OmniAICreator/Qiita-1.07M huggingface dataset:
OracleDBのバックアップをコマンドでするときのメモ

業務でシステムを納品する際にコンティンジェンシープランとして行った時のメモです。

⑴コマンドプロンプトでSqlPlusにログイン。あらかじめ設定ファイルを作成しておき、その設定ファイルのディレクトリ上で下記のようにログインすると、設定ファイル通りに動作させることができる。
**Sqlplus UserID/Password@接続識別子　@sql設定ファイル.sql**

⑵本番環境がDBにスキーマが１つしかない状態だったので、スキーマを指定してデータをエクスポート（バックアップ）
これでディレクトリオブジェクトに指定されているフォルダ配下にdmpファイルとlogファイルが作成される。　
**expdp UserID/Password directory=ディレクトリオブジェクト schemas=hirosato logfile = hirosato_expdp.log**

⑶リカバリを実行したい時
⑵でエクスポートしたdmpファイルをインポートする。ただし前のデータが残っている場合を想定しているので、table_exists_action = replaceを指定する。これによりテーブル自体を一度削除してからインポートすることができる。前のデータが残っている状態だと正しくインポートできない。
**impdp UserID/Password directory=ディレクトリオブジェクト table_exists_action = replace logfile = hirosato_impdp.log**

table_exists_action = replaceではテーブルを削除できても、ビューやパッケージなどのオブジェクトは削除できない。それらのオブジェクトを削除するコマンドは現在impdpにはないので、きちんとリカバリを実行するのならば、ビューやパッケージを削除するdrop文を作るかスキーマ自体を一度削除してからimpdpするしかない。

＊本番環境にスキーマが１つしかない状態だったのでimpdpのスキーマ単位でデータを入れ替えるremap_schemaが使用できなかった。もちろん本番環境でスキーマ自体をdropさせてからインポートさせるわけにもいかなかった。Oracleさんには早くimpdpにオブジェクト削除機能をつけてほしい。
【修正済】Atom の Package Update で undefinedエラーが出る場合の対処法


<font color="Red">**seti-syntax が 1.1.3 に更新されたため、以下の対応は不要です。**</font>

## 現象
ATOMでPackageのUpdateを実行しようとすると、エラーが発生。
Undefinedと表示される。

## 原因
[seti-syntax](https://atom.io/themes/seti-syntax) 内に入っているapmInstallSourceが悪さしている模様。

## 対処方法
seti-syntaxをいったん削除したあと、再起動する。
まだ、seti-syntaxの更新版はリリースされていないため、再インストールすると同じ現象が発生する(と思われる)。当面はseti-syntaxを削除して様子を見た方がいい模様

## 参考
 - [seti-syntax package breaks apm upgrade mechanism · Issue #145 · jesseweed/seti-syntax · GitHub](https://github.com/jesseweed/seti-syntax/issues/145)
 - [remove apmInstallSource, fix #145 by itsnotvalid · Pull Request #146 · jesseweed/seti-syntax · GitHub](https://github.com/jesseweed/seti-syntax/pull/146)
 - [apm outdated returning undefined when seti-syntax is installed · Issue #13790 · atom/atom · GitHub](https://github.com/atom/atom/issues/13790)
 - [apm update returns undefined on Ubuntu 16.04.1 · Issue #620 · atom/apm · GitHub](https://github.com/atom/apm/issues/620)
String#gsub の第二引数にハッシュが渡せるんだった

# 動機

HTML エスケープするメソッドが作りたいとする。たとえば `Q & A` という文字列なら `Q &amp; A` に変換する。

話を簡単にするため，`&`, `<`, `>` をそれぞれ `&amp;`, `&lt;`, `&gt;` に変換すればいいということにする。

# 実装

難しくはない。

```rb
ENTITIES = {
  '&' => '&amp;',
  '<' => '&lt;',
  '>' => '&gt;'
}

def html_escape(str)
  str.gsub(/[&<>]/){ENTITIES[$&]}
end

puts html_escape("<Q&A>") #=> "&lt;Q&amp;A&gt;"
```

ちなみに，

```rb
str.gsub(/&/, "&amp;").gsub(/</, "&lt;").gsub(/>/, "&gt;")
```

みたいなやり方は効率が悪い。

# 発見

なんかのライブラリーのコードを見てたら，ちょうど HTML エスケープするメソッドが含まれてて，`String#gsub` の第二引数にハッシュを渡してた。

え？　そんなことできんの？

で，できるみたい：
https://docs.ruby-lang.org/ja/2.4.0/method/String/i/gsub.html

Ruby 1.9 からなのかあ！　知らんかった orz

もしかしたら，見たけどすぐに忘れたんかも。

# 改良

これでいいわけだ。

```rb
ENTITIES = {
  '&' => '&amp;',
  '<' => '&lt;',
  '>' => '&gt;'
}

def html_escape(str)
  str.gsub(/[&<>]/, ENTITIES)
end

puts html_escape("<Q&A>") #=> "&lt;Q&amp;A&gt;"
```

簡潔になった。

# 速度

ベンチマークをとってみよう。

```rb
require "benchmark"

ENTITIES = {
  '&' => '&amp;',
  '<' => '&lt;',
  '>' => '&gt;'
}

def html_escape_block(str)
  str.gsub(/[&<>]/){ENTITIES[$&]}
end

def html_escape_hash(str)
  str.gsub(/[&<>]/, ENTITIES)
end

iter = 200_000

string = "honyara<b>ah&oge</b>hogefugafuga"

Benchmark.bm 8 do |r|
  r.report "block" do
    iter.times{html_escape_block string}
  end

  r.report "hash" do
    iter.times{html_escape_hash string}
  end
end
```

```
               user     system      total        real
block      1.500000   0.010000   1.510000 (  1.523939)
hash       1.240000   0.010000   1.250000 (  1.268519)
```

スピードも第二引数にハッシュを渡すほうが少し速いようだ。

ただし，対象の文字列に置換すべきものがあまりないと差が出ない。まあ当たり前か。

# 余談

HTML エスケープみたいに，何か文字列の置き換えリストみたいのがあって，それに従って置換を行いたいとする。

例えば，置き換えリストが

```rb
replace_table = {
  "なんたら" => "かんたら",
  "どうたら" => "こうたら",
  # ...
}
```

のようなハッシュになっているとする。

うっかり次のようなコードを書いてしまいそうだ。

```rb
re = Regexp.new(replace_table.keys.join("|"))

some_string.gsub(re, replace_table)
```

これは，`replace_table` の内容によっては，次の二つの点でマズい。

まず，ハッシュのキーのほうにメタ文字と解釈されちゃう文字があったらダメ。だから，[`Regexp.escape`](https://docs.ruby-lang.org/ja/2.4.0/method/Regexp/s/escape.html)
 を使って

```rb
re = Regexp.new(replace_table.keys.map{|s| Regexp.escape(s)}.join("|"))
```

のように個々の文字列をエスケープしてやらなくてはならない。

もう一つの問題は，キーの中に「cat」と「catch」のように，一方が他方の先頭の一部分になっているようなペアがあったとき，出現順序に左右されるということ。

```rb
str = "catch a cat"

puts str.gsub(/cat|catch/, "*") #=> "*ch a *"
puts str.gsub(/catch|cat/, "*") #=> "* a *"
```

ようするに，Ruby の正規表現エンジン鬼雲では，他の多くのエンジンと同じく，`/cat|catch/` が `"catch"` を拾うことはないってこと。

よって，長いほうを前に出さなければならない。

だから，ちょっとめんどうだけど

```rb
keys = replace_table.keys.sort_by{|s| -s.length}
re = Regexp.new(keys.map{|s| Regexp.escape(s)}.join("|"))
```

とする必要がある。

## 追記（2017-09-13）

@taram さんのコメントにあるように，文字列の配列を与えて，それらのいずれかにマッチするという正規表現オブジェクトを得るには [`Regexp.union`](https://docs.ruby-lang.org/ja/latest/method/Regexp/s/union.html) が使えます。

エスケープまでやってくれます。

たとえば，

```rb
Regexp.union(["a+b", "a.b"]) #=> /a\+b|a\.b/
```

というように。

ただし，長いもの順に並べてくれたりはしないので，ソーティングはやってやる必要があります。

つまり，最後に書いた

```rb
keys = replace_table.keys.sort_by{|s| -s.length}
re = Regexp.new(keys.map{|s| Regexp.escape(s)}.join("|"))
```

は

```rb
keys = replace_table.keys.sort_by{|s| -s.length}
re = Regexp.union(keys)
```

と書くべきでした。わー，すっきり！
webpack2でScrollMagicのGSAPプラグインを読み込めなかった件

webpack(v2)で開発をしていて、[ScrollMagic](http://scrollmagic.io/)と[TweenMax](https://greensock.com/gsap)を使おうと思ったときに躓いてしまったのでメモ。

# npmでインストール
ScrollMagicもTweenMaxもnpmにあるのでそちらからインストール

```
npm install gsap
npm install scrollmagic
```

# 使うです
```iwanttousescrollmagic.js
import {TweenMax} from "gsap";
import ScrollMagic from "scrollmagic";

~~ 略 ~~

this.controller = new ScrollMagic.Controller();
this.targetElement = document.getElementById('#targetElement');
new ScrollMagic.Scene({
  triggerElement: '#triggerElement',
  duration: 100,
  offset: 50
})
.setTween(this.targetElement, {
  y: -100
})
.addTo(this.controller);
```
setTweenするならgsap用のプラグインを使ってねとエラー。ごもっともです。

```
(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin 'animation.gsap'. Please make sure to include plugins/animation.gsap.js
```

プラグインをインポートしてみる。

```.js
import 'scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap';
```

webpackからコンパイル失敗の旨お知らせいただいた。

```
Module not found: Error: Can't resolve 'TweenMax' in ~~~
```

TweenMaxモジュールを見つけることができなかったという内容のようだ。なんでだろう？

# imports-loaderを使って解決
resolve.alias など、いろいろ試してみたが駄目だった。
[こちら](https://www.reddit.com/r/Frontend/comments/4dshb8/new_to_webpack_problem_using_scrollmagic_gsap/)に記載されているとおりにimports-loaderを使って以下のようにプラグインを読み込むようにしたところ、正常に動作するようになった。

```.js
import 'imports-loader?define=>false!scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap';
```

imports-loaderについては[こちら](http://webpack.github.io/docs/shimming-modules.html#importing)。webpackで使用するうえで、そのままでは使えないような記述のjsファイルやサポートされていないモジュールのフォーマットで作成されたものなどを取り込むときに使用するらしい。


動いたので良かったです。
Ethereum のローカルで作った testnet のコントラクト関数の戻り値が取得できない


## どうしたらおこったのか
このようなジェネシスブロックの設定を作成

```json:genesis.json
{
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x0",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}
```

ブロックチェーンを初期化

```shell:geth-inti.sh
#!/bin/bash
geth \
  --datadir ~/test-net-ethereum \
  init ~/test-net-ethereum/genesis.json
```

browse-solidity でコントラクトをデプロイ，コントラクト関数を実行

browse-solidity JavaScript VM 設定では戻り値が得られる

browse-solidity Web3 Provider だと以下のエラー

```
Value: "0x"
Decoded: Failed to decode output: Error: Invalid offset: 0
```

## なぜおこったのか

1. Ethereumのバージョン「Homestead」のフォーク前後にデプロイされたコントラクトの呼び出しの処理が異なる
2. 最新の web3.js だと「Homestead」のフォーク後にデプロイされたコントラクトじゃないとエラーが出る
3. 上記のジェネシスブロックの設定で，初期化すると，すべてのブロックが「Homestead」前にデプロイされてた状態になる

## 対処法

```json:genesis.json
{
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x0",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {},
  "config": {
    "homesteadBlock": 0
  }
}
```

ジェネシスブロックの設定に 0ブロック以降が，「Homestead」であるという設定を付け加える

chaindata で破棄して，ブロックチェーンを初期化で正常に呼び出せるようになった


## 参考

https://github.com/ethereum/go-ethereum/issues/3653
オフラインリアルタイムどう書くE12 の問題

@Nabetani さんが主催するオフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/57434 )で問題を出させてもらいました。

問題は「積むけど消えない」という名前で、詳細は
http://mtsmfm.github.io/2017/03/04/doukaku-e12.html
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
似たような問題をもっと解きたいという方は、Doorkeeper の コミュニティページ
http://yhpg.doorkeeper.jp/
に @Nabetani さんの過去問リンク集がありますので、そちらをご覧になると良いと思います。
Markdown記法について

# はじめに
最近初めてMarkdown記法に触れて感動した。
PCでメモ取る癖がある人なら、適当に取るだけのメモにも互換性があるためかなりおすすめ。
Markdown書けるってだけでGithubやQiitaで精力的に活動しているように見える。
今回は一旦Markdownでそれっぽい記事を書いてみるのが目的。

# Markdownとは?
* テキストを記載する際の形式
* HTMLを簡略化したようなもの
* 簡単に書けることを第一にしているデザイン(であるように感じる)

# 良いところ
* 見栄えが良い
* 手間がかからない
* 汎用性が高い
    * 様々なサービスで使用可
        * Qiita
        * はてなブログ
        * Github
        * Gmail (要Chrome拡張機能)  
        etc...
* **書いたものがきれいな形になっただけで気持ちがいい！！！**

# 使用方法
素晴らしくまとまった記事があるので参照
[Markdown記法 サンプル集](http://qiita.com/tbpgr/items/989c6badefff69377da7)

## 上記資料への補足
### 改行
スペース2個以上を挿入することで改行する。

#### 記入例
```
* リスト
    * スペースを挿入していないので改行しない
    上記の行の続きになる
    * スペースを挿入しているので改行する  
    上記の行の続きにならない
```

#### 表示例
* リスト
    * スペースを挿入していないので改行しない
    上記の行の続きになる
    * スペースを挿入しているので改行する  
    上記の行の続きにならない

以上。
Cyberduckを使ってAWS S3にファイルアップロードを行う手順（Mac編）

説明用に、ファイルアップロードを行う手順のみをまとめました。


## 前提
S3へのアップロードが可能な
* アクセスキーID
* シークレットアクセスキー
が手元にある

## 1. Cyberduckをダウンロード
https://cyberduck.io/index.ja.html?l=ja

## 2. 接続先設定を行う

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/3475b1a5-eb79-c782-d282-6d69b132cc91.png)

「新規接続」 から
* 最上部のプルダウンは「S3（Amazon シンプルストレージサービス）」を選択
* 「アクセスキーID」
* 「シークレットアクセスキー」
を設定して「接続」をクリック


以下のような画面が表示されれば接続成功。
ここにファイルをドラッグアンドドロップすればファイルアップロードができる。

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/6cb871cc-de83-2ad7-4e12-758592308f96.png)

## 3. ブックマークとして保存

2回目以降はすぐに接続できるように、
「アクション」（歯車のアイコン） → 「新規ブックマーク」
でブックマークとして保存する。
わかりやすいように「ニックネーム」には任意の名称をつけておくと良い。

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/c3b36331-ea10-0cee-a325-fdc415b1ecce.png)
Raspberry Pi のコードはAWS CodeCommitからpullする

#今回の趣旨
WinSCP等でコードをRaspberry Piへコピーするのはイケてない。。
GitHubのプライベートリポジトリを使用したいが有料だし。。
ということで、AWS CodeCommitを使ってみようという趣旨です。

#AWS CodeCommitのメリット
利用条件によっては、GitHubのプライべートリポジトリより費用が安いです。
https://aws.amazon.com/jp/codecommit/pricing/



#構成はこんな感じ

![CodeCommit.png](https://qiita-image-store.s3.amazonaws.com/0/146154/84e57b71-85b3-b2c0-4abc-2e83831691a9.png)



#利用条件
- Gitが使える
- AWSアカウントを持っている
- インターネットにつながっているPCがある
- Raspberry Piもインターネットにつながっている
- PCからsshでraspberry piへ接続ができる
- とりあえず使うのは自分だけ

#構築方法
- AWS CodeCommit上に空のリポジトリを作成
- PC上にAWS CodeCommit上の空のリポジトリをcloneする
- 必要なコードをPC上からAWS CodeCommit上のリポジトリにpushする
- Raspberry PiからAWS CodeCommit上のリポジトリをcloneする

```
#git clone https://git-codecommit.us-west-2.amazonaws.com/v1/repos/xxxxxx
#cd xxxxxx
```


##運用方法
- PCでコード修正したらAWS CodeCommit へ git push。修正分が更新される。
- Raspberry Piでgit pullすることで差分が反映される。






#RaspberryPiでAWS CodeCommitリポジトリデータを読み込むためにID,PASSWORDを設定

毎回入力を省略したい場合は以下を設定する。

```
#vi ~/.netrc
machine git-codecommit.us-west-2.amazonaws.com
login xxxxxxxxxxxx
password xxxxxxxxxxxx
```

#最後に
AWS CodeCommit上でのリポジトリ構築方法とリポジトリへのアクセス方法や、PCとRaspberry PiのローカルGitについての説明は今回は割愛させていただきました。機会があれば追記していきたいと思っています！


-
jsdoでヒートマップ　その４

#概要
jsdoでヒートマップやってみた。
leafletで表示してみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/S/D/Y/SDYn.jpg?t=1488608116)


#成果物
http://jsdo.it/ohisama1/SDYn
Vagrantに構築した環境へPHPStorm + Xdebug でデバッグする

できそうでできなくて苦労したのでメモ。

# 環境
PHP:7.0.9
Xdebug:2.4.1
PHPStorm：2016.2.2

# 前提
Vagrantの仮想環境にApache、PHP、Xdebugはインストール済み

# Vagrant（の仮想環境）
CentOSで試しましたが、特にOS依存はないです、たぶん。

## php.ini
Xdebug用の設定値を追記します。他にも設定値がありますが、とりあえず動けばいいや的な。
`[xdebug]
zend_extension=/opt/remi/php70/root/usr/lib64/php/modules/xdebug.so ; Xdebugモジュールのパス
xdebug.remote_enable=On
xdebug.remote_autostart=On
xdebug.remote_host=192.168.33.1 ;デバッグ接続するPCのIPアドレス
xdebug.remote_port=9000
xdebug.idekey="PHPSTORM"` ; PHPStormとのセッションクッキー名

# PHPStrom側の設定
こっちの設定がけっこう手こずりました。
PHPStorm -> Preferences から設定します。
##### Languages & Frameworks > Debug
* Debug Port  
デフォルト9000番でよいです。php.iniのxdebug.remote_portと合わせる必要があります
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/25351/0debabb7-1298-524e-64ce-90addb924921.jpeg)

##### Languages & Frameworks > Servers
「+」からサーバを追加します。

* Name  
適当でよいです
* Host  
デバッグ対象のURL
* Absolute path on the server  
Vagrant上のプロジェクトのパスを選びます。デフォルトは空欄なので、セレクトボックスから絶対パスを選択します
![スクリーンショット_2017-03-04_13_31_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/25351/f0593375-6ca4-672f-1465-1dce59eeb6d5.jpeg)

##### メニューのRun > Edit Configurations
左上の「+」から、「PHP Remote Debug」を選択し、設定を追加します

* Name  
適当でよいです

* Servers  
さっき作成したサーバ情報を選択します

* ide key  
"PHPSTORM"を指定します


![スクリーンショット_2017-03-04_13_45_50.jpg](https://qiita-image-store.s3.amazonaws.com/0/25351/f2a590bf-4af5-6979-399a-7539b6e69acf.jpeg)


# デバッグ
![スクリーンショット_2017-03-04_14_21_43.jpg](https://qiita-image-store.s3.amazonaws.com/0/25351/64a3b50e-5414-053d-3892-77e9159ae615.jpeg)
右上の電話の受話器マークを有効にして（緑っぽくする）URLにアクセスすると、ブレークポイントでめでたく停止。
こちらからは以上です
Illustratorで形状を指定してオブジェクトを作成することはできるが、作成された形状から値を取得する方法はないのでしょうか？

標題通りですが、
Illustratorで形状を指定してオブジェクトを作成することはできるが、作成された形状から値を取得する方法はないのでしょうか？

![WS001.JPG](https://qiita-image-store.s3.amazonaws.com/0/122812/ea047d7d-a221-299a-9e9a-ed128083722c.jpeg)

作成する場合、

| Illustratorツール       |method|
|:-----------------|:------------------|
| 長方形ツール|pathItems.rectangle()|
| 角丸長方形ツール|pathItems.roundedRectangle()|
| 楕円形ツール|pathItems.ellipse()|
| 多角形ツール|pathItems.polygon()|
| スターツール|pathItems.polygon()|
| フレアツール|？ |

引数に座標やサイズを入れれば作成はできますが、作成された形状から rectangle などの値を取得する方法はないのでしょうか？
色々と調べましたが見つけられませんでした。。。

```javascript:getShapeProperty.jsx
var doc = app.activeDocument,
    sel = doc.selection;
alert(sel[0].typename);
```

typename だと全て PathItem が返ってきます。

参考にしたサイト
[ADOBE ILLUSTRATOR CC 2017 SCRIPTING REFERENCE: JAVASCRIPT](http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/illustrator/sdk/CC2017/Illustrator_JavaScript_Scripting_Reference.pdf)
macOS + Rails5 + sqlite3環境でのrails consoleでActiveRecord利用時エラー

rails consoleでActiveRecord利用すると以下のようなエラーが見られました。

```
irb(main):001:0> User.first
/Users/katsuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/sqlite3_adapter.rb:27: [BUG] Segmentation fault at 0x00000000000110
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]

-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:
     * ~/Library/Logs/CrashReporter
     * /Library/Logs/CrashReporter
     * ~/Library/Logs/DiagnosticReports
     * /Library/Logs/DiagnosticReports
   for more details.
Don't forget to include the above Crash Report log file in bug reports.

-- Control frame information -----------------------------------------------
c:0065 p:---- s:0284 e:000283 CFUNC  :initialize

・・・
```

## 環境
macOS Sierra 10.12.3
Rails 5.0.0.1
sqlite 3.14.0

gem
`gem 'sqlite3', '1.3.11'`

## 解決方法1
`gem 'sqlite3', '1.3.11'`
を
`gem 'sqlite3', '1.3.13'`
(1.3.13以上)にしましょう。

## 解決方法2
どうしても`gem 'sqlite3', '1.3.11'`のまま利用したい場合はこちらの方法を利用してください。

①`bundle config build.sqlite3 --with-sqlite3-dir=$(brew --prefix sqlite3)`を実行
②`bundle install`をやり直します。

### bundle config build.sqlite3について
`bundle config build.sqlite3 --with-sqlite3-dir=$(brew --prefix sqlite3)`
を実行すると

`~/.bundle/config` に
`BUNDLE_BUILD__SQLITE3: "--with-sqlite3-dir=/usr/local/Cellar/sqlite/3.17.0"`
の行が追加されます。よって、もとに戻したい場合は、追加された行を削除すれば元に戻ります。  

また、
`bundle config build.sqlite3 --with-sqlite3-dir=$(brew --prefix sqlite3)`
を実行せずに上記の行をアプリケーションのディレクトリの`.bundle/congig`に追加することで、アプリケーションでの`bundle`でだけ設定が反映させることも可能です。

## 参考
https://github.com/sparklemotion/sqlite3-ruby/issues/195
http://qiita.com/hmuronaka/items/88fb04e347a59d509e10
http://qiita.com/emahiro/items/ec3a875dbc671651d4c4
http://ruby.studio-kingdom.com/bundler/bundle_config/
Whenever【自分用】

Railsで定期的にバッチ回す「Whenever」
http://qiita.com/yumiyon/items/388fbb84450f49a6ab0d


Command not found
http://stackoverflow.com/questions/9482298/rails-cron-whenever-bundle-command-not-found

###更新コマンド

```
bundle exec whenever  --update-crontab
```


##SSHKit::Runner::ExecuteError: Exception while executing as

【deploy.rb】

```
set :whenever_roles, :batch # 対象のロールを指定

```
VSCode使いがKobitoを使わないでQiitaの投稿をバックアップする

## バックアップする方法について調査
Qiitaに投稿した記事をバックアップしようと思って調べたところ、この記事を見つけました。
[Qiitaの投稿をGitHubにバックアップ - Qiita](http://qiita.com/cognitom/items/a98dffc4b1ad095898b1)
しかし、この記事ではKobitoを使っていることが前提になっていました。

Kobitoを使っていたこともあるんですが、Windows版とMac版で微妙に使い勝手が違うのといつも使っているテキストエディタを使いたいのとで使うのをやめました。
Visual Studio CodeにはMarkdownのプレビュー機能が備わっているので、今はQiitaの記事を書くのにも使っています。

Kobitoを使えばローカルのデータがQiitaと同期されるので、同期してからローカルデータをバックアップするだけで済みますが、Visual Studio Codeの場合はそうはいきません。


## 別の方法を考える
ローカルとの同期ができないので、Qiitaのサイトにある記事をバックアップするしかありません。とりあえずローカルにバックアップをダウンロードできればよしとしましょう。

### HTMLでバックアップする方法
Chromeの拡張機能にSingleFileというのがあります。
これを使うとウェブページを画像なども含めてHTMLとして保存することができます。
[SingleFile \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle)

![2017-03-04 13.24.45.gif](https://qiita-image-store.s3.amazonaws.com/0/37701/db761150-cfec-b28f-8102-39339fbca9bb.gif)


### Markdownでバックアップする方法
編集画面に入ればMarkdownを表示できるのでそれをテキストとしてコピーする方法がありますが、さすがに面倒だなと思っていたらMarkdownだけを表示する方法がありました。URLの最後に".md"を追加するとMarkdownが表示されるので、あとはそれをそのままダウンロードするだけです。
[Qiitaの投稿をMarkdown表示にする方法 - Qiita:Support](http://help.qiita.com/ja/articles/qiita-show-raw-body)

![2017-03-04 13.31.17.gif](https://qiita-image-store.s3.amazonaws.com/0/37701/798a59e8-9977-fa09-1173-454b014804e6.gif)


## 最後に一言
Visual Studio CodeにQiitaと同期する拡張機能があれば最高なんだけど。
pythonで __new__() を使いdictから特定のクラスのインスタンスを作成する方法

pythonで `__new__()` を使ってdictから特定のクラスのインスタンスを作成できる場合がある。たまに便利かもしれない。定義されている `__init__()` を迂回してインスタンスを作成する方法。

## 普通のインスタンスの作成方法

以下の様なクラスが定義されているとする。

```python
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return "{self.__class__.__name__}({self.name}, {self.age})".format(self=self)
```

通常は以下の様に直接引数として値を渡して初期化する。

```python
p = Person("foo", 20)
print(p)
# Person(foo, 20)
```

## dictからの変換

dictからインスタンスを作りたい場合はこういうふうに書ける。

```python
d = {"name": "foo", "age": 20}
p = Person.__new__(Person)
p.__dict__.update(d)
print(p)
Person(foo, 20)
```

## `Person(**d)` で十分じゃない？

先程の様な例なら `Person(**d)` でもdictのデータを用いてインスタンスを生成できる。これで十分なのでは？

そうでもない事がある。例えばテスト用のデータを作る時などに計算済みの値で直接初期化したい場合がある。こういうクラスで色々と邪魔な計算が入った状態で__init__()が定義されていて、その計算を迂回し直接値を指定してインスタンスを初期化したいみたいな状況。

```python
class X(object):
    def __init__(self, d):
        self.y = foo(d)
        self.z = boo(d)
```

### 詳細

`__new__()` はクラスをcallableオブジェクトとして利用した時に、オブジェクトの生成に使われる。

1. `__new__()` でオブジェクトの生成
2. `__init__()` でオブジェクトの初期化

また、オブジェクトのインスタンス変数自体は `self.__dict__` に格納されている。このため、`__new__()`によるオブジェクトの生成だけを行い後で `__dict__` を更新するということができる。


## 注意

当然だけれど、 `__init__()` は呼ばれないので注意。

```python
class X(object):
    def __init__(self, d):
        self.x = foo(d)
        self.y = boo(d)
        raise RuntimeError("hmm")


x = X.__new__(X)
x.__dict__.update({"y": 10, "z": 20})
print(x, x.y, x.z)
# <__main__.X object at 0x10f7e4f28> 10 20
```
rails5でルーティングのprefixを変更したい

以下は[ドキュメント](http://railsdoc.com/routes)に書いてある部分の転載


### RESTfulなURLを自動生成

```
resources :pages
#     pages GET    /pages(.:format)          pages#index
#           POST   /pages(.:format)          pages#create
#  new_page GET    /pages/new(.:format)      pages#new
# edit_page GET    /pages/:id/edit(.:format) pages#edit
#      page GET    /pages/:id(.:format)      pages#show
#           PUT    /pages/:id(.:format)      pages#update
#           DELETE /pages/:id(.:format)      pages#destroy
```


### prefixをmain_pageにする
```
resources :pages, :as => :main
# main_index GET    /pages(.:format)          pages#index
#            POST   /pages(.:format)          pages#create
#   new_main GET    /pages/new(.:format)      pages#new
#  edit_main GET    /pages/:id/edit(.:format) pages#edit
#       main GET    /pages/:id(.:format)      pages#show
#            PUT    /pages/:id(.:format)      pages#update
#            DELETE /pages/:id(.:format)      pages#destroy
```

簡単なことなのになかなか見当たらなかったので、メモ程度に残しておく
Json Web Token作成方法

## WHY

使った方が良い理由は下記で

[Go 言語で JWT を使って認証と認可を低コストに](http://qiita.com/nirasan/items/1d5a2527a5384c863aa3)

## HOW

ここでは具体的な作成方法について記述します。（RS256の認証方式で作成します。）

1: Json WEB Tokensを下記で作成します。

![スクリーンショット 2017-03-04 12.24.02.png](https://qiita-image-store.s3.amazonaws.com/0/10496/64dafb13-d057-edb1-db3a-f5b7d11a7074.png)

下記にアクセスします。

[JSON WEB Tokens](https://jwt.io/)

ALGORITHMSで"RS256"を設定します。

2: 認証用に必要な鍵の作成

下記の方法でRS256方式の鍵を作成します。

```
ssh-keygen -t rsa -b 4096 -f jwtRS256.key
# Don't add passphrase
openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub
```

private key

```
jwtRS256.key
```

public key

```
jwtRS256.key.pub
```

3: 鍵の設定と必要な値の設定

![スクリーンショット 2017-03-04 12.35.55.png](https://qiita-image-store.s3.amazonaws.com/0/10496/0b624674-69cd-9cb5-6c32-e8d594d99077.png)

下記の部分に先ほど作成した`public key`を下記の部分にコピーします。

```
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----
```

下記の部分に先ほど作成した`private key`を下記の部分にコピーします。

```
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
```

4: JWTトークンに設定する値を下記で設定

ここでは認証用のトークンに含めたい情報を下記に追加します。

![スクリーンショット 2017-03-04 12.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/10496/d3f2f391-b8ff-15f5-ff51-6198fa500a24.png)

よく設定する値が下記

apiのドメインを設定

```
"iss": "https://jwt-idp.example.com"
```

apiのサブドメインを設定

```
"sub": "mailto:mike@example.com"
```

JWTが有効になる日時を示す

```
"nbf": 1454503213(UNIXタイムで指定)
```

JWTが有効になる日時を示す

```
"exp": 1490667232(UNIXタイムで指定)
```

JWTを発行した時刻を示す

```
"iat": 1454503213(UNIXタイムで指定)
```

Unixタイムを発行は下記のサイトが便利です。

http://url-c.com/tc/

5: JWT トークンの確認

左側にJWTトークンができているので

![スクリーンショット 2017-03-04 12.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/10496/79b1ed12-ae04-feb2-74bc-f344d3962dba.png)

下記で正しくできているか確認します。

![スクリーンショット 2017-03-04 12.43.32.png](https://qiita-image-store.s3.amazonaws.com/0/10496/c123e824-a7c9-6065-3021-d7cfa25885eb.png)

以上でトークン作成手順は終了です。
これでサクッと認証しましょう！！
初心者向け ターミナルの色を変更する方法


## 概要
- ターミナルはデフォルトだと、背景の色が白、文字が黒となっています。
- せっかくプログラミングをやるなら、映画で見たことあるような背景が黒、文字が白のターミナルを使いたいですよね。

## 手順
- ターミナルを開きます。
- 「環境設定」を選択します。

![スクリーンショット 2001-01-01 11.11.33.png](https://qiita-image-store.s3.amazonaws.com/0/142810/6e4f9895-2340-b688-1d31-6316a0c17ab7.png "スクリーンショット 2001-01-01 11.11.33.png")

- 「プロファイル」を選択します。

![スクリーンショット 2001-01-01 11.11.58.png](https://qiita-image-store.s3.amazonaws.com/0/142810/ce5ee621-7371-343a-bfdb-b4dbd6a1d58f.png "スクリーンショット 2001-01-01 11.11.58.png")

- 「Pro」を選択し、ダブルクリックします。

![スクリーンショット 2001-01-01 11.12.19.png](https://qiita-image-store.s3.amazonaws.com/0/142810/e8fe6df0-4881-90b5-1ba1-09a91892f8b5.png "スクリーンショット 2001-01-01 11.12.19.png")

※ ダブルクリックした時、名前変更になってしまうと適用されないので注意します。

- 画面に色が変更されたターミナルが表示されます。

![スクリーンショット 2001-01-01 11.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/142810/502a9abb-90cf-0b84-bc5c-aaf234f5fb35.png "スクリーンショット 2001-01-01 11.23.05.png")

- 以上で、ターミナルが変更されました。
【対処法】Ansibleの初回接続エラー（Ansible2.2, CentOS7.2）

# はじめに
ansible-playbookコマンドを実行する際に、対象サーバーとSSH接続したことがないとエラーが出ます。これはOpenSSHのチェック機能によるものみたいです。 

# 前提
検証OS:　CentOS7.2
Ansible:　version2.2


# 回避方法


1.　Ansible実行サーバーにログインし、rootにsu

2.　ansible.cfgの[ssh_connection]セクションを編集（285行目にありました。）

```
# vi /etc/ansible/ansible.cfg

下記設定に変更
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
```

ちなみに、デフォルトでは下記のようになっています。

```
[ssh_connection]
#ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s

```

3.　Ansible実行し、エラーが出なければ完了！！

```
例
# ansible-playbook -i /ansible/hosts /ansible/start.yml --private-key=/ansible/keys/ansible_key.pem
```
長い文字列がセルを突き抜ける


古い業務システム改修で起きたので軽くメモ

##原因
・ブラウザ上で日本語と英数字の挙動が違うため。
・日本語は一文字単位で改行ポイントがあるが、英数字は一単語から改行されるから。
**→つまり連続した長い数字、英文字列がセル内にあると改行するポイントが見つからずに突き抜ける。**

##対処法
・テーブルセル幅を固定して、文字列折り返しを指定する。
・なんかIE11でも未だに`overflow-wrap`が効かないみたい。

```
/* テーブル幅固定 */
.table-box {
    table-layout: fixed;
    width: 100%;
}

/* 表示文字列を折り返す */
.table-box td {
    word-wrap: break-word; /* IE11用 */
    overflow-wrap: break-word;
}
```

参考先
http://qiita.com/n_s_y_m/items/cb29d730e63772b02475
https://w3g.jp/blog/confusing_word-break_word-wrap
http://8cmp.blog.fc2.com/blog-entry-43.html
Rails　よく使うクエリはmodelの中にscopeを書こう

対象者

- Controller、Viewの中にクエリが増えすぎて見づらくなってきた人
- 同じようなクエリを色んな所で書いててDRYじゃないんじゃないかと感じる人

#問題
- 複雑なクエリがController、Viewにあると可読性が悪くなる
- 別のControllerに同じクエリを書く必要がある

##問題のController
```rb:sample_controller.rb

def index
  @arrival_books = Article.where(category_name: "book",
                                 created_at: 1.weeks.ago..Time.now)
  @tokyo_user = User.where(area: "tokyo", status: 0)
end
````

こんな感じのクエリが増えてくととても使いづらい。
よく使うクエリはモデルにscopeを使って切り出すと良い。

#modelにスコープを書くとこう↓

```rb:models/article.rb

scope :arrival_books, -> do
    where(category_name: book,
          created_at: 1.weeks.ago..Time.now)
end
```

```rb:models/user.rb
scope :tokyo_users, -> {where(area: "tokyo", status: 0)}
```

#結果
↓こんな風に呼べるようになりました！

```rb:sample_controller.rb
def index
  @arrival_books = Article.arrival_books
  @tokyo_users   = User.tokyo_users
end
```
クエリが複雑になればなるほど使いやすくなるので使ってみてください
 
#ちなみに、where区を追加することもできる

```rb
hoge_arrival_books = Article.where(user_id: "hoge").arrival_books
```


#値を渡すこともできる
```rb
sample_user = User.first
Article.ariival_books(sample_user)
```

```rb:article.rb
#sample_userを使ってクエリの条件を書ける
scope : arrival_books, ->(sample_user) do
    where(category_name: book,
          created_at: 1.weeks.ago..Time.now,
          user_id: sample_user.id)
end
```
初心者向け ターミナルに表示されるホスト名を変更する方法

## 概要
- ターミナルを表示した時、左側にやたらと長く、かつダサい名前が表示されると思います。
- これを変更することでスッキリし、かつカッコ良い表示にします。

![スクリーンショット 2001-01-01 9.42.00.png](https://qiita-image-store.s3.amazonaws.com/0/142810/c35023f7-c3b0-b61c-8195-48b3001af6ad.png "スクリーンショット 2001-01-01 9.42.00.png")

## 手順
- マックのアイコンから、「システム環境設定」を選択。

![スクリーンショット 2001-01-01 9.42.39.png](https://qiita-image-store.s3.amazonaws.com/0/142810/6965c494-05f0-f97f-9642-baf349bf731b.png "スクリーンショット 2001-01-01 9.42.39.png")

- 「共有」を選択。

![スクリーンショット 2001-01-01 9.43.00.png](https://qiita-image-store.s3.amazonaws.com/0/142810/b2c1f2ea-2927-393a-c5d9-5e11e49f8337.png "スクリーンショット 2001-01-01 9.43.00.png")

- 編集を選択。

![スクリーンショット 2001-01-01 10.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/142810/063f7afe-a64e-88f1-909b-5654d93b6597.png "スクリーンショット 2001-01-01 10.15.44.png")


- こちらをお好みの名前に変更し、OKを選択します。

![スクリーンショット 2001-01-01 10.16.00.png](https://qiita-image-store.s3.amazonaws.com/0/142810/e4b0112b-b0ec-f622-87e0-7ff058159d96.png "スクリーンショット 2001-01-01 10.16.00.png")

- 「共有」の画面で赤マルの部分が変更され、これがホスト名として表示されます。

- ![スクリーンショット 2001-01-01 10.15.44のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/142810/3ef95fe0-2257-8c2c-0505-c9cdacb7d1bb.png "スクリーンショット 2001-01-01 10.15.44のコピー.png")

- 変更したら、そのまま「共有」を閉じます。
- また、ターミナルも閉じます。

![スクリーンショット 2001-01-01 9.44.36.png](https://qiita-image-store.s3.amazonaws.com/0/142810/616a9b80-2592-b465-e5cc-08654c1a4acd.png "スクリーンショット 2001-01-01 9.44.36.png")

- 再度、ターミナルを起動します。


![スクリーンショット 2001-01-01 9.45.12.png](https://qiita-image-store.s3.amazonaws.com/0/142810/49bfdb34-59bd-c662-e4c0-45720a4b0517.png "スクリーンショット 2001-01-01 9.45.12.png")

- これでターミナルに表示されるホスト名が変更されました。

## まとめ
- 手順としては、非常に簡単なので、さっと変更することをおすすめします。
Railsのバージョンを指定してinstallする方法


チュートリアルを試す為にRailsのバージョン落とす必要があった。
忘れそうなので方法をメモしておく。

## 環境
・rbenvでrubyを管理している
・rubyは`ruby 2.3.1`を使用している

## railsのバージョン確認

今回は`Rails 4.1.1`を使用する。普段は`Rails 5`を使用しているのでダウングレードする必要がある。

### 現在のバージョン確認

```bash
% rails -v                                                                                                                                                                                     
Rails 5.0.1
```

### 使用できるバージョン一覧を確認

```bash
% gem list rails                                                                                                                                                                               

*** LOCAL GEMS ***

rails (5.0.1, 4.2.6, 4.2.5, 4.1.6)
```

## Rails 4.1.1のダウンロード
該当バージョンがないようなのでインストールする。

```bash
gem i -v 4.1.1 rails

#iはinstallの略
```
### 再びバージョンを確認

ちゃんと追加されたみたい。

```bash
% gem list rails                                                                                                                                                                               

*** LOCAL GEMS ***

rails (5.0.1, 4.2.6, 4.2.5, 4.1.6, 4.1.1)
```

## Rails 4.1.1のアプリを作成
以下のコマンドでアプリを作成する。

```bash
rails _4.1.1_ new awesome_events
```

### アプリを確認してみる

期待していたバージョンでrailsアプリが作成された。

```bash
^_^  ~/dev/projects/awesome_events
% rails -v  
Expected string default value for '--rc'; got false (boolean)
Rails 4.1.1
```

###  エラーが出ている

`Expected string default value for '--rc'; got false (boolean)`というエラーが出ている。設定ファイル(?)内に記述している期待していたデフォルト文字列が`false`になってしまっているよとの事。どうゆう事でしょう。

色々調べてみると以下。

Railsをバージョンダウンすると、`Rails 5`時にinstallしていたgemが、今回の`Rails 4.1.1`とバージョンが合わない為に発生するエラーらしい。

参考：[http://qiita.com/motty93/items/ad39f2f632a7d8b3b442](http://qiita.com/motty93/items/ad39f2f632a7d8b3b442)

## とりあえず成功

現状、`rails s`してサーバーを起動しても問題が起きている様子はないので、とりあえず無視します。依存関係のエラーが出たら何とかする予定。

### 補足：素敵なまとめがありました

[Railsチュートリアルでrails newするときはバージョンを指定しよう](http://qiita.com/jnchito/items/f3bde6e46afbeba8cb82)
タブを選択した時にシンプルなアニメーションを追加する


![20170303.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/763a5fa5-b471-78ca-a0d8-165527afb106.gif "20170303.gif")


UITabBarItemをUIViewにキャストします。

```

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        
        
        let v = item.value(forKey: "view") as! UIView
        
        v.echo()
    }


```

アニメーションは別ファイルで実装する方法を最近知りました。
ソースが見やすくなっていいですね。


```Animation.swift

import UIKit

extension UIView {


   func echo() {
 
 		// CABasicAnimationを実装してCALayerに追加する
     }
    
    
}

```

ソースはこちら。[AnimatedTabBarSample](https://github.com/rnsm504/AnimatedTabBarSample)


####参考
[RAMAnimatedTabBarController](https://github.com/Ramotion/animated-tab-bar)
超使いやすいです。
BLEのスループットの理論値

BLEのスループットの規格上の最大値について調べました。

4.0/4.1、4.2、5におけるBLEのスループットの規格上の最大値

| version | thurouput |
|:-:|:-:|
| 4.0/4.1  | 0.305 Mbps |
| 4.2  | 0.803 Mbps  |
| 5    | 1.43 Mbps  |

スループットの最大値は、規格書に記載されている PHYレートと最大ペイロード長と最小転送単位時間から求めることができます。

```
スループットの最大値 = 最大ペイロード長　/ 最小転送単位時間
```

最小転送単位時間は、データの転送から、ACKを受信して、次のデータを送信できるまでの時間です。下記で計算します。

```
最小転送単位時間 = 最大ペイロード転送時間 + IFSの時間(150us) + ACK(10octets)の受信時間 + IFSの時間(150us)
```

最大ペイロード転送時間 はペイロードにプリアンブル 1octet、アクセスアドレス 4octets、ヘッダ 2octets、MIC 4octes、CRC 3 octetsを足して、bitsに換算してから、PHYレートで割ると算出できます。


# Bluetooth各バージョンでの実効スループット導出

## Bluetooth 4.0 / 4.1

最大ペイロード長 27 Octets
最大ペイロード転送時間 (1 + 4 + 2 + 27 + 4 + 3) * 8 / 1 Mbps = 328 us
最小転送単位時間 (328 + 150 + 80 + 150) us

```
27 * 8 bits                  216 bits  
-----------------------  = ----------- = 0.305 bit/us = 0.305 Mbit / sec
328 + 150 + 80 + 150 us      708 us
```

## Bluetooth 4.2

Bluetooth 4.2で最大ペイロード長が27から251に拡張されました。

最大ペイロード長 251 Octets
最大ペイロード転送時間 (1 + 4 + 2 + 251 + 4 + 3) * 8 / 1 Mbps = 2120 us
最小転送単位時間 (2120 + 150 + 80 + 150) us

```
251 * 8 bits                  2008 bits  
------------------------  = ------------ = 0.803 bit/us = 0.803 Mbit / sec
2120 + 150 + 80 + 150 us      2500 us
```

## Bluetooth 5

Bluetooth 5で2MbpsのPHYが追加されました。
2Mbpsの場合はプリアンブルが2octetsになります。

最大ペイロード長 251 Octets
最大ペイロード転送時間 (2 + 4 + 2 + 251 + 4 + 3) * 8 / 2 Mbps = 1064 us
ACKの転送時間 11*8/2 Mbps = 44 us
最小転送単位時間 (1060 + 150 + 40 + 150) us

```
251 * 8 bits                  2008 bits  
------------------------  = ------------ = 1.43 bit/us = 1.43 Mbit / sec
1064 + 150 + 44 + 150 us      1408 us
```

# 参考
* http://web.archive.org/web/20161005050714/http://www.konure.com/it/2014/12/bluetooth-42.html
* https://blog.bluetooth.com/exploring-bluetooth-5-how-fast-can-it-be
コレクション変数の命名規約

##コレクション変数の命名規約
コレクション変数名については、コレクションを複数系、その要素を単数形にするという規約がある。ただし、英語で複数形にすると、単純にsをつけるだけではない場合、問題が発生する。実際に以下のようなコードを見たことがある。

```csharp
       internal void Main()
        {
            // 各機能で呼び出す共通データ取得処理(私が書いたもの)
            var entities = GetData();
            // 機能担当者が書いたコード
            foreach (var entitie in entities)
            {
            }
        }

        /** 共通処理からデータを取得する。 **/
        private List<Entity> GetData()
        {
            var entities = new List<Entity>() { new Entity() { ID = 1, Name = "1" } };
            return entities;
        }

        /** 共通処理で生成するエンティティクラス **/
        private class Entity
        {
            internal int ID { get; set; }
            internal string Name { get; set; }
        }

```

私が書いた共通処理のコードの下から機能担当者にforeachを書いてもらった結果、sを消してentitieという変数名にしている。また、最悪なことにforeachは各機能で書く必要があったためコピーでentitieが量産されてしまった。3ヶ月ぐらいentitieが気になったため、こっそり修正した。

一方、単純なスペルミスではあるものの、この問題は「日本人」が書いていることに起因しているとは思う。英語のスキルは個人によって差があるので-es, -sなどの使い分けができない人も想定するべきである。

##問題点を踏まえた後の命名規約
次のプロジェクトではsをつけるだけの規約にする。
間違えもおきにくい上、foreachループ内での変数の対応関係が明確である。
entities=>entityよりはentitys=>entityのほうが可読性は高くなる。

コレクションの命名規約を周りはどうしているのか気になるところである。
３パターンのいずれかだと思う。
1. 厳密な複数形(-es,-s)と単数形にする。
2. 複数系は単数形にsをつけるだけにする。
3. 自由

```csharp
        internal void Main()
        {
            // 各機能で呼び出す共通データ取得処理(私が書いたもの)
            var entitys = GetData();
            // 機能担当者が書いたコード
            foreach (var entity in entitys)
            {
            }
        }

        /** 共通処理からデータを取得する。 **/
        private List<Entity> GetData()
        {
            var entitys = new List<Entity>() { new Entity() { ID = 1, Name = "1" } };
            return entitys;
        }

        /** 共通処理で生成するエンティティクラス **/
        private class Entity
        {
            internal int ID { get; set; }
            internal string Name { get; set; }
        }

```

##追記 2017/03/11
この結論に至った経緯が必要と考えたので、追記する。

###コレクション変数名に英語の複数形(s,es)を使用する利点
コレクションを複数形にすることは違和感がない上、変数名にListなど型情報を持たないので、型が変わったとしても変数名を変える必要がない。

例えば、変数名に型名をつける場合(...Listや...Dictなど)、コレクションの型変更が発生すると、すべて書き換えることになる。
ここの問題を回避できるのであれば、コメントいただいた変数名に型名をつける規約でも良い。

###コレクション変数名にsをつけるだけに変更した経緯
元の記事に書いている通り、複数形が分からずに間違えるプログラマがいるので規約を単純化した。プロジェクトの質を下げるような規約だが、そもそもプロジェクトメンバーの質が低いので、低いレベルに合わせないと仕事が回らない。
コードレビューで指摘して全て修正させるべきだという意見をいただいたが、メンバーの質が低すぎて、不可能な状況となっている。
大半のメンバーが規約の半分以上を守ることすらできないので、守れる規約にせざるを得ない現状がある。

###プロジェクトメンバーの質と規約
[別の記事](http://qiita.com/csharpisthebest/items/90f040ad52c213bd0d64)に書いたとおり、コードレビューの指摘では直らない人たちの集まりになっている。
また、製造期間のみの期限つきであるため、育てるという選択肢はない。そもそも
規約が守れないことが多く、コードレビューは規約違反が多すぎて、危ういロジックを拾うことができない。

今回はコレクション変数名について記事にしているが、例えばbool型の変数名では過去分詞や形容詞が分からないプログラマもいるので、同じような問題が発生する。
妥協できる規約にできればそうしたいものの、なかなか良い案はない。

##追記 2017/12/16
いろいろと検討した結果、コメントにいただいた「コレクションは...List」にするという案は良いかもしれない。ListであろうとDictinaryであろうと全て「...List」にするのはスペルミスも大幅に減り、プロジェクトメンバーへの負担が低い気がする。
普通はList型が圧倒的に多いことを考えれば、一番守りやすい規約になり得る。
(当初、型を変数につけるという話だと思ってしまったので、私の返信コメントが的外れな内容になっている)

[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)
bash > 任意の列数を持つファイルから3ステップずつ項目を抽出する実装 / $@: 全ての引数項目を渡す / set, Brace Expansionを使う

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

[PNM > ppmファイル > 1行に出力されるRGB値はファイルによって異なるようだ > １行70文字制限](http://qiita.com/7of9/items/d1477e4b7687de7fe3d6)
で見つかったppmファイルのBlue成分読込みの失敗。

任意の列数を持つファイルから3ステップずつ項目を抽出する実装が必要だ。

bashで実装した。

```bash:read_with_step_exec_170304
#!/usr/bin/env bash

extract_column() {
	((cnt=1))
	for aword in $@;do
		mdl=$((cnt % 3))
		if [ $mdl -eq 1 ];then
			echo $aword
		fi
		((cnt++))
	done	
}

list=$(cat $1 | tr '\n' ' ')
#echo $list # for debug

clm=$(extract_column $list)
echo $clm
```

```sample.dat
1 2 3 4
5 6 7
8 9 10 11
```

```txt:実行
$ bash read_with_step_exec_170304 sample.dat 
1 4 7 10
```


### 学習事項
 
- bashでの全ての引数項目の渡し方 ($@)
   - 参考 [Propagate all arguments in a bash shell script](http://stackoverflow.com/questions/4824590/propagate-all-arguments-in-a-bash-shell-script)

### 補足
(追記 2017/03/10)

@hasegitさんの記事
[bashで文字列分解する時、cutやawkもいいけど、setの方が早い](http://qiita.com/hasegit/items/5be056d67347e1553f08)
のset使用と@magicantさんのコメントのread使用も気になる。

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

@hasegitさんの[コメント](http://qiita.com/7of9/items/70c247752a5249855593/#comment-b77c7f6600fa6678742c)にてsetとBrace Expansionを使った方法を紹介いただきました。Brace Expansionというのは使い慣れていませんが、便利そうです。
情報感謝です。

それを元に、自分でも試してみたのが以下のコードです。
(cutを新たに使っています)

```bash:test_read_170311_exec
#!/usr/bin/env bash

set $(cat $1 | tr '\n' ' ')
pos=$(eval echo {1..${#}..3} | tr ' ' ',') # e.g. 1,4,7
echo $@ | cut -d ' ' -f $pos
```

```txt:結果
$ bash test_read_170311_exec sample.dat 
1 4 7 10
```

補足: posの行をsetの上に持って行くと失敗します。
第8世代Kindle(無印)をjailbreakしたけどscreensaverを無効にできないので何とかしてみた

[ドイツ語の本読んでみ・・](http://soranoji.air-nifty.com/blog/kindle/index.html)さんの見よう見まねで第8世代Kindle(無印)をjailbreakしてみたが、
KUALに不具合があるようでscreensaverやUSBNetworkなどがうまく機能しないようだ。
screensaverを無効にしたいがためにjailbreakしたのでどうにかしたい。
ktermは問題なく利用できるのでそれを使って実現してみた。

KUALからktermを起動し、下記コマンドを実行するとscreensaverが無効になる。

`# lipc-set-prop com.lab126.powerd preventScreenSaver 1`

でもKindleを再起動するとまた有効になるので、起動時に自動的に無効になるようUpstartを使う。

`# mntroot rw`
`# cd /etc/upstart`
`# vi preventScreenSaver.conf`

```shell-session
start on started lab126
stop on stopping lab126

script
    sleep 2
    lipc-set-prop com.lab126.powerd preventScreenSaver 1
end script
```

`# initctl reload-configuration`
`# initctl list | grep preventScreenSaver`

```shell-session
preventScreenSaver stop/waiting
```

`# reboot`

これでできるはず。
/etc/upstart/testd.conf を参考に preventScreenSaver.conf を作りました。
/etc/upstart を探ると、きっといろんなことができるはず。
GoogleSpreadSheetで同じ日のデータを一つのセルにまとめて表示する

# 前置き
よくある要望だと思うんですよ。たとえバッドノウハウだとしても。

# 本題
たとえばこんな感じのデータがあったとします。宿題の提出期限を示した表なのですが。

表:source

| date   | subject  |
|:-------|----------|
| 2017/3/2|数学|
| 2017/3/2|社会|
|2017/3/3|英語|
|2017/3/4|国語|
|2017/3/5|理科|
|2017/3/5|英語|


データ構造としてはこれで正しいんですが、世間一般の人が読むには直感的ではないです。次の表のようにスペースやカンマでつないで一つのセルにまとめてしまうのが一般的ではないでしょうか

表:work

|date|subjects|
|:---|--------|
|2017-3-2|数学 社会|
|2017-3-3|英語|
|2017-3-4|国語|
|2017-3-5|理科 英語|

表計算ソフトは帳票ツールじゃないってこと百も承知の上で。

# 実装

dateが任意の年月日の行を抽出するには[QUERY](https://support.google.com/docs/answer/3093343?hl=ja)を使います。

```
QUERY(データ, クエリ, [見出し])

=QUERY(A:B, "SELECT *")
=QUERY(A:B, "SELECT * WHERE B = '英語'")
```

検索キーが日付の場合、注意が必要です。dateを修飾することで日付フォーマットで記述された年月日の文字列を日付型に変換して抽出してくれます。

```:work!cell.b2
=QUERY(source!$A$2:$B, "SELECT B WHERE A = date'2017-3-5'")
```

今回は任意の年月日を条件とするので、セルを参照しなければなりません。クエリでセルを参照するには次のようにします。

```:work!cell.b2
=QUERY(source!$A$2:$B, "SELECT B WHERE A = '"&a2&"'")
```

単純に文字列を&で結合すればいいんですね。


ただし、検索キーは日付型なので、このやり方では上手く行きません。ユーザからは伺い知ることができませんが、セルの日付データは数値で管理されています。日付を日付として扱うには、次のように変換してやります。

```:work!cell.b2
=QUERY(source!$A$2:$B, "SELECT B WHERE A = date '"&TEXT(A2,"yyyy-mm-dd")&"'")
```

もう一つ注意点として、年月日の区切りはハイフンを使います。日本人にはおなじみのスラッシュ区切り(例:2017/03/02)では動きません。

最後にクエリーの結果を結合して、一つのセルに収まるようにします。

```:work!cell.b2
=join(" ",QUERY(source!$A$2:$B, "SELECT B WHERE A = date '"&TEXT(A2,"yyyy-mm-dd")&"'"))
```

クエリの結果が空の場合、エラーとなるので対処しましょう。

```:work!cell.c2
=IFERROR(B2, "なし")
```

# 結論
[シートにした結果がこちらになります](https://drive.google.com/open?id=1EfcLKZ9ceFLh08lXvQyCV9kM_dVt-LDuOTjQDaPujbw)

workシートには余分な情報が含まれますので、印刷する時はviewシートを使います。この表をGoogleDocに転送すれば、ちゃんとした印刷物になります。

期待どおりの表ができましたね。
ソフトウェア開発現場での集合知


---------------------------------------

# ソフトウェア開発現場で使われている

---------------------------------------

# 集合知を活用した見積もり手法を紹介

---------------------------------------

# 正解よりも合意形成を重視する一例として

---------------------------------------

# プランニング・ポーカー

---------------------------------------

# アジャイルソフトウェア開発で使われている工数見積もり手法の一つ

---------------------------------------

# 紙のカードを使って、1~2週に一度実施されるカジュアルな手法

---------------------------------------

# James Grenningが考案

---------------------------------------

# Mike Cohn「アジャイルな見積もりと計画づくり」で有名に

---------------------------------------

# 広域デルファイ法が元になっている。

---------------------------------------

# やり方

---------------------------------------

# 1.プロジェクトを小さな作業単位に分割する。

---------------------------------------

# 例) twitterっぽいサイトをつくる

- ログインしてツイート一覧が見れる
- つぶやき投稿できる
- 検索できる
- リツイートできる

---------------------------------------

# 2. 基準となる作業を選ぶ

---------------------------------------

# (「例: 検索ページをつくるのに5かかると仮定する」)

---------------------------------------

# 3. 開発チームのメンバーは、それぞれフィボナッチ数(1,2,3,5,8,13) の書かれた札をもつ。

---------------------------------------

# 4. 1で分解した作業をひとつ選び、メンバーに内容を説明

---------------------------------------

# 5. 合図で、基準の作業にくらべてどれくらいの量かを考えて札を出す。

---------------------------------------

# 6. もし出した数字がばらばらの場合、お互い判断した理由を話し合う
 
---------------------------------------

# 7. 全員の札がある程度収束するまで繰り返す。

---------------------------------------

1. プロジェクトを小さな作業単位に分割する。
2. 基準となる作業を選ぶ
3. 開発チームのメンバーは、それぞれフィボナッチ数(1,2,3,5,8,13) の書かれた札をもつ。
4. 1で分解した作業をひとつ選び、メンバーに内容を説明
5. 合図で、基準の作業にくらべてどれくらいの量かを考えて札を出す。
6. もし出した数字がばらばらの場合、お互い判断した理由を話し合う
7. 全員の札がある程度収束するまで繰り返す。

---------------------------------------

# 集合知なのか?

---------------------------------------

# エンジニア向け導入説明時に、

---------------------------------------

# 群衆の叡智の説明について説明がなされる。

---------------------------------------

# 例）

---------------------------------------

 『アジャイル・サムライ』 で

---------------------------------------

# ジェームズ・スロウィッキー「みんなの意見は案外正しい」

---------------------------------------

# 雄牛の重量宛てが紹介されている

---------------------------------------

# 元のデルファイ法や予測市場との比較

---------------------------------------

# 予測結果の精度を重視

---------------------------------------

# プランニング・ポーカー

---------------------------------------

# 見積もりの差の理由を議論することで、情報共有を目指す

---------------------------------------

# 予測主体の独立性は重視されない

---------------------------------------

# 取引回数

---------------------------------------

# 1作業についき、数回の取引(投票と市場の中間)

---------------------------------------

# 1週間から2週間に1回(1~2時間程度)開催される。

---------------------------------------

# かなり日常的に使用される

---------------------------------------

# 他の手法との共通点

---------------------------------------

# 参加者の多様性が重要だと説明される

---------------------------------------

# 専門家だけでなく、実際に作業する人が見積もる

---------------------------------------

# 参考資料
http://kawaguti.hateblo.jp/entry/20120218/1329524230

---------------------------------------
vncserver構築メモ

・前提条件
　サクラのVPS
　CentOs7.2
　ローカルOSはMac
　リモート側のユーザー:centos
以下作業

#rootでログイン
ssh root@***.***.***.***

#デスクトップ環境のインストールとVNCサーバ導入、および全体アップデートしリブート
yum -y groupinstall "GNOME Desktop" "Server with GUI" ;yum install tigervnc-server -y ;yum update -y ;reboot

#起動状態監視
ping ***.***.***.***

#rootで再度ログインしVNCユーザ追加
ssh root@***.***.***.***
useradd centos;passwd centos
#ユーザーパスワードを二回入力
Password: ＊＊＊＊＊＊
Verify: ＊＊＊＊＊＊

＃VNCサーバのユーザ定義作成と定義の再ロード
cp /usr/lib/systemd/system/vncserver@.service /usr/lib/systemd/system/vncserver@:1.service
sed -ie "s/<USER>/centos/g" /usr/lib/systemd/system/vncserver@:1.service
systemctl daemon-reload

#centsoにユーザチェンジ
su - centos

#centsoでVNC接続する際のパスワードを二回入力
vncpasswd
Password: ＊＊＊＊＊＊
Verify: ＊＊＊＊＊＊

#centsoでログイン時にデスクトップ起動定義作成
cd ~/.vnc/;touch xstartup;chmod +x xstartup;echo "#! /bin/sh " >> xstartup;echo "gnome-session & " >> xstartup;cat xstartup

#rootにログアウト
exit

#firewallにVNCサーバ追加
firewall-cmd --permanent --zone=public --add-service=vnc-server
firewall-cmd --permanent --list-all
firewall-cmd --reload

#VNCサーバ自動起動追加
systemctl start vncserver@:1.service;systemctl is-active vncserver@:1.service;systemctl enable vncserver@:1.service;systemctl is-enabled vncserver@:1.service

#ログイン時の認証デバック
echo "X-GNOME-Autostart-enabled=false" >> /etc/xdg/autostart/gnome-software-service.desktop;echo "X-GNOME-Autostart-enabled=false" >> /etc/xdg/autostart/gnome-settings-daemon.desktop;reboot
PNM > ppmファイル > 1行に出力されるRGB値はファイルによって異なるようだ > １行70文字制限

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

http://qiita.com/7of9/items/1a04107f8af1e38e3969
にて気になった以下について調べた。

> csvファイル出力時のカンマの数がおかしい。

2つの異なる単語をそれぞれ画像化したppmファイルを比べた。

```tmp.ppm.idx4
...
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
```

```tmp.ppm.idx5
...
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 173 216 230 
173 216 230 173 216 230 173 216 230 
```

最後の行の項目数が異なる。
以下でもチェックしてみた。

```
$ head -n 100 tmp.ppm.idx5  | wc
    100    1870    7221
$ head -n 100 tmp.ppm.idx4  | wc
    100    1858    7197
```

100行目までの項目数が1870と1858で異なる。

http://netpbm.sourceforge.net/doc/ppm.html
> No line should be longer than 70 characters.

１行が70文字を越さないように出力しているのかもしれない。
TensorFlowのRNN/LSTMで為替の推移（時系列データ）を学習するコードを書いた

http://qiita.com/yukiB/items/f6314d2861fc8d9b739f

を参考に、TensorFlowのRNN/LSTMで為替推移の学習をするコードが書けた。精度が出るかはまだ不明。

https://github.com/ryogrid/fx_systrade/blob/f8c16333955a0089f55dfed0ad4cbd2adafe5d09/lstm_exchange_regression.py
Node.jsファイル操作

Nodejsでファイルを扱う時には、fsモジュールを使う。

var fs = require('fs');

ファイルの書き込み方法

fs.writeFile('書き込みたいファイル名','書き込む文字','エンコード','イベントハンドラ');

イベントハンドラは省略可能

ファイル読み込み方法

fs.readFile('読み込むファイル名','エンコード','function(err, data){
});

文字列を指定したい場合

createReadStreamを使用する
createReadStream(path,{プロパティ名：値、プロパティ名：値....});
⚠︎createReadStreamは値を返します
なので
var crs=createReadStream(path);
{}部分は省略可能です

read.jsの中身
var fs = require('fs');
//startは文字列のどの部分からを指定する　endは文字列の終了を表す。
var rs = fs.createReadStream('./read.txt',{encoding:'utf-8',start:1,end:3});
rs.on('data',function(read){
  console.log(read);
});

とします

terminalを開いて echo hello > read.txt と書く
次に node read.js とすると　ell　と表示される
Rubyのcoverageを使ってスクリプトのどの行が何回実行されたか調べる

Rubyには[coverage](https://docs.ruby-lang.org/ja/latest/library/coverage.html)という標準ライブラリが存在しており、これを使用することでRubyのスクリプトを実行したときに、どの行が何回実行されているかを確認することが出来ます。FizzBuzzのコードを例に説明します。


```ruby:fizzbuzz.rb
1.upto(100) do |n|
  if n % 3 == 0 && n % 5 == 0
    puts 'FizzBuzz'
  elsif n % 3 == 0
    puts 'Fizz'
  elsif n % 5 == 0
    puts 'Buzz'
  else
    puts n
  end
end
```

計測を行うコードですが `Coverage.start` で計測を開始して、`Coverage.result` で集計結果を取得することが出来ます。取得した値は `[ファイルのパス, 各行の実行回数]` の配列の形式で保存されています。


```ruby:coverage.rb
require 'coverage'

Coverage.start
require_relative 'fizzbuzz'
result = Coverage.result

result.each do |filepath, count_list|
  puts '-' * 80
  count_list.zip(File.readlines(filepath)).each do |count, line|
    puts "#{count.to_i.to_s.rjust(10)}: #{line}"
  end
  puts '-' * 80
end

```

実行するとこんな感じで表示されます。

```
# FizzBuzzの実行結果
.
.
.
--------------------------------------------------------------------------------
         1: 1.upto(100) do |n|
       100:   if n % 3 == 0 && n % 5 == 0
         6:     puts 'FizzBuzz'
         0:   elsif n % 3 == 0
        27:     puts 'Fizz'
         0:   elsif n % 5 == 0
        14:     puts 'Buzz'
         0:   else
        53:     puts n
         0:   end
         0: end
--------------------------------------------------------------------------------
```

fizzbuzz.rbを実行したときに、どこが何回実行されたかを確認することが出来ました :smile:


## 参考サイト

https://docs.ruby-lang.org/ja/2.4.0/library/coverage.html
[JAWS-UG 磐田] EC2インスタンスの削除

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 EC2編 #1
###ＥＣ２インスタンスは、AWS マネジメントコンソールを使用して削除します。
**コンソールを使用してインスタンスを削除するには**
**１．**[Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/)を開きます。
- - -
**２．**ナビゲーションペインで [インスタンス] を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/168665/841a935e-c6cd-e1c5-68f0-97cbf790c695.png)
- - -
**３．**インスタンスを選択し、[アクション]、[インスタンスの状態]、[削除] の順に選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/168665/8a07e912-dacc-32d7-1c20-c26e28a861fd.png)
- - -
**４．**確認を求めるメッセージが表示されたら、[はい、削除する] を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/168665/f39c092a-1573-7724-28b0-78c2af0b0e5e.png)
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/terminating-instances.html