むにえる牧場

毎日むにえるをつくっています

しがないラジオを聞いてTwitter転職した話

この記事は、#しがないラジオ Advent Calendar 2018の7日目の記事です。

しがないラジオについてはこちらから

概要

SES企業からスマートフォンゲーム開発企業の転職エントリー。

しがないラジオから刊行された完全SIer脱出マニュアルを読んで、転職活動を行い1か月弱で終わりました。
振り返ってみると、ものすごいスピード感だったなと思います。

booth.pm

経歴

  • 1993年生まれ25歳
  • ゲーム廃人

大学 - 情報系大学で緩くプログラミング学んでいた

1社目 - スマートフォンゲーム会社で初社会人

周りにめちゃくちゃできる強いエンジニアしかいませんでした。
同期で入社したエンジニアも強いエンジニアだらけでしたし、後輩となるエンジニアも強いエンジニアしかいない。(ように見えた)
そんな中、力の抜き方が分からず、ただただ行動へのハードルが上がって行き、片道1時間の満員電車通勤も重なって体調を壊してドロップアウト
計2年半ほどの勤務経験でした。

辞めてしまいましたが、エンジニアとしてはかなり恵まれた環境だったように思えます。
運営/開発どちらも経験できて、とても良かったです。

ムダに完璧主義な考え方があって、自分の意識と実際の行動のギャップに苛まれ、それが体調不良に繋がっていっていたのかと。
今となってはそう思います。

2社目 - SES企業(K社)

Twitterでちょくちょく流れてくる悪いところを詰め合わせたようなSES企業でした。
通勤時間を抑えるために自宅近辺で探したのですが、片道2時間程度かかるN●Cまで客先出向(常駐)

また常駐先の環境が悪く、

  • インターネット、社内イントラすら繋げない
  • ソースコードはzip化して、USBで手渡し
  • 穴だらけのウォーターフォール開発
  • 埃だらけ、タバコ臭い、表面の破けているパイプ椅子
  • 朝から晩までExcelいじってる人がいる
  • 紙とペンを使ってのテスト

役満な感じでした。
入社初日に、Excelで存在する文書を手作業コピペでWordに写すという作業を行い、(こういう世界存在したのか……)としみじみしていたのを覚えています。
極め付けに、自社の先輩社員に「弊社に向上心のある人なんていないよ」と面と向かって言われてしまい、転職活動への決意が固まりました。

Twitter転職

完全SIer脱出マニュアルを読んで触発されたこともあって、Twitterで転職活動を呟いてみました。
このツイートに対して11社ほど声をかけていただき、3社/週ほどのペースでカジュアル面談を行わせていただきました。

うち3社、内定をいただきました。
最終的に都心にあるスマートフォンゲーム会社(T社)で、12月から働きます。

カジュアル面談は楽しい

学生時代の就職活動は、肉体/精神ともに大変でした。
しかし、今回行ってきたカジュアル面談はほぼすべて楽しい!と感じることができました。

理由をざっと考えてみると、

  • 現職があるから失敗しても良いという安心感
  • 就職活動/転職活動を1度経験しているということ
  • カジュアル面談だから雰囲気がゆるい
  • 直接の採用面接ではないから、いろいろなことが聞ける
  • しがないラジオ界隈の人が関わっているコミュニティで転職について話ができた

といった点が、カジュアル面談を楽しめた理由になるかなと思います。

とはいえ、通常の業務を終えた後に1,2時間程度費やして転職活動をしていたのでかなり疲れました。
残業が多い生活をしていたら、絶対に無理だろうなと思います……
(僕は転職活動がない日に、多めに残業して仕事終わらせておくとかやってました)

おわりに

転職エントリーという名のふりかえりエントリーみたいになりました。
次の会社は組織的にまだそこまで大きくなく、いろいろなことに挑戦させていただけるので、どんどん新しいことに挑戦していきたいです。

改めてゲーム業界に身を置けるので、個人でもゲーム作ってApp StoreとかGoogle Playで公開とかしたいところ。

ほしいものリスト

様式美的にほしいものリストを載せます。
(今見たらkindleのものばかり登録していました……意味ない……)

ほしいものリスト

アドベントカレンダーバトン

8日目は@sapi_kawaharaさんです。
とても濃ゆい話を聞けそうな気がしています。
よろしくお願いします。

「テキスト校正くん」を導入して読みやすい文章を書きやすくなった

この記事は、write-blog-every-week Advent Calendar 2018の6日目の記事です。
write-blog-every-weekSlackへのjoinはこちらから

概要

ブログ記事を書くときには、読みやすい文章を書くことに意識を割かなければなりません。

11月からカックさん( id:kakku22 )のブログメンターを受けていますが、
誤字、脱字について注意を受けることが何度かありました。

とくに技術系の用語について

  • GitHubgithubと書いてしまう(大文字小文字の誤字)
  • QiitaQittaと書いてしまう(スペルミス)

というミスが多くありました。
これに気付くのはなかなか難しいため、校正ツールを導入しました。
ブログ執筆を支える技術としての紹介記事です。

テキスト校正くん

VS Codeテキスト校正のためのプラグインが存在します。

ics.media

テキストファイルや、Markdownファイルで日本語文章を書いているときに、自動的に文章のチェックをおこなってくれます。

f:id:jalemy:20181202215231g:plain
Githubgithubと間違えた場合

f:id:jalemy:20181202215237g:plain
同じ助詞を2重で使ってしまった場合

上記画像のように間違いがある箇所に対して、下線を引いて、誤りの内容まで通知してくれます。
この他、

  • 「ですます」調、「である」調の混在
  • ら抜き言葉
  • 二重否定
  • 箇条書きでの句点利用
  • 漢字の「ひらく」表現(特に->とくになど)

などなど、さまざまなチェックを行ってくれます。

テキスト校正くんを使ってみた感想

テキスト校正くんを使ってみて1か月弱経過しました。
例として挙げた、技術用語の誤り同じ助詞を2重に利用してしまうといったミスは目に見えて減りました。

また、誤字・脱字に対して意識を割かなくて良いので、「脳のリソースを無駄に使わなくて良い」という点が最高です。
(校正チェックなんて人間のやる仕事じゃないんだ……)

誤字・脱字が減った影響で、多少は読みやすい文章が書けるようになったかなという気がしています。
もちろん伝えやすい文章書けてなかったり、そもそも構成が悪かったりとかいろいろありますが……(要努力)

まとめ

ブログ執筆を支える技術としてテキスト校正くんを紹介しました。
無料で使えるツールですし、インストールの手間もとくにないので、ぜひ使ってみてはいかがでしょうか。

write-blog-every-week アドベントカレンダー7日目は、@Linus_MKさんです。
機械学習をやっていて滅茶苦茶強そうなエンジニアだと観測しているので、乞うご期待。
よろしくお願いします。

Gatsby + NetlifyでWebページを作って、公開するところまでやってみた

概要

とある友人から頼まれてポートフォリオサイトを作るという案件を趣味でやることにしました。
せっかくだからReact製の静的サイトジェネレーターGatsby.jsを使って、ホスティングサービスにはNetlifyを使ってモダンな感じで作ろうと、技術選定を行いました。
(僕はReactの経験、はたまたフロントエンドの経験全然ないです)
今回は、

  1. Gatsbyを利用してジェネレート
  2. Netlify上でサイトを公開する

まで備忘録として書き残します。

Gatsbyとは

GatsbyJS

  • Node.js環境で動作するWebサイトジェネレーター
  • 静的サイトを製作することに特化している
  • React Webpackとモダンな技術てんこ盛り
  • PWA(Progressive Web App)として生成することもできる
  • どんなに適当に作っても爆速で動作する設計になっている(らしい)

とメリットだけ見ると良い感じのフレームワークです。

デメリットとして、日本語の情報が非常に少ないことが挙げられます。
試しに2018/12/1時点でQiitaにてGatsbyを検索すると28件しか記事がヒットしません。
ドキュメントに関しても英語のものしか存在しないため、検索するのには一苦労します。

Gatsbyセットアップ

npmを利用してインストールします

$ npm install --global gatsby-cli

インストールすればgatsbyコマンドが利用できるようになっているので、まずはバージョン確認。

$ gatsby --version
2.4.6

僕が入れた時点では、2.4.6がインストールされました。
バージョンが確認できればセットアップはOK。

雛形ページ作成

$ gatsby new [PROJECT NAME]

でデフォルトの雛形ページが生成されます。
このコマンドの引数に追加でURLを指定することによって、ブログ用途にカスタマイズされているスターターを利用することもできます。
スターターの一覧はこちら

www.gatsbyjs.org

今回は特にスターターを指定せずに、デフォルトのものを利用します。
デフォルトの雛形ページのディレクトリ構成はこんな感じに。

f:id:jalemy:20181201173909p:plain:w300
Gatsby - default starterのディレクトリ構造

ローカル環境でテスト

$ gatsby develop

とコマンドを入力することで、ローカルに開発サーバーを立てることができます。
初期の状態では、localhost:8000にアクセスすればGatsbyのページを確認できます。

f:id:jalemy:20181201173914p:plain
Gatsby - defaultページ

なんかもうここまででWebサイトが作れている感じがして、満足感がでてきます。(はやい)

Netlifyでホスティングして、インターネット上で見れるようにする

最近流行りらしい(?)無料でWebサイトをホスティングできるサービスNetlify
先ほどGatsbyにて作成したページをNetlifyに上げるのはとても簡単で、

  1. Gatsbyで生成したプロジェクトをGitで管理するようにcommitする
  2. GitHubに上げる
  3. NetlifyGitHubを連携認証させる
  4. Netlifyで案内される通りにボタンをぽちぽちと押して、GitHub上に上げたrepositoryを選択する
  5. deployさせるのを待てば、終わり

基本的に案内通りで躓かなかったので、文字で手順だけ書くようにしました。
deploy時にエラーがあれば、こんな感じに表示されます。

f:id:jalemy:20181201173904p:plain
Netlify - Overviewイメージ

もちろんエラーがなければ、そのままdeployされてWebページが公開されるのでとても簡単です。
NetlifyGitHubのrepositoryを勝手に追随してくれるため、buildやdeployの手間が一切かかりません。便利すぎます。
あとはNetlifyが生成してくれたURLにアクセスすれば、自身の作ったWebページにアクセスできます。

まとめ

React製Webサイトジェネレーターや、Netlifyのようなホスティングサービスを利用することははじめてでしたが、1時間とかからずにWebページ公開するところまで行きつけました。
Gatsbyの設計思想や、Webpack周りの話などわからないことがたくさんあるので、時間を見つけつつポートフォリオサイト作成を進めていきたい所存です。

Gatsbyのスターターを覗いていたところ、ポートフォリオサイト作成用に公開されているスターターがあったので、その辺り利用すればサクッと作れるかなーと妄想しています。

Google Apps Scriptではてなブログの週間PV数をスクレイピングして、Spread Sheetへ書き込むところまで自動化してみた

概要

11月からカックさん( id:kakku22 )のブログメンターを受けています。
そこでKPIとして、

  • Twitterフォロワー数
  • ブログ週間PV
  • ブログ読者登録数

の3つをGoogle Spread Sheetに記録しています。
毎週末に記録しているのですが、手作業でやる作業ではないな!と思い立ったため、Google Apps Script(以下GAS)を利用して自動化することにしました。
今回はブログ週間PVのみ記事にします。

GASでログイン処理

はてなブログの週間PVはログインしたあとでないと見ることができません。
そこで、はてなブログのログインで利用されるURLに対して、POSTでログイン情報を送ります。
はてなブログのログインで利用するURLはここ
https://www.hatena.ne.jp/login

それではこのURLに対してPOSTリクエストを送ります。

var url, options, response;
  
  // はてなブログのログインで利用するURL
  url = 'https://www.hatena.ne.jp/login';
  
  // ログイン情報
  const payload = {
    "name" : "ユーザー名",
    "password" : "パスワード"
  }
  
  // POSTオプション
  options = {
    "method" : "POST",
    "payload" : payload,
    "followRedirects" : false
  }
  
  // POSTリクエスト
  response = UrlFetchApp.fetch(url, options);

これでログイン処理が実行されます。

PV数取得

先ほどログイン処理を実行して、自身のブログのPV数など見れるようになりました。
次はPV数をスクレイピングして取得します。
週間PV数の取得に利用するページはこちら

https://blog.hatena.ne.jp/jalemy/meuniere.hatenablog.jp/accesslog

このページに対して、

  1. ログイン処理で取得したクッキー情報を利用しながらGETリクエストを送る
  2. GETリクエストの結果、レスポンス情報が返ってくる
  3. レスポンス情報から、PV数を取り出す

という流れになります。

ということでコードはこんな感じに。

// POSTリクエストのレスポンスからcookieを取得
const cookies = response.getHeaders()["Set-Cookie"];
const header = { 'Cookie' : cookies };

// GETオプション
options = {
  "method" : "GET",
  "headers" : header,
  "followRedirects" : true
}
  
// はてなブログのアクセス数を見るためのURL
url = 'https://blog.hatena.ne.jp/jalemy/meuniere.hatenablog.jp/accesslog';

// GETリクエスト
response = UrlFetchApp.fetch(url, options);

// レスポンスからUTF-8でページソースを取得
const content = response.getContentText("UTF-8");

// PV数の前後についているタグを利用して、indexをつくる
const indexStart = content.indexOf("count-small");
const indexEnd = content.indexOf("td", indexStart);

// 作成したindexを利用して文を抜き出し、正規表現を利用して数字以外の部分を置き換え
const accessCount = content.substring(indexStart, indexEnd).replace(/[^0-9]/g, "");

これでPV数が取得できました。

Spread Sheetを取得

PV数のスクレイピングができたところで、Spread Sheetへの書き込みをGASからやります。
まずは対象となるSheetの取得から。

参考 qiita.com

Spread Sheetの作成方法によって、Sheetの取得方法を変更した方が良いみたいです。(詳しくは参考URLまで)

// SpreadSheetをID指定で開く
const spreadSheet = SpreadsheetApp.openById('SpreadSheetのID');

// SheetをSheetの名称で開く
const sheet = spreadSheet.getSheetByName('Sheet名');

これで該当の1シートが取得できます。

sheetに書き込み

f:id:jalemy:20181125140652p:plain

KPIを上記画像のような形式で記録しています。
自動的に次の行に差し込めるように実装します。

ということでコードがこんな感じ

// 列の指定用に変数作成
const dateColumn = 1;
const twitterFollowerColumn = 2;
const hatenaFollowerColumn = 3;
const weeklyPVColumn = 4;

// getLastRow()でspread sheetの数値記入がある最後の行が取得できる
// そこに+1して、次に書き込みたい行を取得
const nextRow = sheet.getLastRow() + 1;
  
// 日付を入力
sheet.getRange(nextRow, dateColumn).setValue(Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/M/d'));

// はてなブログのPV数を入力(getAccessCount()でPV数が返ってくるようにした)
sheet.getRange(nextRow, weeklyPVColumn).setValue(getAccessCount());

まとめ

今回ははてなブログのPV数しか自動化していませんが、同じような形でTwitterのフォロワー数/はてなブログ読者登録数も自動化します。

GASには日時を指定して、自動的に実行する設定があるので、これを週に1回動作するようにすれば自動化できます。

GASをはじめて書きましたが

  • spread sheetとの連携が楽に実現できる
  • 基本的にjavascriptだから、知見が豊富
  • ブラウザ上で動作するから環境作りとかしなくて良い

と良い感じでした。

最後にコード全体を貼り付けておしまい。

function getKPISheet() {
  const spreadSheet = SpreadsheetApp.openById('Spread SheetのID');
  return spreadSheet.getSheetByName('Sheet名称');
}

function getAccessCount() {
  var url, options, response;
  
  url = 'https://www.hatena.ne.jp/login';
  
  const payload = {
    "name" : "ユーザー名",
    "password" : "パスワード"
  }
  
  options = {
    "method" : "POST",
    "payload" : payload,
    "followRedirects" : false
  }
  
  response = UrlFetchApp.fetch(url, options);
  
  const cookies = response.getHeaders()["Set-Cookie"];
  const header = { 'Cookie' : cookies };
  
  options = {
    "method" : "GET",
    "headers" : header,
    "followRedirects" : true
  }
  
  url = 'https://blog.hatena.ne.jp/jalemy/meuniere.hatenablog.jp/accesslog';
  response = UrlFetchApp.fetch(url, options);
  
  const content = response.getContentText("UTF-8");
  
  const indexStart = content.indexOf("count-small");
  const indexEnd = content.indexOf("td", indexStart);
  const accessCount = content.substring(indexStart, indexEnd).replace(/[^0-9]/g, "");
  
  return accessCount;
};

function myFunction () {
  const sheet = getKPISheet();
  
  const dateColumn = 1;
  const twitterFollowerColumn = 2;
  const hatenaFollowerColumn = 3;
  const weeklyPVColumn = 4;
  
  const nextRow = sheet.getLastRow() + 1;
  
  sheet.getRange(nextRow, dateColumn).setValue(Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/M/d'));
  sheet.getRange(nextRow, weeklyPVColumn).setValue(getAccessCount());
}

homebrew cask で cocoscreatorv2.0.5 をインストールできるようにPRを出した

概要

homebrew caskでcocoscreatorというappを入れたかったのですが、versionが古いものしか登録されてませんでした。
そこでhomebrewについて調べてみたところ、GitHub上でOSSとして運用されていました。
僕個人からpull request(以下PR)を投げることができたので、投げてみました。
(人生初OSSヘのcommitです)

PRを作る上で何かと手間取ったので備忘録的に書き残します。

1. homebrew caskのrepositoryをfork - cloneする

github.com

homebrewのGitHubページに移動してforkします。
forkしたのち手元にforkしたrepositoryをcloneして手元で編集できる状態にします。

$ git clone git@github.com:[各自のユーザー名]/homebrew-cask.git homebrew-cask

2. cocoscreatorの最新パッケージを用意する

2-1. version情報をメモする

homebrewにversionを記載する箇所があるため、version情報を手元にメモしておきます。
大体appのパッケージ(.exe.dmg)にversion情報が載っているので、それを参照します。
今回利用したcocoscreatorは以下のような形式になっていたので、v2.0.5_2018110602 を書き留めておきます。

CocosCreator_v2.0.5_2018110602_mac.dmg

2-2. sha256のhashを作る

homebrewでは、改ざんなどを行ったパッケージが登録されていないか、不正防止用にパッケージごとhashが登録されています。
sha256のhashを作るためには以下のコマンドを利用します。

$ shasum -a 256 [パッケージ名]

このコマンドにて生成されるhashを書き留めます。

2-3. パッケージのdownloadに利用されるURLをメモする

パッケージの配布にCDNを利用していることがよくあるため、CDNで実際に利用されるURLを突き止める必要があります。
今回はMac.dmg 形式のファイルをダウンロードしていたので、ファイルの詳細情報を見て実際のdownload URLを突き止めることができました。

f:id:jalemy:20181118112858p:plain:h400

3. homebrew caskの編集をしてcommitする

cloneしてきたrepositoryの Casks/ 以下に、パッケージごとにrubyで実行内容が書かれています。
今回はcocoscreatorのcaskを編集したいので、 ./Casks/cocoscreator.rb を開きます。

大体どのcaskも下記のような内容になってます。

cask 'example' do
  version ''
  sha256 ''

  url ''
  name ''
  homepage ''

  app ''
end
項目 内容
version バージョン情報/番号
sha256 sha256のhashが記載されている。不正改ざん防止に利用される。
url パッケージのダウンロードに利用するURL
name アプリケーションの名称
homepage アプリケーションのホームページ。今回だったらcocoscreatorだから、 http://www.cocos2d-x.org/creator といった感じ。
app .appファイルの名称

今回はversion upのために編集をするだけなので、

  • version
  • sha256
  • url

と3種類の編集をすればお終いです。

PRを出す

homebrew caskではPRを出す際に、PRのコメントとしてテンプレートが準備されているため、テンプレートに沿って確認を行いcheckboxにcheckを入れるだけでOKです。
具体的には以下の4つ。

After making all changes to the cask:

  • brew cask audit --download {{cask_file}} is error-free.
    このコマンドを実行してエラーが出ないかどうか。
  • brew cask style --fix {{cask_file}} reports no offenses.
    このコマンドを実行してstyle checkが通るかどうか。
  • The commit message includes the cask’s name and version.
    コミットメッセージにcaskの名前とバージョンが記載されているかどうか。
  • The submission is for a stable version or documented exception.
    安定板、もしくは文書化されているような例外のものかどうか。

まとめ

まだPRはmergeされていませんが、人生初のOSS貢献(?)としてPRを出してみました。
gitのお作法さえわかっていれば意外とPR出すのは大変じゃありませんし、OSSのコードも読んでみてなんとなく理解できました。
(あまりruby経験ないのですが、過去のcommitから雰囲気で察しました)
自分の中でOSSへの参加ハードルがぐっと下がった感触を得ています。

実際に出したPRはこちら。
Testは通ってるの確認できたので、mergeされたら嬉しいなと。

github.com

追記(2018/11/18 19:00くらい)

無事mergeされてました!
人生初のOSS貢献達成です。

macでcocos2dxの開発環境セットアップをする

概要

転職先でcocos2dxを利用しているので、勉強としてcocos2dxで簡単なゲームを作ってみることにしました。
環境構築周りは大体忘れて悲しい思いをするのでメモとして残しておきます。

cocos2dxのセットアップをするにあたって、android-sdk/ndkやjavaなどいろいろと入れる必要があったので、全てhomebrewで入れてみました。

cocos2dxのダウンロード

www.cocos2d-x.org

こちらからダウンロードします。
zipが手に入るので、展開してmac/Applications フォルダに置きます。

javaのセットアップ

既にjavaが入ってたので、この機会に古いjavaを削除してhomebrew経由で入れてみました。
削除方法についてはこちらのリンクを参照。

macOSで古いJDKをアンインストール - Qiita

削除できたことが確認できたらhomebrew経由でinstallします。

brew cask install java

これだけでinstall終わります!homebrew便利!

android-sdk/ndkのセットアップ

brew cask install android-sdk
brew cask install android-ndk

apache antのセットアップ

brew install ant

cocos2dxのセットアップ

cocos2dxに必要なライブラリもろもろが揃ったので、cocos2dxそのもののsetupをします。
cocos2dxを置いたディレクトリに移って、

$ ./setup.py

Setting up cocos2d-x...
->Check environment variable COCOS_CONSOLE_ROOT
  ->Search for environment variable COCOS_CONSOLE_ROOT...
    ->COCOS_CONSOLE_ROOT is found : /Applications/cocos2d-x-3.17/tools/cocos2d-console/bin

->Check environment variable COCOS_X_ROOT
  ->Search for environment variable COCOS_X_ROOT...
    ->COCOS_X_ROOT is found : /Applications

->Check environment variable COCOS_TEMPLATES_ROOT
  ->Search for environment variable COCOS_TEMPLATES_ROOT...
    ->COCOS_TEMPLATES_ROOT is found : /Applications/cocos2d-x-3.17/templates

->Configuration for Android platform only, you can also skip and manually edit "/Users/jalemy/.bash_profile"

->Check environment variable NDK_ROOT
  ->Search for environment variable NDK_ROOT...
    ->NDK_ROOT not found

  ->Search for command ndk-build in system...
    ->Path /usr/local/Caskroom/android-ndk/18 was found

    ->Error: "/usr/local/Caskroom/android-ndk/18" is not a valid path of NDK_ROOT. Ignoring it.
->Check environment variable ANDROID_SDK_ROOT
  ->Search for environment variable ANDROID_SDK_ROOT...
    ->ANDROID_SDK_ROOT not found

  ->Search for command android in system...
    ->Path /usr/local/Caskroom/android-sdk/4333796 was found

  -> Add ANDROID_SDK_ROOT environment variable...
    ->Added ANDROID_SDK_ROOT=/usr/local/Caskroom/android-sdk/4333796

->Check environment variable ANT_ROOT
  ->Search for environment variable ANT_ROOT...
    ->ANT_ROOT not found

  ->Search for command ant in system...
    ->Path /usr/local/Cellar/ant/1.10.5/bin was found

  -> Add ANT_ROOT environment variable...
    ->Added ANT_ROOT=/usr/local/Cellar/ant/1.10.5/bin


A backup file "/Users/jalemy/.bash_profile.backup1" is created for "/Users/jalemy/.bash_profile".

Please execute command: "source /Users/jalemy/.bash_profile" to make added system variables take effect

setup.pyを実行すると上記の通りandroid sdkやndk、antのpathが聞かれます。
今回のようにhomebrew経由で入れた時は特に困らないはず……
setup.py により .bash_profile が更新されるので、 .bash_profile の内容を軽く確認して、言われるがままに

source ~/.bash_profile

を実行します。 これによって .bash_profile の再読み込みが行われます。

cocosコマンドが通ることを確認

terminal上で

cocos

とコマンドを入力します。 無事に環境設定ができて入ればcocosのコマンド一覧が出力されます。

まとめ

homebrew経由でjava/android-sdk/android-ndk/apache antを入れてcocos2dxのセットアップをしました。

とりあえずcocos2dxのデモアプリとか動かしつつ、軽くテスト用のプロジェクトを作って、何か遊べるゲーム作ろうかなと。

.jarファイルをdecompileして中身を見る

概要

業務中に hoge.jar という形でパッケージ化されたコードの中身が見たくてどうしようもない状況に陥ったのでやりました。
既に初期の開発メンバーがいなくてライブラリを把握してる人がいないとか、聞ける人がいないとか……
ポジティブに考えるならば、デバッグのためとか勉強目的として利用すると良いかもしれません。

jarファイルを解凍する

terminalにて unzip hoge.jar と打てばjarファイルの解凍が出来ます。
出力結果はこんな感じに

$ unzip hoge.jar
Archive: hoge.jar
inflating: META-INF/MANIFEST.MF
inflating: fuga.class
inflating: piyo.class
inflating: poyo.class
inflating: hage.class
...

classファイルをdecompileする

カレントディレクトリ直下にjarファイルを解凍した結果得られたclassファイルの大群がいます。
そのclassファイルをdecompileします。

decompileに使うコマンドはこちら

javap

参考
javap

javapコマンドは、1つ以上のクラス・ファイルを逆アセンブルします。出力は指定するオプションにより異なります。オプションを使用しない場合、javapコマンドは、そのパッケージ、渡されたクラスのprotectedおよびpublicのフィールドとメソッドを出力します。javapコマンドは、その出力をstdoutに表示します。

javap hoge.class

といった感じでclassファイルへのpathを渡せば標準出力でdecompile後のコードが出てきます。

複数の.classファイルを一括でdecompileする

今回は拡張子が .class になっているものだけ対象としたいので、 find コマンドを利用して一括でdecompileします。

find [ディレクトリ名] -name "*.class"

上記のコマンドで拡張子が .class になっているものが一覧で取れます。
この結果を javap コマンドに投げることで一括decompileします。

find [ディレクトリ名] -name "*.class" | xargs javap

xargs を利用して javap に投げ込んでいく形にしました。
結果こんな形の出力が得られます。

Compiled from "hoge.java"
public class hoge extends hogeBase {
public hoge();
public boolean isHoge();
}
Compiled from "fuga.java"
public class fuga extends fugaBase {
public fuga();
public boolean isFuga();
}
...

javap コマンドのみだと細かい命令文までは出力されないので、細かい部分まで見たい場合は -c コマンドをつけてください。
(invokeとかldcといったレベルで出てくるのでぱっと見では難しかったです……)

まとめ

unzipjavap を組み合わせることによって、 .jar ファイルをdecompileすることができました。
いざというときには便利です。
そもそも .jar ファイルの中を見なければいけない状況に陥りたくない。