Make組ブログ

Python、Webサービスや製品開発、ライブラリー開発についてhirokikyが書きます

「0から1の発想術」は0から1を発想するコツを教えてくれる本

f:id:hirokiky:20170804210047p:plain

何か作りたい、生み出したいという気持ちはあるのにアイディアや発想が湧いてこないことがあると思います。

もっと発想が湧いてきたらいいのに、がむしゃらな思いつきじゃなくて効果的な発想ができたらいいのにと、私もよく悩んでいます。

もちろん本や手法に頼っただけで良いアイディアが湧いてくるわけではありません。 ビジネスや製品、サービスに関するノウハウ、本には、怪しい商売やうさんくさい方法論が多いのも事実です。

ですが1つの参考として、この本を知っておくのは損ではないと思います。

一個人が新しい何かを生み出していく時代

「0から1の発想術」という本を読んでみました。

この本は大前研一さんという人の本で、以下の主張のもと、0から1を生み出す助けになる11個の発想術が書かれています。

「これからの時代は好景気ってだけで食えるわけじゃない」

「一個人が新しい何かを生み出していく時代だ」

「0から1を創造する力が必要」

「0から1」の発想術

「0から1」の発想術

発想のコツ集として読める本

この本は平たく言うと「発想のコツ集」とも言える本です。 ポイントは3点です。

1. 何かを生み出すときに必要な考え方を教えてくれる

単に技や手法、思考法でなく基本的な「新しい価値を生み出す」という考え方も書かれていました。

基礎編1の「戦略的自由度」の話では

  • お客さまの価値を第一に考えること
  • 第二に今ある方法(軸)以外を考えること
  • 最後にその軸に沿った方法を考えること

が大切であると説かれています。

他にも基礎編4「固定費に対する貢献」、5「デジタル大陸時代の発想」、9「RTOCS」、11「構想」は、新しいものを生み出す上での基本的な考え方が説かれている印象でした。

このあたりの内容は匠メソッドや匠シンクにも通じるものがあると感じました。 何か製品やサービス、価値を生み出す際の基本になる考え方には普遍的で共通なものがあると感じます。

匠Method: 〜新たな価値観でプロジェクトをデザインするために〜

匠Method: 〜新たな価値観でプロジェクトをデザインするために〜

2. 発想に使える技集

また、 「こういう発想は使えるよ」 というような思考の切り口を紹介してくれている本でもあります。

基礎編3の「ニューコンビネーション」では既存の2製品、概念を組み合わせることで新しい発想を持とうという考え方が紹介されています

例としては「携帯電話」と「ネットオークション」を合わせた「モバオク」などです

基礎編2「アービトラージ」、6「早送りの発想」、7「空いているものを有効利用する発想」、8「中間地点の発想」、10「すべてが意味することは何」は、発想術、思考の切り口として具体的な方法が紹介されています。

この考え方を元に、日常生活する中で発想してみるだけでも何かアイディアが湧いてきそうな気持ちになります。

3. 実践していく中での考え方と問題への対処法、ヒント

実際の例をあげての物語的な部分は強いですが、各事例から成功や失敗の原因が紹介されていました。

2017/08/07追記

さらに読み込んで、この「実践編」は11の発想術で発想できないときの発想術や基本になる考え方が書かれていると分かりました。

とくに「実践1. 感情移入」からは 自分自身がビジネスに惚れ込んで感情移入すれば発想は湧いてくる というメッセージが読み取れて、とても納得できました。

こう発想してみようという切り口やコツを知れる本

この本は「自由な発想を持っていこうよ」「こう考えれば良いんだよ」というようなメッセージを感じます。何か生み出そうとするときの自由さや発想の切り口を教えてくれます。

またその習慣をつけて、トレーニングしていくことで発想できるようになっていこう、という内容でした。 「このチャートを埋めていけばアイディアがでる」のような本ではなく、発想の切り口を与えてくれる本という印象です。

何かを生み出そうとすればするほど頭の中はこんがらがって、狭い視野や市場で考えてしまいがちです。 そういったときに、この本を読んで「立ち返った」自由な発想で新しい製品、サービスを考えるのが良いのではないでしょうか。

社内読書会で読んで良かった本

この本をBeProud社内で読書会 BPRA をして読み進めました。

www.facebook.com

参加者内で議論できたり、共通認識が作れたりと、単に本以外の学びが多かったです。

もともと1人でこの本を読んでいたときは「なんか微妙だなぁ」「それくらい僕も知ってるよ」という斜に構えた読み方になっていましたが、話し合ったり人の説明を聞く中で「あぁ、そういうメッセージなんだな」と深い理解に至れたかなと思います。

ReadForActionが良いのは本の良し悪しに関係なく、興味ある、学びたい分野についてを本をキッカケに共有できることにあると思います。 今回は読書会より前に読んだときに本から深く学べなかっただけに、参加者メンバーの言葉を通して強く学べて良かったなと思います。 BeProud社内読書会BPRAについて興味ある方は以下の記事を読んでみてください。

本好きな会社〜読書会による組織学習 - ビープラウド社長のブログ

合わせて読むと良さそうな本

この本はビジネスになる構想や発想を出していこうという、「戦略的な」「ビジネスな」視点が多い本でした (2017/08/07追記 この本の中でも実践編1 感情移入などはそういった視点が強い部分です)。

実際に製品やサービスを作る中では「関わる人の嬉しいを考えよう」のような、ハートな部分も深堀されている本も読んでみると良いかもしれません。 前述の 匠メソッド や MarketingForDelopers という本をオススメしたいです。

devmarketing.xyz

僕はユーザーの方やお客様への共感を持ったり、何とか助けになりたいという気持ちもとても大事だと考えています。

0から1の発想術から学べたこと

とはいえ 新しいものを作って世の中を良くしていこう、こう考えてみれば発想は湧いてくるんじゃないかな、という本として読んで良かった なと思います。

何か新しいものを作りたい、発想を持ちたい、煮詰まった頭をリセットして考え直したいという方にはオススメしたい一冊です

今後、僕たちとしてどう活かせるか

2017/08/07追記

読書会参加者のメンバーと「この本を読んで、今後どう活かせるか」という議論をしました。

BeProudという会社として新しい価値を提供するときの発想に活かせるか、今ある事業の中でもっと何か価値を提供できないかと議論しました。

また、ビジネスや企画に関する本も製品やサービスが生まれるロードマップの中に位置づけて捉えられるのではないかと話していました。 ロードマップの中で考えることで他の人に知見を共有する場合や、自分が何かを考えている時にどのレイヤーで思考しているかを考えられそうです。

ゲイン、ペインや悩み、不満 => アイディア => 企画、モデリング、分析、プロトタイプ => 設計、開発 => 運用、サポート、展開

僕達の製品である PyQ をより良くする発想や、悩みを解決できる製品、サービスづくりに今後も取り組んでいきたいと思います。 良いものを作って、世の中をもっと便利に楽しくしていきたいです。

「0から1」の発想術

「0から1」の発想術

ヒヨッコの僕たちはこうして新規プロダクトPyQを企画・開発・販売しました

ヒヨッコの僕たちはこうして新規プロダクトPyQを企画・開発・販売しました

f:id:hirokiky:20170807211628p:plain

今日、4月12日は何の日でしょうか? 久々に晴れて気持ちが良かった日?それももちろんそうですが違います。

今日は PyQ の正式リリースの日です!

こんにちは。@hirokikyです。 これはヒヨッコだった僕が、僕たちが1年で勉強した、製品の企画、開発、価格戦略マーケティング戦略の話です。 チームのみんなで勉強して奮闘した1年でした。

自信過剰のヒヨッコ、ky

僕は自信たっぷりでしたが、ヒヨッコでした。 僕は今までも自分で PileMd を作ったり、 PythonDjangoでお仕事してきたりと自分と製品づくりには結構自身がありました。

でも

  • 「ホントウに人が欲しい価値あるものを作る」
  • 「何かを作ってお金をいただいて、そのお金でもっといいものを作る」
  • 「作ったものを求める人に届ける」

ということはできませんでした。今思えば。 エンジニアとして自信があっても、ホントウに求められる製品を作る方法とか、値段の付け方とか、宣伝の仕方とか分からなかったです。

たぶん、これができる人はすごいと思います。できたら起業しろって、そういうレベルですね。

正直分からない。。。どこで学べば良いのかも分からない。。。 実際「新規の事業を企画して開発して売る」まで一気通貫でできる機会って少ないんですよね (そりゃ毎日何かがリリースされてたらチョット忙しいですよね)。

で、僕は全くその辺を知らなかったんですが1年 PyQ_ を通して学んだことを書きたいなと思います。 数人の少ないチームのみんなで勉強しながらここまでやってきました。大変でしたがチームも、会社自体も成長できたと思います。 (これからもみんなでやっていこうな!)

今日、リリース時のテンションで書いてるので、雑筆なのは許してください。

製品の企画!どんな価値を提供するの?

さて「新しいビジネスをやるぞ!」と意気込んでも何を作るんでしょう。 とりあえずで「ブルーオーシャンを狙った」自分でもよく分からない物を作ったことある人は僕だけじゃないはずです。ありますよね?

まずは、何をつくるかを決めましょう。どうやって?

PyQではまずharuさんの思いから始まりました。平たく言うと 「技術の底上げをしたい。多くの人はプログラミングとかの技術に興味があるし今後も人が増えるけどできない。人材の紹介とかパイの取り合いはやってるけどパイを増やすことができていない」 という思いから始まります。

でもそれだけだと何にもならないですよね。これを育てていかないといけません。

僕は1年前にこの企画に入ります。それまでは同僚のかめちゃんが1人でプロトタイプとかを作って、haruさんshinさんと模索している段階でした。 入ったときは今の PyQ_ の原型もほぼなくて、SQLを学ぶプラットフォームだったりしました。 僕が入る中で「この製品はいけてないな」とかエラそうなことを言います。 そこで僕もプロトタイプに入って、コンテナー技術でうまく学習プラットフォームを提供する仕組みを作ります。

でもやっぱり何か違う。 何をつくるかってどうやって決めるんでしょう?

そこで4人(haru, shin, kameko, 僕ky)で企画から練り直すことになりました。 一旦みんなで本を読んで、ひたすらそれを元に僕たちのストーリーは何かと話しました。

ここで、参考になる本をお伝えします。

この本では事業のストーリーを練って価値あるものにしていこうということが書かれています。 この中でPyQというものが見えてきました

  • Pythonを使うこと。Pythonを徹底的に学べること
  • BeProudの知見を最大限盛り込むこと
  • BeProudの他事業(研修事業など)と連携すること
  • オンラインで学べること

が大まかに見えてきます。ストーリーも浮かび上がってきます。 おぉ、これはすごいぞと。

そこからさらに踏み込んで、ステークホルダーの人々、そこにある要求、提供できる価値を見える化していきました。 その方法には匠メソッドという方法を使っています。

匠メソッドは「ステークホルダーは誰か、私たちは何か、で、提供できる価値は何か?」を図に書きながら掘り起こす手法です。 これで、チームで合意を形成しつつ、ぶれない「製品の価値」を定義できます。

これは今BeProudの会社としても、例えば受託でお仕事いただくときもお客さまにとっての価値は何かを見つけるために使っていたりします。 PyQでもこの匠メソッドを使って「使う人、関わる人に取っての価値は何か?」を徹底的に徹底的に掘り下げました。

このプロセスはスピード感はありましたが、延べで1,2ヶ月ほど時間を使っていた記憶です。 でもそのおかげで、全く的はずれな製品に注力することなく価値ある PyQ_ を作れたと思っています。

開発と製品を良くしていく方法

Webアプリ、フロントエンド、インフラ、デザイン、HTML、CSSなどなどの開発は全部僕がやっています。 ので、基本的には僕が「ガッ」と作って皆んなに見てもらってヤイヤイ言い合って、ときにユーザーさんの価値に立ち返って製品を育ててきました。

問題やカリキュラムについてはkamekoが主導して頑張ってくれました。

ここで良かったことをあげます:

  • とにかく速くあげて速くフィードバック貰った
  • 朝会で認識を共有してオンラインで言えないことを言う
  • ベータユーザーさんやアルバイトでお願いしたモニターさん、社員のフィードバックを徹底的に反映する

というスタイルを取っていました。

製品の動き、UXについてもそうですし、問題文の構成や学ばせる手順などもすべてゼロから作る必要があります。 とにかく計画してみて作ってみて、自分たちで使ってみてというのを繰り返していたように思います。

ホントウに、この段階から使ってくれた方のおかげて今の PyQ_ があると思います。 でも大事なのは「フィードバックを真に受けずに作る人間が責任持って価値を提供する」ことだと思います。

ときに、使う人自身が見えてない価値を提供するのが作り手だと思うので、 使う人にはチョット申し訳ないですが、たまに真意だけ受け取って内容をスルーしたりもしました。

大事なのは常に、ユーザーさんにとっての価値を提供することだと思います。

で、いくらでどうやって売るの

おそらくこれがエンジニア的に最大にして最強の壁だと思います。 自社サービスの会社で働こうが、受託の仕事をしようが、自分で値段を決めて自分で広めて使ってもらう機会はなかなかないと思います。

僕も多少はあれど、ガッツリ製品として売っていくことは初めてだったので分からないことだらけでした。 えぇ、もちろんチーム全員としてそうですね。チーム全員、どうすりゃええねんと。

ここでharuoさんが良い本と学習教材、勉強方法はどうかな?やってみない?と提案してくれました。 1つ、学習方法はRead For Actionという方法でチームで本から学んでみよう。 2つ、価格については各自持ち寄った価格に関する本を使ってReadForActionしよう。 3つ、販売については神田昌典氏まわりの本やWeb教材から学んでみよう。

ということでした

この本は参考になりました。

この辺の内容を参考にしつつ、チームでとにかく議論して決めました。 この頃にはLPや広告画像のデザインしてくれたmarippeも加わりなかなかホットなチームでした。

さて、価格において、販売において重要なのは何でしょうか。

色々学んだ中で考えるとやっぱり「お客さんに提供される価値はなんだろう」に尽きると思います。 お客さんに提供される価値から価格を考えたり、提供される価値・喜んでくれる人に対して知ってもらう。ということです。

原価やリソースの費用、稼働時間を元に価格を計算するのでなくて、お客さんに提供される価値を元に値段を決める。 これは大変なことですが、大事な考え方だと思います。

そもそも、お客さんに提供される価値が自分たちに見えていないと価格も決めれないってことですね。

売っていく方法

大々的にPRすればそれで良いでしょうか? Twitterで拡散すればそれでOKでしょうか?

違いますよね。すぐ話題が終わってしまいますし、知り合いがチョット知ってくれて終わりになっちゃいます。

結局、僕もそれまでのチームもコンフォートゾーンから出れてなかった気がします。 自分たちの知り合いや、身近な人しか想像できない狭い世界ですね。

そうじゃなくて、ホントに必要としてくれる人に会って、話して、その人達に使ってもらいたいです。 もちろん知り合いの方にも使っていただいてますし、農婦の方とかもいらっしゃって、今までの自分とは違う世界に来たなと思います。

話が長いので詳しくは割愛します。

神田昌典氏の講座もどうぞ http://www.cp.almacreations.jp/digital/

まとめ

自社で新規の事業を企画、開発、販売するなかで感じたことは

  1. 作れ!
  2. 学べ!
  3. 自分とチームのセンスを信じろ

ですね。

とにかく作らないと見えない。とにかくリリースしないと分からない。それが新規の事業です。ゼロからイチを作ることだと思います。 本だけ読んでエラそうな顔してた僕が言うんだから間違いないです。やれば苦労がイッパイあります。苦労しかない!? そしてとにかくリリースしましょう。リリースされてないコードはゴミです。リリースされて、人に使われて物語は始まります。

あとは今の自分にないものを積極的に学ぶことですね。 うさんくさいオッサンだろうが、マーケッターだろうが営業だろうがマッキンゼーだろうが、僕らにとってはその分野の師匠です。 新鮮な、謙虚な気持ちで弟子入りしましょう。

あと、最後にはやっぱり僕たちの力を信じるしか無いです。 ものを作る間、ホントウに価値があるかなどホントウに気を病みます(僕もメンタルはタフな自信がありましたが逆食と神経性胃炎になりました)。 大事なのは自分のセンスを、自分たちチームを信じることです。最終的には「自分たちが何をするか」です。誰に言われるかでなく。 自分たちの製品、価値、お客さんに責務を持って「調整するのでなく決める」ことが大事です。

以上、他にも勉強になった本は大量にありますし書きたいこともイッパイあります。 まずは、リリースしたテンションで書いてみました。

チームで活動してくれたharuoさん、shinさん、kameちゃん、marippe、esuji氏、shimizukawa先生、john、お疲れ!! ベータユーザーの方、モニターの方、社員の皆さん、協力してくれた人ありがとう。

PyQ_ の物語はまだ始まったばかりだ!(プリンセス・ハオ)

Build, Minify, Merge TypeScript by webassets

Build, Minify, Merge TypeScript by webassets

Today, I introduce webassets to build TypeScript, minify each generated JavaScript, and merge it.

webassets is a media manager written in Python to merge JS, compress JS/CSS, uglifying, and so on. and It also provide the way to coraborate with a veriety of WebFrameworks.

But in this post, you can learn way to build, minify, merge JavaScript from commandline interface by webassets:

Install

First, install webassets and I’ll write config file for the buliding as YAML file. so you also need webassets with PyYAML.

pip install webassets
pip install PyYAML

now you might get webassets==0.9, PyYAML==3.11.

And to minify JavaScripts, install jsmin.

pip install jsmin

Python requiremests are them. And ofcause TypeScript is necessary to bulid them.

npm install -g typescript

now you’d better to check ‘tsc’ command.

OK. let’s make it.

Configuation for building

Now let’s write the configuration file. You can put ‘webassets.yml’ file you want. In this post, I won’t show you how to write it step by step. But I’ll show you a case and it’s sample file, and then, describe each meanings of it.

The case is for building a JavaScript file to a web application. It requires three external libraries (jquery, knockout, and underscore) and files I wrote are written in TypeScript. So you need to compile ts files and merge all of them and also minfy it. The number of TypeScript files is 7, 4 difinition file and 3 application files The config file of this case will be like this:

directory: ./karmaid/static
debug: False
bundles:
  js-karmaid:
    contents:
      - js/lib/jquery-2.1.0.js
      - js/lib/knockout-3.1.0.js
      - js/lib/underscore-1.6.0.js
      - contents:
        - js/app/config.d.ts
        - js/lib/jquery.d.ts
        - js/lib/knockout.d.ts
        - js/lib/underscore.d.ts
        - js/app/api.ts
        - js/app/ko_flushvalue.ts
        - js/karmaid.ts
        filters: typescript
    filters: jsmin
    output: js/karmaid.js
  • directory: : it means the root directory http://webassets.readthedocs.org/en/latest/environment.html#webassets.env.Environment.directory

  • debug: : you can switch it by own enviroments http://webassets.readthedocs.org/en/latest/environment.html#webassets.env.Environment.debug

  • bundles: : you can put own ‘bundles’ under it. Each bundles are corresponding to each output files. so If you want to create JS file for Top page of your application, you may create js_top bundle and write config to merge or minify some Javascript files. In this case only ‘js-karmaid’ is appearing.

  • contents: : the output file will be constructed by each elements of this list. Own elements will be automatically merged and the file written in ‘output’ will be generated. And it can discribe ‘nested bundle’ in it. In this case, each typescript files are in js-karmaid bundle which means these ts files will be builded before minifying and merging each JavaScript files.

  • filters: : Specify to minify, build, uglify and so on.

    -   jsmin is for minifying JavaScript by 'jsmin'
        <https://pypi.python.org/pypi/jsmin>
    -   typescript is for building TypeScript and generating
        JavaScript files. If you use external libraries you also
        need specify difinitely files
        <https://github.com/borisyankov/DefinitelyTyped>
    
    You can learn about all of filters provided by
    [webassets](https://pypi.python.org/pypi/webassets/0.9)
    <http://webassets.readthedocs.org/en/latest/builtin_filters.html>
    

Run command

After making the config. Run the command to build:

webassets -c webassets.yml build

Then you can get own JavaScript files to correspond to each bundles. In abeve example, you can get ‘karmaid.js’ file.

If you want to generate one JS, run it:

webassets -c webassets.yml build <bundle name>

it’s over.

Why webassets

Because I wanted to try it. You know, you can choice fanstatic or grunt too.

And I want to use it with Pyramid and Python3, but now, pyramid_webassets on PyPI isn’t support Python3. This supporting will be finished soon (https://github.com/sontek/pyramid_webassets/issues/23).

Python mini Hack-a-thon 雪山合宿 2014 に行ってきた

Python mini Hack-a-thon 雪山合宿 2014 に行ってきた

Python mini Hack-a-thon 雪山合宿 2014

今回3回目の参加になる、Python mini hack-a-thonの合宿版です。 スキーはせずに引きこもって開発してました。

開発したもの:

genaa 0.4リリース

genaa というASCII Art生成ツールの最新版です。 日本語など、1文字で2幅以上持つ文字列に対応しました。 @nakamuray さんがフォークして開発しててくれたので取り込ませてもらいました。

invokeにプルリク

invoke はローカルでのコマンドをまとめるようなツールで、Pythonで書けるmakeみたいなものです。 実行できるタスクの一覧を ‘invoke –list’ で取れるんですが、 その際に各タスクの説明のサマリを表示するようにする対応をしていました。 まだ反応がないのでどうなるかわかんないですが。

遊んだテーブルゲーム

  • Love Letter: さっくり楽しめる&導入も簡単な割によくできてる印象。
  • 犯人は踊る: かなり面白かった。犯人は誰なのかと推理していく感じがよかった。
  • Dungean of Mandom: あんまり掴めなかった。

提供は @kiris さんより。

New year's python meme 2013

New year’s python meme 2013

Today is the final day of 2013, time to write New year’s python meme. This is the last year’s one:

1. What’s the coolest Python application, framework or library you have discovered in 2013 ?

Kaa is the coolest application. This is a CUI editor written in Python3.3. It is easy to use and useful, so I changed to use it on a routine basis. The development of kaa is very active, a new version is available almost everyday. Check out the version history.

I’m checking a Webframe work named morepath, too.

2. What new programming technique did you learn in 2013 ?

I learned how to distribute packages, creating libraries and Web frameworks. And learned the basics of Python, HTTP and WSGI. Last year, I didn’t know about them. just I created own Web applications using some frameworks. I aimed to learn them, written in 2012’s python meme. All of things I created and contributed are available on next section.

3. Which open source project did you contribute to the most in 2012 ? What did you do ?

May be Django. This year I joined one of django authors.

Or, Uiro framework.

And I created many libraries this year:

I also contributed existed projects:

4. Which Python blog or website did you read the most in 2013 ?

In Japanese:

5. What are the three top things you want to learn in 2014 ?

  1. English:

Next year, I will join to EuroPython2014. This will be the first time to join another country’s event. I will learn about English in order to enjoy this event much more. I listen to VOA Leaning English these days.

  1. How to keep developing and improving one project:

This year I created many packages, but almost of them are left alone. And I learned that the first release is not so important. To create effective and useful software, it is necessary to keep creating and improving.

  1. Not only Web. I’ve learned about Web programming for about 2 years:

This year, I will try to create something not relating Web. For the first step, now I’m creating genaa, a command line tool.

6. What is the top software, application or library you wish someone would write in 2014 ?

genaa is.

And some Web applications or libraries for Pyramid, not only Django.

I learned many things in 2013. I wish I would write more interesting things in 2014. Have a good holiday.

Pythonでバウンドインナークラスを使う (Python Advent Calendar 2013 最終日)

Pythonでバウンドインナークラスを使う (Python Advent Calendar 2013 最終日)

Python Advent Calendar 2013 25日目のブログ記事です。

Python Advent Calendarでは例年最終日にはゲストをお迎えして記事を書いてもらっています。今年は Python 3.4 のリリースマネージャーである Larry Hastings さんに書いていただきました。

Larry, thank you very much for your posting to this Python Advent Calendar!

ここでは日本語訳を書いていきたいと思います!

Pythonでバウンドインナークラスを使う

Python において、関数をクラス中に定義した際にはある魔法が起こります。 クラスのインスタンスを通して関数にアクセスした場合単なる関数が得られるわけではありません。 代わりに新しいオブジェクト「メソッド (method)」と呼ばれるものが返ります。 概念的にはこの関数はインスタンスに「バウンド/束縛 (bound)」されています。 実際にメソッドを呼んだ際にはそのインスタンスが関数の第一引数に自動的に 渡されます。別の位置引数 (potitional argument)は1つ後ろに追いやられます。

しかしこの魔法は関数にしか有効ではありません。クラスについて考えてみましょう。 Pythonでは、あるクラス C を別のクラス D 内に定義した際に、この C を 「インナークラス (inner class)」と呼びます (「ネステッドクラス (nested class)」かもしれません)。 D のインスタンスを通して C にアクセスした場合、 さきほどのような魔法はおこらず、単に C が返されます。 C を呼び出したとしても C.__init__ への引数は変わりません。

インナークラスが Python で使われることは稀です。なぜでしょうか。 それをする実用的な利点が無いからです。 Python のスコープルールによって面倒が生じます (後述)。

それでも私は Python でインナークラスをよく使います。 概念的に他のクラス内にあるべきクラスの場合です。 大抵の場合インナークラスはアウタークラスに “バウンド” されて欲しいものです。 しかしこのように、手動でする必要があります:

class D:
    class C:
        def __init__(self, outer):
            self.outer = outer
d = D()
c = d.C(outer)

関数がするように、インナークラスも “バウンド” されると良さそうです。 アウタークラスが自動的にインナークラスの __init__ に渡されると良さそうです。

でもこれって Python でできることなんでしょうか? 数年前、 Stack Overflow で聞いてみました:

http://stackoverflow.com/questions/2278426/inner-classes-how-can-i-get-the-outer-class-object-at-construction-time

返答には驚きました。それが不可能というだけでなく、意味がないと言うからです。 その後に Alex Martelli が、それは可能だと教えてくれました。 その解法には心底驚かされましたよ!彼の解法はクラスデコレーターを使って、 クラスを「ディスクリプター (descriptor)」にするというものでした。 これは関数がメソッドになるのと全く同じメカニズムです。実に素晴らしい!

Alexの許可を得て、私はこれを「レシピ」として、 Python Cookbookに投稿しました:

http://code.activestate.com/recipes/577070-bound-inner-classes/

このアプローチには何度も手直しをしました。今ではちゃんと動作しますよ! そして…そうなんです、このレシピは Python 2 と 3 両方で変更なしに動作します。

このバウンドインナークラス (bound inner class) のことは本当に気に入っていますし、 可能であればどこでも使います。バウンドインナークラスを人に教えたときの 一番よくあるフィードバックは 「それのユースケースは?」ですが、 私の回答はこうです「メソッド呼び出しのユースケースは?」 私が思うに、この2つは全く同じ質問です。そしてバウンドインナークラスは メソッドと同じくらい便利なものであるとオススメしておきます。 もしかしたらそれ以上かもしれません!

もちろん、クラスは関数よりも複雑なものです。つまりはバウンドインナークラスは メソッドよりも複雑です。例えば継承と2レベル以上のネストとなるとちょっと ややこしいことになります。 こんな場合でもバウンドインナークラスが実用的で、理解しやくなるよう 考えてみました。どう動作するかを少し理解して、いくつか単純なルールに従う 必要があります。これについては、上記の「レシピ」にすべて記載されています。

ぜひ皆さんのコードでもバウンドインナークラスを使ってみてください!

なぜインナークラスが不便になり得るかを疑問に思ってるかもしれませんね。 以下について考えてみてください:

class D:
    value = 5
    class C:
        value2 = value * 5

このコードは動作しません、 value について NameError を送出します。 C のコード中では value が見えないのです。 D のどのメンバーも見えません。 C が見えるすべてのメンバーはグローバルとビルドインです。 (残念ながら nonlocal キーワードもここでは助けになりません。 これはネストした関数でのみ有効で、クラス本体はネストした関数のようには 振る舞いません)

ここで、コードをこんな感じに変えてみましょう:

class D:
    value = 5
    class C:
        value2 = D.value * 5

悲しいことに、これもまた動作しません。 D はまだ存在しないからです。技術的には、 D は “まだバウンドされていません"。 このコードは D についての NameError を送出します。

唯一動作するのは、ルックアップをランタイムで行うことです:

class D:
    value = 5
    class C:
        def __init__(self):
            self.value2 = D.value * 5

言い換えると、コンパイルタイムにおいてネストしたクラスは アウタークラスのどのメンバーにもアクセスできないということです。

追伸、クリスマスを楽しむ日本の読者の皆様へ。 私が皆さんに教えてあげたいのは、実際にはアメリカ人は KFC をクリスマスに食べないということです!これは日本の KFC が創りだしたマーケティング上のギミックなのです。アメリカ人は家族でのディナーを盛大に行うものですが、伝統的なメインコースというものはありません。

以上です。

Larryさん、ありがとうございました!

(なおフッターにあるCC-BYの表記はこの記事においては有効ではありません。 The above expression about CC-BY is not available at this entry.)

Think about expression of blocks as 1 byte

Think about expression of blocks as 1 byte

This blog post for my unimportant memo.

I am creating genaa, a ASCII Art generator.

Now, It can rendering text box like this:

┌────────────────────┐
│Shut the f**k up and│
│write some code!    │
└────────────────────┘

And, I am considering about expression of blocks as 1 byte for providing new rendering feature for genaa.

Free blocks

The feature is rendering some blocks from sigunature. How can we express the following block as plain text?:

┌─┐

┌─┘ └─┐ └─────┘

(As you know, it’s the most gentle block on Tetris)

I noticed the block can be expressed by 6 characters:

69C
D47

Each characters mean the lines of the block. One character is actually hex, and each digits mean corresponding lines:

1

┌─┐

8 │ │ 2 : └─┘ : 4

And the sum of line numbers is the above character. For instance, 6 means ‘bottom’ and ‘right’:

│ 2

──┘ : 4

(Ofcause, this expression may contain some redundancies, like ‘28’)

This may be powerful and useful to render some blocks. But, the bad points is hard to read and write as plain text.