SQLAlchemyとJupyterNotebookで遊んでみた話

../../../_images/sqlalchemy.png

SQLAlchemy触ったことはあるのですが、ふわっとした知識しかなかったので入門してみました。 (とはいっても2017年の12月ぐらいの話なのですが、供養のため公開しておきます)

資料は次のURLから閲覧できます。今回はその写経をJupyter Notebookでやった話です。

動作環境

  • Python 3.6.3
  • SQLAlchemy==1.1.15
  • jupyter==1.0.0

SQLAlchemyについて

先に上げた2つの資料を見るまでは、SQLAlchemyに対して次のような疑問やイメージを持ってました。

  • 「ORMとして紹介されることがあるけど、単純にそれだけじゃない気がする。」
  • 「DjangoのORMと比べるとなんでもできそうに見えるけど、どう学んだらいいかわからん。」
  • 「ドキュメントどこ見たらいいかよくわからん」

資料をやり終えて少なくとも1つ目と2つ目の疑問はなんとなく解消し、3つ目もなんとか見れるようになったと思う。 個人的には「よくある誤解」のくだりが納得感がありました。

資料では事前準備としてSQLite版のDB(データ入り)の準備から説明されており、SQLAlchemyの構成する要素の説明、それを実際に手を動かして試していくハンズオンも含まれているのでスムーズに入門できました。困ったときは資料や公式ドキュメントに立ち返ろう。あとは実践だ。

0.6.5と古いものになるけど日本語訳のドキュメントもある。公式のURLと併せてメモしておきます。

写経した環境について

最初はREPLで写経していたんですが、「Jupyter Notebookを使用して写経すればよいのでは?」と後から気づきました。 コードとMarkdownによるメモと実行結果を同居できるのやっぱりいいですね。

ショートカット

当方Vimは使えるので、 j, k, dd, <Esc>, <Tab>, <Ctrl+Enter> などは雰囲気で使えていました。 しかし以下のコマンドモード(<Esc>を押したときのモード)のショートカットを使えるとかなり捗ったのでメモしておきます。

  • 1: 「見出し1(大見出し)」で書き出す
  • 2: 「見出し2(中見出し)」で書き出す
  • y: セルをコードモードに変更
  • m: セルをMarkdownモードに変更
  • Space: 下にスクロール
  • Shift+Space: 上にスクロール
  • a: セルを上に挿入
  • b: セルを下に挿入

コマンドモードで h を押すと、ショートカット一覧がでるので他のショートカットも気になる方はそちらもご覧ください。

参考リンク: Jupyterのショートカットキー一覧を調べてみた - Qiita

Jupyter Notebookをどこで動かすか問題

写経するたびにJupyter Notebookの環境用意するのが面倒だなと感じてしまいました。

  • 1つJupyter Notebook用の仮想環境を用意して、そこにライブラリを全部突っ込むようにすると動かないときが面倒そう。
  • Jupyterをグローバルな環境に突っ込むのは依存ライブラリが多すぎて問題になりそうだから避けたい。
  • 新しくJupyter Notebookの環境を作るたびにnbextentsionを都度設定するのダルい

といろいろ考えたのですが、NotebookはNotebookでも Azure Notebook が良さそうだという結論になりました。

  • 無料で使える(少なくとも現時点は)
  • Python3系に対応してる(現状は3.5と3.6をサポート)
  • ほしいライブラリは !pip install hogehoge できる

という点だけで十分使えそうだと判断しました。

対抗馬としてGoogleの Colaboratory があったのですが、参考リンクにあるように、次の理由から

  • 現状ではPython2.7にしか対応していない (Python3使いたい) →Python3対応してた
  • 最新すぎて公開されている情報が少なすぎるため、困った際に検索しても解決策が出てきにくい。
  • 現段階では申し込みをする必要があり、即時使用はできない。
  • キーボードショートカットが違いすぎる

気になる方は Colaboratory/FAQ も参照するとよいでしょう。

まとめ

  • 手を動かす環境をつくるの大事
  • SQLAlchemyべんり。DB操作フレームワークという表現に納得した
  • JupyterNotebookも活用しよう

Python mini hack-a-thon 雪山合宿 2018に参加した #pyhack

合宿としては4回目 Python mini hack-a-thon 雪山合宿 2018 - connpass にいってきました。過去の記録を辿ると夏、冬それぞれ2回ずつの参加だそうです。

今回やったこと

だいたいこんな感じです。それ以外にはtmuxとより仲良くなろうとしたり、UbuntuにKindle入らないなーと思ってうんうん唸ってたりしました。

1日目

会社のバターコーヒーエバンジェリストの影響で飲み始めた、バターコーヒーをお供に新幹線で出発。

恒例の刀屋

普通そうに見えますが、実はどんぶりにぎっちりとそばが敷き詰められており大変ボリュームがありました。満足。

2日目

2日目は昼間はほぼスノボして、一眠りしたら夜はボードゲームしてました。

雪山の様子

約1年ぶりのスノボしてきました。あんまり雪が積もってなかったこともあり、雪がカチコチですっ転ぶとヒッププロテクターをつけていても痛みで悶絶しましたが強い心で滑ってきました。

3日目

前日スノボですっ転んだときのダメージか、首筋が痛む3日目。朝昼と堪能し、それ以外は疲れて寝てた…

帰りの新幹線では何故か急にdotfilesのsetupスクリプトをPython化しようと思い立ってコーディングしてました。 結果はこんな感じ→ dotfiles/setup.py

またいくぞー。

Linuxデスクトップを半年ぶりに導入した

macOSからArchLinuxにしたが結局macOSに戻ってきた話 — kashew_nuts-blog 以来半年ぶりにLinuxデスクトップを導入しました。

多少の問題はありますが、今のところ快適です。安定して使えていますね。

動機

「メモリのゆとりは心のゆとり」と誰かがいってました。

これまでプライベートのPCは最大メモリが8GBだったのですが、PyCharmやVMを気兼ねなく使えるとはいえず、Dockerを使うにも快適とは言えませんでした。OS面で言ってもmacOSでがんばるのも、Windowsに適合するのもつらそうだなと思い、原点回帰してUbuntuをデスクトップで使うことにしました。

Ubuntuを初めて使ったのは大学生の頃、最初に入っていたWindowsXPをまるごと消し飛ばしたのが最初だったと記憶しています。バージョンも8.04LTSがでた頃でした。今回は最終的にUbuntu17.10を入れました。

PC事前準備

新しいPCを購入ました。

../../../_images/inspiron-laptop-13-7000-polaris_hero.jpg

macbookはハードウェア・ソフトウェアの両面から魅力を感じなくなってきたので、 Dellの Inspiron13 7370 という機種を購入しました。第8世代のCPUなのでCore i5でいいかなと思ったのですが、メーカーのサイトでマニュアルを見てみるとメモリの換装が困難(というか無理)そうだったので諦めてはじめからフルスペックモデルです。

Linuxデスクトップを導入するにあたり、気になっていたのは次のとおりです。

  • WiFiやBluetooth接続
  • サスペンドやハイバーネーションといった電源周り
  • HDMIなどの外部接続
  • Linuxデスクトップとして動いている実績があるか

PCメーカーとしてDellはUbuntuの対応も長く続けていますし、情報も多そうだったので問題ないと思い選択しました。キーボードの打鍵感や配列、トラックパッドの感触も確認して問題なさそうだったので購入。

ディストリビューション選び

Linuxデスクトップとしてはこれまで Ubuntu(数回) -> ArchLinux(Antelgos) ときたので再度 ArchLinux にしようかとも思いましたが、ここでは Ubuntu を導入することにしました。

../../../_images/ubuntu-logo.png

理由としては、次のとおりです。

  • 情報は少ないより多いほうがいい
    • Ubuntuの情報は多い
    • ArchLinuxのWikiも参考になることはわかっている
    • 両者をいいとこ取りしよう!
  • ローリング・リリースよりLTSも考慮に入れた運用を行いたい
    • ArchLinuxで常に最新が使える環境はよかったが、ドキドキすることも確かだった
    • Ubuntuは半年に一回、もしくはLTSで二年に一回に新しくできるので心の準備ができる
    • 「もしかしたら今日PCが起動しなくなるかも…」と考えるなら、最新より心の安定をとりたい
  • デスクトップ環境がUnityからGnomeに戻る!
    • これが一番大きかったかも(?)

バージョン選びはLTS版のUbuntu16.04LTSを導入しようとしました。 しかし自分の環境では appstreamcli というのがエラーをはき、対応したかと思ったらそれ以降も定期的にエラーを吐くので「どうせUbuntu18.04LTSでGnomeになるのだから17.10にしよう」と思い、Ubuntu17.10を入れることにしました。

Ubuntu17.10はBIOS破壊のバグがあったりしたようなのですが、自分のマシンは対象じゃなかったことと、ちょうどBIOS破壊の対応をしたバージョンがリリースされたようだったので採用しました。

[参考] 「BIOS破壊バグ」を修正したUbuntu 17.10.1のISOイメージ公開。本家・日本語Remix・各フレーバーまとめ | Linux Fan

Windows側で事前準備

Ubuntuをインストールする前に、 Windowsは消さずにUbuntuとのデュアルブート構成にする ことにしました。

理由としては「出荷状態に戻す手段を確保しておきたかったから」です。 USBメモリをリカバリ用に設定・作成しておけたとして、USBを紛失するリスクはゼロじゃないですし、 0.1%くらいWindowsを使いたくなる機会があるかもしれないと考えました。

なのでWindows側で事前準備として以下を実施。

  • コンピュータの管理かUbuntu用のディスク空き領域を確保
    • Ubuntu: 350GB (メインで使うのでガッツリ確保)
    • Windows: 120GB (WindowsUpdateなどで40~60GBぐらいは使ってる記憶があったので余裕をもたせた)
    • 残: リカバリ領域など
  • 高速スタートアップとセキュアブート解除:
    • これらを設定しないとOSのインストールや起動、ファイルシステムのマウントに問題が発生しうるらしい

ディスクの空き領域は自分で決めましたが、Dellが公開している Dell PCでデュアルブートとしてUbuntuおよび最近のWindowsオペレーティングシステムをインストールする方法 | Dell 日本 のままに作業を進めました。

インストール自体はつつがなく終了。

Ubuntuの使用環境

../../../_images/ubuntu_desktop_image.png

使用環境を書いておくと次の通りです。

ログインプログラム:GDM
デスクトップ環境:Gnome
日本語入力:iBus + mozc
ターミナル:gnome-terminal

デフォルトのままですね。困ったことがでてくるまではこのままで行こうとおもってます。

Ubuntu側の設定

さて日本語Remix版ではない本家版のUbuntuを入れたので、日本語の言語設定がすんでいません。 それ以外にも必要なアプリケーションなどもあるので、何を行ったのかを書いておきます。

最新版にアップデート

ログイン後にアップデートを促されたので指示にしたがって実行

各種必要なツールをインストール

念のため最新化

$ sudo apt update -y & sudo apt upgrade -y

ビルドに必要なツール群導入

$ sudo apt -y install build-essential libsqlite3-dev libreadline6-dev libgdbm-dev zlib1g-dev libbz2-dev sqlite3 tk-dev zip libssl-dev

CLIツール導入

$ sudo apt install vim-gnome tree git curl python peco tig golang golang-go tmux jq

CapsLockキーをCtrlキーにする

$ gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:nocaps']"

ディレクトリ名を英語にする

ホームディレクトリにある「ダウンロード」や「デスクトップ」といったディレクトリ名を英語にする

$ LANG=C xdg-user-dirs-gtk-update

PyCharmインストール

deb を落としてこようとしたら、JetBrainsのサイトで「 snap を使え」とでてきたので指示にしたがって導入

$ sudo snap install pycharm-professional --classic

DLが必要だったものをインストール

  • GitHubのreleasesよりDLして導入
    • Ricty Diminied : 等幅フォント
    • ghq : リポジトリ操作用
    • pt : コード検索
    • hub : Gitのヘルパー
  • 各種Webサイトより deb をDLしてきてインストール
    • Dropbox: ファイル共有
    • Google Chrome: ブラウザ
    • Slack: チャットツール
    • VirtualBox: 仮想環境管理ツール
    • Vagrant: VirtualBoxのラッパー

各種設定を変更

  • 言語サポート: 言語->言語のインストールと削除: 日本語 にチェックをつけてインストール
  • 設定
    • デバイス->マウスとタッチパッド->ナチュナルスクロール: OFF
    • Dock->Dockを自動的に隠す: ON
    • サウンド->音響効果->警告音の音量: OFF
    • 電源管理->画面の明るさ: 最小
    • 電源管理->キーボードの明るさ: 真ん中
    • 詳細->ユーザー: アイコンを好みのものに変更
  • ibus-mozc: ツール->プロパティ->一般->キー設定->キー設定の選択: 以下の設定を追加
    • すべてのモード(直接入力、入力文字なし、変換前入力中、変換中、サジェスト表示中、サジェスト選択中)、入力キー「ESC」、「Ctrl+[」のコマンドを「キャンセル後IMEを無効化」にする
    • モード「直接入力」、入力キー「Henkan」のコマンドを「IMEを有効化」にする
    • モード「入力文字なし」、入力キー「Muhenkan」のコマンドを「IMEを無効化」にする
  • ログイン時: ログインボタンの左隣にある歯車を選択し WaylandXorg に変更
    • WaylandだとIMEで変換候補が明後日の場所にでる。
  • GnomeTerminal: 設定->プロファイル
    • 全般->常にメニューバーをデフォルトで表示する: OFF
    • プロファイル->編集:
      • 全般
        • 起動時の端末サイズ: 100 列, 50
        • 端末ベルを鳴らす: OFF
        • 文字の外観->フォントを指定する: Ricty Diminied Regular 14
        • 文字や背景の色->組み込みのスキーム: 黒背景に灰色文字
        • 文字や背景の色->透過の背景をON: 20%透過
        • バレッド->組み込みのスキーム: Linuxコンソール
  • GNOME Tweeks: GNOME3の高度な設定
  • ufw有効化

解決したこと

単に設定しておけばOKというものでもなかったものについてメモしておきます。

Bluetoothヘッドホンがぷちぷちいってる

プロファイルを変更して対応(HSP/HFP→A2DP)

gnome-terminalのタブが慣れない

gnome-terminalは背景の透過ができたけど、vimが透過されない

mozcの変換候補がGoogleIMEのと比べて弱い…

(若干)気になっていること

細かいことは必要になったときに対応するつもりですが、現状で気になっているのは次のとおりです。

外部ディスプレイの推奨解像度だと出力が認識されない

奮闘の記録としては以下のような感じ。 せっかくだから最大出力でやりたいところだが、今のところ対応策は検討がついてない…

  • Ubuntu側の設定をミスって、外部ディスプレイの方だけ移すようにしてしまったので余計に…
  • 電源をOFFにしてから接続しようとしてもNG
  • xrandrコマンドも試してみたがうまく行かず。
  • xrandrコマンドでうまくいった (ただ、PC側の最大解像度と同じところまでしか出力できないっぽい?)
    • HDMIケーブルで接続した状態で(PCの画面は黒いままだが)xrandrコマンドをやることで認識していることは確認
    • 試しにPC側と同じ解像度を選択したらいけた。
  • 外部ディスプレイは2560x1440が推奨だが、1920x1080までしか出力できていない(←いまココ)

(1/31追記)

  • Windows側でグラフィックス・ドライバー(と念のためモニタのドライバー)の更新を行った。 Windows側は2560x1440で識別できるようになったが、Ubuntu側は状況変わらず。
  • Ubuntu側でグラフィックス・ドライバーを更新するようにUpdateToolを導入して更新してみたが状況変わらず。

peco-historyでターミナルに実行するコマンドがでてこない

pecoでインタラクティブにヒストリを検索→実行するようにしていたが、何故か実行時に一度ターミナルに出力するようにしていた実行コマンドが出力されなくなってしまったので、デフォルトの挙動に戻した。けどmacOSでは動いてるので何か違うのだとは思う。

(1/30追記)

改めてLinux用に記述を書いたら動いた。macOS用の記述と分離してるので気が向いたら整備し直したい。

(1/30追記) WindowsとUbuntuを切り替えて起動するにはUFEIで設定の切り替えが必要

普通に起動時にUbuntuもWindowsも起動できそうな画面がでてきます。 しかしセキュアブートをOFFにした影響らしく、Windowsを起動しようとすると次のような画面が表示され、回復キーの入力が求められました。

回復キーを毎回入力する羽目になっても嫌なので入れずに済む手順を探すことにします。 「セキュアブートを再度有効にするか、BitLockerを中断してWindowsを起動する必要がある」と書いてあるので BitLockerを中断したらいけるかなと思って試しましたがダメでした。BitLockerをWindows側でOFFにすればいけるかなとも思ったのですが、面倒だったのでやめました。

結局Windowsを起動するときは次のような手順を踏むことにしました。

  • UFEIを起動する (自分のPCだとF12キー連打しながら電源ON)
  • セキュアブートを ON
  • ブートシーケンスの一覧にある Ubuntu のチェックボックスを OFF
  • 保存して終了するとWindows起動

Ubuntuに戻すときはON/OFFにしたものをもとに戻して対応します。 若干面倒ですがほぼWindowsは使わないので問題ないと判断。

まとめ的な

マシンパワーは申し分ないし、MackBook Proを使っていたときに困ったところも解消できてるしでほとんど言うことはないですね。(若干)気になっているところもありますが、全体的に快適な開発環境を作れた感じです。