OmniAICreator/Qiita-1.07M huggingface dataset:
数値が入ったリストの文字列変換


## 各要素の文字列への変換

リストに数値がいくつか入っているとき、それらを全て文字列に変換するにはmapを使う。

```python
>>>list = [0,1,2,3,4,5]
>>>map(str,list)
['0', '1', '2', '3', '4', '5']
```

また、これらの要素を","などで区切って一つの文字列にしたい時も一行で書ける。

```python
>>>','.join(map(str,list))
'0,1,2,3,4,5'
```

センサなどで計測したデータを送信したりするときに便利。
ロボットpepperを動かしたい！まずはここから。Choregrapheをインストールする手順

#pepperとは
pepperとは、ソフトバンクがリリースした、感情認識ロボットです。

* [pepperとは(ソフトバンクの公式ページ)](http://www.softbank.jp/robot/)
* [ロボットアプリの未来をオープンコミュニティに賭けるソフトバンク（ロボットアプリの未来を感じさせる記事）](http://pc.watch.impress.co.jp/docs/column/kyokai/20140924_668070.html)


スマートフォンのようにアプリストアもオープン予定で、Pepperを使って様々なロボアプリを製作・公開できるようになるでしょう。

まず、その開発環境を整えるための手順をまとめました。

#インストール手順
ソフトバンクのPepperに関するページの中にChoregraphe（試用版）のダウンロードについても記載があります。
http://www.softbank.jp/robot/developer/tools/sdk/

これに従ってダウンロードしてみました。

[ALDEBARAN社のコミュニティーページ](https://community.aldebaran.com/ja)にアクセス
Create Accountを選択


![スクリーンショット 2015-02-05 15.57.47.png](https://qiita-image-store.s3.amazonaws.com/0/63942/344b0434-4caf-5158-150e-ce58a92b2f16.png)



名前やアドレスを入力 -> Create
![02.png](https://qiita-image-store.s3.amazonaws.com/0/63942/37c6ce84-59cb-908a-083e-47d7455b33c2.png)


すぐに登録したメールアドレスにメールが届くので、そこのリンクをクリック。
以下のような画面が出て、アカウントが作成されたので、右上のSign inを選択。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/63942/9521e16e-2176-315a-424a-2d61e20cf933.png)

アドレスとパスワードを入力。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/63942/b3d49697-a6bb-a3b3-63b8-5064b8e44d32.png)



再びコミュニティページに移り、ダウンロードを選択。
ちなみに、 右上の部分で英語と日本語表記を選べる。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/63942/1518c33d-4ebc-24b0-847d-49625097582e.png)


自分の環境に合わせてMac 64 - Setupを選択。
ダウンロードが始まります。
![ 07.png](https://qiita-image-store.s3.amazonaws.com/0/63942/b92e4ed4-c8db-af27-b3c2-39be54bc19fe.png)

![ 08.png](https://qiita-image-store.s3.amazonaws.com/0/63942/c7df7365-c46f-be93-8073-be861205b707.png)

このまま開こうとしたらエラーメッセージが出たので、右クリックの「開く」から選択。
インストールが始まる。
![ 09.png](https://qiita-image-store.s3.amazonaws.com/0/63942/2304f810-16d7-b23f-2502-98a65ea8a7fc.png)

「次へ」を選択。
![スクリーンショット 2015-02-05 16.24.25.png](https://qiita-image-store.s3.amazonaws.com/0/63942/1f0e12ee-c392-c7d6-c94d-4157e82e7094.png)

契約書に同意。
![スクリーンショット 2015-02-05 16.24.30.png](https://qiita-image-store.s3.amazonaws.com/0/63942/373557d2-a821-2eaf-99f4-616c93e0664c.png)

今回はライセンスキーを持たないので評価版モードで登録。
９０日間無料で試用できる。
![スクリーンショット 2015-02-05 16.24.36.png](https://qiita-image-store.s3.amazonaws.com/0/63942/ee748b40-18f9-eef4-1bc4-4102c26aa6c2.png)

今回は Quick版をインストール。
![スクリーンショット 2015-02-05 16.24.52.png](https://qiita-image-store.s3.amazonaws.com/0/63942/f8ab4566-58bf-21df-4170-32c0b58e5db2.png)

２分程度でインストールが完了。
![スクリーンショット 2015-02-05 16.25.07.png](https://qiita-image-store.s3.amazonaws.com/0/63942/4f572237-d61c-6c1a-05fe-55f4a2280b86.png)

![スクリーンショット 2015-02-05 16.26.32.png](https://qiita-image-store.s3.amazonaws.com/0/63942/3978b7fe-b242-fb86-a166-30bfeef7bfac.png)

「Activate 90 days trial period」を選択
![スクリーンショット 2015-02-05 16.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/63942/247de6c4-3aff-5440-de00-f152f468dca2.png)


無事にインストール完了です！
![スクリーンショット 2015-02-05 16.27.00.png](https://qiita-image-store.s3.amazonaws.com/0/63942/5ca69bf4-206f-cd57-861a-32c0c19cc3dd.png)


#日本語の設定に変更
Choregraphe -> Preferences -> language -> System Defaultを日本語に変更
apache log x fluentd x datadog


Based on this [article](http://qiita.com/takus/items/f3dfaa1ab431644b922b), we can setup apache log processor to forward data to datadog.

Mind the ```format``` setting, change ```ltsv``` => ```apache2```

```
<source>
    type tail
    format apache2
    #time_format %d/%b/%Y:%H:%M:%S %z
    path /var/log/httpd/access_log
    pos_file /tmp/access_log.pos
    tag apache.access
</source>
```

Required plugins:

1. fluent-plugin-datacounter
2. fluent-plugin-rename-key
3. fluent-plugin-record-reformer
4. fluent-plugin-forest
5. fluent-plugin-dd

If you are using td-agent, plugin can be installed using: ```sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-record-reformer```

Permission issue may arise, so:
```chmod 0645 /var/log/httpd```

Shoot, apparently we need to tweak to http status matching as well. Based on this [article](http://www.fluentd.org/guides/recipes/apache-add-hostname), we should math the ```code``` instead of ```status``` key

```
<match apache.access>
    type datacounter
    tag apache.status
    aggregate tag
    count_key status
    pattern1 2xx ^2\d\d$
    pattern2 3xx ^3\d\d$
    pattern3 4xx ^4\d\d$
    pattern4 5xx ^5\d\d$
</match>
```

Voila

![Datadog timeseries](https://monosnap.com/file/DhscDbwuRlTmGbcWXcQmUhBFijkutQ.png)

Now we're talking ;)

PS:
Both fluentd and datadog are new to me
pythonでシリアル通信を行う


## pyserialを使う

シリアル通信を行う場合、pyserialを使うと便利。

- OSX 10.10.1
- python2.7

## install

まずはpipを使ってpyserialをインストール。

```
$ pip install pyserial
```

これだけ。

## 使い方

### 送信

インポートして、設定して、出力、最後にクローズ。
非常に簡単。

```python
>>> import serial
>>> ser = serial.Serial('/dev/tty.usbserial-******', 9600, timeout=1)
>>> ser.write("hello")
>>> ser.close()
```

設定の部分では、第一引数にデバイス名、次にボーレート、次にタイムアウトを指定。
macでデバイス名を調べる場合は、ターミナルで

```
$ ls /dev/tty.*
```

と入力してやれば、'/dev/tty.usbserial-*****'と表示されるので確認できる。

### 受信

read()の引数に、

- 何も指定しなければ、1文字読み込み
- 整数(10など)を指定してやれば、指定された文字数分読み込み
- readline()としてやれば行末端まで読み込み

```python
>>> import serial
>>> ser = serial.Serial('/dev/tty.usbserial-*****', 9600, timeout=1)
>>> c = ser.read()
>>> string = ser.read(10)
>>> line = ser.readline()
>>> ser.close
```
nmt-newt-listbox.c:333:update_active_internal: accertion failed

不幸にも同じエラーコードに出会ってしまった人へ。

nmt-newt-listbox.c:333:update_active_internal: accertion failed

VMwareとかでクローンしたサーバで
nmtuiで「Activate a connection」を選びましたか？
そうであれば、クローン元のMACがそのままコピーされていて、
vCenter上で認識してるMACとifcfg-ens*に書かれているMACが異なっているのが原因です。

vmwareのKnowledge Baseに解決方法が書いてあるのですが、
タイトルのエラーコードでググっても出てこないのでハマります。

http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2093503

この記事で僕と同じハマり方をする人が一人でも減ると嬉しいです。
wp-cliでwp-cronを強制的に発火する


## wp-cliでwp-cronの一覧を取得

wp-cronに登録されているイベントの一覧を取得するには以下のように`wp cron event list`を使用する。

```
$ wp cron event list
+----------------------+---------------------+----------------------+---------------+
| hook                 | next_run_gmt        | next_run_relative    | recurrence    |
+----------------------+---------------------+----------------------+---------------+
| wp_maybe_auto_update | 2015-02-05 07:35:00 | 4 minutes 46 seconds | 12 hours      |
| wp_update_plugins    | 2015-02-05 08:50:13 | 1 hour 19 minutes    | 12 hours      |
| wp_update_themes     | 2015-02-05 08:50:13 | 1 hour 19 minutes    | 12 hours      |
| wp_scheduled_delete  | 2015-02-05 08:54:23 | 1 hour 24 minutes    | 1 day         |
| wp_version_check     | 2015-02-05 19:29:58 | 11 hours 59 minutes  | 12 hours      |
| publish_future_post  | 2020-01-01 12:00:18 | 4 years 11 months    | Non-repeating |
+----------------------+---------------------+----------------------+---------------+
```

## wp-cliで特定のイベントを強制的に発火させる

特定のイベントを発火させるには、上述のコマンドで発火させたいイベントの`hook`を確認した後で、以下のように`wp cron event run`を実行する。

```
$ wp cron event run wp_update_plugins
Success: Executed the cron event 'wp_update_plugins'
```

上の例では、引数に`wp_update_plugins`を指定してプラグインのアップデートを発火させた。
検索結果の最初の1件のみを取得する

稀に SQL の検索結果の最初の1件だけが欲しい場合がある（副問い合わせのときなど）。やり方はいろいろあると思うが、ここでは Oracle の `ROWNUM` を使うやり方をメモしておく。

## 準備

以下のテーブルを用意する。

**T_SAMPLE**:

```sql
create table T_SAMPLE (
    PARENT varchar2(6) not null,
    CHILD  varchar2(6) not null,
    SORTNO number(2,0) default 1 not null,
    constraint PK_T_SAMPLE primary key (PARENT, CHILD) using index
)
/
insert into T_SAMPLE (PARENT, CHILD, SORTNO) values ('IDC8JT', 'IDVZ1O', 1)
/
insert into T_SAMPLE (PARENT, CHILD, SORTNO) values ('IDF8CM', 'IDVZ1O', 2)
/
insert into T_SAMPLE (PARENT, CHILD, SORTNO) values ('IDCQJJ', 'IDI50N', 1)
/
insert into T_SAMPLE (PARENT, CHILD, SORTNO) values ('ID3JF6', 'IDVZ1O', 3)
/
```

| PARENT*| CHILD* | SORTNO |
|:-------|:-------|-------:|
|'IDC8JT'|'IDVZ1O'|       1|
|'IDF8CM'|'IDVZ1O'|       2|
|'IDCQJJ'|'IDI50N'|       1|
|'ID3JF6'|'IDVZ1O'|       3|

（* は primary key 項目）

## ROWNUM を使って最初の1件のみを取得する

```sql
select PARENT, SORTNO from T_SAMPLE where CHILD = 'IDVZ1O'
```

これで以下の結果を取得できる。

| PARENT | SORTNO |
|:-------|-------:|
|'IDC8JT'|       1|
|'IDF8CM'|       2|
|'ID3JF6'|       3|

ここで `SORTNO` が最大のレコードの `PARENT` のみが欲しい場合はこうする。

```sql
select TBL.PARENT as PARENT
  from (select PARENT, SORTNO from T_SAMPLE where CHILD = 'IDVZ1O' order by SORTNO desc) TBL
 where rownum = 1
```

| PARENT |
|:-------|
|'ID3JF6'|

元の SQL 文に `rownum = 1` 条件を入れると `order by` でソートする前の状態で条件が効いてしまうので、いったん

```sql
select PARENT, SORTNO from T_SAMPLE where CHILD = 'IDVZ1O' order by SORTNO desc
```

でソートした状態に対して `rownum = 1` 条件をセットする。

まっ、本当はこんな羽目に陥らないようにテーブル設計すべきなんだろうけど、改造仕事はこういうイレギュラーがよくあるのよ。

### ROWNUM を使いたくないなら

今回の例で `CHILD` に対して `SORTNO` 値のダブりがないと言えるなら

```sql
select PARENT
  from T_SAMPLE
 where CHILD = 'IDVZ1O'
   and SORTNO = (select max(SORTNO) from T_SAMPLE where CHILD = 'IDVZ1O')
```

という手が使えなくもない。ん～、ちょっと苦しいかな？ テーブルのフルアクセスが2回発生するからなぁ。

## 【おまけ】 LIMIT を使って最初の1件のみを取得する

ついでに。
MySQL の場合は `ROWNUM` ではなく `LIMIT` が使える。

```sql
select PARENT, SORTNO from T_SAMPLE where CHILD = 'IDVZ1O' order by SORTNO desc limit 1
```

Oracle の `ROWNUM` とちがい， `LIMIT` の場合は `order by` を含めた文全体に対して効く。
shellの$1とかのスコープ確認

シェルスクリプトに渡された引数を取るときと関数の引数を取るときどちらも「\$1」を使うので、引数のスコープがどこまでになってるかをチェック。(関数の中の$1がシェルスクリプトで渡されたものになってないかが心配だった)

結果、関数の中の$1はちゃんと関数に渡された引数でした。

```bash:hello.sh
#/bin/sh

hello() {
  echo "Hello $1"
}

NAME=$1
hello "Mr.$1"
```

```:実行結果
$ sh hello.sh kamatama41
Hello Mr.kamatama41
```
IoTとは

## 背景
* [Ruby東京プレゼンテーション2015](http://www.digitalfukuoka.jp/events/60?locale=ja) に参加した
 * 時間：　2015-01-30(金) 13:30 - 18:00
* 今回のセミナー参加したから、「IoT」という言葉は、初耳だった

## IoTとは
* 注意：　○ IoT;   × ToT (笑い)

### [Internet of Things (IoT)](http://www.sas.com/en_us/insights/big-data/internet-of-things.html)
* 物のインタネットというのは、人が仕事中とか、寝ているとか、忙しい時に、情報共有しタスクを完成できる物の集合です。
* 物のインタネットは、三つのコンポーネントがある
 * 物
 * 物と物（PC, スマホ)は、コミュニケーションできる
 * 物とデータを送受信できるシステム 

### [モノのインターネット (IoT)](http://www-01.ibm.com/software/jp/info/internet-of-things/index.html?S_PKG=-&S_TACT=C314009T&cmp=c3140&ct=c314009t&cr=google&cm=k&csr=apjp_iot-20140725&ccy=jp&ck=%E7%89%A9%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88&cs=broad&mkwid=spDdtpv98-dc_49584262739_432ko539144)
* ｢モノのインターネット｣ とは、あらゆるモノがインターネットにつながる、進化したインターネットの世界です。インターネットに接続されているデバイスからのイベントに対応して、より効率的に送受信、収集、分析、応答できるようになります。

### [モノのインターネット(Internet of Things)](http://tocos-wireless.com/jp/tech/Internet_of_Things.html)
* モノのインターネット（Internet of Things : IoT）とは従来は主にパソコンやサーバー、プリンタ等のIT関連機器が接続されていたインターネットにそれ以外の様々な"モノ"を接続する技術です。
* "モノ"をインターネットにつなぐことにより。以下を実現します。
 * 離れた場所の状態を知りたい。→離れた"モノ"の状態を知る。
 * 離れた場所の状態を変えたい。→離れた"モノ"を操作する。

## IoT vs. M2M
* M2Mとは、Machine to Machineの略称で、人を介在させないで、マシンとマシンの間にデータ情報を通信する
* IoTは、人が介在して、モノ同士がインターネット通信する全体像と考えられる

* 参照
 *  [ M2Mとは何か？IoTと何が違うのか？](http://it.impressbm.co.jp/articles/-/11087)


## いろいろなIoTケース
### 家の温度などを知って、コントロールできる
* 家に、温度、湿度、照明度、騒音など情報を取得して、インタネットを経由して、どこでも情報を知れる
* 人は、家の温度、湿度、照明度などをどこでもコントロールできる
* 帰宅の前に、自動的に部屋の温度と湿度を調整されて、ドアに入る瞬間に、照明つけるようにできる

### 自転車共有
* 自転車のロックに、小さいコンピュータをつけて、位置情報や鍵を持っている方のIDを認識できる
* 知り合いは、自転車を借りたい場合は、自分のスマホに、ロックの開ける権限を共有して、OK

## 感想
* 技術面が広い
 * Android, iOS, サーバーなどの技術が普通
 * シングルボードコンピュータに関する技術が多い
 * ソフトウェアだけじゃなくて、ハードウェアの技術も必要 
* リアルタイム性を重視 
* ビッグデータと関連
 * 世界中に、物が多いので、情報処理の技術が必要 

## 関連リンク
* http://iotlive.org/index
* http://iot.eclipse.org/
* http://www.m2mdaily.com/the-internet-of-things/
* http://www.m2mnow.biz/
* http://www.mindcommerce.com/
* http://www-01.ibm.com/software/jp/info/internet-of-things/index.html
* http://tocos-wireless.com/jp/index.html
AWS Lambda: Publish S3 event notifications で登録ができなかったときの対応

AWS lambda でS3へのデータpushをトリガーにうごくサンプルを作ったときにはまったので、かいておきます。


### エラーメッセージ
>We were unable to configure your function to the S3 bucket. This could be due to a propagation delay of your new IAM role, a misconfigured invocation role, or a mismatch between the function region and the bucket region.

### 対応方法
* バケットとlambdaの地域を同じしようねという単純なエラーではありますが。。。
* S3に送っているs3_regionを対応している国に変更
* 今使えるのは、アメリカとヨーロッパの一部のみなので、気をつける。
* 既につくられたバケットに関しては、regionを変更しても変わらないように見えるので、思い切ってbucket名をかえておいたほうがよさそう。

```bash:fluent.conf
  # s3_region ap-northeast-1
  s3_region us-east-1
```

### 関連
* [LambdaのコンソールURL](https://console.aws.amazon.com/lambda/home?region=us-east-1#/configure/)

#### 同じようなイシューをawsフォーラムでもやりとりされていた模様。
* https://forums.aws.amazon.com/thread.jspa?threadID=169868&tstart=0
试试虚拟主机的计划任务


之前发现虚拟主机有计划任务的功能,为什么不用起来呢.
比如说,我发现一个网站每天会更新一些内容, 虽然很多网站他们也会每天有邮件推送.
但是内容不可控,有很多额外的东西, 那就不是我想要的了.

所以,我有个需求就是每天去访问一个地址,然后挑出我想要的,然后发邮件给我.
以为虚拟主机你无法自由安装依赖,所以在需要的一些库的时候直接就包含在你自己的代码里就行了.
我选了2个库

1. 编辑 HTML 的: http://sourceforge.net/projects/simplehtmldom/
2. 还有就是发邮件的 PHPMailer

剩下的其实需要做的很少了,就是获取一个网页,取到你想要的内容, 然后发邮件.
比如, 我发现一个日英翻译的网站,每天会列出一些常见使用错误的英语用法, 我就截取到它,然后邮件给我

```php
// Create DOM from URL or file
$html = file_get_html('http://dictionary.goo.ne.jp/mistake_english');
$content = '';
// Find all images 
foreach($html->find('div.text_honbun_box') as $element) {
	   $content = $element->plaintext . '<br>';
}
    

$mail = new PHPMailer;
$mail->setFrom('显示用的发件人地址', '显示发件人名字');
$mail->Subject = '主题';
$mail->addAddress('收件人地址', '收件人名字');
$mail->Body    = $content;

if(!$mail->Send()) {
   echo 'Message could not be sent.';
   echo 'Mailer Error: ' . $mail->ErrorInfo;
   exit;
}

```

然后就是去虚拟主机管理面板添加计划任务了. 这个也就是 linux 系统的 `cronjob` 了.
比如我把上面的代码文件保存为` crawl.php`, 放到了我的 root 目录,就这样写它:

```
24	13	*	*	*	/usr/local/bin/php /home/你的用户名/crawl.php >/dev/null 2>&1
```

done!
コマンドラインから、ブランチで変更したすべてのファイルを一発で開く

あちこちcheck out している間に、作業していたエディタのウィンドウがぐちゃぐちゃになっている。。。
そういうことで、無理やり作ってみました。

```bash:.gitconfig
[alias]
  open = "!subl . && subl $(git diff origin/master...$(git symbolic-ref --short HEAD) --name-only)"
```

```bash
$ git open # 指定したエディタから、すべてのファイルが一気に開かれる
```
試してみてください！
Option型はgetしないほうがいい

あるインターフェイスが戻り値の型を`Option`にしているのは、`Some`と`None`どちらの場合もあり得るから。

`Option`型に対して`get`メソッドを呼ぶコードは書いてはいけない。代わりに、matcherで条件分岐するか、`getOrElse`を使う。

`get`メソッドをコーディングしてしまうと何が困るかというと、エラーをコンパイル時に発見できない点。実行してみないと、動くかどうか分からないコードになってしまう。
[PHP] Facebook, Graph APIからGETしたデータを扱うためには (Tips)

昔、3系のSDKを使っていたのですが
しばらく見ないうちに4系がでていて、あたふたしてます。


```php:https&#58;//developers.facebook.com/docs/graph-api/using-graph-api/v2.2?locale=ja_JP
/* PHP SDK v4.0.0 */
/* make the API call */
$request = new FacebookRequest(
  $session,
  'GET',
  '/me'
);
$response = $request->execute();
$graphObject = $response->getGraphObject();
/* handle the result */
```

で取得した、``$graphObject``は、``backingData:protected``と守られているので

```php:modify
$request = new FacebookRequest(
  $session,
  'GET',
  '/me'
);
$response = $request->execute();
$graphObject = $response->getGraphObject();
$data = $graphObject->asArray();
```
として、取得する必要がありました。

[asArray()](https://developers.facebook.com/docs/php/GraphObject/4.0.0?locale=ja_JP#asarray)
セキュリティグループの仕様比較（AWS/Azure）


Azure側はエンドポイントのACLでしかアクセス制御ができませんでしたが、
いよいよAzureでもセキュリティグループの考え方が登場したので、比較してみました。


#簡易比較表

|観点         | AWS     　　　　　　　   |Azure|
|:-------------------	|:--------------------------------------|:---|
|名称			| Security Groups    | Network Security Groups (NSG) |
|アタッチ対象			| インスタンスに対して適用<br>（EC2、RDSなど）    | サブネット、インスタンスに適用可能    |
|アタッチ対象への上限数	| 5個			| 1個<br>（サブネットとインスタンスに1個ずつアタッチ可能）     |
|ルール数上限/SG			| 50個			| 200個    |
|Default設定(In)		| All-deny		| VnetからはAll-allow、<br>インターネットからはAll-deny    |
|Default設定(Out)		| All-allow	|All-allow     |
|設定方法				| Management Consoleで設定可能<br>（もちろんコマンドからの可能）    |Powershellコマンドレットからのみ設定可能     |
|上限緩和  				| 可能<br>（Management Consoleから）    |可能なはず<br>（ソース見当たらず…）     |





#考察
<b>どちらのセキュリティグループもステートフル（入力が許可されれば応答は保証される）とのこと。
Azureのセキュリティグループの設定方法はAWSのNetwork-ACLっぽいので、もしかしたらスレートレスなのかも、
と思いましたが、杞憂だったようです。

<b>AWSでは、送信元や送信先にセキュリティグループのIDを指定できますが、AzureではCIDRのみ指定可能</b>です。
`AzureはVNet内通信は全許可なので、SourceIPとかdestinationIPにセキュリティグループを設定するケースがないのかな`、と想像しました。
（AWSでは、同じVPC内であっても明示的に許可しなければ通信できないので、そういった需要がでてくるのかな）


また、注意点として、Azureのセキュリティグループは、エンドポイントACLとの共存はサポート外のようです。
セキュリティグループを使う場合は、事前にエンドポイントACLは削除しておきましょう。　　	　


#まとめ

**<font color=red>AWSのセキュリティグループとNetwork-ACLがひとつにまとまっているのが、Azureのセキュリティグループ</font>**

という印象です。

明示的な許可設定が必要なのがAWS。間違っても出て行かないように、という、
**安全側に倒す設計方針は、AWSの基本理念が垣間見えます。**


<font color=red>明示的に拒否する必要があるAzureと、明示的に許可する必要があるAWS。</font>
どちらがよいかは、それぞれのシステム構成や要件によりけりかな、と思います。

これだけでAWSかAzureかと決定するようなことはないと思いますが、
移行などをする場合は、考え方の差によってセキュリティホールになる可能性があるので（特にAzure）、
認識しておいて損はないと思います。



<br><br>
＊認識誤り、追加情報あればご指摘ください！
Ruby で s が nil か String か分らぬとき s.to_s と s || '' はどっちがいい？

`s` に String か nil が入っているとき，nil を空文字列扱いにして処理したい場合があるよね。

その場合，`s.to_s` と `s || ''` とどっちがいいんだろう？というお話。

`nil.to_s` は空文字列を返すのでどっちでも同じじゃん，と思いがちだけど，微妙な違いがある。文字コードが違うのだ。

```rb
p ''.to_s.encoding #=> #<Encoding:UTF-8>
p nil.to_s.encoding #=> #<Encoding:US-ASCII>
```

たいがい，この違いは気にしなくてもいい。UTF-8 が「ASCII 互換エンコーディング」なので，US-ASCII の文字列との間で比較や結合もできるし，`index` で互いに検索したり，`split` や `scan` の引数に使っても問題ない。

ただ，もし UTF-8 でしか動かない処理に投入するのであれば，`s.to_s` は使ってはいけないことになる。

実際，そういう目に遭った。UTF-8 と CP932 の両方に対応した文字列処理メソッドで，encoding の値で場合分けしていたところ，想定外だった US-ASCII の空文字が来ちゃって死んだ。

# 2021-08-25 追記：Ruby 2.7 で nil.to_s は frozen

Ruby 2.7.0 で，`nil.to_s` にわずかな非互換性が導入された（ことを Ruby 3.0 時代になってから思い出した）。
このバージョンからは `nil.to_s` が**凍結された**空文字列を返すようになったのだ。しかも，何回実行しても**常に同じオブジェクト**が返される。

```rb
# Ruby 2.6 の場合

empty_strings = Array.new(3){ nil.to_s }

p empty_strings.first.frozen? # => false
p empty_strings.map{ |s| s.object_id }.uniq.count # => 3
```


```rb
# Ruby 2.7 以降の場合

empty_strings = Array.new(3){ nil.to_s }

p empty_strings.first.frozen? # => true
p empty_strings.map{ |s| s.object_id }.uniq.count # => 1
```

一方，文字列リテラル `""` は，マジックコメントで `frozen-string-literal` を `true` にしていない限り，凍結されていない空文字列を返す。そして評価されるたびに新たな String オブジェクトが作られる。

よって，`s.to_s` と `s || ""` のどちらがよいかは，`s` が `nil` のときに凍結された空文字列が欲しいのかどうかも検討することになる。
multiprocessで起動したプロセスもログを取得する

multiprocessを利用したconfの作成
---
[fluent-plugin-multiprocess](https://github.com/frsyuki/fluent-plugin-multiprocess)
[Multiprocess Input Plugin](http://docs.fluentd.org/ja/articles/out_forward#retrywait-retrylimit-and-maxretrywait)
上記を参考に起動ファイルを作成してみる。

```td-agent.conf
 <source>
   type multiprocess
   <process>
     cmdline -c /etc/td-agent/sub_td-agent1.conf 
     sleep_before_start 1s
     sleep_before_shutdown 5s
   </process>
   <process>
     cmdline -c /etc/td-agent/sub_td-agent2.conf 
     sleep_before_start 1s
     sleep_before_shutdown 5s
   </process>
 </source>
```

multiprocessを利用して起動
---
### 起動ログ

```
2015-02-05 14:38:57 +0900 [info]: adding source type="multiprocess"
2015-02-05 14:38:57 +0900 [info]: adding match pattern="**" type="stdout"
2015-02-05 14:38:58 +0900 [info]: launching child fluentd -c /etc/td-agent/sub_td-agent1.conf
2015-02-05 14:38:59 +0900 [info]: launching child fluentd -c /etc/td-agent/sub_td-agent2.conf
```
エラー無く起動しているようだが、
別プロセスとして起動したFluentの起動ログがでていない。
`ps`などで確認すると6つのプロセスが存在していたので起動はしているようだ。

親プロセス以外のログも取得
---
`td-agent.conf`を修正
`cmdline`にログを吐き出すオプションを付与
※td-agent2を利用しているので、ついでにv1オプションも付与

```td-agent.conf
 <source>
   type multiprocess
   <process>
     cmdline -c /etc/td-agent/sub_td-agent1.conf  --log /var/log/td-agent/sub_td-agent1.log --use-v1-config
     sleep_before_start 1s
     sleep_before_shutdown 5s
   </process>
   <process>
     cmdline -c /etc/td-agent/sub_td-agent2.conf --log /var/log/td-agent/sub_td-agent2.log --use-v1-config
     sleep_before_start 1s
     sleep_before_shutdown 5s
   </process>
 </source>
```

これで起動してやると各プロセスのログが吐出されます。

ログファイルがわかれるのが嫌
---
ログオプションを付与する方法だとログファイルがわかれてしまうので嫌とかある場合は親プロセスと子プロセスに以下の設定を追加

親プロセス

```
<source>
  type forward
  port 24230   # 他のプロセスが使ってないポートならなんでも
</source>

<match fluent.**>
  type stdout
</match>
```

子プロセス

```
<match fluent.**>
  type forward
  <server>
    host localhost
    port 24230   # 親プロセスで追加したポート
  </server>
</match>
```

このような設定入れとけば子プロセスで何かあっても親プロセスのログに出力されるはず。
※動作確認してないけどきっとこんなかんじ…
ただ、初回起動時の設定読み込みとかは見れないので、見たい場合は別出ししとくしかないのかなと思います。

他に良い方法あれば教えて下さい。
JavaエンジニアがUbuntuで設定すべきプロキシ設定まとめ

# 環境変数+Gradle
* [EnvironmentVariables](https://help.ubuntu.com/community/EnvironmentVariables)

`/etc/environment` を以下のように編集する。
各ユーザ毎に正しい場所に設定したいのであれば、最初に提示したマニュアルを参照のこと。
```
http_proxy=http://example.jp:8080
https_proxy=http://example.jp:8080
GRADLE_OPTS=" -Dhttp.proxyHost=example.jp -Dhttp.proxyPort=8080 -Dhttps.proxyHost=example.jp -Dhttps.proxyPort=8080"
```

`sodo`コマンド経由で何かを実行している時にプロキシの設定がきいてない場合には、
`sudo -E`すると環境変数が引き継がれるのでうまく動くかもしれない。

* [Sudo Manual](http://www.sudo.ws/sudo.man.html)

# APT
* [apt.conf - Configuration file for APT](http://manpages.ubuntu.com/manpages/trusty/en/man5/apt.conf.5.html)

`/etc/apt/apt.conf`を以下のように編集する。
```
Acquire::http::proxy "http://example.jp:8080";
Acquire::https::proxy "http://example.jp:8080";
```

# git
* [git-config(1) Manual Page](https://www.kernel.org/pub/software/scm/git/docs/git-config.html)

以下のコマンドを実行する。
```
git config --global http.proxy http://example.jp:8080
git config --global https.proxy http://example.jp:8080
```

`~/.gitconfig`を以下のように編集してもよい。

```ini
[http]
        proxy = http://example.jp:8080
[https]
        proxy = http://example.jp:8080
```

# Maven
* [Configuring a proxy](http://maven.apache.org/guides/mini/guide-proxies.html)

`~/.m2/settings.xml`を以下のように編集する。ファイルが当該個所に無ければ作る。

```xml
<settings>
 <proxies>
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>example.jp</host>
      <port>8080</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    <proxy>
      <id>optional2</id>
      <active>true</active>
      <protocol>https</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>example.jp</host>
      <port>8080</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
  </proxies>
</settings>
```
pecoでgitのコミットハッシュを2つ選択してdiffを確認する

`.bashrc`なり`.zshrc`なりに下記の関数を用意する
※`setopt ksharrays`はzshの場合のみ記述する（zshの配列インデックスはデフォルトだと1ベースなので0ベースに変更する為のオプションが`ksharrays`）

```shell-session
function git-pdi() {
  setopt ksharrays  # 0 base array index for zsh
  HASHES=($(git log --pretty="format:%ad %h (%an): %s" --date=iso | peco | awk '{print $4}'))
  if [ ${#HASHES[@]} -eq 2 ]
  then
    git diff ${HASHES[1]}..${HASHES[0]}
  else
    echo "selected commit count must be 2, but ${#HASHES[@]}"
  fi
}
```

`git-pdi`を実行すると、pecoを起動し行単位でコミットの概要が表示されるので、`Ctrl+Space`で対象コミットを2つ選択して`Enter`
2つ目に選択したコミット → 1つ目に選択したコミット、という比較結果が表示される

![git-pdi.gif](https://qiita-image-store.s3.amazonaws.com/0/4516/19cb9df7-a4b0-bebe-5aba-52075eb75985.gif)
集合、要素、写像、単射、全射

_GitHubに移行します_

## はじめに

この記事では代数学の単射と全射を紹介します。集合、要素、写像という言葉を紹介したあと、単射と全射を紹介します。

## 準備

集合と要素という言葉から始めます。

集合とは、モノの集まりです。

要素とは、その集まりを構成するモノです。

まず、この集合と要素に慣れることが大切ですが、あまり難しく考えないことも大切です。

例えば、自然数だと、自然数全体のことを集合といい、１とか２とか３のことを要素といいます。

次に、写像です。

写像とは、ある集合の要素を別の集合の要素に変えるモノです。ただし、変わるときに複数の要素になることは許されません。

写像ではどういうことが許されないか見てみましょう。

例えば、集合Aを考えてみます。この集合Aには要素が三つあり、その要素をa, b, cとします。写像を考えるためにはもう一つ集合が必要ですので、もう一つの集合を自然数とします。

まずは写像とは言えない変なモノを見てみましょう。

どのようなモノかというと、aを受け取って１を返し、bを受け取って２を返し、cを受け取って１と２以外の自然数すべてを返すモノです。

確かに変なモノです。特に、cを変換したときが変です。

なぜこのような変換が写像ではないのか？それはcが複数の要素になるからです。これは写像ではありません。

## 単射

準備は整いました。前出の変わりモノを再利用したいと思います。

前出の変わりモノは、aを受け取って１を返し、bを受け取って２を返し、cを受け取って１と２以外の自然数すべてを返すモノでした。

ここではcを受け取って３を返すモノとします。つまり、aを受け取って１を返し、bを受け取って２を返し、cを受け取って３を返すモノです。こういうモノを単射と言います。

もし、cを受け取って２を返すモノであれば、（写像ではありますが）、それを単射とは言いません。

大ざっぱな言い方をすると、一意性を保つような変換が単射です。

## 全射

全射とは、すべての変換後の要素に変換前の要素が存在する変換です。これは理解が難しいと思います。

ここでも前出の変わりモノを再利用したと思います。ただし、変わりモノの逆変換を利用します。変わりモノの逆変換とは、自然数の要素を集合Aの要素に変換するモノです。

例えば、１を受け取ってaを返し、２を受け取ってbを返し、１と２以外の自然数を受け取ってcを返すモノです。このようなモノを全射と言います。

もし、集合A {a, b, c} の代わりに集合Aに要素dを追加した集合B {a, b, c, d} があり、この変わりモノの逆変換が自然数の要素を集合Bの要素に変換するモノだったとすると、（写像ではありますが）、それを全射とは言いません。これは変換後の要素dに変わる要素（変換前の要素）が自然数に存在しないからです。

## あとがき

集合、要素、写像、単射、全射という言葉を紹介しました。どこまで書けるか分かりませんが、数学の記事を少し書いてみようと予定しています。

間違いに気付きましたらコメントなどで教えていただければ幸いです。

## 参考書

- [群・環・体入門](http://www.amazon.co.jp/%E7%BE%A4%E3%83%BB%E7%92%B0%E3%83%BB%E4%BD%93%E5%85%A5%E9%96%80-%E6%96%B0%E5%A6%BB-%E5%BC%98/dp/4320015959)
phpbrewからダウンロード失敗したので自分で落として入れるやーつ


phpbrewからちょっと古めのphpを入れようとしたら404エラーで落せなかった。
公式のCookbookには[ミラー指定してやってみそ](https://github.com/phpbrew/phpbrew/wiki/Cookbook#specifying-mirror-site)とかあるんだけど、それでもだめだった。  

普通にPHP公式いけばtarballは落とせたので、そこから入れる方法をとった。


```
===> phpbrew will now build 5.4.14
===> Loading and resolving variants...
===> Downloading from http://www.php.net/get/php-5.4.14.tar.bz2/from/this/mirror
[==================================================================] 184.00/184.00B 100%
Redirecting to http://php.net/get/php-5.4.14.tar.bz2/from/this/mirror
```

1. [ここか](http://php.net/releases/)ら tarballを落としてくる
2. ~/.phpberw/distfiles/ に保存する

あとは普通にphpbew install

なんか[plenvでも同じようなことした](http://qiita.com/trapple/items/f52ef2bc49ee5ac34cc7)気がします。
webで頑張っている元教え子ちゃんにおくるまとめ＃7 無料サンプルコード


#記述の動機
専門学校でPG、Webを教え始めてもう８年。
マイナススタートの２年はあまりに短い。教えきれなかったことが多い。
頑張ってる元教え子ちゃんにむけてまとめているのですが
ついでに、公開しておきます。

#注意事項
あくまで購入が前提です。サンプルコードを見て、和書でも、洋書でも購入。

#PHPのサンプルコード
http://shop.oreilly.com/product/0636920029335.do

![スクリーンショット 2015-02-05 9.42.45.png](https://qiita-image-store.s3.amazonaws.com/0/33317/7970afc6-a1d6-9d1e-c236-3d2e9ed6e5fe.png "スクリーンショット 2015-02-05 9.42.45.png")

サンプルをダウンロード
code-3ed-master.zipでした。

#README.MD
code-3ed
========

Code and Examples from PHP Cookbook 3rd Edition

Each directory contains the code examples from a chapter of the book.

Each code example is generally in a *.php file. For a given example, there may be some other files with the same basename but different extensions that indicate certain things about the code example -- expected output, special INI settings required, etc.

| Extension | Meaning |
|------|------|
| `php` | The code itself |
| `prepend` | The code expects this file to be the `auto_prepend_file` |
| `append` | The code expects this file to be the `auto_append_file` |
| `min-version` | The code works with this PHP version at minimum |
| `ini` | The code needs these INI settings |
| `skip` | The code is not a self-contained runnable example but its syntax should be correct |
| `out` | Expected output of the code |
| `out.strip` | The expected output in the `.out` file should have newlines removed to match the actual expected output |
| `out.regex` | The output is expected to match the pattern in this file |
| `err.regex` | The error output is expected to match the pattern in this file |
| `stdin` | The contents of this file should be fed to the code on standard input |
| `args` | The code needs these PHP command line args |
| `server` | The code expects to talk to a server running the PHP code in this file on port 9876 (with `php -S localhost:9876 whatever.server` ) |
| `server.ini` | The server code expects these INI settings (e.g.`php -S whatever.server.ini -S localhost:9876 whatever.server`) |
Premium Storageを試してみる

プレビュー登録から1ヶ月超、やっとPremium Storageがアクティブになったので、
ディスク性能を計測してみようと思います。
![pic1.png](https://qiita-image-store.s3.amazonaws.com/0/41379/18e65cac-e898-23a5-6100-c5380476257d.png)

# 仮想マシン作成
プレビューポータルから仮想マシンを作成します。
Premium StorageをアタッチするにはDSシリーズの仮想マシンが必要です。
![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/41379/8e9b6173-c1f2-d157-27dd-1e5b0c695a9e.png)

DSシリーズの価格は公式ページには載ってませんが、Dシリーズと同じっぽいです。
また、現在はプレビュー機能なので、以下のリージョンでしか作れません。
　* 西ヨーロッパ
　* 米国東部2
　* 米国西部

仮想マシンが出来たら、新規ディスクのアタッチを行います。
プレビューポータルからお好みのサイズ(プラン)を選択し、あとはいつも通りボリュームの作成まで行います。
![img4.png](https://qiita-image-store.s3.amazonaws.com/0/41379/c36f433e-a96d-72e7-80e1-478a88fddf5d.png)

# ディスクベンチマーク
とりあえず、ClystalDiskMarkでベンチマークを取ってみました。
マシンサイズはDS2(2コア、7GBメモリ)となります。

1. P10(127GB) * 1
![img6.png](https://qiita-image-store.s3.amazonaws.com/0/41379/71364d99-8d5d-6324-559a-3c5bd9052749.png)
2. P20(512GB) * 1
![img7.png](https://qiita-image-store.s3.amazonaws.com/0/41379/44adf7fa-3ea3-84e6-51d0-1889ed079c02.png)
3. P30(1024GB) * 1
![img5.png](https://qiita-image-store.s3.amazonaws.com/0/41379/b6d7b704-2154-9718-d457-d2256635704e.png)
4. P30(1024GB) * 4
![img8.png](https://qiita-image-store.s3.amazonaws.com/0/41379/90b8e18d-991c-1640-9540-5c922c47e106.png)
Genymotionが動かない時の対応


# Unable to create virtual device. Failed to import ova file. と表示されるとき

Settings > Misc タブ から "Clear cache" ボタンを押してキャッシュを消す。

それでも動かない時は、再度キャッシュを消して、さらに以下のファイルを削除してからGenymotionを再起動する

```
~/.Genymobile/Genymotion/ova/*
~/.Genymobile/Genymotion/deployed/*
~/.Genymobile/Genymotion/templates/*
```

# file is corrupted と表示されるとき

たとえば以下のように sudo で実行する。

```
$ sudo /usr/local/genymotion/genymotion
```
指定した全ての要素をhas_many関連先に持つ条件の書き方

商品Aと商品Bの両方を注文した顧客の一覧を取得したい。顧客には複数の注文が紐付いていて、注文はひとつの商品を持つ。

上のような場合のSQLとArelの書き方を試行錯誤していて、なんとかできたのでメモしておきます。

## SQL


```sql
select *
from customers
where id in (
  select customer_id
  from orders
  where item_id in (1,2) /* 指定する商品ID */
  group by customer_id
  having count(distinct item_id) = 2 /* 指定する商品IDの数 */
)
```

複数の商品ID(1,2)で注文テーブルを絞り込んで、指定した商品だけの注文にします。
と同時に顧客IDで集計して、商品IDが指定された数だけあるものを抽出しています。

## Arel

```rb:app/models/Customer.rb
# 引数の商品全てを注文したことがある
  scope :has_item_id_all, -> item_ids {
    customer = arel_table
    order = Order.arel_table
    subquery = order.project(order[:customer_id])
      .where(order[:item_id].in(item_ids))
      .group(order[:customer_id])
      .having(order[:item_id].count('distinct').eq(item_ids.size))
    where(customer[:id].in(subquery))
  }
```

SQL文ををArelの文法に変えただけですが、サブクエリの書き方がわからずにひどく苦労しました。
Arelを使ったことで他スコープとのマージもできるようになりました。
Swiftのnil判定

##nilとOptional
SwiftにはOptionalという概念が存在し、変数がnilを許容出来るかどうかを設定することができる。

```swift
var hoge:String? = nil   //OK
var hoge = nil           //error
var hoge:String = nil   // error
```
具体的な設定方法としては変数の型に```?```を付けるか、```as? String```の様にキャスト時に設定することが出来ます。

なのでOptionalとして宣言した変数に関してはnilになる可能性があるため、引数がOptionalを許容しない場合(引数にhogeを利用したい場合など)はnilの判定が必要になります。

## nil判定に関して

###Optionalでnil判定が必要な場合とそうでない場合
呼び出し元のオブジェクトがOptional型の場合わざわざnil判定を行う必要はありません。以下の場合など。

```
hoge?.action()
```

この場合hogeがnilだった場合はaction()は実行されず、この行は無視されます。
また、返り値が存在するメソッドの場合は、nilが返り値と鳴ります。


一方で、Optionalが許容されない場合はnil判定を行う必要があるため、以下の手法でhogeがnilかどうかを判定します。

###ObjCでのnil判定

ObjCのnil判定は非常にシンプルです

```objc
UIView* hoge = [UIView alloc]init];
if (hoge) {
  [self addSubView:hoge];
}

if (hoge != nil) {
	[self addSubView:hoge];
}
```

###Swiftでのnil判定

一方でSwiftではif let構文を利用し、hogeがhogehogeに代入出来た場合のみifスコープに突入します。

```swift
let hoge = UIView()

if let hogehoge = hoge { // if let hoge = hogeでも可
  self.addSubView(hogehoge) //OK
}

if hoge != nil {
	self.addSubView(hoge!) //OK
}

//この書き方はswiftでは出来ない
if hoge { 
	self.addSubView(hoge!) 
}
```

間違ってたらご指摘お願いします。
バグ票を書こう

ここでいうバグ票とは、ユーザーやテスターから、メーカーないし、プログラマーに宛てて書く文章です。最近のITSだとチケットと呼ぶかもしれないモノです。

自分がいた会社では別の名前で呼ばれていたので正式な名称はとりあえず不明ですが、世間ではどうも良くこの名前を聞くので、仮に「バグ票」とします。


ここではこのバグ票において最低限書いておいた方が良いものを列挙します。テスターからプログラマー宛てにバグ票を書くとき、ユーザーから開発者にフィードバックするときなどにお使いください。

ただし自分も実戦から退いて長いので忘れてるところもあるかもしれないです。何かあればコメントください。

# 問題事象の概要
問題を一言で表す文章。チケットなら表題に相当。
たとえば「○○のアプリを起動中、フリックするとアプリが応答無しとなる」など。なるべく短く、かつ問題事象が大まかにわかる程度の内容が良い。

なお、基本的に「修正が盛り込まれない可能性があるもの」以外は「○○となる」「○○する」などの言い切り系で終わらせること。「○○について」などと曖昧な表現はしない。

# 条件
問題が発生する前提条件。たとえば「○○がインストールされていること」「○○が△△の状態であること」など、問題に関連しうる設定は全て列挙。
なお、なるべく箇条書き。

「なし」は最後の手段なのでなるべく書かない。

# 問題発生機種
パソコンならOSバージョン、搭載メモリ、CPU(ハードウェアに密接に関わりうる問題であれば加えてグラボ等のスペックも併記)、Webアプリなら使用しているブラウザ、スマートフォンなら機種など、問題が発生した機種、問題事象を確認した機種を列挙。

# 手順
問題発生に至る手順を、できるだけ入り口から書く。たとえば「アプリを起動してからの操作」だったり、「パソコンを起動してからの操作」だったり。この辺は問題事象の原因に推測がついてきたら大体分かると思います(パソコンの起動時間に関する問題なら、パソコン起動から書く等)。
なるべく箇条書き。問題事象で言及するため、番号付きで書いておいた方がいい。

条件とおなじく「なし」は最後の手段（とはいえ偶発的事象などはなしとかかざるをえない？）。

# 問題事象
手順〇にて△△が発生するなどといった具体的な問題事象。なるべく簡潔に、起こった事象のみを書く。
また、パソコンやアプリの再起動など、復帰操作があるのであればそれについても一緒に書く。
写真を添付できるなら、事象発生時のスクリーンショットなど掲載しておくと良い

同様の事象が何度もあった場合など、再発防止策を問う文言があっても良いけどそれはツラいしお互いの関係を悪くしかねないのでそこそこに。

# 事象発生後の動作
事象発生後、復帰操作(あれば)をするまでの間どのようになるのか、そしてそれによりユーザーが得るデメリットがあるかどうかについて、文章で書く。

# 問題と判断した根拠
この問題が「修正が必要な問題である」と判断した根拠。たとえばAndroidアプリなら、Androidアプリケーション開発デザインガイドライン( http://developer.android.com/design/index.html ) とか、RFCのドキュメント( http://www.ietf.org/rfc.html )とか、アプリの設計仕様書とか。
できるならその仕様書のどこ(章番号で指定)に違反するかなどを、引用を添えて書いておくといいかも。
また、違反しているだけだとちょっと弱い。もし可能なら「ユーザービリティを損なう恐れがある」とか「データの損失に繋がる可能性がある」など、想定しうるリスクについても言及しておくとよい

最悪「自分が仕様だ」でも良いけどあまりやると嫌われるぞ。

# 期待する正常動作
自分が期待する正常動作として、明確なものがあればなるべく書きましょう。もし書かないと最悪修正されないことがあります。
たとえば「○○が起きないこと」「ハングアップしないこと」「○○と表示されること」など。

# 問題事象の推定
もしこちらに推定が可能であった場合。
たぶんこのへんがおかしいのではないかと推定して書いてあげると開発者に喜ばれそうです。
たとえばログを見て「○○の設定値が間違っていると思われます」や「△△の動作について処理が漏れていると思われます」など、気付いた点があれば全部書いておく。

ただ、ユーザー→開発者ではそこまでやると疲れてしまうので、そこそこに。

# 再現性
再現可能な問題であれば再現性について書く

# 全体的に
とりあえず個人的には、この手のバグ票を送ってもし質問が来たりしたら、基本的にはこちらの落ち度だと思っています。
なのでこれだけにとらわれず、実際に運用してみて質問が来たらそれによってルールを補強する くらいが良いと思います。

また、気をつけておかないといけないのは、「自分の場で起きたことは、相手には全くわかってない」ということです。書いた後で第三者のつもりになって(あるいは第三者に直接)読んでみて、疑問点がないかどうか確認しておきましょう。


# チェックリスト
なにかのチェックリストにコピペして使う用リスト。

* 問題事象の概要は書いたか
* 条件の記載は的確か
* 問題発生機種の記載は的確か
* 手順の記載は的確か
* 問題事象の記載は的確か
* 事象発生後の動作は記載したか
* 問題と判断した根拠は明確か
* 期待する正常動作は書いたか
* 問題事象の推定は書いたか
* 再現性は記載したか
* 第三者による(第三者がいない場合、第三者になったつもりで)チェックは済んだか
オンラインゲームの基礎用語


#はじめに
どうも！とある会社に新卒で入って間もない、未熟な者です。
私自身、プログラムしかやった事がなかったので、こういった基礎用語をほとんど知りませんでした。
(初めての会議では何言ってるかわからなかった・・・。)
もしかしたら、私と同じく知らない人がいると思ったので今回、書く事にします。
早速本題へ。

#基礎用語

##日次アクティブユーザー数 [Daily Active User]
####省略名：DAU
・<b>その日にゲームにログインしたユーザーの数</b>

ユニークユーザーの数を指しています。
<b>`Unique User`</b>は<b>`UU`</b>と省略をするので、会社によっては<b>`デイリーUU`</b>と言うみたいです。

[*]ユニークユーザーとはウェブサイト(アプリ)に訪問(ログイン)した人の数。

##月次アクティブユーザー数 [Monthly Active User]
####省略名：MAU
・<b>その月にゲームにログインした人の数</b>

<b>`マンスリーUU`</b>とも言われているみたいです。
##課金者数 [Paying User]
####省略名：PU
・<b>課金した人の数</b>

主にデイリーとマンスリーで集計するようです。
課金していないユーザーと課金しているユーザーを区別する時に
「今日はDAUが1万人だったけどPUは100人だったね」の様な言い方。
これだと課金率は1％になります。

##全ユーザー平均課金額 [Average Revenue Per User]
####省略名：ARPU
・<b>その日の過金額を全ユーザーで割った値</b>

DAUが1万人で日商100万だったら、その日のARPUは100円となるみたいです。
「1人当たり100円儲けてましたね」というようになります。

##課金ユーザー平均額 [Average Revenuer Per Paying User]
####省略名：ARPPU
・<b>その日の日商をお金を払った人だけで割った値</b>

お金を払った人が平均でいくら使ったのか？という指標になります。
「DAUが1万人で、売り上げが100万円でした。課金者は100人いました。」という場合、
100人で100万円を割ると1人1万円なので、ARPPUは1万円という事になります。

##課金率
・<b>全ユーザーの中で、課金してくれた人の割合</b>

主にデイリーとマンスリーで集計するみたいです。

#終わりに
会社の会議ではこういった言葉が出てくるので、同じ新卒の方々は一緒に覚えましょう！
知らなかった人への手助けになれれば、と思います。

参考にさせて頂いたサイト
http://gigazine.net/news/20110920_dropwave_game_planner_cedec2011/
DataTables のソートアイコンを Font Awesome に置き換える

## <i class="fa fa-heart fa-fw"></i>概要

[DataTables](https://datatables.net/) のソートアイコンはデフォルトでは画像なので、色や大きさなどの調整が困難です。
そのため [Font Awesome](http://fortawesome.github.io/Font-Awesome/) のアイコンで置き換えたいと思います。
最初は色々と試行錯誤していましたが、ちゃんと [公式の GitHub](https://github.com/DataTables/DataTables) の issues を漁ったら参考記事にたどり着きました。

## <i class="fa fa-star fa-fw"></i>方法

``` scss:datatables_overrides.css.scss
table.dataTable thead th {
  // ソートの矢印の画像を FontAwesome のアイコンに置き換える。
  position: relative;
  background-image: none !important;
  
  &.sorting:after,
  &.sorting_asc:after,
  &.sorting_desc:after {
    position: absolute;
    top: 12px;
    right: 8px;
    display: block;
    font-family: FontAwesome;
  }

  &.sorting:after {
    content: '\f0dc'; // fa-sort
    font-size: 0.8em;
    padding-top: 0.12em;
  }
  &.sorting_asc:after {
    content: '\f0de'; // fa-sort-asc
  }
  &.sorting_desc:after {
    content: '\f0dd'; // fa-sort-desc
  }
}
```

## <i class="fa fa-search fa-fw"></i>参考

* [Provide Font Awesome integration option #165](https://github.com/DataTables/DataTables/issues/165)
* [Font Awesome integration](http://datatables.net/blog/2014-06-06)
FacebookAPIの /me/friends で友だち一覧が空になる原因

access_tokenは合っててエラーは起きないのになぜか空になる時の原因です。ちょっとハマったのでメモしておきます。（コードの例はruby & koala）

```ruby
[1] pry(main)> @graph = Koala::Facebook::API.new(access_token)
=> #<Koala::Facebook::API:0x007f8aecd9e670
[2] pry(main)> @graph.get_connections("me", "friends")
=> [] # こうなるケース。
```

ちなみに、`access_token`がおかしい場合はエラーが返るので別の問題です。

```ruby
[6] pry(main)> @graph.get_connections("me", "friends")
Koala::Facebook::AuthenticationError: type: OAuthException, code: 190, message: The access token could not be decrypted [HTTP 400]
```

#1. 同じアプリを使っている友だちがいない
実は`/me/friends`は全ての友だちを取ってくることはできません。v2.0でそういう仕様になりました。なので、実は結果が空なのは正しいのかもしれません。

詳しくは[Facebookプラットフォームアップグレードガイド](https://developers.facebook.com/docs/apps/upgrading?locale=ja_JP#upgrading_v2_0_user_ids)を参照してください。

> /me/friendsは同じアプリを使用している利用者の友達を返す
v2.0では、友達APIエンドポイントは、利用者の友達のうち、同じアプリを使用している友達のリストを返します。 v1.0では、応答には、利用者の友達がすべて含まれていました。
アプリから、アプリを利用していない友達にアクセスする必要がある重要な2つのユースケースは、タグ付けと招待です。 v2.0では、これらのケースをサポートするために、タグ付け可能な友達APIと招待可能な友達APIを追加しました。

#2. `user_friends`permissionを要求していない
アクセス権限`user_friends`をユーザーに要求していない場合、結果が空になります。これもv2.0からの仕様変更で、明示的に権限を求めないといけないことになりました。

こちらも、[Facebookプラットフォームアップグレードガイド](https://developers.facebook.com/docs/apps/upgrading?locale=ja_JP#upgrading_v2_0_user_ids)を参照。

> アクセス権限の変更点
> v2.0のFacebookログインでは、開発者が自分のアプリを監査する必要がある権限に変更を加えました。以下に例を挙げます。
> v2.0では、/me/friendsへのアクセスがデフォルトのアクセス権限に含まれなくなります。 今後は、新しいアクセス権限である「user_friends」を利用者に明示的に要求する必要があります。

----
以上！他に原因を知っている方がいれば補足お願いします。
Facebookの仕様変更にはいつも注意が必要です。
uGUIのButtonでの色とかのメモ


## 環境
- Unity 4.6.1(無料版)

![Screen Shot 2015-02-05 at 12.58.00 PM.png](https://qiita-image-store.s3.amazonaws.com/0/10722/bb7d2c1c-a223-06c5-690c-43eba93848fc.png "Screen Shot 2015-02-05 at 12.58.00 PM.png")

- Transitionで`Color Tint`を選択

|名前|メモ|
|:---|:---|
|Normal Color|普段の色|
|Highlighted Color|Hover時の色(※)|
|Pressed Color|Click Down時の色|
|Disabled Color|ButtonがDisabled時の色|


#### ※ Highlighted Colorの注意点
- 1度クリックすると、Highlighted状態になる
- 他のところをクリックするとNormalに戻る

#### Disabled状態にする方法

~~~
button.interactable = false;
~~~
タスクランナー使わない時のローカルサーバー走らせるシェルスクリプトのメモ


__(追記) 記事にすると色々集約したくなる。もうちょっと整理した。__

こんな感じにしてる:

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

CWD=$(pwd)

function ctrl_c () {
    #pgrep -f mongod && pkill mongod  # MongoDB の場合
    pgrep -f mysql && mysql.server stop  # MySQL の場合
    
    cd ${CWD}                                                                  
    unset CWD
    unset -f ctrl_c
}

trap ctrl_c SIGINT

#mongod --config $(brew --prefix)/etc/mongod.conf &  # MongoDB の場合
mysql.server start  # MySQL の場合

# スクリプトの第 1 引数に HTTP サーバーのルートパスをオプションで指定可能にする
[[ ! -z "${1}" && -d ${1} ]] && cd ${1}

#python -m SimpleHTTPServer 8080  # Python の場合
#ruby -run -e httpd . -p 8080  # Ruby の場合
php -S 0.0.0.0:8080  # PHP の場合
```

これに実行権限付ける:

```
chmod +x ./run.sh
```

そんでローカルサーバー走らせるディレクトリに置いてバックグラウンド実行:

```
./run.sh &
```

終了する時はフォアグラウンド化して `<C-c>` で終了:

```
Mac:htdocs Genius $ jobs
[1]+  Running                 ./run.sh &
Mac:htdocs Genius $ fg %1
^C
Shutting down MySQL
.. SUCCESS!
```

HTTP サーバーは適時、必要な環境に置き換えると良いかも:

```
python -m SimpleHTTPServer 8080
ruby -run -e httpd . -p 8080
php -S 0.0.0.0:8080
```

* [開発用ローカルサーバを立ち上げる方法 - Qiita](http://qiita.com/higuma/items/b23ca9d96dac49999ab9)
Pythonでデスクトップのパスを取得する

意外とハマったのでメモ。

デスクトップのパスはＰＣやユーザーによってまちまちなので汎用的に取得する方法を記述します。


##環境
Python 2.7
Windows 7/8

##スクリプト
```py
#coding:cp932

import os

desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop"

print desktop_path
```

実行結果：

```shell-session:
C:\Users\foo\Desktop
```


##説明
os.getenv("???") で環境変数を取得できます。

[主な環境変数（外部リンク）](http://win.just4fun.biz/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/Windows%E3%81%AE%E4%B8%BB%E8%A6%81%E3%81%AA%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E4%B8%80%E8%A6%A7%E3%81%A8%E6%84%8F%E5%91%B3.html)

デスクトップのパスそのものを格納した環境変数がないため、上のスクリプトでは環境変数の組み合わせでデスクトップのパスを作成しています。


##おまけ
マイドキュメントやピクチャ・・・等々も取得してみます

```py
#coding:cp932

import os

desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop"
mydocument_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Documents"
mypicrure_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Pictures"
myvideo_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Videos"
mymusic_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Music"

if os.path.exists(desktop_path):
    print "デスクトップ：" + desktop_path
if os.path.exists(mydocument_path):
    print "ドキュメント：" + mydocument_path
if os.path.exists(mypicrure_path):
    print "ピクチャ：" + mypicrure_path
if os.path.exists(myvideo_path):
    print "ビデオ：" + myvideo_path
if os.path.exists(mymusic_path):
    print "ミュージック：" + mymusic_path

```

実行結果：

```shell-session:
デスクトップ：C:\Users\foo\Desktop
ドキュメント：C:\Users\foo\Documents
ピクチャ：C:\Users\foo\Pictures
ビデオ：C:\Users\foo\Videos
ミュージック：C:\Users\foo\Music
```
yumで旧バージョンも含めて、パッケージを一覧表示する。


```console:
# yum --showduplicates list | grep mysql-community-server
mysql-community-server.x86_64             5.6.15-1.el6                   mysql56-community
mysql-community-server.x86_64             5.6.16-1.el6                   mysql56-community
mysql-community-server.x86_64             5.6.17-4.el6                   mysql56-community
mysql-community-server.x86_64             5.6.19-2.el6                   mysql56-community
mysql-community-server.x86_64             5.6.20-4.el6                   mysql56-community
mysql-community-server.x86_64             5.6.21-2.el6                   mysql56-community
mysql-community-server.x86_64             5.6.22-2.el6                   mysql56-community
mysql-community-server.x86_64             5.6.23-2.el6                   mysql56-community
```
AWS SNSからの通知がAWSからのものであることを確認する


AWS SNSからHTTP/HTTPSで通知を受けた場合、それが本当にAWSからのものであるか確認する必要がある。
http://docs.aws.amazon.com/ja_jp/sns/latest/dg/SendMessageToHttp.verify.signature.html

手順やサンプルコードを見ると異常にだるい。。
http://docs.aws.amazon.com/ja_jp/sns/latest/dg/SendMessageToHttp.example.java.html

なんか楽に出来ないものかとaws-sdk-javaを眺めていたら`com.amazonaws.services.sns.util.SignatureChecker.SignatureChecker()`というのを発見し、それでいけそうだったので試してみた。
プロキシ対応。

依存性管理まで1ファイルで出来るのでGroovy Scriptで書いているが、構文はJavaにしてあるのでJavaでそのまま使えると思う。

```java
// Groovy Version: 2.3.8 JVM: 1.8.0_25 Vendor: Oracle Corporation OS: Mac OS X
@Grab('com.amazonaws:aws-java-sdk:1.9.17')
import com.amazonaws.services.sns.util.SignatureChecker;

import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

String json = "SNSから送られてきたJSON";
// 上記JSONから取り出したsigningCertUrl
String signingCertUrl = "https://xxxx.amazonaws.com/SimpleNotificationService-xxxxx.pem";

// プロキシありかどうか
boolean proxyExists = true;

URL url = new URL(signingCertUrl);
InputStream is;
if (proxyExists) {
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxyHostName", 80));
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
    is = conn.getInputStream();
} else {
    is = url.openStream();
}
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
is.close();

SignatureChecker checker = new SignatureChecker();
boolean result = checker.verifyMessageSignature(json, cert.getPublicKey());

assert result
```
クラス内から関数ポインタ渡し

```lang:Serial.h
void attach (void(*fptr)(void), IrqType type=RxIrq);

template<typename T>
void attach (T *tptr, void(T::*mptr)(void), IrqType type=RxIrq); 
```

```lang:controler.h
class Controler {
public:
    Controler(PinName pinTx, PinName pinRx);
   
private:    
    Serial _device;
};
```

```lang:controler.cpp

void Controler::attachRx()
{
    rxBuffer[rxVolume++] = _device.getc();
}

Controler::Controler(PinName pinTx, PinName pinRx) : _device(pinTx, pinRx) {
    Serial *p;
    p = &(_device);
    p->attach(this, &Controler::attachRx, Serial::RxIrq);
}
```
Controlerクラス内のvoid Controler::attachRx()を関数ポインタ渡しするため、
_device.attach(&attachRx, Serial::RxIrq);
と宣言しても通らなかったため、回避方法として。。。
WebSocket を使うのに便利な Framework/Library まとめ(2015年2月調べ)


リアルタイム通信で思い浮かぶのは WebSocket ですが簡単には使うには何を使えばいいか分からなかったので言語別にまとめました。

# Server side

## JavaScript

- Node.js(io.js)
 - [Socket.IO](http://socket.io/) 

## Ruby
- Ruby on Rails
 - [websocket-rails](https://github.com/websocket-rails/websocket-rails)
 - [EM-WebSocket](https://github.com/igrigorik/em-websocket)

## Java
- [Play Framework](https://www.playframework.com/)
- [Jetty](http://eclipse.org/jetty/)

## Scala
- [Play Framework](https://www.playframework.com/)

## Go
- [golang.org/x/net/websocket](https://godoc.org/golang.org/x/net/websocket)

# Client side

## Objective-c
- [SocketRocket](https://github.com/square/SocketRocket)

## Java
- [Java WebSockets](https://github.com/TooTallNate/Java-WebSocket)
リレーショナルデーターベース


参考: http://codezine.jp/article/detail/3261

データベース
「複数の人が共有利用するデータを貯めてある入れ物」

DBMS(データベース管理システム)


代表的なデータベースの種類
階層型、ネットワーク型、リレーショナル型

階層型、ネットワーク型は最近ではあまり見られなくなった
現在代表的なのは『リレーショナル型データベース』

##リレーショナルデータベース
リレーショナル型データベースはデータの集まりを行と列からなる数学の集合論に基づく表形式で表現するデータベースです。
このDBMSをRDBMS(リレーショナルデータベース管理システム)とよぶ。

[特徴]
表形式のデータベースであるデータ同士の関係を定義せず、柔軟に経路を設定できるというところ。また、すべての処理に対して平均的な処理速度を提供してくれる。
(*逆に言うと、処理速度を向上させる工夫をしなければならない)


##データと情報
データベースに格納されている客観的な値を「データ」という。また、そのデータに意味付けされたものが「情報」とよぶ。つまり[情報 = データ + 意味]となる。(データと情報を混合させないこと)

RDBMSの場合、こういった意味付けは表の列に名前をつけたり、列に格納するデータのタイプ(string、Intなど)を指定することによって行います。

##テーブル
RDBMSでは、データの管理単位として「表」が用いられます。表はデータベースに格納されるため「データベースオブジェクト」や、論理的な管理単位として「セグメント」と呼ばれることもあります。
列(同じ種類の値)、行(レコード)で作られている。
基本てきにデータベースの表における列や行の順番は問われない。
【iOS】新しくなったCrashlyticsの使い方 Fabric版（テスター配信編）

※本投稿は，iOS開発をある程度行っている方向けです。

##あらすじ
先に，[アカウント取得編](http://qiita.com/tomoki-n/items/1bc57054b5f9a2b24459)，[SDK導入編](http://qiita.com/tomoki-n/items/29e435507a1879a95bd1)を読んでから，見てください。

##テスター配信
1.[Xcode]->[Product]->[Archive]で.ipaファイルを作成すると，こんな画面が出てくるのでDistributeをクリックします。
![スクリーンショット 2015-02-05 9.37.19.png](https://qiita-image-store.s3.amazonaws.com/0/60055/ae4dc706-b245-a417-4978-25a6c95279bc.png)

2.配信したい人のメールアドレスを入力して，配信完了です。
![スクリーンショット 2015-02-05 9.37.30.png](https://qiita-image-store.s3.amazonaws.com/0/60055/79d12e3e-d132-5884-ba4e-b4660f6e9753.png)

3.こんなメールが届きます。
![IMG_0669.PNG](https://qiita-image-store.s3.amazonaws.com/0/60055/be5a761d-6b94-230c-79c4-a51e47be437f.png)

※ちゃんとSafariで開きましょう。（すごく親切です）
![IMG_0670.PNG](https://qiita-image-store.s3.amazonaws.com/0/60055/6304f595-ef21-a7aa-f917-f1ec68c6ff75.png)

4.名前とか，証明書をインストールしてアプリインストール！！
![IMG_0671.PNG](https://qiita-image-store.s3.amazonaws.com/0/60055/a4b8a91a-c183-608d-bfe3-5f6ab8a1bee7.png)



三回にわたってお送りしました。ありがとうございました！！
EclipseでJavaのステップイン実行をフィルターする

デバッグのステップイン実行。

自分たちで実装したクラスにはインしたいんだけど
Stringクラスとか標準ライブラリなどまではインしたくない場合がほとんどかと。

そんなときにはステップインっていっても特定のクラスやパッケージをすっとばしてくれる設定があるので使おう。

F5,F6,F7キーあたりの使い分けを減らせて少しだけ便利。

###設定
メニューの
ウィンドウ　＞　設定　
＞　Java　
　＞　デバッグ　
　　＞　ステップ・フィルター
rspecのshared examplesでletで宣言した変数を引数でわたしたいとき



rspecの重複箇所を共有化しようと思ってshared examplesを使ってみたのですが、関数を使う感覚でやっていたらはまってしまったのでメモ残しときます。

```ruby
shared_examples_for '許可しないユーザ' do |path|
  let(:user) { FactoryGirl.create(:forbidden_user) }

  it '401を返却' do
    get path, { user_id: user.id }
    expect(response.status).to eq 401
  end
end

RSpec.describe Example do
  describe 'GET /api/me/comments' do
    let(:path) { '/api/me/comments' }
    it_should_behave_like '許可しないユーザ', path
  end
end
```

これで実行しようとするとエラーが出てしまいます。

```sh
/home/vagrant/tryjob/spec/requests/api/v1/me/comments_spec.rb:50:in `block (3 levels) in <top (required)>': undefined local variable or method `path' for RSpec::ExampleGroups::Example::POSTApiV1MeExperiences::Nested:Class (NameError)
```

結局、`let`だと参照するときに見にいくので引数でわたす必要ないんですね。

```ruby
shared_examples_for '許可しないユーザ' do
  let(:user) { FactoryGirl.create(:forbidden_user) }

  it '401を返却' do
    get path, { user_id: user.id }
    expect(response.status).to eq 401
  end
end

RSpec.describe Example do
  describe 'GET /api/me/comments' do
    let(:path) { '/api/me/comments' }
    it_should_behave_like '許可しないユーザ'
  end
end
```
mbed LPC1768でデバッグする

CMCIS-DAPに対応させるため、LPC1768を最新ファームウェアにアップグレードする。
http://developer.mbed.org/handbook/Firmware-LPC1768-LPC11U24

”Download latest firmware”からダウンロードしたファイルをmbedのUSBストレージに書き込む。

一度mbedの電源をoffして、再度電源を入れてmbedストレージ内のMBED.HTMを開き、ファームウェアバージョンが
firmware=141212となっていることを確認する。

シリアルドライバーをインストールする。
http://developer.mbed.org/handbook/Windows-serial-configuration#1-download-the-mbed-windows-serial-port

KEILにアクセスして、ユーザー登録を行い、MDK-ARMをダウンロードする。
https://www.keil.com/demo/eval/arm.htm

続く...