しょ〜うぃん広場

おもにTech系なブログ、ときどき個人的なブログ

中国で2ヶ月半インターンをしてきた

2月17日からおととい(4月30日)まで約2ヶ月半中国でインターンをしてた。

中国でインターンをやることになった経緯とか、インターンの内容とかいろいろまとめて書こうと思う。

なぜ中国でインターン

僕は4月から大学4年生になって、大学院には行かずに中国で就職しようと思っている。 大学院に行かずに、中国で就職する理由は簡単に書くと ・成長率が高いうちに中国で仕事/生活をしてみたい ・(年配者と比べて)グローバル意識の高い若者がそろそろ社会の中心になって、ネット規制が強い中国で大きな変化が起きると思ってる ・彼女が中国人 ・若い時にしかいろいろな経験ができないから、とりあえず海外で苦労してみる とか、そんなもん。

それで、中国で就職するのに、中国に留学したこともないし、中国の仕事文化も知らないし… じゃちょっとヤバそうだから、とりあえずインターンしとこうか! みたいな流れ。

どうやってインターン先が決まったの?

基本的には中国人向けのサイトで適当に探して、適当に応募した。 (日本で言うリクナビ的なやつ? 日本でマジメに就活してないからよくわからないけど…)

あとは、彼女の知り合いが勤めてる会社を紹介してもらったり。

結果的に彼女の知り合いつながりで今回のインターン先は決まった。 インターン先はソフトウェア開発会社で、日本のグループ企業が受注した案件をこっちで開発するという、要は下請け企業。

  インターンまでの選考は
1. 履歴書(中国語)提出
  ↓
2. Skypeで面接 (口頭で問題を出されることもある)
  ↓
3. 合格

中国の企業は選考の途中で落とされると、その後全く連絡が来なくて 落とされたのか、まだ選考途中なのかわかりにくい。。。 企業と就活生が対等に扱われていない感じ。(企業>>就活生)

インターンどうだった?

7:30 起床 8:30 出発 10:00 会社到着 午前 自分のやりたいことやる(基本的に自分のWebサービスの開発) 午後 会社の仕事 18:00 退社 20:00 帰宅

という生活をしてた。 他のインターン生は午前中に日本語の授業があるんだけど、ぼくはそんな授業受ける意味はないから、自分でやりたいことやってた。 同じ部屋で作業してたから、日本語の授業も耳には入ってきていて、日本語ってこうやって教えるんだ〜とか、先生の発音違うな〜とか、この日本語はこういう中国語の表現なのかとかいろいろ勉強になった。

午後はプログラミング演習的な感じ。 基本的にJavaSAStrutsってフレームワークを使って、開発をしているから、そのフレームワークの使い方とか、ユニットテストの仕方とかを勉強した。 周りのインターン生は(おそらく)中堅大学以下(Dラン大学?)ぐらいのレベルで、あまり頭が良くないのはインターンが始まってすぐに分かった。 だから、開発速度とかもちょっと遅くて、僕がコミットしたコードをそのままコピーして使っているらしかった。 (みんなで似たような機能を開発していたんだけど、「ちょっと助けて〜」って呼ばれて行くと、自分のコードがそのままコピペされてた) (しかも後半に開発していたものは全員が同じ機能を作るものだったから、「伊藤くんが作ってくれるから、それコピーしようぜ!」とか言ってて、おいおいって感じだった。だから完成するまでぼくはワザと1回もコミットしなかった。笑)

通勤時間が毎日3時間あって、大変といえば大変だけど、それなりに価値のあることができた。 通勤に3時間もかかるのは、会社の近くに家を借りて住んでいたわけじゃなくて、彼女の家に住ませてもらっていたから。彼女の両親に感謝。 それで、通勤時間は ・技術系のPodcast(rebuild.fm)を聞く(35%) ・中国語の勉強(25%) ・ゲーム(25%) ・音楽を聞く(15%) をやっていた。

rebuild.fmは結構オススメで、このPodcastの影響で技術への関心が高まった。 ゲームはiPhoneドラクエ4とか、ゲームボーイアドバンスのソフトをエミュレータで動かしたりして遊んでた。

  肝心の給料は、時給144.5円(JPY)だった。毎月2万円程度。 この値段は杭州市のインターン最低賃金。 ちなみにこの会社の初任給は6万円らしい。 この会社は日本と取引してるのに、社内に日本人がいないらしく、どうしても僕に働いて欲しいらしい。 だから、毎月20万円くれたら、あんたの会社で働くよ。ってマネージャに伝えてみたら、「それは僕と同じぐらいの給料ですよ〜」って言われて、これはヤバイと思った。 (ちなみに、中国の東大、京大レベルの大学の卒業生(理系)の初任給は15万円前後) まぁあんまりお金なくて、資金繰り大変そうだなーというのはインターンをしていても感じるところがあって、(働いている人のレベルも低いし)、給料高く貰えないならこの会社ではちょっと働きたくないかなぁという感じ。

集合写真 集合写真 (真ん中右に写ってて、社員証の紐の色が違うのがマネージャ。僕がどれかは秘密!笑)

帰国後

明後日(5月4日)のフライトで帰国する。 1週間前ぐらいから大学の研究室の課題が出てたり、帰ってから健康診断の申し込みとか事務的な事もしないといけなくて、忙しくなりそう。

秋にまた中国に行って就活するから、論文も夏休みにかなり進めないといけないし、今年度はそれなりに頑張らないといけないらしい。 まぁわざと忙しくさせるために、大変そうな研究室選んだんだけども…笑

大学院には行かないから、4年生の1年間のうちに1.5~2年間分ぐらい頑張りたいなと思ってる。

さくらVPSにBitTorrent Syncを導入した

1ヶ月前ぐらいからRebuild.fmの存在を知って、#1から順に気になるもの(全体の7割ぐらい)を聞いている。

#30BitTorrent Syncの話をしてて、これは使えそうだなーと思ったから環境構築をしてみる。 BitTorrent Syncというのは、DropBoxP2Pバージョンみたいなやつで、つながっている端末同士でファイルを同期することができる。 要は ・高速 ・メインサーバーなし(全てが同等の扱い) ・容量無制限 なDropBoxだと思ったらいい。 しかもReadOnlyの設定とかできて、共有した相手に消されないようにもできたりするから優秀。 悪い点は、電源が入っていないと同期が取られないという点。

どうやって使うかはまだ決めてないけど、とりあえず常に電源が入っているサーバーをP2Pネットワークに含めると随分と使いやすくなるから(弱点克服)、まずはさくらVPSに入れる。

下の2つのサイトを参考にして導入した。
[参考]CentOSにBittorrent Syncを導入する
[参考]How to install and configure a BitTorrent Sync server

まず、どちらともroot権限で実行したと書いているけど、別にroot権限にしなくても問題なくできた。

$ cd 
$ mkdir btsync
$ cd btsync
$ wget http://btsync.s3-website-us-east-1.amazonaws.com/btsync_x64.tar.gz
$ tar -xvzf btsync_x64.tar.gz

HOME以下にbtsyncディレクトリを作って、そこにBitTorrent Syncを持ってくる。そして解凍。 さくらVPSの場合には64bitなので上のURLから。 32bitの場合にはhttp://btsync.s3-website-us-east-1.amazonaws.com/btsync_i386.tar.gzから持ってくるらしい。 (32bitの方は試してないので、間違っていたらゴメンナサイ)

$ ./btsync --dump-sample-config > btsync.conf

このコマンドでbtsync.confにサンプルの設定を書き込む。 コマンドの説明をしておくと、[./btsync --dump-sample-config]のコマンドを打つとサンプル設定がダラダラ流れてくるから、それをbtsync.confに書き込むというコマンド。

設定ファイルの中身を書き直す btsync.conf

{
   "device_name": "showwin VPS in Japan",
   "listening_port" : 55555,  // 0にするとランダムになる。固定したかったので適当な値を決めた

   "storage_path" : "/home/showwin/.sync",  //ログとかがたまるらしい。よく分かってない…笑

   "check_for_updates" : true,
   "use_upnp" : true,

   "download_limit" : 0,     //ダウンロード時の回線速度制限。0なら無制限
   "upload_limit" : 0,       //アップロード時の回線速度制限。0なら無制限

   "webui" :          //WebUIの設定
   {
     "listen" : "0.0.0.0:8888",  //8888ポートで使えるようにする。適当な値でOK
     "login" : "********",        //ページにアクセスした際の認証に必要
     "password" : "********"      //同上
   }
 }

こんな感じ。 どんなオプションがあるのか、まだよく分かってないから、これからもうちょっと調べてみる。

あとはiptablesの設定。 /etc/sysconfig/iptables

# BitTorrent Sync 
-A OUTPUT -p tcp --dport 55555 -j ACCEPT
-A OUTPUT -p udp --dport 55555 -j ACCEPT
-A INPUT -p tcp --dport 55555 -j ACCEPT 
-A INPUT -p udp --dport 55555 -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT

を追加した。

$ /etc/init.d/iptables restart

iptablesを再起動。

$ ./btsync --config btsync.conf

最後にbtsync.confの設定でbtsyncを起動させればOK! これでxxx.xxx.xxx.xxx:8888にアクセスすればGUIのコントロールパネルが見れるはず。

Screen Shot 2014-04-29 at 13.51.17 (クリックで拡大)

次は使ってみた感想を書くつもり。

Ruby-OpenCVを使って顔認識をしてみた

昨日から個人的に始めたあるプロジェクトのために、まずは顔認識をしてみた。 (プロジェクトに関しては、ネット上を漁ればどこかに見つかるはずです…笑)

はじめに

OpenCVというのはOpen Source Computer Vision Libraryの略称らしくて、 インテルが開発したものらしい。(via Wikipedia)

それをRubyで扱えるようにするのがRuby-OpenCV

・(前半) インストール ・(後半) 顔認識 の二本立てで行きます。

(前半)インストール

下のページを参考にしながら顔認識していきます。 [参考]ruby-opencvをインストールして顔認識した

まずはOpenCVをインストールして、その後にRuby-Open

$ brew tap homebrew/science

$ brew info opencv
> opencv: stable 2.4.8.2

$ brew install opencv
# opencvのインストール完了

$ gem install ruby-opencv

ってやるだけなんだけど、 OpenCVのインストールでコケた。

$ brew install opencv
> ...
> undefined method `[]' for Formula:Class

解決方法

$ brew update
$ brew install opencv

イケた homebrewの問題だった。

 

(後半)顔認識

続いて顔認識の部分

画像を読み込んで、顔が見つかれば赤い四角で囲って出力するようにした。

分類器は

/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_****.xml

にあるものを持ってきて使う。 ****の部分には ・default ・alt ・alt2 ・alt_tree の4種類があったので、それぞれ使ってみてどれが優秀なのか調べてみた。

それぞれがどういう特徴をもった分類器なのかわからないけど、 2種類の画像を使って性能を比較してみた。

※もちろん、モザイクは顔認識をした後にかけています。 ※画像はクリックで拡大できます

 

・default

かなりミスが多い。多く間違えてもいいけど、顔を逃したくない時に有効? (と思ったけど、左側の写真の右側の顔を捕らえてなかった。。) test3_default test2_default 

 

・alt

これが一番精度が高かった。完全に捕らえられてる。 test3_alt test2_alt 

 

・alt2

左側の写真の左下に余分な"顔"が捕らえられてる。 test3_alt2 test2_alt 2 

 

・alt_tree

左側の画像では顔を捕らえられていなかったり、右側の画像では余分な部分まで検知していたり。。。 test3_tree test2_tree 

結論&実装

ということで、とりあえずaltが良さそうだった。

画像サンプル3つでやったから、信頼できるかは別だけど… これから大量の画像に対して顔認識させる予定だから、 またその時にも、どの分類器が適しているのか実験してみよう。

以下コード。 コメントを書いてあるので、詳しい説明はいらないですね。

require 'opencv'
include OpenCV

if ARGV.size < 2
  puts "Usage: ruby #{$0} input.jpg output.jpg"
  exit 1
end

input_file = ARGV.shift #一つ目の引数がinput
output_file = ARGV.shift #二つ目の引数がoutput

image = nil
begin
  image = IplImage.load input_file, 1  #インプットファイルを読み込む
rescue
  puts 'Could not open or find the image.'
  exit
end

#分類器の指定
detector = CvHaarClassifierCascade::load './detector/haarcascade_frontalface_alt.xml'

#検出された顔に対してどんな処理を行うか
detector.detect_objects(image).each do |region|
  image.rectangle! region.top_left, region.bottom_right, :color => OpenCV::CvColor::Red
end

image.save output_file

ブログのために写真のサイズ変更したり、モザイクかけたり大変だったわ…

RubyGemでのインストール時に--no-ri --no-rdocをデフォルトで付ける

中国で開発をしているとネットの回線速度が遅くて、なにをするにもいろいろ時間がかかる。
(特に海外のサーバーを訪問する時にはGreatFireWallのお陰で500KB/sec以上はなかなか出ない。)

そこでgemをインストールする時とかは

$ gem install foobar --no-ri --no-rdoc

としたいんだけど、すぐに忘れてしまう。

だから、デフォルトでドキュメントをダウンロードしないようにしたい。

$ echo "gem: --no-ri --no-rdoc" >> ~/.gemrc

これだけで良いらしい。

便利になった。

さくらVPSでOpenSSLのアップデートをした

少し前にOpenSSLの脆弱性で大騒ぎになって、
最近は脆弱性を利用して情報を盗みだした人が逮捕されたとかよくニュースで見るようになりましたね。

個人的にさくらVPSを借りて、Webサービスを動かしているんですが
まぁ個人情報扱うようなサービスじゃないし、大した情報も入ってないからいいや。
って思って放置してました。

でも、やっぱり確認しておこうかなと、ふと思い立ったのでその作業過程をメモしておきます。

環境:CentOS 6.5

OpenSSLのバージョンを確認

$ rpm -q openssl
> openssl-1.0.1e-16.el6_5.4

openssl-1.0.1e-16.el6_5.7未満は脆弱性が存在するらしいので、 うちのサーバーは脆弱性が存在していたみたいです。 おぅ。。。 ということで

OpenSSLのアップデート

$ yum update openssl
> (アップデートログがダラダラダラダラ......)

途中で アップデート続行しますか?(y/n) みたいなことを聞かれた気がするから[y]を入力してEnter。

アップデートが終わって一応バージョンを確認

$ rpm -q openssl
> openssl-1.0.1e-16.el6_5.7

OK!

稼働しているWebサーバやFTPサーバは再起動させた方が良いそうですが、
いちいち再起動させるのは面倒だったので、サーバ本体を再起動させました。

これで心臓からの出血を止められたようです。

デロイトトーマツコンサルティングのインターンに挑む

9月になって暇になったから、夏休みの出来事を振り返ろう。

[6月中旬]

コンサルに興味があったから、夏休みインターンとか行ってみようかなーって思って軽い気持ちでインターン申し込みをした。
戦略コンサルってインターンやってるところはそんなに多くなくて、しかも対象が2014年度卒ばっかりだったから自分が申し込みできたのはデロイトトーマツコンサルティング1社だけだった。
5月ぐらいにコンサルの面接勉強会に行った時、周りの人達から3~5社ぐらいインターンの申し込みするって聞いてたから、1社だけじゃどうせ無理だろーとか思ってた(笑)

最初の申し込みフォームには1000字以内でインターンで学びたいことを表現しなさいという課題が付いていた。
インターン採用までの流れを何にも知らない自分は、この課題だけで採用が決まると思って結構本気で書いた。

[6月下旬]
デロイトさんからメールが来て、7月中旬までにWebテストを受けてくださいという旨だった。
「え、Webテストとかあんのかよ…
しかも申し込みした人全員受けるとか、これ絶対最初の1000字のレポート読まれないじゃん。。」
て思ってちょっとショックだった。

Webテストってどんなんかなー!?ってちょっとワクワクしながら「開始」のボタンを押した。
大問5個あって、それぞれ制限時間が15分だった気がする。

最初の大問は国語っぽい内容だった。
「上の文章はつまりどのようなことを言っているか」とか「上の文章の内容とそぐわない選択肢はどれか」
とかそんな感じの内容。
国語の出来が悪い自分は、わけがわからなくて焦った。
わけわからんまま15分が過ぎて絶望した。
敗因は「開始」ボタンを押してから、喉乾いたなーって思ってのんきにお茶を淹れに行った事だとおもう。
こくごりょくがたりないとかそんなんじゃないとおもう。
そんな感じで大問1が自分を本気にさせた。(本気で解いても大問1は出来が悪かっただろうから最初に国語の問題が来たのは幸運だった。)

大問2は、数学っぽい問題。
IQテストとかによく出てくるような空間図形の問題だったり、場合の数とか計算するような問題。
楽勝だった。正答率9割超えたんじゃないかと思うけど、分からん。

大問3は、英語の問題。
10行ぐらいの英文が書かれていて、その内容について設問が4,5個付いてる感じ。
最近英語なんて全く触れてなかったからアルファベットが目に入った瞬間「やってしまった…」と思ったけど、意外と読めた。
でもやっぱり単語力は結構落ちてて、単語は復習しないといかんなーと思った。(結構それ以降も単語の勉強はしていない)
英語は7割ぐらいできた感じ。

大問4,5は性格テスト(適性テスト)。
学校の保健室とかがたまに実施するアンケートみたいな感じのやつ。
全部で200問近くあって、疲れた。

そんな感じで75分かけてWebテスト終わった。
国語が散々な出来だったから落ちたと思った。

[7月末]
デロイトさんからメールが来て、Webテスト合格したから一次面接に来いって言われた。
「おいおい、Webテストで採用決まるかと思ったら面接までするんかい。
しかも"一次"面接ってことは二次面接もあるんだよね…?」
インターンってそんなにオオゴトなのかと思った。

一次面接の日程はWebで都合のいい日を選ぶ方式だったんだけど、ほとんどが大学の期末試験と被ってる。。。
オワッタ…
と思ったけど、面接最終日は大学の試験が終わる次の日だったから、なんとか行けるっぽい。
試験後に出さなきゃいけないレポートがあったけど適当に終わらせた。
結局面接当日の朝に京都から東京まで新幹線で行くしか選択肢がなくて、金かかった。
インターンの面接のために往復3万の交通費とか…おとうさん、おかあさん交通費出してくれてありがとう。

そんな感じで、一次面接で落ちるわけにはいかなかったのでがんばった。
みんなスーツのジャケット着ててネクタイも締めてた中、ぼくは半袖ワイシャツ ノーネクタイでがんばった。
面接の控え室を間違えて思いっきりミーティングしてる部屋に入っちゃったけど、がんばった。

これはパスしただろうと思ったら、案の定4時間後ぐらいに一次面接の合格通知(メール)が届いた。

[8月上旬]
二次面接行ってきた。
今回はケース面接らしい。コンサルっぽいねぇ。
最初の60分で筆記試験で、そのあと30分は回答した内容についての面接がある。
設問の内容とか書いたらマズそうなので一応秘密に…

空き時間に周りの人と話したけど、みんなガチ就活生だからケース面接の対策とかかなりしてるっぽい。
「今回ちょっと特殊だったからいつものケース面接の定石使えなかったよね」みたいな話してて ほえ〜 ってなった。
自分は明らかに対策不足というか、、、
周りの人たちは「銅の剣」とかもってるのに、自分は「ひのきのぼう」で戦ってる気分になった。

完敗

二次面接落ちました…笑

敗因としては
・ケース面接対策不足
ロジカルシンキングができてない
・デロイトさんと相性がよくなかった
・そもそも自分の考え方がアホ
辺りがあげられるんだけど、どれかわからない。
敗因がハッキリしないのが一番悪いパターン。。。
来年の就活でコンサル受けるんだったら上2つをやれば大丈夫かなぁと思ってるけど…

やっぱりコンサルは倍率的にも能力的にも厳しいなぁと感じました。

 

大変だ大変だ!! もう人生の半分終わってる…!!!

20歳のみなさん、もう人生半分終わってますよ。ええ。

いや、みんな40歳で死ぬとかそういうことではありません。
85歳で死ぬことを仮定して計算しましたから。

「なんか昔に比べて最近1年が早く感じるなぁ…」

とか思ったことありませんか?
ありますよね!?
小学校の時の1年間は長く感じたのに、最近はすぐに次の年になっちゃう…とか。

…なんでですかね?

ぼくの考えでは
「今まで生きてきた期間に対して、その1年がどのぐらいの比率を占めるか」が重要だと思うんですよ。

つまり5歳の子にとっては最近1年間は今までの人生の20%を占めるわけです。
でも80歳のおじいちゃんおばあちゃんにとっては、最近の1年間って今までの人生の1.25%にしかならない訳ですよ。
この違いが時間の体感速度の違いを生み出してるのではないかなぁと思うわけです。

って事で、(ひまな)大学生の立場を利用して簡単(雑)に計算してみました。
物心つくのが4歳だとして、そこから20歳まで、Σ(5→20)1/nを計算すると1.47
20歳から85歳までΣ(21→85)1/nを計算すると1.44
(計算は大雑把なので有効数字2桁が妥当だと思います…)
20歳でちょうど半分ですよ…!!

人生まだあと3/4ぐらいあるぜー!!!
って思ってたらあと半分だった。。。

もちろん絶対的時間は3/4あるんですが、ぼくの体感速度理論だとあと半分みたいですね。

って事で20歳になったー!!合法的に酒飲めるー!!!タバコ吸えるー!!!!!
とかウカウカしてたらすぐに30歳、40歳になっちゃいますよ。

別に焦る必要ないけど、そろそろ将来設計も… って感じですかねぇ。

うー、気付いたらあと4ヶ月で20歳だ。
この調子だと、気付いたら死んでるかも。
いや、死んだら気付かないから、気付かないうちに死んでるな…


(成人式で話す機会あったらこの話しよう…笑)


追記:
この記事書いた後に気付いたんだけど…
なにも1年毎に離散的に考えなくても、連続的に考えればもっと簡単だった…笑
1/nを5→20まで積分して(log20)-(log5)=log4=1.38629
1/nを20→85まで積分して(log85)-(log20)=4.44265-2.99573=1.44692
あれ、結構差がある…苦笑
さっきの計算適当すぎました…笑
まぁだいたい半分って事で!ははは

80歳までと仮定すると(log80)-(log20)=log4=1.38629
となってちょうど半分になるんだけどね!