OmniAICreator/Qiita-1.07M huggingface dataset:
Capistrano3でリリースディレクトリをJSTにする方法

自分への備忘録を兼ねて。


# はじめに

Capistranoでアプリケーションをデプロイする場合、リリースディレクトリ（releasesの下のディレクトリ名）はUTCの年月日時分秒が設定されます。
ディレクトリに設定される時刻をUTCからJSTに設定する方法について、Capistrano2での設定方法は簡単に見つかったのですが、Capistrano3での設定方法が見つからなかったので、Capistrano3のソースコードを実際に読んでみました。
なお、確認したCapistranoのバージョンは3.1.0です。


# Capistrano2の場合

Capistrano2では

```
set(:release_name) {
  set :deploy_timestamped, true; Time.now.strftime("%Y%m%d%H%M%S")
}
```

とdeploy.rbに記述することで、リリースディレクトリがJSTの時刻に設定されます。


# Capistrano3の場合

Capistrano3でリリースディレクトリの名前をセットしているのは、/path/to/capistrano-3.x.x/lib/capistrano/tasks/deploy.rake の以下のタスクです。

```
task :new_release_path do
  set_release_path
end
```

ここでは、/path/to/capistrano-3.x.x/lib/capistrano/dsl/paths.rb に定義されている

```
def set_release_path(timestamp=now)
  set(:release_path, releases_path.join(timestamp))
end
```

を呼び出して、リリースディレクトリの名前をセットしています。

set_release_pathは引数で受け取った変数 timestamp をそのまま別の変数にセットしているので、set_release_pathに変数を渡すようにすればリリースディレクトリを変更することが可能です。
そこで、deploy.rbで以下のようにして、定義されているタスクを一度クリアした上で、set_release_pathに引数を渡す形に書き換えます。

```
Rake::Task["deploy:new_release_path"].clear

namespace :deploy do
  task :new_release_path do
    set_release_path(Time.now.strftime("%Y%m%d%H%M%S"))
  end
end
```

これで、JST（正確には、実行環境のタイムゾーンに合わせた時刻）をリリースディレクトリの名前に利用することができます。
なお、私が動作確認しているのは3.1.0ですが、3.4.0のソースコードを見たところ、paths.rbのset_release_pathの処理が多少変わってはいるものの、同じ方法で変更ができそうです。
もしかしたら、Capistrano3であれば、すべて同じ方法でできるかも知れません。
機会があれば試してみたいところですね。


# 応用編

上述の方法で、UTC以外の時刻をリリースディレクトリの名前に設定することができるようになりましたが、実際のところリリースディレクトリには時刻以外の文字列を利用することも可能です。
そこで、下記のようにすれば、任意の文字列をcapコマンド実行時に渡すことで、日時以外をリリースディレクトリに利用できるようになります。

```
set :release_date, ENV['RELEASE_DATE'] || Time.now.strftime("%Y%m%d%H%M%S")

Rake::Task["deploy:new_release_path"].clear

namespace :deploy do
  task :new_release_path do
    set_release_path(fetch(:release_date))
  end
end
```

こうすると、capコマンド実行時に指定がなければ現在時刻が、指定がある場合はそちらの文字列がリリースディレクトリの名前に利用されます。
時刻以外を利用する場合はソート順などを意識する必要がありますが（でないと、ロールバックなどでの挙動がおかしなことになる）、外部から時刻を指定できるようになるとタスクを何段階かに分割して実行するなど、ちょっと変わった実行も可能になります。
興味のある方は、こちらも合わせて試してみてください。
Linuxデスクトップのステータスアイコンがダサい

私は、ArchLinuxにデスクトップAwesomeを使っていますが、ツールで設定されるデフォルトで設定されるステータスアイコンが合ってないので、ちょっとずつ変更させています。


(この中の一番左の側のアイコン:ja,volume,bluetooth,clipit,dropbox)

https://github.com/syui/numix-icon-theme/blob/master/setup.sh

テーマは、基本、`Numix`を使います。気になるツールのがあったら、ぜひ教えてください。
YouTube が再生中なら iTunes を停止 (逆も) (OS X 限定)

最近 YouTube で動画を見始めたら iTunes を止めたい！
と思ったので、 JXA でチャレンジしてみた。

もちろん逆に、 YouTube で再生中でない場合は iTunes を再生し始める。

```javascript:autotunes
#!/usr/bin/env osascript -l JavaScript

var executeJS = {
    // http://qiita.com/zakuroishikuro/items/194223d63b0f95ab7a63
    'Google Chrome': function (app, tab, fnStr) {
        return app.execute(tab, {'javascript': fnStr});
    },
    'Safari': function (app, tab, fn) {
        return app.doJavaScript(fnStr, {'in': tab});
    }
};

function main () {
    var iTunes = Application('iTunes');
    if (someAppYouTubePlaying()) {
        iTunes.stop();
    } else {
        iTunes.play();
    }
}

main();

function someAppYouTubePlaying() {
    var browserNames = Object.keys(executeJS);
    return selectActiveApps(browserNames).some(function (app) {
        return app.windows().some(function (window) {
            return window.tabs().some(function (tab) {
                return youtubePlaying(app, window, tab);
            });
        });
    });
}

function selectActiveApps(appNames) {
    var se = Application('System Events');
    return se.processes().reduce(function (actives, app) {
        var appName = app.name();
        if (appNames.indexOf(appName) > -1) {
            actives.push(Application(appName));
        }
        return actives;
    }, []);
}

function youtubePlaying(app, window, tab) {
    var js = '(' + isYoutubePlaying.toString() + ')();';
    return executeJS[app.name()](app, tab, js); 
}

function isYoutubePlaying() {
    // This function will be running on browser (client side JS).
    // https://developers.google.com/youtube/js_api_reference
    const STOP = 0;
    const PAUSE = 2;
    if (!String(window.location).match(/https?:\/\/www\.youtube\.com/)) {
        return false;
    }
    var player = document.getElementById('movie_player');
    if (!player) {
        return false;
    }
    if ([STOP, PAUSE].indexOf(player.getPlayerState()) > -1) {
        return false;
    }
    return true;
}
```

# 使い方

実行権限をつけて実行するだけ。

```shell-session
$ chmod +x ./autotunes
$ ./autotunes
```

自分は、これをさらに定期的に実行してくれるように、パスを通して
こんな感じの Bash スクリプトを書いて、これを実行している。
1 秒おき。

```bash
#!/usr/bin/env bash
set -euo pipefail

while sleep 1
do
    autotunes
done
```

Safari と Google Chrome での差異の吸収は↓の記事を参考にさせていただいた。
[JXAでSafari, Chrome, Firefoxを操作する際の違い](http://qiita.com/zakuroishikuro/items/194223d63b0f95ab7a63)


工夫次第で他のブラウザや他の動画再生サイト・他の音声プレイヤーでもできる（たぶん）……！
ossp-uuidを使ったマルチプラットフォームで動くコードを書くには

# ossp-uuidを入れる

## osx

HomeBrewだと

```
brew install ossp-uuid
```

## Linux

```
sudo apt-get install libossp-uuid-dev
```

OSXのHomebrewでは

```
pkg-config uuid --cflags
```

と名前にuuidを指定すれば、良かったが、
Linux（Ubuntu）だとuuidではなく、ossp-uuidを指定する必要があった。

これでは、OS毎に条件分岐でpkg-configを実行する必要がある。

# 解決方法

uuid-configを使う

## ヘッダファイルのパス指定

```bash
uuid-config --cflags
```

## ライブラリリンク時のオプション指定

```bash
uuid-config --ldflags --libs
```
Railsで環境変数を設定、取得

## 前置き、概要説明

ことの始まりはRails4.1から`config/secrets.yml`に下記のような環境変数が使われていたことです。

```rb:config/secrets.yml
development:
  secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

test:
  secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
```

本番サーバー向け(production)の`secret_key_base`プロパティが環境変数を読んでいて、デプロイ後に本番サーバーを確認したら画面が真っ白。ローカル開発環境なら`~/.zshrc`に`export SECRET_KEY_BASE=xxxxxxxxxx`で良さそうですが、本番サーバーはプロジェクト(サービス)毎に環境変数を隔離しておきたいです。

そこで今回は`dotenv-rails`というgemライブラリを用いて解決しました。

## インストールおよび設定

本記事はBundlerを用いてRails環境を既に構築してある前提です。Bundler環境のインストール方法は[こちら](http://qiita.com/HayneRyo/items/d493a2b3cec2322f167c)。

### 1.dotenvインストール

gemライブラリ**dotenv-rails**をインストールします。bundlerを用いるのでGemfileに`dotenv-rails`を追記します。

```rb:Gemfile
gem 'dotenv-rails'
```

bundleコマンドでインストールします。

```lang:ターミナル
$ bundle install
```

### 2.環境変数を設定

次に環境変数を設定します。本記事は`config/secrets.yml`が原因で**画面が真っ白になる問題の解決**をサブ目標としているので、SECRET_KEY_BASEの生成も記述します。

```lang:ターミナル
$ bundle exec rake secret
```

上記コマンドでSECRET_KEY_BASEが生成されます。この文字列をコピーして設定ファイルに環境変数にして代入してあげます。dotenvの設定ファイルはプロジェクト配下の.envというファイルです。

```lang:.env
SECRET_KEY_BASE="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

これで、WEBサーバー(サービス)を再起動してあげれば、恐らく環境変数が取得出来ているはずです。SECRET_KEY_BASEに限らず、データベース向け設定などを環境変数として持たせておけば色々と便利かと思います。
Android Studio 1.1.0 で Navigation Drawer 付きの Activity を作った場合に、左上のアイコンを回転させるようにする

# 事象

Navigation Drawer 付きの Activity を作りたいときは、

![NavigationDrawerActivity作成ウィザード.png](https://qiita-image-store.s3.amazonaws.com/0/52403/c44acdde-3c86-da39-72a1-d607f68ac2c3.png)

このウィザードを使うと、テンプレートが自動で生成されるので便利ですよね。

ですが、生成されたコードをそのまま実行すると、次のようになります。

![矢印の遷移1.png](https://qiita-image-store.s3.amazonaws.com/0/52403/40e05ddd-da6e-4e1b-9b01-cebbfb8c9fe6.png)

赤い丸で囲んだ部分に注目して欲しいのですが、ドロワーを開閉しても ≡ から ← へアイコンが変わるアニメーションがされません。それどころか、アイコンは初めから ← のままじゃありませんか！

# 対応

そこで、ドロワーの開閉時に ≡ から ← へアイコンがアニメーションするように、コードを少し書き換えてみましょう。

1. `NavigationDrawerFragment.java` の import 群の中から `android.support.v4.app.ActionBarDrawerToggle` を探して、 `v4` の部分を `v7` へ書き換えます。これにより、非推奨クラスの警告も解消されます。
2. ActionBarDrawerToggle の生成部分を書き換えます。（後述）
3. 完了。

## ActionBarDrawerToggle 生成部分の書き換え

アイコンを指定する第 3 引数を削除します。

元のコード:

```java:NavigationDrawerFragment.java

        mDrawerToggle = new ActionBarDrawerToggle(
                getActivity(),
                mDrawerLayout,
                R.drawable.ic_drawer,
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close
``` 
書き換え後のコード:

```java:NavigationDrawerFragment.java

        mDrawerToggle = new ActionBarDrawerToggle(
                getActivity(),
                mDrawerLayout,
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close
```

これで、左上のアイコンがアニメーションするようになります。

![矢印の遷移２.png](https://qiita-image-store.s3.amazonaws.com/0/52403/5d314689-44d1-8e89-7c4d-445da97b89b9.png)
　

以上です。
8pinoで光センサーの値を7-segment LEDに表示

8pinoから7-segment LEDを表示するのにシリアル通信のI2Cを使用します。

# 必要なもの
* [8pino](http://8pino.cc/)
* [7-segment LED HT16K33 Backpack](https://www.switch-science.com/catalog/1639/)
* ブレッドボード
* ジャンパー線
* [光センサー](http://akizukidenshi.com/catalog/g/gI-05713/)
* 抵抗
* [ピンヘッダ](http://akizukidenshi.com/catalog/g/gC-00167/)

# 環境
* [arduino IDE 1.6.3 with Adafruit Boards](https://learn.adafruit.com/adafruit-arduino-ide-setup/arduino-1-dot-6-x-ide)
* ライブラリ
	* [TinyWireM](https://github.com/adafruit/TinyWireM) I2C通信用ライブラリ
	* [Adafruit_LEDBackpack](https://github.com/adafruit/Adafruit-LED-Backpack-Library)
	* [Adafruit_GFX](https://github.com/adafruit/Adafruit-GFX-Library)

# 事前準備
1. [こちら](https://learn.adafruit.com/adafruit-arduino-ide-setup/arduino-1-dot-6-x-ide)を参考に、arduino IDE 1.6.3 with Adafruit Boardsをinstallします。
2. 上記のライブラリを.zipとして保存しておきます。
3. arduino IDE 1.6.3 with Adafruit Boardsを起動し、[スケッチ]-[Include Library]-[Add .ZIP Library]から、上記で保存したライブラリを追加していきます。
![Include_Library.png](https://qiita-image-store.s3.amazonaws.com/0/4779/f27029e8-fdf1-5106-a74f-71357754846f.png "Include_Library.png")
4. 8pinoにピンヘッダをハンダ付けする。8pinoをブレッドボードに挿せるようにするためです。
![8pino.png](https://qiita-image-store.s3.amazonaws.com/0/4779/491ea5fb-f623-00ab-280d-787e7451371e.png "8pino.png")

# 回路
8pinoの部分をATTiny85で表現しています。(回路図を描くFritzingに8pinoのアイコンがないので)
![7-segment-LED_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/4779/cb654889-e3de-f1e3-5361-e64644f119cd.png "7-segment-LED_ブレッドボード.png")

# スケッチ
```
#include <TinyWireM.h>
#include <Adafruit_LEDBackpack.h>
#include <Adafruit_GFX.h>
#include <avr/power.h>

Adafruit_7segment disp = Adafruit_7segment();

int ledPin = 1;
int threshold = 20;
int val=0; //入力される値を格納する為の変数
int val1=0;
int val2=0;
int val3=0;
int val4=0;

static const uint8_t numbertable[] = {
	0x3F, /* 0 */
	0x06, /* 1 */
	0x5B, /* 2 */
	0x4F, /* 3 */
	0x66, /* 4 */
	0x6D, /* 5 */
	0x7D, /* 6 */
	0x07, /* 7 */
	0x7F, /* 8 */
	0x6F, /* 9 */
};

void setup() {
  pinMode(ledPin, OUTPUT); 
  //Serial.begin(9800); //モニターに出力するための設定
  if(F_CPU == 16000000) clock_prescale_set(clock_div_1);
  disp.begin(0x70);
}
void loop() {
//ANALOG INの０番ピンからデータを受け付ける
  val=analogRead(2);
  //Serial.println(val); //入力された値をモニターに出力
  
  if (val >= threshold) {
    digitalWrite(ledPin, HIGH);   // LEDをオンに
  } else {
    digitalWrite(ledPin, LOW);    // LEDをオフに
  }
  
  val1 = (val % 10); val /= 10;
  val2 = (val % 10); val /= 10;
  val3 = (val % 10); val /= 10;
  val4 = (val % 10); val /= 10;
  
  disp.writeDigitRaw(0, numbertable[val4]);
  disp.writeDigitRaw(1, numbertable[val3]);
  disp.writeDigitRaw(3, numbertable[val2]);
  disp.writeDigitRaw(4, numbertable[val1]);
  disp.writeDisplay();
  

  delay(1000);
}
```

# 動作
[vine](https://vine.co/v/eBrMHruh23b)に保存しました。

# まとめ
* Arduino IDE 1.6.3を使って、8pinoでコンパイルしました。
* 今回、7-segment LED表示には、I2Cを使いましたが、ライブラリがあるので比較的簡単に実装できました。

# 参考
* https://learn.adafruit.com/tap-tempo-trinket/overview
新しいパソコンのセットアップ

開発用に中古のThinkPadを手に入れたのでツール導入や設定変更についてメモ。
CPUだけCore i7のやつを狙って買ったので今のところ快適。
メモリもHDDも増設できるので薄さを捨てた代わりに性能はまだまだ向上の余地あり。

## 入力関連

最近Macを使う機会が多いので一部入力操作をMacと統一しておく。

* Google日本語入力
    * 変換、無変換キーで日本語入力が有効、無効になるよう設定
* タッチパッドの二本指スクロールをAndroidやiPhone、MacBookと同方向に変更
* レジストリをいじくって2本指タップを右クリック扱いにする

## 各種ツール導入

* Firefox
* Chrome
* Chocholatey
* Dropbox
    * vim
        * vimrcの同期が必要
    * git :octocat:
        * ユーザ名とメールアドレスの設定が必要
    * vagrant
    * cmder
        * 既存設定のコピーが必要
    * VirtualBox
bundle install時にnokogiriでエラーの対処

bundle install時に

``` An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot continue. 
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling. ```

みたいなエラーが出た時に、 bundle install 実行前に
``` $ bundle config build.nokogiri --use-system-libraries ```
をすると通った。
mysqldumpを特定のテーブルに対して条件付きで取得する方法の備忘録

mysqldump -u [ユーザ名] -p -t [テーブル名] --where='カラム名'='xxxx'
で取れます。

LIKE句を使いたい場合は、
mysqldump -u [ユーザ名] -p -t [テーブル名] --where LIKE 'カラム名'='xxxx'

取得するダンプにバイナリデータが含まれている場合は上記に続けて、
--hex-blobと付けると良いです。
稼働中のＤＢに対して行う場合は、--single-transactionを付けることでダンプ取得中のテーブルへの更新を抑止可能。
SlidingTabLayout + ViewPagerを使った下タブの表示の仕方

友達にAndroidで下タブ表示の実装をして欲しいって頼まれて作りました。

##前提

下タブはAndroid design materialではあかんこととされています。

まぁ俺らはipxxxxとちゃうねんっていうのを言いたいのかなって思ったり。

厳密には違うかもしれませんが・・・

##やりかた
1.とりあえずSlidingTabLayoutを使ってViewの上側にTabが表示されるまでやってみてください。

ここは割愛（ここはぐぐったら出てくる）

2.xml内を

Viewpager
 
SlidingTabLayout

の順番で書くと下タブ表示がされます

この実装は、バグくさいので本当に必要に迫られなければ使わないほうがいいと思います。

もしもっと詳しくって教えて欲しい方いらっしゃったらコメントしてください。
addToBackStackで戻ってきてもViewが表示されない・・・

#addToBackStackで戻ってきてもViewが呼ばれない時の処理#

かれこれ４日間ほど悩んで

奇跡的に見つかった神サイトのおかげで解決

##現象

![スクリーンショット 2015-04-26 18.32.23.png](https://qiita-image-store.s3.amazonaws.com/0/56148/e81732e2-43f5-07cb-cff6-2294708f69d0.png)

こんな感じのレイアウト

MainActivityからViewpager + FragmentPagerAdapterのレイアウト移ると４つのFragmentを持つ

FragmentA -> Fragment A'に buttonで遷移して表示まではすぐできました。

ただ・・・バックボタンで戻るとFragmnetA, FragmentBが表示されない・・・

FragmentDのタブを押すと全部表示されるっていう意味不明な動きをしていました。

###試したこと##
1.recreateをonAttachで呼ぶ
　無限ループ笑　Genymotionがチカチカしてました。
2.containar.removeAllViews()をonViewCrate内で呼ぶ
　　StackOverFlowにバックボタンで戻ったときに表示がされないときに呼んでみたら？ってかいてあったのでやってみると、MainActivityから画面遷移をした時点でViewが表示されない。

他にもいろいろ試してましたが忘れたので割愛w

#神サイト
http://wasnot.hatenablog.com/entry/2013/04/20/220534
↑に書いてある通りにすればいい笑

細かい話はなし笑　

細かい話は追記で書きますね（すいません）

でここを参考にonViewCreate内をいじる。

```java
mViewPager.setAdapter(new TabPagerAdapter(getActivity().getSupportFragmentManager()));
```
を

```java
TabPagerAdapter mTabPager = new TabPagerAdapter(getChildFragmentManger());
mViewPager.setAdapter(mTabPager);
```

に変更しすると出来た。

##そもそも論#
追記します。

今言えることは、Fragmentのライフサイクルやらの使い方とかAdapter自体の使い方が全くもってわかってなかったです。

勉強せねば・・・(^◇^;)

##参考サイト
http://y-anz-m.blogspot.jp/2012/03/androidfragmenttransaction_14.html
WatchKit App と iOS App 間でやり取りしつつ、iOS App に割りと長めの処理を実行させる

iOS App がフォアグラウンドにあるときはうまくいくのに background にあるとうまくいかない、などでハマらないように。

# iOS App 側
## application:handleWatchKitExtensionRequest:reply: の実装
AppDelegate に実装します。

```
- (void)application:(UIApplication *)application
handleWatchKitExtensionRequest:(NSDictionary *)userInfo
              reply:(void (^)(NSDictionary *replyInfo))reply
{
    // do something...
}
```

## beginBackgroundTaskWithName:expirationHandler: あるいは beginBackgroundTaskWithExpirationHandler: で background 処理を継続させる

[公式ドキュメントの Execution States for Apps 欄](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html) にあるように、アプリは background に移るとほどなくして suspended になり、なんのコードも実行しなくなります。
長めの処理を iOS App 側にさせる場合それだと困るので、[こちらの Executing Finite-Length Tasks](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW1) に従って background 処理を継続させます。

```
- (void)application:(UIApplication *)application
handleWatchKitExtensionRequest:(NSDictionary *)userInfo
              reply:(void (^)(NSDictionary *replyInfo))reply
{
    __block UIBackgroundTaskIdentifier bgTask;
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
 
    // この辺で長い処理とか。GCD を使うなど。
    reply( hoge );

    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}
```

# WatchKit Extension 側
## Controller などで openParentApplication:reply: を呼び出す。
ドキュメントは[こちら](https://developer.apple.com/library/prerelease/ios/documentation/WatchKit/Reference/WKInterfaceController_class/index.html#//apple_ref/occ/clm/WKInterfaceController/openParentApplication:reply:)
TwitterAPIで自動フォロー返しする

# 前書き

Twitterでリクエストがあったのでサンプルを掲載します。

- ストリーミングで継続的に監視する方法を紹介しますが、cronで定期実行する場合でもストリーミング関連の部分を削除するだけで対応可能です。
- ライブラリには[TwistOAuth](https://github.com/mpyw/TwistOAuth)を使用しますが、他のライブラリでも方法は類似しているはずです。
- ToS的には怪しいですが、運用上自動リムーブ返しがないとフォロー数規制で困るケースがあるので、参考程度にこれも込みのソースにさせていただきます。不要な場合この部分は消してください。
- 並列リクエスト可能ですが、Twitterにアクセス拒否される要因になるので、あえて逐次リクエストにしています。

# ソースコード

## ストリーミング利用時・cron利用時ともに必要なコード

```php
<?php

// ライブラリをロード
require 'TwistOAuth.phar';

// テキストとして結果を表示
header('Content-Type: text/plain; charset=utf-8');

// 実行時間を無制限にする
set_time_limit(0);

// APIキー設定
$ck = '***コンシューマーキー***';
$cs = '***コンシューマーシークレット***';
$at = '***アクセストークン***';
$as = '***アクセストークンシークレット***';

// インスタンス生成
$to = new TwistOAuth($ck, $cs, $at, $as);

// カーソルを追跡して全てのIDを配列として取得するクロージャ
// 但し高速化のためキーに格納する
$get_all_ids = function ($endpoint) use ($to) {
    $ids = [];
    $params = [
        'stringify_ids' => '1',
        'cursor'        => '-1',
    ];
    $params['cursor'] = '-1';
    do {
        $result = $to->get($endpoint, $params);
        $ids += array_flip($result->ids);
    } while ($params['cursor'] = $result->next_cursor_str);
    return $ids;
};

// リムーブ実行用クロージャ
$unfollow = function ($user_id) use ($to) {
    try {
        $user = $to->post('friendships/destroy', compact('user_id'));
        echo "Unfollowed @{$user->screen_name}\n";
    } catch (TwistException $e) {
        echo "ID{$user_id}: {$e->getMessage()}\n";
    }
};

// フォロー実行用クロージャ
$follow = function ($user_id) use ($to) {
    try {
        $user = $to->post('friendships/create', compact('user_id'));
        if ($user->protected) {
            echo "Send follow request to @{$user->screen_name}\n";
        } else {
            echo "Followed @{$user->screen_name}\n";
        }
    } catch (TwistException $e) {
        echo "ID{$user_id}: {$e->getMessage()}\n";
    }
};

/* ユーザリストによる処理開始 */
try {
    
    // フレンドとフォロワーそれぞれを取得
    $friends   = $get_all_ids('friends/ids');
    $followers = $get_all_ids('followers/ids');
    
    // 差分を取得
    $friends_only   = array_diff_key($friends, $followers);
    $followers_only = array_diff_key($followers, $friends);
    
    // 1件ずつそれぞれ試行
    foreach ($friends_only as $user_id => $_) $unfollow($user_id);
    foreach ($followers_only as $user_id => $_) $follow($user_id);

} catch (TwistException $e) {
    
    echo "Fatal Error: {$e->getMessage()}\n";
    
}
   
    
```


## ストリーミング利用時のみ必要な追加のコード

```php
/* ストリーミングによる処理開始 */
try {

    // 自分のユーザIDを取得
    $my_id = $to->get('account/verify_credentials')->id_str;
    
    // ストリーミングに接続
    $to->streaming(
       'user',
        function ($status) use ($unfollow, $follow, $my_id) {
            // 自分に対するフォローイベントとリムーブイベントだけを検知
            if (isset($status->event) && $status->target->id_str === $my_id) {
                if ($status->event === 'unfollow') {
                    $unfollow($status->source->id_str);
                } elseif ($status->event === 'follow') {
                    $follow($status->source->id_str);
                }
            }
        }
    );

} catch (TwistException $e) {
    
    echo "Fatal Error: {$e->getMessage()}\n";
    
}
```
Swift1.2で発生したエラー

#UTF16Countが使えない


##エラーメッセージ
こんなん出ました

```swift
'utf16Count' is unavailable: Take the count of a UTF-16 view instead, i.e. count(str.utf16)
```

##解消方法

```swift:変更前
if( self.textView.text.utf16Count == 0 ){...
```

```swift:変後
if( count(self.textView.text.utf16) == 0 ){...
```

#メソッドをoverrideできない

こんなん出ました

##エラーメッセージ

```swift
Method 'setText' with Objective-C selector 'setText:' conflicts with setter for 'text' from superclass 'UITextView' with the same Objective-C selector
```

##解消方法

わかりませんでした！！！！


困りました
Swift さくっと確認したい基礎文法 [関数オブジェクト]


#関数オブジェクト

関数をオブジェクトのように
変数に代入したり、関数の引数に渡したりすることができます。

今回は下記の３つの方法をまとめました。

①関数を変数に代入
②関数を引数に指定
③関数を戻り値に指定


## ①関数を変数に代入

以下のように書くことで
定義した関数を変数に代入して利用することができます。

```swift

/* 消費税込みの金額を取得します。 */
func getPrice(#price:Double) -> Int{
    return Int(price * 1.08)
}

// getPrice()を代入
let myGetPrice = getPrice

// コーヒーの値段
let COFFEE_PRICE:Double = 300

// 代入先のmyGetPriceからgetPriceを実行
let coffeePrice = myGetPrice(price:COFFEE_PRICE)
println(coffeePrice) // 324

```
## ②関数を引数に指定

下記のように、
関数の引数に`(引数：引数の型 -> 戻り値の型)`を指定することで、
関数を引数に指定することができます。

```swift

func 関数名(引数:引数の型 -> 戻り値の型) -> 戻り値の型 {
	引数()
	return 戻り値
}
```
例を見てみましょう。

下記の例では、
関数`getTotalPrice`に関数`getPriceJPY`と関数`getPriceSWE`を渡しています。

これによって関数`getTotalPrice`内で、
受け取った関数を`getPriceFunc`として利用しています。


```swift

/* 日本の消費税で税込み価格を取得 */
func getPriceJPY(#price:Double) -> Int{
    return Int(price * 1.08)
}

/* スウェーデンの消費税で税込み価格を取得 */
func getPriceSWE(#price:Double) -> Int{
    return Int(price * 1.25)
}

// コーヒーの値段
let COFFEE_PRICE:Double = 300


/* 指定した金額と個数の税込み価格を取得します。 */
func getTotalPrice(#getPriceFunc:(Double) -> Int, #price:Double, #count:Int) -> Int {
    return getPriceFunc(price) * count
}

getTotalPrice(getPriceFunc: getPriceJPY, price: COFFEE_PRICE, count: 3) // 972
getTotalPrice(getPriceFunc: getPriceSWE, price: COFFEE_PRICE, count: 3) // 1125

```

## ③関数を戻り値に指定

下記のように、
関数の戻り値に`(引数：引数の型) -> 戻り値の型`を指定することで、
関数を戻り値に指定することができます。

```swift

func 関数名(引数:引数の型) -> (引数：引数の型) -> 戻り値の型 {
	
	func 

	return 戻り値
}
```


例を見てみましょう。

国コードを指定して、
国内と国外で異なる手数料込みの金額を取得するコードです。

※enumを使ってもっと良い書き方ができますが、
今回は関数を戻り値にする例ということで悪しからず。。。


`getPriceFunc`内に
`getDomesticPrice`と`getForeignPrice`という二つの関数があります。

`getPriceFunc`は引数に指定したCountryCodeが
`CountryCode.JPN`であれば`getDomesticPrice`を
それ以外であれば`getForeignPrice`を返す関数になります。


```swift

/* 国コード */
enum CountryCode {
    case JPN // 日本
    case KOR // 韓国
    case CHN // 中国
}

/* 手数料込みの値段を取得する関数を取得。 */
func getPriceFunc(countryCode:CountryCode) -> (price:Double) -> Int {
    
    /* 国内用(日本) */
    func getDomesticPrice(#price:Double) -> Int {
        return Int(price * 1.05)
    }
    
    /* 国外用(日本以外) */
    func getForeginPrice(#price:Double) -> Int {
        return Int(price * 1.25)
    }
    
	/* 指定したcountryCodeによって返す関数を分岐 */
    if countryCode == CountryCode.JPN {
        return getDomesticPrice
    }else{
        return getForeginPrice
    }
}

// 関数getDomesticPriceのオブジェクト
var getPriceForJPN = getPriceFunc(CountryCode.JPN)

// 関数getForeginPriceのオブジェクト
var getPriceForCHN = getPriceFunc(CountryCode.CHN)

println(getPriceForJPN(price: 3000)) // 3150
println(getPriceForCHN(price: 3000)) // 3750

```

`getPriceForJPN`には`getPriceFunc`で
`CountryCode.JPN`を指定しているので
**getDomesticPrice**が入ります。



`getPriceForCHN`には`getPriceFunc`に
`CountryCode.JPN`ではない値を指定しているので
**getForeignPrice**が入ります。
Rubyを使ったWebレスポンス監視

今回はWindows環境でグラフィカルにモニタリングできる仕掛けを作ります。
画面描画にはJavaFXが便利なので、jrubyfxというRubyWrapperを使ってみます。

#準備

##Java(JDK)をインストール
[Oracleダウンロードサイト](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
私の場合は、「jdk-8u45-windows-x64.exe」を選択

##JRubyをインストール
[JRubyダウンロードサイト](http://jruby.org/)
私の場合は、x64(exe)を選択。この当時の最新バージョンは9.0.0.0.pre1。

##仕様するgemをインストール
今回は、RubyからPing等を使えるようになるnet-pingを使います。

```
jgem install net-ping
jgem install win32-security
jgem install jrubyfx
```

jgemはJRubyのgemです。コマンドプロンプトから実行します。

#コーディング
ハマったポイントをご紹介します。

## JRubyでNet::Ping::Externalは動かない
[net-pingのソースコード](https://github.com/djberg96/net-ping/blob/master/lib/net/ping/external.rb)を見たらわかるのですが、残念ながらExternalクラスはJVMをサポートしていません。

## JRubyでNet::Ping::ICMPを使う場合、管理者権限が必要
考えると当たり前なのですが、直接RawIPSocketを作ることになるため、一般ユーザで実行できません。権限を与えても良いかもしれませんが、今回は見送りました。

## Net::Ping::HTTPを使う
実は、単にRTT値が欲しかっただけなのですが、HTTPのレスポンスでもいいかな？ということに途中で気づきまして、これを採用しました。
コードで書くと以下のようになります。

```ping.rb
require 'net/ping'

def sendping
  server = 'scanme.nmap.org'
  @pinger = Net::Ping::HTTP.new(server, timeout = 1)
  if @pinger.ping?
    rtt_value = @pinger.duration
  else
    rtt_value = 9999
  end
end
```

durationは、通信開始時間と通信終了時間の差が秒単位（小数点以下第三位まで）で入ります。通信プロトコル上のRTTではなく、アプリケーションから見た時のRTTが入っています。（経験的に100～200msくらい上乗せされています）

この関数を定期的に実行しながら、変化するrtt_valueを使ってグラフィカルに画面描画していくようにします。具体的には、jrubyfxのplay（名前は何でもよいですが）関数で以下のように書きます。以下の例は、2秒おきに実行します。

```ping.rb
def play
  sendping
  handler = EventHandler.impl { |n, e| sendping }
  time = Timeline.new
  time.cycle_count = :indefinite
  time.keyFrames << KeyFrame.new(2000.ms, handler)
  time.play
end
```

あとは、rtt_valueによって絵が変わるように、JavaFXの仕掛けを使って描画です。
ifとelseの繰り返しなので、割愛します。
状態空間モデルの一般周期成分モデルを試す


## 概要
「Rによる動的線形モデル」に載っている、一般周期成分モデルを試す。
あまり他の本に載っていないが、非常に便利。
通常の状態空間モデルで周期成分を表現する場合、周期成分の周期は外部から与えなければならない。つまり、観測行列を固定することで周期を表現する。

しかし、一般周期成分モデルでは周期を最尤推定することが可能であり、非常に柔軟な周期性の表現ができる。
また、異なる周期で構成される系列を合成することが可能っぽい。

詳細な数式は本を参照されたいが、いろいろ読んだけど、この本でしか見たことがないのは私だけでしょうか。

とりあえず、dlmパッケージに含まれるdlmModTrig関数を使うことで簡単に実装ができるので、感触だけでも見てみる。

## 実装

RPubbにあげた。

http://rpubs.com/hironishi/general_seasonal

## 感触

今回は確率的トレンドモデルと一般周期成分を合わせて使って、トレンド成分と周期成分の分離を試みた。
使用データは米国の月次雇用統計データを使用した。

トレンド成分とレベル成分の分散は所与として、周期成分とその分散を最尤推定している。

トレンド成分の分散を小さくしていくことで、トレンド成分の値は定数に近くなるため、そのしわ寄せが周期成分に来て、観測値を周期成分だけで説明しようとするようになるっぽい。

これは便利なので、もう少し勉強する必要がありそう。
よく使うGitコマンド

# 一般
git add .
git commit -m "comment"
git push -u origin master dev
git push --force origin master dev

### 最新のコミットメッセージの変更
git commit --amend -m "新しいメッセージ" # 最新のコミットメッセージの変更
# リモート
git remote add origin URL # リモートのAdd
git remote set-url origin URL # リモート(origin)のURL変更

### 複数のリモート登録
git remote add mysrv URL # originと違う名前(mysrv)指定してリモート追加
git remote set-url mysrv URL # リモート(mysrv)のURL変更

これで
git push -u mysrv dev # mysrvとして登録したURLのリポジトリにブランチdevをプッシュ
とかできる

git remote -v # リモートのURL確認

# クローン・プル・チェックアウト・ブランチ・フェッチ
git clone URL # 指定URLのリポジトリをローカルにコピー
git branch -a # ブランチ一覧表示
git branch -d <branch> # ブランチの削除
git checkout <branch> # ただチェックアウト
git checkout -b dev origin/dev # cloneしてきてローカルにmasterしかないとき、ローカルにdevというブランチを新たに作る、それはリモートoriginのdevと同じ内容。
git pull origin new-branch:new-branch

remoteにあるのが正義，localにあるものはいらないという時は
git reset --hard origin/branch
とするとremoteの内容で完全に上書きされる．(localの情報が失われるので注意)

git fetch # fetch?

git branch -D <branch> # Delete Branch

# スタッシュ（変更内容のクリーン）
stash save # 現在の作業を一時的に退避
stash list # 退避した作業の一覧を表示
stash drop # 退避した作業を削除
stash clear # 退避した作業を全て削除したい

# リベース
古いコミットから生やしたブランチからマージ先のブランチにpull requestを送ると，衝突したら迷惑をかけることになる．そのため事前に最新のマージ先ブランチのコミットにリベースをしてからpull requestを送る．

### リベース衝突の解消
衝突した場合，ツリーの一番上に衝突情報が表示される

衝突したファイルを手動で修正し，

```
git add <衝突したファイル>
git rebase --continue
```

SourceTreeの場合は衝突したファイルを手動で修正してコミットを押した後，リベースを続けるを選択．

### リベースを取りやめたい場合

```
git rebase --abort  # リベースのキャンセル
```
それぞれのコミットが差分を保持しているため，最終的な状態が衝突しない状態であったとしても，一つでも衝突するコミットがあると衝突する．

# タグ
git tag # タグの一覧表示
git checkout refs/tags/<tag> # タグをチェックアウト
git checkout -b <branch> refs/tags/<tag> # ブランチを作成してタグをチェックアウト


# リモート上では削除されているのにローカルにまだ参照が残っているブランチの削除
git remote prune --dry-run origin # remoteブランチでは削除されているが、ローカルに参照が残っているブランチを表示
git remote prune origin # すでに削除されているremoteブランチのローカル参照を削除してきれいにする
http://qiita.com/kony/items/f0fb18b04bd5337132e3
# 設定
git config --global user.name "taro"
git config --global user.email taro@example.ac.jp

# 追跡されているファイルを後から.gitignoreにファイルに入れた場合

```
$ git rm -r --cached .
```

で、すべてadd, commit すると、diffにはgitignoreにいれたファイルの削除分だけ入る。

# Git LFS
コミット

```
$ git lfs install # LFS を使うようにrepository initialize
$ git lfs track "*.jpg" # jpg を LFS の対象にする
$ git add *
$ git commit -m “first commit”
$ git lfs ls-files
# コミットされたLFS対象ファイルが表示される

$ git push origin master
```



```
# LFSをSkipしてClone
$ GIT_LFS_SKIP_SMUDGE=1 git lfs clone <url>
```
ruby:メモ

# ruby:メモ

## コーディング規約
- http://shugo.net/ruby-codeconv/codeconv.html
- http://www.loveruby.net/w/RubyCodingStyle.html
- http://www.caliban.org/ruby/rubyguide.shtml
- https://github.com/styleguide/ruby
- https://github.com/thoughtbot/guides
- https://github.com/cookpad/styleguide

## 覚えておきたいメソッド

```rb
"hello, world".upcase
=> "HELLO, WORLD"
```
```rb
"hello, world".reverse
=> "dlrow, olleh"
```
```rb
"hello, world".methods
=> [:<=>, :==, :===, :eql?, :hash, :casecmp, :+, :*....
```
```rb
object_id(=self.object_id)
=> 17084920
```
```rb
1.+(1)(=1 + 1)
=> 2
```
```rb
object.singleton_methods
=> [:to_s, :inspect, :context, :conf, :irb_quit,...
```
```rb
hello = "hello, world"
hello.class
=> String
```
## クラスとインスタンス

### インスタンス変数の定義
```rb
class Book
	def author
		@author
	end
	def title
		@title
	end
	def isbn
		@isbn
	end

	def author=(author)
		@author = author
	end
	def title=(title)
		@title = title
	end
	def isbn=(isbn)
		@isbn = isbn
	end
end
```
↓等価↓

```rb
class Book
	attr_accessor :author, :title, :isbn
end
```


### 外部ファイルの読み込み
```rb
require_relative 'book'
=> true
```

### インスタンス生成
```rb
book = Book.new
=> #<Book:0x007fba434564f3>
```

### 値の設定
```rb
book.author = "jon smith"
=> "jon smith"
```

### 値の取得
```rb
book.author
=> "jon smith"
```
Rubyでプログラムの処理速度を計測する

Rubyでは、言語に付属している[benchmark](http://docs.ruby-lang.org/ja/2.2.0/library/benchmark.html)ライブラリを使って簡単に速度計測が出来ます。

```rb:使い方
require 'benchmark'

# ラベル行の表示
puts Benchmark::CAPTION

# データ計測
result = Benchmark.measure{
  # 計測したい処理
  require 'xmlsimple'
  hash = XmlSimple.xml_in(open('path/to/file.xml'));
}

# 結果表示
puts result
```

```bash:実行結果
      user     system      total        real
 11.160000   0.160000  11.320000 ( 11.402827)
```

なお、計測結果の読み方は以下の通りです(基本、Linuxの`time`コマンドと一緒です)。

- user
    - ユーザモード（ユーザプログラムを実行するモード）で消費するCPU時間
- system
    - システムモード（OSのプログラムを実行するモード）で消費するCPU時間
- total
    - userとsystemの合計
- real
    - 実行（呼び出しから終了まで）にかかった実時間
Ubuntu14.04にCaffeをインストール(CPUモード)

Caffeの導入手順について。CPUモード編。
GPUを使う場合はもっと面倒ですが、こっちも十分時間がかかります。
VirtualBox上で試しました。(Ubuntu14.04 LTS)
ほとんど以下のサイトの通りでできるのですが、一部補足してあります。
参考：[Ubuntu 14.04 上での Caffe の導入手順メモ](http://www.nal.ics.es.osaka-u.ac.jp/personal/k-yamanishi/CaffeUbuntu.html)

たまにaptもpipもインストールに失敗することがあるので、気をつけてください。


#CUDAのインストール

```sh
# 最新版をインストール
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0-28_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
```

#BLASのインストール
行列計算のライブラリ。MKL, OpenBLASなどでもいいらしいですが、ATLASがデフォルトのようなのでこれをインストール。

```sh
$ sudo apt-get install libatlas-base-dev
```

#他の依存関係

```sh
# g++はこのバージョンじゃなきゃならない。
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler g++-4.6
```

# Caffe のダウンロード

```bash
# gitが入ってなければ
$ sudo apt-get install git

# home直下に置きます。わかる人は好きなところにどうぞ。
$ cd
$ git clone https://github.com/BVLC/caffe.git
```
#Makefile.config の設定
```bash
$ cd caffe
$ cp Makefile.config.example Makefile.config
$ vi Makefile.config
```

```makefile:Makefile.config
#8行目をアンコメントアウト
# CPU_ONLY := 1
↓
CPU_ONLY := 1

#12行目をアンコメントアウトしてバージョンを指定
# CUSTOM_CXX := g++ 
↓
CUSTOM_CXX := g++-4.6

#15行目。おそらく変えたほうが良い。バージョンに合わせる。lsで確認を。
CUDA_DIR := /usr/local/cuda
↓
CUDA_DIR := /usr/local/cuda-7.0

```
# コンパイル
`$ make -j4 all` のようにすると並列処理ができる。数字はCPUのコア数。
時間がかかるのでフルパワーでやるのがおすすめ。

```bash
$ make all
$ make test
$ make runtest
```
テストが全部パスできればcaffeの環境構築は終了。
失敗した時は、問題を解決してから `$make clean`をして`$make all`からやり直し。

# Python でCaffe を使うための環境構築

python用のパッケージマネージャ

```bash
$ sudo apt-get install python-pip
```
下でscipyを入れる際に必要。

```bash
$ sudo apt-get install gfortran
```
pipで必要なライブラリのインストール

```bash
$ for req in $(cat ~/caffe/python/requirements.txt); do sudo pip install $req; done
```
足りないライブラリのインストール

```bash
$ sudo apt-get install python-dev python-numpy python-skimage
```
コンパイル。

```bash
$ make pycaffe
```
パスを通す。

```bash
$ vi ~/.bashrc
```

```bash:~/.bashrc
#適当なとこに書く
export PYTHONPATH=~/caffe/python/:$PYTHONPATH
```
反映させる

```bash
$ source ~/.bashrc
```
あとは

```bash
$ python
>>> import caffe
```
でcaffeが読み込まれればOK。お疲れ様です。
C/C++で他のファイルをincludeして文字列として埋め込む方法（OpenCLとか）

例えばOpenCLを使う時、ソースコードを文字列として実行時にコンパイラに渡しますが、それだと

* .clを別ファイルとして毎回ファイル読み込みする
* .clをリソースファイルとして埋め込む（Windowsの場合）
* 諦めてソースコード中に文字列として直書きする

という辺りが一般的ですが、それもちょっとイマイチです。

で、以前のアドベントカレンダーで @tap4453 さんが『[マクロを使って便利にOpenCL](http://qiita.com/tap4453/items/8161709e2b060c6d5d6c)』という記事を書いていたのですが、そのままだとうまくいかなかったので、私の使い方をメモしておきます。

```c:device.cl
#ifndef OCL_EXTERNAL_INCLUDE
#define OCL_EXTERNAL_INCLUDE(x) x
#endif

OCL_EXTERNAL_INCLUDE(
kernel void func(global double dst[])
{
	const int i = get_global_id(0);
	dst[i] = i*i;
}
)
```

```cpp:host.cpp
#define OCL_EXTERNAL_INCLUDE(x) #x
const char srcStr[] =
#include "ocl.cl"
;

cl::Program::Sources sources;
sources.push_back(std::make_pair(srcStr, std::strlen(srcStr)));
cl::Program program(context, sources);
program.build(devices);

```

としておくと、``srcStr``が文字列としてdevice.clの内容を持ってくれます。
文字列の長さは```std::strlen```でとれますね。

OpenCL関係なくても、別のファイルを埋め込めるのは地味に便利です（UIテキストとか計算の入力値とか）。
C++で書きましたがCでも同じはず・・・。

ほんとに出来るのか試したい人は[bitbucketに実際の使用例が置いてある](https://bitbucket.org/aokomoriuta/simd/src/1b1d74959e6946c2f4db2f178f4c18b822b4dcdc/ocl/)のでご覧ください。

ちなみに、「OpenCLはCUDAと違ってソースコードを文字列で持つのが嫌！」みたいなのたまに聞きますが、逆に最適化極めたい場合は実行時にソースコードを変更したり生成できたりするので、これはこれで利点だと思ってます。
ViennaCLなんかは、計算式は式テンプレートで持っておいて、コンパイルするカーネルはそれぞれ最適な感じで生成しますしね。
Pythonをソースインストールして導入

1.ダウンロード

```
# wget http://www.python.org/ftp/python/3.3.3/Python-3.3.3.tgz

100%[===================================================================================================================>] 16,808,057  23.0M/s 時間 0.7s    

2015-04-26 13:15:57 (23.0 MB/s) - `Python-3.3.3.tgz' へ保存完了 [16808057/16808057]
```

2.解凍

```
# tar zxvf Python-3.3.3.tgz
```

3.configure
・Makefileが出来ていれば大丈夫なはず

```
# cd  Python-3.3.3
[root@v157-7-196-182 Python-3.3.3]# ./configure --prefix=/usr/local/python
creating Modules/Setup
creating Modules/Setup.local
creating Makefile
```

4.Maketest
・なぜかエラー・・・URL不一致？

```
# make test 
======================================================================
FAIL: test_geturl (test.test_urllibnet.urlopenNetworkTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/root/Python-3.3.3/Lib/test/test_urllibnet.py", line 88, in test_geturl
    self.assertEqual(gotten_url, URL)
AssertionError: 'https://www.python.org/' != 'http://www.python.org/'
- https://www.python.org/
?     -
+ http://www.python.org/


----------------------------------------------------------------------
Ran 13 tests in 0.472s

FAILED (failures=1, errors=3)
test test_urllibnet failed
make: *** [test] エラー 1
```

5.(構わず)Make
・行けた

```
# make 

# ll /usr/local/python/bin/python3.3
-rwxr-xr-x. 2 root root 7785682  4月 26 14:26 2015 /usr/local/python/bin/python3.3
```


6.インタラクティブモードで実行


```
# python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello, World!"
Hello, World!
```

とりあえずDone!
Ubuntuで最新版PyCharmを使う

UbuntuでPyCharm使おうとしたらはまったのでメモ。  

**結論**：使えるようになった  

#PyCharmのインストール
##PyCharmをダウンロード  
[ここから](http://www.jetbrains.com/pycharm/download/)PyCharm community Editionをダウンロード  

##PyCharmを展開
```tar xvzf pycharm-community*.tar.gz -C /tmp/```  

##移動とか  
```sudo su -c "chown -R root:root /tmp/pycharm*"```
```sudo mv /tmp/pycharm-community* /opt/pycharm-community```  

##シンボリックリンク作成  
```sudo su -c "ln -s /opt/pycharm-community/bin/pycharm.sh /usr/local/bin/pycharm"```
```sudo su -c "ln -s /opt/pycharm-community/bin/inspect.sh /usr/local/bin/inspect"```
  
##起動!!  
さっきシンボリックリンクを作ったので  
```pycharm```  

これでできるはず。  

#JDK/JRE
##JVMのエラー？
先程までの手順で行けると思ったら、エラー出て動かなかった。
```Unrecognized VM option 'MaxPermSize=350m'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.```

##OpenJDKのアンインストール
UbuntuだとOpenJDKがデフォルトで入っているのかな?  
PyCharmはOracle Javaつかえという記事が結構見つかるので、OpenJDKを消す
```sudo apt-get remove openjdk*```  

##リポジトリ追加　　
ppa追加する
```sudo add-apt-repository ppa:webupd8team/java```

##Javaインストール
```sudo apt-get install oracle-java8-installer```  
何が理由かわからないけど自分の環境にはJava9が入ってた…orz  
こいつのせいで上記エラーが出ていたんだと思う。下記でアンインストール後、改めてJava8入れなおしました。

###Javaアンインストール  
```sudo apt-get remove oracle-java7-installer```  

#PyCharm起動!!  
コマンドラインで以下のコマンドを叩いてPyCharm起動
```pycharm```  
動いた!!  

![Screenshot-PyCharm Community Edition.png](https://qiita-image-store.s3.amazonaws.com/0/76794/7805e999-5d72-7f4a-232f-b17227d91ff4.png)  

メニューが英語のままなのとか、フォントとかはあとから調べて調整かな。これでIDE使って開発できる。  

#追記
実は以下の手順で簡単にインストールできるみたいだけどリポジトリにあるバージョンが入ると思うのでおそらく最新ではない（…はず）。  

```
wget -q -O - http://archive.getdeb.net/getdeb-archive.key | sudo apt-key add -

sudo sh -c 'echo "deb http://archive.getdeb.net/ubuntu $(lsb_release -sc)-getdeb apps" >> /etc/apt/sources.list.d/getdeb.list'

sudo apt-get update  
sudo apt-get install pycharm
```
Railsのルーティングでドットを含んだURLを生成

## 
Railsで、`/skills/react.js`みたいな、ドット入りのURLを実現したいとき。

ドットはhtmlやjsonなどのフォーマットを表すのに利用するため、例えば

```rb:config/routes
get "/skills/:name" => "skills#show"
```

と書いて、`/skills/react.js`にアクセスしてもうまくいかない。
ログを見ると、ドット以降のURLは省かれ、`Parameters: {"name"=>"react"}`となっているのが分かる。（ホントは`params[:name]`に`"react.js"`が入ってほしい）

これを回避するには、`:constraints`オプションを利用して、動的セグメント部分（`:name`）のフォーマットに制約を付ける。

参考: [Rails のルーティング — Rails ガイド](http://railsguides.jp/routing.html#セグメントを制限する)  


上記のルーティングを以下のように変更する。

```rb:config/routes
get "/skills/:name" => "skills#show", constraints: { name: /[^\/]+/ }
```

`:name`の部分に許可する文字列を正規表現で指定。上の例だとスラッシュ以外の文字列を許可したことになる。
再度アクセスすると、`Parameters: {"name"=>"react.js"}`になっており、ドット入りの動的URLを利用することが可能になっているのが分かる。
exercise.ioの事前インストール



ココから勉強しまーす！

```
# curl -O https://raw.githubusercontent.com/exercism/cli-www/master/public/install                                                    
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
101  3463  101  3463    0     0   5991      0 --:--:-- --:--:-- --:--:-- 18718
# chmod +x install

# ./install
install client into: [/usr/local/bin] 
\nDownloading https://github.com/exercism/cli/releases/download/v2.0.2/exercism-linux-64bit.tgz...\n
Installed exercism to /usr/local/bin
# ll /usr/local/bin/exercism 
-rwxr-xr-x. 1 mysql games 7833408  4月  2 12:09 2015 /usr/local/bin/exercism
```


<参考>http://ninoseki.hatenablog.com/entry/2014/10/11/_Exercism.io%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E5%AD%A6%E3%81%B6
EC2のインスタンスをテストのために気軽に立ち上げてみる


EC2のインスタンスをテスト用に立ち上げることが多くなってきたので、その方法を備忘録として。

今回はすでにアカウントがあるものとして進める。


## インスタンスの選択〜

サービスから *** EC2*** を選択し`Launch Instance`からインスタンスの選択をスタートする

![step1.png](https://qiita-image-store.s3.amazonaws.com/0/32801/c0a6893e-a263-474a-81b0-c1968143c426.png "step1.png")

### インスタンス内容を選択

#### Imageの選択

テストですぐに削除予定なので、最も最小のImageを選択できるように、少し下の方にある`Amazon Linux AMI`を選択。
一番上にあるものと間違わないように注意。

![step2.png](https://qiita-image-store.s3.amazonaws.com/0/32801/303569f9-c184-40d0-510d-122d6091ed00.png "step2.png")

#### インスタンスのサイズを選択

最も小さい`t1.micro`を選択

![step3.png](https://qiita-image-store.s3.amazonaws.com/0/32801/0cc5143e-d8f3-8bbe-29f3-bf0ef7c57414.png "step3.png")

#### インスタンスの設定

デフォルトのまま次に進む。
各種の設定に関しては、以下のページに詳しく紹介されています。
[AWS EC2インスタンス作成手順(CentOS 6)](http://qiita.com/na0AaooQ/items/2774f63f540969a55941)

![step4.png](https://qiita-image-store.s3.amazonaws.com/0/32801/c31bcaf7-58d1-6ab9-101a-0ca2c9df17d3.png "step4.png")

#### ストレージの追加

デフォルトのまま次に進む。
テスト用なので、一番小さいもので特に変更はなし。

![step5.png](https://qiita-image-store.s3.amazonaws.com/0/32801/1162b850-e962-f6b7-3ef4-33d517729810.png "step5.png")

#### Tagの設定

ここは適宜、名前を設定。

![step6.png](https://qiita-image-store.s3.amazonaws.com/0/32801/134c1f1c-7449-201a-0b1c-af0e7cfb412d.png "step6.png")

#### セキュリティグループの設定

既存のセキュリティグループがない場合は、新規追加。
NameとDescriptionは、適当に追加。
テストのため、手元のMacからアクセスするだけなので、`Source`は`My IP`を選択。`My IP`を選択すると、自動的に入力される。

![step7.png](https://qiita-image-store.s3.amazonaws.com/0/32801/f5eda5d3-3fcd-1fe8-51f6-6f1a0c0349a6.png "step7.png")

#### 設定確認

これまでの設定を確認する。問題がなければ`Launch`する。

![step8.png](https://qiita-image-store.s3.amazonaws.com/0/32801/df7496a8-0aef-746e-908a-4d40511a6381.png "step8.png")

#### SSHログイン用のkey pairを設定

ここでは、すでにあればそちらを利用。
今回は始めてだったため、`Create a new key pair`を選択し、 *Key Pair Name* に好きな名前を設定。
そして、`Download Key Pair` を選択し、ダウンロードする。

![step9.png](https://qiita-image-store.s3.amazonaws.com/0/32801/cb40d455-6604-00dd-a0f8-4a1e7720cfb4.png "step9.png")

#### インスタンス起動

Key Pairのダウンロードが完了した後、`Launch Instance`からインスタンスを起動する。

![step10.png](https://qiita-image-store.s3.amazonaws.com/0/32801/8971e326-0de3-57f3-785d-668d1d3cb3d6.png "step10.png")
 

#### IPアドレス/DNS確認

EC2のダッシュボードからIPアドレスやDNSなど、サーバにログインするために必要な情報を確認しておくこと。


### EC2インスタンスへのSSログイン

####ターミナルからログイン

```bash
ssh -i {.pem_file} ec2-user@IPアドレス(or DNS)
```

Key Pairを作成した後、ダウンロードしていおいたキーファイルを用いてログインを行う。
初回のユーザは、`ec2-user`である。

####初期設定

```bash
sudo us -
useradd new_user
passwd new_user
visudo  # sudo 設定

mkdir /home/new_user/.ssh
cp /home/ec2-user/.ssh/authorized_keys /home/new_user/.ssh/
chown -R new_user:new_user /home/new_user/.ssh
chmod -R 600 .pem_file
```

ここで新しいユーザでログインし直し、セキュリティのことを考慮してデフォルトのユーザを削除しておく。
また、最後に`yum update`を実施しておく。

```bash
userdel ec2-user 
sudo yum update
```

### EC2インスタンスの削除

テストが終わった時点で不要となったインスタンスに関しては、削除することを忘れないようにする。

#### 削除手順
インスタンスを選択し、[Actions] をクリックして [Instance State] を選択した後、[Terminate] をクリック。ここでは、オフィシャルの[ドキュメント](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/terminating-instances.html#terminating-instances-console)を参考にした。

### 最後に
EC2は1時間単位で課金されていくということだが、microのものであれば、数時間だとほとんどコストとならないので、実施のサーバで気軽にミドルウェアのインストール手順などを実行できるのが嬉しい気がした。
【javascript】ヒアドキュメント(自分用)

他所で拾ったヒアドキュメントの書き方を関数化して
テンプレート風に使えるようにしたもの

```js:javascript
/**
 * ヒアドキュメント実装
 * 'function(){/＊' から '＊/}'の間の文字列を取得する
 * オブジェクト{key:value,...}を渡せば'{@key}'をvalueに変換する
 */
function heredoc(data,func){
    var _data=null, _func=null;

    // 初期化
    if (typeof func === 'undefined') {
        _func = data;
        _data = {};
    } else {
        _func = func;
        _data = data;
    }

    // functionでなければ処理をしない
    if (typeof _func !== 'function') throw new Error(_func + " is not a function");
    if (!(_data instanceof Object && !(_data instanceof Array))) throw new Error(_data + " is not a object");

    // ヒアドキュメント本体を取得
    var _doc = _func.toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

    // dataを回して変数の置換
    for (var _key in _data){
        var _reg = new RegExp("\\{@"+_key+"\\}","g");
        var replacement = _data[_key];
        _doc = _doc.replace(_reg, replacement);
    }

    return _doc;
}

```

※追記

使い方

```js
// パラメタなし
var doc = heredoc(function(){/*
<div>
  <span>HEREDOCUMENT</span>
</div>
*/})

// パラメタあり
var doc = heredoc({
  mes:"HEREDOCUMENT"
},function(){/*
<div>
  <span>{@mes}</span>
</div>
*/})

```
GojiのアクセスログをJSON形式で出力する


Gojiのデフォルトのアクセスログはあまりセクシーではないので、JSON形式で出力できればfluentd等のログプロセッサとの相性も高まり、利便性が向上しそうなので試してみました。

## Logrus / glogrus

[github.com/Sirupsen/logrus](https://github.com/Sirupsen/logrus)はGoで利用できるロガーで、出力フォーマットを自由に設定することができます。今回は、これを利用してJSON形式でアクセスログを出力させるようにします。

GojiアプリケーションからLogrusを利用するには、[github.com/goji/glogrus](https://github.com/goji/glogrus)を利用するのが簡単です。これはLogrusのインスタンスを渡すと、それををロガーとして使用できるようにするGojiミドルウェアでです。

```go
import(
    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web/middleware"
    "github.com/goji/glogrus"
    "github.com/Sirupsen/logrus"
)
```
```go
// ロガーを生成し、出力フォーマットと出力ファイルを設定する
logger := logrus.New()
logger.Formatter = new(logrus.JSONFormatter)
f, _ := os.OpenFile("/var/log/my_app.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
logger.Out = f

// 生成したロガーをGojiで使用するようにする
goji.Use(glogrus.NewGlogrus(logger, "my_app"))

// Gojiデフォルトのロガーを無効にする
goji.Abandon(middleware.Logger)

// Gojiアプリケーションの開始
goji.Serve()
```

上記のようにすることで、アクセスログをJSON形式で出力できるようになりました。ここではJSON形式を選択しましたが、Formatterを変更することで他の形式でも出力することができるようになります（たとえば、LTSVなら[github.com/doloopwhile/logrusltsv](https://github.com/doloopwhile/logrusltsv)を利用できます）。
『UNIXという考え方』読書録


# 定理

## スモール・イズ・ビューティフル

* 小さなプログラムは分かりやすい
* 小さなプログラムは保守しやすい
* 小さなプログラムはシステムリソースにやさしい
* 小さなプログラムは他のツールと組み合わせやすい 

## 一つのプログラムには一つのことをうまくやらせる

* 一つのことに集中することで、プログラムに不要な部分をなくせる

## できるだけ早く試作する

* 試作によって学ぶ
* 早い試作はリスクを減らす

## 効率より移植性

* プログラムを速くすることに時間をかけない
* 最も効率の良い方法は、ほとんどの場合移植性に欠ける
* 移植性のあるソフトウェアは、ユーザーのトレーニングを時間も減らす
* よいプログラムは死なず、ただ新しいハードウェアに移植されるのみ

## 数値データはASCIIフラットファイルに保存する

* データにも移植性を持たせる

## ソフトウェアを梃子として使う

* よいプログラマはよいコードを書く。偉大なプログラマはよいコードを借りてくる
* 独自技術症候群を避ける
* コードを他人が梃子として使うのを認める
* すべてを自動化する

## シェルスクリプトによって梃子の効果と移植性を高める

* シェルスクリプトにはおそろしいほどの梃子の効果がある
* シェルスクリプトは梃子の効果で時間も節約する

## 過度の対話的インターフェースを避ける

* 拘束的プログラムはユーザーを人間と想定している
* 拘束的コマンドパーサは、大きく醜い
* 拘束的プログラムは「大きいものは美しい」的アプローチをとる
* 拘束的プログラムは、他のプログラムと結合するのが難しい
* 拘束的ユーザーインターフェースはスケーラビリティに欠ける
* 拘束的ユーザーインターフェースは、ソフトウェアの梃子の効果を利用できない

## 全てのプログラムをフィルタとして設計する

* 全てのプログラムはフィルタである

# 小定理

* 好みに応じて自分で環境を調整できるようにする
* オペレーティングシステムのカーネルを小さくする
* 小文字を使い、短く
* 紙のドキュメントを用いない
* 沈黙は金
* 同時に考える
* 部分の総和は全体よりも大きい
* 90パーセントの解を目指す
* 劣るほうが優れている
* 階層的に考える
SUM(CASE WHEN)を使った条件付き集計


MySQLのSUM関数で、集計条件を指定できることがわかったのでメモ。

```sql
SELECT SUM(CASE WHEN flag = 1 THEN 1 ELSE 0 END) FROM table
```

売上予定テーブルを作って、プロジェクトごとの売上額と、当月時点の売上残を集計してみる。

```sql
CREATE TABLE `売上予定` (
  `id`                int	        NOT NULL AUTO_INCREMENT,
  `プロジェクトID`      varchar(3)    NOT NULL,
  `計上年月日`         date           NOT NULL,
  `金額`              decimal(11,2)  NOT NULL,
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

データを用意します。

- プロジェクト001は、1月〜6月まで毎月100,000円を売上予定
- プロジェクト002は、3月〜4月まで毎月50,000円を売上予定

```sql
INSERT INTO `売上予定` VALUES (1, '001', '2015-01-31', 100000);
INSERT INTO `売上予定` VALUES (2, '001', '2015-02-28', 100000);
INSERT INTO `売上予定` VALUES (3, '001', '2015-03-31', 100000);
INSERT INTO `売上予定` VALUES (4, '001', '2015-04-30', 100000);
INSERT INTO `売上予定` VALUES (5, '001', '2015-05-31', 100000);
INSERT INTO `売上予定` VALUES (6, '001', '2015-06-30', 100000);
INSERT INTO `売上予定` VALUES (7, '002', '2015-03-31', 50000);
INSERT INTO `売上予定` VALUES (8, '002', '2015-04-30', 50000);
```

プロジェクトごとの売上額と、4月末の売上残を集計してみます。

売上額は単純にSUM(金額)で集計します。

売上残は計上月が4月以降の金額を合計したいので、`SUM(case when)`を使って集計条件を指定しています。

```sql
SELECT
  `プロジェクトID`,
  SUM(`金額`) AS `売上額`,
  SUM(CASE WHEN `計上年月日` > '2015-04-30' THEN `金額` ELSE 0 END) AS `売上残`
FROM `売上予定`
GROUP BY `プロジェクトID`;
```

SQLを実行すると、次のような結果になります。

```
プロジェクトID	売上額		売上残
001				600000.00	200000.00
002				100000.00	0.00
```
よく使うgitコマンドをまとめてみた

4月1日から入社し、エンジニアなるべく勉強しています。今日はgitのよく使うコマンドをメモ書いてみます。

**1. ブランチを作る**
`git checkout -b BRANCH-NAME`  

**2. ブランチを確認する**
 `git branch`
現在いるブランチには*がついている  

**3. ブランチを変更する**
`git checkout BLANCH-NAME`

**4. 変更したファイルのリストを確認する**
`git status`  

**5. 変更したコードを確認する**
`git diff` ← 変更された部分全てが一度に出てくる
`git diff FILE-NAME` ← 指定したファイルの変更した部分が出てくる  

**6. ローカル環境からステージング環境にファイルをあげる**
`git add .` ← 今いるディレクトリの下の全てのファイルをあげる
`git add FILE-NAME` ← 指定したファイルのみをあげる  

**7. ローカル環境からステージング環境にあげたファイルのバージョン情報あげる**
`git commit -m YOUR-COMMENT`

**8. リモート環境にあげる**
・ブランチを作って（ブランチを切るって言うらしい）、そのブランチのままあげる場合
`git push origin BRANCH-NAME`
GitHubにいくとpullrequestができるようになっているので、コードレビューがしやすいです。ここからmasterマージ(統合)することができます。
・masterブランチにマージしてからあげる場合
`git checkout master` ← masterに移動する
`git merge BLANCH-NAME` ← ブランチにある変更をmasterにマージする
`git push origin master` ← GitHubにあげる
・ブランチを切らずにmasterで作業した場合
`git push origin master`

**9. GitHubにあるバージョンをローカル環境に持ってくる**
`git pull origin master`

**10. あるブランチで作業している時にブランチを変更したいとき**
*編集したファイルを退避しておく(表面上はなかったことにするみたいな・・・)
`git stash save FILE-NAME`　←　これで退避
`git stash list` ← 退避されているバージョンのリスト
`git stash pop`(一番最近に退避されたバージョンを取り出す) or　`git stash@{LIST-NUMBER} pop`(指定したバージョンを取り出す)
*おまけ
`git stash drop`(一番最近のバージョンを削除) or `git stash@{LIST-NUBER} drop'(指定したバージョンを削除)


最後のstashについてはあまり使ってないので、自信ないですが・・・
他の.ms(MAXScript)を読み込む方法

# 概要
メインのmaxscriptで他のmaxscript内に書いてある関数を利用したい！
等といった際にどうすればいいのか。

他の言語では include import とか言ったりするやつです。
（厳密に同じわけではないです。）


# include と fileIn の２つがある 
maxscriptでは上の2つのコマンドが読み込むコマンドとして準備されている。

include ： スクリプト内へのスクリプトの組み込み
[ヘルプから引用](http://docs.autodesk.com/3DSMAX/16/JPN/MAXScript-Help/)
> MAXScript には、コンパイル時ソースファイル組み込み機能があり、大きいスクリプトを小さいファイルに分割して、スクリプトの任意の位置に組み込むことができます。
`include <file>`構文を使って、その位置にファイルの内容を効果的に挿入できます。

fileIn  ： スクリプトの実行
[ヘルプから引用](http://docs.autodesk.com/3DSMAX/16/JPN/MAXScript-Help/)
> 次のようにリスナーから、または他のスクリプト内から fileIn() メソッドを使用してスクリプトを実行することもできます。


何を言っているかは3dsMaxを立ち上げてMAXScript Listenerで実際に走らせてみると分かりやすい。

include では...
書いてあるスクリプトの文章が書き出されて最後に OK と出てくる。

fileIn では...
スクリプトが実行されて処理が行われる。





# 結局 includeとfileInは何が違う？
公式サイトの双方の説明、特にincludeの方を見たことをま大雑把にまとめる。

## fileIn
* スクリプトの内容がグローバル スコープ　コンテキスト内にコンパイルされる

## include
* 名前付きファイルの内容に効果的に置換
* MAXScript スコープは組み込まれたファイル内に保持
* include <file> は、名前、リテラル、句読点などの新しいトークンが必要とされる位置であれば、どこにでも入れることができる

# まとめ
* スコープの違い
* 実行か、読み込みか

これを覚えておけばとりあえず問題なさそう。
エラーが起きる場合の検証は機会と時間があればやってみます。
Deviseの設定手順をまとめてみた。 その3　Deviseの日本語化編

--- 全体の流れ ---
[その1　導入編](http://qiita.com/itboze/items/ea0d9236d89fa24a7a1c)
[その2　ViewとControllerのカスタマイズ編](http://qiita.com/itboze/items/f991d54ff527edb844d9)
[その3　Deviseの日本語化編](http://qiita.com/itboze/items/a1b532004a9a8a57e296) ←今ココ
[その4　ユーザーIDで、ログイン認証編](http://qiita.com/itboze/items/385d3cd539fc7578b52a) 


ところで、Deviseのログイン画面やサインイン画面、そして各種メッセージは、デフォルトは英語。
なので、運用を考えたら、やっぱり日本語化しないとね。

### 1. Gemfileに以下を追加

```rb
gem 'devise-i18n'
gem 'devise-i18n-views'
```

### 2. インストール

```console
$ bundle install
```

* `config/application.rb` で **`ja`** に設定

```rb
config.i18n.default_locale = :ja
```

以上です。