メルカリに入社しました
7/31でDeNAを退職し、8/1よりメルカリに入社しました。
DeNAでやってきたこと
DeNAには新卒入社してから6年強、CSでのアルバイトも含めると10年弱お世話になりました。
新卒入社してからはずっと、エンジニアとして内製ゲームタイトルの運用・開発に携わってきました。
数えてみたら6年強で7タイトル経験しており、そのうち4タイトルが「○○ロワイヤル」という名前のタイトルでした。
おそらく社内でもロワイヤル系タイトルを自分ほど経験したエンジニアはいないと思うので、ここで自慢しておきます。
キャリアとしては基本的にはずっとサーバサイドエンジニアでしたが、直近2年間はチームの開発基盤整備や開発効率改善業務を行ったり、Objective-C/Javaでアプリ開発をしたりと様々な経験をさせてもらいました。
サービスマインドが高く責任感の強いチームメンバー、ちょっと怖いけど最高に頼りになるインフラメンバー、職人的にバグを見つけてくれる天才集団のQAメンバー等、
素晴らしいメンバーに囲まれながらゲーム開発を思いきりできたことは、自分の人生にとって貴重な経験となりました。
ファーストキャリアがDeNAで本当によかったと心から思っています。
転職理由
転職の理由はポシティブ/ネガティブ様々ありますが、一番大きかったのは「エンジニアとしてまた一からがむしゃらに仕事をしたい」と思ったことです。
どこの会社にいても起こりうることかと思いますが、新卒で入社して6年も経つと良くも悪くも器用に仕事がこなせるようになります。
例えば、自分の力でぱっと解決できない問題でも社内の有識者に聞くことでスピーディーに解決できるようになります。
また、自分一人で取り組むタスクの中でも力を入れる部分と抜いていい部分がわかってきます。
結果として、短い時間でそれなりのアウトプットを出せるようになってきます。
本来であれば、短い時間で成果を出せるようになった分空いた時間でよりアウトプットの精度を高めたり、別のタスクを行うべきなのですが、ここ最近はそれを行うモチベーションが内的/外的要因によって高められない状態が続いていました。
人生における仕事の優先順位が変わってきたこともありますし、自身の怠惰さに起因する部分もあります。
そのような状態で自分のエンジニアとしての成長が鈍化していく焦燥感があり、自分を変えるか環境を変えるかしてもう一度がむしゃらに仕事をしたいと思うようになりました。
そんな中、業務的にもライフステージ的にも新しいチャレンジがしやすいタイミングだったこともあり、新しい環境に身を置くことで否が応でも頑張らざるをえない状態に自分を追い込むことにしました。
メルカリでやること
CXI(Customer eXperience Improvement)チームでエンジニアとしてCSメンバーが使うツールの開発をします。
DeNAで3年ほどCSのアルバイトをしていたこともあり、CSの業務には思い入れが強いので今から楽しみです。
謝辞
今回の転職に際して、株式会社リブズパートナーズの佐地さんには大変お世話になりました。ありがとうございました。
また、職務経歴書の添削をしてくれたり、転職にまつわる色々な相談に乗ってくれた id:mameco0417 ありがとう!
最後に、恒例のやつをそっと置いておきます。
https://www.amazon.co.jp/registry/wishlist/2BAS2R9ZN7YFP/
2015年を振り返る
明けましておめでとうございます。
去年も一年の振り返りエントリ(2014年を振り返る - るさんちまん)を書いたので、今年も書いてみようかと思います。
仕事
4月の異動から今まで自分がやってこなかった領域を担当することになり、自分がチームにどう貢献できるかを考えながら仕事してきた一年だったなーと思います。
外出できない正月
去年の振り返りにも書きましたが、2014年の11月、12月に土日返上で開発していたサービスを年末にリリースし、正月はそのサービスの監視業務でほぼ家に張り付きでした。
本来であれば人が常に監視しなくてよいようにすべきなのですが、開発に余裕がなく最低限の監視システムしか実装できなかったのと、障害が起こった場合に即時対応しないといけないタイプのサービスだったので、ヒヤヒヤしながら正月を過ごしていました。
※結果的に大きなトラブルもなくてよかったです。。。
海外メンバーへの仕事引き継ぎ
自分の担当領域をチームメンバーに引き継ぐことはよくありますが、チームメンバー以外、しかも日本語のほとんどできない海外メンバーに引き継ぐのは初めてでした。
言語も文化も経験もスキルも違うメンバーに仕事を引き継ぐのは苦労が多そうだなーと思っていたのですが、エンジニアだとプログラムという共通言語で話せるのが大きく、技術的な引き継ぎはスムーズに進みました。
ただ、サービスが安定して動くことの責任だけでなく、どうユーザに楽しんでもらうか、どうやったらもっと楽しんでもらえるのか、といったことを常に考えながら仕事をする姿勢を伝えるのは難しかったですね。
チーム異動
サービスのリリース前からお世話になっていたチームを離れ、4月に社内でも有数の大規模チームに異動しました。
今までサービスの運用開発をメインにやってきましたが、新チームではサービスの開発は行わずにチームの開発支援専門のエンジニアとなりました。
サービスのコードは一切書かずに、チームの開発作業が円滑に行えるような環境整備とツール開発を行います。
具体的にやったのは下記のようなものです
- 開発サーバの保守・管理
なんでdiskすぐfullになってしまうん
— なおぱー (@naopr) 2015年5月19日
gitでサブモジュール削除するの、ブランチ単位でやらなきゃいけなそうで死にたい
— なおぱー (@naopr) 2015年5月22日
- AngularJSでの管理ツール開発
Angularタソ-
— なおぱー (@naopr) 2015年4月8日
Angularぶっ飛ばしたい
— なおぱー (@naopr) 2015年5月26日
- Google Apps Scriptでのマスタデータ管理ツール開発
Google Apps Scriptで、File.makeCopy(name, dest)すると、name指定してるのにもかかわらずコピー先のファイル名が "hogeのコピー"になることがあるので、makeCopy後にsetName()しなきゃいけなかった。 google--
— なおぱー (@naopr) 2015年8月4日
Google Apps Script、Range.setFormulas()すると最後の行のリファレンスがバグるという知見を得た。対応としては空の1行を追加してやると直る。こんな感じのバッドノウハウが溜まってきたのでそのうちブログにでも書こうかな
— なおぱー (@naopr) 2015年9月14日
- Jenkinsの保守・各種ツール開発
【ゆるぼ】Jenkinsのビルド履歴にユーザ名を表示する方法
— なおぱー (@naopr) 2015年10月29日
汚い言葉は使いたくないけど、ほんとにシェルスクリプトはクソだな!!
— なおぱー (@naopr) 2015年12月4日
どれも今までちゃんと取り組んだことがなかったので、勉強しつつ楽しんで仕事ができました。
個人的には、開発環境で頻発していたdisk fullを根絶できたのが精神衛生上一番よかったかな。
プライベート
…とここまで仕事のことを長々と書いてきましたが、ぶっちゃけ2015年はプライベート9割でした。
結婚
結婚しました
— なおぱー (@naopr) 2015年3月10日
結婚式はハワイで行いました。忙しい中、多くの時間とお金を使って参列してくれた皆さん、本当にありがとうございました。
今月の帰国後パーティーが結婚関連の最後のイベントですが、結婚ってプロポーズから1年以上かかる遠大なプロジェクトなんだなあとしみじみ思います。
ねこ
ねこ飼いたいねこ飼いたいと言い続けてはや数年。ついに飼い始めました。
結婚よりも何よりも、今年一番生活を変えたのがこいつ。
野生を忘れ果てた猫の姿です pic.twitter.com/fVHeo1CFNU
— なおぱー (@naopr) 2015年9月25日
毎日「かわいい」って言ってる。こんなにかわいい生物は存在しないんじゃないかな。
てなことで、2015年は仕事もプライベートも充実した一年でした。
結婚関連で一年間バタバタしてたので、今年はもう少しのんびりできればいいかなと思います。
今年もよろしくお願いします!!
【これから結婚する人向け】入籍前後の戸籍周りの手続き
私事ですが、今月入籍しました。
入籍の前後で諸々の戸籍の手続きをしていて、それらの情報がまとまっているページが見つからなかったので備忘録がてら雑なメモを残しておきます。
なお、自分は結婚しても苗字が変わらなかったのですが、苗字が変わる人はもっと多くの手続きが必要になります(銀行口座とか)。誰か書いてくれないかなー。
婚姻届
言わずもがなですが、入籍するためには婚姻届の提出が必要です。
記入に必要なもの
- 認印(夫、妻)
- 証人の署名捺印(2人・誰でもいい)
提出時に必要なもの
その他注意点など
- 婚姻届に捨印が必要と書いてあるサイトがあったが、私の場合は必要なかった
- 本籍地はきっちり戸籍通り書かないとその場で書き直しくらう
- 住民票の発行等よりずっと時間がかかった(私の場合は20分ほど)
- 手続きが終わってから、本籍が変更になるまで1週間前後かかる*1
免許証
免許証を持っている方は、警察署や運転免許更新センターで本籍地の変更が必要になります。
変更に必要なもの
- 新本籍地つきの住民票原本(返却されないので注意)
- 免許証
パスポート
本籍地の都道府県が変更になった場合のみ、パスポートの記載事項変更が必要です。
変更に必要なもの
- 戸籍謄本、または戸籍抄本
- パスポート用の写真
- 持っているパスポート
- 場合によって必要な書類があるので、 PASSPORT_氏名・本籍・住所が変わったとき も参照のこと
パスポートについては、私は記載事項変更をしない予定です。
というのも、海外旅行するだけであれば出入国審査で本籍地をチェックされたことは今まで一度もなく、手続きの手間や手数料の支払いが面倒だからです。
不安な方は記載事項変更しておいたほうが無難かとは思います。
まとめてみるとそれほど手続きは多くはないのですが、一から調べようと思うとこういうの面倒なんですよね。 このまとめが誰かの役に立つことを願います。
*1:本籍が変更になる前にどうしても変更後の本籍が書いてある書類が必要な場合は、役所の戸籍係に相談すると対応してくれることもある
【2014年】ふるさと納税でもらってよかった食べ物/よくなかった食べ物
去年初めてふるさと納税を始めたのですが、今までやらなかったことを後悔するレベルでよかったです!
詳しい説明は下記ページに譲るとして、私が去年ふるさと納税でもらってよかった食べ物、よくなかった食べ物を書いていこうと思います*1。
ふるさと納税[ふるさと寄附金]とは?本当のメリットを、実はあまり知られていないのです。 | ふるさと納税ポータルサイト「ふるさとチョイス」
よかった食べ物
佐賀県玄海町 黒毛和牛 (10000円)
すき焼きにして食べましたが、最高ですね。スーパーで売ってる高い肉よりもうまいレベル。2〜3人前くらいありました。
山形県長井市 米沢牛すき焼き・しゃぶしゃぶ用 (10000円)
しゃぶしゃぶして食べましたが、最高ですね。スーパーで(ry。450gなので、こちらも2〜3人前くらいでしょうか。
鳥取県境港市 境港産紅ズワイ脚肉爪肉セット (10000円)
蟹って1パイまるまる届いても調理したりむいたりするの面倒なんですが、これはあらかじめむいた状態で冷凍で届くので、解凍するだけで食べられます。
蟹しゃぶにして4人前くらいあり、味も満足できるレベルなのでかなりオススメです。
大阪府泉佐野市 こがしバターケーキ (5000円)
コーヒーと一緒に食べると激うまいです。焼き菓子なので10日ほど日持ちするのもGoodですね。
よくなかった食べ物
佐賀県玄海町 いちご「さがほのか」 (5000円)
郵送のせいかもしれませんが、届いたときにいちごが全部潰れてしまっていました。味もスーパーのいちご以下に感じたのが残念。
鳥取県鳥取市 農家が作った「ジェラート4種類6個セット」 (5000円)
ミルクジェラート以外、口に合いませんでした。
鳥取県琴浦町 ふろしきまんじゅう (3000円)
味は悪くないのですが、到着日=賞味期限、というのがかなり厳しいです。16個入りのまんじゅうを1日でおいしく消費できる方であればよいかもしれません。
さーて、確定申告しなきゃだ。
*1:画像はふるさとチョイスより引用
2014年を振り返る
明けましておめでとうございます。
去年も一年の振り返りエントリ(2013年を振り返る - るさんちまん)を書いたので、今年も書いてみようかと思います。
仕事
部署異動やチーム異動もなく、バタバタしていた2013年とはうってかわってまた腰を落ち着けて運用開発を行っていました。
それほど書くこともないのですが、やったことをいくつか書き残しておきます。
フロントエンドをかじる
入社してから今まで、業務で書くコードはほとんどサーバサイドでたまにHTMLをちょろっといじる程度だったのですが、チーム内開発ツールを作成するにあたってHTML、CSS、JavaScriptをある程度の量書けたのはいい経験でした。
ただ、ほとんどなにも知らない状態からコードを書いていたので、今見たらだいぶコードがひどい…。
連勤術師になる
11月、12月はひたすら、ただひたすら働いていました。
新規開発案件を通常の倍以上のスピードで企画・開発し、入社以来一番働いた2ヶ月になりました。
途中体調を崩してしまってつらい時期もありましたが、大きな障害もなくリリースまでこぎつけ、かつユーザに喜んでもらえたので、今となってはいい思い出です(もうこれっきりにしたいですが)。
プライベート
旅行によくいく
2014年はよく旅行にいく一年でした。
保育士試験にまた落ちる
去年に引き続き2年目の保育士試験。
仕事が忙しかったのと前年ほどの勉強モチベーションが湧かなかったのでほとんど勉強してなかったのですが、運良く筆記試験には合格しました。
実技試験は読み聞かせとピアノの弾き語りを選択し、スタジオを借りて十分にピアノの練習をしたつもりだったのですが、当日にアガってしまって失敗。読み聞かせは合格だったものの、弾き語りが3点足りずに不合格となりました。
来年こそは必ず!!!
というわけで、2014年も色々な方にお世話になりました。
最近はエンジニアとしての成長が極端に鈍化していてかなりマズい状況なので、プライベートでの勉強時間をしっかり確保しようと思います。
2015年もよろしくお願いいたします。
Limechatのテーマをカスタマイズしてみた
MacのLimechatではデフォルトのLimelightというテーマを使っていたのですが、使っているうちに下記のような不満や要望が出てきたのでカスタマイズしてみました。
- コピペがしにくい
- join,quit,modeなど不要なメッセージを消したい
- 常に発言の時間を表示したい
MacのLimechatはテーマのカスタマイズがCSSとyamlをいじるだけでいけるので、CSSの知識がある方なら簡単にカスタマイズできます。
カスタマイズ前後の比較はこんな感じ。
[before]
↓
[after]
Limelight_my.css · GitHub
変更点
主な変更点は上に挙げた不満の解消です。
- join,quit,mode,part,nick,replyメッセージを非表示にした
- display:block要素を削除してフラットな表示にした(行単位でコピペできる)
- 左端に時間を表示した
また、ハイライトの表示は自分の好みで少し変えました。
cssだけでなくyamlも1箇所だけ変更していて、nickname-formatを'%n: 'にしています。
JavaScriptでローカルにファイルを保存する方法(その1)
JavaScriptでローカルにファイルを保存する方法を調べたので、メモ。
動作確認はMac OS X10.9.2、Google Chrome 33で行っています(他のブラウザについては、参考リンクにもある JavaScriptからローカルファイルを作成する方法まとめ - あらびき日記 をご覧ください)。
Chromeでローカルにファイルを保存するには、File API: Writerを使います。
単純なテキストファイルをローカルに保存するサンプルは下記のようになります。
サンプルコード
<script type="text/javascript"> function writeToLocal(filename, content) { // chrome以外は弾く var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf('chrome') == -1) { alert("This Page is Google Chrome only!"); } function errorCallback(e) { alert("Error: " + e.name); } function fsCallback(fs) { fs.root.getFile(filename, {create: true}, function(fileEntry) { fileEntry.createWriter(function(fileWriter) { fileWriter.onwriteend = function(e) { alert("Success! : " + fileEntry.fullPath); }; fileWriter.onerror = function(e) { alert("Failed: " + e); }; var output = new Blob([content], {type: "text/plain"}); fileWriter.write(output); }, errorCallback); }, errorCallback); } // クオータを要求する。PERSISTENTでなくTEMPORARYの場合は // 直接 webkitRequestFileSystem を呼んでよい webkitStorageInfo.requestQuota(PERSISTENT, 1024, webkitRequestFileSystem(PERSISTENT, 1024, fsCallback, errorCallback), errorCallback); } writeToLocal("hoge.txt", "foo\n"); </script>
サンプルコードの内容について、要点だけ説明します。
ファイルシステムの要求
まず、 webkitRequestFileSystem()によってファイルシステムを要求します。
第一引数にはwindow.PERSISTENT(永続データ)、もしくはwindow.TEMPORARY(一時データ)を指定します。
ここで注意なのがPERSISTENTを指定した場合で、データ保存許可をユーザから得なくてはいけません。
サンプルコードのwebkitStorageInfo.requestQuota()がそれで、ページ表示時に最上部に許可ダイアログが表示されます。ここで一度許可すると次回以降はrequestQuota()する必要はありません。
また、TEMPORARYを指定した場合にはrequestQuota()する必要はなく、単にwebkitRequestFileSystem()を呼べばよいです。
ファイル書き込み
fs.root.getFile()すると、内部的にファイルが作成されます。
最後に、Blobデータを作成し、fileWriter.write()でファイルに書き込みを行います。シンプルですね。
ただ、ここでもハマりポイントがあって、Blob作成にはBlob()を使いましょう。
他のページだとBlobBuilder()やWebKitBlobBuilder()を使っているものが多いですが、BlobBuilder()は非推奨、WebKitBlobBuilder()はChromeから既に削除されています!
作成されたファイルは、/Users/USERNAME/Library/Application Support/Google/Chrome/Default/File System/
以下に保存されます。
PERSISTANTで保存した場合は、上記ディレクトリ/(数字3文字のディレクトリ)/p
TEMPORARYで保存した場合は、上記ディレクトリ/(数字3文字のディレクトリ)/t
以下に保存されます。
その中で、さらに(数字2文字のディレクトリ)/(数字列だけの拡張子なしファイル)
に保存されます。なので、実はwriteToLocal()の第一引数で指定したファイル名はほぼ無意味です。
ただ、同じファイル名を指定すると同じファイルに保存され、違うファイル名を指定すると、数字が1増えたファイル名で保存されるようです。
まとめ
JavaScript+Google Chromeでファイル保存する方法はあるものの、ファイルの保存先が自由に選べなかったり(そりゃそうだが)、ファイル名を指定できなかったりで、使い勝手が悪いです。
ファイル保存先を指定するリンクを作成して、そこからファイルを保存する方法があるので、そのうちそのエントリも書きます。