夏影(開発合宿 1日目)

夏真っ盛りですね。 夏といえば海、そして開発合宿です。(雑なタイトル回収)

f:id:kokuyouwind:20180718125621j:plain:w300

というわけで、ただいまMisocaの有志で2泊3日の開発合宿に来ています。 場所は蒲郡のホテル明山荘

f:id:kokuyouwind:20180718122925j:plain:w300

山の中腹にあって三河湾の見晴らしも良い絶好のロケーションです。

今回はリアルタイムに更新をしていく実況形式を試してみようと思います。


(13:00 @kokuyouwind)

午前中に電車で宿に移動し、お昼ご飯を食べ終わったのでいよいよ開発開始です。

集まって開発をするために借りた会議室は、ホワイトボードやスクリーンもあり設備が整っていました。 今回は8人で来ていますが、20人くらいまでなら余裕を持って使えそうな広さです。

f:id:kokuyouwind:20180718123529j:plain:w300

会議室にはWi-Fiもあり、上り下りとも40MB前後とそこそこ高速です。

f:id:kokuyouwind:20180718124854p:plain:w300

ただし暗号化されていないので、可能ならend-to-end SSLを使ったほうが安全かもしれません。 どのくらい速度が出るかわからなかったため、今回はポケットWi-Fiもレンタルしています。

今回の合宿では3チームに分かれて開発を進めています。

f:id:kokuyouwind:20180718123403j:plain:w300

進捗があるたびにこの記事を更新していく予定です。

お楽しみに!


(14:30 komatatsu)
アイスが食べたかったのでマルケーに来ました

f:id:komatatsu:20180718143251j:plain:w300

やってないみたいですね...


(15:00 id:mizukmb)

Android の機能開発をしています。 Android 初心者なので同じチームの id:komatatsu さんに教わりながら進めています。

f:id:mizukmb:20180718151120p:plain:w300

ボタンのレイアウトが崩れてるのが気になる……


(15:15 corocn)

左前のチームから「ボタンの位置が崩れてる!!許さんぞ!!」という声が聞こえてくる

こわい...

右前のチームから「jQuery最高!!!!」という声が聞こえてくる

暑さのせいかな...


(15:31 oosawatechnica)

引率で来ている oosawatechnicaです。

昨年の合宿は下見をせずに行ったので色々と想定外のことが起こって、それはそれで楽しかったのですが開発合宿としてはなかなか厳しいものがあったので、今年は5月に私が下見に行き、ホテルのご担当の方と色々とお話させていただいて決めました。

そのおかげか、きちんと準備していただいていて、ちょっとしたことがすごく嬉しい〜!

f:id:oosawatechnica:20180718110039j:plain:w300

会議室もきちんと準備してくださっていて、フリーのお水と温かいお茶が無限出てくるセットアップもしてくださっていました。 みんなでワイワイやってます。

f:id:oosawatechnica:20180718153006j:plain:w300

一方私は冷房が苦手なのもあり、ロビーのソファで一人でお仕事をしています。

ふと窓の外を見ると…あれはなんだ?🤔

f:id:oosawatechnica:20180718153112j:plain:w300


(15:40 @mugi_uno)

富山から来てる@mugi_unoです。

ElasticSearchと戦いながら、有限のWiFiパケットを燃やしている途中の@corocnの様子をどうぞ。

f:id:mugi1:20180718154243j:plain:w300


(16:00 nao)

みんなめっちゃ集中してる!

LIFFアプリチームはちょっと方針考えつつ休憩中です。


(16:10 corocn)

こんにちは、今年も合宿神をしています。

なんかそれっぽく動くものができました。神なので。


(16:25 merotan)

みんな真剣にとりくんでるぞ〜〜〜⤴

f:id:renya-mizuno:20180718162408j:plain:w300

僕はLIFFが全くわからない & デバッグクソ辛い & JS〜〜〜⤴ってなってて海が綺麗です。

f:id:renya-mizuno:20180718162459j:plain:w300


(16:41 oosawatechnica)

私も含め、当該プロジェクトメンバーのすべてのエンジニアが開発合宿に参加していたため、しゃちょうをZOOMに置き去りにしてしまった。 合宿に来ないからこういうことになるんだと思う

嘘ですごめんねとよしさん


(16:50 id:mizukmb)

ボタンのズレを放置して進めてたんだけど、段々ズレが大きくなってきた気がする

f:id:mizukmb:20180718165122p:plain:w300


(17:00 @kokuyouwind)

LIFFで請求書一覧の表示ができた!

f:id:kokuyouwind:20180718170123p:plain:w300

LIFFのサンプルアプリから始めてMisoca APIをJavaScriptから呼ぼうとしたところ、CORSに引っかかって全く進まなくなった。

ので開き直ってとよしさんの作ったMisoca API用サンプルアプリをそのまま動かしてLIFFアプリ登録したところ、何の問題もなく認証・一覧表示までたどり着いた。

結論としては、今日の黄緑㌠の進捗の9割9分は合宿に来てないとよしさんによるものである。


(17:20 corocn)

Elasticsearchのimportがtimeoutしまくる。なんで。

温泉に入りたい!


(17:40 @kokuyouwind)

会議室から人がいなくなってきました。

そろそろ一息いれてお風呂と夕食タイムですね。


(18:00 @kokuyouwind)

お部屋に来ました。 9階のオーシャンビューです。豪華。

f:id:kokuyouwind:20180718180721j:plain:w300

なお、部屋からはフリーWi-Fiが掴めませんでした。 部屋でも作業したい人はポケットWi-Fiが必要そうですね。


(18:50 @mugi_uno)

お風呂にも入って、完全に仕上がった人も数人います。

いまからご飯です!

f:id:mugi1:20180718185537j:plain:w300


(19:00 komatatsu)

f:id:komatatsu:20180718190822j:plain:w300

ヨッシャ!合宿はじまった!!


(22:44 merotan)

合宿はじまった!!って言った人寝たぞ!!!

ころちゃんも寝たぞ!布団に入ってぁあっついって唸ってたぞ!

残された者たちは頑張るぞ!


(22:47 @kokuyouwind)

ご飯を食べて、温泉に入ってきました。

露天風呂はアンチエイジング効果のあるラドン泉だそうです。わかるわ。

夜はこれからだー!


(24:45 @kokuyouwind)

なぜか開発合宿の題材ではなく、技術書典5の準備が進みました。

この辺の話はまた別の機会に…

naoがまだ頑張ってますが、さすがにそろそろ寝ようかなと思います。

明日の記事もお楽しみに!


(24:55 nao)

明日の自分に期待して、今日はそろそろ寝ようと思います。 また明日もよろしくお願いします!!


2日目の記事はこちら。

tech.misoca.jp

👋Farewell song

mzpです。こんにちは。

今回、Misocaを辞めて転職する決断をした。そのため、これがこのブログへの最後の投稿となる。なので、Misocaへの感謝を述べつつ退職の報告としたいと思う。

🏢出会い

新卒で自動車メーカーの系列会社に入社し社内SEをしていたが、やりたいこととのギャップを感じはじめたので転職活動をはじめた。 その中で、以前から知っていたMisoca(当時の社名はスタンドファーム)に話を聞きにいった。 自分が自社サービスに興味があったことと、Misocaも資金調達に成功し人を増やすタイミングだったことがうまくマッチし、入社を決めた。

こう書くとちゃんと活動したように見えるが、実際は退職を宣言したあと、何人かの知人とご飯を食べていたら話が進んでいたので運要素が大きい。 資金調達に成功してうんぬんは最近知った。

当時のメモには選んだ理由に以下のものが書かれている。

なぜスタンドファームを選ぶか。

「私服可」とか「音楽を聞いてもいい」とか「フレックス」「リモートワーク(フルでなくていい)」「トイレがきれい」は譲れないけど、だいたいの会社にある。

決め手になったのは次のポイント。

  • 自社サービスを育てる、というのをやってみたい。
  • どういうソフトウェアを作るか、という自由度も高そう。
  • 社内の仕組みが整ってないので、自分でいろいろ決めていける。

f:id:mzp:20180710124132p:plain

✨Misocaのよい所

いろいろできる

選んだ理由にもあげたが自由度が高く、いろいろなことを経験できた。 自分が経験したことだけでも次のように多岐に渡る。

  • チームでの開発・レビュー
  • リリースプロセスの改善
  • リリースする機能の企画
  • 選考設計とその後の受け入れ
  • 社内の評価制度作り
  • ロードマップに基づいた開発計画作り

入社した当時は人が不足しているので色々やる必要があるという側面も強かった。 最近は人が増えたので役割分担はできている上で、状況や興味に応じて他のこともできる理想的な環境に近づいていると思う。

リモートワーク

入社時はほとんどのメンバーが名古屋近郊に住んでいたので、リモートワークもできるくらいの位置付けだった。

リモートワークを活かして「旅行しながら仕事する」を実際にできた。 途中で「リモートワークするより有給とって旅行したほうがいいいのでは?」とも考えたが、有給日数の残りが5日を切ったあたりで「やっぱりリモートワーク旅行はいいわ」と思いなおした。

f:id:mzp:20170617114744j:plain

f:id:mzp:20180208084336j:plain

最近は、リモートワークをする人の割合がだいぶ増えたので、より自由度が増している。

f:id:mzp:20180122125550j:plain

ミーティングの短かさ

ミーティングの時間を少く、短くしようとしている。 最近は、Slackのみのやり取りで決定できる範囲も増えてきた。

会社としての残業時間の少なさや、ボクが時短勤務をしていても支障がないのはこれに由来する部分が大きいと感じている。

f:id:mzp:20151104163357j:plain

勉強会補助

勉強会補助も充実している。国内の勉強会ならまかなえる額の交通費・参加費がでる。 東京以外に住むことのネックはこれでだいぶ軽減されている。

海外カンファレンスに参加できるほどの額はないので、WWDCは自費負担が大きい。

f:id:mzp:20180328215525p:plain

改善への意思

エントリの性質上、Misocaのよいところをあげているが、すべてがうまくいっているわけではない。 現状のMisocaにはいくつかの課題を抱えている。

しかし「とりあえずやってみる」の精神は根付いており、改善を受け入れる土壌も十分ある。また、関係者が協力してやっていこうという雰囲気に満ちている。

現状がよくないことよりも、ずっとよくない状況が続くことのほうがつらいのでだと思うので、このような改善に向う雰囲気というのは重要である。

🚀転職へ

このように多くの魅力があったMisocaだが、転職をするという決断に至った。 その理由を長々と書く場ではないので簡潔にまとめる。

  • 国内だけでなく世界を相手とする場所で、どこまでがんばれるか試してみたくなった。
  • Webサービス以外の方法で世界に貢献してみたくなった。

f:id:mzp:20180710054705j:plain:w300

🙏未来のMisocaを頼みます

退職エントリにはwishlistを貼るのが定番だが、かわりに採用サイトへのリンクを貼っておく。オンライン面談やランチ会なども受け付けているので、もっと話を聞きたいひとはここから応募してほしい。

recruit.misoca.jp

今後ともMisocaをよろしくお願いします。

Android版Misocaの技術選択

f:id:komatatsu:20180705160422p:plain こんにちは @k0matatsu です。
Android版Misocaアプリがとうとうリリースされましたね。
やっとスタートラインに立てたことが本当に嬉しいです。

2009年に日本で初めてAndroid端末が販売されたのが9年前です。
それからAndroid界には様々な変化がありました。
そんな中で今から全く新規にアプリを書き起こすのは楽しかったです。

言語

JavaとKotlinの両方を使っています。
iOSと違ってAndroidはKotlinへの移行を促されているわけではないですし、それぞれ良い面があると思うのでJavaを禁止するようなことはしていません。
プログラムの内容や言語の特性、書く人間の好みでJavaとKotlinどちらを使うか選んでいます。

非同期処理

非同期処理にはkotlinx.coroutinesを利用しています。
前職などではRxJavaが非同期処理にも使われていたのですが、非同期処理以外で使う場面がほとんど思い浮かばなかったですし、too muchかなと思って避けました。

kotlinx.coroutinesはまだv1.0になってないのですが、うまく行かなかったら別の方法に切り替えようと思って導入に踏み切りました。
async/awaitは回りくどくなくてよく馴染みます。

Kotlin Android Extensions

悩ましいParcelizeを解決するために、Kotlin Android Extensionsを利用しました。
Parcelizeはexperimentalな機能なのでどうしようか迷っていたのですが、Kyashさんでも利用されているとのことで、エイヤッと導入しました。 *1

今の所特に問題なく動いているのでこれもこのまま行けそうです。

一方で、Kotlin Android Extensionsのメイン機能であるViewとのBindingは全く利用していません。
xmlではスネークケースを利用しているため、コードの中にキャメルケースとスネークケースが混在するのを避けたかったためです。

CI

社内にすでにあったJenkinsを利用しています。
ファーストリリースに向けてアプリ自体の開発に比重をおいていたので、まだあまり洗練された状態にはできていませんが、dangerを使ってlintの結果をPRにフィードバックしたり、PRごとにapkをアップロードしたりと、一通りの機能は揃えました。
lintやcheckstyleを機械的にチェックすることで、うっかり良くないコードが入ってしまうのを防いでいます。
これらはコードベースが大きくなってから適用するのはめちゃめちゃ大変なので早い段階で導入しました。

lintはdanger-android_lintktlintを使っていて、ルールは一部カスタマイズしています。

そのほか

API Clientにはretrofit2を使っています。安定ですね。
DIは今の所使ってないのですが、これから必要になりそうなのでToothpickを選択肢として考えています。
リリースはもちろんApp Bundle形式を採用しています。

これからの課題

そんなわけで結構エッジよりな構成になったのではないかなと思っております。
まだAACも導入できていないですし、開発が佳境に入ったところでjetpackの発表があったため正直全然追いつけていません。
ひとまずLiveDataから導入を試みているのですが、Android専任のエンジニアは私一人なので中々手が回っていないというのが実情です。

おわりに

過去の遺産やしがらみのない状況で、自由な裁量の元あれこれ考えながら開発を勧めて行くのは非常にエキサイティングな体験でした。
ユーザーに価値を届けるのは我々の責務ではありますが、どうせなら楽しく開発したい!そんな思いで日々開発を進めています。
Misocaでは一緒にモバイル開発をしてくれる戦友を募集しています。
良い部分をあげるとキリがないのでぜひ一度オフィスに遊びに来ていただいて雰囲気を感じて貰えればと思います。

www.wantedly.com

*1:konifarさんはKyashのエンジニアの方です

🍎WWDC

mzpです。 こんにちは。 念願だったWWDCに参加したので、その話を書く。

RubyKaigiと日程がかぶっていたので、仙台からサンノゼに移動して参加するなどをして大変だった。

f:id:mzp:20180629153214j:plain

🏢会場の様子

初日はキーノートを聞くための列に並ぶ。

開場は10時からだが、よい席に座るには早朝もしくは深夜から並ぶ必要がある。 ボクは8時ごろから並びだしたが、最前列の人は夜中の2時ごろから並んでいたらしい。 列に並びながらWWDC Extended Tokyo 2018の人が楽しそうにしているのをTwitterで見るのは心にくるものがある。

f:id:mzp:20180604073927j:plain

二日目からはそこまで混んでいないので、セッション開始の30分前くらいにいけばよかった。 前のほうに座ったら、スポットライトが眩しかった。

f:id:mzp:20180605084851j:plain

現地にいるので何度かラボに遊びにいった。 「xxxxという機能が動かないんだけど...」は回避策を教えてもらえたりして有用だが、「〜という機能がほしいんですよー」という話は「Radarに要望あげてね」と言われるので微妙というのを学んだ。

f:id:mzp:20180605100038j:plain

f:id:mzp:20180605100055j:plain

空き時間はラウンジでXcodeをダウンロードしたりしていた。電源とLANケーブルが生えていて便利だった。 調子にのってAppleWatchのOSを更新したら、起動しなくなって焦った。 最終日に受付で修理してもらうまで、AppleWatchが使えず不便だった。

f:id:mzp:20180606083042j:plain

🌭食事

お昼ごろにサンドイッチが配られていたので、それを食べていた。 一緒にはいっているクッキーがすごく甘い。

f:id:mzp:20180629155849p:plain

通称小田原ことOdwallaジュースはおやつの時間に提供されていた。 時間帯や日によって提供される種類が違うのでゲーム性があった。

f:id:mzp:20180607082727j:plain

夕食は知り合いと食べにいくことが多かった。「そろそろ日本食が恋しくなってきた」「せっかくアメリカにいるんだしアメリカっぽいものが食べたい」の両方を満すために、アメリカンなお寿司を食べた。

f:id:mzp:20180608185413j:plain

🍻Bash

4日目には野外でBash(懇親会?)が開催された。野外で開催されるあたり、雨と無縁の街という感じがする。

f:id:mzp:20180607191312j:plain

光る卓球台などが置いてあっておもしろい。

f:id:mzp:20180607200432j:plain

巨大ジェンガもある。

f:id:mzp:20180607200646j:plain

🐦try! Swift San Jose

最終日はWWDCには行かずに、隣の建物で開催されたtry! Swift San Joseに参加した。

f:id:mzp:20180608092953j:plain

try! Swift Tokyo 2018に参加したときの縁でメンター参加だったので、参加者の人たちがSwift/Swift関連プロジェクトにプルリクエストを送る手伝いをしていた(参考: 💫try! Swift Tokyo 2018 - みずぴー日記)。 見事プルリクエストを送る段階に辿りついたので、記念に写真を撮った。

f:id:mzp:20180608172406j:plain

👣観光: 社屋見学

せっかくサンノゼまで来たので、AppleGoogleの社屋を見にいった。

Apple

ビジターセンターで、ARバージョンのAppleParkを見る。 「昨日、バージョンアップしたばかりでたまにフリーズするんだよね」といったことを言ってて、たのしかった。

f:id:mzp:20180603114022j:plain

ビジターセンターの上からAppleParkを見たが木に埋もれてていて何も見えなかった。 正直、ただの森にしか見えない。

f:id:mzp:20180603122230j:plain

InfiniteLoopのほうの社屋も見た。1から順に回ろうかとも思ったが、暑い日だったので1を見た時点で力つきた。

f:id:mzp:20180521110015j:plain

Google

Googleの社屋も見にいった。 ここはAppleよりもさらに自然豊か。

f:id:mzp:20180521131512j:plain

ドロイド君がぽつんと立っていた。

f:id:mzp:20180521140420j:plain

うわさに聞いていたChormeカラーの自転車は売店に置いてあった。 乗って移動している社員の人も何人か見た。

f:id:mzp:20180521133544j:plain

やたらボロい建物があるなーと思ってたら「Apple R&D Lab」と書いてあっておもしろかった。 人気はなかったので使ってないと思うけど...。

f:id:mzp:20180521135155j:plain

まとめ

初めてWWDCに現地参加したが、色々な開発者と話ができてよかった。開催期間中は何度か行列に並ぶタイミングがあるが、そのときは列の前後の人と「どういうお仕事してるんですか?」みたいな話をすることになるのでたのしい。英語でしゃべるのはつらい。

また、サンノゼの気候はカラッとしていて過しやすかった。

MisocaではWWDCに参加したいエンジニアを募集しています。

recruit.misoca.jp

#RubyKaigi 2018でEightマンになってきた #misoca #eight #sansan

はいどうもー! Misoca開発チームの黒曜(@kokuyouwind)です!

先日、仙台でEightマンになってきました!

……はい。

無意味な某Tuber風のハイテンション導入でした。最近割とハマってるんですよね。

ちなみに、弊社のmzpもEightマンになって公式宣伝に加担してました。

お前ら自社の宣伝をしろって感じですが、自社ロゴ入りTシャツを着てるのでセーフということにしてください。 なお、このアイマスクについてはSansan Official BlogさんのEightアイマスクを使ってみた。で紹介されています。

そんなわけでRubyKaigi2018に行ってきました。 参加レポを書くまでがRubyKaigiなので、今回もまとめていきたいとおもいます。

🗾開催地

今回は仙台での開催ということで、Misoca社員も各地から続々と集合しました。 フルリモートの社員も多いため、こういうときは富山の人のほうが近かったりして面白いですね。

名古屋からは新幹線🚄を乗り継いで3時間くらいかかるので、前泊している人が多かったようです。 自分も前日に行って秋保温泉ホテル瑞鳳に宿泊しました。

詳細は省きますが、めちゃくちゃ良かったです。 また行きたい……

🔖ノベルティについて

今回の公式ノベルティは栞でした。

f:id:kokuyouwind:20180606143050j:plain

玉虫塗で高級感があります。定規を模しててかわいいですね。 個人的には小説・理工書問わず本をそこそこ読むので、これはありがたいです。

ちなみに、前回の公式ノベルティはしゃもじでした。 厳島神社の縁起物ということでインパクト抜群でしたね。

一方で、各社さんのノベルティも充実していました。

冒頭でEightさんのノベルティの話をしましたが、他だとリアルガチャがあったのと、どら焼きがやたら充実していたのが印象に残っています。 賞味期限ギリギリになった大量のどら焼きを食い尽くすために力を合わせたRubyist達の勇姿、涙なしには見られませんでした…

ノベルティに関してはMisocaも力を入れたものを配布しました。 以前の記事でもご紹介した、ステッカー帳とRuby入りのフロッピーディスクです!

tech.misoca.jp

tech.misoca.jp

ブースは今回なかったので、ノベルティ置き場に見本を展示して、Misoca社員が手渡しで配布していました。

f:id:kokuyouwind:20180606133650j:plain

おかげさまで好評で、いろいろな方に声をかけていただきました。

中にはMisoca社員を探されてたり、声をかけていただいたのに手持ちが尽きていたりということもあり、そのあたりはすみませんでした… 手配りしたのは今回が初めてだったので、このあたりの知見は次回に活かしたいと思います。

ちなみに、ステッカー帳は自分の分を確保して各社さんのステッカーを集めてみました。

裏面にもいくつか貼ってるので写ってない会社さんもありますが、ご容赦ください……

f:id:kokuyouwind:20180606144141j:plain

🎤セッションについて

当然ですが、RubyKaigiのメインはセッションですね。

今回もMatzの名付けの話から始まり、興味深いセッションをいろいろと聞いてきました。

なかでも今回は静的型検査を実装してみた系のセッションが多く、個人的に関心が高い分野なので面白かったです。 @soutaroさんの型定義ファイルを使った検査の話や、@mametterさんのTypeDBとType Profilerの話も公式に取り入れる方向のアプローチとして着実に進んでるなぁという感じだったのですが、Stripeで使っている型検査システム Sorbetの話が大穴という感じで凄かったです。

Webから技術デモを試せるんですが、注釈なしでもstring+symbolとかdeadcodeとかを検出できてますし、注釈の書き方も言語内DSLでわかりやすいと思います。 なにより発表の中で「すでに実用しておりスケールしている」という内容があり、ある程度実績がある、というのが強いですね。 今後オープンソースにしていきたいという話もあったので、Misocaでも取り入れられないか注視していきたいと思います。

一応補足しておくと、Sorbetは言語内DSLを使ってソースコード中に型注釈を書いていくアプローチでした。 このため型注釈を使わない方針のRuby3に入ることはまずないでしょうし、今後もしSorbetが放棄された場合はちょっとめんどくさいことになりそうな気がします。 とはいえ、質疑応答で答えていた「我々には今、ちゃんと動く型検査システムが必要なんだ」という理念は、一つのスタンスとして素晴らしいと思いました。

つい型システムで饒舌になってしまったので他のセッションの話は割愛します。 私用で3日目は出られなかったので、最後のTRICK2018が見られなかったのは残念でした……

🗾次回の開催地

発表があったみたいですが、次回開催地は福岡ですね!

f:id:kokuyouwind:20180607102248j:plain

来年、また福岡でお会いしましょう!

🏖余談

仙台に行ってきたところなんですが、月末にはHackers Champloo 2018で沖縄に行くことになりました。 沖縄の皆様、沖縄に行く皆様、よろしくおねがいします。

📢宣伝

RubyKaigiやHackers Champlooなど、Misocaでは勉強会参加費・交通費が支給されます!

Misocaでは会社のお金でRubyKaigiに行きたいエンジニアを募集しています!

RubyKaigi2018 で現存する最古の Ruby をフロッピーディスクに入れて配布します

id:mizukmb です。こんにちは。

昨日紹介した 📖ステッカー帳 に引き続き、 RubyKaigi2018 でお配りするノベルティを紹介します。

来る RubyKaigi2018 にて、 Misoca ではノベルティとして Ruby 0.49 のソースコードが入ったフロッピーディスク を配ります。

こちらの紹介と、 Ruby 0.49 のビルド方法や実際に動かしてみた内容について書きたいと思います。

フロッピーディスク 💾

f:id:mizukmb:20180528162226j:plain

外観はこんな感じで、 RubyKaigi2018 仕様のジャケットと一緒にケースに入っています。ケースは自立するので飾ることができます。かっこ良いですね。

こちらのフロッピーディスクですが、実際に読み込むことができ、中には Ruby 0.49 のソースコードが入っています。

Ruby 0.49 はこちらで公開・配布されています。 ftp://ftp.ruby-lang.org/pub/ruby/1.0/

Ruby 0.49 をビルドしてみる

実際に Ruby 0.49 をビルドします。以下の環境で試しました。

フロッピーディスクを読み込む

会社にフロッピーディスクドライブを内蔵した PC が無かったため、 Amazon で外付けドライブを購入します。

ドライバにフロッピーディスクを入れると、「ウィーン, カシャ...カシャ...」という音と共に読み込まれます。オフィスで作業していたところ、懐しさからかこの音を聞きに多くの社員が私のデスクに立ち寄ってました。

読み込みに成功すると、 ruby というディレクトリがあると思います。これが ruby 0.49 のソースコードになります。適当なローカルストレージにコピーしてください。

macOS High Sierra でビルド

UbuntuRuby 0.49 をビルドしている記事があるので、こちらを参考にしながら macOS でもビルドします。

Ruby 0.49 をビルドする

現環境ではそのままビルドできないようです。有志が公開しているパッチをあてて make できるようにします。

github.com

上記パッチは 32bit バイナリを想定されているようなので、クロスコンパイルできる gcc を用意します。

macOS に標準搭載されている llvm-gcc ではクロスコンパイルできないので非 llvmgcc をインストールします。

こちらの記事を参考に gcc-7.2.0 をインストールしました。 1

marssky99.com

gcc の make に非常に時間がかかりました (2時間半くらい) 。気長に待ちます。

その後、以下のようにパッチを当てて Ruby 0.49 を make します。

$ cd /path/to/ruby # 事前にフロッピーディスクから ruby ディレクトリを適当な場所にコピーしてください
$ curl https://raw.githubusercontent.com/charliesome/historical-rubies/master/ruby-0.49.patch -LO
$ patch -p1 < ruby-0.49.patch
$ ./configure
$ make CFLAGS="-w -Wno-return-type -m32" CC=/path/to/built/bin/gcc7.2.0 # gcc のパスは適宜変更してください
(snip)
-n Loading ruby ...
done
rm parse.c
$ ./ruby -v
ruby - version 0.49 (18 Jul 94)

18 Jul 94 というのが時代を感じますね。ちなみに94年といえば私はまだ1歳で当時の事は何も覚えていません。

Ruby 0.49 で遊ぼう

ビルドに成功したので遊んでみます。素朴な fizzbuzz を実行します。

こんな感じに書いてみました。

class FizzBuzz
  def self.call(num)
    for n in 1..num
      case 0
      when n % 15
        print('FizzBuzz')
      when n % 5
        print('Buzz')
      when n % 3
        print('Fizz')
      else
        print(n)
      end
    end
  end
end

FizzBuzz.call(15)

実行結果

$ ./ruby scripts/fizzbuzz.rb
12Buzz4FizzBuzz78BuzzFizz11Buzz1314FizzBuzz

for n in 1..num ~ end1.upto(num) とか書けそうですが動きませんでした。

$ cat upto.rb
num=10

1.upto(10) do |n|
  print(n)
end

$ ./ruby upto.rb
upto.rb:3: syntax error
upto.rb:5: syntax error

恐らく upto メソッドが無いからだと思われますが、エラーメッセージから得られる情報が少ないのでソースコードを見る必要がありそうですね。

他にもソースコードsample/ ディレクトリに、テスト用に書かれたと思われるサンプルコードがいくつかあるので、そちらも実際に動かしたり眺めたりしてみると良さそうですね。

🙌RubyKaigiで会いましょう

フロッピーディスクは RubyKaigi 2018 に参加する社員が持ち歩いてますので、声を掛けていただければお渡しします。会場やドリンクアップで弊社員とお会いした時は是非お手に取ってみてください 💾

📖ステッカー帳もご用意しましたので、そちらもよろしくお願いします。

それでは RubyKaigi 2018 で会いましょう!

One more thing

当たりフロッピーディスクがいくつかあるらしい…… 👀

f:id:mizukmb:20180529112213j:plain

お楽しみに!


  1. 執筆時点の gcc 最新バージョンは 8.1 ですが、より確実にビルドできる方法を優先し記事内のバージョンに合わせました。

📖ステッカー帳

mzpです、こんにちは。

RubyKaigi 2018で配るノベルティとしてステッカー帳を作成したので紹介する。

f:id:mzp:20180528095948j:plain

🔖ステッカーをどう使うか

RubyKaigiに限らず技術カンファレンスではステッカーを貰う機会が多い。 Misocaでもロゴステッカーをよく配っている。

f:id:hidakatsuya:20170918112611j:plain

ノートPCに貼ったり、手帳に貼ったりするが、だんだんと場所が足りなくなっていく。 そして既存のステッカーの上に新しいステッカーを貼ったり、古いのを剥したりとしていくことになる。

f:id:mzp:20180528134803j:plain

📖ステッカー帳

この問題を解決するために、ステッカーを貼るための専用の手帳を作った。

f:id:mzp:20180528100020j:plain

御朱印帳のように蛇腹折りになっているので、貼ったステッカーを一度に見られる。

f:id:mzp:20180529095914j:plain

🛠作っているときの様子

ある日、ふと思いつく。

みんなに説明するために図を書く。今みたら蛇腹の向きが、完成版と違う。

f:id:mzp:20180412093919j:plain

発注前にロゴのサイズ等を大きさを確認している。オフィスのプリンターで印刷して自分で折った。

f:id:mzp:20180528135607p:plain

「手帳渡されても分からないのでは」と指摘されて、あわててマニュアルを1ページ目に追加した。

f:id:mzp:20180528095954j:plain

🙌RubyKaigiで会いましょう

RubyKaigi中にMisocaメンバーに声を掛けてもらえば渡せると思う。たぶん、こんな感じのロゴ入りのTシャツを着ていると思う。

f:id:miho_hama:20180427094254j:plain

RubyKaigiで会いましょう!