OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Registry 2使ってみた

## 参考

* [Docker Registry 2.0](https://hub.docker.com/_/registry/)

## dockerの利点

* jenkins で自動ビルド
    * ベンダーロックインの回避(クラウドベンダーの独自機能に縛られない)

## docker registryの起動

* [latestは0.9.1の様子](https://hub.docker.com/_/registry/)なので最新バージョンを指定。

```bash:5000番で待ち受け
docker run -d -p 5000:5000 \
  -v /data/registry:/tmp/registry \
  registry:2
```

* コンテナ側: /tmp/registry/
* ホスト側: /data/registry/

## pushの準備

```bash:何かイメージを用意。実際は自前でBuildしたものを使うでしょう。
docker pull centos:6
```

```bash:tagをつける
docker tag centos:6 localhost:5000/centos`date -I`
```

## push実施

```bash:localhostの5000番にpush
docker push localhost:5000/centos`date -I`
```

# イメージ一覧

* [distribution/api.md at master · docker/distribution](https://github.com/docker/distribution/blob/master/docs/spec/api.md)

```bash:
$ curl http://localhost:5000/v2/_catalog
{"repositories":["centos2015-09-03"]}
```

```bash:取得方法ほか
curl -s "http://localhost:5000/v1/search"
curl -s "http://localhost:5000/v2/_catalog"
curl -s "http://localhost:5000/v2/ubuntu/tags/list"
```

# docker-composeでimages指定

```bash:docker-compose.yml
app:
  image: localhost:5000/centos2015-09-03
```
[Android]ACRAを利用して好きなタイミングでクラッシュレポートを送信する

参考：
https://github.com/ACRA/acra/wiki/AdvancedUsage

ACRAライブラリを利用することでクラッシュレポートの通知ができます。
ただ、ネットワーク環境がない状態でエラーが発生した場合の状況も入手したかったので、
その方法をメモで残そうと思います。

エラー発生時はエラー情報をファイルに保存するだけにし、
ネットワーク環境につながっているときに後から送信するという方法で実装しました。


1. クラッシュレポート用のクラス作成
2. ReportSenderの作成
3. ACRAの設定

## クラッシュレポート用のクラス作成

クラッシュレポートの内容をファイルに保存、読み込みを行うクラス
※Read,Write処理部分は省略

```lang:CrashReport.java
public class CrashReport {
    private static final String CRASH_REPORT_FILE = "crash_report.txt";

    private Context context;
    private StringBuilder report = new StringBuilder();
    public CrashReport(Context context) {
        this.context = context;
        // ロード処理
        .
        .
        .
        report.append(loadData);
    }

    public void add(CrashReportData errorContent) throws JSONReportBuilder.JSONReportException{
        // レポートを追加
        report.append("\n------------------------------------------------------------\n");
        report.append(errorContent.toJSON().toString().replaceAll("\\\\n", "\n").replaceAll("\\\\t", "\t"));
    }

    public void save() throws IOException{
       // レポートの保存
    }

    public void send(String email){
        // メールでクラッシュレポートを送信
        Intent intent = new Intent();
        intent.setType("message/rfc822");
        intent.setAction(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("mailto:" + email));
        intent.putExtra(Intent.EXTRA_SUBJECT, String.format("Crash report![%s]", context.getPackageName()));
        intent.putExtra(Intent.EXTRA_TEXT, report.toString());

        context.startActivity(intent);
    }

    public void clear(){
        // クラッシュレポートのクリア
        report = new StringBuilder();
        try {
            save();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
```

## ReportSenderの作成
クラッシュしたときに動作するSenderクラスを作成

```lang:CrashReportSender.java
public class CrashReportSender implements ReportSender {

    @Override
    public void send(Context context, CrashReportData errorContent) throws ReportSenderException {
        CrashReport crashReport = new CrashReport(context);

        try {
            crashReport.add(errorContent);
            crashReport.save();
        }catch (Exception e){
            Log.e("CrashReportSender", "CrashReport save is failed.");
            e.printStackTrace();
        }
    }
}
```

## ACRAの設定
最後にACRAを設定して完了！

```lang:AcraCrashReportApplication.java
@ReportsCrashes(
        mode= ReportingInteractionMode.TOAST,
        resToastText = R.string.acra_dialog_text,
        resDialogCommentPrompt= R.string.acra_dialog_comment_prompt // 発生状況を入力する欄のラベル
)
public class AcraCrashReportApplication extends Application {
    @Override
    public void onCreate() {
        // The following line triggers the initialization of ACRA
        super.onCreate();

        // ACRAの設定
        ACRA.init(this);
        CrashReportSender sender = new CrashReportSender();
        ACRA.getErrorReporter().setReportSender(sender);
    }
}
```

```lang:AndroidManifest.xml
android:name=lang:AcraCrashReportApplication
```


あとは、どこかの画面でCrashReportのsendを呼び出せばOKです。
ループバックデバイスを使って普通のファイルをXFSファイルシステムとしてマウントしてみる

## はじめに
ext4でフォーマットされたルート領域のみの仮想VMで、どうしてもXFSの追加デバイスが必要になったため、以下の方法を用いて構築した。なお、OSは、Ubuntu 14.04を用いている。

ちなみに、自分は、OpenStack Swiftを構築する際にルート領域とは別デバイスが必要になったため、今回このような手法をとった。そのため、以下の方法はdevstackのソースコードをベースにしている。

## XFSパッケージのインストール

`xfsprogs`というパッケージが必要になる。

```swift

$ sudo apt-get install -y xfsprogs
```

## ループバックデバイスとなるファイルの作成
ファイルを配置するディレクトリの作成と、`touch`によるファイル作成を行う。

```shell-session
$ sudo mkdir -p /srv/node/images
$ sudo touch /srv/node/images/file.img
```

`truncate`コマンドによりSparseファイルを作成する。

```shell-session
$ sudo truncate -s 50G /srv/node/images/file.img
```

## ファイルシステムのフォーマット

XFSでフォーマットする

```shell-session
$ sudo /sbin/mkfs.xfs -f -i size=1024 /srv/node/images/file.img
meta-data=/srv/node/images/file.img isize=1024   agcount=4, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

fileコマンドで確認すると以下のとおりになる。

```shell-session
$ file /srv/node/images/file.img
/srv/node/images/file.img: SGI XFS filesystem data (blksz 4096, inosz 1024, v2 dirs)
```

## マウント

マウント先のディレクトリを作成する。

```shell-session
$ sudo mkdir -p /mnt/loop0
```

マウントする。

```shell-session
$ sudo mount -t xfs -o loop,noatime,nodiratime,nobarrier,logbufs=8 /srv/node/images/file.img /mnt/loop0
```

`df`コマンドで確認する。

```shell-session
$ df -h | grep loop0
/dev/loop0       50G   33M   50G   1% /mnt/loop0
```
MacにパッケージでインストールしたChefにプラグインを追加する

Macに最初から入っているgemでなくて、パッケージでchefをインストールしたばあい、パッケージでインストールされたgemでプラグインを追加する必要がある。
例えばdata bagを追加する場合

```bash
sudo /opt/chefdk/embedded/bin/gem install knife-solo_data_bag
```
EC2からJmeterをつかってRedshiftへクエリを投げる(負荷試験)

環境等は後で時間ができたときに記載

①【EC2】EC2へJmeterインストール
参考：http://blog.star-flare.com/2015/04/12/setup-apache-jmeter-to-amazon-linux/

②【EC2】postgreSQLのJDBCドライバを入手
※postgreSQLのバージョンは、EC2からRedshiftにつないだ時に確認できます
入手元：https://jdbc.postgresql.org/download.html

③【EC2】postgreSQLのJDBCドライバを、先ほどインストールしたJmeterの下記フォルダに配置
フォルダ：/~/apache-jmeter-2.13\lib\ext

④【Jmeter】シナリオを作成(今回はWindows端末でシナリオを作成)

⑤【Jmeter】JDBC Conection Configurationの設定
※このときDataBase URLにRedshiftのJDBC URLを入力するが、
　下記の通りURLを修正すること
(修正前)
　jdbc:redshift://~　　
(修正後)
　jdbc:postgresql://~　　

参考(JDBC URL)：http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/configure-jdbc-connection.html
![rs-mgmt-clusters-cluster-database-properties-jdbc.png](https://qiita-image-store.s3.amazonaws.com/0/60220/4f8df352-0fcc-1b6f-b1a5-b14d22f511bd.png)


参考(JDBC書換え)：http://stackoverflow.com/questions/30458152/aws-data-pipeline-redshiftcopy-activity-cannot-find-suitable-drivers

⑥【EC2】上記④、⑤で作成したシナリオ(~.jmx)をEC2上に配置

⑦【EC2】シナリオ実行コマンドを実行
/[Jmeter インストールpath]/./jmeter -n -t /[シナリオインストールpath]/[シナリオ名].jmx -l /[実行結果出力path(任意)]
[例]
/var/tmp/tool/apache-jmeter-2.13/bin/./jmeter -n -t /var/tmp/tool/apache-jmeter-2.13/scenario/test_ec2.jmx -l /var/tmp/tool/apache-jmeter-2.13/result


⑤の手順が合っているかはわかりませんが、とりあえず⑤の手順を踏むことでクエリを投げることが出来ました

誤記等ございましたらご報告くださいませ

-2015/09/9　追記-
Oops!
⑤でJDBC URL書き換えなくても下記の情報使えばredshiftドライバでいけました。。。

・JDBC 4.1 互換ドライバ: https://s3.amazonaws.com/redshift-downloads/drivers/RedshiftJDBC41-1.1.6.1006.jar
このドライバーのクラス名は com.amazon.redshift.jdbc41.Driver です。
・JDBC 4.0 互換ドライバ: https://s3.amazonaws.com/redshift-downloads/drivers/RedshiftJDBC4-1.1.6.1006.jar
このドライバーのクラス名は com.amazon.redshift.jdbc4.Driver です。
GitlabへのpushをトリガにJenkinsジョブを”キックして欲しくない”

設定していて，ちょっとわかりにくかったので．

Gitlab hook pluginを入れていると，pushと同時にソースコード管理でGitリポジトリを指定していると，自動的にジョブを実行してくれます．

実はこれ， `Branches to build` で一致したジョブが全部実行されてしまうので，pushをトリガにしたくないジョブまで実行されてしまいました．

# 設定

設定するのはこれ．
`Don't trigger a build on commit notifications`

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/20506/29bb49f8-dd0e-677b-ae10-e4cc05abb68a.png)

これを `Additional Behaviours` に指定すればOKです．
MAMP環境で.htaccessファイルを有効にする方法

MAMP環境で、WordPressを動かしていて、パーマリンクをデフォルトから数字ベースやカスタム構造に変えても、思うように表示ができず、悩むこと数時間・・・。

.htaccessファイルは存在するし、記述内容も問題はなさそうな状態でした。

もしやと思いapacheのconfファイルを確認してみたら、
.htaccessファイルでの上書き設定が無効になっていました(^^;

httpd.confに記述されている"AllowOverride"の値"none"を"All"に変更することで、.htaccessファイルの記述内容が有効になります。


/Applications/MAMP/conf/apache/httpd.conf

```
#
# Each directory to which Apache has access can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories). 
#
# First, we configure the "default" to be a very restrictive set of 
# features.  
#
<Directory />
    Options Indexes FollowSymLinks
    AllowOverride All 　　　　　　　　←"none"を"All"に変更
</Directory>
```
Sqlserverで時間の範囲を取得

現在時間を含む30分間のデータを取得

e.g.
現在時刻： 09:11
取得範囲： 09:00-09:30

```lang:sql
select *
  from 対象テーブル
 where 日時 between
       cast(convert(varchar,dateadd(MINUTE,30-datepart(MINUTE,getdate()),getdate()),0) as DATETIME)
       and
       cast(convert(varchar,dateadd(MINUTE,60-datepart(MINUTE,getdate()),getdate()),0) as DATETIME)
```
Gitで大きいファイルを間違えてコミットしてしまった時の対処法


### はじめに

　現在、apacheの生ログの解析をしているのですが作業ディレクトリにログデータが入ったままコミットしてしまいなぜプッシュ出来ないのか調べないままそれらの作業を重ねてしまった時にした対処法を備忘録として保存しておきます。
　すべての元凶は自分のアホさとgit add . を使うめんどくさがりなところです。。。

### 大きいデータをpushしたい時

　エラーメッセージで検索した時にまず出たのが、pushする時のファイルサイズを変更するというものだったので、この方法を試しました。

```zsh
git config --global http.postBuffer 157286400
```

　これは、ポストするバッファのサイズを大きくするという対処法です。実際に120.44 MiBのプッシュにも成功しました（今考えるとすごいアホなサイズのをgitにあげようとしてますね笑）。
　画像などを管理する人はこの対処法が有効だと思います。


### コミットしないファイルを除外する

　自分にとって有効だったのがこの方法です。まずは、.gitignoreファイルを作成します。

```zsh
vi .gitignore
```

　次に、除外するファイル、ディレクトリを.gitignoreに記述します。実際に書いたものを下記に示します。

```vi
# 無視するファイル
*.txt
*.csv
*.db
*.out
*.log
*.md

# 無視するディレクトリ
analysised/
log_data/
output_log/
```

　自分の場合は、このような感じです。結局拡張子での除外は必要なく、ディレクトリごと除外する方が重要になりました。
　拡張子やディレクトリ以外での除外方法もあるので調べてみてください。

#### gitignoreしたファイルの除外

　次に、gitignoreで除外したファイルをgit上でも除外しなくてはいけません。
　除外しないといけないファイルは、git commitした時にずら〜と出てくるのですがcommitの削除もする手間が出るので、できればcommitエラーを出さずに削除したほうがいいと思います。

```zsh
git rm --cached -f ファイル名
```

### 終わりに

　これらの方法で、gitでの管理が再び出来るようになりました。慣れていないとgitの恩恵が受けられず大変ですががんばりましょう！！

### 参考HP

- [gitで管理しないファイルを無視させる .gitignore｜misc｜@OMAKASE](http://www.omakase.org/misc/gitignore.html)
- [1MBのファイルをgit pushできない - @peccul is peccu](http://peccu.hatenablog.com/entry/2015/04/11/000000)
Github から Gitlab へリポジトリをミラーする


# 概要
Github から Gitlab へのミラーリングをする方法です。

Gitlab などから Github などへのミラーリングはよく行われていると思いますが、Github のバックアップを取るというのはあまり行われていないようです。

確かに、リポジトリのミラーを取るなら正リポジトリを自前サーバにするのが普通のような気もします。
その方法だとミラーリングについては、`./git/hooks/`正リポジトリ配下にスクリプトを書けば良いので楽勝ですね！たぶん！

# 手順
1. Gitlab にリポジトリ（プロジェクト）を作成する
2. Gitlab のリポジトリを Github のミラーにする
3. リポジトリをミラーするシェルスクリプトを準備する
4. Github の Webhook を Hubot で受けシェルスクリプトを叩く

## Gitlab にリポジトリを建てる
まずは Gitlab にリポジトリを作ります。
こちらは Gitlab の画面からプロジェクトの作成を行えばよいです。

## Gitlab のリポジトリを Github のミラーにする
次に、作成したリポジトリを Github のミラーリポジトリにします。
まずは、リポジトリができた場所に移動してみます。

```bash
$ ssh gitlab.necojackarc.com
$ sudo su - root
$ cd /var/opt/gitlab/git-data/repositories/necojackarc/
$ ls
repo1.git/  repo1.wiki.git/
```

リポジトリはここ bare リポジトリとして配置されています。
この中にある config に origin の設定を書いてあげても良いのですが、面倒くさいのでまずは元のリポジトリを消し去ります。

```bash
$ rm -rf repo1.git/
```

次に、一般ユーザ（後ほどシェルスクリプトから SSH するユーザ）に戻り、好きな場所で以下のコマンドを叩きます。
これは後ほどシェルスクリプトから SSH した際、`sudo`なしで実行できるリポジトリを作成するための作業です。

私はホームディレクトリ以下に`repositories/:group`ディレクトリを作り、その下で行いました。

```bash
$ git clone --mirror https://necojackarc:password@github.com/necojackarc/repo1.git
```

次に、リポジトリが本来あるべき場所に対して、シンボリックリンクを貼ります。

```bash
$ sudo ln -s ~/necojackarc/repo1.git /var/opt/gitlab/git-data/repositories/necojackarc/repo1.git
```

これでミラーのリポジトリができました。
Gitlab から確認すれば、無事ミラーできていることがわかります。

### 補足
Gitlab と Hubot が別サーバで動作しており、SSH ログインを前提としています。

## リポジトリをミラーするシェルスクリプトを準備する
サクッと書きます。

```bash
#!/bin/sh
ssh necojackarc@gitlab.necojackarc.com "cd ~/repositories/necojackarc/repo1.git/; git fetch origin"
```

ログインして移動して fetch するだけです！余裕！
こいつを Hubot のリポジトリの`scripts/shellscripts`にでも叩き込んでおきましょう。

## Github の Webhook を Hubot で受けシェルスクリプトを叩く
サクッと Hubot のスクリプトを CoffeeScirpt で書きます。

```coffeescript
module.exports = (robot) ->
  # Mirror Github
  mirror_github = ->
    @exec = require('child_process').exec
    command = "sh ./shellscripts/mirror_github.sh"
    @exec command, (error, stdout, stderr) ->
      console.log error if error?
      console.log stdout if stdout?
      console.log stderr if stderr?

  # Listen to "POST /github"
  robot.router.post "/github", (req, res) ->
    event_name = req.headers["x-github-event"]
    payload = req.body

    console.log event_name
    switch event_name
      when "push" then mirror_github
      when "create" then mirror_github
      when "delete" t
```

Hubot からのシェルスクリプト起動は以下の記事を参考にしました。

> [SlackからHubot経由で 、サーバのシェルを実行してみよう！](http://tech.sanwasystem.com/entry/2015/04/30/213521)

ありがとうございます。

# まとめ
Hubot で Webhook を受けて、スクリプトを叩くだけです！
使用中のADユーザー名とコンピュータ名を簡単に取得



単純に文字列として取得したいときはけっこうある。今まで後者を使ってきたけど、最近前者の方法を見つけた。

参考情報に挙げたページがけっこうおもしろかったので、2通り合わせてメモ（Office 2010で確認）

## ADSystemInfo オブジェクトを参照
```vbnet
Private Sub Command1_Click()
'    On Error Resume Next
    Dim objSysInfo, objUser
    Set objSysInfo = CreateObject("ADSystemInfo")
    Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
    Set objComp = GetObject("LDAP://" & objSysInfo.ComputerName)
    
    ' 取得内容：ADユーザー名，コンピュータ名
    ' 例：取得内容をメッセージボックスに表示
    MsgBox objUser.sAMAccountName & vbCrLf & objComp.cn
    
    Set objUser = Nothing
    Set objComp = Nothing
    Set objSysInfo = Nothing
    
End Sub
```

### 参考情報
- [ss64.com - List User properties as displayed in ADUC](http://ss64.com/vb/syntax-userinfo.html)
- [ss64.com - List Computer properties as displayed in ADUC](http://ss64.com/vb/syntax-computerinfo.html)
  - 例と合わせてシンプルにまとまっている
  - コマンドごとのページ末尾に、その内容に即した"格言"があって、なぜそれを選んで書いたのかと合わせて読み取ると結構おもしろい。たとえば前者だと：

> "Nearly all men can stand adversity, but if you want to test a man's character, give him power" - Abraham Lincoln

- [Hey, Scripting Guy!: あなたはだれ](https://msdn.microsoft.com/ja-jp/cc137985)
  - 易しい例から徐々に応用へ、通して読むとよく理解できる内容
  - もはや伝統的というか、文章序盤は（ほぼ必ず）ユーモアが入り、文中にも散りばめられている。日本語訳でもうまくユーモアが出ていると思う
  - 方法を早く知りたいときはやや面倒くさいけれども

## Win32API を利用

```vbnet
' 標準モジュールに書く
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
```

```vbnet
' 任意のSub（またはFunction）
Private Sub Command1_Click()
  Dim Name As String
  Dim Leng As Long
  Dim Ret As Long
  'バッファを確保
  Name=String(250,chr(0))
  Leng=Len(Name)

  Ret=GetUserName(Name,Leng)
  MsgBox "ユーザー名は" & Name & " です。"
  Ret=GetComputerName(Name,Leng)
  MsgBox "コンピュータ名は" & Name & " です。"
End Sub
```

```vbnet
' 他の例
' Excel VBA
Cells(1,1) = GetComputerName()
' Access VBA
Me.[ログオンユーザ名] = GetUserName()
```
### 参考情報
[５８．ユーザー名を取得する ](http://homepage1.nifty.com/MADIA/vb/API/GetUserName.htm)
[５９．コンピューター名を取得する ](http://homepage1.nifty.com/MADIA/vb/API/GetComputerName.htm)
Pryをより快適にしてくれるGemsとその設定方法


# 概要
Ruby の 標準 REPL は irb ですが、その代わりに pry を使っている人も多いかと思います。

何も設定をしなくても、pry は 標準の irb よりも快適に使用することができます。

しかし、いくつかの Gem と組み合わせることでより快適になります。

# おすすめ Gems
- [michaeldv/awesome_print](https://github.com/michaeldv/awesome_print)
	- 出力を非常に綺麗に整形します
- [cldwalker/hirb](https://github.com/cldwalker/hirb)
	- ActiveRecord の出力を綺麗に整形します

どちらの Gem も出力が非常に読みやすくなって、開発効率があがります！

Awsome Print は常に入れておいても損はないと思います。

## Awsome Print の設定
Awsome Print は明示的に有効化する必要があるので、`.pryrc`で常に有効化しておくと快適です。

```ruby:.pryrc
begin
  require "awesome_print"
  Pry.config.print = proc { |output, value| output.puts value.ai }
rescue LoadError
  puts "no awesome_print :("
end
```

## Hirb の設定
Hirb も同じく、明示的に有効化する必要があります。

```ruby:.pryrc
begin
  require "hirb"
rescue LoadError
  puts "no hirb :("
end

if defined? Hirb
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  Hirb.enable
end
```

# 付録
私が今現在 Pry 関係で導入している Gem 一覧と`.pryrc`です。


## Gem 一覧
私が Gemfile に書いている pry 関係の Gem は以下のとおりです。

```ruby:Gemfile
gem_group :development, :test do
  gem "pry-coolline"
  gem "pry-rails"
  gem "pry-byebug"
  gem "pry-stack_explorer"

  gem "awesome_print"

  gem "hirb"
  gem "hirb-unicode"
end
```

## pry 設定
pry には`.pryrc`という設定ファイルがあり、一部の Gem を常に有効化するためにはここに設定を書く必要があります。

私の`.pryrc`は以下のとおりです。

```ruby:.pryrc
# awesome_print
begin
  require "awesome_print"
  Pry.config.print = proc { |output, value| output.puts value.ai }
rescue LoadError
  puts "no awesome_print :("
end

# hirb
begin
  require "hirb"
rescue LoadError
  puts "no hirb :("
end

if defined? Hirb
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  Hirb.enable
end
```

<cite>[necojackarc/dotfiles/pryrc - Github](https://github.com/necojackarc/dotfiles/blob/master/pryrc)</cite>

快適！

# 謝辞
@scivola さんに誤字修正をしていただきました。

ありがとうございます。
【C#】Linqラムダ式事例集



データがあるかチェックする

```lang:C#
String searchAuthor = "John Grisham";
bool contains = tbl.AsEnumerable()
               .Any(row => searchAuthor == row.Field<String>("Author"));
```

同じ意味

```lang:C#

DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'");
if(foundAuthors.Length != 0)
{
    // do something...
}

```



indexの列を追加する

```lang:C#
var result =  query.AsEnumerable().Select((x, index) => new { index,x.Id,x.FirstName});
```

同じ意味

```lang:C#
int i = 1;
    var query = from u in dbReport.Users
                join p in dbReport.Physicans on u equals p.User
                let Rank = i++
                select new 
                {
                    Rank.ToString(),
                    u.Id,
                    u.FirstName,
                    ...
                };

```


where句の複数指定

```lang:C#
TotalEatin = Data.kassaOrders.AsEnumerable().Where(x => x.Field<bool>("btwticket") && !x.Field<bool>("terugname") && !x.Field<bool>("teruggenomen"))
    .SelectMany(x => Data.orderDetails.AsEnumerable().Where(d => d.Field<int>("orderid") == x.Field<int>("serial") && !d.Field<bool>("takeout")))
    .Sum(x => x.Field<decimal>("price"));

TotalEatin += Data.kassaOrders.AsEnumerable().Where(x => x.Field<bool>("btwticket") && !x.Field<bool>("terugname") && !x.Field<bool>("teruggenomen"))
    .SelectMany(x => Data.orderDetails.AsEnumerable().Where(d => d.Field<int>("orderid") == x.Field<int>("serial") && !d.Field<bool>("takeout")))
    .SelectMany(x => Data.MenuDetails.AsEnumerable().Where(d => d.Field<int>("orderid") == x.Field<int>("orderid")))
    .Sum(x => x.Field<decimal>("prijs"));

```


データの更新

```lang:C#
var dt = new System.Data.DataTable("tmp");

dt.Columns.Add("col1", typeof(string));
dt.Columns.Add("col2", typeof(string));

var row = dt.NewRow();
row["col1"] = "A01";
row["col2"] = "B01";
dt.Rows.Add(row);

row = dt.NewRow();
row["col1"] = "A02";
row["col2"] = "B02";
dt.Rows.Add(row);

row = dt.NewRow();
row["col1"] = "A03";
row["col2"] = "B03";
dt.Rows.Add(row);

dt.AsEnumerable().Where(r => r.Field<string>("col1") == "A02").Select(r => r["col2"] = "hoge").ToList();
```
Macのスクリーンをロックする方法

Macのスクリーンをロックするショートカットを忘れるので備忘録。

前提として Security & Privacy の Require Password にチェックをいれておく。

```
Shift + Control + Power
```


メニューバーからもロックできるようにする方法もついでに。

- Keychain Access > Preferences > General の Show keychain status in menu bar にチェックを入れる。
- メニューバーに表示された南京錠のアイコンをクリックして、Lock Screen。
Windows版PostgreSQLでpg_bigmを使う方法(非公式)

現在(2015/09)、pg_bigmは公式にWindows版PostgreSQLをサポートしていません。pg_bigmコミュニティには[パッチ](https://github.com/kou/pg_bigm/compare/support-windows.patch)を投稿していただいているのですが、(Window上での開発のハードルが高く)まだ見れていない状態です。すいません。
ですが、[pg_trgm](http://www.postgresql.jp/document/9.4/html/pgtrgm.html)のように、ソースコード内に特別なWindows対応コードを入れなくても、Windows版PostgreSQL上でpg_bigmは使用できるので、その方法を紹介します。

**※注意 : この方法は非公式です。**

準備
=====

## Windows開発環境の準備
PostgreSQLマニュアルの[こちら](http://www.postgresql.jp/document/9.2/html/install-windows-full.html)を参考に、Microsoft Windows SDKとActiveState Perlをインストールします。(私の環境ではMicrosoft Visual Studio Communityをインストールしました)

## PostgreSQLのソースコードの入手
[こちら](http://www.postgresql.org/ftp/source/)から好きなバージョンのソースコードをダウンロードし、解凍しておきます。(私は9.4.4をダウンロードしました)

## pg_bigmのソースコードの入手
[こちら](https://osdn.jp/projects/pgbigm/releases/)からソースコードをダウンロードし、同じく解凍しておきます。(私は1.1-20131122をダウンロードしました)

インストール
==================

**※コマンドプロンプトは「Visual Studio コマンドプロンプト」を使いました。(スタートメニュー→すべてのプログラム→Visual Studioにありました)**
**このコマンドプロンプトを使わないと、「Unable to determine Visual Studio version: The nmake version could not be determined. at src/tools/msvc/Mkvcbuild.pm line 63.」というエラーが出て、buildコマンドが実行できません。**

## PostgreSQLのインストール
**※PostgreSQLが既にインストールされている、またはインストーラーでインストールしている場合はスキップしてください。**

PostgreSQLマニュアルを参考に、

```
> cd src\tool\msvc
> build
```

で、ビルドし、

```
> install <インストールするパス>
```

で、指定したパスへインストールします。

## pg_bigmのインストール

１．解凍したpg_bigmをPostgreSQLのcontribディレクトリに移動します。

２．次に以下のコマンドでビルドします。

```
> cd src\tool\msvc
> build pg_bigm
```
ビルド後、PostgreSQLのソースディレクトリのトップに`Releaseディレクトリ`ができ、その中に`pg_bigmディレクトリ`があることを確認します。(pg_bigm.pdbやpg_bigm.dllなどが入っています)

３．下記の表を元にインストールに必要なファイルを**手動**でコピーします。

| 対象ファイル名 | コピー元 | コピー先 |
|:------------:|:-------:|:-------:|
|pg_bigm.dll|\<PostgreSQLのソースディレクトリ\>\Release\pg_bigm\pg_bigm.dll|\<PostgreSQLのインストール先\>\lib|
|pg_bigm.pdb|\<PostgreSQLのソースディレクトリ\>\Release\pg_bigm\pg_bigm.pdb|\<PostgreSQLのインストール先\>\symbols|
|pg_bigm.control と pg_bigm--1.1.sql|\<pg_bigmのソースディレクトリ>\pg_bigm.control と pg_bigm--1.1.sql|\<PostgreSQLのインストール先\>\share\extension|
**※ダウンロードしたpg_bigmのバージョンによって、pg_bigm--1.0.sqlになるかもしれません**

上記の４つファイルを移動できたらインストール完了です。

pg_bigmの登録
=============

PostgreSQLへのpg_bigmの登録はLinux環境と同じです。
PostgreSQLを起動後、[pg_bigmのマニュアル](http://pgbigm.osdn.jp/pg_bigm-1-1.html)に書いてある通りに、以下のコマンドで登録します。

```
> psql -d postgres
=# CREATE EXTENSION pg_bigm;
CREATE EXTENSION
```
プルリク時のコメント略語

プルリク時、優先度を表す略語

MUST : 必ず直すべき

IMO : 自分なら直すけどどう? 緩やかな指摘(In my opinion)

IMHO : 丁寧なIMO (In my humble opinion)

nits : 細かい指摘(nitpick)
Fiji (ImageJ)のマクロでチャンネルの色を変換する

蛍光顕微鏡の画像解析にFiji(ImageJ)をよく用いるのだが、チャンネルの色をモノクロにしたり、赤や緑にするのを、ちまちまやるのが面倒だったので、チャンネルの色を一発で変換させる関数作ったら、大変便利だったのでメモ。

以下のマクロをコピペしてもらえれば、使えるはず。最近は四重染色をすることが多いので、チャンネル数が4つの画像を想定してあるが、三重染色の画像なら、4の入った箇所を削れば使えるでしょう。

```setChannelColors.ijm
function setChannelColors (col1, col2, col3, col4){
		Stack.setChannel(1);
		run(col1);
		Stack.setChannel(2);
		run(col2);
		Stack.setChannel(3);
		run(col3);
		Stack.setChannel(4);
		run(col4);
	}
```

使い方というほどでもないが、col1/2/3/4が、それぞれチャンネル1~4の色に対応しているので、そこに"Blue", "Red", "Green", "Magenta", "Grays"なんかを指定してあげれば、よいです。

**使用例**

```sample.ijm
setChannelColors("Blue", "Green", "Red", "Magenta");
```
Windows用vSphere CLIのActive Perlについて

メモ。

Windows用VMware vSphere CLIはActive Perlを同梱しており、各コマンドはPerlスクリプトとして実装されている。管理環境にはvSphere CLIがインストールされることが多くなり、同時にActive Perlが利用できる環境にもなる。

ユーティリティを自作するときにはこのPerlを使う形にすると、動作環境が整いやすいが、このPerlは相当に古い版数で固定されている。いま手元のWindows環境に入っているメインのPerlはStrawberry Perl v5.16.3で、これだって新しくないけど、それに比べても相当古い。

    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -v
    
    This is perl, v5.8.8 built for MSWin32-x86-multi-thread
    (with 50 registered patches, see perl -V for more detail)

同梱のTest::Moreは0.75版。noteやexplain、subtestといったメソッドが実装される前で、これらを使ったテストコードを含むライブラリが軒並みSyntax Errorになった。これらはより本気のテストを書こうと思ったら欠かせないもので、ユーティリティには新しいTest::Moreを同梱することにした。

    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -MTest::More -e "print Test::More->VERSION"
    0.75
    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -MTest::More -e "note Test::More->VERSION"
    Can't locate object method "note" via package "Test::More" at -e line 1.

File::Pathは1.08。make_pathメソッドがない。これは新しいFile::Pathモジュールではレガシーインターフェースとしてmkpathが残されているので、こちらを使うことにした。

    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -MFile::Path -e "print File::Path->VERSION"
    1.08
    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -MFile::Path -e "print File::Path->can('make_path')"
    
    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -MFile::Path -e "print File::Path->can('mkpath')"
    CODE(0x3bcd2e8)

Archive::Tarは1.30版。旧来、Archive::Tarはtar書庫内容を全部メモリに読み込んでしまうのが標準の動作なのだけど、最近の版では先頭から順次処理するためのiterメソッドがある。でもこれが1.30版にはない。

    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -MArchive::Tar -e "print Archive::Tar->VERSION"
    1.30
    c:\>"c:\Program Files\VMware\VMware vSphere CLI\Perl\bin\perl.exe" -MArchive::Tar -e "print Archive::Tar->can('iter')"
    

数百GBのtar.gzファイルを扱うつもりだったので、これで手詰まりになった。どうするかまだ考えているけど...GNU tarか7zipコマンドにパスするとかかな。

モダンなPerlでも動いて、vSphere CLIのPerlでも動くユーティリティを書くのは、意外に厄介だ。どこかで行き詰ったら、早々にどちらかに絞るか、2バージョン書いてしまうことをお勧めする。
node: No such file or directory エラーが出る


browser-syncを実行しようとしたところ、エラーが出たので備忘録です。

![cmd](https://gyazo.com/16a5faa6a68095f1900ef54fabbe5d7f.png)

こんな感じ。
nodeコマンドがないと言われている。
確認していきます。

### nvmコマンド打てるか
ないと言われる場合はまず、~/.nvm ディレクトリあるか確認
その後,bashrc ,zshrc等にnvmのスクリプトが記載されているか。

![cmd](https://gyazo.com/2581962f89ecc16c73da55117fbe0fe2.png)

こんな感じ。
記載されていない場合,自分で書くか、macの場合は

```
$ brew info nvm
```
とかやると、どう設定すべきかでてくる。

### nodeの確認
nvmに何がインストールされているのか確認。

```
$ nvm ls
```

インストールされていなかった場合は```nvm instal```
インストールされている場合は```nvm use```

これで```node```と打ち、使えることを確認。

### defaultの設定

ログイン時にも保持してくれるように defaultを下記で設定

```
$ nvm alias default [バージョン]
```


この後再度ログインしてnodeが実行できたら完了！！(^O^)
海外移住者が知るべきビザのことについて

# 海外移住したいですか！？

日本での生活から海外への移住をしているtonocchoです。よくgeek界隈では優秀なエンジニアさんたちが米国で働く、というようなストーリーを見つけますが、自分のようなどこにでもいるレベルのエンジニアがどうやって海外移住するのさ？ということを雑に書いておきます。

## 最初にやるべきことはビザを知ること

自分が移住に向けて頑張っている国はNZです。生活に関しては、

http://seiji.tonouchi.org

でポロポロ書いてます。

実は２００９年くらいにオーストラリアに一年間いたことがあって、移住に失敗しています。でも、何を知れば道が見えるかは学べました。

何を知るか？ビザを知ることです。

## シナリオ

どうやって海外移住を達成するのか？というと、NZやオーストラリアでは、スキルドマイグラントビザというのを取得するのが技術者の目標になると思います。もうITとか真っ平御免だわと思うなた別の道があると思いますが、その道は知らない道ですね。

で、独立技術者ビザをゴールに据えたら、どうやってそこ前行くかを考えます。その時に助かるのが、日本でちょこちょこ説明会をやってくれるエージェントです。ただ、当たり外れはあるようなので、気をつけましょう。

エージェントに提示された道筋は以下の通り。

留学するー＞卒業者向けワークビザを取得ー＞就職ー＞永住権申請

今就職活動中です、卒業者向けワークビザまではどうにかなると思います。ただ、この就職が結構厳しい。なんにせよ、この道筋が見えたら、あとは、何が手に入ればそのステップにいけるのかを知れば良いのです。

## まとめると

まずは、自分がなんのビザで海外移住したいのかをよく考えてくださいね。独身者であれば、現地で運命の相手を探すことだってできます（mixiで書いたら罵詈雑言くらいましたが）。ある程度のまとまったお金や企業経験があれば、起業家ビザというのもあります。

噂では宝くじで高額当選すると永住権がもらえるとかもあります。オランダでは最恵国待遇というのがあるから、移住の敷居も低いかもしれません。調べたことないけど。

## 英語

その国に住む以上は、現地の言葉は話せないといけません、と思いきや、チャイナタウンに行くと、中国語しか通じない店とか普通にあるんだよな。。。彼らどうやって永住権手に入れてるんだろう。。。

## ゴールドリブン海外移住

そんなわけで、TDDとかBDDとか言っているエンジニアの皆様なら、ゴールを決めることの重要性はお分かり頂けると思います。といっても、永住権はゴールじゃなくて、スタートなんですけどね、そこから数十年にわたる海外生活が始まるのだから。
AWS Certified Solutions Architect - Associate 頑張る記１


# AWS Certified Solutions Architect - Associate に挑戦しようと思ったわけ

NZへの移住を目指して、就職活動をしている中で、こちらでは資格がとても重要だと方々で聞かれた。どうせ海外に移住したのだから、今まで挑戦したことないことも含めてやりたいと思ったので、AWSの道を切り開けるかと思って、挑戦することにした。

## お前はどこのだれた

一部ではtonocchoというハンドルネームで知り合いがいる程度のしがない元金融系SEです。日本での生活を抜け出して、海外移住を目標に頑張っています。java-jaからきますた。

## まずは地元の勉強会に参加

AWSといっても、全く触ったことがないわけじゃないのだけど、実際にAWSをがっつり使っているサービスの話などを聞くために、AWSのmeetupグループに参加。

というのも、このグループ新規立ち上げなのよね。新しいものに目がないので、ついうっかり参加しました。

で、改めてAWSすげえ！って思った。

## 怖いのは課金

と言っても、AWSは無料で提供するものじゃないから、課金が怖い、個人レベルでやって課金されすぎて路頭に迷ったらどうしよう、と思って、勉強会でAmazonの人に聞いたらFree-tierでやれば課金されないか、せいぜい数ドルで済むよ！と言われたので、信じることにした。

## まずはざっとサービス一覧を眺めてみた

でもって、だいたいどういうものがあるかを確認した。EC2位はいじったことがある程度だったのだけど、たくさんのサービス群に目を回しそうになる。

一通り読んでみたので、AWSに登録した。

## チュートリアルを一通りやった

https://aws.amazon.com/documentation/gettingstarted/

上記のコンテンツを順繰りにチュートリアルを一通りやりました。何はともあれ、操作に慣れるのが目的。

## 実際にwebサイトをAWSに作った

と言っても、Wordpressのサイトを構築しただけなんですが、EC2、RDS、S3を使って作ってみた。作ってみると、各サービスの連携が見えてきたり、読んだだけでわかった気になっていたことがそうでもないとわかってきたのでよかった。

ちなみにWebサイトは

https://www.pikotech.co.nz/

デス。副業用に作った会社なのです。

ここまででなんとなくAWS使ってWebサイト作るくらいはできるようになりましたので、いよいよ資格の勉強に本腰を入れます。

・・・って、資格の勉強してたんじゃないのかw

## 試験の概要を知る

当該試験のExam Guideをまずはみます。

http://awstrainingandcertification.s3.amazonaws.com/production/AWS_certified_solutions_architect_associate_blueprint.pdf

で、試験の概要と、点数配分が書かれていますので、頑張りどころを把握します。で、次に、どういう問題が出るかも確認します。どうやら多岐選択式ダケみたいです。運の要素も活用できそうだ！（←ダメ発想

でもって、各セクションで問われることを確認します。これで傾向はつかめました。あとは対策ですね。対策はなんとここで観れます。

http://d0.awsstatic.com/training-and-certification/docs/datasheet_trainingcert_certificationprep_guide.pdf

Amazonさん太っ腹ですね。この文書を見ると、どこの情報をよくみとくといいよ！というようなことが書かれています。

## ここまでの勉強時間

チュートリアルやるまで５時間くらい、webサイトを作ってみるまで１０時間くらい。
メモ：CentOS7にNode.jsをNVMでインストール

# CentOS7にNode.jsをNVMでインストール

## とりあえず使いたい方用Summary
以下順番にインストール

```bash:bash
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.26.1/install.sh | bash
$ source ~/.bashrc
$ nvm install stable
$ node -v
v0.12.7
$ nvm alias default stable
``` 


## NVMとは
[NVM@Github](https://github.com/creationix/nvm)   
Node.jsのバージョン管理ツール。   
Node.jsのインストール、バージョン切り替えが簡単にできる。

## NVMのインストール   
スクリプトが用意されているので、それを実行するだけ。

```bash:bash
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.26.1/install.sh | bash
```

インストール後に、ユーザーの.bashrcに以下が追加される。

```bash:~/.bashrc
export NVM_DIR="/root/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
```

デフォルトでは各ユーザーごとにnvmがインストールされることになる。
インストール先は`~/.nvm/`となる。


** インストール後は、すぐに使用できないので、~/.bashrcを読み込むか、ログインし直すことで使用できるようになる **

```bash:bash
$ source ~/.bashrc
$ nvm --version 　# 確認
0.26.1
```

## Node.jsのインストール
`nvm install [バージョン]`でインストール出来る。   
デフォルトで、stable,unstableというバージョンエイリアス名が登録されているので、
最新stableをインストールする場合、以下を実行するとインストールされる。

```bash:bash
$ nvm install stable
######################################################################## 100.0%
Now using node v0.12.7 (npm v2.11.3)
```
v0.10.xをインストールしたい場合は、以下でインストールされる。

```bash:bash
$ nvm install 0.10
######################################################################## 100.0%
Now using node v0.10.40 (npm v1.4.28)
```

npmも同時にインストールしてくれる。

## バージョンの切り替え
まず、インストールされているnode.jsのバージョンを確認。   

```bash:bash
$ nvm ls
->     v0.10.40
        v0.12.7
         system
node -> stable (-> v0.12.7) (default)
stable -> 0.12 (-> v0.12.7) (default)
iojs -> iojs- (-> N/A) (default)
```
上記の結果で分かる通り、yum等でシステムにインストールしたnode.jsにも切り替えることが出来る。

`use [version]`で切り替え。

```bash:bash
$ nvm use stable
Now using node v0.12.7 (npm v2.11.3)
$ node -v 
v0.12.7
$ nvm use v0.10
Now using node v0.10.40 (npm v1.4.28)
$ node -v
v0.10.40
```

システムのNode.jsに切り替える場合、以下を実行すれば良い。
```bash:bash
$ nvm use system
Now using system version of node: v0.10.36 (npm v1.3.6)
```

ログアウトし直すと、nvm管理のNodejsは選択されていないので、システムのNode.jsとなる。
デフォルトでどのバージョンを使用するかを、defaultエイリアスで指定できる。

以下はデフォルトで最新安定版を指定している。

```bash:bash
$ nvm alias default stable
$ source ~/.bashrc
$ node -v
v0.12.7
```
Timeオブジェクトを相対時間の文字列に変換する


RailsのViewHelperを使うんですが、自分はRails環境が無いのでrubygemのインストールから。

```bash:
$ gem install actionview
```

```ruby:
require 'action_view'
include ActionView::Helpers::DateHelper

time_ago_in_words( Time.now - rand(10000) )
# => "about 3 hours" とか "28 minutes"
```

折角なので自分でも作ってみました

```ruby:
class Time
  def to_time_ago_string
    diff = (Time.now - self).to_i
    case diff
    when (3600*24*3+1)..Float::INFINITY
      strftime("%C%y/%m/%d %H:%M")
    when (3600*24*1+1)..(3600*24*3)
      "#{ diff / (3600*24) }d"
    when 3601..(3600*24)
      "#{ diff / 3600 }h"
    when 60..3600
      "#{ diff / 60 }m"
    when 0..60
      "#{ diff }s"
    end
  end
end
```

### 参考
Railsのフォーマットヘルパー抜粋 - Qiita : http://qiita.com/metalels/items/e3b58e6a9482c6078a52
JpStock で世界同時株安のデータを収集する


[だいぶ前](http://qiita.com/ynakayama/items/afdfabd64b028da856b3)にも書いたのですけど [JpStock](http://utahta.hatenablog.com/entry/2012/03/25/jpstoc/) は Yahoo ファイナンスをスクレイピングして日本国内の株式に関する情報を取得するものとしては秀逸です。なお、ありがたいことに[こちらの記事](http://vsanna.sakura.ne.jp/wp/2015/01/stock_price_ruby/)でも取り上げていただいています。

さて、最近の状況としては世界的な株安が止まらなくなっています。 8/21 の時点で NY ダウは 3.1% 安と年初来安値、その週明けの日経平均は 4.6% 安、上海株は 8.5% といった状況でした。 (参考 : 下図)

![chart_N225.png](https://qiita-image-store.s3.amazonaws.com/0/38501/0e763541-3a60-aa5e-356c-104162cd6ff4.png)

上海も下げると米国も下げる、米国が下げると日本の夜間の先物も一段と売りが出る、翌日は現物も下げるという調子で連鎖が続きました。上海も今までジリ上げ基調であった日本株も 17 日の週から薄商いの中、先物主導で下げはじめ 2 万円を割る流れ、翌週には半値戻しに届かない程度の自立反発をするも、さらにここへきてさらに下値を探る展開、なかなかの波乱となっています。 28 日には一時的に 19,000 円を回復し投資家の不安心理がやや改善するも、米国の FOMC を控え、中国当局の動きなどを伺う神経質な相場です。

こういった状況であっても、日本企業のファンダメンタルズに大きな影響は無いという見方も多いのですが、実際のところファンダメンタルズに対する株価の現状としてはどうなのか。これは思い込みではなくデータを集めてしっかりと分析しなければなりません。そこで現在の予想 EPS をもとにした PER (株価収益率) に注目してみましょう。

```rb
require 'csv'
require 'jpstock'

CSV.open('out.csv', "wb") do |csv|

  csv << ["銘柄コード", "銘柄名称", "始値", "高値", "安値", "終値", "前日終値", "出来高", "時価総額 (百万円)", "発行済株式数", "配当利回り (会社予想)", "1 株配当 (会社予想)", "PER (会社予想)", "PBR (実績)", "EPS (会社予想)", "BPS (実績)", "最低購入代金", "単元株数", "年初来高値", "年初来安値"]

  # 銘柄一覧に基づいて JpStock によって PER, PBR などを取得する
  CSV.foreach('stocks.list') do |row|
    code = row[0]
    unless code == "N225"
      jps = JpStock.quote(:code=>code)
      csv << [jps.code, jps.company_name, jps.open, jps.high, jps.low, jps.close, jps.prev_close, jps.volume, jps.market_cap, jps.shares_issued, jps.dividend_yield, jps.dividend_one, jps.per, jps.pbr, jps.eps, jps.bps, jps.price_min, jps.round_lot, jps.years_high, jps.years_low]
    end
  end
end
```

独自にまとめたここ最近 (8/21 〜 9/2) の世界同時株安のデータを GitHub に置いています。
https://github.com/ynakayama/sandbox/tree/master/ruby/jpstock/data

なお銘柄の一覧は先月末入れ替え前の JPX 日経インデックス 400 に筆者の判断でいくつかの銘柄を加えたものとなっています。

summary_xxxxxxxx.csv … 該当日の四本値と、機械学習等での予測
ref_xxxxxxxx.csv … JpStock によって収集した該当日の株価参考指標

データの利用は自由ですが、正確性やそれによって得られた損益について一切の保証をするものではありません。


機械学習や回帰分析によるトレンド分析・予測については他の記事で触れますので割愛します。

日経平均との相関は、過去 180 営業日の移動相関の平均を算出しています。

これらの数値を精査すると、先高期待で 18 倍以上に上振れていた PER が約 14 倍程度の下限まで落ちてきたということがわかります。なお、日経平均ではこの PER が 14 から 16 が適正水準とされています。もちろんこれは予想 EPS (1 株当たり当期純利益) をもとにしていますから、もしこの先日本企業の業績が下振れるということになれば変わってくることになります。

ここしばらくの歴史的な相場というのは研究の価値がありますから、上のデータをもとにさらに分析・可視化してみても面白いでしょう。
github > renameされたファイルのhistoryをたどる

## 前置き

[SO: リネームしたファイルのリネーム前のコミットログが見たいのですが](http://ja.stackoverflow.com/questions/15164/%E3%83%AA%E3%83%8D%E3%83%BC%E3%83%A0%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%AA%E3%83%8D%E3%83%BC%E3%83%A0%E5%89%8D%E3%81%AE%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%AD%E3%82%B0%E3%81%8C%E8%A6%8B%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C)

上記の質問について、これは今後よく使いそうと思ったので調べてみた。

http://stackoverflow.com/questions/17213046/see-history-in-github-after-folder-rename

> You just need a commit before the rename happened. You could retrieve it locally or via the Blame feature.

>After you have retrieved the URL of such commit you just need to click History. You will then see all of the commit history of the file before the rename.

とのこと。

[github](https://github.com/yasokada/150903-renamedFileFollow/commits/master)にテスト用リポジトリを作成した。


## historyのたどり方

### 前提
ファイル名rename時にそれがわかるコミットメッセージでコミットしておく。
例 `rename to renamed1.txt` [github commits](https://github.com/yasokada/150903-renamedFileFollow/commits/master)


### 手順
0. リポジトリに移動 (例: [github](https://github.com/yasokada/150903-renamedFileFollow))
1. ファイル名 ( renamed1.txt )をクリック
2. Blameをクリック
3. renameする直前のコミットをクリック (`add 3Test`)
4. Viewをクリック
5. Histroyをクリック

上記にて、「rename前」のhistoryが表示される。

手順3においてrename直後のcommitがどれだったかわからない場合は、「このコミットかな」というのを選択することになるが、その場合、後ろのhistroyが見えない。
【fastlane】今日も休日の予定がないのでfastlaneの中身を見る1

# そもそものfastlane
![スクリーンショット 2015-08-29 16.50.47.png](https://qiita-image-store.s3.amazonaws.com/0/31237/7ea9331f-b54d-d668-8a08-c8ca9b09a1c9.png)

[Fastlane](http://www.infoq.com/jp/news/2015/02/fastlane-ios-continuous-deploy)
iOSの継続的デプロイメントをいい感じにしてくれる。
これまでになかったツールである。
Rubyで書かれたツールコレクションだそうで、コードはがっつり読むことができる。

## 豊富なツール群

|ツール名|説明|
|:-----------|------------:|
|deliver|スクショやアプリのバイナリをストアに上げる|
|snapshot|iosの各デバイスでのスクショを取ってくれる|
|frameit|いい感じのスクショのフレーム画像を作れる|
|PEM|push notificationのprofileを更新してくれる
|sigh|providioningの作成や更新に使える|
|produce|新しいアプリを作ったりできる|
|cert|証明書の管理ができる|
|codes|プロモーションコードの発行|
|spaceship|デプロイとかitunesconnecetの非公開APIを使える|
|pilot|テストフライト管理|
|boarding|テストフライトのテスターページとか作れる|
|gym|ipaの作成とできる|

いやーめちゃくちゃすごい。

## どうやって動いているの？

イケメンで有名な[クラウス](https://twitter.com/KrauseFx) さんがrubyをがりがり書いて作ったらしい。主にiTunesConnectの非公開APIを使ってるそうです。
iTerm2で今いるディレクトリのまま分割したい

iTerm2で画面分割して左側でvim、右側でコンパイルとかやりたい。
一度ディレクトリ移動したあとに分割してもう一回移動するのは面倒。
設定かなんかできないかな、と思ってたらありました。

# 設定方法

iTerm > Preferences

![iterm_01_01.png](https://qiita-image-store.s3.amazonaws.com/0/47351/d7d15075-5c6e-896a-1482-7d369097e505.png)

Working DirectoryのチェックをAdvanced Configurationに変更。
そしてEdit。

![iterm_02_01.png](https://qiita-image-store.s3.amazonaws.com/0/47351/0717a83e-b64e-cb25-3bb1-cd8d6f07c214.png)

一番下のWorking Directory for New Split PanesのチェックだけReuse previous session's directoryに変更。
これで分割時のみカレントディレクトリのまま分割してくれるようになりました。

新しくウィンドウやタブを開いた時に同じ動作にしたい場合は
Working DirectoryをReuse previous session's directoryに変更すればOKです。

## 参考
[bash - iTermで画面分割する時に自動的にカレントディレクトリに移動させる方法 - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/1714/iterm%E3%81%A7%E7%94%BB%E9%9D%A2%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E7%A7%BB%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95)
SlackとGithubEnterpriseを連携する


## 手順
### Integrations からGithubを選択
https://$domain.slack.com/services/new に遷移

![Screen Shot 2015-09-03 at 10.34.16.png](https://qiita-image-store.s3.amazonaws.com/0/2869/01067e38-0b72-d578-97a0-8054f5d1deee.png "Screen Shot 2015-09-03 at 10.34.16.png")


GitHub を選び、次の画面で Slack のどのチャネルにポストするかを選択する

![Screen Shot 2015-09-03 at 10.35.48.png](https://qiita-image-store.s3.amazonaws.com/0/2869/46c707ea-f843-cf1a-a588-b668e228a0e4.png "Screen Shot 2015-09-03 at 10.35.48.png")


選択後、 [Add GitHub Integration]

### 認証画面に遷移するが、認証しない

switch to unauthed modeをクリック

![Screen_Shot_2015-09-03_at_10_37_45.png](https://qiita-image-store.s3.amazonaws.com/0/2869/9dabe61f-383d-50b2-0ae1-6bdac91e6a9f.png "Screen_Shot_2015-09-03_at_10_37_45.png")


webhook URLをGithubEnterpriseのリポジトリの設定画面でwebhookとして登録する

###### slack
![Screen_Shot_2015-09-03_at_10_38_01.png](https://qiita-image-store.s3.amazonaws.com/0/2869/becf636b-3160-7429-6f28-ec5663564ffc.png "Screen_Shot_2015-09-03_at_10_38_01.png")

###### GithubEnterprise
![Screen_Shot_2015-09-03_at_10_41_13.png](https://qiita-image-store.s3.amazonaws.com/0/2869/69a69e84-6ffb-ca26-95ca-9efdfdf987df.png "Screen_Shot_2015-09-03_at_10_41_13.png")
Modernizr を JavaScript から挿入して処理するフローを実装する。


昨日、「[プロミス処理のラッパーをつくる](http://qiita.com/japboy/items/74fa0cb93baa6466e505)」という記事を書いた動機付けが、今日の記事。


# tl;dr

結論から言うと、JavaScript 側から [Modernizr](http://modernizr.com/) 挿入をコントロールして、更に `Modernizr.load` 機能で必要な互換処理スクリプトも挿入するフローを実装したかった。

```coffeescript
scripts =
  # 一番最初に挿入される `<script>` の配列
  modernizr: [ '/js/vendor/modernizr.custom.js' ]
  # `Modernizr.load` で必要に応じて挿入される `<script>`
  polyfills: [
    test: (M) -> M.json
    nope: '//cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js'
  ,
    test: (M) -> M.ie8compat
    yep: '//cdnjs.cloudflare.com/ajax/libs/aight/1.2.2/aight.min.js'
  ,
  	 test: -> !global.console
  	 yep: '//cdnjs.cloudflare.com/ajax/libs/loglevel/1.4.0/loglevel.min.js'
  ]

# Modernizr の挿入
scriptsInjected scripts.modernizr
.then ->
  # `Modernizr.load` の実行
  modernized scripts.polyfills
.then ->
  # メイン処理
```

この為に 2 つ関数を作成した。

`scriptsInjected` 内部の `loaded` 関数、`modernized` 内部の `completed` 関数を Promise 化するのに、`promisify` 関数を使っている。

**※ ちゃんと動作してなかったので、修正しました。**

```javascript
// Underscore.js、jQuery と Modernizr が必要。

/**
 * scriptInjected
 */
var scriptsInjected = function (urls) {
  var selector = 'script', fjs = document.getElementsByTagName(selector)[0];
  var loaded = promisify(function (resolve, reject, url) {
    var js = document.createElement(selector); js.src = url;
    if (js.addEventListener) {
      js.addEventListener('load', resolve, false);
      js.addEventListener('error', reject, false);
      fjs.parentNode.insertBefore(js, fjs);
    } else {
      // MSIE8 以下が `onload` 拾えないので。
      $.getScript(url).then(resolve, reject);
    }
  });
  return all(_.map(urls, loaded));
};

/**
 * modernized
 */
 var modernized = function (tests) {
  var M = window.Modernizr, len = tests.length;
  var completed = promisify(function (resolve, reject) {   
    var loads = _.map(tests, function (test, idx) {
      test.test = test.test(M);
      if (idx === len - 1) test.complete = resolve;
      return test;
    });
    M.load(loads);
  });
  return completed();
};
```

ちなみに上記関数で使用している `promisified`  と `all` 関数は説明していないが、`promisify` を用いて値を Promise にして返す関数と、複数の Promise 同期する `$.when` のショートハンド。

```javascript
// Underscore.js が必要。

/**
 * promisified
 */
var promisified = promisify(function (resolve, reject, val) {
  if (_.isObject(val) && val instanceof Error) return reject(val);
  resolve(val);
});

/**
 * all
 * これは単に `$.when` のラッパー
 */
var all = function () {
  var args = _.toArray(arguments), promises = _.isArray(args[0]) ? args[0] : args;
  return $.when.apply(undefined, promises);
};
```


# 関心の分離

一連の実装動機は、[Underscore.js](http://underscorejs.org/) と [jQuery](https://jquery.com/) だけで、ES5 に満たない環境でも動作するスクリプトを書くというところから来た。

[gulp.js](http://gulpjs.com/) でモジュール化して、細かい処理を沢山書いていて、Promise 系のモジュールと、クライアントサイド JS のモジュールを分けていた。上記の `scriptsInjected` と `modernized` 関数も、クライアントサイド JS のモジュールとして書いていたが、機能的に Promise が必要になった。

上記関数内部で、直接 Deferred オブジェクトを生成する処理を書いた方が単純なんだけど、すごく冗長で、後で Promise 回りを修正するかも知れないと思うと、Promise モジュールとして一箇所に集約したかった。

後、Modernizr はタスクランナーでモジュール化する時、単純に `require` だと動作しなかったり、この手の手法と相性が悪くて、自分なりの落としどころを見つけたかったんだけど、この手法はしっくりきた。これで JS の処理フローは全部 JS に定義できる。

すっきり。
【EC2】amirotateを試してみた

## 参考記事
こちらの投稿をみて[amirotate](https://github.com/y13i/amirotate)というソフトウェアを知りました。
[amirotateでEC2のAMIをローテーションする](http://qiita.com/shiru/items/dcde452277a2e720645d)
上記投稿では、IAM Userを使ったケースなので、私はIAM Roleを使用します。

## 構成
![aws_amirotate.png](https://qiita-image-store.s3.amazonaws.com/0/60057/8a197f58-7fc7-2434-1a89-cc874718d567.png "aws_amirotate.png")

![kobito.1441243436.067056.png](https://qiita-image-store.s3.amazonaws.com/0/60057/94419e68-eb5c-a70a-ad29-8065f3f7e479.png "kobito.1441243436.067056.png")

## IAM Role作成
**amirotate**というロールを作成し、作成したロールに **EC2FullAccess** ポリシーをアタッチ

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "ec2:*",
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "elasticloadbalancing:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "cloudwatch:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "autoscaling:*",
      "Resource": "*"
    }
  ]
}
```
※ここまで強い権限じゃなくてもいいと思いますが、今回の投稿はこのまま使用しますm(_ _)m

## amirotateインストール・設定
[こちらを参照](http://qiita.com/shiru/items/dcde452277a2e720645d#bundler%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

## amirotate設定
[こちらを参照](http://qiita.com/shiru/items/dcde452277a2e720645d#bundler%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

上記は、`amirotate setup`を実行した場合なので、今回はオプション指定した場合を記載します。

リージョンとバックアップ世代数を指定した実行方法

```
amirotate setup --region=us-east-1 --retention-period="3 days"
```

![kobito.1441243107.224796.png](https://qiita-image-store.s3.amazonaws.com/0/60057/7487b536-f049-a0a6-2ae1-bb93e064fb4a.png "kobito.1441243107.224796.png")

`amirotate help setup`でオプションを確認できます。
`--dry-run`オプションもありますね。嬉しいですね。

## amirotate実行
```
$ amirotate rotate --region=us-east-1

I, [2015-09-03T01:24:34.872705 #2657]  INFO -- : Started.
I, [2015-09-03T01:24:35.188858 #2657]  INFO -- : Found 4 instance(s).
I, [2015-09-03T01:24:35.189043 #2657]  INFO -- : Create image from instance i-1d8263c8 (websv2). Retention period is 3 days.
I, [2015-09-03T01:24:35.567605 #2657]  INFO -- : Create image from instance i-1c8263c9 (websv1). Retention period is 3 days.
I, [2015-09-03T01:24:35.935325 #2657]  INFO -- : Create image from instance i-208263f5 (websv3). Retention period is 3 days.
I, [2015-09-03T01:24:36.498531 #2657]  INFO -- : Create image from instance i-738263a6 (ssh bastion). Retention period is 3 days.
I, [2015-09-03T01:24:36.969439 #2657]  INFO -- : Found 0 image(s).
I, [2015-09-03T01:24:36.969891 #2657]  INFO -- : Exiting.
```

## amirotate実行結果
### AMI確認
![kobito.1441243580.220340.png](https://qiita-image-store.s3.amazonaws.com/0/60057/a0607c9b-9815-aef6-7b64-dbbc1079130f.png "kobito.1441243580.220340.png")

### Snapshot確認
![kobito.1441243638.212983.png](https://qiita-image-store.s3.amazonaws.com/0/60057/964700a1-696a-3417-b9c4-b02b43526e64.png "kobito.1441243638.212983.png")


## cron設定
[こちらを参照](http://qiita.com/shiru/items/dcde452277a2e720645d#%E4%BE%8B-cron%E3%81%AB%E4%BB%95%E8%BE%BC%E3%82%80)
c++ builder XE4, 10.2 Tokyo > htmlファイルを作ってInternetExplorer / Chrome で表示する

```txt:動作確認
C++ Builder XE4
```

TMemoで色付け表示したかったが、htmlファイルを作成してIEで開いてもいいかも、と思い始めた。

## IEで開く

IEでファイルを開く処理は以下のようにできる。

参考
http://kwikwi.cocolog-nifty.com/blog/2005/12/bcb_shellexecut_ea97.html


```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	makeDummyHtml();

	String filename = L"index.html";
	String curDir = ExtractFileDir(Application->ExeName);

	String filepath = curDir + L"\\" + filename;

	if (FileExists(filepath)) {
		ShellExecute(NULL, NULL, L"iexplore.exe", filepath.c_str(), NULL, SW_SHOWNORMAL);
	}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::makeDummyHtml()
{
	TStringList *fileSL = new TStringList();

	String line = L"<font color=red>Hello World</font>";
	line = line + L" on " + Now().FormatString(L"yyyy/mm/dd hh:nn:ss");
	fileSL->Add(line);

	fileSL->SaveToFile(L"index.html");

	delete fileSL;
}
//---------------------------------------------------------------------------
```

上記を実行すれば
<font color=red>Hello World</font> on 2015/09/03 10:19:39
のような表示がIEで見える。


## chromeで開く

chromeの場合は、実行exeを"chrome.exe"に変更する。

しかしながら、フォルダ名などに空白が含まれている場合、そのままでは空白までのパス認識しかされずファイルオープン失敗する。
(`C:\\Rad Studio\index.html`が`C:\\Rad `になる)。

chrome用には以下のように空白を「%20」に変更する必要がある。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	makeDummyHtml();

	String filename = L"index.html";
	String curDir = ExtractFileDir(Application->ExeName);

	String filepath = curDir + L"\\" + filename;
	String url;

	// for chrome
	url = StringReplace(filepath, L" ", L"%20", TReplaceFlags()<<rfReplaceAll);

	if (FileExists(filepath)) {
		ShellExecute(NULL, NULL, L"iexplore.exe", filepath.c_str(), NULL, SW_SHOWNORMAL);
		ShellExecute(NULL, NULL, L"chrome.exe", url.c_str(), NULL, SW_SHOWNORMAL);
	}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::makeDummyHtml()
{
	TStringList *fileSL = new TStringList();

	String line = L"<font color=red>Hello World</font>";
	line = line + L" on " + Now().FormatString(L"yyyy/mm/dd hh:nn:ss");
	fileSL->Add(line);

	fileSL->SaveToFile(L"index.html");

	delete fileSL;
}
//---------------------------------------------------------------------------
```

### 10.2 Tokyo

```txt:動作確認
Rad Studio 10.2 Tokyo Update 2
```

10.2 TokyoでビルドしたソフトをWindows 10 Pro上で動かし、IEとChromeでの動作を確認した。

Windows 10 Proの場合はIEでなくEdgeを使うという選択肢もある。