OmniAICreator/Qiita-1.07M huggingface dataset:
JSONとは


## JSONとは
- 「Javascript Object Notation」の略で「ジェイソン」という
- テキストフォーマットの一種で、シンプルかつ軽量
- null、真偽値、文字列、配列、オブジェクト（連想配列）のデータを文字列で表現できる
- 配列とオブジェクトはネスト構造で表現することができる
- XMLと比べて比較的仕様が簡単なため導入が容易

### フォーマットについて

- 空白、タブ、改行などの整形用の文字は自由に挿入できる

#### 文字列の表現
- 文字列はダブルクォーテーションでくくる（シングルクォーテーションでくくることはできない）

#### 数値の表現
- 整数、小数、指数を表現できる
- 16進数や8進数の表記を使用することはできない
- NaN値やInfinity値は使用できない

#### null値の表現
- nullと記述する
- undefined値は使用できない

#### 配列の表現
- 配列リテラルをそのまま使用できる

```:json

// 配列
[true, false, 0, 1, 2, 1.5, "あ", "い"]

//多次元配列
[
  [
    ["A", "B", "C"],
    ["D", "E", "F"]
  ], [
    ["G", "H", "I"],
    ["J", "K", "L"]
  ], [
    ["M"],
    ["N"],
    ["O"]
  ]
]

```

#### オブジェクトを表現
- オブジェクトのキーは文字列の表現と同じ
- ダブルクォーテーションでくくる（シングルクォーテーションでくくることはできない）
- クォーテーションを省略することもできない（）

```:json

//オブジェクト
{
  "name": "hogeta",
  "age": "12",
  "address": "shibuya",
  "result": true
}

//配列とオブジェクトの組み合わせ
{
  "a": {
    "name": "a",
    "id": 1,
    "result": false
  },
  "b": {
    "name": "b",
    "id": 2,
    "result": true
  },
  "c": {
    "name": "c",
    "id": 3,
    "result": true
  }
}

```
中国語の繁体字・簡体字について

#繁体字・簡体字とは

中国語の文字の中で、簡体字と繁体字2種類があります。
以下簡単に比較と説明します。

| | 繁体字 | 簡体字 |
|:-------:|:-------:|:-------:|
|概要|従来の漢字。簡体字との対比により呼ばれています。正体字と呼ぶ人もいます。|1950年代に中華人民共和国で制定された　従来の漢字を簡略化した字体体系|
|利用地域|台湾・香港・マカオ|中国・ マレーシア・シンガポール　などの中華圏|
|Unicode以外)主要文字コード|Big5|GBxxxx (ex: GB18030)|


同じ繁体字でも、地域によって若干違う場合もあります。
例：

| 台湾(繁) | 香港(繁) | 簡体字 | (日本)新字体 |
|:-------:|:-------:|:-------:|:-------:|
|畫|畫|画|画|
|敘|敍|叙|叙|
|衛|衞|卫|衛|
|裡|裏|里|裏|



#文字コードについて

今はだいたいUnicodeに集約していくが、
最初に作った時、繁体字と簡体字はそれぞれ違う文字コードがあります。

昔から作ったシステム・サービスは、そのまま使われているかもしれません。


**ややこしい経緯(概要)**

![image](https://qiita-image-store.s3.amazonaws.com/0/26351/78d7472e-fe46-d16d-2f75-c78754622aa6.png)


* * *
**補字符集ってなに？**

ちなみに、なぜか香港・台湾は同じ繁体字でも、"香港補字符集"というものがありますか。
実は中国で様々な**方言**があります。地方によって、話の発音や言葉が全然違って、一般の中国語（普通語）は通じないどころもあります。

例えば、香港（広東語）や台湾（閩南語）にあるが普通語（北京語）にない発音もあります。
なので、話が文字にするとき、方言の発音に合わせて適切な漢字で表現するために、普段にない漢字を使う（作る）状況があります。

↓こんな感じかなぁ

![image](https://qiita-image-store.s3.amazonaws.com/0/26351/523f9e70-bbf4-2c12-8805-8af7b85139c0.png)


* * *
**余談**

1. 字体だけではなく、地方によって、中国語の用語が違います。
参考：http://s-bokan.com/blog/multilingual_websites/chinese-language.html

2. 交流・インターネットによる、文字の流通が速くなってきました。差がだんだん縮小していきます。
テーブルのカラムごとにAjaxで値を取得して反映する

Ajaxで値を取ってテーブルに値をいれる自分の中でのテンプレ。

例えばこんなHTMLがあったとして

```
  <table>
    <tr>
      <td class="targetHogehoge">
        <div>Loading...</div>
        <input type="hidden" name="param1" value="p1" />
        <input type="hidden" name="param2" value="p2" />
        <input type="hidden" name="param3" value="p3" />
      </td>
    </tr>
    <tr>
      <td class="targetHogehoge">
        <div>Loading...</div>
        <input type="hidden" name="param1" value="pp1" />
        <input type="hidden" name="param2" value="pp2" />
        <input type="hidden" name="param3" value="pp3" />
      </td>
    </tr>
    <tr>
      <td class="targetHogehoge">
        <div>Loading...</div>
        <input type="hidden" name="param1" value="ppp1" />
        <input type="hidden" name="param2" value="ppp2" />
        <input type="hidden" name="param3" value="ppp3" />
      </td>
    </tr>
  </table>

```

`Loading...`にAjaxで取った値を表示されるようにするには。

スクリプト書くとこんな感じ

```
$(function($){
  getHogeHogeData();
});

function getHogeHogeData() {
  var targetColumn = $(".targetHogehoge:first");
  if (targetColumn.length == 0) {
    return;
  }
  var param1 = targetColumn.children("input[name='param1']").val();
  var param2 = targetColumn.children("input[name='param2']").val();
  var param3 = targetColumn.children("input[name='param3']").val();
  var hash = new Date().getTime();
  $.ajax({
      type : "get",
      url :  "hhh/ooo/ggg/eee",
      dataType : "html",
      data : {
        "parameter1" : param1,
        "parameter2" : param2,
        "parameter3" : param3,
        "hash" : hash
      },
      error : function(XMLHttpRequest, status) {
        targetColumn.children("div").html(status);
        targetColumn.removeClass("targetHogehoge");
        getHogeHogeData();
      },
      success : function(data) {
        targetColumn.children("div").html(data);
        targetColumn.removeClass("targetHogehoge");
        getHogeHogeData();
      }
  });
}

```
mysqlで直近のバックアップと現在の値を比較

### 以下のようなテーブル構成
* * *
- 業務テーブル(USER_TABLE)

|カラム|型|備考|
|:----|----:|:----:|
|USER_ID|INT|ユーザID(PK)|
|USER_INFO_1|VARCHAR(255)|ユーザ情報１|
|USER_INFO_2|VARCHAR(255)|ユーザ情報２|
|USER_INFO_3|VARCHAR(255)|ユーザ情報３|
|MODIFIED|TIMESTAMP|更新日時|

- バックアップテーブル (USER_BACKUP_TABLE)

|カラム|型|備考|
|:----|----:|:----:|
|ID|INT|連番ID(PK)|
|USER_ID|INT|ユーザID|
|USER_INFO_1|VARCHAR(255)|ユーザ情報１|
|USER_INFO_2|VARCHAR(255)|ユーザ情報２|
|USER_INFO_3|VARCHAR(255)|ユーザ情報３|
|MODIFIED|TIMESTAMP|更新日時|

業務テーブルにあるユーザの**現在**の情報と**直近**のバックアップした情報の**変更点**を確認したいため、以下のSQLで実現できた。

サブクエリしすぎかな。。。

```sql
select 
  NOW.USER_ID,
  NOW.USER_INFO_1,
  BK.USER_INFO_1,
  NOW.USER_INFO_2,
  BK.USER_INFO_2,
  NOW.USER_INFO_3,
  BK.USER_INFO_3,
from USER_TABLE NOW 
join
  (select USER_ID, USER_INFO_1, USER_INFO_2, USER_INFO_3 from USER_BACKUP_TABLE UBT 
  join 
    (select USER_ID, MAX(ID) as last_id from USER_BACKUP_TABLE group by USER_ID WHERE CREATED bwtween '2015-12-01 00:00:00' and '2015-12-31 23:59:59') AS MAXBK
  ON UBT.USER_ID=MAXBK.USER_ID AND UBT.ID=MAXBK.ID) AS BK
ON NOW.USER_ID=BK.USER_ID
WHERE NOW.MODIFIED bwtween '2015-12-01 00:00:00' and '2015-12-31 23:59:59'
```
PythonでSpatiaLiteを作成

この記事について
---
PythonでSpatialiteを作成した時のメモ

実行環境
---
OS Windows7-64bit
Python 2.7.10

DLLダウンロード
---
[ここ][link-1]からWindows版バイナリをダウンロード
[link-1]:https://www.gaia-gis.it/spatialite-2.3.1/binaries.html
* libspatialite-win-x86-2.3.1.zip
* libiconv-win-x86-1.9.2.zip
* proj-win-x86-4.6.1.zip

DLLコピー
---
zip展開すると各binフォルダ内にDLLがあるのでパスが通ったフォルダへコピー
* libspatialite-1.dll
* libiconv2.dll
* libproj-0.dll
※DBの作成だけであればgeos*.dllは必要ないようです

スクリプト
---
POINT,LINESTRING,POLYGONを格納したSpatialiteを作成する簡単なスクリプト
作成されたsample.spatialiteはQGISなどのGISツールで参照出来ます

```py:sample.py
# -*- coding: utf-8 -*- 
import sys
import os
import sqlite3

if __name__ == "__main__":
  conn = sqlite3.connect("sample.spatialite")
  if conn:
    print 'connect success'
  else:
    print 'connect failes'
    sys.exit()
  conn.enable_load_extension(True)
  conn.execute('SELECT load_extension("libspatialite-1.dll")')
  conn.execute('SELECT InitSpatialMetaData()')
  conn.execute("INSERT INTO spatial_ref_sys (srid, auth_name, auth_srid, ref_sys_name, proj4text) VALUES (4326, 'epsg', 4326, 'WGS 84', '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')")

  #POINT
  conn.execute('CREATE TABLE "point" ("OBJECTID" INTEGER PRIMARY KEY AUTOINCREMENT)')
  conn.execute('Select AddGeometryColumn ("point", "Geometry", 4326, "POINT", 2)')
  conn.execute('INSERT INTO point (Geometry) VALUES(GeomFromText("POINT(139.69 35.679)",4326))')

  #LINESTRING
  conn.execute('CREATE TABLE "line" ("OBJECTID" INTEGER PRIMARY KEY AUTOINCREMENT)')
  conn.execute('Select AddGeometryColumn ("line", "Geometry", 4326, "LINESTRING", 2)')
  conn.execute('INSERT INTO line (Geometry) VALUES(GeomFromText("LINESTRING(139.69 35.68, 139.691 35.681, 139.692 35.68)",4326))')

  #POLYGON
  conn.execute('CREATE TABLE "polygon" ("OBJECTID" INTEGER PRIMARY KEY AUTOINCREMENT)')
  conn.execute('Select AddGeometryColumn ("polygon", "Geometry", 4326, "POLYGON", 2)')
  #Exterior CCW - Interior:CW
  conn.execute('INSERT INTO polygon (Geometry) VALUES(GeomFromText("POLYGON((139.69 35.682, 139.69 35.681, 139.691 35.681, 139.691 35.682, 139.69 35.682),(139.6902 35.6818, 139.6908 35.6818, 139.6908 35.6812, 139.6902 35.6812, 139.6902 35.6818))",4326))')

  conn.commit()
  conn.close()
```

その他
---
* OGC:Simple Feature Access - Part 1: Common Architecture
http://www.opengeospatial.org/standards/sfa

* spatialite sql一覧
https://github.com/azavea/acs-alchemist/blob/master/csharp/Azavea.NijPredictivePolicing.Common/init_spatialite.sql

* ジオメトリはXYタイプのみ
Spatialite(2.3.1)はXYZに対応していないようです
定義すると下記のエラーになります
``AddGeometryColumn() error: argument 5 [dimension] current version only accepts dimension=2``
Raspberry PiでGPIOを試してみた（ドアセンサーサーバー保存する版）

# ゴール

[前回](http://qiita.com/thuydg@github/items/bd5f3e2cd0fabac9195e)の続きで、今回Raspberry PiのGPIOをINとして、ドアセンサーを利用し、空くか閉めるかという判断（１か０）を取得する。

# 利用する環境

* Raspberry Pi 2 Model B
* 磁石スイーチ
* NodeJS
* NodeRED

# 磁石スイーチ

* リードスイーチも呼ばれて、磁石でドアが開閉しているかどうかをON/OFFスイーチとして電源が流れる。
* 色々書類があるが、今回秋月にはものがないので、車の[開閉運動スイッチ](http://minkara.carview.co.jp/userid/312102/car/206826/7132603/parts.aspx)を利用します

理想のもの
![sensor1](http://akizukidenshi.com/img/goods/C/P-04025.jpg "sensor1")
使ったもの
![sensor2](http://cdn.snsimg.carview.co.jp/minkara/parts/000/007/132/603/7132603/p1.jpg?ct=7fc9da2c3920 "sensor1")

# 準備

* 回路の準備：
以下のように回路を準備します。画像にはボタンスイッチと書かれているが、そちらは磁石スイッチとしてつながりました。
![sensor1](http://deviceplus.jp/wp-content/uploads/2015/05/raspberrypi19_img02.png "sensor1")
* 簡単に説明すると、ボタンが押されたら、信号は流れて、GPIO INの方で信号判断します。
* 利用するのはGPIO2

# NodeJSから信号取得

こちらの[nodeモジュール](https://www.npmjs.com/package/rpi-gpio)を利用します。

インストール：

```js
npm install rpi-gpio
```
ソースコード

```js
var gpio = require('rpi-gpio');

gpio.setup(2, gpio.DIR_IN, gpio.EDGE_BOTH);

gpio.on('change', function(channel, value) {
   console.log('Channel ' + channel + ' value is now ' + value);
});

```
# NodeRED

便利なノードがあるため、ノードをそのまま使うと実現できた。
また、こちらの[記事](http://qiita.com/yt09191971/items/5929927c297970344333)で[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)にデーター登録できるようになっていますので、組み合わせで試しました。

![gpio_nodered3.png](https://qiita-image-store.s3.amazonaws.com/0/18698/07a9b007-7a15-1ddc-b979-9c465eb7ae24.png)

詳細設定
![gpio_nodered1.png](https://qiita-image-store.s3.amazonaws.com/0/18698/0409b336-d09f-297b-5084-2c8052524fcb.png)

![gpio_nodered2.png](https://qiita-image-store.s3.amazonaws.com/0/18698/b54cd831-d2e9-34d7-e9da-62a3a2b93cf6.png)

結果

![gpio_nodered4.png](https://qiita-image-store.s3.amazonaws.com/0/18698/235e5697-cafd-53be-bf0b-332f614017d1.png)


# 参考

* http://deviceplus.jp/hobby/raspberrypi_entry_019/
* http://mb.cloud.nifty.com/
* http://qiita.com/yt09191971/items/5929927c297970344333
生年月日から年齢を計算する簡単な計算式

むかーし、年齢を計算するのに色々やっていたら、一発で出る方法を教えてもらって感動したので忘れないようにメモ的な意味合いで残す。

## 計算式

    (今日の日付-誕生日)/10000 の小数点以下切捨て。

PHPだと

```php:php
$birthday = 19800123;
$age = (date(Ymd) - $birthday) / 10000;
```

## 満了時期について
上記で簡単に年齢が計算できるようですが、注意点がある模様。

ただ年齢を表示する場合には問題ないようだけど、
**いつその年齢が満了したか**
を元に計算する場合は業務によって考え方が違うので気をつける必要があるようです。

簡単に言うと、9/1が誕生日とすると

    1. 誕生日の前日が満了
    　8/31 23:59:59.9999999…… で満了するという考え
    　この場合は満了日が 8/31 になる

    2. 誕生日が満了
    　9/1 00:00:00 で満了するという考え
    　この場合は満了日が 9/1 になる

１と２のどちらで計算を始めるかを確認する必要がある。ということ。
AWSで不要になったメインルートテーブを削除できない場合の対処法

# 概要

AWSで不要になったルートテーブルを削除しようとしてエラーで削除できない。
```
The routeTable 'rtb-*****' has dependencies and cannot be deleted. (Service: AmazonEC2; Status Code: 400; Error Code: DependencyViolation; Request ID: ****-****-*****-*****)
```
当該エラーが表示されるケースとしては以下 2 点の可能性が考えられる

1. メインルートテーブルである
2. サブネットに関連付けられている

今回は、1)に該当してました。

残念ながら**メイン**ルートテーブルは VPC 自体の削除時に**のみ**削除できる仕様となっているため、VPCも削除することにしました。
が、またエラーでVPCも削除できない。
```
The vpc 'vpc-*****' has dependencies and cannot be deleted. (Service: AmazonEC2; Status Code: 400; Error Code: DependencyViolation; Request ID: *****-*****-****-****-*****)
```

依存関係はデフォルトのセキュリティグループが残されているだけの状況だと思うけど、メインルートテーブルと同様VPC 自体の削除時に**のみ**削除できるはず。
でも、メッセージでは依存関係のエラーと思われるエラーが見受けられてるのでさらに依存関係を探してみる。

# まとめ

VPCにて、VPC エンドポイントを関連付けされていることがわかりました。
この関連付けを解除することでVPCを削除でき不要になったルートテーブルも削除できました。

1. VPC コンソールへ接続
2. VPC エンドポイント（vpce-*****）を選択
3. 3. 2. で選択したVPC エンドポイントを削除
[Actions] - [Delete Endpoints] 

ElasticBeanstalkで作成した環境で、
関連付けを調べるのに時間がかかったので残しておきます。
Ruby で SSH トンネルして、その先のサーバにSSHする方法

# Ruby で SSH トンネルして、その先のサーバにSSHする方法

SSH サーバをトンネルして、その先のサーバにSSHする方法です

## 1. gem を Install　しておく
インストール未済だったらインストルします

```bash
gem install net-ssh
gem install net-ssh-gateway
```

## 2. GateWay を生成する
トンネルするSSHサーバのObjetを生成します

※ ID/Password を使う場合

```ruby
require 'net/ssh/gateway'

## Gateway の生成
def openGateway()                                                                  
    gateway = Net::SSH::Gateway.new('192.168.XXX.XXX', 'UserName', :password => 'Password')
    return gateway
end
```

※ Private Key を使い場合

```ruby
require 'net/ssh/gateway'

## Gateway の生成
def openGateway()                                                                  
    gateway = Net::SSH::Gateway.new('192.168.XXX.XXX', 'UserName', :keys => 'PrivateKeyFile', :passphrase => 'Passphrasw')
    return gateway
end
```

## 3. Gateway を介してSSHする
トンネル先のSSHサーバにコマンドを投げます

```ruby
require 'net/ssh'

gateway = openGateway()

# Gateway の先のサーバに Login する
gateway.ssh('192.168.XXX.XXX', 'Username', :password => 'Password') do |ssh|
    ## この辺で、ssh に対してコマンド発行などをする
    print(ssh.exec!('ls -l'))
end
```

これで、Gateway 先のサーバにコマンドを発行して、結果を取得することが可能です。
WindowsでポートをLISTENしているプロセスを特定する

`netstat -aon` でポートの状態とあわせてpidが取得できます。

```
C:\> netstat -aon

アクティブな接続

  プロトコル  ローカル アドレス          外部アドレス        状態           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       3636
  (...略...)
```

あとはタスクマネージャでpidのプロセス、サービスを確認すれば良いです。

## タスクマネージャで起動しているプロセスのパスを探す方法

メニューの [表示]->[列の選択] から**イメージパス名**にチェックを入れるとプロセスのあるパスが表示されます。

またはプロセスを右クリックして [ファイルの場所を開く] でも OK.
エンジニアとしての情報発信

#はじめに
2016年会社の方針で、エンジニアスキル向上の一環として、積極的に情報発信を行うことになりました。

#目的
色んな言語や技術を持っていても（技術資産）、世の中に貢献できない、お金が稼げない、給料が上がらない。
世の中と繋がって始めて、貢献できる、稼げる、給料が上がると気づいた。
世の中と繋がるために、発信力を高めるべきだ。
とのこと

#どんなことを発信すると良いか
調べたい時は、初心者のタイミングが多い。ある程度理解が進むと調べることが減る。
なので初心者だからと気後れせずに発信をしていくのが良い。
なるべく、業務で知り得た具体的なことを発信するのが良い。（マッシュアップしただけの情報だと面白くない）

#注意点
（当たり前だけど。。。）IPアドレスや、ID、パスワードはアップしない！
業務的なセキュリティ情報はアップしない！！
※AWS怖い（[AWS で不正アクセスされて凄い額の請求が来ていた件](http://d.hatena.ne.jp/yoya/20150404/aws)）


#最後に
自分自身をブランディングするために、GitHub/Twitter/FaceBook/Qiitaなどで同じ名前（ハンドルネーム）を使い続ける。

#おまけ
・タグは、多くの人と同じタグにした方がよい
・slides.com より slideshareの方が、検索的に優位ぽい
GoogleAnalyticsを複数ドメインを持つサイトに設置

通常のGoogleAnalyticsタグは

```
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXX-YY', 'auto');
  ga('send', 'pageview');

</script>
```

複数ドメインをまたいで設置する場合は

```
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXX-YY', 'auto', {'allowLinker': true});
  ga('require', 'linker');
  ga('linker:autoLink', ['example.com', 'example.net']);
  ga('send', 'pageview');

</script>
```
GitHub, CircleCI, Herokuで連携してデプロイしたい時に, CIがEmailの認証で止まる時の対処方法


# 前提

https://circleci.com/docs/continuous-deployment-with-heroku

上記に沿ってdeploy出来るように設定しようとしている。

# 問題となる現象

CircleCIのbuildの出力

```
$ heroku run rake db:migrate --app app-name

Updating Heroku v4 CLI to 4.27.9-cce0260 (master)... done
Updating plugins... done
Enter your Heroku credentials.

Email:
```

上記の出力でCircleCIからHerokuへのデプロイが中断される

# 解決方法

1. GitHubのSettingからEmailの認証
2. CircleCIをログインし直す
3. rebuildする

# 推測

CircleCIでは、HerokuCLIの```Email:```という出力が出る際に、emailを入力するようなスクリプトが動いている？
そのemailはGitHubから拾ってくるが、GitHubのemailは認証されていない為に起きた問題では無いか？
ansibleでuserが存在しない場合のみuserを作成する方法

# 概要

userのアカウントをansibleで作成したい場合に、既にuserが存在する場合は、それを変えたくない場合がありますが、あまり良い方法がありません。

あまり格好良くないのですが、以下のような案を考えてみました。
最初の版では、サーバの複数のアカウントを変更する場合に問題があったので、手順2.を修正しました。

# 手順

## 1.以下のタスクで、ユーザが存在するかチェックする。

    - name: check user
      user: name={{ item.name }} password={{ initial_password }} update_password=on_create state=present
      with_items: myusers
      register: u

## 2. `check user` の結果に基づき、アカウントを作成（更新）する。

    - name: create users
      user: name={{ item[0].name }} uid={{ item[0].uid }} group={{ item[0].group }} groups={{ item[0].groups }} password={{ initial_password }} update_password=on_create state=present
      with_together:
        - myusers
        - u.results
      ignore_errors: true
      when: item[1].changed is not defined or item[1].changed == true

with_togetherを使ったので、分かりにくくなってしまいました。
もっと格好良い方法は、ないのですかね？

以上
バグ分析について

#仕事で品質見解書を書くことになったのでバグ分析について調べてみた

##バグを分析することにより以下の3つを実現する。

**・類似バグの発見**
バグの内容を分析することにより、今回検出されたバグと同じような処理をやっているところはないか。
そこに同様のバグが無いかを確認する。

**・バグの資産化**
バグの内容を分類、蓄積し、傾向を分析することにより、将来の設計、製造にフィードバックしていく。

**・バグの再発防止**
バグそのものと周辺の状況を捕らえ、動機的原因の分析と再発防止策の立案を実施し、バグの再発を防止する。

##STEP1：バグを分類する
以下の6つの要素でバグを分類する

| # | 要素 | 内容 |
|:-----------|------------:|:------------:|
|１| 発生機能 |     どの機能で発生したバグであったか     |
|２| リリース日 |    いつリリースされたバグであるか    |
|３| 作りこみ工程 |     どの工程で作りこまれたバグであるか（例）設計工程・製造工程     |
|４| バグ内容 |      どの様な内容（種類）のバグであるか（例）別表参照      |
|５| バグ原因 |    どの様な原因で起きたバグであるか（例）別表参照    |
|６| 作りこみ工程 |   本来どこで摘出されるバグであるか（例）UT、IT、ST  |

##STEP2：バグ内容、バグ原因を分類する
STEP1で分類した作りこみ工程に沿って以下のバグ内容、バグ原因を分析する

設計工程のバグ内容

| # | バグ内容 ||
|:-----------|------------:|:------------:|
|１| 要求仕様不良 |     要求仕様誤り     |
|２||    要求仕様が不完全   |
|３||     データ初期設定誤り，漏れ      |
|４| 機能仕様不良 |      機能仕様誤り       |
|５||    機能仕様が不完全     |
|６||   表現，記述の不良（内容曖昧）   |
##STEP3：COMING SOON
##STEP4：COMING SOON
（大幅改訂）WROOM02の扱い方

**改定しました(2017-03-20)**

ArduinoIDEを使ってスケッチの書き込み、実行を行うときの自分用虎の巻メモ
## 機材
- Windows10Home 64bit  
- [秋月のESP-WROOM-02 DIP化キット](http://akizukidenshi.com/catalog/g/gK-09758/)  
- USBシリアル変換モジュール[AE-UM232R](http://akizukidenshi.com/catalog/g/gK-01977/)
- 3.3V電源(↑の5Vからレギュレータで作ってもいい。)
- ArduinoIDE v1.8.0

## 接続方法
### 接続先
GNDはGND、3V3は3V3、RXとTXは交互に接続。加えて下記の通りに接続↓

|ESPのピン|書き込み時|実行時|
|-----:|:-----:|:-----:|
|IO15|Pダウン|Pダウン|
|IO2|Pアップ|Pアップ|
|IO0|Pダウン|Pアップ|
|EN|Pアップ|Pアップ|
|RST|Pアップ|Pアップ|

ちなみにIDEの設定↓
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/108489/88734e47-02f8-3d88-767a-a17e7c801d1e.png)



### 注意!!
- **毎回書き込み前にGNDに一瞬落とすことでリセット必須。**
- 3V3電源はFT232RLから出てる3V3をそのまま繋いでも電流不足で動かん。ので別の3V3が必要。FT232RLの5Vをレギュレーターで落とせばOK。(ちなみに書き込み時消費電流30mAくらい？Lチカで70mAもいく)

##私的メモ
ここまでたどり着くまでに。。。

- ENピンをプルアップするのを忘れていた。
- 最初9v電池からレギュレーターで落としていたが放熱が大変だった。  
USBシリアル変換モジュールのUSBから5V取った方が早いことに途中で気づいた。

- 他のarduinoに書き込んでいたならIDEの設定をESP8266ようにしておく!!

- 全部プルアップは抵抗を入れる。
起動スクリプトからService APIを利用する


## Service APIとは？

[Atom Flight Manual](https://atom.io/docs/latest/)の[Interacting With Other Packages Via Services](https://atom.io/docs/latest/behind-atom-interacting-with-packages-via-services)に詳しく載っているが、他パッケージの機能を利用したり、パッケージの動きを外部から操作するための仕組みである。
提供する側はサービス提供用メソッドでオブジェクト等を指定し、受け取る側はサービス提供用メソッドから渡されたオブジェクト等を利用する。
利用するには`package.json`に所定の情報を書き、それぞれ処理を行うメソッドを実装するのみである。

### 利用例

#### 提供側例

```coffeescript
module.exports =
  activate: -> # ...

  provideService: ->
    provide: (foo, bar) -> #...
```

#### 受け取り例

```coffeescript
module.exports =
  activate: -> # ...

  consumeService: (service) ->
    result = service.provide "foo", "bar"
```

## 起動スクリプトからサービスを利用するには

**マニュアルに書いてない方法のため今後使えなくなる可能性があることに注意**

マニュアルには`package.json`を利用する方法しか書かれていない。
では、起動スクリプト(`init.coffee`)で特定パッケージのサービスを利用したい場合はどのようにしたらよいのだろうか？
Atom内部でどのように扱っているのかを確認したところ、[package.coffee](https://github.com/atom/atom/blob/master/src/package.coffee)内で下記のような処理を見つけた。

```coffeescript:package.coffee
activateServices: ->
  for name, {versions} of @metadata.providedServices
    servicesByVersion = {}
    for version, methodName of versions
      if typeof @mainModule[methodName] is 'function'
        servicesByVersion[version] = @mainModule[methodName]()
    @activationDisposables.add @packageManager.serviceHub.provide(name, servicesByVersion)

  for name, {versions} of @metadata.consumedServices
    for version, methodName of versions
      if typeof @mainModule[methodName] is 'function'
        @activationDisposables.add @packageManager.serviceHub.consume(name, version, @mainModule[methodName].bind(@mainModule))
  return
```

`@packageManager`は恐らく`PackageManager`のオブジェクトだろう。
`atom.packages`も`PackageManager`オブジェクトなのでこちらを利用すればいけそうだ。
という訳で私がインストールしているパッケージでサービスを提供しているものを調べ、下記のようなコードを`init.coffee`に書いてみた。
ここではとあるパッケージが`some-service`という名称でサービスを提供していると仮定する。

```coffeescript:init.coffee
atom.packages.serviceHub.consume "some-service", "^1.0.0", (service) ->
  console.log service
```

`window:reload`後にデベロッパーツールのコンソールを確認したところ、`service`の内容が出力されていたのでこのやり方で間違いないようだ。
サービスを使って何かしたいことがあるがパッケージ化するまでもないという場合や、パッケージの形にする前にとりあえず試してみたい場合は使えるのではないだろうか。

パッケージ内でも同様に利用できるが、パッケージでは`package.json`に記載する方法を利用したほうが良いだろう。
無難なテスト項目名作成術

客先の本番サーバとか、プレゼン画面なんかで hoge はまだしも unko とかいうのが表示されたりしてこれはあかんで〜〜〜　みたいなの、自分ではやったことなくても見たり聞いたりしたことはあるんじゃないでしょうか

かといって無難なテストのための名前っていちいち考えるのも面倒だし、Seeder使うのも面倒なんだよね

なので、誰に見られてもそんなに恥ずかしくない、かつツールを使わなくてもテストのための適当な項目名がぽんぽこ出てくる方法をかんがえました！！！！！！！！！！！！

りんご

ごりら

らっぱ

ぱいなっぷる

るびー

びーる

るーびっくきゅーぶ

ぶるーはーつ
Wordpressをgitで管理するときの.gitattributesの使いドコロ

WordPressのGit管理と`.gitignore`
---

Wordpressをgitで管理しようとして「どのファイルをignoreすればいいんだっけ...?」となっても、今は[gitignore.io](https://www.gitignore.io/)や[gibo]()で簡単にWordpress用のgitignoreファイルを生成できます。

これらが作る`.gitignore`に、**`wp-config.php`と`.htaccess`が含まれています**。
前者はDBの設定などを記録するもの、後者はルーティングを設定するファイルです。
なぜignoreリストに追加されているかというと、**テスト環境と本番の環境間で値が異なるから**です。
もしdevelopmentブランチにあるこれらのファイルをマージすると、masterブランチにある本番環境の情報が誤って上書きされてしまいます。

なので、手動でFTPアップロードを行うのであれば、上記の2ファイルを単に`.gitignore`に記述したうえで環境ごとに別々のファイルを作っておき、それ以外のファイルをバージョン管理すれば問題ないわけです。
これは割とよくあるパターンだと思います。

heroku等での問題点
---

ところが[heroku](https://www.herokuapp.com/)を始めとした**Gitの使用を前提としたPaasではそうはいきません**。
アップする必要があるファイルは**全てgitで管理する必要が有るためです**。
よって上記ファイルも**git経由でサーバー(heroku)へアップロードしなければいけない**のです。
つまるところ

1. `wp-config.php`と`.htaccess`は本番にデプロイしたい(=gitで管理したい)一方で
1. 開発環境に対応するブランチを本番ブランチへマージする時はそれらの差分を無視したい(=ブランチ間で異なる状態を維持したい)

という要求を満たさねばならず、**`.gitignore`で無視することができません**。

.gitattribesの機能
---

「こんなわがままなことできるわけ無いじゃん...」

..と思っていたら、**なんと`.gitattributes`を使ってできる**ことが分かりました!!

`.gitattributes`ファイルは、ファイルや特定の拡張子ごとに属性を定義することができるファイルです。
この属性についての詳細な説明は、あまり自分でも理解できていないので省略しますが、属性の一つに**ブランチ間の差分を無視する**という属性があるのです。

まずプロジェクト(リポジトリ)のルートディレクトリに`.gitattributes`ファイルを作成し、以下を書き込みます。

```
.htaccess merge=ours
wp-config.php merge=ours
```

ブランチ間で差分を無視したいファイル名と、後ろに`merge=ours`というオプションをつけます。

そして`.git/config`を開いて

```
[merge "ours"]
    name = "Keep ours merge"
    driver = true
```

を追記します。
この謎のおまじないによって、なんと**gitでファイルを管理しつつ、mergeしても差分は取り込まれない**という設定ができるのです!!

Wordpressでの環境設定ファイルの管理に役立ちそうなTIPSですね。

参考
---
* [gitattributes Documentation](http://git-scm.com/docs/gitattributes)
* [git merge 時に内容が異なるファイルをマージ対象から除外する](http://qiita.com/haman29@github/items/cafd59233b2affe653fb)
* [Wordpress用の.gitignoreを考える 既にあるけど](http://tech.basicinc.jp/Wordpress/2013/05/05/wordpress_gitignore/)
[Objective-C] Collection was mutated while being enumerated

高速列挙を使い配列から要素を削除しようとしたら「Collection was mutated while being enumerated」というエラーが出た

列挙中に配列の要素を削除すると、それより後ろにある要素の全てが「1つ前」へ移動することになり、順番に処理をしていくことができなくなっておかしくなってしまうらしい。。
.each()を使ったループ処理でオブジェクトの値を取得する

.each()を使ったところ、上手く値の取得ができなかったので
色々なところに説明も書いてあるのですが、備忘録として。

##.each()を使ってオブジェクトを取得するには

```js:ループ
$("body").find('input[type="check"]').each(function(i, elem) {
	elem.attr("checked", true);
});
```

式の意味としては
**"\<body>内の全てのチェックボックスを順に取得、取得したチェックボックスをチェック済みにする"**
となりますが、
実は、この書き方では上手く実行できません。

elemの中身はオブジェクトだと思って式を書いていますが、each文で取得した中身は「\<input type='radio' id=''......./>」
の様なソースの文字列が入っています。
したがって、

```js:ループ正解
$('body input[type="check"]').each(function(i, elem) {
  elem.checked = true;
});
```
~~上記のような書き方でセレクターとして使用すると、オブジェクトが取得でき、使えるようになります。~~
コメントで指摘していただいた、より簡潔な書き方に修正しました。
ネットワークの経路の設定方法


OSはCentOS6.6

一時的な設定方法

```:bash
route add -net 172.27.111.0 netmask 255.255.255.0 gw 172.27.88.252 eth0
```

このままだとネットワークを再起動すると消える


恒久的な設定方法

```:bash
vi /etc/sysconfig/network-scripts/route-eth1
```

記述内容

```:route-eth1
172.27.111.0/24 via 172.27.88.252
```

これでネットワークを再起動しても設定されたままになる

```:bash
service network restart
```

確認方法

```:bash
route -n
```

削除方法

```:bash
route del -net 172.27.111.0 netmask 255.255.255.0 gw 172.27.88.252
```
c++ builder > [未解決] beep音 > Volumeが10%程度にしかならない / Beep(3000,1000) > 同期処理

http://qiita.com/7of9/items/3471ff39fccd75d08434
で調べたbeep音を鳴らす実装をしてみた。

Volumeが10%程度にしかならない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/29c798cd-a1ba-15c0-ed33-c5083e6169dd.png)

## Beep(3000,1000);

参考 http://www.papy.in/bbs/delphi/201102/11020008.html

Beep(3000, 1000);というような関数実行例があった。

試してみたところ、音量が50%になるようになった。

しかしながら
https://msdn.microsoft.com/ja-jp/library/cc428923.aspx
を見ると

> スピーカから単純な音を鳴らします。この関数は同期で実行されます。音が鳴り終わるまでは、呼び出し側へ制御を返しません。

同期処理というのが使用をためらわせる。

## PlaySound();

PlaySound()関数というものでwavファイルを再生を試みたが、音が聞こえなかった。

delphiでたくさんの実装例があるのだが、よくわからない。
フォームの一括操作

「一括選択」等の操作を作る機会があったので、忘れないよう投稿

「ボタンを押したら全てのチェックボックスにチェックを入れる」等の処理で参考にしてみてください。
<br><br><br>


```html:sample
<body>
<div id="aaa">
	<input type="radio" id="" class="yes" value="1" name="hoge1">YES
	<input type="radio" id="" class="no" value="0" name="hoge1">NO
</div>
<div id="bbb">
	<div>
		<input type="radio" id="" class="yes" value="1" name="hoge2">
		<input type="radio" id="" class="no" value="0" name="hoge2">
	</div>
	<div>
		<input type="check" id="" class="yes" value="1" name="hoge3">
		<input type="check" id="" class="no" value="0" name="hoge4">
	</div>
</div>
</body>
```

##.find()のセレクターを活用して一括操作


```js:「AND条件」sample
$("body").find('input[type="radio"].no').attr("checked", true);
```
上記のように書くと
findの引数の条件に合致する"body"タグ中の**ラジオボタンかつ、クラス名"no"**全ての要素にチェックを付けてくれます。

###find()の引数
find()の引数は複数のセレクターを指定でき、or又はandの条件を付ける事が可能です。

上記のように複数のセレクターを**繋げて書くと「AND条件」**
下記のように**カンマを使って複数のセレクターを書くと「OR条件」**です。

```js:「OR」条件sampla
$("body").find('input[type="radio"] , .no').attr("checked", true);
```
ちなみに、上記のOR条件sampleだと**ラジオボタン又はクラス名"no"**の要素となるので、クラス名"no"のチェックボックスにもチェックが入ることになります。
クロスサイトのiframeで親にコンテンツの高さを渡す方法

iframeで読み込んだ、動的コンテンツの高さに応じて親フレームの高さも調整したい事ってありますね！
結構すんなり出来る事なんですけど、ただ、クロスサイトになると制約がいっぱいなので単純には行きま。
ググった結果web Messagingってのを使うことにしました。

# Web Messagingを使う
**web messaging**とは、異なるサイト間でメッセージのやり取りが出来る機能です。クライアント間で完結します。
[こちらに詳細載ってます。Web Messagingとは](http://javascript-api.sophia-it.com/reference/Web+Messaging%E3%81%A8%E3%81%AF)

この機能には、`チャネルメッセージング`と`クロスドキュメントメッセージング`の二つのAPIが用意されています。
今回は`クロスドキュメントメッセージング`を使用します。

> クロスドキュメントメッセージングは、この異なるオリジンの間での通信を安全に行うことを目的としたAPIで、そのために、メッセージの送受信を専用のメソッドとイベントだけに限定し、送受信時に相手先のオリジンを確認できるようになっています。

渡すメッセージに、子フレームのコンテンツの高さを入れてやろうって事です！

# 子フレームから親フレームにメッセージを渡す

## 子フレームにpostMessageを実装する
まず、子フレームにて、親フレームに渡すコンテンツの高さとスクロール位置を文字列にして渡します。

```Javascript:children.js
// ウィンドウload時のイベントで
window.addEventListener("load", postSize, false);
function postSize(e){
    var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);
    if (typeof target != "undefined") {
        target.postMessage("height"+document.body.scrollHeight+"_top100", "https://example.com");
    }
}

// または、何かしらのアクションでのイベントで
function doEntry() {
    var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);
    if(typeof target != "undefined"){
        target.postMessage("height"+document.getElementById('entryResult').scrollHeight+"_top0", "https://example.com");
  }
}
```
*  親フレームがpostMessageを使えるかチェックします。

```
var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);
```

* postMessageでメッセージを送る

```
target.postMessage("height"+document.body.scrollHeight+"_top100", "*");
```
|param | 意味 | 
|:-----------:|:------------|
| message |他のウィンドウに送られる文字列データ|
|targetOrigin |自身のURIか、 "*" というリテラル文字列（指定しないことを示します）で指定します。もしイベントが targetOrigin で指定されたものにマッチしない場合、そのイベントは伝達されません。|
[詳しくはこちら](https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage)

## 親フレームにmessageイベントを受け取れるようにする
以下の例は、ウィンドウの高さとスクロールの位置をmessageから受け取る例です。

```Javascript:parent.js
// messageのイベントリスナー
window.addEventListener("message", receiveSize, false);
// 実行関数
function receiveSize(e) {
	// e.dataに「height1000_top0」のような文字列が入ってくる想定。
	var data = e.data.split('_');
	// originのチェック。
	if (e.origin === "https://example.com" && (0 == data[0].indexOf("height") && (0 == data[1].indexOf("top"))  ) {
		document.getElementById("entryform").style.height = parseInt(e.data.replace('height', '')) + "px";
		// FirefoxとIE11で動かなかったので一部修正
		$('html, body').scrollTop(parseInt(data[1].replace('top', '')));
	}
}
```
messageを受け取ったら、
`window.addEventListener("message", receiveSize, false);`で`receiveSize()`を呼び出します。
イベントデータのプロパティは以下です。

|プロパティ| 意味 | 
|:-----------:|:------------|
|data |postMessageで送ったmessage部分|
|origin|postMessageで送ったtargetOrigin部分|

セキュリティ上、`if (e.origin === "https://example.com")`でURIのチェックは行った方がよさ気です。

はい、以上で子フレームのコンテンツの高さを親に渡す事ができました。
他に良い方法があれば教えて下さい(・∀・)
pyenv, virtualenvの仕組み

この記事の目的
===========
pyenv, virtualenvがどのような仕組みでPython実行環境を作っているのか説明する。導入方法、使用方法には特に触れない。説明は参照サイトの翻訳で、それ以上の情報はない。

参照サイト
========
[yyuu/pyenv](https://github.com/yyuu/pyenv)
[virtualenv](https://virtualenv.pypa.io/en/latest/)

pyenv
=====
## 概要
pythonのバージョンを同一端末内で使い分けるためのツール。作業ディレクトリ毎に用いるpythonのバージョンを設定できる。
## 仕組み
### 構成要素
pyenvでインストールされる各バージョンのpythonは下記のように保存される。ちなみにpyenvで指定するバージョン名はフォルダ名そのままである。

```shell-session:pyenv_structure
$HOME/.pyenv/shims/               # pyenvの仕組みの核。各shimコマンドが配置される。
          |-/versions/2.7.8/      # インストールしたPythonインタプリタ
                   |-/3.4.2/      # 例として2.7.8, 3.4.2, pypy-2.4.0をインストールした場合このようになる
                   |-/pypy-2.4.0/
          |-/version              # globalで使うpythonのバージョン情報ファイル
```

また、`python local`コマンドを使うことで、任意の作業ディレクトリに`.python-version`ファイルが配置される。

`python global`コマンドでは、`$HOME/.pyenv/version`ファイルが編集される。

`.python-version`と`$HOME/.pyenv/version`ファイルには、名前の通り利用するpythonのversion情報が記述されているのみである。

そして`$HOME/.pyenv/shims/`以下にshimコマンドが作成される。これについては次節で説明する。

### shimとバージョン切り替えの仕組み
shimコマンドとは、pythonコマンド(python, pip等)と同名で、`$HOME/.pyenv/shims/`に配置されるコマンド群である。一口に言うと、バージョン情報を探索したのち、該当するバージョンの同名コマンドを実行するコマンドである。具体的な手順は下記の通り。

1. 環境変数`PYENV_VERSION`を調べ、もしバージョン情報があれば、それを利用する。

1. 環境変数`PYENV_VERSION`に情報がない場合、`.python-version`ファイルが同ディレクトリにあれば、それに記載されたバージョンを利用する。

1. 同ディレクトリに`.python-version`ファイルがなければ、親ディレクトリを探索し、`.python-version`ファイルが存在しないか調べる。

1. 上記の探索でバージョン情報が見つからない場合、`~/.pyenv/version`ファイルに記載された情報を利用する。このファイルすらない場合、system標準にあるPythonを利用する。

このshimコマンドを利用するために、`$HOME/.pyenv/shims/`をシステム標準のコマンドがあるPATHより左側に＄PATHを設定しなければならない。
```directory:例
~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin
```

ちなみに、`pyenv rehash`はこのshimsコマンドを現在インストールされてるpythonバージョン群に基づいて再構成するコマンドである。

virtualenv
==========

## virtualenvで構築されるディレクトリ
virtualenvコマンドで任意のディレクトリにPython実行環境を作成できる。このディレクトリ構成は単にPythonインタプリタのディレクトリと同じ構成である。Pythonコマンドは、自身の親ディレクトリにあるinclude, libディレクトリを参照するようだ。なので、virtualenvはただそのディレクトリ構成を作成し、必要なモノを入れ込むだけである。ちなみにPythonコマンドなどは、シンボリックリンクをはるのみである。実物をコピーしたい場合は`--always-copy`オプションを使う。

```directory
# $VIRTUAL_ENVはvirtualenvコマンドで作成したディレクトリ
$VIRTUAL_ENV/bin/              # Python, pip等実行ファイル群
          |-/include/          # C headerが配置される
          |-/lib/              # 追加ライブラリが配置される
              |-/pythonX.X/site-package 
```

## activate scriptで設定される環境変数
`$PATH`に`$VIRTUAL_ENV/bin`を追加するだけ。python実行を、`$VIRTUAL_ENV/bin/python`としても、仮想環境のPythonを問題なく実行できそう。

```shell-session:activate
# activateスクリプトから抜粋
PATH="$VIRTUAL_ENV/bin:$PATH"
unset PYTHONHOME

```

まとめ
=====
pyenvのshimの仕組みはちょっと面白い。virtualenvがやってることはそんなに複雑ではない。pyenvにインストールしたバージョンを使いたい場合、次のようにすればよさそう。

```shell-session
$ virtualenv path-to-desired-env --python=$HOME/.pyenv/versions/2.7.8/
```
jQuery:子要素をスクロールしている間は、ページ全体のスクロール無効化する

子要素をスクロールできるUIで、その要素をスクロールすると勢いづいて、ページ全体までスクロールしてしまうことがある。

たとえばこんな感じに…

<img src="https://qiita-image-store.s3.amazonaws.com/0/889/109bbadd-f58a-9be2-3f3b-940291457052.gif" class="img-thumbnail">

子要素をスクロールしているときは、ページ全体のスクロールを無効にする方法はいろいろ考えられるが、今回はjQueryで対応する方法を紹介する。

```js
(function () {
    var timer = null;
    $(".prevent-window-scroll").on("mousewheel", function () {
        $("body").css({overflow: "hidden"});
        clearTimeout(timer);
        timer = setTimeout(function () {
            $("body").css({overflow: "inherit"});
        }, 200);
    });
})();
```

デモ: [jQuery - 子要素をスクロールするときは、ウィンドウをスクロールしないようにする例](http://codepen.io/suin/pen/EPWryG)

スニペットの内容を簡単に説明すると、子要素`.prevent-window-scroll`の`mousewheel`イベントにかんで、マウスホイールが回ったときに一旦`<body>`のCSSに`overflow:hidden`をセットすることでページ全体のスクロールを無効化する。その後、200ミリ秒経過したら、`<body>`の`overflow:hidden`を取ってやるようにしている。
Rails generate の使い方とコントローラーやモデルの命名規則


## **コントローラーを作りたいとき**
### **`rails generate controller <コントローラー名> <アクション名>`**
コントローラー名は**複数形**で、頭文字を**大文字**にする。
newアクションを持つUsersコントローラーを作るときは次のように入力する。

```cmd:command
$ rails generate controller Users new

```

## **モデルを作りたいとき**
### **`rails generate model <モデル名> <カラム名：型>`**
モデル名は**単数形**で、頭文字を**大文字**にする。
name、emailの2つの項目を持つUserモデルを作るとき。

```cmd:command
$ rails generate model User name:string email:string

```

`rails generate model User`によって作られたマイグレーションファイルは次の通り。
テーブル名は`Users`と**複数形**になる。

```rb:[timestamp]_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps null: false
    end
  end
end
```

### マイグレーションファイルを適用したいとき

```rake:command
$ bundle exec rake db:migrate
```


### 適用したマイグレーションの取り消すしたいとき

```rake:command
$ bundle exec rake db:rollback
```

## **存在するテーブルのカラムにインデックスを追加するとき**
以下の例は、usersテーブルのemailカラムにインデックスを追加する場合の流れです。

手順１.インデックス追加用のマイグレーションファイルを作成する
### **`rails generate migration <マイグレーションファイル名>`**

```cmd:command
$ rails generate migration add_index_to_users_email
```

```rb:[timestamp]_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration
end
```


手順２．作成されたマイグレーションファイルにインデックスを定義する

```rb:[timestamp]_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end
```

※`unique: true`はインデックスに対して一意性を強制するオプション。オプションをつけなければインデックス自体の一意性は強制されない。

手順３．インデックスを定義したマイグレーションファイルを適用する

```cmd:command
$ bundle exec rake db:migrate
```


## **存在するテーブルにカラムを追加したいとき**
以下の例は、usersテーブルにpassword_digestというカラムを追加するときです。


手順１.インデックス追加用のマイグレーションファイルを作成する
### **`rails generate migration <マイグレーションファイル名> <追加するカラム名：型>`**

```cmd:command
$ rails generate migration add_password_digest_to_users password_digest:string
```

作成されたマイグレーションファイル

```rb:[timestamp]_add_password_digest_to_users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration
  def change
    add_column :users, :password_digest, :string
  end
end
```

手順２．作成されたマイグレーションファイルを適用する

```cmd:command
$ bundle exec rake db:migrate
```
nodejsでOneDrive APIを使う。主にOAuthとか

###ざっくりと概要
https://dev.onedrive.com/README.htm

###アプリの登録
https://account.live.com/developers/applications/index
アプリケーションを作成して、
設定>API設定、モバイル クライアント アプリ/デスクトップ クライアント アプリを「はい」に
アプリケーション設定にて表示される、クライアント ID、クライアント シークレットをのちに使用する

###認証コードの取得
参考　https://msdn.microsoft.com/ja-jp/library/hh243647.aspx

先のクライアントIDを以下のurlに入れて、ブラウザからアクセスする
アドレスバーに/?code=XXXXXXと、認証コードが含まれるので、これをアプリの中で使う。この操作は最初の1回でよい

```lang:ブラウザにてアクセス
https://login.live.com/oauth20_authorize.srf?client_id=クライアントID&scope=wl.signin onedrive.readwrite wl.offline_access&response_type=code
```

###アクセストークンの要求
認証コードを使い、リフレッシュトークンを取得する

```lang:JavaScript
var url = 'https://login.live.com/oauth20_token.srf';
	
request.post({
	url: url,
	form: {
		client_id: client_id,
		client_secret: client_secret,
		code: /* 認証コード */,
		grant_type: 'authorization_code'
	},
	json: true,
	headers: {  'Content-Type': 'application/x-www-form-urlencoded' }
}, function(error, response, d){
	if (!error && response.statusCode == 200)
		console.log(d.refresh_token);	// リフレッシュトークンの取得
	else
		console.log(response);
});
```

###アクセストークンの更新
リフレッシュトークンを使い、アクセストークンを更新する
以降、apiを使用するときはheaderにアクセストークンを含める
アクセストークンはexpires_inプロパティで指定された秒数だけ有効なので、この操作は毎回行うことになる。そのため、リフレッシュトークンを保存しておき、次回使うときは保存したリフレッシュトークンでアクセストークンを取得する

```lang:JavaScript
var url = 'https://login.live.com/oauth20_token.srf';

request.post({
	url: url,
	form: {
		client_id: client_id,
		client_secret: client_secret,
		refresh_token: /* リフレッシュトークン */,
		grant_type: 'refresh_token'
	},
	json: true,
	headers: {  'Content-Type': 'application/x-www-form-urlencoded' }
}, function(error, response, d){
	if (!error && response.statusCode == 200) {
		//	リフレッシュトークンの保存
		fs.writeFileSync('refresh_token.txt', d.refresh_token);

		//アクセストークン
		console.log(d.access_token);
	} else {
		console.log(response);
	}
});
```

###apiの使用例
```lang:JavaScript
var root = 'https://api.onedrive.com/v1.0';
var refresh_token = fs.readFileSync('refresh_token.txt', 'utf-8');

//	アクセストークン更新
//	var ACCESS_TOKEN = 

request.get({
	url: root+'/drive/items/ディレクトリのIDとか/children',
	headers: {
		Authorization: 'Bearer ' + ACCESS_TOKEN
	},
	json: true,
}, function(error, response, d){
	・・・
	・・・
});
```
Go のあるパッケージが参照している外部パッケージを一覧化する

Dependency の管理を特に行っておらず、 GOPATH 配下のパッケージを直接参照する Go のプレーンな手法に頼っているプロジェクトにおいて、参照している外部パッケージを一覧化します。

```bash
$ cd $GOPATH/src/path/to/target/
$ go list -f '{{join .Deps "\n"}}' |  xargs go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}' | grep -v `go list`
```

[GO15VENDOREXPERIMENT](https://github.com/golang/go/wiki/PackageManagementTools#go15vendorexperiment) や [Godep](https://github.com/tools/godep) などで Vendoring しているプロジェクトの場合はそこからリストアップします。

### 参考

- [List external dependencies of package](https://groups.google.com/forum/#!topic/golang-nuts/611QEJqkDKw)
Gitサーバ構築


* install packkages

```
yum install git git-daemon xinetd
```
* config xinetd and git daemon to pull, push project from localhost

```
chkconfig xinetd on
vim /etc/xinetd.d/git

disable = no # ← 変更
user = git # ← 変更
server = /usr/bin/git ←　変更
server_args = daemon --base-path=/srv/git --export-all --user-path=public_git --syslog --inetd --verbose --enable=receive-pack # <- 変更

/etc/init.d/xinetd start
```

* create git user and group

```
useradd git
groupadd git
```

* git ユーザーになって /srv/git に移動

```
sudo /bin/bash
su git
cd /srv/git
```

* ディレクトリを作成

```
mkdir hoge
```

* 作成したディレクトリに移動し、リポジトリを初期化

```
cd hoge
git init --bare --shared=true
```

* バックアップ用に /home/git/ に最初にクローンする

```
cd /home/git/
git clone git://localhost/hoge
```
CS-Cart: 全ページでJavaScriptを読み込みたい

CS-Cartでページを横断するようなAddonを作っていると、JavaScriptを全ページで読み込みたいことがある。ここでは、AddonのJavaScriptをCS-Cartのbackendの全ページで読み込む方法を紹介する。

まず、全ページで読み込むJSを作成する。ファイル名は好きなようにつけて構わない。JSファイルは`js/addons/{アドオンID}/`ディレクトリに作成する。

```
touch js/addons/{$addon_id}/all-page.js
```

CS-Cartでは、全ページでJSをロードできるようにテンプレートフック`index:script`が用意されているのでこれを活用する。

まずテンプレートフックにかむテンプレート`index/scripts.post.tpl`を追加する。

```
mkdir -p  design/backend/templates/addons/{$addon_id}/hooks/index
touch design/backend/templates/addons/{$addon_id}/hooks/index/scripts.post.tpl
```

読み込まれているかを確認したいので、テンプレートの中身はデバッグ用にアラートを出すコードを差し込んでおく。

```html:scripts.post.tpl
<script>alert("OK");</script>
```

ここまでできたら画面をリロードして、アラートが出れば読み込みOK。最後に、目当てのJSがロードされるように、テンプレートを書き換える。変更を適用するには、「一般設定」→「ストレージ」→「キャッシュのクリア」をしないとならない。これが面倒な場合は、[AddonのJavaScriptをリロードで反映するようにする](http://qiita.com/suin/items/cb70e6cbf8bfe0705153)設定をしておく。

```js:scripts.post.tpl
{script src="js/addons/{$addon_id}/all-page.js"}
```

ちなみに、この`{script}`タグやAddonのJS同梱等については[CS-Cart: AddonにJSやCSSファイルを同梱する - Qiita](http://qiita.com/suin/items/ed5fda742593f317a8b0)を参照。
2016 年 1 月現在、どの IM の SKK を使うと良さそうなのか

## 前書き

SKK と一口に言ってもインプットメソッドの数だけ SKK の実装もあるため、どれを使うべきなのか初心者にはなかなか分り難く環境構築にとまどったのでまとめておきます。また近年、 Ubuntu では ibus が大変不評で fcitx がデフォルトになっているようですが SKK は必ずしもこの流行と同じではないというのも躓く原因の一つでしょう。

今回の記事の前提は以下の通りです。

- Ubuntu 15.10 (僕は Xubuntu ですが同じだと思います)

また僕の環境の特殊な事情もあるのでそれも併記しておきます。

- StumpWM 0.9.9
- Xmodmap で数字と記号を入れ替え済み

実際に試したときにどれが原因でそうなったのかというのが分らなかったので、一応 OS とバージョンを書いておきました。他の OS やバージョンを使っている場合はまた事情が違うかもしれませんので、読むときは注意してください。またここまでで分かる通り、 Windows と Mac については触れません。

## 本題

結論を言えば先に書いておいたような条件下で安定して使えたのは ibus-skk でした。これも ibus-skk を使って書いています。
以下に試したもののバージョンと雑感を書いておきます。

### scim-skk

```
scim: Version: 1.4.15-5
scim-skk: Version: 0.5.2-7.2build1
```

独特の IM と SKK でした。 IM をアプリケーションごとに設定できるなど他にはないユニークさがありました。
SKK についても他に比べて設定できる範囲が広く良かったように思います。ただ、現行バージョンは安定して動作しませんでした。
具体的にはアプリケーションを切り替える度に一切の入力を受け付けなくなることがあるという現象で、恐らくは IM 側の問題だとは思いますが(もしかしたら StumpWM との相性が悪かっただけかも?) SKK の出来がよかっただけに残念でした。

### uim-skk

```
uim: Version: 1:1.8.6-11
```

SKK を標準搭載している IM です。また設定を Scheme で書けるというのは Lisper friendly でポイントが高かったです。
日本語の情報も豊富なのでそういう意味でもお勧めできます。こちらも設定項目が豊富でした。ただ設定ファイルは euc-jp で書かなければいけないようです。
残念だったのは僕の環境下でかつ urxvt を使ってる場合に変換候補窓が左下の画面外に出てしまって、現在入力中の文字に関して視認することが出きなかったことです。変換候補窓自体は設定で位置を変更可能のはずですが、動かず使用を断念しました。

### fcitx-skk

```
fcitx: Version: 1:4.2.9-3
fcitx-skk: Version: 0.1.1-1.1
```

以前まで fcitx-mozc を使っていたので惰性で最初に試した SKK です。この SKK は他と比べると幾らか違うところがあります。
まず変換候補の選択に a,s,d,f… などを用いず、数字を使います。また、変換候補をカーソルキーで選択することは不可能です。ただ、変換候補窓はちゃんと入力中のカーソル付近に出てきてくれます(素晴らしい)。
というわけで僕の環境下では使うことが出来ませんでした。数字と記号を入れ替えている都合上、数字は Shift を押しながら入力する必要があり数字を入力すると変換が確定され入力された数字が入力されてしまうためです( Why? )。ちなみに数字と記号を入れ替えていない場合、正常に動作します。
他の SKK に比べると設定項目が少ないという印象でしたが、普通なら問題にならないかなという気がします。

### ibus-skk

```
ibus: Version: 1.5.10-1ubuntu1
ibus-skk: Version: 1.4.2-1
```

最後に辿りついた SKK です。おおよそ問題なく動きます。設定項目がやはり多くはないですが、 libskk を使っているのでそちらから設定できるようです。
ただ暗黙の確定を使ったときに入力した文字が前後することがある?みたいでそこが少し嫌なところです(例えば `[TukaTte<space>i]` -> `[い使って]` のような感じ)。

## まとめ

僕は最終的に選択肢がなかったので、 ibus-skk にしましたが StumpWM を使っていなかったり、数字と記号を入れ替えるなどしていなければ他にも選択肢はあると思います。また幾つかの問題は、 SKK 実装というよりは IM 側の問題のようにも見えるので、 SKK 実装側ではどうしようもないのかもしれないです（例えば変換候補窓が軒並揃って左下に出てくるとか、 fcitx の数字選択の問題とか)。

## おまけ

### ddskk

```
Daredevil SKK/16.0.52/mepla-20151225.2242/ (Futamata)
```

最も便利な SKK で Emacs の中から出なければ最高のインプットメソッドです。プログラム実行変換はとても便利(使いこなせれば)。

## 参考

http://qiita.com/tadsan/items/8f9f5c458451167399ae
Rails | バリデーションの値を外部から参照できるようにする

# 解決

単純な方法だが。
バリデーションの値を定数で書いてしまえば良い。


```rb
class Book < ActiveRecord::Base
  TITLE_MAXIMUM_LENGTH = 100

  validates :title, length: { maximum: TITLE_MAXIMUM_LENGTH }
end
```

# 参照

```rb
Book::TITLE_MAXIMUM_LENGTH

# => 20
```

# 改善

このままでは冗長なので。
定数宣言の返り値を使って、1行で書くようにする。

```rb
class Book < ActiveRecord::Base
  validates :title, length: { maximum: TITLE_MAXIMUM_LENGTH = 100 }
end
```

# 補足

`Book.validators_on(:title)` メソッドは配列を返すため。
特定のバリデーションの値を得るのは面倒そうだったので、この方法にした。

何か他の方法があれば教えて下さい。

# 環境

- Ruby 2.0.0
- Rails 4.0.0



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
AtCoderで特定ユーザが投稿したコードを検索するプログラムを作ってみた

# 概要
　タイトルの通りです。Ruby版の実装は私が作りましたが、その後に他の方がJavaScriptで実装してくれました。
　AtCoderが何かについては詳細を略しますが、「競技プログラミングサイトの1つ」ぐらいの認識でオーケーです。

# アルゴリズム
　AtCoderでは、自分や他人が投稿したコードを閲覧することができます。この**閲覧はログインしなくても可能**ですので、自分が書いたコードを他人に見せたい場合にはとても便利ですね。逆に、自分より上手い人のコードを眺めたい場合にも対応しています(サイトのフォーム上で条件を指定して検索できる)。
　ここで、[ある人](https://twitter.com/chiwawa_std)から、「ある特定のユーザが投稿したコードの一覧を出せないか(要約)」との声が出ました。で、その応対を眺めていますと、どうやらgetパラメータによって検索結果が制御されているようです。具体的には次の通り。
> http://abc003.contest.atcoder.jp/submissions/all
> ……AtCoder Beginner Contest(以下ABC)003における全ての一覧
> http://abc003.contest.atcoder.jp/submissions/all?user_screen_name=YSR
> ……ABC003におけるYSR氏が投稿した一覧
> http://abc003.contest.atcoder.jp/submissions/all/2?user_screen_name=YSR
> ……ABC003におけるYSR氏が投稿した一覧(2ページ目)

　ということは、当該URLを叩きつつ、中身のHTMLを解析すればお手軽に一覧が作れるはずです。構造がシンプルでしたので、解析はそれほど難しくありませんでした。

# Ruby編
```search.rb
require 'open-uri'
require 'nokogiri'

user = 'YSR' #検索したいユーザ名

1.upto(31){|i|
	url = 'http://abc' + sprintf('%03d', i) + '.contest.atcoder.jp/submissions/all?user_screen_name=' + user
	charset = nil
	html = open(url) do |f|
		charset = f.charset
		f.read
	end
	doc = Nokogiri::HTML.parse(html, nil, charset)
	nodes = doc.css('table[class="table table-bordered table-striped table-wb"] > tbody > tr')
	next if nodes.size == 0
	puts 'AtCoder Beginner Contest ' + sprintf('%03d', i)
	nodes.each{|node|
		print node.css('td > a')[0].inner_text + "\t"
		print node.css('td.table-nwb')[1].inner_text + "\t"
		print node.css('td > span').inner_text + "\t"
		puts 'http://abc' + sprintf('%03d', i) + '.contest.atcoder.jp' + node.css('td > a')[3].attribute('href').value
	}
}
```

　これを実行すると、次のように結果が表示されます。
> AtCoder Beginner Contest 003
> B - AtCoderトランプ     Ruby (1.9.3)    AC      http://abc003.contest.atcoder.jp/submissions/604223
> B - AtCoderトランプ     C++11 (GCC 4.8.1)       AC      http://abc003.contest.atcoder.jp/submissions/604215
> B - AtCoderトランプ     C++11 (GCC 4.8.1)       AC      http://abc003.contest.atcoder.jp/submissions/604213
> (中略)
> C - Brute-force Attack  C++ (GCC 4.9.2) AC      http://abc029.contest.atcoder.jp/submissions/497685
> A - 複数形      C++ (GCC 4.9.2) MLE     http://abc029.contest.atcoder.jp/submissions/497668
> B - カキ        C++ (GCC 4.9.2) AC      http://abc029.contest.atcoder.jp/submissions/497381
> A - 複数形      C++ (GCC 4.9.2) AC      http://abc029.contest.atcoder.jp/submissions/496972

#JavaScript編
　リンク先のページをご覧ください。
・[Wreulicke](https://twitter.com/wreulicke)氏が作成した版→
　http://jsfiddle.net/m8um5tpx/1/
　http://jsfiddle.net/m8um5tpx/6/
・[angel-p57](https://twitter.com/angel_p_57)氏が作成した版→
　http://jsfiddle.net/88csv9t5/1/
wordpressの管理画面用のパスワードを忘れたら

WordPressの初期設定を一通り終えて、アプリをしばらく放置
久しぶりに開いてみようかな、なんて時に

**パスワード、なんだったっけ...?**

ということが起こる。
特に初期設定ではランダムの文字列がパスワードになるから、忘れられやすいのである。

# 一番良い方法：メールに委ねる

ログインフォームの下にある「パスワードをお忘れですか?」をクリック
<img width="403" alt="スクリーンショット 2016-01-06 20.30.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/57635/13997fca-d533-e6a1-12f2-64e0588d6fd2.png">

新しいパスワードを取得するためのフォームに飛ぶので、言われるがままに登録したメールアドレスを入力して「新しいパスワードを取得」ボタンを押す。
するとWordPressからパスワード変更用のメール届き、次こそはわすれまいとメモを取るなりすればOK
<img width="392" alt="スクリーンショット 2016-01-06 20.31.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/57635/e1919b95-0e48-cda0-7294-d841b95c89d4.png">

# メールが使えりゃ苦労はしないさ

その通り。そもそもパスワード送信用のメールが使えるならこんなところに辿り着いたりなんかしない。

**「メールを送信できませんでした。
ホスティングサービス上で mail() 関数が無効になっている可能性があります。」**

この二行を突破するために躍起になって、そして挫けた人がここにやってくるのである。
ただ一つ言えることとしては、本番サーバーに上げるまでにはメールの設定をしておくに越したことはない。

# DBをそのままいじるしかない

## phpmyadminに入れる時
- 該当するDB → wp_usersにアクセスする。
- 該当ユーザー(ログイン用のユーザー)のカラムにある「:pencil2:編集」を選択
- user_passの「値」パスワード用の任意の文字を入れる
- **関数は「md5」を選択** ※ココ重要
- 「実行」

## コマンドで操作する時
該当するDBで以下のコマンドを実行

```sql
UPDATE `wp_users` SET  `user_pass` = MD5('[任意のパスワード]') WHERE  `wp_users`.`ID` = [ログインするユーザーのID];
```
Nodejsで暗号化と復号化する


### 暗号化と復号化

```js:node
var crypto = require('crypto');
var algorithm = 'aes-256-ctr';
var passphrase = "7IeZlmfz";

var encrypt = (text) => {
  var cipher = crypto.createCipher(algorithm,passphrase)
  var crypted = cipher.update(text,'utf8','base64')
  crypted += cipher.final('base64');
  return crypted;
}

var decrypt = (text) => {
  var decipher = crypto.createDecipher(algorithm,passphrase)
  var dec = decipher.update(text,'base64','utf8')
  dec += decipher.final('utf8');
  return dec;
}
```

### 確認

```js:node
console.log(encrypt("こんにちは"));
console.log(decrypt(encrypt("こんにちは")));
```


## 参考
http://lollyrock.com/articles/nodejs-encryption/
Visual Studio 入門 > youtube動画 2つ > 英語でない / 英語

Visual Studioの入門のyoutube動画

youtube動画でVisual Studioでのソフト実装を探していて、以下を見つけた。

1. ~~https://www.youtube.com/watch?v=-CwP6Zr2N_U~~
  - （おそらく）英語ではない。時々英語のフレーズを使っている
  - IDEの操作などわかりやすい
  - (追記 2017/04/19) 上記はリンク切れ
  - [こちら](https://www.youtube.com/watch?v=ULzJNoSg2Xo&list=PLUyYwyJA_WfQd5zeCU890TDFQAqboekyc)の方がいいかもしれない
2. https://www.youtube.com/watch?v=xWf_GQrymac
  - こちらは英語
  - calculatorの実装

別のIDEからの移行としてはまあまあ勉強になりそう。

<hr>
(2016/01/09 追記)

英語でない方は In Urdu と書かれているように、パキスタンあたりのウルドゥ語のようだ。