OmniAICreator/Qiita-1.07M huggingface dataset:
raspberry pi 1 model bで、node-red　その５

#概要
raspberry pi 1 model bの、node-redで、Lチカしてみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#ピン配置
![RPi-GPIO-Pins.png](https://qiita-image-store.s3.amazonaws.com/0/18104/37a9e991-b455-bc6e-79d7-4a5b2e6ca8ee.png)

#回路図
![gpioled_thumb.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/3c70cfb4-bbb1-a0a5-66a0-ab495cfab189.jpeg)

#写真
![ras6.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/3f07f644-70d9-bf01-c630-1d09cdb94921.jpeg)

#サンプルコード
```
[{"id":"1949c06a.cabf2","type":"inject","z":"addc1b17.459d98","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":185.71428680419922,"y":278.9285640716553,"wires":[["5ce85e00.10a144"]]},{"id":"471fb530.4d5c6c","type":"debug","z":"addc1b17.459d98","name":"","active":true,"console":"false","complete":"payload","x":490,"y":461.07143211364746,"wires":[]},{"id":"5ce85e00.10a144","type":"trigger","z":"addc1b17.459d98","op1":"0","op2":"1","op1type":"str","op2type":"str","duration":"2","extend":false,"units":"s","reset":"","name":"","x":292.8571472167969,"y":361.4286003112793,"wires":[["471fb530.4d5c6c","62c14444.8ee81c"]]},{"id":"62c14444.8ee81c","type":"rpi-gpio out","z":"addc1b17.459d98","name":"gpio","pin":"7","set":false,"level":"0","out":"out","x":507.1428571428571,"y":298.57142857142856,"wires":[]}]
```
小ネタ： arctan(x) のマクローリン展開

つまらないことだが、たまたま放送大学でやっていたので、メモっておく。
（知っているとちょっと得したような気分になる小ネタ？)

### arctan(x) のマクローリン展開

微分すると、
$$\frac{d}{dx} \\ arctan(x) = \frac{1}{1+x^2}$$

ここで**右辺をよく見ると** これは公比 $-x^2$ の等比級数で表せるから、
$$
\begin{eqnarray}
\frac{d}{dx} \\ arctan(x) &=& \frac{1}{1+x^2} \\\\
  &=& 1 - x^2 + x^4 - x^6 + ...
\end{eqnarray}
$$

これを $x$ で積分。 $arctan(0)=0$ だから

$$
arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...
$$

と、簡単にマクローリン展開できてしまった。賢い！！

### 出典

 - 放送大学テレビ 非ユークリッド幾何と時空（'15） 第4回
ERROR! MySQL server process #3366 is not running! Permission denied...

#エラーの内容と問題点
時折Railsアプリ起動の際に

1. `mysql.server start`を行うと`ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`という警告が表示される。
2. `mysql -u root -p`でログインもできない。
3. `sudo mysql.server restart`で入ろうとすると

```
ERROR! MySQL server process #3366 is not running!
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/Nakauchi-no-MacBook-Air.local.pid).
Nakauchi-no-MacBook-Air:ex1 usr$ mysql.server start
Starting MySQL
./usr/local/Cellar/mysql/5.7.15/bin/mysqld_safe: line 135: /usr/local/var/mysql/Nakauchi-no-MacBook-Air.local.err: Permission denied
/usr/local/Cellar/mysql/5.7.15/bin/mysqld_safe: line 169: /usr/local/var/mysql/Nakauchi-no-MacBook-Air.local.err: Permission denied
/usr/local/Cellar/mysql/5.7.15/bin/mysqld_safe: line 135: /usr/local/var/mysql/Nakauchi-no-MacBook-Air.local.err: Permission denied
 ERROR! The server quit without updating PID file (/usr/local/var/mysql/Nakauchi-no-MacBook-Air.local.pid).

```

#行ったこと

- 明らかにpermission周辺でのエラーを起こしているのが原因だと思ったので`ls -laF /usr/local/var/mysql/`でpermissionを確認。間違えて`mysql`を全く違うものに変えてしまっていないか。
- `sudo chown -R _mysql:admin /usr/local/var/mysql`と`sudo chmod -R u+rwX,g+rwX,o-rwx /usr/local/var/mysql`と`sudo chmod -R g+rwx /usr/local/var/mysql`を順番に実行した後`mysql.server start`で無事動き出した。

リンク先の相談者の問題はどうやらmysqlのdata directoryの場所がよろしくなかったみたいです。そこで`chown`と`chmod`コマンドを使ってアクセス権限を変えてあげたわけです。最初の二つだけだとsudoコマンドなしで`mysql installation directory`へのアクセスができないようなのでその権限も`sudo chmod -R g+rwx /usr/local/var/mysql`で変えると。

#参考にしたリンク
- [MySQL server start issues on Mavericks](http://stackoverflow.com/questions/21470193/mysql-server-start-issues-on-mavericks)
DynamoDBの１レコードをデータ型記述子の入っていないJSONとしてLambdaで取り出す



DynamoDBに追加されたデータをLambdaから普通の？JSONとし取り出したいが、自分でパーサー作るのはめんどくさいな・・・と思ってたら、あっさり解決したので共有

具体的に詰まってたところ
---

```
Map<String, AttributeValue> image = dynamodbStreamRecord.getDynamodb().getNewImage();
```

この`Map<String, AttributeValue>`をパパッと以下のようDynamoDBのデータ型記述子が入っているものではなく、データ型記述子が入っていないJSONにしたい

* データ型記述子が入っていない例

```
{
  "number": 47
}
```


* データ型記述子が入ってしまっている例

```
{
  "number": {
    "N": "47"
  }
}
```

解決
---


`InternalUtils#toSimpleMapValue`と`Item#item.toJSONPretty`を使ってあげる


実際にコードは以下

```
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.internal.InternalUtils;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;

import java.util.Map;


public class DynamoDBStreamFunction implements RequestHandler<DynamodbEvent, String> {
    @Override
    public String handleRequest(DynamodbEvent input, Context context) {
        for (DynamodbEvent.DynamodbStreamRecord dynamodbStreamRecord : input.getRecords()) {

            Map<String, AttributeValue> image = dynamodbStreamRecord.getDynamodb().getNewImage();


            final Map<String, Object> newImage = InternalUtils.toSimpleMapValue(dynamodbStreamRecord.getDynamodb().getNewImage());
            final Item item = Item.fromMap(newImage);

            context.getLogger().log(item.toJSONPretty());
        }
        return "Successfully processed " + input.getRecords().size() + " records.";
    }
}
```
Stretcher v0.8.0 でダウンロードのリトライオプションを追加しました

[Stretcher v0.8.0](https://github.com/fujiwara/stretcher/releases/tag/v0.8.0) で以下のオプションが追加され、アーカイブのダウンロード処理をリトライできるようになりました。

- `-retry` srcアーカイブのダウンロードリトライ回数 (default 0)
- `-retry-wait` リトライ間隔(秒 default 3)

Pull Requestをいただいた @sugy@github さん、ありがとうございました！
＜初心者向け＞pythonライブラリ＜機械学習用＞


python歴1年の初心者による、よく使うライブラリと一言コメントのメモ。画像処理、最適制御を目的としたものが多いです。随時更新予定。また、オススメのライブラリがあれば是非コメントください！

# 辞書操作

- easydict
    - ドットで辞書の要素にアクセスできる

# 表作成

- prettytable
    - テーブル表を作成するときにお世話になってる

# パス・ファイル操作

- os
    - path操作に使える
- shutil
    - copy、removeなどファイル操作に使える

# 画像処理

- pillpow
    - 回転リサイズとか簡単なことするときはお世話になってる
- scikit-image
    - numpyとの相性割とよさげ
- opencv
    - 画像処理系なら基本なんでもできる優秀
    - conda install でやらない場合は導入ビルドが少し面倒

# 科学技術計算

- numpy
    - 行列計算が楽
- scipy
    - 線形代数、最適化、確率統計など色々な数学が扱える
- pandas
    - Rに近い、データ処理をするなら使う

# データ可視化

- matplotlib
    - 定番のプロット先生
-  seaborn
    -  matplotlibベースで簡潔・見やすい


# 組合せ最適化

- pulp
    - ナップサック問題、最短経路問題など扱えるソルバー
    - 目的式、制約式などモデル化さえできていれば解けるすぐれもの

# 機械学習

- scikit-learn
    - 教師あり、教師なし学習お手軽に試したいなら
- pybrain
    - 強化学習を扱いたいなら
- tensorflow
    - mac, linuxで深層学習やりたいなら
- chainer
    - windowsで深層学習やりたいなら

# その他

- pytube
    - youtubeから動画をダウンロード可能
    - ffmpegと組み合わせて動画から静止画像生成も容易に
- pywinauto
    - windowsのキーボードやマウス操作を行える
macOS Sierraでjekyllをinstallする”Operation not permitted"が出たときの解決法

#### 地味躓いたのでメモ

#### **課題**
$ sudo gem install bundler などやっても"Operation not permitted"とのこと．

####  **解決方法**
以下の頁で説明されているように，「Rootless」のセキュリティを"disalbe"にすると問題なくinstallできるようになった．

[OS X 10.11 El Capitanのシステム保護機能「Rootless」を無効にするcsrutilコマンドの使い方。](http://applech2.com/archives/46435268.html)
PHP 基礎フォーム

##$_POSTの中身

Array ( [name] => 名前 [renraku] => denwa [Submit] => 確認 ) 

$_POSTは変数の連想配列

■kisoform.php

```php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xm1ns="http://www.w3.org/1999/xhtml">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript">


	<title>在庫確認・買取お見積り 問い合わせフォーム</title>

</head>
<body>
	<h1>
		<font color="#ff9933">在庫確認・買取お見積り 問い合わせフォーム</font>
	</h1>
	お客様情報を入力して下さい
	<form action="kisoform_confirm.php" method="post" type="submit">
		<p>
			お名前：<input type="text" name="name">

		</p>
		<p>
			ご希望の連絡方法 <input type="radio" name="renraku" value="denwa" checked>電話
				<input type="radio" name="renraku" value="mail">メール

		</p>

		<input type="submit" name="Submit" value="確認">

	</form>

</body>
</html>
```

■
kisoform_confirm.php

```php
<?php
$name = $_POST ['name'];
$renraku = $_POST ['renraku'];
if ($renraku == "denwa") {
	$renraku = "電話";
} else if ($renraku == "mail") {
	$renraku = "メール";
}
echo "<pre>";
print_r ( $_POST );
print_r ( $name );
print_r ( $renraku );
echo "<pre>";
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xm1ns="http://www.w3.org/1999/xhtml">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript">


	<title>在庫確認・買取お見積り 問い合わせフォーム</title>

</head>
<body>
	<h1>
		<font color="#ff9933">在庫確認・買取お見積り 問い合わせフォーム</font>
	</h1>
	以下の内容で送信します
	<form action="kisoform_complete.php" method="post">
		<p>お名前：<?php echo $name; ?></p>
		<p>ご希望の連絡方法：<?php echo $renraku; ?></p>
		<input type="submit" name="Submit" value="送信">

	</form>
</body>
</html>
```

<font color="#ff0000">```
$name = $_POST ['name'];の$_POST ['name'];のnameはkisoform.phpの<input type="text" name="name">の"name"と同じ
```</font>

■kisoform_complete.php

```php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xm1ns="http://www.w3.org/1999/xhtml">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript">


<title>PHP入門</title>
</head>
<body>
	<div>
		<h1>完了</h1>
		送信が完了しました。 <br> <br> <a href="./kisoform.php">戻る</a>

	</div>
</body>
</html>
```

■kisoform.php 実行結果
Array
(
    [name] => 名前
    [renraku] => denwa
    [Submit] => 確認
)
名前電話
![kisoform入力画面.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c082fd6f-391b-992e-82a3-efe73fb44ffd.png)

![kisoformpost中身.png](https://qiita-image-store.s3.amazonaws.com/0/95187/2b9fa412-e2b1-f5e5-bf33-484f667d562f.png)


[参考](http://ryouchi.seesaa.net/article/23737498.html)
AWS Lambdaの使いみちをWebで調べたまとめ

とりあえずざっと調べた

### データ処理

* [テキストを縦書きPDFに変換](http://inside.pixiv.net/entry/2016/06/14/102502)
* [アップロードされたファイルからのテキスト抽出](http://blog.livedoor.jp/sasata299/archives/52204992.html)
* [動画のサムネイルを作る](https://blog.castalia.co.jp/aws-lambda-%E3%81%A7-s3-%E3%81%AE%E5%8B%95%E7%94%BB%E3%81%AE%E3%82%B5%E3%83%A0%E3%83%8D%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B-d0c130cef793#.1cmk45g0l)

### 通知

* [GitHubのアクティビティをTwitterに投稿する](http://efcl.info/2016/06/09/github-to-twitter-lambda/)
* [Slack Bot](https://blog.kazu69.net/2016/05/12/playing-aws-lamda-api-gateway-using-serverless-framework/)
* [Slack Bot](http://www.yamamanx.com/slack-bot-aws-lambda-python-api-gateway/)
* [Backlog -> Zendesk連携](http://blog.serverworks.co.jp/tech/2015/12/21/backlog2zendesk/)
* 
### サービス

* [入力された文字列を楷書体の画像にして返すサービス](http://qiita.com/macoshita/items/10bc707a019431817952)
* [短縮URL](http://www.davekonopka.com/2016/serverless-aws-lambda-api-gateway.html)
* [お問い合わせフォーム付きWebSite](https://speakerdeck.com/ryonext/aws-lambda-to-api-gatewayderailsshi-wazuniji-ndahua)
* 
### その他

* [決まった時間にしか使わないEC2インスタンスを起動・停止する](http://tech.linkbal.co.jp/66/)
* [S3が更新されるとCloudFrontをInvalidateする](http://cluex-developers.hateblo.jp/entry/2016/09/16/135638)
* [計算リソースとして使う](http://imoz.jp/note/amazon-lambda.html)
* [社内ISCONのベンチサーバ](http://tech.kayac.com/archive/isucon_benchmark_from_lambda.html)
* [S3の署名付きURLを生成](https://www.cloud-koubou.jp/archives/3384)
* [スクレイピング](http://blog.takuros.net/entry/2016/04/19/075508)
* [AMIのバックアップ](https://www.wantedly.com/companies/bec/post_articles/32935?source=show-sidebar-recent)
* [LambdaでMeCab](https://libraries.io/github/KunihikoKido/aws-lambda-ja-tokenizer)
* [S3の容量を制限する](http://qiita.com/c9katayama/items/706f8198d76f2232e874)
iOS10 でinput type='text' name='security_code' と指定すると日本語キーボードが出てこない

ちょっと個人的に面白かったのでメモ

```html
<input type='text' name='security_code'>
```

https://jsfiddle.net/orangelion/wc2v2a0v/1/

単純にiOS9とかで見ても、日本語キーボードが出てくるんだけど、iOS10からどうも出てこない(Apple payとかの影響？)

証券会社などでは「証券コード」の事を「security code」と言うので、気づいたけど普通にこれは気づかないでしょ
こういうの勝手に入れられると個人的にダメだと思うんだけどどうなんだろ
他にもこういうの入れられたかもしれないから情報欲しいので求むです！

[追記]

~~端末ごとによって違うみたいです~~
現状、iPhone 5sとiPhone SEでは同じように出てしまう（口頭での確認になってしまっているがiPhone 6sでも同じ症状になるらしい）

|iPhone 5s|iPhone SE|
| ------- | ------- |
|![iPhone 5s](https://qiita-image-store.s3.amazonaws.com/0/65819/b3ff6f34-b4ab-e6d9-4f8e-191cf36be0b3.png)|![iPhone SE](https://qiita-image-store.s3.amazonaws.com/0/11101/f1421ef7-2839-e208-2943-5a8b9bce990e.png)|

こういうことを問い合わせられるSafariの問い合わせフォーラムってどこにあるんだろう？
Typings で DefinitelyTyped 由来の型情報をインストールするには

~~~sh
% typings install dt~jquery
~~~

のように、配布元を明示する必要があります。

## 配布元とは？

次のように ```typings search``` を行った際に、```source``` の欄に表示される項目です。

~~~sh
% typings search jquery

NAME           SOURCE HOMEPAGE                                  DESCRIPTION VERSIONS UPDATED
chai-jquery      dt   https://github.com/chaijs/chai-jquery                     1    2016-07-24T06:33:59.000Z
jasmine-jquery   dt   https://github.com/velesin/jasmine-jquery                 1    2016-03-17T12:06:54.000Z
jquery           dt   http://jquery.com/                                        1    2016-09-29T16:29:22.000Z
~~~

具体的には次の 10 種類あります。

|配布元|説明|
|:----|:---|
|npm|npm でインストールされたライブラリに関するものをインストールする場合に使用|
|github| GitHub にホストされているものを直接使う場合に使用|
|bitbucket| Bitbucket にホストされているものを直接使う場合に使用|
|bower|bower でインストールされたライブラリに関するものをインストールする場合に使用|
|common|標準的なもの|
|shared|?|
|lib|[ここにリストされているもの](https://github.com/typings/registry/tree/master/lib)|
|env|Atom や Electron、ES2015 など実行環境に関するものをインストールする際に使用|
|global|[ここにリストされているもの](https://github.com/typings/registry/tree/master/global)|
|dt|Definitely Typed に公開されているものを利用する場合に使用|
コマンドでファイル名を一括変換する方法

例えば
こういうファイルがあったとして

```zsh
$ ls
test_01.txt
test_02.txt
test_03.txt
```

「test」の部分を「TEST」に変えたい場合

```
find . | grep test | sed 'p;s/test/TEST/' | xargs -n2 mv
```
でOK

```zsh
$ ls
TEST_01.txt
TEST_02.txt
TEST_03.txt
```
変換できています。

あまりスマートではないかな。。。
固定IP設定の方法

CentOS5系の固定IP設定方法

rootでログイン

ネットワークの設定は、
/etc/sysconfig/network-scripts/ifcfg-eth0
に記載する。

以下追記する。

```
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.xxx.yy
NETMASK=255.255.255.0
GATEWAY=192.168.xxx.zzz
DNS1=8.8.8.8
```

記載したら、

$ service network restart

で再起動する。

ちなみに、ssh接続して記載するならsudo vi で記載。
VMwareで直で書き込むなら、nanoコマンドで記載します。nanoコマンド初めて使ったから、
vimの勉強になる。

ネットワークにつながるか以下手順にしたがって確認する。

```
1. IPアドレスを確認して同じネットワークにpingをとばす
 同じネットワークないの別のサーバにpingでアクセする。
ipアドレスはroot権限でログインして、ifconfigすればわかるので、
別のサーバに対して、
$ ping 192.168.xxx.??
ってやってレスポンスが返って来れば同じネットワーク内なら接続成功！
これでレスポンスが返ってこないなら、アクセス先のサーバが死んでいないことを確認しましょう。
また、固定IPを設定したサーバに対してもpingしてみて、ちゃんとレスポンスが返って来れば大丈夫。
 
2. 外部ネットワークにping飛ばす。
次に、異なるネットワーク環境にあるサーバにpingを飛ばして、レスポンスが返ってくるか確かめる。
異なるネットワーク同士を接続するにはルータが必要となるので、もしここでダメならゲートウェイの設定が
間違っています。

3. ドメイン名でアクセスしてみる。
curl か wget　で存在するドメインにアクセスしてみる。
これで、うまく行ければネットワークは正常に設定されています。
$ curl www.yahoo.co.jp
これで、ダメなら名前解決出来ていない可能性があるので、設定を見直してみてください。
```

CentOS5系にphpインストールしようとして、remi-repo入れようとしたら名前解決出来ないことから
ネットワークを確認しました。その過程で固定IPの設定をミスっていたので、他に詰まった人がいたら、
参考にしてみてください。
tnsnames.oraと接続文字列の関係

# tnsnames.oraと接続文字列の関係

DBにOracleを利用する場合、大抵は利用することになるtnsnames.ora
tnsnames.oraとアプリケーション側からの呼び出しの関係がなんとなくでしか理解できていなかったので、この機会に整理を行っておく。

接続情報には下記で説明する以外にも多くのオプションが存在するが、今回は必要最低限の値に絞って説明を行う。

## tnsnames.ora
```
① =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ②)(PORT = ③))
    (CONNECT_DATA =
      (SERVICE_NAME = ④)
    )
  )
```

|No|説明|
|:--|:--|
|①|ネットサービス名。アプリケーションはこの名前を参照して接続情報を取得する|
|②|DBサーバのアドレス|
|③|DBサーバのリスナのポート番号。意図的に変更してなければ1521|
|④|サービス名|

### サービス名とは
１つインスタンス、または、同じ機能を提供（＝サービス）する複数インスタンスの集合体を特定する名称。
インスタンスに複数設定でき、同じ名前を別のインスタンスに指定することができる。

### SID=xxx で接続先を指定する場合
SERVICE_NAME でなく、「SID=xxx」という書き方で接続先を指定することもできる。
（SIDとはインスタンスに一意に割り当てられる名前）
ただ、これは古い書き方（Oracle8か9くらいまで）なので、今はSERICE_NAMEで書くことが推奨。
（これでも一応動作するけれど）

## configファイル（接続文字列）
```
<connectionStrings>
  <add name="①" connectionString="Data Source=②;User ID=③;Password=④" providerName="⑤" />
</connectionStrings>
```

|No|説明|
|:--|:--|
|①|接続文字列名。ここの名前を用いて接続情報を取得する。|
|②|ネットサービス名。tnsnames.oraで設定したものを指定|
|③|DBに接続するためのユーザ名|
|④|DBに接続するためのパスワード|
|⑤|DBに接続するために利用するドライバ|


## 実例

### tnsnames.ora

```
KOTORI =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.222)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = minami)
    )
```

### アプリケーションのコンフィグファイル

```
<configuration>
  <connectionStrings>
    <add name="chunchun" 
         connectionString="data source=KOTORI;user id=oyatuni;password=sityauzo;"
         providerName="System.Data.OracleClient"/>
  </connectionStrings>
</configuration>
```

### アプリケーション内のコネクション取得処理
（以下の例はVB）

```
Dim connection As New OracleConnection("chunchun")
```


## 最後に
今回はアプリケーションからOracleのDBへ接続するための設定ファイルについて記述した。
なんとなくでしか理解できていない場合いざという時に問題になるので、整理できてよかったと思う。

あと、例示が相変わらずアレなのはご愛嬌。


## （追記）SID、サービス名の確認方法
すでに作成済みのインスタンスに対し、「SID」「サービス名」は以下のように取得できる。

### SID
```
SELECT DBID,NAME,DB_UNIQUE_NAME,CURRENT_SCN,LOG_MODE FROM V$DATABASE
```

### サービス名
※SQL*PLUSで実行すること

```
show parameter service_name
```
S3にuploadしたzipファイルのイメージ画像をLambdaで解凍する　メモ

```python:extract_image_zip.py

import boto3
import zipfile
import traceback
import os

print('Loading function')

s3 = boto3.resource('s3')
s3_client = boto3.client('s3')

def lambda_handler(event, context):

    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']

    try: 
        s3_client.download_file(bucket, key, '/tmp/file.zip')
        print('download')
        zfile = zipfile.ZipFile('/tmp/file.zip')
        namelist = zfile.namelist()
        print(namelist)

        for filename in namelist:
            if not os.path.basename('/tmp/'+filename):
                os.mkdir('/tmp/'+filename)
            else:
                f = open('/tmp/' + str(filename), 'wb')
                data = zfile.read(filename)
                f.write(data)
                f.close()
        for filename in namelist:
            if '.jpg' in filename:
                s3_client.upload_file('/tmp/'+filename, bucket, key + filename)
                

    except Exception as e:
        print(e)
        print(traceback.format_exc())

```
PhpStormのTerminalからCygwinを起動する方法

基本的に開発機はなんでもいいんだけど、Windowsだった場合は必ずCygwinを入れることにしている。便利だし。

で、PhpStormのTerminalタブで起動のをCygwinに切り替える方法を以下に記載。

Cygwin自体は、Cygwin.batを起動するかbash.exeを起動すればいいんだけど、PhpStormで直接指定した場合、環境変数が読み込まれなかったり、プロジェクトのパスにならなかったりするので、以下の手順が必要となる。

### 1. 専用のbashrcを作成する

PhpStormでTerminalを起動した際、プロジェクトのパスは`$OLDPWD`に格納されている。
自動的にプロジェクトのパスが開かれるように、専用のbashrcを作成しておく。

```bash
source /etc/profile
source ~/.bash_profile
cd $OLDPWD
```

### 2. Cygwin起動用のbatを作成する

1.で作成したbashrcを読み込む設定で、bashを起動するbatファイルを作成する。
ここでは`Cygwin.bat`を元にして`Cygwin-storm.bat`というファイル名で作成した。

```
@echo off
C:
C:\cygwin64\bin\bash --rcfile C:\cygwin64\Cygwin-storm.bashrc -i
```

### 3. PhpStormに設定する

Settings → Terminal → Shell pathに、作成したbatファイルを指定。

![phpstorm-cygwin.png](https://qiita-image-store.s3.amazonaws.com/0/78226/2ff42bb7-b69f-83cf-35b1-c54d6e207bd8.png)

以上でPhpStormでTerminalを開くとCygwinが起動するようになる。
Electron ipcRenderer.on とかをジェネレータ関数内で利用したい

# はじめに
環境が react+redux+redux-saga なので出来ればipcRendererはsagaでまとめてしまいたい。

つまりこう

```js
import { ipcRenderer } from 'electron';
const ipcRendererOn = (channel) => (new Promise((resolve, reject) => ipcRenderer.on(channel, (event, arg) => resolve({event, arg}))));
```

ピュアなJSで書くとこうなる

```js
import { ipcRenderer } from 'electron';
var ipcRendererOn = functio(channel) {
  return new Promise(function (resolve, reject) {
    return ipcRenderer.on(channel, function (event, arg) {
      return resolve({ event: event, arg: arg });
    });
  });
};
```

```js
function* select() {
  const { event, arg }  = yield ipcRendererOn('select');
}
```
のように使う。

備忘録( ´ω` )
[Android]コード規則をちょっとだけ統一させてチーム内のストレス軽減

みんなもうやってると思います。
今回の記事は、備忘録的な内容です。

# 微妙なストレス
他人が書いたコードに手を加える時、微妙にストレスになること。
それは、空白やインデント。
例えば

```
if(str.equals(checkStr)){
    hogehoge();
}
```

のように、ifの後は、空白１行空ける空けない、){の間に１行空白を空ける空けないなどなど、
派閥や好みが色々あって、統一がめんどくさいです。

チーム内でコミュニケーションが取れてないところだと、修正するたびに、自分流に直しあっていたり・・・。

めんどくさいですね。

あと、importの消し忘れ。
IDEで、警告出てるの気にならないんでしょうか・・・。

この辺り、一個一個消したり修正したり、話し合って統一とかめんどくさいし、無駄この上ないです。

# 解決策
Android studioのreformat codeとoptimize Importsを実行することで、統一できます。
この２つを実行することを義務付けておけば、解決です。
Androidだと、xmlにも効果的です。idとか、widthとか、marginとか、みんなバラバラだと思います。
これも、reformat codeをかけると、すべて位置を揃えてくれます。

# だが、しかし・・・
Codeタブ開いて、reformat code選んで、optimize Importsを選んで、とか、絶対やらなくなる人がいます。
まぁ、間違いない。

そこで、この２つをmacroにし、`command+S`に割り当ててあげましょう。
エンジニアなら、慣れ親しんでいる、`command+S`です。
これで、ほとんどの人が、やってくれると思います。

ハードルはmacro登録だけ。

もし、やってない。
上記のような問題で困ってるって方は、提案してみましょう。

「スゲーッ爽やかな気分だぜ。新しいパンツを はいたばかりの正月元旦の朝のよーによォ～ッ。」

ってなれること間違い無し！
swift3.0 カメラロールより選択された画像からURLの取得とURLから画像の表示について

初めまして、こんにちは。

表題に記載した内容を実装したいのですが
swift3.0での情報が見つけれず、助けて頂きたいです。

やりたい事。
①カメラロールより選択した画像(1枚)のURLを取得
②①で取得したURLから画像を表示


よろしくお願いいたします。
MC/DCよりMCC?


## MC/DCの代わりにMCCを使う？

今度ドックたー・スチュアート(Dr.Stuart)さんが参加したseminarに参加して面白い内容を聞いてもらいました。

『MC/DCよりMCCを使いましょう』

>もしMC/DC(Modified Condition/Decision Coverage)とMCC(Multiful Condition Coverage)の違いを分からない方はグーグル神様を拝見してください。

もちろんその主張には前提があります。

* クライアントがISO26262に言及されたMC/DCなどのテスト設計手法にかまわない場合。
* その他MC/DCを使うわけがない場合。


スチュアートさんによるMCCの利益は僕が理解する限り下のようです。

* MC/DCは一応設計方法がどっても複雑だ。その一方MCCは各Condition(条件)の組み合わせでできます。
* short-circuitを使ったらMCCのケースの件数のずいぶん減られます。
* MC/DCよりMCCのテスト範囲が広いので以外のエラーを発見する可能性が上がる。

一番目はMC/DCを直接にやったことがある人々はよく分かると思います。
二番はの「short-circuit」についてちょっと語ると

IF (A and B) の場合

|A | B | Result |
|----|-----|----|
|T|T | T |
|T|F | F |
|F|T | F |
|F|F | F |

4つのケースがMCCで作れます。ここでAがF(False)の場合はBで何が来ても結果はFと同じです。それでAがFの場合の３，４番ケースは１個のみすれば良い。。。の意味です。

MC/DCとMCCのケース数を比較した資料を見ましょう。

![](https://t1.daumcdn.net/thumb/R1280x0/?fname=http://t1.daumcdn.net/brunch/service/user/J8k/image/oLGwj4uyWTVX1u7rcB7vOlsZ_kQ.png)

---


$N$をパラメーター数であればMC/DCを通じて醸し出すテスト・ケースの数は$N+1$個です。(緑いろの吹き出し)MCCを全開で適用するとケースの数は $2^N$個です。
でも研究を通じてShot-circuitを適用するとその数はMC/DC対比1.35~2倍くらい数が減るのを明かしました。(ピンクとオレンジ色のふきだし)


![](https://t1.daumcdn.net/thumb/R1280x0/?fname=http://t1.daumcdn.net/brunch/service/user/J8k/image/fhq1o7tYyT4lqZz3B8r8YzfaCvs.png)

上のグラフで分かるのはMC/DCとMCCのエラー発見可能性は6%しか差がないのです。MC/DCのほうが6%上回るのです。


**これからこの主張についての僕の考えを語ります。**

> Short-circuitを探すのも大変なものだ。

簡単なコンディションでは問題がありませんがコンディションが複雑に混ぜてる場合はShort-Circuitを探すのも大変な作業です。MC/DCくらいリソースが掛かります。
そしてこの間はMC/DCを自動的に生成させてくれるツールも沢山あるのでMC/DCの適用であんまり問題はなさそうです。

> MCCでMC/DCより多いケースを遂行したとはいえ効果的なテストが出来たと言えません。

スチュアートさんによるとMCCで遂行されるMC/DC対比35%の追加ケースが予想できなかったエラーを発見するといいます。
でも僕はこれに賛成しません。35%の追加で予想できなかったエラーを発見するのを保障するわけでもないし実際に意外のエラーを発見するためにはこの方法よりちょっと違う接近をする（エラー発見可能性分析など）方が良いと思います。

---


MC/DCの適用はほとんどの人々は難しいするのでスチュアートさんがこんな主張をしたかなと思います。以前の29119の講義では境界値分析が他の手法より効果的だと話したこともありました。使いやすい手法をちゃんと使う方法で案内する派ですね。
でも今度のプレゼンで僕が感じたのはスチュアートさんがshort-circuitについて実務経験がなさそうなことでした。

僕のはMC/DCを避けるではなくてツールなどを通じて突破ろうと研究しました。そのための簡単なツールを作ってコンサルに使っています。僕だけではなくてさまざまなツール研究者がこんなのをするので僕の方向性が間違ってないと思います。


でもワザワザMC/DCを使う事情がなければMCCを導入するのも悪くないでしょう。
Windows で md5sum をやりたいので作った

[ブログからの転載](http://1bed.allright.life/?p=2276)

# 経緯

PowerShell v2.0 の環境でリリース物のチェックが捗らなかったので、勢いに任せて作りました。
恐らく世界で 100 万人ぐらいの人が同じのを作っていることでしょう（てきとー

# 一応使い方

* [GitHub: miyamiya/mypss](https://github.com/miyamiya/mypss) の右にある `Clone or download` をクリックして zip ファイルをダウンロードします。
* **ダウンロードしたライブラリにはセキュリティの観点からブロックが施されています** ので 、ダウンロードした zip ファイルを右クリックしてプロパティを開き、ブロックの解除にチェックを入れて OK ボタンを押します
* zip ファイルを解凍します
* Get-Md5sum のディレクトリを `$Env:PSModulePath` で表示される何れかのディレクトリに配置します  
  よくあるのは、 C:\Users\ユーザー名\Documents\WindowsPowerShell\Modules に配置

# 実行

```ps1
# 対象がファイル
Get-Md5sum -Path hoge.txt
c32ec965db3295bad074d2afa907b1c3  hoge.txt

# 対象がディレクトリ内のファイル
Get-Md5sum -Path foo/

# チェックサムファイルを使い妥当性検査
Get-Md5sum -Path hoge.txt > checksum.txt
Get-Md5sum -Check checksum.txt

# Linux チックにエイリアスを使って実行
md5sum hoge.txt
```
Dell OpenManage Server Administrator（OMSA）をyumからインストールする

# はじめに
DELLサーバのハードウェア状態を取得する際に利用しているDell OpenManage Server Administrator（OMSA）が、yumからでもインストールできることが判明したので纏めておきます。

# OMSAって？
- 公式だとこのあたり<br>
http://www.dell.com/support/manuals/jp/ja/jpbsd1/dell-opnmang-srvr-admin-v7.4/OMSA_CLI-v3/%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB?guid=GUID-800C0F9C-94F9-4893-AB05-1C3754260261&lang=ja-jp
- ここのページが分かり易い<br>
http://www.skyarch.net/blog/?p=1388

# 手順

## これまでの手順
- こんな感じでした。<br>
  - DELL 製品サポート<br>
  http://www.dell.com/support/troubleshooting/jp/ja/jpbsd1/TroubleShooting/ProductSelector
  - サービスタグを入力→送信
  - 「ドライバおよびダウンロードファイル」を選択
  - ドライバダウンロード 
  - 「OSの変更」から「Red Hat Enterprise Linux 7」（centos7の場合）を選択する
  - 「システム管理」を選択する
  - 「OpenManage Server Administrator Managed Node」のリンクを保存、インストールするサーバから取得する
  - インストール実施<br>
  インストーラ（srvadmin-install.sh）がRHEL用に作られているので、/etc/redhat-release の内容がマッチするように修正する（centosの場合には「Santiago」を「Final」に修正）。

- まれにインストール失敗することがあり（PowerEdge-R720あたりとか）、過去にダウンロードした古いバージョンのインストーラを利用することで対応したこともありました。

## yumからインストールする手順
/optにインストールされるので、/optを別立てでmountする必要がある場合は、先にそちらを実施したうえでやってください。（社内作業の場合、DBサーバ構築など）

```bash:
# 以下rootユーザーで実施

# omreportインストールのためのレポジトリ追加
wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash

# omreportインストール
yum install srvadmin-base srvadmin-storageservices

# サービス起動＆登録
/opt/dell/srvadmin/sbin/srvadmin-services.sh start
/opt/dell/srvadmin/sbin/srvadmin-services.sh enable

# 確認
omreport system summary
```

# 参考文献
http://dice-k-0.blogspot.jp/2012/02/dell-poweredgeraid.html
自分でrpmbuildしたhttpd-develをyum installできない（/usr/local/bin/perlがないと言われる）

# 環境・前提
- OSはCentOS 6.8。
- ソースからrpmbuildしたhttpd-devel 2.4.23をyum installしようとしたが「/usr/local/bin/perlが必要」と言われinstallに失敗。
- ローカル環境には /usr/local/bin/perl は存在する（/usr/bin/perl のシンボリックリンク）。ローカル環境にないと言われているのではなく、yumのinstall済みパッケージに /usr/local/bin/perl を提供すると言っているやつがいないということのよう。
- yum deplist httpd-devel で依存するものを調べると、CentOS レポジトリの httpd-devel 2.2系は同じperlパッケージを要求するがパスは /usr/bin/perl になっている。
- ググると rpm --nodeps で依存性を無視してinstallするという手順が見つかったが、それだと何か気持ち悪い。
- rpmbuild のどこかの過程で perl のパスを規定しているはず。specファイルでうまく環境変数を規定するか、または何らかのパッチをつくって当てれば何とかなるはず。

# 結論
- $SOURCE/build/install-bindist.sh.in を見ると環境変数 PATH の各ディレクトリをスキャンし perl5 か perl がないかを探していた。
- 最初に見つかったものをパスとして定義するので、PATH の中で /usr/local/bin が /usr/bin より先にあると /usr/local/bin/perl がセットされてしまうよう[^1]。
- spec ファイルの configure するステップの直前で PATH 変数中の /usr/local/bin を一番後ろに持って行く処理を入れて rpmbuild し署名すると、問題なく yum install できるようになった。

```httpd.spec
（前略）
# 現在のPATHをバックアップ
PATHBAK=$PATH
# /usr/local/bin: を見つけたら除去し、末尾に :/usr/local/bin をくっつける
PATH=`echo $PATH | sed -e 's/^\(.*\)\(\/usr\/local\/bin:\)\(.*\)/\1\3:\2/'`
%configure \
（中略）

%post
# Register the httpd service
/sbin/chkconfig --add httpd
/sbin/chkconfig --add htcacheclean
# 一応PATHを戻しておく
PATH=$PATHBAK
（後略）
```
```
$ pwd
/home/user/rpmbuild/SPECS
$ rpmbuild -ba httpd.spec
$ rpm --resign httpd-{,-devel,-manual,-tools}-2.4.23-n.x86_64.rpm
　※ n は httpd.spec で規定した release 番号、x86_64 部分はアーキテクチャに依存
$ cd /var/www/html/rpmrepo/RPMS/x86_64
$ createrepo .
$ yum clean all
$ yum install httpd-devel
　※ httpd が既に install されている場合、httpd-devel は同じバージョンの httpd
　　を要求するので先に update しておく必要あり
```

[^1]: [Bug 101268 – rebuilt package requires /usr/local/bin/perl to install](https://bugzilla.redhat.com/show_bug.cgi?id=101268)
digdagでtd>結果をJavaで取得

前タスクの結果を次タスクに受け渡すとき、
digdag変数は環境変数になっているのでJavaの中から取得可能(Java以外でも環境変数取ればいい)
td>のlast_job_idとか

```xxx/XXX.dig
+step1:
  td>: XXX.sql
+java:
  sh>: java -jar xxx.jar
```

```xxx_java/src/main/java/xxx/XXX.java
package xxx;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import org.supercsv.io.CsvListReader;
import org.supercsv.io.ICsvListReader;
import org.supercsv.prefs.CsvPreference;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Function;
import com.treasuredata.client.TDClient;
import com.treasuredata.client.model.TDResultFormat;

public class XXX {
    public static void main(String[] args) throws Throwable {
        TDClient client = TDClient.newClient(); // get config from ~/.td/td.conf
        String tdJson = System.getenv("td"); // 直前のtd>がdigdag変数にセットしたものを環境変数から取得
        System.out.println(tdJson); // {"last_job_id":"9999999", "xxx":"xxx"}
        String jobId = new ObjectMapper().readValue(tdJson, Td.class).last_job_id;
        client.jobResult(jobId, TDResultFormat.CSV, new Function<InputStream, String>() {
            public String apply(InputStream is) {
                try {
                    ICsvListReader reader = new CsvListReader(new InputStreamReader(is), CsvPreference.STANDARD_PREFERENCE);
                    List<String> list;
                    while ((list = reader.read()) != null) {
                        System.out.printf("XXX:[%s] XXX:[%s]%n", list.get(0), list.get(1));
                    }
                    reader.close();
                    return null;
                } catch (Throwable e) {
                    throw new RuntimeException(e);
                }
            }
        });
    }
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Td {
    public String last_job_id;
}
```

```xxx_java/build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}

apply plugin: "java"
apply plugin: "application"
apply plugin: "eclipse"
apply plugin: 'eu.appsatori.fatjar'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.treasuredata.client:td-client:0.7.28',
            'ch.qos.logback:logback-classic:1.1.7',
            'net.sf.supercsv:super-csv:2.4.0',
            'com.fasterxml.jackson.core:jackson-databind:2.8.4'
}

compileJava {
    options.encoding = 'UTF-8'
}

mainClassName = 'xxx.XXX'

fatJar {
    baseName = 'xxx'
    manifest {
        attributes 'Main-Class': 'xxx.XXX'
    }
}

task copyJar (type: Copy, dependsOn: fatJar) {
    from 'build/libs'
    include 'xxx.jar'
    into '../xxx'
}

task wrapper(type: Wrapper) {
    gradleVersion = '3.1'
}
```

```xxx_java/src/main/resources/logback.xml
<configuration/>
```
DRBD9環境をソースコードからVagrant+Ansibleでインストールしてみた。(CentOS7編)

DRBD9環境をソースコードからVagrant+Ansibleで構築してみました。
VirtualBoxとVagrantがインストールされたホストマシンを用意してください。

今回実行したマシンの環境は以下です

## ホストマシン環境
||バージョン|
|:--|:--|
|OS|MacOS Sierra|
|VirtualBox|5.1.6|
|Vagrant|1.8.6|

## 構築するDRBD9環境
以下になります。
CentOS7.2サーバ3台をVagrantで構築し、その後AnsibleでDRBD9のパッケージをインストールします。
drbdctlは３台のサーバをコントロールするソフトウェアです。

![DRBD9-server2.png](https://qiita-image-store.s3.amazonaws.com/0/101744/f861034b-35ed-5b90-5873-6337f6295e2f.png)

## インストール環境
||バージョン|
|:--|:--|
|OS|CentOS 7.2|
|DRBD|9.0.5|
|DRBD Manage|0.97.3|


## Vagrantでサーバ3台構築
ホストマシンにログインし任意の場所に移動します。
例では/vagrantを作成して移動します。

```shell-session
$ cd ~/
$ mkdir vagrant
$ cd vagrant
```

次にVagrantfileと実行用のスクリプトを取得します。

```shell-session
$ git clone https://github.com/ksawada1979/DRBD9-CentOS7-Vagrant.git
$ cp ./DRBD9-CentOS7-Vagrant/* ./
```

次にvagrant.shを実行します。

```shell-session
$ ./vagrant.sh 
```

自動的にサーバ3台作成されます。
途中でvagrantユーザのパスワードを設定するよう求められますので入力してください。
このパスワードは後の鍵交換で使用します。

## Ansible実行準備
以降の手順は全て一号機で実施します。

まず一号機であるホスト名DRBD9-1にSSHでログインします。

```shell-session
$ vagrant ssh DRBD9-1 
```

次に鍵作成と鍵交換をします。
一号機で鍵作成をして一号機、二号機、三号機と鍵交換します。

```shell-session
$ ssh-keygen -t rsa
$ ssh-copy-id -i .ssh/id_rsa.pub vagrant@192.168.33.11
$ ssh-copy-id -i .ssh/id_rsa.pub vagrant@192.168.33.12
$ ssh-copy-id -i .ssh/id_rsa.pub vagrant@192.168.33.13
```

次にAnsibleのプレイブックを取得します。

```shell-session
$ git clone https://github.com/ksawada1979/DRBD9-CentOS7-Ansible.git
$ cd DRBD9-CentOS7-Ansible
```

## Ansible実行
以降の手順は全て一号機で実施します。
Ansibleを実行して3台のサーバにDRBD9とDRBD manageをインストールします。ついでに時刻同期用にntpもインストールします。

ソースコードからインストールするためにコンパイルに必要なパッケージなどを追加します。

```shell-session
$ ansible-playbook -i ansible_hosts ready.yml
```

次にサーバ3台を再起動します。

```shell-session
$ ansible-playbook -i ansible_hosts reboot.yml
```

再起動によりログアウトしますので、再度ログインした後に３台まとめてDRBD9とDRBD Manageをインストールします。

```shell-session
$ vagrant ssh DRBD9-1
$ cd ./DRBD9-CentOS7-Ansible
$ ansible-playbook -i ansible_hosts drbd9.yml
```

以上でインストールが完了です。

## DRBD9環境構築
次に構築になりますが、長くなりそうなので以下に分割しました。

簡単にできるDRBD9環境構築
http://qiita.com/ksawada1979/items/1fa59f1945e4853dde11

## 環境破棄
vagrantで作成した環境を破棄する場合は以下のコマンドで破棄できます。

```shell-session
$ vagrant destroy
```


## 参考
以下サイトを参考にさせていただきました。

VagrantのVMに複数のディスクを追加する方法
http://qiita.com/kjtanaka/items/8f3e92e029e46f826754

Ansibleでサーバ一括再起動
http://qiita.com/wanghm/items/0efa793f9f89d4312164
機械学習関連情報の収集と分類(構想)

最近は人工知能や機械学習関連の情報がどんどん出てきて流れを追いかけるのが大変です。

まとめサイトもありますが、すぐにロールアウトしていくので、少し古くなった記事がどこにあったか気になることもあります。

非常によくできたまとめサイトもありましたが、そういうところはアクセスが集中して維持が困難になることが多いようです。

そこで、機械学習関連情報を自動的に収集・分類してローカルに眺めるからくりを作ってみようと構想しました。

構想の全体像はこんな↓感じです。
![構想の全体像](https://qiita-image-store.s3.amazonaws.com/0/144985/c90a2646-b6e2-c130-28db-29aabc774822.png)

現状、いくつかのパートはできているのですが、うまくいかないパートもあり、全体がつながっていません。

以下、つまみ食い的にいくつか紹介しておきます。

❶ 情報の収集
-------------

FESS サーバを立てて定期的にクロールして収集します。

現状動かしている FESS サーバは http://hosi.org:8090

このサーバは、

　http://www.asahi-net.or.jp/~dd6t-sg/AI-Links.html

を起点にして、深さ 3 でクロールした結果を検索できるようにしています。

❹ 手動分類
-----------

クロールして発見したページのショートカットをローカルファイルシステムに手動でドラッグ＆ドロップします。

ローカルファイルシステムのフォルダを階層的にしておいて、そのまま分類として用います。

![ドラッグ＆ドロップ](https://qiita-image-store.s3.amazonaws.com/0/144985/95d8f8f2-831c-19b8-7c67-de2973a7b0f6.png)

❷ 自動分類
-----------

FESS サーバで収集した情報は Elasticsearch で取り出せます。

これに gensim を用いてトピックモデルで教師なし分類しようというのが最初の構想でした。これはうまくいかなかったので別途経緯を整理します(→[機械学習関連情報をトピックモデルで分類する](http://qiita.com/suchowan/items/a4231d1c63c835ae88e2))。

次に考えられるのが、手動分類結果を教師データとする教師あり分類です。こちらは手を付けたばかりです(→参考:[scikit-learn でランダムフォレストによる多ラベル分類](http://qiita.com/suchowan/items/58760cedb1b062182d92))。

❸ 階層的分類の可視化
---------------------

ローカルファイルシステムのフォルダに展開された分類結果は Ruby on Rails のサーバで可視化します。

機械学習関連情報の部分でなくて恐縮[^1]ですが http://hosi.org:4000/bookmarks のような記事一覧ツリーになるでしょう。

■ 現状
-------

…ということで、❶情報の収集→❹手動分類→❸階層的分類の可視化[^2]という経路は実現しているので、新聞を読む感覚で記事を毎朝ドラッグ＆ドロップして、ローカルに記事一覧ツリーが見えるようにはなっています。

しかし記事数が四千件(→[こちら](http://qiita.com/suchowan/items/7fd43a5950170782b467))を超えてくると、さすがに自動化したいですね。

[2017-08-03 追記]
全体のデータフローがかなり変わっていますので [https://github.com/suchowan/bookmarks](https://github.com/suchowan/bookmarks ) もご覧ください。

[^1]: ご覧のように非常に重いです。機械学習関連情報部分を公開するとサーバが耐えられないでしょう。

[^2]: 番号順の乱れに現れているように、この経路は本来想定した主経路ではありません。
Firebase v9.8からFirebase Notificationsのアイコンが指定できるようになりました


## 概要

正しくはFirebase Cloud Messagingがv9.8からデフォルトの通知アイコンとアクセントカラーを設定できるようになったことで、実質Notificationsのアイコンをランチャーアイコン固定から自由なアイコンに変更することができるようになりました。

[Firebase Android SDK Release Notes  |  Firebase](https://firebase.google.com/support/release-notes/android)

> Cloud Messaging
>
> FEATURE Improved the reliability of message delivery to Android Wear devices that are paired with an iOS device.
>FEATURE Added the ability to customize the default notification icon and color using AndroidManifest.xml metadata.

## 実装方法

AndroidManifest.xmlのapplication内の`meta-data`として登録します。

```xml:AndroidManifest.xml
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:name=".FanfanApplication"
    >

    <meta-data android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@android:drawable/sym_action_email" />
    <meta-data android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />

	<!-- 以降、省略 -->
```

![スクリーンショット 2016-10-25 11.43.09.png](https://qiita-image-store.s3.amazonaws.com/0/4560/67485fc6-9509-349e-fe6c-2f7b3c7a705d.png "スクリーンショット 2016-10-25 11.43.09.png")

ランチャーアイコンとは違うアイコン＋ピンクのアクセントカラーを設定しました。

## 実行結果

### meta-dataを設定していない場合（Android 7.0）

![Screenshot_20161025-115059~01.png](https://qiita-image-store.s3.amazonaws.com/0/4560/083dc4bf-a0ad-6c44-abda-514ab88695af.png)

### Android 6.0

![Screenshot_1477362970.png](https://qiita-image-store.s3.amazonaws.com/0/4560/9df6021f-70cd-18dd-8bd2-facc1af5c308.png "Screenshot_1477362970.png")

### Android 7.0

![Screenshot_1477362557.png](https://qiita-image-store.s3.amazonaws.com/0/4560/9796c7b7-2e26-0e6a-2e08-158dc2b02253.png "Screenshot_1477362557.png")


ようやく実用しやすい感じになりましたね！
CENTOS 7.0  Install Developement WebServer

BOOT(CentOS 7.0 Install DVD)

*Language* : Japanese
*Software* : Basic Web Server


# WEB Server 環境の整備 (PHP)

```bash
# mariadb 追加
yum install mariadb-server mariadb mariadb-devel epel-release

# remi リポジトリ追加
yum localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# PHPのアップデートおよびエクステンション追加
yum install --enablerepo=remi-php56 --enablerepo=remi ￥ 
    php php-mbstring php-mysqli php-intl

# sshd の起動
systemctl enable sshd.service
systemctl start  sshd.service

# httpd の起動
systemctl enable httpd.service
systemctl start  httpd.service

# mariadb の起動
systemctl enable mariadb.service
systemctl start  mariadb.service

# Firewall の停止
systemctl stop    firewalld.service
systemctl disable firewalld.service
```

# GIT の追加

```bash
# yum install autoconf gcc  subversion-perl
mkdir -p /usr/local/src/git
cd /usr/local/src/git
wget https://github.com/git/git/archive/v2.10.1.zip
unzip v2.10.1.zip
make configure
./configure --prefix /usr/local/git/2.10.1
make && make install
alternatives --install /usr/local/bin/git git /usr/local/git/2.10.1/bin/git 1
```

# RUBY の追加

```
yum install readline-devel ImageMagick  ImageMagick-devel gcc-c++ curl-deve httpd-devell
mkdir -p /usr/local/src/rbenv
cd /usr/local/src/rbenv
wget https://github.com/rbenv/rbenv/archive/v1.0.0.zip
unzip v1.0.0.zip
mkdir -p /usr/local/rbenv/1.0.0
cp -pr /usr/local/src/rbenv/rbenv-1.0.0/* /usr/local/rbenv/1.0.0/

# rbenv-install のインストール
git clone git://github.com/sstephenson/ruby-build.git  /usr/local/rbenv/1.0.0/plugins/ruby-build
/usr/local/rbenv/1.0.0/plugins/ruby-build/install.sh

# ruby-2.3.1 のインストール
RBENV_ROOT=/usr/local/rbenv/ rbenv install 2.3.1

# PATH の追加
alternatives --install /usr/local/bin/rbenv rbenv /usr/local/rbenv/1.0.0/bin/rbenv 1
alternatives --install /usr/local/bin/ruby ruby /usr/local/rbenv/versions/2.3.1/bin/ruuby
alternatives --install /usr/local/bin/rake rake /usr/local/rbenv/versions/2.3.1/bin/rake 1
alternatives --install /usr/local/bin/gem ruby-gem /usr/local/rbenv/versions/2.3.1/bin/gem 1
```
tmux 上でバッテリーの残量が一目でわかるコマンドを Go で作った

[Code-Hex/battery - GitHub](https://github.com/Code-Hex/battery)
> Draw battery unicode art written by Go

これは tmux 上でバッテリーの残量を表示したいがために作成したものです. ガラケーな感じで表示されるのが特徴的です.
![battery](https://qiita-image-store.s3.amazonaws.com/0/118068/5b495b63-e20e-1d6e-a2fc-ed4d9c91b125.png)

## :battery: 個人的に思いついた使い方
一つの `.tmux.conf` を複数デバイス上で使う場合, 全てのデバイスに必ずしもバッテリーが搭載されているわけではないので, バッテリーを持っている場合のデバイスのみで表示をしたい時に次のような設定を `if-shell` を使って設定することができます.

    # バッテリーを持っていない場合のフォーマット
    set-option -g status-right '#[fg=colour255,bg=colour64] %H:%M:%S #[default]'

    # バッテリーを持っている場合のフォーマット
    if-shell "battery --has" "set-option -g status-right '#(battery -t) #[fg=colour255,bg=colour64] %H:%M:%S #[default]'"

この `battery` コマンドは `--has` オプションを持っています. これはデバイスがバッテリーを持っているかどうかを判断するオプションです. 実行すると何も表示されませんが, `echo $?` で確認すると, バッテリーを持っている場合は `0`, 持っていない場合は `1` が表示されるはずです.

これで簡単に条件分岐を行うことができますね！

## :computer: 対応している OS
現在は Mac OSX, Windows, Linux をサポートしています.

バッテリーの残量を知るために複数コマンドをパイプで実行するのが個人的に許せなかったので, Mac の方では Objective-C をバインドして結果を取得するようにしています.
Windows, Linux も同様にファイルやシステムコールを用いてバッテリーの状態を取得できるようになっています！（[mattn](http://qiita.com/mattn) さんありがとうございます！）

## :arrow_double_down: インストール 
Go の環境がある方は go get で簡単にできます！

    go get -u github.com/Code-Hex/battery/cmd/battery

もしくは[バイナリ](https://github.com/Code-Hex/battery/releases)を配布しているので, 直接ダウンロードして `/usr/local/bin` などに置くか, [zplug](https://github.com/zplug/zplug)を用いると良いかもしれません:+1:

## 最後に
リクエストがある場合, ぜひ github issue に書き込んでください！
Pull Request もお待ちしております!!
照合順序がCI(大文字小文字区別しない)なのに、大文字小文字区別して検索したい

COLLATEを指定して検索すればOK。

```
SELECT *
FROM   [テーブル名]
WHERE  [項目名] = '[値]' COLLATE [照合順序]
```

| オプション        |説明              |区別対象           |
|:-----------------|:-----------------|:-----------------|
| CI / CS |大文字と小文字を区別しない/する。|「A」と「a」|
| AI / AS |アクセント、濁音、半濁音を区別しない/する。|「は」と「ば」と「ぱ」|
| (KIの指定はない) / KS |ひらがなとカタカナを区別しない/する。|「あ」と「ア」|
| (WIの指定はない) / WS　|半角と全角を区別しない/する。|「A」と「Ａ」｜


```
SELECT *
FROM   TableA
WHERE  Col1 LIKE '%a%'
COLLATE Japanese_XJIS_100_CS_AS
```
Chromeデベロッパーツールで実機の回線速度を再現してコーディング

ウェブサイトのコーディングはデザイン・アニメーションなど気をつけるべきポイントはたくさんありますが、特にスマートフォンサイトのコーディングには実機の回線速度を意識することが大切です。

読み込みが遅いウェブサイトなんて待ってられないですよね:expressionless:

普段はオフィスの光回線&Wi-Fiを使用したり、ローカルにサーバーを立ててコーディングしている方も多いと思います。読み込みも一瞬で終わって、なかなか読み込み時間を再現しづらいと思います。今回はChromeのデベロッパーツールを使って擬似的に実機の回線速度を再現する方法を紹介したいと思います。

# 1. 実機の回線速度を計測する

まず、実機の回線速度を計測アプリで計測します。[SPEEDTEST](http://www.speedtest.net/)はAndroid、iOSともにリリースされているのでおすすめです。

![Screenshot_20161025-102349.png](https://qiita-image-store.s3.amazonaws.com/0/55103/53cde70e-3790-e130-b45f-ce1a87207076.png)

実際に手元の端末（Xperia Z5 Premium）とSIM（IIJmio）で計測しました。ダウンロードが14.78Mbps、アップロードが3.63Mbps、レイテンシ（PING）が51msでした。この数値はデベロッパーツールで後ほど使用するのでメモしておきましょう

# 2. Chromeデベロッパーツールに回線情報を登録

回線速度の再現にはChromeデベロッパーツールの「Network conditions」を使用します。「Console」タブの左側にある「・・・」をクリックし、「Network conditions」を選択します。

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/55103/4729fdd7-2d6a-aa12-66e9-bffbf2eb57e9.png)

開きました。

![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/55103/4c4f8a5c-b4b1-e570-fcc8-a46c3de93907.png)

「Network throttling」から「Custom」 ＞ 「Add」を選択します。

![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/55103/7f14c49a-bfe2-08dd-9463-3a4d20610794.png)

「Network Throttling Profiles」が開くので、「Add custom Profile」ボタンをクリックして、先程アプリで計測した数値を入力します。[Download]と[Upload]の単位が`kb/s`となっているため注意してください（Mb/sからkb/sへの変換には1024倍します）。入力出来たら「Add」ボタンをクリックして登録します。

![cap4.png](https://qiita-image-store.s3.amazonaws.com/0/55103/41df6eae-7b84-8fc5-c14d-0d3a21f63f03.png)

登録すると「Network throttling」の一覧に表示されるので選択します。これで実機の回線速度を再現する準備が整いました。

![cap5.png](https://qiita-image-store.s3.amazonaws.com/0/55103/e03bbdbf-3410-3641-6bed-bda019a38b1f.png)

Let's 検証！:laughing:
【Swift】Swift2.0とXcode7.3でFMDBを設定する

SwiftでFMDBを利用しようと思い，設定手順をいろいろ調べていて紹介されている手順よりも**個人的に**楽な方法で設定ができたので記事にします．

# 環境
Swift 2.2
Xcode 7.3
# Step1 : CocoapodsでFMDBをインストールする
まずはFMDBを利用したいプロジェクトにFMDBをインストールします．

```text
$cd プロジェクトへのパス
$pod init
```
生成したPodfileに以下のようにpod 'FMDB'を追加します．
<img width="450" alt="Podfile.png" src="https://qiita-image-store.s3.amazonaws.com/0/139470/14cefd17-ea95-12ea-565a-34d3cedea0f2.png">


Pod fileの変更を保存した後，以下のコマンドを実行します．

```text
$pod install
```
# Step2 : プロジェクトを開く
プロジェクト名.xcworkspaceのファイルを開きます．
「Build Phases」→「Link Binary With Libraries」の＋ボタンで「libsqlite3.0.tbd」を追加します．

![スクリーンショット 2016-10-25 10.23.09.png](https://qiita-image-store.s3.amazonaws.com/0/139470/ad95ed9c-2db7-b107-d070-658b6d747eae.png)

![スクリーンショット 2016-10-25 10.28.08.png](https://qiita-image-store.s3.amazonaws.com/0/139470/46d8fb33-5e6d-71cf-78ec-7e5f01baf2a0.png)
# Step3 : プロジェクト名-Bridging-Header.hファイルを作成する
「New File」→「Header File」を選択してNextボタンを押します．
ファイル名を，「プロジェクト名-Bridging-Header」としてヘッダファイルを作成します．
![スクリーンショット 2016-10-25 10.32.47.png](https://qiita-image-store.s3.amazonaws.com/0/139470/51e14afc-abf1-ceec-cb97-2f39a8d7efa3.png)

![スクリーンショット 2016-10-25 10.34.07.png](https://qiita-image-store.s3.amazonaws.com/0/139470/8501657a-dd34-0f5d-7ce6-3d4bc6c0c87b.png)

# Step4 : ヘッダファイルを編集する
Step3で作成したヘッダファイルに以下のコードを追加します．

```Swift:FMDB_Swift-Bridging-Header.h
#ifndef FMDB_Swift_Bridging_Header_h
#define FMDB_Swift_Bridging_Header_h

// ここから追加
#import "FMDB/FMDatabase.h"
#import "FMDB/FMResultSet.h"
#import "FMDB/FMDatabaseAdditions.h"
#import "FMDB/FMDatabaseQueue.h"
#import "FMDB/FMDatabasePool.h"
// ここまで

#endif
```

# Step5 : ヘッダファイルへのパスを設定する
「Build Settings」→「Swift Complier - Code Generation」→「Objective-C Bridging Header」に作成したヘッダファイルへのパスを設定する．
パス：プロジェクト名/ヘッダファイル名

![スクリーンショット 2016-10-25 10.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/139470/796d7782-7b1b-0358-57b8-55bbe32f3e25.png)
# Step6 : ViewController.swiftにインポート文を追加
以下のようにViewController.swiftにインポート文を追加します．
![スクリーンショット 2016-10-25 10.54.29.png](https://qiita-image-store.s3.amazonaws.com/0/139470/b90be5d7-69e9-f76e-d8af-97c0eee95163.png)

これでFMDBが使えるようになっているはずです！

以下の参考サイトでは，GitHubからfmdbファイルをダウンロードして追加する方法が説明されていますが，個人的にはこの方法の方がしっくりくるのでこの方法でFMDBを利用しようと思います．

# 参考サイト
[SwiftでSQLiteのFMDBをエラー無しで設定する方法！](http://smileapps.sakura.ne.jp/blg/?p=705)
Linuxにおける「パスを通す」って何ですか？

windowsとlinuxのプログラム実行の違い
-----------
ウィンドウズ上でエクセルを起動させたいときは、exeが置いてあるフォルダまでエクスプローラーで行き「excell.exe」ファイルをダブルクリックすることで起動させます。

Linux上でも同じで、実行したいプログラムが置いてあるディレクトリまで移動し、そこでプログラムを実行するコマンドを入力することでプログラムが起動できますが・・・
いちいちディレクトリまで移動するのめんどくさくないですか？



「パスを通す」とは、サーチしてくれるディレクトリを事前に登録すること
-----------------------------
ユーザー名「cent」にてlinuxにログインすると一番最初に始まるディレクトリは

/home/cent

今いるディレクトリにどんなファイルがあるか確認したいので
コマンド「ls」を入力したい（lsもウィンドウズで言うなら「ls.exe」という実行ファイル扱い）

「ls」は「/bin」ディレクトリにあるので、その時の入力コマンドは
```
$ /bin/ls
```
と入力することが必要です。
でも毎回「/bin」いれるの面倒なので、「$ ls」と入力するだけで実行したい。

そこで、コマンド入力したときに自動的に「/bin」ディレクトリをサーチして、
もし「ls」コマンドがそのディレクトリに存在していたら、その「ls」を実行しますという方法がある。
それが「パスを通す」という言葉の意味です。




具体的には、どうすれば「パスを通す」ことになるのか？
---------------------------------------
コマンドを入力したときに、サーチしてくれるディレクトリを表示するコマンド
```
$ echo $PATH
```
上記の実行結果として（私の環境では）
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/cent/.local/bin:/home/cent/bin

と表示されます。


最初に書いてある、「/usr/local/bin」が最初にサーチにいくディレクトリ
コロン区切りで２番目の「/usr/bin」が２番目にサーチにいくディレクトリ

１番目になければ２番目という感じで見ていってくれる
digdagのtd>のdownload_file

MalformedInputExceptionになることがある → 0.8.19で解消済
=====================================

digdag(執筆当時0.8.16くらいだったか)のtd>:にdownload_file:を指定すると、うまくいく場合と以下のエラーでうまくいかない場合がある
データによるっぽい？

```
    java.nio.charset.MalformedInputException: Input length = 1
org.msgpack.core.MessageStringCodingException: java.nio.charset.MalformedInputException: Input length = 1
       at org.msgpack.value.impl.AbstractImmutableRawValue.asString(AbstractImmutableRawValue.java:72)
       at io.digdag.standards.operator.td.TdOperatorFactory.addCsvValue(TdOperatorFactory.java:390)
       at io.digdag.standards.operator.td.TdOperatorFactory.addCsvRow(TdOperatorFactory.java:334)
       at io.digdag.standards.operator.td.TdOperatorFactory.lambda$downloadJobResult$0(TdOperatorFactory.java:304)
       at io.digdag.standards.operator.td.TDJobOperator.lambda$null$3(TDJobOperator.java:105)
       at com.treasuredata.client.TDHttpClient.call(TDHttpClient.java:442)
       at com.treasuredata.client.TDClient.jobResult(TDClient.java:597)
       at io.digdag.standards.operator.td.TDJobOperator.lambda$getResult$4(TDJobOperator.java:103)
       at io.digdag.util.RetryExecutor.run(RetryExecutor.java:158)
       at io.digdag.util.RetryExecutor.run(RetryExecutor.java:133)
       at io.digdag.standards.operator.td.TDJobOperator.getResult(TDJobOperator.java:102)
       at io.digdag.standards.operator.td.TdOperatorFactory.downloadJobResult(TdOperatorFactory.java:299)
       at io.digdag.standards.operator.td.TdOperatorFactory$TdOperator.processJobResult(TdOperatorFactory.java:124)
       at io.digdag.standards.operator.td.BaseTdJobOperator.runTask(BaseTdJobOperator.java:57)
       at io.digdag.util.BaseOperator.run(BaseOperator.java:51)
       at io.digdag.core.agent.OperatorManager.callExecutor(OperatorManager.java:297)
       at io.digdag.cli.Run$OperatorManagerWithSkip.callExecutor(Run.java:676)
       at io.digdag.core.agent.OperatorManager.runWithWorkspace(OperatorManager.java:241)
       at io.digdag.core.agent.OperatorManager.lambda$runWithHeartbeat$2(OperatorManager.java:134)
       at io.digdag.core.agent.NoopWorkspaceManager.withExtractedArchive(NoopWorkspaceManager.java:20)
       at io.digdag.core.agent.OperatorManager.runWithHeartbeat(OperatorManager.java:132)
       at io.digdag.core.agent.OperatorManager.run(OperatorManager.java:116)
       at io.digdag.cli.Run$OperatorManagerWithSkip.run(Run.java:658)
```

起きたときには以下で回避(★)

```
+step1:
  td>: XXX.sql
# download_file: XXX.csv
+step2:
  sh>: td job:show ${td.last_job_id} -f csv -o XXX.csv --column-header
```

2016/11/17追記：ver.0.8.19で解消済とのこと(試していないが) → http://docs.digdag.io/releases/release-0.8.19.html#workflow-changes

サーバモードだと次タスクで読めない
===============================

カレントディレクトリにダウンロードするので、ローカルモードなら次タスクで読める
しかしサーバモードだとタスク毎に専用ディレクトリが作られてその中で当該タスクが実行されて当該タスクが終わると当該ディレクトリは消えるのでダウンロードしたファイルを次タスクで読むことはできない
かといって「download_file: /tmp/XXX.csv」とか「download_file: ../XXX.csv」とか指定すると「プロジェクトディレクトリ外は指定不可」エラーになる

しかたないので前述の★で回避 (-o /tmp/XXX.csv)