技術情報棚卸し(平日限定)

todoa2cの技術情報棚卸しです。平日限定ってことはアレだ。言わせんな恥ずかしい。

PythonのPriorityQueueとobjectの拡張比較メソッド

優先順位付きキューを使おうとして、17.7. queue — 同期キュークラス – Python 3.3.3 ドキュメントを見たところ、よく分からない一文に遭遇した。

最小の値を持つ要素が最初に検索されます

書いていることの意味は分かるんですよ。分からないのは、「じゃあ比較はどうすればいいの?」という点。 ちなみに、自作クラスのインスタンスを優先順位付きキューにそのまま入れてみたら、怒られました。

1
2
3
4
from queue import PriorityQueue

pq = PriorityQueue()
pq.put(A())
1
TypeError: unorderable types: A() < A()

このエラーから察するに、PriorityQueue自身に比較用メソッドを渡してあげるのではなく、 インスタンス間で大小を比較できるようにしなさい、ということなのだろうと推測しました。 そうと分かれば話は早いってんで、 Python言語リファレンスの3. データモデル を見ると、目的の情報を見つけることが出来ました。

1
2
3
4
5
6
7
8
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

これらはいわゆる “拡張比較 (rich comparison)” メソッドです。

objectには特殊メソッド名がいくつかあるのですが、その中に比較に関するメソッドも 用意されていたわけですね。

今回のエラーから必要なのは、__lt__ メソッドをオーバーライドしてあげれば良いと分かり、 早速Aクラスに__lt__メソッドの詳細を実装したところ、うまく動きました。

Check iOでレベル10に到達した

ちまちまやっているCheck iOですが、ようやくレベル10に到達しました。 自分で解くのも面白いのですが、人のソースを読むのも非常に参考になります。

例えばThree Points Circleですが、 私は別件で解いたように、3点を通る3つの連立方程式を 用いて解きました。 方程式を解くだけではダメで、そこから(x-x0)^2+(y-y0)^2=r^2に変換すべく、もう一手間加えなければ、 本当の回答にまで至らなかったわけで、少々面倒でした。

一方、この問題を外接円の 外心を求める問題だと気付けば、半径と位置をより容易に解くことができるわけです。

この解き方をしていたのは日本人の競技プログラマーですが、 競技プログラミングにおいては、問題の適切な定義と解き方の引き出しが 尋常じゃなく沢山あるのかもしれません。 もしくは、私の引き出しが少なすぎるのかもしれません orz

競技プログラミング用のアルゴリズムの学習も、今後はしていきたいですね。 一応本も一冊持っていることですし(ざっとは読んだけど理解は…ってレベル)

コーチング実践してみた感想とロールモデルの距離感

前置き

最近、会社のチーム内でコーチング研修が何回かありました。 コーチングとは何かについては、コーチング – Wikipediaから引用するに留めます。

コーチング(coaching)とは、人材開発の技法の1つ。対話によって相手の自己実現や目標達成を図る技術である。相手の話をよく聴き(傾聴)、感じたことを伝えて承認し、質問することで、自発的な行動を促す。

コーチング研修では、コーチングの基礎を学び、 何度か演習(コーチングの時間をセッションと言うそうです)もこなしたのですが、 どうしても短い時間(長くて15分)のセッションだと、 答えを見つけるまでに到達できないことも多かったので、 少し消化不良を起こしていたのです。

実践

というわけで、本日コーチングを実践してみました。 私がコーチ役で、クライアント役には、個人的も周囲的にも今後の成長が期待される後輩さんに なっていただきました。

テーマは「今後のキャリア形成について」的な感じで、 1時間のセッションをやってみました。 事前に考えた質問はこんな感じです(質問メモすら渡してしまったので覚えている範囲)

  • 興味がある・追求したい技術
  • 今のチームと前のチームとの違い
  • 今のチームでクライアントに求められいること、またはクライアントが思うこうありたい姿
  • 成功体験・失敗体験
  • ロールモデル(参考にしている人物像)
  • 社外活動に関する質問いくつか(勉強会、コミュニテOSS…)

他にも色々あったと思いますが、上記について質問しながら、 3年後にどうありたいかをイメージしてもらい、ありたい姿に向かうためには 具体的にどういうことをやっていけばいいかを挙げてもらい、 そのうち1つを実施することを決めてもらう、というところまでは 一応できたかなと思います。

クライアントさんは日頃から大体考えていたことらしいので、 だいぶクライアントさんに助けられた感はあります。もっと実践せな…

やってみた感想

うまく行ったこともぼちぼちありますが、 いくつかうまく行かなかったことがあるので、メモとして残しておきます。

明確な問題のないセッションの落とし所をどうすればよいか

今回のように、何か明確な問題があるわけではない、目標設定をするようなセッションでは、 具体的な行動への落とし所が難しかったです。 目標を決めたらOKだと事前には思っていたのですが、それでは具体的な行動には 到達できません。 ですので、急遽その場で、じゃあその目標に向かうにはどういうことをすれば良いかを 挙げてもらいました。

最終的に、あるべき姿は覚えておいてもらいつつ、 具体的な行動ひとつを選択してもらい、それを実践してもらうよう後押しする、 という風にすることで、無事にセッションが着地できたかなと思います。

タイムキープ重要

1時間のセッションと事前に決めていたのですが、その中で40分は質問。 残り20分で具体的な行動への話に繋げていったのですが、 上記のような急遽の話があり、最後の具体的な行動の時間がギリギリになってしまい、 具体的な行動のリストアップを途中で打ち切ってしまうかたちになってしまいました。 これはアイデアを摘んでしまうことになるので、良くないです。 コーチ側のタイムキープの力が問われます。

前もって準備した質問が多すぎた?

どちらかと言うと、質問の数は少なめにして、逆に「他には?」「具体的には?」などと 色々出してもらったほうが良かったかもしれません。 キャリアのことを考える上で色んな視点があった方がいいと思い、 質問の数を多めにしたのですが、深く聞けたかどうかはちょっと自信がないですね…。 これはクライアントさんに別途聞いてみようかと思います。

初めての実践コーチングの自己フィードバックでした。

ロールモデルの存在

最後に、ロールモデルの存在について。 上のほうで何となく「参考にする人物像」と書いたのですが、 ロールモデル とは – コトバンクによると、

具体的な行動技術や行動事例を模倣・学習する対象となる人材

だそうです (実はロールモデルの定義をちゃんと知らずこの言葉を使っていた…反省)。

ロールモデルとなる方は、どのくらい自分から離れた存在なのが良いのかな、と セッション後に考えてみた次第です。 例えば、新人のロールモデルが課長、みたいなケースだと、 ちょっとロールモデルとするには距離感がありすぎる気がするんですね。 新人さんが模倣しようにも、上司とは業務内容から視点から色々異なるので、 参考にしにくいのではないか?思うわけです。 逆に近すぎると、それはそれでロールモデルとしては適切ではないのかな、とも思います。 参考にすると言うよりは、ライバル的な関係となり切磋琢磨するのが良いのかなと、何となく思います。

そう考えると、程よく離れた関係がロールモデルとして適切なのかと思うのですが、 さてさてこの「程よく離れた」って実際にはどのくらい?というのが分からない。 何か指標みたいなのがあればいいんですけどね。まだ調べていないので、分からないです。

話を戻してクライアントさんですが、今はクライアントさんの上にも下にも バラエティに富んだチームメンバーがいます。 そういう環境では、ロールモデルとなる人を見つけやすいと思いますし、 実際にいるとのことなので、何よりだと思います。

そのクライアントさんだけに限らず、他のメンバーがどういう人をロールモデルとして 捉えているのか、その距離感はどんなものなのか、この辺を注目していこうと思います。

最後にコーチングについて

コーチング研修の先生は、何度も「答えはクライアントの中にある」と仰っていました。 何回かの演習と今日の実践を踏まえて、仰っていることは本当なのだと思います。 今回の実践は私も非常に勉強になりましたので、引き続き実践していく予定です。

Pythonで線形方程式を解く

How much gold :: CheckiOを解く方法として、 何か簡単な方法はあるんだろうなと思いながら、線形方程式を解く方法を採用したわけです。

線形方程式を簡単に解く方法はないかな?と探したところ、 SymPyを使って式を与えるだけで解くことが出来ました。 テストその1をベタ書きしています。

ソースコードおよびセットアップ方法は、 Pythonを使って一瞬で連立方程式を解く – Qiita を参考にしています。 要するに、右辺がゼロとなる方程式を、連立方程式を解くのに必要な分渡しているわけです。

1
2
3
4
5
6
7
8
9
10
11
12
from fractions import Fraction
from sympy import *

g, t, i, c = symbols('g t i c')
out = solve([
    g * Fraction(1, 1) + t * Fraction(1, 1) - Fraction(1, 2),
    g * Fraction(1, 1) + i * Fraction(1, 1) - Fraction(1, 3),
    g * Fraction(1, 1) + c * Fraction(1, 1) - Fraction(1, 4),
    g * Fraction(1, 1) + t * Fraction(1, 1) + i * Fraction(1, 1) + c * Fraction(1, 1) - Fraction(1, 1),
], [g, t, i, c])

out[g]  # -> Fraction(1, 24)

ただ、CheckiOでは外部ライブラリの利用はできません。 また、式を動的に生成する方法があるかも分かりませんので、 複数ケースに対応する方法が分かりませんでした。

結局、 ガウスの消去法 – Wikipedia を使って、自前実装で解くことにしました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def gauss_elimination(m):
    '''mは[g, t, i, c, value]というベクトルを4本持つ行列'''
    n = len(m)
    # 前進消去
    for i in range(n):
        v = m[i][i]
        if v == 0:
            # ゼロ以外の値を持つ行と交換する
            for k in range(i + 1, n):
                if m[k][i] != 0:
                    m[i], m[k] = m[k], m[i]
                    v = m[i][i]
                    break
        for j in range(n + 1):
            m[i][j] /= v
        for k in range(i + 1, n):
            v = -m[k][i]
            for j in range(n + 1):
                m[k][j] += m[i][j] * v

    # 後退代入
    for i in range(n-1, 0, -1):
        v = m[i][i]
        m[i][i] /= v
        m[i][n] /= v
        for k in range(i - 1, -1, -1):
            v2 = m[k][i] * m[i][n]
            m[k][n] -= v2
            m[k][i] = Fraction(0, 1)
    return m

これでgauss_elimination()が解けたときにはすべての変数の値が求められた状態になります。 良かった良かった。

…と思ったら、最短1行で書くことができるらしい。 G+T=a, G+I=b, G+C=c, G+T+I+C=1から、G = (a + b + c - 1) / 2が導出できて、 a, b, cを、それぞれGが含まれている場合の式に変換することで計算できると (テスト2の方は、1 – 式とすればGが含まれる方になる)。 なるほど、勉強になりました。

大阪Pythonユーザの集まり 2014/03 を募集開始しました ‘#osakapy

前回の記事で書きました、大阪でPythonの勉強会を行う、という話ですが、 本日ようやく募集開始しました。

大阪Pythonユーザの集まり 2014/03 – connpass

  • 日時 2014/03/13 19:00
  • 場所 堂島アバンザ21F

Pythonユーザはもちろんのこと、 Pythonに興味を持っていただいている方のご参加もお待ちしております。

今時点では、下記3名が発表予定です。私も参加します。

  • @whosaysni wxPythonの初心者向けのお話(仮) 15分
  • @todogzm scikit-learnを用いた機械学習チュートリアル 30分
  • @heavenshell タイトル未定 10~15分

また、当初の予定にはなかったのですが、とりあえずLT枠も作ってみました。 誰か少しでも発表できることがありましたら、ご参加をお待ちしております。 個人的にはPython 3.4の新機能を話せる人がいたら、ひとつピックアップして お話いただけると嬉しい次第です。

懇親会も行う予定ですので、こちらも是非ご参加ください。

関西のIT関連の勉強会・コミュニティ一覧を作ってみた

コミュニティに入るか入らないかでエンジニアとしての幸福度がかわる – きしだのはてながホッテントリ入りしていたので、読んでみました。 幸せの評価基準をバシッと1コに決めてしまう当たりに賛否両論はあるのかもしれませんが、 少なくとも私は同意するところが多々あります。 エンジニアですもの、技術力が上がることは成長しているってことで、嬉しいわけですよね。

計算機科学者、未踏統括PM 竹内郁雄が語るエンジニアに伝えたいこと | 三年予測 |IT・Web業界の転職ならDODAエンジニア ITにも、下記のような話がありました。

「閉塞状況から脱出したいなら、コミュニティだ。それも、単に勉強会とかフォーラムに参加して情報を吸収するだけではなく、他人と交わることだ。できれば懇親会まで出て、人との交流を楽しんだほうがいい」

コミュニティには、似たようなものを作っている人や、まったく違うものを作っている人、 様々なキャリアの人がいて、その人達と情報交換することにより、 自分の知らなかった情報を得ることが出来ます。 今まで知らなかったことを、存在だけでも知ることができれば、 あとは自分で調べることができるようになります。 これがコミュニティに参加する、一番最初に得られるメリットだと思います。

とは言え、関西でコミュニティをどうやって探したらいいのか分からん、とゴネられても困るので、 関西のIT関連の勉強会・コミュニティ一覧 – Qiitaを作ってみました。 不足やカテゴリ変更など色々ツッコミたい部分はあると思いますので、 是非コメントなり編集リクエストなりをお送りください。 よろしくお願いします。

なお、3月第2週くらいに、大阪でPythonの勉強会を企画中です。 大阪でPythonで集まろうの巻に参加した – 技術情報棚卸し(平日限定)から上がった企画ですね。

CheckiOでPythonのお勉強

CheckiOが楽しいので、少しずつクリアしています。

CheckiOはPythonを使ったプログラミング学習サービスなのですが、 ゲーム要素溢れるところが非常に特徴的です。

ゲーム要素は、例えばこんな感じです。 私自身のPython歴がそれほど長くないので、人のコードを読むのは非常に勉強になります。

  • サインアップするためにもPythonコードを書く必要がある
  • コードを書くことによって経験値が得られ、バッジや行ける場所が増える(行ける先はO’ReillyとかDropboxなどという見慣れた名前が…)
  • コードの提出が完了したら、自分の書いたコードを公開できる(経験値ももらえるしレビューももらえる)
  • 人のコードを読むことが出来、レビューすることができる(レビューすると経験値がもらえる)

サイトが重いとか、作りが分かりにくいとか不満点は少々ありますが、 パズルを解く感覚でPythonを学ぶ事ができるのは、非常に楽しいです。 下記が私のアカウントですので、よかったら私をフォローして下さい。

todogzm profile :: CheckiO

Sexy Little Numbersの和訳の賞味期限が短い件

データ・サイエンティストに学ぶ「分析力」という本を読みました。 マーケティングに関するサービスを開発している割にマーケティングのことについて あまり知識がないことに気付くというしょうもない状態だったので、 この本で学習しようとしたわけです (一応言い訳ですが、マーケティング周り担当になったのはここ最近の話!)。 割と厚い本であるし初学者でもあるので、まずは分からない点も含めてざっと読みしました。

マーケティングの流れ

  1. 誰にアプローチするかを決める
  2. どのようなメッセージを送るかを決める
  3. 客がどこに居るかを探す
  4. プロモーションにいくら使うかを決める
  5. 実際にプロモーションし、結果を測定する
  6. 測定結果をもとに、次の行動を最適化する

という流れとのこと。で、本書はこの各行動について、 手元にあるデータを頼りにした(またはデータが揃ってない場合には直感なども頼りにした) 適切なアプローチを取ります。

適切なアプローチ方法

例えば誰にアプローチするかについては、既存顧客を分類して、 どういう顧客層が「価値のある顧客となりうるか」「価値のありそうな潜在顧客か」 などに割り振ります(バリュースペクトラムモデル)。 その際の「価値」についても、自分の商品・マーケットにそって、 色々な尺度があり、それをどのように計算するかが書かれているわけです。

各フェーズについて、データからどのようにアプローチするか、 データがない場合はどうするかが書かれており、非常に有用に感じました。 まだ分かってない点も多々あるので、今度は深く読もうと思います。

本を読んで

マーケティングの仕方が分かり、マーケティングサービスに 組み込んでいくためのアイデアをいくつももらえた気がします。 逆に言うと、いくつも基本的なことが出来ていなかったと思います。反省しきりです…。

また、マーケティングに関わる分析の未来についても書かれており、 ワクワクする反面、不安になる点もいくつかありました。 詳細は本を手にとって読んでみてください。

最後に

「データ・サイエンティスト」って賞味期限の短そうな名前をタイトルに使うと 今はいいけど数年後には誰も見向きもしない本に成り下がってしまわないか、 ちょっと気がかりです。 10年くらいは有用な本だと思ったので、その点が残念かなぁと思いました。

大阪でPythonで集まろうの巻に参加した

背景

大阪でPythonで集まろうの巻に参加してきました。 参加してきましたというか、上記リンクの先を見ていただくとお分かりの通り、発端は私です。 私なんですが、恐れ多くも増田さんにボールをぶん投げ、企画していただいたという次第です。

私自身Pythonを初めて1年半。 実際にそれなりの時間を割いて書くようになってきたのがここ数ヶ月くらいの話なのですが、 私の周囲にPythonを書く人がいないんですね(最近少しだけ書く人が増えたけど)。 Pythonについて相談できる相手がいないわけで、少々つらいこともあるわけです。 そういう背景もあって関西のPythonコミュニティを探していたわけですが、 ここ数年の活動は停滞気味だったとのことでした。

まずはテーマとかないけれど、Pythonな人たちで顔合わせしましょうかね、 合わせて勉強会とか開発合宿とか企画したいね、という感じで企画されたのが今回の会合です。 増田さん、お忙しい中企画と会場をご提供いただき、ありがとうございます。

会合

会合ですが、各人の自己紹介を経て、勉強会のざっくり方針だけを決めて、 会合自体は30分で終わり懇親会場になだれ込みましたw

メモ

以下はメモ。時系列などは無視のだらだら箇条書きです。

  • 大阪にはPythonの仕事もGoの仕事もある!
  • ミッション・クリティカルなシステムにもPythonが使われており、構成次第では非常に大量のアクセスもさばける模様。
  • Erlangの軽量プロセスの管理がGoよりも充実しており、子プロセス生成時に、子プロセスが異常終了した場合にどのように通知して親プロセスはそのまま生存するか一緒に終了するかの制御を明示的に指定できるらしい。
    • Erlang開発者の論文に、システムがどういう状況で障害を起こすのか、その対策は、という話が書かれているらしい。多分これっぽい。armstrong_thesis_2003.pdf
  • Seleniumのドライバーに、Python用のSelenium Driverがある。うちもJavaじゃなくてPythonを使ったほうがサクサク書けるんじゃないかな。
  • スプリント・バックログを付箋化するのはひと目で分かって良い。ただチケットも別途発行しており、そのチケットが溢れる問題は解決しない。
  • Web界隈だとGitHubでTravisCIで~という話をよく聞くが、CIも自動テストもない現場が普通にあるとのこと。おっとSVNの悪口はそこまでだ orz
  • 勉強会の運営についても幾つか。
    • 会場の確保は、20~40人規模なら何とかなりそう。会場提供可能な方が結構多くてビックリ。
    • 開催日は、平日か土日かといえば、どちらかだけ都合がいいという人が一定数いる関係上、交互にやった方がいいんじゃないか。
    • 勉強会には参加する人は多いが発表してくれる人はかなり限られる。発表の敷居を下げるか、強制で発表できるような仕組みが必要?
    • 発表する側、企画する側も何らかの成果を得たい。案として、グループディスカッション形式の勉強会があっても面白いかもしれない。

最後に。大阪でPythonの勉強会を開催予定です。3月第2週あたりを予定しております。

あぁぁ大阪Go勉強会もこんな感じでいい加減踏ん切りつけてやらないと… orz コミュニティ化しないといかんなぁ…。

こちらからは以上です。皆様、昨日はありがとうございました!

そう言えば。

妻の同級生が居て腰抜かしそうになるほどびっくりしました。 世の中広いようで、狭いです。

追記 2014-02-19 12:55

@ikegami__さんから教えていただいたのですが、 Python for Kidsという本の訳本が今月末発売予定とのことです。

たのしいプログラミング Pythonではじめよう!

サイボウズLiveを試用する

Emailがコラボレーションツールに適していないもう1点で書いたことを実践する機会ができまして。 諸事情により地域の会合に参加することになったのですが、 そこでの議論の結果がメールで回されることになりそうだったのです。 Emailはコラボレーションツールに適してないと主張する私としては 黙って見ているわけにはいきません。

「メールでのやりとりは議論が残せないので、別の場所を設けましょう。私が提案します!」

と手を上げて、実際に導入するところまでを面倒見ることにしました。

評価ポイント

今回の地域の会合で、ある程度PCやスマホに慣れている男性陣が想定利用者です。 評価ポイントは、ざっくり以下としました。

  • 無料である(まだ予算とかないので…)
  • セキュアである
  • スケジュール、議事録、TODO管理ができる
  • スマホ対応している

こういう条件で、限られた時間内で調べてみました。

評価対象

この中で、サイボウズLiveを第1候補としました。 上記の評価ポイントをすべて押さえているからです。

というわけで、サイボウズLiveに登録し、実際に試用してもらうことにしました。 まだ1日しか経っていませんが、果たしてどうなることやら。