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

リーンスタートアップ(原題: THE LEAN STARTUP)

書評

今更感がありますが、リーンスタートアップ(第1版第4刷)を読んでみました。全400ページ程度で、最初の80ページはあまり得るものもなさそうかなーなどと思いながら読み進めていたのですが、読み終えてみると結構学びがありました。定期的に見返すために、心に響いた箇所をいくつか抜粋しておきます。

ちょっとでも気になった人は是非買いましょう。サクサクと読めますし、読了後は読了前よりもやる気にみなぎっていることに気付くのではないかなと思います。

リーン・スタートアップ

リーン・スタートアップ

  • 作者: エリック・リース,伊藤穣一(MITメディアラボ所長),井口耕二
  • 出版社/メーカー: 日経BP社
  • 発売日: 2012/04/12
  • メディア: 単行本
  • 購入: 24人 クリック: 360回
  • この商品を含むブログ (91件) を見る


以下、引用と所感です。

引用 P.105

構築 - 計測 - 学習 のフィードバックループ

アイディア → 【構築する】 → 製品 → 【計測する】 → データ → 【学ぶ】 → アイディア → ...

この本の主題である「構築ー計測ー学習」のループ。PDCAとかOODAとかと同じようにも見えますが、ステップが1つ少ないので個人的には好きです。このループを高速に回し続けることこそが、企業の規模やジャンルを問わず成功するために必要、とのことです。

引用 P.107

実用最小限の製品(minimum viable product)

革新会計(innovation accounting)

この本で度々出てくる重要な概念。要は凝った機能を開発するのは無駄な可能性が高いから、本当に必要かどうかはまず実験してみなさいということ。そして評価方法も既存の概念捨てるくらいの覚悟で行くべし、と。

引用 P.122

我々が集めなければならない情報は「事務所の外」にしかない。特にスタートアップは見込み客とのコンタクトを重ねなければそのような情報が得られないのだから、事務所の椅子に座っていてはいけない。出歩いて情報を集めなければならないのだ。

これはエンジニア宛てにも書かれているのかちょっとわかりませんが、意図は伝わります。

引用 P.151

法的リスクで二の足を踏むのはわかる気がするが、MVPを作るにあたって一番多い拒否反応が、競合相手ーーー特に大企業ーーーにアイデアを盗まれるかもしれないという不安であるのには驚くかもしれない。すばらしいアイデアが簡単に盗まれるようなら、苦労はしないと思う。だいたいスタートアップの場合、自分のアイデアや会社、製品を競合他社どころか誰でもいいから知ってもらうことが難しいのだ。この点を恐れるアントレプレナーに対して私は、「自分のアイデアをひとつ(重要性があまり高くないものでいい)、大企業でその領域を担当するプロダクトマネージャーに盗ませる」という課題を与える。電話をかける、レターを書く、プレスリリースを送る……思いつくかぎりのことをしてみればいい。どの企業のどのマネージャーもすばらしいアイデアなら腐るほど持っているのが現実だ。彼らの課題はそのアイデアに優先順位をつけて実行することーーーだからこそ、スタートアップに生き残れる希望があるのだ。

これはまさに目から鱗。

引用 P.185

スプリットテストを導入すると、顧客が望むことと望まないことを深く理解できるようにもなる。ソーシャルコミュニケーションのツールは多いほうが製品の価値は高いはずだと考え、グロキットのチームは顧客同士がやりとりする方法を次から次へと追加していた。もっとやりとりがしたいと顧客は勉強しながら思っているはずだと信じていたからだ。しかし、そのような機能を追加しても顧客の行動に変化が見られないとスプリットテストで確認され、その前提がまちがっているのではないかと疑問が投げかけられた。

ABテストの重要性に気付かされるという意味で、目から鱗。

引用 P.189

遅延登録はオンラインサービスにおけるベストプラクティスのひとつだと言われており、チームは自信をもってこの機能を推していた。遅延登録を導入すると、登録をしなくてもサービスが使えるようになる。とりあえずサービスを使ってみて、そのメリットを経験してから登録すればいいのだ。…中略… グロキットが遅延登録を採用していたのは、これが業界のベストプラクティスだと言われていたからだ。この機能に対し、私はシンプルなスプリットテストを提案した。あるグループの顧客に対し、グロキットのマーケティング資料を見るだけで登録を要求するのだ。驚いたことに、このコホートの行動は遅延登録グループとまったく同じだった。登録率、アクティベーション率、最終的な定着率に違いは見られなかった。つまり、遅延登録は業界のベストプラクティスだと言われているが、それにまつわる努力は無駄以外の何物でもなかったわけだ。

これはもう目から鱗っていうか目から鯨って感じです。自社サービスでも盲目的にやろうとしていたことだったので、やるにしても効果測定をしっかりしなければならないな、と。

引用 P.261

巨大バッチ死のスパイラル(large-batch death spiral)

前回リリースのあとに使った時間があまりに長くて、新バージョンの製品が「会社を賭ける」タイプになってしまうのだ。このときマネージャーは、製品の出荷よりバッチサイズの拡大に走りがちだ。開発期間の長さを思えば、バグをもうひとつ直したり機能をもうひとつ追加したりしたくなる。致命的な欠陥になるかもしれない点を見すごしてこの一大リリースの成功を危険にさらしたくないと思うのがマネージャーという人種なのだ。

いわゆる開発あるあるですね。バッチサイズは可能な限り細かくやるのが良いようです。100通の封筒に手紙を詰める作業も、100通折ってから100通詰めるよりも、1通折って1通詰めるということを100回やった方が効率的らしいです。

引用 P.265

検証したい仮説を設定したら、なるべく早く実験方法を考え、実行していく。このとき、バッチサイズは可能な限り小さくする。フィードバックループは実際に行う順番に合わせて「構築ー計測ー学習」としているが、計画はこの逆順で考えるーーーまず学ぶ必要があるものをみつけ、そこから逆順でその学びが得られる実験となる製品を考える。つまりポイントは顧客ではなく顧客に関する仮説(hypothesis about the customer)であり、それをプル信号として製品開発をはじめとするさまざまな仕事を動かす。これ以外の仕事はすべて無駄である。

つまり常に学びたいものを考え、それを検証しまくろうということですね。ソーシャルゲーム屋さんはこのサイクルがめちゃくちゃ速いイメージです。

引用 P.274

「スタートアップは餓え死にしない。溺れ死ぬのだ」。製品を改善するアイデアなら数えきれないほど浮かぶが、このようなアイデアの大半はごくわずかな違いしかもたらさない。それが現実だ。ほとんどが単なる最適化にすぎないからだ。スタートアップは検証による学びが得られる大きな実験に注力しなければならない。

すごく的を射ている表現だと思います。

引用 P.275-286

粘着型成長エンジン(sticky engine of growth)を使う企業は顧客の離反率や解約率と言われるものに注目する。

…中略…

ウイルス型成長を示す製品の場合、その製品を顧客が普通に使うだけで人から人へと認知が広まる。顧客は知り合いに勧めようとも思っていないし、必ずしも製品について何かを伝えようと思っているわけでもない。ただ、顧客が製品を使うとその副作用として自動的に成長していく。ウイルス効果は顧客がオン・オフできるものではないのだ。

…中略…

ウイルス型成長エンジンを使う場合にはウイルス係数の改善に注力しなければならない。この数字がほんの少し変わっただけで将来性が大きく変化するからだ。

…中略…

広告には100ドルかかり、その結果、50人がサービスを新規契約してくれるとしよう。このとき、この広告は顧客獲得単価(CPA)が2ドルだと言う。ここで商品の生涯価値が2ドルを超えていれば、成長が得られることになる。支出型成長エンジンの回転速度を決めるのは、この生涯価値と顧客獲得単価の差(限界利益)だ。

成長パターン(成長エンジン)が【粘着型成長エンジン】【ウイルス型成長エンジン】【支出型成長エンジン】の3つに分類され、とてもわかりやすい。とりあえずこの章は3回読んだ方が良いと感じました。

引用 P.296

しかし、スピードばかりを重視するのもよくない。スタートアップには、理想的な仕事のペースをみつけるスピード調整器が必要だ。

…中略…

「生産を止めなくていいようにするため生産を止める」という自己矛盾したトヨタの格言に集約されている。アンドンの役割は、品質に修正不可能な問題が発生したらただちに作業をストップすること、つまり、原因究明をしなければならない状況を作ることである。時間のために品質を犠牲にしてはならないーーーこれがリーン生産方式の肝だ。いま品質問題が発生しているなら、あるいは品質問題を見のがせば、その結果生じた欠陥によって後々スピードダウンせざるをえなくなる。欠陥があるとやり直しが必要になる、士気が低下する、顧客から苦情が入るなど、前進を妨げ、貴重な資源を食いつぶす原因がいろいろと発生する。

品質を落とすと結局あとで苦しい思いをする、ということなのだろうけど、とはいえ一方で実用最小限の製品(品質に重きを置かない製品)を小さなバッチサイズで改善させまくって学習しまくらなければならない。そのバランスはやっていくうちに身体で覚えるしかないのかな。このバランスの取り方を開発チームで共有できていれば良いチームになりそうな気がなんとなくします。(ので色々試してみよう。)

引用 P.304

スタートアップは、技術的になにかがうまくいかなかった場合や狙った事業成果がでなかった場合、顧客が予想外の行動をした場合など、障害に直面したら必ず5回のなぜを実行すべきだ。

何を障害と定義するか、正直悩ましいところですね。しかもなぜなぜ5回って本当に難しいんですよね。。。

引用 P.308

5回のなぜを導入する場合、特に初めのころ、組織のネガティブな部分を突きつけられると覚悟しなければならない。この方法を導入すると、新しい製品や機能に投入できたはずの時間やお金をミスの防止に使わなければならなくなる。長い目で見ればそのほうが時間の節約になるのだが、真因の探求に無駄づかいできる時間はないと感じたりする。5回のだれに陥っていしまうこともある。このようなとき、十分な権限を持つ人物が同席し、このプロセスをきちんと実行しろ、求められていることをやれと指示しなければならないし、意見が衝突したときには審判役を務めなければならない。つまり会社の上層部がこのプロセスを支持し、導入を推進しなければ順応性の高い組織は作れない。

ふむ。

引用 P.310

5回のなぜによる学びを促進するには、この方法を適用する分野ごとに責任者を置くとよい。

ふむ。

引用 P.340-341

イノベーションのサンドボックスを用意する

  1. 製品や(複数要素で構成された製品の場合は)サービスのうち、サンドボックスにいれられた部分のみ、あるいは、一部の顧客セグメントや(新製品の場合は)領域についてのみ、どのチームもスプリットテストによる実験を自由に行える。ただし、
  2. ひとつの実験は最初から最後までひとつのチームが管轄する。
  3. 実験期間には上限を設定する(シンプルな機能実験なら2〜3週間、破壊的イノベーションならもっと長期)。
  4. 実験対象の顧客にも上限を設定する(メインストリームの顧客ベース全体に対する割合で定めることが多い)。
  5. 実験の評価は、行動につながる評価基準が5〜10個(これを超えてはならない)ある標準報告書1通で行う。
  6. サンドボックスで作業するチームもそこで作られる製品も、すべて、同じ評価基準で成否を測る。
  7. 実験を準備したチームは評価基準と顧客の反応(サポートへの電話、ソーシャルメディアでの反応、フォーラムへの書き込みなど)を実験中にモニタリングし、大きな問題が発生したら実験を中断する。

どうやって進めようか迷いますね。

引用 P.351

チームの生産性について、その定義を機能的な卓越性ーーマーケティングや営業、製品開発などそれぞれにおけるエクセレンスーーから検証による学びに変えると問題が起きる。すでに紹介したように、各機能のスペシャリストは自分の仕事に没頭できた時間の割合で効率を測ってきた。プログラマーなら1日中プログラミングをしているのが一番という具合だ。このようなエキスパートにとって従来の職場環境は、会議や仕事の部門間 受け渡し、さまざまな上司への説明などで仕事を中断されることが多く、効率が落ちてフラストレーションを感じるものだった。リーン・スタートアップの場合、スペシャリスト一人ひとりの効率向上は目的に含まれない。機能横断的に仕事をして検証による学びを得るチームが欲しいのだ。行動につながる評価基準、継続的デプロイメント、全体的な構築ー計測ー学習のフィードバックループなど、そのためのテクニックはいずれも、チームメンバーの個人的効率を落とす。どれほど速く構築できても意味がない。どれほど速く計測できても意味がない。大事なのは、ループ全体を少しでも速く回すことだ。

これは耳が痛いですね。が、学びの量ベースでの評価スタイルや開発の進め方を鋭意検討中なので、きっとやります。

という感じで、これが僕の心に響いた箇所の全てです。 革新会計ってなんだよ!みたいに思った方もいるかと思いますが、あくまでこの記事は自分のためのメモなのでご容赦ください。

リーン・スタートアップ

リーン・スタートアップ

  • 作者: エリック・リース,伊藤穣一(MITメディアラボ所長),井口耕二
  • 出版社/メーカー: 日経BP社
  • 発売日: 2012/04/12
  • メディア: 単行本
  • 購入: 24人 クリック: 360回
  • この商品を含むブログ (91件) を見る

テスト環境を作るときに少し便利なTips

開発 テスト環境構築

Webサービスを作るときに、開発中はローカルに置いてあるDBを指して開発することが多いと思います。でもパフォーマンスイシューの修正とか特定のユーザーの環境でしか起こらないバグの修正とかで、本番のDBをローカルにコピーしてくることもありますよね。

え、そんな危険なことできないって? でも僕はよくやりますよ、えぇ。(小芝居)


ただそうすると「ユーザーのメアドが含まれているので、間違ってユーザーにテストメールを送ってしまいそうで怖い」のような不安に駆られますよね。今回はその解決方法を記事にしておこうと思ったのでした。

やることはたった1つだけですが、まず事前準備としてGmailかOutlook.comでメールアドレスを取得しておきましょう。このメールアドレスを example@gmail.com とします。(Outlook.comの場合は、以後 @gmail.com を適宜 @outlook.com に読み替えて下さい。)


で、やることは、

全ユーザーのメアドを
example+<任意の文字列>@gmail.com
として上書きする

だけです。


たったこれだけで、メール通知を含む機能の試験などが安心してできるようになります。


説明する必要も無いかと思いますが、GmailやOutlook.comには
「メールアドレスのユーザー名部分で、"+"(プラス記号)以降の文字列を無視する」
というありがたい仕様があります。 example@gmail.com というユーザーには example+test@gmail.com 宛てに送ったメールも届くのです。この仕様をテスト環境に適用したらちょっとハッピーだな、と気付いた時はちょっとニヤけてしまいました。


具体的にはDjangoで以下のようなスクリプトを実行しています。

from django.db import models


class Account(models.Model):
    email = models.EmailField(u'ユーザーのメアド', max_length=254)
from myapp.models import Account

for x in Account.objects.all():
    src = x.email
    if src.endswith(u'leadingmark.jp'):
        continue  # 自社ドメインのメアドに対しては何もしない
    if src == u'example@gmail.com':
        continue  # 自分のメアドに対しては何もしない

    former, latter = src.split(u'@')
    dst = 'example+{}___{}@gmail.com'.format(former, latter)
    print 'Convert {} => {}'.format(src, dst)
    x.email = dst
    x.save()

ちなみにこんな遅くて危険なコードは製品コードに入れてはダメなので、それだけはご注意下さい。危険すぎるので僕はgitで管理もしていませんし、実際のコードにはローカル環境以外で実行したらエラーになるような安全策も入れてあります。

ワールドビジネスサテライト砲を乗り越える時にやったこと

先日2013年11月25日(月)にテレビ東京さんのWBS(ワールドビジネスサテライト)に弊社サービスのrecme[レクミー]を取り上げていただきました。

というわけで、急激なアクセス増加に耐えるために打った対策を、時系列順にまとめておきます。

11月22日(金) 〜 放送3日前 〜

  • EC2インスタンスを沢山並べるために、デフォルトの20台制限を100台にしてもらうようにここのフォームから申請する。
  • ELBの暖気運転を申し込むため、AWSサポートのビジネスプランに申し込む。
  • ちなみにAWSサポートは1ヶ月単位の申し込みではなく日割りで清算してくれるようなので、必要な瞬間だけ申し込むことが可能とのこと。
  • EC2インスタンスはc1.medium(c3.largeにした方が良かったと思ってますが)を2つのゾーンに10台ずつ並べる。
  • 目標は秒間3,000アクセスを優雅に捌くこと。

11月23日(土) 〜 放送2日前 〜

  • もっともアクセス数が多いであろうトップページ+αのSQLクエリ数を減らす。
  • 具体的にはmemcachedを導入したり、Djangoにおいてselect_relatedを使ったり。

11月24日(日) 〜 放送前日 〜

  • RDSを最高にハイ!なスペックのものに切り替える。
  • ちなみにこのページの『エイトエクストララージ』で、Multi-AZオプションも付けるので1時間あたり950円(1ドル101円換算)の利用料金がかかる。高い!
  • パフォーマンスはサクッと試しただけで1500 Requests per secondを確認できたので、ほぼ大丈夫だと確信。
  • あとは放送を待つのみ。

11月25日(月) 〜 放送当日 〜

  • 放送3時間前くらいになって「コーポレートサイトも強化しないと!」という話になり、慌てて準備。
  • ELBの暖気運転の申請はとても間に合わないと思い、ELBは使わずc3.2xlargeにNginxを入れてLBとして使い、2台のc3.largeインスタンスをぶら下げる。
  • 心のどこかで「いやそこまでやらなくてもいいだろうな」という思いはあったが、とりあえずコーポレートサイトが見たことないくらい高速になってテンション上がる。

11月25日(月) 〜 23時30分 放送開始後 〜

  • 20台のサーバーの様子を見るも、余裕綽々。
  • 個人的には放送をチラ見しながら「ロードアベレージが60を超えたぞ! どうなってるんだ! 30秒以内にサーバーを追加せねば!」みたいな動き方をしてみたかったけどそんな漫画みたいな状況にはならず。


…という感じです。

具体的なアクセス数とかは今のところ未公開の方針なのでお伝えできませんが、久々にテンション上がりっぱなしの数日間でした。

素数について愛を語らう。 vol.2

素数

素数が大好きなことで定評のある僕ですが、本当は素数のことはあまり好きではありません。難しいのです。難しすぎるのです。本当に難しすぎてついていけないのです。

素数を好きか嫌いかで言えば、

生後「おぎゃー、おぎゃー、そすー」
11歳「素数って無限にあるんだ! 証明かっこいい!」
12歳「恩師からもらった『コンピューターと素因子分解』って本おもろー」
17歳「素数判定のコードって何回書いても幸せ」
19歳「素数に関する定理を見つけたので川崎の定理と名付けよう」
23歳「テニス楽しいなー」
29歳「素数のこと…やっぱり好き…」
31歳「実は合成数もちょっと好き」

という人生を歩んできたので、きっとそれなりに好きではあります。年齢が全部素数じゃないのかよ!と心の中でツッコんだ人は多分気持ち悪い人ですのでどうぞ一刻も早くお帰りください。

会う人会う人に「なんで素数が好きなんですか?」「1って素数なんですか?」「ブログに素数のこと全然書いてないじゃないですか!(激おこ)」とか良く言われるのですが、素数が好きになった経緯はこちらに書いてありますので暇すぎて死にそうな方はご覧ください。




さて本題ですが、目の前の数字が素数かどうかが気になってしょうがないことってありますよね。

例えば夜眠れなくて素数を数えているときとか、車を運転していて眠くなって前を走っている車のナンバープレートを素因数分解して目を覚まそうとしてるときとか、古今東西素数ゲームいぇーい!とサークルでゲームに興じているときとか。

そんなときに携帯でササッと調べられるようなサイトを昔作ったことを思い出したので、リンクを張っておきます。

http://prime.pheromone.jp/

このサイトは「高速に素数判定したいなー」とかぼんやり考えていた時に気がついたら作っていたものなのですが、その際に参考にしたサイトはこちらになります。

Pythonを使って高速素数判定をしてみる - Pashango’s Blog

正直、素数についてわかりやすくまとめたブログとかを書こうといくら足掻いてみても、上述のブログのわかりやすさには到底かなわないと思います。それぐらい良くまとまっている記事で、多分10回以上は見ています。もし素数に興味のある方がいたら、是非上記の記事をご一読いただいて損は無いでしょう。

というわけで、久々の素数ポストでした。

コンピュータと素因子分解

コンピュータと素因子分解

SSL証明書をELBに設置する簡単な方法メモ

AWS SSL

Webサービスを作ろうとした場合、ログインページや会員登録ページなどをはじめとしてSSLで暗号化した方が良いページがいくつかありますが、それに必要なSSL証明書の取得・設置の簡単な方法をメモがてら書いてみます。すでに詳しい説明などは世の中に溢れていると思いますのでできればそちらを参考にしていただきながら、「ただひたすら簡単にやりたいなー」「AWS使ってるけどSSLとかあまり詳しくないんだよなー」という方はご参考にしていただければと思います。(可能な限りコマンドを叩くとかそういうのが不要な方法を記してあります。)

手順としては主に下記となります。

  1. SSL証明書を購入
  2. ELBを立ち上げ、SSL証明書を設置する

1. SSL証明書を購入する

まずRapid-SSLのサイトにアクセスし、「新規お申込」ボタンをクリックします。ワイルドカード証明書を取っておくと、www.example.com や api.example.com などの複数のサブドメインでも利用できるので、今後サービスを発展させる予定があるのであれば便利です。

クリック後はいくつかの注意事項が出てきますので、しっかりと読んでおくと良いかもしれません。読んだら「お申込フォームへ」のボタンをクリックします。

ここで色々入力項目があるかと思いますが、基本的には入力に迷わない項目かデフォルトのままでOKな項目ばかりです。唯一のハードルは「CSRの貼り付け」の項目だと思います。ここで項目名の直下にある「CSR作成ツール」というのをクリックしてみましょう。こちらには必要な項目をそれぞれ入力してして作成ボタンをクリックすればOKで、迷うところは無いかと思います。コモンネームのところだけ、ワイルドカードドメインを取得する場合は example.com ではなく *.example.com と入力するよう注意してください。表示されたもののコピーを手元にとっておいて、あとは「CSRの貼り付け」欄にコピペするだけです。また、秘密鍵のパスワード(任意)は空欄にしておいた方が楽です。

あとは申込者の情報などを適宜入力して、クレジットカードで申し込みをすればSSL証明書の取得は完了です。メールが何通か届くので見失わないようにしましょう。一番重要なメールは「【通知】 SSL サーバ証明書発行完了のお知らせ」というタイトルのメールで、これは申し込みが完了してから少し時間が経ってから届きます。(僕の場合は2時間程度でした。)

2. ELBを立ち上げ、SSL証明書を設置する

AWS Management Consoleにログインして左側のメニューのLoad Balancersをクリック。

Create Load Balancerをクリック。

Load Balancer ProtocolにHTTPS(Secure HTTP) を追加(右側のSaveボタン押下を忘れずに)して、Continueボタンをクリック。

Upload a new SSL Certificate のラジオボタンを選択し、

  1. Private KeyにはCSR作成ツールで作ったPrivate Keyを、
  2. Public Key Certificateには「【通知】 SSL サーバ証明書発行完了のお知らせ」というメール本文のうしろの方にある「SSLサーバ証明書(X.509形式)」という箇所を、
  3. Certificate Chainには同じくメール末尾にある「中間証明書(INTERMEDIATE CA):」という箇所を、

それぞれコピペして貼り付けます。もしここで

Error: Private key must not be encrypted with a passphrase.

というエラーメッセージが出た場合は、上述のPrivate Keyを何らかのテキストファイルに保存して、

openssl rsa -in <Private Key> -out hoge.key

というコマンドを実行してパスワードを外して下さい。hoge.keyにパスフレーズのないPrivate Keyが出力されますので、この内容をコピペしてPrivate Keyの欄に入力してください。

他の入力項目は何も迷うことはないと思うので(通常のELB作成と同じなので)、これでELBの設置が完了です。

転職を決意した理由

TwitterやFacebookではアナウンスしていましたが、2013年の9月をもって前職の株式会社アイリッジのCTOを辞任しました。現在は株式会社リーディングマークという会社でCTOを務めています。転職活動の際にお声掛けをいただいた方々には大変感謝をしております。


さて、アイリッジという会社をなぜ辞める決断をしたのかを、あたかも独り言のようにつらつらと書き記してみたいと思います。















(2時間かけて正直に書きました。かなり推敲もしました。)















が!















何らかの誤解とか不慮の事故で万が一前職の評判が下がったりとかしたら怖いので消しました(笑)















念の為消す前に文字数カウントしてみたら、1,634文字も書いてました。勿体無い!


端的に言うと、

  • B2Cのサービスを作りたい
  • エンジニアにとってのパラダイスを追求したい
  • 売上はきっと絶好調なのでどうか皆幸せになって下さい
  • 辞めたいと感じてから実際に辞めるまでは32ヶ月
  • 気になる人は直接連絡下さい*1

という感じです。


今CTOを務めているリーディングマークという会社は、前職よりも従業員数も売上も少ないですが*2、今のところアイリッジでの反省点を全てクリアできています。



そんなこんなで、今最高に楽しいです。最高に「ハイ!」ってやつです。11月1日にプレリリースするサービスの開発で若干せわしないですが、超楽しいです。


というわけで、以上、
はてなダイアリーからはてなブログに移行した記念ポストでした。

*1:飲みながらならきっとしゃべれる気がする

*2:1人当たりの売上は多いんですけどね

AutoHotKeyのススメ

Windows8

さて、以前こんな記事を書いたのですが、
実はそれ以来WindowsマシンよりもLinuxマシンの方が使う機会が多くなり、
しばらくキーバインドの変更を諦めていた日々が続いていました。


しかし2012年10月にWindows8マシンをサブマシンとして多用するようになり、
メモ帳代わりにUltrabookを使い始めて早8ヶ月。
今ではWin8AutoHotKeyなしではろくにメモも取れないくらいにWin8マシンが重宝しています。


今週金曜日(2013年6月7日)にはSurface Proも日本国内で発売されることですし、
特に書くこともないことですし、自分のAutoHotKeyスクリプトを公開してみることにします。


とりあえずコメントを付けながら貼り付けてみます。

#Include lib/IME.ahk  ;IMEを取り扱うためのライブラリ

まず先頭で他の方が作られた便利なライブラリを読み込みます。
http://lukewarm.s101.xrea.com/up/index.php から 089.zip を拝借しています。
IMEのON/OFFを関数ひとつで制御できたりなど、とても便利です。


その後は以下のように自作のスクリプトが続きます。

;------------------------------------------------------------------------------
;   Cursor Keys
;------------------------------------------------------------------------------

vk1Dsc07B & H::Send,{Blind}{Left}   ;無変換 + H = 左カーソルキー
vk1Dsc07B & J::Send,{Blind}{Down}   ;無変換 + J = 下カーソルキー
vk1Dsc07B & K::Send,{Blind}{Up}     ;無変換 + K = 上カーソルキー
vk1Dsc07B & L::Send,{Blind}{Right}  ;無変換 + L = 右カーソルキー

;------------------------------------------------------------------------------
;   with 無変換キー
;------------------------------------------------------------------------------

vk1Dsc07B::Send,{Blind}{sc029}      ;無変換単独 = 全角/半角キー
vk1Dsc07B & F::Send,{Blind}{Enter}  ;無変換 + F = Enter
vk1Dsc07B & A::Send,{Blind}{BS}     ;無変換 + A = BackSpace
vk1Dsc07B & S::Send,{Blind}{Del}    ;無変換 + S = Delete
vk1Dsc07B & W::Send,{Blind}{Esc}    ;無変換 + W = Escape
vk1Dsc07B & E::Send,{Blind}{PgUp}   ;無変換 + E = PageUp
vk1Dsc07B & D::Send,{Blind}{PgDn}   ;無変換 + D = PageDown
vk1Dsc07B & N::Send,{Blind}{Home}   ;無変換 + N = Home
vk1Dsc07B & M::Send,{Blind}{End}    ;無変換 + M = End
vk1Dsc07B & Z::Send,^z              ;無変換 + Z = CTRL + Z
vk1Dsc07B & Y::Send,^y              ;無変換 + Y = CTRL + Y
vk1Dsc07B & X::Send,^x              ;無変換 + X = CTRL + X
vk1Dsc07B & C::Send,^c              ;無変換 + C = CTRL + C
vk1Dsc07B & V::Send,^v              ;無変換 + V = CTRL + V
vk1Dsc07B & `;::Send,{F2}           ;無変換 + セミコロン(;) = F2
vk1Dsc07B & .::Send,{Blind}{F3}     ;無変換 + ドット(.) = F3
vk1Dsc07B & U::Send,{Blind}^+{Tab}  ;無変換 + U = CTRL + SHIFT + Tab
vk1Dsc07B & P::Send,{Blind}^{Tab}   ;無変換 + P = CTRL + Tab
vk1Dsc07B & vk1Csc079::Reload       ;無変換 + 変換 = AutoHotKeyスクリプトのリロード
vk1Dsc07B & @::Send,{Blind}{Ins}    ;無変換 + アットマーク(@) = Insert
vk1Dsc07B & Tab::                   ;無変換 + Tab = 行頭に半角スペース2個を挿入
    ime_mode := IME_GET()
    IME_SET(0)
    Send,{Blind}{Home}{Space}{Space}{Home}{Down}
    IME_SET(ime_mode)
Return
vk1Dsc07B & 8::                     ;無変換 + 8 = 左向きの簡易矢印を入力
    ime_mode := IME_GET()
    IME_SET(0)
    Send,{Blind}<={Space}
    IME_SET(ime_mode)
Return
vk1Dsc07B & 9::                     ;無変換 + 9 = 右向きの簡易矢印を入力
    ime_mode := IME_GET()
    IME_SET(0)
    Send,{Blind}=>{Space}
    IME_SET(ime_mode)
Return

;------------------------------------------------------------------------------
;   with 変換キー
;------------------------------------------------------------------------------

vk1Csc079::Send,{Blind}{Esc}        ;変換単独 = Escape
vk1Csc079 & X::Send,{Blind}!{F4}    ;変換 + X = ALT + F4 (つまりアプリの終了)
vk1Csc079 & Q::Send,{Blind}{F5}     ;変換 + Q = F5 (ブラウザの更新やコンパイルなど)
vk1Csc079 & Tab::                   ;変換 + Tab = 行頭に半角スペースを4つ入力
    ime_mode := IME_GET()
    IME_SET(0)
    Send,{Blind}{Home}{Space}{Space}{Space}{Space}{Home}{Down}
    IME_SET(ime_mode)
Return
vk1Csc079 & 3::                     ;変換 + 3 = 行頭にシャープ(#)と半角スペースを入力
    ime_mode := IME_GET()
    IME_SET(0)
    Send,{Blind}{Home}{#}{Space}{Home}{Down}
    IME_SET(ime_mode)
Return

;------------------------------------------------------------------------------
;   環境依存ショートカット
;------------------------------------------------------------------------------

vk1Csc079 & K::Run,"C:/kawasaki/"                       ;よく使うフォルダをエクスプローラで開く
vk1Csc079 & W::Run,"C:/kawasaki/work/"                  ;よく使うフォルダをエクスプローラで開く
vk1Csc079 & O::Run,"C:/AutoHotKey/"                     ;よく使うフォルダをエクスプローラで開く
vk1Csc079 & D::Run,"C:/Users/yasuhiro/Downloads/"       ;よく使うフォルダをエクスプローラで開く
vk1Csc079 & R::Run,"C:/DropBox/"                        ;よく使うフォルダをエクスプローラで開く
vk1Csc079 & S::Run,"C:/Users/yasuhiro/SkyDrive/"        ;よく使うフォルダをエクスプローラで開く
vk1Csc079 & I::Run,"C:/kawasaki/work/memo.txt"          ;よく使うファイルを開く
vk1Csc079 & T::Run,"C:/kawasaki/test.py"                ;よく使うファイルを開く
vk1Csc079 & E::Run,"C:/tools/EmEditor/EmEditor.exe"     ;よく使うアプリを立ち上げる
vk1Csc079 & P::Run,"C:/tools/putty/putty.exe"           ;よく使うアプリを立ち上げる
vk1Csc079 & F::Run,"C:/tools/FileZilla/filezilla.exe"   ;よく使うアプリを立ち上げる

;------------------------------------------------------------------------------
;   EmEditorでのショートカット
;------------------------------------------------------------------------------

;それぞれEmEditorでショートカットを用意しないと全く意味がいないので、
;「あぁこんなこともやってるんだ気持ち悪いなぁ」と思っていただければそれで十分です。

vk1Dsc07B & -::Send,{Blind}^+!{F7}      ;ハイフンを79列まで入力するマクロを実行
vk1Csc079 & J::Send,{Blind}^+!{F8}      ;PEP8チェックするマクロを実行
vk1Csc079 & C::Send,{Blind}^+!{F9}      ;選択範囲をコメントアウトするマクロを実行
vk1Csc079 & Z::Send,{Blind}^+!{F10}     ;選択範囲をコメントインするマクロを実行
vk1Csc079 & A::Send,{Blind}^+!{F11}     ;ALC検索するマクロを実行
vk1Csc079 & G::Send,{Blind}^+!{F12}     ;Google検索するマクロを実行

;------------------------------------------------------------------------------
;   メッセージのショートカット
;------------------------------------------------------------------------------

:O:`;sl::/                 ;セミコロン(;)に続けてSL<Enter>と入力すると全角スラッシュが入力される
:O:`;bsl::\                ;セミコロン(;)に続けてBSL<Enter>と入力すると全角バックスラッシュが入力される
:O:`;kome::※               ;セミコロン(;)に続けてKOME<Enter>と入力すると※が入力される
:O:`;koko::                 ;セミコロン(;)に続けてKOKO<Enter>と入力すると
                            ;   ==== ここから ====
                            ;   
                            ;   ==== ここまで ====
                            ;という3行が入力される。
    Send,==== ここから ====`n`n==== ここまで ====
    Send,{Blind}{Home}{Up}
Return
:O:`;s::■{Space}           ;セミコロン(;)に続けてS<Enter>と入力すると■と半角スペースが入力される
:O:`;Mon::(月)            ;セミコロン(;)に続けてMON<Enter>と入力すると"(月)"が入力される
:O:`;Tue::(火)            ;セミコロン(;)に続けてTUE<Enter>と入力すると"(火)"が入力される
:O:`;Wed::(水)            ;セミコロン(;)に続けてWED<Enter>と入力すると"(水)"が入力される
:O:`;Thu::(木)            ;セミコロン(;)に続けてTHU<Enter>と入力すると"(木)"が入力される
:O:`;Fri::(金)            ;セミコロン(;)に続けてFRI<Enter>と入力すると"(金)"が入力される
:O:`;Sat::(土)            ;セミコロン(;)に続けてSAT<Enter>と入力すると"(土)"が入力される
:O:`;Sun::(日)            ;セミコロン(;)に続けてSUN<Enter>と入力すると"(日)"が入力される

;------------------------------------------------------------------------------
;   カラーピッカー
;------------------------------------------------------------------------------

; マウスカーソルの位置の色を取得し、結果をクリップボードにコピー
vk1Csc079 & L::             ;変換 + L = マウスカーソルの位置の色を #RRGGBB 形式でクリップボードに貼り付ける
    MouseGetPos, x, y
    PixelGetColor, color, %x%, %y%
    R := mod(color, 0x100)
    G := mod(color >> 8, 0x100)
    B := color >> 16
    msg := "(R, G, B) = (" . R . ", " . G . ", " . B . ")"

    SetFormat Integer, H
    R := SubStr(R + 0, 3)
    if (StrLen(R) < 2) {
        R := "0" . R
    }
    G := SubStr(G + 0, 3)
    if (StrLen(G) < 2) {
        G := "0" . G
    }
    B := SubStr(B + 0, 3)
    if (StrLen(B) < 2) {
        B := "0" . B
    }
    CLIPBOARD = #%R%%G%%B%
Return


他にもいくつか設定してあるのですが、今のところ公開できるのはざっとこんなものです。


もしAutoHotKeyフリークの方がいらっしゃったら、オススメの設定を是非コメント欄に書いてくだs…そんな人あまりいないか。