Unicorn pHATを試してみる
pHATシリーズはRaspberry PiのGPIOに接続して、機能拡張ができるというもの。
今回買った、Unicorn pHATは 8x4のRGB LEDが乗ったものです。
スイッチサイエンスでRaspberry Pi Zeroを買うついでにノリで買ってしまったので、セットアップして動かしてみました。
ハードウェアの準備
まずは、Unicorn pHATに付属するピンヘッダーのソケットを取り付けます。 久しぶりにはんだ付けしたので、かなり汚いです…
Raspberry Pi ZeroにはGPIOのピンヘッダが付いていないので、こちらもはんだ付けしました。
使ったのは コレ 。 前に他の用途で買ったものだと思うけど、Unicorn pHATを取り付けると長すぎる気がする。
→強く押し込んだらしっかり刺さった…
ソフトウェアの準備
ターミナルから、必要なソフトウェアの準備を行います。
今回は、Macからssh経由で操作し、ファイルはCyberduckを使いsftp経由で転送しました。
UnicornHatをPythonから操作するためのライブラリをインストールします。
まずは、適当なディレクトリで以下を実行。
$ curl https://get.pimoroni.com/unicornhat | bash
一連のインストールスクリプトの実行が終わると再起動を促されるので、yを選択して再起動します。
Would you like to reboot now? [y/N]
再起動後、再度Raspberry Piのターミナルを開きPythonのインタープリタが使用できることと、インストールしたUnicornHatのライブラリがimportできることを確認します。
一般ユーザーpiで実行したところ、unicornhatのライブラリが/dev/memへのアクセスを要求するため、アクセス権限の問題で実行できませんでした。
今回は、以後rootでPythonを実行することにしました。
$ sudo python Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import unicornhat >>>
とりあえず光らせてみる
>>> unicornhat.set_layout(unicornhat.AUTO) >>> unicornhat.brightness(0.5) >>> unicornhat.set_pixel(0,0,255,0,0) >>> unicornhat.show() >>>
すると、次のように左上のLEDが赤色に点灯します。
unicornhat.set_layout(unicornhat.AUTO)
UnicornHATには通常サイズ(HAT)と半分サイズ(PHAT)があるらしく、それぞれLEDのレイアウトが異なるため、ここで使用するHATの種類を設定します。
ここでは、自動で判別させるためAUTOと指定しました。
unicornhat.brightness(0.5)
1.0を最大値としてLEDの明るさを設定します。
最大の明るさだとかなり明るいので、ここでは半分の0.5としています。
unicornhat.set_pixel(0,0,255,0,0)
点灯するLEDと色を指定します。
第1~2引数でLEDの位置を設定し、第3~5引数は色を設定します。
unicornhat.show()
実際に表示させる命令です。
他も試す
全部点灯
import unicornhat as unicorn from time import sleep unicorn.set_layout(unicorn.AUTO) unicorn.brightness(0.5) width,height=unicorn.get_shape() for x in range(width): for y in range(height): unicorn.set_pixel(x, y, 0, 255, 255) unicorn.show() while True: sleep(1)
get_shape()
でレイアウトの幅と高さを取得できるようです。
その他
Unicorn HATのリポジトリにサンプルがたくさんありました。
まずは、ここらへんで遊んでみると楽しいです(雑)。
雑感
ノリで買ったはいいものの1ヶ月ぐらい放置してしまっていたので、ひとまず動作確認?レベルですが触れてよかった。
「GPIOに接続したLEDを操作する」などに比べると、ハードウェアの組み立て的にも、プログラムの容易さ的にも格段と簡単にLED表示が実現できるデバイスだと感じました。
ライブラリさえインストールしてしまえばPythonから操作できるという点は、WebアプリやSlackBotなどとの組み合わせで可能性が広がりそうです。
Python入門してみる(1)
公式ドキュメントを進めてみた記録。
Python Documentation contents — Python 3.6.1 ドキュメント
初めの章はイントロダクション的な感じだったので、ざっと目を通してスキップ。
2. Python インタプリタを使う
2.1. インタプリタを起動する
起動する
$ python
終了する
Ctrl + D ro quit()
2.1.1. 引数の受け渡し
スクリプト内から引数にアクセスする場合、sys.argvを参照する (例: sys.argv[0])
インタプリタにargument.py というファイルに hogeという文字列の引数を渡して実行する場合は以下のようになる
python argument.py hoge
2.1.2. 対話モード
引数無しでインタプリタを起動した場合は、対話モードで実行される (3つの第なり記号)
以下の状態
$ python Python 3.6.1 (default, Jun 10 2017, 20:33:51) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
2.2. インタプリタとその環境
2.2.1. ソースコードの文字コード
ソースコードの先頭に以下を記述すると覚えておく
# -*- coding: utf-8 -*-
と言うのは、Python2系までの話らしい。 Python3ではデフォルトのエンコードがUTF-8となっているのでこの記述は不要とのこと。
3. 形式貼らないPythonの紹介
対話型のインタプリタを実際に触って、サンプルを動かしてみようといった内容。
3.1 Pythonを電卓として使う
3.1.1. 数
$ python Python 3.6.1 (default, Jun 10 2017, 20:33:51) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 2+2 4 >>> 50-5*6 20 >>> (50-5*6)/4 5.0 >>> 8/5 1.6 >>> 17/3 5.666666666666667 >>> 17//3 # //演算子を使うと小数部を切り捨てて整数部のみを返却する 5 >>> 17%3 2 >>> 5*3+2 17 >>> 5**2 # **でべき乗の計算が可能 25 >>> 2**7 128 >>> width=20 >>> heigth=5*9 >>> width*heigth 900 >>> n Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'n' is not defined >>> 3*3.75/1.5 7.5 >>> 7.0/2 3.5 >>> tax=12.5/100 >>> price=100.50 >>> price*tax 12.5625 >>> price+_ 113.0625 >>> round(_,2) 113.06 >>>
3.1.2. 文字列型(string)
文字列操作に関して。
$ python Python 3.6.1 (default, Jun 10 2017, 20:33:51) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 'hoge moge' 'hoge moge' >>> 'doesn\'t' "doesn't" >>> "doesn't" "doesn't" >>> '"Yes," he said.' '"Yes," he said.' >>> "\"Yes,\" he said." '"Yes," he said.' >>> '"Isn\'t," she said.' '"Isn\'t," she said.' >>>
ここまでチュートリアルに記載の内容を順に進めてきたが、幾つかのサンプルをスキップ。
雑感
高専時代はスーパー不真面目学生だったこともあり、授業でプログラミング言語を勉強した記憶は殆ど無いように感じる。
作りたいものベースで、必要な言語やフレームワークの使い方を都度ググりながら覚えるというようにプログラミング言語と向き合ってきたので、
公式のチュートリアルを進めるという経験は、案外初めてかもしれない。
あとで見返してみると、中身の無い記事だろうと感じるだろうけどひとまずPythonに関してはこんな感じで続けようと思っている。
MacでPythonを始めようと思ったときにやったこと
この記事は、以下の記事を参考にやった作業をまとめたメモです(環境構築しただけです)。 http://qiita.com/spyc/items/73d1295f8b3dde3b49ca
次の職場ではPythonをガッツリ使うことになりそうなので、公式ドキュメントを見ながらゆったり体系的に勉強する機会を作っても良いかなぁと思った次第。 人から貰ったPythonスクリプトを実行した記憶があったので、実行環境は整っていたはず。 Pythonには2系と3系が存在することも薄っすらと認識していて、どうせなら3系をつかいたなぁと。←と現在この程度のPython力です。
環境
まずは環境
$ sw_vers ProductName: Mac OS X ProductVersion: 10.11.6 BuildVersion: 15G1212 $ brew -v Homebrew 1.2.2 Homebrew/homebrew-core (git revision 80032; last commit 2017-06-09)
確かPython2系は入っていた気がするが…
$ python Python 2.7.10 (default, Oct 23 2015, 19:19:21) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
ということで、どうやら2.7系は入っているらしい。
pyenv(バージョン管理ツール)の導入
Node.jsで言うところのnodebrewとイメージすればよいだろうか。 pyenvというのをインストールしました。今回はbrew経由で。
brew install pyenv ==> Installing dependencies for pyenv: openssl ==> Installing pyenv dependency: openssl ==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2l.el_capitan.bottle.tar.gz ######################################################################## 100.0% ==> Pouring openssl-1.0.2l.el_capitan.bottle.tar.gz ==> Using the sandbox ==> Caveats A CA file has been bootstrapped using certificates from the SystemRoots keychain. To add additional certificates (e.g. the certificates added in the System keychain), place .pem files in /usr/local/etc/openssl/certs and run /usr/local/opt/openssl/bin/c_rehash This formula is keg-only, which means it was not symlinked into /usr/local, because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries. If you need to have this software first in your PATH run: echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile For compilers to find this software you may need to set: LDFLAGS: -L/usr/local/opt/openssl/lib CPPFLAGS: -I/usr/local/opt/openssl/include For pkg-config to find this software you may need to set: PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig ==> Summary 🍺 /usr/local/Cellar/openssl/1.0.2l: 1,709 files, 12.1MB ==> Installing pyenv ==> Downloading https://homebrew.bintray.com/bottles/pyenv-1.0.10_1.el_capitan.bottle.tar.gz ######################################################################## 100.0% ==> Pouring pyenv-1.0.10_1.el_capitan.bottle.tar.gz 🍺 /usr/local/Cellar/pyenv/1.0.10_1: 563 files, 2.2MB
パスを設定する。 .bash_profileに以下を追記
export PYENV_ROOT="${HOME}/.pyenv" export PATH="${PYENV_ROOT}/bin:$PATH" eval "$(pyenv init -)"
ターミナルを再起動してpyenvコマンドが使えることを確認する。
$ pyenv pyenv 1.0.10 Usage: pyenv <command> [<args>] Some useful pyenv commands are: commands List all available pyenv commands local Set or show the local application-specific Python version global Set or show the global Python version shell Set or show the shell-specific Python version install Install a Python version using python-build uninstall Uninstall a specific Python version rehash Rehash pyenv shims (run this after installing executables) version Show the current Python version and its origin versions List all Python versions available to pyenv which Display the full path to an executable whence List all Python versions that contain the given executable See `pyenv help <command>' for information on a specific command. For full documentation, see: https://github.com/pyenv/pyenv#readme
Python3のインストール
Pythonの公式ドキュメントを見ると、現時点の最新は3.6.1らしい。
$ pyenv install 3.6.1 Downloading Python-3.6.1.tgz... -> https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz Installing Python-3.6.1... Installed Python-3.6.1 to /Users/d_ojima/.pyenv/versions/3.6.1
次のコマンドでpyenvでインストールしたバージョンの一覧が確認できる。
$ pyenv versions * system (set by /Users/d_ojima/.pyenv/version) 3.6.1
バージョンを切り替えます。
$ pyenv global 3.6.1 $ pyenv rehash
切り替わっているかの確認をします。
$ pyenv versions system * 3.6.1 (set by /Users/d_ojima/.pyenv/version)
$ python --version Python 3.6.1
pyenv優秀
もともと入っていた2.7系もsystemという名前でpyenvから切り替えられるのみたいです。
pipのインストール
Node.jsで言うところのnpmだと信じておく。 Pythonの標準的なパッケージ管理ツール。
$ sudo easy_install pip Searching for pip Best match: pip 9.0.1 Adding pip 9.0.1 to easy-install.pth file Installing pip script to /Users/d_ojima/.pyenv/versions/3.6.1/bin Installing pip3 script to /Users/d_ojima/.pyenv/versions/3.6.1/bin Installing pip3.5 script to /Users/d_ojima/.pyenv/versions/3.6.1/bin Using /Users/d_ojima/.pyenv/versions/3.6.1/lib/python3.6/site-packages Processing dependencies for pip Finished processing dependencies for pip
pipが使えるか確認。
$ pip list DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning. pip (9.0.1) setuptools (28.8.0)
pipコマンド自体は通るが、何やら赤文字でDEPRECATIONが表示されている。
毎回この表示は流石にうざいので、素直に従ってみます。
次の記事を参考にしました。
pip.confという設定ファイルに出力フォーマットの設定をすればいよことがわかったので。
$ cd ~/Library/'Application Support' $ mkdir pip && cd pip $ touch pip.conf
作成したpip.confに以下を記述
[list] format = legacy
再度確認してみます。
$ pip list pip (9.0.1) setuptools (28.8.0)
警告が表示されなくなりました。 めでたし。
雑感
環境構築的な作業は久々にやった気がする。
毎回思うけど、リファレンス通りにやってもバージョン違いなどが原因で必ずと言っていいほど一筋縄には行かない印象。
これからどんどんPython書くどん!
connect-mongoをサクッと試す
社内勉強会で「Node.jsを使って社内で使える便利ツールを作ろう」というテーマで簡単なWebアプリケーションの作成を行っている。
Express+MongoDB+ejs(ほぼjQuery)で最低限の機能を実装したモノは出来上がったものの、ユーザー認証機能が未実装のままだったので、ちょっと残念な感じになっていた。
Express ユーザー認証
とかで検索すると、Passport
というパッケージを使うのが定跡なように感じたが、あまり頑張らずにサクッとユーザー認証機能を実装したかったので、今回はconnect-mongo
というパッケージをサクッと試してみることにした。
Expressで認証を設定するプロジェクトの雛形を作成する
事前にexpress-generator
のインストールをしてある前提で、プロジェクトの雛形を作成し、動作確認を行います。
テンプレートエンジンにはejs
を使用した。
$ mkdir connect-mongo-skt && cd connect-mongo-skt $ express -e . $ npm install $ npm start
今回想定するログインのシナリオは、以下の通りです。
未ログイン時
* ルートへのアクセス
↓(リダイレクト)
* ログイン画面
↓(ログイン)
* ユーザーページ
ログイン時
* ルートへのアクセス
↓(リダイレクト)
* ユーザーページ
ユーザー認証に成功すると、ユーザーページへアクセス可能になるという動作に必要なrouterとviewの作成を行います。
express-generator
で作成した雛形には以下のように、indexとusersページが作成されているので、
- index → ログイン画面
- users → ログイン認証に成功されたら表示する画面
追加で、以下のviewを作成しました。(コードは後述)
- login → ログイン前にindexのrouterから呼ばれる
※現時点ではhttp://localhost:3000/users
というアドレスでusersページにアクセス出来る
connect-mongoを導入
必要パッケージのインストール
$ npm install --save connect-mongo $ npm install --save express-session $ npm install --save mongoose
app.jsの変更
パッケージの読み込みとmongooseコネクションの確立
const mongoose = require('mongoose'); const session = require('express-session'); const mongoStore = require('connect-mongo')(session); // localhost:27017 でMongoDBが起動している前提 mongoose.connect('mongodb://localhost:27017/connect-mongo-skt');
sessionを使うための準備
app.use(session({ secret: 'test', store: new mongoStore({ mongooseConnection: mongoose.connection }) }));
後でindex
内でルーティングの設定を一括して行うため以下の部分はコメントアウトします。
// app.use('/users', users);
mongooseのスキーマ定義
$ mkdir models $ touch models/userModel.js
const mongoose = require('mongoose'); let Schema = mongoose.Schema; let UserSchema = new Schema({ username: String, password: String, }); module.exports = mongoose.model('Users', UserSchema);
index.jsの変更
ModelとViewファイルの読み込み
let User = require('../models/userModel.js'); let users = require('./users.js');
router.get('/', function(req, res, next) { // debug console.log(req.session); if (req.session.user) { // すでにログイン時 res.redirect('/users') } res.render('login', { title: 'Express' }); }); /* ログイン */ router.post('/login', function(req, res, next) { // 簡単なバリデーション if (!req.body.username || !req.body.password) { res.redirect('/'); } let query = { username: req.body.username, password: req.body.password // sha1などで暗号化するのがベター } User.find(query, function(err, data) { if (err) { // エラー発生時 console.log(err); res.redirect('/'); } if (data.length > 0) { // ログイン成功時 req.session.user_id = data[0]._id; res.redirect('/users'); } else { // ログイン失敗時 res.redirect('/'); } }); }); router.post('/register', function(req, res) { // 簡単なバリデーション if (!req.body.username || !req.body.password) { res.redirect('/'); } let user = new User(); user.username = req.body.username; user.password = req.body.password; user.save(function(err) { if (err) { console.log(err); } res.redirect('/'); }); }); router.post('/logout', function(req, res) { delete req.session.user; res.redirect('/'); }); let loginCheck = (req, res, next) => { if (req.session.user_id) { next(); } else { res.redirect('/'); } } router.use('/users', loginCheck, users); // loginCheck
ログイン画面
サクッと試す目的で作成したため、ログイン画面とユーザー登録画面が単一になっています。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h2>ログイン</h2> <form action="/login" method="POST"> <input type="text" name="username"/> <input type="password" name="password"/> <input type="submit">ログイン</button> </form> <h2>新規登録</h2> <form action="/register" method="POST"> <input type="text" name="username"/> <input type="password" name="password"/> <input type="submit">登録</button> </form> </body> </html>
以上、connect-mongoを使ってログイン機能をサクッと実装することが出来ました。
GitHub
Kindleを買った
Kindleの本体代金分の本を買ったほうが得なんじゃないかという謎の衝動にかられ、ほしいものリストにある本を片っ端からカートにツッコミ、大体Kindle本体代金分ぐらいになったら発注するという謎のイベントを2,3回繰り返していた。
ただ、このイベントでは紙の書籍以外にもBDであったり、ガジェットのアクセサリ類なども同時に購入していたわけで、完全に意味の分からない状況になっていた。
今回は、母の日のギフトコードを使うと2300円OFFになるらしいので、過去の衝動買いイベントの反省も踏まえKindleを購入することにした。
選んだのは、このモデル。
機種と色は決まっていたものの、最終的に悩んだのが広告ありか広告なしかという点。
レビュー記事などを見ると、広告が表示されるのはトップ画面のみというのと、Amazonに関するAddが表示されるので、不快な広告がバンバン表示されることは無いらしいということがわかった。
Webページを見ている時にAddが表示されていても特に気にならない(よっぽど過剰でなければ)人なので、今回は広告ありモデルにした。
2000円の価格差がありその分浮いた気になって、ケーブル類を買ってしまった。
Kindel本体を手に入れたら手に入れたでKindle本を衝動買してしまっている…
結果的に読書が捗る気もするしよい気もする。
Hugoでブログを初めたけど結局はてなブログを使い始めた
案の定、ブログ始めましたポストです。
ブログを始めるにあたり、自分的に問題だったことを挙げてみる回です。 ※「◯◯問題」とか「◯◯おじさん」 みたいの大好きです。
どのブログサービス使うか問題
2017年にもなり、レンタルサーバーやVPCを借りて自分でブログ用のCMSをインストールして使う… というのは、まず無いなぁとは思いつつも、「どのブログサービスで使うか」はブログ始める人にとっては割りと課題になるんじゃないかぁと
候補としては次のようなもの
ブログサービス系
手っ取り早く始めるならここらへんを使うのがいいだろうなぁという印象。 特にエンジニアの技術系ブログはダントツはてブロ率高し
ライトなブログ系
- Tumblr
- Ameba Ownd
- Medium
ここらへんもアカウント登録するだけで初められるし、Tumblrなんかはカスタムテーマも豊富 実はTumblrはやってました→ [link]
GitHubにホストする静的ページ系
- DocPad
- jekyll
- Hugo
これらを何系とするのかは微妙なところだけど、勝手に一括りにさせてもらいました。
※ジャンル分けは適当です
結局は
HugoをGitHubにホスティングすることに
カスタマイズの自由度が高い点、内容をGitで管理できる点が大きかったです。
Hugoを選んだのはトレンド的にって言う部分と、Qiitaで参考になる記事が多く導入しやすそうだったから。
また、新しいサービスなんかが出てきたらそっちに移行するかもです。
↑とかゴチャゴチャ言っていましたが、結局はてなブログを使うことにしました。
一番の理由としては、更新するためにエディタ
→ターミナル
→GitHub
を行き来しなければいかなかった点。
Hugoの制定気ファイル生成、公開用ブランチの切り替えなどをタスクランナーで自動化するなどすれば話は別なのかもしれないが、ブログ開設にそこまでの体力を避けなかったのも原因。
まずは、コンスタントに記事を書くことを第一に考えることにします。。。
書くこと無いよな問題
これが、今までにブログを始めてみようと思うも、結局やらないパターンになった主たる要因なきがする。
最近、ちょっとしたことでもQiitaにポストするというのを初めてみた。
これを初めてみると、自分の中でWebにアウトプットすることのハードルが少し下がったと感じることがある。
それと同時に、「Qiitaに投稿するべき内容ではないけど、自分のブログになら…」という内容を書きたいことがあった。
今なら!という思いもあり、今回再びブログを始めることに??
タイトル決まらない問題
こんなのどうでもよくて、とりあえず記事書けよ自分という話なのだが、これはかなり重大問題。
同じ理由でブログを始めるかどうか迷っている人は相当数いるはず。
今回は、GitHubページの1コンテンツとしてブログを埋め込む形をとったのでタイトルは必要なかった。
いずれ、ある程度記事が溜まってきたら、専用のドメインを取ってブログ部分だけを切り出そうかなぁとも思っている。
その時にはまた、"タイトル決まらない問題”に悩まされるわけだが…