OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Unite 2015「ここが変わる！Unity 5のスマホ開発　～アセットバンドル、ビルド、プラグイン～」レポート


# レポート一覧

- [ここが変わる！Unity 5のスマホ開発　～アセットバンドル、ビルド、プラグイン～](http://qiita.com/baba_s/items/8d4a30d6458b9efac2fe)
- [コロプラUnity 5プロジェクト ～白猫プロジェクトにおけるUnity 4からUnity 5への移行事例～](http://qiita.com/baba_s/items/3c394db28be90d83234c)
- [Unity 5グラフィックス機能使いこなしガイド](http://qiita.com/baba_s/items/d4f7b24bab2ccdaa1f1e)
- [Rederer Massive Amount of Objects in Unity](http://qiita.com/baba_s/items/228b368196ef606e4b68)
- [協力・対戦ゲームを支えるPhotonの最新情報、Mecanimにネイティブ対応したPUNの実力協力・対戦ゲームの市場感](http://qiita.com/baba_s/items/3f29400c026fc0d87842)
- [ゲーム開発の始め方、育て方、終わらせ方～「Game Dev Heroes」における生産性チャレンジ～](http://qiita.com/baba_s/items/a563b09e93e7e868d00b)

# 講演ファイル

http://japan.unity3d.com/unite/unite2015/files/DAY1_1300_room2_Ito.pdf

# AssetBundle

## 今までの問題点

- スクリプトを書く必要がある
- ビルド時間が長い
- 差分ビルドが難しい
- 依存関係の設定が面倒
- 互換性がない
	- Unityのバージョンを上げるとビルドし直す必要がある
	- アプリのユーザーがアセットバンドルをDLし直す必要がある

## Unity 5.x 以降

- スクリプトを書く必要がほとんど無くなった
- 差分ビルドが簡単になった
- push、popしなくてもUnityが依存関係を設定してくれるようになった
- 互換性を保持するようになった
- 注意：4.xと5.xのアセットバンドルを混ぜないように

## 新しいアセットバンドルのビルド方法

1. UnityエディタのInspectorでAssetとAssetBundle間を結びつける
2. ビルドするスクリプトを呼ぶ  
`BuildPipline.BuildAssetBundles();`

これだけ

# 名前付けに関して

- 拡張子は.unity3dじゃなくてもいい
- 小文字のみ
- 同じ名前は禁止
- パス構成が使える
- Editor拡張で一気に「名前」=「パス」と変更も可能

## BuildAssetBundleOptionsが追加された

- IgnoreTypeTreeChanges
	- ソースコードを変更しても変化したとみなされない
	- アセットバンドルの再生成を防ぐことができる？
- DisableWriteTypeTree
	- タイプツリー削除（サイズ削減用途として）
	- こちらオンにしてIgnoreTypeTreeChangesをオンにすることはできない

## バージョン互換性

- 4.6と5.1: ☓
- 5.1と5.2: ○

## 依存関係

- マニフェストファイルが解決
	- SingleManifestファイル
		- 親玉
		- 依存関係を解決できる
		- ランタイム時に読んで使用する
	- 他の.manigestファイル
		- インクリメンタルビルドにだけ関係する
		- ランタイム時は読み込まない

## .manifestファイルの中身

- CRC
- アセット名
- 依存関係
- Hash
- ClassTypes

## SingleManifestファイルの中身

- すべてのアセットバンドル名などを保持する
- OSXプラットフォーム向きであれば「OSX.manifest」がSingleManifestファイル

## Variantとは？

- SDモードやHDモードでアセットを出し分けする機能のこと
- つまり、ランタイム時に読み込むアセットバンドルを変えられる
- アセットのInspectorのアセットバンドル名の右側の入力欄で設定可能

## サンプルプロジェクト

- http://files.unity3d.com/vincent/assetbundle-demo/users_assetbundle-demo.zip
- 下記のスクリプトを参考にするのがおすすめ
	- AssetBundleManager.cs（マネージャークラス）
	- BaseLoader.cs（基本ローダー）

## Unityエディタ上でテストする

- AssetDatabase.GetAsssetPathsFromAssetBundleAndAssetName
- ランタイムと同じ仕組みをエディタ上で再現できる

## ジュエルセイバー

- 無償のキャラクターコンテンツ
- http://www.jewel-s.jp/download/

## アセットバンドルビルドの時間短縮の方法

- 複数のプロジェクトを用意して並行でビルドする
	- プロジェクトファイルを複数作成
	- シンボリックリンクを設定する
		- Library,ProjectSettingsフォルダをリンク
		- Assetはその中にあるフォルダとファイルをリンク
		- Tempはリンクしない
	- Unityはバッチモードを使う
	- ビルドするAssetBundleはプロジェクトによって分担を分ける
		- 例：100個あるABのうち、1~25はプロセス1,26~50はプロセス2に任せる
	- 注意点
		- 未来永劫使えるとも限らない！
		- 運用は自己責任で...

## UnityEditor.iOS.Xcode名前空間

- Xcodeプロジェクトを直接編集可能になりました
- ただしドキュメントがない
- サンプルコード
	- http://bit.ly/1CSDBYo

# Plug-in

## 変更点

- Inspectorで設定できるようになった
- Pluginsフォルダの中に入れなくてもいい？
	- 依存するFrameworkを選択可能
	- コンパイルオプションを設定可能

## Native Plugin

1. Unityからネイティブの関数を呼び出し
2. CからObjCを呼び出し
3. ObjCを呼び出し

## ObjC.cs

- objc_getClassなど
- 利点
	- 橋渡し部分のコードを書かなくてもいい
	- Singletonを使わなくていい
- 注意点
	- 引数が使えない
汎用スクリプト作成に利用するスクリプトステップ


前回の投稿でスクリプト引数の渡し方について書きましたが、受け取ったデータを利用したレイアウトに依存しないスクリプト作成についてまとめておきます。

#スクリプトステップ
##フィールドを名前で設定 [<指定された計算フィールド>; <計算値>]
汎用的な処理を作成する場合は、直接フィールド名をしたくないので、スクリプトの引数でフィールド名を受け取り設定するためにこのスクリプトステップを利用します。

カスタム関数で引数を受け取る方法で記述した場合、以下のような感じで利用します。

```FMScript:指定フィールドに値を設定するスクリプト(FieldName;Value)
1 #引数を受け取るだけのシンプル版
2 If [#Assign ( Get ( スクリプト引数 ) )]
3	新規レコード/検索条件
4 	フィールドを名前で設定 [$FieldName; $Value]
5 End If
```

##オブジェクトへ移動 [オブジェクト名:""<オブジェクト名>"]
ポータル内のフィールドに対して処理する場合などに利用しています。
１つのレイアウト内に複数のポータルを配置している時などはポータルに名前を付けておかないと想定外の動きをすることがあるので気をつけましょう。

![ポータルに名前を付ける](https://qiita-image-store.s3.amazonaws.com/0/68589/0d99a6b1-a892-6aef-6d26-0b20f429471e.png "スクリーンショット_2015-04-23_10_00_41.png")

使用例は以下のような感じです。

```FMScript:ポータル内に行追加(ポータル名;フィールド名;フィールド値)
1 If [#Assign ( Get ( スクリプト引数 ) )]
2 	オブジェクトへ移動 [オブジェクト名: $ポータル名]
3 	ポータル内の行へ移動 [選択; 最後の]
4 	フィールドを名前で設定 [$フィールド名; $フィールド値]
5 End If
```



上記2つのスクリプトステップは汎用的なスクリプトを作成しようとした場合には頻出すると思いますので参考にしてみてください。
jQueryプラグインをつくるときのテンプレート

## テンプレート
とりあえずつくりたいとき用

```js
;(function($) {

    $.fn.myPlugins = function(option) {

        var defaults = {
            // ここにデフォルトのオプション
        };

        var option = $.extend({}, defaults, option);

        // ここにJavaScript

        return this;
    };

})(jQuery);
```
ネストされたJSONの取り出し方メモ

<h2>JSONデータの解析</h2>

>オブジェクトは、順序付けされない名前/値のペアのセットです。オブジェクトは、{(左の中括弧)で始まり、} (右の中括弧)で終わります。 各名前の後ろには、:(コロン)が付きます。そして、名前/値のペアは、,(コンマ)で区切られます。
[JSON の紹介](http://json.org/json-ja.html)

`{}：Dictionary`
`[]：Array`

<h3>openWeatherMapのJSONデータからお天気をとる</h3>

```lang:openWeatherMap
{"coord": 
{"lon": 139,
"lat": 35},
"sys": 
{"message": 0.0296,
"country": "JP",
"sunrise": 1429732929,
"sunset": 1429780953},
"weather": [
{"id": 802,
"main": "Clouds",
"description": "scattered clouds",
"icon": "03d"}],
"base": "stations",
"main": 
{"temp": 287.25,
"temp_min": 287.25,
"temp_max": 287.25,
"pressure": 1026.76,
"sea_level": 1034.8,
"grnd_level": 1026.76,
"humidity": 100},
"wind": 
{"speed": 3.21,
"deg": 41.5002},
"clouds": 
{"all": 36},
"dt": 1429749965,
"id": 1851632,
"name": "Shuzenji",
"cod": 200}
```

ここからtempだけ取り出す場合

```lang:hoge.m
-(NSString *)getWeatherTemp:(NSString *)lat lon:(NSString *)lon{
    
    NSString *temp;
    
    NSString *ApiPath = [NSString stringWithFormat:@"http://api.openweathermap.org/data/2.5/weather?lat=%@&lon=%@",lat,lon];
    NSURL *url = [NSURL URLWithString:ApiPath];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    NSData *jsonData =[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    if(jsonData){
        NSError *jsonParsingError = nil;
        
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&jsonParsingError];
        NSArray *status = [dic objectForKey:@"main"];
        NSNumber *mainWeather = [status valueForKey:@"temp"];
        float code = [mainWeather floatValue];
        code = code - 273.15;//ケルビン係数なので273.15を引く
        temp = [NSString stringWithFormat:@"%.1f",code];        
    }
    return temp;
}

```

weatherのmainだけ取り出す

```
        NSArray *status = [dic objectForKey:@"weather"];
        NSArray *mainWeather = [status valueForKey:@"main"];
        NSString *string = mainWeather[0]; 
        return string;

```
ReSharper利用者の、StyleCopルール無効設定作業録

# 概要
StyleCopで無効にしたルールの覚書

## ReSharperの整形と合わないルール
* SA1309（フィールド名をアンダースコアから始めてはいけない）
* SA1101, SA1126（暗黙のthisなどを使用しない）
* SA1013, SA1012（{}括弧内の要素の前後に空白を入れる）
* SA1200（名前空間の中でusingする）

## やる気がないルール
* SA1633（ファイルの先頭でヘッダコメントを書く）
* SA1623, SA1630, SA1642, SA1643, SA1650（英語の使用を前提とした文法チェックなど）
* SA1400（クラスのアクセス修飾子を明示的に指定する）
* SA1600（コンストラクタにコメントを付ける）
* SA1601（partial class にコメントを付ける）

## 全体の設定

designerファイルまでスタイルを揃える気が無いので対象外にする。
設定ダイアログの、左側のペインでC#を選び、Analyze designer files のチェックボックスを外す

private フィールドまではドキュメント化する気が無いので対象外にする。
左側のペインで"Documentation Rules"を選び、Ignore privates にチェックを入れる。
NetworkManager で vboxnet を管理外にする

/etc/NetworkManager/NetworkManager.conf に書けばいい

```
[keyfile]
unmanaged-devices=mac:0a:00:27:00:00:00;mac:0a:00:27:00:00:01;mac:0a:00:27:00:00:02
```

https://github.com/openshift/origin/blob/d2e59476f5eae4bd0bca087af42213f2f7dbf3d4/CONTRIBUTING.adoc#ensure-virtual-box-interfaces-are-not-managed-by-network-manager に載っているスクリプトが便利

```
$ ip link list | grep vboxnet  -A 1 | grep link/ether | awk '{print "mac:" $2}' |  paste -sd ";" -
```
PostgreSQL コンテナの backup / restore をする

Docker コンテナとして動いている PostgreSQL からデータを backup する、またデータを restore する（PostgreSQL コンテナにデータを注入する）方法です。
ここで使っているイメージは [Docker Hub 公式の postgres](https://registry.hub.docker.com/_/postgres/) イメージです。今回は `postgres:9.4.1` を使いました。

```bash
$ docker run -d -p 5432:5432 --name postgres postgres:9.4.1
```

## backup する

```bash
$ docker exec [container_id or name] pg_dumpall -U postgres > dump.sql
```

コンテナ内のデータベース全体が SQL として dump されます。

```sql:dump.sql
--
-- PostgreSQL database cluster dump
--

SET default_transaction_read_only = off;

SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;

--
-- Roles
--

CREATE ROLE postgres;
ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION;

...
```

## restore する

他の PostgreSQL（コンテナに限らず）から取得した dump.sql が必要です。

```bash
$ cat dump.sql | docker exec -i [container_id or name] psql -U postgres
```

```
SET
SET
SET
ERROR:  role "postgres" already exists
ALTER ROLE
REVOKE
REVOKE
GRANT
GRANT
You are now connected to database "postgres" as user "postgres".
SET
SET
SET
SET
SET
SET
SET
...
```

ちゃんとデータが流し込まれたか確認

```bash
$ docker exec -it postgres psql -U postgres
```

```
psql (9.4.1)
Type "help" for help.

postgres=# \d
                  List of relations
 Schema |         Name         |   Type   |  Owner
--------+----------------------+----------+----------
 public | ramesh_images        | table    | postgres
 public | ramesh_images_id_seq | sequence | postgres
 public | schema_migrations    | table    | postgres
(3 rows)

postgres=#
```

:tada:
React Nativeを実機で動かす

###1. AppDelegate.mを開きます。
以下、実行する形式が2種類あります。

###2-1. サーバーでデバッグしながら実行する場合(OPTION1)
「OPTION 1」はサーバー上でデバッグしながら実行するモードです。その場合、`http://localhost:8081/index.ios.bundle`のlocalhost部分を自分のMACのIP(192.168.x.xなど)に変更してください。もちろんiphoneなどの実機も同一のWiFiネットワークに接続しておく必要があります。

###2-2. 本番同様に実機にバンドルする(OPTION2)
もしくは「OPTION 2」です。実機にバンドルして本番と同様に状態で実行されます。
そこに書いてあるとおり、以下のコマンドをプロジェクトrootディレクトリで実行しましょう。

```
$ curl 'http://localhost:8081/index.ios.bundle?dev=false&minify=true' -o iOS/main.jsbundle
```
これで、main.jsbundleというファイルがプロジェクト内に作られます。

次に「OPTION 1」の`jsCodeLocation = ...`をコメントアウトして、「OPTION 2」の同様の最後の行をコメント解除します。

以上でRun出来るようになるはずです。

上手く実行出来ない場合には、curlの再実行と、xcodeのProduct>Cleanをしましょう！

※バージョンによって記述の仕方が変わるので注意してください。
弊社後輩のためのBundlerの説明


なお、環境はMacです。

bundlerってのは、「同梱」みたいな意味のライブラリで、Gemfileに書いてあるライブラリをプロジェクトと関連づける役割をする。
各ライブラリのバージョンも、Gemfile.lockに書かれているバージョンに固定される。

## bundle install

```Bash
bundle install
```

は、文字通りインストール。
Gemfile.lockを見ながら、既に存在するライブラリのバージョンはそのままで、ないものはインストールされる。

## bundle update

```Bash
bundle update
```

は、文字通りアップデート。後ろになにも書かないと、Gemfile(.lockじゃないやつ)で
バージョン固定されていないライブラリは全部バージョンアップしようとする。

```Bash
bundle update rails
```

って書くと、railsとそれが依存するライブラリのみアップデートしようとする。
その際に、Gemfile.lockも上書きされる。

私の場合は、`bundle update hogehoge`した後に必ずテストを行い、通ったらgitでcommitする。
乱暴に`bundle update`のみを行うことは、ほぼない。

## bundle exec

```Bash
bundle exec hogehoge
```

は、そのプロジェクト内で使ってるライブラリのバージョンを使って操作する。
例えば、

```Bash
gem install rails
```

ってやっていると、今だと4.2.1が入ってしまうから、
bundle execつけずに`rails s`などを実行すると、4.2.1のrailsで実行される。

しかし、既存のプロジェクトみたいにプロジェクト内のGemfileにgem rails, '3.2.19'って書いてあるところで

```Bash
bundle exec rails s
```

って書くと、3.2.19のrailsで実行される。

複数のプロジェクトで異なるバージョンのライブラリを使っていたりするときには、必ず`bundle exec`を付けるといい。
railsの場合はプロジェクト内で

```Bash
bin/rails s
```

とか、binディレクトリができてて、それを使うとよしなにしてくれるようにはなったけど。

## オマケ: Alias

.bash_profileなど、ログインした際に読み込まれるファイルに以下を書いておくと便利。

```Bash:.bash_profile
# Alias
alias be='bundle exec'
alias bi='bundle install'
alias bu='bundle update'
```

こうすることで、`be middleman`や`be rails s`などと書けるようになる。
最近JavaScriptでハマったこと（メモ）

最近ハマった初心者的罠のメモ。

# 連想配列のカンマ
IE7以下だと下記のようなJavaScriptコードは構文エラーになる。

```javascript:
dataLayer.push({
    "a" : "aaa",
    "b" : "bbb",
    "c" : "ccc",
});
```

⇒連想配列の最後の要素の後にカンマを付けてはいけない。

**IE8以上や他のブラウザではエラーにならないので気付きにくい＞＜**

参考：http://dqn.sakusakutto.jp/2012/05/javascript-last-comma.html

# タイムスタンプの日付フォーマット

下記コードで日付を取得すると、ブラウザによってフォーマットがバラバラになる。

```javascript:
var date = new Date();
var now = date.toLocaleString();
// 2015/03/18 16:53:10
// 2015年3月18日 16:53:10 JST
// WED MAR 18 2015 16:53:10 GMT+0900 (JST)
```

⇒date.getMonth(), date.getDate()等でそれぞれ取得して自分でフォーマットを揃える。
React NativeでCommand /bin/sh failed with exit code 2のビルドエラー

以下のようなビルドエラーが発生しました。

```
Connection to localhost port 8081 [tcp/sunproxyadmin] succeeded!
Port 8081 already in use, packager is either not running or not running correctly
Command /bin/sh failed with exit code 2
```

すでに8081ポートのnodeのプロセスが使われているとのことです。

プロセスを確認するコマンドをうちます

```bash:ターミナル
lsof -n -i4TCP:8081
```

以下のような結果がでます。

```bash:ターミナル
COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    14733 nishiyama   18u  IPv6 0x2eb9a9c7e8b5881f      0t0  TCP *:sunproxyadmin (LISTEN)
```

PIDの列のプロセスIDを使って、Killします。
`<PID>`は上記の例だと、14733になります。

```bash:ターミナル
kill -9 <PID>
```

これで再度ビルドしてみてください。
Swift+xibで簡単レイアウトでカスタムビュー

方法としては以下のリンクのように行います。
http://blogios.stack3.net/archives/1944

これをSwiftで行う方法が本エントリです。

手順は
* xibでレイアウトを作る
* swift側のinitでxibをaddsubviewする
といった流れになります。

まずはNew File>iOS/User Interface>ViewからCustomView.xibを作り、適当にレイアウトします。

![Screen Shot 0027-04-23 at 9.06.29 AM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/0af3bebf-87b1-d12e-5848-8c5fa3324997.png)

次にCustomView.swiftを作り、以下のように編集します。

```swift:CustomView.swift


required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.customViewCommonInit()
    }
    
    func customViewCommonInit(){
        let view = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil).first as! UIView
        view.frame = self.bounds
        view.setTranslatesAutoresizingMaskIntoConstraints(true)
        view.autoresizingMask = UIViewAutoresizing.FlexibleWidth|UIViewAutoresizing.FlexibleHeight
        self.addSubview(view)
    }

```

少し解説をいれると、init(coder aDecoder: NSCoder)はStoryboardからCustomViewが呼ばれる際に呼ばれるイニシャライザです。
ここでプレーンなUIviewを生成した後、customViewCommonInitメソッドでxibからロードしたviewを取得し、addsubviewします。

最後にxibに戻り、File's OwnerのCustom ClassをCustomViewに指定して終了。

StoryboardでUIViewを貼り付けて、Custom ClassをCustomViewに指定すればStoryboardからxibでレイアウト指定したカスタムビューを貼ることが出来ます。

コードから呼ぶ場合はinit()やinit(frame:frame)に同様の処理をしてください。
MacにPython 3.4をインストール


# Macに入っているPython
最近買ったMacbook Pro(Early 2015)にはPython 2.7が最初から入っている。
Python 2.7ならすぐに使い始められるが、Pythonを本格的に使い始めたのは最近なんで、Python2系はいまさらって感じがする。
Python 3.0がリリースされたのはもう6年も前だし。
多少ハードルが高くてもここは最新のPython 3.4をインストールすることにする。　

# Windowsの場合
Windowsなら[WinPython](https://winpython.github.io)で一発インストールできる。
NumPyやSciPyなど技術計算で使うようなパッケージも最初から一緒についてくるんでかなり便利。
Python2系もPython3系もあるし、64ビット版もあるし、ポータブル版もある。
MacにはWinPythonみたいなのはなさそうなんでインストール方法を調べた。

# Homebrewのインストール
Macを買ったばかりで知らないことばかりだが、プログラマならPythonなどのパッケージとやらを[Homebrew](http://brew.sh/index_ja.html)でインストールするらしい。
他にどんなパッケージがあるのかは知らないが、とりあえずPython 3.4がインストールしたいだけなんで後で調べよう。

インストールにはHomebrewのサイトに書いてあるRubyのワンライナーをターミナルで実行する。
PythonをインストールするためにRubyもインストールしなきゃいけないのかってうんざりしてたが、MacにはRubyは最初から入ってる。何から何まで知らないことばかりだ。

# Python 3.4のインストール
Python 3.4のインストールは簡単。
ターミナルから下のコマンドを実行するだけでインストールされる。

```bash
$ brew install python3
```
これでインストールできるのは最新バージョンのみ。
最新バージョン以外をインストールする場合はどうするんだろう？
XOOPS Cubeで特定のモジュールの一般設定を取得する方法


モジュールの中ではグローバル変数の$xoopsModuleConfigでそのモジュールの一般設定の値を取得できるが、別のモジュールの一般設定を参照したいことがあったのでその方法をメモ。


	$moduleHandler = xoops_gethandler('module');

	// モジュール指定 target_module_dirname を一般設定を取得したいモジュールのディレクトリ名に変更してください
	$targetModule = $moduleHandler->getByDirname('target_module_dirname');

	// コンフィグ取得
	$configHandler =& xoops_gethandler('config');

	// targetModuleConfigに対象モジュールの一般設定が入る
	$targetModuleConfig = $configHandler->getConfigsByCat(0, $targetModule->get('mid'));
ImagemagickをOpenCL対応にしてみた

# Homebrewで

```
brew info imagemagick
```

とすると

```
--without-opencl
```

なんて出てくるからってきりOpenCLに対応していると
思った。Macは全部OpenCLに対応したってWWDC2013で発表されてたし。

# imagemagickの状態を調べる

```
convert -list configure
```

や

```
convert --version
```

とすると

ある程度、どんなオプションが有効な状態かがわかる

これで確認すると手元のMac miniとMacBook Pro RetinaはOpenCLが出てこなかった。

# --enable-opencl で有効になったっぽい

```
brew edit imagemagick
```

でそれっぽいところに--enable-openclを追加

```rb
 args = %W[
      --disable-osx-universal-binary
      --prefix=#{prefix}
      --disable-dependency-tracking
      --disable-silent-rules
      --enable-shared
      --disable-static
      --with-modules
      --disable-openmp
      --enable-opencl
    ]

```

```
brew reinstall imagemagick
```

上記のコマンドでFEATURE欄にOpenCLと表示されたのを確認。
あと、リンクしてるimagemagickのコアなんちゃらをotool -Lしたら、OpenCL Frameworkリンクされていた。

ただ、これまでの作業で、OpenCLが実際に使われているのかや、そもそも速くなるのか
はこれから調べてみるかもな状態。

# Link

- http://www.imagemagick.org/script/opencl.php
- [OpenCLでImageMagickはどれほど高速化されるか](https://mizukama.sakura.ne.jp/ol/article_016.php)
- https://developer.apple.com/videos/wwdc/2013/?id=508

# 関連投稿

- [ImageMagickのMagick++ APIでEXIFを取得するには - Qiita](https://qiita.com/kjunichi/items/f68d1c5884f1dc44c273)
- [Magick++を使ったソースをWindowsでビルドするには - Qiita](https://qiita.com/kjunichi/items/c4362f666f74c1636a75)
- [Magick++でrepageするには - Qiita](https://qiita.com/kjunichi/items/e8b44443b6e8d84e617d)
- [Travis-CIでImageMagickをclangでビルドして使うには - Qiita](https://qiita.com/kjunichi/items/c08a6ae9809d1fe8325a)
- [Magick++で利用可能なフォント一覧を取得するには - Qiita](https://qiita.com/kjunichi/items/c62df93f5fdad79a3eff)
- [PNGを扱えるImageMagickをクロスコンパイルするには - Qiita](https://qiita.com/kjunichi/items/d13c4633bf76a2cc2c9d)

# 関連記事

- [ChocolateyでImageMagickをヘッダ、Libファイルとレガシーコマンドも一緒に入れるには](https://abrakatabura.hatenablog.com/entry/2018/02/21/071914)
- [mruby-mrmagickをWindowsでもv7系のImageMagickに対応させた](https://abrakatabura.hatenablog.com/entry/2018/02/23/074159)
- [Ubuntu16.04LTSでapt install imagemagick-devしてもImageMagickがリンクされない件](https://abrakatabura.hatenablog.com/entry/2018/03/02/071533)
stack smashing | スタック破壊

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> スタック破壊 (stack smashing)は、バッファーオーバーフローによって、実行スタックに割り当てられたメモリ上のデータが上書きされる場合に発生する。

メモリのうちのスタック領域におかしなデータが書かれる状況だろう。

どのように破壊されるかについては、上記の本において図説でよく説明されている。

<hr>
http://inaz2.hatenablog.com/entry/2014/03/14/151011
> スタック上にあるcanaryと呼ばれる値は、実行するたびに値が変わる。 これは、stack-smashing protection (SSP) と呼ばれるセキュリティ機構によって追加されるデータである。 SSPは元となった実装の名前からStackGuardやProPoliceとも呼ばれることがある。

SSP / StackGuard / ProPolice は知らなかった。
espレジスタ > アーキテクチャのスタックポインタを指定する

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> アーキテクチャのスタックポインタはespレジスタで指定される。
>...最初のeはextendedの意味で、32ビットスタックポインタと16ビットスタックポインタを区別する

espのspはstack pointerだろうか。
命令ポインタ > eip 

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> 命令ポインタ (eip)は、次に実行される命令のアドレスを指し示す。
> ... 最初のeはextendedの意味で、32ビットスタックポインタと16ビットスタックポインタを区別する

eipのiはinstructionだろうか?

<hr>
stack > フレームポインタ / ベースポインタ

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 現在のフレーム(スタックフレーム)のアドレスは、フレームポインタもしくはベースポインタと呼ばれるレジスタに保存される。

<hr>
http://www.uquest.co.jp/embedded/learning/lecture13.html

> あと、多くのシステムではフレームポインタ(FP)レジスタというものが用意されているんだけど、...
twitter4j-http2-supportでStethoを導入しやすくしてみた。

 参考 http://qiita.com/takke/items/96b7a45f0476d546b5b1
 参考 http://qiita.com/wasabeef_jp/items/1e7bdb78766708206d3d  

このへん見て自分もやりたくなってカッとなってやった。

リポジトリ
https://bitbucket.org/mumei_himazin/twitter4j-http2-stetho


###導入###
```java
repositories {
    mavenCentral()
	maven{
		url 'http://repository.mumei-himazin.info/nexus/content/repositories/releases/'
	}
}
dependencies {
	compile 'org.twitter4j:twitter4j-core:4.0.3'
	compile 'org.twitter4j:twitter4j-http2-support:4.0.3'
	compile 'info.mumei-himazin:t4j-h2-stetho:2.0'
}
```


###使い方###
```java
Twitter twitter = new TwitterFactory(configuration).getInstance();
twitter4j.stetho.Twitter4jStetho.initialize(twitter);
```
後は参考のところと同じようにApplicationで  

```java
public class Application extends android.app.Application{
	@Override
	public void onCreate() {
		super.onCreate();
		com.facebook.stetho.Stetho.initialize(
			com.facebook.stetho.Stetho.newInitializerBuilder(this)
				.enableDumpapp(com.facebook.stetho.Stetho.defaultDumperPluginsProvider(this))
				.enableWebKitInspector(com.facebook.stetho.Stetho.defaultInspectorModulesProvider(this))
				.build()
		);
	}
}
```

Gradleに書いて
Applicationでテンプレ書いて
twitter4j.twitterをTwitter4jStetho.initialize(twitter)にぶち込むだけです。
Apache CXF (JAX-RS) で abstract class を活用した REST Client を作る

JAX-RS を使うと REST クライアントが簡単に書けることを知ったが、
一つ問題があった。

具体的には、以下のようなことがやりたかった。

```java
@Path("/json_sample")
public abstract class SampleRESTServer {
    /**
     * このメソッドではサーバーにデータを取得して POJO で返す
     */
    @GET
    @Path("/hello.js")
    public abstract Message getMessageJSON();

    /**
     * このメソッドは、POJOの一部だけ返す
     */
    public String getMessage() {
        return this.getMessageJSON().getMessage();
    }
}
```

REST でデータを取得する部分だけは JAX-RS の実装に任せて、ついでにその実装に依存した abstract なメソッドはそのまま動かして欲しい。

が、そんな実装は無かった。需要高いと思うんだけどな……

仕方ないので org.apache.cxf.common.util.CglibProxyHelper を Monkey Patch してみました。

↓のファイルを字面通りのパスに java ファイルとして配置して、クラスを上書きしてやるだけです。

```java
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.cxf.common.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

class CglibProxyHelper extends ProxyHelper {    
    @Override
    protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces, 
                                      final java.lang.reflect.InvocationHandler h) {
        
        Class<?> superClass = null;
        List<Class<?>> theInterfaces = new ArrayList<Class<?>>();
        
        for (Class<?> c : interfaces) {
            if (!c.isInterface()) {
                if (superClass != null) {
                    throw new IllegalArgumentException("Only a single superclass is supported");
                }
                superClass = c; 
            } else {
                theInterfaces.add(c);
            }
        }
        if (superClass != null) {
            Enhancer enhancer = new Enhancer();
            enhancer.setClassLoader(loader);
            enhancer.setSuperclass(superClass);
            enhancer.setInterfaces(theInterfaces.toArray(new Class[theInterfaces.size()]));
            enhancer.setCallback(new MethodInterceptor() {

                public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) 
                    throws Throwable {
                    return h.invoke(obj, method, args);
                }
                
            });
            return enhancer.create();
        } else {
            return super.getProxyInternal(loader, interfaces, h);
        }
    }
}
```

今のところうまく動いています。
添削希望っぽいのでやってみる #rstatsj

@uri さんのこれだけど

- [ホクソエムカラー](http://rpubs.com/uri-sy/hoxom_color)

添削希望??みたいなのでやってみます。

```r:添削前
screen.name <- html("https://twitter.com/teramonagi/lists/list/members") %>% 
  html_nodes(css = ".username") %>% 
  html_text() %>% 
  unique() %>% 
  grep(pattern = "^[[:punct:]][[:graph:]]", value = TRUE) %>% 
  substr(2, 100)
screen.name
```

```r:添削後
screen.name <- html("https://twitter.com/teramonagi/lists/list/members") %>% 
  html_nodes(xpath = '//*[@id="stream-items-id"]/li/div/div[2]/div/a/span[1]') %>% 
  html_text %>%
  substring(2)
screen.name
```

ちゃんとスクレイピングすれば変に `grep` とかやらないで済みます。

```r:添削前
for(i in 1:length(screen.name)){
  html(paste("https://twitter.com/", screen.name[i], sep = "")) %>% 
  html_nodes(css = ".ProfileAvatar-image") %>% 
  html_attr("src") %>% 
  download.file(destfile = paste("img_hxm/", screen.name[i], "_", basename(.), sep = ""), method = "curl")
}
# 親分へ。これをpfroeachでやるにはどうすればよいでしょうか... 
## 失敗例
# pforeach(i in 1:length(screen.name))({
#   html(paste("https://twitter.com/", screen.name[i], sep = "")) %>% 
#   html_nodes(css = ".ProfileAvatar-image") %>% 
#   html_attr("src") %>% 
#   download.file(destfile = paste("img_hxm/", basename(.), sep = ""), method = "curl")
# })
```

```r:添削後
npforeach(id = screen.name)({
  cat(id, "\n")
  url <- sprintf("https://twitter.com/%s", id)
  img_url <- html(url) %>% 
    html_nodes(css = ".ProfileAvatar-image") %>% 
    html_attr("src")
  destfile <- file.path("img_hxm", sprintf("%s_%s", id, basename(img_url)))
  img_url %>% download.file(destfile = destfile, mode="wb")
  invisible()
})
```

`pforeach`　では `in` でなく `=` を使います。
これぐらいだと並列処理するほうがコストがかかると思うので `npforeach` を使ってます。
好みの問題ですが、`paste` より `sprintf` を使ったほうがすっきりします。
どうしても `paste` を使いたい場合は `paste0` を使うのが便利かと。

```r:添削前
prof.file <- list.files(path = "img_hxm")
pal <- extract_colours(url_img = paste("img_hxm/", prof.file[15], sep = ""))
pal
```

```r:添削後
prof.file <- list.files("img_hxm", full.names = TRUE, pattern = sprintf("^%s", screen.name[15]))
pal <- extract_colours(url_img = prof.file)
pal
```

`list.files` には `full.names` という引数があります。
また、`screen.name` と `prof.file` の順番が必ずしも対応するわけではないため、`pattern` 引数で目的の ID から始まるファイルを指定してやります。

```r:添削前
data.frame(name = rep(screen.name[15], each = 5), value = rep(20, 5), pal) %>% 
ggplot(., aes(x ="", y = value, fill = pal)) + 
  geom_bar(stat = "identity") + coord_polar("y") +
  scale_fill_manual(values = pal) + 
  guides(fill = FALSE)
```

```r:添削後
data <- data.frame(name = screen.name[15], value = 100/length(pal), pal)

ggplot(data, aes(x ="", y = value, fill = pal)) + 
  geom_bar(stat = "identity") + coord_polar("y") +
  scale_fill_manual(values = pal) + 
  guides(fill = FALSE)
```

わざわざ `rep` とかしなくても長いほうに合わせてくれます。
好みの問題だけど、パイプと `ggplot` は分けたほうが良いのでは。

`rPlotter` 入れるの面倒くさそうだったので実行はしてません。

ところで `screen.name[15]` は dichika さんみたいだけど、`screen.name[14]` のまちがい？

Enjoy!
Angular2のドキュメントを読む

angular.ioのちゃんとした[ドキュメントの方](https://angular.io/docs/js/latest/)ではなく、[angular/angular](https://github.com/angular/angular)に入っている[dgeni](https://github.com/angular/dgeni)で生成される方のドキュメントの話です。
まだ、ちゃんとしたドキュメントの方ですら読みきっていないですが、[grunt-dgeni](https://github.com/k-kinzal/grunt-dgeni)とか作ってる身としては、こちらの方が気になります。

# プロジェクトを準備する

```sh
$ git clone https://github.com/angular/angular.git
$ cd angular
$ npm install
```

まずはクローンしてドキュメントを生成できる準備をします。

# ドキュメントを生成する

```sh
$ gulp docs
```

これで`dist/docs`以下にドキュメントが生成されました。

# ドキュメントサーバーを立てる

```sh
$ npm install -g koko
$ cd dist/docs
$ koko
```

ぱっと見ではドキュメントサーバーのタスクが見当たらなかったので、[koko](https://github.com/fnobi/koko)を使って簡易サーバーを立ち上げます。kokoを実行すると`[listen 55083]`というように立ち上げたポート番号が表示されますので、`http://localhost:55803`のように指定のポート番号をブラウザで開きます。

### 追記（2015/04/24）

コメントで頂きましたがドキュメントサーバーのタスクあります。

```
$ gulp docs/serve
```

# 読む

![image](https://qiita-image-store.s3.amazonaws.com/0/5522/33180f84-32b8-51f6-6288-61198c0949ce.png)

読めました！

中身としてはangular.ioのdocs+αという感じで読み応えがある部分はdocsと一緒ですね。（見つけきれてないだけで何か取り込むフローがあるのかもしれません）

# おわりに

全く関係ないですが、ドキュメントを読んでてShadowCssというクラスが凄い気になっています。Shadow DOMと同じようなノリでCSSも弄れるようになるのでしょうか。JS上で上手くCSSの管理できるなら楽しそうなのです。
Cでファイルの情報を取得して表示する

# ファイル情報？

いろいろありますが、今回は`man fstat`で取れる値を表示するまで。
とても短いのにprintfするまで(型合わせが)面倒だったので自分用メモ。

# 構造体

`fstat`を使うとこんな感じの値が取れるそうです。`$ man fstat` で見れます。

```cpp:
struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* protection */
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for filesystem I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};
```

みんな符号付きだったり符号なしだったりする整数なんですが、printfする際には型を合わせないと警告が出続けたり、あまり警告を無視すると痛い目見たりします。

# printfする

```cpp:
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>

int main(int argc, char** argv) {
  struct stat buf;
  int rebt = stat(argv[1], &buf);
  printf("st_dev: %lu\n"
         "st_ino: %ld\n"
         "st_mode: %u\n"
         "st_nlink: %lu\n"
         "st_uid: %u\n"
         "st_gid: %d\n"
         "st_rdev: %lu\n"
         "st_size: %ld\n"
         "st_blksize: %ld\n"
         "st_blocks: %ld\n"
         "st_atime: %ld\n"
         "st_mtime: %ld\n"
         "st_ctime: %ld\n",
         buf.st_dev,
         buf.st_ino,
         buf.st_mode,
         buf.st_nlink,
         buf.st_uid,
         buf.st_gid,
         buf.st_rdev,
         buf.st_size,
         buf.st_blksize,
         buf.st_blocks,
         buf.st_atime,
         buf.st_mtime,
         buf.st_ctime);
}
```

こんな感じで表示できます。

```
$ ./a.out hoge.cc
st_dev: 2049
st_ino: 17043777
st_mode: 33188
st_nlink: 1
st_uid: 1000
st_gid: 1000
st_rdev: 0
st_size: 802
st_blksize: 4096
st_blocks: 8
st_atime: 1429718442
st_mtime: 1429718439
st_ctime: 1429718439
```
Cocos2d-xで絵文字対応

## PR
https://github.com/cocos2d/cocos2d-x/pull/11172

## Issue
システムフォントラベルに特定の絵文字(🍣など)を使うと落ちてしまう。
原因は、JNIが対応していないフォーマットであるため。

## Action
JNIでStringを作らず、byte arrayで渡して、java内でString化するように改修。
GoでXMLに未定義な要素が含まれていたらUnmarshalをエラーにしたい

GoでWeb APIのXMLレスポンスのテストを書いているとき、「不要なXML要素が返却されていないか」というテスト項目が必要になりました。普通にGoのxml.Unmarshalを使っていると、構造体に未定義な要素は単に無視されてしまうので、工夫が必要です。

```go
	// 余計な要素(XXX)が無視されてしまう例
	type Person struct {
		Name   string
		Gender string
		Age    int
	}

	badxml := []byte(`
  <Person>
    <Name>John</Name>
    <Gender>Male</Gender>
    <Age>20</Age>
    <XXX>xxxxxxxxxxx</XXX>
  </Person>`)

	p := Person{}
	if err := xml.Unmarshal(badxml, &p); err != nil {
		log.Fatal(err)
	}
	fmt.Println(p.Age) // -> 20 
```

``encoding/xml`` パッケージで、`,any`というフラグが定義されています。

> \* If the XML element contains a sub-element that hasn't matched any
   of the above rules and the struct has a field with tag ",any",
   unmarshal maps the sub-element to that struct field.

XML要素の中で、他のルールに適合しないサブ要素があるとき、",any"タグのついた構造体フィールドにマッピングされるそうです。これで余分なXML要素名を得る事が出来ます。

せっかくなので、これを応用して「XMLデコード中に余計な要素が現れたらエラーを返す型」を作ってみました。

```go
type NoExtra struct {
        I noExtraInner `xml:",any"`
}

type noExtraInner struct{}

func (u *noExtraInner) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
        return xml.UnmarshalError(fmt.Sprint("detected an extra XML element. (", start.Name.Space, start.Name.Local, ")"))
}
```

このNoExtra型を下のように構造体フィールドに含めることで、Name,Age,Gender以外のXMLサブ要素が含まれている場合に``xml.Unmarshal``関数がエラーを返すことができます

Demo: http://play.golang.org/p/lJaBwq0Yry

```go
type Person struct {
	Name   string
	Gender string
	Age    int
	NoExtra
}
```

```go
	badxml := []byte(`
  <Person>
    <Name>John</Name>
    <Gender>Male</Gender>
    <Age>20</Age>
    <XXX>xxx</XXX>
  </Person>`)

	p := Person{}
	if err := xml.Unmarshal(badxml, &p); err != nil {
		log.Fatal(err) // -> detected an extra XML element. (XXX)
	}
```

こちらからは以上です。
JSPのコンパイルバージョンの設定方法

JSPのコンパイルバージョンを設定する方法を記述します。

# 背景
スクリプトレットでswitch文を使っているJSPにアクセスしたら、エラーが発生しました。

```jsp:test.jsp
<%
String name = request.getAttribute("name");
switch(name) {
case "A":
   //処理
default:
  //処理
}
%>
```

エラーメッセージ
```text
Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted
```

Sring型の値をswitch文で使うには、Java1.7以上でないといけないので、JSPのコンパイルバージョンを上げる必要があります。

### 環境
* Tomcat7
* Java7
　
# 設定方法
まずTomcat7の現在のJSPコンパイルバージョンを見てみましょう。
http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html#Configuration

>
* compilerSourceVM - What JDK version are the source files compatible with? (Default value: 1.6)
* compilerTargetVM - What JDK version are the generated files compatible with? (Default value: 1.6)

デフォルトは「1.6」と書かれています。
設定ファイルに`compilerSourceVM`と`compilerTargetVM`情報を追加する必要があります。

```xml:$TOMCAT_HOME/conf/web.xml
   <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <!-- ここから -->
        <init-param>
            <param-name>compilerSourceVM</param-name>
            <param-value>1.7</param-value>
        </init-param>
        <init-param>
            <param-name>compilerTargetVM</param-name>
            <param-value>1.7</param-value>
        </init-param>
        <!-- ここまでを追加 -->
        <load-on-startup>3</load-on-startup>
    </servlet>
```

以上です。

# 参考サイト
http://qiita.com/hibinohirokatsu/items/80563665baeae5ba01fe
http://docs.escenic.com/ece-tech-notes/5.7/jsp_servlet_configuration.html
http://stackoverflow.com/questions/17545720/unable-to-switch-on-string-type-in-jdk-7

# 疑問点
* compilerSourceVMとcompilerTargetVMの違い。コンパイル時か実行時かの違い?
PHP7調査(23)致命的エラーが例外としてキャッチできるようになった

（2015/07/02追記：PHP 7.0.0alpha2に合わせて修正しました）

PHPのエラーは、エラー文言を表示するだけの警告・注意と、その場で処理を終了してしまう致命的エラー（fatal error）の2種類に大別できます。

ところで、PHP5の致命的エラーには不便な点があります。それは、`set_error_handler()`やその他の方法でエラーハンドリングできず、必ず終了してしまう点です。これでは致命的エラーをユニットテストするのも不便ですし、ReactPHPのようにサーバ動作させるようなプログラムも安心して使えません。

PHP7では致命的エラーが例外として実現されるようになり、エラーハンドリングの自由度が格段に上がりました。この変更の概要を紹介します。

# 例外のクラス階層の変更

まず、PHP7で例外クラスの階層がどう変わるかを説明します。PHP5までの例外のクラス階層は次のようなものでした。

* Exception
  * ErrorException
  * その他SPL例外

一方、PHP7からは次のように`Throwable`インターフェースが実装され、`Exception`と`Error`が`Throwable`を実装する形になりました。また、`Error`の子供として `TypeError`, `ParseError`の2つが新設されています。

* Throwable
  * Error
     * TypeError
     * ParseError
     * AssertError（「[PHP7調査(25)assert関数が実用的になった](http://qiita.com/hnw/items/c996cecf98f0dba5f4fc)」参照）
  * Exception
     * ErrorException
     * その他SPL例外

# 致命的エラーが例外になる仕組み

PHP7では、致命的エラーの多くが`Error`をスローするように実装が変わりました。`Error`がトップレベルまで処理されなかった場合は、従来と同じ致命的エラーが表示されてPHPの処理が終了します。

この`Error`は`Exception`の子供ではないため、PHP5向けコードの`catch (Exception $e)`ではキャッチされません。つまり、過去のコードをPHP7で動かした場合はPHP5と同じ動作をするように設計されています。


```php
<?php
$foo = null;
try {
    $foo->bar(); // 例外スロー、次のキャッチブロックに入る
} catch (Error $e) {
    var_dump($e->getMessage());
}
echo "baz\n";
$foo->bar(); // 例外キャッチしていないため致命的エラーになる
```

```
$ php7 /tmp/foo.php
string(39) "Call to a member function bar() on null"
baz
PHP Fatal error:  Uncaught Error: Call to a member function bar() on null in /tmp/foo.php:9
```

# 文法エラーも例外になった

PHP5までは文法エラーもキャッチ不可能なエラーでしたが、PHP7では`ParseException`をスローするようになりました。これを利用して、PHP7からは`include()`や`eval()`で発生した文法エラーをキャッチできます。

```php
<?php
try {
    include("bar.php");
} catch (ParseError $e) {
    var_dump($e->getMessage());
}
echo "baz\n"; // 致命的エラーより後まで処理が進む
```

```
$ php7 /tmp/foo.php
string(36) "syntax error, unexpected end of file"
baz
```

ただし、トップレベルのスクリプト自身の文法エラーはキャッチできません。

# 注意点1

残念ながら、全ての致命的エラーが例外になったわけではありません。

* スタートアップ処理でのエラーやメモリ不足など、真の致命的エラー
* 本来なら例外にすべきなんだけど、実装上の都合で例外に再実装するのがつらくて残っている致命的エラー

上記のような2種類の致命的エラーがまだ残っている状況です。PHPらしいといえばらしい気がしますが、ちょっと悲しいですね。

# 注意点2

警告・注意レベルのエラーはPHP7でも変わっていません。あらゆるエラーを統一的に扱いたい場合は、`set_error_handler()`を使ってエラーハンドラで例外スローして、`catch (Throwable $e)`でキャッチしましょう。

# 参照

本件、興味がある人はRFCを読んだ方がいいと思います。

* [PHP RFC: Exceptions in the engine (for PHP 7)](https://wiki.php.net/rfc/engine_exceptions_for_php7)
* [PHP RFC: Throwable Interface](https://wiki.php.net/rfc/throwable-interface)
Ojbective-Cで絵文字を見た目通りにカウントする

## Repository
[NSString-ActualLength](https://github.com/matsuokah/NSString-ActualLength)
MIT LICENSE.

## Issue
[NSString length](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html#//apple_ref/occ/instp/NSString/length
)は絵文字を含むとカウントが予期せぬ値になる。

#### obj-c
```objc
NSLog(@"string: %@ length: %ld", str, [str length]);
```
#### output
```shell
xctest[-] string: 🔴🔴🔴🔴🔴 length: 10
xctest[-] string: 👦 length: 2
xctest[-] string: 👦👦🏿 length: 6
xctest[-] string: 👦🏼👦🏿 length: 8
xctest[-] string: 👨‍👩‍👧‍👦 length: 11
xctest[-] string: 👦He▶️♈️llo👦🏼🔴👦🏿🇨🇱🇨🇳🇨🇴🇩🇰🇫 length: 39
xctest[-] string: Hello World! length: 12
xctest[-] string: 🇦🇺🇦🇹🇧🇪🇧🇷🇨🇦🇨🇱🇨🇳🇨🇴🇩🇰🇫🇮 length: 40
xctest[-] string: 1⃣➡️▶️♈️🆗🆖🅰🆘✅㊗️ length: 19
```
## Action
- [x] Regional Character(0xdde6 - 0xddff)のスキップ
- [x] Skin tone modifier(0xdffb - 0xdfff)のスキップ
- [x] Variation selector(0xfe00 - 0xfe0f)のスキップ
- [x] Zero-width Joiner(0x200d)のスキップ
- [x] 上記のカウントに伴うsubstring

```objc
NSLog(@"string: %@ length: %ld", str, [str actualLength]);
```
```shell
xctest[] string: 🔴🔴🔴🔴🔴 length: 5
xctest[] string: 👦 length: 1
xctest[] string: 👦👦🏿 length: 2
xctest[] string: 👦🏼👦🏿 length: 2
xctest[] string: 👨‍👩‍👧‍👦 length: 4
xctest[] string: 👦He▶️♈️llo👦🏼🔴👦🏿🇨🇱🇨🇳🇨🇴🇩🇰🇫 length: 16
xctest[] string: Hello World! length: 12
xctest[] string: 🇦🇺🇦🇹🇧🇪🇧🇷🇨🇦🇨🇱🇨🇳🇨🇴🇩🇰🇫🇮 length: 10
xctest[] string: 1⃣➡️▶️♈️🆗🆖🅰🆘✅㊗️ length: 10
```

## UnitTest
https://github.com/matsuokah/NSString-ActualLength/tree/master/NSString%2BActualLengthTests
[追記] リネーム漏れがあり、actualLengthのテストが正常に行われていないのにもかかわらず全て成功するというバグがありました。
@miyakeryo@github さん、ご指摘ありがとうございました。(2015/04/29)

## Attention
ただしiOS8.3以降の仕様である[**Zero-width joinerで複数の絵文字をつなげた場合に１つの絵文字にまとめる**](http://emojipedia.org/family/)は1文字としてカウントせず、つなげられている絵文字の数だけカウントされる。
なぜなら、iOS8.2以前及びAndroidで複数の絵文字が展開されるため。

#### Hipchatのスクショ
![Pasted_Image_4_23_15__12_29_AM.png](https://qiita-image-store.s3.amazonaws.com/0/51409/628b58a4-df7e-795c-b38e-93838783dad5.png)
[Android][Java] Logging

# android.util.Log

```java:MainActivity.java
import android.util.Log;

final String TAG = this.getLocalClassName();
Log.v( TAG, "Verbose" );
Log.d( TAG, "Debug" );
Log.i( TAG, "Info" );
Log.w( TAG, "Warn" );
Log.e( TAG, "Error" );
System.out.println( "println" );
```

これで、

```text:logcat
04-22 23:22:02.364  17432-17432/com.example.fuzzball.testlog D/MainActivity﹕ Debug
04-22 23:22:02.364  17432-17432/com.example.fuzzball.testlog E/MainActivity﹕ Error
04-22 23:22:02.364  17432-17432/com.example.fuzzball.testlog I/MainActivity﹕ Info
04-22 23:22:02.364  17432-17432/com.example.fuzzball.testlog V/MainActivity﹕ Verbose
04-22 23:22:02.364  17432-17432/com.example.fuzzball.testlog W/MainActivity﹕ Warn
04-22 23:22:02.364  17432-17432/com.example.fuzzball.testlog I/System.out﹕ println
```

こうなる。

* 簡単に取得できるのはクラス名だけっぽい。
* ```System.out.println```はInfo扱い。

# log4j

TBC
現在のAppStoreのトップセールス1位を取得する one-liner



RSS ( https://rss.itunes.apple.com/jp/ ) のエントリの１番目をみるだけ。


#### コード


```
$ ruby -r rss -e "p RSS::Parser.parse('https://itunes.apple.com/jp/rss/topgrossingapplications/limit=10/xml').entries[0].title.content"
"モンスターストライク - mixi, Inc"
```

#### zsh の関数にしてみると

```zsh
function apps() {
  index=$[$1 - 1]
  echo "AppStore rank $1 位:"
  ruby -r rss -e "puts RSS::Parser.parse('https://itunes.apple.com/jp/rss/topgrossingapplications/limit=10/xml').entries[$index].title.content"
}
```

```
$ apps 1
AppStore rank 1 位:
モンスターストライク - mixi, Inc
```

こうなった :)
年齢を○代前半/後半に変更したい

以外となさそうだったので。

###前提
`User`という`model`にメソッドを追加したイメージ。
`User`は`age`ってカラムを持ってる。


###コード

```User.rb

  def round_to_generation
    "#{ age / 10 * 10 }代#{ age.round(-1) == age / 10 * 10 ? '前' : '後' }半"
  end

```

### 結果

```
# user.age = 24のとき
user.round_to_generation # => "20代前半"


# user.age = 37のとき
user.round_to_generation # => "30代後半"
```

ってなる。
CentOS6のパーティション容量をpartedで拡張する

CentOS/ec2/ebsな環境でディスクを拡張すると、パーティションが自動で拡張されないため、手動で拡張する必要があります。
fdiskだと以下のようなエラーが表示され、OSの再起動が必要そうだったので、partedで拡張してみました。

```
WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
```

※ルートパーティションに対しては試していないので、ルートパーティションの拡張には他に設定が必要かもしれません。


##現状のディスクの確認
```
df -h
--------
/dev/xvdl1             15G   12G  3.0G  80% /home
--------

lsblk
--------
NAME                     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
xvdl                     202:176  0    20G  0 disk
└─xvdl1                  202:177  0    15G  0 part
--------
```


##EBSの準備
１、既存のEBSをスナップショット作成
２、容量を増やして、リストア
３、パーティションをOSからアンマウント
３、既存ボリュームをデタッチ
４、新ボリュームec2へアタッチ



##partedのインストール
```
yum install parted
```

##partedでパーティションを拡張。
指定するのが、パーティション（/dev/xvdl1）でなく、デバイス（/dev/xvdl）を指定するのに注意！

```
parted /dev/xvdl
```

セクター単位で表示

```
(parted) unit s
```

現状の状態を表示

```
(parted) print
--------
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdl: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End        Size       Type     File system  Flags
 1      63s    31943039s  41942977s  primary  ext4
 
--------
```


Numberに表示されている数字を指定してパーティション情報を一旦削除
 
```
(parted) rm 1
```

TypeとStartを指定して、最大まで拡張してパーティション情報を再作成

```
(parted) mkpart primary 63s 100%
```


増えていることを確認

```
(parted) print
--------
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdl: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End        Size       Type     File system  Flags
 1      63s    41943039s  41942977s  primary  ext4
--------
```


partedの終了

```
(parted) quit
```

###fsckで整合性チェック
```
e2fsck -f /dev/xvdl1
```

##マウント
```
mount /dev/xvdl1 /home
```

##パーティションの拡張
```
resize2fs /dev/xvdl1
```

##パーティションサイズの確認
```
df -h
--------
/dev/xvdl1             20G   12G  7.0G  63% /home
--------

lsblk
--------
NAME                     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
xvdl                     202:176  0    20G  0 disk
└─xvdl1                  202:177  0    20G  0 part /home
--------
```


##参考
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/storage_expand_partition.html
[Ruby基礎学習] パターンの表示③

# はじめに
章末問題まできた。章末問題1つ目。


# 問題

```
以下を表示する。

########
 ######
  ####
   ##

```

# 解答
`#`が下に行くごとに2個ずつ減っていって、
逆に空白は2個ずつ増えている。

最初はとりあえず無理やり表示できるようにした。

```rb
hash_count = 8
space_count = 0
4.times do
   print " " * (space_count / 2)
   print "#" * hash_count
   print " " * (space_count / 2)
   puts ""
 
   hash_count -= 2
   space_count += 2
 end
```

ちょっとすっきりさせた。

```rb
sharp = 8
space = 0
4.times do |i|
	space_text = " " * (space / 2)
	puts space_text + ("#" * sharp) + space_text
	sharp -= 2
	space += 2
end
```

もっとシンプルにしたいなぁと考えてる時に、
今以下のように表示させようとしているけど、
右端に空白をひっつける必要はないのでは？と思った。

```
########
□######□
□□####□□
□□□##□□□
```

そうやって色々考えたらこうなった。
シンプルになったなぁ。

```rb
[*1..4].reverse.each.with_index{ |c, i| puts (" " * i) + ("#" * c * 2) }
```


# 問題の出典

* プログラマの考え方がおもしろいほど身につく本　問題解決能力を鍛えよう！
「No 'Access-Control-Allow-Origin' header is present on the requested resource. 」というエラーに遭遇しました

「[初めてのSpring Boot](http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AESpring-Boot%E2%80%95%E3%80%8CSpring-Framework%E3%80%8D%E3%81%A7%E7%B0%A1%E5%8D%98Java%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-I%E3%83%BBO-BOOKS/dp/4777518655)」でREST Webサービスを写経し、Dartでクライアントサイドを記述してみたのですが、お手本どおりのコードではDartEditorにて下記のエラーになりました。

```text:DartEditorで表示されたエラー
XMLHttpRequest cannot load http://localhost:8080/api/customers. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8081' is therefore not allowed access.
Exception: Uncaught Error: Instance of '_XMLHttpRequestProgressEvent'
```

##環境

- Windows 7 (64bit）
- DartEditor 1.9.3
- Spring Boot 1.1.11.RELEASE

##対策

「[JavaScript プログラミング講座](http://hakuhin.jp/js/resource_sharing.html)」によると、クロスオリジンリソースシェアリング（CORS）というHTML5世代の仕様らしく、任意の Web ページから、別のリソース格納場所にあるリソースを読み取りアクセスする事は、基本できないそうです。

ただこれを回避する方法はあって、サーバ側にてアクセスコントロール情報を付加したレスポンスを返せば良いんだそうです。

[Springのサイト](https://spring.io/guides/gs/rest-service-cors/)にちょうど？それに関する説明があって、レスポンス内にCORSを追加させる方法が載っていました。

正直本質的な意味は理解できていませんが、このサイトにある以下のコードを追加すれば問題は解決しました。

```java:CORSに対応させるコード
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

@Component
public class SimpleCORSFilter implements Filter {

	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletResponse response = (HttpServletResponse) res;
		response.setHeader("Access-Control-Allow-Origin", "*");
		response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
		response.setHeader("Access-Control-Max-Age", "3600");
		response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
		chain.doFilter(req, res);
	}

	public void init(FilterConfig filterConfig) {}

	public void destroy() {}

}
```

##参考

- [JavaScript プログラミング講座/クロスオリジンリソースシェアリングについて（CORS）](http://hakuhin.jp/js/resource_sharing.html)
- [Springのサイト/Enabling Cross Origin Requests for a RESTful Web Service](https://spring.io/guides/gs/rest-service-cors/)
ジョブ中に次のジョブが発生した場合に古いジョブを中断する

参考にさせていただきました。
http://developer.aiming-inc.com/study/techhills6-jenkins/

社内でJenkinsに自動ビルド環境を作り、svnの更新があれば都度ビルドするようにしていました。
こうするとなるはやで最新版が出来る良さはあるのですが、commit頻度が多いため最新版がなかなか出来上がらないという不満が周囲から出てきました。

途中経過へのこだわりはあまりなかったので、それであればそういう状況になったら古い方を止めればいいじゃない。ということで以下の設定をしてみました。

1. 1プロジェクト1ノードに固定する。
2. ノードで並列ジョブ数を2にする。(元々Unityなので1ノード2ジョブ処理は無理なので他プロジェクトは入れられない)
3. 以下の設定を追加する。

```lang:シェルの実行設定内先頭に追加
bnum_past=`expr $BUILD_NUMBER - 1`
curl http://jenkins_addr/job/${JOB_NAME}/${bnum_past}/stop -X POST 
```

要は1つ前のジョブを止めちまえ、ということですね。

しかしこれをやると、commit頻度が密すぎるとなかなかビルドが出来上がらないという不安が…とりあえず暫く様子を見てみます。
flex-toolbarの自分設定

#自分用の設定
```json:toolbar.json
[{
  "type": "url",
  "icon": "mark-github",
  "url": "http://github.com",
  "tooltip": "Github Page",
  "iconset": ""
}, {
  "type": "spacer"
}, {
  "type": "button",
  "icon": "document",
  "callback": "application:new-file",
  "tooltip": "New File",
  "iconset": "ion"
}, {
  "type": "button",
  "icon": "file",
  "callback": "application:open",
  "tooltip": "Open File",
  "iconset": "fa"
}, {
  "type": "button",
  "icon": "floppy-o",
  "callback": "core:save",
  "tooltip": "Save File",
  "iconset": "fa"
}, {
  "type": "spacer"
}, {
  "type": "button",
  "icon": "markdown",
  "callback": "markdown-preview:toggle",
  "tooltip": "markdown-preview",
  "iconset": ""
} ,{
  "type": "button",
  "icon": "html5",
  "callback": "atom-html-preview:toggle",
  "tooltip": "html-preview",
  "iconset": "fa"
} ,{
  "type": "spacer"
}, {
  "type": "button",
  "icon": "settings",
  "callback": "application:show-settings",
  "tooltip": "Setting",
  "iconset": ""
}]
```
とりあえず、普通のtoolbar程度には欲しいかなと。
で、markdownとかのプレビューボタンも欲しいなって。
後は設定周りにも簡単に行きたいなって。
Qiitaニュースの投稿ベスト20って読みにくいよね?

Qiitaニュースの投稿ベスト20が読みにくいのって俺だけ? :sweat_smile: 

記事タイトルの先頭が**[NEW]**の影響で揃ってないし、ランキング途中で宣伝入ってるし。
![qiita_news_before.png](https://qiita-image-store.s3.amazonaws.com/0/61700/9b39ce98-8582-f25e-cd1b-c9bd07e973fc.png)

宣伝はベスト20の前にでっかく打てばいいと思うし、tableがベストではないかもしれないけれど、とにかく読みやすくして欲しいなぁと。
![qiita_news_after.png](https://qiita-image-store.s3.amazonaws.com/0/61700/297c0cbe-f9a6-9a29-e6af-1934a9e0f684.png)

運営さん、お願いします。 :laughing: