tetsunosukeのnotebook

tetsunosukeのメモです

PILで文字画像を抜き出す

初めてのPIL。
もっとカンタンに書けるかもしれないけど無理やり。

こんなデータから
f:id:kidd-number5:20130604192047j:plain

白い部分を取り除いてこんなかんじにする
f:id:kidd-number5:20130604192112j:plain

# -*- coding: utf-8 -*-

from PIL import Image
from numpy import *

im = Image.open("test.jpg")

# とりあえず配列にする
pixel_array = array(im)

x = []
y = []
for i in range(0, im.size[0]):
    for j in range(0, im.size[1]):
        # 白以外のピクセルを探索
        # ここはもう少しゆるいしきい値でも良いと思う
        if pixel_array[i][j].tolist() != [255, 255, 255]:
            y.append(i)
            x.append(j)

# x, yそれぞれの最大最小が白以外に初めて出る色。
# そのまま切るとジャストで切れちゃうから2ピクセルくらいのバッファを確保            
buffer = 2
left = min(x) - buffer
top = min(y) - buffer
right = max(x) + buffer
bottom = max(y) + buffer

# 切り取って保存
cropped_im = im.crop((left, top, right, bottom))
cropped_im.save("cropped.jpg")

これで手書き文字認識とかもできるのかもしれないとちょっと夢が広がった。

karmaでらくらくJavaScriptをテスト

Testaclarの後継?ことKarmaを使ってみたのでメモ。

※ 現在のカバレッジ取得は
karma で テストしながらカバレッジを取る - tetsunosukeのnotebook を参考にしてください。


Karma(元Testacular)を使って簡単にテストを実行しよう をほぼ参考にしました。

node.js をインストールしているマシンで

c:\> npm install

適切なフォルダで

c:\work> karma init

するといろいろ聞かれる。
テストフレームワークはJasmineを使うことにする。

Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine

Do you want to use Require.js ?
This will add Require.js adapter into files.
Press tab to list possible options. Enter to move to the next question.
> no

Do you want to capture a browser automatically ?
Press tab to list possible options. Enter empty string to move to the next quest
ion.
Chrome

Which files do you want to test ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.


Any files you want to exclude ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.


Do you want Testacular to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes

Config file generated at "c:\work\karma.conf.js".


こんな感じで初期設定が終わる。

下記の箇所に、ソースファイルとテストファイルの場所を追加しよう。

// list of files / patterns to load in the browser
files = [
  JASMINE,
  JASMINE_ADAPTER
];

こんなかんじ。

// list of files / patterns to load in the browser
files = [
  JASMINE,
  JASMINE_ADAPTER,
  'src/*.js',
  'spec/*.js'
];

スクリプトを書いてみる

// src/add.js
function add (a, b) {
    return a + b;
}

// spec/addSpec.js
describe("test add", function() {
    it("1+2=3", function() {
        expect(add(1, 2)).toEqual(3);
    });
})

この状態で

c:\> karma start

すると、下記のようになる。

INFO [karma]: Karma server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 26.0 (Windows)]: Connected on socket id zdixoohRJSrQcoer04vh
Chrome 26.0 (Windows): Executed 1 of 1 SUCCESS (0.346 secs / 0.002 secs)

f:id:kidd-number5:20130409122738p:plain

テストが起動しっぱなしになっているので、
この状態でテストを失敗させてみたりすると、

// spec/addSpec.js
describe("test add", function() {
    it("1+2=3", function() {
        expect(add(1, 2)).toEqual(30);
    });
});

こんな具合に自動認識される。

INFO [watcher]: Changed file "c:/work/spec/addSpec.js".
Chrome 26.0 (Windows) test add 1+2=3 FAILED
        Expected 3 to equal 30.
        Error: Expected 3 to equal 30.
            at null. (c:/work/spec/addSpec.js:4:27)
Chrome 26.0 (Windows): Executed 1 of 1 (1 FAILED) (0.339 secs / 0.008 secs)

オプションいくつか

karma.conf.js

browsers

['Chrome', 'IE'] のようにすることで複数ブラウザを扱うことができる

singleRun

singleRun = True; にすると、都度コマンドで立ち上げる形になる。CI環境で使う場合はこちら

カバレッジを見る

以下のようにして実行する

preprocessors = {
  'src/*.js': 'coverage'
};
reporters = ['progress', 'coverage'];

coverageReporter = {
  type: 'html',
  dir : 'coverage/'
};

karma start したあとに、coverageフォルダができて、その中のindex.html を開くと下記のようになります。

f:id:kidd-number5:20130409124024p:plain

ファイル単位

f:id:kidd-number5:20130409124037p:plain


Jasmineを入れてから~ とかしなくて良いので初期設定が結構ラクチンでした。

GoogleApps で社外(自ドメイン以外)の人を宛先に含む場合のTips

実は対策がされている

補完って便利ですよね!でも補完のせいで、うっかり宛先にすべきでない人を宛先にしてしまいお詫びをした経験はありませんか?誰しも一度くらいはやってしまったことがあるのではないかと思います。

GoogleAppsの場合、自ドメイン以外のメールアドレスに対しては、ある程度の目印をつけてくれているのですがご存知でしたか?

新しいメール作成画面の場合

f:id:kidd-number5:20130307115439p:plain
アドレスをクリックすると

f:id:kidd-number5:20130307115446p:plain

古いメール作成画面

f:id:kidd-number5:20130307115450p:plain

うすっ!
気づかないよね!普通気づかないよね!言われてから初めて気づくレベルだよね!

というわけで

これをユーザCSSで目立たせてみよう
というわけです。

例えばChromeをお使いの場合、Stylist などの拡張を用いてユーザスタイルシートを作成します。

f:id:kidd-number5:20130307120112p:plain

私の場合はこのように設定しています。

この設定で自ドメイン以外のメールアドレスを入れると・・・

f:id:kidd-number5:20130307120348p:plain
f:id:kidd-number5:20130307120356p:plain

ほらわかりやすい!

ご活用ください。

注:クラス名がもし変わったりしたら使えなくなるので注意...

ストレングス・ファインダー をやってみた

以前から気になっていた、ストレングス・ファインダーをやってみました。

「資質」と呼ばれる34の分野において、その人にどのような資質があるかを測定します。資質とは、自分が最も自然に考え、感じ取り、行動する方法であり、強みを形成するための基礎

とCLIFTONのサイトには書いてあります。

「ストレングス・ファインダー」そのものがタイトルの通り「強みを知る」ものと思っていたのですが、この目的はあくまでも自分の「傾向」について知るものである、ということでした。

結果から言えば私の5つの強みは

  1. 慎重さ
  2. 学習欲
  3. 分析思考
  4. 調和性
  5. 着想

であるとのことでした。

ストレングス・ファインダーを受けるには

さあ、才能(じぶん)に目覚めよう―あなたの5つの強みを見出し、活かす

さあ、才能(じぶん)に目覚めよう―あなたの5つの強みを見出し、活かす

この本を買うと、巻末にアクセスコードがついているので、それをサイトで入力して受けることができます。(現在、この他の本でもついているものがあったり、受けるだけであればアクセスキーを購入することもできるようです)

正直こういった診断には一万円くらいかかると思っていたので、想像していたよりは安価に済んでよかったです。もっと早くやればよかった。アクセスキーだけなら$9.99です。まあ、実施するとなると多くの質問に答えていくのでそこそこ時間がかかっちゃいますけど。

本を中古で買う場合、アクセスキーがついているわけがないので、安いからといって安易に飛びつかないように注意しましょう。

この本の構成は、なぜ強みにフォーカススべきなのか、弱点の克服ばかりを考えていてはいけない、という話などが序盤に書いてあり、ストレングス・ファインダーの受け方などの説明があります。この本の三章まで読むと、具体的な受け方が書いてあるので、そこで実際に受けるのが良いようです。

本の内容

四章からはそれぞれ診断された強みに関しての説明が記載されています。

四章以降がなかなかおもしろくて、例えば「慎重さを強みとする人は普段から人を褒めるようなことはしないため、彼の口から賞賛の言葉が出た場合にはそれは本当に心からそう思っている」なんていうような、具体的な行動で、あっそれまじで俺のことだよ!、って思うような記述がいくつか見つかりました。

傾向としての強み

上記のことから自分が一番気付かされたのは、自分ならこういうふうにする、それがアタリマエのことだ、と思っていたこと、例えば「エンジニアなら日頃から学習し続けるなんて当たり前じゃないの?」みたいなことは、ある程度は「自分が持っている傾向のためにそうである」というだけであって他の人も同じではない、という、それこそ人はそれぞれみな違うというあたりまえのことだった。

そういう視点でみてみると、自分がそれこそ脊髄反射的に考えてしまうところを一旦待って、他の人がどのように考えてどう動いているかを観察すると、その人にはその人なりの傾向、良さ、強み、みたいなものが見えてくるなと思いました。

自身の強みのほかに

自分の強みがどれであるかはここで公開しているように、会社の上長には自分の強みを知ってもらいました。本も読んでもらい、実際に受けてみるつもりだそうです。

理想的にはお互いに自分のグループのメンバーなどにもこれを受けてもらってお互いの強み・傾向を知ってもらうのがよいなと思いつつ、こればかりは強制もできないのでなかなか。

「会社として」このようなことに取り組んでいる所があればぜひどうなのか教えてほしいなと思います。

補足

強みの内容の34分類についてはとりあえずこちらのサイトが参考になるかな。
http://www.leafandletters.com/wordsarepower-strengthsfinder.html

生を意識した2013年1月

自分にとって生を意識する出来事がこの一週間の間に2つも起きたので、思ったことをそのまま記しておきます。

実家にて

もともとこのことを書こうと思っていたのだけど。

父方の祖父から実家宛に年賀状。今年で祖父は90になる。そこには、今年で年賀状は終わりにするから、という旨のことが書かれていた。我が家だけではなく、すべての人に対してである。

別件で祖父が活動していた絵画サークルがあり、そこの活動についての手紙が届いており、その中には、「絵画サークルのメンバーも徐々に他界しており、もうこのサークルも終わりにしようと思っていた。だけど新しい人が参加したいと言ってきたのでまだ続けることにするよ」という旨の内容。

節々に「オレももう長くないのだから」ということが書かれていた手紙と年賀状だった。

なんというか、年賀状が来るのが終わってしまったらそれこそ我が家はともかく、他の人のつながりが絶たれてしまい、ある意味で孤独死のようなことが起きてしまうのではないか、と思ったものだ。別の意味では出した相手から次々とすでに他界したので、という連絡があったりとか、喪中の連絡があったりとかが辛かったのかもしれない。そういった考え方は、その立場に近づいてみないとわからないことなのだろう。

最近でこそそれこそ物理的には疎遠な人とも、SNSなどでいろいろと近況を知ることができたり、自分としても、うざいくらいに近況を配信しているので、そういったことに対しての考え方がどう変わっていくのか、今の発信でいいのか、などを考える機会となった。

昨日

実家の岡山に戻っていた大学の同期が亡くなったとの報せ。

つい一日前まで、Twitterで他愛もないことを含めて書き込んでいたその1日後に、弟さんがTwitterのアカウントにその旨を書き込んでいたこともあり、これが「本当に信じられない」っていう状態なのか、としばらく放心してしまった。

近辺の書き込みから病気だったのか、まさか自殺か、この年齢なら事故か。そうであってほしいともそうでもないともいう複雑な思いで昨日を過ごした。

この時に強く感じたのは「彼が病気であったのかもしれない」なんてことも含めて、自分は何一つ知らなかった、もし自殺なのだとしても、彼が何かに悩んでいたのかもしれない、自分が何か助けられたのかもしれないのに、という思いだけがこみ上げてきて、特に遠方となってしまったことを含めて疎遠になってしまっていたことを後悔すること共に、友人としての資格?みたいなものに対する自責の念ばかり。

死に対して驚くのが正しい(?)かどうかもよくわからなくなった。例えば祖父の死ならそれは驚かないものなのだろうか。日頃から不摂生している人物であればガンなどで亡くなっても「まあそうだよね」となるものなのか。そういった面でも自分は死に対してまったく対面していない、と思いました。

今日死ぬ確率

奇しくも去年、今日死ぬ確率(http://dit.monoroch.net/)というのを教えていただき、その確率は宝くじで一等が当選するよりよほど高いのだ、という話を聞いた。(今回の彼でいえば43万分の1の確率である)

その文脈では、こんなにも高い確率で死亡する確率があるのだから、日々をムダに生きないようにしよう、みたいな話であり、まさかこのような形で再度強く意識することになるとは、思いもしなかった。

今言えることは

自分の場合今日死ぬ確率は60万分の1のようだ。
今日を大事に生きよう。

友人のご冥福をお祈りいたします。

また、皆様の生と死についての考え方などもしお聞かせいただければ嬉しいです。

2012年振り返り

2012年が終わろうとしている中、振り返りつつブログ。

お仕事的には今年は大きく3つにわかれるかなという感じです。

リーダー・プレーヤーからマネージャーへの転化

リーダー層を集めた研修があったのですが、そこで「サーバント・リーダーシップ」を学びました。また中途入社のメンバーにスキルの高いメンバーが入社したため、フラットな組織ではあるがテクニカル面では引っ張っていくことで示すリーダーシップ、ではなく、どちらかというと積極的にゴミ拾いをする形での関わりをしていく、ということを意識するようになりました。

同時にマネージメント、その本質としては成果を出すようにサポートする、という意味で、自身で案件を持たずあらゆる意味でサポートを目指す、というスタイルを目指してみました。結果としては自分が忙しい時に比べてチームのコミュニケーションが円滑になったので反省してこれは継続したい。

やってみるとむつかしいもので属人化している部分や自分が得意であったりいわゆる自分でやった方が早い、というのを、周囲からの自身に対する期待(あるかどうか不明)の中やりとおすのには課題があるなーと認識。まずは認識して次へ。というところ。

具体的には

ほとんどAction script書いてた!

あとはプロジェクトの技術負債をどう返すか、に悩んだ一年だった。新しく採用した方がそっち方面に長けたスキルをお持ちだったので、それを機に進めてみようとしたが、なかなか長年に渡った負債が解消されるはずもなく、これも認識で終わる一年。

Jenkinsとかの勉強もしたし、世の中の常識レベルに早く追いつかなくては。

be agile

昨年から興味を持っていたアジャイルの適用にも悩んでみた。まずは全体の仕組みを変えるべく、経営層や、システム担当以外へのアプローチをしました。結局のところの価値ってなんだろうね、というところへは、来年からもう少し多くの人を巻き込めたらと思う。

合わせてリーンスタートアップの考え方にハマる。

もともとデータ分析の勉強の活かしどころを探してもいたので、この中での科学する考え方は習慣としていきたい。

分析と統計

分析の勉強会を一通りしっかりできた。他の人がさぼっても自分だけはやる、というように意思の強さを持てた。また、人よりも高いところを自分の中で目標とできたのは良かった。

結果少しやるのももったいないので、統計検定の受験を決意。三ヶ月くらいしっかり勉強する時間を取れたし、こちらもなりふり構わず意思を。。という感じ。来年も何か強い意思をもってやれたらいいなと思う(チーム作業においてもこも意思が一つポイントだと思ってやってみたのだが、抵抗というわけではないが全員の意思を強くする、というには何か別の力が必要なのだろう。権力とかじゃないといいのだが)

コミュニティ的な活動

勉強会はほとんど参加、主催できなかった。

ひとつ後半に、google apps 関連で参加したセミナーで新しい人脈ができた。というか、システム管理者と開発者が関わる方法が模索できたように思う。こちらのコミュニティで二度ほどお話をさせていただいたし、他企業様とのお話の機会やそこでできるエンジニアリングの可能性を提示できたことで、個人としての魅力作りが久々にできたような

野球もやりました

会社で作ったチームに参加してリーグ戦に出ました。日頃からの筋トレの効果確認みたいなところもありますが、四球後の盗塁などなかなかの緊張感とか、いろいろ試してみてもうまくいかないとかそういうところが、ある意味楽しいなと思いました。

最初はランナーがいたら打順回ってほしくないなーと思っていたんですが(ヘタだから併殺打を打ってしまうのが怖い)、満塁でタイムリーを打ったりとかできたのが結構いい想い出。

リーグ戦は月に二回土曜日を費やしたので、いろいろな活動が滞ったのはこれが原因でもある。(ただし、全試合出てない)

最後に

統計の勉強以外のすべてのことで継続して強い意思でできなかったことの理由に、今年はインフルエンザ含め三日以上の休みを取る羽目になったのが四回、というか四半期に一度あった。がんばろう、と思って業務外で三時間残業したり、というようなどこかしらの無理がこういう結果を招いたようにも思う。

もともと体が強くないのだから、無理をしない、というところもキーになるか。

例えば本当の意味でメンバーに任せる、というようなことができていないのもストレスになったりするのだろうから、そもそもの仕組みを変えていかないとね。


本年もよろしくお願いいたします。