OmniAICreator/Qiita-1.07M huggingface dataset:
uGUIのText

#概要
Unityのバージョンは5.2.3f1

uGUIのTextについてのメモです。一通りの機能についての解説します。
Textを追加すると画面上にCanvasの子にTextが追加されます。
Textのコンポーネントの内容は以下の通りです。

- Text
- Font
- Font Style
- Font Size
- Line Spacing
- Rich Text
- Alignment
- Horizontal Overflow
- Vertical Overflow
- Best Fit
- Color
- Material
- Raycast Target　*マニュアルに書いてないみたいだが、チェックを外すとタッチ判定が消えるらしい。

内容はマニュアルを見ると詳しく載っています。
http://docs.unity3d.com/ja/current/Manual/script-Text.html

#Textに関してのちょっとしたノウハウ
マニュアルを見ればTextのできることはほぼ載っているので、
少し凝った表現や文字表示のノウハウについて解説します。（少し参考になるかもといった程度の情報です）

##1.文字に影を追加する
Add ComponentでUI>Effects>Shadowを選択すると、テキストに影が表示される。
原理は同じ文字をずらして表示しているだけ。
色と位置を調整できる。
http://docs.unity3d.com/ja/current/Manual/script-Shadow.html

注）
同じ文字をずらしているだけなので、ずらしすぎると影に見えなくなる。
半透明にすると影っぽくなる。
水面に写っているような文字はShadowではできないので、Textを２つ作って片方を子オブジェウトに追加して、スケールで縮めてRotationで反転させると表現できる。

##2.文字にアウトラインを追加する
Add ComponentでUI>Effects>Outlineを選択すると、テキストにアウトラインが表示される。
原理は同じ文字を４つ表示して上下左右にずらして表示しているだけ。
色と位置を調整できる。
http://docs.unity3d.com/ja/current/Manual/script-Outline.html
2つアウトラインを追加するとさらに文字が強調できる。（これに影を追加するとさらに良くなる）

注）
同じ文字をずらしているだけなので、ずらしすぎるとおかしくなる。
文字に対して４つ重ねてるので、たくさん使うと結構負荷がかかる。

##3.文字のサイズと行間
スマホでの文字サイズは最小で14~16pxくらいにする。
文字の行間は1.2~1.6くらいにする。
上下左右に余白を20~30pxくらいとる。
読みやすいフォントを選ぶ。
以上のことに注意してTextを使うと文字が読みやすくなる。
（主にWebサイトや資料作成のノウハウが参考になる）
http://tsutawarudesign.web.fc2.com/index.html
文字サイズは小さすぎるとぼやけてしまうが、文字サイズを大きくしてスケールで縮小すると綺麗に表示される。（アウトラインを使う時は特に有効）

##4.文字のサイズに黄金比、白銀比を利用する
基準の文字サイズを決めて、そのサイズから黄金比などの比率を使ってサイズパターンを決める。
http://www.modularscale.com

#TextのSprict制御
```lang:TextTest
  using UnityEngine.UI;

  Text text1;
  text1 = GetComponent<Text>();  // コンポーネントを取得
  text1.text = "文字を代入";
  text1.enabled = false;         // 文字を非表示
```

#その他のメモ
ノベルゲームのノウハウが参考になる。（他のゲームにも役立つかも）
- 文字を１文字づつ表示
- クリックすると全て表示
- さらにクリックすると次の文章を表示
- 一定時間経つと次の文章を表示するオート機能
- 行頭禁則の処理

ゲーム終了時のエンドロールの表現が参考になる
- 文字の移動と回転
- フェードイン、フェードアウトの表現
- 鏡文字

ゲーム中の文字表現
- スコアを徐々にカウントアップ
- 効果音と同じ文字を表示する演出
- 3D空間上に表示されているキャラクタに追従する文字（ユーザー名の表示など）

CMの企業タイトルロゴの演出（表現としては参考になるかも）

#参考になりそうなサイトやAsset
- 宴（ノベルゲーム作成アセット）
http://madnesslabo.net/utage/
- 禁則処理の参考サイト
http://tsubakit1.hateblo.jp/entry/2014/12/28/135446
- ノベルゲームのメッセージ処理参考サイト
http://tsubakit1.hateblo.jp/entry/2014/12/06/233000
- ダイナミックフォントとビットマップフォントの違い参考サイト
http://www.metalbrage.com/UnityTutorials/uGUI/TextElement.html
- FF風のダメージテキストアニメーション
http://kikikiroku.session.jp/ff4-ff5-damage-animetion-on-unity/

#今後の課題
Materialを使った表現が上手くいかない。（参考になりそうなサイトもなさそう）
ShadowとOutlineのUse Graphic Alphaは、使いどころがいまいちわからない。
Position as UV1の使い方がいまいちわからない。
Textを光らせたり、テクスチャをあてた文字にしたり、凹凸がある文字にしたり、グラデーションをかけた文字にしたり、などの方法がわからない。（Scriptもしくはシェーダを書くとできそう？）
カスタムフォントは時間かかりそうなので気が向いたら試す。
Textを使ったアニメーションについてはanimatorの記事で書く予定。
文字サイズに合わせてサイズの修正やTextを自動で並べる方法などはLayoutの記事で書く予定。
Row size too large (> 8126). が出たので、解決がてら周辺知識をまとめてみた

## 環境
mysql 5.6

## 現象
大量のTEXT型のカラムに対してデータをいれる際に下記のエラーがMysqlによって吐かれた。

```lang:mysql
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help
```

## 解決方法
エラー文にかかれているように
`ROW_FORMAT=DYNAMIC`か `ROW_FORMAT=COMPRESSED`をテーブルに設定してあげればOK!

```
CREATE TABLE `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `hoge1` TEXT NOT NULL AUTO_INCREMENT,
  `hoge2` TEXT NOT NULL AUTO_INCREMENT,
   :
   :
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
```

### 注意点
上記だけだと正しく反映されない場合がある。
それは`SHOW TABLE STATUS LIKE [対象テーブル名]\G`で確認できる。
ROW_FORMATが指定したものになっていれば良いが出来ていない場合がある。
その際は下記の設定をmy.cnfにする必要がある。
my.cnfがどこ？という場合は右記で確認 `mysql --help | grep my.cnf`

```lang:my.cnf
[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
```

再起動後に先ほどのcreate文を流せば反映されるはず。

## そもそもの話

### my.cnfに指定したBarracudaとは？
innodbにはAntelopeとBarracudaとあり、Barracudaのほうが新しいフォーマット
違いとしては
**Antelope**
可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)の先頭768バイトを B-tree ノードのインデックスレコードに格納し、残りをオーバーフローページに格納する。

**Barracuda**
可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)の全てを外部のオーバーフローページに格納し、クラスタインデックスレコードにそのページへのポインタ(20B)のみを格納する。

つまりBarracudaはポインタのみを格納するためより多くの文字列を格納できる！

### ROW_FORMATにDynamicとかCompressedって何？
ROW_FORMATの種類は現状4種類!

| ROW_FOMATの種類 | 何者？ | 対応innodb_file_format |
|-----------------|----------------------------------------------------------------------------|------------------------|
| Redundant | かつて使われていたもの | Antelope |
| Compact | myql5.0から追加されUTF8の最適化やRedundantよりもデータサイズが小さくなる。 | Antelope |
| Dynamic | データの圧縮を行わない | Barracuda |
| Compressed | データを圧縮しデータサイズを縮小してI/O現象の効果 | Barracuda |

何も指定しないとCompactになります。
さきほどの注意事項でBarracudaを設定しないとDynamicとCompressedを設定できなかったのも
この対応表を見ればすっきり！

### DynamicとCompressedどっちを選択？
Dynamicはデータをgzipで圧縮するようで、その分スループットが落ちるそうなので、
パフォーマンスを気にしないならCompressedかな？

## おまけ
### RailsのMigrationでROW_FORMATを指定
```
create_table :table_name, options: 'ROW_FORMAT=DYNAMIC' do |t|
## カラム
end
```
dismissViewControllerAnimatedで画面が真っ暗になる問題

modalPresentationStyleを.OverCurrentContextにしてモーダルを表示して消す際にcompleteTransitionを呼ぶと何故か呼び出し元のビューコントローラのビューが吹き飛ぶ

```swift
                    fromViewController?.view.removeFromSuperview()
                    if let toView = toViewController?.view {
                        self.transitionContext!.completeTransition(true)
                        UIApplication.sharedApplication().keyWindow?.addSubview(toView)
                    }
                    self.transitionContext = nil
```


こうやってもう一回付けてあげればおｋ
key windowが動的に生成されてたりするとぶっ壊れる気がする。

[ios - "From View Controller" disappears using UIViewControllerContextTransitioning - Stack Overflow](https://stackoverflow.com/questions/24338700/from-view-controller-disappears-using-uiviewcontrollercontexttransitioning)

iOS8からのバグっぽい
[Unity] Google Cardboard SDK でオブジェクトが注視されたイベントを受け取って関数を実行する

## 成果物
宙に浮いてるCubeを注視すると、Cubeが上昇する。
Cubeは注視されたというイベントを受け取って、スクリプトで自分自身を上昇させている。

[動画](https://youtu.be/-K4IXAQGO08)


<iframe width="420" height="315" src="https://www.youtube.com/embed/-K4IXAQGO08" frameborder="0" allowfullscreen></iframe>

本記事はGoogle Cardboard SDKのデモサンプルを大いに参考にしています。



<iframe width="420" height="315" src="https://www.youtube.com/embed/-K4IXAQGO08" frameborder="0"></iframe>



## EventManagerの作成
2016/11/24追記：超重要な手順が抜けてました。すみません・・・
空のオブジェクトを作成。名前をEventManagerに変更（例。名前はなんでもいい）

EventManagerオブジェクトに
- Event コンポーネントをアタッチする
- GazeInputModuleコンポーネントをアタッチする


## VRカメラの設定を確認

CardboardMain->MainCameraをインスペクタに表示。
Physics Raycasterがコンポーネントに追加されていることを確認する

![スクリーンショット 2015-11-28 17.58.42.png](https://qiita-image-store.s3.amazonaws.com/0/58251/eb455188-aa92-2ad5-27f6-12a2ddc45583.png "スクリーンショット 2015-11-28 17.58.42.png")

![スクリーンショット 2015-11-28 17.59.00.png](https://qiita-image-store.s3.amazonaws.com/0/58251/bae5b672-9a75-ba88-f895-1e15d2c72157.png "スクリーンショット 2015-11-28 17.59.00.png")





## オブジェクトと関数の準備

注視されたときに何かさせたいオブジェクトを新規作成。（Cubeとか）

コンポーネントにスクリプトを新規作成＆追加。
注視されたときに実行したい関数を作る。 **これはpublicにすること。**
（例：SetGazedAt() 名前はもうなんでもいい。この例では実行されるとオブジェクトが上昇する）


```
using UnityEngine;
using System.Collections;

public class CubicResonator : MonoBehaviour {

	public void SetGazedAt () {	
		transform.position += Vector3.up;
	}

}

```

## イベントを受け取る設定

コンポーネントにColliderを追加する。（本稿の例では、BoxColliderを追加）

コンポーネントにEventTriggerを追加する。

![スクリーンショット 2015-11-28 18.19.36.png](https://qiita-image-store.s3.amazonaws.com/0/58251/7673b4b5-f247-2be8-7f8d-0c5412736a6d.png "スクリーンショット 2015-11-28 18.19.36.png")


PointerEnterイベントを追加する

![スクリーンショット 2015-11-28 18.19.59.png](https://qiita-image-store.s3.amazonaws.com/0/58251/f582a1ca-6f47-4567-656b-e88056fc5cb5.png "スクリーンショット 2015-11-28 18.19.59.png")



ここで、対象のオブジェクトに自分自身を設定。また、Functionにさきほど作成した関数を設定する。

![スクリーンショット 2015-11-28 18.21.19.png](https://qiita-image-store.s3.amazonaws.com/0/58251/0c201771-fbf8-c975-1129-e32c37b2354a.png "スクリーンショット 2015-11-28 18.21.19.png")


これでおわりです!!


## 補足
この手法は別にGoogle Cardboard SDKに限ったものではないと思います。（確認はしてませんが）
ハコスコのVRアプリは小作品的なものが多いので、こういうインタラクションを使って面白いアプリができたらいいですね。
ITエンジニアは考古学者になってはいけない

推測はいいことだけれども。 

#<i class="fa fa-pencil" style="font-size:1em;"></i> 追記
放置していたこの記事が、**なぜか**数人の方にストックしていただいているので(指が滑っただけかもしれませんが)、続きを書きたいと思いました。放置してごめんなさい。

#<i class="fa fa-meh-o" style="font-size:1em;"></i> 一体何が言いたいのかというと
つまるところは、冒頭の一文。ITエンジニアは考古学者のように手探りで未知のものを発掘する以外に術がないわけではなく、少なからずともドキュメント(文献)があるはずなので、ソースコードから**意味を発掘**する必要はなく、まずは**文献を読みましょう**ということ。

たとえば他人から受け取ったコードをむやみやたらといじって、値を変更して、テストして、やっとこさ意味を把握するのではなく、きちんと前任者のコメントやらドキュメントやら、もしくは本人に確認してみた方がとても良いのであるということ。その方が精神的にもずっと健康でいられるのです。

#<i class="fa fa-thumbs-o-up" style="font-size:1em;"></i> これだけ
ほんと、これだけです。タイトルの割りにしょうもないことですね。チラシの裏でした！
Xcode旧バージョンダウンロード

<h1><font color="#0000FF">Xcode旧バージョンダウンロード</font></h1>

<font color="#FF8C00">↓↓Downloads for Apple Developers</font>
https://developer.apple.com/downloads/

![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/5d091613-b033-f5ce-fefe-edc4c8bc1be0.png)
El Capitanでソースをコンパイルしたときにopensslのエラーが出た場合の対処方法

# 遭遇した事象
[libimobiledevice](http://www.libimobiledevice.org)をソースからコンパイルしようとしたところ、以下のエラーが出て失敗しました。

```bash:コマンド
$ ./configure
# 省略
Configuration for libimobiledevice 1.2.0:
-------------------------------------------

  Install prefix: .........: /usr/local
  Debug code ..............: no
  Python bindings .........: no
  SSL support backend .....: OpenSSL

  Now type 'make' to build libimobiledevice 1.2.0,
  and then 'make install' for installation.

$ make
/Applications/Xcode.app/Contents/Developer/usr/bin/make  all-recursive
Making all in common
  CC       socket.lo
  CC       thread.lo
  CC       debug.lo
In file included from debug.c:36:
../src/idevice.h:30:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make[2]: *** [debug.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
```

ssl.hを見つけられていないようです。
ネットを調べて回ったところ、以下の情報が見つかりました。

- El CapitanではOpenSSLヘッダが提供されなくなっている
- Homebrewでopensslをインストールし、`brew link openssl --force`のコマンドを実行すると良い

opensslはHomebrewで最新のものをインストール済みの環境でした。
brew link 〜のコマンドを実行しても、残念ながらエラーは変わりません。

# 解決策
.bash_profile に以下のパスを追加したところ、コンパイルが通るようになりました。

```bash:.bash_profile
export PATH=/usr/local/opt/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$LD_LIBRARY_PATH
export CPATH=/usr/local/opt/openssl/include:$CPATH
export LDFLAGS=-L/usr/local/opt/openssl/lib
export CPPFLAGS=-I/usr/local/opt/openssl/include
export PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH
```

~~なお、パスを追加していても、`brew link openssl --force`を実行していない環境では、以下のエラーが発生してコンパイルに失敗しました。~~

```bash:コマンド
$ make
# 省略
Undefined symbols for architecture x86_64:
  "_ERR_remove_thread_state", referenced from:
      _internal_idevice_deinit in idevice.o
      _idevice_connection_enable_ssl in idevice.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libimobiledevice.la] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
```

~~brew link 〜の実行とパスの追加の両方が必要だったようです。~~

`brew link openssl --force`は、現在は使えなくなっています。

```bash:コマンド
$ brew link openssl --force
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
  -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
```

# 環境

- Mac OS X 10.11.6 El Capitan
- MacBook Pro (Retina, 13-inch, Late 2013)
- Xcode 8.2.1
- Homebrew 1.2.0 (git revision 922c8; last commit 2017-05-02)
- OpenSSL 1.0.2k  26 Jan 2017
- libimobiledevice-1.2.0
ScrollViewerのイベントを下層のコントロールへ透過させる方法

##概要
このTipsは、WPFの通常の使い方からは逸脱しているので、参考になるかは微妙です。
ただ、私と同じ状況に陥って悩んでいる方も居るかもしれないので、備忘録を兼ねて残します。
ScrollViewerは、ListViewのような（仮想的に）大きな子要素を表示するためのコントロールで、画面内に収まりきらない大きな領域をスクロールバーを使って、表示するUIを実現します。
スクロールしなければユーザーの目に入らないため一部の人からは、一覧性を損なう存在として嫌われていますが、とても便利なUIであることは間違いありません。
しかしながらWPFのScrollViewerは、汎用的に利用するには少々厄介な実装になっています。
[Stack Overflow](http://stackoverflow.com/)に何件か投稿されてる所をみると罠に嵌まる人も（私も含めて）居るようです。

##問題点
画面いっぱいに、ScrollViewerを置き、その下へボタンを置いてください。
マウスイベントは、ScrollViewerに拾われボタンは反応しません。
WPFに慣れた技術者なら背景色を{x:Null}にすれば、イベントが透過する筈だと思うでしょう。
しかしながら努力は徒労に終わります。
筆者は、Templateまで潜って、どのコンポーネントがイベントをブロックしているのか調べましたが、こちらも上手く行きませんでした。
ちなみに、ScrollViewerのIsHitTestVisibleをfalseへ設定するとイベントは透過し下層のボタンは操作できます。
しかし、IsHitTestVisibleを設定してしまうとScrollViewer配下のコンテンツに含まれるコントロールも操作不能になってしまうという問題が残ります。

##ScrollViewerは、カスタムヒットテストを持っている
[Stack Overflow](http://stackoverflow.com/)にヒットする質問と回答を丹念に調べていくとScrollViewerは、カスタムヒットテストを持っているので、オーバーライドすれば良いという回答を見つけることができました。
ScrollViewerを基底クラスにして派生クラスを作成して、下記のように、HitTestCoreメソッドをオーバーライドします。

```
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    return null;
}
```
完全に殺してしまって副作用がないのか心配ですが、今のところ問題は無いようです。
Karabinerを使い選択テキストをショートカットキーでWeb検索

WindowsのAutohotkeyでやっていることをMacでもやりたいなと思い。
以下の例だと"英数"+"T"で選択テキストをWeblio辞書で検索しています。
Googleで検索する場合は、5行目を``open "https://www.google.com/search?hl=ja&q=`pbpaste`"``にします。

**private.xml**

```xml
<vkopenurldef>
  <name>KeyCode::VK_OPEN_URL_WEBLIO_WITH_CLIPBOARD</name>
  <url type="shell"><![CDATA[
    sleep 0.2;
    open "http://ejje.weblio.jp/content/`pbpaste`"
  ]]></url>
</vkopenurldef>
<item>
  <name>英数 + T -> Weblioで選択テキストを検索 </name>
  <identifier>private.eisuu_t.weblio</identifier>
  <autogen>
    __KeyOverlaidModifier__
    KeyCode::JIS_EISUU,
    KeyCode::VK_MODIFIER_EXTRA1,
    KeyCode::JIS_EISUU
  </autogen>
  <autogen>
    __KeyToKey__
    KeyCode::T, ModifierFlag::EXTRA1,
    KeyCode::C, ModifierFlag::COMMAND_L,
    KeyCode::VK_OPEN_URL_WEBLIO_WITH_CLIPBOARD
  </autogen>
</item>
```

Karabinerの中でクリップボード変数とかないかなとか探しましたがなさそうでしたのでshellで...
というかshellが呼べるとなんでもできますね。
`sleep 0.2;`は、`Cmd+C`のコピーが終了するのを待っています。
Qiitaに仕込んだGoogleAnalyticsを少し見やすくする工夫

自分のQiitaのページがどれだけ見られているのか、ちょっと気になったりすると思います。
そこで、ちょっとだけQiitaに仕込んだGoogleAnalyticsのデータを見やすくする工夫を紹介します。

# QiitaへのGoogleAnalyticsの仕込み方
[QiitaでGoogleアナリティクスを利用する手順](http://qiita.com/Qiita/items/c7f704e3786df3aa7a11)に詳しく書かれているため、ここでは割愛します。
この記事のコメントに書かれている通り、「リアルタイム」にデータが反映されていませんが、後日見てみるとデータの集計はできているので設定はちゃんとできている様子。

# 今回の改善ポイント
どのページがどれだけ見られたのかを知るためには以下の箇所を見ると思います。
行動 -> サイトコンテンツ -> すべてのページ
![スクリーンショット 2015-11-29 10.47.41.png](https://qiita-image-store.s3.amazonaws.com/0/100736/28723c74-9c32-cc39-c3a3-4d3869893cbe.png)
しかし表の「ページ」のところを見てもこれではどれが何のページなのか全然わかりませんね。

# 改善方法
そこで「ページタイトル」をクリックします。
![スクリーンショット 2015-11-29 10.47.41.png](https://qiita-image-store.s3.amazonaws.com/0/100736/7017a850-73c2-446e-1ffd-c60575a10bd1.png)
すると以下のようにページタイトルで表示されるのでどのページのことなのかが一目でわかるようになります。
![スクリーンショット 2015-11-29 10.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/100736/e9de9b20-82e8-48ff-3cef-a8e77d2db303.png)
[tmux] ペイン移動,削除の際にウィンドウ名をリネームする

やりたいこと
============

tmuxでウィンドウ名を自分で決めている人(目的別,サーバー別などで分けている人)でなければ,
現在実行しているコマンドや,ディレクトリ名がウィンドウ名になっていて欲しいと思うと思います。

tmuxの便利なオプションに`automatic-rename`というのがあって,コマンド実行時に自動でウィンドウ名をリネームしてくれます。

ただし,使っていて不便に感じたのは二つ以上ペインを作ると,最後に実行したコマンドがウィンドウ名となって,いまフォーカスしているペインの名前がウィンドウ名とはならないことです。

そこで,ペイン間の移動や,ペインの削除,スワップなどを行った際に,そのウィンドウ名を自動でリネームするようにすると便利ですね。

どうするか
==========

具体的には`tmux.conf`に以下のように書き,キーバインドの設定として既存の動作をした後にリネームを行うようにします。(各々自分のキーバインドに読み替えてください)

```
# if session has > 1 windows in current, kill-pane without confirmation.
# But confirm before killing pane when it is the last pane in the window.
bind-key -n M-c if "tmux display -p \"#{window_panes}\" | grep ^1\$" \
    "confirm-before -p \"Kill the only pane in the window? It will kill this window too. (y/n)\" kill-pane" \
    "kill-pane \; run 'tmux rename-window \"#{pane_current_command}\"'"

# move between panes with Alt+j/k
bind-key -n M-j select-pane -t :.+ \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-k select-pane -t :.- \; run 'tmux rename-window "#{pane_current_command}"'

# join pane with Alt+H/L
bind-key -n M-L join-pane -t :+ \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-H join-pane -t :- \; run 'tmux rename-window "#{pane_current_command}"'

# swap pane to Alt+shift+number
bind-key -n M-! join-pane -t :1 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-'"' join-pane -t :2 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-'#' join-pane -t :3 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-'$' join-pane -t :4 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-% join-pane -t :5 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-& join-pane -t :6 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-"'" join-pane -t :7 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-( join-pane -t :8 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-) join-pane -t :9 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-( join-pane -t :8 \; run 'tmux rename-window "#{pane_current_command}"'
bind-key -n M-) join-pane -t :9 \; run 'tmux rename-window "#{pane_current_command}"'
```

やっていることは,既存の操作に加えて`\;`でコマンドをつなげ,フォーカスの移った先で

```
run 'tmux rename-window "#{pane_current_command}"'
```

を実行しています。単に

```
rename-window "#{pane_current_command}"
```

とするだけでは`#{pane_current_command}`が文字列として表示されてしまったので,`run-shell`を使っています。

簡単にできる設定で効果は抜群なので,試してみてください。

僕の`tmux.conf`です↓

* [dotfiles/tmux.conf at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/rcfiles/tmux.conf)


問題点
======

1. `swap-pane`したときに,元ウィンドウもリネーム
2. `automatic-rename`のフォーマットに合わせたい

もし分かる方いらしたら教えていただきたいです。
いわゆる植樹について

こんばんわ。このアドベントカレンダーの管理人をやっているu_kubota と言います。
自己紹介を記事にする余地もありましたが、今回はとりあえず植樹ネタで行きます。

##植樹って？
植樹とは、OSMでやる緑化活動みたいなものです。
nyampire さんのこの記事が植樹について初めて触れておられます。
http://qiita.com/nyampire/items/3d8eb9c07ece58379484

2011年の上半期頃までは、日本全国には森林がありました。元データは国土数値情報でした。
が、ライセンスの切替時等の諸事情で、主に西日本の都道府県の森林が消えてなくなりました(´；ω；｀)
私の記憶する限りは、岡山県、香川県、徳島県、高知県、大分県、熊本県、宮崎県、鹿児島県のが消えました。
　※国土数値情報は都道府県単位でデータが作られてますので・・・。
現時点では、岡山県、徳島県（全域）と香川県、鹿児島県、熊本県（一部）が直っています。

## 植樹ってどうやるの？
前述のnyampireさんの記事のとおりで、Tasking Managerで対象エリアの定義とタスク分けをし、各タスクエリア内の森林を描いていきます。
ただそれだけです。
余裕のあるときは、該当エリア内の道路の修繕までやってます。道路が地図の基準なので、エラーや欠落を見つけると放っておけない・・・。
個人的にはそこまで綺麗に森林をトレースしているわけではありません。建物とか道路と違って、境界の線引が難しいためです。
あと、複雑なリレーションの定義と大きい森林の描画は極力避けています。
複雑な図形は初心者マッパーさんには扱いにくいためと、大きいと頂点数の上限に達しやすいリスクがあるためです。（そこまで気にする必要ないかもですが）

##植樹の進捗
私は今年の春から植樹に参加しました。鹿児島市のお手伝いが初だったと記憶してます。
それから岡山県、熊本県に着手して、たまに、森林リレーションの壊れたエリアもコツコツ描き直しました。
　※本当はリレーション直すほうが断然対応早いですが、自分が描いたほうが精度のいい森林が描けるって思ってますから。
ただ今熊本県やってますが、もう少し落ち着いたら高知県に手を付けたいです。

## 今後の植樹
来年までには終わらせたいです！！一人でもできなくはないですが、この楽しみを独り占めするのもなんなので、参加者募集します。
みどりに触れるのはいいことです。最高の癒やしですよ！
[Tips] UILabel, UITextField, UITextViewのちょっとした挙動の違い

UILabelとUITextFieldとUITextViewのtextプロパティの持ち方がそれぞれ想像していたものと違かったのでTipsとしてまとめます。

普段UILabelを使っているとtextプロパティはOptional型ですし、nilが入るものと当然のように思っていました。
しかしUITextFieldとUITextViewは若干挙動が異なっていたのでまとめます。

実行環境はXcode7.1.1のPlaygroundでやりました。

##UILabel
```Swift
let label = UILabel()
label.text
```

結果：nil

UILabelのtextプロパティはString?なのでnilが入ります。

##UITextField
```Swift
let textField = UITextField()
textField.text
```

結果：""

UITextFieldのtextプロパティもUILabel同様String?なのでnilが入るのかと思っていたら取得する際には内部的に勝手に空文字が入る仕様のようです。
念のためtextを表示する直前に`textField.text = nil`としても同じ結果でした。


##UITextView
```Swift
let textView = UITextView()
textView.text
```

結果：""

じゃあUITextViewはどうだろう？と見てみると、これのtextプロパティはString!でした。
そもそもnilが入らない挙動のようです。

#まとめ

UITextFieldのtextプロパティを取得するときには空文字が入るというところが今回のミソかと思います。
`if textField == nil {}`や`textField.isEmpty`などの条件を使うときに注意が必要かもしれません。:)
direnv note


# prepare

If you use zsh.

```bash:.zshrc
eval "$(direnv hook zsh)"
```

set `EDITOR` env_val

# python virtualenv
1. Use `layout python`
2. Use pre-installed virtualenvs

## layout python

```bash:.envrc
layout python <phtyon-path>

```
Create new virtualenv in &lt;projectdir&gt;/.direnv/...
 
## Activate pre-installed virtualenv
```bash:.envrc
# source <virtualenv-path>/activate e.g ↓	
source ~/.virtualenvs/aws/bin/activate

```
 
# Ruby bundler

## add_PATH & binstub

```bash:
bundle install --path vendor/bundle --binstubs=vendor/bundle/bin

```

```bash:.envrc
PATH_add vendor/bundler/bin
```

But `gem` command point global gem's path (not vendoer/bundler ...).
To show all installed gems, run `bundle exec gem list` .
Node version management

## tj/n

nodeのパッケージ管理をHomebrewで行っていたのですが、先日新たにパッケージを入れようとしましたところ、npmより

```
Error: Cannot find module 'asap'
```

と言われまして、どうすることも出来ずnode自体を再インストールすることになりました。

そんな経緯から、nodeのバージョン管理として、
https://github.com/tj/n
を使うことにしました。

### install

```
$ npm install -g n
```

（事前に、Homebrewでインストールし直していたのでnpm使えました。）


### Add Version

latest版（最新Ver）

```
$ n latest
```

Stable版（安定Ver）

```
$ n stable
```

Version指定

```
$ n <version>
```

### Switch Version

```
$ n                                                                                                                                          
  ο node/5.0.0
    node/5.1.0
```
nと叩くとリストが表示されて、カーソルなどでVersionを選択出来ます。決定はEnter

### Remove Version

```
$ n rm 0.12.7
```

or

```
$ n - 0.12.7
```

気軽に消せます

### More

https://github.com/tj/n
CoffeeScriptでクラス一つを"module.exports ="せずにexportする

ちょっとだけ面白い書き方ができることに気がついたので。

普通はこんな感じにすると思いますが、

```coffeescript
module.exports = class extends React.Component
  constructor: (props) -> super props
  ...
```

代入文を使わずにこんな感じに書いても良いようです。

```coffeescript
class module.exports extends React.Component
  constructor: (props) -> super props
  ...
```
一般Userにはactiveadminのdashboardにもアクセスさせたくない。

activeadmin利用時において、ユーザーと管理ユーザーをUser/AdminUserのような別モデルにせず、どちらも同じUserとして管理しているとします。

その時、管理者としてのroleをもたないユーザーにはactiveadminの管理者画面(dashboardなど)にアクセスすらさせたくない場合があります。
そんな時の設定方法をまとめました。


以下手順。

## 1. Userに権限を分けて与えるためのrole(役割)を付与する
roleを付与するmigrationファイル生成

```zsh
$ rails g migration AddRoleToUser role:integer
```

migrationファイルの中身を確認

```rb
# db/migrate/xxxxxxxxxxxxx_add_role_to_user.rb
class AddRoleToUser < ActiveRecord::Migration
  def change
    add_column :users, :role, :integer, default:0
  end
end
```

マイグレーション実行

```zsh
$ rake db:migrate # Userにroleが付与されたか rails c などで確認しておく
```

##2. ability.rbにてactiveadminの管理画面にアクセスできないように設定する

述語メソッドを利用可能にする

```rb
# models/user.rb
class User < ActiveRecord::Base
  enum role: %i(user admin) # roleはuserとadminの2つとしておく。もちろん3つ以上でもok
end
```

権限管理でactiveadminのページにはadminユーザー以外アクセス出来ないように変更

```rb
# models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    cannot :manage, :all

    user ||= User.new
    if user.admin?
      can :manage, :all
    else
      can :read, :all
      cannot :manage, ActiveAdmin::Page # roleがadmin以外であればactiveadminの各種ページにアクセス出来ないようにした
    end
  end
end
```

なお、このままの状態でactiveadminの画面にアクセスすると**「アクセス権限ない -> dashboardにリダイレクト -> アクセス権限ない -> リダイレクト ...」**とリダイレクトループに陥ってしまう。

そこでアクセス権限がない場合のactiveadminの挙動を変更する

3. アクセス権限がない場合の挙動を設定

```rb
ActiveAdmin.setup do |config|

  #(中略)
  
  # == User Authorization = 認可. どのリソースにアクセスできるのか
  
  #(中略)
  
  # You can specify a method to be called on unauthorized access.
  # This is necessary in order to prevent a redirect loop which happens
  # because, by default, user gets redirected to Dashboard. If user
  # doesn't have access to Dashboard, he'll end up in a redirect loop.
  # Method provided here should be defined in application_controller.rb.
  config.on_unauthorized_access = :access_denied # ここをコメントイン. 

  #(中略)

end

```

application_controller.rbでaccess_deniedを上書きする。
redirect先をアクセス可能なページに変更。(ここでは表のTOPページを指定している)

```rb
# controllers/application_controller.rb
class ApplicationController < ActionController::Base
  #(中略)

  # cancancanでaccess_deniedされた時の挙動を記述
  def access_denied(exception)
    redirect_to root_path, notice: "only users which have a admin role can access the page you've accessed."
  end

  #(中略)

end

```

## 終わりに

以上です。

誤りがあれば随時コメントいただけると幸いです!
技術英語 > But let's not get too close. > related with / associated with

@ Star Trek Voyager > ELOGIUM

宇宙空間で奇妙な現象に遭遇した状況の中、近づきたいChakotayだが

> But let's not get too close.

<hr>
関連して思い出したのは

今回はない。

<hr>

「関連して」に関連して気になったのは以下の違い

- related with
- associated with

http://medieigo.com/articles/-/1046.html

> 両者の違いは，be associated with は「2つの間に因果関係はないかもしれないが関連性はある」ことがイメージされるのに対し，be related to は「2つの間に因果関係がある」ことがイメージされる点です。
Laravel Homestead メモ



完全に自分用な作業メモ。


* ちゃんと知りたい人は、以下を見てやりましょう。
 * [Laravel Homestead 4.2.0 Laravel](http://readouble.com/laravel/4/2/0/ja/homestead.html)

## Add Vagrant Box

```
vagrant box add laravel/homestead
```

## Install Homestead


```
composer global require "laravel/homestead=~2.0"
```


## Set Path

```
~/.composer/vendor/bin
```


## Init


Create ~/.homestead/Homestead.yaml

```
homestead init
```

## Edit the homestead file

```
homestead edit
```


## Setup SSH key


Edit Homestead.yaml file.
Create SSH a key pair.


```
ssh-keygen -t rsa -C "you@homestead"
```


## Setup Shared Folder

Change folders property in Homestead.yaml


```yaml:Homestead.yaml
folders:
    - map: ~/Code
      to: /home/vagrant/Code
```

In this case,

* your PC dir: ~/Code
* homestead dir: /home/vagrant/Code


## Setup Nginx site

```yaml:Homestead.yaml
sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public
      hhvm: true
```


## boot vagrant


```
homestead up
```



```
homestead list
```


## Edit /etc/hosts

```text:/etc/hosts
192.168.10.10  homestead.app
```

## Access to the site


http://homestead.app


## connect by SSH 


```
homestead ssh
```


## connect to databases


* 127.0.0.1

* MySQL: port 33060 
* Postgres: port 54320

* user/password: homestead/secret



## Add sites

two methods

### method 1

* add a site to Homestead.yaml
* vagrant provision

### method 2

Use serve script.

First, connect to Homestead environment (by ssh).


```
serve domain.app /home/vagrant/Code/path/to/public/directory
```

## port forward

SSH: 2222 -> フォワード先22
HTTP: 8000 -> フォワード先80
MySQL: 33060 -> フォワード先3306
Postgres: 54320 -> フォワード先5432


## その他・公式ドキュメント

終わったらこことか参照

* [Laravelクイックスタート 4.2.0 Laravel](http://readouble.com/laravel/4/2/0/ja/quick.html)


## ref: 参考URL


[Laravel Homestead 4.2.0 Laravel](http://readouble.com/laravel/4/2/0/ja/homestead.html)
PHPのトレイトを使うならおさえておきたい５つのこと

PHP5.4から使えるようになったトレイト(trait)を使えば
単一継承だけでは限界のあったコードの再利用が可能になるのでとっても便利です。

**「php 多重継承」**こうググったあなたは是非traitの利用を検討してみましょう。

traitとはメソッドやプロパティーだけをクラスから切り出したもので
**クラスはtraitを装備することで「ふるまい」を増やすことが出来ます**。
##利用方法
下記はプロパティをJsonで欲しくなったので、クラスではなくトレイトとしてtoJsonメソッドを実装してみた例です。

```php
  trait Jsonable
  {
    public function toJson()
    {
      return json_encode($this->getAttributes());
    }
  }

  // 親クラス
  class Store
  {
    use Jsonable;

    protected $attributes;

    public function getAttributes()
    {
      return $this->attributes;
    }
  }

  // 子クラス
  class WebStore extends Store
  {
    protected $attributes = ['name' => ''];
  }

  // 子クラス
  class RealStore extends Store
  {
    protected $attributes = ['name' => '', 'address' => ''];
  }
```

Jsonableトレイトを親クラスでuseしていますが、子クラスでuseしたって構いません。
**Traitを利用すれば継承関係を汚すこと無く「ふるまい」を増やせるのです。**

##前提条件を定める
先程の例に出てきたJsonableトレイトですが、**StoreクラスにはgetAttributesメソッドがあるはず**と決めつけて書かれています。
もしgetAttributesメソッドが無かった場合は実行時にエラーになっちゃいますね。

下記のようにすればuseした段階でエラーとなってくれるので安心です。

```php
  trait Jsonable
  {
    abstract public function getAttributes(); // 僕を使うならgetAttributesメソッドを実装していること

    public function toJson()
    {
      return json_encode($this->getAttributes());
    }
  }
```

これによってトレイトを使うための前提条件を明確に出来るんです。
インターフェースみたいですな。

##基本的なアレコレ

- トレイトはいくつでもuseできるとか
- もしその中に同名メソッドを持つトレイトがいたらとか
- その場合の回避方法だとか
- トレイトが更に別のトレイトをuseできるとか

[PHPの公式マニュアル](http://php.net/manual/ja/language.oop5.traits.php)で丁寧に説明されているので一読しておくと良いでしょう。

##命名例
PHPとして命名規則はありません。どんな名前を付けても自由ですが**オススメはあります**。

オススメといっても僕がわかりやすい！と感じた２つの法則です。

- トレイトをuseすると「〜できる」ようになるので「able」使うと分かりやすい。
- 単純にTraitを付けちゃう。クラスとかと同じディレクトリに置く場合に区別しやすい。

| トレイト名 | トレイト名からイメージできる機能 |
|:-----------|:------------|
| Jsonable | JSON化出来る |
| JsonParserTrait | JSONを解析できる |
| Authenticatable | 認証出来る |
| Queueable | キューに突っ込めるようになる |

##ユニットテスト
トレイト単体ではインスタンス化する事が出来ません。
そうなると仮のクラスにuseさせてテストしなくてはいけません。激めんどいっすね。
でも**PHPUnitのgetMockForTraitメソッドを使えばスマートにテスト出来ます**。

*getMockForTraitメソッド便利*。
https://phpunit.de/manual/current/ja/test-doubles.html#test-doubles.mocking-traits-and-abstract-classes

##テクニックてきな
トレイトはインターフェースのような役割も果たすため、
instanceOfを使って処理を分岐するように、method_existsを使って分岐させてという感じで
フレームワークでしばしそういった処理を見ます。
C#時刻サンプル

```csharp
using System;
class date{
    public static void Main() {
        Console.WriteLine(DateTime.Now);
        // 2011/11/30 9:22:35
        Console.WriteLine(DateTime.Today);
        // 2011/11/30 0:00:00
        DateTime dt = DateTime.Now;
        Console.WriteLine(dt.Year   + "年"); // 2011年     Console.WriteLine(dt.Month  + "月"); // 11月
        Console.WriteLine(dt.Day    + "日"); // 30日
        Console.WriteLine(dt.Hour   + "時"); // 9時
        Console.WriteLine(dt.Minute + "分"); // 22分
        Console.WriteLine(dt.Second + "秒"); // 35秒
        Console.WriteLine(dt.ToString("F"));
        // 2011年11月30日 9:22:35
        Console.WriteLine(dt.ToString("yyyy年MM月dd日 HH時mm分ss秒"));
        2011年11月30日 09時22分35秒
    }
}
```
Dockerの公式MySQLコンテナに外部コンテナから接続できない

# 記事を書いた理由
 Dockerを利用してWordpressをインストールしようとしたらMySQLに接続できなかったので、その備忘録として

# 何が発生したか
 docker run --name wordpress --link some-mysql:mysql wordpressでwordpressのコンテナが起動してすぐ終了する。
 docker logs wordpressを見ると'root'@'172.17.0.3'での接続に失敗していた。

# 原因
 MySQLの公式コンテナはbind-addressをコメントアウトしており、localhost以外のアクセスを拒否している。
 https://github.com/docker-library/mysql/blob/7dea35524a41992ed669858e80c07c5d666d5426/5.7/Dockerfile#L36

# 対策
 せめてコンテナ間でのアクセスはできるようにmy.cnfを書き換え。(Dockerコンテナは172.17.0.0/16のネットワークに所属している)

``` :Dockerfile
FROM mysql:5.7
MAINTAINER XXX xxx@xxx.com

RUN sed -Ei 's/#bind-address*/bind-address = 172.17.0.0/16' /etc/mysql/my.cnf
```

あとは上記のDockerfileをビルドして起動させる。

```
docker build -t xxx/mysql:latest .
docker run --name mysql -d xxx/mysql
docker run --name wordpress --link mysql:mysql wordpress
```

# そもそもの勘違い
docker run --linkをしたときの挙動を勘違いしてた。
てっきりdocker run --linkを実行すると--linkしたコンテナ内の内容を自由に使えるものかと思っていた。
実際はlinkしたコンテナのネットワークの情報が環境変数に書き出されるだけなんですね。
コンテナの利点を全く理解しないまま使ってました。自分怖い。
Oracleテキストの仕組み

先日、Oracle Textにちょっと調べていて

なるほどなーって思ったので少し書いてみます。

OracleTextは前文検索が出来るOracleが提供している機能のひとつで、

Enterprise Editionはもちろんのこと、

Standard Editionでもついているので無償で利用できます。

さて、全文検索とは・・・


いわゆる「部分一致検索」とか「あいまい検索」とか言われるものですね。

例えばこのエントリーのタイトル【Oracleテキストの仕組み】では

中間に入っている【テキスト】という文字で検索ができること。

一般的なSQLのtitle LIKE '%テキスト%'にあたります。


まぁ、このLIKE検索でも機能的な役割は果たしますが

LIKE検索で％を前後につけるとINDEXが効かなくなるので

フルスキャンが走り、大変コストのかかる検索になります。

そこでこのOracleテキストの登場です。

MySQLにはFULLTEXTインデックスという似たようなものがありますね。

このOracleテキストを対象カラムに設定してSQLのWHERE句に

【CONTAINS(title, 'テキスト') > 0】という感じに

CONTAINS関数にカラム名と検索文字列を渡してあげます。

「> 0」がないとダメなので気をつけましょう。

ただ、いくらOracleテキストといえ、何千万・何億という

検索対象だとやはりちと、遅い。

そういう場合は全文検索用のミドルウェアであるApache Solrなどと

併用すると良いでしょう。

左のサイドバーのサイト内検索で

「Solr」と検索すれば以前の記事が見つかると思います。



さてOracleテキストの仕組みです。

単一項目にOracleテキストを付与すると内部で

複数のオブジェクトが生成されます。

仮に今回はENTRYというテーブルのTITLEカラムに

ENTRY_TITLE_ORATEXT_IDXという名前でOracleテキストを

作ったとします。

そうすると以下の3つが出来ます。

ENTRY_TITLE_ORATEXT_IDX

ENTRY_TITLE_ORATEXT_IDX$I

ENTRY_TITLE_ORATEXT_IDX$X



これらの内容はこんな感じ。


- ENTRY_TITLE_ORATEXT_IDX

これがOracleテキストのメインです。

このインデックスオブジェクトを経由して

残りのインデックスが呼ばれます。


- ENTRY_TITLE_ORATEXT_IDX$I

「$I」が付いたオブジェクト。

これは転置インデックスとなっています。

インデックスを付けたカラムの文字列を

トークンとして分解します。

基本的には日本語は２文字分割、英語は単語分割されます。

英語はスペースやハイフンなどの記号で単語化できますが

日本語は単語にするのが難しいので。。。

例えばこのエントリーと一つ前のエントリーの

タイトルである、

Oracleテキストの仕組み

OCNのネットワーク障害

からトークンを作る場合は以下のように分解されます。

Oracle
テキ
キス
スト
トの
の仕
仕組
仕み
OCN
のネ
ネッ
ット
トワ
ワー
ーク
ク障
障害
こんな感じです。

どういつのトークンがあった場合は１つのレコードにまとめられます。

カラム構成は以下のような感じ。

・対象のトークンが含まれる実レコードの個数、

・実レコードが含まれるアドレス範囲、

・実レコードの場所

- ENTRY_TITLE_ORATEXT_IDX$X

これはトークン表に対するビットマップインデックスです。

トークン表をインデックスにすることにより

高速でデータの有無を判断して、

決められた範囲・レコードの場所(ROW_IDとかかな？)から

実レコード見つけるので高速でHITするわけです。


なかなか考えられている仕組みですね。

ちょっと関心しました。

2文字区切り(N-gram検索)なので

日本語の精度は微妙ですが、設定次第では辞書情報を持たせてより

精度の高い検索が出来ますが労力もかかります。
JBOSSとSeasarとTeeda その４

だいぶ時間が空いてしまいましたが、JBOSS移行シリーズ最終回。

もはや少し忘れかけてます。。。


サーブレットコンテナによる細かい仕様の違いなんだけど、

まずはFilterです。

WebLogicではサーブレットフィルターの中で

フォワード(RequestDispatcher#Forward)をすると

フォワード先にかかっているフィルターも呼ばれます。

しかしJBOSSではフォワード先のFilterは呼ばれない。


Tomcat7もJBOSSと同様でした。JBOSSもCatalinaのAPI使ってるしね。

Servlet2.4からWeb.xmlのfilter-mappingに

dispatcher属性が追加されて

フィルターの適用をリクエスト・フォワード・インクルード・エラーの

それぞれのイベントで選択できるようになったけど

WebLogicのバージョンが古いから全部適用になってたっぽい。

2.4移行はデフォルトでリクエストのみの様子。


これのせいでJBOSS環境ではフォワード後に

SeasarのHotdeployFilterが適用されなくて

RequestオブジェクトがDIできずハマった。。。


お次はInputStreamの２度読み。

WebLogicではInputStreamをBufferedInputStreamで

包んであげればmarkメソッドとresetメソッドで

一度お尻まで読み込み終わっても

ストリームの位置を元に戻せるけどJBOSSではできない。

resetが動作しないのでBufferedReader#readLineがnullになる。


その影響だと思うけど、

フォームなどのPOSTリクエストに対して、

SeasarのRequestDumpFilterで

ログを出力した後にInputStreamを使うと読み込めない。。

これはRequestDumpFilterの中で利用している

Request#getParameterNamesのせい。

これをコメントアウトすれば大丈夫！


POSTの場合はパラメータ情報を取得する時に

InputStreamを使ってるんだと思う。

getParameterNamesやgetParameterValue自体は

内部でキャッシュするからか、何度も呼べるけど

InputStreamはダメ。どうしてもやりたい場合は

HttpServletRequestWrapperを使って、

InputStreamをキャッシュしましょう。


あとはWindowsからLinuxへの移行ということで、

SJIS⇒UTF8になり、Byte長が変わって入力チェックや

各種制御を総見直しになったり、

MSゴシックのフォントが使えなくなったり。

まぁ、それはそれは大変でした。


AS7.2~はまだ情報も少ないのがキツかった。
JBOSSとSeasarとTeeda その３

ログ設定まわりのお話です。

JBOSS関連で一番ハマったのがこれです。

JBOSS AS7.xでは各アプリケーションで利用している

Log4Jなどのロガークラスは

LogManagerがハックして一元管理する仕組みになっています。

JAVA標準のログAPIやLog4Jの呼び出す時に使われるクラスローダーは

以下のようにLogManager用のクラスローダーに置き換えられてしまう。

java.util.logging.Logger = org.jboss.logmanager

org.apache.log4j.Logger = org.jboss.log4j.logmanager

{JBOSS_HOME}/modules/system/layers/base/org/apache/log4/main/module.xmlを見ると

```

<module-alias xmlns="urn:jboss:module:1.1" name="org.apache.log4j" target-name="org.jboss.log4j.logmanager"/>

```

こんな記載があり、特定のパッケージの場合に

クラスを置き換えているのがわかる。

このファイルを消したりいじるとJBOSS自体が起動できるなる。

LogManagerを無効にする方法は後述します。


LogManagerではstandalone.xmlやdomain.xmlに書かれている

ログ設定に応じて出力されるようになる。

また、このXMLを変更してJBOSSを起動すると

{JBOSS_HOME}/{standalone|domain}/configuration/logging.propertiesにその設定が反映される。


上述のように基本的にはLogManagerで一元管理されるのですが

アプリケーションのクラスパス上にlog4l.xmlがある場合は

実はLog4Jのアペンダーなどの設定が優先されます。

ただし、実はここにトラップがあります。

その１でも書きましたが、私の今回のミッションはJBOSSへの

既存プロジェクト移行です。

Seasar2で作られたプロジェクトなのでSeasar系が出力するログは基本的に

CommonsLoggingが使われています。

配備するアプリケーションのcommons-logging.propertiesファイルが

置かれていてもJBOSS環境下では無視されるんですよ。

なのでLogFactoryでロガーインスタンスを作ると

apache.commons.logging.impl.SLF4JLocationAwareLogに

なってしまう。

ややこしいことにDBFluteはCommonsLoggingではなくクラスの中で

明示的にLog4jロガーを利用しているのでDBFlute関連のログは出る。

ハマる原因のひとつでした。TraceInterceptorを

ラップしてLog4Jロガーを使うように明示的に変更してあげると出ます。

一般的なプロジェクトであればこれで解決なのかもしれませんが

まだ問題はあります。

JBOSS上ではLog4j.xmlを各モジュール分読み込んでくれません。

先勝ちなのか後勝ちなのかわかりませんが、

どれかの設定がすべてに適用されるんです。

今回の移行対象のシステムは6つくらいあり、JAVAのパッケージ構成は同一で

それぞれのLog4j.xmlないでログの出力場所を変更しているんですが、

上述した仕様の為、全部同じログファイルに出力されちゃうんですよ。

まいった(>_<)＞

で、結局どう解決したかというと・・・

```

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.apache.commons.logging" />
      <module name="org.apache.log4j" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

```

各モジュールのWEB-INFの下に

jboss-deployment-structure.xmlという名前で

こんなXMLを配備すれば良い。これでLog4jはLog4jとして動きます。


JBOSSとSeasarとTeedaシリーズも次回くらいが最後になるかと思います。

次はWebLogicとJBOSS、Tomcatの

サーブレットコンテナの仕様の違いや

その他、細かいところを。
JBOSSとSeasarとTeeda その２

今回はTeedaの設定まわり。

前回のS2Containerのコンポーネント登録を直しただけではダメです。

JBOSS自体にもJSFの機能がありますのでTeedaと競合してしまいます。

そこでWeb.xmlでJBOSSのJSFは使わないよ！と宣言してあげる必要がある。

以下を追記して下さい。

```

<context-param>
  <param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name>
  <param-value>true</param-value>
</context-param>

```

あと、HotDeoloyの場合、JBOSSだと

Seasarの初期化処理内でセッションのClassCastExceptionが発生してしまう。

ライブラリの奥地に手を入れるのはちょっとリスクだったので

開発時はTomcatを利用するようにしました。

その為、s2container.diconで

diconファイルを無理やり環境設定に応じて切り替えています。

```

<components>
  <include condition="#ENV == 'ut'" path="warmdeploy.dicon"/>
  <include condition="#ENV == 'ct' and !@System@getProperties().containsKey('jboss.host.name')" path="hotdeploy.dicon"/>
  <include condition="#ENV != 'ut' and #ENV != 'ct' or @System@getProperties().containsKey('jboss.host.name')" path="cooldeploy.dicon"/>

  <include condition="@System@getProperties().containsKey('jboss.host.name')" path="jbossVfsFactory.dicon"/>

  <component class="org.seasar.framework.container.factory.SimplePathResolver">
    <initMethod name="addRealPath">
      <arg>"jdbc.diconn"</arg>
      <arg>@System@getProperties().containsKey("jboss.host.name") ? "jdbc-jndi.dicon" : "jdbc.dicon"</arg>
    </initMethod>
    <initMethod name="addRealPath">
      <arg>"jta.dicon"</arg>
      <arg>@System@getProperties().containsKey("jboss.host.name") ? "jta-jboss42.dicon" : "jta.dicon"</arg>
    </initMethod>
  </component>
</components>

```

これでとりあえずはSeasar2&Teedaが動くようになります。

次回は一番ハマったログ出力設定。
Code For Kobe #10

内容は [Code for Kobe github wiki](https://github.com/codeforkobe/codeforkobe.github.io/wiki) に集約しました。こちらにあるのはコピーです。
------
2015-11-19
第10回Code for Kobe定例ミーティング
https://www.facebook.com/events/485013991670464/
[github](https://github.com/codeforkobe/codeforkobe.github.io/wiki/10%E5%9B%9E%E5%AE%9A%E4%BE%8B)

agenda

1. 神戸アプリコンテストNTTdocomo賞受賞報告（後藤さん）
2. 神戸市オープンデータを使った保育園マップアプリ（板谷さん）
3. SIG報告&COPLI共催アイデアソン・視察告知（長井さん）
4. CｆKの次の1年を考える（大山さん）
5. 調整中/その他/連絡事項等

siggraph asia, kobe it festival, code4japan summit とイベント
続きで関係者はバタバタしていましたが、その報告会的な感じ。


Hack the local treasure
-----------------------
神戸アプリコンテストNTTdocomo賞受賞報告（後藤さん）

地元観光客の比率が高い「穴場」観光スポットを NTT DoCoMo 
空間統計API からひねり出す。

課題：近隣集客に頼った主客体質構造がある。
リピーターに向けた穴場の紹介で、観光スポットの絶対数を増やせれば。
観光地が少ない（密集している）のが原因の一つかも。
実際、観光地数と宿泊数は相関があるようだ。

穴場的な場所を発掘して開拓すると課題解決につながるという目論見。
「穴場」の定義を「兵庫県の昼間-夜間/全体」と定義した。

数字が高すぎると「穴場」というよりは「生活圏」になるし、
割合だけで判定してもあまりうまくいかず、程よいところを抜き出す必要があった。

人による検出結果の精査が必要。この部分はボランティアで運営できないかと考え中。

ヒートマップはこちら：
http://www.city.kobe.lg.jp/information/opendata/contest.html#midashi50334

管理者モードはこちら：
http://htlt-admin.s3-website-ap-northeast-1.amazonaws.com/

データは 2014-05 ... 2015-05 土日祝日の集計


保育園マップ
------------
神戸市オープンデータを使った保育園マップアプリ（板谷さん）

大阪が保育園の空き情報をメンテナンスして公開しているらしい
http://www.city.osaka.lg.jp/contents/wdu110/sukusuku/map.html

これがニュースで取り上げられていた。
http://www.sankei.com/west/news/150709/wst1507090100-n1.html

神戸市・高槻市でも位置情報をプロットしてみた。
活用できるようになるといいな。

comments: データ自体は神戸市は区で集計したものが掲載されています
http://www.city.kobe.lg.jp/child/grow/shinseido/index02_03.html


Siggraph ASIA の報告
--------------------
長井さん

http://www.city.kobe.lg.jp/information/project/innovation/siggraph/index.html
6000人見込みが7000人だったので、上手くいったという手応え。
35%が海外と見込みより多かった。

夜のイベントもしっかりセッティングしたのが好評だった。
https://www.facebook.com/events/1646163565650012/


「ICT活用による地域力向上を目指した事例視察・アイデアソン」紹介
http://www.city.kobe.lg.jp/information/press/2015/11/20151118040501.html

久保さんによる背景の解説：
10万人都市であれば、情報の展開が早い。情報の精査もしやすく、俯瞰しやすい。
大きめの視野で、ICTの展開をやってみれば、クイックに知見を得られそうな感触がある。
市民が参加しやすい形を実現していけたら良い。
Open govermentにフィードバックできるといいな。


github patchwork 告知
---------------------
松村さん

12/14 patchwork kobe で開催予定。
github の使い方を学べる。
メンター枠もあり、是非CodeForKobeから参加してほしい。
http://patchwork-kobe.peatix.com/


Code for Kobe 振り返りと次の1年
-------------------------------
大山さん

* unique 80 人は実は最大サイズの brigade
* いま見えている方向性は次の3つぐらい？
 * civic tech やりたい人
 * open government やりたい人
 * open data やりたい人
* せっかく人数も集まっているので、チームでアクションを起こせるようにしていきたいな
* LT 大会＋忘年会的なのができるといいな
JBOSSとSeasarとTeeda その１

WebLogic+Seasar2+Teeda+JDK1.5(JRockit)という環境か

JBOSS AS7.2+JDK1.7に移行することになりましたが問題多発です。

備忘録も兼ねて数回に分けてやったことを書いておこうと思います。

まずSeasar2ですが、

開発が止まっているプロダクトということもあり

JBOSS AS7.xそのままでは動きません。

JBOSSのAS5以前では内部のリソース管理に

vfsfile、vfszipというプロトコルを使っているようで

Seasar2もこのプロトコルには対応してますが

AS5移行ではこれがvfsというプロトコルに変更されているので

S2Containerがコンポーネントの自動登録をする際に失敗します。

http://ml.seasar.org/archives/seasar-dev/2013-July/001254.html

http://tech-sketch.jp/2012/09/sastrutsjbossas7.html

上記のサイトに解決方法が書かれており

解決する為の追加jarファイルと設定がありますが

AS7.0ではこれで良かったと思うんですが、これではダメ。

jarファイルの中にあるクラスを自動登録しようとするとエラーになります。

上記のサイトで公開されている

org.seasar.framework.util.VFSResourcesFactoryの中に

以下のコードがあります。

```

if (url.getPath().toLowerCase().endsWith(".jar/")) {
  return handleJar(physicalURI, rootPackage, rootDir);
} else {
  return handleDir(physicalURI, rootPackage, rootDir);
}

```

リソースがファイルなのかjarファイルなのか判定して

分岐している個所があるのですが、

AS7.2では【{JBOSS_HOME}/standalone/tmp/vfs/deploymentxxxxxx/xxx.jar/contents/zzz/】のように

.jarの後にPATHが続きます。

なので後方一致の個所を部分一致に直すなど対策が必要。

＃ もう１個所同じ判定があります。

また、

```

private Resources handleJar(URI physicalURI, final String rootPackage,
                            final String rootDir) throws IOException {
  File f = new File(physicalURI);
  File[] jar = f.getParentFile().listFiles(new FileFilter() {
  public boolean accept(File pathname) {
    return pathname.getName().toLowerCase().endsWith(".jar");
  }
}

```

ここのphysicalURIという変数の値は

【file:/{JBOSS_HOME}/standalone/tmp/vfs/deploymentxxxxxx/xxx.jar/contents/zzz/】

という値になっているのでfile:とかcontents以降とかを消さないと

ファイルが見つからないエラーになります。

修正してJbossの依存jar追加してコンパイル・・・なので

面倒くさいけどしょうがない。

まだまだJBOSSトラップは続きます。
Laravel5をAWS EC2にデプロイした時のメモ


## CLIでの操作

```
# 最初にインストール済みパッケージの更新（重要）
sudo yum -y update
# 関連するパッケージのインストール
sudo yum install -y httpd24 php56 php56-mbstring mysql55-server php56-mysqlnd

# Composerのインストール
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer


# ドキュメントルートをApacheとec2-userから、読み書きできるようにグループwwwを作成し、ユーザーapacheとec2-userを所属させる
sudo groupadd www
sudo usermod -a -G www ec2-user
sudo usermod -a -G www apache


# /var/www下をwwwグループの所有にする 
sudo chown -R ec2-user:www /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} +
find /var/www -type f -exec sudo chmod 0664 {} +

# Apache起動
sudo service httpd start
 
 
# ブートするごとにApcheが起動するように設定
sudo chkconfig httpd on
 
# MySQLの起動 
sudo service mysqld start
sudo mysql_secure_installation
sudo chkconfig mysqld on
```

## httpd.confの設定
viで中身を書き換える

- laravelファイル/publicにアクセスするとrootアクセスができるので、DocumentRootをその位置に設定する
- .htaccessを有効にするためにAllOverrideをAllにする。

## S3に画像をアップデートする

基本的にはIAMでユーザーを作ってポリシーでアタッチS3FullAccessをアタッチすれば良い
こちらのサイトに詳しく書いてあるので参照
http://joppot.info/2014/06/14/1621

バケットポリシーに以下を記述する

```
{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Sid": "1",
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:GetObject",
				"s3:PutObjectAcl",
				"s3:PutObject"
			],
			"Resource": "arn:aws:s3:::BUCKET_NAME/*"
		}
	]
}
```

## Composer Updateした後にAPIを叩くとエラーが出る
以下のコマンドを叩いてアクセスしようとすると、Internal Server Errorが出る。

```
composer update
```


理由は謎だけど、以下のコマンドを一度起動したら治った。

```
php artisan ser
```

このコマンドでコードを一回読み込んでいるのかも
【C言語】クリスマスツリーをコマンドラインで

　どうも、drumathです。デパートや商店街ではもうクリスマスの準備が始まっていますね。いやだなぁ、またクリボッチとか言われんだろうなぁって季節です。学生なんでそこらへん焦ってます。

# クリスマスツリー
　さてコマンドラインにクリスマスツリーを描きたいなんてことを思ったわけです。ツリーの外観としては
>￥
>￥￥
>￥￥￥
>￥￥￥￥￥
>￥￥
>￥￥￥
>￥￥￥￥￥
>￥￥￥￥￥￥￥￥
>￥￥￥
>￥￥￥￥￥
>￥￥￥￥￥￥￥￥
>￥￥￥￥￥￥￥￥￥￥￥￥￥
>　　]
>　　]
>""""""
こんな感じの木を線対象に作るようなコードを描きます。（ちなみに気分でフィボナッチ数列になっています。）

# コード
コードはこんな感じです。

```c:tree.c
#include "tree.h"

int main()
{
	color_change(0x0e);
	printf("%35s\n","*\0" );
	color_change(0x02);
	leaves_2();
	color_change(0x04);
	miki();
	color_change(0x0b);
	printf("Happy,Christmas!!\n");
	color_change(0x0f);

	return 0;
}
```

```c:tree.h
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

#define ARRAY_MAX 35
#define LEEFF "\\"
#define DECO1 "*"
#define DECO2 "?"
#define DECO3 "&"
#define SEED 25

void pri_deco1();
void pri_deco2();
void pri_deco3();

void leaves_2()
{
	int a=1,b=2,tmp=0;
	int i,j,k;
	int x,y,z;

	srand((unsigned)time(NULL));

	printf("%35s\n",LEEFF);
	for(k=0;k<4;k++){
		x=a;
		y=b;
		for(i=0;i<5;i++){
			for(j=0;j<34-a;j++){
				printf(" ");
			}
			for(j=0;j<a;j++){
				if ((rand()%15)==0) {
					pri_deco1();
				} else if((rand()%SEED)==1){
					pri_deco2();
				} else if((rand()%SEED)==2){
					pri_deco3();
				}else{
					printf(LEEFF);
				}
			}
			printf(LEEFF);
			for(j=0;j<a;j++){
				if ((rand()%15)==0) {
					pri_deco1();
				} else if((rand()%SEED)==1){
					pri_deco2();
				} else if((rand()%SEED)==2){
					pri_deco3();
				}else{
					printf(LEEFF);
				}
			}
			printf("\n");
			tmp=a+b;
			a=b;
			b=tmp;
		}
		a=y;
		b=x+y;
		tmp=0;
	}
}

void miki()
{
	int i=0;
	for(i=0;i<5;i++){
		printf("%35s","|       \0" );
		printf("%7s\n","|" );
	}
	printf("%35s","-------\0" );
	printf("%s\n","-------\0" );
}
void color_change(char col)
{
  
  SetConsoleTextAttribute(
    GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_INTENSITY | col );
}
void pri_deco1()
{
	color_change(0x0d);
	printf(DECO1);
	color_change(0x02);
}
void pri_deco2()
{
	color_change(0x0b);
	printf(DECO2);
	color_change(0x02);
}
void pri_deco3()
{
	color_change(0x0e);
	printf(DECO3);
	color_change(0x02);
}
```

このコードを実行すると↓
![2015-11-29.png](https://qiita-image-store.s3.amazonaws.com/0/86191/2ac25376-c97d-677c-5ef2-bfbc8bc260c1.png)

みごと、クリスマスツリーが出来上がりました。
このコードは乱数でデコレーションを出力してるのでデコレーションの位置が毎回変わるのも楽しみの一つですｗ

ご覧いただき、ありがとうございました。
MemcachedでCONNECTION FAILUREになったときの記録

PHPでmemcachedを使おうと思ったらSELinuxでひっかかってしまったのでメモ。

```php:console
$m = new Memcached();
$result = $m->addServer('localhost', 11211);
if(!$result) {
    echo 'addServer return false';
    exit;
}
$value = $m->get('hoge');
var_dump($value);
$result = $m->set('hoge', 'test');
var_dump($result);
$value = $m->get('hoge');
var_dump($result);
```

インストールもライブラリの追加も完了し、コンソール上で動いたのでいざ実装！と思っていたら

```php:sample.php
$m = new Memcached();
$result = $m->addServer('localhost', 11211);
if(!$result) {
    throw new Exception('addServer return false');
    exit;
}
if(!($value = $m->get('hoge'))) {
    $rc = $m->getResultCode();
    if($rc == Memcached::RES_NOTFOUND) {
        echo 'key empty!';
    } else {
        throw new Exception(sprintf('memcached error [%d][%s]', $rc, $m->getResultMessage());
    }
}
echo 'hit! ', $value;
```

上記コードでエラー「memcached error [3][CONNECTION FAILURE]」。
対話シェル（php -a）だと正常に繋がるのに、なぜ？fpmの設定？もしかして違うパスのphpが動いてる？といろいろ試し、まさかと思い「setenforce 0」にしてから再度実行したら通った。
ただのSELinuxかよーと落胆し、設定項目を探して

```shell-session
$ getsebool -a | grep memcache

httpd_can_network_memcache --> off
```

これか・・・

```shell-session
$ sudo setsebool -P httpd_can_network_memcache true
$ getsebool httpd_can_network_memcache

httpd_can_network_memcache --> on
```

もちろん「setenforce 1」でSELinuxを戻すのも忘れずに。
再度実行

```text
hit! test
```

動いた！ということで原因はSELinuxのhttpd_can_network_memcacheがoffになっていたせいでした。
offになってても対話シェル形式だと普通に動作するんだね…
playframeworkでのjson読み取りについて

# 動機
会社のとあるシステムでjsonに一項目増やしたらエラーが出るようになったので、jsonのparseが厳密すぎるのではないか？という話になったが、そんな馬鹿なという感じなのでちょっと試してみた。

# ソースコード

```scala:Application.scala
package controllers

import play.api.libs.json.{Json, Reads}
import play.api.mvc._

class Application extends Controller {

  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }
  case class Person(name: String, age: Int)
  implicit val personReads: Reads[Person] = Json.reads[Person]
  def json = Action(parse.json) { implicit request =>
    request.body.validate[Person].fold(invalid => BadRequest(invalid.mkString(",")), valid => Ok("no problem"))
  }

}
```

# Personクラスに則った形
![2015-11-29_00h44_42.png](https://qiita-image-store.s3.amazonaws.com/0/39243/7d97586c-8e99-3d29-2408-953aa423e8e0.png)

# Personクラスに則っていない形

![2015-11-29_00h44_12.png](https://qiita-image-store.s3.amazonaws.com/0/39243/441393b2-8797-0b03-66cb-e9611fb7fb82.png)

# うーむ
余裕でparseしよるので、原因は他にありそうですね。

# 結論
実はJacksonを使用していて、Jacksonのデシリアライズでエラーを出していた
http://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c#2-7

# 解決方法
case classに
`@JsonIgnoreProperties(ignoreUnknown = true)`
をつけてエラーを出さないようにしました。

Jacksonを使うときには気をつけないとダメですね。

# playframeworkのjsonパースで厳密にparseするには
この辺かな？

http://stackoverflow.com/questions/23297985/how-to-enforce-strict-serialization-of-json-in-play-2-x