OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript基礎02】配列

#はじめに
[前回](http://qiita.com/fantm21/items/b1bed462642098917d0f)同様、基礎のプログラムについてPCの中のプログラムを整理がてら紹介します。てか、紹介でもない...。
今回は配列について。

#配列
配列とは、複数の箱を持った変数で、配列を利用することで複数のデータとそのデータの順番を格納でき、順番を番号(インデックス)で表し、**0から始まり**、配列名[0]、配列名[1]、配列名[2]、...で示す。

##1.配列の宣言
配列の宣言->変数を作ること。

```js:
var 変数名 = new Array(x);
```

＊xは配列の大きさ。つまり用意する箱の数。

###例01）

```js:
var hoge = new Array(9);
```

これでhogeという配列ができ、その中に10個の値を格納(値を入れる)ことができる。

##配列へのデータの代入
配列に値を代入するには、変数と同様に[代入演算子 (Assignment operator) ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Assignment_Operators)を使って配列名の後ろでインデックスを指定する。

```js:
配列名[i] = 値;
```

＊文字も格納可能。
＊代入演算子とは、「＝」のこと。

###例02)

```js:
hoge = [0,2,10,30,40,28,9,10,30,2];
var _hoge = hoge[2];
```

これは_hogeという変数に配列であるhogeの2番目に格納されている値を_hogeに代入している。今回はその値は10である。また、配列する準備ができたら上記の例のように`hoge = [0,2,10,30,40,28,9,10,30,2];`という風にカンマで一区切りとされ、10個の値を前から順に格納できる。ただし、hogeに格納されている値は0番目からということを忘れずに。

##配列のデータの参照
配列に代入した値を参照するには、インデックスを指定して参照する。

###例03)

```js:
var _hoge2 = _hoge + 1;
var _hoge3 = hoge[3] + hoge[0];
var _hoge4 = hoge[5] + 1;
```
_hoge2には、例02で_hogeにhoge[2]を代入したので、_hogeは10である。よって、_hoge2は10+1の計算となるので11。
_hoge3は、hoge[3]とhoge[0]の足し算で、配列hogeに格納した3番目の数と0番目の数の足し算となるので、_hoge3は30+0を計算した結果30という値になる。
同様にして、_hoge4はhoge[5]に格納されている28+1なので29という値となる。

##グローバル変数とローカル変数

###グローバル変数とは
プログラムの全体で使える変数のこと。[グローバルコード](http://www23.atwiki.jp/sevenlives/pages/408.html)(HTMLのタグ外であり、関数の外にあるコード)で宣言するとグローバル変数となる。

###ローカル変数とは
関数内など限られた範囲でのみ有効な変数のこと。HTMLのタグ内、または関数内で宣言するとローカル変数となる。

###例04)

上記のグローバル変数とローカル変数は次の例で確認してほしい。

```html:hoge.html

<html>
    <head>
        <title>hoge</title>
        <script>
        /*--numberArrayとmax_numberがグローバル変数--*/
        var numberArray = new Array(10);    
        var max_number = 100;

        function testMethod(){
            /*--iとjがローカル変数--*/
            var i,j;
            for(i=0;i<10;i++){
                numberArray[i] = Math.random()%3;
                document.write((numberArray[i]+max_number)+"<br>");
            }
        }
        </script>
    </head>

    <body>
        <script>
            testMethod();    //関数の呼び出し
        </script>    
    </body>
</html>
```

この表示結果は

```code:
100.37061285902746
100.86192406388
100.2949768404942
100.13671321840957
100.30868708342314
100.09659432037733
100.48186643468216
100.15702182915993
100.29797119670548
100.85369600891136
```

となる。グローバル変数とローカル変数についてはもっと詳しく書かれた記事があったので[そちら](http://qiita.com/redamoon/items/4646a909ab234a64735c)の方でご確認ください。

参考記事：[スコープと命名規則について（グローバル変数とローカル変数）](http://qiita.com/redamoon/items/4646a909ab234a64735c)
Fragmentのアクションバーのタイトルの変え方

Fragmentを用いたアクションバーのタイトルをページ毎に変える方法

MainActivityに

```
public void setActionBarTitle(String title){
        getActionBar().setTitle(title);
    }
```

を記載する。

変更したいページのJavaクラスに@Overrideで以下を追加する。

```
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ((MainActivity)getActivity()).setActionBarTitle("タイトルの名前");

    }


【追記】
これでできますね。dekimasune.Mainの記述とか要らないかも。
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);

        getActivity().setTitle("AAAA");
    }
ホールデムの場を表現するJSON構造案

```js:json

/*
 * 用語
 * セッション：カードが配られてから、決着がついてポットの配分が決定するまでを指す単位
 */

var json = {
    // プレイヤー一覧
    "players":[
        // プレイヤーの情報。players内でのkeyは他のところでもプレイヤー指定のために使うことがある
        {
            "name":"test1",     // プレイヤー名
            "id":"ABC-001",     // プレイヤー識別ID
            "start_chip":1000,  // セッション開始時のチップ所持量
            "betting_chip":10,  // 既にベットしたチップ量
            "fold":1,           // 降りていれば1, まだ降りていなければ0
            "allin": 0,         // オールインしていれば1, オールインしていなければ0
            "hand":["7s","7h"], // ハンド。nullはjson受信者から見て不明
            "roll":0            // プレイヤーの位置。0：SB、1:BB、2〜n：ザガン〜ボタン
        },
        {"name":"test2", "id":"ABC-002","start_chip":300, "betting_chip":10, "fold":0, "allin": 0, "hand":null, "roll":1},
        {"name":"test3", "id":"ABC-003","start_chip":300, "betting_chip":30, "fold":0, "allin": 0, "hand":null, "roll":2},
        {"name":"test4", "id":"ABC-004","start_chip":300, "betting_chip":0, "fold":1, "allin": 0, "hand":null, "roll":3},
        {"name":"test5", "id":"ABC-005","start_chip":300, "betting_chip":0, "fold":1, "allin": 0, "hand":null, "roll":4}
    ],
    // ボード。常に5要素。まだ開いてないところはnullになる
    // As〜Kcまでのカード文字列
    "board" : [null,null,null,null,null],
    // アクションの履歴。0:プリフロップ、1:フロップ、2:ターン、3:リバー
    // 固定長4要素。まだおこなわれていないラウンドはnull
    "action" : [
        [
            // プレイヤーの行動履歴の配列。playersの要素番号と一致。
            // 数値はベットした量、F:フォールド
            // フォールド後にターンが回ってきてもnullを追加しない
            [10,"F"],
            [10],
            [30,30],
            ["F"],
            ["F"]
        ],
        null,
        null,
        null
    ],
    // このセッションの情報
    "session_info": {
        // 開始日時（ミリ秒）
        "start_date": "2000-01-01 00:00:00.123",
        // SB、BBのチップ量
        "stakes":[10,20],
        // レーキ情報
        // レーキがない場合はnull
        "rake": {
            "rate" :0.1,
            "cap": 10
        }
    },
    // 場の情報
    "state": {
        // ポット情報
        // 先頭がメインポット、２番目以降はサイドポット（発生順）
        "pot":[
            {
                // チップ量
                "chip":100,
                // このポットで勝負する権利のあるプレイヤー番号（playersの要素番号）
                "join":[0,1,2,3,4],
                // このポットの勝者。配列でプレイヤー番号（playersの要素番号）が入る。
                // まだ決定していない場合はnull
                "winner":[1]
            }
        ],
        // 現在のフェーズ
        "phase":{
            // 0:プリフロップ中、1:フロップ中、2:ターン中、3:リバー中、9:終了
            "round":0,
            // 同一ラウンド中の何周目か
            "lap":2,
            // 現在、アクションを要求されているプレイヤー番号（playersの要素番号）
            "roll":1,
            // 現在の状況でのベット下限（ラストベットと同額）
            "minimam":30
        }
    },
    // このJSONを受け取っている者が、プレイヤーとして認証されていない場合はnull
    "you" : {
        // プレイヤーのID
        "id": "ABC-000",
        // ハンドの内容
        "hand": ["7s","7h"]
    }
}

```
CodeIgniter内のPEARを使うようにパスを通す

[PEARのHTTP_Request2](http://qiita.com/takky/items/1c1f41eff2d5d7d1dd78)を使ってみる
でライブラリを作って自作APIを叩くようにして、batchでぐるぐる回そうとしたら、エラーがでた。
# エラー

```php
require_once 'mylib.php';
Class
～
$data = mylib::getdate();

～
```

で
PHP Fatal error: require_once(): Failed opening required 'Net/URL2.php' (include_path='.:/usr/local/lib/php:/php/includes:/usr/local/php-5.2.17/lib/php/) in /app/app_name/libraries/PEAR/HTTP/Request2.php on line xx

が出た。

# 対処

パスが通ってないのでパスを通してあげる。

例えばPEARのディレクトリを

```php
define ('PEAR_PATH', 'libraries/PEAR/');
```
としてあげて、

```php
set_include_path(get_include_path() . PATH_SEPARATOR . PEAR_PATH);
```
すればPEAR_PATHが通る。

get_incude_path() で現在のpathが取得できて、

PATH_SEPARATORで
Windows →;
それ以外 :
が取得できるので

現在のpath:PEAR_PATH
でPATHを通すことが出来る。
ElasticSearchのテンプレートで指定した型が今月だけ適用されなかった

まだ良く調べていないけど、起こった事象をメモ。

<code>logstash*</code>のインデックスにテンプレートによるマッピングを適用するように指定している。

毎月後半になると、クーロンで<code>logstash-yyyy.mm+1</code>という翌月分のインデックスを空の状態で作るようにしている。

今月3月以外、これまで10ヶ月ほどの間、毎月この仕組みで新しいindexが生成され、テンプレートによるマッピングが適用されていることは確実である。

また、2月の後半において、自動的に作成された空のインデックス<code>logstash-2015.03</code>が作成されていることは確認している。

だたし、その空のインデックス<code>logstash-2015.03</code>に、マッピングがきちんと適用されていたのかどうかは確認していない。

今月になって、kibanaが<code>logstash-2015.03</code>の解析についてエラーを報告してきた。

理由は、<code>response_time</code>の型違反だった。

見てみると<code>logstash-2015.03</code>のフィールド<code>response_time</code>の型が<code>String</code>になっていた。

適用されるハズのマッピングでは、<code>float</code>で定義されている。

その他、<code>logstash-2015.03</code>では、<code>@timestamp</code>を除く全てのフィールドについて、型が<code>String</code>になっており、こちらで指定した型や<code>not_analyzed</code>と言った属性も全て無視されていた。

復旧させるため<code>logstash-2015.03</code>を削除し、再作成してみたところ、今度は正常に型や属性がついたいつものインデックスが出来上がり、kibanaの解析も正常に行えるようになった。

今後なにか分かったら追記する（かもしれない）。
Windows 8.1 ProにvSphere Client 4.1をインストールする

Windows 8.1にvSphere Clientのv4.1をインストールしようとしたら、ちょっとした小細工が必要だったのでメモしておきます。

#手順
まずは通常通り、下記のURLからESXiサーバのWEB画面を開きます。

https://{サーバのIPアドレス}

するとこんな画面が開くので、[Download vSphere Client]のリンクをクリックして、vSphere Clientのインストーラーをダウンロードします。私の環境だと、「VMware-viclient-all-4.1.0-345043.exe」というファイルでした。

![image](https://qiita-image-store.s3.amazonaws.com/0/63849/6bdf7b24-7765-b2e4-a7be-410beb07cf1e.png)

その後、このインストーラーをそのまま実行してもインストールができない状態になってしまうので、そのインストーラーが7zipの自己解凍ファイルになっているので、適当なツール（私はCubeICEを使いました）で解凍します。
（ダブルクリックでも%TEMP%のどこかに解凍されるみたいですが場所を調べるのが面倒だったので）

解凍したフォルダ内のbin/VMware-viclient.exeファイルを右クリックして[プロパティ]を開きます。
プロパティダイアログが開いたら、[互換性]タブから下記のように設定を変更します。

* 互換モードでこのプログラムを実行する ⇒ チェックON、[Windows 7]を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/63849/4e79e195-f7be-4003-6932-7a054f96fe1d.png)

その設定をした後に、bin/VMware-viclient.exeを実行すると、ちゃんとvSphere Client 4.1をインストールできます。
あとはインストーラーにしたがってインストールを進めるだけです。

# 使ったソフト
CubeICE
http://www.cube-soft.jp/cubeice/
【メモ】Dropwizardアプリケーションのログあれこれ


# hibernateのログ出すぎ問題

## こーゆーログが大量に出ちゃう
```text
INFO  [2015-03-03 15:56:58,288] org.hibernate.engine.internal.StatisticalLoggingSessionEventListener: Session Metrics {
    55389 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    8034966 nanoseconds spent preparing 1 JDBC statements;
    2891678 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    4544906 nanoseconds spent executing 1 flushes (flushing a total of 1 entities and 0 collections);
    48126 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)
}
```

## とった方法

org.hibernate.engine.internalパッケージのログ出力レベルをWARNにしといた

```yaml
logging:
  loggers:
    "org.hibernate.engine.internal": WARN
  level: INFO
  appenders:
    - type: file
      currentLogFilename: /var/logs/hoge.log
      threshold: ALL
      archive: true
      archivedLogFilenamePattern: /var/logs/hoge.log.%d.gz
      archivedFileCount: 31
      timeZone: JST
#      logFormat: # TODO

```

# アクセスログ出したい問題

## 出せばいいと思う

```yaml

server:
  requestLog:
    timeZone: JST
    appenders:
      - type: file
        currentLogFilename: /var/logs/access-hoge.log
        threshold: ALL
        archive: true
        archivedLogFilenamePattern: /var/logs/access-hoge.log.%d.gz
        archivedFileCount: 31

```

```text:/var/logs/access-hoge.log
0:0:0:0:0:0:0:1 -  -  [03/3/2015:16:27:51 +0900] "DELETE /hoge/delete/1?hoge=abcdefg HTTP/1.1" 304 - "-" "curl/7.37.1" 6
```
PEARのHTTP_Request2を使ってみる

CodeIgniterでAPI用のライブラリを作成するときにHTTP_Request2を使ったのでまとめてみた。

# GETするだけ
サンプルコード

```php:http_request2_sample.php

require_once 'HTTP/Request2.php';
$url = 'http://allabout.co.jp';
$http_request = new HTTP_Request2();
$http_request->setUrl($url);
$http_request->setMethod(HTTP_Request2::METHOD_GET);
$ret = $http_request->send();
var_dump($ret);

```

* $http_request->setMethod でGET以外にもPOSTなども設定出来る。


# パラメータがある場合
```php:http_request2_sample2.php

require_once 'HTTP/Request2.php';
$url = 'http://allabout.co.jp';
$http_request = new HTTP_Request2();
$http_request->setUrl($url);
$http_request->setMethod(HTTP_Request2::METHOD_GET);
if(!empty($params)) {
    $param_url = $http_request->getUrl();
    $param_url->setQueryVariables(array(
             'package_name' => array('HTTP_Request2', 'Net_URL2')
                        ));
    $param_url->setQueryVariables($api_params);
    $http_request->setUrl($param_url);
}
$ret = $http_request->send();
var_dump($ret);

```

* 一回getUrlでsetしたURLを取得
* setQueryVariablesでパラメータをセット、
* パラメータをセットしたURLをセットしなおして、send

あくまで上記はサンプルなのでパス通したほうがいいかもしれない。
FuelPHPでSimplePieを使う

/composer.jsonに以下を追加


```lang:composer.json
"require": {
    ・・・
    "simplepie/simplepie": "1.3.1"
},
```
　


comporserアップデート
`php composer.phar update`
　
　
使用方法は以下のように

```lang:Controller
$feed = new SimplePie();
$feed->enable_cache(false);
$feed->set_feed_url('http://hoge.com');
$feed->init();
		
$data = [];
foreach ($feed->get_items() as $tmp) {
    $data[] = array(
        'title' => $tmp->get_title(),
        'url' => $tmp->get_link(),
        'site' => $tmp->get_feed()->get_title(),
        'created' => $tmp->get_date('Y-m-d'),
    );
}
```
Androidのアプリケーションデータを削除する

## はじめに

　コンシューマアプリだとあまり需要があるように思えませんが，アプリケーションからアプリケーションのデータを削除したいと思うことがたまにあります．
基本的にはAndroidの設定からアプリを選択してデータを消去するのと変わりませんが，例えば　ネットゲームでキャッシュが影響して不具合を起こしている場合，ユーザからの問い合わせに対してその手順を提供するよりも，アプリ内のヘルプ組み込んだ方がUXを向上できるかもしれません．

　はたまたAndroidで独自プラットフォームを開発している場合，エンドユーザにはAndroid標準の設定にアクセスしてもらいたくないかもしれません．

　そんなときにちょっとだけ手が届く「プログラムからアプリケーションのデータを削除」する方法の紹介です．

　なお，下で紹介するメソッドを呼び出すと，その瞬間アプリが終了します．
　実際にユーザに操作してもらう場合は「再起動します」などの案内を行い，呼び出す前にAlarmManagerなどで数秒後にアプリの起動処理も行うようにした方が良さそうです．

## Android 4.4（API Level 19）以上の場合

ActivityManager#clearApplicationUserData() を呼び出すだけです．
簡単ですね

```java

ActivityManager am = (ActivityManager) context.getSystemService(Service.ACTIVITY_SERVICE);
am.clearApplicationUserData();

```

## Android 4.4未満の場合

　ActivityManager#clearApplicationUserData()はAPI Level 19未満では呼び出せません．
　リフレクションを用いて ActivityManager#clearApplicationUserData() を呼び出します．
　しかし，clearApplicationUserData()の引数は Stringでパッケージ名と IPackageDataObserverなるインターフェースを渡す必要があります．
　このインターフェースは通常のSDKのみではリンクできないので，[Androidのリポジトリ](https://github.com/android/platform_frameworks_base/blob/android-wear-5.0.0_r1/core/java/android/content/pm/IPackageDataObserver.aidl) からAIDLをダウンロードし，ソースディレクトリに配置します．
プロジェクトをリビルドすると，genディレクトリに IPackageDataObserver.java というインターフェースが自動生成されます．

あとはリフレクションで呼び出すだけです．

```java

    IPackageDataObserver observer = new IPackageDataObserver() {
        @Override
        public IBinder asBinder() {
            return null;
        }

        @Override
        public void onRemoveCompleted(String packageName, boolean succeeded)
                throws RemoteException {
            Log.i(TAG, "application data cleared!");
        }
    };

    Method method = null;
    try {
        method = am.getClass().getMethod("clearApplicationUserData", String.class,
                IPackageDataObserver.class);
        method.invoke(am, context.getPackageName(), observer);
    } catch (Exception e) {
        Log.e(TAG, "Cannot reflection.", e);
    }

```

## 番外編：自分自身以外のアプリケーションのデータを消去したい場合

　上の方法はどれも自分自身のデータを消去する方法です．
　API Level 19以上でも，当然ですが他のアプリケーションのデータを消すことはできません．
　呼び出すメソッドは下と同じくリフレクションを用い，消去したいアプリケーションのパッケージ名を指定します．

　ただし，Systemと同じ権限（android.uid.system）を持ち，プラットフォーム署名が必要です．
　また， `<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>` のパーミッションを指定する必要があります．
MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.04

# VagrantのCentOS 6.5 仮想マシン(box）起動まで

MacOS X Yosemite で Heroku にアプリを公開するまでの環境構築を何回かに分けて書きます。

vol.01 [VirtualBox インストール編](http://qiita.com/hirolog/items/560ce489dce08f555876) 
vol.02 [Vagrant インストール編](http://qiita.com/hirolog/items/79c294da5225827f3f75)
vol.03 [Vagrant box作成編](http://qiita.com/hirolog/items/a57692eae892e7cdb6a7)

も合わせてお読み下さい。（というか、先にこの3つの操作が必要です）

## 仮想マシンの準備

まずは、マシンに box が入っているか確認しましょう。

```
vagrant box list
```

と叩けば、boxのリストが表示されます。
先ほど持ってきた centos65-x86_64-20140116 のようなものが存在してればOK。

仮想マシンを立ち上げて作業するディレクトリを作成、移動します。
ここでは myCentOS65 としますが皆さん自由に作成してください。

```
mkdir myCentOS65 ※名称は任意
cd myCentOS65 ※作成したディレクトリ名
```

Vagrantで仮想マシンを作成して、マシンを起動し、接続するには以下の3手順です。

1. Vagrant 初期化 (init)
2. 仮想マシン起動 (up)
3. 接続 (ssh)

初期化は一度だけ行えば以降は不要です。
起動(up)も立ち上げっぱなしにしておけば以降不要ではあるのだけど、けっこうバッテリーを喰うのとたまに挙動が怪しくなるので halt でマシンを落としてからの up と ssh はそこそこ使います。

### Vagrant 初期化 (init)

念のため pwd コマンドで作業ディレクトリにいることを確認（ここでは myCentOS65 にいればOK）。

```
vagrant init centos65-x86_64-20140116
```

[centos65-x86_64-20140116]というのは box名 なので、別名を付けてる人はご注意。
このコマンドはテキストファイルを作るだけなので一瞬で処理が終わります。
Vagrantfile というファイルが作成されればOKです。

Vagrantfile を修正しましょう。
慣れてる人は vim などそのままコマンド操作で良いのですが、不慣れな人は素直に Finder で Vagrantfile を探して、テキストエディタで修正の方がラクです。

テキストエディタで Vagrantfile を開いて修正です、メモリの割当量を増やすとか必須ではないけど環境によって必要な修正もあるのだけど、**ここでは Rails開発に必須** な修正のみ記載します。

Railsでの開発中に必要な3000番ポートにアクセスできるようにしておく。

```
  # config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "forwarded_port", guest: 3000, host: 3000
```

IPアドレスでアクセスできるようにしておく。

```
  # config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "private_network", ip: "192.168.33.10"
```

他には、Vagrantで立ち上げる仮想マシン内のフォルダと、Mac内のフォルダを同期・共有させる設定もできます。
これを設定しておくと仮想マシン内のファイルに Finder などで直接アクセスできるので、Macの使い慣れたIDE（開発環境）で直接編集などが可能です。
標準で 仮想マシンの/Vagrantディレクトリ と Mac側のVagrantfileがあるカレントディレクトリ が設定されてますが、変更したい場合は config.vm.synced_folder の指定を変更しましょう。

最小限、ポートとIPアドレスの設定をしておけばOKです。

### Vagrant 起動と接続

起動と接続はそれぞれ1コマンドなので一緒に記載。

```
vagrant up
vagrant ssh
```

vagrantというユーザで接続できればOK。
**パスワードも vagrant** なので覚えておきましょう。

仮想マシンから抜けるときは、素直に

```
exit
```

だけで Mac に戻ってきます。但し、当然ながら仮想マシンは動いたままです。
仮想マシン内で shutdown しても良いのですが、macに戻ってから

```
vagrant halt
```

すると仮想マシンの電源が落ちます。再度接続するときは **Vagrantfileがあるディレクトリに移動してから**

```
vagrant up
```

です。
この後、Railsアプリを制作できるようにサーバ設定していくのですが、長くなりそうなので今回はここまで。

Vagrantfile の修正によって色々とできる（問題が起きた時のヒントになる）ので、サーバの設定はこのファイルで行ってると覚えておきましょう。

### キーワード

* MacOS X
* VirtualBox
* Vagrant
* CentOS
* Ruby on Rails
* RVM (Ruby Version Manager)
* Heroku
Android Studio の Keymap を Eclipse に設定しても、 Eclipse とキーが違うショートカットまとめ

Android Studio の設定で Keymap を "Eclipse" に設定すると Eclipse のショートカットを基本的に使えます。

しかし、Eclipse の通りになっていないショートカットもあるので、まとめました。

貼った画像は Eclipse のものです。

# 次の警告・エラーへジャンプ
Eclipse の場合、次の警告やエラー（イエローやレッドの波線が出ている場所）へジャンプできます。
![n.gif](https://qiita-image-store.s3.amazonaws.com/0/44676/34aae301-08e4-4a68-6111-b0e744125ef8.gif)

<dl>
<dt>Eclipse</dt>
<dd>Ctrl + .</dd>
<dt>Android Studio</dt>
<dd>F2</dd>
<dd>Android Studio での名称は "Next Highligted Error"</dd>
<dd>エラーが発生している間は警告へジャンプすることができません。解消するとジャンプできるようになります</dd>
</dl>

# リファクタリング・クイック・メニューの表示
リファクタリングのメニューを表示させます
![m.jpg](https://qiita-image-store.s3.amazonaws.com/0/44676/5a68fe01-da49-2579-4f7d-0a745577bcf2.jpeg)

<dl>
<dt>Eclipse</dt>
<dd>Alt + Shift + t</dd>
<dt>Android Studio</dt>
<dd>Ctrl + Alt + Shift + t</dd>
<dd>Android Studio での名称は "Refactor This..."</dd>
</dl>

# 単語単位のカーソル移動・単語削除
キャメルケースの大文字・小文字の区切りを単語の区切りと認識してカーソル移動や単語削除をします。
Eclipse に限らず普通のテキストエディタでもよくありますね。
Android Studio はデフォルトではキャメルケースでの単語の区切りを、区切りとして認識してくれません。

<dl>
<dt>Eclipse</dt>
<dd>Ctrl + Left</dd>
<dd>Ctrl + Right</dd>
<dd>Ctrl + Bs</dd>
<dd>Ctrl + Del</dd>
<dt>Android Studio</dt>
<dd>なし</dd>
<dd>Keymap の設定画面にて "CamelHumps" で検索すると該当する操作が表示されます。それらに好みのキーを割り当てると使えます</dd>
<dd>IDE Settings -> Editor -> Smart Keys -> Use "CamelHump" words にチェック　でも使えるようになります</dd>
</dl>

# クイックフィックス
エラーの解決案を教えてくれます。
![n.gif](https://qiita-image-store.s3.amazonaws.com/0/44676/c70d5019-416d-dee8-2da5-9729e3dbb9fb.gif)

<dl>
<dt>Eclipse</dt>
<dd>Ctrl + 1</dd>
<dt>Android Studio</dt>
<dd>Alt + Enter</dd>
<dd>Android Studio での名称は "Show Intention Actions"</dd>
<dd>Typo を自動検知して修正はできません（Strong を String に修正など）</dd>
</dl>

# クイックアシスト
変数のリネームとかローカル変数として抽出とかのメニューを出してくれるやつです。
![m.jpg](https://qiita-image-store.s3.amazonaws.com/0/44676/5a23d5a7-d88e-db46-d968-d5b9c1e4f7d6.jpeg)

<dl>
<dt>Eclipse</dt>
<dd>Ctrl + 2</dd>
<dt>Android Studio</dt>
<dd>Ctrl + Alt + Shift + t</dd>
<dd>Android Studio での名称は "Refactor This..."</dd>
<dd>これでメニューを開いたあとで、番号でメニューを選んだり、メニューをインクメンタル検索で絞り込んだりします</dd>
</dl>

# ブロック選択モード
矩形選択です。
![n.gif](https://qiita-image-store.s3.amazonaws.com/0/44676/b9dfbb6b-99ea-cd7e-4ba9-79ad138f7c2e.gif)

<dl>
<dt>Eclipse</dt>
<dd>Alt + Shift + a</dd>
<dt>Android Studio</dt>
<dd>Alt + Shift + Insert</dd>
<dd>Android Studio での名称は "Column Selection Mode"</dd>
</dl>

# フィールドの呼び出し階層を開く
Eclipse であれば Ctrl + Alt + h でフィールドの呼び出し階層を開けます。

<dl>
<dt>Eclipse</dt>
<dd>Ctrl + Alt + h</dd>
<dt>Android Studio</dt>
<dd>Ctrl + g</dd>
<dd>Android Studio での名称は "Find Usages"</dd>
<dd>Eclipse における Ctrl + Shift + g と同じです</dd>
<dd>単に検索するだけで、呼び出し階層にはなりません。不便です</dd>
</dl>

# 感想
Android Studio でそのまま使えないものが意外とありました。

Android Studio もショートカットキーを自分で設定できます。
自力で Eclipse と同じに変更すれば、より Eclipse に近い操作で Android Studio を使えます。

\* Android Studio のものとして書いたショートカットキーは、Keymap を Eclipse に設定した時のものです。デフォルトとは異なるものもあります。
GithubのLGTMでひな祭りを祝いましょう( ˘ω˘)

`:+1:`:+1:ばかりだと飽きるので、

今日はこれで

```
:dolls:
```

:dolls:

桜も咲かせてみましょう。

```
:cherry_blossom: :dolls: :cherry_blossom: 
```

:cherry_blossom: :dolls: :cherry_blossom: 


もっといいのがあればコメント欄で教えてください〜
Mac clean install からのHomebrew install



自分の備忘録として書いた俺得用です


Macをclean installした。2014/12/1
     Mac OS X ver 10.9.5
     ruby ver 2.0.0p481


zsh使いたいのでshellをzshに変更

zshのpathを調べる

	$which zsh
	/bin/zsh

bashからzshに変更

	$chsh -s /bin/zsh

これでログインシェルがzshに変わる

次にhomebrewのinstall

もしxcodeでcommand line toolをinstallしてない場合は先にする。

rubyが入ってることを確認して、次のコマンドからhomebrewをinstallする

	$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

10分ぐらいで終わった

brew doctorでhomebewに問題がないか調べる
clean install後によけいなもの入れてなければ問題はないはず

	% brew doctor

Your system is ready to brew.

そんでもって一応update。たぶん最新だろうけど。

	$brew update

Already up-to-date
すでに最新なら「Already up-to-date」っていわれる。これで一安心。
mysqlの疎通確認(ログイン確認)

MySQLが入ったサーバへの疎通確認を取りたい時の確認方法メモ


###リモートホストのmysqlにユーザとパスワードを指定してログインする
---
```bash
mysql -h xxx.xxx.xxx.xxx -u hoge -p fuga
```
上記コマンドでログイン出来たらOK

### mysqladminコマンドを使って疎通確認をする
---
```bash
mysqladmin ping -h xxx.xxx.xxx.xxx -u hoge -p fuga
```
ユーザとパスワードの指定はオプションだが、パスワードが設定されていて疎通がとれた時に`Access denied`のエラーが出る。
本来はMySQLの起動を確認するコマンドのようだが、疎通取るならこれでもよさそう。

```bash
> mysqld is alive
```
ちなみに疎通が取れる(MySQLが起動していてパスワード等の指定も合っている)と上記のような結果が表示される。

###最後に
---
上記コマンドで疎通確認は取れますが、この段階で権限確認は取れてないので、

```sql
> select Host, User from mysql.user where Host = 'hoge'
```
などで確認してください。

(あくまで個人的な感想ですが)
権限確認も加えて個別にするなら前者を使うとその後の作業がスムーズに出来るかもしれません。
確実に権限が入っていることが予めわかっているならば後者を使えば毎回MySQLから出る手間がなく楽に確認が出来ました。
StumpWMで設定ファイルをreloadする

i3wmを使っていたがどうも拡張性に欠ける気がするので他のWMに乗り換えようと思って試行錯誤中ですが、stumpwmで設定ファイルをリロードする方法をいつも忘れるのでメモ。  

    C-t ;

してコマンド入力のアレを呼び出して

    loadrc

する。
FreeBSDのurxvtで□とかの文字幅が変なのをどうにかする

FreeBSDでurxvt使ってるけど、全角の記号（□■○●◇◆など）が半角の文字幅で表示されてキモかった。
いわゆる East Asian Ambiguous Character Width とか略して EAW とか言われる問題で、噂によるとurxvt的にはlocaleが示す幅を尊重するからurxvt側でそれを勝手に2バイト幅に直して表示とかはしないぜ！って事になってるらしい。

まあ経緯とか細かい実装の話はさておき、localeの側が全角記号を2バイト幅ですよって言うようにしてやればよろしいみたい。

FreeBSDのロケールの設定は、`/usr/share/locale/` の下に保存されてて、ここの `./ロケール名/LC_CTYPE` が今回直したい部分。
こいつはバイナリファイルで、 `/usr/src/share/mklocale/` の下にある .src ファイルを mklocale コマンドでコンパイルした物がそれにあたるっぽい。

`/usr/share/locale/ja_JP.UTF-8/LC_CTYPE` は `/usr/share/locale/UTF-8/LC_CTYPE` にシンボリックリンクを貼ってるので、今回はそうするのをやめて ja_JP.UTF-8 専用に LC_CTYPE を作るように直してみる。

まずは src ファイルを書かないといけないんだけど、書くのがめんどくさい。探してみたらmutt-jaのリポジトリに良さげなのが置いてあったのでそいつを使う。

```
$ wget http://sourceforge.jp/projects/mutt-j/scm/svn/blobs/146/mutt-ja-doc/trunk/samples/UTF-9.src?export=raw -O ja_JP.UTF-8.src
```
こいつを `/usr/src/share/mklocale/` にコピーする。

```
$ sudo cp ja_JP.UTF-8.src /usr/src/share/mklocale/
```

んであとは `/usr/src/share/mklocale/Makefile` を編集。

```diff

--- share/mklocale/Makefile     (リビジョン 275347)
+++ share/mklocale/Makefile     (作業コピー)
@@ -8,6 +8,7 @@
                hi_IN.ISCII-DEV \
                hy_AM.ARMSCII-8 \
                ja_JP.SJIS \
+           ja_JP.UTF-8 \
                ja_JP.eucJP \
                kk_KZ.PT154 \
                ko_KR.CP949 \
@@ -82,7 +83,7 @@
                en_AU en_CA en_GB en_IE en_NZ en_US es_ES et_EE eu_ES fi_FI \
                fr_BE \
                fr_CA fr_CH fr_FR he_IL hr_HR hu_HU hy_AM is_IS it_CH it_IT \
-               ja_JP kk_KZ ko_KR lt_LT lv_LV mn_MN \
+               kk_KZ ko_KR lt_LT lv_LV mn_MN \
                nb_NO nl_BE nl_NL nn_NO no_NO pl_PL pt_BR pt_PT \
                ro_RO ru_RU sk_SK sl_SI sr_YU sv_SE tr_TR uk_UA zh_CN zh_HK \
                zh_TW
```

あとはビルドするだけ。

```
$ cd /usr/src/share/mklocale/
$ sudo make
$ sudo make install
```

うまくいくと、`/usr/src/share/mklocale/LC_CTYPE` がシンボリックリンクじゃなくなって実ファイルになってる。

で、あとは X の再起動とかすれば2バイト幅で綺麗に表示されるようになってるはず。やったね！
名前空間あれこれ


::で指定するとエイリアスのほうを参照する。

```cs:名前空間のテスト
using System;
using alpha = Alpha;
using beta = alpha;

class Test {
	public Test() {
		Console.WriteLine("global Test");
	}
}

namespace alpha {
	class Test {
		public Test ()
		{
			Console.WriteLine ("alpha Test");
		}
	}
}

namespace Alpha {
	class Test {
		public Test() {
			Console.WriteLine("Alpha Test");
		}
	}
}

class NSTest {
	static void Main() {
		global::Test t1 = new global::Test ();
		alpha::Test t2 = new alpha::Test ();
		beta::Test t3 = new beta::Test ();
		Alpha.Test t4 = new Alpha.Test ();
	}
}
```

```txt:実行結果
global Test
Alpha Test
alpha Test
Alpha Test
```
【メモ】Dropwizardで@PrePersistと@PreUpdateが使えない？

普通に無視されるっぽい

[元ネタのstackoverflow](http://stackoverflow.com/questions/28310907/automatically-updating-created-updated-date-field-on-the-entity-in-dropwizard-hi)

なんか上記stavkoverflowによると登録(更新)時に呼び出すイベントリスナー作って登録しておけば大丈夫的なこと書いてあるけど、めんどくさいので普通に毎回セッターからセットします。
ken_all.lzh の配布が終了していた件

なんかエラーが起きてるなー、と思ったら lzh 形式での配布が終了していたようです。
時の流れを思わずにはいられません。

> <お知らせ>
> 
> 郵便番号データダウンロードにおいて提供しているlzh形式ファイルにつきましては、データ配信を終了いたしました。
> 引き続きご利用の際は、お手数ですがzip形式ファイルをダウンロードしていただけますようお願いします。
> 
> 平成27年2月27日更新
http://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html

ken_all.zip は引き続き配布されているのでそちらを使いましょう。
というか 2015 年ですし [embulk](https://github.com/embulk/embulk) とかで何とかしていけたらいいですね。
Spark FrameworkをGroovyで動かす

「<a href="http://sparkjava.com/">Spark</a>」はJavaで書かれたSinatraライクなWebフレームワーク。
Java8で導入されたラムダ式を取り入れてシンプルな記述でサービスが作成できる。

Groovyのクロージャを、ラムダ式が期待される部分に当て嵌めたところ、期待通りに動いたのでここに記録する。

- Gradle 2.3
- Java 1.8.0_11
- Groovy 2.4.1

```bash:初期設定
$ mkdir SparkGroovyExample
$ cd SparkGroovyExample
$ gradle init --type groovy-library
```

build.gradleを編集。
dependenciesにsparkを追加。
"gradlew run"が使いたかったので、applicationプラグインを追加し、mainClassNameを指定している。

```groovy:build.gradle
apply plugin: 'groovy'
apply plugin: 'application'

mainClassName = 'ExampleService' // パッケージ名も必要に応じて指定 foo.bar.ExampleService等

repositories {
    jcenter()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.0'

    testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
    testCompile 'junit:junit:4.12'

    compile 'com.sparkjava:spark-core:2.1'
}
```

build.gradleの、mainClassNameで指定したクラスにmainメソッドを記述する。

```groovy:ExampleService.groovy
import static spark.Spark.*
import groovy.json.JsonBuilder

class ExampleService {
    public static void main(String[] args) {

        Object.metaClass.asJson = {
            def builder = new JsonBuilder(delegate);
            builder.toString()
        }

        def obj = new A();

        def map = [:]
        map['foo'] = 'Hello!!!'
        map['bar'] = [1, 2, 3]
        map['boo'] = ['hoge' : 'aaa', 'fuga' : [1, 2, ['obj':obj]]]

        get('/obj', { req, res -> obj.asJson() })
        get('/map', { req, res -> map.asJson() })

    }
}

```

MapとObjectでJSONシリアライズの様子を確認するために適当なクラスを定義。

```groovy:A.groovy
class A {
    def x = 1
    def y = 'qwerty'
    def z = ['a':1, 'b': [111, 222, 333]]
}

```

実行。

```bash:実行
$ ./gradlew run

:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
[Thread-1] INFO spark.webserver.SparkServer - == Spark has ignited ...
[Thread-1] INFO spark.webserver.SparkServer - >> Listening on 0.0.0.0:4567
[Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.0.2.v20130417
[Thread-1] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@4a92881d{HTTP/1.1}{0.0.0.0:4567}
> Building 80% > :run
```

Webブラウザなどから、http://localhost:4567/obj 、http://localhost:4567/map にリクエスト。


```text:レスポンス1
http://localhost:4567/obj

{"z":{"a":1,"b":[111,222,333]},"y":"qwerty","x":1}
```

```text:レスポンス2
http://localhost:4567/map

{"foo":"Hello!!!","bar":[1,2,3],"boo":{"hoge":"aaa","fuga":[1,2,{"obj":{"z":{"a":1,"b":[111,222,333]},"y":"qwerty","x":1}}]}}
```

クロージャの振る舞い、JSONの返り値は期待通り。
ゴテゴテした記述がなく、サックリ動いたのは好印象。
【デザインパターン】Abstract Factoryパターン

##概要
互いに関連するオブジェクト群を生成するための抽象化されたインターフェイスをクライアントに提供するパターン

以下の4種類のクラスからなる
1. Abstract Factoryクラス(関連するオブジェクト群を生成するためのインターフェイスを宣言)
2. Concrete Factoryクラス(関連するオブジェクト群の生成を実装する)
3. Abstract Productクラス(個々のオブジェクトを生成するためのインターフェイスを宣言)
4. Concrete Productクラス(個々のオブジェクトの生成を実装する)

##具体例と実装
乗り物工場を例にすると、

上記1~4はそれぞれ

1. 乗り物工場クラス(VehicleFacrtoryクラス)
2. 自動車工場クラス、自転車工場クラス(CarFactoryクラス、BicyclFactoryクラス)
3. タイヤクラス、車体クラス(Wheelクラス、Bodyクラス)
4. 自転車用タイヤクラス、車用タイヤクラス、自転車車体クラス、車車体クラス(CarWheel,BicycleWheel,CarBody,BicycleBodyクラス)

が対応する。
コードの詳細は以下

```rb:vehicle_factory.rb
class VehicleFacrtory
  def create_vehicle
    create_body
    create_wheel
  end

  private

  def create_body
  end

  def create_wheel
  end
end
```

```rb:car_factory.rb
class CarFactory < VehicleFacrtory
  def create_body
    return CarBody.new
  end

  def create_wheel
    return CarWheel.new
  end
end
```

```rb:bicycle_factory.rb
class BicyclFactory < VehicleFacrtory
  def create_body
    return BicycleBody.new
  end

  def create_wheel
    return BicycleWheel.new
  end
end
end
```

```rb:body.rb
class Body
  def initialize
  end
end
```

```rb:wheel.rb
class Wheel
  def initialize
  end
end
```

```rb:car_body.rb
class CarBody
  def initialize
  end
end
```

```rb:car_wheel.rb
class CarWheel
  def initialize
  end
end
```
```rb:bicycle_body.rb
class BicycleBody
  def initialize
  end
end
```

```rb:bicycle_wheel.rb
class BicycleWheel
  def initialize
  end
end
```

クライアントコード

```rb:client.rb
car_factory = CarFactory.new()
car = car_factory.create_vehicle

bicycle_factory = BicycleFactory.new()
bicycle = bicycle_factory.create_vehicle
```

##メリット
* 作成するオブジェクトを入れ替えるのが容易
* オブジェクト間の無矛盾性を担保できる

##まとめ
利用するオブジェクトの整合性を保ちたいときに便利なパターン
MacのrbenvでRubiniusをインストールする


RubiniusはApple LLVMではコンパイルできないので、Homebrewで純正LLVMを入れます。オプション付けないとclang,clang++が入らないので注意。

```shell
brew install llvm --with-clang
```

現在のRuby環境にRubiniusをコンパイルするためのサポートツールをインストール。

```shell
gem install rubinius-melbourne
```

Homebrewで入れたLLVMはApple LLVMと被らないようになっているのでその点を考慮して`rbenv install`。

```shell
LDFLAGS=-L/usr/local/opt/llvm/lib \
CPPFLAGS=-I/usr/local/opt/llvm/include \
CC=/usr/local/opt/llvm/bin/clang \
CXX=/usr/local/opt/llvm/bin/clang++ \
rbenv install -v rbx-2.5.2
```

#### おまけ1
Rails 4.2.0をインストールしようとするとbyebugを入れる辺りで止まるので、他のRubyで`rails new`してから

```ruby:Gemfile
gem 'byebug', platforms: :mri
```

に変更して再`bundle`するか、対応済みの4.2.1-pre以上を入れよう。

#### おまけ2
Homebrewでrbenv-default-gemsを入れてる時は注意な。パスは`/usr/local/opt/rbenv/default-gems`だぞ！（4回失敗した）
slackのアップロード用APIをpythonから叩いて画像アップロード

前提
アクセストークンは手動、もしくはmechanize等を利用して取得済みとする。
通信ライブラリはrequestsを使用する

```
with open("FILE_PATH",'rb') as f:
	param = {'token':access_token, 'channels':CHANNEL_ID,'title':'タイトル'}
	r = requests.post("https://slack.com/api/files.upload", params=param,files={'file':f})
```

CHANNEL_IDは各チャンネルのタイトルクリックして`Add a servive integration...` に飛ぶとURLパラメータにidがあるのでそれを利用する。

参考 https://github.com/os/slacker/blob/master/slacker/__init__.py
Railsで1対nでjoinsした列の値をとりたい


## テーブル構成
1. Category …カテゴリマスタ
 - name …カテゴリ名
2. Word …ワードマスタ
 - name …ワード名
3. CategoryWord…ワードがどのカテゴリに紐づくのか保持
 - category_id
 - word_id

## n+1問題
[n+1問題とは](http://ruby-rails.hatenadiary.com/entry/20141108/1415418367)

アソシエーションが作成されてあってCategoryWordからCategoryの名称を取る場合は以下の通りになるかと

```ruby:CategoryWord
def self.get_first_category_name
  CategoryWord.first.category.name  
end
```

ただしこの場合だとCategoryWordの件数分、CategoryモデルにもSELECT分が実行されるため、
n(CategoryWordの件数分のCategoryモデルの参照) + 1(CategoryWordモデルへの参照)が起きてしまいます。
そのため、本来SQLで行っているような結合を明示的に行う必要があります。

## やりかた
ActiveRecordクラスに存在するattributesメソッドを使い、結合先のカラムを取得する。

```ruby:CategoryWord
def self.get_first_category_name
  CategoryWord.joins(:category).select("categories.name").first.attributes
end
```

n+1問題で困るのは大体allとかwhereで取得したレコードに対してeachでぐるぐるまわすパターンなので、それはいかになります。

```ruby:CategoryWord.each
CategoryWord.joins(:category).select("categories.name").each do |cat|
  p val.attributes["name"]
end
```
こんな感じで全件取得済のマスタの名称を取ってループ中でごにょごにょやったりします。
といってもめっちゃかっこわるいんで他に良いやりかたあるよーってのがあったら教えてください。
DOM Distillerを試してみる

## 概要

Google Chrome で DOM Distiller という機能が実装されました。
[DOM Distiller now available for all channels of Chrome, mobile included](http://www.talkandroid.com/238538-dom-distiller-now-available-for-all-channels-of-chrome-mobile-included/)

Pocket (Read It Later) や Instapaper のように、ウェブページの主なコンテンツ部分だけを抽出して見せる機能です。実際の動かし方で日本語情報がパッと見つからなかったので、簡単にまとめます。

## やってみる

まずはターミナルから、 --enable-dom-distiller オプション付きで起動します。なんとなくですが Canary Build を実行しています。

```lang:console
$ /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --enable-dom-distiller 
```

![2015.0303 dom distiller.png](https://qiita-image-store.s3.amazonaws.com/0/15769/185fbae9-61ba-bd8c-24b1-f4aa90e161ae.png)


続いてツールバーからページを抽出をクリック。
![2015.0303 dom distiller3.png.png](https://qiita-image-store.s3.amazonaws.com/0/15769/da349552-fb31-dadc-5d52-324fe4938ed8.png)


これで DOM Distiller が実行されました。
![2015.0303 dom distiller4.png](https://qiita-image-store.s3.amazonaws.com/0/15769/707e003b-3f08-6e35-835f-be9819c87a97.png)

広告やらヘッダタブやらが消えて、記事の中身だけが表示されていますね。

## 後記

あれ、Google さんのブラウザなのにこんなワイルドなことしていいの？という気もしますが、ad blocker 的な extension も Store に登録されていることですし、そこはフレキシブルに対応していくということでしょうか。そのうち標準搭載されることにはなりそうですね。
【Ideone】chromeでjavascriptを使うときは、Node.jsで実行する

3月2日、CodeIQで解いた問題のフィードバックが来ました。そこには、「プログラムとしては合っているけど、Ideoneではエラーになってしまったので不合格」というメッセージが書いてありました。Ideoneとは何なのでしょうか？また、プログラムが合っているのにエラーとは何なのでしょうか？調べてみました。

##Ideoneとは
Ideoneは、環境環境を用意することなくネット上で書いたプログラムを実行できるWEBサービスです。javascriptは、PCとメモ帳があれば開発環境が整いますが、phpなどはPCに必要なツールをダウンロードしないと開発環境が整いません。<br>
しかし、Ideoneは、これらの手間を省きプログラムを実行することができるのがポイントです。URLが生成されるので、第三者に見られても良いコードに限るといった注意点については、[Ideoneの使い方](http://qiita.com/saltheads/items/52e5080d60f21f52be6e)をご覧ください。

##なぜ、IdeoneでJavaScriptがエラーになったのか？
それは、僕がchoromeを使っているにも関わらず、Ideone上で実行するときのコードの種類をjavascript(rhino)、あるいはJavaScript(spidermonkey)を選択していたからでした。実は、プログラムはブラウザなどの実行環境に影響を受けるんだそう。そして、ブラウザによってJavaScriptの種類が違うということも知りました。

クロノス・クラウン代表　柳井 政和さん
> rhinoはJavaで記述され、Mozilla Foundationで管理配布されています。spidermonkeyは同じ Mozilla FoundationでC実装です。これらは、FirefoxやJavaを利用した環境で使われます。
>ChromeはV8で、これはnode.jsにも利用されています。IEでは、また違うエンジンです。


こうして、chromeはnode.jsと関連があるということがわかりました。chromeにFirefoxのJavaScriptを指定していたら、エラーが起きるはずです。そして、chromeとnode.jsで、無事にプログラムを実行することができました。

##まとめ
JavaScriptでも実行環境によって、動作が違ってくることを初めて知りました。他のブラウザでは確認してないですが、chromeでJavaScriptを使うときは、Node.jsを使うと正常動作することを紹介しました。

参考サイト
[Ideoneの使い方 Tbpgr Blog](http://t.co/qAcT2XEWRw)
[Ideoneの使い方 Qiita](http://qiita.com/saltheads/items/52e5080d60f21f52be6e)
cocos2d-xで自動スリープを禁止する

cocos2d-x v3.x で使えるようになった、`cocos2d::Device::setKeepScreenOn(bool value)` を呼ぶだけ


[setKeepScreenOn method #7824 - cocos2d/cocos2d-x](https://github.com/cocos2d/cocos2d-x/pull/7824)


実装は↑見ればわかるけど、よく使うiOSとAndroidは以下の様になってた

- iOS向け実装 (cocos2d/cocos/platform/ios/CCDevice-ios.mm)

```cpp
void Device::setKeepScreenOn(bool value)
{
    [[UIApplication sharedApplication] setIdleTimerDisabled:(BOOL)value];
}
```

- Android向け実装 (cocos2d/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java)

```java
    public void setKeepScreenOn(boolean value) {
        final boolean newValue = value;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mGLSurfaceView.setKeepScreenOn(newValue);
            }
        });
    }
```
WPFのListViewコントロールのヘッダーをサイズに自動追従させる

ListViewヘッダーのカラムサイズは、指定することは出来てもコントロールのリサイズに追従させることはできません。
そのためリストの右に空白のカラムが表示されて残念な見た目になってしまいます。
Behaviorを作成して、コントロールのリサイズに追従するようにしてみました。
AutoResizeColumnsNumberは、リサイズ時にサイズが変化するカラムです。他のカラムは変化しません。

```csharp:ListViewHeaderAutoResizeBehavior.cs
public class ListViewHeaderAutoResizeBehavior : Behavior<ListView>
{
  public int AutoResizeColumnsNumber { get;  set; }

  protected sealed override void OnAttached()
  {
    base.OnAttached();
    ListView hostControl = (ListView)this.AssociatedObject;

    hostControl.Loaded += Loaded;
    hostControl.SizeChanged += SizeChanged;
  }

  protected sealed override void OnDetaching()
  {
    base.OnDetaching();
  }

  private void Loaded(object sender, RoutedEventArgs e)
  {
    ListView view = sender as ListView;
    this.AutoColumnsSizeChanged(view);
  }

  private void SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
  {
    ListView view = sender as ListView;
    this.AutoColumnsSizeChanged(view);
  }

  private void AutoColumnsSizeChanged(ListView view)
  {
    GridView gridView = view.View as GridView;

    double size = 0;

    for (int i = 0; i < gridView.Columns.Count; i++)
    {
      if (this.AutoResizeColumnsNumber != i)
      {
        size += gridView.Columns[i].ActualWidth;
      }
    }
    if (view.ActualWidth - size > 0)
    {
      gridView.Columns[this.AutoResizeColumnsNumber].Width = view.ActualWidth - size;
    }
  }
}
```

```xaml:Test.xaml
<ListView>
  <i:Interaction.Behaviors>
    <cb:ListViewHeaderAutoResizeBehavior AutoResizeColumnsNumber="3" />
  </i:Interaction.Behaviors>
</ListView>
```
AutoLayoutをコードで制御したい時、どうもわかりにくいのでStoryBoardで一度作ってコードに置き換えている。


![xx.png](https://qiita-image-store.s3.amazonaws.com/0/5222/5db466cb-bba8-553d-3676-eb06a4de627f.png "xx.png")

```
        sv.contentSize=CGSizeMake(100, 1500)
        sv.backgroundColor=UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
        let v1:UIView = UIView()
        sv.addSubview(v1);
        v1.backgroundColor=UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
        v1.frame=CGRectMake(10, 100, 100, 300);
```
↑AutoLayout使わず

```
        sv.contentSize=CGSizeMake(100, 1500)
        sv.backgroundColor=UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
        let v1:UIView = UIView()
        sv.addSubview(v1);
        v1.backgroundColor=UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
        v1.setTranslatesAutoresizingMaskIntoConstraints(false)
        v1.addConstraint(NSLayoutConstraint(item: v1, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1.0, constant: 300.0))
        v1.addConstraint(NSLayoutConstraint(item: v1, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1.0, constant: 100.0))
        sv.addConstraint(NSLayoutConstraint(item: v1, attribute: .Top, relatedBy: .Equal, toItem: sv, attribute: .Top, multiplier: 1.0, constant: 100.0))
        sv.addConstraint(NSLayoutConstraint(item: v1, attribute: .Bottom, relatedBy: .Equal, toItem: sv, attribute: .Bottom, multiplier: 1.0, constant: 10.0))
        sv.addConstraint(NSLayoutConstraint(item: v1, attribute: .Leading, relatedBy: .Equal, toItem: sv, attribute: .Leading, multiplier: 1.0, constant: 10.0))
        sv.addConstraint(NSLayoutConstraint(item: v1, attribute: .Trailing, relatedBy: .Equal, toItem: sv, attribute: .Trailing, multiplier: 1.0, constant: 10.0))
```
↑AutoLayout使った

これも最初わからなくて、sv.addConstraintするところをv1.addConstraintしちゃって

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view.  Does the constraint reference something from outside the subtree of the view?  That's illegal. constraint: view:>'
*** First throw call stack:
(0x33a4b2a3 0x3b6c997f 0x33a4b1c5 0x34408ad5 0x35c8c3c1 0x35c8c535 0x358732e1 0x358735c7 0x3586de53 0x358557dd 0x358552c3 0x358c9ce3 0x358c9afb 0x358c6ceb 0x358c64c1 0x358b4b93 0x358b4833 0x2eed47 0x2e2eb9 0x2e6159 0x20b279 0x35868ab3 0x358dd8ef 0x35612c01 0x3bae04b7 0x3bae1dcb 0x33a1ef3b 0x33991ebd 0x33991d49 0x375442eb 0x358a7301 0xc4bc5 0x3bb00b20)
libc++abi.dylib: terminate called throwing an exception

とか言われたりした。
awk > コンマとコロン区切りのデータを分割する > awk -F "[,:]" '{print $2, $3}' test.dat

動作確認

    CentOS 6.5

```test.dat
1,2,3,4
2,2;3,4
3:2,3,4
```
というファイルがあるとする。この２列目と3列目を取りたい時は以下のようにする。

    $awk -F "[,:]" '{print $2, $3}' test.dat
    2 3
    2 3
    2 3

`"[,:]"`は複数の区切り文字を指定しており、`","`と`":"`を区切りと認識する。
ヒカルのgo! #4 (hikarie.go) - メモ


# [ヒカルのgo! #4 (hikarie.go)](http://connpass.com/event/12179/)の参加メモです

golangまったく書けないのに参加してきた。

PCを忘れてしまって思い出しながら書いてるのでところどころ抜けや間違いがあるかもしれません。


## Goとリレーショナルデータベース([@umisama](https://twitter.com/umisama))

- WEBアプリケーションを作る上でDBは必須
- DB(SQL)を扱う上でGolangでのベストプラクティスはない
- 現在golangでSQLを扱う方法はおおまかに言って以下の3つ
	- 素のSQLで書く
    	- エラーハンドリングを毎行ごとに行うのが辛い
	- クエリビルダーを使う
		- https://github.com/lann/squirrel
		- https://github.com/dropbox/godropbox/tree/master/database/sqlbuilder
	- ORMを使う
- https://github.com/go-gorp/gorp
		- https://github.com/jinzhu/gorm
		- https://github.com/naoina/genmai
	
- 案件で実際に使っていて一番いいと感じてるのは今のところsquirrel + gorp (だったと思う…)


## マルチプラットフォームなインタラクティブシェルを楽に作る [@k0kubun](https://twitter.com/k0kubun)

- ブログ + Slide
	- http://k0kubun.hatenablog.com/entry/2015/03/02/233040



## すごいgolang楽しく学ぼう ([@T_akms](https://twitter.com/T_akms))

- golangをどうやって学んだか？とその成果物について
- golangを学び初めて8ヶ月
- 会社ではツールは自由に作っていいのでGoを使ってツールを作っている
- fmtなどの標準のpackageのコードを読むのがとても勉強になる
	- 実装方法
	- テストの書き方


## golangでスクレイピング ([7yan00](https://twitter.com/7yan00))

(タイトルは口頭で行っていたような気がするので間違ってるかもしれないです)

- ↓内容によるハンズオン
	- https://github.com/7yan00/hikago-4_handsOn/blob/master/text01.md

## Yet Another JSON な json5をgolangでparseできる奴を作った

(ブログの記事のタイトルを利用させていただきました)

- [Yet Another JSON な json5をgolangでparseできる奴を作った](http://yosuke-furukawa.hatenablog.com/entry/2014/12/03/160514)の実演
iTerm2のビープ音と一緒にでるフラッシュを消す


画面全体が白くフラッシュするので、個人的にうざかった

[Preferences...] -> [Profile] -> [Terminalタブ] -> Notifications項目にあるSilence bellにチェック

## 参考
- [How do I replace bell with Window flash in iTerm?](http://www.quora.com/How-do-I-replace-bell-with-Window-flash-in-iTerm)
Jadeでエスケープせずに変数展開する


Jadeでjsなどの変数をマークアップ上に展開したいとき

```
#{hoge}
```

というふうに記述することで実現できるが、これではメタ文字がエスケープされてしまう。
メタ文字をエスケープせず、そのまま出力したい場合には、

```
!{hoge}
```

と書くと良い。
POSIX の exit-status を簡単に取れるヤツ作った

## 2019-03-17追記

[pkg/os/ProcessState.ExitCode()](https://golang.org/pkg/os/#ProcessState.ExitCode) というメソッドができたようです。

[Goでコマンドを実行して終了コードを取得する方法](https://qiita.com/hnakamur/items/5e6f22bda8334e190f63) より

---

Go でコマンドを実行して終了ステータスを取ろうと思うと割と面倒だったので、POSIX 前提で簡単に取れるヤツをライブラリ化しました。

```go:main.go
package main

import (
	"fmt"
	"github.com/yuya-takeyama/posixexec"
	"os"
	"os/exec"
)

func main() {
	cmd := exec.Command("/bin/sh", "-c", fmt.Sprintf("exit %s", os.Args[1]))
	exitStatus, err := posixexec.Run(cmd)
	if err != nil {
		panic(err)
	}

	fmt.Printf("exit-status: %d\n", exitStatus)
}
```

といっても POSIX ちゃんとわかってるわけではないのでツッコミありましたらコメントください。

Enjoy!

[github.com/yuya-takeyama/posixexec](https://github.com/yuya-takeyama/posixexec)
WPFのListViewコントロールのヘッダーを固定サイズで使用する

###ヘッダーのカラムをドラッグで入れ替えできないように抑制する用法
ヘッダーカラムの入れ替えを抑制するには、GridViewColumnHeaderタグを明示的に記述して、IsEnabledプロパティをFalseに設定します。

```xaml:Test.xaml
<ListView>
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumnHeader IsEnabled="False"/> <!-- 入れ替えの抑制 -->
      </GridViewColumn>
    </GridView>
    </ListView.View>
  </ListView>
</Grid>
```

###ヘッダーのカラムのリサイズを抑制する方法
ヘッダーカラムのリサイズを抑制するには、GridViewColumnHeaderのStyleを利用します。Blendで、GridViewColumnHeaderのスタイルをコピーして、PART_HeaderGripperという名前の付いたThumbクラスを探し出します。PART_HeaderGripperがカラムのセパレーターで、GridViewColumnHeaderGripperスタイルを変更すれば、縦棒の色を変えることもできます。リサイズを抑制したい場合には、IsEnabledプロパティをFalseに設定します。

```xaml:Test.xaml
<Style x:Key="{x:Type GridViewColumnHeader}" TargetType="{x:Type GridViewColumnHeader}">
  <!-- 中略 -->
  <Canvas>
    <Thumb x:Name="PART_HeaderGripper"
      Width="Auto"
      Margin="0,0,7,0"
      HorizontalAlignment="Stretch"
      IsEnabled="False"
      Style="{StaticResource GridViewColumnHeaderGripper}" />
  </Canvas>
  <!-- 中略 -->
</Style>
```
Elasticsearchが重くなった時は、bloom filterを無効化すると良い


#####※少しストックされているので更新
```
1.3.5以降のバージョンでは、bloom filterはデフォルト無効化されているのでこの内容は、それ以前のバージョンでElasticsearchを運用されている方向けです。
```

Elasticsearchをログ格納用に運用していて、突然動作が重くなりレスポンスが返ってこなくなった時の対応メモ。
もちろん、これだけでは改善しない事もあるので、インデックスのdeleteやcloseも必要だけど、自分の運用している環境ではかなり効果があった。

######どうやら、デフォルトでbloom filterというリソースがインデックス単位で割り当てられているようで、fluentdから日単位でインデックス作ったりするとインデックスの数だけこのbloom filterが有効になっているのでメモリを逼迫しているらしい。

【解説は下記】
http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/index-modules-codec.html

ということで、elasticsearch-curatorを使い、このbloom filterも無効化しておくメモ。

##手順

elasticsearch-curatorについては、下記に書いたので参考までに。
http://qiita.com/nagais/items/5580f77a8af6dd5e1856


テストを月単位のインデックスで実施したが、下記のオプションで単位は変えられる。


```
#1ヶ月前までのbloom filterを保持し、他は無効化する
$ curator bloom --prefix syslog- --older-than 1 --time-unit months
```

elasticsearch_headで確認すると、
下記のようにbloomがfalseになっている事で確認出来る。

![スクリーンショット 2015-03-02 11.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/40850/2c5ea76b-0283-f355-c4d7-0f598993a373.png "スクリーンショット 2015-03-02 11.37.14.png")

##オプション

|オプション名|意味|
|---|---|
|--timestring|Pythonのstrftime形式でフォーマットを指定する<br>サンプル --timestring %Y.w%W|
|--prefix|インデックスのプレフィックスを指定<br>サンプル --prefix aaa-|
|--time-unit|タイムスパンを下記のいずれかで指定<br>[hours,days,weeks,months]|
|--older-than|対象とする数を指定する<br>1と指定するとデフォルトはdaysなので1日分は保持し、2日以前のものを対象とする<br>time-unitと組み合わせで判断される|
|--exclude-pattern|特定のインデックスを処理対象から外したい場合に指定|

##おまけ

fluentdで週単位のインデックスを運用していて少しはまったのでメモ

下記のような感じでfluentd経由でインデックスを作っていると、[time-unit weeks]では処理対象にならずに、[--timestring]を使って整形してあげないとインデックスを削除出来ない。。

#####週単位インデックス名:aaa-2015.w01

```td-agent.conf
logstash_dateformat %Y.w%V
```
curatorで削除する場合は、下記のように[--timestring %Y.w%W]で形式を指定すると対象になる。

```
$ curator bloom --prefix aaa- --older-than 1 --time-unit weeks --timestring %Y.w%W
```

正確には測ってないけど、過去分のbloom filter無効化したらだいぶメモリが空いた。
これも、cronのタスクに組み込み夜間実行する。
ATOMにterm2インストール時のエラーの対処

#ATOMにターミナル機能をつける長い道のり
ATOMのパッケージでターミナルの機能をつけるパッケージ「Term2」をインストール使用としたらエラーがでた(´・ω・`)
で、解決方法を探してたら[AtomにTerm2を入れた時に若干ハマった話](http://qiita.com/n0bisuke/items/10b0960160d233d8fce5)というのを見つけたので、まねしてみた。  
  
```
$ sudo npm update -g node-gyp
$ sudo rm -rf ~/.atom/.node-gyp
$ xcode-select --install
```

φ(ﾟДﾟ )ﾌﾑﾌﾑ… 

が、さらにエラー…どうやらnpmコマンドが見つからないらしい(´・ω・`) 
解決方法を探してたら[Atom に Term2 を導入しました](http://pizzaboi.hatenablog.com/entry/2014/10/05/011019)というのを見つけたのでまねしてみた。  
  
```
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm install v0.10.0
```

これで、npmコマンドをいれるためのnvmコマンドを入れるとｃ⌒っﾟдﾟ)っφ　ﾒﾓﾒﾓ...  
が、さらにエラー…どうやらgitから消えてるらしい(´・ω・`)  
 
 
 
gitがだめならということでHomebrewでインストール！！  
```
$ brew install nvm
```
  
これでインストールはできたので設定を！  
```
$ mkdir ~/.nvm
```
で```$HOME/.bashrc```または```$HOME/.zshrc```に以下を付け加えます(例はzshで行ってます)。  
  
```
$ vi $HOME/.zshrc
  
   ###↓を追加  
  export NVM_DIR=~/.nvm
  source $(brew --prefix nvm)/nvm.sh
```
これでnvmの設定完了！  
あとはnode.jsをいれるだけです。ちなみに最新版(2015/03/02時点)は0.11系ですが安定は0.10版です。まぁ今回はnode.jsがメインではないので最新版の0.11系を入れておきましょう。  
```
$ nvm install 0.11
```
これで、最初の解決方法を試して完了です。  
  
で、うまくいけばいいのですがまだまだエラー(´・ω・`)  
同じエラーの人がatomでTerm2パッケージのエラーっぽいんじゃないのだろうかといってるが（["apm stars --install" error #310](https://github.com/atom/apm/issues/310)）とりあえず色々やって疲れたからしばらくは様子見です( ´Д｀）ﾉ~ﾊﾞｲﾊﾞｲ
Coccinelle (後で調べるようメモ)

* [HomePage](http://coccinellery.org/)
* [GitHub](https://github.com/coccinelle/coccinelle)
* [linux/scripts/coccinelle/iterators/use_after_iter.cocci](https://github.com/torvalds/linux/blob/4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7/scripts/coccinelle/iterators/use_after_iter.cocci)
CentOSの一般ユーザーにパスワードなしでsudoコマンドを使えるようにしました

一般ユーザーにパスワードなしでsudoコマンドを付与しました。環境はCentOSです。

# visudoコマンドを実行する
visudoコマンドを使うとsudo権限を付与できます。

```bash:visudoを実行
sudo visudo
```
viが立ち上がります。
pugiemonnという一般ユーザーにsudo権限を付与します。

```vi:pugiemonn
## Allow root to run any commands anywhere
root      ALL=(ALL)       ALL
pugiemonn ALL=(ALL)       ALL
```
rootユーザーに権限が付与されているのがわかります。
pugiemonnというユーザーを追加しました。

これでviエディタを閉じるとpugiemonnというユーザーでsudoコマンドが使えるようになります。

しかし、これだけではsudoコマンドを実行する度にパスワードを要求されます。

もう一度visudoしてエディタを開きます。

```vi:pugiemonn
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
%pugiemonn      ALL=(ALL)       NOPASSWD: ALL
```
%wheelグループの指定がパスワード不要の書き方がコメントにされていたので、pugiemonnグループにNOPASSWDを指定しました。

今度はpugiemonnユーザーはパスワードなしでsudoコマンドが使えるようになりました。
人気プログラミング言語の推移

#はじめに

TIOBE Software というオランダにある会社が、ネット検索のキーワードをもとに人気プログラミングのランキングを発表しています。これを [TIOBE INDEX](http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html) と言います。

#ランキングの推移

単純なランキングだけでなく、人気プログラミング言語の推移もグラフで示されています。先月の結果ですが、下のようになっていました。

![graph](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/tiobe_graph.png)

これによると、上位言語で C はだいたい横ばい、Java , C++ は減少していますね。オブジェクト指向でない C が１位でオブジェクト指向の２位 Java が減少しているというのも不思議な気がします。これは、Java のライバルとなる他のオブジェクト指向言語が多いというのもあるかもしれません。

C のライバルとなる言語はこの中では C++ ですが、C++ は C と互換性があるので家族みたいなものです。

急速に人気の高まった Objective C ですが、iPhone は人気ですが、新規アプリ開発は一段落なのか急激に落ち込んでいますね。

PHP は バージョン 5 で進化が止まっているので、ネットのキーワード検索という観点からするとこのように減っているんでしょうか。日本ではまだまだ需要は多い感じです。

#気になる Ruby は

日本発祥の Ruby ですが、残念な結果になっています。

![ruby](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/tiobe_ruby.png)

2007 年ごろから急激に増えた後、2010 年ごろピークアウトして、最近では落ち込みが激しいようです。日本ではまだまだ人気言語ですが。

これは Ruby のキラーアプリである ROR (Ruby On Rails) の人気にも関連しているようです。ROR は高機能ですが、かなり重い感じですし、学習にも時間がかかる感じです。最近では、ライバルもたくさん出現して、そちらへ流れる人も多いんでしょうね。

#このグラフから感じたこと

日本で利用の多い Java がずっと減り続けているのが気になります。かつては C を引き離しての１位でしたが、このままの傾向が続くと１０％割れは間違いありません。

日本では業務系アプリの比率が高く、それらの多くが Java を採用しています。欧米(特にソフトウェア大国アメリカ)では、業務系アプリの比率は低く、特に Microsoft, Oracle, Apple, IBM と言った大企業は Java をあまり使わない(日本に比べてですが)と思われます。OS や ミドルウェアの開発には、C や C++ が多く使われるためです。

他に Java が減っている理由ですが、Java 技術が成熟化してネットのキーワード検索という枠に入らないとか、ERP パッケージの利用が(海外では特に)増えているのかもしれませんね。あまり聞かない言語ですが、SAP で利用される ABAP が上位 (16位) に入っています。


[原文はこちら ..](http://bonk.red/show.php?id=23)
(著作権を気にする人がいるのでひと言。原文の著作権はこの投稿者にあります)