読者です 読者をやめる 読者になる 読者になる

mrubyのはじめかたメモ その2 Windows編

はじめに

mrubyのはじめ方について、色々とやったことをメモっておきます。

今日は、Windowsでのmrubyのはじめ方について。

これまでの記事

miyohide.hatenablog.com

環境

準備

Windows上でmrubyをビルドするためには、いろいろとソフトウェアをインストールする必要があります。自分は次のものをインストールしました。

それぞれ説明します。

Visual Studio Community

Windows上でのC/C++コンパイラであるclコマンド等を入手するためにVisual Studioをインストールします。Visual Studioには色々とエディションがありますが、個人開発者は無料で使えるVisual Studio Community Editionを入手、インストールしました。

Visual Studio Community - Visual Studio

インストールするときは、通常の方法でインストールするとclコマンドがインストールされないので、カスタムインストールでVisual C++のインストールを選択してください。

Ruby 2.3.3

Rubyのインストールは、RubyInstaller for Windowsを使ってインストールしました。

RubyInstaller for Windows

環境変数PATHにRubyのインストールパスを通すようにすると後々の作業が楽になります。

また、Development Kit(DevKit)もインストールしておいたほうが良いでしょう。DevKitのインストールは、GitHubのWikiページに記載されているように、

  1. ダウンロードしたDevKitを空白を含まないパスに解凍する(自分は、いつもC:\tools\devkit以下に解凍しています)。
  2. コマンドプロンプトを起動して、DevKitの解凍場所(自分の場合は、C:\tools\devkit)に移動。
  3. ruby dk.rb init」を実行
  4. 生成される「config.yml」を編集。Rubyをインストールしている場所をYAML形式で記述する。
  5. ruby dk.rb install」を実行

とすればOKです。

Bison for Windows

Bisonというツールをインストールします。私はBison for Windowsを使いました。

Bison for Windows

このページにある「Complete package, except sources」をダウンロードしてインストーラーを起動すればインストールが行われます。ここでの注意点は、インストールパスを必ず変更して、空白を含まないパス(例えば、「C:\tools\bison」とか)にインストールすることです。デフォルトでは「C:\Program Files (x86)」以下にインストールされるのですが、このままだとmrubyのビルドのときにエラーを出力して異常終了します。

ビルド

準備ができたら、mrubyのビルドを行います。予め、mruby-1.2.0.zipをダウンロードし、解凍したら「Developer Command Prompt for VS2015」を起動し、そこでコマンドを入力します。

やることは簡単で、「ruby minirake」と実行するだけです。

f:id:miyohide:20170115235938p:plain

マシンスペックにもよりますが、数分でビルドは完了します。

f:id:miyohide:20170115235954p:plain

バージョンを確認してみましょう。

f:id:miyohide:20170116000001p:plain

以上でWindows上でのmrubyビルドが成功しました。

mrubyのはじめかたメモ

はじめに

mrubyについて2ヶ月触ってなかったらきれいさっぱり忘れていたので、ここでメモがてら記録を残してみることにします。

環境

  • mruby 1.2.0
  • OSX 10.11.6 El Capitan

ビルド

mruby 1.2.0をGitHubからダウンロードして、展開します。

[~/work]$ wget https://github.com/mruby/mruby/archive/1.2.0.zip
--2017-01-12 22:30:54--  https://github.com/mruby/mruby/archive/1.2.0.zip
Resolving github.com... 192.30.253.113, 192.30.253.112
Connecting to github.com|192.30.253.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/mruby/mruby/zip/1.2.0 [following]
--2017-01-12 22:30:55--  https://codeload.github.com/mruby/mruby/zip/1.2.0
Resolving codeload.github.com... 192.30.253.121, 192.30.253.120
Connecting to codeload.github.com|192.30.253.121|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 501087 (489K) [application/zip]
Saving to: ‘1.2.0.zip’

1.2.0.zip                100%[==================================>] 489.34K  96.6KB/s    in 6.0s

2017-01-12 22:31:02 (82.0 KB/s) - ‘1.2.0.zip’ saved [501087/501087]

[~/work]$
[~/work]$ mv 1.2.0.zip mruby-1.2.0.zip
[~/work]$ unzip mruby-1.2.0.zip
Archive:  mruby-1.2.0.zip
22464fe5a0a10f2b077eaba109ce1e912e4a77de
   creating: mruby-1.2.0/
  inflating: mruby-1.2.0/.gitignore
  inflating: mruby-1.2.0/.travis.yml
  inflating: mruby-1.2.0/.yardopts
  inflating: mruby-1.2.0/AUTHORS
  inflating: mruby-1.2.0/CONTRIBUTING.md
  inflating: mruby-1.2.0/ChangeLog
(省略)
  inflating: mruby-1.2.0/test/t/typeerror.rb
  inflating: mruby-1.2.0/test/t/unicode.rb
  inflating: mruby-1.2.0/travis_config.rb
[~/work]$ cd mruby-1.2.0
[~/work/mruby-1.2.0]$

その後、minirakeコマンドを実行するとビルドが行われます。

[~/work/mruby-1.2.0]$ ./minirake
(in /Users/miyohide/work/mruby-1.2.0)
CC    src/array.c -> build/host/src/array.o
CC    src/backtrace.c -> build/host/src/backtrace.o
CC    src/class.c -> build/host/src/class.o
CC    src/codedump.c -> build/host/src/codedump.o
CC    src/compar.c -> build/host/src/compar.o
CC    src/crc.c -> build/host/src/crc.o
CC    src/debug.c -> build/host/src/debug.o
(省略)
             mruby-random - Random class
             mruby-object-ext - Object class extension
             mruby-objectspace - ObjectSpace class
             mruby-fiber - Fiber class
             mruby-enumerator - Enumerator class
             mruby-enum-lazy - Enumerable::Lazy class
             mruby-toplevel-ext - toplevel object (main) methods extension
             mruby-compiler - mruby compiler library
             mruby-bin-mirb - mirb command
               - Binaries: mirb
             mruby-bin-mruby - mruby command
               - Binaries: mruby
             mruby-bin-strip - irep dump debug section remover command
               - Binaries: mruby-strip
             mruby-kernel-ext - Kernel module extension
             mruby-test - mruby test
================================================

[~/work/mruby-1.2.0]$

作られたバイナリはbinディレクトリに作成されます。試しにmrubyのバージョンを出力してみます。

[~/work/mruby-1.2.0]$ ./bin/mruby --version
mruby 1.2.0 (2015-11-17)
[~/work/mruby-1.2.0]$

Hello World

定番ですが、Hello Worldを出力してみます。

まずはソースです。mrubyはRubyと文法が同じなので、Hello Worldは次のようにかけます。

p 'Hello mruby World.'

これを実行します。mrubyコマンドを使ってファイル名を指定することで実行できます。

[~/work/mruby-1.2.0]$ cat hello_world.rb
p 'Hello mruby World.'

[~/work/mruby-1.2.0]$[~/work/mruby-1.2.0]$ ./bin/mruby hello_world.rb
"Hello mruby World."

mrubyはソースをコンパイルすることができます。コンパイルするにはmrbcコマンドを使います。

[~/work/mruby-1.2.0]$ ./bin/mrbc hello_world.rb
[~/work/mruby-1.2.0]$ ls -l hello_world.*
-rw-r--r--  1 miyohide  staff  105  1 12 22:51 hello_world.mrb
-rw-r--r--  1 miyohide  staff   24  1 12 22:47 hello_world.rb
[~/work/mruby-1.2.0]$

作成されたバイナリ(hello_world.mrb)を実行するには、mrubyコマンドに-bオプションを付けます。

[~/work/mruby-1.2.0]$ ./bin/mruby -b hello_world.mrb
"Hello mruby World."
[~/work/mruby-1.2.0]$

RubyWorld Conference 2016で発表してきた(技術的な詳細版)

はじめに

かなり時間が過ぎましたが、11月3日〜4日に開催されたRubyWorld Conference 2016にて発表してきました。話したことは以前別エントリーで記しましたので、このエントリーでは、発表に至るまでの経緯と、そこで使った技術的なことをいろいろと記したいと思います。

f:id:miyohide:20161224214808j:plain

きっかけ

発表の中でもちょっと触れましたが、私は所属会社以外にOSS推進フォーラムアプリケーション部会(以下、アプリ部会)という団体にも所属しています。アプリ部会では、毎年有志がそれぞれテーマを持ち寄っていろいろと調査結果を発表したりしています。

アプリ部会ではちょっと前からmrubyに注目しています。その話を聞いていると自分でも何かできるのではないかと思い、今年の3月ぐらいにmrubyをテーマに何かやることにしました。

ネタ

mrubyをテーマにすると言っても、何か具体的に動くものを作らないとモチベーションが上がらないよなぁと思い、ネタを探すことにしました。Lチカっていうのがこういうものの定番ですが、もうちょっと凝ったことをしたいという思いがありました。

そこで上がったのが自分が趣味としているランニング。GPSデータや温度などをリアルタイムで取得してそれを活かすようなアプリを作ってみようと考え、必要なものを揃えるようにしました。

まぁ「それ、スマホでいいじゃん」って言われると元も子もないんですが、まぁ、そんなこと言ったら駄目です。

ハードウェア

ハードウェアについては、アプリ部会で話をしたらすぐ調達してくれました。Raspberry PiにUSB接続のGPSや温度センサーです。いわゆるIoTっていうともっと小さなハードウェアやはんだ付けされたものを思い浮かぶのですが、

  • 個人的に使い慣れたOSで作業がしたい
  • はんだ付けとかできない
  • はじめてのことを色々といっぺんにやると、トラブったときに何が何だかわからなくなる

という考えから、まずは簡単にできることからスタートすることにしました。実際、mrubyアプリケーションを書くことについては、結構苦労したので、この選択は正しかったんだろうなと思います。

作るものを減らす

今回のテーマはmrubyアプリケーションの実装だったので、それに必要なものはできるだけ実装しないように考えました。そんなことを考えているときに出会ったのがAzure IoT HubとPower BIです。

これらはたまたまMicrosoft社さんのセミナーに出ていたときに知ったもので、これだったら自分が実装するのはmrubyアプリケーションだけで済むと考え、Azureベースで実装することにしました。ただ、自分の環境ではなぜかPower BIを使うことができませんでした。そこで、データ表示分はAzure Web Apps上でRailsアプリを動かすことにし、簡単なデータ表示アプリを作ることにしました。

正解を知る

mrubyアプリを作ることは初めてで、なんとなくCRubyとmrubyには非互換の部分があるということを知っていたので、まずはCRubyで実装することにしました。

Azure IoT Hubにデータを送信するためには、SASトークンというものを計算する必要があります。アプリの実装で難しいところはここで、自分は次のようなコードで動くものができました。

これで正解を知ることができたので、あとはmrubyで動くものを作るだけです。

アレもこれもmrbgems

さて、後はmruby上で実装するだけなのですが、ここが一番難しいところです。CRubyとmrubyとで非互換の部分をまとめたものは、Qiitaで高橋会長が記されているものが今なら見つかるのですが、私が実装し始めたときには見つけることができず、自分で試行錯誤しました。

当初はRubyGemsを使わなければ簡単に動くようにできるでしょ?って考えていましたが、CRubyではあって当たり前のメソッドもmrubyでは普通にないので、mrbgemsを探すことにしました。

mrbgemsの情報源としては、

を主に利用しました。特に軽量Rubyフォーラムにあるmruby安定版のアナウンスページWindows/Mac/Linuxでの動作確認実績が記されていましたので、私みたいにMacで開発し、Linuxで動かすと言った用途では非常に役立ちました。

結局、SASトークンの生成部分は、

のようになりました。

Azure Web AppsでRailsアプリを動かす

さて、Power BIが使えなかったので、データを表示する部分をサクッとRailsで開発したのですが、それを動かすための基盤として今回はAzure Web Appsで動かすことにしました。ここではAzure Web Apps上でRailsアプリを動かすことについて記します。

2016年12月24日現在Azure Web AppsはRubyをサポートしていませんので、Railsを動かすにはちょっとした工夫が必要です。

工夫の方法は下記の二種類あります。

  • JRuby + Warblerを使ってwarファイルを作り、warファイルをアップロードする
  • Kuduを使ってデプロイ時にJRubyのインストール、Gemのインストール、DB migrateなどを実施する

今回は、Kuduを使ったデプロイを行いました。参考にしたのは、下記サイトです。

blog.shibayan.jp
github.com

最終的に使用したdeploy.shは次のとおりです。

DB migrateとかは動かすとちょっと時間がかかるので、一度動かすと後はコメント化してしまって処理時間の短縮に努めました。

実際のアプリの動作ですが、最初は無料プランでやっていたのですがそもそもうまく動かないことが多かったので早々に諦めBASICやSTANDARDプランで動かすと、安定して動くようになりました。

なお、わざわざこんなことしてAzure Web Apps上でRailsアプリを動かさなくても適当にVirtual MachineなんかでLinuxを立ち上げて動かしても良かったと思うのですが、インフラ周りであまり悩みたくなかったので、Azure Web Appsで動かすことにしました。

各種課題など

こんなことをやっていってなんとか発表までたどり着けたのですが、課題が山盛りなのでこれからはその課題をいろいろと解決していきたいなと考えています。

特に走るときにRaspberry Piを背負って走るのはあまりにも邪魔なので、できるだけ小型化したいなと思っています。ただそのためにはハードウェアの知識とか半田付けとかOSなしとか色々と課題があるので、それをゆっくりと乗り越えていきたいなと考えています。

SoftbankからMVNO(IIJ mio)に移った

はじめに

iPhone 3Gが出てからずっとSoftbankを使っていたのですが、一念発起してナンバーポータビリティをつかってMVNOIIJ mio)に移りました。すでに書きつくされたことのようにも思いますが、自分もMVNOする前は色々と検索しまくったので、なんらかのお役に立てればと思い、顛末を書きます。

動機

そもそも移った動機は料金です。

  • Softbankでは大体4,000円/月。端末を一括で買って月々の料金を低く抑えています。
  • データ通信は5GB/月ぐらい。外出先でYoutubeを見ることはないので、大体これぐらいで収まる。
  • 周りを見るとMVNOに移っていい評判しかしかなかったので、思い切って移ってみることに。

準備

Softbankのまま機種変するのが一番ラクで、色々と悩んでいたときにこんなDMが届いたので心がグラッと揺らぎましたが、2年縛りが解ける11月を迎えたので、えいや!ってな感じで移ることにしました。

f:id:miyohide:20161113233130j:plain

事前準備としては、次のことをしました。

  • キャリアのメールアドレスを使っている場合は、メールアドレスの変更を通知
  • AmazonIIJmio みおふぉん SIMカード 音声通話パックを購入
    • IIJのサイトから申し込んでもよいのですが、それだと3,000円かかってしまうので、事前にAmazonでパッケージを買った方が安いと思います。ちょうどキャンペーン中でデータ容量が増えるので買っておきました。

MNP

MNP予約番号はSoftbankに電話。朝イチで電話しても相変わらず中々つながりませんが、じっと待つこと5分、繋がって会話するとMNP予約番号がSMSで届きます。

MNP予約番号を手に入れたらすぐさまIIJ mioのサイトから手続き。事前準備で購入しておいたパッケージを利用して手続きを進めます。手続きを終えると本人確認書類の提出が求められるので、運転免許証を撮影して指定したサイトにアップロードして終わり。審査には1日ぐらいかかるので、のんびり待ちましょう。

その後SIMの発送連絡が審査終了後の翌日。SIMを受け取ることができたのは審査終了後の翌々日でした。

この段階ではまだSoftbankの契約は生きている状況で、IIJに移るためにはもう一段階、手続きが必要となります。

シムフリー版携帯の入手

MNPの手続きをやっているのと同時にシムフリー版携帯を入手します。Apple教信者の自分はiPhone 7を選択。Apple Storeでオンラインで購入。翌日には届きました。

シムフリーiPhoneは電源入れた後はアクチベーションが必要となります。自分は、まだ移行が済んでいないIIJ mioのSIMを入れました。これでもアクチベーションは通り、WiFiだけでの運用が可能です。

開通手続き

IIJからSIMが届いてから数日後、ようやく時間が取れたので開通手続きを行います。手続きは自動音声ガイダンスへの電話一本かけるだけです。電話をかけた後、Softbankの回線が切れ、少し時間が経ってからIIJ mioの回線が使えるようになりました。その間大体2時間。iPhoneのバックアップデータから復帰して再セットアップなどをしているといつの間にか使えるようになっていました。

運用

移行後、一週間ほど使ってみていますが特に不満点はありません。電話の受発信も問題はないし、データ通信にトラブルも特にありません。1日の使用データ量も大体150MBぐらいなので、プラン内に収まりそうです。

まとめ

思ったよりも簡単に移行できました。長々と待たされた挙句にたくさんの書類を読まされ気を抜くといろいろな契約を結ばされる店頭でのキャリア契約よりストレスフリーで移行できるのは良かったです。

大阪マラソン2016を走ってきた

2016年10月30日(日)に開催された大阪マラソン2016を走ってきました。

f:id:miyohide:20161030145154j:plain

幸運なことに抽選に当たったので、参加することに。

connect.garmin.com

目標はサブ4。キロ5分半で30キロまでは走り、そこからは残った体力勝負ってな感じで入ったのですが、残り5キロぐらいから大体死んでました。

最後、気力を振り絞ったのですが、サブ4まであと一歩足りず...というか、わざわざ手に入れているものを自ら放棄している感じかも。

f:id:miyohide:20161030154148j:plain

前日

ゼッケン受付が前々日と前日のみ。事前配送物はなく、ネットで手続きをするだけ...なんだけど特に通知も何もなく、たまたま覗いたWebページでネットでの手続きが必要なことに気がつきました。ちょっと不親切な気がします。

前日の土曜日に横浜から大阪に移動し、ゼッケンを受け取ったあとは早々にホテルに向かい、早々に就寝...しようとしたのですが、ちょうど日本シリーズをやっていたので、寝るに寝られず。結局23時ぐらいまで起きてしまいました。

当日(スタート前)

朝は5時ぐらいには起きて朝食。準備をして6時半にはチェックアウトして大阪城公園へ。すでに多くのランナーで電車が埋まりました。

荷物預け締切が8時。整列締切は8時40分。荷物預けはサクッとできたのですが、整列はトイレ渋滞と整列場所までの混雑がひどく、30分前に移動開始したのにギリギリセーフ。ここらは運営側の改善がほしいところ。

スタート

あたふたしたままスタート。スタート直後の渋滞もそんなに無く、キロ5分半のペースを掴む。このままいけるかなぁと思ったけど、どうしてもペースが上がってしまう。抑えよう抑えようとずっと心がけながら走る。

10キロあたり

5分半/kmを目安に走っていると、いきなり肩を叩かれる。何事?と思っていたらランステで見知った仲間が。ちょっと元気が出る。このままペースを維持しながら距離を刻む。

20キロ過ぎ

半分。ちょっと疲れている。いつの間にかランステの仲間とも離れ、途中で「サブ4目指している」という桧山のユニフォームを着たランナーと並走する。大阪という土地柄なのか、阪神のユニフォームを着た人を結構見かける。

30キロ過ぎ

時計を見るとちょうどいいペースで来ている。これからが辛いところ。体の調子がダイレクトに出てくる。

そんなさなか、右ふくらはぎがちょっと痛みだす。これまでになかった痛み。ちょっとやばさを感じる。

37キロ過ぎ

南海大橋あたりで右ふくらはぎが攣りそうになる。やばい...。ちょっと歩いて様子を見る。大丈夫そうなので、徐々に走ると痛みが出てくるポイントがあるのでほぼ早歩きな感じで前に進む。後5キロ。こんなに長かったっけ...

ゴール

そのまま痛みはあまり引かずにゴール。う〜ん、ちょっと悔いが残るタイムだしレースであった。ちょっと残念。

ゴール後

ゴール後は、ゆっくりと着替えをし、無料のマッサージを受ける。会場から大阪駅までの直行バスを予約していたのでそれに乗って帰る。このバスは完全予約制。自分は17時の便を予約していたんだけど、早めに行って聞いてみたら「空席があったらOKですよ」ということ。無事、空席が出て早めに帰ることに成功。その後はJRで新大阪まで行き、新幹線で横浜まで帰る。マッサージを受けた結果か、そこそこ普通に歩けて帰れた。

反省会

やっぱりというかいつも通りというか、35キロ過ぎが自分にとって勝負。辛い時にかんたんに心が折れてしまうのはどうやって鍛えたらいいんだろうと思うんだけど、やっぱり長い距離の練習なのかなぁ。

RubyWorld Conference 2016で喋ってきた

はじめに

2016年11月3日と4日に島根県松江市で開催されたRubyWorld Conference 2016で講演者として参加してきました。

RubyWorld Conferenceは、毎年島根県松江市で開催されるRubyのカンファレンスなのですが、出席者の半数ぐらいがスーツな人で占められる不思議なカンファレンスです。県知事と市長による挨拶があるカンファレンスはおそらくこれぐらいでしょう。

f:id:miyohide:20161106205017j:plain

CFP

講演者としてRubyWorld Conferenceに行くためにはCFPを出して採択される必要があります。ここ数年の傾向を見ると、

  • システムをRailsで構築しましたっていうのはすでに当たり前なので、採択される可能性は低い
  • 去年ぐらいからmruby関係の採択率が高いような気がする
  • 教育は一定の枠がある感じ
  • 深い技術的な話はあまり求められていないようなきがする

みたいな感じ。今回は、参加しているOSS推進フォーラムアプリケーション部会でやっているmrubyの話をまとめてCFPとして出したら採択されました。

発表内容

半数以上がスーツな人で占められることと、mrubyに関してはET展などで「どうやって始めていいかわからない」っていう声を多く聞いたことから、mrubyでアプリケーションをどうやって作るかについて簡単に紹介することに時間を費やしました。

後で話を聞くと「分かりやすかったです」という声をたくさん聞いたので、狙いとしては成功だったように思います。

時間の関係上、

  • mrbgemsの探し方(詳細版)
  • mruby-cliについて
  • Azure Web AppsでRailsアプリを動かす方法

については全く喋りませんでしたので、聞きたい人がいましたらお声がけください。

あと、資料は後ほどRubyWorld Conferenceの公式サイトにて公開される予定です。

テーマについて

今回は、mrubyを使ってセンサーデータを収集してAzureにデータを送信するって話をしたのですが、最初始めるときは色々と舐めてました。

  • mrubyってほとんどCRubyと同じでしょ。同じアプリをちょっと編集すれば動くでしょ。
    • →う、動かない...
  • mrbgemsってググれば適当に見つかるでしょ。
    • →見つかることは見つかるんだけど、どう書けばいいか分からない
  • Raspberry Piでとりあえず動かしてみて、すぐさま組み込みにチャレンジだ
    • →組み込み、めっちゃ大変。半田付け難しい、メモリ足りない

実際にやってみるとその大変さが分かりました。

今回は、「CRubyでいいじゃん」ってな結果になったのですが、徐々にmrubyでしか出来ないようなものにもっていきたいので、徐々に突き止めてみようかなと思っています。

第70回 Yokohama.rb にてどう書くの問題にチャレンジした

はじめに

毎月第二土曜日ぐらいにYokohama.rbという地域Rubyコミュニティを開催しています。ここ最近、レシピブック読書会を @igrep さんと @nabetani さんに丸投げしていていました。

Rubyレシピブック 第3版 303の技

Rubyレシピブック 第3版 303の技

このままの状況、運営としてはイケてない!と感じ新しいコンテンツを探そうと思っていたところ、 @nabetani さんから「どう書く」のYokohama.rb版を提供して頂けることになり、早速試してみました。結局人様に頼りっきりで申し訳ないんですが...


今回の問題

今回の問題は、Rails on Tiles yokohama.rb 2016.7.9 問題

自分の戦略

ポイントは、画像で表現されているタイルをどのようにプログラムとして表現するか。ここがいろいろと悩みましたが、自分は「上辺のものはどこに移動するか」「左辺のものはどこに移動するか」...という形でHashで表現しました。こんな感じ。

Tiles = [
  {top: :left, left: :top, right: :down, down: :right},
  {top: :right, left: :down, right: :top, down: :left},
  {top: :down, left: :right, right: :left, down: :top},
  {top: :death, left: :death, right: :death, down: :death}
]

あとは、入力文字列をParseしてフィールドを作り、枠外もしくは行き先がdeathに行ったら処理終了という流れでベタに書きました。それが次のコード。


Yokohama.rb 70回で出題された問題の回答です。

わかりやすいコードを書くことを心掛けているので、多少長いのはしょうがないのですが、流石に長過ぎるのでもうちょっとあがいてみます。

他の人の答え

  • @hamaknさん


70th Yokohama.rb どう書く http://nabetani.sakura.ne.jp ...

  • @nabetaniさん

qiita.com

  • @nomnelさん

nomnel.hatenablog.com

次回は?

次回は8月第1週の8月6日開催予定です。

yokohamarb.doorkeeper.jp