HHKBのキーボードルーフを自作する

HHKB Professional 2を使っているのですが、この度オフィスがフリーアドレスになり、キーボードを毎日持ち歩きすることになりました。*1

 

しかしHHKBは知ってはいたがキーボードカバーが高い。

HHKBキーボードルーフ (Professional用/クリアー)|PFUダイレクト

4000円... まあHHKB使っている時点で道具には金に惜しまない人間と判定されているのかもしれませんが、どう考えてもプラケースならもっと安いのあるやろ。

 

ということでずっといい感じのものがないか、どうせ先人がいるだろう、と探していたのですが安易な代替品はなく、ソフトカバーの記事がヒットするばかり。

HHKB カバー 100均とかでググっていてさまざま見つけましたが、カバーで最適なのはこの方のもの。良さそうですが、ソフトカバーなのでカバンの中でキーボードが押しっぱなしになりそう、という懸念があります。

HHKBのケースをいろいろ試して最後にたどり着いたのはダイソーだった件 | ねぎ子の散財日記

 

しかしここに先人の知恵あり。なんと自作している方がいました。

hemus.hatenablog.com

うーん、自作かーーーーー ぜったい100均にありそうなもんだけどなーーーー

と、心理的ハードルがあったのですが、これ以上ググっても同じ記事しか見つからないので、やってみることにしました。手順も結構少なさそうです。

一番微妙なのが木材を切るところですが、自宅で切ると木屑処理や工具の問題などがあって困ったのですが、ホームセンター的なところでカットサービスや、むしろDIYコーナー的なところで処理できそうです。今回は調べたら1ヶ所切るだけだったのでDIYコーナーで処理しました。(コーナンは神)

 

買い物とカット

  • アガチス工作材 5x100x600 … 700円
  • ヒノキ 3x10x900 ... 100円
    • トラックバック先の方は3x5x90をくっつけて3x10x90に加工していましたが、10mmのが価格同じで販売してたので、こちらを採用
  • 木工ボンド ... 100円
  • 水性ウレタンニス つや消しオールナット ... 800円
    • 色やら種類やらいっぱいあったのだが、とりあえず水性ウレタンニスなら失敗なさそうです。色とツヤはお好みで。
  • サンドペーパー #320 ... 50円
  • サンドペーパー #240 ... 50円
    • 当て木もなかったので端材50円くらいのを買いました。

合計1,850円

 

「アガチス工作材」って初めてきいたのですが、普通に置いてありました。メジャーな材質なのかな。

 

購入後に借ります。天板部分を290mmになるように手ノコギリで切ります。290mmはキーボードに対してちょっと長めなので、少し失敗しても大丈夫です。

切り口はやっぱりちょっと荒れているので、#240のサンドペーパーもこの段階で掛けます。手がめちゃめちゃ木粉で汚れるので服につかないように注意。

天板が終わったら、それに合わせて脚になるヒノキ材を切ります。丈夫な鋏で切りました。ノコギリでもいいが割れないように注意。

 

組み立て

貼り付けとニス塗りは時間がかかるので自宅でやります。

木端が手前に来ないように長さを調整しています。

天板と足は木工ボンドで貼ります。万力などはないので、ちょっと大きめの洗濯バサミで固定。24時間放置します。(速乾だけどしっかり固めたかったので)

 

足の長さや内径サイズが狭すぎないかなーと不安に思うわけですが、恐ろしくピッタリでした。(写真はわかりやすいようにキーに載せてますが横幅も問題ないです)

横幅はキーボードよりちょっと長いですがリストレストにもする予定なので問題なし。

 

ニス塗り

中学生の技術の授業以来でニス塗りしました。ニスって、いまいちなぜ塗るのかよくわからなかったのですが、今回調べたらすごく理解しました。

  • 生木は柔らかいので傷つきやすい
  • 生木は水が染み込みやすい

ニスを塗ることで

  • ニスが固まり樹脂的なコーティングがされるので、傷つきにくくなる
  • 樹脂コーティングなので水を弾く

ということで耐久力が上がるようです。小中学生のときは耐久力とかよくわからなかったからなー。

しかも、色がつきます。ここでハッっと理解しました。

家具とかの色で、「ウォルナット」「マホガニー」とかあるやつ、てっきりその木を使っていると思ってましたが、ほんとにその木を使う場合もあるかもしれませんが、安いものの場合は、単に色のことを指している場合もあるってことですね。

今回やってみて色が高級感出してくるのでびっくりした。ニス材も昔に比べてよくなってるのかもしれません。

天板の材料が余っていたので(余談ですが600mmの材料に対して必要な長さが290mm、ノコギリの刃厚が2mmくらいなので、予備1枚ができる)、比較してみました。

コーナンのニスコーナーに塗り方が書いてあったのでメモ

  • 塗る前に元木をサンドペーパー#240番で削る
  • ニスを塗って乾いたら、#320番くらいで削る(表面のザラザラがなくなる)

 

塗る前と1回目

全然色が変わる

1回目と2回目

染み込みやすいところだけが濃いのがだんだん均等な感じになる。ここでも十分だけど楽しいからまた塗る。(この段階で裏面も1回塗ってます)

1回目と3回目

かなり丈夫な感じになっているので、これで終了。


いい感じです。

ベニヤ板とかのイメージがあったので、圧力がかかったらバキっと行かないかなと思っていたのですが、全然大丈夫でした。

 

まとめ

手間を考えるとそんなに安いというわけでもないのですが、やってみたらかなり楽しかったし、愛着でるのでおすすめです。

DIYレシピを公開していただいているトラックバック先の ヘムスさん には大感謝です。

 

また近年は100均使いすぎて自分で作るという選択肢が頭になかった(めんどくさそう、と嫌厭していた)ということに気づきました。でも楽しかったなー。特にニス。小瓶(プラ?)だったのですが2/3くらい余っているので、気が向いたらまた木工作業したいと思います。

 

*1:

会社にもロッカーはあるのだが、席と行き来するのが面倒なので持ち歩きすることにした、というコンテキストなのですが、実際出社してみたら別にロッカーに置いといてもいい気はしたので、この記事は自己満です

Search Engineering Tech Talk 2019 Autumnに参加しました

検索勉強会に参加したよ(その2)

ヤフーにおける機械学習検索ランキングの取り組み 鈴木さん

こういうのが聞きたかった。。。というかこの勉強会みんな検索に苦労している。

  • A/Bテストはめちゃめちゃやっている。オフラインの評価はオンラインでも性能が良いので、その意味ではすごくやっている。そういう意味では打率良い。
  • KPIは秘密。。。

niconicoの検索システム -2019年版 by ドワンゴ 石塚さん

 

2019/6に任意のタグでランキングできるようになった。え、まじすごい。

ランキングソート

動画再生数、マイリスト数、コメント数などの24時間の評価。1時間ごとに動画サーバから1時間ごとにドキュメントごとのランキングスコア増加量が送られてくるので、24時間分を合計する

ただし、ゲームのタグで700万件。Elasticsearchのrescoreを使って負荷軽減している。更新が会った時に24時間分計算し、近似値として持っておく。第一ソートで近似値を使い、上位にヒットしたものだけ24時間分で計算する。バッチで24時間再生されていない近似値は削除。いろいろやっている。ユーザ数が多いと大変だなぁ...

 

パーソナライズドソーシャルサーチ

人間の興味は千差万別なのでそれに検索は対応する必要がある。が、「黒猫」という文字列が入っているクリエイターは100名以上いる、、、などただのワードでは難しい。つながりを表現する必要がある。

なので、

 

... うん、強ワードすぎる。めっちゃ言いたい。

「うちの検索は凝集型階層的グラフクラスタリング使ってますよ。」

めっちゃ厨二臭がする(失礼)

 

実際Louvain法でフォロー関係、視聴関係のつながりを使ってクラスタ情報を生成

 

質疑

・同じよーな検索クエリで検索した時に見た動画のスコアをあげる、というのも手法としてあるのでは?
 → ユーザは検索以外からも流入してくるので、そういう情報も加味している
・Louvain法を選択した理由は?
 → 2016年ではそれがメジャーだった。Hadoopで利用できる方法がこれしかなかった。今だったら違う方法を選んだかも。

・ユーザを中心にモデルにした理由は?

 → 動画はタグがなかったり、テキスト情報が少なかったりする

 

なるほど。。。サービスの特徴がいろいろ影響しているなぁ。

 

メルカリ検索におけるオフライン品質評価 by 株式会社メルカリ 富樫さん

Topic setのの構築

  • 偏りのないサンプリングをするために月別、層別にサンプリング

指標

  • 何らかの良さを測るもの。仮説・信念について相関しそうなもの。検索結果(SERP)から計算可能なもの。
  • 仮説は
  • User Study
  • オンライン指標の観察
  • Debug devel

指標を作る

  • メルカリではFressnessが大事
  • でも車と服では出品のされやすさが違う
  • だから出品時刻を「順序尺度」として扱う。そうすればクエリ間での評価が変わらない

 

  • 順序しか使えないのでノンパラメトリックな指標を使いたい
  • ざーーーっと検索結果が見られるので、nDCGみたいなディスカウントは変

→ ということでKendall's τ を選択

 

適合度

  • 適合度は自動で作るのはちょっとダメ
  • 開発者が言語化できていないと改善の議論ができない
  • 自分はクリック率を信じてない 
  • → わかりみがすごい。クリック率選ぶのって脳死だと思う。

クラウドソーシングで適合性評価

  • Pros 単価安い
  • Cons 難易度高い、データ品質悪い、Abuserがいるかも
  • → それぞれ工夫でかいぜん

 

これ以降、クラウドソーシング運営の話が圧倒的すぎてうまく書けないです。察せ。

約束のネバーランド 1 (ジャンプコミックスDIGITAL)

約束のネバーランド 1 (ジャンプコミックスDIGITAL)

 

 

Debug eval
  • クラウドソーシングは実はお膳立てにすぎない
  • あくまで素人の意見は素人の意見
  • Search qualith担当の技術者全員が集まって議論する(debug eval)のを効率的にするために利用

 

Σ(´∀`;), 工エエェェ

 

あれだけ色々やっていて、全てはお膳立てにすぎないとか。。。

どんだけ力入れているんだ。。。

 

そして2019/6の1ヶ月で22回も実験しているとは、、、こりゃ進化の速度に劇的に影響するわ。。。

 

今回も充実でした。

 

 

 

 

検索勉強会に参加したよ

検索勉強会に参加するよ

この会社に入ってからECサイトを担当しているのですが、なんと「検索」をテーマにした草の根の勉強会があったので参加しています。

search-tech.connpass.com

検索は、システムに必須の機能になってきています。 あって当たり前の技術になっていますが、実は結構色々と考えることがあったりします。

検索技術勉強会の目的は、「検索」/「検索システム」にまつわる技術や手法に関して共有できる場を提供することです。 検索エンジンごとの勉強会などもありますが、検索エンジンには関係なく、「検索」というシステム、サービスを作る上で共通の解決すべき課題があります。 これらの課題をみんながどのように解決しているのかといった知識を共有できる場になればと思っています。

 

で、感想なのですがめちゃめちゃ面白いので毎回参加しています。

これまで全回参加できているので、ご紹介...

 

第1回

「いい検索」を考える」 内田さん

どういう感じなんだろうな~と思いながら聞いた思い出...

初心者に優しい感じの基本知識セッションかな、とか思いきや最初だけ。どんどん「奥深いな~~~」となるセッションでした。

2017年入社って、社会人2年目じゃない?すごすぎじゃない?

 

古いですが検索の鉄板本... 大学のときに読んだもの。

情報検索アルゴリズム

情報検索アルゴリズム

 

 こちらは去年読んだ本。これも中々面白いです。

 

情報アクセス評価方法論

情報アクセス評価方法論

 

 

でもこの発表のいいところは、こういう「汎用的な」評価方法にとどまらず「よい検索とは?」を定義しているところでした。すばらしい...

あまりに良い発表だったんで社内で4回くらい人捕まえて聞かせた。

 

UI/UXが無意識に検索行動に与える影響について  Tairo Moriyama さん

メルカリの検索チームすごい話でした。SIG-IRいってるとか尋常じゃない。

評価指標もめちゃ参考になるな~ うちのサイトはどうしたらいいんだろうな~~って考えさせられました。

ちなみに本番の発表では、ある改善が思うように改善しなかった事例を元に、なぜそうなったのか?の「クイズ」的な流れになりました。

20人くらいチャレンジしましたが(私も答えてみましたが)全員はずれ。

もちろんこの流れも社内で再現しました。誰も当たらず。そして答えを言った瞬間の反応も同じ。再現率高すぎる。

 

Efficient top-k query processing in Lucene 8 @moco_betaさん

サービスのレベルの話から、要素技術の話へ。

話の内容の6割くらいついていけてない。

というか、「Luceneの数年オープンになっているチケットを最初から追いかけて流れをつかむ」とか平然と発表されていて、会場が「何者www」という空気でした。

Lucene8ははやいんだなー はー という感想しか残ってない。すごい(語彙)

 

第2回

 もう前回が楽しすぎてテンションがすごかった。でもネタ切れするやろ、と思っていたのが良い意味で裏切られました。深すぎる。

 

「安心な移動」のための POI(Point-of-Interest; 地点) 検索 @lastarrow21 さん

会場ご提供元のNaviplusさんの発表でした。

地点検索とかニッチすぎるな~ ECサイト改善にはあんまり関係ないだろうな~とナメきってました。

  • 経路検索するにも、まず地点の特定ができなければ始まらない、というNaviplusのサービスにとって超重要な要素であること。
  • ECサイトや一般情報検索と違って、検索対象ドキュメントが「地点」という非常に限られた情報量で、的確に検索しなければならないという難しさ。
  • DBにはない「知名度」や、現在地との「距離」などを加味しなければならない地道なデータ構築

めちゃ頭が下がる... 場所の検索といっても考えることが多くてアイディアが広がりますね。

 

社内ドキュメント検索システム構築のノウハウ @shinsuke_sugaya さん

これまでの検索が主にテキストデータをドキュメントとして扱っていた発表だったのですが、それとはまったく軸の異なる課題感がある「社内ドキュメント検索」の話。

  • 種別がたくさん:Word、PDF、画像、Excel一太郎(官公庁とか)、業務システムのDB
  • 権限制御:機密文書、開示範囲...
  • 前処理:そもそも検索対象ドキュメントが一箇所に集まってない。様々な全然違う形式のデータソースから収集する部分も作る必要がある

いままでふわっとしていた、Lucene, Solr/ElasticSearch, GSAなど、同じ検索関連のプロダクトのカテゴライズも整理してくださっていたのでわかりやすかった。

 

料理動画アプリ「クラシル」の検索について @818uuu さん

「検索を好きになったの 小学6年生」

 

やべーやつが来た

 

これはもう、すごすぎて何もいえません。

うちの会社の検索女子にツメの垢を煎じて飲ませたいです(ということでその次の回に検索女子を連れてきました)。

 

第3回

仮)Rettyでお店を探す体験 @R3kei さん

いやー大変だよねー前処理大変だよねー

って思っていたら

なんだかんだ1,2名が片手間でやっている

 うぉぉぉおぉぉっぉぉ

がんばってください。。。

 

ESで類似ベクタサーチをシュッとやる @takahi_i さん

システム要件が出てから手法の良し悪し・手間・めんどくささw を脳内で考えているときってこんな感じだな~~あるな~~と思いながら拝聴。

類似度ベクトル検索って結構カジュアルにできるし需要ある気がするけど、最近は機械学習に負けているのかな。。。

 

 検索の運用って難しいよねって話 @setsuna82001 さん

実は今回この発表が一番楽しみでした。

前回のさくらさんの発表に感化されて、弊社の検索女子(新卒1年目)を連れて行ったのですが、主に同義語辞書などの運用をやっているので、そこに共感... したかった。

 

クラスタ・ノード管理

負荷対応

設定ファイル更新

バージョンアップ

日常の運用

 

あっ、あっ、、、だめだ。。。これはガチのインフラ側の運用や。。。

 

さっぱりわからなかったらしいが、新卒1年目でしたので勉強会自体初めて、ということで、楽しんでいたのでいいでしょう。

そういえば前職では勉強会にいきまくりでした。新卒入社のときに上司が「勉強会で発表しろ」と猛烈にプッシュされていたのを思い出しました。

時間が経ったなぁ。

 

さて来る次回は?

ということで毎回楽しい検索勉強会 #searchtechjp ですが、次回は2019年秋。

明日です!!!!

 

 

 ブログ枠で申し込みしましたので、参加後にレポート書きます。楽しみ。

 

 

PostgreSQLでSQLを書いた

すーーーーごい久々にBlog書きます。。

最近、負けているなーと思いつつSQLを書いているのですが、要件が複雑なデータ補正なので、「selectの基本構文はわかります」程度のレベルでは立ち行かず、9行の補正に4時間掛けてどうやればいいか調べて徹夜したりしてます。。。
(手修正すればいいけどそれはそれで負けている気がする)

基本PostgreSQLです。

  1. insert select 構文 〜 SQLでデータを作ってテーブルに保存
  2. coalesce 〜 nullだったらデフォ値を入れる
  3. joinに直値 〜 予め結合するデータを絞る(高速になるのかな)
  4. dense_rank() ウィンドウ関数 〜 max() + 1 じゃできないことをやる
  5. array_agg & 配列の要素アクセス 〜 first_value じゃできないことをやる

insert select 構文 〜 SQLでデータを作ってテーブルに保存

データの補正作業や、アプリで制御しているような各種テーブル間の整合性を取ったデータを作る必要性がある場合、既存のテーブルからデータを作ってテーブルに入れたいのですがそれを一発でやる方法です。

insert into テーブル名
select *
from 取ってくるテーブル

insert行とselect行の間にはセミコロンとかカッコとかいりません。
insert行をコメントアウトしておけばselectした結果をコンソールで見て確認することもできます。

nullだったらデフォ値を入れる

「joinして結合先テーブルに存在しないならこれにしてください。」という要件。
単にleft outer join するとnullになるので、NOT NULL制約が付いているカラムだとイライラしてしまいます。

そこでcoalesce関数 ※いつも読み方わからないが「コウアレス」と読む。

select coalesce(name, '名無しさん') 
from users
  left outer join letters
    on users.name = letters.from_name

↓わかりやすい
SQL関数coalesceの使い方と読み方 | データベース | DoRuby

joinに直値 〜 予め結合するデータを絞る(高速になるのかな)

たまにサンプルとかで見るのですが、???ってなっていた構文。

select users.name
from users
  left outer join letters
    on users.name = letters.from_name
    and letters.year = '2017'

on句って、テーブルAとテーブルBを結合するときの条件なので、AのカラムとBのカラムを比較するしかできないと思っていた...
けど、SQLは動くのです。いまいちどういう概念なのか調べることもできなかったのですが、たまたまものすごい「それだっ」というブログ記事を発見したのでついでに記録。

http://atsuizo.hatenadiary.jp/entry/2016/12/12/163921

「JOINに直値」

まんまだけどわかりやすい!まんまだけど!
もっと広がれ。

http://blogs.itmedia.co.jp/doc-consul/2015/11/sql.html

こちらもわかりやすい。ON句に書けるのは、「結合前抽出条件」と「結合条件」の二種類!
SQL処理エンジンにとっては同じなのかもしれませんが)

「結合前抽出条件」と聞くと、いらんデータは絞ってから結合したほうが速いのかなぁ、って思うので結果が変わらないinner joinのケースではwhere句からon句に持ってきたりしてます。最適化エンジンが頑張りそうなのであまり意味は無いかもしれません(測定してません)。

dense_rank() ウィンドウ関数 〜 max() + 1 じゃできないことをやる

insert ~ select構文を使うとき、一番便利なのはmax()関数を使って、シーケンスっぽいことを実現するとき。
データをバルクで登録するとき、順序やキーが一意になるように最大値+1を自動で設定する。
(同じ値が登録される気がするが、1行登録されるとmaxが更新されるらしくちゃんと動く。原理がよくわからない...)

insert into users
select other_users.name, max(users.id) + 1
from other_users

だがしかし。ユーザクラス別にユニークなキーや順序を指定するときには使えない。
そこでウィンドウ関数を利用。user_orderをclassごとにユニークにしたい場合に使えます。
既存のテーブルに追加する場合はclass毎の最大値を取っておく必要があるのでちょっとメンドくさい。

insert into users
select other_users.id, other_users.name, other_users.class, max_num + dense_rank() over (partition by other_users.class order by other_users.name)
from other_users
  join (
    select class, max(user_order) as max_num
    from users
    group by class
  ) as max_order_by_class
    on other_users.class = max_order_by_class.class

(ちょっとSQL怪しいかも)

ウィンドウ関数は最初わかりづらかった。。。
partitionとgroup by で混乱してしまってましたが、理解すると超便利。

http://postd.cc/window_functions_postgresql/
https://lets.postgresql.jp/documents/technical/window_functions/1

array_agg & 配列の要素アクセス 〜 first_value じゃできないことをやる

Group byしたとき、Group gyのキー以外のカラムにてきとーに値をいれたい、という要件
関数の名前から、ずーーーーと first_value(最初の1個取れそう)でできるだろうと思っていたけどできなかった。

Group byしたとき、集約キー以外の項目が2値以上取る場合にNULLになってしまうのが困るのです。
first_valueは「ウィンドウ関数」なので、行を集約しないのです。

そこで、array_agg集約関数

select class, (array_agg(name))[1] || 'さん、等'
from user
group by class

array_aggはgroup byした各グループの、特定のカラムを配列化して1行に集約しちゃう関数。
上記の場合、配列化せずに単に name || 'さん、等' *1を付けると1個目がピンで表示できる。
*2

array_aggは、配列型がわかってないと難しい。下記は例を用いて説明があるのでわかりやすい。
http://qiita.com/choplin/items/9d5e2ff8721fb9509bf8


最近の自分の最大の問題は、このBlog書き始めたのが5月なのに、最後の2つの項目書くのをずっと溜めてしまって9月公開となったこと。うーむ、、、

*1:※ 余談だが、「1行しかなかった場合は'等'を付けない」としたい場合は、 case式でcount(name)の結果によって場合分けすればよい))) とすると、nameがNULLになってしまうので||で結合した文字列全体がNULLになってしまう。 array_aggの戻り値は配列型なのだが、配列アクセス演算子の結合優先順位が高いのでカッコでくくって[1] ((PostgreSQLではデフォルトでは1始まりになる。

*2:なお、PostgreSQL 9.x以降は、order byを付けることで配列化するときの順序を指定できるようだ。
https://www.postgresql.jp/document/9.4/html/sql-expressions.html#SYNTAX-AGGREGATES

Piwikを試す

Windows7に入れようと思ったらはまったのでメモ

1. extentionが見つからない
php.iniを作ってない
php-develop.iniをコピペしてphp.iniを作る

php.iniの,


php.iniの, mbstring.dll関係、pdo等mysql関係のコメントアウトを外しておかなければならない

;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_fileinfo.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_gmp.dll
;extension=php_intl.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
extension=php_mbstring.dll
;extension=php_exif.dll ; Must be after mbstring as it depends on it
extension=php_mysql.dll
extension=php_mysqli.dll
;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client
;extension=php_openssl.dll
extension=php_pdo_firebird.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_pspell.dll
;extension=php_shmop.dll


; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
; extension_dir = "./"
; On windows:
extension_dir = "ext"

最後の行のコメントアウトを外しておかなければならない

[Mac] Mountain Lion on VirtualBox on Lionしました。

iPhoneアプリを作ろうと思って思ってきただけの数年が過ぎました。
ちょっとこのへんでプログラミングスキルの衰えを本格的に感じてきたのでアプリ開発するべく環境を作ったので例によって自分のためのログ。

  • 物理マシン:11 inch Mid 2011 Macbook Air, Mac OS X 10.7.5 Lion
  • 今回インストールした仮想マシン:10.8 Mountain Lion
    • Mervericsが発表されたけど秋リリース予定らしいのでヤメました。
    • 開発者版はダウンロードできますが、Developper登録しないといけず、開発がそこまで続くか自分が信用できなかったのでまだ登録してません。あとアプリ開発でハマるのに開発者版のOSでもハマりたくなかったというのもあります。

ワタクシ、このマシンを買う前までは普通に開発環境インストールして作業していたのですが、Macbook (プラのヤツ)がどんどん重くなっていくのを感じていたので、開発環境はVMでやる!と決めています。
Windows 7CentOSVirtualBox上にインストールしてあり、MBA自体はテキストエディタやブラウザくらいしか入れないようにしています。おかげで2年経った今でも大変快適です。(SSDのせいかもしれないけど)

で、今回iPhone app開発のためにMac OSを買いました。1700円。
MacがあるのにMacを買うのが大変ためらわれましたが...

Mac OSiTunes Storeで買うと、「OS X Mountain Lionのインストール」というアプリがダウンロードできます。
これはイメージファイルではないのでVirtualBoxに食わせられない。
ということで先人の知恵をそのまま使っております。

最終的に参考にしたのはこちらのサイト
http://ritalin.github.io/2012/12-17/hentai-advent-2012/

以下はちょいハマったところ

  • 上記記事での手順の途中、「(仮想OSで仮想ディスクを)ディスクユーティリティでフォーマットする(不要かも)」とありますが、しないとインストール先ドライブがなくて進めかったです。フォーマットというより、パーティションを1つ作成するという形でしょうか。パーティション名は安直に"HDD"としました。なんかもっとなかったのか。
  • VirtualBoxで最初にVMを新規作成するときに、「タイプ」を「Mac OS」にすると、バージョンを「Mac OS」と「Mac OS(64bit)」から選べるのですが、64bitの方を選択しておかないと起動時にブートできないです。作ってから設定で変えることもできるようなのですが、そこで変えてもダメだったので最初から指定したほうがよいです。

現在無事インストールできたので、ゲストOSのほうからはデフォルトインストールされているアプリを削除して開発環境に仕立てる予定です。

余談となりますが、先ほどの記事にたどり着くまでが大変でした。以下どうでも良い苦労話...

続きを読む

TDD in Action

ペアでTDDしつづけるイベントです。
一緒にペア組んでいただいた方にめちゃイロイロ教えていただきました。ちょうラッキーというヤツです!

# 今日のブツをgithubにupしてみました。
https://github.com/zuisener/tddact/tree/master/src/tddact

続きを読む