PimoroniからpHATを三種買った。
pHATというのはPimoroniが作っているRaspberryPi用の拡張ボードで今回買ったのはRaspberry Pi Zeroのサイズにぴったりのもの。装着するとちょうどRpiZeroのボードと同じサイズで重なるような感じ。
買ったのはスピーカー拡張のSperker pHATと、LEDマトリクスのScroll pHAT HD、カラーLEDマトリクスのUnicorn pHAT。どのモジュールもPythonのライブラリが公開されていて、ちょこっと使うなら簡単そう。
Pimoroniは送料も安くて、届くのも一週間程度なので使いやすいです。
スイッチサイエンスで買ってもそこまでの値段の差がないので、ケチらないならそっちでも良いかもしれない。
2017年6月28日水曜日
2017年6月13日火曜日
がんばらない
仕事でプログラムを書くとき、ややこしかったり、大きくなりそうな箇所に差し掛かると、とにかく「ゆっくりやる、ゆっくりやる、がんばらない、がんばらない」と念じて書いてる。そうすると集中力の途切れるまでの時間が多少は伸びる。ゆっくりやろうと思ったところで、さほど手の速度が落ちるわけでもないし、トータル早いし楽になる。そんな気がする。ライフハック。
2017年6月7日水曜日
npm-run-script実行時にwindowsとlinuxで統一的に環境変数を扱う
Node.jsでプログラム開発時なんかにnpm run scriptを利用することがよくある。で、開発中なのでデバッグ用の引数とか環境変数なんかを渡して実行することがあるのだけど、これはただのコマンドなので環境変数の指定の仕方はOSに依存する書き方になる。
Windowsのcmd.exeならset hoge=fuga&& node index.jsみたいな感じになるし、Linux系のshの場合はhoge=fuga node index.jsという書き方になる。PowerShellの場合また違うはずだけどよく知らない。
で、完全に実行や開発環境が同OSで固定されていればなんの問題もないのだけど、そうじゃないときもある。例えば、クライアントとサーバーがWindowsとLinuxで、同じスクリプトを利用するというようなときがある。もちろん、OSごとにscriptsに書いても良いんだけど、面倒くさい。で、調べてみるとcross-envというパッケージを使うのが定番らしい。
https://www.npmjs.com/package/cross-env
scriptの頭にcross-envを読んで、あとはshと同じ書き方で設定すれば、OS問わず環境変数を設定してくれるようになる。つまり、"cross-env hoge=fuga node index.js"とすればあとはcmd.exe上でも問題なく環境変数に設定してくれる。便利。
Windowsのcmd.exeならset hoge=fuga&& node index.jsみたいな感じになるし、Linux系のshの場合はhoge=fuga node index.jsという書き方になる。PowerShellの場合また違うはずだけどよく知らない。
で、完全に実行や開発環境が同OSで固定されていればなんの問題もないのだけど、そうじゃないときもある。例えば、クライアントとサーバーがWindowsとLinuxで、同じスクリプトを利用するというようなときがある。もちろん、OSごとにscriptsに書いても良いんだけど、面倒くさい。で、調べてみるとcross-envというパッケージを使うのが定番らしい。
https://www.npmjs.com/package/cross-env
scriptの頭にcross-envを読んで、あとはshと同じ書き方で設定すれば、OS問わず環境変数を設定してくれるようになる。つまり、"cross-env hoge=fuga node index.js"とすればあとはcmd.exe上でも問題なく環境変数に設定してくれる。便利。
2017年6月6日火曜日
Node.jsネイティブのasyncとawait
Node.jsのv7.6からasync awaitが使えるようになった。これは非同期処理の可読性を向上させるための機能で、asyncで宣言した関数はすべての戻り値がPromiseとして返されるようになる。つまり、
みたいな感じになる。これはこの関数が非同期だという宣言だからだけど、より具体的な利便性の向上としては、async関数内ではawaitが利用できるということがある。awaitは他の非同期の関数(Promiseを返すもの。async関数じゃなくても良い)を同期的な処理のように待ち受けできるということにある。
awaitを待つとはいえ、そこはasync宣言がされた非同期処理内なので処理がブロックされるということではない。順序をどおりに処理が呼び出されるというだけである(Promiseがチェインするように書いたときと同じように)。
ちなみにawaitで宣言した場合、resolveに渡されたものはそのまま戻り値になり、rejectされたものは例外として投げられる。そのためrejectされる可能性がある場合はtry,catchで処理しなければならない。
あと意外と忘れがちなのが、awaitを使うときは、それが直接含まれる関数がasyncではなければならないということ。これはアロー関数も含まれるので、forEachとかmapとかにcallbackを渡して使ったときに忘れがち。
ちなみに上記の処理の場合、list内の要素への処理が順番に実行されるという保証はない。(各要素eにa,bの順番で呼び出されることは保証されてる)。この場合だとlistの各要素への処理順序も守りたい場合は、普通にfor文を使って処理するのが手っ取り早い。
async function hoge(){ return 1; //return Promise.resolve(1)と同じ }
みたいな感じになる。これはこの関数が非同期だという宣言だからだけど、より具体的な利便性の向上としては、async関数内ではawaitが利用できるということがある。awaitは他の非同期の関数(Promiseを返すもの。async関数じゃなくても良い)を同期的な処理のように待ち受けできるということにある。
async function hoge(){ const result = await fuga();//promiseを返す非同期の処理 return hogefuga(result);//fugaがpromiseを解決してから処理される }
awaitを待つとはいえ、そこはasync宣言がされた非同期処理内なので処理がブロックされるということではない。順序をどおりに処理が呼び出されるというだけである(Promiseがチェインするように書いたときと同じように)。
ちなみにawaitで宣言した場合、resolveに渡されたものはそのまま戻り値になり、rejectされたものは例外として投げられる。そのためrejectされる可能性がある場合はtry,catchで処理しなければならない。
あと意外と忘れがちなのが、awaitを使うときは、それが直接含まれる関数がasyncではなければならないということ。これはアロー関数も含まれるので、forEachとかmapとかにcallbackを渡して使ったときに忘れがち。
function hoge(list){ list.forEach(async (e)=>{ // ← ここがちゃんとasyncになっている必要がある await a(e); await b(e); }); }
ちなみに上記の処理の場合、list内の要素への処理が順番に実行されるという保証はない。(各要素eにa,bの順番で呼び出されることは保証されてる)。この場合だとlistの各要素への処理順序も守りたい場合は、普通にfor文を使って処理するのが手っ取り早い。
2017年6月4日日曜日
息子と協調性と自分
参観日などで見たり、妻の話を聞く限り、息子は協調性に欠け、先生の話を聞いてない。これは問題かなと考えてみるが、振り返って見るに自分も完全にそうであった。というか、参観日で先生が教育方針がどうのとか説明し始めた瞬間、すごい退屈になって眠り始めたりするし、親御さん方が並んで混雑してたりするともう良いかと思って適当に外れて座ってたりするし、今現在でも完全にそのままである。
そうだとすると、別に良いのだろうなと思う。
外からすると問題なのかもしれないが、自分で嫌だったことはないし、私の両親もそれを「ふつう」に直そうとはしなかった。しかし協調性や共感の必要な職業には向かないので、一人でなんでも出来るように、独学で物事を習得する方法とかはうまく伝えてやらなければと思う。
そうだとすると、別に良いのだろうなと思う。
外からすると問題なのかもしれないが、自分で嫌だったことはないし、私の両親もそれを「ふつう」に直そうとはしなかった。しかし協調性や共感の必要な職業には向かないので、一人でなんでも出来るように、独学で物事を習得する方法とかはうまく伝えてやらなければと思う。
2017年6月3日土曜日
electronでWindows向けにexe作る
electron-packagerとelectron-builderがあるんだけど、builderのが良いとのこと。
https://stackoverflow.com/questions/37113815/electron-builder-vs-electron-packager
ビルドのためのオプションはpackage.jsonのbuildプロパティ下に設定する。
installer要らない場合、targetをportableにすれば良い。target自体はOSによって違うので、実際には、"win":{"target":"portable"}みたいに設定する。
タスクトレイのアイコンとか、読み込むファイルを追加するのはextraFilesで指定すると良さそう。ちなみにフォルダ内にある場合はそのままフォルダもコピーされる。extraResourcesだとresourcesフォルダにコピーされるんだけど、このあたりの使い分けがまだ良くわかってない。resourcesフォルダだけは何かしらの方法でさくっと読み込めたりしたりするんじゃないかと思う。
https://stackoverflow.com/questions/37113815/electron-builder-vs-electron-packager
ビルドのためのオプションはpackage.jsonのbuildプロパティ下に設定する。
installer要らない場合、targetをportableにすれば良い。target自体はOSによって違うので、実際には、"win":{"target":"portable"}みたいに設定する。
タスクトレイのアイコンとか、読み込むファイルを追加するのはextraFilesで指定すると良さそう。ちなみにフォルダ内にある場合はそのままフォルダもコピーされる。extraResourcesだとresourcesフォルダにコピーされるんだけど、このあたりの使い分けがまだ良くわかってない。resourcesフォルダだけは何かしらの方法でさくっと読み込めたりしたりするんじゃないかと思う。
2017年6月1日木曜日
webpackでelectronのレンダラプロセスのjsをビルドする
Vue.jsでelectronのアプリ書こうと思ったんだけど、単一ファイルコンポーネントとか使って、webpackでビルドしようとすると、当然うまくいかない。コンポーネント内のrequireはwebpackに解決されてしまうので、ipcとかrequireしようとするとエラーになってしまう。
で、webpack公式ドキュメントを眺めてたら書いてあった。
https://webpack.github.io/docs/configuration.html#target
webpack.config.jsのtargetにelectronを設定すりゃいいとのこと。
で、webpack公式ドキュメントを眺めてたら書いてあった。
https://webpack.github.io/docs/configuration.html#target
webpack.config.jsのtargetにelectronを設定すりゃいいとのこと。
登録:
投稿 (Atom)