OmniAICreator/Qiita-1.07M huggingface dataset:
Gmail の DKIM (DomainKeys Identified Mail) を AWS Route53 に登録する方法


迷惑メール対策として、DKIM を DNS に登録するのは良い方法です。
Gmail の DKIM を Routes 53 に登録する方法の忘備録メモです。

- Google Apps 管理画面にログイン
- [管理コンソール] - [アプリ] - [G Suite] - [Gmail] - [メール認証]メニューと順番にクリック
- DKIM を生成したいドメインを選択
- 「新しいコードを生成」をクリック
- コードが生成されるので、DNS ホストの名前 (TXT レコード名) をコピー
- Google Apps の DKIM の設定画面は開いたままにしておく
- TXT レコード値をコピペし文字列を下記のように作業
    - 文字列を最初の 255 文字と残りの文字で分ける
    - 100文字ごとに半角引用 ("") マークで囲さんで、その間を半角スペースで空ける
    - 合計3分割する
- AWS Routes 53 にログイン
- 希望のドメイン Host ゾーンをクリック
- "Create Record Set" で新規レコードを作成
- Name に DNS レコードの「google._domainkey」もしくは変更した場合はそれを記入
- Valueに前述のテキストを1行で貼付け
- Google Apps の DKIM 設定画面に戻る
- 「認証」ボタンを押して認証する


## 参考

DNS レコード

DNS ホストの名前 (TXT レコード名) のデフォルトは
google._domainkey

TXT レコード値が

```
v=DKIM1; k=rsa; p=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

だったとしたら

```
"v=DKIM1; k=rsa; p=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

と約100文字毎に、引用マークで3分割して設定することで Gmail の認証が通りました。

（理論上は2分割だけで Gmail での認証で通るはずなのですが、なぜかエラーが出て、3分割しないと認証が通りませんでした)
Exchange Online(Office365)への移行テスト

#Exchange Onlineへの移行に際して、一部のアカウントだけExchangeOnlineを使用する方法

ActiceDirectory、Exchangeサーバーなどを使っていない環境でExchangeOnlineへ移行しようとした時、使用感や移行しても大丈夫なのか？といった検証をしたかったので管理している一部のアカウントだけをExchangeOnlineに移したかった。

MXレコードをexchange onlineに向ければ簡単にできるのだろうが
一部のアカウントだけをまず移したかったので下記のように既存のメールサーバからexchange onlineへ対象のユーザだけ転送するようなイメージとする

具体的には下記のようなイメージ

```lang:virtusertable
test1 test1
test2 test2@***.onmicrosoft.com
test3 test3
```

##前提
ActiceDirectoryを導入していない
Exchangeサーバーを導入していない
DNSを管理している（お名前.com、Route53など自分で設定変更できればOK）
※ActiceDirectoryとかExchangeサーバーが既に運用されているならもっとよい方法がありそう。個人では高くて無理だよね。。。

##無料登録
https://signup.microsoft.com/Signup?OfferId=B07A1127-DE83-4a6d-9F85-2C104BDAE8B4&dl=ENTERPRISEPACK&culture=ja-JP&country=JP&ali=1
でまず無料登録。
このとき発行されるのが「＊＊＊＠＊＊＊.onmicrosoft.com」といったドメインの物。
ただしこのアドレスでは、ドメインが違うので普段と同じように使用できるか？といった検証はできない。

##普段使用しているドメインをExchangeOnlineに登録する
###ドメインの登録
[Office365のAdmin center](https://portal.office.com/)にて設定＞ドメインと開き、ドメインの追加を押下する
するとドメインの追加画面が開くので追加したいドメインを入力する。
ドメインの確認にてTXTレコードかMXレコードを変更してくださいと要求してきます。
MXレコードの変更は全てのアカウントを移行するような時にしかしたくないので、TXTレコードを変更する。
下記のように自分の管理するDNSのゾーンを変更する。

MS=の値は確認画面で表示されますのでそれを使用ください。

```lang:zoneファイル
IN      TXT     "MS=ms******"
```

DNSの設定が完了した後、office365の設定画面に戻り、確認を押下すると確認がとれましたと表示されます。
引き続きDNSの設定変更を要求してきます。

今回はexchange onlineだけなので関係あるものだけ追加しました。

SPFにはinclude:spf.protection.outlook.comを追加
autodiscoverを追加

```lang:zoneファイル
@ IN      TXT     "v=spf1 +ip4:既にある設定 +ip4:既にある設定 include:spf.protection.outlook.com ~all"
autodiscover        IN      CNAME   autodiscover.outlook.com.
```

上のような感じです。
mxレコードを変更してください等言われますがこの時点では無視でよいです。
以上でドメインの登録は完了です。

###ホワイトリストの登録
転送元メールサーバからのメールを常に許可します。検証後、本格的に稼働させた（MXレコードの書き換え）後は不要になると思います。

管理センターよりExchangeを選択し、Exchange管理センターを開きます。
左メニューの保護を選択し、接続フィルターを開き、鉛筆ボタンにて編集を開きます。
接続フィルターのIP許可一覧に転送元メールサーバのIPを記載します。

###中継の登録
本格稼働までは今までのメールサーバを中継させるため、その設定をします。
メールフロー＞承認済みドメインと辿り、今回追加したドメインを選択、編集します。
「この承認済みドメインの定義：」とあり、「権限あり」「内部の中継」ラジオボタンが並んでいると思います。
「権限あり」が選択されていると思うので「内部の中継」に選択をあわせてください。

###ユーザの設定変更
受信者＞ユーザ選択＞編集画面
と遷移し、メールアドレスの追加画面を＋で開いてください。
SMTPのメールアドレスを使用したいメールアドレスに変更作業してきたドメインに変更します。

##メールサーバの転送設定
既存のメールサーバへきたメールを365に飛ばします。
sendmailなら下記のようなイメージになります。

```lang:
test@ドメイン名              test@******.onmicrosoft.com
```

以上

##参考
https://kero3.wordpress.com/2015/10/06/pop%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%81%8B%E3%82%89office365exchange%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C/
機械学習　トレーニングデータの分割と学習・予測・検証

機械学習を、 [PyData.Tokyoのチュートリアル#1](https://github.com/PyDataTokyo/pydata-tokyo-tutorial-1) を元に勉強したり、教えていると、トレーニングデータの分割から、学習・予測・検証の部分がわかりにくいと感じています。
この部分の解説をします。

# 前提条件

- 教師あり学習を行う -> つまりラベル付きデータがある
- データセットはある程度の数がある -> このチュートリアルでは、890件
- テストデータを 20% 残して学習し検証する
- 特徴行列は多次元(当たり前のことだが・・)
- sklearn(scikit-learn)を使う
- ロジスティック回帰で推定を行う
- 詳細のコードは、[PyData.Tokyoのチュートリアル#1](https://github.com/PyDataTokyo/pydata-tokyo-tutorial-1) の `pydatatokyo_tutorial_ml.ipynb` を参照のこと


# トレーニングデータの分割

特徴行列を `X`
クラスラベルデータを `y`
としたときに、以下のように行うと、データ分割が可能

```python
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, train_size=0.8, random_state=1)
```

![機械学習データの分割2.png](https://qiita-image-store.s3.amazonaws.com/0/47908/74e10c91-88e2-9d1b-e25a-49256c773830.png "機械学習データの分割2.png")



- X_train : 学習用特徴行列 (80%)
- X_val : 評価用特徴行列 (20%)
- y_train : 学習用クラスラベル (80%) 未知のデータ
- y_val : 評価用クラスラベル (20%)　未知のデータの答え合わせに使う (隠し持っておく)



# 学習・予測・検証

## 分類器(学習器)の初期化

```python
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
```

clf を初期化して、以下の学習・予測・検証に使っていきます。

## 学習

```python
clf.fit(X_train, y_train)
```

初期化されたclfのfitメソッドを使って、学習させる
データは80%の学習用データに特徴行列とクラスラベルを与える

## 予測

```python
y_train_pred = clf.predict(X_train)
y_val_pred = clf.predict(X_val)
```

clfのpredictメソッドで予測をします。

- `y_train_pred` : 学習用データで改めて予測を行った結果
- `y_val_pred` : 評価用データで予測を行った結果

ここまで、 `y_val` を使っていない。つまり、 `y_train` が未知データとして扱われている



## 評価・検証

```python
from sklearn.metrics import accuracy_score
train_score = accuracy_score(y_train, y_train_pred)
val_score = accuracy_score(y_val, y_val_pred)
```

`accuracy_score` には、 `クラスラベルデータ` と `上記の予測結果` を与え、正答率を出力

- train_score : 学習用データで予測を行った結果
- val_score : 評価用データで予測を行った結果　未知のデータで予測を行ったことになる
jQueryMobile で 外部jsが2度実行される時の対策

jQueryMobileを触る事があったので、備忘録

head内にかけば問題無いのだけど、
どうしてもbody内に記述する場合に使用する。

```
document.addEventListener('DOMContentLoaded', function (evt) {
~~~~何かの処理
});
```
vagrant up で起動できなくなった

ちょっとハマったのでシェア。
何かをキッカケに vagrant up で起動できなくなった。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: E_FAIL
VBoxManage.exe: error: Failed to create the host-only adapter
VBoxManage.exe: error: SetupDiCreateDeviceInfo failed (0x00000005)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleCreate(struct HandlerArg *)" at line 71 of file VBoxManageHostonly.cpp


Failed to host-only adapter とあるので、ネットワーク設定をコメントアウトして vagrant ssh してみると起動できた。

$ vi Vagrantfile
  config.vm.network "private_network", ip: "192.168.33.10"
    ↓
  #config.vm.network "private_network", ip: "192.168.33.10"

$ vagrant ssh


気になったので Windows のスタートメニューから「ネットワーク接続」を開き、「VirtulBox Host-Only Network」のプロパティを確認すると、なんとIPv4アドレスが 192.168.56.1 となっていた。デフォルトは 192.168.33.1 なんですけどー

思い当たるフシがあって、おそらく ViretulBoxのアップデートを一度アンインストールせずにしたためか、またはDockerをインストールしたためか。

とりあえずは vi Vagrantfile して、IPアドレスを書き換えることで対処。

$ vi Vagrantfile
  #config.vm.network "private_network", ip: "192.168.33.10"
    ↓
  config.vm.network "private_network", ip: "192.168.56.10"

$ vagrant up
オラオラ (自社)式 git-flow 概要

# オラオラ式 git-flow
一昨年くらいから、gitを導入して運用方法等を考えていました。

git-flowであったり、Github-flowだったり色々運用法はいっぱいあると思うんですけど、やっぱり今いる会社では、git-flow、Github-flowを取り入れて運用するのは難しい

## git-flow
### 予想される問題点
- 新規開発が多く、納品完了後の運用がすくないから、ブランチを多く分ける必要性がそんなに無い
- シンプルなフローにしないと全員に浸透せず、ミスが起こる

### 良さそうな点
- フェーズ分け公開案件時には良さそう

## Github Flow
### 予想される問題点
- １つの作業が終わったら、そのブランチ最後に消す（自社は、新規案件多めなので、１つ作業が完了するまでに長い時間がかかる。）
- masterしか存在しないため、誰かが間違ってmasterにpushしかねない

### 良さそうな点
- ブランチの数も考え方もシンプル

っていう、（自社の）問題が多かったので、実際にはどっちも使わず、独自のフローを構築してやっていってるのが現状。

特に「シンプルなフローにしないと全員に浸透せず、ミスが起こる」と「masterしか存在しないため、誰かが間違ってmasterにpushしかねない」って部分は矛盾しているんだけどね

どっちつかずなオラオラ式運用を自社では行っています。

## オラオラ (自社)式 git-flow 概要

### 主なブランチ
1. masterブランチ（常時デプロイ可能）
2. dev_masterブランチ（開発サーバ用ブランチ）
3. preview_masterブランチ（クライアント公開サーバ用ブランチ）
4. ○○_workブランチ（個人作業ブランチ）

### 運用法
- 何か作業が発生するなら、masterをクローン後、○○_workブランチを作成
- 移行自分の作業があるなら、全て○○_workブランチを使用する
- 他の人のコミットが欲しい時は、○○_workブランチでマージを行う
- アップして確認に出したいときは、dev_masterブランチ、previewブランチにマージ
- 確認が取れたら、masterにマージ
- ○○_workブランチは削除せず、そのまま保持

### 良い点
- 個人作業ブランチがあるので、間違ってmasterにpushが無い
- デフォルトで用意するブランチ数も多くなくてシンプル
- git使っていなかった時の作業フローとたいして変わらない

### 問題点
- お互いの個人作業ブランチをマージするので、コンフリクトしやすい
- マージする回数が増える
- マージし忘れが起こりやすい
- 誰かがやらかしたコード書くと、マージするのが怖くなる
- デプロイ系が手動なので、とりまとめが大変

現状としては、まだまだ問題はあるものの、安定して開発を進められています。
Azure に　デプロイしてみる

# 何か始めねば。

藁から始めよう。
ちょっと作ってみたいものが思いついたので、そそくさと手を動かして公開するまでもっていく練習を兼ねて。
公開先をせっかくアカウントとったのに無料期間に何もできなかったAzure様への公開を目標としました。

# ネタをどうするか。

丁度いまやってるゲームで、こういう見え方したらいいよなってデータが無いので作ってみる。内容は至極簡単なリンク。
参照データはがんばってCSV化。
CSVを読み込んで、データ一覧からLINQでほしいデータを抽出して並べるだけの簡単なプログラムです。
今回はASP .NET MVC 4 をつかって、VS2010から開発。
ん？なんでいまさらそれなのかって？
PCに隙間が無くて最新のVS入れられなかったの！
というわけで、プログラムは雑なので省略。
本当はさらにきれいな見た目を作りこめればjsフロントエンドの勉強にもなっただろうけど、そこまではしません。

# Azureに上げてみる。
ここからが本題。そのまえにアップロード先を作らねばいけません。
なにぶん、アカウントを作って放置しっぱなし、もちろん無料期間は過ぎています。なお、AzureのアカウントつくったらMSさんから直々にワタクシの携帯に電話が入り「どんなブツ作るか話聞かせてもらおうか？」とアンケートがあったのが一番びっくりしました。
（いえ・・・とりあえず登録しただけでもやっとしてるだけですって答えたよ！）

なので、使用期間のサブスクリプションを、従量課金へグレードアップしました。

次に「アプリケーションが動く場所」を作ります。
無料で使えるのはWebAppなので、そいつを使いましょう。

ポータルの左側からWebAppを選択。
追加を押すと候補がいっぱい出てきます。本当はちゃんと選択したほうがいいですが、一番汎用性高そうなWeb Appを選択しました。
概要が出るので、作成を押します。
必要事項を記入します。
アプリ名（被らないようにちゃんと使えるものをチェックしてくれるよ！）
サブスクリプション
リソースグループ
App Servise プラン/場所

ここでプランと場所を選ぶんですが、初期設定値がS1になってました。
無料じゃないやつです。ちゃんと選択し直しましょう。
なお、選択しようとしても有料プランのみのおすすめが出てきやがりましたが、下のほう名でスクロールするとちゃんとFreeがあります。

あとは作成しちゃえば1分かからず準備完了です。
共通だからか早いもんですね。

# アップロードしよう
今回はVisual Studio 2010を使いました。
ソリューションを右クリックすると、発行のメニューが出てきます。
今回はFTPを使ってのアップロードをしてみました。

Azure側でも、FTPの受入設定が必要です。
App Servideのメニューから、**デプロイ資格情報**を選択します。
FTPのアカウントとパスワードを設定する画面が表示されるのでお好みのユーザ名とパスワードを設定します。セキュリティには気を付けて。

これで設定すると、App Serviceのメニューより**プロパティ**を選択するといろいろと初期設定値が出てきます。
この情報を、VS2010の発行ウィザードに登録します。

この時、対象のパスにFTPホスト名をそのままぶっこむと、アップロード先が公開フォルダになってくれませんでした。そりゃホスト名だもの、そうなるよね。

なので、公開先はホスト名＋site/wwwrootをつけておきましょう。

なんど発行してもファイルが更新されないぞってなってました。

#これで稼働確認！
とおもったら、エラーがでてました。
詳細を見るために、Web.configにCustomeError="off"を追記します。
よくみると、必要なDLLとデータフォルダが足りてませんでした。
必要なDLLは、参照設定のローカルコピーをTrueにする→再度発行で対応できました。
データフォルダは発行対象に含まれていなかったので、今回は直接FTPでアップしました。

このへん、うまいことやる必要がありますね。

#動け！動いてくれ！
はい、結果すんなり動きました。
あっさり動くもんです。今回は最も相性のいいと思われるASP .NET MVCをつかったからか、本当に苦労なくできました。

#それよりも一番気がかりなのが
AWSで大量課金発生とかの記事を読んだことがあったので、クラウドサービス使うのって怖いのが問題かもしれない。

#やれば、できる。
やらなきゃ、できない。当たり前ですが。
実際、ちょっと仕事から逃げたい気持ちが強かったんですが、こうやって簡単ながらも動くものを作ったことで、なんか、こう、すごくスッキリして仕事が手につくようになりました。
「区切りをつける」ことの重要さを学んだ気もします。
Android端末にインストール可能なDER形式の自己証明書作成

opensslはインストール済みの前提。

1.秘密鍵の作成作成

```
$openssl genrsa 2048 > server.key
```

2.　CSRファイルの作成

```
$openssl req -new -key server.key > server.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Fukuoka
Locality Name (eg, city) []:Fukuoka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```

3.　証明書の作成

```
$openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 3650 -extfile v3.ext
```

**※v3.extは以下の内容であらかじめ作成**

```
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:TRUE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
```

keyUsageの内容は以下のサイトがわかりやすかったです。
http://oxynotes.com/?p=4516

4.証明書のチェック

```
$openssl x509 -in server.crt -text -noout  
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            8a:・・・
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, ST=Fukuoka, L=Fukuoka, O=Company, CN=example.com
        Validity
            Not Before: Feb 22 02:18:10 2017 GMT
            Not After : Feb 20 02:18:10 2027 GMT
        Subject: C=JP, ST=Fukuoka, L=Fukuoka, O=Company, CN=example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:・・・
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Authority Key Identifier: 
                DirName:/C=JP/ST=Fukuoka/L=Fukuoka/O=Company/CN=example.com
                serial:・・・

            X509v3 Basic Constraints: 
                CA:TRUE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
    Signature Algorithm: sha1WithRSAEncryption
        93:・・・
```

5.DER形式に変換

```
$openssl x509 -in server.crt -out server.der.crt -outform der
```

6.Android端末にserver.der.crtをコピー

7.設定->セキュリティ->SDカードからインストールから、server.der.crtを選択

8.信頼できる認証情報->ユーザーに証明書が追加されていることを確認。
複数の物理インタフェースに来ているトラフィックを1つの仮想インタフェースで見たい場合


普通あまりない状況かもしれませんが、忘れると思うのでメモ。

# 概要
例えばスイッチでSPANしたい時に、スイッチが複数あってサーバ側も複数のインタフェースに繋がないといけない時があるかと思います。
1つのセッション内で別スイッチ通るとサーバ側の別インタフェースに到達するので、NetFlowとか取ろうとすると困ります。
別インタフェースでもうまく扱ってくれるプログラムなら良いですが、自分が使ったものは別インタフェースに来たら別フローに分かれてしまって困りました。
サーバ側で何とか仮想インタフェース1つで受けられたらなぁと思い試行錯誤した時のメモです。

# 環境
- OS
	- CentOS 6.5

# 設定
まず、bondingでいけるだろうと思って試しました。
bondingは送信時はうまくいくのですが、2つのインタフェースでpromiscuousに受けている場合にbond0とかでうまく受信できませんでした。
モードとか色々変えれば出来るかもしれないので、ご存じの方がいたら教えてください。

最終的に `tc` コマンドを使ってLinux内でミラーリングしました。
`tc` は以前から使っていましたが、遅延発生させたりという用途だったのでミラーリング出来るのは知りませんでした。
`mirred` というactionがあり、それを使うとうまくできました。

今回はeth0とeth1があり、それらをdummy0にミラーリングすることにします。

まずdummy0インタフェースを作ります。

```
# vim /etc/sysconfig/network-scripts/ifcfg-dummy0
DEVICE=dummy0
BOOTPROTO=none
ONBOOT=yes
PROMISC=yes
# service network restart
```

次にeth0とeth1を一応promiscuous modeにしておきます。
必要ない気がしますが、一応やってます。

```
# ifconfig eth0 promisc
# ifconfig eth1 promisc
```

永続化したい場合は設定に書いておけば良いです。

```
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
PROMISC=yes
```


最後に、ミラーリングの設定をします。

```console
# tc qdisc add dev eth0 ingress
# tc filter add dev eth0 parent ffff: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 1:1 \
   action mirred egress mirror dev dummy0
# tc qdisc add dev eth1 ingress
# tc filter add dev eth1 parent ffff: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 1:1 \
   action mirred egress mirror dev dummy0
```

これで完了です。

dummy0で見ると、eth0とeth1のパケットが流れてきていることがわかります。

```
# tcpdump -i dummy0
```



# 参考URL
- http://serverfault.com/questions/225178/copying-packets-from-an-interface-to-another
- https://adamkuj.net/blog/2016/05/18/pro-tip-port-mirroring-in-linux/
- http://chamaken.blogspot.jp/2011/04/port-mirror-on-linux.html
Raspberry PiでDHCPサーバを立ち上げる


クラウドからコマンドを受けHueを制御するために、Raspberry Piをゲートウェイとし、有線LANポートに接続したHue BridgeにDHCPでIPアドレスを割り当て、無線LAN側からインターネット接続する。
以下のような構成を実現する。

![Hue_Raspi構成.png](https://qiita-image-store.s3.amazonaws.com/0/29493/ec9cf86a-02e0-70f2-809c-45a115a3a2ce.png "Hue_Raspi構成.png")

DHCPサーバのインストール

~~~
sudo apt-get install isc-dhcp-server
~~~

/etc/dhcp/dhcpd.confの最下行に下記を追加する

~~~
option domain-name "raspberry.local";
option domain-name-servers 192.168.1.1;
subnet 192.168.9.0 netmask 255.255.255.0 {
        option routers 192.168.9.1;
        option subnet-mask 255.255.255.0;
        range dynamic-bootp 192.168.9.2 192.168.9.254;
}
~~~

eth0をDHCPサーバで利用する
/etc/network/interfacesを編集
おそらく最初は下記のようになっているはず

~~~
iface eth0 inet dhcp
~~~

これをstaticに変更する

~~~
#iface eth0 inet dhcp
auto eth0
iface eth0 inet static
address 192.168.9.1
network 192.168.9.0
netmask 255.255.255.0
broadcast 192.168.9.255
gateway 192.168.1.1
~~~


[参考URL](http://www.soramimi.jp/raspberrypi/etherconv/)

DHCPサーバの状態を確認

~~~
sudo service isc-dhcp-server status
~~~

DHCPサーバを無効にする

~~~
sudo update-rc.d isc-dhcp-server disable
~~~

DHCPサーバを有効にする

~~~
sudo update-rc.d isc-dhcp-server enable
~~~

[参考URL](http://raspberrypi.stackexchange.com/questions/22297/disabling-dhcp-server)

Hue Bridgeからインターネット接続するためのルーティング設定は後日更新します。
SlackでGET WILDリアクションを自動化する

# 概要
* 私が入ってるslackチャンネルはよく`GET WILD`リアクションをされます
* 新しく入った人を歓迎するとき。
* お前ちょーGETWILDじゃん！と賛辞するとき。
* それを自動化したい

<br>
<img width="414" alt="スクリーンショット 2017-02-22 15.05.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/29405/ef2fdf2a-dfc3-a2b3-87ff-6748148935c5.png">

# 内容
## ①slackのWebAPI用tokenを作る
* 「slack token」でググると簡単に作れると思います。

## ②対象のチャンネルを取得する
```bash
### 通常
$ curl -s "https://slack.com/api/channels.list?token=TOKEN入れてね" | jq . 

### privateチャンネル
$ curl -s "https://slack.com/api/groups.list?token=TOKEN入れてね" | jq .
```

## コード書く
```bash
$ vim slack_reaction_getwild.sh
#!/bin/bash -
### usage: /bin/bash getwild.sh add 1
# $1: add or remove
# $2: The message of the history number
set -eu
: $1 $2

declare -r TOKEN="xxxxxxxxxxxxx"
declare -r CHANNELID="xxxxxxxx"
declare -r TARGET_MESSAGE=$2

### この絵文字はカスタムです。登録してね！
emoji=(
  "emoji_g"
  "emoji_e"
  "emoji_t"
  "emoji_w"
  "emoji_i"
  "emoji_l"
  "emoji_d"
)

if [[ ! ( $1 == "add" || $1 == "remove" ) ]];then
  echo -e "set add or remove!!"
  exit 1
fi

### ターゲットとなるメッセージのtimestampを取得する
### 下記はプライベートチャンネルのhistoryの取得です。
### 通常チャンネルはgroups.historyをchannels.historyに文字を変えてください
ts=$(curl -s "https://slack.com/api/groups.history?token=${TOKEN}&channel=${CHANNELID}" | jq .messages[].ts | head -n $2 | tail -1)

for i in ${emoji[@]};do
    curl -s "https://slack.com/api/reactions.$1?token=${TOKEN}&channel=${CHANNELID}&name=${i}&timestamp=${ts}" > /dev/null
done
```

## 実行
* 第１引数： add or remove
* 第２引数： 履歴の何番目のメッセージか

```bash
$ /bin/bash slack_reaction_getwild.sh add 2
$ /bin/bash slack_reaction_getwild.sh remove 2
```

<br>
![get_wild_reaction.gif](https://qiita-image-store.s3.amazonaws.com/0/29405/a79f4ffe-b00a-8749-f08d-7d6ca7f525be.gif)


# 最後に
* 次はslashコマンドにしたいです
NLog覚書　インストールから設定まで

ASP.netでWebアプリを開発している中、サーバーサイドで発生するエラーを確認する手段がなかったので、「NLog」を使う事になり、インストールから設定までを調査した内容を覚え書き。
もっと色々な設定が出来るみたいなのですが、今回は最低限の設定でシンプルに使っています。
#参考サイト
https://github.com/nlog/nlog/wiki/Tutorial
http://news.mynavi.jp/articles/2010/03/19/nlog/
http://gomocool.net/gomokulog/?p=708
http://hkou.hatenablog.com/entry/2016/03/13/194043
http://dotnetcsharptips.seesaa.net/article/418697104.html
#NLogとは
.NET環境でログ出力できるオープンソースのツール。
log4netに比べて導入が簡単なことが特徴。
#使用環境
VisualStudio 2012
.NET Framework 4.5
NLog.4.4.3
#インストール
VisualStudioのNuGetで簡単インストールしました。
1.　ソリューションエクスプローラーの「参照設定」を右クリック
2.　下記のメニューが表示されるので、「NuGetパッケージの管理」をクリク
![image](https://qiita-image-store.s3.amazonaws.com/0/67341/e0475dd9-58cd-60d8-2ac7-ec7ead374327.png)
3.　NuGetパッケージの管理画面が表示されるので、左側の「オンライン」をクリック後、右側の「オンラインの検索」に「NLog」を入力する
![image](https://qiita-image-store.s3.amazonaws.com/0/67341/5f25e336-1c73-1484-1b5e-dda40cbe3542.png)
4.　真ん中に「NLog」が表示されるので、インストールボタンをクリックする
5.　ソリューションエクスプローラーの「参照設定」の中に「NLog」があればインストール完了![image](https://qiita-image-store.s3.amazonaws.com/0/67341/edadce51-f538-5df3-a6f9-fcebdc2df594.png)
#使用前に必要な設定
1.　WebConfigのconfigSectionsへsectionタグを追加する

```c#:web.config
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  </configSections>

```

2. 引き続き、WebConfigにnlogタグを追加する

```c#:web.config
  <nlog>
    <targets>
      <target name ="logfile" type="File" filename="./Log/test.log" layout="[${longdate} ${level}]  ${message}" />
    </targets>
    <rules>
      <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
  </nlog>
```

　　taeget：出力先情報の設定
　　layout：ログ出力レイアウトの設定
　　rules：どの出力レベルに対しどのターゲットを使うかの設定

|Level|Example|
|:----|:------|
|Fatal|Highest level: important stuff down|
|Error|For example application crashes / exceptions.|
|Warn|Incorrect behavior but the application can continue|
|Info|Normal behavior like mail sent, user updated profile etc.|
|Debug|Executed queries, user authenticated, session expired|
|Trace|Begin method X, end method X etc|

#使い方
下記のように記述します。

```c#:sample.cs
using NLog;
    public class FileUploader : IHttpHandler
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();

        public void ProcessRequest(HttpContext context)
        {
            // net use 接続
            System.Diagnostics.Process open = new System.Diagnostics.Process();
            open.StartInfo.FileName = "cmd.exe";            // コマンド名
            open.StartInfo.Arguments = "/c";                // 引数①
            open.StartInfo.Arguments += cmd;               // 引数②
            open.StartInfo.CreateNoWindow = true;           // DOSプロンプトの黒い画面を非表示
            open.StartInfo.UseShellExecute = false;         // プロセスを新しいウィンドウで起動するか否か
            open.StartInfo.RedirectStandardOutput = true;   // 標準出力をリダイレクトで取得したい
            open.Start();
            open.WaitForExit();
           
            logger.Debug("net use 接続");
```

#出力結果
こんな感じに出力されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/67341/9151b409-f4f3-3ff0-e635-b258c98e0752.png)
[Unity+NCMB] SDK導入時にAndroid端末への転送に失敗する場合の対応方法

# 事例
研究開発中のアプリにNCMB対応を実装したところ、
ビルドは出来るものの、Android端末への転送に失敗する状況に遭遇。
最初にやるべき1ステップが抜けていただけなのだが、
ちょっと引っかかってしまったので備忘録として残しておく。

# 問題点
NCMBのSDKをインポートする際に、SDKに含まれる AndroidManifest.xml を使用する場合、
最低限の変更を加えないとそのままでは動作しない。

# 対応方法
1. NCMBのSDKに含まれている AndroidManifest.xml を開き、
![2017-02-22_14h33_56.png](https://qiita-image-store.s3.amazonaws.com/0/144504/4f831060-1e5f-deba-b829-278ee18abfde.png)

1. YOUR_PACKAGE_NAME となっている箇所を、
![2017-02-22_14h40_05.png](https://qiita-image-store.s3.amazonaws.com/0/144504/cb20e3c2-0646-7c94-3be0-f8e67adc65df.png)

1. UnityのPlayer Settings にある Bundle Identifier に書き換える。
![2017-02-22_14h35_37.png](https://qiita-image-store.s3.amazonaws.com/0/144504/4ee3f114-3d04-83e0-2d98-b74cf2b9a200.png)
社会人2年目までで、大事だと思ったこと

書いた人: クイックという人材系企業で営業半年、社内SEを1年半やった後、[Traimmu](https://www.wantedly.com/companies/co-media)というベンチャー企業に転職する社会人2年目。

忘れないために。

自分でも全然できていないことばかりである。
人から聞いたことや本を読んで納得したことも入っているが、これからも大切にしていきたいと思ったので書いた。

# 人と話すのは面白い

- まず、スタンスとして、人を学びの対象とすること。何かを得ようとする意識が大事。
- 深堀することを恐れないでいい。「それってどういうことですか」「何でそう思ったんですか」「例えばどんなことがあるんですか」みたいな質問をどんどんして良い。勿論、ちゃんと話を聴いてリアクションした上で、だが。
- 頭の回転、テンポに縛られなくて良い。沈黙があっても、ゆっくりでいいから、ちゃんと相手のことを理解することに努めよう。
- 枕言葉は意外と大事。「自分の浅い考えなんですが」みたいのは、使い過ぎるとやらしいが何か踏み込みたい時に使える。
- まず褒める。相手を理解しているということを示すだけで、その後に話を聞いてもらえるかが決まる。
- よほど単純な話以外、相手の話を遮らない。最後まで聞く。
- たとえ話が盛り上がらなくても、自分を責める必要は無い。「相手と合わなかっただけ」と考えるのも大事。

# 仕事を速く捌くためのコツ

- ボールを持たない。言われたらすぐやって、タスクのクオータを超えないようにする。
- すぐやる。人から言われたら、取り敢えず動く。特に簡単なタスクはすぐやって、「あいつはあんな簡単な仕事にも時間がかかるのか」と思われないようにする。
- スタートダッシュ。早目に取り掛かって、その後は流す。早く終わっても、次の仕事に取り掛からない。長期的に成果を出すためには、「常に締切を守る人」になるのが大事で、「超人的に仕事が速い人」を目指す必要は無い。
- タスクの意味を考える。「これやって」と言われた時、「これはどう役に立つのか」「これをすると何が嬉しいのか」を深堀する。「俺を動かすならそのくらい説明できるようにしろ」くらいで良い。
- 効率を上げるのはもちろん大事だが、その上でどうやってやるべき仕事を減らすか、つまり不要なタスクをしないかが大事。それが最終的な差になる。だから、これ本当にやるべきなのか、他に良い方法が無いのか、立ち止まって考えよ。
- どんな仕事でもコミュニケーション。相手が求めてるのは何か、相手に信頼され、気持ちよく働けるにはどうすれば良いか、常に考えよ。
- マルチタスクはしない。一つの仕事に集中して、一回で終わらせる。メールの二度見はまじで無駄。そのためにポモドーロを使おう。

# マインド

- 金のため、名声のため、地位のためには働かない。自分が楽しい事をする、何よりもそれを優先しよう。
- 視野を高く持つ。自分のやってることは、業界で、市場で、日本で、世界で、どうなのか、考える。その材料として、本を読んだり、人の話を聞こう。
- 正しい選択なんて、無い。自分の選択をどうやって正しくしていくか、もっと言えば都合の良い意味づけをすれば良い。何かを学び取ろうとする姿勢が大事。起こった事にくよくよするより、そこから何を得て、自分の糧にしていくかを前向きに考える。無駄な経験なんて無い、同じ空がどう見えるかは、心の角度次第だから。
Wordの目次設定で途中から追加する場合

# 手順書やらの修正を任されることがあり、その時にほぼほぼひっかるのが目次設定や段落設定。

## １　既存の段落があるので、まず改行して次の段落作成する
## ２　下記のような状態になるので元の番号にコピーして２にある「初めに」を戻してあげる。
　　　　例：　　　　1	
　　　　　　　　　　2	はじめに
## ３　戻したら目次にいき追加する。
　　　 既存で記載してある目次をコピーして下に張り付けて追加した分に修正する
　　　例：2　テスト......	43

## ４ 修正したら、上タブの参考資料の目次の更新をクリックする。
　　　「ページ番号だけを更新する」を選択する。
　　　選択するとCtrlキーを押しながら追加した目次を選択するとそのページに飛べるはず。
　　　※２の時にホームタブから段落番号で追加して目次を作成、
　　　「ページ番号だけを更新する」を選択しても「目次」と「段落番号」で紐づけはできない。
gcloudのconfigの設定変更

## 背景
gcloudのdefault設定を変更したい場合以下のdocを参考にする。sampleがなかったのでメモ書き。

https://cloud.google.com/sdk/gcloud/reference/config/set

```
gcloud config set SECTION/PROPERTY VALUE [--installation] [GLOBAL-FLAG …]
```

## サンプル
```
gcloud config set compute/region asia-northeast1
gcloud config set compute/zone asia-northeast1-a
```
Windowsでログインパスワードを忘れたときに無理やり書き換える方法

Windowsのログインパスワードを忘れた場合の解決方法は幾つもありますが, その内の1つをメモ書き程度に残しておこうと思います.

今回は以下の状況を想定しています.
1. 他に作業出来るPCがある
2. Windowsのログイン機構以外の保護は掛かっていない（BIOSパスワードなど）

※当然のことながら、他人のPCでパスワード保護を突破したりすることは犯罪です. 本投稿によって生じた全ての事象について, 筆者は責任を負いません. 必ず自己責任で行って下さい.

---

こんな感じでパスワードが設定されているけれど, 忘れてしまったアカウントがあります.

![01.png](https://qiita-image-store.s3.amazonaws.com/0/166899/1ec63b2c-786c-e62a-da2a-df543f4c900f.png)

まずは他のPCでWindows10のインストールメディアを作成します. Microsoftが配信しているものもあるので, USBでもDVDでも良いですがパスワードを忘れた環境に合わせてインストールメディアを作成して下さい.
https://www.microsoft.com/ja-jp/software-download/windows10

インストールメディアが用意出来たら, パスワードを忘れたPCに挿し, PCをシャットダウンします. その後USBからBootして起動すると以下のようになります.

![02.png](https://qiita-image-store.s3.amazonaws.com/0/166899/22c513e7-7c02-d83a-e4a9-1c456774f003.png)

この画面でShift+F10を押すとcmdが起動します.

![03.png](https://qiita-image-store.s3.amazonaws.com/0/166899/c0995ff4-2706-fe9c-a936-e14b39a2a109.png)

後は既にインストールされている領域を書き換えるだけです.

まずWindowsがインストールされているドライブを探します. デフォルトだとXドライブにいると思いますが, これはインストールメディアの上なので, 以下のようにコマンドを打って移動しましょう.

```
diskpart
> list volume
```

![04.png](https://qiita-image-store.s3.amazonaws.com/0/166899/651c7269-5714-7591-e16b-c42856b23a49.png)

するとDドライブにWindowsがインストールされていることが分かります. Dドライブに移動しましょう.

```
cd /d D:
```

![05.png](https://qiita-image-store.s3.amazonaws.com/0/166899/0bef1977-7638-ddd3-c87c-38e2aa42b785.png)

これで普段使っているドライブにアクセスすることが出来ました. 次にWindows\System32に移動し, sethc.exeをsethc_.exeにリネームし, cmd.exeをsethc.exeという名前でコピーしましょう.

```
cd Windows\System32
rename sethc.exe sethc_.exe
copy cmd.exe sethc.exe
```

![06.png](https://qiita-image-store.s3.amazonaws.com/0/166899/3d13439c-3cbb-2638-d085-fbb4fa5e2d73.png)

これで作業は終了です, コマンドプロンプトを閉じ, Windowsセットアップのダイアログも閉じて再起動して下さい.

さて, この画面に戻ってきましたが, 先程までとは違います. Shiftキーを5回押してみて下さい.

![07.png](https://qiita-image-store.s3.amazonaws.com/0/166899/21647fcb-89f2-aa7c-cc5b-7b2a728c0bc9.png)

![08.png](https://qiita-image-store.s3.amazonaws.com/0/166899/7c8b1e28-fe0f-ffe4-86e6-b23519369b4c.png)

このようにコマンドプロンプトが起動したでしょうか？ 後はパスワードを書き換えるだけです. 以下のようにすることで, パスワードを書き換えられます.

```
net user ユーザ名 新しいパスワード
```

![09.png](https://qiita-image-store.s3.amazonaws.com/0/166899/be29813f-5f57-9142-c938-e297d40798dc.png)

これで新しいパスワードでログインすることが出来るでしょう.

---

以上でパスワードを変更することが可能です.

もしより強固なセキュリティが必要だと感じた方はWindowsのログイン認証以外の保護も実施したほうが良いでしょう. 他のパスワードを掛けたり, ディスクを暗号化したり, PCに自分以外がさわれないようにすべきです.
naming > Link > Complement names must be used for complement operations > query/answer, ping/pong, ack/nackを教えていただきました

変数名の対称性について。

Readableコードに記載があったと思ったら、Code Completeの方だった。
http://www.fml.org/software/FNF/ja/function.name.reverse.html

関連して以下を見つけた。
http://geosoft.no/development/cppstyle.html
> `27. Complement names must be used for complement operations [1].
get/set, add/remove, create/destroy, start/stop, insert/delete,
increment/decrement, old/new, begin/end, first/last, up/down, min/max,
next/previous, old/new, open/close, show/hide, suspend/resume, etc.

探していたのは、「問い合わせ」と「応答」。
案としては(動詞として)
request/reply
inquire/reply
またはreplyをrespondとするなど。

http://community.rti.com/rti-doc/500/ndds/doc/html/api_cpp/group__RequestReplyExampleModule.html
http://www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.ref.adm.doc/q087830_.htm
http://www.mqseries.net/phpBB/viewtopic.php?t=3179&sid=f997aca557aff2a3f46b59d9c54ce7af
https://github.com/cnyangqi/itg/blob/3e27a1cf11a6b0753479f7e47b8395852a9757e1/WebContent/res/native/app_inquire_zh_CN.res

### 教えていただいた事項 
(追記 2017/03/22)

@tenmyo さんの[コメント](http://qiita.com/7of9/items/1ad400382c17969ecbcc#comment-d7b1d47722a0a07e093b)にて他の用法も教えていただきました。

情報感謝です。
docker-syncが動かない（El Capitan）

## 環境
▼ OSX El Capitan
▼ gem 2.6.8

## 状況
Rails製のアプリケーションをdocker上で触りたくて、docker-syncを使おうとした。

下記のように公式通りインストールして、

```
gem install docker-sync
brew install fswatch

brew install unison
```
Dockerfileを配置し、docker-sync.ymlも配置して
`docker-sync-stack start`
でbuildしようとしたところsyncが途中で止まってしまい、正常にbuildされない。


【公式】
https://github.com/EugenMayer/docker-sync/wiki

## 原因
gemとOSX El Capitanエラーが出る件についてはたくさん記事があるけれども、この件もどうやら同じ原因だった。
参考記事のように、インストール先をデフォルトの`/usr/bin`から`/usr/local/bin`に変更した所、インストールが正常に走ってbuildまで持って行けた。

▼ 変更前
`gem install docker-sync`

▼ 変更後
`gem install docker-sync -n /usr/local/bin`
【参考記事】
http://web-tsukuru.com/612


解せないのは、インストールしようとした際にエラーも何も出なかったこと。正常にインストールされていないのは確かなようなのだが（syncが途中でとまってしまうので）、参考記事のような`Operation not permitted - /usr/bin/docker-sync`といったエラーが出ない。うんともすんとも言わなかったので、正常にインストールされたものと思い込んでしまってハマった。

ともかくこれを機にOSをsierraにアップデートしようと思った。
イケてるゲノムブラウザWebApollo2.0.6をmacに導入する その２　サンプルゲノムデータをいれてみる

#サンプルデータを使ってみる

##ゲノムデータなどを置くところを作っておく

ユーザーが自分で入れ直すことも考えてDesktopに置きます

```bash:mkdir.sh
cd ~
mkdir $WEBAPOLLO_DATA_DIR
mkdir $JBROWSE_DATA_DIR
mkdir temp
```

##サンプルデータをダウンロード

```bash:db_postgres.sh
wget http://icebox.lbl.gov/webapollo/data/pyu_data.tgz
tar xvzf pyu_data.tgz
```

#fastaファイルの変換
webapolloに読める形に形式を変換して$JBROWSE_DATA_DIRディレクトリにいれる。

```bash:ref_fa_read.sh
cd ~/Apollo-2.0.6
bin/prepare-refseqs.pl --fasta $HOME/pyu_data/scf1117875582023.fa --out $JBROWSE_DATA_DIR/test
```

blatで使うためにfastaファイル自体も$JBROWSE_DATA_DIRにいれておく

`cp $HOME/pyu_data/scf1117875582023.fa $JBROWSE_DATA_DIR/test`


#webapollo側の設定

webapolloにアクセスして、$JBROWSE_DATA_DIR/testを配列情報の場所として設定する。

http://localhost:8080/apollo/
に再度アクセスして、先ほどいれたアドミンユーザーとしてログインする。

右ウインドウがわ`Organism`タブをクリックして
下側の`Details`画面の`Add New Organism`をクリックする。

各項目を入力して、`Directory`欄には先ほどの`$JBROWSE_DATA_DIR/test`を指定する。

![test.tiff](https://qiita-image-store.s3.amazonaws.com/0/165467/f5c2edce-f105-2780-19dd-314c5768cf53.tiff)

#GFFを追加する

以下の様にしてGFFを導入する。

```bash:ref_fa_read.sh
bin/flatfile-to-json.pl \
--gff $HOME/pyu_data/scf1117875582023.gff --type mRNA \
--trackLabel MAKER --out $JBROWSE_DATA_DIR/test
```

#遺伝子名などで検索できるようにする
作成したデータディレクトリに入り以下のようにするとindexが作成され、検索窓から遺伝子名を検索できるようになる

``
~/Apollo-2.0.6/bin/generate-names.pl --verbose
``



#BAMを追加する

$JBROWSE_DATA_DIR/testにbam ディレクトリを作って底にbamデータをインデックスと一緒に移動させる。

`mkdir $JBROWSE_DATA_DIR/test/bam`
`cp $HOME/pyu_data/simulated-sorted.bam $JBROWSE_DATA_DIR/test/bam`
`cp $HOME/pyu_data/simulated-sorted.bam.bai $JBROWSE_DATA_DIR/test/bam`

$JBROWSE_DATA_DIR/test/からみた場合の
bamの場所の相対パスを--bam_url で指定する。
--label　でwebapollo中で表示される名前を指定する
--key　で一意にデータを区別する名前を入れる
-i　でtrackList.jsonを指定する

```bash:bam_read.sh
bin/add-bam-track.pl --bam_url bam/simulated-sorted.bam \
   --label simulated_bam --key "simulated BAM" -i $JBROWSE_DATA_DIR/test/trackList.json
```


#bigwigを追加する

bamと同様に読み込ませる

```bash:bam_read.sh
mkdir $JBROWSE_DATA_DIR/test/bigwig
cp ~/pyu_data/*.bw $JBROWSE_DATA_DIR/test/bigwig
bin/add-bw-track.pl --bw_url bigwig/simulated-sorted.coverage.bw \
--label simulated_bw --key "simulated BigWig" -i $JBROWSE_DATA_DIR/test/trackList.json
```


#webapollo上での見方
右側のウインドウのTracksタブを開くと、導入したgff, bam, bigwigのチェックボックスがあるのでそれをチェックすると左のマップ上に表示される
Unreal Engine ソースコードハックテクニック #UE4Study

# Unreal Engine ソースコードハックテクニック

## ToolTipから該当箇所を探す
ボタンなどにマウスカーソルを当てると説明が表示される
この説明を出しているプロパティのことをToolTipという
ToolTipのコメントを検索ワードとして取得する
[Add a new key at the current time]
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/119b24b3-bfa4-5edb-d695-47df8ad64fec.png)

検索範囲をソリューション全体に設定して、検索ワードを入れて検索すると該当箇所が見つかる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/f4b686e4-62a9-ec43-8d56-952abbb17c82.png)

## 定義に移動

ボタンなどで実行している処理については、OnClickedなどイベントでよく使いそうな名前に関数が参照されている。
関数名を右クリックして定義に移動を選択すると処理の場所まで移動することができる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/b62a920d-39a7-db4f-a908-f56cae8c4fca.png)

## ブレイクポイントで処理を止めて、値を確認する
Debugビルドなどで、出来るみたいだがエラーになってしまって中々ブレイクポイントを使用できなかった。
プロセスにアタッチしてデバッグ出来ることを思い出して、試してみたらブレイクポイントで止められた。
こっちの方が、Developerビルドのままデバッグ出来るし、ちょっと手間話かかるけど結果楽かもしれない。

Editorを起動し、自分が作成した処理が走る状態にする

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8ecc5b02-b568-95bb-d15e-0127a60fcd45.png)

Visual Studio
デバッグ->プロセスにアタッチを選択する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/a23a75de-6667-d44e-04cb-2ca99b736425.png)

UE4Edito.exeを選択して、アタッチをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/7b5a496b-d425-b4cb-f720-3de2b338d613.png)

値を確認したい箇所にブレイクポイントを打つ
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/37a36bdd-372c-b11d-a3de-00d350069569.png)

ブレイクポイントで処理が止まり、値を確認したり、if文に入ったことを確認したり処理を負うことが出来る
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/0157149d-4187-5e34-d66c-d4d8c422e5e2.png)
Python3.5でのiOSアプリ開発環境を構築する方法を探しています。

機種：MacBook(2016)
OS：Sierra
Python：3.5

シンプルに、最新のPython3.5でiOSアプリを開発したいのですが、kivyも対応していないし巷に溢れている情報はpython2.7かバージョンすらわからない方法か、Windowsのみの情報だったりと、役に立ちません。

どなたか、Python3.5で開発できる環境をご存知ないでしょうか。
そもそも、

【現時点で可能であるのかどうか】だけでも教えてもらえる方を探しています。
Counterwallet の mnemonic から，オフラインで Bitcoin アドレスを取得する方法

# 背景

自社サービスに [Counterparty トークン SEMORA](http://blockscan.com/assetinfo/SEMOLA) を採用したい。
まずは顧客が購入したトークンの口座に相当する Bitcoin アドレスを，顧客ごとに割り当てる必要がある。BIP32/BIP44 辺りを使っているだろうから難しいことではないはず。
自社内で counterblockd は動いているし他社提供の API を使う手もありそうだ。
しかし，顧客に割り当てる Bitcoin アドレス表示のたびに JSON RPC を発行するのも効率が悪い。

よって，オフラインでも seed から Bitcoin アドレスを割り出せるようにしたい。

# 課題

Counterwallet では認証方法として 12words mnemonic が使われている。しかし，用いている単語リストが BIP39 と異なっている。なんてこった。
そのため，BIP39 を扱うライブラリでは BIP32/BIP44 用の seed が得らず，Bitcoin アドレスのリストも得られない。

# ハマりどころ

## Node ユーザのみ

npm で配布されている `bip39` パッケージは，mnemonic に BIP39 が定義しない単語が含まれていてもエラーを出さず，しれっと seed らしきものを返す。
もちろん誤った seed なので，正しい Bitcoin アドレスは得られない。
Counterwallet で表示されるアドレスと目視比較すればすぐに分かるけれども，うっかりすると危険。
bitcore-lib が提供する BIP39 関連のコードからは，きちんとエラーが得られる。

## たぶん全員

Counterparty の公式情報によると「[CounterWalletHelper.py スクリプトを使え](https://counterpartytalk.org/t/is-it-possible-to-create-list-of-addresses-and-private-keys-from-counterwallet-pass-phrase/1223)」とある。
しかし，手元の環境 [^env] では動作しなかった。
[追試した日本語圏の方もいらっしゃる](http://blog.yzono.com/entry/2014/12/19/224339)ようなので，どこかの時点までは期待通りに動作していたはずとは思うのだが…。
Python わからんので，深追いはしていない。

# オススメ

Blockscan が，[Counterwallet の nmemonic から Bitcoin アドレスを生成する静的 web サイトの雛形](https://github.com/blockscan/cw_address_key_generator)を公開している。
手元環境では，これは正しく動作する。サーバサイドで動かすには一手間かかりそうだけれども，コードは比較的きれいなので，なんとかなりそう。

# 感想

さすが Blockchan 様。

[^env]: Ubuntu 14.04 / Python 2.7.6 (default, Oct 26 2016, 20:30:19)
CentOS7からL2TP接続

最近、VPN接続以外はLinuxノートを使っており、VPNのためだけにWindowsノートを起動するのが面倒になったので設定しました。

ウインドウマネージャはXfceを使ってますが、ネットワーク接続アイコンのVPNからは接続できなかったのでコマンドでつなぐことにしました。

# パッケージインストール
```shell-session
yum install libreswan
yum install xl2tpd
```
※epelリポジトリが必要です。

# 設定ファイル
※環境依存値は"%"で挟んでいます。

## L2TPサーバの設定
```text:/etc/ipsec.d/HOGE.conf
conn L2TP-HOGE
  authby=secret
  pfs=no
  rekey=no
  keyingtries=3
  type=transport
  left=%defaultroute
  leftprotoport=17/1701
  right=%L2TPサーバのIP%
  rightprotoport=17/1701
  auto=add
```

NATトラバーサル環境の場合は以下の行を追加する。

```
  rightid=%実際に受ける機器のプライベートIP%
```

## 共有鍵の設定
```text:/etc/ipsec.d/ipsec.secrets
: PSK "%事前共有鍵%"
```

## L2TP接続設定
```text:/etc/xl2tpd/xl2tpd.conf
[lac L2TP1]
lns = %L2TPサーバのIP%
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd.conn-1
length bit = yes
redial = yes
redial timeout = 10
max redials = 6
```

## 接続オプションの設定
```text:/etc/ppp/options.xl2tpd.conn-1
name "%接続ユーザ名%"
noauth
mtu 1400
mru 1400
nodefaultroute
proxyarp
logfile /var/log/xl2tpd.conn-1.log

refuse-pap
refuse-eap
usepeerdns
connect-delay 5000
```
参考URLではcrtscts、lockを指定するようになっていましたが、CentOS7ではエラーになるようなので削除。refuse-pap、refuse-eapは追加。

## 認証情報の設定
```text:/etc/ppp/chap-secrets
# client        server  secret                  IP addresses
%接続ユーザ名% * "%パスワード%" *
```

# 接続
```shell-session
sudo systemctl start ipsec
sudo systemctl start xl2tpd
sudo ipsec auto --up L2TP-HOGE                             # L2TPサーバ設定名
sudo su -c 'echo "c L2TP1" > /var/run/xl2tpd/l2tp-control' # L2TP接続設定名
```

# 切断
```shell-session
sudo su -c 'echo "d L2TP1" > /var/run/xl2tpd/l2tp-control' # L2TP接続設定名
sudo ipsec auto --down L2TP-HOGE                           # L2TPサーバ設定名
sudo systemctl stop ipsec 
sudo systemctl stop xl2tpd
```

# シェル化
私の環境ではusepeerdnsでVPN側のDNSを拾えなかったので、resolv.confを書き換えるようにしました。

```text:vpn_conn.sh
sudo systemctl start ipsec
sleep 1
sudo systemctl start xl2tpd
sleep 1
sudo ipsec auto --up L2TP-HOGE
sudo su -c 'echo "c L2TP1" > /var/run/xl2tpd/l2tp-control'
sleep 3

grep '^nameserver %DNSのIP%' /etc/resolv.conf > /dev/null

if [ $? -ne 0 ]; then
  sudo sed -i -e "2i nameserver %DNSのIP%" /etc/resolv.conf
fi
```

```text:vpn_disconn.sh
sudo su -c 'echo "d L2TP1" > /var/run/xl2tpd/l2tp-control'
sudo ipsec auto --down L2TPｰHOGE
sudo systemctl stop ipsec
sudo systemctl stop xl2tpd
sudo sed -i -e "/^nameserver %DNSのIP%$/d" /etc/resolv.conf
```
VPNを切断せずにshutdownしても、DHCPで使ってるので次回起動時に余計なnameserverはいないため手抜きしてます。

# 参考URL
http://network.station.ez-net.jp/client/remote/vpn/l2tp-linux.asp
https://wiki.archlinuxjp.org/index.php/Openswan_L2TP/IPsec_VPN_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E8%A8%AD%E5%AE%9A
【IE】<label>内の画像<img>がクリックできずイベントを拾わない（ラジオボタン等で使用した画像が反応しない）

#何が起きたか

ChromeやFFでは確認できなかったが、IE(11)では
ラジオボタンに画像を使用した際にチェックができない現象が発生


画像部分がクリックできない
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/fab14516-625b-4558-abb2-f8d63d65124b.jpeg)


```html:form.html
～略～
<link href="/form.css" rel="stylesheet">
～略～
<form>
<div id="hyoka">
<label>好き
<input type="radio" name="hyouka" value="like">
<img src="like.jpg" border="1">
</label>
<label>嫌い
<input type="radio" name="hyouka" value="dislike">
<img src="dislike.jpg" border="1">
</label>
</div>
<input type="submit" value="送信する">
</form>
```


#解決方法

label要素を**`display:inline-block;`**にし、画像に**`pointer-events: none;`**を付与することで、解決しました。

```css:form.css

#hiyoka label{
    display: inline-block;
    ～略～
}
#hiyoka label img{
    pointer-events: none;
    ～略～
}
```

IEのバグ？で画像を使われることを想定していないつくりになっているようです。
そこで画像を無効化してラベル自体をボタンにすることで回避できるみたいです。

**ただ`pointer-events`はIE11未満はサポートされていないみたいなので注意が必要です。**
[CSS pointer-events (for HTML)](http://caniuse.com/#feat=pointer-events)


##参考リンク
html - Image label for input in a form not clickable in IE11 - Stack Overflow
http://stackoverflow.com/questions/20198137/image-label-for-input-in-a-form-not-clickable-in-ie11
golangのWebアプリケーションフレームワーク一覧(2017年2月版)


golangのWebアプリケーションフレームワークの私的メモ。

| Name    | Star  | URL                                   | Note |
|:--------|:------|:--------------------------------------|:-----|
| Beego   | 9,499 | https://beego.me/                     | 中国企業の採用実績が多い |
| martini | 9,044 | https://github.com/go-martini/martini | 日本語ドキュメントもある |
| Gin     | 8,730 | https://gin-gonic.github.io/gin/      | martiniライクな感じで使え、martiniより高速 |
| Revel   | 7,836 | https://revel.github.io/              | 有名ですね。 |

## Beego

中国語の情報は多い印象。

## martini

日本語ドキュメントがある。
リフレクションで遅いという噂もある。

## Gin

martiniライクではやいらしい。

## Revel

日本では本命？

## メモ

i18nのサポートを言語そのものでして欲しいと思う。
Sublime Text3で一括置換したファイルをすべて保存する

大量の一括置換案件が降ってきて、アホみたいにcommand + sしていたら隣の席の人に不審者を見る目で見られました。:eye:

静的htmlのコーディングでは一括置換作業が度々発生するので、この機会に一気に保存できる方法を調べました。:eyes:


## File > Save All ですべて保存
ここを押すとすべてのファイルを保存できます。
<img width="260" alt="スクリーンショット 2017-02-22 12.52.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/4f661a87-2747-7ef6-90d1-59714aee9036.png">


## 常に自動保存する設定
sublimeは軽くて落ちることが少ないので自動保存はあまり使う機会がないかもしれませんが、設定することもできます。

常に自動保存してくれるように設定するには、
`preference → settings → Preferences.sublime-settings - User` に`"save_on_focus_lost": true`
を追記します。
最終行の場合末尾に`,`は入りませんが、続けて設定を記述する際は末尾を`,`でつなぎます。

再起動すると自動保存設定が有効になります。
<img width="430" alt="スクリーンショット 2017-02-22 12.53.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/f2346bd4-57ed-d3b9-990e-1ff47c130627.png">

<img width="347" alt="スクリーンショット 2017-02-22 13.08.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/065a726f-a31e-0341-a472-7cc718b8e080.png">
JavaScript でnullチェックしつつ多次元配列にアクセスする

# TL;DR

CakePHP の Hash::get 
Laravel の array_get
みたいな関数作った

**追記**
Lodash に同じコンセプトの関数があると教えてもらったので、それを使ったほうが良さそう（ @n-oshiro さんありがとうございます ）
https://lodash.com/docs/4.17.4#get

# 背景

javascript で多次元（連想）配列を扱う必要があったが、ネストが深いとエラーチェックが大変。

```js

var hoge = {
  'foo': {
    'bar': 'baz'
  }
};

var val = hoge['foo']['bar']
```

こんな感じの配列アクセスがしたいのだけれど、実践的には値がなかったりするので、エラーチェックや存在チェックをしたい

```js
var val = hoge['foo']['piyo'] || 'default' // default

または

var val = 'default';
if (hoge['foo']['piyo']) {
  val = hoge['foo']['piyo'];
}
```

こんな感じになるが、例えばネストが深いところの bar みたいなキーにアクセスしようとするとエラーになることがある。
下記はすべてエラーになる。

```js
var val = hoge['foo2']['bar'] || 'default';

var val = 'default';
if (hoge['foo2']['bar'] != undefined) {
  val = hoge['foo2']['bar'];
}
```

これを解決するには下記のようなチェックをしないといけない。

```js

var val = 'default';
if (hoge['foo2'] != undefined) {
  if (hoge['foo2']['bar'] != undefined) {
    val = hoge['foo2']['bar'];
  }
}
```

ネストが深いとチェックがどんどん煩雑になっていく

# 関数作った

```js

var arrayGet = function(ary, path, _default) {
  if (! (ary instanceof Object)) {
    return _default
  }
  if (path.indexOf('.')) {
    path = path.split('.');
  } else {
    path = [path];
  }

  var cursor = ary;
  for (var i = 0; i < path.length; i++) {
    if (cursor[path[i]] == undefined) {
      return _default;
    }
    cursor = cursor[path[i]];
  }
  return cursor;
};

```

配列のキーにアクセスし、存在したらその値を、存在しない場合はデフォルト値を返す。
キーは'.'で階層を示すので、'.' を含むキーが存在する場合はうまく動作しない。

# 使い方

```js

var hoge = {
  'foo': {
    'bar': 'baz'
  },
  'fooo': 'baar'
};

arrayGet(hoge, 'foo.bar', 'default') // baz
arrayGet(hoge, 'fooo', 'default') // baar
arrayGet(hoge, 'foo.foo', 'default') // default
arrayGet(hoge, 'foo2.bar', 'default') // default

// 連想配列でなくてもいける

var ary = [
  'a',
  {
    'foo': 'bar'
  }
];

arrayGet(ary, '0') // a
arrayGet(ary, '1.foo') // bar
```

既存で似たようなライブラリあったら教えてください

以上
sublimeText3でコメント中の日本語がEnterすると消える問題

## 環境
Mac OS X El Capitan
SublimeText3

## DocBlockrの削除
DocBlockrというプラグインを入れていたら削除する。

shift+command+pでCommand Paletteを開き、Package Control: Remove Packageを選択する。
DocBlockrを検索して選択すると削除される。

sublimeを再起動する。


長い間悩まされていましたが、私の場合はこれで直りました。
`//`タイプも`<!-- -->`タイプも問題ないことを確認。
Googleの翻訳APIをRubyから叩いてみる

# 前準備

[Google Cloud Platform コンソールの API マネージャ](https://console.cloud.google.com/apis/library) にいって `認証情報` から適当にキーを作ってください。

作成したら以下図な感じになっているはずなので `キー` に表示されている文字列をコピーします。プログラム中で使います。

![image](https://qiita-image-store.s3.amazonaws.com/0/38598/f7f0d278-dc9e-ece9-4e20-43e17e5f6ad6.png)


# 実装

```rb:test_translation.rb
require 'net/http'
require 'uri'
require 'json'

def translate q
  url = URI.parse('https://www.googleapis.com/language/translate/v2')
  params = {
    q: q,
    target: "ja",
    source: "en",
    key: "<ここにキーをペースト>"
  }
  url.query = URI.encode_www_form(params)
  res = Net::HTTP.get_response(url)
  JSON.parse(res.body)["data"]["translations"].first["translatedText"]
end

puts translate "I'm trying to use the google translation api."
```

```:実行結果
$ ruby test_translation.rb
私はGoogle翻訳のAPIを使用しようとしています。
```

# 参考情報

## ドキュメント

https://cloud.google.com/translate/docs/getting-started?csw=1

## お値段

https://cloud.google.com/translate/pricing
![image](https://qiita-image-store.s3.amazonaws.com/0/38598/d8d77c04-a0f0-88a5-e857-91f492a8bdeb.png)

文字数で課金なんですね。
TurboPower Abbrevia を使用して暗号化されたzipファイルを処理する

# 環境
- RadStudio XE8
- TurboPower Abbrevia 5.2

# 暗号化されているか確認
TAbUnZipper.Itemsの返すTAbZipItemのIsEncrypted プロパティを調べる。

```delphi
function CheckEncryption(const AFileName: string): Boolean;
var
  Zip: TAbUnZipper;
begin
  Zip := TAbUnZipper.Create(Nil);
  Zip.FileName := AFileName;
  Zip.TempDirectory := TPath.GetTempPath;
  Zip.ExtractOptions := [eoCreateDirs, eoRestorePath];

  Result := False;
  if Zip.Count > 0 then
  begin
    if Zip.Items[0].IsEncrypted then
      Result := True;
  end;
  Zip.Free;
end;
```

# パスワードが正しいかチェック
TAbUnZipper.Passwordにパスワードを設定してTAbUnZipper.TestTaggedItemsを実行する。
パスワードが正しく無かった場合は例外としてEAbZipInvalidPasswordが投げられるのでそれで確認する。

```delphi
function CheckPassword(const AFileName, APassword: string): Boolean;
var
  Zip: TAbUnZipper;
  OutPutPath: String;
begin
  Zip := TAbUnZipper.Create(Nil);
  Zip.FileName := AFileName;
  Zip.TempDirectory := TPath.GetTempPath;
  Zip.ExtractOptions := [eoCreateDirs, eoRestorePath];

  Zip.Password := APassword;
  Zip.TagItems('*.*');
  try
    Zip.TestTaggedItems;
    Result := True;
  except
    on EAbZipInvalidPassword do
    begin
      Result := False;
    end;
  end;
  Zip.Free;
end;
```

# ライブラリにおまかせ
OnNeedPassword イベントでパスワードを設定する。

```delphi
procedure TForm1.OnNeedPassword(Sender: TObject; var NewPassword: AnsiString);
var
  Val: String;
begin
  if InputQuery('パスワード入力', 'パスワードを入力してください', Val) then
    NewPassword := Val;
end;
procedure TForm1.ExctractFile(const AFileName: string);
var
  Zip: TAbUnZipper;
  OutPutPath: String;
  Pass: String;
begin
  Zip := TAbUnZipper.Create(Nil);
  Zip.FileName := AFileName;
  Zip.TempDirectory := TPath.GetTempPath;
  Zip.ExtractOptions := [eoCreateDirs, eoRestorePath];
  Zip.BaseDirectory := 'C:\';
  Zip.OnNeedPassword := OnNeedPassword;
  Zip.ExtractFiles('*.*');

  FreeAndNil(Zip);
end;
```
setCustomAnimationsがViewPagerの中のFragmentに効かない問題

## 直面した問題
Fragment#replaceを呼ぶときに setCustomAnimations でenterとexitのアニメーションを指定しているのに、ViewPagerの中のFragmentがパッと消える問題に直面した。
elevation関係で重ねてる他のViewの後ろに回るとかしてるのかと思っていろいろ調べて、 https://code.google.com/p/android/issues/detail?id=163384 に行き着いたけど、どうやらこれは関係なかった。

## 原因
setCustomAnimations はViewPagerの様なNestedなFragmentには適用されず、パッと消えるとのこと。たしかによくよく考えたらフェードアウトのアニメーションが親と子で２重に掛かったりしたら大変だ。

## 対策
いろいろ調べた結果、Stack Overflowの↓に行き着いた。

http://stackoverflow.com/a/23276145/4052730

Fragment#onCreateAnimationメソッドはFragmentの追加時/削除時のアニメーションの生成を担っているので、該当する子フラグメント(ViewPagerの中身)を親フラグメント(ViewPagerの持ち主)がisRemoving()==trueのときはアルファ値を1に固定するなどしてあげると、パッと消えるような見た目にはならない。

## 2017/07/14追記
Support Libraryの25.x.x系で内部の変数の持ち方が変わったので、↑の方法をそのまま適用すると動きません。変数名を変えてあげると動くようになります。
Zynq > BOOT.binの解析 > I. Boot.binのヘッダー比較

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。

### ImageHeaderTable (0x8C0)

| 	Version |	ImageCount |	PartitionOffset |	ImageOffset |
|:-:|:-:|:-:|:-:|:-:|
| zynq-bootで作成 | 16,842,752 | 3 | 608 | 576 |
| XSDK(v2014.4)で作成 | 16,908,288 | 3 | 800 | 576 |

### BootPartitionHeader (zynq-boot:0x980 / XSDK:0xC80)

| | ImageWordLen, DataWordLen, PartitionWordLen | LoadAddr | ExecAddr | PartitionStart |	PartitionAttr | SectionCount |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| zynq-bootで作成 | 21,707 | 0 | 0 | 672 | 16 | 1 |
| XSDK(v2014.4)で作成 | 	24,579 | 	0 | 	0 | 	1,472 | 	16 | 	1 |
リモートブランチに.gitignoreをpushせずに管理する方法

# リモートブランチに.gitignoreをpushせずに管理する方法
* gitの管理に含めたくないファイルがある。
* .gitignoreファイルに除外対象のファイルを設定したが.gitignoreファイルはリモートにpushしたくない。

そんなシチュエーションに便利。(←そもそもの運用方法が悪いという話はここでは置いておく。)

## .gitignoreファイルを作成する
プロジェクトのルートにgitのディレクトリがあることを確認し、.gitignoreファイルを作成する

```
$ ls -a
. .. .git app

$ vi .gitignore
```

```git:.gitignore
PROJECT_ROOT/app/tmp/logs/
#↓以下に無視したいファイルを続けて記入
```

無視したいファイルがきちんと無視できているかを確認。

```
$ git status

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.gitignore


```

## gitのexcludeファイルにgitignoreを追加
あとはこの.gitignore自体を無視したい。

```
$ vi .git/info/exclude
```

```git:exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

.gitignore
# ↑.gitignoreを追加

```

## gitのconfigファイルの設定
さらに、

```
$ vi .git/config
```

```git:config
[core]
	excludesfile = /path/to/ignore-definition
    #↑この行を追加
```


無事に無視することができた。

```
$ git status
On branch master
nothing to commit, working directory clean
```

# 参照
https://portalshit.net/2013/05/28/ignoring-file-without-gitignore

# 終わりに
もっといい方法があればアドバイスください！
2017年気になるデザインサービス

# WEBデザインフロー


1. アイデア (調査)
2. ビジュアルデザイン (作成）
3. プロトタイプ (模型）
4. ハンドオフ(デザイン完成）
5. コーディング(実装）

----------

## アイデア

- [Dribbble(ドリブル)] (https://dribbble.com/)
- [Behance ( ベハンス ) Adobe社](https://www.behance.net/)
- [Muzli(マーズリ）](https://muz.li/)

-----------

## ビジュアルデザイン
- Sketch
- Photoshop
- Illustrator
- [Figma](https://www.figma.com/)


> 記事
- [UIデザイナーの私がPhotoshopからSketchへ乗り換えた9つの理由](https://liginc.co.jp/web/tool/mac-iphone/165286)
- [Sketchでデザインをして気付いたPhotoshopより優れているポイント](http://creive.me/archives/6464/)


-----------

## プロトタイプ
- [Invision](https://www.invisionapp.com/)
- Proto.io
- [Adobe XD](https://blogs.adobe.com/creativestation/web-how-to-play-with-adobe-xd)

-----------

## ワークフロー
- GitHub
- [Lingo](https://www.lingoapp.com/)
- [wakatime](https://wakatime.com/)
- Trello

-----------

## ハンドオフ

- [zeplin（ツェプリン）] (https://zeplin.io/)
- [avocode（アボコード)] (https://avocode.com/)

[Avocodeを使ってスライスとコーディングの効率をグッとあげよう](https://liginc.co.jp/web/tool/other-tool/162015)

-----------

## 最後に

新しいものが全て良いわけではないですが、同じツールを使い続けていると発想も留まってしまうことが多い。
新しいものに触れることで、今どんなものが流行っていて、どんなものが世の中に求められてるのかが明確になってきます。
そうすることでデザインの発想も変わってくるのではないかと思います。


-----------

おまけ
[Androidの初代マスコットがいろいろとヤバい件](https://matome.naver.jp/odai/2135754835110840901)