CrystalのプログラムをRaspberry pi上で動かす

この記事は MCC Advent Calendar 2017 - Adventar の7日目の記事です。

早くも3投稿目になりますががんばって行きましょう。

パッと記事の投稿予定をみると技術系の記事が多かったので同調圧力に負けてそういった記事を書いてみようと思います。

背景

ラズパイのGPIOとマイコンを連携(もしくはGPIOをそのまま使うなど)して、センサーから色々データをとったり家電を操作しようということ試みる。

インターフェースとしてWebサーバーを置こうということを思い立ったが、Railsとかいじるのも癪なのでなんか面白そうなWebフレームワークを探し始める。

Rubyライクな「Crystal」という言語でつくられた「Amethyst」というフレームワークを見つけたので使ってみようということになった。

そうメジャーな言語ではないと思うがCrystalについては最近いろいろな人がいじって話題にしているのでそちらを参考にしてほしい。

ポストRubyだなんだといっているがそういうのには興味なくて、使いやすい場面で使ってくれといったかんじ*1

問題点

紆余曲折*2あって、とりあえずラズパイにCrystalのコンパイラを乗せることにするがここで問題が発生する。

ARM向けのバイナリがない

さらに

コンパイラはCrystalで記述されている

対処

ザッと調べてみたところ、以前に「ARM向けコンパイラをつくる」というissueが立っていた。

このissueは「クロスコンパイルオプションを実装する」というissueにmergeされていた。

つまり、クロスコンパイルで自分でARM向けバイナリをビルドしろということか・・・

# helloworld.cr
puts "Hello world!"
$ crystal build --cross-compile -D arm --target=arm-unknown-linux-gnueabihf helloworld.cr --release --mcpu=arm1176jzf-s

今回つかったのはRaspberry pi zeroでCPUがARM1176JZF-Sですが、2や3ではCortexだったと思うのでまたオプションが変わってくるとおもいます。(試していないので性格なことはわかりませんが)

コンパイルすると、ターゲット環境で以下のコマンドを実行しろよ、といった雰囲気の文字列が表示されます

cc 'helloworld.o' -o 'helloworld'  -rdynamic  -lpcre -lgc -lpthread /usr/local/Cellar/crystal-lang/0.23.1_3/src/ext/libcrystal.a -levent -lrt -ldl -L/usr/lib -L/usr/local/lib

なるほど、ターゲット環境にもCrystalのソースはあったほうがいいわけだな。

いい感じにgit cloneして先程のコマンドを実行したところ実行形式バイナリがポンと吐かれました

$ ./helloworld
Hello world!

やりました。

まとめ

時間がなくてなんとかHelloWorldをするところまでしかこぎつけられませんでしたが、いい感じにやればいい感じに行くんじゃないかなという気がしています(がどうなんでしょうか)

なにはともあれ近いうちにAmethystを動かすところまで漕ぎ着けたいです。


明日の予定はありません!!!!各位!!!

adventar.org

*1:といった点ではWebに静的型付き言語はどうなのかと思うところもあるが...

*2:かどうかは諸説ある

リアルお料理対決をした話

この記事は MCC Advent Calendar 2017 - Adventar の4日目の記事です。


料理とは 果てなき荒野そのものである

美味しさも不味さも、数限りなく点在する荒野……!

f:id:gurapomu:20171204192830p:plain

背景

先日、スッと合宿所に行ってみたら、料理勝負などという面白そうなことをやっていたので参加してきました。

開始

形式は団体戦で1チーム5,6人で3チームに別れて勝負をすることになりました。

お題はホットプレートを使った料理ということで、自分のチームは餃子をつくることになりました。最終的な料理名は「特製!和風餃子」というところにまとまっています。

材料

だいたいの材料は以下のとおりです。餃子100個分の分量になります。

  • 餃子の皮 100枚
  • 豚ひき肉 300~400g
  • 白菜 1/2~1/4玉(1/2では多いが1/4では少し足りない気がする)
  • 大葉 10枚
  • 干し椎茸 1パック
  • 醤油
  • ほんだし
  • ごま油
  • (おろし生姜)

当日、おろし生姜を入れる予定だったのですがすっかり買うのを忘れていました。なんとかなりましたが、入れたほうが味にまとまりが出るはずです。

調理

まずは、干し椎茸を水につけて戻しておきましょう。戻すのに使った水は、タレを作るのに使うので絶対に捨ててはいけません!

次に、タネを作っていきます。まずは白菜を刻みます。大きさはお好みですが食感が欲しい人は粗みじん切り(だいたい3~4mm角程度)にしておきましょう。大葉は横に細く切っていくと雰囲気が出て良いです。

材料を切り終わったら用意した材料を、餃子の皮を除きすべて混ぜ合わせてください。さっき戻したしいたけも忘れずにね!

タネが出来たら、餃子の皮で包んでいきます。料理の味というのは良くも悪くもビジュアルによって左右されがちです。美味しく味わってもらうにはやはりきれいに包んだほうが良いでしょう。コツとしては、皮の片側のみを折り込んで包んでいくことです。

さて、餃子を包み終わったらホットプレートを温めます。230~240度に設定してください。(ホットプレートって温度が数字で設定できるのでコンロより定量的に説明しやすいですよね)十分に鉄板が温まったら餃子を素早く乗せましょう。ジージーと焼ける音がしたら熱湯を注いで蓋をします。このとき、お湯はだいたい餃子の1/5~1/6が浸かるくらいが良いと思います。

水分を飛ばす間に、タレを作ってしまいましょう。これは簡単です。最初にしいたけを戻すのに使った水にほんだしを加えます。(旨味の相乗効果でトリプルパンチです)さらに醤油をくわえて味をつけます。少しずつ加えて、塩気はお好みで調整してみてください。

鉄板にいれたお湯がなくなったらいよいよ仕上げです。蓋を取りましょう。焦げ目はお好みですが、個人的には和風餃子にはあまり焦げはない方がいい気がします。お好みのところで火をとめて完成です!

実食

しいたけやほんだし、大葉の風味が和風にまとまって素晴らしい出来だったともいます。もう2つのチームは「餃子チーズタッカルビ」と「りんご入りホットケーキ」をつくってくれました。どちらも美味しく、大満足だったと思います。

f:id:gurapomu:20171205092259j:plain

まとめ

そういえば、お料理対決とかいいつつ勝負をつけてなかったなーと思います。まあおいしかったのでいいか。

自分が写真とってなかったのも心残りですね。当日参加して、もし写真撮っている人がいれば、私宛に送ってくれればこの記事が華やかになるので是非よろしくお願いします。


明日は@GEN52462138くんです!よろしくお願いします!!!

TUATMCC 2017の総括

この記事は、MCC Advent Calendar 2017 - Adventar 1日目の記事です。


皆さんおはようございます.

TUATMCC,元部長のぐらぽむでございます.

本日は,2017年ももう12月ということで,少し早いですが2017年のMCCの総括をしていきたいと思います.

後輩の皆には,ぜひこの記事を来年提出する活動報告書等に活用していただければと思います.


1月

ICTSC7の予選に出ていました.HTML/CSS問題を説いていたんだけどunicodeの半角スペースが紛れ込んでいてキレた思い出.個人的には色々あって忙殺されていました.

2月

MCC初の合宿に行きました.LT大会とハッカソンをやって酒をのんで寝たのでもう最高だった思い出です.

3月

ICTSC7の本選に出場していました.ぐわーーっとやったけど新人賞(総合4位)でしたね.悔しい.ちなみに予選順位は2位でした:thinking_face:

春季休業中なので他には特になにもない気がします.

4月

新入生歓迎シーズンでしたね.今年は新入部員が多かった気がするし,現在残っている人間も例年より多い気がするので後輩諸君にはぜひ大事にしていってもらいたいです.

5月

新歓LTをやりました.みんなそれぞれユニークな話題で興味深かったです.ちなみに自分はPPTをつかったクソアイコンの作り方と野球の話をしました.

それから,各種講習会をいろいろやりましたね.ありすぎてわけわからないことになりかけてたけど,参加してくださった方々ありがとうございました,開催してくださった方々お疲れ様でした.経験を活かして,来年は是非教える立場で,というのも面白いと思います.

6月

めちゃくちゃ遅くなったけど確定新歓をやりました.寿司とピザを食ってお話をするだけの会でしたが...体調不良で途中抜けして申し訳なかったです.

7月

学内向けLT大会を開催しました.主に自分のコネクションを使ってでしたが,サークルというくくりを抜けて専門外の人にも情報発信する機会ができてよかったのではないかと思っています.是非第2回も開催したい!

それから,ICPC国内予選にも出場しました.MCCからは3チーム出ましたが,一番成績の良かったチームは大学別順位で2位を記録していました.つくば大会,タイ大会も近くに控えているので是非頑張って欲しいですね...!

8月

MCC夏合宿を行いました.花火が見れる部屋でとてもキレイだったとのことでした.一方では地下室にこもってハッカソン中「なんか外バンバンうるせえな」「花火じゃん,風情もへったくれもねえな」という一幕もありました...

それからICTSC8にも出場しました.4人エントリーしたはずなのに予選を解きに来たのは自分含めて2人という惨劇.「これは予選敗退ですね」と言っていたものの,滑り込みセーフで本選出場,ですが残念ながら入賞には至りませんでした.総合順位はたぶん5か6位くらいだったと思います.無念

9月

ツイッターとかを見返しましたが,MCCっぽいイベントは何もなかったです.

10月

こちらも何もなさそう.MCC秋やる気あるの??????

11月

農学部学祭に出展しましたね.いろんなゲームを展示したり風船を配布したり,子供に大人気だったなーというイメージです.

まとめ

去年に比べて何かが大きく変わった一年だったと思います.合宿を始めたり,学内向けのLT大会をやってみたり,春の講習会を増やしてみたり.

2017年もいよいよあと1ヶ月となりましたが,頑張っていきましょう.

あ,今年こそアドベントカレンダー完走しましょうね!!!!

 

明日の記事を書く人は...いません! おい!!!!!!!!!!

CentOS7のカーネルをソースからビルドする

背景

俺はUbuntu16.04のVagrantfileをcpしたはずだったんだがいざあげてみるとaptが使えず何が起こったのかと思ったらCentOS7のVagrantfileをcpしていた。(ブチ切れた

本題

めんどうなのでそのまま始めた

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "2", "--ioapic", "on"]
  end
end

諸々必要なやつをいれる

$ apt -y install gcc bc openssl libncurses5-dev

ソースを落として解凍

$ cd /usr/src
$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.54.tar.xz
$ tar xvf linux-4.9.54.tar.xz
$ cd linux-4.9.54.tar.xz

コンフィグを作成してmakeとinstall

$ make oldconfig
$ make menuconfig
$ make && make modules_install && make install

DockerでSpigotサーバーを立てる

8/30 spigotのダウンロード部分について追記

8/31 hostとのディレクトリ共有・デタッチについて追記

背景

久しぶりにプラグインを書いてテストをするたびにSpigotサーバーをセットアップするのはそろそろバカらしい。

やる

やります

準備

Dockerは頑張ってインストールして下さい。

作成

以下が最小構成のDockerfileになります。

FROM ubuntu:16.04

RUN apt-get update && apt-get -y upgrade && apt-get -y install openjdk-8-jdk wget git
RUN mkdir spigot
WORKDIR /spigot
RUN wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
RUN java -jar BuildTools.jar
RUN echo 'eula=True' > eula.txt
CMD ll | grep spigot | grep jar | awk '{print $9;}' | xargs java -Xms512m -Xmx1024m -jar

ちゃんと調べてないけど、Spigotのライセンスの関係でDockerイメージの配布はできない気がします。多分。

$ docker build -t 'spigot/ubuntu:16.04' .

DockerfileからDockerイメージを作成します。JDKを入れるのに結構時間がかかります。いつの間にかSpigotがJarを配布してくれるようになっていたのでJREのみで問題ないかもしれませんね。今度試すかもしれません。 DMCA的にグレーっぽかったので公式のBuildToolsからビルドするように修正しました。それによってgitも必要になりました。

$ docker run -v [host dir path]:/spigot/plugins --name spigot -p 25565:25565 -i -t spigot/ubuntu:16.04

Dockerコンテナを作成します。

-iオプションは標準入力を使えるようにするオプションでこれがないと操作ができなくなってdocker stopするしかなくなってしまうので気をつけましょう。

[08:37:36 INFO]: Done (10.348s)! For help, type "help" or "?"

コンテナの作成ができました。ログインができるか確認してみましょう。

-vオプションでホストとのディレクトリ共有が出来ます-v [host dir path]:[guest dir path]としましょう。ホスト側をIDEAやEclipseの出力ディレクトリにしておくととても楽。

-p 25565:25565でコンテナの25565ポートをホストの25565ポートにフォワーディングしてるので、ホストからlocalhost:25565にむけてアクセスができると思います。

使い方もろもろ

Dockerコンテナの確認

docker ps -a

-aはallです

Dockerコンテナの停止

docker stop [Container Name or ID]

Dockerコンテナの起動

docker start [Container Name or ID]

-aiオプションで起動と同時にアタッチができます。

Dockerコンテナの削除

docker rm [Container Name or ID]

Dockerイメージの確認

docker images

Dockerイメージの削除

docker rmi [Image ID]

所感

今のところ、コンテナからデタッチできなくて困っています・・・

screenを使うという手を思いついたのですが結局デタッチできない気がします。試してはいません。

docker attach--detach-keysというオプションがあったので色々試してみましたが、何をおしてもサーバーコンソールの標準入力に吸い込まれました。

再度試してみたら普通にデタッチできました。docker attach [containter name]で再度アタッチ出来ます。

まとめ

そっこうでSpigotサーバーが立って楽

mbed LPC1768と圧電スピーカーで音楽を鳴らす

背景

先日MCCの夏合宿に行ってきました。

所用で3時間ほど遅れて参加したので、他のメンバーはもうチームを組んで実装を始めていて、さて何をしようかというところだったのですが、LPC1768を4台ほど持ってきていたので、これで何かつくろうということになりました。

しばらく一人で何を作るか思案していたのですが気づいたら夜でした。そこでテーマを決めたはずが実現可能性がゼロに近づきすぎてしまったicchyrさんに声をかけてもらい、シェルスクリプトテトリスを実装してmbedコントローラーをつかって操作しながらBGMとして圧電スピーカーでテトリスのBGM(A-Type)を流すプロダクトをつくることになりました。ちなみにこのBGMは原曲がありましてロシア民謡のコブロチカという音楽が元になっているそうです。

テトリス部分をicchyrさん、スピーカーやコントローラーを私という分担にしました。

実装

コードは下記のURLに置いてあります。

speaker_test - a mercurial repository | Mbed

f:id:gurapomu:20170828231029j:plain

楽譜はicchyrさんに耳コピで作ってもらいました。

icchy (@icchyr) | Twitter

悲しいかな

たまたま持っていた圧電スピーカーなのですが、ものが悪すぎてとある周波数で共鳴を起こして正直言って不快な音が出ます。

秋月で部品を買うともらえるベージュ(?)の紙袋を上からかぶせてテープでとめたらわりとマシに聞こえたのでそんな感じで使うことにしました。

高周波帯のノイズが混じっているような気がしたので、即席でコンデンサと抵抗を使ってカットオフ周波数数十kHzのLPFをつくって噛ませていたのですが、たまたま外してみたらそっちのほうがいい音がでてたのでがっかりしました。今考えたら設計をミスっていたかもしれません。

f:id:gurapomu:20170828233140j:plain

解説

正直お酒を飲みながら実装していたので今見るとひどいコードな気がしますが反省をふまえながら解説していきます。

コアになってくるのはTickerと呼ばれる繰り返しタイマー割り込み機能です。圧電スピーカーの入力にsp1を設定し以下の関数をt秒ごとに繰り返すことで周波数1/2t[Hz]の音がなるという寸法です。

void tick(void)
{
    sp1.write(oto);
    oto=!oto;
}

反省点が2つあります。

1つは変数名が"oto"とかなっているところです。よく考えるとわかりやすくて短い変数名だし悪くないのかもしれません。※諸説あります

2つ目ですが上記4行目の oto=!oto; です。

これは=!の順番が変わるだけで全く意味をなさないコードに変わってしまうものなので要注意だと思っています。

実はこのコード、はmbed_blinky(テンプレートのLEDを点滅させるプログラムです)にも乗っているので本当に良くないと思っています。絶対に書くまいと思っていたことなので非常に反省しています。

反省が長くなりましたが次に行きます。

float mm[]={659,2,493,1,523,1,587,2,523,1,493,1,440,2,440,1,523,1,659,2,587,1,523,1,493,3,523,1,587,2,659,2,523,2,440,2,440,2,0,3,587,2,698,1,880,2,783,1,698,1,659,2,0,1,523,1,659,2,587,1,523,1,493,2,493,1,523,1,587,2,659,2,523,2,440,2,440,2,0,2,659,2,493,1,523,1,587,2,523,1,493,1,440,2,440,1,523,1,659,2,587,1,523,1,493,3,523,1,587,2,659,2,523,2,440,2,440,2,0,3,587,2,698,1,880,2,783,1,698,1,659,2,0,1,523,1,659,2,587,1,523,1,493,2,493,1,523,1,587,2,659,2,523,2,440,2,440,2,0,2,329,4,261,4,293,4,246,4,261,4,220,4,207,4,246,4,329,4,261,4,293,4,246,4,261,2,329,2,440,4,415,8};

これはBGMの譜面になります。0と偶数のインデックスで周波数、奇数インデックスで伸ばす回数を表しています。酔っていたのでこれぐらいの制御方法しか思いつきませんでした。float配列なのに整数リテラルを代入していてこれほど意味のないことはありません。反省です。

for (i=0;i<sizeof(mm)/sizeof(float);i+=2) {
    timer.attach(&tick,1.0/mm[i]/2.0);
    wait(0.2*mm[i+1]);
    timer.detach();
    sp1.write(0);
}

ここが再生部分です。先程説明した繰り返しタイマー割り込みを1.0/mm[i]/2.0秒間隔で動作させるようにしています。これによって周波数mm[i]の音を発生させることが出来ます。このTickerを仕込んで0.2*mm[i+1]秒後にTickerを停止させます。その後スピーカー入力を0にします。

最初はsp1.write(0);を書かずに鳴らしていたのですが、休符の際に2回に1回高音を発するというバグを踏んだので書きました。原因は未だにわかっていません。

よく考えたら1.0/mm[i]/2.0はゼロ除算になると思うんですけど浮動小数点数だとエラーにならないんだっけ???? ARM特有かもしれません。これが謎の高音はこれが関係していたかもしれない。

再生部分は大体こんな感じです。超単純

あとは、もう1台のmbedから信号を受け取って音楽を一時停止させたり停止させたりする機能を実装しています。なんで1台に統合しなかったんだろう、とても不思議です。

おわりに

結局テトリスは完成しませんでした。

シェルスクリプトでは無理がありすぎて2日目の朝からmbed(C++)で実装していたのですが流石に無理がありすぎるということです。

ハッカソンとはなんなのかということにもなってきますが、ある程度作りたいものをもったままスタートできるとスムーズに開発が進むのではないかと思います。

聖なる夜について

この記事は MCC Advent Calendar 2016 - Adventar の21日目の記事です。

書いたのは22日です。

時候の挨拶

寒さもひとしお 心に しみるころ、 独り身の 皆様はいかがお過ごしでしょうか。

 

 

聖なる夜

本日はついに12/22、クリスマス・イブまで後2日*1でありますが、東小金井駅周辺にはクリスマスムードの一端すら見受けられませんでした。

都市部ではいよいよクリスマス本番ムード、仲睦まじくあるくカップルが街中にあふれることでありましょう。

さて、キリスト教圏では「クリスマスは家族と過ごし、互いにプレゼントを贈りあう日」であります。

それでは、日本ではどのようにして現在のようなクリスマスの文化が浸透していったのでしょうか。

日本のクリスマスの始まり

江戸時代の禁教令以前を除き、日本でクリスマスが受け入れられたのは1900年に、明治座が銀座に進出しクリスマス商戦を始めたことがきっかけであると言われています。

もちろんこの頃はまだ恋人と過ごす習慣はなかったようです。

サンタがやってくる

クリスマスといえばサンタクロースでありますが、

1928年の朝日新聞には「クリスマスは今や日本の年中行事となり、サンタクロースは立派に日本の子供のものに」と書かれるほどに普及していたようですが、サンタクロースが子供にプレゼントをするという程度の習慣だったそうです。

クリスマスは恋人と

「クリスマスは恋人と」という文化が本格的に浸透し始めたのは、1980年代から1990年ごろにかけてであるという意見が多いようです。根拠として述べられているものはいくつかあるのですが、私は性に対しての意識の変化が根底にあるのではないかと考えています。

この1980年代というのは、20代の男女における、初めての性交渉の相手の比率の1位が「配偶者」から「恋人」に入れ替わった時期であり、婚前交渉が世間一般に受け入れ始められた時期であるといえます。

この事実を後押しするかのように、1980年代後半からは12月にたくさんのクリスマスソングが発売されはじめます。街中にクリスマスソングが響き渡る中、恋人といつもより高級な食事をし、ホテルに泊まるという文化が広まっていったのではないでしょうか。

 

 

心を冷やしてはいけない

さて、本当に寒い日が続いておりますが、この記事をご覧になっている皆さんの心はどこまで冷え込んでいるのでしょうか。

どんなに街中をあるく恋人が羨ましくても、心を冷やしてはいけません。


恋人がいなくても、クリスマスは友人と、鍋を囲み酒を飲みながらこの記事を紹介して「こんな記事書いてるお前の心が一番冷えてるんだよバーカ」と笑い飛ばして身体と心を温める、というのはいかがでしょうか

www.adventar.org

*1:細かいことをいうとクリスマス・イブは12/24の日没から日付が変わるまでを指すそうです