OmniAICreator/Qiita-1.07M huggingface dataset:
チーム開発 GitHubの使い方

# GitHubとは？
* ソフトウェア開発プロジェクトのための共有ウェブサービスであり、Gitバージョン管理システムである。
* GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供している。
* GitHubは最もポピュラーなGitホスティングサイトとなった。
* こちらが公式サイトです
    * https://github.com/

# チーム開発でGitHub 使い方の流れ
1. まず、リードプログラマーがプロジェクトの**リボジトリ**を作成
2. そのリボジトリを各プログラマーが**fork**する。
3. プログラマーは、forkしたリボジトリを**clone**する。
    * git clone https://github.com/ユーザー名/リボジトリ名.git
4. cloneしたリボジトリの.gitに**fork先**のGitURLを追加
    * コマンド) git remote add リモート名 https://github.com/リードプログラマーのユーザー名/リボジトリ名.git
5. 作業用**branch**を作成。
    * コマンド)  git checkout -b (branch名)
6. リボジトリで各プログラマーは開発をスタートする。
7. 1タスクごとに**commit**していきましょう。
    * git add フォルダー or ファイル名
    * git commit -m "タスク名" 
8. ある程度commitがたまったら、GitHubに **push** する。
    * コマンド) git push origin master  
9. pushしたら、リードプログラマー宛てに**PullRequest**を送ります。
10. PullRequestを送るときに、注意する点があります。
    * 右上らへんに自動的にマージできる(緑色) か 手動でマージする(灰色)のどちらかが出る。
    * 自動的にマージの場合
        * そのまま送れます。
    * 手動マージの場合
        * 競合が起こっているので、リードプログラマーが大変になるのでこれは送らないでください。
        * どうするかというと、fork先のGitURLに対してpullをしてあげましょう。
        * 最新版と自分の作業をマージしてくれます。
        * もう一度PullRequestを送りましょう。
11. PullRequestを送る際に何を実装したかのメッセージを書きましょう
    * 他人でもわかるようなメッセージを書いていきましょう。
12. リードプログラマーは、送られたきたPullRequestをメッセージにあったことを実装しているかどうかを確認した上でマージしましょう。


これらがチーム開発で必要な流れです。


# 終わりに
* チーム開発で一番大変なコード統合は、Gitを使うことで自動的にしてくれるので、開発効率が上がります。
* 週一程度でプログラマー同士でコードレビューもしていきましょう！
標準モジュールのあれこれ


## 標準モジュールのリストを出す
ご存知 `corelist`

```shell-session:
$ corelist -v 5.21.7

The following modules were in perl 5.21.7 CORE
AnyDBM_File                                  1.01
App::Cpan                                    1.62
App::Prove                                   3.34
App::Prove::State                            3.34
...
```

以下の様に、標準モジュールに含まれるかどうかの確認に使う

```shell-session:
$ corelist lib::core::only

Data for 2014-12-20
lib::core::only was not in CORE (or so I think)
```

## 標準モジュールのパスを表示する。
常識なのだが、年寄は物忘れしがちなので、、、

### lib::core::only

`local::lib` と一緒に入ってくる。

```shell-session:
$ perl -Mlib::core::only -le 'print for @INC'
${HOME}/.anyenv/envs/plenv/versions/5.21.7/lib/perl5/5.21.7
${HOME}/.anyenv/envs/plenv/versions/5.21.7/lib/perl5/5.21.7/darwin-2level
```

### Config

標準モジュールだけで確かめるなら[^1]

[^1]: 上の `lib::core::only` のソースを見れば分る事だけど。

```shell-session:
$ perl -MConfig -le 'print for @Config{qw(privlibexp archlibexp)}'
```
コマンドラインから、ユーザの削除



### いる事を確認
```shell-session:
$ /usr/bin/dscl . -search /Users name username
username		dsAttrTypeNative:name = (
    username
)
```

### 削除

```
$ sudo /usr/bin/dscl . -delete "/Users/username"
```

### いない事を確認

```
$ /usr/bin/dscl . -search /Users name username
```

### ユーザーを隠す

ファーストユーザースイッチとかに現われない様にする

```
$ sudo dscl . create /Users/hiddenuser IsHidden 1
```

https://support.apple.com/en-us/HT203998
MacでChromeのダウンロード先を/tmpに変更する



Macを使っているとDownloadフォルダにファイルが大量に溜まりがちになるので自動的に削除されるようにしたい。

[こちら](http://www.lifehacker.jp/2013/01/130130clean_old_downloads.html)を参考にダウンロード先を/tmpに指定しようとしたものの、Chromeの設定画面からはルートディレクトリが参照できない。

ホームディレクトリに/tmpへのシンボリックリンクを作成して解決。


```
ln -s /tmp Tmp
```
Ruby の prime モジュールと自作のエラトステネスのふるいを benchmark で比較する


Ruby には prime モジュールが用意されています。prime モジュールを使うと簡単に素数を求めることができます。

ここでは、自作のエラトステネスのふるいのアルゴリズムを用いたプログラムと、prime モジュールでどれくらい速度に差がでるかを benchmark で計測してみたいと思います。

(追記) `test_eratosthenes2` を追加しました。一番外側のループは sqrt(n) までで止める方法の場合、`test_eratosthenes` の n までループする方法よりかなり速くなりました。
zakuro9715 さん、ありがとうございます！

```ruby:
require 'prime'
require 'benchmark'

def test_prime(n)
  a = Prime.each(n).to_a
  a.size
end

def test_eratosthenes(n)
  primes = [2] # 素数リスト
  tab = [true] * n
  (3..n).step(2).each {|i|
    if tab[i]
      primes << i
      (i+i..n).step(i).each {|j|
        tab[j] = false
      }
    end
  }
  primes.size
end

def test_eratosthenes2(n) # test_eratosthenes より高速
  tab = [true] * n
  (3...(Math.sqrt(n).to_i)).step(2).each {|i|
    if tab[i]
      (i + i..n).step(i).each {|j|
        tab[j] = false
      }
    end
  }
  a = [2].concat (3..n).step(2).select {|i| tab[i] }
  a.size
end

N = 10_000_000
Benchmark.bm(12) do |x|
  x.report('prime') { test_prime(N) }
  x.report('eratosthenes')  { test_eratosthenes(N) }
  x.report('eratosthenes2') { test_eratosthenes2(N) }
end
```

実行結果です。

```bash:
                   user     system      total        real
prime          1.330000   0.050000   1.380000 (  1.395049)
eratosthenes   2.730000   0.050000   2.780000 (  2.783461)
eratosthenes2  1.760000   0.030000   1.790000 (  1.803994)
```

## 環境

- OS X 10.10.2
- Ruby 2.2.2

## 参考

- [Benchmarkモジュール](http://docs.ruby-lang.org/ja/2.2.0/class/Benchmark.html)
文字操作 JAVA

#正規表現

| 構文        | 説明 |
|:-----------|------------:|
| [a-z]      |        This |
| [^a-zA-Z]  |      column |


| 構文        | 説明 |
|:-----------|------------:|
| \d         |数字 |
| \D         |数字以外 |
|\s|空白文字(スペース、タブ)|
|\S|非空白文字|
|\w|文字|
|\W|文字以外[^a-zA-Z0-9_]と等価|

|||
|:-----------|------------:|
|.|任意の文字|
|^|行の先頭|
|$|行の末尾|
|\b|単語境界　空白、タブ、カンマ、|
|*|直前の文字が0以上|
|+|直前の文字が1以上|
|?|直前の文字が0,1|
|||論理演算子のOR|
文法コメント

プログラムを作成している際に、ひとつの文をコメントにしたいケースがある。
テキストエディタの機能を使ってブロックコメント化することも考えられるが、プログラム言語の機能として文単位でコメントにする方法を考えたい。

```
if( a == 0 ){
  print('zero');
}
```

のようなif文があった場合に、

```
#if( a == 0 ){
  print('zero');
}
```

などと書くと、if文全体がコメント化されるような記法があると便利なのではないか。
「WordPressをはじめよう！」勉強会に参加した

# 勉強会の基本情報
* 【日　時】2015年4月25日 15:30~17:30
* 【会　場】埼玉県越谷市レイクタウン8-11-1 レイクタウンオークラビル4F
* 【参加費】500円
* 【主　催】コワーキングスペース HaLake(ハレイク)
* 【申し込み】https://halake.doorkeeper.jp/events/22907

# 概要
* wordpressとは
* WordPressの概要と事例
* ドメイン申請とレンタルサーバに環境構築
* 投稿と固定ページの使い方を中心とした管理画面の使い方
* テーマ（サイトデザイン）の変え方、PCとスマートフォンへの対応方法
 * 時間すぎなので、「PCとスマートフォンへの対応方法」が紹介されなかった
* プラグインで機能拡張しよう

# 内容
### wordpressとは
* CMS - [コンテンツマネージメントシステム](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)
* ブログ作成だけでなく、企業サイトも作成できる
* オープンソース
 * [フリーダウンロード](https://ja.wordpress.org/)
 * [ライセンス： GPL](https://ja.wordpress.org/gpl/)
* [プラグインがおおい](https://wordpress.org/plugins/)
* [利用者多い](http://wisdommingle.com/wordpress-is-worlds-best-blog-software/)
* プログラム
 * 言語：PHP
 * DB：mysql

* メトッリ
 * 独自ドメイン、アカウントをコントロールできる
 * 意図しない広告入らない
 * 文書、写真のデータを自分で管理できる
 * サービス停止なし：　例えば、無料のブログが停止される可能性がある
 * 自由にデザインや機能を追加：　テーマ、プラグイン

### WordPressの概要と事例
* ブログ
 * 記事を作成、検証、公開の権限が分かれる　ー　workflow承認
 * 例：[管理者、編集者、投稿者、寄稿者、購読者の違い](http://www.adminweb.jp/wordpress/user/index5.html)
 * http://www.magical-remix.co.jp/magicalog/archives/3113
* 企業のサイトとしても
 * wordpressで作られるサイトの特徴
 * htmlソースを見て、wp-contentがあること
* 観光のサイトが多い、例えば：[南三陸の観光](http://www.m-kankou.jp/)
 * プラグインを追加した：　イベントカレンダー（ajax envent calendar）、天気、スライドショー
* 有名人のサイト

### ドメイン申請とレンタルサーバに環境構築
* ドメイン
 * http://muumuu-domain.com/から、申請できる
* レンタルサーバー
 *  http://heteml.jp/
* 料金
 * ドメイン＋レンタルサーバ：3000~4000円/月

### 投稿と固定ページの使い方を中心とした管理画面の使い方
* 設定
 * キャッチフレーズの修正が忘れないように
* パーマリンク
 * ブログのURL
 * 変更したら、元々のURLが存在しない
 * 公開前に、決めましょう
* 画処理：　サムネイル、中(400*400)、大(600*600)の三段階
* 投稿と固定ページ
 * 投稿利用範囲：　ブログ、新着ニュース
 * 固定ページ利用範囲：　自己紹介、会社概要
* ユーザ権限
 * [管理者、編集者、投稿者、寄稿者、購読者の違い](http://www.adminweb.jp/wordpress/user/index5.html)

### テーマ（サイトデザイン）の変え方
* ダウンロードできる - https://wordpress.org/themes/
* カスタマイズもOK
* 自作もOK: http://kachibito.net/wordpress/theme-development-flow.html
* メニューをカスタマイズで調整できる

### プラグインで機能拡張しよう
* [プラグイン](https://wordpress.org/plugins/)
* よく利用されるプラグイン
 * SNS: wP total hacks

# 感想
* wordpressの利用範囲がわかった
* 触ってみて、ブログやサイトを作ることが、簡単だ
* 運用や保守についての情報がすくない
* 高速化できたけど、静的なページと動的なページを分けて、管理することが課題かな
Microsoft Azureを使ってWordPressの高速化をハンズオン形式で実体験しよう！勉強会に参加した

# 勉強会の基本情報
* 【日　時】2015年4月20日 19:00 - 21:45
* 【会　場】東京都港区港南 2-16-3 品川グランドセントラルタワー 日本マイクロソフト株式会社セミナールーム
* 【参加費】無料
* 【申し込み】https://enterprise-wordpress.doorkeeper.jp/events/22839

# 概要

* WordPress構築ハンズオン
* WordPress高速化 On Azureの説明
* WordPress高速化 On Azureのハンズオン

# 内容

### WordPress構築ハンズオン
* Microsoft Azureとは
 * http://azure.microsoft.com/ja-jp/overview/what-is-azure/
 * IaaS, PaaS, BaaS... なんでもOK感じサービス
* 管理ポータルへのログイン
 * https://manage.windowsazure.com/
 * ![スクリーンショット 2015-04-26 11.01.30.png](https://qiita-image-store.s3.amazonaws.com/0/13451/4a9f65ca-f3f7-b450-a2a0-e688280a90fb.png)
* ストレージアカウントの作成
* WordPress + Apache 仮想マシンの作成
* WordPress + nginx 仮想マシンの作成


### WordPress高速化 On Azureの説明
* http://www.prime-strategy.co.jp/へアクセスして、hmtlファイルの開ける時間は、0.017sぐらい
* WordPressのパフォーマンスは、高速化するとはどういうことか？
 * HTMLページのロード時間を短くして１秒
 * あたりのリクエスト数を増やすこと
* HTMLページのロード時間を分解すると、以下の経過がある
 * リクエスト送信
 * 実行：　PHP処理、Mysql処理、翻訳
 * レスポンス受信
* 高速化対応
 * D1インスタンスを利用
 * 仮想マシンD1インスタンスにAPC（PHPアクセラレータ）導入
 * MySQLのクエリキャッシュ導入
 * 翻訳キャッシュ導入
 * Apache（mod_php）からNginx+HHVM構成に変更
 * ページ圧縮（gzip）導入


### WordPress高速化 On Azureのハンズオン
* WordPressのインストール
* 翻訳キャッシュの有効化・ベンチマーク
* ページキャッシュの有効化・ベンチマーク


# 会場について
* 日本マイクロソフト株式会社セミナールーム
* ![IMG_1494.JPG](https://qiita-image-store.s3.amazonaws.com/0/13451/5256b306-7729-cc7c-98f3-ae79ef3642b8.jpeg)
* ドリング無料
 * ![IMG_1485.JPG](https://qiita-image-store.s3.amazonaws.com/0/13451/390dafe5-599e-5b53-7041-8143d72be800.jpeg)
 * ![IMG_1486.JPG](https://qiita-image-store.s3.amazonaws.com/0/13451/24886aa7-795f-c4a8-d787-8fa2a8a28b90.jpeg)
* 品川オフェィス
 * ![IMG_1498.JPG](https://qiita-image-store.s3.amazonaws.com/0/13451/6f44e94c-95ae-3e15-bf5f-9cea4cdb214e.jpeg)
Arduino IDE 1.6.3で8pinoにスケッチを書き込む

8pinoにスケッチを書き込む場合、[8pino公式サイト](http://8pino.cc/)では、Arduino 1.0.5 for Trinketの利用を紹介されていますが、8pinoでもArduino IDEの最新版を使いたいなと思っていたところ、[ドンピシャの記事](http://qiita.com/odaki/items/27ae946d26cc2436167e)を見つけたので試してみました。

# 結論

下記より「Arduino 1.6.3 with Adafruit Boards for Mac OSX(10.7+)」よりダウンロード、インストールするだけでした。
https://learn.adafruit.com/adafruit-arduino-ide-setup/arduino-1-dot-6-x-ide

Arduino IDEを起動し[ツール]-[ボード]を確認すると、「Adafruit Trinket 8MHz」が表示されるようになっていました。(8pinoは、厳密いうとAdafruit Trinket 8MHz互換なので)
![arduino163.png](https://qiita-image-store.s3.amazonaws.com/0/4779/c12e3bc3-36cb-5794-f5ab-1cbe245dbbd4.png "arduino163.png")

後は[ツール]-[書込装置]として「USBtinyISP」を選択し、書き込みたいスケッチに対して「検証」「マイコンボードに書き込む」をすると、書き込み完了です。

# ハマりポイント

実は1箇所だけハマりました。
上述の記事では、下記linkが先に紹介されており、ここで紹介されている3つのパッケージを「Boards Manager」からinstallしていたところ、上述の「Arduino 1.6.3 with Adafruit Boards for Mac OSX(10.7+)」をinstallしても、[ツール]-[ボード]で「Adafruit Trinket 8MHz」が表示されませんでした。
https://learn.adafruit.com/adding-custom-boards-to-the-arduino-v1-6-board-manager

「Boards Manager」から下記パッケージをRemoveすることで、「Adafruit Trinket 8MHz」が表示されるようになりました。
* Adafruit AVR Boards
* ESP8266
* Arduino Leonardo & Micro MIDI-USB
マルチプラットフォームを意識しつつC言語でファイルを消す

#️ 注意

以下は明らかに危険な処理なので、各自よく調べてから使ってください。
貴重なデータを一瞬で消し去る可能性が高いので。（自戒）

# 背景

とある画像処理に関連するmrbgemsでの実装をいかにサボるかで、
こっそり中間ファイルを作って処理を行っているが、
中間ファイルって消さないとバレる

# C言語でファイルを消す

Linuxだとうろ覚えでunlikなるAPIがあった気がするが、
OSXやWindowsなどのことを考えるとちょっと不安。

```C
#include <stdio.h>

remove("./tmpimagefile.png");
```

ベタな名前でした。

下のリンクにもあるようにunlinkはPOSIXだから、
結構汎用性高そうだった。

# Link

- [Remove file in C++ under UNIX - Stack Overflow](http://stackoverflow.com/questions/678325/remove-file-in-c-under-unix)
- [IPA ISEC　セキュア・プログラミング講座：C/C++言語編　第7章 データ漏えい対策：テンポラリファイル（Unix の一時ファイル）](http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c603.html)
MongoDB + express.js で位置情報検索(緯度経度)

座標検索っていうのかな…
位置情報検索…？なんていうのこういうの
とりあえず2点の数値を座標として扱って、

近い順にデータを取り出す方法を以下に備忘録的に

###テスト用データ

```javascript:コレクション[search]内のデータ例
{
  "_id":"16188bfdf093f",
  "loc":[139.000000000,35.000000000]
}
```

###コード

```javascript:app.js
//利用するコントローラを読み込みます
var search = require('./routes/search ');
app.use('/search', search );
```


```javascript:search.js
var mongodb = require('mongodb');
var data_collection;

//mongoDBに接続
//そしてカラム「loc」を２次元座標として設定する
mongodb.MongoClient.connect("mongodb://localhost:27017/test", function(err, database) {
  if(err){}
  data_collection= database.collection("data_collection");
  data_collection.ensureIndex({loc: "2dsphere"}, {}, function(err, result) {if(err){}console.log(result)});
});

router.get("/", function(req, res) {

  //リクエスト内の座標情報を取得
  var lat = req.query.lat;
  var lng = req.query.lng;
  
  var searchObject = { 
    "loc" : { 
        $nearSphere : [parseFloat(lng) ,parseFloat(lat)]
    }
  };
  
  // 座標から近い順に50件を取得
  // 非同期コールバック処理なので注意。
  // コレクションから値を取得する。
  data_collection.find(searchObject).limit(50).toArray(function(err, items) {
    if(err){console.log(err)}
    res.send({"items":items});
  });//find
  
});//router
```


↓こいつの描き方がよくわからなくて詰んでた…
　parseFloatを忘れてただけでした。恥ずかしい。

```javascript:
  var searchObject = { 
    "loc" : { 
        $nearSphere : [parseFloat(lng) ,parseFloat(lat)]
    }
  };
```
Ubuntu 15.04 にアップグレードしたらブート時に「ACPI PPC Probe failed.」と表示されて起動しなくなった

先日Ubuntu 15.04がリリースされたそうなので早速アップグレードしてみたんですがその時にトラブったのでメモしておきます。

# 事件
アップグレード後、ブート時に「ACPI PPC Probe failed. Starting version 219」とか表示されてうんともすんとも言わなくなるように…

# 原因と思われるもの
どうやらグラボのドライバ周りでトラブってたようで…。私は特に理由なくNVIDIA binary driverの方を利用していたのですが、そのせいでこの問題に遭遇したみたいです。

参考：[ACPI PPC Probe failed. Starting version 219 NVIDIA](http://askubuntu.com/questions/613969/acpi-ppc-probe-failed-starting-version-219-nvidia)

# 対処法
リンク先のやり方その通りやったらうまく行きました。

1. ディスプレイケーブルをマザボ側に挿し替える
2. 多分エラーは出なくなるんですがお馴染みのデスクトップは表示されないと思います
3. Ctrl+Alt+F1 でターミナルを表示してログイン
4. `sudo apt-get remove --purge nvidia-XXX`　(XXXはドライバのバージョン)で問題のドライバを削除
   - もしかすると`nvidia-XXX-updates`かもしれませんが、その時はそれを消せばOK
1. 以降はディスプレイケーブルをグラボ側に挿してても無事に起動するようになるはず

（リンク先のほうが丁寧に説明してくれてます）


## 注意
あまり詳しくないので間違ってたり他の原因だったりするかもしれません。あくまで紹介程度に見てください…
問題等あればコメントでお知らせしていただけると幸いです

アップグレード検討中の方はアップグレードする前にこの辺確認しておくといいかもしれませんね

（もうプロプライエタリなドライバーは使わない…）
やはり俺のHerokuアプリはまちがっている。②

###前回のあらすじ
ひょんなことからpythonのwebフレームワークBottleで遊び始めた俺だったが、Herokuにデプロイしてみるとページの表示がおかしくなっていた。


###今回の話：　ファーストシーズンを見逃すな。
問題はサーバーサイドプログラミングの基本的な部分にあると気づいたのですが、ググるキーワードもよくわからないレベルです。そこで歴史の勉強から始めることにして、「WEB+DB PRESS 総集編〔Vol.1~72〕」のpdf過去記事データを読み漁っていきました（この総集編はお値打ちだと思います）。定期刊行物なので、その時々の「最新」情報が得られます。既存技術→問題点→最新技術の経緯をたどっていくと、どうしてこの技術が出てきた（持ち上げられる）のかというのが、おぼろげながら見えてきます。僕はAngularJSで学習を始めたので、ドラマでいうとたぶんサードシーズン（のスピンオフ？）くらいからの視聴者のようです。とりあえずファースト世代の会話が理解できるくらいには知識を得ておけば、今後のストーリー展開も楽しめそうです。

###学んだこと: ステートレス

簡易なサンプルにして試してみました。

* グローバル変数に状態を格納していたとき

これだとサーバーが変わるとデータが引き継げない。gunicornでworker=3にして問題が出ていたのはそういうこと。


````python:stateful.py

# global var
myCat = "cat"
myDog = "dog"


# routing root
@app.route('/', method='GET')
def myDef():

    global myCat
    global myDog

    return template ('<div>{{myCat}},{{myDog}}</div><a href="/cat">cat</a><br><a href="/dog">dog</a>', myCat=myCat,myDog=myDog)


# cat
@app.route('/cat', method='GET')
def next():
    # global var
    global myCat

    # set var
    myCat = "myao"

    return redirect('/')

# dog
@app.route('/dog', method='GET')
def next():
    # global var
    global myDog

    # set var
    myDog = "waon"

    return redirect('/')



````


* urlを使ってみる例。

````python:stateless.py

#routing root
@app.route('/', method='GET')
@app.route('/<myDog>/<myCat>',method='GET')
def good(myDog="myDog", myCat="myCat"):

    return template ('<div>{{myCat}},{{myDog}}</div><a href="/myDog/myao">cat</a><br><a href="/waon/myCat">dog</a>', myCat=myCat, myDog=myDog)



````


Bottleにdynamic routes (e.g. /hello/<name>)があるは知っていましたが、ようやく意味がつかめました。
技術英語 > 3以上 > 3 or more

3以上という時、うっかり"more than 3"と言ってしまってないだろうか。

正しくは"3 or more"と言う。

他にはこういうのも使えそう
- more than 2
- at least 3


A「How many items do you expect?」
B「3 or more.」
Railsで標準添付ライブラリをrequireする場所

標準添付ライブラリは`Gemfile`に書かれていない。
標準添付ライブラリを`require`したいとき、どこに書けばいいかよく分からなかったので、
今まではモデルやコントローラの先頭で個別に`require`していた。

こういうとき`config/initializers/stdlibs.rb`に標準添付ライブラリの`require`を書くとまとめられて良さそう。

```config/initializers/stdlibs.rb
require 'csv'
require 'ostruct'
```
gets() > 置き換え > fgets() > 改行文字を保持する

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> gets()関数とは異なり、fgets()関数は改行文字を保持するので、gets()関数をそのまま置き換えることはできない。

<hr>
[ideone](http://ideone.com/sTZHfF)
で試したら、改行文字を保持しているためかstrlen()の結果が1増えた。

「改行文字」というのはLFのことだ。
gets() > C99適合 > fgets()かgetchar()を使う

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 厳密なC99適合アプリケーションにおける選択肢は２つある。fgets()かgetchar()のいずれかでgets()を置き換えることだ。
gets() > gets()関数は使うべからず

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 絶対に忘れてｊはならないルール、それは「gets()関数は使うべからず」

gets()は終端の改行文字かEOFが見つかるまでバッファに格納しようとするのでバッファオーバーフローが起きる、とのこと。

<hr>
[SO](http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be-used)
> It remained an official part of the language up to the 1999 ISO C standard, but it was officially removed by the 2011 standard.
adbコマンドでAndroidデータのバックアップ/リストア

ホーム画面の状態で実行。
BootloaderやRescueモードで行うものではないので注意。

## 対象
Android 4.0 以降

動作確認した構成

  * Nexus7 2012 (Android 4.2.2)
  * Nexus7 2012 (Android 4.4.2)
  * Nexus7 2012 (Android 5.1)
  * docomo SO-01G (Android 5.0.2)

## バックアップ

```bash:
adb backup -apk -shared -all -system -f nexus7.bak
```

* キャリア端末では`-system`はつけないこと。
* `-shared` は、端末のストレージと SD カードをバックアップに含む。SD カードのバックアップ不要な場合、アンマウントしておく。
* コマンド実行後、端末画面でバックアップを許可する。

## 復元

```
adb restore nexus7.bak
```

## 注意点

* Android 4.2 以降の場合はUSB接続の前に、`設定>端末情報>ビルド情報`を7回タップし開発者向けオプションを表示させる。`開発者向けオプション>USBデバッグ` を有効にする。
* (バージョン・設定に依っては?) USB 接続後に、デバッグ許可の確認が表示される。
rails sを実行した際に"C:/Users/kazu/Gemfile not found"というエラーが出てしまいます

表題の通り、作成したアプリケーションのルートディレクトリでrails s を実行しようとすると上記のようなエラーが出てしまいます。
googleで検索してgemのアップデートなどを試してみたのですが解決せず・・・。
どなたか解決策をご存じの方いらっしゃらないでしょうか。
String.replaceは思ったほど速くない

一般的にJavaで何度も同じ文字列置換を行う際には、正規表現による置換が必要であれば`String.replaceAll`ではなく`Pattern.compile`した`Pattern`インスタンスを使いまわし、固定文字列による置換で事足りるのであれば単に`String.replace`で置換するという使い方が多いと思います。

```java
private String regex = ...
private Patten pattern = Pattern.compile(regex);
private String masking(String input) {
    input = input.replace("yyy", "XXX");
    // input = input.replaceAll(regex, "xxx"); は遅いので書き換え
    input = pattern.matcher(input).replaceAll("xxx");
    return input;
}
```

これは`replaceAll`の正規表現置換は結局`Pattern`クラスを使用していて、呼び出しのたびに`Pattern.compile`されていることが知られている一方で、固定文字列の`replace`は高速な検索・置換が可能だと考えられるからです。常識的に考えて。
しかし実際にはString.replaceはこのような実装になっています。（OpenJDK/OracleJDK:8u40）

```java:java.lang.Stringより抜粋
public String replace(CharSequence target, CharSequence replacement) {
    return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
            this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
```

驚きの手抜き実装です。なにか理由があるんでしょうか。チケットが発行されているのを見る限り、たぶんないんだと思いますが…
https://bugs.openjdk.java.net/browse/JDK-8058779

`replace`の速度が欲しい場合はApache Commons Langの`StringUtils.replace`を使うなどで逃げるようです。自分で適当に`indexOf`と`StringBuilder`でサクッと作ってもいいかもしれません。たとえばこんな感じ。

```java
private static String replaceByHand(final String original, final String old, final String replace) {
	int offset = 0;
	StringBuilder builder = new StringBuilder(original.length());
	int index;
	while (0 <= (index = original.indexOf(old, offset))) {
		builder.append(original, offset, index);
		builder.append(replace);
		offset = index + old.length();
	}
	builder.append(original, offset, original.length());
	return builder.toString();
}
```

正しい測定は面倒なので省略しますが、適当な測定によると速くなると言ってもだいたい3倍速程度です。また`replaceAll`でやるように、あらかじめ`Pattern.compile(target.toString(), Pattern.LITERAL)`しておいた場合では`replace`の1.5倍程度でした。プロファイラで出てこない限りはライブラリが何かの都合で実装していればそっちを使う程度で、積極的には置き換えるほどではない数値ですね。チケットも上がってますし将来的にJDKの方で修正されるのならそれでよさそうです。

一方で、`replace`の速度がボトルネックになった場合は`replace`を置き換えるとともに文字列パターンにあった文字列探索アルゴリズムを検討するとよいかもしれません。`indexOf`の実装は非常にナイーブな（シンプルな）ものです。いろいろな状況に合わせる必要性を鑑みると、`indexOf`や`replace`における文字列探索はおそらくナイーブなものにならざるを得ず、自動で最適化される日は将来的にも当面は来ないと思います。そのあたり`Pattern`が上手くやってくれると期待したくなりますが、`Pattern`のリテラル実装も同じぐらいナイーブです。

何事も疑ってかかると時間がいくらあっても足りませんが、思い込みで「上手くやってくれているはず」というのも危険という話でした。
【iOS】UIWebViewでwebページ内のボタン等を制御する


## 経緯

該当画面はUIWebViewで表示した際、「閉じる」ボタンが効かなかった。
ボタン押下時は閉じるのではなく、一画面戻したかった為、方法を探った。

## 方法

jsを書き換える為のファイルを用意、プロジェクト内に格納：

```js:JS_WebViewController.txt
window.close = function () {
    history.back();
};
```

`window.close()`を`history.back()`で書き換えているだけ、シンプル。


次、
`webViewDidFinishLoad`で先のファイルを読込、書き換え：

```objc:WebViewController.m
// URL読込後
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSError *error = nil;
    NSString *jsFromFile = [NSString stringWithContentsOfURL:[[NSBundle mainBundle]
                                                              URLForResource:@"JS_WebViewController" withExtension:@"txt"]
                                                    encoding:NSUTF8StringEncoding error:&error];
    __unused NSString *jsOverrides = [webView
                                      stringByEvaluatingJavaScriptFromString:jsFromFile];
}
```


## 応用

urlスキーマ使えば、objC側でもっと自由にやれる：


```js:JS_WebViewController.txt
window.close = function () {
    open("native://close");
};
```

同じく`webViewDidFinishLoad`で書き換える：

```objc:WebViewController.m
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    
    NSError *error = nil;
    NSString *jsFromFile = [NSString stringWithContentsOfURL:[[NSBundle mainBundle]
                                                              URLForResource:@"JS_WebViewController" withExtension:@"txt"]
                                                    encoding:NSUTF8StringEncoding error:&error];
    __unused NSString *jsOverrides = [webView stringByEvaluatingJavaScriptFromString:jsFromFile];
    

}

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *scheme = [request.URL.scheme stringByAppendingString:@":"];
    scheme           = [scheme stringByAppendingString:request.URL.resourceSpecifier];
    if ([scheme isEqualToString:@"native://close"]) {
        
        /*
        *
        * Do Something!!!!!!!!!!!!!!!!!!
        *
        */
        
        [self dismissViewControllerAnimated:YES completion:nil];
        return NO;
    } else {
        return YES;
    }
}
```

スキーマは`request.URL.scheme`と`request.URL.resourceSpecifier`で取得して判定してる

## 参考


- [iOS UIWebView Handle window.open/window.close PopUp Page](http://brainwashinc.com/2014/01/06/ios-uiwebview-handle-window-openwindow-close-popup-page/)
javascriptで日付フォーマッタ

オブジェクトの順序保証されないけどほとんどの環境で動くからいいやーと放置してたけど、地味にストック増えてきてマズイ気がしてきたのでとうとう修正しました(；´∀｀)

###フォーマッタ

JSONでフォーマッタを定義してみました。
他の書式対応も、JSONの要素を追加するだけです。

| データ | 書式 | 
|:--------|------------:|
| 西暦４桁 | yyyy |
| 月２桁  | MM |
| 日   | dd |
| 時間 | hh |
| 分   | mm |
| 秒   | ss |

```js
dateFormat = {
  _fmt : {
    "yyyy": function(date) { return date.getFullYear() + ''; },
    "MM": function(date) { return ('0' + (date.getMonth() + 1)).slice(-2); },
    "dd": function(date) { return ('0' + date.getDate()).slice(-2); },
    "hh": function(date) { return ('0' + date.getHours()).slice(-2); },
    "mm": function(date) { return ('0' + date.getMinutes()).slice(-2); },
    "ss": function(date) { return ('0' + date.getSeconds()).slice(-2); }
  },
  _priority : ["yyyy", "MM", "dd", "hh", "mm", "ss"],
  format: function(date, format){
    return this._priority.reduce((res, fmt) => res.replace(fmt, this._fmt[fmt](date)), format)
  }
};
```

###使用例
date型のオブジェクトと任意の書式を渡します。

```js
dateFormat.format(new Date(), 'yyyy/MM/dd hh:mm:ss');

// 実行結果
// "2015/04/26 01:32:52"
```

※追記
もうすこし実用的なサンプル

```javascript:
var dateFormat = 
 {
  _fmt : {
    hh: function(date) { return ('0' + date.getHours()).slice(-2); },
    h: function(date) { return date.getHours(); },
    mm: function(date) { return ('0' + date.getMinutes()).slice(-2); },
    m: function(date) { return date.getMinutes(); },
    ss: function(date) { return ('0' + date.getSeconds()).slice(-2); },
    dd: function(date) { return ('0' + date.getDate()).slice(-2); },
    d: function(date) { return date.getDate(); },
    s: function(date) { return date.getSeconds(); },
    yyyy: function(date) { return date.getFullYear() + ''; },
    yy: function(date) { return date.getYear() + ''; },
    t: function(date) { return date.getDate()<=3 ? ["st", "nd", "rd"][date.getDate()-1]: 'th'; },
    w: function(date) {return ["Sun", "$on", "Tue", "Wed", "Thu", "Fri", "Sat"][date.getDay()]; },
    MMMM: function(date) { return ["January", "February", "$arch", "April", "$ay", "June", "July", "August", "September", "October", "November", "December"][date.getMonth()]; },
    MMM: function(date) {return ["Jan", "Feb", "$ar", "Apr", "$ay", "Jun", "Jly", "Aug", "Spt", "Oct", "Nov", "Dec"][date.getMonth()]; },  
    MM: function(date) { return ('0' + (date.getMonth() + 1)).slice(-2); },
    M: function(date) { return date.getMonth() + 1; },
    $: function(date) {return 'M';}
  },
  _priority : ["hh", "h", "mm", "m", "ss", "dd", "d", "s", "yyyy", "yy", "t", "w", "MMMM", "MMM", "MM", "M", "$"],
  format: function(date, format){return this._priority.reduce((res, fmt) => res.replace(fmt, this._fmt[fmt](date)), format)}
}

dateFormat.format(new Date('2015/03/04'), 'MMM dt, yyyy [w]');
// 実行結果
// "Mar 4th, 2015 [Wed]"
```
デバイス回転の制御

## 背景

画面（ViewController）ごとに回転を制御したいとき、
とりあえず回転する可能性のある方向をすべて指定してから

### UISupportedInterfaceOrientations
![スクリーンショット 2015-04-25 23.51.33.png](https://qiita-image-store.s3.amazonaws.com/0/19909/d434097d-8217-b9bb-fbae-a209e85f5b4b.png)

各`ViewController`で
shouldAutoroate, supportedInterfaceOrientations
をオーバーライドして制御する方法しか知らなかった。
あまりスマートじゃないと感じたので別の方法を探してみた。

## 回転制御方法

以下のようにすると`ViewController`ごとに回転を制御できるようになる。

### ソースコード

https://github.com/bolobob/RotateSample

```swift:AppDelegate.swift

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
        if window?.rootViewController?.presentedViewController is ViewController2 {
            return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue)
        } else {
            return Int(UIInterfaceOrientationMask.Portrait.rawValue)
        }
    }
```

### ではUISupportedInterfaceOrientationsって？

[UISupportedInterfaceOrientations](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW10)
によると、アプリを起動するときに取りうる方向を指定しておくものらしい。
Let's Chat のユーザ管理ツール作った

[Let's Chat](https://github.com/sdelements/lets-chat) には管理GUIとかが無いので、以下のようなことができない。

* ユーザ一覧の確認
* ユーザの登録
* ユーザの削除
* パスワードの変更

ということで作ってみた。→ https://github.com/kounoike/lcam

bcrypt, click, pymongo が必要なのでそれぞれ `pip install` すること。

ついでに [Click](http://click.pocoo.org/4/) を使ったサンプルとしても作りこみ中。
ちょっと引数周りを変えようかな・・・
[Ruby基礎学習] パターンの表示④

# はじめに
章末問題2問目。

# 問題
```
以下を表示する。
#            #
 ##        ##
  ###    ###
   ########
   ########
  ###    ###
 ##        ##
#            #
```

# 解答
難しい…何この形。

下が左右上下対照に4つある。

```
#
 ##
  ###
   ####
```

とりあえず空白も埋めてみて考える。

```
■□□□□□□□□□□□□■
□■■□□□□□□□□■■□
□□■■■□□□□■■■□□
□□□■■■■■■■■□□□
□□□■■■■■■■■□□□
□□■■■□□□□■■■□□
□■■□□□□□□□□■■□
■□□□□□□□□□□□□■
```

いつものようにまずは無理やり表示させる。


```rb
sharps = 2
spaces_center = 12
spaces_side = 0
4.times do
	sharp = "#" * (sharps / 2)
	space_side = " " * (spaces_side / 2)

	puts space_side + sharp + (" " * spaces_center) + sharp + space_side
	sharps += 2
	spaces_center -= 4
	spaces_side  += 2
end
sharps -= 2
spaces_center += 4
spaces_side -= 2
4.times do
	sharp = "#" * (sharps / 2)
	space_side = " " * (spaces_side / 2)

	puts space_side + sharp + (" " * spaces_center) + sharp + space_side
	sharps -= 2
	spaces_center += 4
	spaces_side -= 2
end
```

この前教えてもらった`center`を使ったらもうちょっと単純化できた。

```rb
center_spaces = 12
fillin_sp = 14
4.times do
	puts (" " * center_spaces).center(fillin_sp, "#").center(14, " ")
	center_spaces -= 4
	fillin_sp -= 2
end
center_spaces += 4
fillin_sp += 2
4.times do
	puts (" " * center_spaces).center(fillin_sp, "#").center(14, " ")
	center_spaces += 4
	fillin_sp += 2
end
```

この2回同じような処理があるのは何とかならないものか…。
…と思って使う数値を全列挙したら処理自体は短くなった。

```rb
space_array = [14,12,10,8,8,10,12,14]
[*12,8,4,0,0,4,8,12].each.with_index do |c, i|
	puts (" " * c).center(space_array[i], "#").center(14, " ")
end
```

この数値自体を列挙しない方法でどうにかできるのだろうけど。
数日考えてここまでしか思いつかず。
それとも根本的にやり方がおかしいのか。う〜ん…
この図形難し…

# 問題の出典

* プログラマの考え方がおもしろいほど身につく本　問題解決能力を鍛えよう！
MySQLでwhoamiしたい

サーバーでよくwhoamiコマンドを利用します。こちらはログイン中のユーザーを知らせてくれるコマンドです。MySQLでも同じようにログインしているユーザーを教えてほしいと感じました。

# USER()を使う
`USER()`を使います。

```mysql:USER()を使う
SELECT USER();

+----------------+
| USER()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
```
MySQLにログイン中の名前とホスト名を知ることができました。

# 参考
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_user
sublimetext3メモ

#参考
[1ヶ月使って便利だと思った Sublime Text 2 のショートカット 12 選（Win、Mac両方）](http://dev.classmethod.jp/tool/sublime-text-2-shortcut/)

[Sublime Text 2のキーボードショートカット一覧 (Mac OS X)](http://blog.layer8.sh/ja/2012/04/16/sublime-text-2%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7-mac-os-x/)

[プログラミングやマークアップで特に役立つ、Sublime Textの標準機能](http://www.buildinsider.net/small/sublimetext/02)

[これだけ覚えればもっと好きになる。SublimeTextのデフォルト便利機能15個](http://www.tensenweb.com/tools/sublime_basic/)

[Sublime Text 3: 導入から１ヶ月、使用頻度が高くて便利なショートカット10](http://webdesign-workbook.com/sublimetext-useful-shortcut-10/)

[Sublime Text 2 を使ってみよう](http://lab.sonicmoov.com/markup/sublime-text-2/)

検索・置換のアイコンいろいろ
http://mori-ko.net/blog/20121221/sublime-text-2-2/

#ショートカット
選択：
⌘+D、ctrl+D
スキップ：
⌘+K、ctrl+K

置換：
ctrl(command)+shift+F

ウィンドウの分割：
OS X：⌘ + ⌥ + 2,3,4
Windows：Alt + Shift + 2,3,4

選択した文字列をタグで囲む：
Ctrl + Shift + w(win: Alt + Shift + w)

行のコピー：
現在のカーソル位置の行をそのまま下にコピーします。
OS X：⌘ + ⇧ + D
Windows：Ctrl + Shift + D
複数行選択している場合は、まとめてコピーされます。

カレント行を前後の行と入れ替え：
ctrl+ command + up : swap_line_up
ctrl+ command + down : swap_line_down

行の削除：
Ctrl＋shift＋K（Mac）

同じ文字列を一気に複数選択
Alt＋F3キー（Win）／Ctrl＋Command＋Gキー（Mac）

コメントアウト・コメントイン：
OS X：⌘ + /
Windows：Ctrl + /
また、⌥ + ⌘ + / （Alt + Shift + /）で、現在のカーソル位置にコメントを挿入できます。

ブロックコメント：
Ctrl＋Shift＋/

選択部分の折りたたみ・解除：
mac
command + alt+ [ : fold
command + alt+ ] : unfold

win
Ctlr+Shift+[ 	選択範囲を折りたたみ
Ctlr+Shift+] 	折りたたんだ選択範囲を展開

カーソル位置から親要素を辿る
win:Ctrl + ,
ctrl＋shift＋A
どっちだろ
mac
command＋shift＋A

括弧の中を選択：
ctrl+ shift+ m : expand_selection

#パッケージ
●ブラウザでプレビュー：「view in browser」をインストール
ショートカット
ctrl+alt+v/ctrl+alt+f 	Firefox
ctrl+alt+c 	Chrome
ctrl+alt+i 	IE
ctrl+alt+s 	safari

●保存した瞬間にブラウザプレビュー
http://charlie.hateblo.jp/entry/2013/10/10/172349


●CSSフォーマット：「CSSFormat」をインストール
Edit＞CSSFormat

●圧縮・整形
[たった1秒！Sublime TextでCSS/JavaScriptを簡単に圧縮・整形する方法]
(http://webdesign-workbook.com/sublime-text-compress-css-js/)

●チェック
[Sublime Text 3 で構文エラーチェックする設定のまとめ]
(http://qiita.com/Sugima/items/e3ad6c0405c3939dee3b)

#その他
●ショートカットの設定
preferences＞keybindings

●サイドバーでのファイルクリック時にいちいちファイルが開かないようにする。
user-setting＞"preview_on_click": false

●ファイルをWindowsフォルダで開く
サイドバー＞右クリ＞reveal

●インストールしたパッケージの確認
ctrl+Shift+P＞Type [pali]＞Package Control: List Packages

●プロジェクト一覧から削除
Macのフォルダで「Shift」＋「Command」＋「G」のキーボードショートカット
↓
~/Library/Application Support/Sublime Text 3/Local/
に移動
↓
Session.sublime_session
の


#不明
・サイドメニューでのコピペ
・windowsでのブラウザプレビュー
・選択文字列の前後に挿入
・""の中を選択
リフレクションを使って文字列からリソースIDを取得する


一般的に、変数や文字列からリソースIDを取得したい場合、以下のように書くと思います。

```java:
int viewId = getResources().getIdentifier("text_view", "id", getPackageName());
TextView textView = (TextView)findViewById(viewId);
```

[参考ページ](http://qiita.com/t-kashima/items/9462af782fb5f1a2a7da)

Rクラスの内部クラスidのフィールドがリソースIDなので、リフレクションを使って以下のように書くこともできます。

```java:
try {
    Field field = R.id.class.getField("text_view");
    TextView textView = (TextView)findViewById(field.getInt(null));
} catch (NoSuchFieldException e) {
    e.getStackTrace();
} catch (IllegalAccessException e) {
    e.getStackTrace();
}
```

使いどころは皆無ですね。
シンボリックリンク


これで少しは便利に・・・

ln -s <リンク先>　<リンク名>


`ln -s /usr/local/apache2/htdocs/ htdocs`
`ll htdocs`                                                                                                                           
lrwxrwxrwx. 1 root root 26  4月 25 22:34 2015 htdocs -> /usr/local/apache2/htdocs/
reiny v0.4.0 -  if else句の追加, mithril/mercuryのサポート, SCSS生成


[react-problems.md](https://gist.github.com/mizchi/ee8256f7783dde2bea8d "react-problems.md")で発表してきたんだけど、テンプレートエンジンを作っています。

## Mithril / Mercuryのサポート

dekuもサポートしようと思ったんだけど、今APIが変わりまくってる最中っぽくて様子見。

最初にこういうテンプレートを吐くDSLのような中間層を作った

[mizchi/virdy](https://github.com/mizchi/virdy "mizchi/virdy")

```js
const virdy = require('virdy/runtime/mithril')
let template = (props) => virdy($ => {
  $('div', {className: 'root'}, () => {
    $('ul', {className: 'itemWrapper'}, () => {
      [1, 2, 3].map(i => {
        $('li', {}, 'item:' + i.toString());
      });
    });
  });
});

```

で、こういう風に使える

```js
  m.render(
    document.querySelector('#mithril')
    template(title: 'mithril')
  )
```

Mercuryだとこう

```js
  hg.app(
    document.querySelector('#mercury')
    hg.state({})
    -> require('../runtime/mercury')(template(title: 'mercury'))
  )
```

実際に動いてる例はここ [virdy/index.coffee at master · mizchi/virdy](https://github.com/mizchi/virdy/blob/master/playground/index.coffee "virdy/index.coffee at master · mizchi/virdy")


各vdom実装でのcomponent呼び出し型に差異があるので、そこはまだ埋めてない。あとでやる。



## else, if else 句の追加

else 句が存在してないの途中で気づいたのでさっくり作った

## SCSS生成

こんなreinyのインライン記法があったとして

```
.foo {
  color: 'green'
}
  if true
    if true
      .quux {
        color: #eee
      }
  .bar {
    color: 'red'
  }
    .baz {
      color: 'blue'
    }
    if false
      .fuba {
        color: value
      }
```

次のようなSCSSを生成する

```
.foo {
  color:green;
  .bar {
    color:red;
    .baz {
      color:blue;
    }
    .fuba {
      color:$value;
    }
  }
  .quux {
    color:#eee;
  }
}
```

作った動機は、自分はよくインラインCSSを気軽に書いてマークアップの人に怒られるんだけど、だったらインラインCSSからCSSをいつでも生成できれば移行コスト少なくていいやん！みたいな感じ。実験的な機能。作ったはいいがメンテするか微妙。

というわけで引き続き細かいバグを潰します
MacOSX Yosemite 10.10.3 のPHPにmcryptモジュールをインストールする

手元のMacにLaravelをインストールしようとすると、なぜかPHPの`mcrypt`モジュールがインストールされていなかったのでインストールメモ。

## 環境

Mac OS X Yosemite 10.10.3
PHP Ver.5.5.20
※全てターミナルで作業します

## インストール前の確認
`mcrypt` モジュールが含まれていないことを確認する

```bash
$ php -i | grep mcrypt
#何も表示されない
```

## `libmcrypt`をインストールする

```bash
$ brew install mcrypt
```

## PHPソースコードをダウンロード

```bash
$ wget http://jp1.php.net/get/php-5.5.20.tar.gz/from/this/mirror | tar zx
```

## 拡張モジュールのディレクトリに移動

```bash
$ cd php-5.5.20/ext/mcrypt/
```

## mcryptモジュールをビルドしてインストール

```bash
$ phpize
$ ./configure
$ make
$ make test
$ sudo make install #インストールは管理者権限で
```

## php.iniにモジュール宣言を追加

```php.ini
extension=mcrypt.so
#場合によっては make install 時に出力された絶対パスを指定
```

## mcrypt がロードされているのを確認する

```bash
$ php -i | grep mcrypt
```
[プルリク時に確認したい] Rails初心者のための21チェックリスト


できる先輩エンジニアにレビューをいただくことが多い、(僕のような)ビギナーが抜け漏らしがち&&大事なポイントを、チェックリストにまとめました。今一度自分のコードの質を上げるのに役立てたい。

#### MVC系
- [ ] view上のロジックをcontroller or helperに移すことは可能か(controller時点で計算可能なものか)
- [ ] controller上のロジックをmodelに移すことは可能か(特定のオブジェクトに関する動作か)

#### DRY系
- [ ] 便利メソッドやイディオムで完結に言い換えられないか(便利メソッド参照: http://qiita.com/jnchito/items/dedb3b889ab226933ccf )(←一度目を通してどういったものがあるのか知るのおすすめします。)
- [ ] メソッドの適用範囲(よりpublicに/よりprivateに)
- [ ] メソッドの役割の明確さ
- [ ] メソッドの汎用性/独立性(前提条件や他のメソッドに依存おらず、汎用的に使えるか。)
- [ ] 重複したコードが存在しないか
- [ ] call_back使えないか

#### SQL系
- [ ] n+1 Queryないか (allの子たちを全てアクセスしてたりするか。) (参考: http://qiita.com/shunsuke227ono/items/60de21690238aa25e9d4)
- [ ] transaction必要か
- [ ] インスタンスまるまる召喚する必要ある？(existsとかで済まないか)

#### 命名系
命名の参考: http://qiita.com/jnchito/items/459d58ba652bf4763820

- [ ] より正確に変数/methodの意図を特定できないか
- [ ] より短く端的に言えないか


#### DB系
- [ ] defaultいらない？
- [ ] null:falseいらない？
- [ ] 新しいscheme変更に伴う既存データ変更作業必要か(rake task等による)

#### 柔軟性
- [ ] 定数→settings.yml?enum?
- [ ] 文言→locales
- [ ] 想定できる範囲の仕様変更に耐えやすいか

#### 変更に伴うこと
- [ ] 影響範囲を列挙し確認したか
- [ ] 変更に伴い該当部分のspec(テスト)変更したか


****
#### 初心者向けのこちらも参照
- [【Rails】初心者と中級者のコードの差６つ]( http://qiita.com/shunsuke227ono/items/60de21690238aa25e9d4)
- [初心者エンジニアがより効率的にコードを書くために必要な三つの力](http://qiita.com/shunsuke227ono/items/36723b9c19c25d545aa1)

****

随時更新/追加していきます。
gradleで特定のbuild variantを作成しないようにする方法

build.gradleでflavourを分けていると、特定のbuild variantは作成したくない時があります。
例えば、staging、developmentのflavourではreleaseビルドしないのでdebugビルドだけやりたい、みたいな場合です。

これを実現するには `variantFilter`を使います。

```build.gradle
    productFlavors {
        development {
            //（略）
        }
        staging {
            //（略）
        }
        production {
            //（略）
        }
    }

    //（略）

    variantFilter { variant ->
        if (variant.buildType.name.equals('release')) {
            if (variant.getFlavors().get(0).name.contains('staging')
                    || variant.getFlavors().get(0).name.contains('development')) {
                variant.setIgnore(true);
            }
        }
    }
```

なんでこんなことをするかというと、ビルド高速化のためです。
例えば `assembleStagingDebug`のようにした場合でも、なんだかReleaseビルドもやってるような動きをします。それだと無駄に時間がかかるので、ちょっとでも速くしようと、必要ないbuild variantは作らない方がいいと思った次第です。

これをやった結果、ビルドがちょっと速くなった気がします。

参考 : [Exclude specific build variants](http://stackoverflow.com/questions/21221868/exclude-specific-build-variants)
JSXへ関数を埋め込む際に、変数を渡すのとそうでないので挙動が変わる


これは、div を mousedown するとhandlerが実行される：

```
React.createClass({
  render: function() {
    var handler = function() {
      console.log('clicked');
    };
    return <div onMouseDown={handler} />;
  }
});
```

一方これは実行されない：

```
React.createClass({
  render: function() {
    return <div onMouseDown={function() {
      console.log('clicked');
    }} />;
  }
});
```

こうすると実行されるようになる：

```
React.createClass({
  render: function() {
    return <div onMouseDown={(function() {
      console.log('clicked');
    })()} />;
  }
});
```

仕組みは不明
HTML5の参考サイト


HTML5について

詳しい参考サイト
　　https://w3g.jp/blog/studies/html5report

コンテンツモデルや実際の書き方などに関しては、こっち(↓)が参考になる
　　http://www.mdn.co.jp/di/articles/2605/?page=2

HTML5リファレンス
　　http://www.tagindex.com/html5/index.html

コンテンツ・モデル自体についての説明
　　http://www.html5-memo.com/basic/rule-002/

廃止タグ一覧
　　http://www.tagindex.com/html5/basic/abolished.html

HTML５コードチェッカー（Another HTML Lint5）
　　http://www.htmllint.net/
HTML5の概要


# HTML5の概要

## HTML5とは

HTML(Hyper Text Markup Language)の新しいバージョンである

## HTML5の新機能

* よりリッチな Web アプリケーション
* よりセマンティックなマークアップ
* より高いアクセシビリティ
* より高い互換性

### よりリッチな Web アプリケーション

HTML5 と 関連 API を利用することで、機能の実現幅が広がった

実現可能な例

* 動画や音声を再生する（Video/audio 要素）
* 2D グラフィックスを自在に操作する（canvas 要素）
* オフラインでもアプリケーションが動作する（アプリケーションキャッシュ）
* ドメインをまたいで通信を行える（クロスドキュメントメッセージング、Indexed Database API）
* バックグラウンド処理を行う（Web Workers）
* サーバーからのデータプッシュや、サーバーとの双方向通信を行う（Sercer-Sent Events、Web Sockets）
* ローカルファイルの内容を読み取る（File API）

### よりセマンティックなマークアップ

HTML5では文書構造の意味や、文書中に埋め込まれたデータの意味等を明確にするための仕様が多数盛り込まれた


### より高いアクセシビリティ

アクセシビリティとは
> アクセシビリティとは、年齢や身体障害の有無に関係なく、誰でも必要とする情報に簡単にたどり着け、利用できることをいいます
(厚生労働省HPより：http://www.mhlw.go.jp/accessibility/)

HTML5 のアクセシビリティ

* セマンティックな新要素（`<header>、<footer>、<section>`等）が、文書の意味を明確化する
* 入力フォーム（input 要素など）もより種類が豊富になり、ブラウザで入力値チェックも任せられるようになった
（例：`<input type="number">`とすれば、数値のみを受け付ける入力フォームとなる 等）

### より高い互換性

* バージョン間の互換性、ブラウザ間の互換性が高い
* HMTL5 では多くの要素や属性を廃止しているが、ブラウザに対してはそれらのサポートを継続するよう要求しているため、古い機能が動作しなくなるといった心配はない
* 廃止された要素にたいしてすら詳細な仕様を提供する念の入れようである



## 参考書籍

「HTML5 & API 入門」白石俊平著
【javascript】テキストノードをToggleする

ボタンメッセージの切り替えなどなどに有用かも

```js:javascript
//$("html").html("<span id='nurupo-ga'>ガッ</span>")
$("#nurupo-ga").on("click", function(){
  $(this).text({"ガッ":"ぬるぽ","ぬるぽ":"ガッ"}[$(this).text()]) 
})
```


~~無駄にプラグイン化~~

```js:javascript
//;(function($){
//$.fn.textoggle = function(){
//  
//  var o = {};
//  for (var i = 0; i < arguments.length; i++) {
//    var k = i;
//    var v = (i+1) % arguments.length;
//    
//    o[ arguments[k] ] = arguments[v];
//  }  
//  $(this)
//    .text(arguments[0])
//    .on("click",o, function(){
//      $(this).text(o[$(this).text()]);
//    });
//};
//})(jQuery);
```

~~呼出は、以下のような感じ~~

```js
//$("/*Selector*/").textoggle("a","b","c");
```


~~引数が1つの時、文字が重複するときは考慮していない~~



作り直しました
そもそも関数化したら引数をオブジェクトに詰める必要ないので
引数が1つだろうが重複してようが関係ないですね

```js:javascript
;(function($){
$.fn.textoggle = function(){

  var o = {};
  o.arrStr = arguments;
  o.idx = 0;

  $(this)
    .text(o.arrStr[0])
    .on("click",o, function(){
      o.idx = (o.idx+1)%o.arrStr.length;
      $(this).text(o.arrStr[o.idx]);
    });
};
})(jQuery);
```
コードもシンプル
呼び出し方一緒です

```js
$("/*Selector*/").textoggle("a","b","c");
```
ArduinoでDHT11デジタル温度センサーをAdafruitライブラリから使う

ArduinoからデジタルセンサーモジュールのDHT11を使って温度と湿度を計測してみようと思います。DHTxx用のライブラリやチュートリアルはたくさん見つかるので勉強に役立ちます。[DHT11](http://www.aitendo.com/product/10186)より[DHT22](http://akizukidenshi.com/catalog/g/gM-07002/)の方が精度が高く、DHT22とAM2302は同じモジュールのようです。どれも同じライブラリを使えるようなので、安い方のDHT11を購入しました。


## ブレッドボード配線

購入したDHT11は3ピンの完成品です。データはArduinoのデジタル側、PD2に配線します。

* `+` (DHT11) -> +5V (Arduino)
* `S` (DHT11) -> PD2 (Arduino)
* `-` (DHT11) -> GROUND (Arduino)

## adafruit/DHT-sensor-library

いつも参考にしているAdafruitのチュートリアルとライブラリを使います。

* [DHTxx Sensors](https://learn.adafruit.com/dht?view=all)
* [adafruit/DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library)

リポジトリから`git clone`してライブラリをインストールします。

``` bash
$ cd ~/Documents/Arduino/libraries
$ git clone https://github.com/adafruit/DHT-sensor-library.git DHTxx
```

[DHTtester.ino](https://github.com/adafruit/DHT-sensor-library/blob/master/examples/DHTtester/DHTtester.ino)を参考にしてサンプルプログラムを用意します。

```cpp:~/Documents/Arduino/DHTxx/DHTxx.ino
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600); 
  Serial.println("DHT11 test!"); 
  dht.begin();
}

void loop() {
  delay(3000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.println(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");
}
```

コンパイルしてArduinoに書き込みます。シリアルモニタを実行すると温度と湿度が表示されます。

```
DHT11 test!
Humidity: 43.00 %	
Temperature: 25.00 *C 
Humidity: 43.00 %	
Temperature: 25.00 *C 
```

![dht11.png](https://qiita-image-store.s3.amazonaws.com/0/43745/3c9b33dd-8d14-c218-5b63-b8c96afe7304.png)
SSH の設定であまりにはまるので備忘録を書いておく

#　はじめに
もう何度はまったかわから無いくらい、毎度毎度SSHを使っての接続ではまり、毎回毎回調べ直し（覚えてい無いのが悪いのですが。。。）色々やって解決しているので具体的にどれが正しかったのか不明なところもありますが、自分がはまったところの解決策を書いておきます。

# 環境

| クライアント | サーバー |
|:--|:--|
|windows7|CentOS6.6|

# 設定
## サーバ側の設定

/etc/ssh/sshd_config

```
# RSA公開鍵による認証
RSAAuthentication no →　yes
PubkeyAuthentication no →　yes
AuthorizedKeysFile      .ssh/authorized_keys
```

設定した後は サービスの再起動

```
$ sudo service sshd restart
```

## 個人の設定

windowsで鍵を作成する場合 puttygenを使用して作成した公開鍵 (id_RSA.pub)を
サーバ側の個人ディレクトリの　.ssh 配下に保存する

### 注意点
- 保存するファイル名は　authorized_keys
- パーミッションは　他人からアクセスされ無い設定になっている事が重要
ファイルおよび保存しているディレクトリ(.ssh) のパーミッション　６００　
- 公開鍵は　文頭に　公開鍵の種類を書く。改行を含まない事
- puttygen で作成しファイルに保存すると改行が含まれているのでエディットして消す

## 鍵の種類

|ファイル名|形式|
|:--:|:--:|
|id_RSA|openssh形式|
|id_RSA.ppk|Putty形式|

## 着目点
- puttyを使って接続する際　パスフレーズを間違えている時は　その旨のエラーダイアログが表示される
- 設定に誤りがある場合は接続エラーになる
- パーミッションが正しく行われていない場合 /var/log/secure ログを見ると　その旨のエラーメッセージが出力されている
- サーバの設定で　パスワードでのログインを禁止する設定は sshでのログインができるようになっている事を確認してから切り替えないと詰む

```
# パスワードでの認証を禁止（公開鍵による認証のみにする）
PermitEmptyPasswords no
PasswordAuthentication no
```



#　その他
 自分では遭遇していないが起こり得るケース

- ファイアウォールがブロックしている
- sshd自体が起動していない


# 参考

>PuTTYgenについて
http://miscmix.site370.info/server/puttygen.html

>PuTTYgenの画面説明と使い方
http://miscmix.site370.info/server/puttygen2.html

毎回忘れているのはここですね
>（OpenSSH形式はエディットボックスからコピーしてテキストファイルに貼り付けて保存） 

理由がこちらに書かれていました

>puttygen を使って暗号鍵作製
http://osksn2.hep.sci.osaka-u.ac.jp/~naga/miscellaneous/winssh/winsshb2.html

> 先に述べたようにOpenSSH２と商用SSH２では暗号鍵ファイルに違ったフォーマットを採用しています。SSH1では違いがありません。OpenSSHではSSH1とSSH2は共に暗号鍵がコメントを含めて一行の文であることを要求します。PuTTYがSSH2公開鍵を収納するときは商用SSH2に類似のしかし独自のフォーマットを使います。下の三つの中で一番上の図は、id_rsa.pubに収納したSSH2/RSAの公開鍵を秀丸で開いた画面です(注)。収納された文は改行付きで数行にわたっていて、前の図の窓枠にある文字列と違うことに注目しましょう。これをこのままサーバーに持って行ってはいけません。持っていくべき物は上部の窓内にある文字列ですので、コメントを含め全てコピーします。Ctrl キーとＣを同時に押せばクリックボードにコピーされます。右クリックからコピーを選んでもコピーできます。
heroku with PHP Tips


## ssh で入る

````
$ heroku run bash
````

## SQLITE 使う

Postgres使えとかMySQL使えとか、ディスクベースストレージはどうこうとかそういうのはわかってる。
それでも俺はSQLITEが使いたい。

````
{
  "require": {
    "ext-pdo_sqlite": "*"
  }
}
````

`require`手動追加の際には`lock`ファイルの更新をお忘れなく。

## php.iniの設定

`.user.ini`を使う。
q
http://docs.php.net/ja/configuration.file.per-user.php


## 修正ファイルはないけど再デプロイしたい

````
$ git commit -m empty --allow-empty && git push heroku master
````

空コミットを作ってpushする。gitのログは汚れるけど…

## Composer Cacheの削除

開発中ライブリを`dev-master`でcomposer参照している時とか、ハッシュ固定されて面倒。

`composer.json`の`scripts.pre-install-cmd`で定義しとくと上手いこと消してくれる。

````
"scripts": {
        "pre-install-cmd":[
            "bower install",
            "composer clear-cache"
        ]
    },
````


## ビルドパックの設定

php+JSのアプリケーション製作時に
composerのscriptsでbowerとかwebpackとか使いたいときに。

1. .buildpacks の作成

プロジェクトのルートに`.buildpacks`を作成

````
https://github.com/heroku/heroku-buildpack-nodejs
https://github.com/heroku/heroku-buildpack-php
````

2. 環境変数でマルチビルドパックを指定

````
heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi
````


単純にPHPで使いたいだけの時は、

````
heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-php
````

でOK


## 1Dynoでインスタンスを寝かせない

scheduler使うのもいいけど new Relicとかで監視POST送るほうがいろいろ役立ちそう。


## herokuで独自ドメイン

````
heroku domains:add mydomain.com
````

これでドメイン登録は完了。
後はドメイン側にCNAMEレコードを追加する。

````
CNAME	{appId}.herokuapp.com
````

ルートドメインで運用したい場合には、CNAME使えないことも多いので、
ALIASレコードが使えるネームサーバを選択する。

herokuだと`pointDNS`あたりのネームサーバが便利。

## herokuでステージング環境

````
$ heroku fork --from {appId} --to {stageAppId}
````

forkコマンドはアプリケーションを複製する。アドオンも複製するので、必要なければさっさと消したりしたほうが。

アプリケーションを複製してもソースをcloneしてきて別管理…みたいな話ではない。
単にアプリケーションに「このアプリはforkされてますよ」的なマーカを付けるだけっぽい

なにはともあれpushしないとデプロイ出来ないので。

本番環境用のソースとして使用してるトコ(remoteにherokuついてるトコ)に移動して、

````
$ git remote add stage {stageGitUrl}
````

とする。これで`git push stage master`でステージングデプロイ、`git push heroku master`で本番デプロイできるような感じになる。

heroku のgit url は　`https://git.heroku.com/{appId}.git`でいける。

フォークすると`heroku config`とか`heroku logs`とか叩くときにアプリケーションIDの指定が必要になってくる。

````
heroku config --app {appId}  # 本番の設定確認
heroku config --app {stageAppId}  # ステージングの設定確認

heroku logs --remote {stageRemoteName} # ステージのログ確認
````

アプリIDでの指定がめんどくさかったら`remote`オプションを用いてリモート名を用いる事も可能。


## heroku run でコードを実行

psysh 入れとくと何かと捗りそう。
においセンサー（TGS2450）✖️ Arduinoの情報取得


## 事前準備
においセンサー（TGS2450）を利用したデバイスの実験

```用意したもの
・TGS2450（においセンサー）
・Arduino Nano
・RN42(Bluetoothモジュール)
・2SC1815（トランジスタ）
・1kΩ 抵抗 4個
・100Ω 抵抗 4個
・DC12Vアダプタ 
```

すべて、秋月電子で購入可能です。

## 回路設計
まず、以下のサイトを参考にして設計する。
http://tadahiko.justhpbs.jp/arduino/arduino_TGS2450.htm


![tgs2450.png](https://qiita-image-store.s3.amazonaws.com/0/52867/941a7992-f362-9827-104e-b4fb142411d7.png "tgs2450.png")

25Ωの作り方は、100Ωの並列にして合成抵抗にすれば作れます。
（25Ω= 1/100Ω + 1/100Ω + 1/100Ω + 1/100Ω）


## 配線作業

とりあえずはBluetooth接続なしで配線します。

![IMG_0604.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/90fa50f9-64fa-df93-6478-463734f5c595.jpeg "IMG_0604.JPG")


## プログラムと実験

```Arduino
int val = 0;

void setup() {
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    Serial.begin(115200);
}
 
void loop() {
    for (int i = 0; i <= 3; i++){
        delay(242);
        digitalWrite(4,HIGH);
        delay(8);
        digitalWrite(4,LOW); 
    }     
    delay(237);
    digitalWrite(3,HIGH);
    delay(3);
    val = analogRead(5);
    delay(2);
    digitalWrite(3,LOW);
    digitalWrite(4,HIGH);
    delay(8);
    digitalWrite(4,LOW); 
    val = 1023 - val;
    val = val * 5;
    Serial.println(val);
    // 3msec loop
    delay(3000);
}

```

プログラム実行すると、シリアルモニターに数値が出ます。
数値は 0 ～ 5000。

数値が安定するまで待ちましょう。

```
 通常は600前後
```

何かを燃やして当てる1300前後の数値になったので、センサーは正しいってことかな。。。。

ただし、「数値が高い　= においが強いで」あり、不快な匂いではないようです。


## Bluetoothでの接続
Bluetoothでの接続はRX,TX(UART)をモジュールに繋げるだけ。


![IMG_0607.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/1a862f82-a58c-42cf-d337-10227c72e60e.jpeg "IMG_0607.JPG")

あとはMacなどでペアリングしてSCREENでみれば、数値がかえってきます。

LCDを追加した完成品
![IMG_0610.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/6555e350-53ba-f81b-9d04-c48c56c7caa8.jpeg)