OmniAICreator/Qiita-1.07M huggingface dataset:
[JAWS-UG CLI] IAM:#14 ハンズオン後に

ここでは、ハンズオン実施後にやっておくべきことを書いていきます。

1. ログインプロファイルの削除
=============================

ハンズオン用にログインプロファイルを作成した場合は、必ず、そのログインプロファイルを削除しておいてください。
(MFAで防護していない場合、パスワードの強度が弱いなどの状態で放置すると、不正利用されるリスクが高くなります。)

ログインプロファイルの削除 (マネジメントコンソールからのログイン不許可): http://qiita.com/tcsh/items/f56764317729e8974257


2. 認証/設定ファイルの戻し
=============================

必要に応じて、バックアップしておいた認証/設定ファイルを戻しておきましょう。

```bash:バックアップ:
mv ~/.aws/credentials ~/.aws/credentials.handson
cp ~/.aws/credentials.old ~/.aws/credentials
```


```bash:戻し:
mv ~/.aws/config ~/.aws/config.handson
cp ~/.aws/config.old ~/.aws/config
```
[JAWS-UG CLI] IAM:#13 ハンズオン前に

ここでは、IAMグループ/ユーザ作成後、ハンズオン実施前にやっておくと良いことを書いていきます。


マネジメントコンソールを併用しよう
===================================

AWS CLIでコマンドを実行し、マネジメントコンソールでコマンド実行結果を確認しながらハンズオンを実施すると理解が深まります。

ログインプロファイルを追加して、マネジメントコンソールからログインしてみましょう。

ログインプロファイルの作成 (マネジメントコンソールからのログイン許可): http://qiita.com/tcsh/items/4fd15161e9539c0f36b8
Railsのコールバック関数まとめ

#コールバック関数とは
コールバックとはデータベースへの保存の直前や、バリデーションの実行直後など特定のタイミングで処理を行うための機能です。
特定のタイミングで必ず実行されるコールバック関数を設定しておくことで、モデルの一貫性が保たれます。

#コールバック関数の種類
* **after_find**
* **after_initialize**
* **before_validation**
* **after_validation**
* **before_save**
* **before_create / before_update**
* **after_create / after_update**
* **after_save**
* **after_commit**
* **after_rollback**
* **after_touch**
* **before_destory**
* **after_destory**


参考：[Railsのコールバックまとめ](http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/)
EC2のAuto Recovery機能をアカウント内の全インスタンスで有効にしてみた

EC2インスタンスがダメになったときにSTOP-STARTした経験のある方は多いと思いますが、少し前に

https://aws.amazon.com/jp/about-aws/whats-new/2015/01/12/amazon-ec2-auto-recovery-now-available-in-the-us-east-region/

こういう機能がリリースされていました。

AWSのほかのサービスのようにus-east(virginia)限定で開始されたのですが、
どうやらap-northeast(東京)でも使えるようになったみたいです。

さっそくAWSコンソールから設定してみましたが、だるい、だるすぎる…
1台,2台ならいいですがたくさんある場合は途方にくれてしまいますね。

そこで AWS CLI です。
alarmを設定するためのコマンドは aws cloudwatch put-metric-alarm です。

以下はAWS CLIのマニュアル (残念ながら日本語版はないようです)
http://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html

使い方はこんな感じ

```
 put-metric-alarm
--alarm-name <value>
[--alarm-description <value>]
[--actions-enabled | --no-actions-enabled]
[--ok-actions <value>]
[--alarm-actions <value>]
[--insufficient-data-actions <value>]
--metric-name <value>
--namespace <value>
--statistic <value>
[--dimensions <value>]
--period <value>
[--unit <value>]
--evaluation-periods <value>
--threshold <value>
--comparison-operator <value>
[--cli-input-json <value>]
[--generate-cli-skeleton]
```

実際にはこんな感じでパラメータを投入します。

```
aws cloudwatch put-metric-alarm \
       --alarm-name test-alarm \
       --alarm-actions arn:aws:automate:ap-northeast-1:ec2:recover \
       --alarm-description "test alarm dayo"
       --metric-name StatusCheckFailed_System \
       --namespace AWS/WC2$ \
       --statistic Maximum  \
       --dimensions Name=InstanceId,Value=i-XXXXXXXX \
       --period 60 \
       --evaluation-periods 1 \
       --threshold 1 \
       --comparison-operator GreaterThanOrEqualToThreshold
```

ポイントは、--alarm-actions でrevoveryのarnを指定するのと、
--metric-nameに StatusCheckFailed_System というのを指定するというところでしょうか。

上記のような感じで、dimensionsにターゲットのインスタンスIDを指定すれば設定できるのですが、
このままだとGUIとそう変わらない工数感なのでちょっとだけ自動化してみます。

AWS CLI 以外に jq を使って aws ec2 describe-instances の結果からインスタンスIDの抽出をしています。 
credentialは適宜設定してください。(環境変数とか、configとか)

```
#!/bin/bash

if [ $# -ne 2 ]; then
    echo "Usage: $0 [AlarmName] [Region]"
    echo "Region: ap-northeast-1 ap-southeast-1 ap-southeast-2 eu-central-1 eu-west-1 sa-east-1 us-east-1 us-west-1 us-west-2"
    exit
fi

ALARM_NAME_PREFIX=$1
METRIC_NAME=StatusCheckFailed_System
NAMESPACE=AWS/EC2
STATISTIC=Maximum
PERIOD=60
EVALUATION_PERIODS=1
THRESHOLD=1
COMPARISON_OPERATOR=GreaterThanOrEqualToThreshold
ALARM_ACTIONS=arn:aws:automate:$2:ec2:recover

for INSTANCE_ID in $(aws ec2 describe-instances | jq -r '.Reservations[].Instances[].InstanceId');
do
        aws cloudwatch put-metric-alarm \
        --alarm-name `echo $ALARM_NAME_PREFIX'_'$INSTANCE_ID` \
        --alarm-actions $ALARM_ACTIONS \
        --metric-name $METRIC_NAME \
        --namespace $NAMESPACE \
        --dimensions Name=InstanceId,Value=$INSTANCE_ID \
        --statistic $STATISTIC  \
        --period $PERIOD \
        --evaluation-periods $EVALUATION_PERIODS \
        --threshold $THRESHOLD \
        --comparison-operator $COMPARISON_OPERATOR
done
```

ちなみに、STOPされているインスタンスはエラーがでてしまいます。

以上です。
キャメルケースとスネークケースを相互変換するスニペット

人生において、もう5回ぐらい書いてる気がする。[Packagist](https://packagist.org/)にでも登録しておけという話ではある。[キャメルはcamelCase、スネークはsnake_case](http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9)

```php
    public static function snakeToCamel($str)
    {
        $tokens = explode('_', $str);
        foreach ($tokens as $k => $v) {
            if ($k == 0) {
                $tokens[$k] = lcfirst($v);
            } else {
                $tokens[$k] = ucfirst($v);
            }
        }
        return implode($tokens);
    }
```
```php
    public static function camelToSnake($str)
    {
        $chars = str_split($str);
        $result = array();
        foreach ($chars as $char) {
            if (ctype_upper($char)) {
                $result[] = '_';
            }
            $result[] = $char;
        }
        return implode($result);
    }
```
Windowsでboot2Dockerにssh接続

### 接続構成の確認
---
ホスト名、ポート、ユーザーは`vagrant up`で起動中に出力される
<pre>
...
default: SSH address: 127.0.0.1:2222
default: SSH username: docker
default: SSH auth method: private key
...
</pre>

またはコマンドプロンプトで

```
vagrant ssh-config
```

このエラーが出たら

```
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or,
get an ID of a target machine from `vagrant global-status` to run
this command on. A final option is to change to a directory with a
Vagrantfile and to try again.
```

idを確認して指定する

```
C:\>vagrant global-status
id       name    provider   state   directory
------------------------------------------------------------------------
1f5d9fc  default virtualbox running D:/hoge

The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date. To interact with any of the machines, you can go to
that directory and run Vagrant, or you can use the ID directly
with Vagrant commands from any directory. For example:
"vagrant destroy 1a2b3c4d"

C:\>vagrant ssh-config 1f5d9fc
```

### 自動で接続する

Vagrantfileを以下のようにコメントを外してvagrantを起動すると、VirtualBoxのGUI使って自動接続してくれる

```rb

config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
     vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
end
```

### PuTTYで接続する

バージョン0.6.0

1. PuTTYgenを立ち上げて、%USERPROFILE%\.vagrant.d\insecure_private_keyを読み込む

    > 既存の秘密鍵の読込 「読込」ボタンから選択する
1. 「秘密鍵の保存」ボタンでPuTTY用のppkファイルを作成する
1. PuTTYを立ち上げて、以下設定して「開く」ボタン押すと接続する

    |カテゴリ|項目名|値|
|:--|:--|:--|
|セッション|ホスト名|127.0.0.1|
|セッション|ポート|2222|
|接続>データ|自動ログインのユーザー名|docker|
|接続>SSH>認証|認証のためのプライベートキーファイル|保存したppkファイルパス|

> [SSH to Vagrant box in Windows?](http://stackoverflow.com/questions/9885108/ssh-to-vagrant-box-in-windows)


### Git for Windowsで接続する

gitが入ってる前提

1. Git Bashを立ち上げてssh実行

    ```bash
ssh -i "$USERPROFILE\.vagrant.d\insecure_private_key" -port 2222 docker@127.0.0.1
```

    初回実行時に信頼するホストの登録か何かでyesno聞かれたらyesする

毎回指定が面倒であれば `vagrant ssh-config`で構成が表示されるのを確認して

```
mkdir $USERPROFILE\.ssh
vagrant ssh-config >> $USERPROFILE\.ssh\config
```

とすれば以降は次のコマンドだけで接続できる

```
ssh default
```

> [Windowsでvagrant upした後にsshログインする方法](http://dqn.sakusakutto.jp/2013/08/windows_vagrant_ssh.html)
【WordPress】WordPressのパーマリンク設定（お引越しした場合）


##問題
WordPressでサイト改修の際に、ローカル環境にお引越し。
→
パーマリンクが設定の変更が反映されない！
404 NOT FOUNDのエラー画面に

##解決策
ズバリ：mod_rewriteの設定！

①そもそもmod_rewiteは存在するのか？
私の場合）
httpd.configファイルの

```
LoadModule rewrite_module modules/mod_rewrite.so
```
がコメントアウトになっていました！
なのでこのコメントアウトを外します。


②.htaccessファイルの# BEGIN と #ENDの間に以下を挿入

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
```

→これをすることでmod_rewriteが、WordPressのデフォルトURLを、カスタム構造に書き換える機能を持ちます！

③アパッチの再起動


```コマンドラインで
sudo apachectl restart
```


##補足）便利コマンド

```コマンドラインで、「mod_rewrite」を探すには
find / -name mod_rewrite.so
```
ランチャーアイコンのファイル名はリリースしたら変えてはいけない 

※ この問題は2015年に経験したものです

先日Androidアプリのアイコンのファイル名を変えたところ、一部機種でアイコンが変になるという問題がありました。変になるというのは端末によって様々で、たとえば黒くなる / 透明になる / 青い電子回路のような四角になる / ドロイド君になる、などです。

該当の問題がおきた端末でもアプリのリストなどでは表示できていること、一部の機種でのみ問題がおきること、問題が起きた端末にアイコンのファイル名を戻したアプリをインストールすると元に戻ったことなどから、Androidのホームアプリがアイコンファイル名のキャッシュを持っていて、それをうまく更新できないことがあるのではないかと推定しています。ただadbやDeployGateなどからのインストール・アップグレードでは再現しないので、Google Playの自動更新のときのみ起きるのかもしれません。

そういうわけで、Androidアプリに関しては「**ランチャーアイコンのファイル名は、リリースしたら変えてはいけない**」ということにしたほうがよさそうです。この問題はQAでは見つけられないのでご注意ください。
Rubyのハッシュの記法まとめ

まず、ハッシュと配列の違いから。

> 配列はインデックスとして整数値をとるがそれ以外を取るものがハッシュ 

連想配列がハッシュということですね。

**記法①：ハッシュロケットを使う**

```rb
user = { "first_name" => "Yusuke", "last_name" => "Higaki" }
```
`{ }`の最初と最後に空白が入っているのが通例らしい。もちろん無くてもプログラム上は問題ない。

**記法②：シンボルを使う**
Railsではキーに文字列でなくシンボルを使うほうが普通なようです。

```rb
user = { :first_name => "Yusuke", :last_name => "Higaki" }
```

**記法③：シンボルの進化系**
Railsではシンボルを使うのが普通なので、Ruby1.9からシンボルを使った新しい記法がサポートされました。

```rb
user = { first_name: "Yusuke", last_name: "Higaki" }
```

この書き方はRailsのコミュニティで人気が高まってきているようです。

**記法④：メソッドの最後の引数がハッシュならカッコは省略できる**
最後はこれ。

```rb
set_user(first_name: "Yusuke", last_name: "Higaki")
```

もちろん`set_user`のカッコも省略可能なので、

```rb
set_user first_name: "Yusuke", last_name : "Higaki"
```

と書くこともできます。慣れるまでは毎回しっかり立ち止まって考えるべきですね。
matplotlibでcolorbarを図にあわせる


matplotlibのaxis関数は便利で、簡単に座標を調整してくれます。
`axis("tight")`で余白をなるべく少なくしてくれますし、
`axis("image")`で同じ事をアスペクト比を保ったまましてくれます。
しかし`colorbar`を付けるとややこしくなります。
以下のような単純な場合を考えます：

```python
import numpy as np
import matplotlib.pyplot as plt

Nx = 100
Ny = 20

a = np.random.rand(Ny, Nx)

x = range(Nx)
y = range(Ny)
X, Y = np.meshgrid(x, y)

plt.pcolormesh(X, Y, a)
plt.axis("image")
plt.colorbar()
```
![normal.png](https://qiita-image-store.s3.amazonaws.com/0/30426/0353a1ed-f504-d1d9-8250-f330499a3081.png)

この時colorbarがどのように出てほしいかは個人の趣味と思いますが
これは私の好みではありません。

そこで登場するのが`make_axes_locatable`です。

```python
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig, ax = plt.subplots()

image = ax.pcolormesh(X, Y, a)
ax.axis("image")

divider = make_axes_locatable(ax)
ax_cb = divider.new_horizontal(size="2%", pad=0.05)
fig.add_axes(ax_cb)
plt.colorbar(image, cax=ax_cb)
```



![fit.png](https://qiita-image-store.s3.amazonaws.com/0/30426/1ec36d4f-3802-cb57-371f-9b15aa576d58.png)

複数の図を生成する場合はこちらのコンパクトな方が良いと思います。
なお複数の図を生成する場合には

```python
fig = plt.figure()
ax = plt.subplot(311)
```

のように取得すれば後は同じです。
nkfメモ

カレントディレクトリにあるtxtファイルを調べる

```
$ find . -depth 1 -type f -name "*.txt" -print0 | xargs -0 nkf --guess
```

カレントディレクトリにあるtxtファイルの文字コードと改行を、UTF-8とLFに変換する

```
$ find . -depth 1 -type f -name "*.txt" -print0 | xargs -0 nkf --overwrite -Lu -w
```
Laravel 4のRequestクラスメソッド一覧

`vendor/laravel/framework/src/Http/Request.php`の中身を参照しながら下記の表を作成しました。

| Method | 説明 | 
| ---- | ---- |
| ip | String型でIPアドレスを返す | 
| url | String型でプロトコル、ドメイン、パスを含めURLを返します。例）http://www.example.com/ | 
| path | String型でパスのみを返します。例）to/some/path | 
| method | String型でメソッドを返します | 
| all | Arraysでクエリ部分を返します |
| isJson | Boolでcontent_typeはapplication/jsonのリクエストなのかを確認します |
| query | Request::all()と同じで、クエリ部分を配列で返します |
| header | パラメータは指定しない場合は配列で全部のHTTPヘッダーを返します。1stパラメータは指定してある場合はString型でHTTPヘッダーの値を返します。 |
今更ですが、CoffeeScript をかまってみた。


##とりあえず書き方など
ずいぶんラフな書き方ができる、といろんなサイトに書いてあります（嘘です）が、今ひとつイメージできないので、公式サイトにある CoffeeScript -> JavaScript 変換ページで確認しながら見てみます。
[CoffeeScript公式](http://coffeescript.org) -> TRY COFFEESCRIPT のタブで確認します。

詳しいことなどは、[ここ](http://www.buildinsider.net/web/rubyonrails4/0901) とか [ここ](http://www.webopixel.net/javascript/660.html) などにありますので、参照してください。

##今回のポイント
今までは、クラスを定義してそれを利用していました。その資産をなるべく変更せずに使いたいなぁと思います。
ちなみに各クラスはそれぞれ独立したファイルに保存してあります。
例）hoge.js  tara.js

##書き方（ざっくり）
Rubyライクとかっていうお話ですが、ガッツリ JavaSript な印象ですw
※まだ触ったばっかりなので。。。

インデントが重要な役割をしています。
関数とか条件式とかそういうのの中身？はインデントで認識してるらしいので、気をつけましょう。
それから、基本的には値を返すので、返さない（若しくは返さなくても良い）ものは最後に空の return 行を追加します。

それから、ライン終端の ; は基本いらないので気をつけようw
jQuery も普通に使えます。


###class定義
```CoffeeScript
class Hoge
  hello: () ->
    alert("Hello world!")
    return
```
```JavaScript
(function() {

  var Hoge;
  
  Hoge = (function() {
    function Hoge() {}
    
    Hoge.prototype.hello = function() {
      alert("Hello world!");
    };
    
    return Hoge;
  })();
  
}).call(this);
```
※ちなみに 公式サイトのインタプリタでは変換後の (function(){ ... }).call(this); は隠れて見えないようです。
どうやらここがポイントらしく、これは **即時関数** と呼ばれているようです。
これに囲まれると、中身はすべてローカル扱い、ということで、ライブラリを扱うときは注意が必要とのことです。

解決方法としては、CoffeeScript の最後に

```CoffeeScript
class Hoge
  hello: () ->
    alert("Hello world!")
    return
    
window.Hoge = Hoge
```
とすると良いようです。windowクラスはグローバルなので、それに登録して利用する、ということのようです。

あと、クラス名の前に @ を付けてもいいらしい。

```CoffeeScript
class @Hoge
```
これでも大丈夫です。

```JavaScript
(function() {
  this.Hoge = (function(){ ... })();
}).call(this);
```
となって、window.Hoge = Hoge とほぼ同じことになります。。。たぶんw

###function定義
関数の定義の仕方も簡潔になっています、

```CoffeeScript
calculate_age: (birth_year, name) ->
  if name is 'yukari'
    age = 17
  else
    date = new Date()
    nowyear = date.getYear() + 1900
    age = nowyear - birth_year
  
  return age
```
```JavaScript
(function() {

  ({
    calculate_age: function(birth_year, name) {
      var age, date, nowyear;
      if (name === 'yukari') {
        age = 17;
      } else {
        date = new Date();
        nowyear = date.getYear() + 1900;
        age = nowyear - birth_year;
      }
      return age;
    }
   });

}).call(this)
```
まあこんな感じ。
ポイントは **->** が **function()** ということです。
これは例えば jQuery などを使うときも同じです。

```CoffeeScript
  $.post(target_url, data_hash,
    (html) ->
      $("#show_html").html(html)
      return
  )
```
です。

###その他
条件式とかでなんか ？ とか使えたりとかするらしいです
あと == は使えないとか。

でも細かいところはそれくらいかな。
インデントが気になるところですが、それくらいなので、過去の資産を移植するのは意外と楽かもです。

あと、グローバルで使いたい場合はトップの方で

```html
<head>
  <script type="text/javascript">
    var h = new Hoge();
  </script>
</head>
```
ってしておくと良いでしょう。
iOSデフォのNSDateフォーマットのNSStringオブジェクトを、NSDateオブジェクトに戻す

すごいニッチで雑なタイトルですが、毎回忘れるので自分用メモ。

時々、意図せず `2015-03-13 08:08:38 +0000` こういう感じでNSStringオブジェクトにされてしまっているものがあります(多分これiOSのデフォルトのNSDateフォーマットじゃないかと)。でもこれ、NSDateで欲しいんだけど。。っていうときに使えるメソッド。

```objc:NSDate+Utility.m
+ (NSDate *)localTimeFromUTCTimeStr:(NSString*)timeStr
{
    if(!timeStr || ![timeStr isKindOfClass:[NSString class]]) return nil;
    
    NSDateFormatter* df_utc = [[NSDateFormatter alloc] init];
    [df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"JST"]];
    [df_utc setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"];
    return [df_utc dateFromString:timeStr];
}
```

タイムゾーンは適宜変更して使えば良いと思います。

参考[【iOS】NSDateのtimezoneを変更する【Objective-C】](http://qiita.com/__zck__/items/aa08e1ed8496f6da1eb9)
bc > 16進数で足し算 > obase=16 / ibase=16 / 8A0+020

linux上にて16進数で足し算をしたい。

動作確認

    CentOS 6.5

[こちら](http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/bc%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A716%E9%80%B2%E6%95%B0%E3%80%8110%E9%80%B2%E6%95%B0%E3%80%818%E9%80%B2%E6%95%B0%E3%80%812%E9%80%B2%E6%95%B0%E3%81%AE%E5%A4%89%E6%8F%9B%E3%83%BB%E8%A8%88%E7%AE%97%E3%82%92%E8%A1%8C%E3%81%86.html)が参考になった。


```
$bc
obase=16 (入力)
ibase=16 (入力)
924+020 (入力)
944
8A0+020 (入力)
8C0
```
上記の例では0x924に32バイト(0x20)を足している。また0x8A0に32バイト(0x20)を足している。

`8A0`は`8a0`ではsyntax errorとなる。
Djangoでクエリに名前付けする

## 課題

Railsには`scope`という機能があって、頻出のクエリに名前付けを行うことができます。

```rb
class Post < ActiveRecord::Base
  scope :published, -> { where(published: true) }
end

Post.published
# SELECT "posts".* FROM "posts" WHERE "posts"."published" = 1

```

同じようなことをDjangoでもやりたいな、と思ってやり方を調べました。

## 解決方法

カスタマイズしたQuerySetと、ModelManagerを使うと、実現できるようです。

https://docs.djangoproject.com/en/1.7/topics/db/managers/#calling-custom-queryset-methods-from-the-manager

```py
from django.db import models

class PostQuerySet(models.QuerySet):
    def published(self):
        return self.filter(published=True)

    def latest(self):
        return self.order_by('-updated_at')

class PostManager(models.Manager):
    def get_queryset(self):
        return PostQuerySet(self.model, using=self._db)

class Post(models.Model):
    published = models.BooleanField()
    # 他いろんなフィールド...

    objects = PostManager() # custom managerを定義
```

使い方。

```py
>>> Post.objects.all().published()
# SELECT "posts".* FROM "posts" WHERE "posts"."published" = 1 
```

以下のようにチェーンさせることもできました。

```py
>>> Post.objects.all().published().latest()
```

`objects.all()` などをつかって`QuerySet`を生成しないと使えないのがちょっと微妙な気もしますが、Viewなどが読みやすく実装できるようになると思います。
FuelPHP+Twigでカスタムタグ

FuelPHPから渡された値をTwigで配列or文字列を判定する必要があったので、カスタムタグを追加してみました。

①お勧めできないやり方

１．「\fuel\parser\classes\view\twig.php」を「\classes\twig.php」にコピペする
２．「\Parser\View_Twig」を継承したクラスに変更する
３．parser()以外の関数を削除する
４．カスタムタグを追加する

```php:twig.php
class View_Twig extends \Parser\View_Twig
{
	public static function parser(){
		// カスタムタグ
        	static::$_parser->addFilter(new Twig_SimpleFilter('is_string_twig', function ($str){
                        return (is_string($str)) ? 1 : 0;
                }));
		// カスタムタグ
	}
}
```

５．bootstrap.phpでView_Twigの向き先を作成したクラスに設定する

```php:bootstrap.php
Autoloader::add_classes(array(
    'View_Twig'       => APPPATH.'classes/twig.php',
));
```

６．twigで使用する

```:xxx.twig
{% if str|is_string_twig %}
	{{ str }}
{% endif %}
```


②お勧めのやり方

Twig Extensionを使う
http://koyhogetech.hatenablog.com/entry/20131205/fuel_twig
linux > ファイルのバイナリ値の表示(アドレス指定) > od -x -w16 -A x [ファイル] -j 0x8a0 | head -n 2

動作確認

    CentOS 6.5

ファイルtest.datの特定のアドレス(0x8a0)近辺の値を見たい時、以下のようにする

```
$ od -x -w16 -A x test.dat -j 0x8a0 | head -n 2
0008a0 ffff ffff ffff ffff ffff ffff ffff ffff
*
```
CakePHP、Authコンポーネントでログインの条件を追加

CakePHP、ログイン処理はAuthComponentにおまかせ、ってのが定石だが、そういえば、ログインできる条件がある場合はどうしたらいいだろう？
ログインIDとパスワードがあって、他にそのメンバーのステータスが「有効」な時のみログインできる、というような場合だ。
結論、 scope というのを追加すればよい。

```php:app/Controller/LoginController.php
	public $components = array('Paginator', 'Session', 'Auth' => array(
		'authenticate' => array(
			'Form' => array(
				'userModel' => 'Member',
				'fields' => array('username' => 'login_id', 'passeord' => 'password'),
				'scope' => array('status' => 1)
			)    
		)
	));
```
AWSのEC2インスタンス 起動時　設定

<h3>1. インスタンスを起動したらELBの変更サイズを認識させる</h3>

AMIからEBSボリュームのサイズを拡張してインスタンスを起動するとデバイスサイズの拡張分が認識されていません。まずはこれを指定したサイズにする必要があります。<br>
以下のコマンドをroot権限で実行します。

<pre>sudo resize2fs /dev/xvda1</pre>

<h3>2. ec2-user以外のユーザを作成してec2-userは削除しよう</h3>

基本ですね。当たり前なので省略したいところですけど

<pre>
useradd hoge
cp -arp /home/ec2-user/.ssh /home/hoge/
chown -R hoge. /home/hoge/.ssh
passwd hoge
</pre>

<h3>2. コマンドラインツールが動作するように環境変数を設定</h3>

基本的な環境変数は設定しておくと便利です（コマンド都度指定することもできますが）。<br>
アクセスキーと秘密鍵はアカウントのクレデンシャルで取得してもいいですが基本的にはIAMのユーザを作成して、ユーザのSecurity Credentialsメニューで作成して利用します。これでユーザごとの権限も設定可能で安全性も高まります。

<pre>
export AWS_ACCESS_KEY='アクセスキー'
export AWS_SECRET_KEY='秘密鍵'
export AWS_REGION='ap-northeast-1'
export EC2_REGION=${AWS_REGION}
export EC2_URL=ec2.${AWS_REGION}.amazonaws.com
export AWS_SNS_URL=http://sns.${AWS_REGION}.amazonaws.com
export AWS_ELB_URL=https://elasticloadbalancing.${AWS_REGION}.amazonaws.com
</pre>

アクセスキーと秘密鍵が正しければこの時点からec2コマンドラインツールが動作するようになっています。ためしにインスタンス一覧を取得してみましょう。

<pre>ec2-describe-instances</pre>

credentialファイルを作成してその位置を環境変数に設定しておくのもありです。1ユーザで複数のロールを利用する場合もそうですが、セキュリティ上もこの方がいいですね。

<pre>
mkdir .ec2
echo "AWSAccessKeyId=【アクセスキー文字列】" > .ec2/credential
echo "AWSSecretKey=【シークレットアクセスキー文字列】" >> .ec2/credential
export AWS_CREDENTIAL_FILE=/home/me/.ec2/credential
</pre>

上記のexportはシェルのrcファイルなどに書きましょう。セキュリティ上はアカウント個別に設定するのが吉です。
私はデフォルトの.bashrcに記述しています。

<h4>まとめコマンド</h4>
<pre>
mkdir .ec2/
echo "AWSAccessKeyId=[アクセスキー文字列]" > .ec2/credential
echo "AWSSecretKey=[シークレットアクセスキー文字列]" >> .ec2/credential
chmod -R go-rwx .ec2
</pre>

<pre>
echo "export AWS_CREDENTIAL_FILE='/home/[自分のアカウント名]/.ec2/credential'" >> .bashrc
echo "export AWS_REGION='ap-northeast-1'" >> .bashrc
echo "export EC2_REGION=\${AWS_REGION}" >> .bashrc
echo "export EC2_URL=ec2.\${AWS_REGION}.amazonaws.com" >> .bashrc
echo "export AWS_SNS_URL=http://sns.\${AWS_REGION}.amazonaws.com" >> .bashrc
echo "export AWS_ELB_URL=https://elasticloadbalancing.\${AWS_REGION}.amazonaws.com" >> .bashrc
</pre>

<h2>sshログインにメール通知を仕掛けておく</h2>

VPCの場合は基本的にnat-01一台にしかけておけばOKなので楽ですね。
これは何の言語を利用してもいいのですけどとりあえずホームディレクトリの.ssh/rcを作成してその中で通知しておきます。/etc/skel/.ssh/rcを作成しておくとユーザーを追加しても大丈夫なので良いですよね。

<pre>
ORG_USER=`ps auf | head -n 2 | tail -n 1 | awk '{print $1}'`
SUBJECT="[notice][system][${HOSTNAME}] ${USER} from ${ORG_USER} `/bin/date +\%m/\%d/\%Y/\%H:\%M:\%S`"
FROM="noreply@example.com"
TO="me@example.com"
OPTINFO=`ps auf`
BODY=`cat << __EOL__
Subject: ${SUBJECT}
To: ${TO}
From: ${FROM}

${USER} logged in from ${ORG_USER} ${ORG_USER}.

${OPTINFO}

__EOL__
`
echo "${BODY}" | /usr/sbin/sendmail -t &
</pre>

通知は他の言語で作って営業時間内ならチームのIRCチャネルに通知したり、時間外なら重要なメンバーのSMSに通知したりできるようにしておくとよりセキュリティの管理がしやすくなりますね。



<br><br clear="all"></div>
<a name="more"></a>
<div class="portal-links">

</div>
[swift]画像を非同期でロードするextensions

UIImageをURLから非同期でロードしたい時のextensions。エラー処理とか全く入れてないけど...

``` UIImageExtension.swift
extension UIImage {
    class func loadAsyncFromURL(urlString: String, callback: (UIImage?) -> ()) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
            let url = NSURL(string: urlString)
            var err: NSError?
            let imageData = NSData(contentsOfURL: url!, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
            var image: UIImage?
            if let _data = imageData {
                image = UIImage(data: _data)
                    
                dispatch_async(dispatch_get_main_queue(), {
                    callback(image)
                })
            }
        })
    }
}
```

**使い方**

``` swift
UIImage.loadAsyncFromURL(path, {
  (image: UIImage?) in
  self.imageView.image = image
})
```
動的な囲み文字を使ったパターンマッチ

perlの `qr{...}` や `qr|...|` のようなものを正規表現でマッチさせたいときのtips。
結論から言うと以下の正規表現を利用すればいい。

`qr(.)(?:[^\1]|\\\1)*\1`

`(.)` で囲み文字をキャプチャし、 `\1` で利用している。
詳しくはperldoc perlreを参照。
Guardでテストを自動化する。ついでに高速化


# インストール

```Gemfile
gem 'guard-rspec', require: false
```

# 初期化

```
$ bundle exec guard init
```

自動生成ファイル:Guardfile

```rb:Guardfile
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

## Uncomment and set this to only include directories you want to watch
# directories %w(app lib config test spec features)

## Uncomment to clear the screen before every task
# clearing :on

## Guard internally checks for changes in the Guardfile and exits.
## If you want Guard to automatically start up again, run guard in a
## shell loop, e.g.:
##
##  $ while bundle exec guard; do echo "Restarting Guard..."; done
##
## Note: if you are using the `directories` clause above and you are not
## watching the project directory ('.'), then you will want to move
## the Guardfile to a watched dir and symlink it back, e.g.
#
#  $ mkdir config
#  $ mv Guardfile config/
#  $ ln -s config/Guardfile .
#
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"

# Note: The cmd option is now required due to the increasing number of ways
#       rspec may be run, below are examples of the most common uses.
#  * bundler: 'bundle exec rspec'
#  * bundler binstubs: 'bin/rspec'
#  * spring: 'bin/rspec' (This will use spring if running and you have
#                          installed the spring binstubs per the docs)
#  * zeus: 'zeus rspec' (requires the server to be started separately)
#  * 'just' rspec: 'rspec'

guard :rspec, cmd: "bundle exec rspec" do
  require "guard/rspec/dsl"
  dsl = Guard::RSpec::Dsl.new(self)

  # Feel free to open issues for suggestions and improvements

  # RSpec files
  rspec = dsl.rspec
  watch(rspec.spec_helper) { rspec.spec_dir }
  watch(rspec.spec_support) { rspec.spec_dir }
  watch(rspec.spec_files)

  # Ruby files
  ruby = dsl.ruby
  dsl.watch_spec_files_for(ruby.lib_files)

  # Rails files
  rails = dsl.rails(view_extensions: %w(erb haml slim))
  dsl.watch_spec_files_for(rails.app_files)
  dsl.watch_spec_files_for(rails.views)

  watch(rails.controllers) do |m|
    [
      rspec.spec.("routing/#{m[1]}_routing"),
      rspec.spec.("controllers/#{m[1]}_controller"),
      rspec.spec.("acceptance/#{m[1]}")
    ]
  end

  # Rails config changes
  watch(rails.spec_helper)     { rspec.spec_dir }
  watch(rails.routes)          { "#{rspec.spec_dir}/routing" }
  watch(rails.app_controller)  { "#{rspec.spec_dir}/controllers" }

  # Capybara features specs
  watch(rails.view_dirs)     { |m| rspec.spec.("features/#{m[1]}") }

  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+)\.feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
    Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
  end
end

```

# 高速化

このままだと、Springが使われないので`spring`を追加して高速化する

修正前

```rb:Guardfile
guard :rspec, cmd: "bundle exec rspec" do
```

修正後

```rb:Guardfile
guard :rspec, cmd: "bundle exec spring rspec" do
```

# 実行

```bash
$ bundle exec guard
```
soundcloudでプライベートなtrackのsecret-tokenを取得する

なぜか HTTP API Reference には載ってなかったのでメモ

前提として実行環境はpython,アクセストークンは取得済みの状態とする。

```
まずは認証通っている確認
>>> me = client.get('/me')
>>> me.id
{id}

ok
```

[soundcloud HTTP API Reference tracks](https://developers.soundcloud.com/docs/api/reference#tracks) より抜粋

| Methods | Path | Description |
|:-----------|------------:|:------------:|
| GET, PUT|/tracks/{id}/secret-token |secret token of the track|

上記リファレンスにしたがって実行する

```
>>> track = client.get('/tracks/{private_track_id}/secret-token')
略
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found



```

エラーがでてしまう。

エラー内容を調べたり、そもそも指定している{private_track_id}が間違ってないか?など色々調べたあげく、山勘でいじってたら以下で偶然できた。

```
>>> track = client.get('/tracks/{private_track_id})
>>> print track.secret_token
>>> {secret_token}
```

HTTP API Reference以外のページにもしかしたら記載されているのかもしれないが、とりあえずよしとする。
Actionbarのmenuをクリックした時の画面遷移(to List Fragment)

ActionBarのmenuをクリックした時の動作ですが、何故かToastばっかりで、他がなかなかなかったので画面遷移でも入れてみます。
画面遷移もActivityばかりで、Fragmentが少ないので、よろしければ参考までに。

(アクションバーの設置の仕方は[こちら](http://qiita.com/kkkaaakkku/items/6106f3cd3444c9d405c8)を参考にしてみてください。)

設置したら、ここの```onOptionsItemSelected```ですね。

```
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        FragmentManager mFragmentManager = getActivity().getFragmentManager();
        switch (item.getItemId()) {
            case R.id.menu_home:
                Fragment aaaa = new AAAA();
                mFragmentManager.beginTransaction().replace(R.id.container, aaaa).commit();
        }
        return true;
    }
```

replaceのe(R.id.container, aaaa).commit();のcontainerの所で僕は少しハマってしまったので、動かない方は、replaceする場所を確かめてみるといいかもしれません。
AutoScalingGroupからインスタンスをデタッチするときは、残すインスタンスを各Availability Zoneに均等になるように行おう


##1.想定構成と今回やりたかった事

ごくごく当たり前の構成でのお話です。
ELB配下にWebサーバを並べ、Multi-AZ構成を取っています。
Webサーバは50台でした。

とある事情があり、これらのWebサーバをAutoScalingGroupからデタッチする必要がありました。

そのときに遭遇した事象を共有します。



##2.想定外①：デタッチ上限数 = 20台

AWSの仕様だと思いますが、`一度にデタッチできる上限は20台`だそうです。

Management Consoleで該当AutoScalingGroupの[Instances]を見ると、
1ページに20台表示され、ページングされてます。
結果的にはこれが上限値なんですね。

![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20150313/03_view-of-ASG.png)

##3.想定外②：AWSは、AZのインスタンス数偏りを自動補正する

一度に20台しかデタッチできないことがわかったので、
とりあえず20台-20台-10台でデタッチすればいいかと思い、まず20台のインスタンスをデタッチしようとしました。

すると、残った30台のインスタンスのうち、
<b>`何台か勝手にTerminateされ、Terminateされたインスタンス分、新規Launchされた`</b>のです。

正直これには焦りました。

<b>`AutoScalingGroupは、Multi-AZ構成を取っていた場合、それぞれのAZに存在するインスタンス数のバランスを取ろうとします。`</b>
つまり、<font color=red>20台デタッチした後の残りの30台のインスタンスのAZバランスが崩れてしまったため、その調整を行うために、AWSが自動的にTerminate - Launchした</font>のです。

例えば30台のバランスがAz-aが18台、AZ-cが-12台となった場合、AZ-aの3台をTerminateし、AZ-cに3台Launchする挙動をします。

![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20150313/02_after-detach-and-balancing.png)

厳密にこのような挙動を取るかどうかは未確認ですので、誤りあればご指摘ください。
CentOSにMEAN構築してみた


## 概要 
MEANとはアーキテクチャの一種で、以下のアプリケーションで構築されます。特徴として、データからクライアントまで全てJSONで扱えることがあげられます。
　MongoDB - データベース
　Express - MVCのWebアプリフレームワーク
　Angular - クライアントサイドJSフレームワーク
　Node    - サーバーサイドJS環境

今回は、社内ツールを作る際に、
 - 開発サーバーのリソース少ないし、railsほど重いものを動かしたくない
 - でもルーティングとかいい感じにやってほしい
 - MEANが流行り始めてるらしい
 - JSなら触ったことがあるし、言語から覚える必要はない
ってことでMEANを採用しました。

## 導入
今回はページを生成して、ユーザーとインタラクションをする必要がなかったので、angularはいれてません。

### Node

```
$ sudo su 
# curl -sL https://rpm.nodesource.com/setup | bash -
# yum install -y nodejs
```
### mongo

1 yumでインストール

```
cd /etc/yum.repos.d/
vi ./mongodb.repo
```

```:mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

```
yum install -y mongodb-org
```

2 パスを指定して、mongodを起動（デフォルトパスは/daba/dbなので、そこにディレクトリを掘れば、--dbpathオプションは不要）

```
mkdir -p /data/mongodb
mongod --dbpath /data/mongodb
```

3 mongodを常駐させる

```
chkconfig mongod on
service mongod start
```

### express

```
$ npm init
$ npm install express
```

## 起動
### サンプル作成
```js:app.js
var express = require('express');
var app = express();
 
//ルーティング設定
app.get('/', function (req, res) {
  res.send('Hello World');
});
 
//以下、ルーティング情報があればここに追記していく
 
app.listen(3000);
console.log('Server running at http://localhost:3000/');
```

参考: [Node.jsのMVCフレームワーク「Express」の基礎知識とインストール](http://www.atmarkit.co.jp/ait/articles/1503/04/news047.html)

### サーバー立ち上げ
```
$ node app.js
```

## 追加したモジュール
### mongoose
mongoにスキーマを定義したりできる
[mongoose](http://mongoosejs.com/index.html)
[Mongoose - デベロッパーズガイド 日本語訳](http://muddy-dixon.appspot.com/ja/mongoosejs/index.html)

### forever
nodeで立ち上げたプロセスを常駐させることができる
[node.js node.jsスクリプトをforeverでデーモン化する](http://onlineconsultant.jp/pukiwiki/?node.js%20node.js%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92forever%E3%81%A7%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%99%E3%82%8B)
コンディショナルコメント と 互換モード


## コンディショナルコメントとは

```
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="ja"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="ja"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="ja"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="ja"> <!--<![endif]-->
```

みたいなやつのことを言う。
ie だけ css でなんかしたいとか。処理わけたいとかそんな感じ。

##互換モード
互換モードというのは ie ブラウザに搭載されているモード。
ie8 で ie7 の仕様で見たいとか。
そんな需要で使われる。

##互換モード表示を切りたいとき

```
<meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'>
```
をつければ良い。というのが、一般的な結論。

## 互換モードしたときの ua の値って？

はい。まぁやってみればよいのだが、ieの ua には
`documentMode`なる値がある。

ie8 相当なら 8
ie7 相当なら 7

を返す。

```
<meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'>
```

というのは、 この `documentMode` をできうる最新の値(edge)にするということである(個人的な意見)。

## コンディショナルコメント と 互換モードの衝突

さて、では コンディショナルコメント の動きというのはなんなのだろうか？

実は、コンディショナルコメント は ie の `documentMode` によって分岐される。

つまり

```
<!DOCTYPE>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="ja"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="ja"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="ja"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="ja"> <!--<![endif]-->
<head>
	<meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'>
</head>
....

```

なんて記述があったとき()。
文書を上から読んでいるとおかしいことに気づく。

X-UA-Compatibl で `documentMode` を指定する前に、先に `documentMode` にアクセスしているということになる。

これには注意が必要である。なぜなら、X-UA-Compatibl で指定するまえに、 `documentMode` の値が固定されてしまうからである。

##結論
X-UA-Compatibl を指定しながらも、先方から「表示が崩れている」などの連絡を受けた場合は、コンディショナルコメントを一旦疑ってほしい。
Android の Chrome で開発者ツールを使う方法

スマホのサイト作っててPCブラウザのUA偽装じゃなくて実機で見たいってことはよくある。
実機で見ながらHTMLとかCSSをいじって確認したいと思ってスマホで開発者ツール的なのが無いかと探したらあった。

あったけど試したらうまくいかなくて紆余曲折して最終的に__めっちゃ簡単__だったのでメモ。

## やりたいこと
PCブラウザのChrome開発者ツールみたいなものをスマホのブラウザでもやる

## 環境
- PC: Windows 7 64bit
- PC 版 Chrome: ver. 41
- Android 端末: SO-03F / Android 4.4.2
- Android 版 Chrome: ver. 40

## 準備
- Android の USB デバッグを許可する
    - _設定 ＞ 開発者向けオプション ＞ USBデバッグ_ にチェック
    - 開発者向けオプションが表示されていなければ、 _設定 ＞ 端末情報 ＞ ビルド番号_ を連打して表示させる
- PC に [Google USB Driver](http://developer.android.com/sdk/win-usb.html) をインストールする
    - Windows の場合のみ必要らしい
    - Android 開発をしている人なら既に入ってるでしょう
    - SDK Manager があるならそこからもインストールできる

## 手順
1. PC と Android をUSBケーブルでつないで Android が USB デバッグモードになることを確認
    - Android 端末で許可を求められたら許可する
2. PC の Chrome のアドレスバーに以下を入力
    - `chrome://inspect/#devices`
3. _Devices_ の下にある _Discover USB devices_ にチェックを入れる
4. Android の Chrome でデバッグしたいページを開く
5. PC の Chrome に Android で表示しているサイトURLが表示され、下にある _inspect_ をクリックするとお馴染みの開発者ツールが表示される

![ChromeInspect.png](https://qiita-image-store.s3.amazonaws.com/0/57152/f6b7b6be-b475-be80-ad07-ef8f1b9ea770.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/57152/67677f5c-b283-85db-240f-e4e1886a97b3.png)

これでいつもの開発者ツールのようにデバッグ作業を行える。
_Elements_ では選択要素のハイライトもされる。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/57152/604ddb73-b314-eb4b-6929-4e060fc0c199.png)

_Elements_ だけでなく _Network_ や _Script_ のタブもあるので PC での作業となんら変わらず、2で開いたページでタブの切替えやリロード、新規タブを開くなどもできるので使い勝手も悪くない。（いまのところの所感）

これでスマホサイトのデバッグも捗りそうだ。
PC を使わないでスマホだけで出来る方法もあったらなぁ（機能は少なくてもいいけど）

## （おまけ）紆余曲折の内容
これをやるのに調査して見つかった方法はこの3つ
1. Android SDK で ADB コマンドを使う
2. PC の Chrome に[拡張機能](https://chrome.google.com/webstore/detail/adb/dpngiggdglpdnjdoaefidgiigpemgage)を入れる
3. Chrome の標準機能を使う

最初に1を見つけて SDK やら何やら入れてパスを通して・・・とやってはみたもののうまくいかず、開発者ツールらしきものは開いたがソースが表示されずに真っ白な画面になってしまった。
「Android の Chrome の _設定 ＞ デベロッパーツール ＞ USBウェブでバッグを有効化_ にチェックいれる」
という記事を見つけたものの、そもそもデベロッパーツールの項目がなかった。
（Android の 開発者向けオプションと同じなのか？ と思い色々連打したりもした笑）

そしてさらに調べた結果2と3を発見。
3が簡単そうだし試してみて成功したので2は試していない。

もしかしたら3のやり方ができたから1の方法はできなくなった（デベロッパーツールの項目も無くなった）のか？
RubyMineが起動できない

## 原因

RubyMineはデフォルトでJava6を必要してるらしんですが、それがないので起動できないということでした。次に２つの解決方法について書きます。解決策についてどちらの方がベターなのかは分かりません。どちらが良いのか分かる方がいたら教えてください。

## 解決策（１）

Appleがリリースしている[Java6仕様に基づいたJVM](https://support.apple.com/kb/DL1572?locale=en_US)をダウンロードする。

## 解決策（２）

`/Applications/RubyMine.app/Contents/Info.plist`を以下のように編集する：

```
<key>JVMVersion</key>
<string>1.6*</string>
```

↓

```
<key>JVMVersion</key>
<string>1.7*</string>
```

## 参照サイト

- [YosemiteでJetBrains IDEを動かす #jbugj](http://samuraism.com/2014/10/17/2555)
Elasticsearch無停止reindex


##使用する主な機能

http://www.elastic.co/guide/en/elasticsearch/guide/current/index-aliases.html

- aliasの指し先のatomicな変更
- aliasの指し先の取得

##手順（各indexについての処理）

###登場するalias

- write write用のalias
- read read用のalias

初期状態でwriteとreadは同じindexを指しているとする

1. old_index <- readの指すindex
2. new_index <- 新たに作成したindex
3. writeをold_indexからnew_indexを指すようにatomicに変更
4. 全てのデータをwriteに対してindexする
5. readをold_indexからnew_indexを指すようにatomicに変更

###aliasを2つ使用する理由

reindex中に新たなデータが入った時に新しいindexに反映させるため
xcode で cocos2dx のアプリ開発する導入


# <i class="fa fa-cube"></i> 環境

| | version  |
|:--|--:|
| Xcode | 6.2 |
| cocos2dx | 3.4 |
| osx | 10.9.5 |

* xcode と cocos2dx はインストール済みという前提

# <i class="fa fa-cube"></i> 雛形作成

cocos コマンドでアプリの雛形作る。
Jetって名前のアプリにした。

```
$ cocos new -l cpp -d ./ Jet
Running command: new
> Copy template into ~/Documents/repo/cocos2dx/Jet
> Copying cocos2d-x files...
> Rename project name from 'HelloCpp' to 'Jet'
> Replace the project name from 'HelloCpp' to 'Jet'
> Replace the project package name from 'org.cocos2dx.hellocpp' to 'org.cocos2dx.Jet'
> Replace the mac bundle id from 'org.cocos2dx.hellocpp' to 'org.cocos2dx.Jet'
> Replace the ios bundle id from 'org.cocos2dx.hellocpp' to 'org.cocos2dx.Jet'
```

動作確認する。

```
$ cd Jet
$ cocos run -p mac
```

ビルド後にHello Worldのアプリが起動すればOK

Xcode でアプリを開く

```
$ open proj.ios_mac/Jet.xcodeproj
```

# <i class="fa fa-cube"></i>  xcode の設定

## 警告の抑止


実行すれば動く。が、警告が35件もあるのが気に入らない。

![CCFontFNT_cpp.png](https://qiita-image-store.s3.amazonaws.com/0/18700/2e3931dc-e9e4-0266-05fb-4d692e68fc4f.png "CCFontFNT_cpp.png")

### xcodeprojの警告

環境と設定が合ってないので怒られてる。
クリックすると対応内容がでるのでそれに従う。

![Jet_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/18700/b7485751-922d-53f4-1c12-7e345dc44ea4.png "Jet_xcodeproj.png")

### libcocos2d iOS の警告

ライブラリの警告なのでまるっとムシする。

build setting の inhibit All Warnings を NO => YES に

![cocos2d_libs_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/18700/4468a7da-eae7-baa9-7c90-d645c4fdd597.png "cocos2d_libs_xcodeproj.png")
Laravel 4.2のテストフレームワークのチートシート

### phpunitのインストール

composer.jsonを開き、次を追加

```
	"require-dev": {
        "phpunit/phpunit": "4.5.*"
    },
```

phpunitを実行する際に

```
vendor/bin/phpunit
```

### app/config/localの初期設定を使う場合

1. TestCase.phpを開き
2. createApplicationメソッドの`$testEnvironment='local';`に設定


### リクエスト ＆ レスポンス

```
// リクエスト
$url = "http://api…….";  // もしくは $url = "path/to/somewhere";
$res = $this->call($method, $url)

// レスポンス
$jsonResponse = $res->getData(true)    jsonレスポンスはArraysとして返す
```

レスポンスオブジェクトのメソッド一覧

* getStatusCode()
* getContent()
* getData()
* getCharset()
* isOk()
* isForbidden()
* isNotFound()
* header
    * has()
    * get()
    * all()


### assert一覧

* assertTrue
* assertFalse
* assertEquals
* assertResponseOk
* assertJson


### 注意！！！

PHPUnitはリクエスト変数`$_SERVER,$_COOKIE,$_SESSION`が定義されていないので、使うのは控えた方が良い。もしやむ得ず使うことになった場合は、次のように手動で定義してください。

````
$_SERVER["REMOTE_ADDR"] = '127.0.0.1';
$_SERVER['SERVER_NAME'] ='PHP.UNIT.TEST';
$_SERVER['REQUEST_URI'] = 'PHPUNITTEST';
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['HTTP_USER_AGENT'] = 'PHPUNITTEST';
````
node.jsでサーバーを落とさずにデプロイする(naught編)

## モジュールのインストール
naughtというプロセス管理モジュールを使用するとサーバーを落とさずにデプロイすることが可能になります。
https://github.com/andrewrk/naught

グローバルでインストール
`$ sudo npm install -g naught`


## nodeサーバー用jsファイルを編集
naughtにworkerの開始と終了の通知を判別できるようにするために、サーバー用jsファイルのlistenを下記のように編集します。


```javascript:app.js
// Start server
server.listen(config.port, config.ip, function() {
  // Send online to naught
  if (process.send) {
    process.send('online');
  }
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

// Send shutdown to naught
process.on('message', function(message) {
  if (message === 'shutdown') {
    process.exit(0);
  }
});
```

## サーバーをworker化して起動
naught start [サーバー用js] でworkerを起動します。

```
$ sudo naught start app.js
Bootup. booting: 0, online: 0, dying: 0, new_online: 0
SpawnNew. booting: 1, online: 0, dying: 0, new_online: 0
NewOnline. booting: 0, online: 0, dying: 0, new_online: 1
workers online: 1
```
--daemon-mode オプションでdaemonとして起動するか指定できます。
(デフォルト: true)

--worker-count のオプションを付与するとworker数を指定できます。
(デフォルト: 0)

## サーバーを停止
停止はstopで

```
$ sudo naught stop
ShutdownOld. booting: 0, online: 0, dying: 1, new_online: 0
OldExit. booting: 0, online: 0, dying: 0, new_online: 0
```
--timeout オプションでセッションの強制タイムアウト時間を指定できます。
(デフォルト: none)

## デプロイ
deployコマンドでworkerの停止と再起動を行います。

```
$ sudo naught deploy
SpawnNew. booting: 1, online: 1, dying: 0, new_online: 0
NewOnline. booting: 0, online: 1, dying: 0, new_online: 1
ShutdownOld. booting: 0, online: 0, dying: 1, new_online: 1
OldExit. booting: 0, online: 0, dying: 0, new_online: 1
done
```
--timeout オプションでセッションの強制タイムアウト時間を指定できます。
(デフォルトはnone)
DESIGN SPRINT デザインスプリント

##DESIGN SPRINT デザインスプリント

5日間という短い期間で高速にデザインのプロトタイピングと検証を行う方法論（フレームワーク）

Googleの投資部門Google Ventures(GV)が、投資先で実践しているフレームワークを公開
http://www.gv.com/sprint/


##GVによるデザインスプリントの事例

Google Ventures(GV)が投資先のBLUE BOTTLE COFFEEに行ったデザインワークショップの記事
売り上げと滞在時間を約2倍にまで引き上げたという事例です

GV DESIGN　BLUE BOTTLE COFFEE
https://www.gv.com/design/blue-bottle/

(株)THE GUILDによる日本語記事
デザインスプリントとブルーボトルのプロトタイピング
http://labs.theguild.jp/?p=102#more-102
GoogleSpreadSheetでWebサイトのKPIを管理する


## 概要
GoogleSpreadSheetを使って、[こそだてハック](http://192abc.com/)のKPIを管理できるツールを作成してみました。
## 課題
月次で数字をみて、成長しているのはわかるけど、果たしてそのスピードが速いのか？遅いのか？何が原因で伸びたのか？などがわからない状態になっていました。

## 解決案
現状を把握して、目標を設定する。それを簡単にできるツールを作成する

## 要件
* サイトの現状を把握したい
* 現状と同じ成長速度だった場合、半年後にPV, UUなどの値はどうなるのか？などをシミュレーションしたい
* シミュレーションを行った結果を反映して、目標と実績の管理を行いたい

## 設計
以下の3つのスプレッドシートを作成した

### データソース
　シミュレーションや実績管理に必要なデータをまとめておく
　データの更新はアドオンやcsvデータのインポートだけでできるようにする

### シミュレーター
　データソースの値を参照して、グラフを描画し、シミュレーションをおこなう
　操作者がセルの値を変更すると、未来の値が変化するようにする

### 目標・実績管理
　目標値と実績値を管理する
　シミュレーターで予測した値を参考に目標値を設定する
　データソースを参照して、実績値を埋めていく

## 実装
### データソース
　[GoogleAnalyticsアドオン](https://developers.google.com/analytics/solutions/google-analytics-spreadsheet-add-on?hl=ja)を用いて、PV, UUなどのデータを自動で定期的に取得する
　analyticsで取れないデータは、データベースにSQLを発行し、必要なデータのcsvを取得する。「ファイル > インポート > 現在のシートを置き換える」

### シミュレーター
　[importrange関数](https://support.google.com/docs/answer/3093340)と[query関数](https://support.google.com/docs/answer/3093343)を駆使して、データソースからデータを参照する
　参考: [queryをimportrangeを使って別スプレッドシートのデータをフィルタリングする](http://qiita.com/vankobe/items/2af21d4b1c3afed5fa82)
　
### 目標・実績管理
　シミュレーション後の値をシートにまるっとコピー
　別シートでシミュレーター同様importrange, queryを用いて目標値と実績値を並べるようにする

## 運用
### 週次
データソースにデータベースのデータのcsvをインポートする

### 月次
目標と実績を確認する

### 四半期ごと
シミュレーションを行い、目標値を更新する

## まとめ
csvをアップロードするという定常業務ができてしまいましたが、実績管理工数が削減されました。
また、目標値（というより最低成長ライン）ができたことで、「今以上の成長」がどういうものなのか見える化できました。
収益もだいたい予測できるので、採用計画などにも役立ってます。

## 参考url
　https://support.google.com/docs/table/25273?hl=ja
Bootstrap3でStrutsタグライブラリは使えるのか？

今Bootstrap3とSeasar2を使ってWebページを作っています。
ずばり聞きます。
<br>
Bootstrap3でStrutsタグライブラリは使えるのでしょうか？
html:textタグなどです。
<br>
・質問の解答がわかる方
・またBootstrap3ではどういったタグだけが使えるか書いたサイトを知っている方
　がいらっしゃいましたら教えていただきたいと思います。
Live2DモデルファイルからパラメータID取得

通常、Live2DのパラメータIDはCubism Modelerで確認します
![01 2.png](https://qiita-image-store.s3.amazonaws.com/0/15028/91ce329d-0349-2221-5186-51d55ef4e59d.png)


このIDは新規に作ったり編集削除できるので、Live2Dモデルによってバラバラです。
Unity側でモデルファイルからパラメータIDを取得する方法がありました。
[APIリファレンス](http://doc.live2d.com/api/core/cpp1.0j/)にも書いてないので、デバッグしてたら取れましたw


```csharp:SimpleModel.cs
// モデル情報からパラメータIDを取得
var paramList = live2DModel.getModelImpl().getParamDefSet().getParamDefFloatList();
foreach (var item in paramList) {
    // モデルのパラメータIDを取得
    Debug.Log(item.getParamID().ToString());
}
```
これを実行するとこんな感じにパラメータIDが取れます。
今回はStart()の中に入れました。
![スクリーンショット 2015-03-13 13.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/15028/e3c938a0-8b2e-73ae-7ed7-7eddeb628947.png)


また、パラメータの現在の値をとるには以下のコードで取れます

```csharp:SimpleModel.cs
foreach(var item in paramList){
    // モデルのパラメータIDを値を取得
	Debug.Log(live2DModel.getParamFloat(item.getParamID().ToString()));
}
```

エディタ拡張すればモデルをスクリプトにセットするだけで、そのモデルが持ってるパラメータIDも表示できるかと。

あと、描画オブジェクトIDを取得したい場合は以下のコードで取れます。

```csharp:SimpleModel.cs
var dataList = live2DModel.getModelImpl().getPartsDataList();
foreach (var items in dataList) {
	for (int i = 0; i < items.getDrawData().Count-1; i++) {
		Debug.Log (items.getDrawData()[i].getDrawDataID().ToString());
	}
}
```
![DebugLog1.png](https://qiita-image-store.s3.amazonaws.com/0/15028/1dfd9924-bec4-5c6d-df7e-ee4e24856c98.png)

描画オブジェクトの頂点やインデックスを取るなら以下のコードでいけます。

```csharp:SimpleModel.cs
// 描画オブジェクトIDから描画インデックスを取得
var drawIndex = live2DModel.getDrawDataIndex("D_FACE_001.00");
// 頂点を取得
var points = live2DModel.getTransformedPoints(drawIndex);
Debug.Log ("---------- point_num:" + points.Length + " ----------");
var pointArray = new StringBuilder();
for (int i = 0; i < points.Length; i+=2) {
	pointArray.Append("x:" + points[i] + " y:" + points[i+1] + " ");
}
Debug.Log ("<color=blue>point:" + pointArray + "</color>");

// インデックスを取得
var indices = live2DModel.getIndexArray(drawIndex);
Debug.Log ("---------- index_num:" + indices.Length + "----------");
var indexArray = new StringBuilder();
for (int i = 0; i < indices.Length; i++) {
	indexArray.Append(indices[i] + ", ");
}
Debug.Log ("<color=red>index:" + indexArray + "</color>");
```
![DebugLog2.png](https://qiita-image-store.s3.amazonaws.com/0/15028/90e37916-8e41-40c6-eb0f-3a47142e48b6.png)


インデックスはStart()でいいけど頂点はOnRenderObject()やUpdate()に入れないと0が返ってきます。
参考：[Live2D Document - 頂点インデックスの取得](http://sites.cybernoids.jp/cubism2/sdk_tutorial/live2d_library/load_to_display/cd/ding-dianindekkusuno-qu-de)
ComposerコマンドからLaravelプロジェクトを作成した際のエラー


```
$ composer create-project laravel/laravel --prefer-dist
Installing laravel/laravel (v5.0.1)
  - Installing laravel/laravel (v5.0.1)
    Loading from cache

Created project in .
Loading composer repositories with package information
Installing dependencies (including require-dev)


                                                                                                                                      
  [RuntimeException]                                                                                                                  
  Could not load package dragonrun1/phpspec in http://packagist.org: [UnexpectedValueException] Could not parse version constraint ^  
  1.0.1: Invalid version string "^1.0.1"                                                                                              
                                                                                                                                      




                                                                              
  [UnexpectedValueException]                                                  
  Could not parse version constraint ^1.0.1: Invalid version string "^1.0.1"  
                                                                              


create-project [-s|--stability="..."] [--prefer-source] [--prefer-dist] [--repository-url="..."] [--dev] [--no-dev] [--no-plugins] [--no-custom-installers] [--no-scripts] [--no-progress] [--keep-vcs] [--no-install] [package] [directory] [version]
```

ComposerコマンドからLaravelプロジェクトを作成した際
上記のようなエラーが出た。

composerが古いのが原因のよう
アップデートすると解決した。

```
$ composer selfupdate
Updating to version d57187446151ef84b28cb9f6b3ed38cc2cffc597.
    Downloading: 100%         
Use composer self-update --rollback to return to version 1.0.0-alpha9
```

```
$ composer update
```
fail2banでslackに通知する

fail2banしたIPをSlackでだらだら流しておきます。ざっくりやってますのであしからず。。

###SlackのIncoming Webhookの設定をします。
設定方法はこちら参照してください。
https://api.slack.com/incoming-webhooks

※incoming webhook integration と書かれているリンクから設定ページへ飛べます。


###action.dに追加します。

```
vim /etc/fail2ban/action.d/slack.conf
```

```bash:slack.conf
[Definition]

actionban = curl -X POST --data-urlencode 'payload={"channel": "#channel_name", "username": "user_name", "text": "Fail2Ban Reports IP <ip> has been banned by  filter", "icon_emoji": ":ghost:"}' https://hooks.slack.com/services/XXXXXXXX/YYYYYY/ZZZZZZ

[Init]
```


###設定する

```
vim /etc/fail2ban/jail.local
```

actionに追記する

```bash:jail.local
action = iptables-multiport[name=404, port="http,https", protocol=tcp]
         slack[name=404]
```
5分で分かるSymfony2のValidation

[バリデーション | Symfony2日本語ドキュメント](http://docs.symfony.gr.jp/symfony2/book/validation.html)

の要約。

```php
class Author
{
    public $name;
}
```

バリデーション対象のエンティティクラスがあるとして

```yaml
# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
    properties:
        name:
            - NotBlank: ~
```

そのエンティティに対する[バリデーションルール](http://docs.symfony.gr.jp/symfony2/reference/constraints.html)を設定して

```php
$validator = $this->get('validator');
$errors = $validator->validate($author);
```

[Validator](http://api.symfony.com/master/Symfony/Component/Validator/Validator.html)の[validateメソッド](http://api.symfony.com/master/Symfony/Component/Validator/Validator.html#method_validate)を実行すると[ConstraintViolationList](http://api.symfony.com/master/Symfony/Component/Validator/ConstraintViolationList.html)が返ってくる。名前の通り[ConstraintViolation](http://api.symfony.com/master/Symfony/Component/Validator/ConstraintViolation.html)のlistなので

```php
foreach ($errors as $error) {
    echo $error->getMessage();
}
```

でエラーメッセージが取れる

# まとめ
ちゃんとしたIDEが手元にあるなら、このページをブラウザで開く必要はないのでIDEからAPIドキュメントを見よう
queryをimportrangeを使って別スプレッドシートのデータをフィルタリングする - GoogleSpreadSheet


| A | B |
|:-:|:-:|
| こそだて | 1 |
| kosodate | 2 |


## 同じスプレッドシート内のquery
同じスプレッドシートの場合、selectには列のアルファベットを指定します

```
=query("シート名!A2:B","select A, B where A = 'こそだて'")
```

## 別のスプレッドシート内のquery
別のスプレッドシートの場合は、importrangeを使ってデータを読み込み、selectにはCol1, Col2などの値を指定します

```
=query(importrange("スプレッドシートのid", "シート名!A2:B"), "select Col1, Col2 where Col1 = 'こそだて'")
```

## おまけ
### スプレッドシートのid

```
https://docs.google.com/.../spreadsheets/d/スプレッドシートのid/edit
```