OmniAICreator/Qiita-1.07M huggingface dataset:
cuDNNのインストールができない⇒解決

cuDNNのインストールでつまづいていたのですが、
NIVIDIAのサポートデスクに教えてもらった対応で、
インストールまでたどり着いたので、以下にまとめます。

-----------------
●対応前
環境：ubuntu14.04

目的
CUDAツールキット：cudnn-7.5.18_linux.run
cuDNN：cudnn-7.0-linux-x64-v4.0-rc.tgz
のインストール

手順
１．CUDAインストール
http://n-nishida.hatenablog.com/entry/2015/04/19/053643
に倣い、インストール

２．PATH
上のURLに倣い.bashrc（心配だったので.profileにも）
export CUDA_ROOT=/usr/local/cuda-7.5
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:/usr/local/cuda-7.5/lib:$LD_LIBRARY_PATH
export CPATH=/usr/local/cuda-7.5/include:$CPATH

３．cuDNN
http://deeplearning.net/software/theano/library/sandbox/cuda/dnn.html
に倣い、
cudnn.hを/usr/local/cuda-7.5/include
libcudnn*を/usr/local/cuda-7.5/lib64
にコピー
更にPATH
export LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LIBRARY_PATH
を追加

４．Chiner(1.5)インストール
色々怒られながら（もうどう対処したか忘れてしまうくらい苦戦して）、なんとかインストール

５．確認
import cupy
問題なし
import cupy.cudnn
失敗
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/cupy/cudnn.py", line 7, in <module>
from cupy.cuda import cudnn
ImportError: cannot import name cudnn
というエラーを返される


-----------------
〇対応後
手順
１．PATH変更
export CPATH=/usr/local/cuda/include:$CPATH
export LIBRARY_PATH=/usr/local/cuda/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH

２．Chainerアンインストール
pip uninstall chainer

３．Chainer(1.6)インストール
pip install chainer

４．確認
import cupy
成功
import cupy.cudnn
成功

-----------------
■感想
NVIDIAのサポートデスクに感謝。
自力で奮闘しているときに見たほとんどのCUDA,cuDNNインストール関連のページでは、
PATHをlib64にしていたけれど、
Chainerインストール時には上記のPATHでいけるらしい。
NVIDIAの方いはく、他のDeep Learningのフレームワーク(CafeeやTheano)も、
上記のPATHでやってとのことでした。
OpenStackをVagrantから使う

# 前提
以下の環境にて動作確認
- Vagrantは1.8.1
- クライアントはMac OSX El Capitan
- OpenStack Juno

# インストール手順
- Vagrant OpenStack plug-inの導入

```
$ vagrant plugin install vagrant-openstack-plugin
Installing the 'vagrant-openstack-plugin' plugin. This can take a few minutes...
Installed the plugin 'vagrant-openstack-plugin (0.12.0)'!
```

- dummy box の追加

```
$ vagrant box add dummy https://github.com/cloudbau/vagrant-openstack-plugin/raw/master/dummy.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'dummy' (v0) for provider: 
    box: Downloading: https://github.com/cloudbau/vagrant-openstack-plugin/raw/master/dummy.box
==> box: Successfully added box 'dummy' (v0) for 'openstack'!

$ vagrant box list
dummy                    (openstack, 0)
```

- Vagrantfileの作成

```
$ echo 'require "vagrant-openstack-plugin"

Vagrant.configure("2") do |config|
  config.vm.box = "dummy"

  # Make sure the private key from the key pair is provided
  config.ssh.private_key_path = "~/.ssh/id_rsa"

  config.vm.provider :openstack do |os|
    os.username     = "<user-name>"          # e.g. "#{ENV['OS_USERNAME']}"
    os.api_key      = "<api-key>"           # e.g. "#{ENV['OS_PASSWORD']}"
    os.flavor       = /m1.small/                # Regex or String
    os.image        = /CentOS/                 # Regex or String
    os.endpoint     = "http://<os-auth-url>/tokens"      # e.g. "#{ENV['OS_AUTH_URL']}/tokens"
    os.keypair_name = "<key-pair-name>"      # as stored in Nova
    os.ssh_username = "centos"           # login for the VM
    os.network            = "<network-name>"            # optional
    os.floating_ip        = :auto             # optional
    os.server_name = "<instance-name>"
  end
end' | tee Vagrantfile
```

- 起動

```
$ vagrant up --provider=openstack
```
SQLコマンド一覧

# よく使うSQLコマンドの一覧を作成
* 【使用するDBの選択】
USE DB名前;

* 【table内のFieldを調べる】
DESCRIBE table名前;

例　mysql> DESCRIBE my_items;
+------------+---------+------+-----+---------+-------+
| Field      | Type    | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| id         | int(11) | YES  |     | NULL    |       |
| items_name | text    | YES  |     | NULL    |       |
| price      | int(11) | YES  |     | NULL    |       |
+------------+---------+------+-----+---------+-------+
[Mac]MacでWindows向けキーボードを接続した際の設定

# きっかけ
念願のMajestouchを購入しました。そこで、Mac向けに色々キーと配置とかを変更しました。
今回私が買ったのは、普通の日本語向け配列でよく見かけるWindows向けに売られているやつです。
ただ、MacのJIS配列を持っている人にはわかるのですが、キーボード左右にある英数・かなキーが思いの外便利で、私も正直これがあるがためにUS配列にしないくらいのものです。
なので、これを再現したい・・・。ということでやりました。

# 導入したフリーソフト
## Seil
https://pqrs.org/osx/karabiner/seil.html.ja
Windows向けキーボードについている変換・無変換をcommandキーに変更できるソフト
## Karabiner
https://pqrs.org/osx/karabiner/
各種キー配置を変更できるソフト

これらを使って、うまく修正を施していきます。

# 設定
## Macのキーボードの設定
![スクリーンショット 2016-01-24 15.58.32.png](https://qiita-image-store.s3.amazonaws.com/0/76668/0c305549-59bc-3248-90e3-477823333cc4.png)
Macの配列とWindows向けの配列は異なります。ただだからと言って闇雲に変更するのも気が引けるので、とりあえずCpasLockをControlに、CtrlをCommandに変更しました。僕の場合、CapsLockはほとんど使わず、普段はWindowsとかそれと同じキー配列でUbuntuとかを使うゆとりなんでCtrlの位置が変わると困っちゃうため、Mac内蔵キーにおいてもcapsをCommand化しています。

## Seilの設定
![スクリーンショット 2016-01-24 15.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/76668/aec3d574-309b-eabc-199a-32787bc4c81a.png)
NFER(無変換)キーとXFER(変換)キー、ひらがなカタカナキーを全てCommandキーに変更しています。
NFERキーがMacで言うところの左コマンド、XFERとひらがなカタカナキーがMacで言うところの右コマンドに対応しています。

## Karabinerの設定
![スクリーンショット 2016-01-24 15.58.58.png](https://qiita-image-store.s3.amazonaws.com/0/76668/478c4493-ee5d-a962-d61a-0958e5d1c30c.png)
これで、右コマンド、左コマンドキーでかな・英数と切り替えができます(これはUS配列のMacでも使える話です)。
ちなみに、本体の内蔵キーも同様の動きをしますが、まあそこまで問題はなさそうです。

ひとまず、このような形で設定しました。こうした方がいいよとかあればコメント等で募集しております。

P.S.
軸は黒軸です。
PostgreSQLで正規表現

# 正規表現マッチ演算子
PostgreSQLには正規表現マッチ演算子というのがある。LIKEやILIKEでは表現しきれないパターンに使える。

|演算子|説明 |
|:-----------|:-----------|
|`~`|正規表現に一致する。大文字小文字の区別あり。|
|`~*`|正規表現に一致する。大文字小文字の区別なし。|
|`!~`|正規表現に一致しない。大文字小文字の区別あり。|
|`!~*`|正規表現に一致しない。大文字小文字の区別なし。|

`~` が基本。
`~*` は `~` の大文字小文字区別なし版。
`!~`、`!~*` はそれぞれ `~` と `~*` の否定。

|例|結果|
|:-------------|:---:|
|`'abc' ~ '^a'`|true|
|`'abc' ~* '^a'`|true|
|`'abc' ~ '^A'`|false|
|`'abc' ~* '^A'`|true|
|`'abc' !~ '^a'`|false|
|`'abc' !~* '^a'`|false|
|`'abc' !~ '^A'`|true|
|`'abc' !~* '^A'`|false|


# regexp_replace
正規表現を用いた文字列置換関数。

`regexp_replace(string text, pattern text, replacement text [, flags text])`

`\1`, `\2`, … `\N` でパターン内において括弧でくくった部分にマッチした部分を replacement に使うことができる。`\N` はN番目の括弧の部分。実際の replacement では `\\1` のようにバックスラッシュを重ねて書く。

主なフラグ

|フラグ|説明 |
|:-----------|:-----------|
|i|大文字小文字の区別をしない|
|g|最初のマッチだけでなく全てのマッチを置換|

実行例

|例|結果|
|:-------------|:---|
|`REGEXP_REPLACE('abcdeabcde', 'c.', 'X')`|abXeabcde|
|`REGEXP_REPLACE('abcdeabcde', 'c.', 'X', 'g')`|abXeabXe|
|`REGEXP_REPLACE('ABCDEabcde', 'c.', 'X', 'g')`|ABCDEabXe|
|`REGEXP_REPLACE('ABCDEabcde', 'c.', 'X', 'ig')`|ABXEabXe|
|`REGEXP_REPLACE('abcdeabcde', 'b(.)d', E'Y\\1Z', 'g')`|aYcZeaYcZe|

# 参考ページ
[PostgreSQL 9.1.5文書 9.7.3. POSIX正規表現](https://www.sraoss.co.jp/PostgreSQL/Manual/document/9.1/html/functions-matching.html#FUNCTIONS-POSIX-REGEXP)
[PostgreSQL 9.1.5文書 4.1.2.2. C形式エスケープでの文字列定数](https://www.postgresql.jp/document/9.1/html/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE)
RubyMineでのGit操作「現在の作業を一時的に退避したい」

# 想定環境

- Mac OS X 10.11
- RubyMine 8.0.3

プロジェクトディレクトリは次のパス。

```
/Users/kyoshida/RubymineProjects/eslplayer
```

# 課題

トピックブランチで作業している時に別のブランチで作業する必要があり、現在の変更内容をいったん保存したい、といったケース。

例えば `feature/paginate` ブランチで作業していて、別の開発者から「自分の作業している `feature/oauth` ブランチを見てほしい」と相談された場合を想定する。この場合、例えば次の3つの方法が考えられる。

- Subversion 方式
  1. `feature/paginate` ブランチでパッチを作成
  2. `feature/oauth` ブランチで作業を完了後
  3. `feature/paginate` ブランチに戻る
  4. パッチをあてる
- rebase
  1. `feature/paginate` ブランチで一時的にコミット
  2. `feature/oauth` ブランチで作業を完了後
  3. `feature/paginate` ブランチに戻る
  4. 残りを実装後
  5. rebase
- バージョン管理機能を使わない
  1. 編集したファイルを適当な場所に退避する
  2. revert
  3. `feature/oauth` ブランチで作業を完了後
  4. `feature/paginate` ブランチに戻る
  5. 退避したファイルを戻す

最後の方法はファイル数が少なければ出来ないこともないが、作業ミスの可能性が高くなる。Git にはこの方法に似た機能として stash があるので、これを利用する。

VCS -> Git -> Stash Changes... メニューを選択する。
![stash1.png](https://qiita-image-store.s3.amazonaws.com/0/36122/4f0d4fdd-3c8d-354c-f767-f6e8fe37149f.png)

ダイアログが表示されるので、Message 欄に適当なメモを入力（任意）して、Create Stash ボタンをクリックする。これで、内容が直前にコミットした状態に戻る。編集した内容は退避されている。
![stash2.png](https://qiita-image-store.s3.amazonaws.com/0/36122/5dd3cebf-02b3-6c5d-68d6-6b3cff1de51c.png)

リモートリポジトリの最新の状態を取得するため、VCS -> Git -> Fetch メニューを選択する。
![stash4.png](https://qiita-image-store.s3.amazonaws.com/0/36122/97d25798-8c52-dd96-936e-9704ef5e6c4a.png)

ブランチ切り替えで、新たな作業対象の `feature/oauth` ブランチをクリックし、Checkout as new local branch でローカルにチェックアウトする。
![stash3.png](https://qiita-image-store.s3.amazonaws.com/0/36122/2f7f7245-da19-9450-7838-4eaca6c581ec.png)

`feature/oauth` ブランチで作業を完了後、元の作業ブランチに戻る。
![stash5.png](https://qiita-image-store.s3.amazonaws.com/0/36122/7a01d832-2081-d451-83e1-84ca9ddcd6c4.png)

中断した作業内容が消えているので戻す。まずは VCS -> Git -> UnStash Changes... メニューを選択する。
![stash6.png](https://qiita-image-store.s3.amazonaws.com/0/36122/6a24b23c-a185-03a0-d4b3-68d235b546f1.png)

次にダイアログで対象の stash（変更）を選択し、Pop stash にチェックを入れたあと、Pop Stash ボタンをクリックすると中断して退避した作業内容が復活する。
![stash8.png](https://qiita-image-store.s3.amazonaws.com/0/36122/b3893eaf-afba-a020-fd07-ff11d2635e3b.png)

Pop stash は復活させたあと、その stash が削除される。残しておきたい場合はチェックしない。（@jnchito さん、情報ありがとうございます）

上記の図では Stashes 欄に複数の stash が表示されているが、これは過去に登録したもの。一番下が古く、一番上が新しい（スタック）。

UnStash Changes ダイアログの View では選択している stash の内容が確認できる。また、Drop では選択している stash を削除、Clear ではすべての stash を削除する事ができる。

## Console

Version Controll ウインドウの Console タブの出力内容から実際に実行されている git コマンドは次の通り。ただし、各コマンド前にプロジェクトディレクトリに移動しているが、初回以降の表示は省略している。

```zsh
# プロジェクトディレクトリに移動
cd /Users/kyoshida/RubymineProjects/eslplayer
# stash の登録
git -c core.quotepath=false stash save splitメソッドを実装中
# fetch
git -c core.quotepath=false fetch origin --progress --prune
# checkout
git -c core.quotepath=false checkout -b feature/oauth
# checkout
git -c core.quotepath=false checkout feature/paginate
# stash の復元
git -c core.quotepath=false stash apply stash@{0}
```

## 参考

- [Git - git-stash Documentation](https://git-scm.com/docs/git-stash)
- [Stash | 逆引きGit | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/reference/stash.html)
Doctrine ORM で @Version カラムを使用するにはカラム定義に "default 1" が必要

[Doctrine ORM](https://github.com/doctrine/doctrine2)で楽観的ロックの仕組みを利用するするために`@Version`アノテーションを付与するカラムには、実テーブルのカラム定義に `default 1` を設定する必要がある。（※v2.5.4時点）

例

```sql
CREATE TABLE user (
   :
  version integer not null default 1 -- ★★★
   :
);
```

```php
/**
 * @Entity
 * @Table(name="`user`")
 */
class User
{
    /**
     * @var integer
     *
     * @Version
     * @Column(type="integer", nullable=false, options={"default":1})
     */
    public $version;
```

というのも、

[Doctrine\ORM\Persisters\Entity\BasicEntityPersister::getInsertColumnList](https://github.com/doctrine/doctrine2/blob/v2.5.4/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php#L1425)で明示的に `@Version` カラムをinsert対象から除外しており、実際のinsert文にversionカラムが含まれないため。

```php
    protected function getInsertColumnList()
    {
          :

        foreach ($this->class->reflFields as $name => $field) {
            if ($this->class->isVersioned && $this->class->versionField == $name) {
                continue;
            }
```
Wercker APIのJavaラッパーを作った

## 概要
Wercker APIをJavaからお手軽に使えるようにしたライブラリです。

[yeahlol/wercker4j](https://github.com/yeahlol/wercker4j)

## 経緯
CIサービスのWerckerから[公式API](http://devcenter.wercker.com/api/index.html)と[wercker/go-wercker-api](https://github.com/wercker/go-wercker-api)
が公開されていたので、Java版を作ってみました。
ネイティブアプリとかIDEのプラグイン用に欲しいなと考えながら
実装してた感じです。

## 使い方
Maven Central Repositoryに登録してるので、pom.xmlに以下を追加すれば
すぐに使えます。

```
<dependency>
  <groupId>org.wercker4j</groupId>
  <artifactId>wercker4j</artifactId>
  <version>1.0.0</version>
</dependency>
```

ビルドをキックするtrigger build APIを使うには以下のようになります。

```
Wercker4jClient client = new Wercker4jClient("[トークン]");
client.createBuild(new CreateBuildOption("[アプリケーションのID]"))
```
アプリケーションのIDはURLのパスから確認できます。
https://app.wercker.com/#applications/[アプリケーションのID]
が、Application APIからID取得しキックしたりも可能です。

```
Application app = client.getApplication(new GetApplicationOption("[オーナー名]", "[アプリケーション名]"));
client.createBuild(new CreateBuildOption(app.id))
```

ビルドやアプリケーション以外にもデプロイやトークンに対してもリクエスト
できます。
詳しくは[GithubのREADME.md](https://github.com/yeahlol/wercker4j/blob/master/README.md)を参照してみて下さい。

## 最後に
Wercker APIは現時点ではalpha versionを謳っていますが、
将来的にOAuth2対応する可能性もあるっぽいので追随したいなと思います。
[security] Go 1.5.3 is released

（この記事は[ブログ](http://text.baldanders.info/remark/2016/01/security-update-go-1_5_3-is-released/)とのマルチポストです。）

2週間前の話ですみません。1月14日に [Go 言語]コンパイラ 1.5.3 が出ています。メインは [`math/big`] パッケージの不具合修正です。

リスクとしては大したことはないですが，Web アプリケーションまたは TLS の実装を [Go 言語]で行っている方は要更新です。

「[Go 1.5.3 is released](https://groups.google.com/forum/#!topic/golang-announce/MEATuOi_ei4)」より

> This issue can affect RSA computations in crypto/rsa, which is used by crypto/tls. TLS servers on 32-bit systems could plausibly leak their RSA private key due to this issue. Other protocol implementations that create many RSA signatures could also be impacted in the same way.
> Specifically, incorrect results in one part of the RSA Chinese Remainder computation can cause the result to be incorrect in such a way that it leaks one of the primes. While RSA blinding should prevent an attacker from crafting specific inputs that trigger the bug, on 32-bit systems the bug can be expected to occur at random around one in 2^26 times. Thus collecting around 64 million signatures (of known data) from an affected server should be enough to extract the private key used.
> On 64-bit systems, the frequency of the bug is so low (less than one in 2^50) that it would be very difficult to exploit. Nonetheless, everyone is strongly encouraged to upgrade.

## CVE-2015-8618 Carry propagation in Int.Exp Montgomery code in math/big library

**CVSSv2 基本評価値 2.6 (`AV:N/AC:H/Au:N/C:P/I:N/A:N`)** （[Redhat による評価](https://access.redhat.com/security/cve/cve-2015-8618)）

| 基本評価基準                            | 評価値            |
|----------------------------------------:|:------------------|
| 攻撃元区分（AV）                        | ネットワーク（N） |
| 攻撃条件の複雑さ（AC）                  | 高（H）           |
| 攻撃前の認証要否（Au）                  | 不要（N）         |
| 情報漏えいの可能性（機密性への影響, C） | 部分的（P）       |
| 情報改ざんの可能性（完全性への影響, I） | なし（N）         |
| 業務停止の可能性（可用性への影響, A）   | なし（N）         |

[Go 言語]: https://golang.org/ "The Go Programming Language"
[`math/big`]: https://golang.org/pkg/math/big/ "big - The Go Programming Language"
Railsにて日付（日時）を相対的に取得する

Rails(Ruby)で日付を取得する場合の動き。

###日時
時間まで取得したい場合は、Timeを用いる

```Time.rb
#現在日時の取得
t = Time.now
=> 2016-01-24 15:20:02 +0900

#明日の取得
t + 1.day
=> 2016-01-25 15:20:02 +0900

#昨日の取得
t - 1.day
=> 2016-01-23 15:20:02 +0900

#一ヶ月前の取得
t.last_month
=> 2015-12-24 15:20:02 +0900
```

###日付
時間まで取得しない場合は、Dateを用いる

```Date.rb
d = Date.today
=> Sun, 24 Jan 2016

d + 1.day
=> Mon, 25 Jan 2016

d - 1.day
=> Sat, 23 Jan 2016

d.last_month
=> Thu, 24 Dec 2015
```

検索機能などで、期間をする場合は以上のような
記述が利用できそうです。
SlackのOutgoing Webhooksを使って投稿に反応するbotを作る

##概要
Slack apiの[Outgoing Webhooks](https://api.slack.com/outgoing-webhooks)を使って投稿を取得して、それに反応するbotを作る。

##Outgoing Webhooksの設定
Outgoing Webhooksは、特定の投稿があった時、SlackからPOSTでその投稿データを送信し、それに対して特定の形式でjsonでレスポンスを返すと投稿してくれるというもの。
###Integrationの設定
https://your-team.slack.com/apps/manage/custom-integrations
この辺から新しくIntegrationを作成。

- Channel :投稿を取得するチャンネル
- Trigger Word(s) :Outgoing Webhooksを呼び出す単語
- URL(s) :POST送信先になるURL
- Customize Name :レスポンスを返す際の名前
- Customize Icon :レスポンスを返す際のアイコン

それぞれ設定。
TokenはPOST送信される際にこのIntegrationから送信されたかを確認するためのトークン。

##受信側
POSTに対してJSONで返せば良いので、基本的にApiを作るような感覚で実装できる。

POST送信されるデータ形式は以下

```送信されるデータ
token=XXXXXXXXXXXXXXXXXX
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:
```

ごくごく簡単に返事をするだけのものを作るとこんな感じ

``` json.php
<?php
// 受信文字列取得
if($_POST["user_name"] != "slackbot"){
  $text = "@".$_POST["user_name"]." 呼びましたか？";
  $payload = array("text" => $text);

  echo json_encode($payload);
}
```

一応slackbotの投稿は撥ねるようにしている。slackbotの投稿によってOutgoing Webhooksで送られるuser_nameは先ほどのIntegrationで設定したCustomize Nameとは関係なくslackbotになるらしい。


##デモ
<img width="345" alt="demo.png" src="https://qiita-image-store.s3.amazonaws.com/0/82740/93b1f781-d44d-cdf0-8252-c4938b9ab863.png">

やったね！

##課題
- 返答時の「＠」がちゃんと返信になってない。
- ここから何を作ろうか・・・
正規表現始める


dotinstall見てお勉強
http://dotinstall.com/lessons/basic_regexp

# 概要
+ あるパターンで文字列を検索
+ 検索した結果を抽出、置き換えなどする
+ dotinstallでは,Javascriptで実例を出していくらしいので、この記事でもJavascriptの例とする

# 文字列を検索してみる(Javascriptでの例)

```
<script>
    var s  = '@majihuwa, @taro, @hoge';
    var rs = s.match(/majihuwa/);// / /の中に検索したい文字列を書く

    if(rs){
    console.log('マッチしました');
    }
</script>
```

# メタ文字を使う

## [ ]

[]カッコの中の任意の一文字を表現できる
[abc] はaまたはbまたはc
[a-z] a,b,c,....zのどれか
[^abc] ^は否定,a,b,c以外という意味

```
<script>
    var s  = '@majihuwa, @taro, @hoge';
	var	 rs = s.match(/m[ai]jihuwa/);// majihuwa,mijihuwaにマッチする
    if(rs){
    console.log('マッチしました');
    }
</script>
```

## .
ピリオド 任意の1文字

```
<script>
    var s  =	'@majihuwa, @taro, @hoge';
    var rs = s.match(/m......a/);// mで始まりaで終わる6文字の文字列
    if(rs){
    console.log('マッチしました');
    }
</script>
```

## ^
キャレット 行頭を意味する
単体で使うと行頭
[]の中で使うと否定

```
<script>
    var s  =	'@majihuwa, @taro, @hoge';
    var rs = s.match(/^@majihuwa/);// 行頭がmajihuwa文字列
    if(rs){
    console.log('マッチしました');
    }
</script>
```

## $
行末を意味する

```
<script>
    var s  =	'@majihuwa, @taro, @hoge';
    var rs = s.match(/@hoge$/);// 行末が@hogeの文字列を表現
    if(rs){
    console.log('マッチしました');
    }
 </script>
```

## {}

直前の文字の繰り返す回数
a{2}   ２回繰り返す
例: aa

a{2,}  ２回以上を繰り返す
例: aaまたはaaaまたはaaaa

a{2,4} ２回から４回
例: aaまたはaaaまたはaaaa

```
<script>
    var	s  = 'aaaa';
    var rs = s.match(/a{4}/);// aが4文字を表現
    if(rs){
    console.log('マッチしました');
    }
</script>
```

# ?
直前の文字の繰り返しが0 or 1文字 
直前の文字があるか無いか
a または ''空白
# *
直前の文字が０文字以上
空白またはa,aa,aaa,aaaa,aaaaa,...
# +
空白にはマッチしない
1文字以上
a,aa,aaa,...

##()
文字列の繰り返しの祭に使う
(abc)* だとabc,abcabcを表現できる

## |
(abc|def) => abcまたはdefを表現できる

## ¥

¥n：改行
¥t：タブ
¥d：数字 [0-9]も代用か
¥w：英数字と_(アンダースコア) a[
¥s：スペースとタブ
¥メタ文字 ： ¥の後にメタ文字を入れることメタ文字自身を表現できる
Laravel 5.2 へアップグレード（From Laravel 5.1）

リクエストarrayをバリデーションするときに困っていたのですが、
Laravel5.2 で Validating Arrays が実装されたとアドバイスいただきました。

[【Laravel5.1】 arrayの中身をバリデーションする](http://qiita.com/sh-watanabe/items/6e425eac214bc510a702)

なので、5.2にアップデートしたので、そのときやった手順をまとめておきます。ハマったところ含め。
なお、↓が正式ドキュメント。
[Upgrading To 5.2.0 From 5.1](https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0)

## 1.comporser.json の修正
やることは、２つ。
　1-1. laravel を 5.2 に。
　1-2. reture_devに設定追加。   

```lang:coposer.json
...
    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.2.*", // <-変更
...
    "require-dev": {
        ....
        "symfony/dom-crawler": "~3.0", // <-追加
        "symfony/css-selector": "~3.0" // <-追加
```

## 2. composer update 実行
ドキュメント見る限り、composer update すればOKと思っていたが、エラー。
以下の2つを解消して、実行完了。

### エラー対応1：composerを最新に←
エラー内容。
> [RuntimeException]                                                                                                                                                     Could not load package intervention/image in http://packagist.org: [UnexpectedValueException] Could not parse version constraint 4.x.x: Invalid version string "4.x.x" 

composerが最新でない模様。
`$ composer self-update`
で解決。

### エラー対応2：app.phpから不要なものを削除
>[RuntimeException]                                                                                                                                                                                              
Error Output: Xdebug requires Zend Engine API version 220121212.                                                                                                                                                The Zend Engine API version 220131226 which is installed, is newer.                                                                                                                                             Contact Derick Rethans at http://xdebug.org/docs/faq#api for a later version of Xdebug.                                                                                                                         
PHP Fatal error:  Class 'Illuminate\Routing\ControllerServiceProvider' not found in /vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 146  

config/app.php が原因でした。
以下の2つが5.2から必要なくなったので削除。
`Illuminate\Routing\ControllerServiceProvider::class`
`Illuminate\Foundation\Providers\ArtisanServiceProvider::class`

## 3. ログイン画面の表示
サーバー立ち上げてアクセスしたら叱られる。

>exception 'InvalidArgumentException' with message 'Auth guard [] is not defined.' in /vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:73

原因は、auth.phpの変更をしていなかったこと。Multi-Authが実装されたってことはちらっと知ってたのに。

5.2のauth.php↓を参照して対応したら表示できた。
https://github.com/laravel/laravel/blob/v5.2.0/config/auth.php


## 4. ログイン
カスタムドライバを使ってたのですが、これが原因でログインできず。
ちゃんと読めって話ですが、5.2のドキュメントにちゃんと書いてあった。
>**Custom Drivers**

>If you are using the Auth::extend method to define a custom method of retrieving users, you should now use Auth::provider to define your custom user provider. Once you have defined the custom provider, you may configure it in the providers array of your new auth.php configuration file.

Auth::extend を Auth::provider に変更して再度実施。
DualISO 処理ツール cr2hdr  を mac で使う.

漢だったら DualISO で HDR 計測したいですよね!

http://www.magiclantern.fm/forum/?topic=7139.0
https://syoyo.wordpress.com/2013/09/01/550d-magic-lantern-dual-iso-finally-works/

![Screen Shot 2016-01-24 at 2.19.33 PM.png](https://qiita-image-store.s3.amazonaws.com/0/36275/17ea509b-f847-a3a0-96bd-281c8c9938fc.png)


でも DualISO 画像処理をしてくれる cr2hdr が mac 版は古くてしかも GUI 版しかありませんね... コマンドラインで新しいの使いたいですね.

## cr2hdr のビルド

まず, Magic lantern のソースコードを checkout しておきます.

MagicLantern の C コードは gcc を前提にしていくつか gcc 固有の拡張が入っているので(Apple gcc(clang) ではコンパイルエラーになる), brew で gcc 5 あたりをインストールしておきます.

`Makefile.user.default` で PYTHON のパスを設定しなおします.

module/dual_iso に移ります.

`Makefile.cr2hdr` で HOSTCC と CR2HDR_CFLAG を修正します. Then,

```
$ make cr2hdr
```

Voala! cf2hdr が無事コンパイルできました.

## cr2hdr を使う.

依存ツールを brew でインストールします.

```
$ brew install exiftool
$ brew install dcraw
```

```
$ ./cr2hdr cornellbox_dualiso.CR2 
cr2hdr: a post processing tool for Dual ISO images

Active options:
--amaze-edge    : use a temporary demosaic step (AMaZE) followed by edge-directed interpolation (default)
--cs2x2         : apply 2x2 chroma smoothing in noisy and aliased areas (default)
--wb=graymax    : set AsShotNeutral by maximizing the number of gray pixels (default)

Input file      : cornellbox_dualiso.CR2
Camera          : Canon EOS Kiss X4 (unknown, assuming 5D Mark III)
Full size       : 5344 x 3516
Active area     : 5202 x 3465
Black borders   : 142 left, 51 top
Black level     : 2048
ISO pattern     : dBBd GBRG
White levels    : 10194 12084
Noise levels    : 5.92 6.40 6.37 5.87 (14-bit)
ISO difference  : 1.01 EV (201)
Black delta     : 3.16
Black adjust    : -68
Dynamic range   : 10.44 (+) 10.62 => 11.62 EV (in theory)
Looking for hot/cold pixels...
Hot pixels      : 19
Cold pixels     : 8079
AMaZE interpolation ...
Amaze took 2.68 s
Edge-directed interpolation...
Semi-overexposed: 0.41%
Deep shadows    : 16.13%
Horizontal stripe fix...
Full-res reconstruction...
ISO overlap     : 6.4 EV (approx)
Half-res blending...
Chroma smoothing...
Building alias map...
Filtering alias map...
Smoothing alias map...
Final blending...
Noise level     : 171.27 (20-bit), ideally 165.62
Dynamic range   : 11.57 EV (cooked)
Black adjust    : -41
AsShotNeutral   : 0.47 1 0.63, 5553K/g=0.97 (gray max)
Output file     : cornellbox_dualiso.DNG 
cornellbox_dualiso.DNG: copying EXIF from cornellbox_dualiso.CR2
```

Voala! 無事処理された DNG が生成されました.

![Screen Shot 2016-01-24 at 2.22.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/36275/be8e7172-96ed-d232-405b-7fd8aac90006.png)


## TODO

Dual ISO 処理がおそいので RAW 動画で連番を処理させるとたいへんなことに... 

* 画像処理のバッチ処理スケジューラーほしい.
  * Amazon プライムフォトに CR2 や RAW 動画をアップロードしておき, AWS Lambda でバッチ処理できないだろうか.
* OpenCL とか GLSL とか MIT Halide とかで高速画像処理をしてくれる優秀な高速画像処理若人を探す旅に出たい.
テスト環境をDockerで作成する(準備)

## ■Dockerを使う目的

テスト用のVMを毎回作成するのが手間だったため、Dockerで1個のVMの中に複数のサーバを立てよう！ということになりました。
(Vagrantを使用すればVM作成はそれほど手間でもない気がしますが、複数のVMが乱立しカオスになりそうなためこれは却下で)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10982/430e8cd2-31f0-de7e-85b2-07d74a1ee529.png)

## ■事前準備

今回はVirtualBoxにCentOS 7環境を用意し、そこにDockerをインストールします。
CentOSへのDockerのインストールは、[公式サイト](https://docs.docker.com/engine/installation/centos/)に記載されています。
「Install」の章を実行し、`docker version`コマンドでバージョンを確認したところ「1.9.1」がインストールされていました。

## ■DockerでDBサーバを動かしてみる

Dockerがどんなものかまだピンときていないので、DBサーバ(MySQL5.7)を動かして掴んでみたいと思います。流れとしては、

1. コンテナ実行用のイメージを用意([Docker Hub](https://hub.docker.com/)からダウンロードできる、Dockerfileで自作することもできる)
2. イメージからコンテナを作成
3. コンテナを実行

たったのこれだけのようです。
今回は[Docker Hub](https://hub.docker.com/)からダウンロードしてみます。

### 1. コンテナの実行用イメージをダウンロード

[Docker Hub](https://hub.docker.com/)で「mysql」で検索したところ、[公式](https://hub.docker.com/_/mysql/)のイメージがありました。以下のコマンドでダウンロードします。
`$ docker pull mysql`

ダウンロードが完了したら、念のため以下のコマンドでダウンロードされているか確認しておきます。
`$ docker images`

### 2. イメージからコンテナを作成 & 実行

`docker run`コマンドで、コンテナの作成と実行が同時に行われるようです。
[こちら](https://hub.docker.com/_/mysql/)にコマンドが記載されているので、とりあえず叩いてみます。
`$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=test_pass123 -d mysql:latest`

バックグラウンドで実行されているようなので、以下のコマンドで実行されているか確認してみます。
`$ docker ps`

### 3. 実行中のコンテナ内でコマンドを叩く

MySQLは動いているようですが、実際にコマンドを叩いてMySQLの動作を確認したい場合、以下のコマンドでコンテナ内でコマンドが叩けるようになります。
`$ docker exec -it mysql bash`
「mysql」の部分はコンテナID(`docker ps`コマンドで確認できる)でもいけます。

抜けるときは`exit`で抜けられます。

***

とりあえずDockerでMySQLを動かすところまでできました。
いろいろ試して理想形まで持っていきたいと思います。
Mac, Linux, Windowsで共通に使える簡易URLショートカットファイル

言われてみればなんてことはないが、なぜ今まで知らなかった。

```html:cross-platform-url-shortcut.html
<html>
<body>
<script type="text/javascript">
    window.location.href = "http://stackoverflow.com";
</script>
</body>
</html>
```

タグとかセミコロンとか諸々をタイプする時間すら惜しいならこちらの省略版。

```html:cross-platform-url-shortcut.html
<!DOCTYPE html>
<script>window.location.href = "http://stackoverflow.com"</script>
```

ウェブサイトじゃなくてローカルPCのファイルやフォルダへのリンクだったら、IE以外ならこれで大丈夫そう。

```html:cross-platform-file-uri-shortcut.html
<!DOCTYPE html>
<script>
  var osType = navigator.appVersion;
  var userName = 'mmizutani'
  var homePath;
  if (osType.indexOf('Win')!=-1) {
    homePath = 'C:/Users/';
  } else if (osType.indexOf('Mac')!=-1) {
    homePath = '/Users/';
  } else if (osType.indexOf('Linux')!=-1) {
    homePath = '/home/';
  }
  if (homePath) {
    var url = 'file://' + homePath + userName + '/Dropbox/';
    //alert(url);
    window.location.href = url;
  }
</script>
```
Emacs Customize Notes - Swap Lines

プログラミングをしていると、やっぱりこの行はこっちだなと動かしたくなることが多々ある。場合によっては、ある区間をまとめてごそっと動かしたいことも然り。一時期使っていたSublime Textでは、 \<ctr\>+\<shift\>+\<up\>/\<down\> でおなじみの行の移動であるが、emacsではそれがない、もしくは結構使いづらかったのでカスタマイズした。
elispには、現在カーソルがある行をその前の行とスワップする関数transpose-linesがある。　（この表現はあんまり正しくない気がする。自分でもこの関数の挙動がよくわかっていない）　しかし、この関数はカーソルが存在する１行に対してしか操作することができないので、region（マーカとカーソルの間にある領域。一般的なエディタでいう"選択"である）に含まれる複数行をまとめて動かすときは、その行を切り取ってから上もしくは下に移動し、貼り付けるということを行った。目指すは、Sublime Textのように、\<shift\>で複数行を選択して、\<ctr\>+\<shift\>+\<up\>/\<down\> でごっそり動かすあれだ。 （ちなみに、ここでは感覚的に行の移動と表現しているが、実際に行っていることは行のスワップであり、ググるときにはそっちで探したほうがヒットしやすいと思う）

以下にコードを示す。なお、コードは https://groups.google.com/forum/#!msg/gnu.emacs.help/dd2R_UV0LVQ/F06ihLb7hKcJ を参考にさせていただいた。

```lisp
;;; Move selected lines up and down
(defun move-lines (arg)
  "Move several lines together up and down. 
    You can designate the amount of shift by arg. This arg can be less than 0.
    If a region is active, move the region up and down. Otherwise only move
    the line the cursor is in. 
    Somehow, a region which is active before evaluating this function  will be 
    deactivated if you don't use the key bindings to evaluate this function.
    If you want to wrap this function, make sure to set  the variable
    deactivate-mark nil in the wrapper. "  
  (cond
   ((and mark-active transient-mark-mode)
    ;; If region is active
    (if (< (point) (mark))
	(exchange-point-and-mark))
    (end-of-line)
    (exchange-point-and-mark)
    (beginning-of-line)
    (let ((text (delete-and-extract-region (point) (mark))))
      (kill-line)
      (forward-line arg)
      (set-mark (point))
      (insert text)
      (newline)
      (forward-char -1)
      (exchange-point-and-mark))
    (setf deactivate-mark nil))
   (t 
    ;; If region is inactive
    (beginning-of-line)
    (when (or (> arg 0) (not (bobp)))
      (forward-line)
      (when (or (< arg 0) (not (eobp)))
	(transpose-lines arg))
      (forward-line -1)))))

(defun move-lines-down ()
  " Move selected lines down, using move-lines. "
  (interactive)
  (move-lines 1)
  (setf deactivate-mark nil))

(defun move-lines-up ()
  " Move selected lines up, using move-lines.  "
  (interactive)
  (move-lines -1)
  (setf deactivate-mark nil))

(global-set-key (kbd "C-S-<up>") #'move-lines-up)
(global-set-key (kbd "C-S-<down>") #'move-lines-down)
```

キーバインドはsublime textのそれと同じにした。いい感じである。sublime textのキーバインドはとても直感的で使いやすいと個人的には思っている。それに引き換え、emacsのは未だに迷ってしまう。なぜだろうか？

ここで、２点だけ自分がハマった点を記しておく。
a. キーバインドで実行しないと、移動した後にregionがinactiveになっていない。（つまり、連続で動かせない）
b. move-lines-upとmove-lines-downの中でもちゃんと、deactive-mark をnilに設定しないと、移動後にregionがinactiveになってしまう。

aに関してはまだ理由がわかっていない。
bに関しては、elispの関数は基本的にregionに対する操作をしたら、そのregionをinactiveにしてしまう。だから、関数を評価する前にハイライトされていたregionは、評価後にハイライトが消えてしまっている。そこで、deactivate-markにnilをセットすることによって、regionに対して操作をした後でもそれがinactiveにされないように指定することができる。
C#でPDFからTIFに変換

Ghostscriptというネイティブのライブラリでできるが、
C#でラップした物がGitHubに存在する

GhostscriptSharp
https://github.com/mephraim/ghostscriptsharp

公開されているソースでは決め打ちでjpegに変換しているが、
コード内で記述されている以下の箇所を変えればTIFでも出力できる

```C#:GhostscriptSharp.cs
GhostscriptSettings s = new GhostscriptSettings();
s.Device = Settings.GhostscriptDevices.jpeg;
```

※内部的にGhostScriptを使用しているため、ライセンス形態には注意が必要
型情報を明示的に書くことについてのmatzの意見

## 引用
>「プログラムの本質は、コンピューターにどんな仕事をさせたいかにある。型っていうのは、この手続きはこういう構造のデータを必要としますという情報。それは本来、手続きを見れば、意図として表現されている。少なくとも私は表現したつもりがあるわけです」
「それを改めて、これは文字列です、これはこのクラスですって書けって言われると……、いや、もう言ったじゃん！ コンピューター分かってよって思う。型は書きたくない。徹底的に型を書きたくないわけですよ（笑）」
http://hrnabi.com/2015/05/12/7035/

## 感想
- コード読んだだけでどういうデータを渡したらいいか読み取れるくらい表現できているのが望ましい
- 名前やコードの表現についての意識が必要
- チームが大規模になると適用しづらい
HAProxyでMinecraftでもVirtualHostを実現させる

#機能概要 What you can do by reading this article
dev1.domain.tldでアクセスしたときはdev1のMinecraftサーバへ、
dev2.domain.tldでアクセスしたときはdev2のMinecraftサーバへアクセスできるようにする。
ただし、dev1.domain.tldも、dev2.domain.tldも、同じグローバルIPを指すものとする。
`Routing connections of Minecraft based on their domain names such as dev1.domain.tld or dev2.domain.ld WHILE those domains point the same global ip address.`

#方法概要 Logic explanation
HAProxy(L7プロキシ)を使う。
Minecraftの接続確立時の通信内容（ドメイン名が含まれる）を一部読み取り、その内容に応じてルーティング先を制御する。
`We use the Layer-7 proxy called HAProxy. Based on the payload information in the tcp packet after TCP handshake, determine to where the following packets go.`

#環境 Environment
CentOS 7.1
Craft Bukkit 1.8.8
HAProxy 1.5.14-3.el7

#手順 How to
詳しくは[ここ](http://cbonte.github.io/haproxy-dconv/configuration-1.7.html)を。

##frontendとして以下を記述。

 - [x] [mode](http://cbonte.github.io/haproxy-dconv/configuration-1.7.html#4.2-mode), [bind](http://cbonte.github.io/haproxy-dconv/configuration-1.7.html#4.2-bind), [tcp-request](http://cbonte.github.io/haproxy-dconv/configuration-1.7.html#4.2-tcp-request%20inspect-delay)

```file:/etc/haproxy/haproxy.cfg
frontend minecraft
    mode tcp                                  # MinecraftはTCP接続
    bind 0.0.0.0:25565                        # Minecraftポート(25565)で待ち受け
    tcp-request inspect-delay 5s              # 最大5秒の遅延までOK（SSLやSMTPでは必要だけどMinecraftでは要らないかも）

    acl mc_dev1_flg payload(4,4) -m sub dev1  # ドメイン名の先頭4文字がdev1なら
    tcp-request content accept if mc_dev1_flg # 受け入れる
    use_backend mc_dev1_app if mc_dev1_flg    # mc_dev1_appのバックエンドへ

    acl mc_dev2_flg payload(4,4) -m sub dev2
    tcp-request content accept if mc_dev2_flg
    use_backend mc_dev2_app if mc_dev2_flg
```

##backendとして以下を記述。

```file:/etc/haproxy/haproxy.cfg
backend mc_dev1_app
	server mc_dev1_srv 10.0.0.1  # 同じポートへならポート指定要らず

backend mc_dev2_app
	server mc_dev2_srv 10.0.0.2  # 10.0.0.1:25564 とかでもOK
```

#結果 Result
楽しい。`XD`
Git for Windows 2.xのシステムコンフィグファイルは2つある

# 問題
Unix系OSならば、`git config --list`の出力は、

```bash
# 全ユーザで共有している設定を出力する
git config --system --list

# ユーザ固有の設定を出力する
git config --global --list

# リポジトリ固有の設定を出力する
git config --local --list
```
の3つのコマンドを続けて実行したときと同じものになるはずである。

ところが、Git for Windows 2.7.0のGit Bashで同じコマンドを実行してみると、

```
$ git config --list
core.symlinks=false
core.autocrlf=false
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
diff.astextplain.textconv=astextplain
rebase.autosquash=true
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
```

```
$ git config --system --list
fatal: unable to read config file 'C:\Program Files\Git\mingw64/etc/gitconfig': No such file or directory
```

```
$ git config --global --list
 
```

```
$ git config --local --list
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
```

`git config --list`にあった`core.symlinks`から`rebase.autosquash`までの設定が`--system`にも`--global`にも`--local`にも見当たらない。
これらの設定はいったいどこで定義されているのだろうか？

# 答え
Git for Windows 2.xは全ユーザで共有している設定を保存する第二のファイルを持っており、そちらに定義されている。

```
$ git config --file /c/ProgramData/git/config --list
core.symlinks=false
core.autocrlf=false
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
diff.astextplain.textconv=astextplain
rebase.autosquash=true
```

Git for Windows 2.xは次の順で設定ファイルを読み込む。（下のファイルに書かれた設定の方が優先順位が高い）

1. C:\ProgramData\git\config（`git config --file /c/ProgramData/git/config`で読み書き可能）
1. C:\Program Files\Git\mingw64\etc\gitconfig（`git config --system`で読み書き可能）
1. C:\Users\\*（ユーザ名）*\\.gitconfig（`git config --global`で読み書き可能）
1. *（Gitリポジトリへのパス）*\\.git\config（`git config --local`で読み書き可能）

全ユーザで共有している設定を保存するファイルが2つある理由はよく分からなかった。

# 参考リンク

* [Why Git config list (total) is not the same as system + global + local - Stack Overflow](http://stackoverflow.com/questions/34111522/why-git-config-list-total-is-not-the-same-as-system-global-local)
* [Git - First-Time Git Setup](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup)
PHP_ENVの変更の仕方について

PHP_ENVの変更のコマンドがあったと思うのですが、
忘れてしまい、ぐぐってもでてこないので、
どなたか、知っている方いたら、教えていただきたいです。
PHP_ENVをtest → production 又は、その逆にしたいです。
確か、ほぼ、以下のような、形式だったと思います。
export php_env = production

よろしくお願いします。
成長が早いアルバイト学生エンジニアさんの特徴

即戦力になるかどうかは、経験があるかどうかで判断するのが一番安全だと思いますが、
その後成長早くいろいろなことをキャッチアップしていってくれるかどうかについては他の判断基準があると思います。

以下のような特徴をもつ方を採用するか、そういう部分が大事だと教育していくことがチーム力の底上げになると思います。

# ググって理解出来る
プログラマは自習がメインとなると思うので、自分でググって理解出来るということはかなり大事だと思います。
究極ググって手に入る情報を全て理解出来れば（難しいと思いますがw）おおよそ業務で必要な知識は得られると思います。
・なにがわからないかを明確にする
・直接ワードをいれてググる、関連語を含めてググる
・直接ググってもわからないのであれば、それがわかるのに必要な前提知識を明確にし再度ググる
を繰り返せる「忍耐」と「理解力」が大事だと思います。

面接で確認するとすれば、ググれる環境を与えている状態で
（作ったこととない場合）「app storeにアプリを申請するために必要なことを全て教えてください」
（知らない言語のソースとエラーメッセージを見せて）「このバグを直してください」
など聞いてみると良さそうです。

# 今自分が何を解決したいのかをドリルダウンしていける
バグを目の前にして固まってしまう方もたまにいます。
そうならないためには、期待することと現状の差分を明確にして、
その差分をドリルダウンしていけるような思考回路が必要だと思います。
バグに出会って「とりあえずソースを眺める」「とりあえず変数を出力してみる」ような行動は要注意です。

面接で確認するとすれば、ソースとバグを与えて解決するまでの道筋を聞いてみると良さそうです。



以上、今思っている特徴です。
今後もアップデートしていければと思います。
並行と並列の違い

## 定義
### 並行
英語ではconcurrent
複数の動作が、順不同もしくは同時に起こること
### 並列
英語ではparallel
複数の動作が、同時に起こること
## 関係
並行は並列を含む
## 参考
http://freak-da.hatenablog.com/entry/20100915/p1
IoTボード、SingleBoardComputerまとめ

##ESP-WROOM-02
link: [[1]](https://www.switch-science.com/catalog/2538/) [[2]](http://ehbtj.com/electronics/esp8266
) [[3]](http://flogics.com/wp/2015/05/%E5%B7%B7%E3%81%A7%E8%A9%B1%E9%A1%8C%E3%81%AE%E8%B6%85%E5%B0%8F%E5%9E%8B-wi-fi-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-esp8266-%E3%81%A7%E9%81%8A%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B/)
ESP8266 wiriモジュールにarduinoも着いてる感じ

##RedBear CC3200 WiFi Micro Kit:
link: [[1]](https://www.switch-science.com/catalog/2361/)
wifiモジュールだがarduinoも使える。

##USB armoy
link: [[1]](http://sakidori.co/article/7164)
超小型USB linux

##konashi
link: [[1]](http://konashi.ux-xu.com/)
javascript+BLEのボード

##Tessel
link: [[1]](https://html5experts.jp/n0bisuke/13562/)
node.jsで動く

##Odyssey IoT
link: [[1]](http://www.m-pression.com/ja/solutions/boards/odyssey)
FPGAが乗ってる？

##DragonBoard 410c
link:[[1]](http://pc.watch.impress.co.jp/docs/news/20151109_729630.html)
snapdragonのlinuxボード

##8pino
link: [[1]](http://8pino.cc/)
おそらくarduinoの最小モデル

##ラズパイ・ゼロ
link: [[1]](http://qiita.com/mopp/items/826f192095961c811690)
ラズパイの最小モデル

##ラズパイ・3
link: [[1]](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/) [[2]](https://raspberry-pi.ksyic.com/news/page/nwp.id/24)
ラズパイにwifiとBLEが付属されたモデル。

##C.H.I.P
link: [[1]](http://japanese.engadget.com/2015/05/10/9-chip/)
小型PC。発送は7月以降予定？

## TWE-Lite
link: [[1]](http://mono-wireless.com/jp/products/TWE-001Lite.html)
とても小さい。Eclipseとgccで開発できるようです。2.4GHz帯無線で通信できるそうです。

## Adafruit Trinket
link: [[1]](https://www.adafruit.com/product/1501)
Arduino互換の小さいボード
開発はAVRdudeとArduino IDEでできるそうです。

## Intel Quark Microcontroller Dev Kit D2000
link: [[1]](http://akizukidenshi.com/catalog/g/gM-10487/)
Intelのボード。Eclipse GCCで開発。
ピン配列はArduino互換。

##その他メジャーなの
###linux board
BeagleBoard
Cubie
odroid
parallera
###IoTボード
arduino
mbed
Spark Core
Edison
Galileo

##更新履歴
- 20160430
コメントいただいたTWE-Lite、Adafruit Trinketを加筆
Postfixの設定確認をしてみる

Postfixって一旦設定するとなかなか触ることはないですが、メールサーバの移管（これもあまりすることは少ない）、ステージング環境の構築などの際、設定確認する際は、以下を確認してみると良いかも


# Postfixのバージョン確認
```
$ postconf | grep mail_version
```
```
$ /usr/sbin/postconf | grep mail_version
```


# Postfixの設定表示
```
$ /usr/sbin/postconf
```
**オプション**
- なし　⇒　現在の設定値を表示
- d　⇒　デフォルト値を表示
- n　⇒　デフォルトと異なる設定値のみ表示


# Postfixの設定ファイル
```
$ cat /etc/postfix/main.cf
```

# Postfixのプロセスオーナー確認
```
$ ps -ef | grep postfix
root      2875     1  0 15:29 ?        00:00:00 /usr/libexec/postfix/master
```
⇒　この場合、rootがプロセスオーナー


# Postfix のプロセスオーナーの locale の設定確認その１
```
$ sudo -u [ プロセスオーナー ] locale
```
#### 例
```
$ sudo -u root locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```


# Postfix のプロセスオーナーの locale の設定確認その２
```
$ sudo -u [ プロセスオーナー ] locale -a | grep ja
```
#### 例
```
$ sudo -u root locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```
UI > 線の見え方 > head2下の線は見えにくい

## 記事を読んでいてまとまりがわかりにくかった

# head1

## head2

### head3

head2の下の線が僕にはほとんど見えない。
head1の下の線は太さがあるため存在を認識できる。

記事を見ていて、head2が文書のテキストと同等に見えてしまう記事があり、どこで文書のまとまりが切れているかはっきりしなくて読みにくかった。その理由がこれだろう。

自分が同じUIを作る場合は、細い線は色を濃くする検討をするかもしれない。そのとき、head1下とのバランスは検討が必要。

この見え方はPCの解像度によるかもしれない。1024 x 768の解像度で見えていたものが、1920 x 1080では見えなくなる、など。

ヘッドの文字を少し左に表示できるだけでも見え方は良くなるが、制約があるかもしれない。

幸い右側のメニューでジャンプはできる（かつ章は把握できる）ので致命的ではない。


## 他の例

### ヘッドの文字の位置が文書と同じ

LOEではヘッドを緑色の色つきにしている。ヘッドは１段階しかない。
http://loe.org/shows/shows.html?programID=12-P13-00042
> Debate #2 and Energy

Zynq LinuxのWikiでは黒文字だがヘッドがまだわかりやすい。太字とフォントがQiitaとは違うのだろうか。ヘッドはゴシック体なのかもしれない。
http://www.wiki.xilinx.com/Zynq+Linux#x-Zynq Linux Kernel

<hr>
(追記 2016/01/25)
head2下の細い線が見えるモニタと見えないモニタがあると気づいた。

- 線が見える
  - EIZO EV2750-BKR (2560 x 1440) on MacOS X 10.8.5
- 線が見えない
  - RDT23IWLM, RDT232WLM (1920 x 1080) on  Windows 8.1 pro (64bit)
  - RDT23IWLM, RDT232WLM (1920 x 1080) on Windows 7 pro (64bit)

ブラウザはいずれもChrome使用。

良いモニタでデザインした時には見えていて、ユーザ環境で見た時に見えない場合があるかもしれない。ソフトウェアを作る時の注意点かもしれない。
キーワード引数の引き回し

## まとめ

ライブラリのラッパー関数において、呼び出し元からライブラリに渡すパラメータを制御したい場合に、`**` を活用すると、渡したいパラメータが増えてきてもいちいち引数を追加して回らなくて済むようにできる。

## キーワード引数

```py
def func(k1,k2):
    print("%s".format(locals()))
```

という関数を呼ぶとき、普通の呼び方

```pycons
>>> func("v1","v2")
{'k2': 'v2', 'k1': 'v1'}
```

に対して、

```pycons
>>> func(k1="v1",k2="v2")
{'k2': 'v2', 'k1': 'v1'}
```

のように `key=value` の形で与える引数をキーワード引数と呼ぶ。

関数呼び出し時の順序を入れ替えてもkeyが合うところに値を渡してくれる。

```pycons
>>> func(k2="v2",k1="v1")
{'k2': 'v2', 'k1': 'v1'}
```

引数のデフォルト値が指定されていない場合、引数が足りないと例外が発生する。

```pycons
>>> func(k1="v1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes exactly 2 arguments (1 given)
>>> func(k2="v2")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes exactly 2 arguments (1 given)
```

キーワードが重複した場合とか、引数名で使われていないキーワードを指定した場合はエラーになる。

```pycons
>>> func(k1="v1-1",k1="v1-2")
  File "<stdin>", line 1
SyntaxError: keyword argument repeated
>>> func(k3="v3")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() got an unexpected keyword argument 'k3'
```

## 辞書を与える

key=value と指定する代わりに、辞書の手前に `**` を付けたものを与えて

```pycons
>>> func(**{"k1":"v1","k2":"v2"})
{'k2': 'v2', 'k1': 'v1'}
>>> func(**{"k2":"v2"})
{'k2': 'v2', 'k1': 'd1'}
```

のように呼ぶことができる。

二つの書き方を混ぜることもできる：

```pycons
>>> func(k1="v1",**{"k2":"v2"})
{'k2': 'v2', 'k1': 'v1'}
```

## 辞書を受け取る

関数の定義において最後の引数を `**name` の形で書くと、キーワード引数の辞書を受け取ることができる。

```py
def func(k0, **kwargs):
    print("{0}".format(locals()))
```

呼び出しは

```pylons
>>> func("v0")
{'k0': 'v0', 'kwargs': {}}
>>> func("v0",k1="v1",k2="v2")
{'k0': 'v0', 'kwargs': {'k2': 'v2', 'k1': 'v1'}}
>>> func(k0="v0",k1="v1",k2="v2")
{'k0': 'v0', 'kwargs': {'k2': 'v2', 'k1': 'v1'}}
>>> func(**{"k0":"v0","k1":"v1","k2":"v2"})
{'k0': 'v0', 'kwargs': {'k2': 'v2', 'k1': 'v1'}}
```

のようにできる。ただしキーワードを付けないと

```
>>> func("v0","v1","v2")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes exactly 1 argument (3 given)
```

のようなエラーになるのでそこだけ注意すること。

## ラッパーでのパラメータの引き回し

例えば、 requests.get()

```
get(url, params=None, **kwargs)
```

をラップして body を返す関数

```
import requests

def get_body(url):
    r = requests.get(url)
    return r.text

if __name__ == '__main__':
    print(get_body('http://qiita.com'))
```

があったとして、timeout を指定したいとなったときに

```
import requests

def get_body(url, timeout=None):
    r = requests.get(url, timeout=timeout)
    return r.text

if __name__ == '__main__':
    print(get_body('http://qiita.com', timeout=0.1))
```

としてもよいが、これだと将来 headers とか proxies も指定したいとなったときに引数を増やして回る必要が出てしまう。一方、

```
import requests

def get_body(url, **kwargs):
    r = requests.get(url, **kwargs)
    return r.text

if __name__ == '__main__':
    print(get_body('http://qiita.com', timeout=0.1))
```

のようにしておくとその必要がない（引数の仕様を知るには中で呼んでいるライブラリ関数の仕様を見ないといけなくなるので、何をラップしているかの情報がわかりやすいようにしておく必要はある）。ちなみに例で使った requests.get 自体も requests.request のラッパーになっていて、上と同じ方法でパラメータの引き回しがされている。

## 参考文献

* https://docs.python.org/2/tutorial/controlflow.html#keyword-arguments
シェルスクリプト　その５

今回はコマンドについてのメモです。

・コマンドの基本的な書き方" command [option] [parameter] "

・オプションは一文字のアルファベットでハイフン(-)をその前に置く。

・複数オプションは個別に書けるがまとめて書くようにしよう。例："-abc"(順不同)

・引数を確実に認識させるには引数の前に"--"を書くこと。

・"getopt"コマンドはオプションの解析やチェックに使用。今のところ必要性は感じないが後に必要になれば復習したい。

・フィルタコマンドは標準入力からデータを受け取り変更を加えて標準出力に書き出す。
　メリット：複数経由させることで複雑なデータ変換処理ができる。

・"sed"コマンドは標準入力からデータを受け取り編集後の結果を標準出力に書き出す。
　メリット：編集方法をコマンド行に書ける。
　実例：　$sed -e "s/abc/def" infile > outfile

・"s"から始まることで認識するためクォテーション内の"/"は"."などに変えても良い。

・実例では上から検索をかけて一番目に見つけた"abc"という文字列を"def"という文字列に置き換える。

・"s"はsabstitute(置き換え)のこと

・"-e"オプションはその後の文字列が編集用コマンドだと指定する

・すべての同一の文字列を検索して置き換えるときはクォテーションの最後に"g"をつける。
　実例： "s/abc/def/g"

・"-n"オプションは支持した行だけを標準出力に出す。

参考資料：入門UNIXシェルプログラミング　改訂第２版　第６，７章（発行所：SBクリエーティブ株式会社）

[シェルスクリプト　その１](http://qiita.com/woolon/items/7bcfa18320f0abd74ca0)
[シェルスクリプト　その２](http://qiita.com/woolon/items/c69482474ba1564d5057)
[シェルスクリプト　その３](http://qiita.com/woolon/items/59c26dcb040adefae0f3)
[シェルスクリプト　その４](http://qiita.com/woolon/items/514db422f8ccea0ca94c)
[シェルスクリプト　その６](http://qiita.com/woolon/items/6e89c67220b9095a6414)
[シェルスクリプト　その７](http://qiita.com/woolon/items/4e3c986587f428742b79)
TS-220のcronでPythonスクリプトを実行

#この記事について
TS-220のcron機能を使って定期的にPythonスクリプトを動かしてみたくなったのでメモ。

sshでのログインはadminしかできません。スクリプトの場所は/root/python/test.pyとしておきます。
（QNAPのNASは再起動すると/root内などの余計なファイルがクリアされるので、恒久的に動かし続ける場合は別の場所にスクリプトを配置するか、autorun.shを編集しましょう。）

参考
[Add items to crontab](http://wiki.qnap.com/wiki/Add_items_to_crontab)

##テストスクリプト
```py:test.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open("hoge.txt", "w")
f.write("hello python")
```
起動すると同じフォルダにあるhoge.txtに"hello python"と記入します。

##crontabの編集
`[~] cd /etc/config`
で移動し、
`[~] vi crontab`
で以下のように1行追加します。このようになったのは、いろいろ試してみた結果これが一番良く動いたので。出力をlog.txtに吐くようにしています。
`*/2 * * * * cd /root/python/; python test.py >> log.txt 2>&1`

##crondの再起動
`/etc/init.d/crond.sh stop
/etc/init.d/crond.sh start`


##
chrome > 時計が遅れています / 時計が進んでいます

```txt:動作環境
Windows 8.1 pro (64bit)
```

chromeを使っていて以下のメッセージが出る時があった。
googleで検索をした直後に出た。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/707cdebf-3301-4130-3f6d-03c26d64fce3.png)

直前にやったこと

- 時計変更機能のソフトをいじっていた
- 日付を手動設定しなおした

問題は年が2016年でなく2015年としてしまっていたことだった。

反対にPCの日時を2017年にすると「時計が進んでいます」というメッセージが表示された。

google検索時に日付を何かの処理に使っているようだ。そのため、日付範囲のプロテクトをしているのだろう。

日付を扱うソフト実装時に検討することになる。
RubyをインストールせずにdockerでGitHub Pagesのプレビュー環境を作るメモ


## はじめに

[GitHub Pages](http://jekyllrb-ja.github.io/docs/github-pages/)便利ですよね。
でもブラウザから直接GitHubのサイトを開いてファイルを編集しちゃうと
すぐに公開されちゃうんですよね。
([prose](http://prose.io/)とか使えばいいんだろうけどGitHubのアカウント権限を結構要求されるから抵抗がある)

やっぱり実際に表示されるページをブラウザで確認しておきたい。
特にすでに公開済みのPagesを編集するときは確認しないと不安。


* 手早くGitHub Pagesをプレビューしたい
* でもjekyll(rubyも)を用意するの面倒

でも我らにはdockerがあるじゃないか :smirk_cat: 
ということでサクッとプレビュー環境作ります。

dockerとdocker-machineがインストール済みなら数分で出来ます。

## 前提条件

* GitHub Pagesのソースは手元にclone済みであること
* dockerとdocker-machineが利用可能であること
  (今回はドライバに[さくらのクラウド用ドライバ](https://github.com/yamamoto-febc/docker-machine-sakuracloud)を利用)


## 手順

1. jekyll用dockerホスト作成(`docker-machine create`)
2. sshでポートフォワード(`docker-machine ssh`)
3. dockerホストでjekyllコンテナ起動(`docker build`と`docker run`)

## 手順(それぞれの詳細) 

### 1. jekyll用dockerホスト作成

docker-machineで作成します。
ドライバはなんでもいいですが、今回はさくらのクラウドを使いました。
さくらのクラウド用ドライバの使い方は[こちら](http://qiita.com/yamamoto-febc/items/4aff7472fc1ea025db0a)を参照してください。

```bash
# dockerホスト作成
$ docker-machine create -d sakuracloud \
    --sakuracloud-access-token=[ACCESS TOKEN] \
    --sakuracloud-access-token-secret=[ACCESS TOKEN SECRET] \
    sakura-pages

# dockerコマンドから作成したdockerホストを使う
$ eval $(docker-machine env sakura-pages)
```

### 2. sshでポートフォワード

jekyllが使うポート(4000番)をsshでポートフォワードします。

```bash
$ docker-machine ssh sakura-pages -f -N -L 4000:localhost:4000
```

`docker-machine ssh`はsshコマンドへのオプションをdockerホスト名以降に指定可能です。今回は以下を指定しています。

`-f` : バックグラウンド実行
`-N` : リモートコマンドを実行しない
`-L` : ポートフォワード。localhostの4000番への着信をリモートホストの4000番へ。

### 3. dockerホストでjekyllコンテナ起動

GitHub Pagesのソースの置いてあるディレクトリで作業します。

#### Dockerfileの作成

以下のDockerfileを作成します。

```Dockerfile
# jekyllイメージ(GitHubPages用)を指定
FROM jekyll/jekyll:pages

# カレントディレクトリのファイルをイメージへコピー
COPY . /srv/jekyll
```


数回ソースを修正することがありそうなため簡単なシェルスクリプトにしておきます。
`preview.sh`を以下内容で作成します。

```bash:preview.sh
#!/bin/bash

DOCKER_IMAGE_NAME="github_pages_static_preview"
DOCKER_CONTAINER_NAME="github_pages_static_container"

# もし起動しているコンテナがあれば削除
if [[ $(docker ps -a | grep $DOCKER_CONTAINER_NAME) != "" ]]; then
  docker rm -f $DOCKER_CONTAINER_NAME 2>/dev/null
fi

# カレントディレクトリのDockerfileを使ってイメージ作成
docker build -t $DOCKER_IMAGE_NAME .

# コンテナ起動(dockerホストの127.0.0.1:4000をコンテナの4000番へ)
docker run --rm -it \
  --name $DOCKER_CONTAINER_NAME \
  -p 127.0.0.1:4000:4000 \
  $DOCKER_IMAGE_NAME \


```

ポイントは`docker run -p 127.0.0.1:4000:4000`の部分ですね。
この指定により外部からは4000番ポートに繋がらなくなってます。
プレビューだから公開したくないですもんね:+1: 

あとは実行してブラウザで`http://localhost:4000/`へアクセスしてみましょう。

```bash
$ # 初回だけ chmod +x preview.sh
$ ./preview.sh # jekyllコンテナがフォアグラウンド実行される。終了は`Ctrl + c`

```

![kobito.1453604431.352578.png](https://qiita-image-store.s3.amazonaws.com/0/20668/206b7ece-c97e-57f7-6834-7ebf8dc3c21c.png "kobito.1453604431.352578.png")



## おまけ

環境によってはfswatchやinotifywait、gulpなんかでファイル変更を
監視して毎回コンテナ作成+コンテナ起動をするのも良さそう。

以上です。Enjoy!:+1: