読者です 読者をやめる 読者になる 読者になる

明日も楽をするために

めんどくさがりなITエンジニアが書くメモ帳

CentOS6 日本語化設定

vimで編集する際にキーボード設定が出来てないと困るので、まず一時的にキーボード設定を行う

#loadkeys jp106

以下の設定でキーボード設定を行う

#cat /etc/sysconfig/keyboard
KEYTABLE="jp106"
MODEL="jp106+inet"
LAYOUT="jp"
KEYBOARDTYPE="pc"

言語設定

#vi /etc/sysconfig/i18n
LANG="ja_JP.UTF-8" ※うまくいかない場合は"ja_JP.eucJP"

コマンドで確認→設定反映→確認する

#echo $LANG
#source /etc/sysconfig/i18n
#echo $LANG

時刻設定

#vi /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true

タイムゾーンを設定

#cp /usr/share/zoneinfo/Japan /etc/localtime

vagrantでcentosを簡単に用意して使用する方法

vagrantを使用する際にまずはboxをダウンロードしてくる必要がありますが
boxを配布しているサイトは公式の物と非公式の物があります。

centosは以下に公式のboxがありますので、こちらを使用します。
centos | Atlas by HashiCorp

centos6を今回は選択して使用します。
boxのurlにcentos/6を指定すると自動で最新のバージョンが落ちてきます。

#vagrant box add centos/6
#mkdir ~/dev
#cd ~/dev
#vagrant init centos/6
#vagrant up
#vagrant ssh 

urlを指定する場合はダウンロードしたいバージョンを選択し、該当のURLをベースにproviders/virtualbox.boxを最後に追記します。
https://atlas.hashicorp.com/centos/boxes/6/versions/1611.01

#vagrant box add game_dev https://atlas.hashicorp.com/centos/boxes/6/versions/1611.01/providers/virtualbox.box

vagrant upでvagrantを起動することができます。

#vagrant up

vagrant sshvagrantにアクセスできます。vagrant initしたフォルダで実行してください。

#vagrant ssh

vagrantを終了したいときはvagrant環境からログアウトした後にvagrant haltで終了できます。

#vagrant halt

PHPカンファレンス2016に行ってきました!

f:id:makoto1212:20161104232102j:plain:w400f:id:makoto1212:20161104232107j:plain:w400f:id:makoto1212:20161104232112j:plain:w400
スタンプラリーがあったのですが本が2冊当たりました。ありがとうございます。

「Cygamesを支えるPHPと、その高速化の取り組み」を聞いてきましたが、とても面白い話でした。今後もイベントは積極的に参加して行こうかなと思います。

Cygamesさんのサーバー構成を聞く限りだとnginx、vagrant、ansibleってどこでも結構使ってるんですね。
自分はapache環境が多いのでnginxの勉強もしないと行けませんね。

vagrant、ansibleは絶賛勉強中です。便利過ぎて使ってすぐに仕事での導入を考えました。

PHPでコーディング規約の自動化 PHP CodeSniffer

どうしても開発者が増えてきたりするとコーディング規約が適当になりがちです。
そこでコーディング規約を自動化しようと思いました。

職場のコーディング規約はPEARを元にしたものですが、現在では時代遅れ感が否めないのでPSRを採用する方向で考えました。
最近のPHP系のフレームワークはこれを採用しているところが多いです。
www.php-fig.org


実際に試したのはPHP_CodeSnifferと
github.com


PHP-CS-Fixerです。
github.com

某QiitaでPHP_CodeSnifferは古いと書かれていたのでPHP-CS-Fixerを先に使ってみましたが、現在self-updateすると落ちてくるのが2.0のDEV版なのですが、2.0からどうやらオプションが変わるようで1.x系のオプションが使えないので苦労しました。それとDEV版だからなのか、if文が複数行あるとインデントが崩れるため今回の使用は見送りました。

PHP_CodeSnifferは古いと書かれていましたが、現在でも開発は行われているようで全然問題ありませんでした。PHP_CodeSnifferはxmlのruleset.xmlを元にオレオレコーディング規約も作れるので便利です。

ダウンロード

PHP_CodeSnifferは2種類ありまして、phpcs.pharがコーディング規約を適用したさいのdiffを取れます。phpcbf.pharがコーディング規約の適用です。
それぞれgithubから落としてきます。

wget https://github.com/squizlabs/PHP_CodeSniffer/releases/download/2.6.1/phpcs.phar -O phpcs.phar
wget https://github.com/squizlabs/PHP_CodeSniffer/releases/download/2.6.1/phpcbf.phar -O phpcbf.phar
mv ./phpcs.phar /usr/local/bin/phpcs.phar
mv ./phpcbf.phar /usr/local/bin/phpcbf.phar
chmod 755 /usr/local/bin/phpcs.phar
chmod 755 /usr/local/bin/phpcbf.phar
使い方

--standardでコーディング規約を指定します。--report=diffをつけるとどこが変わったか見ることができます。

php phpcs.phar --standard=PSR2 /foo/foo.php
php phpcs.phar --standard=PSR2 --report=diff /foo/foo.php

コーディング規約を改造したい方はGithubのPSR2のxmlを元に自分流に改造できます。改造したファイルのPathを--standardに指定すれば使えます。
PSR2 ruleset.xml
https://github.com/squizlabs/PHP_CodeSniffer/blob/master/CodeSniffer/Standards/PSR2/ruleset.xml

変換実行
php phpcbf.phar --standard=ruleset.xml /foo/foo.php

ignoreで除外もできます。
php phpcbf.phar --standard=ruleset.xml /foo/foo.php --ignore=*Base.php

AndroidとiPhoneでhtml5を使用して音声と動画にアクセス時にユーザエージェントが変わる件

Html5で音声と動画にアクセスする際にAndroidiPhoneだとユーザエージェントが異なるものでアクセスされることが分かった。

Androidの場合(Zenfone5)
stagefright/1.2

iPhoneの場合(iPhone6の9.2)
AppleCoreMedia/1.0.0.13D15 (iPhone; U; CPU OS 9_2_1 like Mac OS X; ja_jp)

私が試した環境だと音声だけだが、調べてみると動画でも起きるらしい。Androidの場合は端末によって端末名が入っていたり、Zenfone5のようにAndroidの文字すら入ってない場合もあるのでユーザエージェントをandroidで判定していると痛い目を見る。

UITableViewでUITableViewCellの高さを自動で可変する

今回はUILabelとUITextViewを使用した場合にUITableViewCellの高さを自動で可変する方法を書きます。UITableViewは予め設定し終わった状態と過程して話を進めます。

StoryBoard上の設定は以下のようにmarginをセットしてます。
画像はUILabelですが、UITextViewも同じようにします。
f:id:makoto1212:20160309213400p:plain:w300

UILabelを使用するときは設定でLinesを0にしてください。
f:id:makoto1212:20160309213838p:plain:w300

UITextViewを使用するときは設定でScrolling Enabledのチェックを外してください。
f:id:makoto1212:20160309213840p:plain:w300


そして以下のコードを追記します。

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }

estimatedHeightForRowAtIndexPathは予めUITableViewCellの高さを指定してやることで実際に表示した際に負荷を軽減してくれます。
heightForRowAtIndexPathは実際のUITableViewCellの高さを取得します。


今回は返り値にUITableViewAutomaticDimensionというUITableViewCellの高さを自動で取得してくれる値を書きます。


ちなみにネット上で色々コードが転がっていたので、それぞれ試してみました。

//OK
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 100

//OK
tableView.rowHeight = UITableViewAutomaticDimension
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }

//OK これが同じ所に書けるし、一番いいのでは?
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }

//NG 何故・・・estimatedRowHeightにはUITableViewAutomaticDimensionを直に設定することが出来ない
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = UITableViewAutomaticDimension

iPhoneアプリを一人で開発している俺がstoryboardの分割に踏み切った理由

iPhoneアプリ複数人で開発していると衝突を避けるためstoryboardの分割は必須だと思いますが、一人で開発している分には別に衝突しないし特に気にする必要もないと思っていたのですが、画面数が増えてきたところで色々と問題が出てきたので同じように一人で開発している人に共有したいと思います。


分割しない場合

メリット
・なにも考えないでstoryboardが書ける。

デメリット
・画面数が増えてくると表示に時間がかかる
・新規画面を追加している際に既存の画面を間違えて変更した時に気づきにくい


特に"画面数が増えてくると表示に時間がかかる"


これが結構問題で、作業効率が著しく落ちます。
(※私の仕事で使用しているMacMiniが5年前以上に買った物というのもありますが・・・)

最初はイメージで画面1枚に付き、storyboardを1枚用意しないといけないと思っていたのですがiOS8以降が対象であるならば以下が使用できます。


Storyboard Reference
developer.apple.com

xcodeの右下のほうにあるのですが、これをstoryboard上に持ってきます。
f:id:makoto1212:20160226000618p:plain:w300

Storyboard Reference内の設定でStoryboardのファイル名の一覧がでてきます。
f:id:makoto1212:20160226001004p:plain:w300

あとはStoryboard Referenceに対して今までどおりにSegueを張るだけでOKです。
f:id:makoto1212:20160309220028p:plain:w300


Storyboard Referenceを導入すると

メリット
・画面分割を機能ごとのStoryboardで分割できる
・Segueがそのまま使える

デメリット
・iOS8の場合はRelationship Segueが使用できない

対してデメリットはないのでオススメです!!