くろねこ日記

ソフトウェアに関する技術メモが多いです.

micropythonをSTM32F4DISCOVERYにインストール

はじめに

micropythonはarmマイコンのSTM32F4チップ用に作られたファームウェアです.

今日はSTM32F4DISCOVERYというマイコンボードにmicropythonをインストールして,Lチカするところまで紹介します.インストール作業に使うマシンはMacOSXで行ないます.

なお,この内容は先月開かれたPyConJP2014の開発スプリント中に行なった内容をメモしたものです.micropythonの良さや簡単な使い方についてはスプリントリーダであり,今年のpyconjpで面白い発表をしてくれた@hktechnoさんあたりの動画やスライドを見てください.

Micro Python で組み込み Python

CR04 Micro Python で組み込み Python (ja) - YouTube

ボード購入

秋月から

STM32F4DISCOVERY: マイコン関連 秋月電子通商 電子部品 ネット通販

STM32F4DISCOVERYを購入しましょう

ビルド環境の設定

まずは,micropythonをビルドするときに使うgcc-arm-embeddedを導入しましょう. Linuxの方はaptやyumを叩けば入ると思いますが,osxの場合はbrewでなぜかコケたのでこちらからバイナリ

https://launchpad.net/gcc-arm-embedded/+download

をダウンロードしましょう.そのあとは解凍してテキトーなディレクトリにコピーまたは移動して,そこにpathを追加してください.

次にmicropythonに書き込むためのライタ(ソフトウェア)を用意します. dfu-utilというのがありまして,homebrewからインストール可能です

brew install dfu-util

やってみる

とりあえず,まずはここまでの流れをやってみます.

マシンのシステム環境は以下の通りです

  • OSX(Marvericks)
  • zsh
  • homebrew

gcc-arm-none-eabiのバイナリはhome以下に置くとします.

/opt以下に置きたい場合は適宜読み替えて行なってください.

なお,curlでダウンロードするものはこの記事が出てから時間が経つと落とせなくなる可能性があります.もしリンクが切れていたら適宜修正してください.

では以下作業内容

brew install dfu-util
cd ~/
curl -L -O https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q3-update/+download/gcc-arm-none-eabi-4_8-2014q3-20140805-mac.tar.bz2
tar xvf gcc-arm-none-eabi-4_8-2014q3-20140805-mac.tar.bz2
cp -r gcc-arm-none-eabi-4_8-2014q3 ~/gcc-arm-none-eabi
echo 'PATH=$PATH:$HOME/gcc-arm-none-eabi/bin' >> ~/.zshrc
exec $SHELL -l

これだけです.

micropythonをビルド

micoropython本体はgithubに上がってますので,ダウンロードしてビルドすればOKです. ビルドの際には今回使うマイコンをオプションで指定する必要があるので注意です. micropython/micropython · GitHub

ビルドしたらdfu-utilを使って購入したボードにインストール作業に移ります.インストール前に,まずはボードの裏側にあるジャンパピン二つのうちどちらかを取って,p2側の21pin-22pin(BOOT0とVDDのところ)に刺します.そのあとボードをパソコンに繋ぎましょう.繋ぐときにはmicrousbとminiusbの2ポートがボードから出ていると思うので.二つともパソコンに繋ぎます.

やってみる

今の内容を実際にやってみます. なお,ボードは予めパソコンと繋いでおいてください.

git clone https://github.com/micropython/micropython.git
cd micropython/stmhal
make BOARD=STM32F4DISC
dfu-util -a 0 -D ./build-STM32F4DISC/firmware.dfu

これだけです. ここまで済んだらp2の21pin-22pin(BOOT0-VDDのところ)に刺してあるジャンパピンを元の場所に戻しておきましょう.

Lチカで遊ぶ

無事に済めば

/dev/tty.usbmodemなんとか

というデバイスを検出すると思います.

シリアルターミナルソフトウェアでそのポートに接続すればOKです. ここではpyserialに付属してくるminiterm.pyを使って接続します.

やってみる

pip install pyserial
exec $SHELL -l
miniterm.py /dev/tty.usbmodemなんとか

これだけでインタラクティブシェルが立ち上がると思います. このインタラクティブシェルはマイコンボードで動いております(すごい時代だ).

ではLチカしますね.

led = pyb.LED(1)
while True:
    led.on()
    pyb.delay(1000)
    led.off()
    pyb.delay(1000)

これだけです.

なお,気づいたかもしれませんが,USBフラッシュメモリのように,ボードがマシンにマウントされます.このなかにmain.pyというのがありまして,そこにコードを書いても動かすことができます.

まとめ

micropythonをSTM32F4DISCOVERYにインストールする手順をざっくり紹介しました.

サーバ管理ツールAnsibleを使ってみた

はじめに

raspberrypi上でansibleを試してみました.

実際に試してみたときの設定手順などをメモしておきます.

ansibleとは

Pythonで作られたサーバ構成管理ツールです.他にはRubyで作られたchefが有名です.

このツールの目的はサーバの管理を自動化するところにあります.サーバを管理するときにシェルスクリプトにサーバ設定を記述して実行したという経験をお持ちの方がいらっしゃるかもしれません.またはマニュアルに必要な設定を書いて読みながら設定された方もいらっしゃると思います.ansibleはそれらの内容を自動で行なってくれるものです.

でも,自動で行なうだけではシェルスクリプトを走らせるのと違いがありませんね. シェルスクリプトで管理するのとは決定的に違う良さとしてこれらのツールのには羃等性というのがサポートされています. 羃等性とは何回実行しても一つの結果に収束する性質のことらしいです. 例えばシェルスクリプトを2回実行すると2回分処理をすることになりますが,ansibleでは一度行なった処理を行いません.

さらにシェルスクリプトのようにわざわざマシンにscpで設定のシェルスクリプトファイルを転送してsshでログインして実行ということをしなくてもansibleは自動でsshを利用してセットアップをしてくれます.もちろん複数のサーバに対しても同時に行なうことができて,ansibleで複数台のマシンに同じ内容を実行させるということが可能です.

ansibleはpythonで書かれておりますが,chefのようにrubyを使うということもなく,yamlさえ記述できればすぐに扱えるというのも特徴の一つです.

対象マシンの情報と行なう内容

今回の対象マシンは次のようになっています.

  • マシンはローカルホスト上で繋ったマシンを想定します(SSHでアクセス可能).

  • ユーザ名はpiという名前です

  • パスワードはかけています

実施内容は次のようになっています.

  • Aptを使ってpython3とgitをインストール
  • python3のpipを使って以下のライブラリをインストール(あくまでも例です)
    • pyserial
    • numpy
    • flask

ここまでを行ないます.

Ansibleのセットアップ

ansibleはpython2のpipからインストールができます.

pip install ansible

python3ではansibleは動作しないので注意してください.

次にセットアップ対象マシンのIPアドレスを設定します. ホームディレクトリ上にansible_hostsというファイルを次のように設置します.

touch ~/ansible_hosts

今はansible_hostsというファイル名にしましたが別なファイル名でも可能です. 特に当たり障りがなければこのファイル名で問題ないでしょう. ansible_hostsのなかに対象マシンのIPアドレスを設定します.

[raspi]
192.168.1.3

IPアドレス(192.168.1.3)は今回はローカルホストのものを指定しましたが,各自で値を入れてください. [raspi]と書いたのはansibleで自動実行するときにマシンを選ぶときの識別に使います.ansibleは複数のマシンに対してセットアップを行なえるので,このように任意の名前で管理ができます.名前のつけかたはさまざまあるようですが,ここではシンプルに対象マシンの名前だけをつけておきます.

つぎに設置したファイルの場所をbashrcやzshrcなどのシェル設定ファイルに書き込みます.

このようにexportを追加すれば良いです.ここではzshrcに書き込むものとします

echo 'export ANSIBLE_HOSTS=~/ansible_hosts' >> ~/.zshrc

これだけです.あとは忘れないようにシェルを再度読み込んでください.

対象マシンのセットアップファイル作成

セットアップファイルはyaml形式で書くことができます. yamlの書き方は

Rubyist Magazine - プログラマーのための YAML 入門 (初級編)

このあたりが詳しいと思います.

ここでは例として書き上げたyamlファイルにそって解説していきます.

今回の設定は再掲すると

  • Aptでpython3とgitをインストール
  • pip3でライブラリのインストール

ですね.

yamlで書くとこのようになります

- hosts: raspi
  user: pi
  sudo: yes
  vars:
    pippackages:
      - pyserial
      - numpy
      - flask
  tasks:
  - name: Apt
    apt: name=python3 state=installed
    apt: name=python3-pip state=installed
    apt: name=git state=installed
  - name: pip install
    pip: name={{ item }} executable=pip-3.2
    with_items: pippackages

順に解説すると先頭にあるhostsというのは~/ansible_hostsで設定したときの名前を指定してます.

yamlでは

- hosts: 値

のように書きます.

次にvarsとtasksと呼ばれる部分がありそれぞれ入れ子として記述してます.

varsとtasksの関係を説明すると,varsはセットアップファイルで実行するときに使う変数を記述する部分です.ここで変数という形で設定などを記しておくことができます.tasksでは実際にサーバ上でどのような操作をするのかを記述する部分です.ですので,varsはtasks上で使用される変数となります.

varsは

  vars:
    pippackages:
      - pyserial
      - numpy
      - flask

と,varsの入れ子としてpippackagesというのがありますね.これは僕が今回つけたpipで導入するライブラリ名を示す変数名です.今回はpyserialとnumpyとflaskをインストールするのでpippackagesに記述しておきました.

tasksは

  tasks:
  - name: Apt
    apt: name=python3 state=installed
    apt: name=python3-pip state=installed
    apt: name=git state=installed
  - name: pip install
    pip: name={{ item }} executable=pip-3.2
    with_items: pip packages

と,tasksの入れ子ではAptを使ってpython3とpip3,gitをインストールし,pipでvarsに記した変数を呼んでインストールしてます.

yamlの書き方として補足しておくと

- name: 実行内容の説明文
   実行内容
- name: 実行内容その2の説明文
   実行内容その2

となっており,「name: 」の後に書くものはコメントを記述し,その下に実行内容を記述してください. 先頭のnameでは「Apt」というコメントを書いておきました.そこでは「apt 」というansibleが用意したモジュールをつかってpython3とpip3,gitをインストールします.

なお,Ansibleではセットアップで使うことが多いモジュールが用意されておりそれらをつかって作業を行ないます.例えばAPTでインストールするときにはansibleが用意しているaptというモジュールを使うことでインストールできますし,pipでインストールするときにはansibleが用意しているpipというモジュールが使えます.もしdebian系ではなくredhat系ならyumをつかってパッケージをインストールしますからyumというモジュールを使えば良いでしょう.その他スクリプトを実行するscriptモジュールやgitを動かすgitモジュールなど非常にたくさんのコマンドが存在しております.

ansibleが用意しているモジュール情報は

Module Index — Ansible Documentation

で調べられたり,具体的な使い方の情報はansibleをインストールするときに付属してきたansible-docsというコマンドで参照できます.

もちろんscriptsやcommandに書くこともできますが,その場合羃等性が崩れる恐れがありますので極力ansible側で用意したモジュールを利用しましょう.

また,pipでインストールする箇所に「with_items: 」というののが見えますね.これはリストを一つ一つ取りだす便利な記法です.ansibleの設定を記述する上で便利な書き方がいくつか用意されておりまして,ここではその一つとして使ってみました.pippackagesに記述した「pyserial」や「numpy」,「flask」という文字列を順に取り出し{{ item }}というところに渡しています.波括弧でitemというのを囲うのはjinja2をつかったことのある方にとっては馴染みがあると思います.

実行

ここまでくればさきほどのyamlファイルのあるディレクトリの上で実行するだけです. 今回のyamlファイル名は「playbook.yml」としておきます. 対象マシンが設定通りのネットワークに繋がっている状況で,以下のコマンドを実行します.

ansible-playbook playbook.yml -v

このときsshにパスワードをかけているのでしたら次のようなオプションをつけてください. パスワードが聞かれるので打てばOKです.

ansible-playbook playbook.yml --ask-pass -v

これでさきほど設定したaptでのインストールやpipをつかったライブラリのインストールが開始されます.

おわりに

今日紹介した内容は

Amazon.co.jp: 入門Ansible eBook: 若山史郎: Kindleストア

を参考にしました.

ここでは紹介していないansibleをつかう上で便利なモジュールが紹介されていたり,yamlを書く上で便利な書き方などが載っております.ansibleは日本語情報が少ないのでこういう書籍は貴重ですね.僕はansibleを使うときにこの本を片手に書くことが多いです.

matplotlibのグラフ本体を保存する

はじめに

pythonにはmatplotlibというグラフを扱えるライブラリがあります.

このライブラリでは手軽にデータをプロットしてグラフを生成できるのですが,Xの機能にはグラフを画像としてエクスポートする機能しかなく,グラフ本体を保存するということができません.

そこでpickleというツールを使うことで簡単にグラフ本体を保存することができるので今日はその使い方をメモしておきます.

頻繁に使うのですがよく忘れてしまうので...

pickleの使い方

pickleはmatplotlibをインストールした段階で付属してくると思います. ここでは簡単な線形グラフを保存してみます.

グラフ書き出し

import matplotlib.pyplot as plt
import pickle

x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 2, 3, 4, 5]
fig = plt.plot(x, y)
filename = open('test.pickle', 'wb')
pickle.dump(fig, filename)
filename.close()

これだけでtest.pickleというファイル名で保存されます. 保存のときにはバイナリで書き出す必要があるので,'wb'の箇所は忘れないようにしてください. もし

filename = Open('test.pickle', 'w')

だとバイナリを文字列として扱えないというエラーがでてしまうので気をつけてください

グラフ読み込み

import matplotlib.pyplot as plt
import pickle
filename = open('test.pickle', 'rb')
fig = pickle.load(filename)
plt.show()

これで読み込めると思います.グラフが描画されたのを確認してください.

まとめ

matplotlibのグラフ本体を保存する方法を紹介した.

これで後からグラフだけ編集ができるようになったので便利.

VimのコンパイルとJedi-Vimの設定と第二回Sapporovimのお礼

はじめに

Vimコンパイル(オプション指定をメモ)とjedi-vimではまったところをメモしておきます.

というのもhomebrewやバイナリ配布のVimではpyenvにあるpythonパスを読んでくれないためにjedi-vimがうまく動いてくれなかったからです.

そこで今回は解決策の一つとしてらぁさんが作っているvimenv(https://github.com/raa0121/vimenv)を使ってvim7.4を導入して,そのときにビルドすることで~/pyenv/shims以下を呼ぶようにします. そのあとにjediのインストールを行なって補完なども効くようにするというものです.

何度かこの方法を使う機会がありました.そのたびに,コマンド履歴を参照して調べるのがツラいので今日こそメモしておきます.

あとここに書いてあることは第二回Sapporo.vimで@thincaさんと@raa0121さんに教えていただきましたのでここでお礼を述べさせていただきます.

ありがとうございました!

vimenvの導入

vimenvは次のような手順で導入してください

git clone https://github.com/raa0121/vimenv.git ~/.vimenv

そのあとにこちらのブログで紹介されているvim-buildを導入します http://yasu-n1.hatenablog.com/entry/2013/10/03/201819

cd ~/.vimenv
git clone https://github.com/yasu-n/vim-build.git ~/.vimenv/plugins/vim-build
exec $SHELL -l

ここまで行ったら次にvimのビルドを開始します.ただし,pythonとタイプすると~/.pyenv/shims/pythonから呼べるようにしておいてください.

今回のvimはluajitもオプションに加えようと思います. 僕の場合,luajitは以下のようにluaenvで導入したものを使ってます.

luaenv install luajit-2.0.3
luaenv global 2.0.3
luaenv rehash

ではここからvimenvでvimをインストールしましょう.

vimenv install -- --with-compiledby=kuroneko --enable-pythoninterp --enable-perlinterp --enable-python3interp --enable-rubyinterp --with-lua-prefix=/path/to/.anyenv/envs/luaenv/versions/luajit-2.0.3 --enable-luainterp --with-luajit --enable-multibyte --enable-fail-if-missing

長いですがこんな感じです.

jediでつまづいたところ

jedi-vimpythonを強力に補完したり,pydocをコード中に参照してくれるプラグインです.

ただし,jediはvim上で動くpythonpathから参照するため,pythonpathの設定をやらないでおくとコード補完がうまく効かない恐れがあります. 僕はしばらくの間これで悩んでいたのですがPYTHONPATHの設定を追加しておけば良かったようです.

たとえば,pyenvの3.4.1のライブラリをjediに参照させたいなら zshrcかbashrcの上で

export PYTHONPATH='/path/to/pyenv/versions/3.4.1/lib/python3.4/site-packages/'

の一文を追加するだけです

これでvimを起動して

:python import sys;print(sys.path)

で今追加したPATHが表示されることを確認してください.

第二回Sapporo.vimへのお礼

今日書いた内容は第二回Sapporo.vimもくもく会に参加したときにやっていたことです. PYTHONPATHがvimからうまく参照できてないところについてはthincaさんに教えていただきました(quickrunで有名な方が向かいの席でびっくり...).vimenvの紹介と使い方はらぁさんに教えていただきました.

勉強会は2時間程度遅刻したこともあって(くろねこ界の最長記録樹立!),もくもくタイム自体は少なかったのですが,有益な時間を過させていただきました.

ただ,会場についてから,自宅同然にもくもくしてしまったので勿体ないことをしてました(ただ,もくもくするのは勿体ないという声が聞こえてきましたがその通りですね).もうちょっと他の人とも交流できればよかったのですが,タイミングが掴めませんでした(このあたりコミュニケーション能力の低さが顕著に表れてますね...).またお会いする機会があれば楽しみにしております.

この日は発表もあって,@supermomongaさんがEmacs上でVimと同等の動作をさせることができるEmacsEvilの発表(Evilの今後に期待),@Linda_ppさんがVim初心者向けに講座を開いてくれました(わかりやすかったです).

ありがとうございました.

まとめ

vimenvでvim導入してみた.

jediのはまったところをメモ

第二回Sapporo.vimの感想とお礼,

PyConJPの告知とCFPが補欠だった件について

はじめに

今年もPyConJP2014が9/12~9/15に開催されます.

今回はPyConJP2014の告知のつもりで記事を書きます. というのも遠方者支援のアピールポイントに「ブログでの告知も行ないます」と書いたこともあったので後に引けなくなったからです.

PyConJPはチュートリアルと開発スプリントを含めると4日間となります.昨年,参加した僕が会場の雰囲気を紹介することで,PyConJP2014への参加に興味を持っていただければと思います.

また,CFPへの応募を今年はやってみました.応募するときに細かな項目があり,どんなことを書いたのかを載せておこうと思います.ただし,アクセプトはされず,補欠枠に回ったので発表できる可能性が低くなりました.反面教師として読んでいただければ良いと思います.

昨年のPyConAPAC

昨年開催されたのはPyConAPACであり,PyConJPではありません.しかしながら,チュートリアル→コアのカンファレンス2日→開発スプリントという構成みたいですし,APACと日程的に似ているので同じと考えても良いと思います.

チュートリアル

チュートリアルでは2コースのうちどちらかに参加することができ,僕はdjango入門のチュートリアルに参加しました.参加の動機としては僕自身Webフレームワークを使った経験が殆ど無く,前々から興味こそあったけれど手が出てなかったのでチャレンジしてみようという気持ちで参加しました.

実際に業務でdjangoを日頃から使っているプロフェッショナルの方に昼から夕方までみっちりハンズオン形式で教えてもらえます.値段にするとPyConへの参加費用よりも高いのですが,値段に比べて内容がだいぶ得だと思います.

具体的にはECサイトをハンズオン形式で作ってみようという内容でした. django初心者向けに使い方がまとまった資料(紙ベース&電子ベース)が配布されました.その資料を元に解説&演習が進んでいきました.

ハンズオン形式なので,進めていく段階でエラーが出てもすぐに聞けます.当時の僕ならエラーを読んでもピンと来なかったような気はするので初歩的なエラーで一日潰していたと思います.そんなときに講師の方にすぐに聞いてエラーの潰し方とかコツを把握できるというのは,時間短縮だけでなくウェブや本では学べないポイントの一つですね. おかげで資料の最後まで到達して一通りECサイトを手元で動かすことができて良かったです.

それから,昨年はチュートリアル後に懇親会も開かれました.チュートリアルだと定員枠が決まっており人数も少ないので,北海道からボッチ参加した僕にとっては知り合いを増やす良い機会でした. チュートリアルの懇親会だと人数が少ない分,参加者の影に隠れることが少なく,話をするきっかけが多いので案外穴場のような気がします(残念な人理論ですが).実際に数人の方と知り合いになり,残りのカンファレンスでは充実して過すことができました.

PyConJPに参加するときにはよかったら@kuroneko1988と書かれた参加証を見かけたら声かけてくれたら嬉しいです.

今年は https://pycon.jp/2014/tutorials/ にあるように - サーチエンジン開発 - Pythonの基礎研修 - PyData入門 のようです.

まだ応募してませんが,今年もどれかに参加したいです.

カンファレンス本体

チュートリアルの翌日から2日間はPyConJPのコアとなる部分です.実際に参加人数はチュートリアルとスプリントでは数十人でしたが,数百人規模となります.

基調講演も開かれており,Dropboxの開発者とSphinxの開発者の講演でした.面白かったです. カンファレンスの発表自体,英語発表が多めではありましたが,基調講演では同時通訳もあるので,英語が怖い人は通訳で聞いても良いかもしれません.でも日本に居ながらして英語と日本語が混る機会ってあまりないので,生英語を聞いても良いかもしれませんね.僕は英語得意ではありませんが,IT系の話題は横文字が多いので英語で聞いてもわかる場合が多いです.

それからランチタイムは多数の出席者が居てジョブボードや書籍販売コーナを覗いてみたりしました.

あとは企業ブースがかなり出展していて,ドリンクとかチョコレートを頂いたり,bitbucketTシャツを頂いたりもしました.

開発スプリント

開発スプリントはレベルが高くて参加するか悩むという声をチラホラ聞いていましたが,折角なので参加してみました.実際にはもくもく会+テーマが設定されているという形式でした.sphinxの翻訳をテーマにして動いているところもありましたし,人によってはもくもくと開発している人も居て放牧的な雰囲気があって良かったです.

もくもくしているだけだと自宅で作っているのと変わりないということがあるので,テーマがあるのは良いことだと思いました.もちろんもくもくしたい人は黙って作業するのも良いですね. それから開発スプリント中は他のセッションを覗いて息抜きをしたりと話かけやすい雰囲気があって良かったです.

僕はMyHDLを使ってみるという内容にしました.MyHDLはPythonでHDLコードを書けるというもので,Pythonで書いたコードがFPGAの上で動きます.FPGA自体は聞いてこそいたのですが,触ったことすらなかったので,初歩の初歩から教えてもらいました(ご迷惑おかけしました(汗)).

テーマの目標としては簡単なパイプラインを作って入力した2つの数字を四則演算するというのを作ることになりました.結果的にはタクトスイッチを押すとクロックのHIGHになり,ボタンから話すとクロックのLOWに落ちるという形を利用して人の計算速度よりも遅い計算機を作ることができました.

CFPの応募

PyConAPACに参加して多少意識が高まったところで今年はスピーカとして応募してみることにしました.事前に倍率が高そうな印象は受けていたので,ダメ元での応募でした.

前述した通り補欠枠になったので,もし読んでいる方でCFPに来年は応募するぞという方がいらっしゃいましたらこれを多少なり参考にされて挑まれることを期待してます.

とりあえず書ける範囲で載せておきます,

カテゴリ
GUI Programming / GUI プログラミング 

言語
Japanese 

Python レベル
初級 

対象者
デスクトップアプリケーションを作ったことのない方やkivyというライブラリを知らない方,kivyを知ってはいても具体的な使い方を知らない方を対象としております. 

目的
kivyというデスクトップアプリケーションの紹介,kivyを利用したデスクトップアプリケーションの作り方です. 

時間枠
30分枠希望

説明
デスクトップアプリケーションを開発するためのライブラリは様々存在しますが,今回はクロスプラットフォーム対応のデスクトップアプリケーションフレームワークkivyの簡単な使い方を紹介と個人的に使用した事例についてお話します. 

概要
デスクトップアプリケーションを開発するためのライブラリは様々存在しますが,今回はクロスプラットフォーム対応のデスクトップアプリケーションフレームワークkivyの簡単な使い方を紹介と個人的に使用した事例についてお話します.kivyの概要から導入,簡単なコードを紹介して作り方を知っていただこうと思います. 
具体的にはHelloWorldからタイマを利用したデスクトップアプリケーションを紹介させてもらいます.
最後に実際にkivyを利用したデスクトップアプリケーションの紹介をさせていただきます. 

アウトライン
    発表内容
    kivyの概要
    kivyでHelloWorld
   タイマを動かしてみる
   これまでに作製した内容を紹介
   まとめ 

追加情報
 

メモ

こんな感じですね.

応募したときの感想として項目が多いということです,発表者名・言語・対象・発表時間・概略くらいのものだと思っていたのですが,アウトラインや目的に至るまで細かく設定されています.すでに準備万端な人であればスラスラとかけると思いますが,今までやったのをせっかくだし発表してみようかなとぼんやりしたイメージでの応募ではアクセプトまではキツかったかもしれません.

アウトラインや目的の部分については概略に書いてしまっているのでだいぶ重複しており,そこが落されたポイントの一つかなという気もします.

あとは内容もkivyでデスクトップアプリの作り方を紹介してもググったり書籍を読んで何とかなるので,アクセプトされるほどの面白みには欠けたかもしれません.

そんなところでしょうか.CFPについては書き方自体をそもそも悪かったところも多いでしょうし,ここに書いてあるのはあくまでも憶測です.反面教師にして,ちょっとでも足しにしてくれれば嬉しいです.

まとめ

PyConJP2014のちょっとした宣伝のつもりで,昨年のPyConAPACの様子を書いてみました.

CFP応募した内容を載せてみました.

追記

ブログ公開した直後に次のようなご指摘がありました.

アクセプト枠,補欠枠,リジェクト枠の3つがあったんですね.ご指摘感謝.

そのため本記事の一部を修正・変更しました.

「はじめてUNIXで仕事をする人が読む本」を読んだ

はじめに

オープンソースカンファレンス2014に参加してきました(今更ですが).

オープンデータハッカソンに参加したり(楽しかったので次回も参加できたら是非), LT(カーネル空間上に草生やす発表が特に面白かったです)を楽しませてもらったり,Sinatra札幌ブースでは僕が作った未完成ゲーム(お化けをやっつけるゲーム)が走っておりヒヤヒヤしたりと(展示していただいて感謝)充実した一日でした.

オープンソースカンファレンスの懇親会にも参加させていただきました.ジンギスカン美味しかったです.懇親会ではLTが再び開かれていたり,様々なグッズが貰えるじゃんけん大会(オライリーTシャツ頂きました)や学生・駆け出しエンジニア向けにグッズのバラマキがありました.

グッズのバラマキでは,以前から読みたかった「はじめてUNIXで仕事をする人が読む本」というのを頂きました.何方から「読んだらブログに書いてね」と言われた気もしたので大分時間が経ってしまいましたが,感想を載せておきます.遅くなってすみません.

構成

以下が本書の構成です.てんこ盛りですね.しかし,これでざっと200ページ弱.なので,UNIXはどういうものか,何が便利なのかよくわからないという読者には最適な本だと思います. 事実,僕も普段からUNIX(OSXの上)を使っておりますが,周りに使える人も居ないまま独りで学んだこともあって,UNIX使いはこのくらい使えれば良いよという指標を頂いたようで安心できました. それだけでも読む価値はあったと思います.

第1部 生活環境編
第1章 ログインログアウト
1.1 そもそもログインとは
1.2 TELNETによるリモートログイン
1.3 SSHによるリモートログイン
1.4 ログアウト
第2章 UNIXの基本操作
2.1 シェル
2.2 リダイレクションとパイプ
2.3 UNIXのファイルシステム
2.4 基本のファイル操作
2.5 パーミッション・オーナーの管理
2.6 正規表現
2.7 grep
2.8 sed
2.9 awk
2.10 アーカイバ
2.11 その他のコマンド
第3章 テキストエディタ
3.1 基本のテキストエディタ
3.2 限定された環境でのファイル編集
3.3 ViとVim
3.4 Emacs
第4章 作業の自動化(シェルスクリプト)
4.1 シェルスクリプトによる作業自動化の必要性と利点
4.2 Bourne shellについて
4.3 簡単なスクリプトの作成と実行
4.4 シェルスクリプトの実用例
第5章 オンラインマニュアル
5.1 オンラインマニュアルを必要とする場面
5.2 氾濫する情報の危険性
5.3 manコマンド
5.4 infoコマンド
5.5 ヘルプメッセージ
第6章 セキュリティ
6.1 UNIXにおけるセキュリティ
6.2 ルート権限の獲得方法
6.3 共通鍵暗号と公開鍵暗号
6.4 SSHの応用
6.5 PGPによる暗号化、電子署名
第7章 UNIXシステム管理
7.1 UNIXにおける管理作業
7.2 起動とシャットダウン
7.3 ユーザとグループの管理
7.4 パッケージ管理
7.5 TCP/IPネットワーク管理
7.6 DNS(名前サービス)
7.7 サービスの管理
7.8 トラブルシュート
第2部 プログラミング環境編
第8章 UNIXプログラミング環境
8.1 プログラミング環境概要
8.2 C言語による開発実例
8.3 Javaによる開発実例
8.4 LL言語による開発実例
第9章 バージョン管理システム
9.1 バージョン管理システムとは
9.2 バージョン管理システムの種類
9.3 バージョン管理システムの使い方
9.4 Subversionの使い方
9.5 Gitの利用方法
第10章 ソースコードからのドキュメントの作成
10.1 はじめに
10.2 ドキュメント生成ツールの種類
10.3 ドキュメント生成ツールの利用方法
第11章 ソフトウェアライセンス
11.1 ライセンスを考慮する理由
11.2 オープンソースライセンス
第3部 ネットワーク技術編
第12章 UNIXとネットワーク技術
12.1 TCP/IP実装の公開と普及
12.2 LANとWAN
12.3 ネットワーク端末としてのUNIX
第13章 OSI参照モデル
13.1 OSI参照モデル
13.2 TCP/IPとOSI参照モデル
第14章 データリンク層
14.1 データリンクとは
14.2 データリンクの基本
14.3 Ethernet
14.4 無線LAN
14.5 Point-to-Point接続
第15章 IPと関連プロトコル
15.1 IPの基本
15.2 IPv4とIPv6
15.3 IPアドレス
15.4 特殊なIPアドレス
15.5 ルーティング
15.6 関連プロトコル
第16章 TCPとUDP
16.1 ポート番号
16.2 UDP
16.3 TCP
16.4 TCPのコネクション
16.5 TCPの通信
16.6 TCP通信の制御
16.7 TCPとUDPの使い分け
第17章 アプリケーションプロトコル
17.1 Webアクセス(HTTPHTTPS)
17.2 電子メール(SMTPPOPIMAP)
17.3 リモートログイン(TELNETSSH)
17.4 ファイル転送(FTPrsync)
17.5 ファイル共有(NFSSMB)
17.6 VoIP(SIPRTP)
17.7 システム運用管理(DNSDHCPNTPSNMP)
17.8 Xプロトコル
第18章 IP関連の技術
18.1 名前解決
18.2 IPアドレスの付与
18.3 アドレス変換(NAT・NAPT・IPマスカレード)
18.4 トラブルシューティング
第19章 ネットワークセキュリティ
19.1 ネットワーク上の攻撃
19.2 認証システム
19.3 通信フィルタとファイヤウォール
19.4 通信の暗号化
19.5 VPN

良かったところ

本当にざっくりと網羅的にUNIXの便利ツールの使い方と紹介が書かれており,さきほど書いた指標を知りたい人におすすめの一冊です.ただ,UNIXのみというよりも,オープンソース界隈で必要とされるツール(VCS,ソフトウェアライセンスとか)の紹介が多く,Linux使いも読んでも良さそうな記述が多かったです(ところどころLinuxの話も記載されている).

また,低レイヤな部分についても書かれており(OSI参照モデルなど)こういう大事なところもきっちりフォロウしているのは凄いと思いました.

  • とりわけ面白かったところ

    • Javaの開発事例というのがあるのですが,JDKコマンドラインツールだけで開発する事例を載せてたりとJavaの本にしてはユニークかもしれません.

    • 「限定された環境でのファイル編集」という項目では,UNIXエンジニアは,破損したファイルシステムや組み込み環境のようにテキストエディタも使えない環境で作業することがあります.というようなことが書かれております.どんな環境なのか想像しにくいですが,echoやcat,readを駆使してファイルを編集する技を見せてたりと,シェル芸が漂っていて面白かったです.

    • ツールについてもその誕生経緯など歴史的な記述も多く非常に参考になりました.

悪かったところ

網羅的に書かれすぎており,一つ一つの話について消化不良感が否めないです. ソフトウェアライセンスについてもう少し細かい紹介が欲しかったです. なので,この一冊から普段使っているツールについて新しい知識を得るということは期待しないほうが良いです(そういう本ですし).

LL言語の紹介では本書の紹介ではpythonrubyについて書いてあるにも関わらず,perlの基本的な紹介で終ったりと,ちょっとくらい対象読者に書かれていたPythonRubyについても紹介したらどうかなとは思いました.

まとめ

日頃からUNIXに触れる人にとっては一般的にこのくらい知っておけばOKという基準が示されているようで安心できます.

UNIXを使ったことがない人にとっては,網羅的に書かれているので,読んだら一つ一つ後で調べたら良いかもしれません.

gunicorn+nginx+flaskで動かしてみた

はじめに

Flask製のアプリケーションをgunicornとnginxを使って動かす方法をメモしておきます.

動かすにあたって簡単なサンプルコードを載せておきます

ここではDebian7を対象に書きます.

アプリケーションの全体構成

ここではhelloというアプリケーションでアクセスされると「Hello!」と返してくれるウェブサプリケーションを想定します.

初期の全体のディレクトリ構成は以下のようになります

/site
├── hello.py
└── tmp

FlaskでHello!を出す

hello.py

#!coding:utf-8

from flask import Flask

app = Flask(__name__)

@app.route('/hello', methods=['GET'])
def hello():
    return 'Hello!'

if __name__ == '__main__':
    app.run()

これだけです.

flaskの細かい使い方は以前のブログ記事を参考にしてください フレームワーク素人がFlask触ってみた

nginxの設定

nginxでgunicornより生成されるsocketファイルを読むための設定を行ないます.

vim /etc/nginx/site-available/default

upsteram hello{
    server unix:/site/tmp/unicorn_flask.sock
}

server {

    location /hello{
        proxy_pass http://hello
    }
}

gunicornの設定

先程nginxで指定したsocketファイルを次のように生成します.

/site上で

gunicorn hello:app --bind unix:./tmp/gunicorn_flask.sock -D

あとは

/etc/init.d/nginx reload

localhost/hello

にアクセスしてhello!が返ってくることを確認

まとめ

gunicornとnginx,flaskの連携についてまとめた.