スプーキーズの中の人。

スプーキーズの中の人が徒然なるままに、垂れ流します。

おじさんの嫉妬は犬も喰わない

f:id:masayuki14:20160621161208j:plain

つりあわない男女問題はいつも面倒だ

ある日、Slackの#devにこんなお題が投稿されました。

Q09 つりあわない男女
あるイベント会場に男女が集まってきました。到着した順に1列に並んで
入場を待っています。イベントの主催者であるあなたは、ある位置で区切っ
て2つのグループに分けたいとおもっています。
2つのグループのいずれかは男女の数が均等になるように分けたいのです
が、到着した順番が悪い場合、どこで区切っても2つのグループで男女の数
が異なってしまいます。

 例えば、男性3人女性3人が「男男女男女女」の順で到着すると、どこで
区切っても男女の数が異なってしまいます。しかし、「男男女女男女」の順
で到着すると、4人目の時点で区切ることで、男女が同じ数になります。

(問題)
男性20人、女性10人が到着した場合、どこで区切っても2つのグループ
のいずれも男女の数が異なってしまうような到着順が何通りあるかを求めて
ください。

合わせて投稿者 id:ashida_spookies の解答例。

再帰で深さ優先探索したつもり
答え合ってるけどめっちゃ遅い(自分の環境で150sぐらい)から誰か速くして

とりあえず解答例は見ないでおいて。おじさんもチャレンジしてみることにしました。

おじさんは考えた

まず、おじさんは組み合わせがどれくらいになるかを考えました。

# 30人で作られる列だから組み合わせは30の階乗だ!  
(1..30).inject(:*) #=> 265252859812191058636308480000000  

途方も無い数になりました。この量を1つずつ確認するなんてできません。 そしてこれは男A 男B 女A男B 男A 女A も別の組み合わせになってしまうので無駄が多くなります。

次に男女の列を30桁の2進数と考えると

# だいぶ減りました。
all = (2**30) #=> 1073741824 2の30乗  

男20人女10人なので、男を1とする場合1が20未満のビット列は対象外となります。
男20人なので 0xF_FFFF より小さい数は対象外です。
しかしこれ以上はちょっと減らし方がわからない。。。
ということでコードを書いてみました。

実行してみると・・・目も当てられない遅さ。。。 2800s て。

id:ashida_spookies の解答例の 150s の比にもならない遅さです。

おじさんがっかり。

彗星のごとく現れた模範解答

そんな中、アルバイトの id:moritanian が彗星のごとく解答を示しました。

f:id:masayuki14:20160607223406j:plain

A地点からB地点までの最短経路の場合の数と考えられる。
# ->
[1, 8, 35, 110, 275, 572, 1001, 1430, 1430]
[8, 43, 153, 428, 1000, 2001, 3431, 4861, 4861]
[43, 196, 624, 1624, 3625, 7056, 11917, 16778, 16778]
[196, 820, 2444, 6069, 13125, 25042, 41820, 58598]
[820, 3264, 9333, 22458, 47500, 89320, 147918]
[3264, 12597, 35055, 82555, 171875, 319793]
[12597, 47652, 130207, 302082, 621875]
[47652, 177859, 479941, 1101816]
[177859, 657800, 1759616]
[657800, 2417416]
[2417416]
[Finished in 0.1s]

最短経路?地点?なにそれ美味しいの? おじさんにはよくわかりませんよ! 0.1s !? ええっ!!!

スタッフ一同からの 素晴らしいとの絶賛の嵐でした。

そしておじさんは嫉妬したのです。悔しかったなー、ちくしょう。

問題を正しく認識する

2人は何が違ったのでしょうか。
経験の差でしょうか?プログラムスキルでしょうか?
いいえちがいます。
問題に対する正しい認識です。

  • おじさんは組み合わせを数える問題と捉えました。
  • id:moritanian は2地点の経路問題と捉えました。

認識の違いがアルゴリズムの選択の違いとなり結果を大きく変えたのです。
この時点で結果が違うのは明白だったのです。

アルゴリズムってなんだろう

アルゴリズム(英: algorithm [ˈælgəˌrɪðəm])とは、数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。「算法」と訳されることもある。 「問題」はその「解」を持っているが、アルゴリズムは正しくその解を得るための具体的手順および根拠を与える。さらに多くの場合において効率性が重要となる。

アルゴリズムは仕事のやり方そのものです。
人間と同じで仕事のやり方が良いと速く成果を出せますが、
悪いといつまでたっても終わらない。
アルゴリズムの成果は処理時間で評価し、これをオーダーという式で表します。

おじさんの使ったアルゴリズムの場合は

t = O(2^n)

ですね。クソコードだ!とどやされるレベルです。
データが増えるほど処理時間も爆発的に増えていきます。

一方、最短経路アルゴリズムを使うと以下のようになります。

t = O(n log(n)) # ダイクストラ法の場合

データが増えてもさほど処理時間に影響はなさそうです。

選択するアルゴリズムが正しければ少しの力で大きな成果を出すことができます。
まるで梃子のようです。まさにイノベーションです。

最短経路アルゴリズムなんて使うことあるの?

おじさんは13年ほどIT界隈で働いてきましたが一度も使うことがありませんでした。
もしかしたら使える場面があったかもしれませんが、知らなくて困ったことはありませんでした。
これからも使う予定はありません。

しかし、だからといって知らなくていいということにはなりません。

カーナビや電車乗換なんかでは確実に使われているでしょうし、
ゲームでプレイヤーに向かってくる敵の動きでも使われていそうです。

今後これらの仕事をしないと言い切れますか?

未知に対する準備

やる気満々でプロジェクトにとりかかっている時に、仕事が続けられなくなってしまったことはないでしょうか。
ネットワークがつながらない!ハードウェアが故障した!他の人にたのんでいた仕事が上がってこない!

これらの原因の1つが準備不足です。

  • 僕はフロントエンドエンジニアだからネットワークのことは知らなくてもいいや。
  • 私はプログラマだからDBのチューニングは気にしないのよ。

という感じで自分の領域以外のことをないがしろにするようではプロとはいえません。 未知の問題が発生しても動じない、準備出来ているような人材こそがプロフェッショナルなのです。

準備不足のおじさんは

はい、まだまだアマチュアですね。 なので模範解答や出典元の解説、アルゴリズムクイックリファレンスを読んで勉強中です。がんばります。

こんなおじさんと働いていみよう

スプーキーズにはこんなおじさんや、おじさんを嫉妬させちゃうような若者が働いています。 さぁ、そこの君も一緒に働いてみようじゃないか。アルバイト・フリーランス・正社員など形態は問いません。

www.wantedly.com

アルゴリズムだけでなくいろいろな勉強会も行っています。

blog.spookies.co.jp

書籍紹介

冒頭のお題はこちらに掲載されています。

アルゴリズムの勉強をしたい方はこちら。

スプーキーズではこの本を元にアルゴリズムの勉強会を行っています。

おじさんの得た教訓

  • 問題を正しく認識する
  • 準備を怠らない
  • 勉強を続ける

ではみなさんごきげんよう。

今流行の自分を操る超集中力を読んだ感想-第一章-

皆さんこんにちは、読書家のいまもんです!

今回はこちらの本を読んだ感想を書きます。

自分を操る超集中力

自分を操る超集中力

第一章:集中力を自在に操る3つのルール

まず始めに、簡単にわかるように三行で内容を説明します。
・メンタリストdaigoが書いた自分の集中法を心理学も交えつつ記述されている。
・大体脳みその思い込みで解決できる。
・同じ意味合いのことが何度も記述されている(この本自体が印象操作でもしてるのでは?、と思うほど。)

「思考」や「感情」をコントロールする力を「ウィルパワー」といいます。
ウィルパワーは一定量で集中すると少しづつ減っていきます。その絶対値を延ばす方法を記述してるのが本書です



心理学的名称なんでしょうが、なぜか「コントロール」「パワー」という単語がでてくると宗教的に感じます。なぜでしょう。。。



ちなみにウィルパワーで検索すると、レーサーのウィル・パワーさんで埋め尽くされます。

ウィル・パワーさん f:id:spoo-imamoto:20160619024208j:plain



そんなことはさておき。
第一章では集中力を自在に操る3つのルールを紹介しています。

ルール1:ウィルパワーを鍛える方法

主に心理学の実験を紹介しながら理論立てて解説していきます。
簡単なものを一つ紹介すると、普段無意識にやっていることを意識的に操作する
これが一つの方法です。

例えば
椅子に座って猫背になっている背筋を常に延ばす。
貧乏揺すりを意識的にやめる。
など、自分の癖や習慣を意識的に操作することは非常に集中力を使います。
そのため筋トレと同じく何度も繰り返すうちに集中力の絶対値が増えていくわけです。

ルール2:ウィルパワーの使い方

人は長時間集中するのは不可能なのです。
充分にウィルパワーを鍛えてる人でも120分が限度と言われています。
しかし大抵の人は日中何かしら作業をしているでしょう、そうなるともっと長時間、集中力が続いて欲しいですよね。

そこで解決策として提案されているのが短い集中を繰り替えすことです!
解決の糸口はいかに休憩を取るか!なのです!
具体的な方法はネタバレになるかもしれないので書きませんが、筆者の感想としては「あー、なるほど確かに」ぐらいのイメージです。
もしかしたら既にやっている人も多いのではないでしょうか。

ルール3:疲れたとかただの思いこみだから死ぬ気でやれ

※あくまで、脳の疲労感です。リミッターでもあるので疲れた時は休みましょう。

プライミング効果をご存知でしょうか。

観念によって人の行動が変わる

という理論です。

つまり、人間は脳を守るため、ある程度のリミッターを設けています。
しかし普段からの習慣である程度リミッターの制御が可能なのです!
簡単な方法としては、自分がもっとも集中していると思った時の状況を記録しておき、常にその環境を再現すること。
これだけで成果が格段に上がります。

終わりに

この本に記述されている多くのことが、皆さんが既に知っている事だと思います。
何かの作業を途中でやめて後回しにするなとか、部屋が散らかっていると集中力も乱れるだとか、当たり前だと感じるでしょう。 しかしそれらを意識して生活するのとそうでないのでは大きな差があると言うことなのです。本書で伝えたいのはその部分だと感じました。

食生活と祝日と

 最近、日々の食生活に気をつけているモリタです。 一人暮らしは栄養が偏る、といわれるので、なるべく野菜と魚をとるようにしてます。 ここ最近は話題のスーパーフード、チアシードにはまっています。

f:id:moritanian:20160619020028p:plain

タピオカに似た触感で、かみつぶすのには小さいんだけれど、そのまま飲み込んでしまってはもったいない、なんて思いながら。 大学の午後の授業につかれてきたら、よくコンビニで買って飲んでます。

 ところで、今年から山の日という新しい祝日ができたことを知ってましたか?   以前、自作のアプリでカレンダーを表示する機能を追加する際に祝日について調べたりしたので、ここにまとめてみたいと思います。(祝日ネタはネットに割と落ちていますが。)

 まず、面倒なのは春分の日、秋分の日ですね。天文計算で先まで日にちが計算できますが、公式に決まるのは、前年2月付の官報です。しかしながら、ここ100年くらいであれば簡単な場合分けで求められるようです。

 もうひとつ、オセロのように祝日に挟まれた日は休みになるというやつ。その通りコードを書いたところ、無限ループに入ってしまいました...。 祝日でないある日、N日が祝日にはさまれているのか知りたいわけですが、前後のN-1日、N+1日が休みか知るためには、それらの前後の日が休日か知る必要がある、つまりN日が休みかどうか確定しないといけない、というわけで無限ループです。

実は、祝日といってるのは法律的に"国民の祝日"で、祝日に挟まれた日は"国民の祝日"ではなく、"国民の休日"であり区別されるようです。さきほどの文章も"国民の休日"を"休み"と誤魔化していました。

  というわけで無事無限ループを脱出して祝日+休日を求めることが出来ました!

 作ってから見つけたのですが、Google Calendar API で取得できるみたいです..。

qiita.com

まあ、オフラインでも使えるということで、計算する意味もあるかなと。  

 京都オフィスではフットサルをやるなど、体を動かすイベントがあるようですが、東京オフィスではこれまでみんなで運動をすることがありませんでした。そこで、ボルダリングをやってみようと声をかけていますが、未だ実現していません。以上、健康的食生活がモットーの、運動不足のモリタでした。

 

続・東京通信

初めまして、小原です。

東京オフィスのマネージャーとしてメンバーのタスク管理等の業務をメインに行っています。 マネージャーという肩書きですがまだまだ京都、東京オフィスのメンバーに助けられながら日々の業務を行っています。 (みなさんありがとうございまっす。)


spookiesにJOINしてまず驚かされたものが勉強会。 勉強会と聞くと少し肩苦しく聞こえてしまうかもしれないですが、 そんなもんでもなく、この技術面白いよね?どう思う!?そんな感じで各メンバーのhotなネタが共有される場。それが勉強会です。 ネタは、開発、技術的な話から、仕事の進め方、筋肉の話まで。。。

blog.spookies.co.jp


spookiesには週に一度普段とはまた違った角度から知的(?)なツボを刺激してくれる瞬間があります。すばらしいですね。


私は、他のメンバーとは少し異色でこれまでのバックグランウドがビジネスサイドよりです。 特に営業系だとノウハウが属人的になりがちで、あまり横のつながりでメンバー間で知識が共有されることってないんですよね。 だから一層この文化にはいいなぁって感じちゃうわけです。


すばらしいですね。もう一回言っちゃいます。

会社説明会 今週木曜日開催!!!

さてさて、前回の記事に告知されていますが、東京オフィス説明会あります。

www.wantedly.com

急募です。ご応募お待ちしております!!


全く関係ないですが写真は、京都オフィスへの出張の帰りに寄った嵐山の祇王寺です。 苔を愛でる年には早い気もしますが苔、、いい感じす。

f:id:Orihisoy:20160607163853j:plain

小原でした。

プログラマーのキャリアと野心と会社説明会

なにをしたいですか?

なにを幸せと感じますか?

どう生きたいですか?

f:id:rhymester19:20160524130357j:plain

普段あまり悩むこともない精神構造の西塚です。

暖かくなってきましたね。室内に篭ってプログラムばかりしている場合じゃないですね。ないですよ。

最近、思うことが重なったので、その話題を。

いきなり読んでない本の紹介

SOFT SKILLS ソフトウェア開発者の人生マニュアル

各地で話題になっていると思いますが、大変興味深そうな内容ですね。 Amazonさんが、近いうちに届けてくれるようです。

次々と新しい職種が増え、またどんどん淘汰が繰り返されている現代では、明確なキャリアプランが、昔より描き難くなっている気がします。 プログラマーのキャリア設計の一助になれば。(←まだ読んでない)

野心のすすめ

林真理子さんの「野心のすすめ」

妻に勧められて、昨今の草食ブームをバッサリと。 現代での野心の上手な持ち方について、現代人に発破をかけているので、奮起したい人は是非。

スプーキーズ会社説明会 in 東京 6/9(木) 開催予定

本題。会社説明会(東京:渋谷)を開きます。 ガラガラです。急募。

株式会社スプーキーズ

www.wantedly.com

持ち物、事前準備について

「気軽な気持ちで、覚悟して来い」

スプーキーズでは、バイト、契約社員、社員等の契約形態で、業務内容(特にプログラムなどの開発業務)は、全く変わりません。

優秀であれば、難易度の高いものをやってもらいますし、仕事量も多くなっていきます。成果は残るし、スキルもあがる、皆からの信頼もあがるし、自信もつくでしょう。 逆に、出来なければ、難易度の低いものをやってもらい、仕事量も少なくなっていきます。成果は残らないし、スキルもあがらない、皆からの信頼も失っていくし、自信もなくなっていくでしょう。

少人数で、且つすべての業務をチケット管理しているので、誰がどれくらい成果を残しているかもある程度把握が可能です。

勝手にもがき苦しみ、最後は逃げるという結末は、どちらにも遺恨を残します。スプーキーズで働くことは人生の一部にはなりうるけれども、全てではありません。

自分に向いていないな(業界でも、スプーキーズでも)と思ったら、さっと諦める勇気も時には必要です。

思っているより華やかな業界ではないし、恐れるほど不幸な業界でもない。 思ったより楽しめてない人もいるし、笑いが止まらないぐらい面白いと思う人もいる。

どの業界、仕事でも同じこと。

伝聞により想像した景色と、外から見た景色、中から見た景色、さらに奥に入った時の景色、下から見上げた景色と、上から見下ろした景色、更に雲の上の景色。

どれも見え方は違うし、感じ方も変わってくる。

チャレンジはして欲しい。 やらずに後悔より、やって後悔の方が良い。 興味があるなら、まずは体感して欲しい。

誰もが、得意なこと、好きなことを、時間を忘れるくらい没頭することを仕事にして欲しい。そして、良き仲間とやって欲しい。 そう願ってやまないのです。

f:id:rhymester19:20160523131121j:plain

さぁ、5時だ。ログボを受け取ろう!