2014年12月21日日曜日

Android Studio を 0.8.9 から 1.0 にアップデートしたときにアラートが発生

Android Studio がメジャーバージョン 1.0 をリリースしたと知り、アップデートしたときに
「Android SDK folder can no longer be inside the application folder」とアラートが発生しました。


今までインストールされていた SDK フォルダの位置がアプリケーションフォルダにあるのは
都合が悪いので別の位置に移動してください。というような意味?でしょうか。
このまま Retry を押しても何も変わらないので、Exit で中断して今ある SDK フォルダを
別の位置に移動しました。

SDK フォルダの中身が数GBあったので移動するだけでも1時間以上掛かりました。
同じ手順を踏むときには、時間に余裕のあるときに行おうと思います。
(最初、コピーではなく切り取りで処理してしまい、ファイルの確認ダイアログが頻発していました)

SDK フォルダを移動後、もう一度アップデートを行うと今度は無事に 1.0 へのアップデートが
できました。

移動する前の SDK フォルダは次のパスにありました。
C:\Users\[user name]\AppData\Local\Android\android-studio\sdk

Android Studio での既知の問題?のページもありました。
今度何かあったときにはこのページも確認したいと思います。
http://tools.android.com/knownissues

IntelliJ IDEA 14 の Community Edition で Gradle の依存関係を解決する方法

IntelliJ IDEA 14 の Community Edition を利用して Gradle によるライブラリの依存関係を
解決しようと考えていたのですが、躓いてしまったので残しておきます。

Gradle は Android Studio でも利用したことがあり、IntelliJ IDEA をベースにしているので
操作も大丈夫かなと思ったのですが、そう上手くはいきませんでした。
依存関係を解決するための build.gradle を編集したときに Android Studio では更新する
UIをすぐに見つけられたのですが、IntelliJ IDEA 14 ではすぐに見つけることができませんでした。

見間違いで無ければ、IntelliJ IDEA 14 では Gradle のようなツールウィンドウは初期設定では
サイドバーに表示されていませんでした。

ツールウィンドウを表示する方法はメニューの File > Settings を選択し
Appearance & Behavior > Appearance にある Show tool window bars にチェックを入れて
OK を押して設定内容を反映することで IDE のサイドバーに Gradle などのツールウィンドウの
ボタンが表示されます。



表示されない場合は IDE 上で Ctrl + Shift + A を同時押ししてテキストボックスに Gradle を
入力して Gradle をダブルクリックすることでウィンドウが表示されます。


Gradle ウィンドウで上のキャプチャの赤枠内のボタンをクリックして実行することで
build.gradle に定義していた依存関係を解決することができました。

2014年11月12日水曜日

unarchive で dest '/path/to/directory/' must be an existing dir が表示されたとき

Ansibleで解凍した圧縮ファイルの内容をアップロードするときに利用するunarchiveモジュールで
msg: dest '/path/to/directory/' must be an existing dir が表示されたときはアップロード先の
ディレクトリが存在していないときに発生します。

2014年11月6日木曜日

scp コマンドを使うときコロンを忘れた

ファイルをセキュアに送信・受信できる scp コマンドを利用するときに
躓いてしまったのでメモ。

ファイルをリモートのホームディレクトリに送信する際に何故か送信できていませんでした。
何故?を5回ほど繰り返していたころに気付きました。
# いくら実行しても何も反応なし
scp [ファイルパス] [ユーザー名]@[リモートのIPアドレス]

# [リモートのIPアドレス]の後ろに : が付いている
scp [ファイルパス] [ユーザー名]@[リモートのIPアドレス]:
scp [ファイルパス] [ユーザー名]@[リモートのIPアドレス]:[リモートのパス]
コロンの微妙な違いを見つけられず時間を少し費やしてしまいました。
これでいけるだろうと思い込んだときに躓くと慌ててしまい、原因を探すのもズルズルと
なってしまう傾向があるので気をつけたいです。orz

2014年11月2日日曜日

Vagrant の共有フォルダ機能が動かないので応急処置

Vagrant で仮想マシンを作成するとマウントが失敗して共有フォルダ機能が動かなくなりました。
以前までは問題なかったのですが。

調べてみると他でも似たようなことが発生しているようでした。
一度 vagrant ssh で仮想マシンにログインし、yum update をしてから vagrant reload で再起動
すると共有フォルダの機能は動作するようになりました。

この方法でも良いのですが vagrant up のときに済ませることができないか探してみたところ
Vagrant の Box の VirtualBox Guest Additions を自動でセットアップしてくれるプラグイン
vagrant-vbguest はインストール済みでしたが、VirtualBox Guest Additions をセットアップ
するときにエラーが出ていました。

kernel も更新の対象に含まれていたので詳細な原因は分からない感じですが
今回は利用する Box を変更することで対応できました。
変更した Box では vagrant-vbguest がセットアップするときに更新がかかるパッケージには
kernel は含まれていませんでした。
# 以前はこの設定
config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5-i386_chef-provisionerless.box"

# 変更後の設定
config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-65-i386-virtualbox-puppet.box"
環境
Windows7
VirtualBox 4.3.16
Vagrant 1.6.5

2014年10月30日木曜日

View に渡す Context には注意しようと思った

View を生成するときに必要な Context で嵌りましたのでメモ。
2.x系のときに作成したアプリを 4.x系にしようとしたとき Theme は Holo.Light なのに
Dialog で表示される EditText の背景色が Holo.Light ではありませんでした。

原因は EditText を生成するときに渡す Context が Holo.Light を設定した Context では
ありませんでした。
作ったアプリの Theme は Activity ごとに設定しており、Application では Theme を何も
設定していなかったのでこのようなケースでは Activity を渡す必要がありました。
問題となっていた部分では getApplicationContext() を渡していました。

アプリケーション全体で共通の Theme を設定しておいたほうが得策だったと思いました。
今後のアプリ作成に生かしていこうと思います。

2014年10月21日火曜日

java.exe が終了できずに Java Update を実行できなかったとき

Java の更新があったので早速、実行してみようとすると java.exe が残っているので
終了してくださいと表示されていました。
思い当たる節は無かったのですが、タスクマネージャーのプロセスを見てみると
確かに java.exe が実行中だったのでプロセスの終了で終了させてから再度実行すると
まだ解決せず java.exe を終了してくださいと表示されました。

色々と確認していたところ Jenkins Slave をサービスで実行していたことを思い出しました。
Jenkins Slave をサービスとして稼動させていたのでプロセスを終了してもサービスを停止
しなければ何度でもプロセスは復活していました。
サービスを一時的に停止させてから実行してみると無事に更新できました。

2014年10月13日月曜日

Ansible で UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7

Ansible で次のエラーに遭遇しました。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 16: ordinal not in range(128)
調べてみると ": " が原因でした。
# ": " が含まれている
lineinfile: dest=/etc/aliases regexp="^#root:.+marc" insertafter="root: root@example.com" line="root: root@example.com"
# ": " を ":\ " に変更
lineinfile: dest=/etc/aliases regexp="^#root:.+marc" insertafter="root:\ root@example.com" line="root:\ root@example.com"
ダブルクォテーション(")で括れば解決できるというページもありましたが、私の場合は
\を追加してエスケープすることで解決できました。
(内容に誤りがありましたので、追記しました)

Ansible は YAML で記述するので今回は YAML のフォーマットに引っ掛かったようです。
気付くまでに 1時間くらい費やしてしまいました。

2014年10月12日日曜日

仕事を楽しくするマウス使わないで Google 検索の4ステップ

Google で検索結果を見るときに画面をスクロールしたり、検索結果サイトのリンクを
クリックするには、いつもマウスを使っていましたが、最近になってマウスを使わなくても
リンクをクリックしたり、ページ移動できることを知りました。

方法は簡単で

  1. アドレスバーまたは検索ボックスで検索条件を入力
  2. 検索結果が表示されたら Tabキーを1回押すまたは Tabキーを1回押して
    上下キーのどちらか片方を押す
  3. するとキャプチャの赤枠内のように右向きの矢印が表示されます
  4. 上下キーを押すと矢印がページ内の検索結果ページのリンク位置へ移動します
別タブでリンク先を表示するには Ctrlキー + Enterキー
新規ウィンドウでリンク先を表示するには Shiftキー + Enterキー
Enterキー でリンク先を表示します。

Windows 環境で確認しました。
Mac 環境でできるか分かりませんが、できる場合は教えていただけると嬉しいです。

今まで検索した後はマウスに手を伸ばしていて、キーボードから手が離れるのは嫌だなぁと
感じていたのですが、この tips があればキーボードから手が離れる回数が減るので助かります。
今までも Tabキーを押すことで移動はしてくれましたが、そんな所に移動しなくても良いのに…と
思っていたので。

ちなみにこの tips は Chrome、IE で動作するようです。
Firefox で試してみましたが、反応しませんでした。

環境
Windows7
Chrome
IE11

Android Studio のカラーテーマに目に優しい Solarized を設定する

今回は Solarized という目に優しいカラーテーマを Android Studio で利用してみます。

Android Studio でカラーを変更しようと思うと Settings > Colors & Fonts からできますが
変更できる項目が多いので 1から始めるとなると結構、労力が要ると思います。

簡単に導入できないか探してみたところ GitHub で IntelliJ IDEA 用が公開されていました。
Android Studio のベースは IntelliJ IDEA の Community Edition だったはずですので
これを利用させていただこうと思います。

README.md にインストール方法がありますが、Android Studio の場合は少し異なるので
導入したときの手順を残しておきます。

  1. Solarized Dark.iclsSolarized Light.icls をダウンロード
  2. ダウンロードしたファイルを Android Studio の設定情報が保存されているフォルダ
    %USERPROFILE%/.AndroidStudioBeta/config/colors に配置します。
  3. Android Studio を起動(または既に起動している場合は終了して起動し直す)
  4. Settings > Colors & Fonts の Scheme name から Solarized DarkまたはSolarized Lightを
    選択して Apply で適用

手順は Windows 環境を対象にしています。

前はコントラストが高い設定でも平気でしたが、最近はコントラストが低いほうが見やすいと
感じてきていたのでありがたいです。
職業柄、目を酷使するので助かります。

環境
Android Studio 0.8.9

2014年10月11日土曜日

プログラミング中にネーミングを考えるときに参考になったサイト

私の場合、プログラミング中にいつも悩むのがネーミングです。

フォルダ名やファイル名、クラスにメソッド、変数といたるところで名前をどうしようか
いつも悩みます。

名前をつけるときには英訳サイトを駆使したり、今まで作成したものを流用していました。
そんなとき、デベロッパーのためのネーミング辞書 codic というサイトを知りました。
このサイトを知ってからは名前の付け方のレパートリーが増えました。

候補が見つからないときもありますが、そんなときは別の方法を探せばいいのですから。
ユーザー登録すればネーミングを提案することもできるようです。

実のところ、自分でこういうWebサービスを作ってみたいなぁと思っていたのですが
先を越されてしまいました。残念。

2014年10月6日月曜日

Git で master ブランチに merge されたらデプロイするというフローが面倒臭いと言われた

複数人でとあるシステムを開発しているとき、共有で使用されている開発環境がありまして
システムの確認にはこの開発環境を利用しています。
(よくある構成かと思います)

普段、開発環境にシステムを反映するときにはファイルをアップロードするのですが、複数人で
開発していること、ファイルのアップ漏れや意図しないファイルの上書きによる問題の発生を
予防したかったので Git のブランチが merge されたら開発環境に反映される仕組みを導入して
おりました。
(仕組みについては今度投稿したいと思います)

この仕組みを導入して半年以上経っていましたが、上述の懸念事項は発生しませんでした。
merge は誰でも出来るようになっているのですが、メンバーが Git について詳しくないこと、一応
私がシステム開発を主動するポジションでしたので merge は私が行っていました。

ある日、システムの修正が発生し、対応は出来たのですが対応自体は他のメンバーが行っていて
いつも通り私が merge して開発環境に反映しました。
すぐに修正できる内容だったのですが、開発環境への反映がすぐに行われなかったので
統括している方に何故、すぐに反映されないのかと聞かれました。

そのとき、この仕組みのことを説明すると何でそんな面倒臭いことをしているんだと言われました。
正直、こっちが「えっ?」って思いましたが、堪えました。

この仕組みを利用しなければ、複数人で作業するときには冒頭の懸念事項があるので
都度、他メンバーに知らせたり、ファイルが上書きされるものなら元に戻したりする必要が
あって、そのときはロスが発生して無駄な時間を費やすのに。

コヤツは何を言っているんだ?自分には関係無くてもチームとしては関係あるんだよ!
チームの他のメンバーのこと考えているのか?と思いましたが、口には出さず堪えました。

モヤモヤした気持ちを鎮めるために、今まで開発環境への反映にどれだけの回数が
実行されたか確認したところ数百回行われていました。

この数を見て私は面倒臭いとは思いませんでした。
むしろ、この回数分はロスが発生する可能性を防げたと思いましたし、そう自分に言って
気持ちを鎮めました。

2014年9月27日土曜日

Bloggerでコードを折り返させないで表示する

以前Bloggerでコードを見栄えよく表示する方法を投稿したのですが折り返しがあると
見づらいと感じたことが何度かありました。
今回は折り返ししないで、枠内に収まらなければ横スクロールできるデザインにしたいと思います。

1. レイアウトの「ガジェットを追加」から「HTML/JavaScript」を選択します。
2. 「HTML/JavaScript」編集画面の「コンテンツ」に次のコードを埋め込んで保存します。
<!-- Google Code Prettify -->
<script src='https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js'></script>
3. テンプレートの「カスタマイズ」で「上級者向け」を選択します。
4. 「CSSを追加」を選択して次のコードを埋め込んで「ブログに適用」します。
li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{ list-style-type: decimal !important }

pre.prettyprint{
  overflow-x: auto;
  word-wrap: normal;
  font-family: 'Lucida Console';
}

ol.linenums{
  display: table;
  width: 93%;
}
5. ヘッダーの「Blogger に戻る」で戻ります。

widthを指定しないとコード行の背景色が欠けてしまうので設定しています。
widthは横スクロールの有無に関らず背景色が大きく欠けない程度に93%;を設定しています。
calc(100%-OOpx)と指定することで%指定でも任意の横幅を設定できるはずなのですが
認識せず思ったとおりに反映されなかったのでwidth: 93%;にしています。

IE11、Firefox、Chromeで確認したところ背景色も欠けずに表示されました。

2014年9月23日火曜日

CentOS6 に Pandoc を yum でセットアップする

CentOS6にPandocをセットアップしてみました。

Pandocのインストール方法にCentOSが無かったのですがEPELにパッケージがありました。

とりあえずPandocを試してみたかったので今回はこのパッケージを利用しました。

Pandocのインストール
# EPELリポジトリを取得
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# EPELリポジトリをインストール
rpm -ivh epel-release-6-8.noarch.rpm
# Pandocパッケージがあることを確認
yum info pandoc
# Pandocパッケージをインストール
yum install pandoc
PandocでMarkdownファイルをHTMLファイルに変換
# Markdownファイルを作成
vi input.md
# MarkdownファイルをHTMLファイルに変換
pandoc input.md -o input.html
input.mdの内容
# test

## テスト
input.htmlの内容
<h1 id="test">test</h1>
<h2 id="テスト">テスト</h2>
入力ファイルの文字コードはutf-8で作成しましたが、日本語も表示されていました。
今回インストールしたPandocは約2年前のバージョン(リリースページ)になるので利用するときは
だいぶ前のバージョンということを考慮しといたほうが良いかもしれないです。

Pandocパッケージ情報
Name        : pandoc
Arch        : x86_64
Version     : 1.9.4.1
Release     : 1.1.el6
Size        : 1.1 M
Repo        : epel
Summary     : Markup conversion tool for markdown
URL         : http://hackage.haskell.org/package/pandoc
License     : GPLv2+
Description : Pandoc is a Haskell library for converting from one markup format to another,
            : and a command-line tool that uses this library. It can read markdown and
            : (subsets of) reStructuredText, HTML, and LaTeX, and it can write markdown,
            : reStructuredText, HTML, LaTeX, ConTeXt, Docbook, OpenDocument, ODT, RTF,
            : MediaWiki, groff man pages, EPUB, and S5 and Slidy HTML slide shows.

VirtualBox 4.3.16 で has terminated unexpectedly during startup が発生したときにしたこと

VirtualBox 4.3.16 で仮想マシンが開けなくなるエラーが発生しました。
The virtual machine 'xxxxx' has terminated unexpectedly during startup with exit code 1 (0x1).

終了コード : E_FAIL (0x80004005)
コンポーネント: Machine
インターフェース: IMachine {480cf695-2d8d-4256-9c7c-cce4184fa048}
思い当たるのはVirtualBoxを4.3.12→4.3.16にアップデート中にプロセスが残っているにも
かかわらず無視(ignore)してアップデートしたことです。

次の手順で今のところ仮想マシンは起動できるようになったので残しておこうと思います。

1. VirtualBox 4.3.12をダウンロードページから再インストール
2. PCを再起動
3. インストールしたディレクトリの「\drivers\vboxdrv」フォルダにある「VBoxDrv.inf」ファイルを
右クリックで「インストール」を選択してインストール

これは 4.3.12 再インストール後に仮想マシンを起動すると"Cannot access the kernel driver"と
表示されたので、この症状に対応するためです。

Cannot access the kernel driver!
VirtualBox Runtime Error

4. PCを再起動
再起動せずに仮想マシンを起動すると"Cannot access the kernel driver"が出たので。

"Cannot access the kernel driver"には次のサイトも参考にさせていただきました。
http://kitaz.dip.jp/default/modules/xpress/archives/643
http://qiita.com/komiya_atsushi/items/b92d1ab844b37a78ac1c
https://forums.virtualbox.org/viewtopic.php?f=6&t=46845

問題なく動作しているPCはアップデートでプロセス云々聞かれずに終了できたので、今後は
アップデート中に問題が発生した場合は綺麗な状態にしてからアップデートしたいと思います。

2014年9月20日土曜日

Android Developer の OS別のシェアのページが見つけづらい

Android DeveloperにあるAndroidのOS別のシェアのページがすぐに見つけられなかったので。



Android DeveloperのトップページからヘッダーのDevelopersをクリック。


ヘッダーにあるメニューが表示されるのでAboutをクリック。


Dashboardsをクリックで目的のOS別のシェアのページにたどり着けました。


最近のAndroidの動作確認端末はどれが良いのか

数年前にAndroidのネイティブアプリを開発を担当していたのですが動作確認の際に
端末の選定で何も知識が無く困ることがありました。

後で知ったのですが、端末を選定するポイントがあるみたいですね。
Androidにおけるテストに関して デバイスをどう選択するか 2012を見たときに凄く参考に
なりました。ありがたかったです。

メーカー + OS + チップセットの組み合わせが選定のポイントと、このとき知りました。
このようなポイントを踏まえてみると3項目でどれも種類が多いのが分かりました。orz

最近の端末を調べてみました。
今回もAndroidにおけるテストに関して 端末をどう選ぶか 201404を参考にさせていただきました。

Xperia、AQUOS Phone、ARROWS、Galaxy、Nexusの5種類は抑えておくと良いかもしれないです。
チップセットはQualcommのSnapdragonがシェアをとっているようです。
AndroidのOS別のシェアは4.0.3(API Level15)以上が全体の約85%を占めています。
WikipediaのAndroid端末一覧を見ると国内で初期に4.3がインストールされている端末は数が
少ないので、場合によっては動作確認端末での優先度は低くなると思いました。

2013年のキャリア別の端末別のランキングを見るとXperia、Galaxy、AQUOS Phoneが高いので
2013年の端末を動作確認に含める場合は考慮しようと思います。

Xperiaはdocomoとauで発売されて人気機種、AQUOS Phoneはどのキャリアでも発売されて
いるので、外せないと思います。
Galaxyも昔から人気機種ですね。
ARROWSは昔は不評だったようですが、最近の端末は評判が良いようですので選定の際には
チェックしといたほうが良さそうです。
昔はノーマークだったNexusはNexus5がSIMフリーやキャリアどちらでも取り扱われているので
どのくらいシェアがあるのか分かりませんがNexusはこれからアプリを開発する際には考慮
しといたほうが良さそうです。

2014年9月19日金曜日

Golang環境を構築するときに気付いたこと

Go言語を触ってみたかったので、環境を構築しようとGetting Startedダウンロードページ
参考にしました。

最近知ったHTMLをコマンドラインからパースするpupとかコマンドラインを便利にできるpeco
触りたかったので go get で取得しようとしたところ $GOPATH が設定されていないので
取得できないとエラーが。

$GOPATH の設定は環境を構築する上で必要らしく重要な環境変数らしいです。
go get のときにエラーが出たので当たり前ですよね。

今度は $GOPATH に設定する値は何が無難なのか分からなかったので調べることに。
GOPATHとワーキングディレクトリを見ると作業ディレクトリのような扱いに感じたので
ホームディレクトリ直下にフォルダを作成。
# GOPATHのパスはGoのバージョンごとに分けたほうが良いと知り .go だけよりも
# バージョンがあると後で融通が効くと思ったので下の設定になりました。
# %USERPROFILE%\.go\{Goのバージョン}
SET GOPATH=%USERPROFILE%\.go\1.3
仕切りなおして再度 go get を実行するとコンソール上に hg の表示が。
調べてみたところ Google が公開しているライブラリは Mercurial を通して公開されているとのこと。

必要なので Mercurial もダウンロードページからインストーラをダウンロードしてインストール。
今回は Mercurial だけ欲しかったので一覧から次の項目のインストーラを利用しました。
Mercurial 3.1.1 MSI installer - x64 Windows - requires admin rights

Mercurial のダウンロードページに Inno Setup installer というはじめてみる名前が。
これも調べてみると OSS のインストーラとのことでした。
特に理由は無いですが、MSI installer を選びました。

go get で無事にpupもpecoも取得できコマンドラインから実行できることを確認しました。
# go get で取得したパッケージは %GOPATH%\bin にバイナリができるので
# PATHに下のパスを追加することで利用できるようになります。
%GOPATH%\bin
Go言語を触りたいから Mercurialを知る→インストーラのInno Setup installerを知る
環境変数の管理の方法が増えた

ただ単にGo言語を触りたいだけだったのに、調べてブログに書き起こしてみると他にも
新たなことを発見・気付くことができました。

形にすることで残るし、些細なことにも気付けるきっかけになるのだなぁと再認識しました。

ちなみにpuppecoはバイナリが公開されているのでGo環境を構築しなくてもダウンロードして
PATHを通せば利用できるようになります。

2014年9月18日木曜日

Jenkins でリモートサーバーのコマンドを実行できる SSH pluginを使ってみた

毎朝Linuxサーバーの電源を入れては起動後に必要なスクリプトを実行していたのですが
たまに忘れたりして他の人に迷惑をかけていました。

このような作業は自動でやりたいと思っていたのでJenkinsで出来ないか調査したところ
リモートサーバーのコマンドを実行できるSSH pluginというのがありました。

インストールから設定方法
  1. プラグインの管理の「利用可能」からsshで検索してSSH pluginをインストールします。
  2.  システムの設定で「SSHリモートホスト」でSSHサイトの「追加」ボタンを押すと下のキャプチャの設定項目が表示されます。
  3. ユーザー名とパスワードで接続できる場合はホスト名、ユーザ名、パスワード/パスフレーズでパスワードを入力します。

SSH plugin 設定画面
SSH plugin 設定画面
公開鍵で接続を行っている場合
キーファイルに秘密鍵のファイルパスを入力して、パスワード/パスフレーズで秘密鍵の
パスワードを入力することで接続できるようになります。
秘密鍵をPuTTY形式で作成している場合はOpenSSH形式に変換する必要があります。

OpenSSH形式ではなかったために見事に接続に失敗してしまいました。

使い方
  1. ビルドの設定画面で「ビルド手順の追加」から「リモートホストでシェルを実行」を選択。
  2. 下のキャプチャの項目が表示されます。SSHサイトにはシステムの設定で追加したSSHサイトが選択できるので、実行するサイトを選択します。
  3. リモートホストで実行したいコマンドを入力します。
  4. ビルド実行で実際にリモートホストに対してコマンドを実行してくれます。

SSH plugin ビルド設定項目
SSH plugin ビルド設定画面

2014年9月17日水曜日

VirtualBox4.3.12→4.3.16にアップデート

以前VirtualBox4.3.12から4.3.14にアップデートしたときには運が悪かったのか
不具合に遭遇し、仮想マシンを起動できない症状がでました。

そのときの回避策はバージョンを戻すことだったので、対応しましたが
少し前に4.3.16がダウンロードできるようになっていたのでアップデートしてみました。

今のところ問題なく動作しています。
4.3.14のダウンロードはOld Buildsからダウンロードできるようになっていますが
多分利用することは無いと思います。

2014年9月15日月曜日

連休での時間の使い方についてへこむときがある

連休で時間が出来たときに限って「やるべきこと」じゃなくて「やりたいこと」ばかりやっている気がする。
休み明けには、やっとけば良かったと思うことを何度も経験している。
「やるべきこと」ばっかり考えて、続けると心身ともに持たないことも経験している。

中途半端に「やるべきこと」、「やりたいこと」を切り替えても疲れるだけかも。
「やるべきこと」に直接関係無いことでも、その時したことをメモなりブログなり形として
残しておくことで "自分はこれだけやった" とか "あなたにはこれだけできた" と実感できるかもしれない。

凹みながらも自分だけの履歴を見返して、少しばかりの励みにして休み明けの凹み率を
下げることができれば良いかもしれない。





今更ながら、残す方法にはSNSとかEvernoteとかも良いかも。

2014年9月13日土曜日

AndroidのapkファイルをWindowsでリバースエンジニアリングしてみた

Androidのapkファイルをリバースエンジニアリングしたときに手順や利用するツールが
色々とあったので、今回試した内容を残しておこうと思います。

利用したツール

dex2jar
JD-GUI
android-apktool

apkファイルは拡張子はapkですが、実体はzipファイルなので拡張子をzipに変更して解凍できます。
今回知った内容はjarファイルに変換してソースコードを閲覧する方法とresourceフォルダのxmlや
AndroidManifest.xmlを閲覧する方法になります。

jarファイルに変換してソースコードを閲覧する方法

ツールはdex2jarとJD-GUIを利用します。

apkファイルをzipファイルとして解凍するとclasses.dexに閲覧したい.classファイルがあるのですが
このままでは閲覧できないのでdex2jarを利用してjarファイルを生成します。
dex2jarのサイトからdex2jar-0.0.x.x.zipをダウンロードして任意のフォルダに解凍します。

dex2jar Webサイト
dex2jar

解凍したフォルダにあるdex2jar.batをコンソールから実行します。
C:\> C:\dex2jar-0.0.x.x\dex2jar.bat C:\AndroidApp\classes.dex
実行するとclasses.dexファイルがあるフォルダにclasses_dex2jar.jarファイルが作成されます。
このjarファイルをJD-GUIというアプリケーションで閲覧します。
JD-GUIのサイトのDownloadからWindowsのjd-gui-0.x.x.windows.zipをダウンロードして任意の
フォルダに解凍します。

JD-GUI Webサイト
JD-GUI

解凍したフォルダにあるjd-gui.exeを起動し出現するウィンドウにclasses_dex2jar.jarファイルを
ドラッグ&ドロップすることでclasses_dex2jar.jarファイルの中身を閲覧できます。


resourceフォルダのxmlやAndroidManifest.xmlを閲覧する方法

ツールはandroid-apktoolを利用します。

apkファイルをzipファイルとして解凍することでresフォルダやAndroidManifest.xmlファイルが
生成されますが、このままではバイナリ形式で閲覧することは出来ません。
xmlファイルなど本来テキスト形式で閲覧できるようにandroid-apktoolを利用します。

android-apktoolのサイトからapktool-install-windows-r05-ibot.tar.bz2、apktool1.5.2.tar.bz2を
ダウンロードして任意のフォルダに解凍します。

android-apktool Webサイト
android-apktool

インストール方法もありました。
解凍した後は1つのフォルダにaapt.exe、apktool.bat、apktool.jarをまとめます。
apktool.batをコンソールから実行します。
C:\> C:\apktool1.5.2\apktool.bat decode C:\AndroidApp.apk
実行するとapktool.batファイルがあるフォルダにapkファイルをデコードしたフォルダが生成され
xmlファイルなどテキスト形式で閲覧できるようになります。

Jenkinsサーバーのジョブ状態を通知してくれるJenkinsOnDesktopを使ってみた

Jenkinsサーバーのジョブ状態を通知してくれるWindowsアプリケーションJenkinsOnDesktop
利用するときには.NET Framework 4.0 以上とWindows PowerShell 2.0 以上が必要になります。
Windows PowerShellを利用するのは初めてだったので、一緒にWindows PowerShellについても
触ってみました。
JenkinsOnDesktopのセットアップ手順があるのでそれに沿って実行してみただけですが。

PowerShellスクリプト実行を可能にすると書かれているのですが、PowerShellの実行ポリシーが
全体に適用される雰囲気で実行ポリシーについて調べてみるとセキュリティを考慮して
デフォルトではPowerShellスクリプトは実行不可になっているようです。
実行ポリシーの状態は get-executionpolicy で確認できます。
about_Execution_Policies
確認したところ確かにスクリプトが実行できない Restricted でした。
個別にPowerShellスクリプトの実行を制御できないか調べてみましたが、ブロックの解除という
方法はあるみたいですが、私の環境ではブロックの解除自体が見つかりませんでした。

Set-ExecutionPolicy RemoteSigned で実行ポリシーを変更します。
RemoteSigned はスクリプトを実行できるようになりますが、ローカルで実行されたスクリプトおよび
作成されたスクリプトに関してはデジタル署名が不要になるようです。
PowerShellスクリプトでのデジタル署名の役割については今度調べてみたいと思います。

JenkinsOnDesktop.exeでアプリケーションを起動してJenkinsさんに仕事をしてもらうサーバーを
設定します。
サーバーのURLを入力するだけで良いようです。
今回はローカル環境を指定したので、ジョブの状態は通知されることを確認しましたが
ログインしないとジョブの一覧が表示されない環境ではどのようになるか今回は試していません。

執事の情報や見た目を変更できるようですので、好きな画像に差し替えてテンションを上げるのも
良いかもしれません。

仕事場ではメール通知を利用していて、本当はJenkinsさんに声で知らせて欲しいのですが
そんな音を気安く出しても良い雰囲気ではないので、こういう通知してくれるアプリケーションは
助かります。

2014年9月11日木曜日

GitHubなどのissueに付けられるタグでよく使われる単語を知りたい

GitHubなどのissueに付けられるタグにでよく使われる単語を集計できたら良いな。とふと思いました。
集計する方法は思いつかないので、また今度になるかも。

リポジトリを作成したときにはbug, featureなどが用意されているけど。
単語とあわせて、それぞれタグの意味合いはどんな役割で使っているのか知りたいと思いました。
とは言っても何か良さそうなものはないだろうか。

後からでも良さそうな単語があれば追記していこう。

2014年9月10日水曜日

omnibus-gitlabでtimezoneが設定できない様子

GitLab 7.5からはタイムゾーンを設定できるようです。
内容についてはomnibus-gitlabでtimezoneをAsia/Tokyoにするを参照ください

プライベートなGitリポジトリを管理するためにGitLabのomnibus-gitlabを利用し始めました。
使い始めて登録されるデータの日時を見ると、タイムゾーンはUTCになっていました。
GitLabでタイムゾーンを設定できるらしいですが対象の config/application.rb ファイルが見つからず。
ソースからインストールしたほうが良いのかな?
rpmでインストールできるので以前よりもセットアップの敷居が低くなって嬉しかったのですが。

全然関係ありませんが少し前まで GitLab を ギットラボ ではなく ギットラブ と呼んでおりました。(>_<)

GitLab 7.2.1

WindowsのJenkinsでジョブ実行中に一時停止したいのに

WindowsでJenkinsのジョブを実行中にsleepのような一時停止を行いたかったのですが
sleepコマンドは無いので代わりにTIMEOUTコマンドを利用してみました。

ジョブを実行してみたところ、次のエラーメッセージが出てジョブが失敗してしまいました。orz
エラー: 入力のリダイレクトはサポートされていません。今すぐプロセスを終了します。

TIMEOUT /T 10 /NOBREAK > nul
TIMEOUTを実行すると残り待ち時間がコンソールに表示されるので > nul で出力を捨てることができるのですがコンソール上では確かに出力されないのですが、Jenkinsではエラーメッセージが出てしまいました。
原因は分からず。別の方法があるか調べなくては。
一時停止する方法を見つけました。
詳細はWindowsのJenkinsでジョブ実行中に一時停止するになります。

2014年9月9日火曜日

Jenkinsでタイムスタンプの値を取得したいとき

ジョブの成果物でファイル名に日時を含めたいとき、どうすればいいか確認した結果
環境変数のBUILD_IDを利用すれば良いようです。
BUILD_DATEも在るらしいですが、私の環境ではこの変数は参照できませんでした。orz
素直に標準で用意されているBUILD_IDを利用したいと思います。

実行するビルド手順によって変数の参照方法が異なります
参照方法が間違っていて失敗してしまいました。気を付けないと。

Windowsバッチコマンドの実行の場合は
%環境変数名%→%BUILD_ID%
シェルの実行の場合は
${環境変数名}→${BUILD_ID}

2014年9月7日日曜日

Jenkins で Graphics N/A Unable to access X.が出たとき

Jenkinsで本来グラフが表示される部分に次のメッセージが表示されるとき

Graphics N/A Unable to access X. You need to run the web container in the headless mode. Add -Djava.awt.headless=true to VM

Open JDKをインストールしている環境ではdejavu-sans-fontsというパッケージを
インストールすることで解決できるようです。
https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+got+java.awt.headless+problem
VagrantなどでJenkinsをCentOS環境にセットアップするときには次のような感じにしています。
# install Jenkins
sudo yum install -y java-1.6.0-openjdk
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install -y jenkins dejavu-sans-fonts
# booting and autorun jenkins
sudo chkconfig jenkins on
sudo /sbin/service jenkins start

2014年9月6日土曜日

Jenkinsでvagrant upするときはBUILD_ID=dontKillMe

Jenkinsでvagrant upするときにはBUILD_ID=dontKillMeの設定が必要
https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller
ジョブを終了するとプロセスも終了するようですがBUILD_ID=dontKillMeを設定することで
プロセスを残したままにできるとのこと。

PHP Fatal error: Class 'DOMDocument' not found が出たとき

PHP Fatal error: Class 'DOMDocument' not found in /phpunit/phpunit/PHPUnit/Util/XML.php on line 136
PHPのXMLが無いとのことなのでphp -mでインストールされているモジュールを確認。
[PHP Modules]
:
xml
:
XMLの表示はあったのですが何かが足りなかったようで php-xml をインストールすると解消しました。
[PHP Modules]
:
xml
xmlreader
xmlwriter
:
xmlreaderとxmlwriterが追加されていました。

CentOSにAndroid SDKをCLIでセットアップする

  1. Android SDKをセットアップするフォルダに移動
    cd /opt (セットアップするフォルダの場所はお好みで)
  2. Android Developerサイト(http://developer.android.com/sdk/index.html)の
    VIEW ALL DOWNLOADS AND SIZESからSDK Tools Only(Linux 32 & 64-bit)Android SDKを
    ダウンロード wget http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz
  3. 圧縮ファイルを解凍
    tar zxvf android-sdk_r23.0.2-linux.tgz
  4. 解凍が成功したら圧縮ファイルを削除
    rm android-sdk_r23.0.2-linux.tgz
  5. PATHにAndroidの環境変数を設定
    vi /etc/profile.d/android.sh
    export ANDROID_HOME="/opt/android-sdk-linux"
    export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"
  6. 環境変数を再読み込み
    source /etc/profile
  7. Android SDKの一覧を表示
    android list sdk -u -a
    先頭に数字が表示されるのでインストールしたい項目の数字を覚えておく
  8. SDKをインストールする
    android update sdk -u -a -t 一覧で表示されていた数字
  9. 他のユーザでも実行できるようにSDKの実行権限を変更
    chmod -R 777 /opt/android-sdk-linux

2014年9月4日木曜日

CentOSでSSHなどコンソールでパスワードをtypoしたときにクリアする

CentOSでSSHなどコンソールでパスワードを入力するとき入力した内容が表示されないので
typoしてしまうとやり直すためにバックスペースを連打していました。

こういうとき Ctrl+u の同時押しで入力した内容をクリアできます。

ローカル:Windows7
リモート:CentOS5とかCentOS6

2014年8月30日土曜日

Thunderbirdのアーカイブの利用について

Thunderbirdのアーカイブを利用するとデフォルトでは年単位のフォルダで区切られています。
フォルダの区切りを年月単位で設定したかったのですが、次の方法で出来ました。
  1. メニュー[ツール]のアカウント設定を選択
  2. アカウントの[送信控えと特別なフォルダ]を選択
  3. [メッセージの管理]の[アーカイブオプション]をクリック
  4. [アーカイブメッセージを次の場所に保存します]で[月別のフォルダ]を選択
    [アーカイブされたメッセージのフォルダ構造を維持する]をチェックすることで
    受信トレイのときのフォルダ構造を維持して年月単位でフォルダが作成されます
すでに会社名でフォルダ分けしているので、フォルダ構造を維持することもできるので
アーカイブでのフォルダ構造をどうするか悩み中です。

以前フォルダの区切りを年月単位で行えるか調査したところ、メニューからではなく
設定エディタで値を操作する必要があったので、そのときは止めました。

2014年8月27日水曜日

MacをJenkinsのスレーブにしたときUnexpected termination of the channel

slave.jarはMacにコピーされるのですがその後、Unexpected termination of the channelという
エラーを吐いて最後はスレーブがオフラインになる症状に遭遇しました。

Macへのスレーブ起動方法はSSHを利用しました。
java.io.IOException: Unexpected termination of the channel
 at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:50)
Caused by: java.io.EOFException
 at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2323)
 at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2792)
 at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800)
 at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
 at hudson.remoting.ObjectInputStreamEx.<init>(ObjectInputStreamEx.java:40)
 at hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:34)
 at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:48)
起動時のJVMオプションに-Djava.awt.headless=trueを設定すると対応できました。

JenkinsのWikiにも載っていました。
-Djava.awt.headless=true

X サーバが有効となっていない UNIX環境で jenkins を利用するときに、無用なトラブルに会わないために必要です。

JenkinsでFULL head 413を返すとき

Jenkinsを利用中にログインが出来なくなって確認したところレスポンスが
FULL head 413を返していました。

FULL head 413はどうやらリクエストの内容が大きいとのこと。

413 Request Entity Too Large
リクエストエンティティが大きすぎる。リクエストエンティティが
サーバの許容範囲を超えている場合に返す。

ふとCookieを見てみると名前が「JSESSIONID」から始まるCookieが大量に存在していました。
Cookieが怪しいと思い、削除すると問題なくJenkinsを利用できるようになりました。

少し前にプラグインを新規インストールしたりしていたので、プラグインが原因かなと悩みました。
他のブラウザでは利用できていたので、今回はCookieが原因だったのかも知れません。

何か問題が起きたときはまず、次の項目を試そうと思います
  • 別のブラウザで操作する
  • 同じブラウザで履歴やCookieが残らないシークレット ウィンドウ(Chromeの場合)で操作する
同じ症状が出ないときは問題が起きたブラウザのデータが原因かも知れないです。
413は初めて見たので、最初は何事!?と軽くパニックになりました。

同様の内容が Jenkins の issue に報告されていました。

2014年8月25日月曜日

JenkinsのプラグインをCLIでインストールするときにハマった

VagrantでJenkinsを構築するときにプラグインをCLI(コマンドライン)でインストールしたときに
ハマったので残しておこう。

Jenkins起動直後ではJenkinsにアクセスできない

Jenkins起動直後だとJenkinsをCLIで操作するためのjenkins-cli.jarファイルが
ダウンロードできませんでした。
service jenkins startした後はsleep 30とかで待機時間を設けることで対応できました。

Jenkinsのインストールから起動+プラグインのインストールまで実行を一度に実行するときにはプラグインのリストを手動で更新する必要がある

プラグインのアップデートサイトのリスト(ファイル)がJenkinsのインストール直後は存在しないようで
その状態でプラグインのインストールを実行するとプラグインのインストールが失敗します。
次のコマンドで手動でプラグインのリストを更新できました
curl -L http://updates.jenkins-ci.org/update-center.json | sed '1d;$d' | curl -X POST -H 'Accept: application/json' -d @- http://localhost:8080/updateCenter/byId/default/postBack

java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin [プラグイン名]で指定するほうが良さそう

// 次の方法でプラグインのインストールは成功
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git

// 次の方法ではプラグインのインストールが失敗
// レスポンスの内容を見るとプラグインが存在するサイトが移動したことを示すドキュメントが返ってきたのでURLでの指定は行わないほうが無難
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin https://updates.jenkins-ci.org/latest/git.hpi

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://mirrors.jenkins-ci.org/plugins/git/2.2.5/git.hpi">here</a>.</p>
<hr>
<address>Apache/2.2.14 (Ubuntu) Server at updates.jenkins-ci.org Port 443</address>
</body></html>

2014年8月15日金曜日

WindowsのVirtualBoxの仮想マシン保存フォルダの場所を変更する

VirtualBoxの仮想マシンを保存するフォルダ(VirtualBox VMs)を別の場所に変更する方法
作成済みの仮想マシンは一度、一時停止か停止をしといたほうが良いです。

  1. 変更先のフォルダを作成
    変更先フォルダ D:\VirtualBox VMs
  2. 変更前のフォルダ内のファイルやフォルダを変更先のフォルダ内にコピー
  3. VirtualBoxを起動してメニュー[ファイル]の環境設定を選択
  4. 一般にある[デフォルトの仮想マシンフォルダー]で選択ボックスから[その他]を選択
  5. 変更先のフォルダを選択して[OK]
今後、作成する仮想マシンは変更先のフォルダに作成されます。
作成済みの仮想マシンはVirtualBoxの仮想マシン一覧から右クリックで[除去]を選択し[除去のみ]を選択
メニュー[仮想マシン]の[追加]から変更先フォルダに移動した仮想マシン(ファイルの拡張子は.vbox)を
選択します。
起動してみて起動が出来たら場所の変更は無事に出来たと思います。
変更前のフォルダを削除して終了です。

環境
VirtualBox 4.3.12

.vagrant.dフォルダの場所を変更する

Windowsでインストーラからインストールするとユーザフォルダ直下に
.vagrant.dフォルダが作成されます。
このフォルダにvagrant box addで追加したボックスが保存されますが、ボックスも
容量があるので別のドライブに移動する方法を実践してみました。

  1. 変更先の場所にフォルダを作成する
    変更先のフォルダはD:\Vagrant\.vagrant.d
  2. 変更先のフォルダ内に現在の.vagrant.dフォルダ内のファイルやフォルダをコピーする
  3. フォルダの場所を変更するには環境変数にVAGRANT_HOMEを追加する
    (特にシステム全体で参照する必要も無かったので、ユーザー環境変数として追加しました)
    変数名
    VAGRANT_HOME
    変数値
    D:\Vagrant\.vagrant.d
  4. 念のため、再起動
  5. vagrant box removeとかで変更先のフォルダの状態が変更されて、変更前のフォルダの状態が
    何も変更されていなければフォルダの場所の変更は無事終わったと思います
無事終わったら場所変更前のフォルダを削除して終了。

環境
Vagrant 1.6.3
VirtualBox 4.3.12

2014年8月14日木曜日

VagrantでAnsibleのPalybookを書くときに役に立つプラグイン

AnsibleのPlaybookを作成するとき「あーでもない、こーでもない」、「あー間違った!
はい!やり直しorz」と何度も思いながら作成していましたが、こんな思いを軽減してくれる
Vagrantのプラグインがありました。

今まではやり直しとなったときはvagrant destroy→vagrant upしてました。
provisionのときにインストールするパッケージが多いとダウンロードだけでも結構な時間が必要でした。

vagrant-vbox-snapshot

Vagrantの仮想マシンのスナップショットをとるプラグイン
provisionを実行した直後の状態を残しといてゴニョゴニョした後、丸ごとやり直したいとき
provisionで必要なパッケージを仮想マシンにインストールする時間とダウンロード時間を節約する
// プラグインインストールコマンド
vagrant plugin install vagrant-vbox-snapshot

# スナップショットの取得、SNAPSHOT_NAMEはスナップショットの一覧に表示する名前
#  [vm-name]はVagrantfileで仮想マシンに名前を設定しているときに必要
vagrant snapshot take [vm-name] [SNAPSHOT_NAME]
# スナップショットの一覧表示
vagrant snapshot list [vm-name]
# 直前のスナップショットの復元
vagrant snapshot back [vm-name]
# 任意のスナップショットを削除
vagrant snapshot delete [vm-name] [SNAPSHOT_NAME]
# 任意のスナップショットの復元
vagrant snapshot go [vm-name] [SNAPSHOT_NAME]

sahara

仮想マシンでサンドボックスモードを有効にするプラグイン
新しいバージョンでは利用できない情報とかあったので不安でしたが、実際はインストールできて利用できています。

インストールするデータベースの設定方法が間違ったとき、戻したいけどprovision直後までは
戻したくないとか、少し前の状態に戻したいときに有用です。
サンドボックスモードを有効後、仮想マシンにゴニョゴニョしてからコミットして確定すれば
その後加えた変更が間違ったときはロールバックすることでコミットしたタイミングに戻れます。
// プラグインインストールコマンド
vagrant plugin install sahara

# サンドボックスモードを有効
vagrant sandbox on [vm-name]
# 現在の仮想マシンの状態をコミットする
vagrant sandbox commit [vm-name]
# コミットした状態に戻る
vagrant sandbox rollback [vm-name]
# サンドボックスモードを無効
# コミットしていなければ変更した状態は無かったことになる
vagrant sandbox off [vm-name]
環境
Vagrant 1.6.3
VirtualBox 4.3.12

2014年8月10日日曜日

AnsibleでCentOS5をセットアップする(準備)

デプロイツール、オーケストレーションツールとして分類されるAnsibleを利用して
仕事でも利用しているCentOS5のサーバをセットアップしたいと思います。

Ansibleの呼び方が最初「あんしぶる」と思っていたのですが「あんしぼぉ」のようです。
恥ずかしい。

必要なもの

ローカル
CentOS6のepelリポジトリを利用してインストールする方法が手っ取り早かったので
vagrantも利用してCentOS6を用意しました。
Windows上で扱うのは出来るかどうかわからなかったので、仮想マシンを用意しました。
// epel repository追加
rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
// Ansibleインストール
yum -y install ansible
サーバ
AnsibleはPythonが必要なのですが、基本的には標準でインストールされています。
インストールされているバージョンが2.5以上なら問題ないようですが、CentOS5の場合は
2.4のためpython-simplejsonが必要です。
Ansibleでの実行結果がJSON形式で返ってきますが、2.4ではJSONを扱う?
パッケージが無いようなのでインストールする必要があります。

Ansibleでサーバをセットアップする前に

SSHでサーバにアクセスできる必要があります。
Ansibleで対象のサーバを操作する場合はインベントリファイル(inventory-file)と呼ばれる
ファイルに設定した内容しか操作対象にされません。
// インベントリファイルは実行時に指定することが出来るのでファイルを作成します
echo [サーバのIPアドレス] > hosts
// Python2.4がインストールされている場合はpython-simplejsonをインストール
// rawモジュールでpython-simplejsonをインストール
// -i:インベントリファイルの指定
// -k:このオプションを指定するとSSH接続するときのパスワードを求められます
// (サーバ側でパスワードなしのSSH接続の設定を行っていない場合このオプションをつけないとサーバへの認証が失敗するので、今回はこのオプションを付けました)
// -u:サーバ接続時のユーザの指定
// -m:実行するAnsibleのモジュールの指定
// -a:モジュールの引数の指定
// (""で括らないと失敗してしまいました)
ansible -i hosts [サーバのIPアドレス] -k -u [サーバのユーザ名] -m raw -a "yum -y install python-simplejson"
疲れてしまいましたので今回はこのあたりで。

2014年7月16日水曜日

Vagrantで利用するコマンド-仮想環境 起動とか停止とか

Vagrantで利用するコマンド

vagrant -h
ヘルプを表示
vagrantで実行できるコマンドの一覧を表示する

vagrant [コマンド] -h
vagrant [コマンド]のオプションや引数のヘルプを表示する

vagrant init
仮想環境をセットアップする
Vagrantで起動するために必要なVagrantfileが生成される

vagrant up
Vagrantfileで指定したBoxから仮想環境を起動する

vagrant suspend
起動中の仮想環境を一時停止する
仮想環境の復帰時間は少ない

vagrant halt
起動中の仮想環境を終了する
仮想環境の電源を落とすので復帰時間はvagrant suspendよりかかる

vagrant destroy
作成した仮想環境を破棄する
仮想環境にあるデータはすべて消去される
オプションをつけなければ事前に破棄するか確認メッセージが表示される
一からやり直したいときにはvagrant destroyしてvagrant upする

2014年6月18日水曜日

SQLのJOINで結合するときのレコードを絞りたい

片方のテーブルのレコードをすべて表示して、もう片方の結合するテーブルのレコードは
ある条件に一致するレコードに絞り込みたいという状況が必要になりました。

カテゴリのレコードはすべて必要だけどカテゴリに属するアイテムを結合するときのレコードは
アイテムの価格がXX以上だけのようなときです。
// カテゴリに属するアイテムを結合
select * from category left join item on category.id=item.category_id

// カテゴリに属するアイテムで価格が1000より大きいレコードだけを結合
select * from category left join item on category.id=item.category_id and item.price>1000
方法を見つけるのにも時間が掛かったので、同じようなことにならないようメモ。

2014年6月14日土曜日

ドキュメントとかリファレンスは見るように意識しよう

開発ですぐに期待した動作を実装することをつい優先するので、どこかのコードを
流用したりしてしまいます。
目の前の簡単?そうなやり方で進められたと、そのときは感じても
ホントはドキュメントとかリファレンスを見てみるともっと良い書き方とか、用意されているAPIが
あるなんて事を身をもって体験済みです。

開発の際には利用している言語とかライブラリとかフレームワークの資料は見るようにしようと
思います。

自分がメソッドとか作るときには必ずAPIドキュメントは書こうと思いました。
当たり前か。ハハッ。

2014年5月31日土曜日

JSON文字列で受け取った値を連想配列で扱う方法

WebシステムでJavaScriptを多用するときにお世話になるJSONですが
ブラウザから受け取ったJSONデータをPHP側でよしなに利用する場合
json_decodeを利用しますがjson_decode(JSONデータ)で返された値は
stdClassのオブジェクトになります。
連想配列として扱いたい場合はjson_decode(JSONデータ,true)とします。

json_decodeはPHP5.2以上で利用できます。

長いことPHPでは配列と連想配列を多用していたのでjson_decode(JSONデータ)を
実行してオブジェクトが返ってきて意図しない動作をしたときにはビツクリしました。

PHPもオブジェクトを利用する場面が増えてくるのかなと遅いながらも感じました。

2014年5月22日木曜日

JavaScriptでタイムスタンプを簡単?に取得する方法

var millisecond = +new Date(); 
これでタイムスタンプを参照することができます。
要素を動的に生成したときに仮IDを割り振りたい場合に利用できると思います。

2014年5月11日日曜日

ScalaでWebアプリケーションを作るときのフレームワーク

仕事でWebアプリケーションを開発するときにはPHPがメインなのですが、最近他の言語でも
作れるようになりたいと思い、何が良いか調べていたところScalaが気になったのでScalaに
決めました。

触れたことの無い言語だったので、どうやって進めていけば良いか模索状態ですが
フレームワークも利用して覚えていけば良いかなと思っています。

そのフレームワークがどんなものがあるのかも調べてみたところPlay2(Play Framework2)
Scalatraというものがあるようです。

簡単なもので良いからそれぞれのフレームワークを触ってみようと思います。
気付いたこと、出来るのかなと思ったことはGitHubを利用して進めよう。

2014年5月7日水曜日

仕事でのコミュニケーション-2

職業柄プログラムや仕様の確認事が多いですが、確認したときには必ずといって良いほど
プログラムや設定内容を何か編集したりします。

そんなときに「ここ変更しました」とか「追加しました」だけメールや口頭で発信されてます。
その状況が続くとあとで振り返ったときに「何故?」が生まれて結局分からず不完全燃焼します。

コミュニケーションって最近は"そのとき"だけじゃなくて"その後"も振り返られることが
できるようにするのが、大事なのではと思っています。

プログラムなどに関っている場合は編集内容を残すのではなくて、編集した理由のほうが
後で大切になるので、"理由"を残すように意識しています。

編集内容は"diff -u"で見やすくすることも出来ますし、Gitとかバージョン管理しておけば
さらによくなると思います。

仕事場ではプログラムに関する内容や仕様に関する内容があれば、メールや口頭ではなく
バージョン管理と連携しているシステムを利用してとお願いしているのに中々根付かないので
モヤモヤしています。

口頭だと周りから見ればコミュニケーションが取れているように見えるけど、その場・その時・そこ
止まりなので"そのときの当事者"しか影響しません。
メールなら内容は残りますが"残るだけ。"さらにそれに関連づくものを残しているかで難易度が
変わっちゃいます。
仕事場では「メール探すのにも時間が掛かるから」と関係するメンバーになったのに探さず
文句を付け加えて関ろうとしないメンバーも現に居ます。
そんな調子で仕事を進めてきたから何も変わらないんだろうなと、事あるごとに思います。

編集したときのコミットメッセージに口頭でやり取りに到った理由を付け加えておくとか、
必要な情報はサービスや仕組みを利用して、メールは必要以上に情報を含めないようにして
通知・気付くための用途で利用するものにしたりとか。
次の一歩を含めないと何もプラスにならないのにね。と思う。

仕事でのコミュニケーション

他の人と一緒に仕事をするとき必ずコミュニケーションというやり取りがあります。

社会人となって間もないころは手探り状態でした。
報告・連絡・相談(ホウレンソウ)なんて言葉もそんなとき知りました。
面と向かってやり取りすることは少ないので、他の部署や管理職などから見れば口下手
(コミュニケーション不足)では?と言われています。

他の人と認識を共有するのは一筋縄ではいかないことを今現在、実感中(苦笑)です。
職業柄、プログラムに関することや業務上の仕様の確認とかが主になるのですが、最近は
メールでやり取りする方法に違和感を感じています。
といっても、面と向かって全部やり取りするということも何か違うような感じがしています。

メールのやり取りも必要以上の情報とかが含まれたり、返信に次ぐ返信で何がなんだか
分からなくなったりします。
関連性があるからと新規ではなく返信でやり取りしてさらに混乱。
メールは直ぐに発信できそうで、やり取りが続くと混乱するなと思うこのごろ。

口頭でやり取りするときも、その時聞いた本人は解決しているのですが、そこ止まり。
たぶん最近の私はやり取りした内容について「自分が納得したからそれで終わり。」
ということにモヤモヤしています。なんか違うと。

自分だけが納得、解決したからそれで良いという事が私にとってはダメなんだと思いました。

自分といっても昨日の自分も別人ですから、そのことを頭に入れないと後で痛い目を見ます。

2014年5月6日火曜日

毎日の自分の時間が欲しい

ここずっと仕事が詰まっていて、毎日帰る時間が遅くなっている。
出社→仕事→帰宅→就寝→出社と、間に自分だけの時間が確保するのが難しくなっている。

時間は自分で作り出すものらしいですが、難しいですね。
帰ってから「少しだけでも」と思うと睡眠時間を削ってしまう。
すでに毎日の睡眠時間が4時間ちょっと。

当分はPCをつけるよりもタブレットとかで少し気になることを消化していくことしか出来ないかな。
本を読むと直ぐ寝てしまうので、眠れないときには積んでいる本を読もう。

2014年4月13日日曜日

Gitを利用しているときのあるある?

ファイルの更新で・・・あるある?

ファイルの更新を行う必要があって頂いたファイルをローカルで確認すると
必要ないだろうと思うところまで変更があったんです。
(ファイルの管理をGitで行っていて、コミットする前のdiffを見て気づきました)

もうこうなっちゃうと、頂いた本人に連絡して確認してもらって更新するファイルを
送ってもらうんですが、いかんせんバージョン管理を取り入れてないので、今度返ってくる
内容はホントに正しいの?って疑ってしまうんです。
(サイトのファイル構成が悪いとか、ややこしいとか以前からそれはそれで対処して
 いかないといけないことはあるんですけどね)
それでもバージョン管理を取り入れておけば気付けたのでは?と思っちゃったり。

git diff したりGUIのツールなら変更箇所をもっと簡単に早く特定できるのに。

更新した内容で・・・あるある?

サイトとかシステムでは何か変更とか作業をして、責任者や関係者に確認してもらった後
やっぱり元に戻してとか、 あると思うんです。

そんなときに限って元に戻す部分が、別のところで進んでいた内容だったんです。
こんなときは担当していた方に連絡して、やってもらうのが普通かもしれないんですが
諸々事情で対応できない状況に陥ったのです。

担当していた方はバージョン管理を取り入れていなかったので、私が作業するとき
ローカルのリポジトリとdiffをとって内容を確認しながら「この部分は今回更新した部分だから
元に戻して」という感じに進めました・・・
間違って不必要なところまで戻したり変更したりしてはダメなので時間と精神力を結構
費やしました。
フラストレーションも溜まるんですよね。

バージョン管理していればGitなら git revert を行うことで変更箇所を無かったことにできるのに。
(そうバージョン管理ならね)

バージョン管理という仕組みを取り入れていれば予防できたのでは?今よりも別の方法で対処
できたのでは?と感じる場面が何回もあります。
「本来のバージョン管理の使い方とは違うよ」と思う方もいるかもしれませんが、使い方の一例と
思ってください。


もうすでに愚痴になっていますが、利用していない周りは「コストがかかる」、「今までの作業
フローとは違うので想定していないデメリットが発生する可能性がある」、「利用しなくても
作業自体は出来る」、「会社は利益を追求するのが目的だから、導入するには検討・・・」と
理由や意見を述べています。

だけど、だけどね利用していると、何か対応しなくちゃならないときがあったときに利用して
いないことが要因で対応に余計に時間がかかったり、担当した人のモチベーションを余計に
下げると思います。
人間だから。
ファイルの反映漏れとか更新漏れとかも、もしかしたら発生する前に気付けるかもしれない。
私はもうすでに何回も経験しています。
そのときに必要以上に時間を費やしたことも経験しています。

私の周りだけかもしれないですが、利用していたら予防できるトラブルは利用しないことで
問題が膨らむばかりで押さえることはできない。
それなのに・・・それなのに・・・
前に声を大にして発信したけど、周りは反応せず、ずぅーっとこんな状況が続いています。
説明する機会を設けたりして、細々続けていますがドコまで保ち続けることが出来るやら。

トラブルや火種に気付いたときは連絡してその場は対処されるんですが、それっきり。

やることやっても周りと連携が取れないことをしていると会社全体から見ればそれは
利益を減少させているのでは?と思いますし、複数人で作業をするとなったときに連携が
取りづらいので、複数人による作業で発生するデメリットが顕著に現れています。

バージョン管理に似たような仕組みをすでに取り入れているならまだしも、いまだに個人に
よる管理が行われていて、良くなる事は無いのに、むしろ酷い環境なのに。
酷い環境はより酷くなることはあっても、良くなる事は難しいと思うのに。
何もしていないからこそ、導入したときの効果は大きいと思うのに。

感謝や謝罪の言葉を述べるなら口だけじゃなく、少し時間をとって実際に使ってみてくださいよ。
魔法にかかったかのように周りが明るくなるかもしれない。

そんな日々利用していて感じることや疑念を抱えながら、また仕事に行かなくちゃならない。
頑張れるかな、踏ん張れるかな。

必要に迫られて使い出した人から「今まで使った事が無いから」とか聞いちゃうと
内心では、前から発信しているのに・・・アンパーンチ!!と思いながら笑顔で対処しよう。

2014年4月11日金曜日

Gitを知らない人に説明する機会を設けることが出来ました

仕事で日々利用させてもらっているGitについて、使ったことの無い人にも
知っていただいて使ってもらおうと(布教?)説明を行う機会を設けることが出来たのですが
参加する人はエンジニアではない方なので、どうすれば上手く説明(良い例え)できるか
悩み中です。

今まで使ってない人と作業を行うと発生していた諸々のトラブルや、ファイルの整合性を
保つために発生していた作業が少しでも軽減できるかなと内心思ったりしています。
(本当は皆が使ってくれれば効果はもっと出る気はするのですが、Gitを使い始めたころは
 誰も見向きをしてくれませんでした(泣))

Gitで必須なコミット、ブランチ、マージ、プッシュ、プル
たぶんこれらの用語を出しただけで拒否反応を起こされそうです。

Gitでこんなことが出来るということをひたすら説明しても混乱するだけだと思うので
まずは普段の作業フローでGitを含めると「こうなるんです」とか説明しようと思います。

以前、同僚のエンジニアに説明をしたときは、懸念点(デメリット)として
「今の作業フローに適用できないのではないか」とか「覚えるのにコストがかかる」とか
他にもあったのですが色々と出てきました。

そのときは良い回答が出来なかったのですが、後々考えると

「今の作業フローに適用できないのではないか」
→ファイル編集後+「履歴を残す」だけなのにそれが難しいとはその作業フローを
 見直す必要があるのではと思ったり。

「覚えるのにコストがかかる」
→バージョン管理されていない状態で作業するほうがコスト云々以前の問題では?と思ったり。
(バージョン管理を利用していない人と作業をしたときにファイルの反映漏れとかあると
利用していれば防げたのでは?と思った場面が何回もあります
そんなとき内心イライラが溜まってしかたがないです)

2014年4月7日月曜日

PHPで作られているWebサイトに携わるときに思うこと

たまに仕事でWebサイトを担当することがあるんですが、最近は外注を利用していて
ページ数が多いためか静的なページでもPHPで作られています。

でも、フォームは諸々の事情で自社で作るのですが、作成されたPHPのサイトは
フレームワークやらライブラリを利用していないので、何かに乗っかって作るということが
出来ないのです。

大抵納期までが短いので、むかーしのフォームのソースとかを流用しているのですが
いかんせん、PHPやプログラミングということ自体が初心者だった時期に作ったものが
多いので昔の自分のソースを目にすると色々と悲しくなっていきます。
(しかもそれを後輩が担当することになったりしたら、それが正しいものだと思う可能性も
 あるので、あまり良いことではないよねと思ったり。
 ピヨコードを体験できると思えばそれはそれで・・・良いかも知れませんが・・・(言い訳です))

フレームワークやらライブラリを入れることが出来れば少しは幸せになるかなと思うのですが
これまた、諸々の事情で入れることもできていないです。
(入れるとなると環境やらで引っ掛かってきます)

いろんなバージョンで利用できて、なるべく既存の環境に影響を与えない小さなライブラリ
でも作ったほうがいいのかなと思うこのごろです。

2014年3月23日日曜日

GitHubとTravis CIでCIする

CI(継続的インテグレーション)のWebサービスTravis CIを使ってみました。

プライベートリポジトリは有料ですが、公開リポジトリであれば無料で、リポジトリ数も
無制限とのことだったので、さっそくトライしてみました。

必要なもの

GitHubアカウント
公開リポジトリ
Travis CI設定ファイル(.travis.yml)

手順

Travis CIのサインインがGitHubアカウントを必要としていましたので
GitHubでの利用が前提のように思います。
GitHubで公開リポジトリを用意していたのでTravis CIへのサインインはスムーズでした。

Travis CI-GitHub Auth

サインインするとTravis CIとの連携を許可するか確認の画面が表示されたので
内容を確認して赤枠内の"Authorize application"ボタンを押して承認します。

Travis CIのアカウント画面でGitHubのリポジトリ一覧が表示されるのでCIするリポジトリを
"ON"にします。
Travis CI-リポジトリ一覧
リポジトリ一覧

公開リポジトリのルートに.travis.yml(Travis CI設定ファイル)を作成します。
ファイル自体はYAML形式で記述します。
言語により設定する内容が変わります。詳細はドキュメントにあります。
Travis CI設定の検証で事前に書き方が間違ってないか確認できます。
(コメントに日本語を含めるとCIでエラーになったのですべて英語にしました)

公開リポジトリにPushまたはPull RequestすることでTravis CIでCIが行われます。

使ってみて

PushやPull Requestすれば設定しておいた内容を自動で行ってくれて実際の画面を見ると
「動作してるよ」と一人で感激していました。
終了時にメールなどに通知もしてくれるのでありがたいです。
GitHub側でPull Request画面で気づいたのですが、Travis CIでCIが行われているかどうか
ステータスとして表示されていました。

GitHubステータス(CI実行前)
CI実行前
GitHubステータス(CI実行後-成功)
CI実行後(成功)

エラーや警告から成功のグリーンに変わるのは気持ちがいいです。
プライベートリポジトリの場合は他の方法も含めて探す必要があるかと思いますが
まずはCIを経験してみるだけでも価値があると思いました。

2014年3月22日土曜日

GitのPushでerror unpack failed

WindowsからGitのPushでリモートに反映しようとすると
error: unpack failed: index-pack abnormal exit
が表示されて全くPushができなくなってしまいました。

結果としてはGitで利用するSSH?のアプリケーションを変更することで解決できました。
// Git BashでGIT_SSHの設定を変更
GIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
↓
GIT_SSH='C:\Program Files (x86)\Git\bin\ssh.exe'
// 次のコマンドでGIT_SSHが設定されているか確認
set | grep GIT_SSH
jarファイルをコミットに含めたときからエラーが現れていました。

Gradleラッパーで必要なjarファイルがgitignoreで除外設定していたので修正したけれど
gitignoreはPushできてjarファイルがPushできなくなってしまいました。
Pushできなくて5時間ぐらい悩んでいました。

.gitフォルダを削除してリモートからクローンし直すとか、.git/objectsに書き込み権限を
追加すると解決するとかありましたが、どれも解決には至りませんでした。

私の場合はGIT_SSHの設定を変更することで解決できましたが、設定を変更する
ことになるので、試すときは慎重に。

Windows 7
Git extensions

2014年3月14日金曜日

開発初心者がバージョン管理をはじめようと思ったきっかけ-続き

前の内容の続きです

バージョン管理について調べてみると、編集したファイルの差分を履歴として残し
履歴として残すときにはメッセージを原則入れなければなりません。
差分もバージョン管理のGUIツールで閲覧できますし、変更後の部分は緑のエリアで表示し
変更前の部分は赤のエリアで表示され、私は見やすいと感じました。
この他にも色々できることがあります。

調べれば調べるほど私が今までやっていた自己流のバックアップ管理、バックアップによる
差分のチェック、他諸々が何をやっていたんだろうと思うくらいショックを受けました。

「数日、数ヶ月経てば自分が作成したプログラムも他人が作ったもの」と実感するように
なったのは、開発について右も左も分からないときから時間が経ったときでした。
履歴が無ければ差分を見ても「○○だろう」と曖昧な判断しかできませんし不安です。
出来るなら常に余計な不安と戦いながら開発をしていたころの私に伝えたかったと思うくらいです。

バックアップ管理は履歴を残すことで、対処できます。
ファイルの複製をする行為が減るので、フォルダ内がカオスになるようなことも予防できます。
差分のチェックは履歴+メッセージをもとに行えるので、判断するための材料が増え
不安要素が減ります。
最新のファイルは?という問題は履歴が内容の保証をカバーしてくれるので、誤って更新
したらバージョン管理の検知で分かるため予防できます。
複数人で編集しても内容に矛盾が発生しなければ、バージョン管理がよしなにしてくれるので
ファイルの編集にビクビクすることも減ります。
(矛盾が発生したらそのときは人が判断する必要があります)

普段の開発で発生する不安要素やヒューマンエラーの軽減・予防をサポートしてくれると
感じ、取り入れなければモッタイナイ!今後のことや時間が経ったときに大きく痛い目に
遭うと感じたので取り入れるようになりました。

お粗末な内容ですが、バージョン管理に興味をいだくきっかけになれば嬉しいです。

2014年3月13日木曜日

開発初心者がバージョン管理をはじめようと思ったきっかけ


バージョン管理を利用する前

開発を行うときは「バックアップを忘れずに」と、ファイルを複製してはファイル名に
日付を付加して管理していました。
(他にも○○コピーや○○編集用とか色々していました)

でも開発を進めているとバックアップファイルが次第に増えて、数日経つと
バックアップがファイル名だけでは判別が付かなかったり、差分を確認しても内容が
いつ・何のためにしたのか判らないカオス状態になったりしました。

上手く動作しなかったときは、動作していたところまで元に戻すのにエディタの「戻る」に
頼ったり、バックアップファイルの差分をチェックして対応していました。

ですが、このやり方だと複数人で進めていると確認環境のサーバにアップしたとき
さっきの状況+他の人がアップしたファイルを更新しないよう気を付けたり、他の人が
編集しているファイルは編集するとキケンなので編集できなかったり、運悪く編集したファイルが
他の人と衝突していたら、差分を比較して問題が出ないよう調整なんかしていました。

ユーザーからの問い合わせ内容でロジックの調査が必要になったときは、担当者に確認して
もらうのですが、数ヶ月経ったりすると担当者からは覚えていない・分からないが返ってきて
それが当たり前の光景になっていました。

開発について右も左も分からない自分は、それが開発の進め方だと思っていました・・・

でもこんな状況を重ねていくと次第に感じてきたのが、一人で作業している場合ファイルの
管理が煩雑になったり、どれが最新なのか判らず安心できなくて精神衛生的に悪い状態。
複数人で作業している場合、どれが最新なのか判らず、誰が・どの部分を・何故編集したか
判らず、ファイルを反映しても良いのか・編集しても良いのか判断できず、担当者に丸投げ。

これでは余計な時間を消費しますし、内容を保証できないので簡単には編集できず、複数人が
同時に開発を行うことは難しく、仕事を進めるうえでも足枷になっていました。

そんなときに出会ったのが、バージョン管理という仕組みです。
バージョン管理は誰が・どの部分を・何故編集したかを記録し履歴として残すことができる
仕組みと解釈しています。
これだけでは、すべてが解決できるとは思っていませんが、バージョン管理を利用する前より
色々と良くなることがあります。

もう夜も遅いので、続きは別の日に書こうと思います。
これだけのことを書くだけで、約3時間も費やしてしまいました。
思ったことを書くのは難しいです。
続きを書きました。

2014年3月9日日曜日

VirtualBoxをUpdateするとき躓いた

VirtualBoxのUpdate通知が来ていたのでインストーラファイルをダウンロードして
インストールしたのですが躓きました。

自分の環境だけかもしれませんが、Updateする前に「ホストオンリーネットワーク」の
アダプターのアドレスは今使っているものとは別のアドレスにしなければいけないようです。
 「192.168.186.1」→「192.168.186.10」のように。

そうしないとVirtualBoxで表示されるアドレスが「ネットワークと共有センター」から表示できる
アダプターのアドレスと違っていました。

アドレス変更前にUpdateしたので今回は下記の手順でUpdateし今まで接続できた状態に
戻せました。
  1. 「ホストオンリーネットワーク」のアダプターのアドレスを一度変更して再起動
  2. 「ホストオンリーネットワーク」のアダプターをすべて削除して再起動
  3. 「ホストオンリーネットワーク」のアダプターを作成して(アドレスは使っていたものと被らないようにしました)再起動
  4. 「ホストオンリーネットワーク」のアダプターを今まで使用していたアドレスに戻す
元に戻すのに約3時間かかってしまいました。
今後、同じことにならないように残しておこうと思います。

Windows 7
VirtualBox 4.3.8

2014年3月8日土曜日

Bloggerでコードを見栄えよく表示する方法

備忘録として残していくであろうプログラムなどのコードを見るときに
他のサイトやWebサービスのように見栄えよくBloggerでも表示できるのか探していたところ
コードスニペット用のgoogle-code-prettifyがありました。

最初はBloggerにあるかなと思い、小一時間探していました。
よくよく考えれば専用に必要なものは、自分で用意しないといけないですよね。反省。

google-code-prettifyを利用するときはGitHubにホスティングされているファイルを
読み込めば良いようです。
以前ホスティングされていたcode.google.comサイトは閉鎖となりプロジェクトは
GitHubに移行されています。そのため、これまで利用できていたURLは無くなるので
リンク先の変更が必要です。

準備

1.適用するブログ > レイアウトの「ガジェットを追加」から「HTML/JavaScript」を選択します。
2.「HTML/JavaScript」編集画面の「コンテンツ」に次のコードを埋め込んで保存します。
<!-- Google Code Prettify -->
<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js'></script>
<style>
li.L0, li.L1, li.L2, li.L3,li.L5, li.L6, li.L7, li.L8{ list-style-type: decimal !important }
pre.prettyprint{
  white-space: -moz-pre-wrap;
  white-space: -pre-wrap;
  white-space: -o-pre-wrap;
  white-space: pre-wrap;
  word-wrap: break-word;
}
</style>
1行目のコメントは埋め込んだ位置を示すために書いています。
4行目は行番号を表示したときデフォルトでは、5行間隔しか行番号が表示されないので、
1行ごとに表示するように変更しています。
5行目~11行目は折り返し表示できるように変更しています。

ブログでコードを書くとき

「HTML」モードに切り替え、次のように書きます。
<pre class="prettyprint">
// 行番号を表示しない場合はpreのclassに"prettyprint"を指定
// コード
</pre>

<pre class="prettyprint linenums">
// 行番号を表示する場合はpreのclassに"prettyprint linenums"を指定
// コード
</pre>
コード内で"<"や">"を利用する場合は"&lt;", "&gt;"に置換する必要があります。
<pre>タグの部分だけ「HTML」モードで記述し、「作成」モードに切り替えてコードを
書き込めば"<"や">"の置換をする手間が省けると思います。
「作成」モードに切り替えると、コードを書き込む部分が分かりづらいので、<pre>タグ内に
目印となる文字を入れておけば、切り替えた後でも簡単に場所を見つけられると思います。

Mockitoを利用したテストコードが失敗する

Androidのテストで利用できるモックライブラリのMockitoをテストコードに利用すると
エラーが出てテストが失敗してしまう。

エラーは次のバーチャルデバイスで発生しました。
  • GenymotionのNexus 4 - 4.3 API 18 - 768x1280
なぜか、次のバーチャルデバイスではエラーが発生しませんでした。
  • GenymotionのNexus S - 2.3.7 API 10 - 480x800
AndroidのAPIのバージョンが原因なのか、エラーメッセージをGoogleで検索すると似たような
報告はありました。

エラーメッセージは次のとおり
java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)
"dexmaker.dexcache"という文字列があるので、dexmaker絡みかな。
今のところは様子見で違うAPIのバージョンを使おうかなと思います。

エラーが発生したテストコード
import android.test.AndroidTestCase;

import java.util.ArrayList;

import static org.mockito.Mockito.*;

public class MockExampleTest extends AndroidTestCase {

    public void testMock() throws Exception {
        ArrayList mock = mock(ArrayList.class);
        when(mock.isEmpty()).thenReturn(false);
        assertFalse(mock.isEmpty());
    }
}

バーチャルデバイスだけなので、やはり実機が欲しいですねぇ。

2014年3月4日火曜日

Apacheの再起動を行うときはgraceful

編集したApacheの設定ファイルやPHPの設定ファイルを反映するには
再起動が必要なので前はrestartを利用していましたが、最近はgracefulを利用
するようにしています。

service httpd restart

service httpd graceful

restartで再起動するとApacheのプロセスの子プロセスが実行中でも終了してしまいます。
Apacheで時間のかかる処理を行わせていたら、その処理が終了してしまいます。

Apacheのプロセスの子プロセスが実行中でも、その子プロセスが終了するまでは
再起動しないようにするにはgracefulを利用します。
Apacheで時間のかかる処理を行わせていても、処理が終了するまでは再起動を待ちます。

稼働中のサーバーで編集した設定を反映させたい場合には問題発生の予防として
gracefulを利用しています。

2014年2月18日火曜日

コンソールでPHPコードを実行する

コンソールでPHPコードを実行する場合は下記のようにタイプする。

php -r "任意のコード"

日付や時刻を返すdate関数のフォーマットを確認したり、strtotimeで指定できる
文字列を確認したりするときに使用しています。

php -r "echo date('Y-m-d H:i:s').PHP_EOL;"

コンソール上に出力結果を表示する場合はecho関数も一緒に使用します。
PHP_EOLを付けておけば改行が入るので少し見やすくなるかもしれないです。
PHP_EOLはOSで出力される結果が異なるので、利用するときは注意。

2014年2月16日日曜日

Google Analyticsのデザインが変わっていた

久しぶりにGoogle Analyticsを見てみると画面のUIやらデザインが変更されていた。
前はヘッダーがオレンジ色で家のアイコンとかあったのに
ヘッダーに配置されているアイテムの位置も変わっていた。
Google Analyticsの画面をキャプチャしてドキュメントを作っている場合はドキュメントの
更新が必要になるだろうなぁ

Genymotionセットアップで躓いた

Android標準のエミュレータが遅くて、代わりになるものを探していたところ
前から気になっていた高速なエミュレータGenymotionのインストールを決定!

VirutalBox上で動作するのでVirutalBoxをインストール。
GenymotionはGenymotionのアカウントが必要なので作成。

必要なものがそろったので、作業を進めていくとGenymotionでエラーが発生。
Genymotionで利用するVirutalBoxのネットワーク設定が間違っているとのコト。

192.168.56.0/24を利用するのでホストオンリーネットワークの詳細を見てみると
アダプターのIPv4アドレスの値(192.168.56.100)とDHCPサーバーの
サーバーアドレスが違っていた。

アドレスの値を同じにして、DHCPサーバーのアドレス下限と上限をさっきの
アドレスが含まれないように設定すると無事にエミュレータが起動!
(下限:192.168.56.101 上限:192.168.56.254)

VirutalBoxのネットワーク設定が間違っていました。
上記のままだと、2回目以降エミュレータが起動しなくなっていました。

いまのところ、設定は下記にすることで動作するようになりました。
これを見て設定をされた方がいたら申し訳ないです。


  • アダプター
    • IPv4アドレス:192.168.56.1
    • IPv4ネットマスク:255.255.255.0
  • DHCP サーバー
    • サーバーアドレス:192.168.56.100
    • サーバーマスク:255.255.255.0
    • アドレス下限:192.168.56.101
    • アドレス上限:192.168.56.200

標準のものと比べるとやはり高速でした。

VirutalBox 4.3.6
Genymotion 2.1.1

初投稿

初投稿。

ブログは初心者なので、いろいろと時間がかかりそうな気がする。
日ごろ思ったことや、気になったことについて調査したり、インプットした内容を
細々と発信していこうかな。