スプーキーズの中の人。

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

月間スプーキーズ

こんにちは、7月になりましたね。
京都では祇園祭が始まり、「コンチキチン」の祇園囃子の音色が心地よく響いておりますが皆さんいかがお過ごしでしょうか? 今年は梅雨らしく雨がしっかり降っておりますが、夏は夏らしく暑くなるのでしょうか。

さて、弊社のこの1ヶ月のイベントを誰得?情報としてお伝えしたいと思います。

フットサル

プログラマーも外で運動せねばということで、年に数回のペースで実施してたのですが、ここ2年程やってませんでした。 久しぶりに、いつもの フットサルスクエア京都南 さんでコートを借りて実施しました。

初心者ばかりなので

  • 1チーム5人でやるミニサッカーのようなもの
  • スローインはなく、キックインだよ
  • オフサイドはないよ

のような説明をしながら、 「怪我だけはするなよー」と言って開始します。

f:id:spookies-nishimura:20160704022827j:plain

いつもどおり他の企業さんも誘ってみたのですが今回は都合がつかず、 アルバイトメンバーが友達を連れて来てくれて、なんとか10人(=2チーム。誰一人離脱できない・・)。

  • 1試合7分
  • 休憩1〜2分

というハードな2時間を過ごしました。

20代は流石に元気で、休憩時間も元気に走り回ってましたが、 わたくしはもちろん足がつりましたYO。 産まれたての子鹿ちゃんでしたYO。

f:id:spookies-nishimura:20160704022833j:plain

これからは数ヶ月に1回やる予定ですので、京都の企業様、是非一緒に汗を流しませんか!!

若手合宿

ここ数年で若手メンバーが着実に成長してくれております。 そんな若手だけが京都・東京から集まり、日本を代表するリゾート地「熱海」に合宿に行きました。

なぜ熱海なのか、若人は熱海で何をしたのか。そのあたりのレポートは、また後日。 f:id:spookies-nishimura:20160704024201j:plain ※激しくピンぼけ

末金会

月末の金曜に飲みに行く会(前職で使われていたキャッチーなネーミングをパクリ)なんですが、 なんとネーミング無視で月の初めの金曜に行いました。

普段からオフィスで業務以外の事も話してはいるのですが、 こういった場を設けることで改めてメンバーの意外な一面を知ることが出来てとても楽しいです。

今回は都合がつかず参加出来なかったメンバーもいたのですが、基本的には全員+OBも含めてワイワイと。 ボードゲームを持ち込んで遊んだりもしています。

f:id:spookies-nishimura:20160704023447j:plain

まとめ

この1ヶ月で目立った行事としては以上ですが、
それ以外にも毎週開催してる改善ミーティングで、 業務やオフィス環境の問題点、福利厚生案などを各メンバーから出してもらってます。

細かいところで

  • レイアウト変更
  • 備品の充実
  • 形骸化したミーティングの改善

など。

お仕事なので楽しいことばかりではありません。 その他で改善できる箇所はとりあえずはやってみよう精神で実行できればと思っております。

以上、不定期な月間スプーキーズでした。

Hello VMWorld!!

f:id:furuhashi1346:20160701103055p:plain

Hello World.

ブログでははじめまして!

東京オフィスに3週間前に入ったアルバイトの古橋と申します.

大学に入って4年勉強していますが,まだまだ未熟者なプログラマーです.

さてさて,書くこともないので私の最近興味あることについて書いていきます.

It's VM Machine!

ずばり,仮想マシンについてです.

仮想化技術といってもいろいろありますが,私はVMマシンについて興味があります.

まずはかなり低レイヤーのことについて書いていきます.

0,1の羅列が嫌いな方はここで回れ右するのが賢明だと思います(笑)

アーキテクチャはVAXでやっていきます.

ってことでまずはVAXの特徴について説明していきます!

About VAX

VAXはVirtual Address eXtensionのことで、32bitの仮想アドレスを使用しています.

仮想アドレスなので,実際のアドレスを指しておらず,オペレーティングシステムの制御のもとでプロセッサによってメインメモリにアクセスします.

なので,メインメモリをより効率的に制御することができます.

VAXは基本,6種類のデータタイプを扱います.

データタイプ サイズ
バイト 8bit
ワード 16bit
ロングワード 32bit
クォドワード 64bit
オクタワード 128bit
浮動小数点 32~128bit

これに符合ありかなしか,また浮動小数点にも4種類あり,パック10進数か,...など,細かくすると色々あります!

レジスタの使い方にも種類があり,レジスタモードとアドレシングモードに分かれます.

汎用レジスタは32bitが16個用意されています.

そして,アドレシングモード…これが肝です!

肝と言いましたが,なかなか複雑なので後々説明するかもです.

Decryption of the source code

はい,もう細々言っても伝わりづらいと思うんで面白いことしましょうか.

ソースコードをDisAssembleしましょう.

みなさん,アセンブラ好きですか?私は大好きです.(錯乱)

みなさん,バイナリ読むのは好きですか?私は大好きです.(錯乱)×2

では解析してみましょう.

こちらアセンブラ言語で書かれたものです.

  1:  .globl _main
  2:  _main: .word 0
  3:
  4:  pushl $6
  5:  pushl $hello
  6:  pushl $1
  7:  calls $3, _write
  8:
  9:  pushl $0
10:  calls $1, _exit
11:
12:  hello: .byte 'h, 'e, 'l, 'l, 'o, 10

上のところはいいとして,これの解説いきます.

まずは4~7についてです.

これはwrite関数を呼んでいます.

pushlで引数を格納しています.pushlはpush longwordの略です.

つまり,書き換えると,write(6, hello, 1)です.

callsの3はwriteの番号のことです.これはどこかのファイルに定義されています.

9,10はexit()を呼んでいます.つまり終了です.

ほとんどの人はわかってると思いますが,これ,helloって出力してるだけです.

Let's analyze

これをバイナリにしてみましょ〜DON!

0000000 : 08 01 00 00 8C 00 00 00 04 00 00 00 04 00 00 00 
0000010 : 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000020 : 00 00 C2 08 5E D0 AE 08 6E 9E AE 0C 50 D0 50 AE 
0000030 : 04 D5 80 12 FC D1 50 BE 04 19 02 D5 70 D0 50 AE 
0000040 : 08 D0 50 EF D8 01 00 00 FB 03 EF 0D 00 00 00 DD 
0000050 : 50 FB 01 EF 28 00 00 00 BC 01 00 00 00 00 DD 06 
0000060 : DD 8F 58 00 00 00 DD 01 FB 03 EF 21 00 00 00 DD 
0000070 : 00 FB 01 EF 08 00 00 00 68 65 6C 6C 6F 0A 00 00 
0000080 : 00 00 FB 00 EF 03 00 00 00 BC 01 00 00 00 04 00 
0000090 : 00 00 BC 04 1E 06 17 EF 04 00 00 00 04 00 00 00 
00000A0 : D0 50 EF 7D 01 00 00 CE 01 50 04 00 00 00 00 00 
00000B0 : 63 72 74 30 2E 6F 00 00 04 00 00 00 00 00 00 00 
00000C0 : 65 78 69 74 00 00 00 00 02 00 00 00 01 00 00 00 
00000D0 : 68 65 6C 6C 6F 32 2E 6F 04 00 00 00 3C 00 00 00 
00000E0 : 68 65 6C 6C 6F 00 00 00 04 00 00 00 58 00 00 00 
00000F0 : 65 78 69 74 2E 6F 00 00 04 00 00 00 60 00 00 00 
0000100 : 63 6C 65 61 6E 75 70 2E 04 00 95 01 6C 00 00 00 
0000110 : 77 72 69 74 65 2E 6F 00 04 00 95 01 70 00 00 00 
0000120 : 63 65 72 72 6F 72 2E 6F 04 00 49 02 80 00 00 00 
0000130 : 5F 65 78 69 74 00 00 00 05 00 28 03 60 00 00 00 
0000140 : 73 74 61 72 74 00 00 00 05 00 AB 01 00 00 00 00 
0000150 : 5F 6D 61 69 6E 00 00 00 05 00 18 02 3C 00 00 00 
0000160 : 5F 65 6E 76 69 72 6F 6E 07 00 25 01 00 02 00 00 
0000170 : 5F 77 72 69 74 65 00 00 05 00 2D 04 70 00 00 00 
0000180 : 5F 5F 63 6C 65 61 6E 75 05 00 95 01 6C 00 00 00 
0000190 : 63 65 72 72 6F 72 00 00 05 00 49 02 80 00 00 00 
00001A0 : 5F 65 72 72 6E 6F 00 00 09 00 35 00 04 02 00 00 

わ〜きれい(棒)

最初の方にheaderと呼ばれるコードの情報が書かれているのでこれを解析します.

 MAGIC : 0x00000108
  TEXT : 0x0000008C
  DATA : 0x00000004
   BSS : 0x00000004
  SYMS : 0x00000100
 ENTRY : 0x00000000
TRSIZE : 0x00000000
DRSIZE : 0x00000000

これにより,TEXTデータは0x8Cの長さってことがわかります.

ってことは,TEXTデータは以下のようになります.

*** memorytext ***
00 00 C2 08 5E D0 AE 08 6E 9E AE 0C 50 D0 50 AE 
04 D5 80 12 FC D1 50 BE 04 19 02 D5 70 D0 50 AE 
08 D0 50 EF D8 01 00 00 FB 03 EF 0D 00 00 00 DD 
50 FB 01 EF 28 00 00 00 BC 01 00 00 00 00 DD 06 
DD 8F 58 00 00 00 DD 01 FB 03 EF 21 00 00 00 DD 
00 FB 01 EF 08 00 00 00 68 65 6C 6C 6F 0A 00 00 
00 00 FB 00 EF 03 00 00 00 BC 01 00 00 00 04 00 
00 00 BC 04 1E 06 17 EF 04 00 00 00 04 00 00 00 
D0 50 EF 7D 01 00 00 CE 01 50 04 00 

ここにたくさんのじょうほうがかきこまれています.

これをさらにかいせきします.

***
pc : 00000000 textBuf[pc] : 00
HALT
***
pc : 00000001 textBuf[pc] : 00
HALT
***
pc : 00000002 textBuf[pc] : C2
SUBL2
レジスタモード
val1 : 8
Register : SP val2 : FFFFB
setValue : FFFF3
***
pc : 00000005 textBuf[pc] : D0
MOVL
バイトディスプレイメント
ope.setVal(memory.readMemory(FFFFB, 4))
Register : SP
readVal : 0
レジスタディファードモード
mov val : 0
writeMemory(FFFF3, 0, 4)
***
pc : 00000009 textBuf[pc] : 9E
MOVAB
バイトディスプレイメント
ope.setVal(memory.readMemory(FFFFF, 1))
Register : SP
readVal : 0
レジスタモード
val1 : FFFFF
R0 val : FFFFF
***
pc : 0000000D textBuf[pc] : D0
MOVL
レジスタモード
バイトディスプレイメント
ope.setVal(memory.readMemory(FFFF7, 4))
Register : SP
readVal : 0
mov val : FFFFF
writeMemory(FFFF7, FFFFF, 4)
***
pc : 00000011 textBuf[pc] : D5
TSTL
Inc val : 4
val : FFFFF
val1 : FFFFF
N : FALSE,Z : FALSE,V : FALSE,C : FALSE
***
pc : 00000013 textBuf[pc] : 12
BNEQ
PC : 13
val : 11
val1 : 11
BName BNEQ
***
pc : 00000015 textBuf[pc] : D1
CMPL
レジスタモード
addr : FFFF7 val : FFFFF
val1 : FFFFF  val2 : 0
***
pc : 00000019 textBuf[pc] : 19
BLSS
PC : 19
val : 1D
val1 : 1D
BName BLSS
***
pc : 0000001B textBuf[pc] : D5
TSTL
オートデクリメント
addr : FFFFB
val : 0
val1 : 0
N : FALSE,Z : TRUE,V : FALSE,C : FALSE
***
pc : 0000001D textBuf[pc] : D0
MOVL
レジスタモード
バイトディスプレイメント
ope.setVal(memory.readMemory(FFFFB, 4))
Register : SP
readVal : 0
mov val : FFFFF
writeMemory(FFFFB, FFFFF, 4)
***
pc : 00000021 textBuf[pc] : D0
MOVL
レジスタモード
ロングリラティブディファード
addr : 200
val : 0
mov val : FFFFF
***
pc : 00000028 textBuf[pc] : FB
CALLS
ロングリラティブディファード
addr : 3C
val : 0
calls
val1 : 3
val2 : 3C
val : FFFEF
last : 3
entryMask : 0
nextPC : 2F
maskInfo : E0000000
PC : 3E
***
pc : 0000003E textBuf[pc] : DD
PUSHL
val1 : 6
***
pc : 00000040 textBuf[pc] : DD
PUSHL
val1 : 58
***
pc : 00000046 textBuf[pc] : DD
PUSHL
val1 : 1
***
pc : 00000048 textBuf[pc] : FB
CALLS
ロングリラティブディファード
addr : 70
val : 0
calls
val1 : 3
val2 : 70
val : FFFC8
last : 0
entryMask : 0
nextPC : 4F
maskInfo : 20000000
PC : 72
***
pc : 00000072 textBuf[pc] : BC
CHMK
val : 4
index : FFFC8
dataNum : 3 index : FFFC8
index : FFFCC
dataNum : 1 index : FFFCC
index : FFFD0
dataNum : 58 index : FFFD0
index : FFFD4
dataNum : 6 index : FFFD4
ap : 000FFFC8 val1 : 3, val2 : 1, val3 : 58 val4 : 6
write(1, 0x58, 6)
sysWrite
hello
len : 6
R0 : 6
***
pc : 00000074 textBuf[pc] : 1E
BCC
PC : 74
val : 7C
val1 : 7C
BName BCC
C = false
***
pc : 0000007C textBuf[pc] : 04
RET
***
pc : 0000004F textBuf[pc] : DD
PUSHL
val1 : 0
***
pc : 00000051 textBuf[pc] : FB
CALLS
ロングリラティブディファード
addr : 60
val : 0
calls
val1 : 1
val2 : 60
val : FFFC0
last : 0
entryMask : 0
nextPC : 58
maskInfo : 20000000
PC : 62
***
pc : 00000062 textBuf[pc] : FB
CALLS
ロングリラティブディファード
addr : 6C
val : 0
calls
val1 : 0
val2 : 6C
val : FFFA8
last : 0
entryMask : 0
nextPC : 69
maskInfo : 20000000
PC : 6E
***
pc : 0000006E textBuf[pc] : 04
RET
***
pc : 00000069 textBuf[pc] : BC
CHMK
val : 1
index : FFFC0
dataNum : 1 index : FFFC0
index : FFFC4
dataNum : 0 index : FFFC4
exit(0)

一つ一つ説明していきます.

その前に…PCとはプログラムカウンタのことでこの値の番地の命令が行われます.

これを操作することでifとかjumpとかやるわけです.

上から見てみましょう.

  • halt : 特に何もしません.実際はやってますが初期化みたいなものです.

  • subl2 : longwordの引数を2つ取ってきて引き算します.

  • movab : byteのアドレスの引数を二つ取ってきて第一引数のアドレスの内容を第二引数のアドレスに格納します.

  • movl : longwordの引数を2つ取ってきて第一引数に第二引数を格納します.

  • tstl : longwordの引数を持ってきて,それによって条件を付与します.0ならZフラグをtrueにマイナスならNフラグをtrueにしたりします.

  • bneq : branch on not equal の略で,Zフラグがtrueなら引数の番地にジャンプします.

  • cmpl : 第一引数と第二引数を引き算して,0ならZフラグをtrueにマイナスならNフラグをtrueにしたりします.

  • blss : Branch on lessの略で,Nフラグがtrueなら引数の番地にジャンプします.

  • calls : カーネルモードに移行して関数を実行します.いろいろやってて読み解くのが難しいです.

  • ret : callsで保存した内容を元に戻します.関数を実行する前の状態に戻すと言ったほうが正しいですかね.

  • pushl : longwordの引数を持ってきて,スタックにプッシュします.

  • chmk : カーネルモードに移行します.これの引数によって実行する関数が違います.4の場合はwrite,1の場合はexitです.

  • bcc : Branch on Carry Clearの略で,Cフラグ(キャリーフラグ)がtrueの時に引数の番地にジャンプします.


あんな短かったコードでもこんなことやってるんです!

複雑でしょ?うん,でもこれ理解できるとかなり面白いんです.

面白いんです!

ってことでこれを解説出来る機会があればいいな…

これが面白そうって思った人は私と同じ人種です!

では,中途半端ですが,See you next time!

最近のオススメの漫画

こんにちは

東京オフィスの塚本です.
最近は暑くなったり雨が降ったりと,初夏なのか梅雨なのかわからないような天気が続いていますね.
そんな中,近頃ハマっている作業用BGMはGReeeNです.いい感じに懐かしくて非常に良いです.

最近オススメの漫画

そうそう,最近すっかりある漫画にハマってしまっています.

それは...

キングダムですね!!!

あらすじをさらっと紹介すると,春秋戦国時代,秦の下僕だった少年・信がひょんなことから武将になり, 数々の戦で軍功を立てながら,中華一の大将軍を目指していく物語です.

どこが好きかというと,思いっきりドラゴンボールっぽいところが好きです.
あまり頭を使わずに,
信が強くなる→もっと強いのが出てくる→信がピンチになる→味方が助ける or 信がさらに覚醒する→信が武功を上げる→・・・(繰り返し)
という少年マンガ伝統のインフレストーリーなのです.

ちなみに僕は "もうてん" というキャラが飄々としていて好きです.

今までスプーキーズと全く関係のない話でしたが,実はオフィスにこのキングダムが置いてあるのです!(どーん)

f:id:TKei:20160622225756j:plain
現在,24巻まで.続きは京都オフィスに.

これを読んでプログラミングだけでなく,中国の歴史についても知識を深めていきたいですね!
そんなわけで,最近また東京でも京都でも新しいメンバーがJOINしましたので,
より一段と圧倒的成長をしてスプーキーズを盛り上げていきたいと思います!宜しくお願い致します!

最後に

なにやら最近面白いゲームがあるみたいですよ!

www.mbga.jp

歯磨きじょうずかな?

f:id:maekawaspookies:20160622163200j:plain ブログでは初めまして、現在京都本社の方で、デザイナーとして働いている前川和也と申します。 本日6月22日をもって、36歳の誕生日を迎えることになりました。 ということもあり最近思っていることを書かせていただきます。

みなさんご自分の歯について日常生活の中で気をつけていることはありますか? こちらの会社で勤め始めてから、昼食後、歯を磨くのですが他社員の方のそういった光景は見受けられません。 私は社内唯一の喫煙者で、昔、結構歯磨きを適当にやっていた時期があったので、気がついてみれば歯の裏側のヤニ汚れや、 歯周ポケットの落ち込みなどが目立つようになりました。心配になって、歯のクリーニングも兼ねて歯医者に通うようになり、 歯科技師さんに歯を見せると、『あなたの歯磨き度は20点(ぐらいだったと思う)』という内容の用紙をわたされました。 いくら適当にやってるとはいえ、そこまで低いかとおもい、それから私の歯磨き維新が起きました。

現在もやってますが、思いついたのが、 まず、口に水を含みます。そのまま歯ブラシを突っ込んで磨くというやり方。 人の体も風呂に入って汚れを落とす、衣類も洗濯機を使って水流の中で汚れを落とす、というところからヒントを得ました。 私的にはかなり有効的と感じており、歯垢汚れも前よりぐんと落ちたように感じてます。 名付けるならサイクロン磨き。まあ名付けたところで二度とこの名を使う機会はないでしょうが。後日歯医者さんでも サイクロン磨きの有効性をプレゼンしたのですが、 「お前は何を言っているんだ。」 という感じでした。この技の有効性を信じるか信じないかはあなた次第、ということで。 口の中の水を一旦吐き出して、あとはみなさんと同じように歯磨き粉をつけて、磨くだけ。

ただ、努力するだけ努力してもその歯医者さんでは、最高で40~50点くらいしかもらえなかったと記憶しています。 『世の中には自分などにははるかに届かない、歯磨き界の猛者がいやがるのか、、、、』と恐れおののいたものです。 朱雀、玄武、白虎、青竜の歯磨き四天王とか、、ヨーダ的な歯磨き仙人とか、、、サウザー的な歯磨き皇帝とか、、強くなっても強くなっても次週には戦闘能力一桁上回る敵が現れる、読者を飽きさせない少年ジャンプ方式。未曾有の奥深さ、もしくは、はるかな高みを感じたものです。

皆さんも歯をご自愛ください。

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

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

書籍紹介

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

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

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

おじさんの得た教訓

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

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