OmniAICreator/Qiita-1.07M huggingface dataset:
gitチートシート


自分用メモ

# ローカルブランチを削除する

`my_branch`を削除する場合

```shell-session
git branch -d my_branch
```

## `-d`と`-D`の違い

manを見ると、

```shell-session
$ man git-branch
-d, --delete
           Delete a branch. The branch must be fully merged in its upstream branch, or in
           HEAD if no upstream was set with --track or --set-upstream-to.

-D
           Shortcut for --delete --force.
```

とある。
`-d`の場合はfork元と差分があると削除されないようになってるみたいだ。
なので、`git checkout -b hogehoge`でブランチをつくった直後に名前のつけ間違えに気づいたときなどは、`-d`を使うのがいいようだ。
というか普段は`-d`を使っておくのがよい。

# git diff でファイル名のみ表示する

`--name-only`を使う。

```sh
git diff master --name-only
```

# リモートブランチを指定してpushする

```sh
git push origin ローカルブランチ名:リモートブランチ名
```

# マージを途中であきらめてマージ開始前に戻す

```sh
git reset --hard HEAD
```

http://img.atwikiimg.com/www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/chunked/ch03s09.html


# あるファイルが最後に更新されたコミットがどれか調べる

```sh
git log -1 ファイル
```

例: package.json が最後に更新されたコミットを表示する

```sh
git log -1 package.json
```

あとはこれで

```sh
git diff コミットID^ package.json
```

とかやれば、最後に更新された内容がわかる。


# ひとつのファイルを分割してコミットする

- 変更箇所のまとまりごとにステージに追加するか聞かれるので`y/n`で答えていく
- さらに細かく行ごとに追加するしないを指定したいときは、`e`を押してマニュアル編集モードにはいる

```sh
git add -p ファイル
```


# 特定のファイルのdiffを見る

hoge.jsonのブランチaとブランチbの差分を表示する

```sh
git diff a b -p hoge.json
```

# git mv せずに mv して編集してしまった

`git mv`せずに`mv`して編集してしまったんですどうしよう、と会社の人に相談したら、「元のファイル名にmvしてからgit mvすればよいのでは」と言われた。確かに。


# ローカルブランチ名を変更する

```sh
git branch -m 新しいブランチ名
```


# リモートホストのディレクトリにgit pushする

```shell-session
remote$ mkdir repo
remote$ cd repo
remote$ git init --shared
remote$ git config receive.denyCurrentBranch updateInstead
```

```shell-session
local$ git remote add myserver ssh://debian@ad02-server/home/debian/aeddrone_viewer
local$ git push myserver master
```

参考: https://qiita.com/fukasawah/items/64ccbdab761012aa12a6


# gitkを起動するとmacOSがクラッシュする

- https://stackoverflow.com/questions/39833961/git-gui-command-crashes-on-macos-sierra
- macOSに最初からはいってるtcl/tkはだめなので、brewではいるtcl/tkを使えとのことだった

```shell-session
$ brew install tcl-tk
$ brew link tcl-tk --force
```


# 特定のファイルを除外してgit diff

https://qiita.com/vankobe/items/95389b7b57daa884654b

`--name-only`と`grep -v`と`xargs`を組み合わせる。

## 例: `ui/`ではじまるファイルを除外して、特定のコミットと現在のワーキングツリーの差分を見る

```sh
git diff --name-only <コミットID> | grep -v '^ui\/' | xargs git diff <コミットID> --
```


# タグをブランチにチェックアウトする

```
git checkout -b 作成するブランチ名 refs/tags/チェックアウトしたいタグ
```
Raspberry Piインストール方法

## 概要

* イメージのダウンロード
* SDカードにイメージを書き込み
* 初期設定（有線固定IP設定）

また公式マニュアルは下記URLにある。
https://www.raspberrypi.org/documentation/installation/installing-images/mac.md

## 手順

### イメージのダウンロード

下記URLのRASPBIAN JESSIEをダウンロードする。
ダウンロードが終わったらSHA-1が一致するか、sha1sumコマンドで確認する。

https://www.raspberrypi.org/downloads/raspbian/

ダウンロードが完了したらunzipコマンドで解凍しておく。

### イメージの書き込み

* SDカードのデバイス名を調べる

   ```
   diskutil list
   ```

* アンマウントする

   ```
   diskutil unmountDisk /dev/disk調べたデバイス名の数字
   ```

* イメージを書き込む

    ```
    sudo dd bs=1M if=image.img of=/dev/rdisk調べたデバイス名の数字
    ```

    ※of=の指定が/dev/diskではなく/dev/rdiskであることに注意。

### 初期設定

#### 固定IPの設定

/etc/dhcpcd.confに次の行を追加。

```
static ip_address=固定IP/CIDR
static routers=デフォルトゲートウェイ
static domain_name_servers=DNSサーバ
```

dhcpクライアントを再起動

```
sudo service dhcpcd restart
```

ここまで設定すれば有線LANを使ってSSH接続できる。
ユーザ名はpi、パスワードはraspberry。
【AccessVBA】差分だけINSERTで取り込みたいときのDoCmd.RunSQL


###MicrosoftAccessを使ったVBAコーディング

今回は、データを取り込む際、差分だけ追加して
それ以外のデータはそのままにしたいときのコードサンプルです。

早速見ていきましょう。

```vbnet:AccessVBA
    DoCmd.RunSQL "INSERT INTO X ( a,b ) SELECT Fn,Fn FROM Y " _
     & "WHERE NOT EXISTS ( SELECT Fn FROM X WHERE Fn = 'X.c' )"
```

####説明
テーブルXに存在しないレコードのみを、テーブルYから取得し、テーブルXへINSERTします。

定期的にデータをもってこなければならないけれど、
ユーザーがそのデータを編集するような時に、使うと良いでしょう。
git で複数行のコミットメッセージをコマンドラインから入れる

# -m オプションを二つつける

```shell-session
$ git commit -m "subject" -m "more desciption"
[develop 886be68] subject
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 new_file.txt
$
```

結果

```shell-session
$ git show
commit 886be681f57b1e83f885705cb9acc297e396492a
Author: negito6 <negito6@example.com>
Date:   Thu May 19 21:23:16 2016 +0900

    subject
    
    more desciption

diff --git a/new_file.txt b/new_file.txt
new file mode 100644
index 0000000..e69de29
$
```

hub コマンドではダメだった。

# ヒアドキュメント使う

こちらの記事に書いてありました http://qiita.com/sutonea/items/0eeb4677691fdd8c3555
user_pathはresourcesでルーティングを生成したときに自動で生成されるヘルパーメソッド

user_pathはresourcesでルーティングを生成したときに自動で生成されるヘルパーメソッドです。引数にidを指定すると自動でパスに変換されます。
<%= link_to "マイページ", user_path(current_user) %>

例：
user_path(10) # => 'users/10'に変換される
Rubotyのコードリーディングで学ぶ。その１

Rubyを学び始めてそんなに経っていませんが、Rubotyへの興味とともに[Ruboty のコードリーディングで Ruboty の仕組みを理解すると共に Ruby の設計・実装の定石を学ぶ #ruboty](http://qiita.com/tbpgr/items/5887003cd2e69e9d8867)の記事でRubotyのコードリーディングを始めました。

仕事以外でコードを読むことはあまりしなかったのですが、始めてみるととても勉強になることに気がつきました。
１．自分の知らないRubyの使い方を知れる。
２．プログラムの構造など参考になる。
などが主な点でしょうか。しかし自分だけの独学だと限界があると思いますが、コードリーディングによって幅が広がると思います。

では早速読んでいきましょう。
ちなみにとても遅いペースでいきます。知らないことがたくさんですから！

#[bin/ruboty](https://github.com/r7kamura/ruboty/blob/master/bin/ruboty)

```ruby:./bin/ruboty
#!/usr/bin/env ruby

$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
require "ruboty"

Ruboty::CommandBuilder.new(ARGV).build.call
```

##env
１行目は、**シバン(shebang)**というそうです。cgiでよく見るのですが、#!/usr/bin/perlとか#!/bin/shとか書かれているもので、どのシェルで実行するか指定するものです。
しかし上記のようなパターンは始めてみました。調べてみるとrubyでよくつかわれる形式のようです。
envは環境変数を設定して、プログラムを実行するコマンドのようです。
結局はrubyで実行するよということですが、envを指定することで環境変数が設定されるため、上記のperlやshのようにフルパスを記述する必要がないため使われているようです。cgiでは環境によってシバンが変える必要があることが多々あり、面倒だった記憶がありますが、それを解決した形になります。

##$LOAD_PATH
rubyではlibなどロードするパスが格納されているようです。こういった変数は知らないものはずっと知らないことも多い気がします。

##unshift
これは配列の頭に要素を追加するメソッドです。つまり上記の$LOAD_PATHは、配列ということになります。

##File.expand_path(相対パス,基準のパス)
絶対パスを返すメソッドです。

##\_\_FILE\_\_
実行中のプログラムのファイル名が格納されている変数です。

$LOAD_PATHから\_\_FILE\_\_までの説明を合わせると、その行の命令は、rubyで使うlibのパスにrubotyのディレクトリにあるlibのパスを追加していることになります。モジュールを分割してロードする必要がある時は、よく使いそうです。

もう少し調べてみると、\_\_FILE\_\_はファイル名が格納されているため、今回のような使い方をする場合は必ず../が必要なようです。
ファイル名が/usr/a.rbとして、/usr/libのパスを取得したい場合、実行しているディレクトリの直下にlibがあるからと、File.expand_path("lib","/usr/a.rb")としてしまうと、/usr/a.rb/libが返ってくるようです。
なのでFile.expand_path("../lib","/usr/a.rb")としないと、/usr/libが返ってこないようです。
\_\_FILE\_\_がファイル名ということを忘れずに使わないといけないです。

##require
これはrbファイルをロードする命令です。テストコード書くときは、テスト対象のソースを読み込む必要があるのでよく使います。しかし少し調べてみると、loadという似た命令もあるようです。
違いは、requireは１度読みこんだら次は同じrequireが出てきても読み飛ばすそうですが、loadはその都度読み込むそうです。またrequireはrbファイルなら拡張子を省略できますが、loadは省略できないようです。
ここで先程指定したlibにある、ruboty.rbファイルをロードしていることになります。

##Ruboty::CommandBuilder.new(ARGV).build.call
最後の一行は、Ruboty::はモジュール名の指定、CommandBuilderがクラス、newで初期化処理、ARGVは引数が格納されている変数、buildとcallはメソッドです。
ここは理解しやすいです。
次は、ruboty.rbの中身を見ていくと上記のモジュールやクラスが出てくるのでしょう。

というわけで、初回は数行のプログラムにもかかわらず知らないことがたくさんでした。次回はruboty.rbのソースを読んでいきたいと思います。
Laravel軽量化フレームワークLumenのアプリをDeployerを使ってデプロイ

Laravelの軽量化フレームワークLumenのプロジェクトを作成し、php製デプロイツールDeployerでサーバーにデプロイするまでの流れです。

## Lumenプロジェクト作成
composerを使って、Lumenのプロジェクトを作成します。

```bash
$ composer create-project laravel/lumen --prefer-dist lumen_sample
```

## Deployerをダウンロード
以下からpharファイルをダウンロードして、実行できるように設定。
http://deployer.org/

```
$ mv deployer.phar /usr/local/bin/dep
$ chmod +x /usr/local/bin/dep
```

## アプリをgithubにpush

```bash
$ cd lumen_sample
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/{acount_name}/{repository_name}.git
$ git push -u origin master
```

## デプロイ
Lumenのアプリ構成はLaravelとほぼ変わらないので、**deployerのLaravelレシピ**を使用してLaravel同様にデプロイできます。
deploy.phpを以下のように記述し、アプリのルートディレクトリに設置します。

```php:deploy.php
<?php
// Laravelレシピ読み込み
require 'recipe/laravel.php';

server('env_name', 'example.com', 12345) // 接続サーバー
    ->user('deploy_user')                // 接続ユーザ
    ->identityFile()                     // 認証
    ->env('deploy_path', '/path/to/application');    // デプロイ先のディレクトリ

// githubのリポジトリ設定
set('repository', 'git@github.com:wrbss/lumen_sample.git');
```
※ env_nameは環境名です。depとかstgとか適切に設定してください。
※ 上記の設定では鍵認証を使っているので、デプロイキーまたはsshキーをgithubに設定する必要があります。

その後、アプリのルートディレクトリでコマンド実行

```
$ dep deploy env_name  

✔ Executing task deploy:prepare
✔ Executing task deploy:release
✔ Executing task deploy:update_code
✔ Executing task deploy:vendors
✔ Executing task deploy:shared
✔ Executing task deploy:symlink
✔ Executing task cleanup
➤ Executing task success
Successfully deployed!
✔ Ok

```

## 参考

Lumen公式
https://lumen.laravel.com/

Deployer公式
http://deployer.org/
新機能をつける時はやみくもに実装せず予め道筋を決めておく

新機能をつけるときは、やみくもに実装していくのではなく事前に筋道を立てておくことが大事です。
新たにページを作成するときは次の4ステップが必要となります。

１、ルーティングを設定する
２、コントローラーをつくる
３、ビューをつくる
４、作成したページへのリンクを設定する

この順番に実装していきましょう。
gem'devise'でユーザー機能を実装した時に、初期設定されていないパラメーターの入力を求め保存する方法

1、モデルファイルにattr_accessorを追加する。
class Book
attr_accessor :group_key
end

2、カラムを追加する

3、applicationコントローラーにconfigure_permitted_parametersを記述
  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    # sign_inのときに、group_keyも許可する
    devise_parameter_sanitizer.for(:sign_in) << :group_key
    # sign_upのときに、group_keyも許可する
    devise_parameter_sanitizer.for(:sign_up) << :group_key
    #account_updateのときに、group_keyも許可する
    devise_parameter_sanitizer.for(:account_update) << :group_key
  end
COBOL脳を解説する（１）


1.はじめに
    　COBOLは現在も尚、企業システムにおいて重要な役割を果たしています。COBOLで書かれたシステムをJavaで書きなおすことを目的としたプロジェクトも一定数存在します。よって、COBOLエンジニアでなくとも、この言語について多少の理解を持っておくのは有益と考えます。
    　この記事では、COBOLエンジニアの思考プロセスを解説することにより、モダンなプログラミング言語のエンジニアがこの言語を理解する助けになることを目的としています。今回は、COBOLの代表的な処理パターンである、順次アクセスファイルの読み書きを解説したいと思います。

2.COBOLエンジニアの頭の中
　COBOLエンジニアが何らかの処理を設計したりコーディングしたりする時の頭の中をシミュレーションしてみます。例えば、次のようなデータがあったとします（便宜上CSV形式で表現しています）。このデータのすべてのレコードのすべての値を10倍するという処理を考えてみます。
    
10,100,1000,10000
20,200,1000,20000
30,300,3000,30000
40,400,40000,40000
50,500,50000,50000
    
　　モダンなプログラミング言語のエンジニアであれば、このデータを見た時、頭の中で瞬時に配列に格納するでしょう。
例えば、((10,100,1000,10000),(20,200,1000,20000),(30,300,3000,30000),(40,400,40000,40000),(50,500,50000,50000))
というような形で認識していると思います。この配列のすべての要素を10倍するというような処理が求められた時は、配列をハンドリングするための関数を作成して、そこにこの配列をそのまま代入するようなプログラムを想起するのではないでしょうか。一方、COBOLエンジニアの場合は、頭の中でまず、次の形でこのデータを認識します。数値なので各カラムはゼロ埋めされています。一度に認識するのは１レコードだけです。
        000010000100001000010000
  　次に、これをカラムに分解します。各カラムが何桁目で区切られているかは、プログラム中の最初の方で定義されていて、このエンジニアはそれを頭に入れつつ次のように分解し、１つ１つのカラム値に10を掛けます。
    　10 * 10 = 100
     100 * 10 = 1000
    1000 * 10 = 10000
   10000 * 10 = 100000
 そしてこれを次のようなレコードにまとめた上で、アウトプットの順次アクセスファイルに１レコード書き込みます。
      000100001000010000100000
そして、次のレコードを、１行読み、
      000020000200002000020000
 このように認識して、以下最後のレコードまで同様に処理していきます。
  　上記の処理のように、ある断面を取ると、エンジニアの頭の中では１レコードしか存在していません。これは、コンピューターのメモリの中でも同じで、メモリの消費量が非常に少ない。COBOL当時のハードウエアの価格や技術水準を考えると非常に合理的な設計になっています。今後説明する予定のコントロール・ブレイクという処理でも、一度にメモリ上に存在するのは多くとも数レコードです。

3.最後に
　元々COBOLエンジニアの私が、Pythonを勉強した時のことです。そこそこ大きなテキストファイルを処理するプログラムを書いていました。最初はfor文を使って、１レコードずつ処理していました。ある時、テキストファイルの中身が配列に見えるようになったのです。私がモダンなプログラミング言語を理解し始めたのはその時だと思います。
  COBOLエンジニアがモダンな言語を習得するためには配列の概念を理解しなければなりません。尚、COBOLにも仕様として配列という型はありますが、それはレコード内で繰り返しの処理を楽にプログラミングしたい時に使うのであって、モダンな言語の配列とは違うように思います。
  一方、モダンな言語のエンジニアが何らかの理由でCOBOLやRPG、PL/1といったクラッシックな言語の理解が必要な局面もあるかもしれません。その場合には、「一度に一行」という原則を理解してください。そして、COBOLにおける配列の考え方は、あなたのそれとは違っていることを念頭においてください。

続編を書きました。
[COBOL脳を解説する(2)](http://qiita.com/nnnmanatsuxu/items/99114f0400b2d79ecc4f)
機械学習ライブラリSharkをCentOS6.6に導入

# 概要

C++の機械学習ライブラリである[Shark](http://image.diku.dk/shark/index.html)を導入．
以下ではすべて`sudo`での操作を想定しています．

# 開発環境

- CentOS 6.6

# 準備（すでにインストール済みの方は飛ばしてください）

## CMakeのインストール

以下のサイトが詳しいです．
[[Linux][CentOS6.7]CMake2.8.12をインストール／アンインストールする(source版)](http://www.infology.jp/noknowit/view/platform/2015/09/linux_centos6_7_install_and_uninstall_cmake2.8.12_from_sourcecode.xhtml)

## Boostをインストール

以下のサイトを参考にさせていただきました．
[CentOS 6.0 gcc 4.7.2にBoost 1.5.0をインストール](http://qiita.com/sincrinc/items/bcde85868bb03717cabd)

自分でビルドして最新版をインストールしたかったのですが，ビルドエラー連発...
おまけに`gcc`まで入れ直すことまでしたのですがエラーは解消せず．
そのため`yum`でインストールしてしまいました．

```bash
# レポジトリからBoostをインストール
yum install boost148*
```

# Sharkをインストール

基本的には[公式サイト](http://image.diku.dk/shark/sphinx_pages/build/html/rest_sources/getting_started/installation.html)に従っています．

```bash
# ダウンロードしたいフォルダに移動して
# 現時点での最新バージョン（v3.1.0）をダウンロード
$ wget https://github.com/Shark-ML/Shark/archive/v3.1.0.tar.gz
$ tar xfvz ./v3.1.0.tar.gz

# ビルド先のフォルダを作成
$ mkdir Shark-3.1.0/build
$ cd Shark-3.1.0/build
$ cmake "-DBOOST_INCLUDEDIR=/usr/include/boost148" "-DBOOST_LIBRARYDIR=/usr/lib64/boost148" ../
$ make
$ make install DESTDIR=(インストールしたいフォルダへのパス)
```
フォームにカラムとしては存在しないプロパティを追加する為にattr_accessorを使用する。

ActiveRecordを継承したクラスの場合自動でテーブルのカラム名がプロパティとして定義されます。今回のようにフォームへ新たに、カラムとしては存在しないプロパティを追加するためにはattr_accessorをUserモデルに追加する必要があります。

#attr_accessorを定義しない場合
class Book
end

book = Book.new
book.title = "Programming Ruby" #この場合はエラーが出力される
#=> test.rb:6:in `<main>': undefined method `title=' for #<Book:0x007fbb7c0e7d80> (NoMethodError)

#attr_accessorを定義した場合
class Book
  attr_accessor :title
end

book = Book.new
book.title = "Programming Ruby" #titleプロパティを定義したのでエラーが発生しない
puts book.title
#=> "Programming Ruby"

※attr_accessorの詳しい説明は
http://ref.xaio.jp/ruby/classes/module/attr_accessorを参照
letsencryptをUbuntu16.04 + Nginxで使ってみた

# 概要

`letsencrypt`を使えば、無料でSSLの証明書を取得することができます。
本文では、Ubuntu16.04 + Nginxでの`letsencrypt`の使い方と、nginxの設定例をまとめました。

# 環境

- Ubuntu16.04
- Nginx

# letsencryptをインストール

~~~
$ sudo apt-get install letsencrypt
~~~

# SSL/TLS サーバ証明書の取得

~~~
# letsencryptがport80を使用するので、一旦nginxを停止する
$ sudo systemctl stop nginx

# 証明書を取得(-dオプションにはあなたのドメイン名を指定してください)
$ sudo letsencrypt certonly --standalone -d hoge.example.com
...
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/hoge.example.com/fullchain.pem. Your
   cert will expire on 2016-08-24. To obtain a new version of the
   certificate in the future, simply run Certbot again.
...
~~~

# nginxの設定例

```/etc/nginx/conf.d/hoge.conf

server {
  listen 80;
  server_name hoge.example.com;
  return 301 https://$host$request_uri;
}

server {
  listen 443;
  server_name hoge.example.com;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/hoge.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/hoge.example.com/privkey.pem;
  ...省略...
}
```

# 自動的に証明書を更新する

**2018/6/8 追記**: 一般的には`certbot-auto`で自動更新させるようです。
参考: [Let's encrypt運用のベストプラクティス](https://qiita.com/tkykmw/items/9b6ba55bb2a6a5d90963#%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E6%9B%B4%E6%96%B0)

----

90日で証明書の期限が切れるので、定期的に更新をする必要があります。
証明書を更新するには、以下のコマンドを実行します。

```
$ sudo service nginx stop
$ sudo letsencrypt renew
$ sudo service nginx start
```

これをcronで自動化する場合は、crontabに以下の設定を追加します(`sudo`コマンドを実行する必要があるので、スーパーユーザのcronに設定する)

```
$ sudo crontab -e
```

```
# 毎月1日の朝5時にSSL証明書を自動更新する(nginxが停止/起動されるので注意)
00 05 01 * * sudo systemctl stop nginx; sudo letsencrypt renew; sudo systemctl start nginx
```



# 参考

- https://certbot.eff.org/#ubuntuxenial-nginx - 本家
- [How To Secure Nginx with Let's Encrypt on Ubuntu 14.04](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14-04) - nginxの設定ファイル例あり
- https://blog.apar.jp/linux/3619/
pip 7.1 で追加された constraints file の使いドコロ

# はじめに

Python のライブラリをインストールするときに使用する pip に、バージョン 7.1 からある機能が追加されました。

Constraints File と呼ばれるその機能は、あまり有名ではありませんが、使い方によっては非常に便利な機能です。

# Constraints File の機能

Constraints File と Requirements File の機能は非常によく似ており、そのフォーマットはまったく同一です。

違いはただ一点、Constraints File はバージョンを制御するだけで、記述したライブラリがインストールされることはありません。

例えば、次のようなファイルがあったとき

```werkzeug.txt
werkzeug=== 0.11.1
```

次のように Requirements File として使用すると、werkzeug 0.11.1 がインストールされます。

```sh
pip install -r werkzeug.txt  # 0.11.1 がインストールされる
```

対して、Constraints File としてしていしても、werkzeug がインストールされることはありません。

```sh
pip install -c werkzeug.txt # なにもインストールされない
```

ですが、次のように引数と併用することで、インストールするバージョンを制御することが出来ます。

```sh
pip install werkzeug -c werkzeug # 0.11.1 がインストールされる
```

また、Requirements File と Constraints File を併用することも出来ます。

まとめると、以下のようになります。

```sh
$ pip install -r werkzeug.txt # 指定したバージョンがインストールされる
$ pip install -c werkzeug.txt # なにもインストールされない
$ pip install -r werkzeug.txt -c werkzeug.txt # 指定したバージョンがインストールされる
$ pip install werkzeug -c werkzeug.txt # 指定したバージョンがインストールされる
```

# Constraints File の便利な使い方

Constraints File は、Requirements File と組み合わせることで真価を発揮します。

よくある Requirements File の使い方は、`pip freeze` の出力をそのまま書き込む、というものでした。しかし、この方法では、インストールしたライブラリと、そのライブラリの依存ライブラリを区別することが出来ません。

たとえば、A というライブラリが、B 及び C というライブラリに依存していたとします。そのとき、A をインストールした後に pip freeze すると、B 及び C まで出力され、それらを区別する方法はありません。

```sh
$ pip install A
$ pip freeze
A==1.0.0
B==1.0.0
C==1.0.0
```

ここで、直接依存するライブラリのみを Requirements File に記述し、`pip freeze` の結果を Constraints File に記述することで、直接依存しているライブラリと、間接的に依存しているライブラリを区別することが出来ます。

```sh
$ cat requirements.txt
A
$ cat constraints.txt
A==1.0.0
B==1.0.0
C==1.0.0
$ pip install -r requirements.txt -c constraints.txt
```

# まとめ

本記事では、Constraints File について紹介しました。

まだまだ新しい機能ですので、ここで紹介した使い方以外にも、もっと便利な使い方ができるかもしれません。もしそんな便利な使い方を発見したら、是非教えていただけるとうれしいです。

# 参考

- https://pip.pypa.io/en/stable/user_guide/#constraints-files
CentOS/RHELとペネトレテスト

昨今は、脆弱性対策とかでペネトレーションテストを掛けられる事がよくある。
何を隠そう、かつての私は掛ける側でした。すみません…

結果をそこそこのレベルのエンジニアさんがきちっと分析して渡してくれるならいいのだけども、

…どう見ても素人レベルの方が、どや顔で生データを提示して対応しろ、ごるぁ、な事が、さらに昨今そこここで悲劇(端から見れば喜劇)として展開される。

その中の一つに、CentOS/RHELのバージョン問題がある。

もう先に書いちゃいましょう。
もし、パッケージのバージョンが古いとか言われたら、対応したいCVEの番号を聞き出してください。
そして、おもむろに、下記のコマンドを打ちましょう。
rpm -q --changelog パッケージ名 | grep -i cve
そうすると、インストール済みのパッケージさんが、今までに対応して貰ったCVEがずらずら～と出てくるのです。

これで、バージョンが古いから対応しろ、もしくは問題が無い事を証明しろ、
のご無体に、結構な割合で対応できます。

なお、上記を行うなら、なる早で行わないと、テストした側のメンツが潰れてしまうので、注意。
ホストOSでのVPN接続時に割り当てられたDNSを，NAT接続されたVirtualBox上のゲストOSから使用する方法

# 結論

    # natdnsproxy1は各自の環境に合わせて番号を変えること
    $ VBoxManager modifyvm $vm_name --natdnsproxy1 on

以下の設定だと，`docker run`のたびにネットワークの接続が切れる場合があるようなので使わないこと（原因不明）．

    # natdnshostresolver1は各自の環境に合わせて番号を変えること
    $ VBoxManager modifyvm $vm_name --natdnshostresolver1 on

単にこうやったらうまくいったというだけの話で，問題の原因も不明だし，発生した現象を詳細に解析したわけでもないので，本当に正しい方法なのかは不明．．

# 事の発端

ゲストOS上でVPN接続先ネットワーク内のサーバー名を`nslookup`したところ，ゲストOS起動直後としばらく経過した後で返ってくるIPアドレスが異なるという現象に遭遇した．

原因は分からないが，何らかの理由でDNSの検索順が変わってしまう，もしくはDNSサーバーの設定が変わってしまうのだろうと推測．そこで，ホストOS（Windows 10）でも`nslookup`を実行してみた．結果，返ってくるIPアドレスは変化しないことがわかった．

どうやらゲストOSからの名前解決のみおかしくなっているようなので，ホストOSのリゾルバーを使用するようにしてみた．

    $ VBoxManager modifyvm $vm_name --natdnshostresolver1 on

これでホストOSと同じ名前解決手順になるはず．

しばらく使っていると，Googleスプレッドシートが編集できなくなった．どうやら接続が切れているようだ．しばらく待つと回復する．

現象を調べてみたことろ，どうやら`docker run`（正確には`docker-compose run --rm`だが，同じことが起こるだろう）が終了したときに接続が切れることがあるように見える（docker engineは同じゲストOS上で動かしている）．ちゃんと調べればわかるのだろうが，コンテナとの通信のためにdocker engineはネットワークをいじっているようだ．それが影響しているのかもしれない．

そこでホストOSのリゾルバー使用を無効にし，

    $ VBoxManager modifyvm $vm_name --natdnsproxy1 on

としてみたところ，接続が切れなくなった．
Thunderbirdアドオン開発でabout:configの値を取得する

Addon開発でユーザ設定値が欲しくなったとき、↓のようにして値を取得できるようです。

```js
var prefValue = '';
try {
  // getCharPref() で文字列として取得
  // 例えばメールのカスタムヘッダの場合
  var str = Components.classes["@mozilla.org/preferences-service;1"]
    .getService(Components.interfaces.nsIPrefBranch).getCharPref("mail.compose.other.header");

  // UTF-8に変換
  var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
    .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  prefValue = converter.ConvertToUnicode(str);
catch(e){
  console.log(e);
}
```
書き込むときは `setCharPref("mail.compose.other.header", "X-Custom")`です。

Firefoxも同様だと思われます。

### 参考
https://developer.mozilla.org/ja/docs/Code_snippets/Preferences
http://so-zou.jp/add-on/tech/firefox/persistence/preferences/
http://d.hatena.ne.jp/vividcode/20100331/1270041237
PHPで配列の未定義インデックスにチェック無しで複合代入する方法

タイトル長いっすね。メソッドの命名が苦手なことが丸出しです。

さて、とある配列のとあるインデックスにデータを複合代入で格納したくても、そのインデックスが初期化されていないと、

```
Notice: Undefined variable: data_array
```

のように `Notice` がでてしまって嫌な感じですね。

かといって、いちいちチェックすると、

```php
if (isset($array['one']['two']['three'])) {
	$array['one']['two']['three'] += 100
} else {
	$array['one']['two']['three'] = 0;
}
```

このように `$array['one']['two']['three']` が3回も登場してなんとかしてまとめたくなってしまいます。精神衛生上よくない。
そこで、**即時関数の引数を参照代入で定義し、自動でNULL初期化するようにする** ことで、この問題を解決してみます。

### PHPの参照渡し

> [PHPでの参照渡し - Qiita](http://qiita.com/akisssa/items/342d742c6ce9cd30b050#2-2)

上記URLの記事で、

> PHPでは原則的に未定義の変数の値を取得しようとしたときに Notice が発生して NULL 扱いになるが、参照渡しのデフォルト値の場合だけ例外的にNoticeを発生せずにNULLとして初期化される。この場合、関数側でデフォルト値に何を指定してもNULLと見なされることに注意する必要がある。

とある。これを利用すれば、

```php
$addnum = 4;

(function(&$ref_array) use ($addnum) {
    $ref_array += $addnum;
})($arr['one']['two']['three']);

var_dump($arr);
// array(1) {
//   'one' => array(1) {
//     'two' => array(1) {
//       'three' => int(4)
//     }
//   }
// }
```

このように、即時関数を使ってすっきり書ける。参照先のインデックスが未定義であればNULLで初期化されるというのは安心。

### エラー制御演算子（`@`）でよくね？

まあ、そうなりますよね。
今回の例で言うと、エラー制御演算子で十分事足りるかと思います。

```php
@$arr['one']['two']['three'] += 4;
```

で同様の結果が得られますからね。

色々処理を模索してる時にたまたまこの特性を発見したのでテンション上がって投稿してみました。
例が悪かったとおもうのですが、なにか複雑な処理での中で配列を扱う際簡単に書くことが出来る場面もあるかもしれないので、覚えておこうと思います。
railsでただgroup by したいだけなのに。ふくざつ。

```
Model.group(:col_name)
```

これをしたいだけなのに、エラーになる。

```
ERROR:  column "Model.id" must appear in the GROUP BY clause or be used in an aggregate function
```

そんなときは、以下でやるとできる。

```
Model.select("DISTINCT ON (col_name) *")
```

また、カラム全部じゃなくて、特定カラムのユニークだけなら、`Model.select(:col_name).uniq`とかでよいとおもいますが。全カラム取得したいときあります。
Googleフォームで家計簿をつける


家計簿アプリはいっぱいあるけれども、
どこのコンビニによく行っているとか、
ウーロン茶を１ヶ月でどのくらい買っているとか
後で細かく集計しようと考えたりすると、
場所とか、品目とか細かくつける必要が出てくるので、
GoogleスプレッドシートやExcelで自前でつけようと思った。

Googleスプレッドシートだと、スマホで記入するのが面倒なので、
無料でアンケートを作ることができる[Googleフォーム](https://www.google.com/intl/ja_jp/forms/about/)を使って、
Googleスプレッドシートと連携すれば、スマホで記入するのも簡単というわけで作ってみた。

Googleドライブを開いて、新規ボタンを押して、Googleフォームを作成

![GoogleFormCreate.png](https://qiita-image-store.s3.amazonaws.com/0/34699/ee06f573-0e8d-88d0-23d2-20848d13d5f7.png)

下記のように、フォームを作った。
![GoogleFormEdit.png](https://qiita-image-store.s3.amazonaws.com/0/34699/673ba0fc-bee7-ec78-8040-0bd01e005179.png)


日付の項目は設定しなくてもタイムスタンプが回答から得られるが、とりあえず設定。
費目(食費、交通費等々）はラジオボタンで設置。
品名は記述式で設置。
金額は記述式で設置。数値のみや、正規表現で入力制限もかけられるので、数値のみに制限。
その他、場所等々追加で入れたい項目を設置。

フォームの作成が完了したら、右上の「送信」ボタンを押すと、アンケートフォームのURLが生成されるので、
そのURLをブックマークやホーム画面に設定すると。

これを使って、アンケート（家計簿）を入力する。
![GoogleFormInQ.png](https://qiita-image-store.s3.amazonaws.com/0/34699/c00564aa-ca92-57c7-b918-c23d193f1c0a.png)

回答を見ると回答をスプレッドに表示のアイコンが出るので、そこを押すと、

![GoogleFormAnswer.png](https://qiita-image-store.s3.amazonaws.com/0/34699/d36976db-d188-90ed-8707-406f0a03f398.png)

Googleスプレッドシートに記入されている。
![スクリーンショット 2016-05-19 19.09.38.png](https://qiita-image-store.s3.amazonaws.com/0/34699/de0c8974-9204-74fc-621b-3c2d8dea63bc.png)


これをパソコンで修正するなり、Google App Scriptで修正するなりということでいけるんではなかろうか。
Watson IoT Platform - 他のBluemixサービスを使えるようにする

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
Bluemixにはさまざまなサービスが提供されているので、これらをNode-REDから使えるようにします。

#Bluemix上のサービスの接続
Bluemixで提供されているサービスをインスタンス化して、Node-REDを稼働させているIoTアプリへ接続します。
1. Bluemixへログインした画面から、画面右上の「＋」をクリックしてサービス一覧のカタログを表示します。
2. この中から使いたいサービスのカテゴリーを選択します。ここではWatsonの「Text to Speech」サービスを使おうと思います。画面右側の「Watson」を選び、「Text to Speech」を選択します。
![スクリーンショット 2016-05-19 18.56.45.png](https://qiita-image-store.s3.amazonaws.com/0/125842/acf449e0-e76a-e2d7-5c8b-ba074d80505d.png)
3. 表示されたサービスの説明画面をスクロールダウンし、「作成」ボタンを押します。
![スクリーンショット 2016-05-19 18.59.27.png](https://qiita-image-store.s3.amazonaws.com/0/125842/80da2194-2c6f-4793-3a2a-9d5ec14fb3bc.png)
4. サービスインスタンスが作成されたら、その名前を控えておきます（例：「Text to Speech-xx」）
5. 使用しているIoTアプリを開きます。画面を閉じてしまった場合には、画面右上の「IBM Bluemix」メニューをクリックし、「すべてのカテゴリー」から対象のIoTアプリを選択します。
![スクリーンショット 2016-05-19 19.04.35.png](https://qiita-image-store.s3.amazonaws.com/0/125842/8537bd41-0b13-eb49-508c-9d39623af8e8.png)
6. IoTアプリの画面を開いたら、「接続」メニューを選択します。
![スクリーンショット 2016-05-19 19.06.36.png](https://qiita-image-store.s3.amazonaws.com/0/125842/ec2d2ec7-fdc9-c45a-a419-8d9b9d06ec20.png)
7. 画面右上の「既存に接続」を選択し、前項で作成した新しいサービス（例：Watson Text to Speech）を選択し、画面下部の「接続」ボタンを押して接続します。
![スクリーンショット 2016-05-19 19.08.33.png](https://qiita-image-store.s3.amazonaws.com/0/125842/33735c99-c8d3-f6ee-0a59-9fe2a33ae5dc.png)
8. 「アプリケーションの再ステージ」のメッセージが表示されるので再ステージします。
![スクリーンショット 2016-05-19 19.25.51.png](https://qiita-image-store.s3.amazonaws.com/0/125842/12ae66af-87c3-aae0-7d20-430262da6ddf.png)

9. これでNode-REDからこのサービスを使用する準備が整いました。
MySQLでのトランザクション処理をGolang+dbrで実現してゆく話


#環境

Go :go version go1.6.2 darwin/amd64
IDE :VSCode1.1.0
echo:Echo v2.(beta) 
MySQL: Ver 14.14 Distrib 5.7.12, for osx10.11 (x86_64)
OS:Max OSX El Capitan
俺 :Go初めて3日目
MySQLはHomebrewで入れました。

#トランザクションとは
トランザクションとは、**連続する複数のデータ操作のまとまりのこと**

特徴として：
 - ユーザはトランザクション単位(複数のデータ操作)での取り消しと確定ができます(トランザクション処理)
 - 複数のデータ操作が連なっている時、「複数の更新処理を連続して行う際に、すべての処理が成功したときにのみデータベースへの変更を有効としなければならないデータ操作」では、このトランザクション処理は必須です。
 - ただのロックとは違います。

例としては
①銀行口座に1000円を振り込む(=財布の中身から1000円減る)
②口座の預金が1000円増える
というのがあり、SQL的にかけば

``` 
①Update 財布 SET 中身 - 1000 where 持ち主=自分
②Update 口座 SET 預金 + 1000 where 持ち主=自分
```
となるわけですが、この場合①②がセットでトランザクションです。

そして例えばトランザクション処理が無かった場合：
①が成功したのに、②が失敗したとしましょう。すると自分の財布から1000円消えただけになってしまいます。

こういったことを防いで、**①と②がどちらも成功したらよしとする。途中でエラーが出て完遂できなかったらこれら一連の処理を無かったことにする**。
これがトランザクション処理です。

#トランザクション処理
**複数のデータ操作処理を連続して行う際に、すべての処理が成功したときにのみデータベースへの変更を有効とする、複数のデータ操作のセット**

トランザクション処理の開始はデータベースが自動的に解釈することはないため自分で開始の宣言をする必要がありますね。

決めること：
・どこからがトランザクション処理かを宣言する(Begin)
・ここまで成功したら良しとして処理する宣言をする(Commit)
・何か間違い(エラー)が発生したらBegin以前まで戻す(Rollback)


先ほどの例でトランザクション処理を行うなら：

```
トランザクション処理を開始するBegin()
①Update 財布 SET 中身 - 1000 where 持ち主=自分
　　if (①でエラー){Rollback()}

②Update 口座 SET 預金 + 1000 where 持ち主=自分
　　if (②でエラー){Rollback()}

③①と②が正しく処理できたのでよしとするCommit()
```
②が失敗した時点で①を行う前の状態に戻ります。


つまり、①が成功したのに、②が失敗したとしてもRollbackが行われます。
それによって①を行う前、つまり”財布から1000円を取り出していない状態”に戻ります。
トランザクションさまさまですね。

#Golang+dbrでそれを実現する
##前提
dbrとMySQLのCRUDについては前回の僕の記事を見てください。
http://qiita.com/CST_negi/items/5e276ddc0412cefef7e3


##コード
```server.go
func transactionTest(c echo.Context) error {
	//トランザクション開始
	tx,_ := sess.Begin()

	//①財布から1000円取り出して振り込む。
	balance_at_wallet -= 1000 //DBから残高を取得する処理は省略(本来はSELECT FOR UPDATEでとってくるべきもの) 
	attrsMap := map[string]interface{}{"balance": balance_at_wallet}
	_,err:=sess.Update("wallet").SetMap(attrsMap).Where("user = ?", 'me').Exec()	

		if err != nil {
			//エラーが発生したのでこれは失敗
			println("エラー：財布から1000円を振り込むのに失敗しました")
			//ロールバックして開始前に戻る
			tx.Rollback()	
			//ロールバックが完了したので、エラー終了する。
			return c.NoContent(http.StatusInternalServerError)
		} else {
			//エラーがなかったので①の処理は成功
			println("正常：財布から1000円を振り込みました。")

		}
		
	//②口座の預金を1000円増やす
	balance_at_bank += 1000 //DBから残高を取得する処理は省略(本来はSELECT FOR UPDATEでとってくるべきもの) 
	attrsMap := map[string]interface{}{"balance": balance_at_bank}
	_,err:=sess.Update("bank").SetMap(attrsMap).Where("user = ?", 'me').Exec()	

		if err != nil {
			//エラーが発生したのでこれは失敗
			println("エラー：口座の預金残高を増やすのに失敗しました。")
			//ロールバックして開始前に戻る
			tx.Rollback()	
			//ロールバックが完了したので、エラー終了する。
			return c.NoContent(http.StatusInternalServerError)
		} else {
			//エラーがなかったので②の処理は成功
			println("正常：口座の預金が1000円増えました。")
		}
			

	}
	//①、②ともに正常に進んだのでトランザクション処理を確定して、両方の処理を有効にする。
	tx.Commit()
	//正常終了する
	return c.NoContent(http.StatusOK)
}
```
こんな感じでしょうか。
仮に①の処理が成功したとして、②が失敗したとしてもログやDBの状況を確認すると①の処理が行われる以前に戻っていることがわかると思います。

トランザクション処理はDB操作においてほぼ必須となる処理になるので抑えておきたいものです。
・これはセットでやらないとおかしくなるなという処理をまとめる
・Begin - DB操作 if(error){Rollback} - Commitというコードを書く。
というだけなので、処理のまとまりさえ理解していればコードを書く方は大丈夫だと思います。

以上です。
GAE DataStoreのレコード数をカウントする


## 経緯
datastoreからexporterでRDBにデータ移行。
その際にdatastoreの該当のkindから移行先のDBのテーブルに同じレコード数が移行できているか確認したい。

## 問題
GAE datastoreを参照するdatastoreViewではselect count(*) ...が出来ない

## 対応方法
datastoreViewで表示されるデータをスクレイピングしてカウント

## 面倒だったこと
* 現状のdatastoreViewはデータを非同期で読み込んでいるのでスクレイピングが困難
* 古いdatastoreViewでパラーメータにlimitとoffsetを渡しながらページ遷移してカウントしていった。  
しかもlimitは200が上限...

#### 旧datastoreView
https://appengine.google.com/datastore/explorer?app_id=アプリケーションID名&namespace=NameSpace名&kind=kind名

## スクレイピングのサンプル

googleのログインはEメール入力してから遷移してパスワード入力の２段階になる。
Mechanizeで対応するにもちょっと面倒

```sample.rb
  agent = Mechanize.new
  # ログインしていない時に旧DataStoreのURLにアクセスしてリダイレクトされた先にURL
  agent.get 'https://accounts.google.com/ServiceLogin?service=ah&passive=true&continue=XXXXXXXXXXX'

  form = agent.page.forms.find {|f| f.form_node['id'] == "gaia_loginform"}

  form.field_with(:id => "Email").value = 'googleのアカウント'

  form.click_button
  form = agent.page.forms.find {|f| f.form_node['id'] == "gaia_loginform"}

  form.field_with(:name => "Passwd").value = 'googleのパスワード'

  form.click_button

  limit_count   = 200
  offset_count  = 0

  begin
    # 取得したいDataStoreのkindやnamespaceを指定したURL
    page = agent.get("https://appengine.google.com/datastore/explorer?＜ほげほげ＞+where+type+%3D+%2710%27&limit=#{limit_count}&offset=#{offset_count}").content.toutf8
    doc = Nokogiri::HTML.parse(page)
    result = doc.xpath("//table/tbody/tr").count
    offset_count += limit_count
    puts "result:#{result}"
  end while result == limit_count

  amount = limit_count * (page_count - 1) + result
  puts "amount:#{amount}
end
```
Google Appe Engine でndb.taskletを使う



Interactive Consoleに貼り付ければそのまま動く。
この場合は、時間のかかるdo_someを並列に動かしているので、直列に実行した時よりも処理時間が短くなる。

```
from time import sleep
from google.appengine.ext import ndb


@ndb.tasklet
def do_some(time):
  yield ndb.sleep(time)
  raise ndb.Return(time)

@ndb.tasklet
def foo():
  a, b = yield (do_some(3), do_some(3))
  raise ndb.Return(a + b)

def main():
  f = foo()
  x = f.get_result()
  print x

main() #Execution time is 3 not 6
```
メール送信用サーバー（SMTPサーバー）の設定

railsアプリケーション自体にメールを送る機能はありません。railsアプリケーションからメールを送るためにはSMTPサーバーを設定する必要があります。
config/environments/development.rbに設定を追記してください。変更するのはご自身のアドレスとパスワードだけで構いません。

  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :enable_starttls_auto => true,
    :address => "smtp.gmail.com",
    :port => 587,
    :domain => 'smtp.gmail.com',
    :user_name => "●●●●●@gmail.com", #ご自身のgmailアドレス
    :password => "●●●●●●●●", #ご自身のgmailアドレスのパスワード
    :authentication => 'login',
  }


※メールの仕組みを理解するのに良いページ
http://itpro.nikkeibp.co.jp/article/COLUMN/20071108/286748/?rt=nocnt
サインイン画面からSkype名を削除するには

Skypeを閉じて、Skypeが実行されていないことを確認します。
「スタート」（Start）をクリックし、「run」と入力してEnterキーを押します。（Windows XPの場合：「スタート」（Start）から「ファイル名を指定して実行」（Run...）をクリックします。
「%appdata%\Skype」と入力して「OK」をクリックします。
自分のSkype名の付いたフォルダを削除します。
自分のSkype名の付いたフォルダが見つからない場合は、CTRL + Hを押して隠しフォルダを表示します。

Skypeを再起動すると、Skype名は表示されなくなります。
【Android】他アプリで音楽が再生されているか知りたい　自アプリからプレイヤーを操作したい

　多くのゲームアプリの場合、BGMやSE、ボイスが鳴るように作られている

そこで、もし自アプリ起動前にミュージックプレイヤーアプリなどで音楽を聴いていた場合にはプレイヤーの再生を止めたかったり、自アプリのBGMを止めたいといったことがある

それを実現するためには、別アプリで音楽が再生されているか知る必要があるので、そのやり方メモ

## 1. 他アプリで音楽が再生中かのチェック方法
　`AudioManager`を利用することで再生中かのチェックができる
ただし、外部アプリでの再生のみをチェックできるわけではなく、チェックする前に自アプリで音楽を再生していた場合もチェックに引っかかるので注意

#### Java
```java
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (audioManager.isMusicActive()) {
    // 再生中!!
}
```

#### Kotlin
```kotlin
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
if (audioManager.isMusicActive) {
    // 再生中!!
}
```

## 2. 自アプリからプレイヤーを操作したい
　もしAndroid標準のミュージックプレイヤーで再生されていれば、自アプリからプレイヤーの操作（再生、停止、次へ、前へ）ができる
#### Java
```java
Intent intent = new Intent("com.android.music.musicservicecommand");
// play: 再生, pause: 停止, next: 次へ, preview: 前へ
intent.putExtra("command", "pause");
context.sendBroadcast(intent);
```

#### Kotlin
```kotlin
val intent = Intent("com.android.music.musicservicecommand")
// play: 再生, pause: 停止, next: 次へ, preview: 前へ
intent.putExtra("command", "pause")
context.sendBroadcast(intent)
```
[C#]try-catch-finally句でreturn文を使ったときの挙動


個人メモです。

JavaについてはQiitaでも同様の話は投稿されてるみたいですが
C#では(自分で調べたところ)、Qiitaにないようでしたので投稿。

# 結論

Javaと同様、finally句があると、try句もしくはcatch句にreturn文を入れても
finally句を処理した後にreturn処理が行われます。

# 参考

[try-catch-finally句内のreturnについて - Qiita](http://qiita.com/tyutyu08/items/7e9e112e69b37f72353c)
[c# - Will code in a Finally statement fire if I return a value in a Try block? - Stack Overflow](http://stackoverflow.com/questions/345091/will-code-in-a-finally-statement-fire-if-i-return-a-value-in-a-try-block)
[c# - What really happens in a try { return x; } finally { x = null; } statement? - Stack Overflow](http://stackoverflow.com/questions/421797/what-really-happens-in-a-try-return-x-finally-x-null-statement)
[Android]ProgressBarの色をコードから変更する


```kotlin
progressBar.indeterminateDrawable.setColorFilter(0xFF378CF9.toInt(), android.graphics.PorterDuff.Mode.SRC_IN)
```

ColorFilterで色とモードを指定できます。

モード解説はこれがいい
https://tech.recruit-mp.co.jp/mobile/remember_canvas2/

今回は下のプログレスの形にカラーフィルタをクリップしたいのでSRC_INです。
自分用のJava備忘録

# Javaについての備忘録
## Javaのバージョン確認
```
sinaku:bash-4.3$java -version
java version "1.7.0_101"
OpenJDK Runtime Environment (IcedTea 2.6.6) (7u101-2.6.6-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
```
or
```
sinaku:bash-4.3$java -fullversion
java full version "1.7.0_101-b00"
```
## インストールディレクトリの確認
```
sinaku:bash-4.3$/usr/sbin/update-java-alternatives -l
java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64
java-8-oracle 1072 /usr/lib/jvm/java-8-oracle
```
## Javaの切り替え
### java
```
sinaku:bash-4.3$sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 2 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
  0            /usr/lib/jvm/java-8-oracle/jre/bin/java          1072      自動モード
* 1            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      手動モード
  2            /usr/lib/jvm/java-8-oracle/jre/bin/java          1072      手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください:
```
### javac
```
sinaku:bash-4.3$sudo update-alternatives --config javac
alternative javac (/usr/bin/javac を提供) には 2 個の選択肢があります。

  選択肢    パス                                       優先度  状態
------------------------------------------------------------
  0            /usr/lib/jvm/java-8-oracle/bin/javac          1072      自動モード
* 1            /usr/lib/jvm/java-7-openjdk-amd64/bin/javac   1071      手動モード
  2            /usr/lib/jvm/java-8-oracle/bin/javac          1072      手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください:
```

ただし、JAVA_HOMEやJAVA_PATHについては切り替わらないので、注意。

## JAVA_HOMEの切り替え
```
$ vim ~/.bashrc

#一番下へ↓4行を追加

JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH

$ source ~/.bashrc
```
↑情報基 [ryo’s blog](http://forco.hateblo.jp/entry/2015/04/05/035621)(^人^)感謝♪詳しい話はリンク先を見ること。

## JAVA_PATHの設定
EXCEL > 項目が列方向に多数ある場合の項目と値一覧の印刷 > 行列を入替える

```txt:動作確認
Excel 2013 on Windows 7 pro
```

- １行目に項目名がある
- 2行目以降にデータがある
- AT列くらいまで項目がある

上記のようなデータファイルをもとに、[項目名, 参考データ]の一覧を印刷したい。

行列の入替をする以下の方法を使う。

1. 1行目と参考データの行だけ残して、他の行は削除
2. Ctrl+A, Ctrl+Cで該当行をコピー
3. 4行目くらいにセルを移動
4. 「形式を選択して貼り付け」を選択。「行列を入れ替える」を選択して貼付け

手順3を行わないと貼り付けが失敗する (エラー > "コピー領域と貼り付け領域のサイズが違うため、貼り付けることができません。")


参考 http://shikaku.biglobe.ne.jp/pc_technic/excel/03_1.html
iOSアプリのHTTP通信を傍受してデバッグに役立てる

iOSアプリを開発していると、iOSアプリ/サーバ間のHTTP通信を見たいことがあります。ここでは、MacでHTTPプロキシを立てて、HTTP通信の内容を見られるようにする方法を紹介します。

## 必要なもの

* [Proxy.app]
* MacとiPhone
* iPhoneからMacに通信できるWiFi環境 (USB、MacをLANケーブルでLANに繋ぐ等は不要)

## Mac側の準備

1. [Proxy.app]をインストールする
2. MacをWiFiにつなぐ
2. Macのファイアウォールでポート8080をLANに公開する
3. Proxy.appを起動する
4. Proxy.appの設定で「Listen to all network interfaces」にチェックを入れる<br>![](https://qiita-image-store.s3.amazonaws.com/0/889/66631d9f-63df-caca-859d-bd2071c632ef.png)
5. プロキシサーバを起動する<br><img width="380" alt="Proxy.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/ff741500-612b-e79b-6455-1f87c9f5aa79.png">

## iOS側の準備

1. Macと同じWiFiにつなぐ
2. 「設定」→「Wi-Fi」→接続中のWiFiの![マルi]→「HTTPプロキシ」→「手動」にMacのプロキシを設定する
    * サーバ: MacのIPアドレスもしくはホスト名
    * ポート: 8080
    * ![IMG_7613.png](https://qiita-image-store.s3.amazonaws.com/0/889/dd0e2eb7-a903-7f6e-c177-423debfcb082.png)

## iOSアプリの通信内容を見る

Mac・iOSともに準備が終わったら、目的のiOSアプリを起動して通信を発生させると、Proxy.appに通信内容が表示されます。

**Proxy.appで見れる通信内容**

<img width="979" alt="Proxy.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/aa29465a-ecc9-5fa6-5430-0b32713f48d0.png">



[Proxy.app]: http://www.proxyapp.io/
[マルi]: https://qiita-image-store.s3.amazonaws.com/0/889/abf2c36e-c9de-35bd-ccbd-ef0ac4af6def.png
gulp-imageminで拡張子を指定しないと、すべてのファイルに影響してしまう

githubのusageでは下記のようになっていたが、
これだと、src/images/に、例えばhtmlだとか画像ではないファイルがあると
そいつらもdist/imagesに持っていかれる。
srcが画像専用フォルダならばそれで良いが、困る場合もある。

```
const gulp = require('gulp');
const imagemin = require('gulp-imagemin');

gulp.task('default', () =>
    gulp.src('src/images/*')
        .pipe(imagemin())
        .pipe(gulp.dest('dist/images'))
);
```

下記のように、拡張子を指定してあげれば良い。


```bash:terminal
gulp.task('imagemin', () => {
  return gulp.src([config.src + '/**/*.{png,jpg,svg,webp}', '!' + config.src + '/**/sprite/*'])
    .pipe(cache('imagemining'))
    .pipe(imagemin({
      progressive: true,
      svgoPlugins: [
        { removeViewBox: false },
        { cleanupIDs: false }
      ],
      use: [pngquant()]
    }))
    .pipe(gulp.dest(config.dest));
});
```
Observableを順番に処理させるサンプル

これで良いかどうかは置いておいて、このサンプルでは5秒毎に「1,2,3」と表示して終わるサンプルです。
あとで、僕が使うメモです。


```swift
        let a:Observable<Int> = Observable.create { observable in
            NSOperationQueue().addOperationWithBlock({ () -> Void in
                sleep(5)
                observable.onNext(1)
                observable.onCompleted()
            })
            return NopDisposable.instance
        }
        
        let b:Observable<Int> = Observable.create { observable in
            NSOperationQueue().addOperationWithBlock({ () -> Void in
                sleep(5)
                observable.onNext(2)
                observable.onCompleted()
            })
            return NopDisposable.instance
        }
        
        let c:Observable<Int> = Observable.create { observable in
            NSOperationQueue().addOperationWithBlock({ () -> Void in
                sleep(5)
                observable.onNext(3)
                observable.onCompleted()
            })
            return NopDisposable.instance
        }
        
        a.concat(b).concat(c).subscribeNext { (value) in
            print(value)
        }
```
HandlerSocketでDATETIME型にINSERTする


# 概要
PHPで[HandlerSocket](http://www.slideshare.net/akirahiguchi/handlersocket-20140218)を使っていると、カラムが[数値型](https://dev.mysql.com/doc/refman/5.6/ja/numeric-types.html)とか[文字・文字列型](https://dev.mysql.com/doc/refman/5.6/ja/string-types.html)を使っている場合はそのまま使えるが、[DATETIME型]()とかだと使えるのか心配になるので、試した。


# 結論：わりと普通に使える。（っぽい）

## テスト用のテーブル

```sql
CREATE TABLE test (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    VALUE VARCHAR(63) NOT NULL DEFAULT '',
    dt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
)  ENGINE=INNODB DEFAULT CHARSET=UTF8MB4
;
```

## テストしたコード

```php
$res = $hs->insert(['dt' => 1463640000 ]);
var_dump($res); // int(1)
/*
mysql> select * from test;
+----+-------+---------------------+
| id | value | dt                  |
+----+-------+---------------------+
|  1 |       | 0000-00-00 00:00:00 |
+----+-------+---------------------+
1 row in set (0.00 sec)
*/

$res = $hs->insert(['dt' => date('Y-m-d h:i:s') ]);
var_dump($res); // int(2)
/*
mysql> select * from test;
+----+-------+---------------------+
| id | value | dt                  |
+----+-------+---------------------+
|  2 |       | 2016-05-19 01:23:45 |
+----+-------+---------------------+
2 rows in set (0.00 sec)


$res = $hs->insert(['dt' => date('Y-m-d') ]);
var_dump($res); // int(3)
/*

mysql> select * from test;
+----+-------+---------------------+
| id | value | dt                  |
+----+-------+---------------------+
|  3 |       | 2016-05-19 00:00:00 |
+----+-------+---------------------+
*/


$res = $hs->insert(['dt' => date('Y/m/d') ]);
var_dump($res); // int(4)
/*
mysql> select * from test;
+----+-------+---------------------+
| id | value | dt                  |
+----+-------+---------------------+
|  4 |       | 2016-05-19 00:00:00 |
+----+-------+---------------------+
4 rows in set (0.00 sec)
*/

```

## 他、おまけてきなやつ
PKに time() の戻り値を入れる。
time()の商を入れるなどすれば、「1時間毎に、最初にアクセスしてきた人に～」とかできそう。

```php
$res = $hs->insert(['id' => time() ]);
var_dump($res); // int(0)
/*
mysql> select * from test;
+------------+-------+---------------------+
| id         | value | dt                  |
+------------+-------+---------------------+
| 1463640000 |       | 0000-00-00 00:00:00 |
+------------+-------+---------------------+
1 row in set (0.00 sec)
*/
```

# 後で調べること
HandlerSocketが、たしかHandlerInterfaceを直接叩くみたいな感じの実装をしてるって[スライド](http://www.slideshare.net/akirahiguchi/handlersocket-20140218)で言ってた気がするので、そのへんの実装をちゃんと読みたい。
laravel on Heroku - DATABASE_URLをランタイムでパース - 何としてもサービスプロバイダーで


Lumen を始めてからConfigファイルという概念を忘れました。

ServiceProviderで以下のように記述を入れます。

````
$this->app->extend("db",function($dbObj){

    /** @var Repository $config */
    $config = app("config");

    $databaseUrl = env(env("DB_DATABASE","DATABASE_URL"));
    $db = new DatabaseConfig($databaseUrl); // パースする用のオブジェクト
    $configParam = [
        'driver' => 'herokupg',
        'host'     => $db->host,
        'port'     => $db->port,
        'database' => $db->database,
        'username' => $db->username,
        'password' => $db->password,
        'charset'  => env('DB_CHARSET', 'utf8'),
        'prefix'   => env('DB_PREFIX', ''),
        'schema'   => env('DB_SCHEMA', 'public'),
    ];
    $config->set("database.connections.herokupg",$configParam);
    return $dbObj;
});

$this->app->bind("db.connector.herokupg",function($app,$configData){
    return new PostgresConnector;
});

$this->app->bind("db.connection.herokupg",function($app,$configData){
    list($connection, $database, $prefix, $config) = $configData;
    return new PostgresConnection($connection, $database, $prefix, $config);

});

````

フックするポイントは多分dbのextendsで大丈夫なはず…(ですよね？)

こうすれば.env側で

````
DB_CONNECTION=herokupg
DATABASE_URL=postgres://xxxxxxx
````

みたいに書いておくだけで上手いこと動いてくれます。

DB_DATABASEを指定することで、別のDatabase名を利用する事も可能

今のところHeroku Postgresのみ対応ですが、同様のやり方で他のDBでも繋げそうです。
Goutte の filter で対象の有無をチェック

Goutte を使っている時に、filter対象のタグの有無を確認したい場合があったりします。
ない場合に `->text()` とか使おうとすると例外が投げられます。

`exists` とか無いかなと思っていたけど無いみたいなのですが、
`count()` を使えば存在確認は出来るみたいです。

```php
$div_target = $crawler->filter('div.target');
if ($div_target->count()) {
    print('exists');
} else {
    print('not exists');
}
```

なかなか見つからなかったのでメモメモ。
PHP から Slack の Incoming WebHooks を叩く

ググッて出てくる情報が古かったり間違っていたり curl 使わなきゃいけなかったりして試行錯誤したのでメモ。

``` php
<?php

function send_to_slack($message) {
  $webhook_url = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX';
  $options = array(
    'http' => array(
      'method' => 'POST',
      'header' => 'Content-Type: application/json',
      'content' => json_encode($message),
    )
  );
  $response = file_get_contents($webhook_url, false, stream_context_create($options));
  return $response === 'ok';
}

$message = array(
  'username' => 'Bot',
  'text' => 'fooooo!!!',
);

send_to_slack($message);
```

素直に POST で JSON を投げつければいいんです。
AWS S3バケットに独自ドメインを割り当てる。

# はじめに

AWS S3に作成したバケットに対して独自ドメインの割り当てを行います。

これによって静的サイトであればS3のみで完結するため、そこら辺のサーバーを動かすよりも低コストで高安定なサイト運営が可能となります。

## 前提条件

今回利用する独自ドメインがRoute53にてドメイン管理できることを前提に行います。
また、今回割り当てるドメインは「hogehoge.hengjiu.jp」で行います。


# バケットの作成 - S3

- S3の「バケットを作成」で新規にバケットを作成します。
![s3_01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/72f93b5a-c551-b7bc-7bb9-bf2423206291.png)

- 作成したバケットのプロパティで「ウェブサイトのホスティングを有効にする」に変更して保存します。
![s3_02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/1251fb2c-2e53-a280-36c8-77361267f69f.png)


# ドメイン登録 - Route53

- Route 53のHosted zones で対象のDomain Nameをクリックします。
![route53_01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/1214fea9-685d-02f7-5fd5-8c249b676388.png)

・Create Record Setをクリックします。
![route53_02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ea7ff1e8-4f73-dd82-360f-007c955afd1e.png)

・Nameにサブドメイン(hogehoge)を入力し、AliasをYesにしてAlias Target入力状態にするとS3で作成したバケット名「hogehoge.hengjiu.jp」が表示されるので、それを選択して「Create」をします。
![route53_03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/a6859d8d-4df8-a564-f4f2-939aee13ba24.png)

以上で完了です。


# おわりに

S3バケットに独自ドメインを割り当てるためには「バケット名は割り当てるドメイン名と同じにする」ということに注意が必要です。

もし、レコード作成時に作成したバケットが表示されない(_No Targets Available_)場合は、

- 作成したバケットの名前間が違う。
- ウェブサイトホストティングが有効になっていない。

などが考えられるのでもう一度確認してみてください。

また、割り当てる際の作業手順は今回説明したように（S3でバケット作成 → Route53でレコード登録）で行うが良いと思います。
ですが、どうしても先にレコード登録をする必要がある場合は、Alias Targetに「s3-website-ap-northeast-1.amazonaws.com.」を入力すれば事前に作成しておくことが可能です。
Code Commitの使い方


AWSのリポジトリサービス「Code Commit」の使い方。
Windows環境でのリポジトリ作成～Pushの手順。
APIアクセスキーを使用したHTTPSの通信が前提。

### AWSCLIのインストール
AWSのサイトからCLIのインストーラーをダウンロードする。
https://s3.amazonaws.com/aws-cli/AWSCLI64.msi

ダウンロードしてきたインストーラーを起動しインストールする。

### アクセスキーの登録
次のコマンドでアクセスキーを登録する。
４項目質問されるのでそれぞれ次のように入力する。

```
aws configure --profile codecommit
  AWS Access Key ID [None]: { アクセスキー }
  AWS Secret Access Key [None]: { シークレットキー }
  Default region name [None]: us-east-1
  Default output format [None]:

```

### リポジトリ作成
Code Commitに登録したいリポジトリを作成。

```
git init

```

### アクセスキーの設定
上記の手順で登録したアクセスキーをGitに設定する。
「--profile」の項目は上記で登録した内容に合わせること。

```
git config --local credential.helper "!aws codecommit --profile codecommit credential-helper $@"
git config --local credential.UseHttpPath true
```

### CodeCommitにpush先を設定
次のコマンドでCodeCommitのリポジトリをリモート先に設定する。

```
git remote add origin { Code CommitのURL }
git remote -v
```

### CodeCommitにpush先
次のコマンドでCodeCommitにpushします。

```
push
git push -u origin master

```
knife-zeroの導入と簡単な使い方


knife-zeroのインストールと簡単な使い方。
AWSのEC2内のインスタンスが前提。

### chefDKインストール
chefの構成要素を一通り含まれているchefDKをインストール。
chefDKをインストールすればchef-zeroを使用することが可能。
chefDKを公開しているサイトからrpmを取得してインストール。

```
wget https://packages.chef.io/stable/el/6/chefdk-0.12.0-1.el6.x86_64.rpm
rpm -Uvh chefdk-0.12.0-1.el6.x86_64.rpm
```

### knife-zeroインストール
kinfe-zeroはchefDKに含まれていないのでchefコマンドでインストール。

```
chef gem install knife-zero --no-document
```

### リポジトリ作成
リポジトリを作成したいディレクトリでコマンドを実行。

```
chef generate repo chef-repo
```

### kinfe-zeroを使用するための設定
ローカルモードを有効とする設定ファイルを作成。

```
cd chef-repo
mkdir .chef
echo 'local_mode true' > .chef/knife.rb
```

### リモートサーバに対してbootstrap実行
リモートサーバをノードに追加。
追加されたノードをnode listコマンドで確認可能。

```
knife zero bootstrap infra -x ec2-user --hint ec2 --sudo
knife node list
```

bootstrapが完了するとnodeディレクトリ以下にjsonファイルが生成される。
ノード追加時に-Nオプションをつけるとノード名を指定することが可能。


### クックブックの作成
サーバを構築するためのクックブックを作成。

```
knife cookbook create {クックブック名}
```

完了するとcookbook以下にクックブック名のディレクトリが作成される。

### レシピの作成
例としてnginxインストールのレシピを作成。
cookbook/recipes/default.rbのファイルを次のように修正する。

```default.rb
package 'nginx' do
    action :install
end

```
### ノードにクックブックを登録
レシピを実行するためにノードにクックブックを登録する。

```
knife node run_list add {ノード名} {クックブック名}
```

### レシピの実行
レシピを実行する。

```
knife zero converge '{ノード名}' --attribute ec2.local_ipv4 -x ec2-user --sudo -i {鍵のパス}
```

正常終了するとリモート先のサーバにnginxがインストールされる。
Mavenでjarをローカルリポジトリに配置する方法


Mavenでjarをローカルリポジトリに配置する方法。

installを使用する。

```
mvn install:install-file -Dfile={jarファイルのパス} -DgroupId={groupId} -DartifactId={artifactId} -Dversion={version} -Dpackaging=jar -DgeneratePom=true
```

## おまけ
ローカルリポジトリに配置されたjarを使用する。

pomファイルに記述を追加する。

```xml
<dependency>
	<groupId>{groupId}</groupId>
	<artifactId>{artifactId}</artifactId>
	<version>{version}</version>
</dependency>
```