OmniAICreator/Qiita-1.07M huggingface dataset:
laravelのhomesteadにphpmyadminを導入した

前に導入したものが動かなくなり入れなおそうとしたら手順を忘れていたのでここに書くことで調べる手間を省こうと思う
#前提
os win 10
``vagrant /Oracle VM VirtualBox/composer`` が導入済みであること

#手順
以下の操作はGit Bashで行っている
##BOXファイルインストール
homesteadを使いたいディレクトリで

```bash:console_local
vagrant box add laravel/homestead
```

を入力
今回は３のVirtualBoxを選択
##laravelファイル作成
```bash:console_local
composer create-project laravel/laravel sample "5.1.*"
```

これでlaravelのプロジェクトファイルが生成される
デフォルトだとファイル名がsampleになってるので好きに書き換えるとよい
書き換えた場合はsampleの部分をそれぞれ自分の書き換えた名前に差し替える
##composerでlaravel/homestedのインストール
作成したファイルに移動し

```bash:console_local
cd sample
composer require laravel/homestead --dev
```

## VagrantfileとHomestead.yaml生成
```bash:console_local
vendor\\bin\\homestead make
```

##vagrant 起動　接続
```bash:console_local
vagrant up    #
vagrant ssh   #
```

今後は基本的にSSH接続した状態で操作していく
##ファイアウォールの無効化
この先の操作時に引っかかって進めなくなるので
```sudo ufw disable ```
でファイアウォールを無効化しておく
##phpmyadminのインストール
```bash:console_vm
sudo apt-get update
sudo apt-get install phpmyadmin
```

を入力しインストールする
`Do you want to continue? [Y/n]`
と聞かれるので　ｙで続ける
その後使用サーバーを聞かれるので``apache2``を選択
その後選択肢が出るがそのままエンターでよい
``dpkg -l`` でインストールされたことが確認できる
ここまで出来たらいったんSSH接続を抜ける
##Homestead.yamlの修正
作成したlaravelのプロジェクトファイル内にあるHomestead.yamlをテキストエディタで開き

```yaml:Homestead.yml
# sites:の後に以下の文を追記
　　- 
　　　　　map: sample.phpmyadmin
　　　　　to: /usr/share/phpmyadmin/
```

##hostファイルの修正
``C:\Windows\System32\drivers\etc\hosts`` の末尾に

```text:C/Windows/System32/drivers/etc/hosts
192.168.10.10   sample.app
192.168.10.10   sample.phpmyadmin
```

を書き加える
書き換えたらGit Bashで
```vagrant provison```
を入力する
##phpmyadminに接続する
vagrant up で立ち上げた後
sample.phpmyadminにブラウザから接続するとphpmyadminが使用可能になっている
デフォルトユーザー名　homestead
デフォルトパスワード　secret
になっている
#補足
上手くphpMyAdminに接続できないときは何度か```vagrant provison```をやると動くようになった
[C/C++]FactorialとFibonacci

今回はFactorialの関数とFibonacciの関数を書いてみました。


# Factorial

```c:factorial.c
int factorial(int n) {
	return n == 0 ? 1 : n * factorial(n - 1);
}
```

# Fibonacci

```c:fibonacci.c
int fibonacci(int n) {
	return n <= 2 ? 1 : fibonacci(n - 2) + fibonacci(n - 1);
}
```
Mac でバックスラッシュを出す


`option + ¥`

以上。

Python を Idle 上で動かしてたら、ぱっと見バックスラッシュなのにエスケープとして機能してなかったので、なんでだろと思って色々押してみたら、こうだった。
バックスラッシュじゃないのにバックスラッシュに見える彼は一体何者なのだろう。
12インチ MacBook だと `option` キーが左しかないので、非常に面倒臭い。
Google Earth Engine におけるSentinelのOverlap問題

#初めに
Landsatよりも解像度の細かいSentinelデータはGoogle Earth Engine（以下、GEE）上でも自由に使うことができる。その際の注意点として、全く同じ時間に撮られた画像でもoverlapが発生していることがあげられる(後述)。Sentinelデータは一つの画像を複数のパーツに分けて格納しており（一つのデータあたりのサイズを減らしたいから？）、場合によっては面積的に無視できないレベルでのoverlapが生じているのでその辺をどう対処するかをまとめる。下記コードの順序に沿ってまとめる。

参照コード：https://code.earthengine.google.com/34c06b4d1816099384b4c0f06ddd6232

#地域ごとのshapefile
特に必要のないステップだが、GEEのデータカタログに落ちているLarge-Scale International Boundary (LSIB)のデータを用い、プロパティを指定して日本の領域を取り出す練習。画像データだけでなくshapefileもいろいろ検索できるのはありがたい。

#どんな感じでデータが入っているのか？
Sentinelの各画像はLandsatと同様passに沿って並んでおり、緯度経度に対して傾いている。プロダクト化のステップでこれらはMGRS（Military Grid Reference System）という緯度経度に直交する長方形（タイル）群に切り分けられる。参照コードではMGRSグリッドのshapefileを用いて検証を行っている（参照元：[某GEEヘルプフォーラムの一話題](https://groups.google.com/forum/?hl=ja#!searchin/google-earth-engine-developers/sentinel$202$20overlap%E3%80%80ft$3A1SaoY60_I5_JUKepshvJwJrNizMQ4hOh1qCZb3csm%7Csort:relevance/google-earth-engine-developers/Mw16QdupMUg/QyuoiKKZBgAJ)）。各タイルは、{経度：1~60までの数字}+{緯度：C~Xまでの英字}+{さらに細部：英字2文字}のidで区分されており、SentinelデータのプロパティではMGRS_TILEからタイル情報を抽出することができる。関東近郊だとMGRS_TILE = 54SUE なので、今回はそれを用いる。

#Sentinelデータを抽出する
領域指定では、MGRSシェープファイルから54SUEのタイルを選択し、その領域にかかる画像を抽出した。説明の都合上、画像データからそれが含まれるポリゴンデータを抽出した（ImageCollectionではなくFeatureCollectionを用いれば、図化したとき一つのレイヤーだけで重複を確認することができる）。同時に、各画像のMGRS_TILEからタイルのidも取得しておく。

#overlapの確認
さて、タイル54SUEにかかる画像データを図示すると下記の通り。FeatureCollectionのはじめ9つのみ図化しているが、他のFeatureもこれらのいずれかに重なるはずである。9つのうちのどこに位置するかはMGRS_TILEのタイル情報と整合する。

![gee1.PNG](https://qiita-image-store.s3.amazonaws.com/0/187118/0a13b2c7-db47-6862-6f9d-30187f90bae3.png)

真ん中の正方形が54SUE。全体として見える傾いた四角形がもともとのSentinel画像1枚分であり、それがタイル状に切り分けられているのが分かる。しかしながら、そもそもMGRSが重複を生じるように定義されているために、重複が生じている。これを透過度を上げた画像レイヤー2枚を重ねて見てみるとこんな感じ。

![gee2.PNG](https://qiita-image-store.s3.amazonaws.com/0/187118/d30ca731-5fe0-f3e5-e5d0-5ebeb205b0a8.png)

やはり上下の衛星画像に重複が生じ、その部分が濃くなっている。

#overlapが嫌な時の対処法
先に示したヘルプフォーラムの中で、重複がちょうど9800mであることが説明されている。そのため、負の方向に4900mだけ画像の辺からbufferをかけてあげると、overlapが解消される。

![gee3.PNG](https://qiita-image-store.s3.amazonaws.com/0/187118/a1782355-7d70-a0ff-f0bb-6128ab963535.png)
Electron で外部アプリの起動・停止を行う

ElectronのGUIに起動・停止ボタンをつけて，外部アプリの起動・停止をしてみた．

# 検証環境
* macOS Sierra 10.12.1
* electron: ^1.4.8

# 起動＆停止

`execFile` で `.app` を実行し，`ps aux` でプロセス番号を取得する方法を試した．
`execFile` と `exec` を同期的に実行すると，後者でプロセス番号が取得できない時があったので， `child-process-promise` をつかっている．


```javascript
const {exec, execFile} = require('child-process-promise');
const kill = require('tree-kill');

const APP_PATH = 'path/to/app/test.app'
// ※ APP_NAMEの場合、同じ名前が含まれるプロセスが他に存在するとプロセスIDが正常に取得できない
// そのため APP_PATH で grep する方式に変更した
// const APP_NAME = 'test.app'

let pid = null;

// 起動
execFile('open', [APP_PATH])
    .then(_ => exec(`ps aux | grep -v grep | grep -i ${APP_PATH} | awk '{print $2;}'`))
    .then((result) => {
        if (result.stderr) {
            throw(result.stderr)
        }
        pid = parseInt(result.stdout);
        logger.debug(`Start App name:${APP_PATH}, pid:${pid}`);
    })
    .catch((err) => {
        logger.debug(`Error: ${JSON.stringify(err)}`);
    });

// 停止
if(pid) {
    kill(pid)
}
```

# 注意
`spawn` を用いても起動はできるが，返り値のオブジェクトの情報だけだと.appのプロセス自体は取得できず，kill停止はできなかった．

```javascript
const process = spawn('open', [APP_PATH])

// これらはspawnのプロセスであって（と思われる）.app自体のプロセスではない
// test.appのPIDとは異なる
console.log(process.pid)

// killしても.appは落ちない
process.kill('SIGKILL')
kill(process.pid)
```
AWS EC2のUbuntuサーバーにFirefoxをインストールして、Selenium(Ruby)を動かすための準備

AWS EC2のUbuntuサーバーにFirefoxをインストールして、Selenium(Ruby)を動かすための準備を行ったときに、割りと大変だったので、そのメモを公開します。

アプリケーション自体はRuby on Railsなので、その準備も入ってます。
Amazon Linuxも試したのですが、firefoxのインストールとか大変でUbuntuを選択しました。
2017/7/18時点。

## UbuntuにGUIとfirefox等をインストール

```
sudo apt-get update
sudo apt-get install lxde #GUI のインストール
sudo dpkg-divert --local --rename --add /sbin/initctl
sudo ln -s /bin/true /sbin/initctl
sudo start lxdm #GUI の起動

sudo apt-get install firefox
export DISPLAY=:1

sudo apt-get install vnc4server
vncserver
rm ~/.vnc/xstartup
ln -s /etc/X11/Xsession ~/.vnc/xstartup
vncserver -kill :1 #プロセス 1 (先ほど立ちあげたプロセス) を一旦 kill
vncserver #もう一回起動。設定が反映される。
```
参考：http://tushuhei.hatenadiary.jp/entry/20131009/1381302187

## Ruby(Rails, MySQL)を動かすためのライブラリをインストール
```
sudo apt-get -y install git
sudo apt-get -y install ruby2.3
sudo apt -y install ruby-bundler
sudo apt-get -y install ruby2.3-dev nodejs libcurl4-openssl-dev apache2-dev libapr1-dev libaprutil1-dev libxml2 libxslt-dev build-essential patch libssl-dev mysql-server libmysqlclient-dev
```


参考：http://qiita.com/sasurai_usagi3/items/0fb2603669e7ac083395

## FirefoxをSeleniumで動かすためにgeckodriverをインストールする

```
wget https://github.com/mozilla/geckodriver/releases/download/v0.16.1/geckodriver-v0.16.1-linux64.tar.gz
sudo sh -c 'tar -x geckodriver -zf geckodriver-v0.16.1-linux64.tar.gz -O > /usr/bin/geckodriver'
sudo chmod +x /usr/bin/geckodriver
rm geckodriver-v0.16.1-linux64.tar.gz
```
参考： https://askubuntu.com/questions/870530/how-to-install-geckodriver-in-ubuntu


## トラブルシューティング
- vncserverがいくつも立ち上がっていると上手くいかない。
- ブラウザを処理完了後に閉じるようにしないと、メモリが足りなくなる。
fetch() でブラウザが持っているBasic認証情報を送信する

既にブラウザでBasic認証の認証を済ませたページから、 [fetch()](https://developer.mozilla.org/ja/docs/Web/API/GlobalFetch/fetch "MDN fetch()") を使用して同じBasic認証領域内のAPIエンドポイントへリクエストを投げることがあり、どうやったらブラウザが持っているBasic認証情報を一緒に投げられるのか調べたので、そのメモです。

簡単にですが nginx の設定を合わせて載せておきます。

```nginx
location ^~ / {
    auth_basic "Secret area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

location ^~ /api/ {
    proxy_pass http://localhost:8080/;
    auth_basic "Secret area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
```

# やりかた

```js
fetch('/api/hoge', {
    credentials: "same-origin" // このオプションを指定
})
.then(function(response) {
  /* ... */
});
```

`fetch()`の第二引数で`credentials`オプションを指定するだけでOKでした。

[MDNのドキュメント上](https://developer.mozilla.org/ja/docs/Web/API/GlobalFetch/fetch "MDN GlobalFetch.fetch()")では、

>credentials: request に使用したい秘密情報: omit、same-origin、include が使用可能です。現在のドメインの Cookie を自動で送るためにはこの設定を指定する必要があります。

と書いていますが、 実際にはクッキーの他にBasic認証情報も送信してくれます。
これにより、既にブラウザで認証済みのBasic認証領域に`fetch()`を使ってリクエストを投げる時でも、Basic認証情報も合わせて送信してくれます。

`credentials`に指定できる値は三つあり、

>* omit：決してクッキーを送信しない。
>* same-origin：URL が呼び出し元のスクリプトと同一オリジンだった場合のみ、クッキーを送信する。
>* include：クロスオリジンの呼び出しであっても、常にクッキーを送信する。
>
>[MDN Request.credentials](https://developer.mozilla.org/ja/docs/Web/API/Request/credentials "MDN Request.credentials")より引用

となっています。

ちなみに IE11 などの古いブラウザは`fetch()`が使用できないため、それらのブラウザでも使用したい場合は
[whatwg-fetch](https://github.com/github/fetch "github/fetch")
を使用するとある程度の古いブラウザまで使えるようになります。

# 参考
[GlobalFetch.fetch()](https://developer.mozilla.org/ja/docs/Web/API/GlobalFetch/fetch "MDN GlobalFetch.fetch()") (MDN)
[Request.credentials](https://developer.mozilla.org/ja/docs/Web/API/Request/credentials "MDN Request.credentials") (MDN)
MySQLのMVCC

# MVCCとは
MultiVersion Concurrency Controllの略で，RDBのisolation levelが`READ COMMITTED`や`REPEATBLE READ`なんかの時のために採用しているシステムのことです．
簡単に言うと「テーブルの過去の情報を持っておく」です．

# isolation level
DBでは同時に複数トランザクションが一つのテーブルを操作したりします．
例えばあるトランザクションがテーブルAを参照中に，Aの内容を書き換えるような別のトランザクションが存在すると，取ってきたデータに不整合が生じます．
この不整合をどの程度許容するかがisolation levelです．通常4種類あります．

1. READ UNCOMMITTED ... COMMITされていないトランザクションAの変更をトランザクションBが参照できます
2. READ COMMITTED ... COMMITされたトランザクションAの変更をトランザクションBが参照できます
3. REPEATBLE READ ... COMMITされたトランザクションAの追加をトランザクションBが参照できます
4. SERIALIZE ... 同時に最大1つまでのトランザクションしか存在しないのと等価です

2以降を実現するためには`SELECT`で共有ロックを，`UPDATE`と`INSERT`で専有ロックを取得すれば良いのですが
パフォーマンスを考えるとなるべくロックの取得はしたくないです．そこで考え出されたのがMVCCです．
MVCC実装はRDBやストレージエンジンによって違いますがここではMySQLのinnodbを考えます．

# MVCC実装
全てのテーブルの全てのレコードにはMySQLが自動的に以下の3つのカラムを追加します(ユーザからは見えません)

- DB_ROW_ID ... その行のID
- DB_TRX_ID ... 最後にそのレコードを追加・更新したトランザクションID
- DB_ROLL_PTR ... そのレコードの過去の値を持つundo log recordへのポインタ

トランザクションIDが**100**のトランザクションがあるレコードを挿入すると
DB_TRX_IDに100が代入されます．DB_ROLL_PTRはNULLです．
トランザクションIDが**102**のトランザクションでレコードの値を書き換えると，undo log recordに過去の値が保存され，DB_ROLL_PTRにそのrecordへのポインタが代入され，DB_TRX_IDに**102**が入ります．

もしこれらの変更がCOMMITされたとして，isolation levelがREPEATABLE READの場合，
トランザクションIDが**99**のトランザクションはこのレコードを参照できません．
トランザクションIDが**101**のトランザクションはこのレコードの変更前の値をundo log recordから探して参照します．
トランザクションIDが**103**のトランザクションは変更後の値を見ることが出来ます．
ざっくり「自分のトランザクションIDより未来の追加と変更は取得されない」と思っておけばそこまで困りません．

## 実験
シェルを2つ起動して両方共mysqlに接続します．
データベースはなんでもいいですが適当にsakila-databaseを利用します．
片方のシェルで**TRX 1**に書かれた命令を，もう片方のシェルで**TRX 2**の命令を実行してください．ただし，コマンドの実行順序は上の行から順番に．
同じ行であればどちらを先に実行しても構いません．

|TRX 1|TRX 2|
|:-:|:-:|
|`USE sakila;`   | `USE sakila;`  |
|`BEGIN;`   | `BEGIN;`  |
|`SELECT * FROM language;`||
||`INSERT INTO language (name) VALUE ('Spanish');`|
|`SELECT * FROM language;`|`SELECT * FROM language;`|
||`COMMIT;`|
|`SELECT * FROM language;`||
|`SELECT * FROM language LOCK IN SHARE MODE;`||

**TRX 1**の`SELECT`は最後以外はSpanishは見られませんが**TRX 2**の最後の`SELECT`では存在します．
MVCCが働いて**TRX 1**では`DB_ROW_ID`が未来のトランザクションであるレコードは読み取られなかったのです．
**TRX 1**の最後の`SELECT`ではSpanishが存在するのは`SELECT ... LOCK IN SHARE MODE`と`SELECT ... FROM UPDATE`の2つが例外的にMVCCを無視して行ロックを取得して最新レコードを取得する命令だからです．
この状態になると**TRX 1**を`COMMIT`か`ROLLBACK`するまでロックされたままです．よくデッドロックの原因やパフォーマンス低下に繋がるので可能な限りロックを取得する`SELECT`はやめましょう．

## ちなみに
上とよく似た実験ですが

|TRX 1|TRX 2|
|:-:|:-:|
|`USE sakila;`   | `USE sakila;`  |
|`BEGIN;`   | |
||`BEGIN;` |
||`INSERT INTO language (name) VALUE ('Spanish');`|
||`COMMIT;`|
|`SELECT * FROM language;`||

この状態だと一見，**TRX 2**の方がトランザクションIDが大きい値なので**TRX 1**では`COMMIT`されたレコードを見ることが出来ない気がしますが，実際は見られます．
これは実はトランザクションIDは`BEGIN;`で割り振られるわけでなく，`SELECT`等のSQLで初めて割り振られるからです．**TRX 1**のトランザクションIDは最後の`SELECT`で初めて割り振られます．
現在のトランザクションのIDは

```mysql:トランザクションIDの取得
SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = CONNECTION_ID();
```
で見ることが出来ますが，`BEGIN`直後にこのSQLを実行してもempty setが返ってきます(ということはこの`information_schema`に対する`SELECT`文もトランザクションIDが発行されなかったってことです)
ちなみに`SELECT 1 FROM dual`のようなSQLでもトランザクションIDは割り振られません．
[Pythonによる科学・技術計算] ファイルから読み込まれた2次元データのプロット，可視化，matplotlib

matplotlibを用いて基本的な2次元グラフを作成する。

状況: 
● testing_plot.datという名前のファイルにXYデータが格納されている
● そのファイルからデータを読み込みプロットしたい
● 場合によっては軸に名前をつける等整形したい
 


```py3
"""
ファイルからデータを読み込み，それをプロットする
"""
import matplotlib.pyplot as plt  # maplotlibのpyplotをpltという名前でimportする 


x_list=[] # x_listを定義 (空のリストを作成)
y_list=[] # y_listを定義 

f=open('testing_plot.dat','rt') # プロットしたいデータが入っているファイルをr(読み込み) t(テキスト)モードで読み込む

##  データを読み込み，x_listとy_listに値を格納する
for line in f:
    data = line[:-1].split(' ')
    x_list.append(float(data[0]))
    y_list.append(float(data[1]))
##

### 描画する
plt.plot(x_list, y_list) #プロットするためのデータ指定: ここではｘ軸にx_list，ｙ軸にy_listを指定。折れ線グラフ
plt.plot(x_list, y_list,color='RED',linewidth=4.0) #赤色で出力.線の太さを4.0pt
#plt.plot(x_list, y_list,marker='o') #線と点を作る
#plt.plot(x_list, y_list,'o') #点を作る
 
plt.xlabel('X ') # ｘ軸のラベル
plt.ylabel('Y') # y軸のラベル
#plt.legend(loc='best') # legend

# その他，描画用オプション
plt.xticks(fontsize=7) 
plt.yticks(fontsize=7) 
plt.grid(True) #グラフの枠を作成

#plt.xlim(xmin, xmax) # 描くxの範囲を[xmin,xmax]にする
#plt.ylim(ymin, x¥ymax) # 描くyの範囲を[ymin,ymax]にする
#plt.hlines([y1,y2], xmin, xmax, linestyles="dashed")  # y=y1とy2に破線を描く



plt.show()    # 描画結果を出力する。必ず書く。

```

###結果
![スクリーンショット 2017-07-18 16.23.51.png](https://qiita-image-store.s3.amazonaws.com/0/192457/53e84a5d-375e-6aac-b91f-fcdd403e80cf.png)

***

###補遺: plot()のオプション引数と短縮形(以下，カッコ内の文字列が相当)

**alpha** : 小数で透明度を指定する
**color (c)**: 文字列で色を指定。red(r), blue(b)など。 
**linestyle (ls)**: 線のスタイルの指定。'-', '--', ':'など。
**linewidth (lw)**: 線の太さの指定
**marker**: マーカーの種類の指定。'+', ',', '.', '1', '2', など。
**markerfacecolor (mfc)**: マーカー内部の色の文字列による指定。
**markersize (ms)** マーカーサイズの指定。markeredgewidth(mew)で境界の太さを指定可能。
**antialiased (aa)** アンチエイリアス処理の指定 (aa=Trueまたはaa=False とする)


***

#[補] 例題で使ったXYデータセット: testing_plot.datという名前で保存する。
0.0 164.26
27.9 147.83
35.7 144.55
44.4 141.26
54.2 137.98
65.1 134.69
77.3 131.41
90.9 128.12
106.2 124.84
123.2 121.55
142.3 118.27
163.6 114.98
187.5 111.70
214.4 108.41
244.6 105.13
278.6 101.84
317.1 98.56
360.6 95.27
410.0 91.99
466.2 88.70
530.4 85.42
604.0 82.13
688.8 78.84
786.8 75.56
900.7 72.27
1033.8 68.99
1190.4 65.70
仮想マシンでビルドしたROSでnaoを動かす(pythonドライバー編)

こんにちは、[前回](http://qiita.com/hakuturu583/items/d85baf33b9fab1be5fff)はROSをクロスコンパイルし、rosocoreを走らせるところまで行きました。
今回は簡単に使えそうな[pythonドライバー](http://wiki.ros.org/naoqi_driver_py)でnaoを動かして見たいと思います。
以下のようなスクリプトを書いて環境設定を自動化しました。

```bash:setup.bash
source /home/nao/ros_naoqi_ws/ros_toolchain_install/setup.bash
python /home/nao/ros_naoqi_ws/ros_toolchain_install/_setup_util.py
export PATH=$PATH:/home/nao/ros_naoqi_ws/bin
export NAO_IP=127.0.0.1
export ROSCORE_IP=127.0.0.1
export LD_LIBRARY_PATH=/home/nao/ros_naoqi_ws/external/poco-1.6.1/lib/Linux/i686:/home/nao/ros_naoqi_ws/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/nao/ros_naoqi_ws/external/lz4-r131/lib:$LD_LIBRARY_PATH
```
#実際に動かしてみた
以下のコマンドでrosのnaoqiドライバーモジュールを起動します。

```
roslaunch nao_bringup nao_full_py.launch
```
![Screenshot from 2017-07-18 14:31:03.png](https://qiita-image-store.s3.amazonaws.com/0/160346/6c64e03d-52da-fc15-4ac5-611026c7b9da.png)
おおおお！起動しました！
とりあえずどんなtopicがあるのか見てみます。

```
rostopic list
```
![Screenshot from 2017-07-18 14:35:06.png](https://qiita-image-store.s3.amazonaws.com/0/160346/5ed4be26-1f29-2052-bce2-a331ef55ca26.png)

とりあえず/imuのトピックの情報でも見てみます

```
rostopic echo /imu
```
![Screenshot from 2017-07-18 14:35:49.png](https://qiita-image-store.s3.amazonaws.com/0/160346/6a4bfc07-80e1-4aba-6679-537bdd13fa67.png)
ちゃんと動いてるっぽいです！！
次回があればC++のドライバーでどうなるかも見てみたいですね、また他の関連モジュール(move_base等)に関してもクロスコンパイルを試みているので結果が出ればまた書き込みたいと思います。


#今回わかった事、注意点
##apt-getの偉大さ
rosの利点の一つにapt-getを使った簡単な環境構築があると思います。
apt-get一発でほしいパッケージを探せるシステムがあれば今回のような苦労はいりません・・・
naoqiはgentooベースなのですがemergeはnao実機では消されていて大変苦労しました。
apt-get作ってくれた方ありがとうございます。

##naoのスペック不足の可能性(ネットワーク、演算性能等に関して)
今回はnaoqiのドライバーを実行してみたところsshでnaoを操作する事すら困難になるほど操作が重鈍になりました。
また、[naoのCPUはZ530](https://ark.intel.com/ja/products/35463/Intel-Atom-Processor-Z530-512K-Cache-1_60-GHz-533-MHz-FSB)はであり1コアしかなくハイパースレッディングを使っていたとしてもプロセス、スレッドを多数立ち上げるROSのような仕組みとは相性が良くないのかもしれません。

##naoの容量不足
[前回](http://qiita.com/hakuturu583/items/d85baf33b9fab1be5fff)ros等を走らせるために必要なファイルを転送したわけですが、ここで一度naoqi OSを入れた直後のnaoの中のパーティション構成を見てみましょう。
![Screenshot from 2017-07-14 17:41:12.png](https://qiita-image-store.s3.amazonaws.com/0/160346/a8592297-be47-060a-7e98-33a9682450a9.png)
/dev/mmcblk0p1くらいしかある程度まとめて容量があるパーティションはありません。パスを通すのを面倒臭がってルート領域に何か入れるのはやめたほうが良さそうです。
また、今回作成したプログラムをすべて入れた状態でdf-Hしてみた結果は以下の通りです。
![Screenshot from 2017-07-18 15:02:13.png](https://qiita-image-store.s3.amazonaws.com/0/160346/60a3a0ea-1c16-b6b4-80fe-8ef597cf58a6.png)
もう36%も使ってしまっています・・・・
今回はとりあえず全部転送してしまいましたが今後の事を考えればビルド結果だけ（というか必要なファイルだけ）転送するようにスクリプトを組み直す必要がありますね。
##設計思想の不一致？
nao本体にはパッケージ管理ツールが含まれていない、pythonは動作するがC++は本体内部でコンパイルできない、内部ディスクの空き容量が非常に少ないなどnaoの内部で開発のしにくい環境になっているように感じます。
そしてnaoqi SDK自体が分散制御系をサポートしているところから考えてそもそも分散制御系を前提にしている節があると筆者は考えます。
そのためあまり多くの内部容量がなかったりコア数が少ない設計になっているのではと思います。
ROSは確かに素晴らしいシステムだと感じますがそれはあくまで十分なハードウェアリソース（処理速度、通信速度等）が確保できる状況での話であり、この方法はその意味ではあまりいい方法ではないのかもしれません。
しかし、SPLリーグではnaoの他に計算機を用いることは禁止されているため、今後も解決の道を模索したいと思います。
East Asian WidthとiTerm2

チラ裏品質

# とりあえず気になる問題

<img width="116" alt="スクリーンショット 2017-07-18 15.29.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/85e79d3b-5bfa-3d39-5a4a-1b56a77cd5a7.png">

この動作がちと気に入らなかった。

まず、実はiTerm2においてもFAQレベルの問題である。

https://www.iterm2.com/faq.html

> Q: I'm a Chinese, Japanese, or Korean user and some characters don't line up because they are not rendered in double-width.
> A: Go to Preferences->Profiles->Text and change the setting of "Treat ambiguous-width characters as double-width."

で、これをやろうとすると……最近のバージョン(筆者環境: Build 3.0.15)ではこれが「Not recommended」になっている。

<img width="908" alt="スクリーンショット 2017-07-18 15.22.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/88974dfd-37d0-39ac-87af-4f5818fa0803.png">

<img width="417" alt="スクリーンショット 2017-07-18 15.22.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/e5e0cce7-ca94-e021-a1bb-01c566c22e1f.png">

追記（2019-10-31）: 3.3.4 ではPreferencesの構成が変わって見た目には「not recommended」が消えたが、チェック非推奨という点では差はない。

<img width="923" alt="スクリーンショット 2019-10-31 16.06.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14365/d8247c9a-04e3-160f-6ad9-30fd8b728857.png">


実際、効果があると同時に頂けない副作用がある。

<img width="113" alt="スクリーンショット 2017-07-18 15.35.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/728d3477-9545-b7ec-5a68-e496952b1823.png">

これは良い結果。ところが履歴をたどると

<img width="143" alt="スクリーンショット 2017-07-18 15.36.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/9aa84e95-3a21-bb57-c111-9ab4ceb56ec5.png">

明らかにバグっている。

説明が非常にめんどくさいので端折るが「…」で扱いがおかしくなる。上のチェックを外すと半角として扱われ、一貫性がある。

上はたまたまPythonだが (そもそもUnicodeの別のことを調べてた)、 ``echo ★`` で遊んでいても酷いことは起こるものだ。

オプションチェックなしだと、表示がおかしいだけで動作は一貫していて予測はできる。一方全体としてカーソルの動作に一貫性がなくなる。
どちらでも100%まともに動作しているように見えない点は変わらないが「なぜ」かは分からない(今のところ興味もない)。

# 東アジアの文字幅

こんなのがある。

[東アジアの文字幅](https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85)

[Unicode® Standard Annex #11 EAST ASIAN WIDTH](http://unicode.org/reports/tr11/)

> Unicode 10.0.0
> 2017-05-14
> ...
> Revision 33
> Reissued for Unicode 10.0.0.

Annexとは「付録」の意味だ。

> A Unicode Standard Annex (UAX) forms an integral part of the Unicode Standard, but is published online as a separate document. The Unicode Standard may require conformance to normative content in a Unicode Standard Annex, if so specified in the Conformance chapter of that version of the Unicode Standard. The version number of a UAX document corresponds to the version of the Unicode Standard of which it forms a part.

いやーつまりだいぶややこしい話だな？ (バカ

「プロポーショナルフォントとかそういう世界で全角と半角の二種類に綺麗にぶった切れるなどとついぞ思いなさんな」みたいなオーラがある。

おそらくiTerm2に欧米圏的に重要度が低いambiguous-widthな文字の扱いにバグがある。また、「Monacoフォントの★が本来半角であって欲しいところで堂々と全角を出してくる」という問題にも同時に思える。

正確な原因は結局よく分からんが、そもそも本でちら見して調べたにしてちょっとややこしすぎるのでここでおしまいにする。少なくとも「例によってUnicodeは複雑だなぁ」と思い直すに至る。

とりあえず、カーソルの動作があまりにもすんごく異様になるのでこのオプションは当座は付けないことにした。どうせ見た目だけの問題だ。

ターミナルそれぞれで設定があることが多いようだ。まともに動作するかは分からないが他のターミナルソフトウェアでも、気になったらプリファレンスあたりを確認してみると良い (「曖昧幅の文字」とかそういう表現をしているようだ)
[Pythonによる科学・技術計算] 2階常微分方程式の数値解法，初期値問題，数値計算

#はじめに

numpy, sympy, scipyを利用して，
2階常微分方程式を初期条件の下で解く。

#内容
問題(単振動): ($k=1$はパラメータ) 
$x''(t)+kx(t)=0$, 初期条件 $x(0)=0, x'(0)=1$

[1階常微分方程式の問題](http://qiita.com/sci_mofy/items/6e0b6c2fc751876bc8e7)では初期条件を数値で与えたが，2階以上の常微分方程式の解法では**初期条件をリストで与える**ことに注意する。

# コード
```py3

from sympy import *      # sympyライブラリから全ての機能をimoprt
import numpy as np      # numpyをnpという名前でimport 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt
"""
2階微分方程式
例題 (単振動): d^2x/dt^2 = -kxを x(0)=0,x'(0)=1の初期条件の下で解く
"""
#シンボル定義
x=Symbol('x')                  # 文字'x'を変数xとして定義
t=Symbol('t')                  # 文字 't'を変数tとして定義
k=Symbol('k')                  # 文字 'k'を変数kとして定義。本問ではパラメータとして使う。
#

def func2(x, t, k):
    x1,x2=x
    dxdt=[x2,-k*x1]
    return dxdt

k = 1.0 # パラメータ設定
x0 = [0.0,1.0] # 初期条件: それぞれx(0), x'(0)を表す

t=np.linspace(0,10,101) # 積分の時間刻み設定: 0から10までを101等分する
sol2=odeint(func2, x0, t, args=(k,)) # 数値的に微分方程式を解き， x(t)とx'(t)をsol2のリストの[:,0]および[:,1]成分へ格納する。

    
#可視化

plt.plot(t, sol2[:,0], linewidth=1,label='x(t)') #  x(t) を図示
plt.plot(t, sol2[:,1], linewidth=1,label='dx(t)/dt') # dx/dt を図示
plt.xlabel('t', fontsize=18)
plt.ylabel('x', fontsize=18,rotation='horizontal')
plt.legend(loc='upper right')
plt.show()
```


###結果
![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/ed51b59c-a58f-2295-e73f-c55b1f50697b.png)
Lambdaで特定のBucket(S3)にある全Objectリストを取得する方法


list_objecthsで取得できるのは一度に1000件なので、`while` で回す


```python:s3_objects.py
import boto3

BUCKET_NAME = ''


def list_handler(event, context):
    s3_client = boto3.client('s3')

    contents = []
    next_token = ''
    while True:
        if next_token == '':
            response = s3_client.list_objects_v2(Bucket=BUCKET_NAME)
        else:
            response = s3_client.list_objects_v2(Bucket=BUCKET_NAME, ContinuationToken=next_token)

        contents.extend(response['Contents'])
        if 'NextContinuationToken' in response:
            next_token = response['NextContinuationToken']
        else:
            break

    print(contents)
    print(len(contents))

```


[参考:BotoAPIドキュメント](https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2)
仕分メソッドaccountとmapの違い

# 仕分メソッドaccountとは

各点が含まれる区間を戻す。発端は[group_by のような処理で、要素数を保ったまま戻り値を得るメソッド(名称募集)](http://qiita.com/Gatz/items/ea664f53234cd83880a5)

* 各点
                                                                                                                               
```ruby
distances = [0, 20, 40, 60, 80, 100, 120, 126.153]`
```

* 区間集合                                                                                                                           

```ruby
sections = [
  {"距離" =>   0,     "高さ" => 80.650},
  {"距離" =>  40,     "高さ" => 78.650},
  {"距離" => 126.153, "高さ" => 76.065}
]
```

* 計算結果

```
=> distances.account(sections.dup, "距離")
{"距離"=>0, :under=>{"距離"=>0, "高さ"=>80.65}, :over=>{"距離"=>40, "高さ"=>78.65}}
{"距離"=>20, :under=>{"距離"=>0, "高さ"=>80.65}, :over=>{"距離"=>40, "高さ"=>78.65}}
{"距離"=>40, :under=>{"距離"=>40, "高さ"=>78.65}, :over=>{"距離"=>126.153, "高さ"=>76.065}}
{"距離"=>60, :under=>{"距離"=>40, "高さ"=>78.65}, :over=>{"距離"=>126.153, "高さ"=>76.065}}
{"距離"=>80, :under=>{"距離"=>40, "高さ"=>78.65}, :over=>{"距離"=>126.153, "高さ"=>76.065}}
{"距離"=>100, :under=>{"距離"=>40, "高さ"=>78.65}, :over=>{"距離"=>126.153, "高さ"=>76.065}}
{"距離"=>120, :under=>{"距離"=>40, "高さ"=>78.65}, :over=>{"距離"=>126.153, "高さ"=>76.065}}
{"距離"=>126.153, :under=>{"距離"=>126.153, "高さ"=>76.065}, :over=>nil}
```

# 仕分account処理の考察

* 特徴
  * 配列distancesとsectionsで__順序__(ここでは"距離")が結合基準(距離の小<大)
  * 結合基準が一致(==)の場合がmap。そのためmapとは本質的に異なる
  
* 性能

  * 一点に対して区間集合の中のどの区間に属すか、検索すると各点数n × 区間数mの手間
  * 一方でaccountは判定毎に比較母数の区間数mが減るので、格段に手間が減る
    * 一つ一つ検索するよりも、まとめて与えて判定する方が良い
    * ... なのでそれなりに存在価値があるのではなかろうか。
 
# 実装はsort_by()を模倣して

　判定時の値をブロックの評価結果で指定

```ruby
class Array
  def account(sectionlist, &block)
    return self.map{ |distance|
      while sectionlist.length > 0 do
        under = sectionlist.first()
        over  = sectionlist.length < 2 ? nil : sectionlist[1];
        if (over.nil? || distance < (block_given? ? yield(over): over))
          break {:key => distance, :under => under, :over => over}
        end
        sectionlist.shift();
      end
    }
  end
end

=begin
各点の高さを求めようとすると、accountとmapは本質的に異なるとはいえ、冗長。
=end
puts distances.account(sections.dup){|section| section["距離"]}

puts distances.account(sections.dup){|section| section["距離"]}.map{|distance, under, over|
  height = if over.nil?
             under["高さ"]
           else
             grad   = (over["高さ"] - under["高さ"])/(over["距離"] - under["距離"])

             under["高さ"] + grad * (distance - under["距離"]);
           end
  {"距離" => distance, "高さ" => height};
}
```

# 重み付け関数という位置づけがいいのかもしれない。

```ruby
  def weighted(sectionlist, key, &block)
    return self.account(sectionlist){|section| section[key]}.map{|v|
      block_given? ? block.call(v[:key], v[:under], v[:over]) : v
    }
  end

puts
puts distances.weighted(sections.dup, "距離"){|distance, under, over|
  height = if over.nil?
   ... 以下略
  {"距離" => distance, "高さ" => height};
}
```
FlyGrep.vimで、Helmライクな高速コード検索を実現

# 概要

Vimでは `ack.vim` や `ag.vim` と `ripgrep` を合わせてコード検索をしていたが、もっとシームレスにできないかと思っていた。

というのも、以前Emacsを使っていた時に `Helm-ag` による高速な検索が実現できていたからだ。

# FlyGrep.vim

https://github.com/wsdjeg/FlyGrep.vim

そう思っていたら、 wsdjeg 氏が作っていた。SpaceVim から切り取ったものらしい。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/103885/9ca75e1f-2701-54a8-91ed-095ba8fe0a31.gif)


Helm-ag のような使い心地だ。もちろん Helm-ag の方が高機能であるが。


# 備考

[vim-swoop](https://github.com/pelodelfuego/vim-swoop) もある。
以前試してあまり使い勝手が良くなかった覚えがあるが、今見たらかなり使いやすくなっていそうだった。後で試す。
[Pythonによる科学・技術計算] 1階常微分方程式の数値解法，初期値問題，数値計算

numpy, sympy, scipyを利用して，
1階常微分方程式を初期条件の下で解く。

問題: 
$x'(t)+k x(t)=0$, 初期条件 $x(0)=1$, (k=1はパラメータ)

厳密解は$x(t)=e^{-t}$である。



```py3
from sympy import *      # sympyライブラリから全ての機能をimoprt
import numpy as np      # numpyをnpという名前でimport 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt

"""
例題: 1階常微分方程式: 
dx/dt = -kxを x(0)=1の初期条件の下で解く
"""

x=Symbol('x')                  # 文字 'x'を変数xとして定義
y=Symbol('y')                  # 文字 'y'を変数yとして定義
t=Symbol('t')                  # 文字 't'を変数yとして定義
k=Symbol('k')

def func(x, t, k): # dx/dtを関数として定義
    dxdt=-k*x
    return dxdt

k = 1.0 #パラメータへ値を設定する
x0 = 1.0 # 初期条件

t=np.linspace(0,10,101) # 積分の時間刻み設定: 0から10までを101等分する

sol=odeint(func, x0, t, args=(k,)) # 数値的に微分方程式を解く。結果をsolというリストへ格納する。

#比較のための厳密解(e^-t)をリストexact_solへセット
exact_sol=[]
tt=np.linspace(0,10,101)
for i in tt:
    exact_sol.append(exp(-1.0*float(i)))
#

    
#可視化

plt.plot(t, sol, linewidth=1,label='numerical') # 数値解
plt.plot(tt, exact_sol, color='red',linewidth=1, label='exact') #真の解

plt.xlabel('t', fontsize=18)
plt.ylabel('x', fontsize=18,rotation='horizontal')
plt.legend(loc='upper right')
plt.show()
```

##結果

![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/7b213540-1791-3f7d-af44-31b873d60bac.png)
Windowsでファイル内検索（findstr）

コマンドプロンプトで次のように打って、mojiの含まれるファイルを検索する。
`findstr /s /i "moji" myfold/*`
（カレントディレクトリにmyfoldディレクトリがあるとき）

（オプションの意味）
/s: サブディレクトリを検索する
/i: 検索文字列の大文字・小文字を区別しない

[ DOS コマンド一覧 Findstr](https://pf-j.sakura.ne.jp/program/dos/doscmd/findstr.htm)
[Pythonによる科学・技術計算] 常微分方程式の解法，数式，sympy

sympyのdsolveメソッドを利用して，定数係数2階線形同次常微分方程式

$2y''(x)+5y'(x)+2y(x)=0$

の一般解を求める。



```py3
from sympy import *
"""
常微分方程式の一般解を求める
"""
x=Symbol('x')                  # 文字'x'を変数xとして定義
y=Symbol('y')                 # 文字 'y'を変数yとして定義

#dsolveにより一般解を求める。
dsolve(2*y(x).diff(x,2)+5*y(x).diff(x,1)+2*y(x))
```

注: コード中の5*y(x).diff(x,1)は， $5 y'(x)$を表す。同様に2*y(x).diff(x,2)は$2 y''(x)$を表す。

###結果

![スクリーンショット 2017-07-18 15.33.40.png](https://qiita-image-store.s3.amazonaws.com/0/192457/5fd3d88b-779c-12c2-338b-5d8397b95b83.png)

C1とC2は初期条件から定まる定数である。
【S3 Event通知】Unable to validate the following destination configurations. Not authorized to invoke function


# 問題
S3の管理画面からオブジェクトのPutに対してLambda関数を実行しようとしたところ、以下のエラーが出力された。

```
Unable to validate the following destination configurations. Not authorized to invoke function
```

# 原因
Lambda関数ポリシーでS3からこのLambda関数を実行する権限が許可されていなかった。
S3の管理画面からは操作できないが、Lambdaの管理画面からはトリガータブから操作することができる。
というより、Lambdaの管理画面からイベントをトリガーにすると自動で付与される。

# 理解
[関数ポリシーについて](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/access-control-resource-based.html)
権限といったらIAM Roleがぱっと思いつくけど、関数ポリシーなんてものもあるんですね。
docker-compose で Redis連携


##Append-only fileで永続化設定

```docker-compose.yml
version: '2'

services:

  redis:
    image: redis:3.2.9
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes --requirepass foobared
    volumes:
       - redis-data:/data

  volumes:
    redis-data:
      driver: local
```

■ ポイント
・appendonly yes 
　　参照 [Append-only file](https://redis.io/topics/persistence)

・requirepass foobared
　　参照 [docker-compose example](https://hub.docker.com/_/redis/)
　　任意のパスワード指定 ex) foobared

・volumesで永続化
[Python] フィボナッチ数列をジェネレータで生成

フィボナッチ数列を生成するやり方はいく通りか考えられると思います。
例えばリストの最後の2項を足してappendするとか、再帰的なメソッドで生成するとか。
ただ、シンプルさと利用シーンを考えたときに、イテレータとして取り出せる方がいいよねと思い立ち、再帰的なジェネレータを使って定義できるんじゃないかということで、書いて見ました。



```fibonacci.py
def fibonacci(n):
    fibo = fibonacci(n-1)
    for i in range(n):
        if i <= 1:
            result = i
            yield result
        else:
            previous = next(fibo)
            result = result + previous
            yield result
```

利用例

```repl:
>>> for i in fibonacci(10): print(i, end=' ')
...
0 1 1 2 3 5 8 13 21 34

>>> [ i for i in fibonacci(15) ]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
```

---
と思ったら、再帰を使わないもっとシンプルな方法ありました。

```fibonacci.py
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, b+a
```
@shiracamus さんご指摘ありがとうございました👏
Rails + CircleCI 1.0 + AWS の設定手順 ビルド開始～デプロイ完了まで


# はじめに

RailsでCircleCI環境を整えるまでの手順をまとめました。

CircleCIはバージョン2.0がありますが、
Dockerがないといけない？ようなので、バージョン1.0で準備しました。

## circleCIとは

簡単に言うと、
githubのpushを検知して、自動でビルドからテスト、デプロイまで自動化してくれるツール。
（デフォルトだと全部ブランチ対象）

1コンテナは無料なので、時間が掛かってもよいのであれば無料枠で十分。

https://circleci.com/

## 設定ファイル

必要なファイルは以下3つ

① circle.yml
② config/database.yml.ci
③ script/deploy-staging.sh

### ① circle.yml
circleCIを動かくための設定ファイル。
Railsのアプリケーションディレクトリ直下にファイルを作ります。(gemfileとかと同じ場所)

### ② config/database.yml.ci
テストするためのDB設定ファイル。Rspecを実行するために必要。

### ③ script/deploy-staging.sh
テストが終わったらステージング環境へデプロイするためのスクリプトファイル。

## 設定ファイルの中身

```circle.yml
machine:
  timezone:
    Asia/Tokyo
  ruby:
    version:
      2.3.0
dependencies:
  pre:
    - sudo pip install awscli
  override:
    - bundle install:
database:
  pre:
    - mv config/database.yml.ci config/database.yml
  override:
    - bundle exec rake db:create db:schema:load RAILS_ENV=test
    - bundle exec rake db:migrate RAILS_ENV=test
test:
  override:
    - bundle exec rspec spec/
deployment:
  staging:
    branch: master
    commands:
      - sh script/deploy-staging.sh:
          timeout: 1500
```
ポイント
AWSにデプロイするのにawscliを使用するために、
「sudo pip install awscli」を記述する。（デフォルトは古いらしい）
DB名は「test」じゃないと動かない。

```config/database.yml.ci
test:
  adapter: postgresql
  encoding: unicode
  database: test
  pool: 5
```

```script/deploy-staging.sh
#!/bin/sh

export AWS_DEFAULT_REGION="ap-northeast-1"

MYSECURITYGROUP="*"
MYIP=`curl -s ifconfig.me`

aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32

bundle exec cap production deploy

aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
```
ポイント
MYSECURITYGROUPは、AWSのセキュリティーグループIDを指定する。
LFの改行コードで作成する。CRLFだと動かない。


## その他設定
CircleCI側にAWSの秘密鍵を登録する。
AWS上で「cat ~/.ssh/id_rsa」で表示されるもの。

CircleCI側にAWSのアクセスキーとシークレットキーを設定

AWSの秘密鍵をAWSの認証キーとして登録。
AWS上で「cat id_rsa >> ~/.ssh/authorized_key」

Port 22をセキュリティグループで空けておく。
[Pythonによる科学・技術計算] 2次および3次方程式の解析解の導出，数式，sympy

#はじめに

sympyのsolveメソッドを利用して，2次方程式$ax^2+bx+c=0$ および3次方程式$ax^3+bx^2+cx+d=0$の解析解を導出する。


#コード
```py3:(1)2次方程式
from sympy import *
x=Symbol('x')                  # 文字'x'を変数xとして定義
"""
解の公式の導出
"""
a=Symbol('a')
b=Symbol('b')
c=Symbol('c')
d=Symbol('d')
#二次方程式
solve(a*x**2+b*x+c,x)
```
***
#結果(1)
![スクリーンショット 2017-07-18 15.02.50.png](https://qiita-image-store.s3.amazonaws.com/0/192457/56dec8dd-3992-a7b2-a070-3d1236b0e40f.png)

***

# 3次方程式の解の公式

```py:(2)3次方程式
from sympy import *
x=Symbol('x')                  # 文字'x'を変数xとして定義
"""
解の公式の導出
"""
a=Symbol('a')
b=Symbol('b')
c=Symbol('c')
d=Symbol('d')
solve(a*x**3+b*x**2+c*x+d, x)
```


###結果(2)
![スクリーンショット 2017-07-31 3.28.20.png](https://qiita-image-store.s3.amazonaws.com/0/192457/5394cc89-26cb-2f1c-0b37-01a3a1b82558.png)

***
### 
同様にして4次方程式の解の公式も導出できる。
[Pythonによる科学・技術計算] 方程式の解を求める 解析解 sympy

#内容
sympyのsolveメソッドを利用して以下の3つの問題を解く。

(1)  二次方程式, $x^2+5x+3=0$, の根を求める。
(2) 三次方程式, $3x^3+3x-5=0$, を解く。虚数解が出る。
(3) 2元連立方程式,  $x^2+y^2=4, y = 2x+1$, を解く。

***
#コード(1)
```py3:例(1)
from sympy import *
x=Symbol('x')                  # 文字'x'を変数xとして定義

"""
方程式: solve
例: 2 * x **2 +5*x+3=0の根を求める
"""
sol=solve(2 * x **2 +5*x+3, x) # 解をsolに格納
print(sol)
```

***
# 結果: 例題(1)
![スクリーンショット 2017-07-18 14.51.46.png](https://qiita-image-store.s3.amazonaws.com/0/192457/eea7cbe0-6211-cb0f-0f45-5039f5965012.png)

***
#コード(2)
```py3:例(2)
from sympy import *
x=Symbol('x')                  # 文字'x'を変数xとして定義

"""
方程式: solve
例: 2 * x **3 +3*x-5=0の根を求める
"""
sol=solve(2 * x **3 +3*x-5, x)
print(sol)
```
# 結果: 例題(2)
![スクリーンショット 2017-07-18 14.57.38.png](https://qiita-image-store.s3.amazonaws.com/0/192457/5e99a790-1bc0-ddab-228e-510de8441ef9.png)

***

#コード(3)
```py3:例題(3)
from sympy import *
x=Symbol('x')    # 文字'x'を変数xとして定義
y=Symbol('y')    # 文字'x'を変数xとして定義

"""
方程式: solve
連立方程式 x**2+y**2=4, y=2x+1の解を求める
"""
b= solve ([x*2+y**2-4, y-2*x+1],[x,y])  # 連立方程式を解く
print(b)
```
***
#結果: 例題(3) 
```
[(1/4 + sqrt(13)/4, -1/2 + sqrt(13)/2), (-sqrt(13)/4 + 1/4, -sqrt(13)/2 - 1/2)]
```
FirebaseにAPNs証明書をアップロードした時に「不明なサーバーエラー」が発生した場合

# 背景
FirebaseにAPNsの開発用証明書をアップロードしようと思い、[プロジェクトの設定]→[クラウドメッセージング]→[APNs証明書]→[UPDATE]から新しい証明書をアップロードしようとしたところ、「不明なサーバーエラーが発生しました」と表示されてしまい、アップデートできませんでした。
書き出し時のパスワードやAppIdの指定が誤っていればそれとわかるエラーがでるのですが、不明と言われてしまうともう原因が想像できません。

# 結論：書き出し方が違う
結論から言えば、証明書（p12ファイル）の書き出し方が異なっている可能性があります。
私はキーチェーンアクセスの当該秘密鍵を右クリックして「"XXX(秘密鍵名)"を書き出す...」から書き出していました。
正しくは、当該 **証明書** を右クリックして「"XXX(証明書名)"を書き出す...」から書き出します。

秘密鍵が必要だから... と考えて秘密鍵を書き出していると、このエラーに遭遇しそうです。

# 参照
https://stackoverflow.com/questions/43838621/error-occurred-while-updating-your-apns-certificate-ios-notification-firebase
pycairoで作成したimageをファイルにしないでkivyのcanvasに描画させたい

kivyでcairoを使いたかった。
ファイルを吐き出すのは嫌だった。
ただそれだけ。

自分の環境では`pycairo`をインストールできなかったので`cairocffi`を利用しています。
環境

* Ubuntu 16.04
* python 3.6.1
* kivy 1.10.0

```
import cairocffi as cairo
import math
import io

from kivy.config import Config
Config.set('graphics', 'width', '300')
Config.set('graphics', 'height', '200')

from kivy.core.image import Image as CoreImage
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle

class HinomaruApp(App):
    #cairoで日の丸を描画
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 300, 200)
    context = cairo.Context(surface)
    context.set_source_rgb(1,1,1)
    context.rectangle(0,0, 300,200)
    context.fill()
    context.set_source_rgb(1, 0, 0)
    context.arc(150, 100, 66, 0, 2 * math.pi)
    context.fill()
    def build(self):
        widget = Widget()
        bio = io.BytesIO()
        self.surface.write_to_png(bio)
        im = CoreImage.load(io.BytesIO(bio.getvalue()), ext='png')
        texture = im.texture
        with widget.canvas:
            Rectangle(texture=texture, size=(300, 200))
        return widget

if __name__ == '__main__':
    HinomaruApp().run()
```

`Image Widget`を利用したい場合は

```
- from kivy.graphics import Rectangle
+ from kivy.uix.image import Image


-        with widget.canvas:
-            Rectangle(texture=texture, size=(300, 200))
+        widget.add_widget(Image(texture=texture, size=(300,200)))
```

で行ける模様

結果

![hinomaru.png](https://qiita-image-store.s3.amazonaws.com/0/30663/2b225f6c-8a34-981e-a9c0-be2e3ab5f725.png)
[Pythonによる科学・技術計算] 積分, 数式, sympy

#内容
sympyの**integrate**メソッドを使い，初等関数の，不定積分・定積分・広義積分の解析解を求める。



***

#コード
```py3
from sympy import *
x=Symbol('x')                  # 文字'x'を変数xとして定義
y=Symbol('y')                 # 文字 'y'を変数yとして定義
"""
積分:
integrateを使う
"""

#不定積分
integrate(6*x**5, x) # 6 x^5の不定積分
integrate(log(x), x) # log(x)

#定積分
integrate(x**3, (x, -1, 1))  # x^3の[-1,1]までの積分
integrate(sin(x), (x, 0, pi/2)) # sin(x)の[0,pi/2]までの積分

#広義積分
integrate(exp(-x**2), (x, -oo, oo)) #Exp(-x^2)の-∞から+∞までの積分。ガウス積分。
```

***

#結果
上から順に，以下の通りになる。


![スクリーンショット 2017-07-18 14.46.34.png](https://qiita-image-store.s3.amazonaws.com/0/192457/6dc84a0f-7461-4a45-24db-e4619dfeeff7.png)
[Pythonによる科学・技術計算] 導関数(微分)の値を求める，数値計算

#内容

sympyを利用して， $x^3$の導関数 ($= 3 x^2$) の $x= a = 2$における値 ($=6$)を求める。

**diff**メソッドにより導関数を求め， **limit**メソッドを用いて x -> a の極限値を評価することで導関数値を求めている。

***
#コード
```py3:derivative.py

from sympy import *
x=Symbol('x')      # 文字'x'を変数xとして定義
"""
例: x^3のx=2における導関数の値をもとめる
"""
def dfdx(x,a):
    return limit(diff(x**3,x),x,a)

dfdx(x,2)
```
***
# 結果
6
Macでpython3でGoogle Cloud Speech gRPC API を使ってストリーム音声認識をする！

# 事前説明
## 最新情報（２０１７年１１月７日）
googleAPIインタフェースが変更されていたりして，そのままでは動かなくなっているようです．
今後新たに，ストリーム音声認識を使う方は，以下の @delete さんの記事を参考にされると良いです．
https://qiita.com/delete/items/395776c6843d67fd65fd

## 以前に書いた記事
以下にあります．

【Google Cloud Speech gRPC API を使ってストリーム音声認識をしたい！（簡易VAD付けた）】
http://qiita.com/sayonari/items/a70118a468483967ad34

## 今回の記事の説明
この記事は，新しい環境で，google音声認識をやったら，上手く行かなかったので，最初からインストールしたときのメモを残しておくものです．ちゃんと再検証できていないので，ご意見や修正事項を発見された方は，どしどしご意見ください．

# 本編
## 実行環境
- マシン：MacBook Pro (Retina, 13-inch, Early 2015)
- OS：MacOS Sierra 10.12.5

## インストール
## google cloud API dashboard
https://console.cloud.google.com/?hl=ja
google cloud APIで，speechAPIを利用可能にする方法は，結構めんどくさいですが，情報が溢れているので，各自でググって調べてください．

## プロジェクトの作成
自分の好きな名前でプロジェクトを作りましょう．
`GoogleCloudAPI-ASRtest` というプロジェクトを作りました．
SpeechAPIを使えるようにしたら，API内のIDが出るので，それを覚えておきましょう．

## ライブラリのインストール
`pip install google.cloud.speech`

## gcloud コマンドのインストール
https://cloud.google.com/sdk/docs/quickstart-mac-os-x?hl=ja

`install.sh`の実行

## SDKの初期化
`gcloud init`

「You must log in to continue. Would you like to log in (Y/n)?」と聞かれるので，Yを入力．

ブラウザが立ち上がるので，API登録したgoogleアカウントでログイン．

「Pick cloud project to use: 」の下に，番号とともに，APIプロジェクト名が並ぶので，SpeechAPIを登録したプロジェクトを選択．

「Do you want to configure Google Compute Engine 
(https://cloud.google.com/compute) settings (Y/n)? 」　Yとして，サーバーの選択．
「 [2] asia-east1-b」にした．


## PYTHONPATHに，パスを追記
`pip install gcloud`

インストールされたディレクトリを，`PYTHONPATH`に追加

僕の場合は，以下のようになった．
`export PYTHONPATH="/Users/nishimura/.pyenv/versions/3.6.1/lib/python3.6/site-packages:$PYTHONPATH"`

これを，`~/.bash_profile`に追記しておくと，毎回自動で実行されるから便利．

## クレデンシャル　デフォルト設定
`gcloud auth application-default login`

ブラウザが立ち上がるので，googleのアカウントでログイン．
アプリケーションの承認．

## googleのサンプルを実行
https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/speech/cloud-client

`transcribe_streaming_mic.py`を実行したら，英語で音声認識できる．

## 日本語音声認識したいよ！
プログラム内（main関数内）の，configを設定しているところで直接指定する．

```
language_code='ja-JP'
```

## 認識候補　（phrase hints）を与えたいよ！
main関数内のconfigを，こう書き換えてみたら？

```
    config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=RATE,
        language_code='ja-JP',
        speech_contexts=[speech.types.SpeechContext(
            phrasesHints=["キータが来た","ホントっすか"]
        )]
    )
```

ただ，「読み」が与えられないので，漢字で書くと上手く認識されない．残念．
誰か，「読みの与え方」を知ってたら教えてくださいm(_ _)m

# 上述されていない参考にしたページ

公式マニュアル
https://media.readthedocs.org/pdf/google-cloud-python/latest/google-cloud-python.pdf
[Pythonによる科学・技術計算] (偏)微分, 数式, sympy

#内容
sympyを利用して初等関数の導関数を求める。

***
#コード
```py3
from sympy import *      # sympyライブラリから全ての機能をimoprt
sym.init_printing()      # 出力を整形

x=Symbol('x')                  # 文字'x'を変数xとして定義
y=Symbol('y')                 # 文字 'y'を変数yとして定義


#微分
diff(sin(x),x)  #sin(x)の微分
diff(exp(x),x)   # e^xの微分

# 高階微分
diff(x**4+x**3,x,2)  # x^4+x^3の2階微分


#偏微分
diff(x**2+x*y+2*y**2,x)  # x^2+xy+2y^2のxによる偏微分


# 微分記号を残す場合
Derivative(y(t),t)
```

***

#結果

上から順に，以下の通りになる。


![スクリーンショット 2017-07-18 14.24.42.png](https://qiita-image-store.s3.amazonaws.com/0/192457/a7541c2e-35fa-1cd5-65e7-b73b13ccb5d4.png)

![スクリーンショット 2017-08-02 2.21.57.png](https://qiita-image-store.s3.amazonaws.com/0/192457/ec3ff174-9a86-3a10-fddf-b2c02f1d351a.png)
[Pythonによる科学・技術計算] テイラー展開, 数式, sympy

sympyを利用してsin(x)のx=0まわりとx=1.5周りのテイラー展開を行う。


```py3

from sympy import *      
"""
series関数を使う。
series("関数", 変数, "x=どこ周りで展開するか", 展開の打ち切り次数)
#デフォルトではx=0周り
"""
x=Symbol('x')                  # 文字'x'を変数xとして定義
y=Symbol('y')                 # 文字 'y'を変数yとして定義
```


```py3
series(sin(x),x) # デフォルト設定
```


![スクリーンショット 2017-07-18 14.12.03.png](https://qiita-image-store.s3.amazonaws.com/0/192457/de27fe50-b3b9-b000-1860-ecc4c84fc633.png)

```py3
series(sin(x),x, 0, 12) # x=0まわりでO(x^12)まで展開
```


![スクリーンショット 2017-07-18 14.12.06.png](https://qiita-image-store.s3.amazonaws.com/0/192457/26f37200-0aa9-a773-53c7-29fd8a1af7a1.png)

```py3
series(sin(x),x, 1.5, 12)  # x=1.5まわりでO(x^12)まで展開
```

![スクリーンショット 2017-07-18 14.12.10.png](https://qiita-image-store.s3.amazonaws.com/0/192457/b50d6b3e-e6f7-8080-f09f-7fd50d2f5cce.png)
codeigniterでアップロードした画像をexif情報から回転。更にリサイズもする。

```php:controller
function send_name() {
		$form = $this->input->post();
		if (!isset($_FILES['PATH'])) {
			$path = "";
		} else {
			$config = [];
			$config['upload_path'] = FCPATH . 'images/user';
			$config['file_ext_tolower'] = TRUE; //大文字小文字判別
			$config['allowed_types'] = 'gif|jpg|png|jpeg';
			$config['encrypt_name'] = TRUE; //乱数名前にする。
			$config['max_size'] = 5000;
			$this->load->library('upload', $config);
			if (!$this->upload->do_upload('PATH')) {
				$error = [
					'error' => $this->upload->display_errors("", ""),
				];
				$this->json_library->_echo(201, $form, $error, $this->upload->display_errors("", ""));
			} else {
				$data = $this->upload->data();
				$path = "user/" . $data['file_name'];
				if ($data) {

					$this->Registration_model->orientationFixedImage($data["full_path"]);

					$config = array(
						"source_image" => $data["full_path"],
						"maintain_ratio" => true,
						"width" => 200,
						"height" => 200
					);
					// イメージライブラリは次のように引数をとります。
					// 引数はライブラリ読み込み前に定義しておきます。
					$this->load->library('image_lib');
					$this->image_lib->initialize($config);
					if (!$this->image_lib->resize()) {
						echo $this->image_lib->display_errors();
					}
				}
			}
		}

/*

db操作は割愛。

*/
	}
```

```php:model
public function orientationFixedImage($input) {
		$exif = @exif_read_data($input);
		if (empty($exif['Orientation'])) {
			return FALSE;
		}

		$this->load->library('image_lib');

		$config['image_library'] = 'gd2';
		$config['source_image'] = $input;

		$orientations = array();

		switch ($exif['Orientation']) {
			case 1: // no need to perform any changes
				break;

			case 2: // horizontal flip
				$orientations[] = 'hor';
				break;

			case 3: // 180 rotate left
				$orientations[] = '180';
				break;

			case 4: // vertical flip
				$orientations[] = 'ver';
				break;

			case 5: // vertical flip + 90 rotate right
				$orientations[] = 'ver';
				$orientations[] = '270';
				break;

			case 6: // 90 rotate right
				$orientations[] = '270';
				break;

			case 7: // horizontal flip + 90 rotate right
				$orientations[] = 'hor';
				$orientations[] = '270';
				break;

			case 8: // 90 rotate left
				$orientations[] = '90';
				break;

			default:
				break;
		}

		foreach ($orientations as $orientation) {
			$config['rotation_angle'] = $orientation;
			$this->image_lib->initialize($config);
			
			$this->image_lib->rotate();
		}
		 $this->image_lib->clear();
	}
```

すでに` $this->load->library('upload')`されてれば` $this->image_lib->initialize($config);`
[Pythonによる科学・技術計算] 和の計算, 数値計算

#内容

$e^x$の値をテイラー展開のn次の項までの和

```math
e^{x} = 1+\frac{x}{1!} +\frac{x^{2}}{2!}+ .... \frac{x^{n}}{n!}

```

によって計算する。

***
#コード

```py3
from math import pi,e, log, factorial
import matplotlib.pyplot as plt

"""
e^xのテイラー展開
例: x=1としてeを計算する
"""

def calc_e(n,x):
    dum=0.0
    for nn in range(n+1):  # x^n/n!の計算
        dum+=x**nn/factorial(nn)
    return dum

#main
sol=[]
for j in range(8):  # n=7次までの計算
    sol.append(calc_e(j,1)) #n=1 ~ 8までの次数で打ち切った場合のeをsolという名のリストへ格納する

# for plot
plt.plot(sol)
plt.xlabel('x',fontsize=24)
plt.show()
```



![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/9ffa8543-b67e-7b4b-8adc-09b816150a32.png)

***
#結果
厳密値は，e = 2.718281828459045...
n=4で誤差は1%以内となっている。

n e
0 1.0
1 2.0
2 2.5
3 2.6666666666666665
4 2.708333333333333
5 2.7166666666666663
6 2.7180555555555554
7 2.7182539682539684
Git 間違ってaddしてしまったものを取り消す方法

# はじめに
軽快にaddしていた時に間違ってaddする必要もないものをaddしてしまった経験はないでしょうか？

```sh
$ git add -p
```
「y」、「Enter」、「y」、「Enter」、「y」、「Enter」....あっ（察し）
僕はよくあります。

そんな時にaddを取り消す方法を共有します。

# コマンド
コマンドは実にシンプルです。

```sh
$ git reset HEAD config/database.yml
```

以上です。
git commit の時に差分を表示しつつ上下分割して調整する

git commit の時のエディタをvimにしているとデフォルトだとコミットメッセージの記述スペースのみが表示されると思う。
以下のように

![def.png](https://qiita-image-store.s3.amazonaws.com/0/6406/defb3a0e-c4fe-2c04-57bc-1a8bf5b33b3f.png)

このままだと変更ファイルの一覧が出るだけで差分がわからない。
そんな時にはvimrcに以下の設定を追加してやると差分が出る。

    autocmd FileType gitcommit DiffGitCached

![DiffGitCached.png](https://qiita-image-store.s3.amazonaws.com/0/6406/77d4e9e4-f997-b079-612d-5e5a851171e4.png)

このままでもいいんだが差分が上に出ると差分の確認がしづらく、表示行数が少なく感じる。差分の表示が下でコミットメッセージの記述スペースを上にして省スペースにしておきたい。

    autocmd FileType gitcommit DiffGitCached | wincmd x | resize 10

この記述だとこうなる

![wincmd x.png](https://qiita-image-store.s3.amazonaws.com/0/6406/1c8650b6-6785-8ce4-2a03-c3a68ee96e61.png)

vimのhelpを引きながら確認してて、以下の機能を使用した。`:help wincmd`をして使えそうな機能をかいつまんでカスタマイズする事ができる。

```
						*:winc* *:wincmd*
以上のコマンドは ":wincmd" によっても実行することができる:

:[count]winc[md] {arg}
		CTRL-W [count] {arg} を実行するのと同じ。例: >
```

```
CTRL-W x					*CTRL-W_x* *CTRL-W_CTRL-X*
CTRL-W CTRL-X	カウント指定なし: カレントウィンドウと次(1つ下)のウィンドウを
		入れ替える。次のウィンドウがない(カレントウィンドウが一番下の)
		場合は、前(1つ上)のウィンドウと入れ替える。
		カウント指定有り: カレントウィンドウと上からN番目のウィンドウ
		(一番上は1番目)を入れ替える。カーソルは入れ替えた相手のウィン
		ドウに移動する。
		水平分割と垂直分割が混ざっている場合には、カレントウィンドウと
		同じ段／列の中だけで入れ替えが行われる。
```

```
:res[ize] [N]
CTRL-W CTRL-_					*CTRL-W_CTRL-_* *CTRL-W__*
CTRL-W _	カレントウィンドウの高さをN行にする(デフォルト: 可能な限り高く
		する)
```

満足🌸

参考: http://d.hatena.ne.jp/metalglue/20091124/1259051881
[GitBucket][Windows] GitBucketとActive Directoryの連携

GitBucketに、Active Directoryで使用しているログインIDとパスワードでログインできるようにします。

# 環境

- GitBucket環境
 - Ubuntu 16.04
 - GitBucket 4.14.1
 - OpenJDK Runtime 1.8.0_131
- Active Directory環境
 - Microsoft Windows Server 2012 R2


# 設定

rootユーザでGitBucketへログインし、メニューから[System Settings]を辿ります。

Authenticationの項目にLDAPがあるので有効にします。

各項目の設定値は次のとおりです。

<dl>
<dt>LDAP host</dt>
<dd>ドメインコントローラホスト名</dd>
<dt>LDAP port</dt>
<dd>389</dd>
<dt>Bind DN</dt>
<dd>ActiveDirectoryにログインできるユーザのDistinguished Name 例）<code>cn=administrator,ou=users,dc=example,dc=com </dd>
<dt>Bind password</dt>
<dd>上記ユーザのパスワード</dd>
<dt>Base DN</dt>
<dd>ユーザを探しに行くツリーの根本 例）<code>dc=example,dc=com</code></dd>
<dt>User name attribute</dt>
<dd><code>sAMAAccountName</code></dd>
<dt>Additional filter condition</dt>
<dd>（空）</dd>
<dt>Full name attribute</dt>
<dd><code>displayName</code></dd>
<dt>Mail address attribute</dt>
<dd><code>mail</code></dd>
<dt>Enable TLS</dt>
<dd>No</dd>
<dt>Enable SSL</dt>
<dd>No</d>
<dt>Keystore</dt>
<dd>（空）</d>
</dl>

# はまりどころ

Active Directory側がちゃんと整えられていないとログインできないです。

- ユーザのcommon nameは日本語にせず、英数字にする
- mail属性に値を入れる
intel nic - e1000eドライバのインストール

## 参考

* [e1000eドライバのインストール](http://akuwano.hatenablog.jp/entry/20100803/1280836837)

```bash:
yum update
reboot

yum groupinstall -y "Development Tools"
yum install kernel-PAE-devel
```

* ドライバのソースファイルをダウンロード。
    * [ダウンロード インテル® PCIe* インテル®ギガビットイーサネット・ネットワーク・コネクション (Linux*) 用ネットワーク・アダプター・ドライバー](https://downloadcenter.intel.com/ja/download/15817)

```bash:
cd /opt
tar zxvf e1000e-3.3.5.3.tar.gz
cd e1000e-e1000e-3.3.5.3

cp e1000e.spec /usr/src/redhat/SPECS/
cd /usr/src/redhat/SPECS/
cp /usr/local/src/e1000e-3.3.5.3.tar.gz ../SOURCES/

# rpmパッケージにホスト名が入るため適当にホスト名変更した。
hostname centos5.11.pae
rpmbuild -ba e1000e.spec

rpm -ivh /usr/src/redhat/RPMS/i386/e1000e-3.3.5.3-1.i386.rpm
```

```diff:/etc/modprobe.conf
- eth1 igb
+ eth1 e1000e
```

reboot

認識されていることを確認。