ニコ技深圳観察会用自己紹介文(竹迫良範)

1. 自己紹介

竹迫良範です。2017年4月のニコ技深圳観察会に参加した平野さんの会社の上司の上司にあたる管理職40才です。平野さんには会社のブログで長編の5つの記事を書いていただき圧倒的感謝です。

tech.recruit-mp.co.jp

元々は大量のトラフィックを捌く職業Perlプログラマーでしたが、セキュリティ技術のR&Dと新規事業開発を経験し、現在は日本の大企業における内製開発の組織作りを担当しています。現代社会は高度に専門分化された職務がありますが、ブラックボックスを次々と開けていく低レイヤー技術を身に付けつつも、雑多な仕事も何でも一度は自分の手でやってみて経験してみることをモットーに職務の深さと幅を広げてきました。

2. 何を仕事にしてるか

普段は上場企業R社のIHD担当(大企業におけるインハウス・内製開発組織構築)の専門役員として、100名規模のエンジニア・デザイナー・プロダクトマネージャーの組織作りとマネージメントを担当しています。兼業先の一つとして、IPAで未踏IT人材発掘・育成事業のプロジェクトマネージャーも兼務しており、25歳未満のアントレプレナーシップを持った若いITエンジニアの個人プロジェクトの立ち上げ支援を行なっています。担当分野はセキュリティと低レイヤー案件です。新規事業の0→1においてハードウェアのプロトタイプやモックアップを気軽に作れる環境は日本でも整ってきましたが、1→10のフェーズで事業拡大する段階になったときにどうやって量産するのかといったノウハウの有無に大きなギャップを感じています。全部を一国一企業の自前主義にこだわることなく、それぞれが得意な領域を持つパートナー同士でコラボレーションしていくようなやり方を深センで学びたいと思っています。

3. 自分の時間で何を作ってるか

2006年にセキュリティキャンプで講師をすることになったことがきっかけで、若者向けのセキュリティ演習教材を趣味の余暇の時間で作っています。国立高等専門学校機構 高知工業高等専門学校(高知高専)の客員准教授も兼務しており、セキュリティ素養を持ったモノづくり人材を育成するため、高専生向けのセキュリティSTEM教材を試作しています。今年度は、全国の高専を巡るキャラバン隊の一員として、高知高専石川高専、阿南高専鈴鹿高専、弓削商船高専、都立産技高専などでIoTセキュリティ演習を実施しています。

tech.recruit-mp.co.jp

私が自作した教材の中では、5Vで動作する50円のAVRマイコンのGPIO端子をON/OFFし、高速にLチカすることで、10kHzでPS/2の疑似キーボード信号を生成し、自分オリジナルのBadUSBを製作してみるという自作演習が一番人気です。当初、第1世代のキットでは純正のAVRライターAVRISP mkIIを使っていましたが、1個3,200円と高価だったため、演習後に機材一式を持ち帰って自己学習することができませんでした。そこで、格安のAVRライターを低コストで自作することを決意し、第2世代のキットとして、FTDI社FT232RLチップを搭載した1個250円のUSBシリアルの格安公板をeBayやAliExpressで中国から大量輸入してavrdudeが動作するようにlibftdiのパッチを書いて使っていました。演習で必須だったAVRライターのコストが1/10以下になり、部品リストの低価格化を実現することができ、演習後に各自ライターを持ち帰って自己学習を継続することができるようになりました。ただ、中国から輸入したUSBシリアルの格安公板は30個のうち1~3個ほど通電するが実際に通信できない不良品のチップに当たることが多く、演習時にハード不良によるトラブルシュートに時間をとられるようになってしまいました。純正のWindowsドライバでも動かないケースがあったため、パッチを当てたドライバやチップの各種設定、クロスコンパイラを同梱したAlpine LinuxのAPKBUILDパッケージを自作して公開しています。

GitHub - takesako/alpine-iot: Alpine Linux packages for IoT tools

現在は、更なる部品リストの低価格化を進めるべく、各社USBシリアルの格安公板を買い漁り、安定した品質と低価格が実現できるチップと公板を探しました。試行錯誤の結果、第3世代として、Silicon Labs社のCP210xチップを搭載した1個150円の格安公板が良さそうということがわかったのですが、avrdudeで使うためには基板のカスタマイズが必要で、半田付けの作業が必要なため、アセンブリの作業を頑張って内製でやるか、コストをかけて外製でやるか、腹決めするために、深センの様々な現場に行って空気を感じたいと思っています。2017年11月にPicoDuinoが欲しくなり、初めてtindieでオンラインの買い物をした際、Slovakia在住の売り手の人とメッセージのやり取りをした経験がきっかけで、自作ハードウェアの国家間の距離は急速に縮まり、変わってきていると実感しました。

gigazine.net

4. 中国経験など

台湾×5回、上海×2回、香港×1回の渡航経験があります。深センは未経験です。中国ではガイドブック片手に一人で行動ができます。大学では第二外国語として中国語を7年間勉強しました。私自身、語学が非常に苦手で、単位がとれるまで繰り返し何年も同じ先生の中国語の授業を受けていたというのが実態ですので、ボキャブラリーは豊富ではありません。発音については先生に厳しく指導されたため、ピンイン表記があれば中国語の四声を正しく発音できます。北京の標準語の教科書で勉強していたため、簡体字繁体字に読み替えることができます。日常会話は、英語も中国語も日本語も聞き取りが非常に苦手で…、何度も聞き直すことがあります。

台湾のカンファレンスでは、セキュリティ技術に関する国際発表を3回ほど行ないました。

  • 2010年 OSDC.tw 2010「Polyglot Programming and Web Security」
  • 2011年 OSDC.tw 2011「x86 ASCII Programming (16bit/32bit)」
  • 2011年 HITCON 2011 Hacks in Taiwan Conference「Disassemble Flash Lite 3.0 SWF File」

5. メイカーズのエコシステム ハードウェアのシリコンバレー深圳感想

日本の大企業の中で新規事業開発の部署をどのように作るかといった苦労が垣間見れる「つくる~む新横」を立ち上げたリコーの井内さん寄稿の記事が非常に心に刺さりました。ブルーカラーは製造原価算入、ホワイトカラーは販売管理費と、中国の会計基準に関する記述についても惜しみなく藤岡さんが触れているのが興味深かったです。アントレプレナーシップを持ちながらも、オーナーシップを持ち、業務プロセスの末端までコンプリート出来る経営者は私のロールモデルです。

単純作業を自動化して人類の無駄な時間をなくそう

このエントリーは Recruit Engineers Advent Calendar の 5日目の記事です。

www.adventar.org

目次

  1. 自己紹介
  2. 時間は有限、大切に使おう
  3. sshで30台のサーバをセットアップする
  4. expect コマンドを使おう
  5. StrictHostKeyChecking no
  6. chpasswdでパスワード設定
  7. chmod u+sとSUID
  8. seqコマンドとbash拡張構文{1..9}
  9. Excel業務を自動化しよう
  10. Win32::GuiTest でキーボード入力を自動化
  11. MouseMoveAbsPix でマウス操作を自動化
  12. マインスイーパーの自動化
  13. BadUSBによるキーボード入力の自動化
  14. まとめ

1. 自己紹介

@takesakoです。最近、まつもとゆきひろさんと岸川克己さんが技術フェローと技術顧問に就任した会社で専門役員を担当しています。 会社ではホールディングス兼務10%の傍ら、事業会社のプロダクト開発部部長、デザイングループと開発支援グループの2つのグループマネージャを兼務し、現在約70名の内製開発組織の体制構築と運営を行なっています。 会社では兼業申請により副業も認められていて、今年度は、独立行政法人2社、NPO法人1社、一般社団法人1社、公立大学法人1社、2省庁、1協議会の事業を掛け持ちしながら複数プロジェクトの進行と通常業務を並行して行なっています。現代人にとって、時間の管理と有効活用は非常に重要な課題です。

2. 時間は有限、大切に使おう

私はエンジニアですので、単純な作業はできるだけプログラムで自動化するコードを書いて、時間を生み出すようにしています。 このエントリーでは、新しくはないが、古くから使われているUNIXの素朴な技を使うことによって、地味な作業を自動化する温故知新なTIPSを紹介してみます。

3. sshで30台のサーバをセットアップする

さて、いきなり30台のLinuxサーバをセットアップする仕事が来たとします。最近はイメージのコピーで複数のサーバをセットアップできるクラウド環境が整っているため、コピー元の基本となるサーバのイメージをベースに30台のサーバに環境をコピーして作業するのが良いのですが、まとめて複数台のサーバへのコマンド実行をしたいことがあります。

まずはコピー元のオリジナルのサーバを用意し、ssh-keygenでssh秘密鍵と公開鍵のペアを作成し、公開鍵を~/.ssh/authorized_keysに追記し、ファイルのパーミッションを600にします。このユーザー名をvi /etc/sudoers で追記し、sudoできる権限にしておきます。コントローラーのサーバには秘密鍵を置き、コピー元のサーバには公開鍵のみを配置します。そして、コントローラーのサーバからsshでログインして各種セットアップを遠隔から行ないます。

4. expect コマンドを使おう

ssh で初回接続時に、~/.ssh/known_hosts に接続先sshサーバのフィンガープリントを記録するかどうか yes/no を答える場面がでてきます。

$ ssh 10.0.0.xx
The authenticity of host '10.0.0.xx (10.0.0.xx)' can't be established.
RSA key fingerprint is ff:ff:ff:ff:37:83:d8:c5:7a:56:72:c6:48:30:b3:7c.
Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '10.0.0.xx' (RSA) to the list of known hosts.

この yes の入力を手で毎回やるのは面倒なので、expect コマンドで自動化してしまいましょう。

#!/bin/sh
for xx in `seq 10 39`; do
  expect -c "
    set timeout 3
    spawn ssh 10.0.0.$xx
    expect \"yes/no\" { send \"yes\n\" }
    expect \":~\" { send \"exit\n\" }
    exit
  "
done

IPアドレス、10.0.0.10~39の30台のサーバに対して実行した様子です:

5. StrictHostKeyChecking no

実は、sshクライアントの接続オプションで -o 'StrictHostKeyChecking no' を指定すると、yes/noの判断を無視して常に接続することができます。

$ ssh -o 'StrictHostKeyChecking no' 10.0.0.xx

また、~/.ssh/config で「StrictHostKeyChecking no」の行を追加すると常にその設定を有効にすることができます。

$ vi ~/.ssh/config

StrictHostKeyChecking no

ただ、DNSスプーフィングなどで違うサーバに誘導されたりしたときにリスクがありますので、この設定は正直あまりお勧めできません。自己責任でご利用ください。

6. chpasswdでパスワード設定

まとめて30台のサーバのログインパスワードを設定して各ユーザに配布するシチュエーションに遭遇した場合、chpasswdコマンドを活用しましょう。

echo 'username:passw0rd' | sudo chpasswd

タブ区切りで用意した各ログイン配布情報を元にssh経由で各サーバで実行するシェルスクリプトPerlで自動生成します。

#!/usr/bin/perl
print<<EOF;
#!/bin/sh
EOF
$_ = <DATA>;
while(<DATA>) {
  chomp;
  my ($NO, $IP, $USER, $PASS) = split /\t/, $_;
  print "ssh $IP echo '$USER:\Q$PASS\E' \\| sudo chpasswd\n";
}
__DATA__
No IPアドレス  ユーザー名 パスワード
1  10.0.0.10   username    P@ssw0rd111
2  10.0.0.11   username    p!ssw1rd222
3  10.0.0.12   username    p#ssw2rd333

上記プログラムを実行すると、以下のシェルスクリプトが生成されます。Perlの文字列中に\Qと\Eで変数をはさむことにより、変数中の記号が自動でシェルエスケープされます。

#!/bin/sh
ssh 10.0.0.10 echo 'username:P\@ssw0rd111' \| sudo chpasswd
ssh 10.0.0.11 echo 'username:p\!ssw1rd222' \| sudo chpasswd
ssh 10.0.0.12 echo 'username:p\#ssw2rd333' \| sudo chpasswd

sudoの前の'|'は、sshログイン後に実行したいため、'\|'としておく必要があります。\でエスケープしないと手元のsshコマンドを実行しているサーバ上で実行されてしまいます。エスケープを注意するのはUNIXらしいですね。

ただし、今回の手法ではechoコマンドで生のパスワードを表示しているため、.bash_historyにパスワードの履歴が残りますので、sshターミナルからコピペできる手軽さの反面、セキュリティは低下しますので、ご注意ください。

7. chmod u+sとSUID

30台のサーバでsudo chmod u+s /bin/dateを実行して、dateコマンドにもSUID(SET UID)ビットを付けたいシチュエーションがあるとします。

SUIDはUNIXのファイルアクセス権限の一つで、ファイルのオーナー権限で一般ユーザがコマンドを実行できる仕組みです。SUIDがデフォルトでついているコマンドはpasswdが代表例で、root権限がなくてもユーザ権限でパスワード変更できるようになっています。

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 23420 Aug 11  2010 /usr/bin/passwd

dateコマンドにもSUIDビットをつけて、時刻の変更をユーザ権限で行ないたいというシチュエーションです。

8. seqコマンドとbash拡張構文{1..9}

シェルで繰り返し実行するfor in文ではスペース区切りで繰り返し変数の値を指定します。

#!/bin/sh
for xx in 10 11 12 13 14; do ssh 10.0.0.$xx sudo chmod u+s /bin/date ; done

連番の数字を全部手で入力するのは面倒なので、seqコマンドの結果をバッククォートでinに渡す方法が古くから知られています。

#!/bin/sh
for xx in `seq 10 39`; do ssh 10.0.0.$xx sudo chmod u+s /bin/date ; done

最近のbashでは、`seq 10 39`相当のことが、{10..39}で書けるので、地味に便利です。bashの拡張記法わかりやすくて良いですね。

#!/bin/bash
for xx in {10..39}; do ssh 10.0.0.$xx sudo chmod u+s /bin/date ; done

9. Excel業務を自動化しよう

今度は、ちょっとテイストが変わって、外部の方とExcel方眼紙のファイルをやりとりする場合、以下のような定型項目の入力は自動化しておきます。

f:id:TAKESAKO:20161206013030p:plain

WindowsにActivePerlをインストールしておくとWin32::OLEが使えるので、現在Excelで開いているシートの項目に現在の日付や任意の文字列を自動で入力することができます。

#!/usr/bin/perl
use Win32::OLE qw();

my $Excel = Win32::OLE->GetActiveObject('Excel.Application');
my $Book  = $Excel->ActiveWorkBook;
my $Sheet = $Book->ActiveSheet;

$Sheet->Range("V3")->{Value} = @{[localtime]}[5] + 1900; # YYYY
$Sheet->Range("Z3")->{Value} = @{[localtime]}[4] + 1;    # MM
$Sheet->Range("AB3")->{Value} = @{[localtime]}[3];       # DD
$Sheet->Range("D4")->{Value} = "まなび事業本部 OL推進室";# 部署
$Sheet->Range("L4")->{Value} = "竹迫 良範";    # 氏名
$Sheet->Range("V4")->{Value} = "XXXXXXXX";     # 社員番号
$Sheet->Range("D7")->{Value} = "WXX+XXXXX";    # 内線
$Sheet->Range("L7")->{Value} = "03-XXXX-XXXX"; # 外線
$Sheet->Range("V7")->{Value} = "テプコ";       # 拠点

exit;

プログラム中でファイル名を指定して開くよりも、実はこの方が便利だったりします。

このようなExcel業務が発生する場合、プログラムで入力を自動化して時間を効率よく使うことが必須です。

10. Win32::GuiTest でキーボード入力を自動化

さらに、Win32::GuiTestモジュールをインストールすると、SendKeysでキーボード入力を自動化することができます。

use Win32::GuiTest qw(SendKeys);

system("start notepad.exe");
sleep(1);
SendKeys("foo{ENTER}");
SendKeys("bar{ENTER}");
SendKeys("bar{BS}z{ENTER}");

上記は、メモ帳(notepad.exe)を起動して、1秒待ってから、f o o 改行、b a r 改行、b a rと打って一文字削除してzを入力して改行するプログラムです。

11. MouseMoveAbsPix でマウス操作を自動化

Win32::GuiTestには、マウスを操作するAPIがあり、MouseMoveAbsPix($x, $y)で任意の座標にカーソルを移動することができます。

use Win32::GuiTest qw(:ALL);

for ($x = 0; $x < 900; $x += 2) {
  $y = sin($x / 60) * 300 + 400;
  MouseMoveAbsPix($x, $y);
}

12. マインスイーパーの自動化

これらの技術を応用してできたのが、5年前のYAPC::Asia 2011で発表したAcme::MineChanです。

yapcasia.org

ここでは、ゲームの攻略を題材にしたAIを作成していますが、実務の仕事にも応用できることは明白です。私が実際にどんな業務を自動化しているかは…内緒とさせてください。:)

13. BadUSBによるキーボード入力の自動化

BadUSBによるキーボード入力の自動化については、昨年のAdvent Calendarで記事にしましたので、IoTや電子工作に興味のある方はぜひご覧ください。

tech.recruit-mp.co.jp

14. まとめ

人類に与えられている時間は皆平等なため、どのように有限の時間を使いこなすかは、人それぞれです。 今回紹介したテクニックをさらに発展させ、ボットの開発や、機械学習による単純作業の自動化によって、人類全体の無駄な時間をなくし、エンジニア個々人のQoL(Quality of Life)を向上させましょう。

サイボウズ・ラボを退職しました(ご挨拶)

2015年8月末をもって竹迫はサイボウズ・ラボ株式会社を退職いたしました。勤続年数は長く9年10ヶ月でした。 在職中は様々な活動を通して多くの皆様よりご指導ご鞭撻をいただきまして誠にありがとうございました。 まだまだ未熟だった私もサイボウズの中では多くのことを学びまして、自分自身も人間として大きく成長することができました。

f:id:TAKESAKO:20150729212850j:plain

サイボウズ・ラボの設立背景(10年前)

思い起こせば、私がサイボウズ・ラボに入社したのは2005年11月で、当時はまだラボを設立したばかりの立ち上げ期の頃でした。 リージャス赤坂のレンタルオフィスの一室を借りて、畑さん、akkyさん、kazuhoさんと4人で机を並べて、仕事を開始したのは良い思い出です。

それまでのサイボウズは関西人のノリでダジャレのキャンペーンをよく実施していたためか、どちらかというと宣伝やマーケティングにうまい会社と思われており、なかなか技術の会社として認識されることが少なかった状況でした。 実際にはC++オブジェクト指向データベースやWebサーバをフルスクラッチで作ったり、独自のスクリプト言語処理系を作って製品に組み込んだりしたり、かなりコアな技術を持った優秀なプログラマーが集まっていましたが、新規のエンジニア採用には苦しんでいました。

当時の時代背景としてWeb2.0の熱狂的なムーブメントがあり、米国の成功事例を参考に日本でも優秀なプログラマーが自分自身でドックフーディングしながら素早く要件や仕様を決めて、新規にWebサービスを何個も立ち上げて世界ヒットを狙うことが各社ベンチャーで挑戦されていました。 今でいうところの「フルスタックエンジニア」という用語が発明される前でしたが、basecampの開発中にRuby on Railsを作ったDHH氏や、memcachedのBrad氏など様々なスタープログラマーが生まれたのもこの頃の時代でした。 自分一人でビジネス要件を定義し、コーディングからインフラの準備までできるスーパープログラマーが脚光を浴びた時期です。

50%ルールとエンジニア主導文化

そのような優秀なエンジニアを採用するために「ラボ」という名前のついた100%子会社を親会社とは離れた場所に作り、サイボウズの技術者ブランドを強化すべく採用活動と新規サービスの開発を開始したのです。 業務時間の2割を自分の自由な研究にあてても良いというGoogleの20%ルールを参考に、サイボウズ・ラボでは50%ルールを作り、エンジニアの自由な発想と自主性にまかせた運営を行っていました。 一人のプログラマーがプロジェクト提案からコードの実装を行えるIPA未踏ソフトウェア創造事業出身者を多く採用したことでも有名です。

その中で私は自身のセキュリティに関する研究テーマの開発と対外発表の傍ら、サイボウズ・ラボの人材強化のため、様々な技術者イベントやカンファレンスの企画実施をしたり、数多くの業務を自由にさせていただきました。 50%ルールも分刻みの正確な時間管理をしているわけでもなく、私自身はほぼ事実上100%で動いていたかもしれません。 このような活動を継続的に認めてくれた上司と会社には今でも感謝しています。 当時の日本では認知度の少なかった「ハッカソン」や「開発合宿」を会社の枠を超えて企画実施したりと、オープンソースコミュニティの優秀な仲間達と一緒にエンジニア文化を作って、世の中に広めていく仕事ができたことは今でも大きな経験になっています。

セキュリティキャンプとの関わり

2006年からセキュリティキャンプの講師として日本の人材育成事業に関わるようになり、セキュリティのことがわかるものづくりエンジニアを育成するにはどうすればよいのかというテーマで9年間試行錯誤を繰り返してきました。 最初はx86アセンブラプログラミングからWebセキュリティの基礎と応用を体験できるプログラミング演習の講座を立ち上げ、その後はWin32 APIハック、Linuxカーネルハック、OS自作、ルーター自作、攻撃検知ソフトの自作、BadUSBハードウェアの自作など 若い学生さんが楽しみながら学習できる教材を優秀な講師の人たちと一緒に作ってきました。 同じメンバーがいつも集まって平均年齢が毎年1づつ上がる日本のセキュリティ業界の中で、ハッカー素質のあるプログラマー出身のエンジニアが入ることによって、新たな風を吹き込むことができたのではないかと思います。

国はハッカーを育てることができるのか?

2012年からは、世界各地で盛り上がっているCTF(Capture The Flag)の大会を日本でも継続的に開催したいというモチベーションで、NPO法人日本ネットワークセキュリティ協会の下でSECCON実行委員会を組織して活動を開始しました。 最初は事業にかけられるお金も少なく、実行委員や問題作成の人も完全ボランティアで持ち出しの多い状況でしたが、世界で活躍している一流の日本人セキュリティ技術者の皆さんと一緒に楽しく運営することができました。 普通のCTFだと面白味が少ないということで実行委員の個性を生かした様々な企画を立ち上げて、 問題を作成したり、協賛企業各社をまわったり、各省庁の後援申請をしたり、政治家の先生にレクチャーしたり、メディアの取材協力に奔走したり、各省庁の官僚の方々と一緒に他国の事例を参考にして国の政策を考えたり、と、普通では経験できない幅広いことを体験することができました。 ホワイトハットハッカー育成というくくりでTV・新聞・メディアの取材が多かったのはこの時期です。 2015年2月には、世界58ヶ国、累計4186人の中から各予選を優秀な成績で勝ち進んだ全24チームが東京に集まる CTF決勝戦を開催し、当日は情報通信技術(IT)政策担当大臣が現地に視察に来られました。

これらの活動を通して、世界の中から見た日本の現状を客観的に認識できる機会が多くあり、日本の技術と教育で足りないものは何なのか、いろいろ考える機会を得ました。

サイボウズ・ラボユースの設立

産業界のIT学会離れが進んだ中、産学連携の「産」の立場で、言語処理学会情報処理学会プログラミングシンポジウム、コンピューターセキュリティシンポジウムなどの運営をのぞかせていただいたのですが、 国の研究予算が削減されたり、様々な制約が増えている環境の中で一流の研究者・教育者の方々が奔走している姿を見ました。 現在、大学教育で問題になっている学力低下、論理思考能力の低下、文章作成能力の低下、研究力低下、論文数低下などの 様々な問題を解決するためには、学習環境の改善のほかに、本流とは異なる別の学習機会の提供が必要と痛感しました。

サイボウズ・ラボでは、2011年よりラボユースという学生支援制度を作り、優秀な学生さんが学校の枠をはみ出て、プログラミングの学習やものづくりを金銭面や技術面でサポートできる環境を提供しました。 それから数年経過し、ラボユースを卒業したあと、産学ともに様々な場所で活躍する人も増えてきて、教育者冥利につきる思いです。

今後について

2015年9月1日より、株式会社リクルートマーケティングパートナーズに入社し、技術フェローに就任しました。 リクルートグループの中で結婚情報誌「ゼクシィ」の媒体を持ち、主に新規事業開発を担当している会社です。 最近ではEdTechベンチャーの「Quipper」を買収し、受験サプリ、勉強サプリを拡大し、教育事業のグローバル展開に参入したことで話題になりました。 私が所属するラーニングプラットフォーム推進室では、2年前より自社エンジニアによる内製開発を進めており、リクナビ進学アプリ、料理サプリ、英単語サプリなど、多くの新規自社サービスを開発してきました。 リクルートグループの中でエンジニアの裁量が大きく技術力の高い会社として知る人ぞ知る存在になっていて、多くの優秀な若いエンジニアが集まっています。ジョインしてまだ2週間ですが、彼らのポテンシャルには驚かされるばかりの毎日です。 これからの日本の晩婚化・少子化問題、世界の貧富の差、教育問題を解決するべく、いままでの経験を生かして、内製エンジニアの働きやすい環境を整え、技術の力でより良い未来を作る仕事に携わります。

今後の活動、これから何をやっていくかについては会社のエンジニアブログ「NET BIZ DIV. TECH BLOG | リクルートマーケティングパートナーズのデザイナー、エンジニア、スクラムマスターたちが発信する Web 開発情報メディア」で書いてまいりますので、どうぞよろしくお願いいたします。

tech.recruit-mp.co.jp

FAQ(追記します)

  • 技術フェローはCTOと違うのですか?
    • CTOとは違います。複数の会社を兼務する技術顧問とも違います。フルタイムでコミットしています。
  • なぜリクルートマーケティングパートナーズなのですか?

略歴をまとめてみました(2015-09-16 更新あり)

竹迫 良範(たけさこ よしのり)

現所属

  • 株式会社リクルートマーケティングパートナーズ 技術フェロー(2015年9月~)

コミュニティ活動

  • SECCON実行委員長
  • Shibuya Perl Mongers リーダー
  • OWASP Japan Advisory board
  • CODE BLUE レビューボード

職務経歴

  • 2002年03月 広島市立大学 情報科学部 卒業(情報工学・学士)
    • 情報機械システム工学科 知能ロボット講座(現:パターン認識研究室)
  • 1997年05月 株式会社エス・ワイ・シー 入社
  • 2002年02月 株式会社ドリームアーツ 入社
    • 独立系ITベンチャーにて大企業向けパッケージソフト開発に従事
  • 2005年11月 サイボウズ・ラボ株式会社 入社
    • セキュリティ先端技術のR&D、情報基盤ミドルウェアの開発 (9年)
    • エンジニア採用ブランディングの企画開発、イベント運営(9年)
    • 海外開発拠点へのセキュリティトレーニング、社内研修講師(4年)
    • サイボウズ株式会社 Cy-CSIRT 社外アドバイザー(3年)
  • 2015年09月 株式会社リクルートマーケティングパートナーズ 入社
    • ラーニングプラットフォーム推進室 技術フェロー

オープンソースソフトウェア開発実績

所属学会

  • 日本データベース学会、The Database Society of Japan(DBSJ)正会員
  • ACM SIGMOD 日本支部メンバー

研究業績

  1. 2011年3月10日、「不自然言語処理コンテスト」第1回開催報告、言語処理学会 第17回年次大会 発表論文集、共著、萩原正人 (楽天), 大原一輝 (フリー), 水野貴明 (バイドゥ), 橋本泰一 (東工大), 荒牧英治 (東大), 竹迫良範 (サイボウズ)
  2. 2012年1月8日、x86 JITコンパイラ上で任意コードを実行する方法、情報処理学会 第53回プログラミング・シンポジウム予稿集、単著、竹迫良範(サイボウズ・ラボ)
  3. 2012年1月20日、Web型グループウェア開発における技術標準動向と人材育成の課題、画像電子学会 第9回国際標準化教育研究会-事業化と標準化教育-、単著、竹迫良範(サイボウズ・ラボ)

受賞歴

国際標準化活動

  • 2009~2011年 SC 22/ECMAScript Ad Hoc エキスパート(ISO/IEC 16262:2011)
  • 2010~2013年 W3C Invited Expert、HTML5 Working Group
  • 2013~2015年 SC 22/C#, CLI, スクリプト系言語SG エキスパート
  • 2015年  情報処理学会 情報規格調査会 SC 22専門委員会 専門委員
  • 2015年~ SC 22/ECMAScript Ad Hoc エキスパート(ECMAScript6、JSONi18n等)

国際発表

  • 2010年 OSDC.tw 2010「Polyglot Programming and Web Security」
  • 2011年 OSDC.tw 2011「x86 ASCII Programming (16bit/32bit)」
  • 2011年 HITCON 2011 Hacks in Taiwan Conference「Disassemble Flash Lite 3.0 SWF File」
  • 2014年 OWASP AppSec APAC 2014「Secure Escaping method for the age of HTML 5」
  • 2015年 SECUINSIDE 2015, BSides Las Vegas 2015, HITCON Community 2015「Backdooring MS Office documents with secret master keys」
  • 2015年 CODE BLUE 2015「MS Office ファイル暗号化のマスター鍵を利用したバックドアとその対策」

委員歴

  • 2006年~ Shibuya Perl Mongers 2代目リーダー
  • 2007~2014年 翔泳社 Developers Summit コンテンツ委員
  • 2008~2013年 経済産業省U-20プログラミング・コンテスト審査委員
  • 2014~2015年 CSAJ U-22プログラミング・コンテスト実行委員
  • 2010~2011年 不自然言語処理コンテスト審査員、アドバイザー
  • 2012年 CTFチャレンジジャパン2012 CTF大会実施ワーキンググループリーダー
  • 2012年~日本ネットワークセキュリティ協会 SECCON実行委員会 実行委員長
  • 2013年~OWASP Japan Advisory board
  • 2014年~国際情報セキュリティ会議 CODE BLUE レビューボード、実行委員
  • 2014年 情報処理学会コンピュータセキュリティシンポジウム2014実行委員
  • 2014年 キャンドルスターセッション(CSS×2.0)in CSS2014 実行委員長

招待講演

パネル登壇

  • 2011年 言語処理学会 第17回年次大会「自然言語処理における企業と大学と学生の関係」
  • 2013年 JANOG31 Meeting「モダンアプリのインパクト」「Outbound Port 80 blocking のご提案」
  • 2014年 情報処理学会 第76回全国大会「国はハッカーを育成出来るのか」
  • 2014年 情報セキュリティ・ワークショップ in 越後湯沢「自社製品のバグ発見者に報奨金をだす企業とバグ発見者」
  • 2014年 Internet Week 2014「S7 本当に身につくセキュリティの学び方」「攻撃者の視点を学ぶ」

教育歴

  • 2006年 Web2.0ワークショップ「Plaggerで学ぶ、初めてのRSS/Atomアグリゲーション」
  • 2006年 セキュリティキャンプ2006、Webプログラミング基礎演習講座
  • 2007年 セキュリティキャンプ2007、プログラミングコース講師(セキュアシステム開発
  • 2008年 セキュリティ&プログラミングキャンプ2008、Webプログラミングクラス講師
  • 2008年 HTTP Meeting 2008 ~Webサービスの明日を見つけよう~「Webプログラミング言語/JavaScript処理系」
  • 2009年 セキュリティ&プログラミングキャンプ2009、OSを作ろう組(OS自作組)講師
  • 2010年 セキュリティ&プログラミングキャンプ2010、両コースの講師を兼任
  • 2011年 セキュリティ&プログラミングキャンプ2011、プログラミング言語クラス講師
  • 2012年 セキュリティ・キャンプ中央大会2012、Webクラス&セキュアシステム講師
  • 2013年 セキュリティ・キャンプ中央大会2013、Webクラス&セキュアOSクラス講師
  • 2013年 京都大学サマーデザインスクール 2013「チームワークのデザイン」実施者
  • 2014年 京都大学サマーデザインスクール 2014「学び方のデザイン ─ 盲点を見つけよう」実施者
  • 2014年 会津大学セキュリティ人材育成事業サイバー攻撃対策演習・情報セキュリティ講座「マルウェアの検知と防御技術」講師
  • 2014年 セキュリティ・キャンプ全国大会2014「ルーター自作ゼミ」講師
  • 2014年 セキュリティ・ミニキャンプ in 東北 2014「攻撃検知システムを自作しよう」講師
  • 2014年 セキュリティ・ミニキャンプ in 沖縄 2014「攻撃検知ソフトの自作」講師
  • 2014年 警察大学校 サイバーセキュリティ研究・研修センター「サイバーセキュリティ分野における人材育成」講師
  • 2015年 警察大学校 サイバーセキュリティ研究・研修センター「サイバーセキュリティ分野における人材育成」講師
  • 2015年 セキュリティ・ジュニアキャンプ in 高知 2015「ウイルス対策ソフトを作ってみよう」講師
  • 2015年 セキュリティ・キャンプ全国大会2015 低レイヤートラック リーダー
  • 2015年 セキュリティ・キャンプ全国大会2015「1-B AVRマイコンで作るBadUSB自作入門」講師

調査協力

  • 2010年 文部科学省 科学技術政策研究所 科学技術動向研究センター「未来予測ディスカッション」
  • 2014年~文部科学省 科学技術政策研究所 科学技術動向研究センター「科学技術専門家ネットワーク」専門調査員

連載

著書(翻訳・監訳・共著など)

寄稿

  • 多数(自分で把握しきれなくなりました…)

新ジャンル:回文プログラミング

ブラウザのアドレスバーに貼り付けてお楽しみください。

javascript:''[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~_+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',~(_*-_+_),_-~_+_|_,_*_+_-~_,-_*~_+_,(_<<_-~_)+'("\\'+(''+!'')[_]+-~(_*_)+-_*~_+(''+{}._)[_]+(_+!'')[_*_]+'\\'+(''+!'')[_]+-_*~_+-~(_*_)+_*_*_+~-(_<<_)+'\\'+(''+!'')[_]+-~_+_%_+_*_+(''+{})[_]+'\\'+(''+!'')[_]+-~_+_%_+_*_+_*_+'?")'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')())(_)//(_)(()(''\'+(_/_+'\\')[[_](_.{}+_)+[_*_](''/_+_)+[_]({}+_)+[_*_]({}+_)]['("?'+_*_+_*_+_%_+_~-+[_](''!+'')+'\\'+[_]({}+'')+_*_+_%_+_~-+[_](''!+'')+'\\'+(_<<_)-~+_*_*_+(_*_)~-+_~*_-+[_](''!+'')+'\\'+[_*_](''!+_)+[_](_.{}+'')+_~*_-+(_*_)~-+[_](''!+'')+'\\")'+(_~-_<<_),_+_~*_-,_~-_+_*_,_|_+_~-_,(_+_-*_)~,'']+''\'+[_](_.{}+_)+[_](''!+_)+[_](''!+'')+[_/_](''!+_)+[_*_](''!+_)+([_](''!+_),''+_~-~-=_))[_][_]_)[_][[_](''!+_)+[_]({}+_)+[_/_](''!+_)+[_*_~-]({}+_)+[_](''!+'')+[_](''!+_)+[_/_](''!+_)+[_*_]([]!+_)+[_](_.{}+_)+[_]({}+_)+[_*_~-]({}+(''~-~-+''=_))=_]'':tpircsavaj

■動作画面

※推奨ブラウザ:Firefox, Chrome, Safari, Opera, Windows7のIE8もしくはIE9で動作確認しています。

■追記:
id:hasegawayosukeさんに卑怯な気がすると言われたので、記号だけで//を使わずに回文javascriptを書いてみました。

('"\')(("')[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~_+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',(~(_*-_+_)),(_-~_+_|_),(_*_+_-~_),-_*~_+_,((_<<_-~_))+'(\\\'',''+_%_+_/_,_*_+_,(_-~_+_|_),(_*_+_-~_)+'\\'+_*_+_%_,((_<<_-~_)-~_),(~(_*-_+_)),(~_^~_*_+_)+'\\'+_*_+_%_,(~_*~_|_)+'\\'+_*_+_%_,(_*_+_-~_),-_*~_+_,(_*_+_-~_)+'\\'+_*_+_%_,(~_*~_|_)+'\\'+_*_+_%_,(~_^~_*_+_),(~(_*-_+_)),((_<<_-~_)-~_)+'\\'+_*_+_%_,(_*_+_-~_),(_-~_+_|_),_*_+_,(''+_%_+_/_)+'\\\')'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')(")(''\'+(_/_+'\\')[[_](_.{}+_)+[_*_](''/_+_)+[_]({}+_)+[_*_]({}+_)]['('\\\'+(_/_+_%_+''),_+_*_,(_|_+_~-_),(_~-_+_*_),_%_+_*_+'\\'+(_~-(_~-_<<_)),((_+_-*_)~),(_+_*_~^_~),_%_+_*_+'\\'+(_|_~*_~),_%_+_*_+'\\'+(_~-_+_*_),_+_~*_-,(_~-_+_*_),_%_+_*_+'\\'+(_|_~*_~),_%_+_*_+'\\'+(_+_*_~^_~),((_+_-*_)~),(_~-(_~-_<<_)),_%_+_*_+'\\'+(_~-_+_*_),(_|_+_~-_),_+_*_,_/_+_%_+'',''\\\)'+((_~-_<<_)),_+_~*_-,(_~-_+_*_),(_|_+_~-_),((_+_-*_)~),'']+''\'+[_](_.{}+_)+[_](''!+_)+[_](''!+'')+[_/_](''!+_)+[_*_](''!+_)+([_](''!+_),''+_~-~-=_))[_][_]_)[_][[_](''!+_)+[_]({}+_)+[_/_](''!+_)+[_*_~-]({}+_)+[_](''!+'')+[_](''!+_)+[_/_](''!+_)+[_*_]([]!+_)+[_](_.{}+_)+[_]({}+_)+[_*_~-]({}+(''~-~-+''=_))=_]('"))('\"')

括弧()[]{}の対応づけが逆になっているのは見た目のための仕様です。(厳密には文字列の reverse になっていない鏡像です)

■追記(5/19 19:47)

2010年5月19日のヘッドラインニュース - GIGAZINE
に(右から見ても左から見ても同じ文字列でプログラミング)との解説付きで掲載していただきました。

■参考文献:

  1. Palindrome C code
  2. [Neta]真・新ジャンル:回文プログラミング - 葉っぱ日記

Linux kernel の wireless.c で .header_type とか,ドットで始まる変数名?がある件について

http://twitter.com/k_morihisa/status/9006163842

Twitter / Morihisa Kazuaki: Linux kernel の wireless.c で .header_type とか,ドットで始まる変数名?がある.謎

Linux-Kernel Archive: 2.6.18-git9 wireless fixes break ipw2200 association to AP with WPAのパッチとかみると、たしかにこんな断片のC言語ソースコードがでてくる。

@@ -242,24 +234,24 @@
[SIOCSIWESSID - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
.flags = IW_DESCR_FLAG_EVENT,
},
[SIOCGIWESSID - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
.flags = IW_DESCR_FLAG_DUMP,
},
[SIOCSIWNICKN - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
},
[SIOCGIWNICKN - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
},
[SIOCSIWRATE - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_PARAM,
@@ -346,8 +338,8 @@
.max_tokens = sizeof(struct iw_pmksa),
},
};
-static const unsigned standard_ioctl_num = (sizeof(standard_ioctl) /
- sizeof(struct iw_ioctl_description));
+static const int standard_ioctl_num = (sizeof(standard_ioctl) /
+ sizeof(struct iw_ioctl_description));

/*
* Meta-data about all the additional standard Wireless Extension events

http://twitter.com/takesako/status/9016296481 でも返事しましたが、

つまり、こういうこと?

#include <stdio.h>

typedef struct x{
  char a;
  char b;
} X;

int main(void)
{
  const X x[] = {
    [2] = { .a=69, .b=0,  },
    [0] = { .a=65, .b=66, },
    [1] = { .a=67, .b=68, },
  };
  printf("%s\n",x);
}

→ 実行結果:ABCDE