JavaScriptのproxyでハマったこと

はじめに


JavaScriptを書いてる訳ですが・・・
久しぶりに書いて、初歩的なことでアレ?ってなったので備忘録的にメモしておきます

thisを自由に変更できるproxy関数を使う


大体、以下のような感じで、関数とコンテキスト(thisに設定するオブジェクト)を指定するわけです。

ですが、以下2つのコードで嵌まりました。

1
2
3
4
5
6
var obj = {
    doSomething : function() {
        alert('test');
    }
};
$('button#hoge').click($.proxy(obj.doSomething(), obj)); 
1
2
3
4
5
6
var obj = {
    doSomething : function() {
        alert('test');
    }
};
$('button#hoge').click($.proxy(obj.doSomething, obj)); 

一見、違いがなさそうなのですが・・・
実は、実行タイミングに違いがあります 。
一番、上の例だとイベント登録時に実行してしまいますが、
下のものはイベント実行時に正しく実行してくれます。

こんな、しょうもないことで詰まりましたw

即時関数


グローバルに変数割り当てなくてお得な感じ
あと、アレですね使い捨てできる(ぉぃ

1
2
3
(function() {
  alert('test');
})();

マージが起きたらさっさと解消しようという教訓

はじめに


Gitを使って開発してるのですが・・・

複数人で1つのプロダクト開発を行ってたらコンフリクトは起こることはよく有ります

俗に言うマージコンフリクトですね

今回はそんなマージコンフリクトで起こった事を備忘録的に残します

まず結論・・・


気づいた時点(Github,gitlab,stashとか)で、さっさとコンフリクトは解消しましょう

後にまとめて行うのは、無謀もいいとこです

1つ2つのコミット差分ならまだしも
10個のコミットが積み上げられ、かつその大半がコンフリクト起こすような状況だと直すのに苦労します

# 解消に1時間かかりましたorz

なので、さっさと直してしまいましょう(他人の書いたコードまでは責任取れないよw)

コンフリクト解消時に起こったこと


上記のことだけなら、反省だけで次回からは行わないようにすればいいだけの話です

ですが、コンフリクト解消時に奇妙なことが起こりました

以下のような状態でmasterのコードをブランチにとりこんだ時(実際はもう少しコンフリクト解消することがありました)

1
2
3
(master) : (起点) - [コンフリクト有(1)] - [コンフリクト有(2)] - [コンフリクト有(3)] - [ファイル移動] - [コンフリクト有(4)] - [コンフリクト無]
              |  
(branch) :   [A] - [B] - [C]

コンフリクト有(2)のコンフリクトを解消した瞬間に、ブランチの状態(merge/CONFLICT)だけでも、マージの継続をすることが出来なくなりました

このコマンドだけが使えました

  • continueは受け付け無い
  • abortとskipは受け付ける

そのため、一度abort→再マージをしたのですが・・・
今度は、コンフリクト(3)で同じ現象。。。

諦めてskipをしましたorz
そうすると、マージが全てブランチに取り込まれました・・・(ファイル移動は取り込まれてないので別途実施)

こういう恐ろしい事態(マージがうまくいかない)があったので、気をつけようねという自戒と対処結果のメモでしたw

Logbackで動的にログの出力先を変更する

はじめに


といっても大したことではなく、「同僚にできないの?」って質問されたことが発端です。

やったこと無かったけど、気になったので調べてみることにしました。

業務要件的にも、以下のことはありそうな感じかなーとは思いましたがw

  • あるログはデフォルトの出力先に
  • 致命的なエラーは、ログの出力方法はそのままで別の出力先に

やり方


割りと簡単に出来ました

手順としてはこんな感じ・・・

  1. Loggerを取得する
  2. Loggerから変更対象の設定名でAppenderを取得する
  3. AppenderをFileAppenderにキャストする(コレがミソ)
  4. ログ出力を一時停止する
  5. setFileメソッドで出力先ファイルを変更する
  6. ログ出力を再開する

コードにするとこんな感じかな(loggerの取得方法は色々変りそうだけど・・・)

1
2
3
4
5
Logger logger = LoggerFactory.getLogger(LogbackLogging.class);
FileAppender<ILoggingEvent> fileAppender = (FileAppender<ILoggingEvent>) logbackLogger.getAppender("FILE");
fileAppender.stop();
fileAppender.setFile("your_new_log_file");
fileAppender.start();

実は、以下の2つのことで気が付きましたw

  • javadoc(Appenderを実装してる)
  • getAppenderメソッドの戻り値(Appenderが返される)

感想


割りと簡単にできるんですねw

後はこの処理をラップしたようなクラス&静的メソッドを作ると汎用的に使えていいのではないだろうか。。。

Volleyをビルドする

はじめに


とある作業でAndroidの通信用ライブラリ「Volley」を使いたくなりました。
が、毎回使うたびにeclipseでーとかやりたくないわけです。
なので一度ビルドしてしまい、ライブラリ化してしまおうという魂胆です。

# 毎回、ビルドどうやるんだっけな?ってAnt Task見たりするのも面倒というオチもあったりw

ビルド前準備


Volleyにはビルド用のファイルとして、以下の2つがついています

  • Ant
  • Gradle

ですが、Gradleでビルドしようとした場合、エラーになります。
タスク一覧も見れませんでしたw

という訳でしたのでAntでやります。

その前に、VolleyはAndroid4.0がベースで作られているようなので、Android4.0のライブラリをインストールしておきます。

ビルド


以下のコマンドでビルドします。

1
$ant jar

成功すれば、「volley/bin/volley.jar」というファイルが出来てます。

バージョン管理とか


ここからは完全に余談なのですが・・・

こういうライブラリを使う場合だと、バージョンが重要だったりしてきます。

では、どうすればいいかということなのですが、自分としてはgit submoduleを使うことをオススメします。

こうすることで、本体コード(volleyを使う側)のバージョンアップに合わせて、都度volleyのバージョンアップを図ればいいことになります。

こんな感じのディレクトリ構成とし、Volleyは都度上記コマンドでビルドする運用

1
2
3
4
5
Android
  |
  |- MainProject(自分が作成するアプリ)
  |
  |- Volley

git submoduleのコマンドは以下です。

1
$git submodule add https://android.googlesource.com/platform/frameworks/volley Volley

submodule化したものを更新する場合は、以下のコマンドです
# 初回の場合は、updateではなくinitをしてsubmodule化したファイル類を取得する必要があります

1
$git submodule update

Gitkeepを作成、及び削除をするshellを作った

はじめに


以下のようなディレクトリ構成のときに.gitkeepを作りたかったのです。

1
2
3
4
└── test
    ├── test1
    │   └── test2
    └── test3

ですが、これを手で一つ一つ用意するのは非常に面倒なわけでして・・・
ついカッとなって用意しました。

# chefお前のことだ!!
# Railsなんかはきっちり用意してくれてるのにね

コード本体


以下のコードをコピペして適当に実行権を与えたファイルにしてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash

function create() {
    dir=$1
    if [ ! -f "${dir}/.gitkeep" ]&&[ ! -z "${dir}" ]; then
        touch ${dir}/.gitkeep
        echo  "Create .gitkeep in `pwd`/${dir}"
    fi
}

function remove() {
    dir=$1
    if [ -f "${dir}/.gitkeep" ]&&[ ! -z "${dir}" ]; then
        rm ${dir}/.gitkeep
        echo  "Remove .gitkeep in `pwd`/${dir}"
    fi
}

function start() {
    command=$1
    for DIR in * ; do
        if [ -d "${DIR}" ]; then
            if [ "${command}" = "create" ]; then
                create $DIR;
            fi
            if [ "${command}" = "remove" ]; then
                remove $DIR;
            fi
            (cd "${DIR}"; start $command;)
        fi
    done
}

command=$1
if [ -z "${command}" ]; then
    command="create"
fi

if [ "${command}" != "remove" -a "${command}" != "create" ]; then
    echo "Usage : ./gitkeep.sh create or ./gitkeep.sh remove"
    exit 1
fi

if ! git rev-parse 2> /dev/null; then
    echo "Abort!!"
    echo "This directory is not git repository!!"
    exit 1
fi

start $command;

使い方


上記のコードをgittkeep.shとして保存していたと仮定した場合

.gitkeepファイル作成する場合は、以下のコマンド

1
$sh gitkeep.sh create

.gitkeepファイルを削除する場合は、以下のコマンド

1
$sh gitkeep.sh remove

Surface Pro2を買いました

はじめに


表題にもあるようにSurface Pro2を買いました。

元々、WindowsOSはあんまりーな人なのですが、気になるのでつい買ってしまいました。

というわけで、経緯と感想を残します。

経緯


元々、WindowsOSはPCゲームか動画鑑賞の用途で使っていました。

とはいえ中古品でちょっとなーとなってました(バッテリー的な意味で)

加えて、身内が捨てるぐらいなら使うので欲しいと言ってきたので、これ幸いという感じでした。

また、SUrfacePro2のスペックもノートPCと遜色ないじゃんということで購入に至りました。

買うまでに結構苦労したことは内緒ですw

使用感


セットアップに関して

  • PCのアカウントとMSアカウントを区別してセットアップする方法が解りにくすぎる

ソフトウェアキーボードに関して

  • タブレット型としては後発の癖に、最低な使い勝手
  • iOSやAndroidだと入力位置に合わせて自動で位置調整してくれますが、全くしてくれません
  • ソフトウェアキーボードに隠れて入力した内容がみえないことも
  • これは、タイプカバー必須というところでしょうか

全体に関して

  • 稀に固まってしまって動かないことがある(強制再起動必須)
  • わかりやすくしようとした結果なのかもしれないけど、設定したい内容がコントロールパネルの何処にあるのか不明(分かってる人に使いづらい仕様)
  • ホームネットワーク?wifiの細かい設定とか何処?色々なところに飛びすぎて分からん・・・
  • UI面(タイル?メトロUI?)は、程よく後発なだけあって直感的で使いやすい!!
  • 右スライドで時間表示、PCやアカウント設定、検索(中身は兎も角)としてをすぐにできるのはGood
  • 左スライドで起動中のアプリにすぐ戻れるところや画面分割ができるところは使いやすいかも

要するに、今までのMS製品の中ではUI面は非常に凝ったものではないのかと思いました。 個人的には、この使いやすいさとXPのPCとして使い勝手の良さ(慣れてる人にも使いやすいという意味で)が合わさってくれるといいのかなと思いました。

wifiプロファイルの削除方法


これが一番悩みました。hoge(1), hoge(2)みたいなプロファイルを勝手に作らてしまい削除に困り果てました。

どうやら仕様変更っぽくって公式回答(MSのモデレーター)でも以下を実行しろとありました。

1
2
$netsh wlan show profiles
$netsh wlan delete profile name="消したいwifiプロファイル"

ちょっとここはいけてない感じがします、ともすればデグレードって取られかねない仕様ですね。

個人的には設定周りはまとまってて欲しいと思うけどなぁ。

今更ながら、艦隊これくしょん(通称、艦これ)始めました

はじめに


今更感が半端ない訳ですが、始めました。

あ、因みに、自分はハードにゲームするわけでもない人間です。

そんな自分が初めてしまったので、感想的な何かを書き下して見ます。

# 今年に入ってからなので、1週間程度のプレイ

プレイ前の印象


こんな感じのことを思ってました。

  • よくあるソーシャルゲームでしょ
  • 某Pがいるような、課金すればするほどするほどのゲームでしょ
  • 俺ツエーしたければ、課金(ry
  • ていうか、絵を集めて何が残るの???
  • ゲーム性あまりないんじゃね?

上記に加えて、ソーシャル界隈のちょっとアレな話を耳にしていました。

どちらかというと以下のほうが気になってました。

  • ビジネスモデル(ソーシャルゲームだと斜陽になりやすいので)
  • サーバ構成&運用などの技術構成要素

# バックが角川なので気づけというのは置いとくとして・・・

プレイのきっかけは?


元々、色々なところで話を聞いていたのもありますが、身内が始めてたというのがあるかもですね。

実家の方針かどうかわかりませんが、冒頭でも述べたように元々TVゲームをハードにする家ではありません。
身内もソーシャルゲームに関しては、完全に否定気味です。

# TVゲーム機は有れども、ソフトが無い(買ってもらってもソフトは自腹)
# TVゲームができるTVは1台しかないので、親兄弟で取り合いになる
# その割には、PCは1人1台状態だったり等など・・・
# ちょっと古い感じのお家ですね。(TVゲームはあまり良しとしない感じ)

そんなお家にも関わらず身内がはまり込んでいるのでどんなものなの?という興味が湧いたというところでしょうか。

あとは、プレイヤー解放のタイミングが自分の休みと偶然合致したということもあります。

# 基本、平日の夕方とかがプレイヤー解放タイミングっぽいので・・・

感想は?


以外とよく出来てるなぁと思いました。
ざっと、以下のような感想ですね。

  1. 基本的に無料で長く遊べる(途中で飽きなければですが・・・)
  2. 戦艦とかの修理に、現実の時間が取られる(実際に修理している感がある)
  3. 俺ツエーしたい要素もある(課金によるゲーム投資)
  4. けれども、課金しない人でも俺ツエーできる要素がある
  5. 艦船ごとのキャラづけ

よく言われる運ゲーという感じですが、殆どの要素がそうなってますね。
これが、良いか悪いかは置いておきます。
# プレイヤーは指揮する人なので当然ですが・・・

1に関して、本当にコレクション要素があるので(まぁ萌え絵だったりするのですが・・・)、
コレクションするのが好きでとかソーシャルゲームが好きという人には向いてるのかと思います。

2に関して、戦艦だったり、重巡洋艦とかだと修理するのに1時間とか平気でかかります。
割りと現実(?)に則した感じなのがよいと思います。
現実感ある感じですね。(頭使って運用しましょうという感じ)

3,4に関しては、こんな印象

基本、運ゲーなのでプレイヤー同士の強い弱いはあまり関係なかったりします。(正確には全くないわけではないですが)
違いは運用できる艦隊になります(戦艦や正規空母なら強いが、駆逐艦だと弱いなど)

要するに俺ツエーは以下にいくらかけれるかということになります。

  • 艦船の建造(コレクション要素)
  • 出撃による弾薬や燃料(資材の要素)
  • 修理や開発に必要なドックの数(基本は2つずつ)

こういう感じなので、無課金の人でも俺ツエーが出来ちゃったりします。
# この要素があるので無料だったら遊んでみる?みたいな人もいるかもしれないですね。

5に関して、史実を元にキャラを作ってるようなので面白いですね(これが、ウケたということもあるかも)
他に、艦船を調べてみるキッカケとかになることも多いようです。
# 自分もちょっとwiki眺めたりとかしたりしましたw

課金はしたの?


えっと・・・、以下に課金しました^;;

  • ドック開放(修理2つのみ)
  • 資材をちょこちょこと(高コストな艦隊すぎて・・・)

元々、気になってところはどうなの?


ビジネスモデルという意味では、もう推して知るべしって感じですね。
# 元々の構想にあったかは知りませんが・・・

十分にメディアミックスしてるじゃないですか。。。

最後に、現時点であなたの運用している艦隊をplz


こんな感じです。アホみたいな火力なので、1回で資材が消し飛びます。

  • 加賀
  • 赤城
  • 飛龍
  • 長門
  • 金剛
  • 鳥海

他に、「愛宕、那智、加古、翔鳳、龍驤、木曾、夕立」がいますね。
# 長門とか正規空母はレアらしいですが、なんか直ぐ建造できますた
# 俺ツエー要素ですね(殆どクリアしていないのに・・・)

Android端末のROM焼きをやってみる

はじめに


Android端末ではNexus5を使用しています。

ついこの前(?)、4.4→4.4.2にアップデートしてみました。

アップデートしてみたところ、全体的な機能改善がされていました。

ところが、端末スピーカーを使って音声再生したところ音が割れるようになりました。

暫く、我慢して使って音声再生していたのですが、最早限界に達しましてダウングレードをすることにしました。

# 大体、Android界隈でこういうROM焼きをする場合ってカスタムROMを焼くことが多いですが・・・ ^;;

# カスタムROMにしてしまうとAPIとか動作含めて検証機として微妙かなという印象もあるので純正にします。

注意事項


本作業によって、メーカーの補償は一切きかなくなります。
本作業でデータが消えたり、Nexus5が起動しなくなってしまったとしてもこちらは一切責任を負いません。
全て自己責任でお願い致します。

対象機器


Nexus5

手順


どの端末で大体やることは同じのようです。

  1. Bootloderの解除
  2. ROMの入手
  3. ROMを焼く

Bootloderの解除


実はこれが一番ハードルが高いです。
機種によって解除するための作業が微妙に異なるためです。(解除するための鍵を入手したり等)

幸いなことにNexus5はハードルが高くありません。

# 流石、天下のGoogle様ですねw

以下の手順で行います。

  1. adb reboot bootloaderを入力する(電源ボタンとボリュームダウンボタンを同時押しで電源を入れるでも可)
  2. 画面に倒れたドロイド君が表示されていればOK
  3. fastboot oem unlockを入力する
  4. Nexus5に、「Unlock bootloader?」と尋ねる画面が表示される
  5. ボリュームボタンを操作し「Yes」を選び電源ボタンを押す

上記作業が成功すれば、Nexus5のブートローダー画面のLOCK STATEが「unlocked」に変化しています。

ロックしたい場合は、fastboot oem lockと入力すれば、LOCK STATEが「locked」に変化します。

ROMの入手


ここは簡単です。

純正のROMは、Factory Images for Nexus Devicesから入手できます。

# カスタムROMは専用のサイトとか行けばよいと思います。

ROM焼き


これも簡単です。

純正のROMの場合は、shellとバッチが用意されていますのでそれを実行するだけです。
実行タイミングは、ブートローダー画面で行います。

こんな感じでログが出たあとに端末が再起動すれば成功かと思います。

1
2
3
4
5
6
7
8
9
10
sending 'bootloader' (2506 KB)...
OKAY [  0.288s]

中略

writing 'cache'...
OKAY [  1.904s]
rebooting...

finished. total time: 99.240s

以上!!自分の作業備忘録でした!!

Findのexecオプションとxargsコマンドについて

はじめに


年が明けましたね。

せっかくの休みなので、今まで溜め込んだファイルの整理をすることにしました。

無駄なファイルが山ほどあって、検索からの削除を便利にしよう

そう思ったのが今回の発端です。

さて、やります。

ファイル検索といえば


findコマンドを使いますね。

execオプションやパイプとともにxargsコマンドを駆使して検索したファイルに対して処理をします。

今回の要件ファイル削除系だとこんな感じですね。

1
$find . -name "*.dummy" -exec rm {} \;

xargsを使う場合だと、こっちですね。

1
$find . -name "*.dummy" -print0 | xargs -0 -n1 rm

因みに、print0オプションを有効にすると区切り文字がスペースから \0 に変更されます。
ファイル名にスペースがあるかもしれない場合とかはつけておくことがよいと思います。

他にxargsの-0オプションも上記同様のものです。-n<数字>は1 コマンドラインにつき最大の数字分ずつ引数として使用するという意味になります。

execオプションでxargsと同様の処理


これをする場合は、+を使えばよいようです。

1
$find . -name "*.dummy" -exec rm {}+

これだけだと意味があるような、ないような^;;

findのdeleteオプション


OS依存になるようですが、findコマンドにはdeleteオプションがあるようです。
これを使えば、上記のようにコマンドの組み合わせをせずともファイル検索→ファイル削除も同時にできるようです。

1
$find . -name "*.dummy" -print0 -delete

検索と同時に削除なので、危険な感じがしますが、便利に使えると思います。

まとめ


大したことでもないですが、こんな感じですね

  • findとxargsを組み合わせる場合、find側はprint0オプション、xargs側は-0オプションを付けたほうが安全
  • findコマンドでxargsと同様のことがしたい場合、execオプションの末尾を;から+に変更する
  • 検索+削除の場合、findコマンドのdeleteオプションを使うと便利

2013年の振り返り

はじめに


年の瀬なので、今年一年を振り返ってみました。
思えば、今年一年は色々とあったなーと思いました。

上半期(1~6月)、下半期(7~12月)の2つのセクションで振り返りたいと思います。

上半期(1~6月)


この頃はあまりモノ作りというものをやってなかったような気がします。

# どちらかというとR&Dライクな何かでしょうかね・・・。

とはいえ、元々自分が何がしたかったのかを思い出せた出来事がありました。

# 出来事についての詳細は割愛します。

ここまででは、やりたいことを思い出しただけですね。

そうそう、忘れてはいけないイベントがありましたね。

GoogleI/Oへの参加

これが、上半期の中で一番デカイイベントでした。

# 初めての海外ということもありますがw

世界のエンジニアと交流することで色々と刺激やツッコミを貰ったりしました。
ここで、自分が本当にやりたいことをやるためには行動が必要だということを学びました。

# 勿論、技術ネタも学んできましたよ。

下半期(7~12月)


さて、実際に行動をする訳ですが、まぁ色々と駄目出しをいただくわけでして・・・

結局、転職という道を選びました。

# 自宅も引っ越しするという・・・

今は、晴れてRailsをやっています。

やはり、今まで事業的な視点を持っていないことが結構キツイですね。
キツイ中でもやり甲斐はあってかなり楽しくやれています。

# 技術が楽しいというのもあるし、コードや開発プロセス、標準使用ツールなどが自分に合ってるというのもあるかもしれないです。

転職して「Androidという最新でイケイケなことを捨ててWeb業界に来たの?」よく言われます。

元々、Androidというかmobile系がやりたかったというわけではないということが理由としてデカイです。

終わりに


お茶を濁してる部分がかなりありますが、其処はアレがあるということで・・・

さて、来年はどうなることですかね。
もう少し、事業的なことにも目を向ける必要がありそうですね。

今(2013年)以上に充実した生活を送りたいですね。

# そろそろ、婚活的なアレもいるんだろうか・・・

というわけで、振り返りになってない振り返りでしたw