OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 での Tomcat8 の自動起動設定

前回に引き続き、CentOS7 に Tomcat8 をインストールする。
今回は仮想マシン起動時に Tomcat を自動起動するように設定したい。

# systemd の設定ファイルの準備

以下のように Unit 設定ファイルを作成した。

```
[Unit]
Description=Apache Tomcat Servlet Container
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/opt/tomcat/apache-tomcat-8.0.17/bin/startup.sh
ExecStop=/opt/tomcat/apache-tomcat-8.0.17/bin/shutdown.sh
KillMode=none

[Install]
WantedBy=multi-user.target
```

ファイル名を `tomcat.service` として、`/etc/systemd/system/` に配置する。

## 環境変数ファイルの準備

前回は `.bash_profile` に環境変数 `JAVA_HOME` を定義した。しかし systemd はここに設定した環境変数を読まない。そのため、今回は Unit 設定ファイルに記述した `EnvironmentFile` に `JAVA_HOME` を定義する（※）。

`/etc/sysconfig/` に `tomcat` という名前でファイルを作成する。中身は以下のようにする（`export` の記述は不要）。

```
JAVA_HOME="/opt/java/jdk1.8.0_31/"
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"
```

（※）別の Tomcat 固有の方法として、`setenv.sh` に環境変数を定義して tomcat の bin ディレクトリの下に配置するやり方もある（この場合は `export` の記述は必要）。

# tomcat サービスの有効化

以下のコマンドで tomcat サービスを有効化する。２つめの start コマンドを実行する前に tomcat が停止している必要がある。

```
systemctl enable tomcat.service
systemctl start tomcat.service
systemctl status tomcat.service
```

成功していれば最後の status コマンドで以下のような出力になる。

```
tomcat.service - Apache Tomcat Servlet Container
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled)
   Active: active (running) since 火 2015-01-27 21:36:46 JST; 1h 8min ago
  Process: 1493 ExecStart=/opt/tomcat/apache-tomcat-8.0.17/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 1989 (java)
   CGroup: /system.slice/tomcat.service
           └─1989 /opt/java/jdk1.8.0_31//bin/java -Djava.util.logging.config.file=/opt/tomcat/apache-tomcat-8.0.17/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava..
```

# 補足やはっきりわかっていない点など

Unit 設定ファイルで `KillMode=none` としているのは、これがないと `systemctl stop tomcat.service` 実行時に `status=143` で終了してしまうから。停止スクリプト実行後にすぐにメインプロセスが停止するわけではないので、デフォルトの `KillMode` の `process` にしたがって systemd によって親プロセスが kill されてしまうのかもしれない？

環境変数ファイルの `JAVA_OPTS` は Tomcat の起動が遅い問題に対処するために追加している。「[CentOS6 tomcat7の起動が遅い問題対策。](http://crenazumina.picolix.jp/2013/10/centos6-tomcat7.html」)」に詳しく書かれている。
[Android] HandlerとHandlerThreadでキュー管理



UIスレッドで実行したい処理をキューで管理したい場合は、下記のコードで

```java:Handler
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Handler handler = new Handler();
    handler.post(new Runnable() {
        @Override
        public void run() {
            // UIスレッド（スレッド名は[main]）で実行される
        }
    });
}
```

UIスレッド以外で実行した処理をキューで管理したい場合は、以下のコードで

```java:HandlerThread
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    HandlerThread handlerThread = new HandlerThread("other");
    handlerThread.start();

    // HandlerThreadを予めstart()させておかないとgetLooper()でnullが返却される

    Handler handler = new Handler(handlerThread.getLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            // ワーカスレッド（スレッド名は[other]）で実行される
        }
    });
}
```
VimでGoの開発環境を設定する方法のまとめ

# TL;DR
本記事ではVimでのGo開発環境の構築方法をまとめる。

基本的に以下のプラグインの使用方法についてのまとめになります。
[fatih/vim-go: Go development plugin for Vim](https://github.com/fatih/vim-go)

情報が古くなっている可能性がありますので、まずは上記のREADMEを参照して下さい。

# この記事でできること
+ `*.go` をGo言語と判別してくれるようにする
+ シンタックスハイライト
+ オムニ補完
+ 保存時の自動整形(go fmt)
+ 保存時の自動ビルドとquickfix
+ シンタックスチェック(重いので使ってないけど一応できる)

# GOPATHの設定

```bash:*shrc
export GOPATH=${HOME}/go
```

現在はGOROOTは指定する必要はないようです
今回はホームディレクトリに`go`というディレクトリを作成してそこをGOPATHに指定しました

fish-shellを使用している方は後述する vim-go の [README](https://github.com/fatih/vim-go#im-using-fish-shell-but-have-some-problems-using-vim-go) に補足が書いてあるのでそちらを参照して下さい

# vimrcの設定
Go言語用のオールインワンプラグインを作っている方がいるので、使わせて頂きます

[fatih/vim-go](https://github.com/fatih/vim-go)

プラグインの導入方法詳細は割愛して、例えばNeoBundleだと以下のように設定します

```vim:vim-goの導入
NeoBundle 'fatih/vim-go'
```

少なくとも自分の今の環境だと`*.go`を自動でGo言語だと判別してくれないようです(最新にパッチが当たっているかは未調査)
`vim-go`は拡張子の判別も含んでいるため、とりあえず上記のように設定すればよいと思います
`*.go`の拡張子の判別設定を自分でやっているのなら、以下のようにLazy化してもいいかもしれないです(動作未確認)

```vim:lazy化
NeoBundleLazy 'fatih/vim-go', {
            \ 'autoload' : { 'filetypes' : 'go'  }
            \ }
```

# 必要パッケージのインストール
`vim-go` が依存しているパッケージをインストールします
*vimを起動後* 以下のコマンドを実行してください

```vim:vim-go依存パッケージのインストール
:GoInstallBinaries
```

`Git` と `Mercurial` に依存してるらしいので、入っていない場合は先にパッケージを入れておくのをおすすめします

```bash:ubuntuでの例
sudo apt-get install git mercurial
```

あとはお好みで vim-go の設定を追記して下さい
自分は今のところ以下の設定のみ足しています

```vim:vim-goの設定例
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_structs = 1
```

他の設定に関してはvim-goやその他の依存プラグインの [README](https://github.com/fatih/vim-go) を参照して下さい

# シンタックスハイライト
上記の設定ができていれば、シンタックスハイライトが有効になっているはずです

追加で err のハイライトも足しておくとより捗るらしいです
["err"という文字列をHighlightしておくとGolangのコードリーディングが捗る](http://yuroyoro.hatenablog.com/entry/2014/08/12/144157)

# オムニ補完
上記の設定ができていれば、`C-x C-o`でオムニ補完ができるはずです

neocompleteで自動補完する場合は以下のように設定しました

```vim
let g:neocomplete#sources#omni#input_patterns.go = '\h\w\.\w*'
```

※githubのパッケージの補完が効かない場合の件について、記事末尾の補足に追記しました

# コード整形
上記の設定ができていれば、保存時に `go fmt` が自動で実行されるはずです

# ビルドとquickfixの利用
以下のコマンドを利用して下さい

```vim
:GoBuild
```

# シンタックスチェック有効化
syntasticを使えば特に設定することなくシンタックスチェックを有効化できます
ただ、大きいパッケージを入れるととたんに重くなるので、vim-watchdogsとかの導入も検討して下さい（設定方法未調査）

```vim:シンタックスチェックプラグイン
NeoBundle 'scrooloose/syntastic'
```

# 補足
## Githubからgo getしてきたパッケージの補完が効かない
以下を試してみてください

```bash
cd ${GOPATH}/src/github.com
go build -v ./... && go install ./...
```

正確なところは未調査ですが、どうやら補完のためには `${GOPATH}/pkg` 以下にバイナリがインストールされてる必要があるようです

## Vim 内でのGOPATHの設定？
設定方法を調べている際、ブログ等で以下のように設定している方が多いようでしたが、
`vim-go`のReadmeにも見られなかったし、設定しなくても実際の動作は影響しませんでした

```vim:必要？
exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")
```

以前は必要だったのか、bashrc等に書いていれば必要ないのかは未調査
備忘録：C#からエクセルファイルを出力する

# C#からエクセルファイルを出力する方法

EXCELの操作って面倒くさいイメージがあって避けてきたけれど、Pythonで作ったツールをC#で焼き直しすることになり、いろいろ嵌ったので備忘録にとっておく。

* 今回の環境

Visual Studio 2010

* 参照の追加

>　.NETのMicrosoft.Office.Interop.Excel

Excel操作のコンポーネントは.netとcomにあるが、comはマシンにインストールされているofficeのバージョンに依存するため注意。

* Usingの宣言

```csharp:
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
```

* エクセル出力のメソッド

```csharp:

private void excel_OutPutEx()
{
  //Excelオブジェクトの初期化
  Excel.Application ExcelApp = null;
  Excel.Workbooks wbs = null;
  Excel.Workbook wb = null;
  Excel.Sheets shs = null;
  Excel.Worksheet ws = null;

  try
  {
    //Excelシートのインスタンスを作る
    ExcelApp = new Excel.Application();
    wbs = ExcelApp.Workbooks;
    wb = wbs.Add();

    shs = wb.Sheets;
    ws = shs[1];
    ws.Select(Type.Missing);

    ExcelApp.Visible = false;
 
    // エクセルファイルにデータをセットする
    for ( int i = 1; i < 10; i++ )
    {
      // Excelのcell指定
      Excel.Range w_rgn = ws.Cells;
      Excel.Range rgn = w_rgn[i, 1];
      
      try
      {
        // Excelにデータをセット
        rgn.Value2 = "hoge";
      }
      finally
      {
        // Excelのオブジェクトはループごとに開放する
        Marshal.ReleaseComObject(w_rgn);
        Marshal.ReleaseComObject(rgn);
        w_rgn = null;
        rgn = null;
      }
    }

    //excelファイルの保存
    wb.SaveAs(@"HOGE:\huge\sample.xlsx");
    wb.Close(false);
    ExcelApp.Quit();
  }
  finally
  {
     //Excelのオブジェクトを開放し忘れているとプロセスが落ちないため注意
     Marshal.ReleaseComObject(ws);
     Marshal.ReleaseComObject(shs);
     Marshal.ReleaseComObject(wb);
     Marshal.ReleaseComObject(wbs);
     Marshal.ReleaseComObject(ExcelApp);
     ws = null;
     shs = null;
     wb = null;
     wbs = null;
     ExcelApp = null;

     GC.Collect();
  }
}

```
開放忘れがあるとExcelのプロセスがガベージコレクションが実行されるまで残るので、注意です。自分はこれで半日くらい悩みました。


EXCELを操作するならVBAが圧倒的に楽だけど。。。C#が使いたかったんだ！
EC2(AmazonLinux)のCVE-2015-0235（GHOST）対応

##AmazonLinuxのCVE-2015-0235（GHOST）対応

AWSが下記ページで発表しているが、AmazonLinux利用時のポイントとしては下記になりそう。

https://alas.aws.amazon.com/ALAS-2015-473.html

* 「2.17-55.93」が適用され再起動しシステム全体に反映されている必要がある。
* Launch時にcloudinitでアップデートが通常かかるので、古いAMIでも新しくLaunchする時はアップデートされて通常は解消されそう。
* 基本的にはyum updateで事象は解決されるが、「/etc/yum.conf」のreleaseverを設定していて古いリポジトリを参照していた場合は注意する。それでも2014.03のリポジトリまでは現在最新のglibcがアップデートされている？
* Beanstalkでreleaseverが固定されている場合は注意する。「/etc/yum.conf」を要チェック。
実践! OverlayFS


先日、[OverlayFSについて](http://qiita.com/awakia/items/a9296840349f0b6f4482) 調べたので、今回は実際に使ってみて挙動を確かめてみた。

## OverlayFSの基礎


ドキュメントには色々書いているが、Overlayfsの基本的な考え方は以下の通り

1.  Readonlyな下の層と、Writableな上の層を重ね合わせ1つのファイルシステムに見せる
2. このとき、ディレクトリは重ね合わされ、ファイルは上から見ていく
 - コンフリクトしていたらファイルだと上が優先され、ディレクトリだとマージされる
3. 下(readonly)にしかないファイルを編集すると上にコピーが作成される


## 実験環境


最新の[CoreOS](https://coreos.com/)はOverlayFSがマージされたKernel 3.18が入っているので、これのvagrantを使う

```bash
$ git clone https://github.com/coreos/coreos-vagrant
$ cd coreos-vagrant
$ vagrant up
$ vagrant ssh
```

念のため、CoreOSの中でKernelのバージョンを確認しておこう。

```bash
core@core-01 ~ $ uname -r
3.18.2
```


## OverlayFSの実験

overlayfsを行うためには、以下の4つのディレクトリが必要

- `work`: ワーキングディレクトリ。upperと同じファイルシステムであり、空である必要がある
- `lower`: 下の層のディレクトリ。読み込み専用で、様々なファイルシステムが使用できる
- `upper`: 上野層のディレクトリ。書き込み可能であり、readdirのd_typeを適切に返す必要がある。このためNFSは使用できない
- `merged`: overlayfsのマウント先のディレクトリ


### 準備

```bash
$ mkdir work
$ mkdir upper
$ mkdir lower
$ mkdir merged
$ echo "upper" >> upper/both
$ echo "upper" >> upper/only_upper
$ echo "lower" >> lower/both
$ echo "lower" >> lower/only_lower
```

必要な4つのディレクトリを作り、挙動を確かめるため以下の3種類のファイルを準備:

- `both`: 上下両方に存在するファイル
- `only_upper`: 上のみに存在するファイル
- `only_lower`: 下のみに存在するファイル

### overlayfsでマウント

```bash
$ sudo mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged
```

`-t`オプションに`overlay`と指定することでoverlayfsでマウントすることを示す
`-o`は、`-t`で指定したファイルシステムに必要なパラメータを指定する部分。`lowerdir`,`upperdir`,`workdir`のすべての指定が必要。

workdirとかなくても大丈夫だろとたかをくくっていると、悪いところの可能性が豊富すぎるよくわからないエラーが出るので注意。

```bash
$ sudo mount -t overlay overlay -o lowerdir=lower,upperdir=upper merged        
mount: wrong fs type, bad option, bad superblock on /home/core/overlay,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
```

### 挙動の確認

lsをするとちゃんと3つのファイルが見えている:

```
$ ls merged
both  only_lower  only_upper
```

それぞれのファイルの中身を見ると、両方にあるファイル`both`の中身は上のものの中身になっている:

```
core@core-01 ~ $ cat merged/only_lower
lower
core@core-01 ~ $ cat merged/only_upper
upper
core@core-01 ~ $ cat merged/both      
upper
```

下のみにしか無いファイルをeditすると、上にファイルがコピーされ、それが編集される:

```
$ ls upper
both  only_upper
$ vi merged/only_lower
$ ls upper
both  only_lower  only_upper
```

## 補足

本来overlayfsは何層にも重ねることができ、てっぺんの層以外はReadOnlyでよい。
この時、overlayfs でのマウントのupperdirにもNFSが使える。
このようにする際には`mount`の`-r --read-only`オプションを使えばよい。
.batでハマった現象のメモ

当たったやつメモしていくだけなので、しょーもない事しか書かれないと思います。
# for文内のサブバッチ呼び出し
## 現象
こんなバッチ書いてました。

```bat:test01.bat
for /d %%e in ( .\* ) do (
  echo start for e
  for /d %%m in ( %%e\* ) do (
    echo start for m
    hogehoge.bat %%e\%%m
    echo endof for m
  )
  echo endof for e
)
echo out of for
```

echoとかは適当。
この時点でこのバッチ自体が非常によろしくない書きかたしてるのは予想がつくと思いますが、それはそれとして、出力がこんな感じ。

```text:console
start for e
start for m
output hogehoge.bat
endof for m
endof for e
```

forの外に出てくれない。for文自体も何回か回ってくれる筈なのに1回しか実行されない。

## 解決方法

```bat:test01.bat
for /d %%e in ( .\* ) do (
  echo start for e
  for /d %%m in ( %%e\* ) do (
    echo start for m
    call hogehoge.bat %%e\%%m
    echo endof for m
  )
  echo endof for e
)
echo out of for
```

他バッチを呼び出してる部分にはちゃんと **call** を付けましょう。

## 原因
1. `hogehoge.bat` の終了のされかたが `exit /b` では無く `exit` だった
2. なので最初に `hogehoge.bat` が呼ばれた時にコントロールが帰ってこないでそのまま終了していた
3. しかし、forが評価された時には *括弧の中の式全体が一度に評価される* ので `echo endof for e` の部分までは実行されていた
Oracle備忘録：データベースリンク

# データベースリンク
他のデータベースに存在するテーブルへアクセスする方法。
たとえば、新システムと既存のシステムでデータ連携を行う際に、サーバーが別々、
データーベースが別々の場合に、データベースリンクを張ることで、データの操作が可能になる。

* データベースリンクの作成

```lang:
CREATE DATABASE LINK データベースリンク名
CONNECT TO 接続先のユーザー名
IDENTIFIED BY 接続先のパスワード
USING データベースサーバーのIPアドレス/接続先のデータベースサービス名
```


* データベースリンクの確認

```lang:
SELECT * FROM ALL_DB_LINKS
```



* データベースリンクの削除

```lang:
DROP DATABASE LINK データベースリンク名
```

* 使い方の例

```lang:
SELECT * FROM データベースリンク先のテーブル名@データベースリンク名
```

注意：
データベースリンクでつなぐデータベース同士の文字コードが異なる場合、外字や特殊文字が文字化けする可能性があるため注意。
複数のコンポーネントから同じJavaScriptライブラリーを使う方法

# Loader componentについて

Lightningコンポーネントを作っていて誰しもこれどうするのかなーと思うのが、外部JavaScriptライブラリーを良い感じに読み込む方法で、私も[RequireJSコンポーネントを使ったLightningコンポーネントの部品化](http://qiita.com/twk/items/fa2a6140dfd8e80aea81)という記事を書きましたし、Qiitaでも他の方の記事も見られます。

さて、[Lightning FAQ](https://developer.salesforce.com/page/JP:Lightning_FAQ)を改めて読むと、何やら記述があります。

> Q: 外部JavaScriptライブラリを組み込むにはどうしたら良いでしょうか?
> A: RequireJSコンポーネントもしくはLoader component (https://github.com/rajaraodv/loadcomponent) を使って、
> 外部のJSやCSSファイルを組み込むことが可能です。

`RequireJS`は冒頭の記事に書いた通りで、実際は準備がやや大変なのですが、Loader componentの方が実は本命とも考えられ、直列読み込み、並列読み込みを読み込み時に簡単に指定したり、読み込み完了イベントも準備されています。

```xml
<namespace:load 
    filesInParallel="/resource/to/css1.css,/resource/to/fileParallel1.js,/resource/fileParallel2.js"        
    filesInSeries="/resource/to/file1.js,/resource/dependentOnFile1.js"
/>
```

```xml
<aura:handler event="jam:staticResourcesLoaded" action="{!c.initScripts}"/>
```

もっと前からこの存在に気づいていれば冒頭の記事も違う形になっていたんじゃ、とか言っていても仕方がないので、冒頭の記事同様、「外部JavaScriptを使っている自作Lightningコンポーネントを第三者に使ってもらう」ことを念頭に、2つの読み込み方を提示し検討したいと思います。

# 呼び出し側での一括読み込み

依存関係が複雑でなければ使用側が外部リソースをまとめて読み込めば良いでしょう。下記は、`myCmp1`および`myCmp2`が`common1.js`か`common2.js`またはその両方を利用する場合です。基本的に当コンポーネントの配布元ではそのような利用方法を想定しているようです。

```xml:ComponentsUser1.cmp
<aura:component>
  <c:load filesInSeries="/my/zip/common1.js,/my/zip/common2.js" />
  <c:myCmp1 />
  <c:myCmp2 />
</aura:component>
```

読み込み指定を忘れた時の対処として、[冒頭の記事の利用例](http://qiita.com/twk/items/fa2a6140dfd8e80aea81#%E4%B8%8A%E8%A8%98%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E3%81%86lightning%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E4%BE%8B)と同様に、`myCmp1`と`myCmp2`内にて、`setTimeout`にて外部リソース読み込みの確認を取ると親切かと思います。

# コンポーネント内からの読み込み

依存関係が複雑な時や、コンポーネントのユーザー側により楽をしてもらいたい場合は、提供コンポーネント内（上記で言う`myCmp1`）にてLoader component等を使用して外部リソースを読み込む方法が考えられます。

```xml:ComponentsUser2.cmp
<aura:component>
  <c:myCmp1 />
  <c:myCmp2 />
</aura:component>
```

```xml:myCmp1.xml
<aura:component>
  <aura:attribute name="loadPath" default="/my/zip" type="String" />
  <aura:if isTrue="{!v.loadPath != ''}">
    <c:load filesInSeries="{!v.loadPath + '/common1.js,' + v.loadPath + '/common2.js'}" />
  </aura:if>
  <!-- Your component body goes here -->
</aura:component>
```

この場合、各コンポーネントからload.cmpを読み込む必要があるため、そのまま呼び出した場合、一括読み込みの場合と比較してコンポーネントの読み込み回数が増えてしまいます。読み込み済みを意味する引数を準備し活用することにより、比較的効率的に動作させることも可能と思われます。

```xml:ComponentsUser3.cmp
<aura:component>
  <c:load filesInSeries="/my/zip/common1.js,/my/zip/common2.js" />
  <c:myCmp1 loadPath="" />
  <c:myCmp2 loadPath="" />
</aura:component>
```
HTML5 templateタグを記述する

以前[Lightningコンポーネント内にscriptタグを記述する方法](http://qiita.com/twk/items/90d2ceebccce0cac17ed)というネタ的な投稿にて`aura:html`タグを紹介しましたが、`aura:html`タグにはタグ名のチェックを回避してくれる場合がある、というポイントがあります。

ここでは、HTML5で導入された`template`タグを記載してみましょう。`template`タグについてざっくり言うと、HTMLの断片をJavaScriptからテンプレート的に使う時に`div`の代わりに使えるタグです。

```xml:Template.cmp
<aura:html tag=“template” id=“mytemplate”>
  <!– template body goes here -->
  <div>Template used: <span>0</span></div>
</aura:html>
```

```TemplateController.js
({
    useIt: function() {
        var div = document.querySelector('template div');
        // Update something in the template DOM.
        var span = div.querySelector('span');
        span.textContent = parseInt(span.textContent) + 1;
        document.querySelector('#container').appendChild(
            document.importNode(div, true));   
    }
})
```

ボタンを何度も押すと、`template`タグの中身が複製されていきます。

![スクリーンショット 2015-01-28 15.32.57.png](https://qiita-image-store.s3.amazonaws.com/0/44645/b1c09731-be9c-c349-0bb7-b7d3df98df80.png)

ここで注意点として、Lightningではタグの記載に応じて動的にDOMを構築していくため、コンポーネントファイルに記載したDOMの構造と実際の構造が変わっていくことがあります。冒頭の記事の通り、`script`は特殊処理が行われるので`template`タグ内でも実行されてしまいますが、それに限らず、意図と違う動作になった場合にはDOM構造を確認すると良いでしょう。
Windowsでアクティブになっているアプリケーションの名前をRubyでFiddleを使って取得

昨日、[Rubyを使ってWin32APIを叩きWindowsでアクティブになっているアプリケーションの名前を取得しましたが](http://qiita.com/hayabusa333/items/1e325946a8d8486ce59e) 、Ruby2.0以降からはFiddleを使ってWindows系の関数を叩くのが標準となったようです。

そこで昨日と同じコードをRuby2.0以降の標準で記載するには、どのように書けばよいのかっということで記載してみました。

動作環境は昨日と同じく、Ruby2.0とRuby2.1で動作確認済み。Ruby2.2は未確認
Windows環境はWindows7を使用、Windows8環境下で動くかは未確認です。

```main.rb
require "fiddle/import"
require 'fiddle/types'

module WIN32API
  extend Fiddle::Importer
  dlload 'C:\\Windows\\System32\\user32.dll'
  include Fiddle::Win32Types

  extern 'HWND GetForegroundWindow()'
  extern 'int GetWindowText(HWND, char*, int)'
  extern 'int GetWindowTextLength(HWND)'
end

loop{
  hwnd = WIN32API.GetForegroundWindow
  buf_len = WIN32API.GetWindowTextLength(hwnd)
  str = ' ' * (buf_len + 1)
  result = WIN32API.GetWindowText(hwnd, str, str.length)

  p str.encode(Encoding.default_external)

  sleep 1
}
```

ソースコードとしては長くなりましたが、C言語やC++で呼び出すように呼び出せるようになったので、直感的にはわかりやすくなったかなっと思います。
また extern で記載する際も、実際の関数呼び出しの呼び方を定義しているため、わかりやすいかと思います。
[Emacs] auto-mode-alist の "\\.js\\'" と "\\.js$" の違い

はじめ
======

js2-modeのコメントに書いてある、以下の記述をコピペして設定していました。

```el
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
```

一方で、だいぶ前に設定した`c++-mode`の設定は以下のように記述していました。

```el
(add-to-list 'auto-mode-alist '("\\.C$"  . c++-mode))
(add-to-list 'auto-mode-alist '("\\.cc$" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.cpp$". c++-mode))
(add-to-list 'auto-mode-alist '("\\.hh$" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.h$"  . c++-mode))
```

終端が`$`か`\\'`であるかが異なります。

正規表現では`$`は行の末尾にマッチするするのでわかるのですが、
`\\'`はわかりません。

EmacsWiki
========

Gooogle 先生に `emacs auto-mode-alist` と尋ねたところ、
http://www.emacswiki.org/emacs/AutoModeAlist を教えてくれました。

> Note that `\'` matches the end of a string, where as `$` matches the empty string before a newline. Thus, `$` may lead to unexpected behavior when dealing with filenames containing newlines. (Should be pretty rare… ;))

ということで、ファイル名に改行が入ってくると予期しない動作になる（`"foo.js\nx"`とか？)ので、この用途では`\\'`を用いるべきとのことです。

また、これは`auto-mode-alist`にかぎらず、Emacsの正規表現全般で使えます。

結論
====

auto-mode-alist に追加するパターンは、`\\'`で終端するべき。

参考
====

* http://www.emacswiki.org/emacs/AutoModeAlist
* http://masutaka.net/chalow/2011-10-18-1.html

蛇足
====

* MacBook でバックスラッシュを出すにはoption+¥なので面倒
* 引用文中に`$`でくくられた箇所が入っていたので数式と解釈されてしまい、表示が崩れて困った
* バッククオートとクオートが混ざって疲れる
やっと出来た、AnsibleとVagrantでLAMP環境を作る


##手本にした記事
[Ansible初心者がLAMP環境の構築を自動化する方法 | 株式会社LIG](http://liginc.co.jp/web/programming/server/129004)
[Ansible チュートリアル | Ansible Tutorial in Japanese](http://yteraoka.github.io/ansible-tutorial/)

##前準備
* VirtualBox、Vagruntのインストール
* Ansibleのインストール `$ brew install ansible`

##手順
ホスト=>仮想サーバで行う場合 ※実行環境MacOS X

* Vagrantで仮想サーバをたてる
* ssh鍵の作成と登録
* sshを使ってVagrant仮想サーバにログインしてみる
* playbookの作成
* ansible-playbookの実行

完成！

##詰まった点
###ssh鍵の作成と登録
**※追記 Vagrantを使う場合 $vagrant ssh-config --host web >> ~/.ssh/config を使ったほうが楽です。要は仮想サーバへ通常のsshでログイン出来れば良いので。。**

仮想サーバにSSH接続をするため鍵を作成し、接続側・接続先に登録する。

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/CRD129/.ssh/id_rsa): ※とりあえずEnter
Enter passphrase (empty for no passphrase): ※とりあえずEnter
Enter same passphrase again: ※とりあえずEnter
Your identification has been saved in /Users/hoge/.ssh/id_rsa.
Your public key has been saved in /Users/hoge/.ssh/id_rsa.pub.
```

公開鍵（.pubのほう）を接続先サーバにsshなりftpなりscpしてとにかく送る。
送れたら接続先サーバの~/.sshに移動、authorized_keysに追加する。

```
$ mv id_rsa.pub ~/.ssh/
$ cd ~/.ssh/
$ cat id_rsa.pub >> authorized_keys 
```

###sshを使ってVagrant仮想サーバにログインしてみる
仮想サーバ側のauthorized_keysのパーミッション変更。
hostsの設定。

```
~/.ssh/config内に記載
Host web #ここで設定した名前を↓
  HostName 192.168.59.34
  Port 22
  User vagrant
  IdentityFile ~/.ssh/id_rsa

~/hosts内に記載
[web]
web 　　　#ここで設定します
```
※ここに気づかずssh接続エラーを解決するのに時間がかかった;;
エラー内容が'FAILED => SSH encountered an unknown error.'でホストのssh設定をしていないためsshのログインユーザが'vagrant'にならず接続が失敗していたよう。

```
$ ansible web -i ~/hosts -m ping
web | success >> {
    "changed": false, 
    "ping": "pong"
}
```
これで接続はOK!


##最終的に出来たコマンドの流れ

```
$ vagrant init chef/centos-6.5-i386
$ vi Vagrantfile 

Vagrantfile~
~省略
#config.vm.box = "chef/centos-6.5"
  config.vm.define "web" do |node|
    node.vm.box = "chef/centos-6.5"
    node.vm.hostname = "web"
    node.vm.network :private_network, ip: "192.168.59.34"
  end
~省略

$ vagrant up
$ ssh-keygen -t rsa
$ scp ~/.ssh/id_rsa.pub vagrant@192.168.59.34:~/
$ ssh vagrant@192.168.59.34

[vagrant@web]$ mv id_rsa.pub ~/.ssh/
[vagrant@web]$ cd ~/.ssh/
[vagrant@web]$ cat id_rsa.pub >> authorized_keys
[vagrant@web]$ rm id_rsa.pub 
[vagrant@web]$ chmod 600 authorized_keys
[vagrant@web]$ exit

$ vi ~/hosts

hosts~
[web]
web

$ vi ~/.ssh/config

config~
Host web
  HostName 192.168.59.34
  Port 22
  User vagrant
  IdentityFile ~/.ssh/id_rsa

$ ansible web -i ~/hosts -m ping
web | success >> {
    "changed": false, 
    "ping": "pong"
}
$ sudo ansible-playbook ~/playbook.yml -i ~/hosts
```

以上でVagrantにLAMP環境を作ることが出来ました。
playbookの内容はとりあえず[Ansible初心者がLAMP環境の構築を自動化する方法 | 株式会社LIG](http://liginc.co.jp/web/programming/server/129004)さんからそのまま頂いたのでこれから少しづつ自分で作れるようにする予定。
あとsshの基本ぐらいちゃんと知ろうと思います。。
MonobehaviourのApplication Did Loadedてきなやつ


# いつも良く効かれるMonobehaviourさんのStartやUpdateなどの正規ドキュメント

[ここ](http://docs.unity3d.com/Manual/ExecutionOrder.html)の**Script Lifecycle Flowchart**を参照!!!

![スクリーンショット 2015-01-28 19.29.44.png](https://qiita-image-store.s3.amazonaws.com/0/25895/4427b7c2-c285-46b1-3c82-76b629ccf49b.png)
総メモリー使用量を算出するSQLクエリ

結構いろんなサイトで書かれてるけど、
自分もメモってたので、共有してみる。

MySQL用です。でもMariaDBでも動くんじゃないかな？

```sql
select
KEY_BUFFER_SIZE + QUERY_CACHE_SIZE + INNODB_BUFFER_POOL_SIZE + INNODB_LOG_BUFFER_SIZE + INNODB_ADDITIONAL_MEM_POOL_SIZE as GLOBAL_BUFFER_SIZE,
SORT_BUFFER_SIZE + JOIN_BUFFER_SIZE + READ_BUFFER_SIZE + READ_RND_BUFFER_SIZE + NET_BUFFER_LENGTH as THREAD_BUFFER_SIZE,
KEY_BUFFER_SIZE + QUERY_CACHE_SIZE + INNODB_BUFFER_POOL_SIZE + INNODB_LOG_BUFFER_SIZE + INNODB_ADDITIONAL_MEM_POOL_SIZE
+ (SORT_BUFFER_SIZE + JOIN_BUFFER_SIZE + READ_BUFFER_SIZE + READ_RND_BUFFER_SIZE + NET_BUFFER_LENGTH) * MAX_CONNECTIONS AS TOTAL_MEMORY_SIZE,
(KEY_BUFFER_SIZE + QUERY_CACHE_SIZE + INNODB_BUFFER_POOL_SIZE + INNODB_LOG_BUFFER_SIZE + INNODB_ADDITIONAL_MEM_POOL_SIZE
+ (SORT_BUFFER_SIZE + JOIN_BUFFER_SIZE + READ_BUFFER_SIZE + READ_RND_BUFFER_SIZE + NET_BUFFER_LENGTH) * MAX_CONNECTIONS)/1024 AS TOTAL_MEMORY_SIZE_kb,
(KEY_BUFFER_SIZE + QUERY_CACHE_SIZE + INNODB_BUFFER_POOL_SIZE + INNODB_LOG_BUFFER_SIZE + INNODB_ADDITIONAL_MEM_POOL_SIZE
+ (SORT_BUFFER_SIZE + JOIN_BUFFER_SIZE + READ_BUFFER_SIZE + READ_RND_BUFFER_SIZE + NET_BUFFER_LENGTH) * MAX_CONNECTIONS)/1024/1024 AS TOTAL_MEMORY_SIZE_mb,
(KEY_BUFFER_SIZE + QUERY_CACHE_SIZE + INNODB_BUFFER_POOL_SIZE + INNODB_LOG_BUFFER_SIZE + INNODB_ADDITIONAL_MEM_POOL_SIZE
+ (SORT_BUFFER_SIZE + JOIN_BUFFER_SIZE + READ_BUFFER_SIZE + READ_RND_BUFFER_SIZE + NET_BUFFER_LENGTH) * MAX_CONNECTIONS)/1024/1024/1024 AS TOTAL_MEMORY_SIZE_gb
from
(select VARIABLE_VALUE as SORT_BUFFER_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'SORT_BUFFER_SIZE') as table1,
(select VARIABLE_VALUE as READ_BUFFER_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'READ_BUFFER_SIZE') as table3,
(select VARIABLE_VALUE as JOIN_BUFFER_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'JOIN_BUFFER_SIZE') as table4,
(select VARIABLE_VALUE as READ_RND_BUFFER_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'READ_RND_BUFFER_SIZE') as table5,
(select VARIABLE_VALUE as KEY_BUFFER_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'KEY_BUFFER_SIZE') as table6,
(select VARIABLE_VALUE as INNODB_BUFFER_POOL_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'INNODB_BUFFER_POOL_SIZE') as table7,
(select VARIABLE_VALUE as INNODB_LOG_BUFFER_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'INNODB_LOG_BUFFER_SIZE') as table8,
(select VARIABLE_VALUE as INNODB_ADDITIONAL_MEM_POOL_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'INNODB_ADDITIONAL_MEM_POOL_SIZE') as table9,
(select VARIABLE_VALUE as NET_BUFFER_LENGTH from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'NET_BUFFER_LENGTH') as table10,
(select VARIABLE_VALUE as MAX_CONNECTIONS from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'MAX_CONNECTIONS') as table11,
(select VARIABLE_VALUE as QUERY_CACHE_SIZE from INFORMATION_SCHEMA.GLOBAL_VARIABLES where VARIABLE_NAME = 'QUERY_CACHE_SIZE') as table12;
```
gollumで特定のディレクトリのみBasic認証をかける

gollum、というかSinatraのはなし。--configで渡すファイルに以下のような感じで記述する。

~~~ruby

module Precious
  class App < Sinatra::Base
    enable :logging

    before '/private/*' do
      response['WWW-Authenticate'] = %(Basic realm="private area.")
      throw(:halt, [401, "Not authorized\n"]) unless private_authorized?
      show_page_or_file("/private/#{params[:splat].first}")
    end

    def private_authorized?
      @auth ||=  Rack::Auth::Basic::Request.new(request.env)
      @auth.credentials == ['user', 'pass']               #=> username, password
    end
  end
end

~~~
mikel/mailでメール受信した時のエンコード 文字化けを解決する

mikel/mailを利用して、メール受信した時に"iso-2022-jp"とかだとエンコードしてあげないと化ける。
細かい部分は適当なのであしからず。

```rb

require 'mail'

Mail.defaults do
  retriever_method :pop3, :address    => "pop.example.com",
                          :port       => 995,
                          :user_name  => 'test@example.com',
                          :password   => 'password',
                          :enable_ssl => true
end

emails = Mail.find(:what => :last, :count => 3, :order => :desc)
emails.each do |mail|
  # 文字コード変換
  mail.header['Content-Type'].to_s =~ /charset=(\S+)/m
  if $1.present? && $1!='utf-8'
    charset = $1.downcase
    str = mail.body.decoded.to_s.encode("utf-8", charset, :invalid => :replace, :undef => :replace)
  else
    str = mail.body.decoded.to_s.force_encoding('utf-8')
  end
end

```
Vagrantのアップデート方法(Windows)

#インストールされているVagrantのバージョン確認方法

コマンドプロンプトを立ち上げて、以下のコマンドを実行することで、バージョンの確認が可能。

```
vagrant --version
```

#Vagrantアップデート方法

1. Vagrantの公式サイトの[ダウンロードページ](http://www.vagrantup.com/downloads.html)から最新のバージョンをダウンロード。

2. ダウンロードしたmsiファイルをダブルクリックし、Vagrantのインストール済みフォルダを指定してインストール。

3. PCを再起動。

4. インストール完了後、以下のコマンドでアップデートされていることを確認。

```
vagrant --version
```
脆弱性GHOSTの検証用コード


はじめに
==========

また深刻な脆弱性が発見されました。
http://d.hatena.ne.jp/Kango/20150128/1422409960
などは現時点でよくまとめられていると思います。

そこに[検証用コードへのリンク](https://www.qualys.com/research/security-advisories/GHOST-CVE-2015-0235.txt)があったので、
簡単に実行できるようにしたので一応共有です。

方法
=====

ソースコードをコンパイルするので **gccが必要** です。

gccが既にInstallされていれば、こんな感じに実行できます。

```shell
% curl -L -s https://gist.githubusercontent.com/mokemokechicken/91b0df69a019c7243857/raw/eb4cc23d11a15561b4043a140e79fbeeeefb6492/check_ghost.sh | sh

```

※スクリプト本体は上記のgist URLで、それを実行しているだけです。

`GHOST` という実行ファイルがカレントディレクトリに作成されます。

**vulnerable** と表示されれば脆弱性があるということで、
**not vulnerable** と表示されれば大丈夫、ということです。

**注意：** glibcをUpdateした後は **not vulerable** と表示されていてもあてにせずに、 **OSを再起動**する方が良いでしょう。
softwarecollections.orgからphp 5.5をCentOS6/7にインストール

# CentOS6用のSoftware Collectionsにはphp 5.4はあるが5.5は無い

RHEL用のSoftware Collectionsには[Chapter 1. Red Hat Software Collections 1.2]( https://access.redhat.com/documentation/en-US/Red_Hat_Software_Collections/1/html/1.2_Release_Notes/chap-RHSCL.html#sect-RHSCL-Features )のようにphp54とphp55というパッケージがあります。

一方、CentOS6用のSoftware Collectionsには[AdditionalResources/Repositories/SCL - CentOS Wiki]( http://wiki.centos.org/AdditionalResources/Repositories/SCL )のようにphp54はありますが、php55はありません。

CentOS7用の標準パッケージだとphpは5.4で、CentOS7用のSoftware Collectionsはまだ無いようです。

# softwarecollections.orgにphp55というパッケージがあってCentOS6/7対応でした

ググっていたら [CentOS • View topic - SCL/RHSCL for CentOS 7]( https://www.centos.org/forums/viewtopic.php?f=48&t=47257 )経由で [Php55 — Software Collections]( https://www.softwarecollections.org/en/scls/rhscl/php55/ ) というパッケージを見つけました。

CentOS 6でphp55とphp55-php-fpmをインストールする手順は以下の通りです。

```shell-session
sudo yum install -y scl-utils
sudo yum install -y https://www.softwarecollections.org/en/scls/rhscl/php55/epel-6-x86_64/download/rhscl-php55-epel-6-x86_64.noarch.rpm
sudo yum install -y php55 php55-php-fpm
```

CentOS 7でphp55とphp55-php-fpmをインストールする手順は以下の通りです。

```shell-session
sudo yum install -y scl-utils
sudo yum install -y https://www.softwarecollections.org/en/scls/rhscl/php55/epel-7-x86_64/download/rhscl-php55-epel-7-x86_64.noarch.rpm
sudo yum install -y php55 php55-php-fpm
```

# softwarecollections.orgはRedHatではなくコミュニティによる運営

[Php55 — Software Collections]( https://www.softwarecollections.org/en/scls/rhscl/php55/ )のページには Php55 by [Software Collections — Software Collections]( https://www.softwarecollections.org/en/scls/user/rhscl/ )と書かれていて、このパッケージの作成者はrhsclというアカウント名になっています。

アカウント名からはRed Hat公式なのか？とも思ったのですが、[Software Collections — Software Collections]( https://www.softwarecollections.org/en/ )ホームページの"Collections Supported by Red Hat"のセクションを見ると、RedHatが有償サポートしているのは、あくまで [Red Hat Enterprise Linux Developer Program - Red Hat Customer Portal]( https://access.redhat.com/products/Red_Hat_Enterprise_Linux/Developer/#rhscl=&dev-page=5 ) のようです。

[Software Collections — Software Collections]( https://www.softwarecollections.org/en/ )ホームページのフッター左にはRed Hat, Inc.の文字がありますが、[About the project — Software Collections]( https://www.softwarecollections.org/en/about/ )の"Who Runs SoftwareCollections.org?"セクションによると SoftwareCollections.orgはコミュニティによる取り組みとのことです。

とはいえ、php 5.5をソースからビルドするよりは楽そうなので、使ってみようと思います。
Homebrewからpyenvインストール、pyenvからPythonをインストールする

Pythonをインストールする前にバージョンコントロコールできるpyenvを導入します。

```
$ brew install pyenv
```

関連するパッケージ、autoconfとpkg-configもインストールされます。

```
$ brew install pyenv
==> Installing dependencies for pyenv: autoconf, pkg-config
==> Installing pyenv dependency: autoconf
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/autoconf-2.
Already downloaded: /Library/Caches/Homebrew/autoconf-2.69.yosemite.bottle.1.tar.gz
==> Pouring autoconf-2.69.yosemite.bottle.1.tar.gz
?  /usr/local/Cellar/autoconf/2.69: 70 files, 3.1M
==> Installing pyenv dependency: pkg-config
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/pkg-config-
Already downloaded: /Library/Caches/Homebrew/pkg-config-0.28.yosemite.bottle.2.tar.gz
==> Pouring pkg-config-0.28.yosemite.bottle.2.tar.gz
?  /usr/local/Cellar/pkg-config/0.28: 10 files, 612K
==> Installing pyenv
==> Downloading https://github.com/yyuu/pyenv/archive/v20141211.tar.gz
######################################################################## 100.0%
==> Caveats
To enable shims and autocompletion add to your profile:
  if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

To use Homebrew's directories rather than ~/.pyenv add to your profile:
  export PYENV_ROOT=/usr/local/opt/pyenv
==> Summary
?  /usr/local/Cellar/pyenv/20141211: 315 files, 2.7M, built in 4 seconds
$ 
```

~/.pyenvディレクトリ作成
~/.bash_profile変更

```.bash_profile
export PYENV_ROOT=/usr/local/opt/pyenv
eval "$(pyenv init -)"
```

インストール可能なものを確認

```
$ pyenv install -l
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5
  2.5.1
  2.5.2
  2.5.3
  2.5.4
  2.5.5
  2.5.6
  2.6.6
  2.6.7
  2.6.8
  2.6.9
  2.7-dev
  2.7
  2.7.1
  2.7.2
  2.7.3
  2.7.4
  2.7.5
  2.7.6
  2.7.7
  2.7.8
  2.7.9

・・・省略・・・

```

今回は、2系の最新版2.7.9をインストール

```
$ pyenv install 2.7.9
```

関連するものもインストールされます。

```
$ pyenv install 2.7.9
Downloading readline-6.3.tar.gz...
-> http://ftpmirror.gnu.org/readline/readline-6.3.tar.gz
Installing readline-6.3...
Installed readline-6.3 to /usr/local/opt/pyenv/versions/2.7.9

Downloading Python-2.7.9.tgz...
-> https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
Installing Python-2.7.9...
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
Installed Python-2.7.9 to /usr/local/opt/pyenv/versions/2.7.9

$
```

インストール確認

```
$ pyenv versions
* system (set by /usr/local/opt/pyenv/version)
  2.7.9
$ python --version
Python 2.7.6
$
```
macでgit管理をはじめる


win:[winでgit管理をはじめる](http://qiita.com/perpouh/items/cfeedab539227ccbc66d)

※git自体の説明は[サルでもわかるgit入門](http://www.backlog.jp/git-guide/)様にて。この記事では実際の手順についてのみ解説します。

## 手順
 - 管理ソフトの準備
 - リポジトリの準備
	- リポジトリの作成
 	- ファーストコミット
 - その後の作業の流れ

## 管理ソフトの準備
無料ソフト[SourceTree](https://www.atlassian.com/ja/software/sourcetree/overview)を使います。
ダウンロード、インストールは適宜。

## リポジトリの準備
無料でプライベートリポジトリを作成できるbitbucketを使っていきますヽ(´@ω@｀)ﾉ
githubもいいと思うんですけど、あっちはお金を払わないとプライベートリポジトリが作成できなくて
ソースコードが全世界に向けて公開されちゃうので、例えば会社とかでソース管理するときはbitbucketだったりします。

金払え。

-----

[bitbucket.org](https://bitbucket.org/)

上記にアカウントを取得します。
アカウントを取得するとダッシュボードにログイン出来る状態になります。
![スクリーンショット 2015-01-28 17.03.37.png](https://qiita-image-store.s3.amazonaws.com/0/62826/9216ace2-2458-3723-f79c-4ca2bdb8eb42.png "スクリーンショット 2015-01-28 17.03.37.png")


### リポジトリの作成
ヘッダーのCreateからリポジトリを作っていきます。
Nameにプロジェクト名、Descriptionにはプロジェクトの説明を入力します。
AccessLevelはそのままアクセス制限、ここにチェックを入れると招待された人間のみ（実際の運用ではアクセス権を与えられた社員のみ）このリポジトリを見ることが出来る状態になります。
Forkingはフォーク権限、フォークはプッシュ権限のないクローンみたいなものだと思っていてください。取り敢えずデフォルトのままでいいです。
RepositoryTypeはGitに。Issue trackingとWikiは必要ならチェックしてください。今回は説明しません。
Languageは扱うプログラム言語を選んでください。今回はPHPを選択します。

### 作業環境へclone

リポジトリができたら、左メニューよりCloneを選択します。
![スクリーンショット 2015-01-28 17.29.38.png](https://qiita-image-store.s3.amazonaws.com/0/62826/82d7934b-e797-a832-3ee3-b5b65d5621b5.png "スクリーンショット 2015-01-28 17.29.38.png")


するとこんなかんじの吹き出しが出てくると思います。ここからClone in SourceTreeを選択します。
![スクリーンショット 2015-01-28 17.31.02.png](https://qiita-image-store.s3.amazonaws.com/0/62826/b85ebb10-6259-d0b5-cc94-533ca718908b.png "スクリーンショット 2015-01-28 17.31.02.png")


アプリ起動の確認ダイアログが出ますので、アプリケーションの起動を選択してください。
するとSourceTreeが立ち上がり、ダイアログが出ます。
![スクリーンショット 2015-01-28 17.32.43.png](https://qiita-image-store.s3.amazonaws.com/0/62826/81a03612-0fb6-8b6e-dc84-a21e9613731c.png "スクリーンショット 2015-01-28 17.32.43.png")


保存先のパスは任意のものに書き換えてください。MAMPを使うPHPプロジェクトであれば/Applocations/MAMP/htdocs/sampleとかになると思います。

!!! この時指定する場所は空のディレクトリでなくてはなりません !!!

すでにプロジェクトファイルが存在しても、そのディレクトリにcloneすることはできません。ご注意ください。

### ファーストコミット

先ほど作成したディレクトリ(/Applications/MAMP/htdocs/sampleとします)に新規ファイルreadme.mdを作成しました。
![スクリーンショット 2015-01-28 17.49.21.png](https://qiita-image-store.s3.amazonaws.com/0/62826/7257155b-cf4d-0a6b-9386-cc7c0ce49784.png "スクリーンショット 2015-01-28 17.49.21.png")


作業ツリーのファイル→readme.mdにチェックを入れ、上部Commitボタンを押します。コミットメッセージの入力画面が出ますので、first commitとでも打ち込んで(様式美)、コミットボタンを押します。
コミットが終わったらプッシュします。この時、masterブランチにチェックが入っていないとうまくコミットされませんので、正しくチェックを入れてください。

プッシュができました！(左NAVIGATION→Sourceから確認できます)
![スクリーンショット 2015-01-28 17.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/62826/f3e52f76-19f4-9614-61f9-9b3926b4b70a.png "スクリーンショット 2015-01-28 17.53.04.png")

## その後の作業の流れ

この後は、今の手順と同じくファイル作成→コミット→プッシュ、ファイル編集→コミット→プッシュ、ファイル削除→コミット→プッシュを繰り返すことになります。

 - コミットは細かく！  
コミットを細かく繰り返すことにより、どうしても動かなくなった、しかもCtrl+Zも利かない！みたいなときにちょっと前のコードに戻すことができます。
 - プッシュはきちんと動作確認してから！  
プッシュしてしまうとそのソースコードは一緒に作業している同僚のファイルにも影響してしまいます。

以上、次はwinの話をします。winではtortoise gitを使用しますヽ(´@ω@｀)ﾉ
AWSにアップロードしたSSL証明書のIDを調べる

# 概要

aws-cliでELBを立てる際に使用するSSL証明書を指定する場合、`--listeners`オプション内で既にアップロードしたSSL証明書のID`SSLCertificateId`を指定する必要がある。

http://docs.aws.amazon.com/cli/latest/reference/elb/create-load-balancer.html

この値はIAMの情報とセットである必要があり、取得するにはIAMの`get-server-certificate`コマンドを使う必要がある。

http://docs.aws.amazon.com/cli/latest/reference/iam/get-server-certificate.html

# コマンド

```shell-session
$ aws iam get-server-certificate --server-certificate-name certificate_name
```

結果（イメージ）

```json
{
    "ServerCertificate": {
        "CertificateChain": "-----BEGIN CERTIFICATE----- *** -----END CERTIFICATE-----",
        "CertificateBody": "-----BEGIN CERTIFICATE----- *** -----END CERTIFICATE-----",
        "ServerCertificateMetadata": {
            "ServerCertificateId": "***",
            "ServerCertificateName": "certificate_name",
            "Expiration": "2015-12-31T23:59:59Z",
            "Path": "/",
            "Arn": "arn:aws:iam::1234567890:server-certificate/certificate_name",
            "UploadDate": "2014-12-31T23:59:59Z"
        }
    }
}
```

上記レスポンスの`Arn`が`SSLCertificateId`で使用する値となる。
jq使うとこんな感じ

```shell-session
$ aws iam get-server-certificate --server-certificate-name certificate_name | jq .ServerCertificate.ServerCertificateMetadata.Arn
```
Android開発メモ-Android用アクセサリを作るには

# Android Open Accessory Protocol 2.0を知る必要があるのだろうか？

AOA Protocolとは、Android用のアクセサリ製品を作る際に必要になる、アクセサリ機器とAndroidとの間でのデータのやりとりに関するプロトコルらしい。

機器の検知、モードの対応確認、接続確立なんかの手順を決めてある。

現在のVersionは2.0で、1.0の頃に加えてAudio機器やHID機器への対応が加わったらしい。

https://source.android.com/accessories/aoa2.html

やりたいことと関係があるかは今はまだ不明だが、一応呼読んでおこう。
FlashBuilderからのantビルドでエラー（Java heap space）が起きたときの解決方法

# 現象
* FlashBuilder4.6でantビルドを実行したときにビルドエラーが発生
    * 「 [compc] エラー: Java heap space」と表示
    * 今までは問題なくビルド出来ていた
    * CI（Jenkins）では問題なくビルド出来ている
    * 出来るものと出来ないものがあった（小さいものはOK）
    * HPを参照して、FlashBuilder.iniや、jvm.configを変更しても効果無し


# 解決方法
* FlashBuilderツール内の「外部ツールの構成...」から最大メモリサイズを設定する
    * ![fix-java-heap-space-masked.png](https://qiita-image-store.s3.amazonaws.com/0/44076/ac470f56-aa22-0bb3-3827-f725ba20aae2.png)

# まとめ
* 対応箇所が、FLEX SDKでもなく、FlashBuilder（eclipse）本体でもなく、ant側だったのでちょっと衝撃を受けました。同現象で困った人が居たら参考にして下さい。

# 参照
* http://www.codingcolor.com/as3/flash-builder-4-5-mxmlc-error-java-heap-space/
解析系研究者だけどGit初心者な皆様へ送るGit入門

## 読んで欲しい人

- 個人で解析しているけどGit使っていない人
- Git使ったほうがいいって知っているけど学習コスト高そうで、使ってない人

## Gitとは

**バージョン管理システム**と呼ばれています。
プログラムの編集履歴を残す仕組みです。
他にSubVersionっていうのもあります。

よく見るのは、複数人開発の現場で
それぞれ別の機能を作っていき、
最後にGitによって統合するというものです。

でも1人の開発でもそこそこの威力を発揮すると思うので
使ってみて欲しいです。

## Why Git?

Gitを使うメリットについて書きます。

- 編集履歴が残っているので、遡ってバグを検知しやすい
- ブランチを切り分けることで日々の解析とコードの整理整頓を複数同時並行できる

## ダウンロード

### Windows

下記から落としましょう。
[Git Download](http://git-scm.com/downloads)
※インストール時に、GitのGUIを入れることができるのですが、基本的にGitはCUIで使うものなので**当然のようにBashをインストールしてください。**

### MacOSX

`$ brew install git`。以上。

### 一緒に落とすべきGUI(共通)

#### Source Tree

[SourceTree](https://www.atlassian.com/ja/software/sourcetree/overview)

こんな感じでファイル更新履歴をおしゃれに可視化してくれます。
![スクリーンショット_012815_052859_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/b7f4eeaf-8f8e-5030-0a75-f241d8d9f591.jpeg)

## 仕組み

「リポジトリ」というハコに更新履歴を保存していきます。
実態はタダのBinaryファイルなんですが、これが重要です。

## 使い方

管理したいファイル群のあるディレクトリ(=フォルダ)にて次のコマンドを打ちます。

```shell-session
$ git init
```

これで、.gitというディレクトリが作成されます。これはリポジトリを指していて、ここに更新履歴が保存されます。

基本的に、よく使うコマンドは次のとおりです

```shell-session
$ git add file.txt //コミット候補ファイルとして追加
$ git commit -m '[add] new file!' //コミット（＝更新情報を保存）する。-m はコミットメッセージを追加するオプションで、クォーテーションマークかダブルクオートでメッセージを囲む
$ git rm file.txt //Gitによる監視をやめる
$ git reset --hard
$ git branch -b develop
$ git checkout master
```

各コマンドの意味などについて、
詳細はここを見ていただけると良いと思います。。。
↓
[サルでも分かるGit入門](http://www.backlog.jp/git-guide/)

## ということで

基本的な用語をまずはリストアップしてみたので、分からないところをググって理解を深めて欲しいです。

わからなければ質問欄へどうぞ!!

## 参考文献

- 初心者向けドキュメント：[サルでも分かるGit入門](http://www.backlog.jp/git-guide/)
- [一人でもはじめるGitでバージョン管理](http://www.slideshare.net/zephiransas/git-14810093)
- [SVNと比べたGitの違いとメリット](http://www.srockstyle.com/think/22/)
- Branchの切り分け方：[git-flowで開発を管理](http://qiita.com/BexPolar/items/4327a7326662bf85d356)
- [キャリア1年未満だった僕が、社内にGitの運用を布教するために読みあさったもの ( +ちょ〜簡単に各Gitの運用方法のメリット・デメリット )](http://qiita.com/h0ng0yut0/items/d0ef7224abc5e07525d4)
Twitterでアプリを作るなら必ず抑えておきたいサイトまとめ

## Twitter Developers
開発者であればまずはこのサイトは必須
https://dev.twitter.com/

## Things Every Developer Should Know | Twitter Developers 

各APIの詳細を読む前に最低このページは必ず読みましょう。

https://dev.twitter.com/overview/general/things-every-developer-should-know

## API Overview | Twitter Developers 
上記と合わせてこちらも読むと、TwitterのAPIの全体像がつかめます。
https://dev.twitter.com/overview/api

## REST APIs | Twitter Developers 
REST APIについて詳しい仕様を知りたいときはこちら

https://dev.twitter.com/rest/public

レイトリミットについて詳細を把握したい人は以下の2つのサイトを熟読しましょう。Rate Limits: Chartに記載が無いエンドポイントは基本15回/15分です。

API Rate Limits | Twitter Developers https://dev.twitter.com/rest/public/rate-limiting

Rate Limits: Chart | Twitter Developers https://dev.twitter.com/rest/public/rate-limits

## Working with Timelines | Twitter Developers 
Twitterのタイムラインを再現したい場合は、必読。

https://dev.twitter.com/rest/public/timelines

## Googleグループ(日本語)
わからないことがあれば、まずはグループで探す癖をつけると良いと思います。ググってもわからないことが結構すぐに見つかったりします。

https://groups.google.com/forum/#!forum/twitter-development-talk-ja

## Googleグループ(英語)
日本語グループで見つからない時はこちら。

https://groups.google.com/forum/#!forum/twitter-development-talk

## Exploring the Twitter API | Twitter Developers
TwitterのAPIを気軽にテストしたい場合に使えます。

https://dev.twitter.com/rest/tools/console

ちなみに以下のURLへGETリクエストをすると各エンドポイントで残りのリクエスト数を調べることが出来ます。
https://api.twitter.com/1.1/application/rate_limit_status.json

## Twitter APIチケットトラッカー
Twitter APIのチケットの進捗状況が確認できます

https://twittercommunity.com/

## Twitter公式技術者ブログ(英語)
https://blog.twitter.com/engineering

## Twitterヘルプセンター
https://support.twitter.com/

## Twitter公式ブログ(英語)
https://blog.twitter.com/

## Twitter障害情報(英語)
http://status.twitter.com/

## Twitter公式ブログ(日本語)
https://blog.twitter.com/ja/japan

## おすすめの本(おまけ)

少し情報は古いですが、Twitterの仕組みからREST API〜Streaming APIの仕様について一通り網羅されており理解が深まるので一読をオススメします。

Amazon.co.jp： Twitter API ポケットリファレンス (POCKET REFERENCE): 山本　裕介: 本 
http://www.amazon.co.jp/Twitter-API-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-POCKET-REFERENCE/dp/477414732X
Chromeアプリ：アイコンをクリックしてサイトに飛ぶ

#アイコンにリンクを並べる。
[アイコンをクリックしたら表示されるアプリ](http://qiita.com/simanezumi1989/items/21577f56a2a7b715578d
)のhtmlを以下のように変更すればよい。

```popup.html
<a href="http://google.com">Google</a>
```
Object.in?でArgumentErrorが発生した場合の対処（Rails3 => Rails4)

Rails3 で開発されたアプリケーションを Rails4 対応しようとすると度々例外が発生するようになります。
object.in? もそのひとつ。
ActiveSupport が提供するメソッドですが、Rails3 で引数を二つ以上使っていた場合、Rails4 に上げると以下の例外が発生します。

```
ArgumentError - wrong number of arguments (2 for 1):
```

見ての通り、引数ひとつしか使えないのにふたつ使っていることが原因です。
コードを見てみると以下のようになっています。

```rb:lib/active_support/core_ext/object/inclusion.rb
  # Returns true if this object is included in the argument. Argument must be
  # any object which responds to +#include?+. Usage:
  #
  #   characters = ["Konata", "Kagami", "Tsukasa"]
  #   "Konata".in?(characters) # => true
  #
  # This will throw an ArgumentError if the argument doesn't respond
  # to +#include?+.
  def in?(another_object)
    another_object.include?(self)
  rescue NoMethodError
    raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
  end
```

コメントに分かりやすい例が書いてあるのでこれに従えばいいです。
つまり、以下のように修正します。

```rb:object_in.rb

object.in?('hogehogehoge', 'fugafugafuga')
    ↓
object.in?(['hogehogehoge', 'fugafugafuga'])

```

分かってしまえば簡単ですね。
CircleCIでJSLintを流す

目的
----

CIの手始めにコードスタイルチェックツールをGitHubへのPUSH毎に実行するように設定します。プロジェクトの開始時からコードスタイルが自動的にフィードバックされるような仕組みになっているとけっこう良いと思います。

手順
----

### JSLintの設定を行う

こちらを参考にしました。
http://qiita.com/mima_ita/items/1cc6b2fb938d5a1fc3aa#1-4

ほぼそのままなんですが、下記のようなコードでコードスタイルチェックを実行します。

```js:check.js
var argv = process.argv;
var gjslint = require('closure-linter-wrapper').gjslint;
var flagsArray = [
  '--nostrict',
  '--nojsdoc',
  //'--disable 14'
];

gjslint({
    src: [
      'admin/webroot/js/*.js'
    ],
    flags: flagsArray
    ,reporter: {
      name: 'gjslint_xml',
      dest: process.env.CIRCLE_ARTIFACTS + '/check_gjslint.xml'
    }
  },
  function (err, result) {
  }
);

```

CircleCIではCIRCLE_ARTIFACTSという環境変数があって、ここにファイルを出力すると後から参照しやすくガイドされます。自分の場合は今回は/.circleci/code_inspections/js/というフォルダに上記のコードを保存しました。

### circle.ymlを用意する

```yml:circle.yml
# https://circleci.com/docs/configuration

machine:
  timezone:
    Asia/Tokyo
  php:
    version: 5.5.15

dependencies:
  pre:
    - sudo easy_install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz
    - cd .circleci/code_inspections/js/; npm install;

test:
  override:
    - node .circleci/code_inspections/js/check.js
```

nodeなどのインストールも必要かなと思ってたんですが、どうも最初からインストールされてるようで不要でした。自分の環境の場合は上記で動作しました。

### チェック結果を参照する

下記のArtifactsタブを開くと出力結果を確認できます。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/d9e20f25-f05f-9aea-fe39-8d5f02335e72.png)

本当は内容をメール等で送信できると良さそうですね。
Homebrewのメンテナンス

Homebrewは頻繁に変更されています。

```
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: Your Homebrew is outdated.
You haven't updated for at least 24 hours. This is a long time in brewland!
To update Homebrew, run `brew update`.
$ 
```

すぐこんなワーニングに出会うでしょう。
そんな時は、メッセージにもあるように呪文です。

```
$ brew update
```

今回は、Homebrewが更新され、新規と更新されたFormulaeがリストされました。

```
$ brew update
Updated Homebrew from 9f12f70e to e80e707e.
==> New Formulae
agda		    iojs		libgxps		    pacvim
crystax-ndk	    juman		mdk		    sblim-sfcc
galen		    libforensic1394	openwsman	    wsmancli
==> Updated Formulae
activemq		   git-cola		      openssl
aha			   git-ftp		      orientdb
arangodb		   github-release	      osquery
arping			   google-sparsehash	      osxfuse
ats2-postiats		   groovy		      p7zip
aws-elasticache		   groovysdk		      parallel
aws-elasticbeanstalk	   h2o			      pass
aws-sns-cli		   haproxy		      passenger
bison			   harfbuzz		      pius
boxes			   hh			      poco
bro			   horndis		      points2grid
bvi			   jenkins		      predictionio
byobu			   keybase		      pyenv-virtualenv
camlp4			   ledger		      s3cmd
cgrep			   leiningen		      solid
clib			   lftp			      sqlite
cmake			   libav		      stunnel
commonmark		   libcouchbase		      swig
cookiecutter		   libjson-rpc-cpp	      syncthing
cpanminus		   libressl		      sysdig
csync			   libsoup		      terraform
deis			   llvm			      tinc
dnscrypt-proxy		   mackup		      vala
ec2-ami-tools		   mariadb		      vera++
ec2-api-tools		   mdp			      weechat
elb-tools		   monetdb		      wine
emscripten		   mpich2		      winetricks
erlang			   mysql		      xa
exiftags		   nexus		      xplanetfx
f3			   node			      yaws
fakeroot		   nspr			      youtube-dl
flow			   nsq			      zsh-completions
fsw			   nvm
fzf			   openh264
$
```
Enumeration values 'NSFetchedResultsChangeMove' and 'NSFetchedResultsChangeUpdate' not handled in switch

Enumeration values 'NSFetchedResultsChangeMove' and 'NSFetchedResultsChangeUpdate' not handled in switch

という警告が出た時。

```objc
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

```

上記のメソッドは、InsertとDeleteについては書いてあるのですが、MoveとUpdateについてはなにも書かれていないために警告が出ています。
なので、なんでもいいので追記します。

```objc
case NSFetchedResultsChangeMove:
	NSLog(@"A table item was moved");
	reak;
case NSFetchedResultsChangeUpdate:
	NSLog(@"A table item was updated");
	break;
```

これでOK。


参照元
http://stackoverflow.com/questions/25752758/enumeration-values-nsfetchedresultschangemove-and-nsfetchedresultschangeupdate