Raspberry Pi 2でのWekanの動かし方
まとめ
- Raspberry PiでWekanは動くらしい
- https://discuss.wekan.io/t/platforms-support/12/11
- WekanコミッタがArmv6やArmv7で動くと言ってる
- 個人的にはWekanをRaspberry Piで動かせなかった
- Wekan(prebuild)は起動途中でnodeパッケージがELFエラーする
- MeteorでWekanをbuildしようとすると、パッケージcfs:gridfsのArmv7向けがなく失敗する
参考元
- Node.js
- http://qiita.com/ryugyoku/items/bf0fafe8be8b5faa7754
- nvm、nodejs、npmをいれる
- Wekan
- https://github.com/wekan/wekan/wiki/Install-and-Update
- 内包してるnodeライブラリがx86依存のため、ソースからビルドを選択する
- https://github.com/anselal/wekan/blob/master/autoinstall_wekan.sh
- 公式提供のbash script、参考になる。
- Meteor on ARM
- http://meteor-universal.tumblr.com/
- http://meteor-universal.tumblr.com/post/118809833179/1st-time-installation-meteor-universal-raspbian-wheezy
- Wekanをビルドするためのツール
- Raspberry Pi向けにprebuildのMeteorを提供している
概要
Node.jsの準備
→Meteorのインストール
→Wekanのビルド
→Wekanのインストール
Node.jsの準備
gitレポジトリからnode.jsを持ってくる。
Wekanの都合から、node.jsはv0.10.40をいれないといけない。
nvm(Node Version Manager)とnpm(node package manager)を使うのがメジャーなようなので、採用する。
なお、node.jsのインストールは時間がかかる。
また、source ~/.nvm/nvm.shを.profileに記述する。
$ git clone https://github.com/creationix/nvm.git ~/.nvm $ ~/.nvm/nvm.sh $ nvm install v0.10.40 $ npm update -g npm
Meteorのインストール
MeteorはWekanのビルドに必要なだけなので、$HOMEへ置く。
管理者権限は必要ない。
そこそこ時間がかかる。
$ cd $HOME $ git clone --depth 1 https://github.com/4commerce-technologies-AG/meteor.git $ $HOME/meteor/meteor --version
途中でcurlの認証書エラーがする場合は、必要に応じて証明書をアップデートする。
ただし、ラズパイの証明書のアップデート方法を調べるのがめんどかったので、今回は-kオプションを使いエラーを無視した。
--- ./git/meteor/meteor 2016-04-07 14:41:11.560265384 +0900 +++ ./meteor/meteor 2016-04-07 22:41:14.946819041 +0900 @@ -1,6 +1,8 @@ #!/usr/bin/env bash BUNDLE_VERSION=0.5.16 +CURLFLAGS='-k' # OS Check. Put here because here is where we download the precompiled # bundles that are arch specific. @@ -100,7 +102,7 @@ # test if we can download the dev_bundle tarball function __check_tarball_download() { - CHECK_TARBALL=$(curl --head --location --silent "$DEV_BUNDLE_URL_ROOT$TARBALL" --output /dev/null --write-out '%{http_code}') + CHECK_TARBALL=$(curl $CURLFLAGS --head --location --silent "$DEV_BUNDLE_URL_ROOT$TARBALL" --output /dev/null --write-out '%{http_code}') # Write down a message instead doing a false download if [ "$CHECK_TARBALL" != "200" ] ; then if [ -n "$METEOR_UNIVERSAL_FLAG" ] ; then @@ -127,11 +129,11 @@ elif [ -n "$SAVE_DEV_BUNDLE_TARBALL" ] ; then # URL duplicated in tools/server/target.sh.in __check_tarball_download - curl --location -# "$DEV_BUNDLE_URL_ROOT$TARBALL" >"$SCRIPT_DIR/$TARBALL" + curl $CURLFLAGS --location -# "$DEV_BUNDLE_URL_ROOT$TARBALL" >"$SCRIPT_DIR/$TARBALL" tar -xzf "$SCRIPT_DIR/$TARBALL" -C "$BUNDLE_TMPDIR" else __check_tarball_download - curl --location -# "$DEV_BUNDLE_URL_ROOT$TARBALL" | tar -xzf - -C "$BUNDLE_TMPDIR" + curl $CURLFLAGS --location -# "$DEV_BUNDLE_URL_ROOT$TARBALL" | tar -xzf - -C "$BUNDLE_TMPDIR" fi # In case that we have to use the universal system environment, make sure
(Additional)Meteorのインストールの確認
心配な人はMeteorのexampleを動かす。
時間はかかる。
$ cd $HOME $ $HOME/meteor/meteor create --example todos $ cd todos $ $HOME/meteor/meteor $ # この後に、http://[IP Address]:3000/ にアクセス
以下のようなエラーが起きた場合は、localesをen_GB.UTF-8からen_US.UTF-8に変更すると治る。
公式githubで議論されてる。
$ ~/meteor/meteor [[[[[ ~/tmp/meteor-test/todos ]]]]] => Started proxy. Unexpected mongo exit code 1. Restarting. Unexpected mongo exit code 1. Restarting. Unexpected mongo exit code 1. Restarting. Can't start Mongo server. MongoDB failed global initialization Looks like MongoDB doesn't understand your locale settings. See https://github.com/meteor/meteor/issues/4019 for more details. $ sudo dpkg-reconfigure locales # en_US.UTF-8にする $ ~/meteor/meteor [[[[[ ~/tmp/meteor-test/todos ]]]]] => Started proxy. => Started MongoDB. Starting your app $ # この後に、http://[IP Address]:3000/ にアクセス
Wekanのビルド
TODO、うまくいってない。
$ git clone https://github.com/wekan/wekan.git $ cd wekan $ git checkout v0.10.1
Wekanのインストール
公式提供のautoscriptを使う。
ただし、公式のレポジトリからzipを落とす部分を、自分でビルドしたWekanを使うように書き換えて実行する。
また、sudoではなくsudo suしてrootアカウントにならないとディレクトリ権限がおかしくなりエラーで落ちる。
気づかずにだいぶハマった。
$ git clone https://github.com/anselal/wekan/blob/master/autoinstall_wekan.sh $ vi ./wekan/autoinstall_wekan.sh $ sudo su # ./wekan/autoinstall_wekan.sh
- wget https://github.com/wekan/wekan/releases/download/v0.10.1/wekan-0.10.1.tar.gz + # wget https://github.com/wekan/wekan/releases/download/v0.10.1/wekan-0.10.1.tar.gz
終わると、/etc/init.d/wekanと/usr/local/bin/get-ip-addressと/etc/network/if-up.d/show-ip-addressが作成される。
ポート番号などの設定は/etc/init.d/wekanの変数を書き換える。
get-ip-addressの中身は単純なbash script。
ちなみに、Debian testingを使った際は、ifconfigのフォーマットが合わないので改変する必要がある。
回路図CAD+プリント基板CADな感想
某人が雑にブログをさくさく書くのやってるの、よいので真似しよう。
軽い気持ちでネットに知識を保存して、世界をちょっとだけよくするのよい。
CR-5000
- 図研
- 多くの企業で採用されている実績のある回路・基板CAD
- 日本語おk、なはず
- 強い
- けど高いのでまだ使ったことない
Eagle
- CadSoft
- 100x80mmや部品数・レイヤーに制限ありまでは無料
- 英語
- 有料になると急に5〜20万と本気を出してくる
- 回路図・基板・自動配線の3つのうちたくさん買うほど高額
- えげつない
- 強い
- 老舗なのか、他フリーCADはEagle形式をインポートできるのを強みに言う
Design Spark PCB
- RS compornents関係
- RSの部品Noをつけた部品リストを出せる機能がある
- 国内のPCB試作メーカにすぐに見積もり・発注が出せる機能とかある
- 完全無償で商用利用もおk
- 英語
- Eagleのデータをインポートできる
- 移動とか基本が普通CAD系の操作感で使いやすい
ヌードルメーカーで家二郎
この記事はNoodleMaker Advent Calendar 2014 20日目の記事です。
各所で話している通り、
こんな目に会いました。
本気には本気で返す
というわけで家二郎を作ることになりました。
今回はフィリップスのヌードルメーカーで家二郎ができることを報告します。
参考文献
機材・材料
- 機材
- フィリップスヌードルメーカー
- 一口IHコンロ
- 鍋4つ
- スープ大鍋
- 麺茹で大鍋(フライパンで代用)
- 油加熱小鍋
- カエシ鍋
- レンチンできる大きめのタッパー(ヤサイ茹で用)
- フィリップスヌードルメーカー
- 材料(約5人分)
- スープ(約鍋1杯、丼10杯分くらい?)
- げんこつ(豚の骨)1本約300g
- 玉ねぎ 1個
- キャベツの芯 1個
- ネギの青い部分 1個
- にんにく 1欠片
- 生姜 1欠片
- カエシ
- 醤油 300ml
- みりん 80ml
- 麺
- 小麦 400g
- 水 140g(加水率35%)
- 塩 4g(1%)
- 食用重曹 4g(1%)
- 小麦 400g
- 具
- 豚肩ロース 800g
- キャベツ 半玉
- もやし 3袋
- にんにく 1欠片〜
- 豚背脂 500g
- スープ(約鍋1杯、丼10杯分くらい?)
スープ
カエシ
材料を混ぜて加熱。
みりんのアルコールを飛ばして置いておきます。
油(スープと平行)
下茹で
前述、スープと一緒に2時間ほど煮ます
本茹で
食べる前に小鍋に入れて包丁でザクザク細かく切ります。
その後、軽く沸騰するまで火にかけて、火から下ろします。
あとは余熱でいい感じにとろけます。
ヤサイ
キャベツは一口サイズほどに切ります。
もやしと一緒にタッパーに入れてレンジ500Wで約1分半チンします。
麺
水に塩・重曹を溶かしておく。
小麦粉をヌードルメーカー(2.5mm各麺)にセットする。
8分でヌードルメーカーをスタートさせる。
水はじっくり少しずつ1分ほどかけて入れる。
麺は1人前ずつでカットする。
湯で時間は約4分〜5分です。
ニンニク
みじん切り
できあがり
カエシ1:スープ4:油1くらいで丼に入れる。
茹で上がった麺を入れる。
野菜・ニンニク・チャーシューを盛る。
アブラ増しの場合はさらにアブラを上からかける。
カラメの場合はさらにカエシを上からかける。
じろうだわ URL
まとめ
- フィリップスのヌードルメーカーで家二郎はできる
- 一口コンロのIHでも頑張れば家二郎はできる
- mzpギルティ
SML with マイコンボード
この記事はML Advent Calendar 2014 14日目の記事です。
最近は、お仕事でマイコンボードプログラミングを書いています。
現在はBeagle Bone Black(以下BBB)をいじっています。
ところでこのマイコンボードはArmでフルのLinuxを動かすことができます。
さらにこんなコメントが。
mltonってARM対応してましたよね…
もちろんBBBは各種GPIOやLEDをLinuxのファイルシステムとして提供してくれています。
つまりファイルの読み書きさえできて、Arm対応の言語なら何でもマイコン操作ができるはずです。
そこで今回はMltonによるマイコンボードプログラミングを紹介します。
環境
- Beagle Bone Black (Rev C)
- Ubuntu 14.10 utopicをインストール済み
- apt-getでMltonのインストール済み
Beagle Bone BlackのGPIOの操作方法
- 以下のサイトを参考にしました
- shellからの操作がとても参考になる。
- ピン番号についての一覧エクセル/PDFも便利。
http://www.si-linux.co.jp/techinfo/index.php?BeagleBoneBlack
# echo 60 > /sys/class/gpio/export # 60番GPIOを使用 # 新しいディレクトリgpio60ができる # echo out > /sys/class/gpio/gpio60/direction # outputに指定 # echo 0 > /sys/class/gpio/gpio60/value # HIGH出力 # echo 1 > /sys/class/gpio/gpio60/value # LOW出力
SMLによるGPIOモジュールの例(Arduino風)
上記シェルコマンドの動作をそのまま落とし込むだけです。
100行以下の小さなお試しプログラムです。
(* DIGITAL_GPIO.sig *) signature DIGITAL_GPIO = sig type pin = int datatype mode = OUTPUT | INPUT (* | INPUT_PULLUP *) datatype value = HIGH | LOW val pinMode : pin * mode -> unit val digitalWrite : pin * value -> unit (* 省略 val digitalRead : pin -> value *) end
(* DigitalGPIO.sml *) structure DigitalGPIO : DIGITAL_GPIO = struct type pin = int datatype mode = OUTPUT | INPUT datatype value = HIGH | LOW val path = "/sys/class/gpio" fun startPin pin = let val path = path ^ "/export" val outs = TextIO.openOut path val () = TextIO.output (outs, Int.toString pin) val () = TextIO.closeOut outs in () end fun setMode (pin, mode) = let val path = path ^ "/gpio" ^ Int.toString pin ^ "/direction" val modeString = case mode of OUTPUT => "out" | INPUT => "in" val outs = TextIO.openOut path val () = TextIO.output (outs, modeString) val () = TextIO.closeOut outs in () end handle IO.Io error => () fun pinMode (pin, mode) = let val () = startPin pin val () = setMode (pin, mode) in () end fun digitalWrite (pin, value) = let val path = path ^ "/gpio" ^ Int.toString pin ^ "/value" val v = case value of HIGH => "1" | LOW => "0" val outs = TextIO.openOut path val () = TextIO.output (outs, v) val () = TextIO.closeOut outs in () end end
(* Main.sml *) structure Main : sig val main : unit -> unit end = struct fun init () = DigitalGPIO.pinMode (60, DigitalGPIO.OUTPUT) fun loop () = let val () = DigitalGPIO.digitalWrite (60, DigitalGPIO.HIGH) val () = OS.Process.sleep (Time.fromReal 0.5) val () = DigitalGPIO.digitalWrite (60, DigitalGPIO.LOW) val () = OS.Process.sleep (Time.fromReal 0.5) in loop () end fun main () = (init (); loop ()) end val () = Main.main ()
できたプログラムをBBB上で実行すると、P9-12番ピン - GND間に繋いだLEDが1秒周期でチカチカします。
やったね!
setMode関数でIo例外を握りつぶしています。
実行初回だけdirectionファイルがビジー状態のエラーがでるためです。
もしかするとexport設定後のdirectionファイルへのアクセスが早過ぎる?
この辺はまだ調査中です。
列挙型と代数的データ型
今日はなごやかJava第1回 - connpassに行って来ました。
そこで@bleisさんによるJavaとC#(とF#)の比較の話の中で列挙型(と代数的データ型)について話題に上がりました。
SML好きな自分が最近C++を書いてて同じように2つの違いについて思ったことがあったので、ここに書いておきます。
列挙型
- (おそらく)有限数状態を表すために作られた
- int等でもプログラマが管理すれば同様の機能は実現できる
- 状態の意味を名前付けしたり、状態数の制限を付加できる
- C/C++やJavaなどで使える*1
- ラベルのみを持つ
- 使用例
// C++ // 定義 enum Janken { Gu, Choki, Pa }; // 使用 int walkLength(Janken hand) { switch(hand) { Gu: return 3 // グリコ Choki: return 6 // チョコレート Pa: return 6 // パイナップル } }
代数的データ型
- 数学の直和が理論の元になっている
- 集合A,Bに対して2つの直和A+Bは A+B = { a_label(x) | x∈A } ∪ { b_label(x) | x∈B }
- つまり、どちらの集合から来たかラベルが付いた和集合
- HaskellやOCamlやSMLやScalaで使える
- 型推論が効く
- 強力なパターンマッチが使える
- 列挙型と違い、ラベルだけでなくデータも持てる
- そもそも列挙ではなく、複数の型を直和した別な型をつくる概念
- Cでいう共用体(union)にラベルが付いている、ほうが正しく表していると思う
- 暗黙の型変換は存在しない
- 使用例
(* SML *) (* 定義 *) datatype janken = Gu | Choki | Pa | LocalRule of string * int (* 使用 *) fun walkLength hand = (* 型推論結果: fn: janken -> int *) case hand of Gu => 3 | Choki => 6 | Pa => 6 | LocalRule (name, n) => n (* "グリコノオマケ"、など *)
まとめ
Emacsのバッファ移動に便利なショートカットキー
問題点
C-xoでバッファ移動はできるけどバッファを3分割以上してると移動がめんどくなってきますよね。
自分は5画面(メイン1つ、サブ2つ、grep-find対象、grep-find結果)があるのでC-xoでは対処できなくなってきました。
そこでバッファをもっと便利に移動する設定を紹介。
よくある設定
Shift+カーソルキーでバッファが移動できるようになります。
めっちゃ便利!
しかし使っているとシフトを押すのがだるくなってきました。
(windmove-default-keybindings) (setq windmove-wrap-around t)
今回の設定
そこでシフトすらいらないように設定。
そもそもEmacsではfbpn使うからカーソルキーなんて使わないって人におすすめ。
カーソルキーは全部バッファ移動に割り当ててしまいましょう.
(global-set-key (kbd "<left>") 'windmove-left) (global-set-key (kbd "<right>") 'windmove-right) (global-set-key (kbd "<up>") 'windmove-up) (global-set-key (kbd "<down>") 'windmove-down)
やっぱりカーソルキーはほしい
手をカーソルキーまで移動するのもめんどいので、C-c+hjklを追加
手を移動させるのはとても面倒なことですよね。
;;; C-x oの代わりのバッファ移動 (global-set-key "\C-cl" 'windmove-right) (global-set-key "\C-ch" 'windmove-left) (global-set-key "\C-cj" 'windmove-down) (global-set-key "\C-ck" 'windmove-up)
まとめ
今はこのC-c+vi操作が気に入っています。
まじ便利
C言語で非アスキー文字を使う方法
諸事情でArduinoを使っています。
さらにArduino ROBOTO LCDを組み合わせています。
さてこのLCDはアスキー文字を表示できますが、実はアスキー外にも文字が定義されています。
その中で-9(unsignedだと247)*1を含んだ文字列を表示する方法で困ったのでまとめます。
無理やりキャストする
できるけどさっぱりクールじゃない。
コードも読みづらいです。
char* s = "a"; char[0] = (char)(-9);
16進数を使う
@keita44_f4 あ、今試したら C が16進エスケープの一部として読まれちゃうから "5\xf7" "C" みたいにして逃げないといけなかった
ただしchar1文字しか使わないならN2文字で区切る必要があります。
char* s = "\xf7";
8進数を使う
@dico_leque @keita44_f4 そういうときは octal で "5\367C" だー。
2014-06-30 19:09:55 via twicca to @dico_leque
char* s = "\367";
まとめ
C難しい
*1:-9は上付き丸に割り当てており、℃を二文字使って表せる