久しぶりにRaspberry Piをセットアップしようとしたら色々詰まった話

問題点

  • 2017-09-07-raspbian-stretch-liteのイメージをSDに焼いたところsshが出来なかった
  • local IPを固定しようとしたらinterfaces周りの設定がDebian 8系と違った

手順

セットアップ手順を振り返る

イメージの入手

www.raspberrypi.org

上記から2017-09-07-raspbian-stretch-lite.zipをダウンロードしました

SDに書き込み

MacbookでSDを焼くので下記リポジトリシェルスクリプトを使うととても楽でした。

GitHub - RayViljoen/Raspberry-PI-SD-Installer-OS-X: Shell Script for creating Raspberry PI SD card on OS X.

$ wget https://downloads.raspberrypi.org/raspbian_lite_latest -o ~/Downloads/2017-09-07-raspbian-stretch-lite.zip
$ unzip ~/Downloads/2017-09-07-raspbian-stretch-lite.zip
$ git clone https://github.com/RayViljoen/Raspberry-PI-SD-Installer-OS-X.git
$ cd Raspberry-PI-SD-Installer-OS-X
$ sudo ./install ~/Downloads/2017-09-07-raspbian-stretch-lite.img

マウントされているディスクの一覧が表示されるのでSDカードを選択します。

書き込みは数分で終わりました。

Rasberry Pi を起動

USB-Ethernetの変換ケーブルだけ差して電源を入れる。適当にIPを調べてsshしようとした。

$ ssh pi@10.0.0.14
ssh: connect to host 10.0.0.14 port 22: Connection refused

はて、馬鹿なのでこの後しばらく何も調べずにsshd周りと格闘していました。30分くらいしてから調べればいいやと気づきました。

2016-11-25のリリースノートによると、デフォルトでsshが無効になるようになったそうです。(下記リンク)有効にするにはブートパーティーションにからのsshというファイルを作成して起動すれば良いらしい。

http://downloads.raspberrypi.org/raspbian/release_notes.txt

再度、MacbookにSDをマウントしてsshファイルを作成

$ touch /Volumes/boot/ssh
$ ssh pi@10.0.0.14

ログインできました。

IPアドレスを固定

今後Amethystを走らせようかと思うのでIPを固定します。

Debian8系のつもりで/etc/network/interfacesを編集しようとしたところ以下のようなコメントが

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

なるほど、ということで/etc/dhcpcd.confを覗いてみます

$ cat /etc/dhcpcd.conf

# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

# Inform the DHCP server of our hostname for DDNS.
hostname

# Use the hardware address of the interface for the Client ID.
clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
# Some non-RFC compliant DHCP servers do not reply with this set.
# In this case, comment out duid and enable clientid above.
#duid

# Persist interface configuration when dhcpcd exits.
persistent

# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
# Most distributions have NTP support.
option ntp_servers
# Respect the network MTU. This is applied to DHCP routes.
option interface_mtu

# A ServerID is required by RFC2131.
require dhcp_server_identifier

# Generate Stable Private IPv6 Addresses instead of hardware based ones
slaac private

# interface eth0
# static ip_address=192.168.1.23/24
# #static ip6_address=fd51:42f8:caae:d92e::ff/64
# static routers=192.168.1.1
# static domain_name_servers=192.168.1.1 8.8.8.8

# It is possible to fall back to a static IP if DHCP fails:
# define static profile
#profile static_eth0
#static ip_address=192.168.1.23/24
#static routers=192.168.1.1
#static domain_name_servers=192.168.1.1

# fallback to static profile on eth0
#interface eth0
#fallback static_eth0

ifconfigしたところIFnameはeth0っぽいのでそこら辺のコメントを外せば良さそう。DNSなども任意で設定

$ sudo shutdown -r now

とりあえず使えるようになったと思います。

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++)で実装していたのですが流石に無理がありすぎるということです。

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

アドベントカレンダーありがとう3

この記事は ぐらぽむ Advent Calendar 2016 - Adventar の19日目の記事です。

gurapomu.hatenablog.com

こんなものを書いたら、@sukukyonに怒られたのでもう少し真面目にやります。ごめんなさい。いま土下座しながら記事を書いています

紹介

kemduino

高校の同期です。

C90に出ようという話が始まるまでは特に関わりはなかった気がします(Twitterで見かける程度)

KnobCon前史(仮) - 0rangetail を書いてくれました。

Knobconの制作会議は、オタクばかりですぐ話がそれるので、僕とkemuduinoで話をレールに乗せるのにとても苦労した覚えがあります。

豆腐屋のサークルカットはとてもかわいくて良いです。@sukukyonとかいうオタクのきつい注文を実現してくれてありがとう。

 

sukukyon

高校の同期です

blog.monora.me

この記事と

blog.monora.me

この記事を書いてくれました。

17日はKnobcon後史を書け!とか無茶振りしてごめんなさい。

@sukukyonはクソみたいな記事は書こうとしたけど、自分もそもそも基盤の設計をめちゃくちゃ遅らせたりそもそも基板設計と実装しかしてないクソだったので、この役目は@akira_techあたりに任せようと思います。まだAdvent Calendarの枠はまだまだ余っているのでお願いします。

いろいろな会社を転々としている気がします。でもそもそもエンジニアというのはそういう働き方をするものだよね。フロントエンドからバックエンドまで幅広くやっていて頑張る人だなぁという気持ちです。

絵に描いたような近頃のオタク

 

ecila_vip

僕が参加しているMinecraftサークル、GrassLifeの頭領です。

ch.nicovideo.jp

こんな記事を書いてくれました。

僕はVILLAGE VANGUARD DINERというところだけ行ったことがなかったので今度行ってみたいと思います。

初めて話したのは多分5,6ヶ月くらい前だと思います。ニコニコ生放送をしていたので遊びに行ったらマイクラマルチサーバーのプラグイン開発について面白そうな話をしていたので少し話をしました。

発言した覚えがないこんなツイートをしていたのですが、本当に覚えがないです。個人としてはこういったModやプラグインを作る気はないです。

恐らくこのツイートを発端として目をつけられていたのではないかという気がしています。夏休み前半いろいろと忙しかったので9月中旬くらいから本格的な話をし始めた気がします。

彼自身は現在、どこかのイケイケな会社でRubyJavaScriptCSSをガリガリ書いているらしいです。

ついでに紹介しておくとGrassLifeには他に@Cyc_Eくんと@unicroakくんがいます。@unicroakくんは最近加入したばかりの期待の新星です。

各位、僕は1月に入るとデスマーチモードにはいるので1ヶ月ほど失踪するかもしれませんが必ず戻ってくるので待っていてください。

このサークルの成り立ちについては以下の記事を読むと欠片くらいはわかるかもしれません。

ch.nicovideo.jp

 

Hlradai

この2文字目って小文字の"エル"なのか大文字の"アイ"なのかどっちか判別がつかなかったのです。普通に考えれば"アイ"だけどオタクはひねくれているという風潮があるので奇をてらって"エル"にしておきましたがあってますか?

高校の同期です。

hiradai.hatenablog.com

この記事と

hiradai.hatenablog.com

この記事をかいてくれました。

これらの記事の僕との関係の無さが逆に清々しくてとても好きです。

僕は近頃CivilizationVIを購入してプレイしているので夜通しCiv部をやるならぜひVIでお願いします。楽しいので買いましょう。

彼も@kemuduinoの同じく高校は同じなのに卒業するまではあまり関わりがなかった気がします。本当に卒業してからご飯を数回食べに行った程度です。

ツイッターを見ているとずっとゲームをしている気がします。頑張って生きてください。

鹿島アントラーズ戦についての話ですが、僕が中学校までサッカー部だったことを知っていての話だったのでしょうか。昔は名古屋グランパスを応援していましたが、最近は殆どサッカー観戦をしていません。もっぱら野球ばかりしています。ごめんね、

 

norn_Renon

なんで知り合ったんだっけ?

というのは冗談です。

alreeg.hatenablog.com

この記事を買いてくれました。

彼との出会いは多分3,4年くらい前だったと思います。当時ラブライブがとても大好きだった僕ですが、Twitterに流れてくる「○○が好きな人はRT」みたいなツイートがあまり好きではありませんでした。好きではなかったのに、たまたま僕の操作ミスで"ラブライブ好き同士でLINEグループを作りたいので興味がある人はファボしてください"といったツイートに間違ってファボをしてしまい、ラブライブのLINEグループに参加することになってしまったことがきっかけです。

そのグループについて思い返してみると、まあ悪くなかったなぁという気持ちはあって今でも数人とは交流があり、とくにいま紹介をしている彼は大阪に住んでいるけどお互い遠征に行ったときには大抵あって飯を食ったりするという関係です。

ころころアカウント名を変えるのは良くないくせだと思うので自重してください。

書いてくれた記事について言及しておくと、正直あまり面白くなかったです。僭越ながらすこし改善点を挙げていきます。

  • 折角オタクを弾圧できるイベントがあったというのに文章にパンチが足りないです。
  • もう少しオタクを弾圧する強い文章を書いていくと逆にウケると思います。
  • 女の子とパンケーキを食べに行った話なのに女の子についての話が全くありません。

とりあえずはこんなところでしょうか。

 

おわりに

他人を紹介していたら、3000字を超えるポエムになっていました。

書き直したのにもかかわらず雑な紹介になってしまった方、申し訳ないです。指摘していただければ修正していきたいと思います。

明日は書く人がいなさそうです、各位!!!!!!

www.adventar.org

MCCMMANCC2016を終えて

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

昨日から3日前まで記事が上がってなくて少しさびしいので各位。


さて今日は、昨日開催された、東京農工大学MCC・電気通信大学MMA明治大学NCCの3サークル合同イベントMCCMMANCCについてかいていきたいと思います。

MCCMMANCC

MCCMMANCCとは

そもそもMCCMMANCCって何なんだろうということを考えると結構ながくなりそうなので、かいつまんで説明しておくと、

MMAの@whywaitaという人とMCCの@altcolonyという人とNCCの@mactkgという人が集まっていたら@whywaitaという人が3サークル合同イベントやろうぜ、といって始まったイベントだそうです。(間違っているかもしれないので教えてください

開催までの流れ

初回開催は昨年の12月でした。今回が2回目の開催で1年ぶりとなります。

前回が終了したときからまたやりたいという話はしていた気はするのですが、その後あまりそういった話も起こらず久しぶりにMCCMMANCCという単語を目にしたのは9ヶ月くらい後のことでした。

たしか@icchyrという人が最初に言い始めた気がしていたのですがツイートがみつからなかったので僕のツイートを貼っておきます。

Slackの横浜県サークルで@icchyrさんのツイートをみて@sukukyonとかとよしやるかという感じになった気もします。

そんな話もありましたが、全然話は進みませんでした(だめじゃん


10月、Dentoo.LTが開催され、どうやらそこでMCCMMANCCの話が上がったらしく@FMS_Catさんが中心となって話を始めてくださいました。

そんなこんなでMMAからは@benevolent0505さんとMCCからは自分に声がかかり、具体的な話が始まります。

準備に関してはわりとスムーズに進んだ覚えがあります。

強いて言えば途中、参加予定人数が少なくて震えていました。

 

当日

当日は

  • オープニング
  • GLSLの使い方に関するハンズオン
  • LT大会(前半)
  • お菓子をたべながらおしゃべりタイム
  • LT大会(後半)

という流れで進行していきました。

こちらも概ねスムーズに進んでよかったです。

ただ、時間がたりずにせっかく飛び入りLT希望していただいた皆様のLTの時間がめちゃくちゃ短かったりそもそもできなかったりしてしまってもうしわけございませんでした。

主に自分が欲張ったせいです。今土下座しながら記事を書いています。

 

打ち上げ(?)

MCCMMANCC終了後は某居酒屋で飲み会をしました。

サークルの現状を掘り下げたり、それぞれの学校について話したりとても有意義な時間だったと思います。

 

おわりに

今回参加してくださった皆様本当にありがとうございます。

また打ち上げに参加してくださった@icchyrさんありがとうございました。

運営各位とは、今後は半年に1回くらい開催できたら良さそう、という話をしています。

MMANCCの運営陣は半年後また引き継がれるかもしれませんがその時はよろしくお願いします。自分は多分次かもやります。


明日はsasamijpが書きます。いろいろな意味で楽しみにしています。

アドベントカレンダーありがとう2

この記事は ぐらぽむ Advent Calendar 2016 - Adventar の12日目の記事です。


どうでもいいんですけど、"ありがとう"ってタイプすると"ありがおつ"ってなりますよね。

完全に遅刻でサクッとかけるネタが思いつかなかったので紹介の続きをします。二人だけです。

紹介

kemuduino

高校の同期です。

一緒にknobconとかつくってました。

思い返してみると高校の時はほとんど話したことがなかった。

いいことをすると素直に褒めてくれるので好きです。

 

sukukyon

高校の同期です。

固定ツイートがきもいのでなんとかしてほしい。

knobconのソフトウェアを担当していた。

オタク

 


紹介する人がいなくなったので今日はこれで終わりにします。

www.adventar.org