OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3のバリデーションメソッドのデフォルト値についての注意

#CakePHP3のバリデーションメソッドのデフォルト値についての注意

##バリデーションメソッドの引数について
バリデーションメソッドには昔から引数を指定することが可能です。

(例)CakePHP2の数値比較

```
public $validate = array(
    'min' => array(
        'maxMin' => array(
            'rule' => array('comparison', '<=', 59),
            'message' => '正しい時間を入力してください'
        )
    )
);

```
また、バリデーションメソッドによってはデフォルト値が指定されています。

(例)CakePHP2のメール形式チェック

```
    public $validate = array(
        'mail' => array(
            'mail' => array(
                'rule' => array('email'),
                'message' => '正しく入力してください',
            ),
        ),
    );

```

`lib/Cake/Utility/Validation.php`

```
public static function email($check, $deep = false, $regex = null) {
```

##で、CakePHP3
CakePHP3なのですが、引数の一番最後に、`$context`というものが自動で追加されます。

もう少し正確に言うと、バリデーションに渡す引数の**一番後ろ**に、entityの情報などを含んだ配列を一緒にバリデーションメソッドに渡しています。

実際に例を出した方が早いと思いますので例を出します。

`Model\Table`でのEmailのチェック

```
    public function validationDefault(Validator $validator)
    {
        $validator
            ->notEmpty('mail', '入力してください')
            ->add('mail', 'email', [
                'rule' => ['email'],
                'message' => '正しく入力してください',
                'last' => true,
            ])
        ;
        return $validator;
    }
```

`Cake\Validation\Validation`

```
public static function email($check, $deep = false, $regex = null)
{
//deepはfalseが入るはずだが$contextの内容が入ってきてしまうため、思った動作をしない。
```
本来は、`$check`がバリデーションチェック値で、`$deep`はfalse、`$regex`はnullになってほしいのですが、tableのバリデーションの指定で引数をなにも指定していないので、**一番後ろの第二引数に`$context`が入ってきてしまっています。**

因みに上記動作が起きている原因ですがここです

`Cake\Validation\ValidationRule`

```
if ($this->_pass) {
    $args = array_merge([$value], $this->_pass, [$context]);
    $result = call_user_func_array($callable, $args);
} else {
    $result = $callable($value, $context);
}
```
**デフォルト値とかガン無視して渡ってきている引数の一番後ろに`$context`をつけているからですね。はい。**

##まとめ
現状だと、デフォルト値があるバリデーションについては、デフォルト値のままだとしても全部設定しておかないと正常に動作しない可能性があります。

とりあえず、お？と思ってEmailの第二引数まで(`$check`, `$deep`)指定して第三引数(`$regex`)を入れなかったら**何もメールアドレスが通りませんでした。**(当たり前)

~~特に、`$context`が来ることを想定された記述になってないしどうみてもバグな気しかしないけど~~設計思想にかかわってきそうなところなので何とも言えません・・・。

とりあえず独自のバリデーションについては、デフォルト値で設定しているものについて`$context`の中身がきたら、デフォルト値に差し替えるという対応でひとまずカバーしてます・・・。
SourceTreeでrebaseして（恥ずかしい）微修正コミットをその前のコミットに含める

![thermometer-cloudbit-p150705__Git_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/d120274f-ca5f-27c4-cdc9-6df1b03284e9.jpeg)

一番上の「微修正」のコミットを、その1つ前の「🐛未使用のgem（rest-client）を削除」というコミットに含めてしまいましょう。

まず、

1. 「🐛入力が表示されないバグを修正」を右クリック
2. 「33646e5の子を対話形式でリベース」を選びます。

すると以下のような画面になります。

![スクリーンショット_2015_07_09_14_34.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/072742d2-f360-5b0f-975c-ef8117e1e1ad.jpeg)

1. 下の「過去を含めてsquashする」をクリック
2. 下の「メッセージを編集」をクリック
3. 統合されたコミットのメッセージを決めます。
4. 最後に「OK」を押せば完了です。
2つのファイルの重複している行を出力するシェルスクリプト

※追記：cat a.txt b.txt | sort | uniq -d で解決します

```bash:worseway
  1 #!/bin/bash
  2 
  3 if [ $# = 0 ] ; then
  4   echo "set 2args"
  5   exit 1
  6 fi
  7 
  8 if [ ! -f $1 ] ; then
  9   echo "no such file: $1"
 10   exit 1
 11 fi
 12 
 13 if [ ! -f $2 ] ; then
 14   echo "no such file $2"
 15   exit 1
 16 fi
 17 
 18 cat $1 | while read line1
 19 do
 20   cat $2 | while read line2
 21   do
 22     if [ $line1 = $line2 ] ; then
 23       echo $line1
 24     fi
 25   done
 26 done
```

※データ多いと死にます。ハッシュマップ使いたいすね。
This is the title

This is a text

somewhere
below of this 

## there is a subtitle
or something

* else
* like
	- a list
	- where
* some items
* are unindented

1. numerations
2. also are part
3. of this

## Conclusion
Ok,I _like_ this app. Despite it asked me for an access authorization to my [github](http://link.com) account.

Bye!
２週間でここまで出来た!!２週間チャレンジ

２週間、仕事終わってから寝るまでの間(通勤時間３０分と、家〜寝るまでのだいたい２時間くらい)をつかってできた事を共有。

## 色々遊べるハニーポット

最初に試してみたかった事はハニーポット。

[JPドメイン　Web改竄速報](http://izumino.jp/Security/def_jp.html) を眺めていると本当にいろんなサイトがクラッキングされているのを目にする事が出来る。
そこで、安全に不審なアクセスをさせて、観察してみたいなと思い、WEB専用のハニーポットアプリを探して行き着いたのがGlastopf。
アクセス情報はでファイルと、SQLiteのデータベースにデータが保存されるので、統計取ったりするには便利そう。
（今回は統計を取るじ時間までは作れなかったので、今後やっていく予定）

[Glastopfで不穏な行動を安全に観察しよう！](http://atani.github.io/2015/06/Glastopfで不穏な行動を安全に観察しよう！/)

ハニーポットを検索すると一番目についたのがKippo。ssh専用のハニーポットになるが、実際に設定すると辞書攻撃を大量にされ、色んなパスワードが見れて、面白い。
また、あらかじめ設定しておいた、アカウント/パスワードを使ってログインされた場合に侵入者が実行したログを再生する事が出来るのが非常に面白かった。

[ssh専用ハニーポットKippo](http://atani.github.io/2015/07/ssh専用ハニーポットKippo/)

## mruby-geoipで地理情報取得。

今、もっともアツい mod_mruby。これにmruby-geoipを組みこんで地理情報取得を一番やりたかった。
だいぶハマってしまったがデバッグ方法など学ぶことができた。

[mod_mrubyとmruby-geoipを使って地理情報でアクセス制御](http://atani.github.io/2015/07/mod-mrubyとmruby-geoipを使ってアクセス制御/)

## CentOS7に触れることができた。

また、今回初めてCentOS7に触れ、これまでのCentOSとの相違点を少し学ぶ事ができた。主にはfirewalld。

[firewalld 備忘録](http://atani.github.io/2015/06/firewalld-備忘録/)

## 最後に

本ブログを作成中にも色んな方にサポートをいただいた。

[hexoプラグインのご紹介](http://atani.github.io/2015/06/hexoプラグインのご紹介/)

特に、[@matsumotory](http://hb.matsumoto-r.jp/)さん、[@kazu69](http://blog.kazu69.net/)さん, [@harasou5](http://harasou.github.io)さんには大変お世話になった。感謝。

Rubyの生みの親である [@matz](https://twitter.com/yukihiro_matz/status/617374830464102400)さんに当方のブログをtweetしていただいて、大変恐縮だった。

今後も引き続き応援宜しくお願いします。

※ 本記事は [2週間でここまで出来た!!2週間チャレンジ](http://atani.github.io/2015/07/%EF%BC%92%E9%80%B1%E9%96%93%E3%81%A7%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E5%87%BA%E6%9D%A5%E3%81%9F%EF%BC%92%E9%80%B1%E9%96%93%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8/) の転載記事になります。
mongoDB timestamp カラムが Binary(unixtime) の場合と ASCII の場合とで違いを確認した

mongoDB で timestamp のカラムを Binary(unixtime) にした場合と、ASCII 文字列とした場合とで、インデックスの大きさとか、クエリーのパフォーマンスが変わるのかと思って確認してみた。


##登録データ

    (Binary ケース)
    mongodb> db.test11.findOne()
    {
            "h" : {
                    "t" : 1400000000,
                    "n" : "host0001",
                    "i" : "item0001"
            },
            "d" : [
                    {
                            "p" : "parameter0001",
                            "v" : 1.1
                    },
                    {
                            "p" : "parameter0002",
                            "v" : 2.2
                    },
                    {
                            "p" : "parameter0003",
                            "v" : 3.3
                    }
            ]
    }

    (ASCII ケース)
    mongodb> db.test12.findOne()
    {
            "h" : {
                    "t" : "1400000000",
                    "n" : "host0001",
                    "i" : "item0001"
            },
            "d" : [
                    {
                            "p" : "parameter0001",
                            "v" : 1.1
                    },
                    {
                            "p" : "parameter0002",
                            "v" : 2.2
                    },
                    {
                            "p" : "parameter0003",
                            "v" : 3.3
                    }
            ]
    }



##クエリー

    (Binary ケース)
    mongodb> db.test11.find({'h.t':{'$gte':1400000000,'$lte':14000086400}}).explain()

    (ASCII ケース)
    mongodb> db.test12.find({'h.t':{'$gte':'1400080000','$lte':'1400082000'}}).explain()



##結果

###インデックスサイズ(MB)

|データ数|Binary ケース|ASCII ケース|
|:-:|:-:|:-:|
|1000000|24|26|
|2000000|47|53|
|10000000|239|268|


###クエリーのパフォーマンス(msec)
数回クエリーを発行して、Index, データがメモリに乗ったであろう状態から測定開始

*query(1%)*

|データ数|Binary ケース|ASCII ケース|
|:-:|:-:|:-:|
|1000000|0|0|
|2000000|1|1|
|10000000|73|65|

*query(2%)*		

|データ数|Binary ケース|ASCII ケース|
|:-:|:-:|:-:|
|1000000|1|1|
|2000000|2|2|
|10000000|145|133|
		
*query(5%)*

|データ数|Binary ケース|ASCII ケース|
|:-:|:-:|:-:|
|1000000|3|3|
|2000000|7|6|
|10000000|357|323|


##気付き

**インデックスサイズは、ASCII ケースの方が大**

**クエリーパフォーマンスは、ASCII ケースの方が数%-10数% よい**

あくまで参考として。
smallbasicでｃ＃のIDE

ｃ＃でparallelをやりたかったのでIDE作った。

## 画像
![csc.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/74efce92-ca0c-282f-a460-a62e68b901f5.png)

## サンプルコード
```
C = Text.GetCharacter(34)
R = Text.GetCharacter(13) + Text.GetCharacter(10)
code = ""
GraphicsWindow.BackgroundColor = "skyblue"
button1 = Controls.AddButton("caption", 350, 400)
Controls.SetButtonCaption(button1, "clr")
button0 = Controls.AddButton("caption", 300, 400)
Controls.SetButtonCaption(button0, "csc")
textbox = Controls.AddTextBox(10, 400)
Controls.SetTextBoxText(textbox, "main.cs")
mtextbox = Controls.AddMultiLineTextBox(0, 0)
Controls.HideControl(mtextbox)
Controls.SetSize(mtextbox, 580, 380) 
Controls.SetTextBoxText(mtextbox, code)
Controls.Move(mtextbox, 10, 10)
Controls.ShowControl(mtextbox)
Controls.ButtonClicked = output
Sub output
  button = Controls.LastClickedButton
  If (button = button1) Then
    Controls.SetTextBoxText(mtextbox, "")
  ElseIf (button = button0) Then
    file = "c:\cs\" + Controls.GetTextBoxText(textbox)
    text = Controls.GetTextBoxText(mtextbox)
    File.WriteContents(file, text)
    csc = "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\csc.exe"
    code = ""
    code = code + "Function setup(a)" + R 
    code = code + "Set obj = CreateObject(" + C + "WScript.Shell" + C + ")" + R
    code = code + "  obj.run " + C + "cmd /K CD c:\cs & " + csc + " " + file + " & main.exe" + C + R
    code = code + "setup = "  + C + C + R
    code = code + "End Function" + R
    a = Class1.VBSrun(code)
  endif
EndSub
```
## サンプルコード
```
using System;
using System.Threading.Tasks;

namespace Hello
{
	class Hello
	{
		static void Main(string[] args) 
		{
			double total = 0;
			Parallel.For(0, 100000, item => {
				total += Math.Pow(item, 2);
			});
			Console.WriteLine("result: 333328333350000");
			Console.WriteLine("result: {0}", total);
			Console.ReadKey();
		}
	}
}
```
<input type=submit>は止めて<button type=submit>を使うべき

表題の通り

# 問題

多くのHTML Formでは送信ボタンのサンプルとして以下のようなコードを例示してします。

```html
<form>
  <input type='submit' value='送信'>
</form>
```

もしボタンによって処理を分岐させたいのであれば、このようなコードを書きます。

```html
<form>
  <input type='submit' name='action' value='送信'>
  <input type='submit' name='action' value='下書き保存'>
</form>
```

```php
if ($_POST['action'] == '送信') {
  // 送信処理
} else if ($_POST['action'] == '下書き保存') {
  // 保存処理
}
```

しかしこの方法では、ソースコードに日本語の文字列が加わって少々気持ち悪いです。

また、さらには

- 複数言語対応した時に分岐が面倒になる。
- （最近は問題ないが）日本語の文字コードの問題が発生する。

などの問題が出てくるかもしれません。

# 解決

以下のようなコードを書くべきではないでしょうか。

```html
<form>
  <button type='submit' name='action' value='send'>送信</button>
  <button type='submit' name='action' value='save'>下書き保存</button>
</form>
```

これならサーバーサイドでは`$_POST['action'] == 'save'`という比較で済むので安心です。

そもそも`<button>`を使うほうが汎用性が高いので、最初から全ての送信ボタンは`<button>`を使うべきだと思います。
どうでしょう。
1分でできる！mysqlslapでDBのかんたん性能調査、ベンチマーク

業務中にそこそこ大きなスキーマ変更をすることになり、実際パフォーマンスに変化があるかベンチマークを取る必要が出てきました。


jmeterとかでごりょごりょとかしないとなのかーとか思ったのですが、
今回はスキーマ変更のみなので、単純にDBのみの測定でよいので、なんかいいツールはないかと探したところ、

mysqlslapなるものがあるようなので試してみました

[4.5.7 mysqlslap — Load Emulation Client](https://dev.mysql.com/doc/refman/5.7/en/mysqlslap.html)

> mysqlslapはMySQLサーバのクライアント負荷をエミュレートし、各ステージのタイミングを報告する診断プログラムです。サーバにたいして複数のクライアントがアクセスしているかのように作動します。mysqlslapはMySQL 5.1.4.から提供されています。


さっそく試してみーる

# 使い方

mysqlがインストールされていれば標準でmysqlslapもインストールされているはずなので、すぐ使えます

基本的には、測定する際特定のスキーマを作って、テキトーなクエリを実行してベンチマークを取る感じのようですが、
今回は実際の本番相当のデータ量のテーブルを用意し、それに対して測定を行いました。

```sql
#SQL

SELECT * FROM TMP_TABLE WHERE hoge = 'hoge'
```

```sh
/usr/local/mysql/bin/mysqlslap\
 --no-defaults\
 --user=USER\
 --password=PASS\
 --host=localhost\
 --port=3306\
 --engine=innodb\
 --concurrency=500\
 --iterations=30\
 --create-schema=TMP_DB\
 --query="SELECT * FROM TMP_TABLE WHERE hoge = 'hoge'"


Benchmark
        Running for engine innodb
        Average number of seconds to run all queries: 0.755 seconds
        Minimum number of seconds to run all queries: 0.702 seconds
        Maximum number of seconds to run all queries: 0.795 seconds
        Number of clients running queries: 500
        Average number of queries per client: 1
```
的な感じでベンチマーク取れます！
500回SELECTするのを30回行い、それらの最大最小平均が取れます


## オプション

|オプション|内容|
|:-----------|:------------|
|no-defaults|設定ファイルに書かれたデフォルトをスキップ|
|user|接続ユーザ|
|password|パスワード|
|host|mysqlのhost|
|port|mysqlのpoot|
|engine|対象ストレージエンジン|
|concurrency|シミュレートする実行の数|
|iterations|実行するテストの回数|
|create-schema|テストを実行するスキーマ|
|query|実行するクエリ（ファイル指定も可能）|

今回は作成済みのDB、テーブルに対して実行したのですが、
他にもテキトーなクエリを自動生成して、ベンチマークを取ることもできるようです。
というかそのほうが本来の使い方っぽいですね。。。

設定ファイルいじって性能確認する的な。



ともあれとってもお手軽！

ベンチマークというと手間かかるなーと思いがちですが、
これなら、実装後にさくっと確認できていい感じです！

もっと早く知りたかった・・・!

<br />

感謝致します。
BLOB2String

ここは広告です。（よろしくお願いいたします。 :blush: )
***
<a href="http://www.amazon.co.jp/gp/aw/rd.html?ie=UTF8&a=B00FWOMRGE&at=servicefree-22&dl=1&lc=msn&uid=NULLGWDOCOMO&url=%2Fgp%2Faw%2Fd.html" alt="(アーケード) ARCADE チノパンツ チノ スキニー メンズ チノパンカーゴ 小尻・脚長 カラー"><img src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00FWOMRGE&Format=_FMjpg_SL80_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=servicefree-22" style="vertical-align:middle;"/></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=servicefree-22&l=msn&o=9&a=B00FWOMRGE" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<span style="font-size: 12px;">AMAZON (アーケード) ARCADE チノパンツ チノ スキニー メンズ チノパンカーゴ 小尻・脚長 カラー</span>
***

以下は、PLSQLでBLOB項目を文字列に変換し、ローカルファイルに出力する処理です。
***
```plsqlコードです。
--sqlplus -s username/password@tns @thissql

WHENEVER SQLERROR EXIT 1
SET LINES 32000
SET TERMOUT OFF
SET ECHO OFF
SET NEWP 0
SET SPA 0
SET PAGES 0
SET FEED OFF
SET HEAD OFF
SET TRIMS ON
SET TAB OFF

PROMPT
SET VERIFY OFF

VARIABLE PDF_FILE_ID NUMBER

BEGIN
    :PDF_FILE_ID := -1;
    :PDF_FILE_ID := TO_NUMBER('&1');
EXCEPTION
    WHEN OTHERS THEN NULL;
END;
/

SET SERVEROUTPUT ON SIZE UNLIMITED

spool &1..txt

DECLARE
    CURSOR cur_LOB_SIZE(id NUMBER) IS
        SELECT
            DBMS_LOB.GETLENGTH(LOB_ITEM) AS "SIZE"
        FROM
            USER_SCHEMA.LOB_TABLE_NAME TBL
        WHERE
            ID_PRIMARY = id
        AND COND_ITEM IN ('application/pdf', 'application/x-fmfcm')
    ;
    
    CURSOR cur_LOB_TEXT(id NUMBER, offset NUMBER, amount NUMBER) IS
        SELECT
            DBMS_LOB.SUBSTR( LOB_ITEM, amount, offset) AS PDF
        FROM
            USER_SCHEMA.LOB_TABLE_NAME TBL
        WHERE
           ID_PRIMARY = id
    ;
    
    C__SIZE             NUMBER := 1000;
    pw_BUFFER           VARCHAR2(32767);
    
    pw_LENGTH           NUMBER := 0;
    
    pw_COUNT            NUMBER := 0;
    pw_SIZE             NUMBER := 0;
    
BEGIN
    DBMS_OUTPUT.ENABLE(NULL);
    
    OPEN cur_LOB_SIZE(:PDF_FILE_ID);
    FETCH cur_LOB_SIZE INTO pw_LENGTH;
    CLOSE cur_LOB_SIZE;
    
    IF pw_LENGTH > 0 THEN
        LOOP
            IF pw_COUNT + C__SIZE > pw_LENGTH THEN
                pw_SIZE := pw_LENGTH - pw_COUNT;
            ELSE
                pw_SIZE := C__SIZE;
            END IF;
            
            OPEN cur_LOB_TEXT(:PDF_FILE_ID, pw_COUNT + 1, pw_SIZE);
            FETCH cur_LOB_TEXT INTO pw_BUFFER;
            CLOSE cur_LOB_TEXT;
            
            DBMS_OUTPUT.PUT_LINE(pw_BUFFER);
            
            pw_COUNT := pw_COUNT + pw_SIZE;
            
            IF pw_COUNT >= pw_LENGTH THEN
                EXIT;
            END IF;
        END LOOP;
    END IF;
END;
/

spool off

SET TERMOUT ON

PROMPT
HOST if exist &1..txt. ECHO &1..txt is created.

SET TERMOUT OFF
```
Linuxで便利な機能個人的備忘録

個人的に使ってるサービスのメモとか。
インストール直後に設定したいアレコレ
ちょくちょく追加していきたい

# ヒストリの設定

```bash:.bashrc
# ヒストリの保存件数を５万件に変更
HISTSIZE=50000
# ヒストリにタイムフォーマットを追記、表示する
HISTTIMEFORMAT='%Y/%m/%d %H:%M:%S '
```

# Git

```bash
### git statusなど美しく表示
$ git config --global color.ui true
```

# ワンライナーで美しく

```bash
$ [ "a" != "b" ] && echo "say ho!"

# ログファイルの圧縮とかまとめて。書き込み中のログファイルを間違えてやらないように注意
$ find -name "*filename*" | xargs gzip 

# 某サイトのリザルトを並び替えるやつ(個人メモ)
$ curl http://*****/?result | iconv -f SJIS -t UTF8 |awk 'match($0,/<a href=.*\">(.*)<\/a>(.*)<\/li>/,result){ print result[2],result[1] }' |sort -n

# ディスクの圧縮しつつバックアップ
$ dd if=/dev/sda1 | gzip -c > sda1.img.gz

# ディスクの解凍しつつリストア
$ gzip -dc < sda1.img.gz | dd of=/dev/sda1
```

# インストールしたい物メモ

## docker

一時的に使うサービス類をdockerから起動して使い捨てれるようにする。

最近のサービス類インストール手順が簡略化しててついつい色々試してしまう。
その半面環境変数汚染してたりしてアンインスコするの大変なのでこれを代替にしたい。

# おわり
CakePHPでModelを使わずにDBを見る

SQL大好きな人がCakePHPでもSQLを書きたい、Modelを使いたがらない人向け

```php:Modelを使わずにDB参照する例
<?php
App::uses('AppController', 'Controller');
/**
 * Test Controller
 *
 */
class TestController extends AppController {

	public function index()
	{
		App::import('Model','ConnectionManager');
		$db =ConnectionManager::getDataSource('default');
		$result=$db->query('select * from datatable1');
		
		echo "<pre>";
		print_r($result);
		echo "</pre>";
		
		exit();
	}
}
```

ConnectionManager::getDataSource()で指定してる default とは
Config/database.phpで定義したDB設定です。
ということは、ここを書き換えるだけで、複数のDBを見に行くことができるわけです


```php:複数DBを参照する例

	App::import('Model','ConnectionManager');
//通常のDBを参照する
	$db1 =ConnectionManager::getDataSource('default');
	$result=$db1->query('select * from datatable1 where id=1');

//違うDBを参照する
	$db2 =ConnectionManager::getDataSource('otherdb');
	$result=$db2->query('select * from datatable2 where id=2');

```

何かしらの都合でDBが分散しているとか、
負荷分散でアクセスするDBをその都度変えたいとか
そんな用途にはもってこいだと思っています。
PythonとRubyで簡単なWebスクレイピング

Webスクレイピング -> WebサイトのHTMLデータを収集して、特定のデータを抽出・整形することです。

今回はPythonとRubyのやり方の１つをそれぞれ紹介します。

# Python: BeautifulSoup4

PythonではBeautifulSoupを使うとけっこう便利です。

## インストール

```bash
pip install beautifulsoup4
```

## 使い方

```py
import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("http://example.com")
# => もちろんファイルを読み込んだりもできます。

soup = BeautifulSoup(html)

# 便利なメソッドがいっぱい！
soup.find_all('td')
soup.find("head").find("title")
soup.find_parents()
soup.find_parent()
soup.descendants()

# タグの名前変更、属性値の変更、追加、削除も出来るみたいです！
tag = soup.a
tag.string = "New link text."
tag
# => <a href="">New link text.</a>

soup = BeautifulSoup("<a>Foo</a>")
soup.a.append("Bar")
# => <a href="">FooBar</a>

```

Pythonってほぼつかったことないけどけっこう楽しく使えました。

# Ruby: nokogiri

## インストール

```bash
gem install nokogiri
```

```Gemfile
source 'https://rubygems.org'
gem 'nokogiri'
```

```bash
bundle
```

## 使い方

```rb
charset = nil
html = open("http://example.com") do |f|
  charset = f.charset 
  f.read 
end

doc = Nokogiri::HTML.parse(html, nil, charset)

doc.title
doc.xpath('//h2 | //h3').each do |link|
  puts link.content
end
```

```rb
html = File.open('data.html', encoding: 'utf-8') { |file| file.read }
doc = Nokogiri::HTML.parse(html, nil) do |d|
  d.xpath('//td').each do |td|
    pp td.content
  end
end

```

個人的にはやっぱりRubyが好きでした。

# 参考

PythonとBeautiful Soupでスクレイピング - Qiita
http://qiita.com/itkr/items/513318a9b5b92bd56185
kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)
http://kondou.com/BS4/#
Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル] - 酒と泪とRubyとRailsと
http://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/
MacでIntel Edisonを使う


Edisonを使ってみたのでメモ書きです。逐次更新。


# 前提条件

* MacOSX Yosemite


# シリアルコンソールに接続する

GNU Screenでシリアルコンソールに接続できる！知らんかった。Edisonを接続すると `/dev/tty.usbserial-XXXXXX` というデバイスファイルが生成されるので、このシリアルポートを操作すれば良い。速度は115200bpsとする。

```
screen /dev/tty.usbserial-A903BXPX 115200 -L
```


# ファームウェアのアップデート

[Phone Flash Tool Lite](https://software.intel.com/en-us/articles/flash-tool-lite-user-manual)を使う。ツールをインストールして立ち上げると次のような画面になる。

![kobito.1436411268.000656.png](https://qiita-image-store.s3.amazonaws.com/0/29860/6b56e620-6ff0-10ee-b4a1-ff498d5608a2.png "kobito.1436411268.000656.png")

[Intel® Edison Board Software Downloads](https://software.intel.com/en-us/iot/hardware/edison/downloads)のページにある **Yocto complete image** をダウンロードする（ [古いファームウェアはこちら](https://downloadcenter.intel.com/download/24909) ）。ツールを立ち上げて、右上の **Browse** ボタンをクリックして先ほどダウンロードしたファイルを選択する。

![kobito.1436411211.131144.png](https://qiita-image-store.s3.amazonaws.com/0/29860/c20f75c5-7c55-53eb-2ce2-4790aba0e7d3.png "kobito.1436411211.131144.png")

USBケーブルでEdisonを立ち上げると **Start to Flash** ボタンが有効になるのですかさずクリック（時間が経つとそのままLinuxが起動してしまう）。

![kobito.1436411496.006094.png](https://qiita-image-store.s3.amazonaws.com/0/29860/3e95c0c4-0e26-1092-4818-0d7e17237a9a.png "kobito.1436411496.006094.png")

右上のプログレスバーが100%になるまでじっと我慢。

![kobito.1436411581.986238.png](https://qiita-image-store.s3.amazonaws.com/0/29860/8508294a-2ac6-d3a8-8fef-8636996c173a.png "kobito.1436411581.986238.png")

シリアルコンソールでも書き込みを行っている様子がわかる。

![kobito.1436411661.273299.png](https://qiita-image-store.s3.amazonaws.com/0/29860/73d28cc1-0b7f-39b1-26e1-019bdc18b148.png "kobito.1436411661.273299.png")

書き込み完了。自動的に再起動します。

![kobito.1436411818.250358.png](https://qiita-image-store.s3.amazonaws.com/0/29860/70b070c6-5af5-b19f-dd0c-98c8708cb443.png "kobito.1436411818.250358.png")

書き込まれたファームウェアバージョンは `/etc/version` を確認する。

```
root@edison:~# cat /etc/version
weekly-159
```

# BLE (Bluetooth Smart / Bluetooth Low Energy)を使う

Bluetoothデバイスを有効にする。

```bash
rfkill unblock bluetooth
hciconfig hci0 up
```

`hciconfig` コマンドでデバイスの状態を参照できる。

```plain
hci0:   Type: BR/EDR  Bus: UART
        BD Address: 98:4F:EE:03:B1:09  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING PSCAN
        RX bytes:7090 acl:0 sco:0 events:212 errors:0
        TX bytes:1679 acl:0 sco:0 commands:65 errors:0
```

Advertise中のデバイスを一覧する。

```bash
hcitool lescan
```

Advertise開始。

```bash
# コネクションを受け付ける場合
hciconfig hci0 leadv 0

# コネクションを受け付けない場合
hciconfig hci0 leadv 3
```

Advertise終了。

```bash
hciconfig hci0 noleadv
```



# GPIOの操作

[mraa](http://iotdk.intel.com/docs/master/mraa/python/index.html)を使う。


# 参考

* [Intel Edisonモジュール](http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html)

* BLE
  * [Enabling BLE (Bluetooth Low Energy aka Smart) and Bluetooth on Edison](https://communities.intel.com/docs/DOC-23431)
  * [
Use BlueZ Stack As A Peripheral (Advertiser)](http://stackoverflow.com/questions/16151360/use-bluez-stack-as-a-peripheral-advertiser)
  * [BlueZで遊んでみる](http://www.slideshare.net/kobashin/ble-32572318)
Storyboard IDが未入力だと警告が出る

![スクリーンショット 2015-07-09 12.13.14.png](https://qiita-image-store.s3.amazonaws.com/0/85010/4106b72d-d58c-0714-e2d6-b6d6abd40671.png)

上記の警告が出る。

![スクリーンショット 2015-07-09 12.13.30.png](https://qiita-image-store.s3.amazonaws.com/0/85010/bd8a3f26-455b-d6b6-e27c-9b7088f9d0c6.png)

Storyboard ID が未入力だと警告が出る。
画面を追加するたびに「なんだこれ！？」ってなるorz

＜2015-07-09 追記＞
コメントをしてくれた@dokubekoさんのおかげでスッキリ。
画面遷移が繋がってないとダメってことなのね。
Concrete5で構築したWebサイトの高速化とTinifierアドオンを入れて嵌った話

初投稿がなんとも言えない感じの記事なのはどうなんでしょうね？

タイトルそのままの内容で、オープンソースCMSであるConcrete5で構築したサイトの高速化のためにやったことと、その際に試したTinifierというアドオンでこっ酷い目にあったというお話。

ちなみにこれは5.6系を用いたサイトで試したことです。5.7系？ｼﾗﾈ（
##Concrete5とパフォーマンス
コーポレートサイトなどを構築するのが得意な汎用CMSであり、ページを見たまま編集できる直感的な「編集モード」やカスタマイズ性の高さが売りのConcrete5。
自分はこのCMSでいくつかサイト構築した経験があるのですが、基本けっこう重い。
デフォルトでデータベースから読み出す表示内容をキャッシュとして保存することで動作を高速化する機能が付いているのですがそれだけでは全然足りません。

また、他のCMS同様`<head>`内で各種JSを読み込んでる上に圧縮もされていません。
特にこれはグーグル先生的には相当問題らしくGoogleのWebサイトの速度計測及び改善案の提案をしてくれるPageSpeed Insightsというサービスで計測すると、上記の件に関して「スクロールせずに見えるコンテンツのレンダリングをブロックしている JavaScript/CSS を排除する」「JavaScript を縮小する」という項目でこっぴどく怒られます（特にモバイル）

##Tinifier導入。そして苦行の始まり
そこで、concrete5で構築されたWEBサイトのJavascriptやCSSを最適化してくれる「Tinifier」というアドオンの導入を検討しました。

で、早速導入。

するとどうでしょう、トップページに設置してあったJqueryを利用したスライドショーが動かないではありませんか！
しかし、これは想定済み。導入前に調べた時に、このアドオンのJS最適化機能をONにした場合、JSを利用したプラグイン等が動かない場合があるのでこの機能はOFFにした方がいいという記述を見つけていたので、慌てず騒がずJS最適化をOFF。

これでスライドショーは無事復活。
ぱっと見その他の部分も特に問題ないように見えたのですが…

##ブロックCSSが…！？

concrete5にはブロックCSS（ブロックのデザイン）といってGUIを通じてブロックごとにstyleを適応できる機能があります。
この機能で適応したstyleはインラインCSSとして書き込まれます。

なので、基本的にはコードが汚くなるというかキモくなるので使わない機能なのですが、1つのページで1箇所1回こっきりしか使わないようなデザインを後になって適応したくなったときには、いちいち`main.css`をFTP通じて編集したり何なりとしなくていいのでちょっと便利だったりします。他にもHTMLやCSSがわからないお客さんでも簡単にデザインを変えれるので喜ばれたりするかも？（この機能のせいで割りと全体のデザインを崩されて泣きたくなることも多いのですが…）

で、この機能を使った箇所が1,2箇所ほどあったのですが、これが「Tinifier」を有効化したことによって何故か無効化されているじゃありませんか！

えー、JSだけじゃなくてインラインCSSも動かないんかい…このアドオン導入は諦めるしか無いな…
と、導入を諦めアンインストール。
##が、しかし
**何故かアンインストールしたのにブロックCSSが動いてない！！！！**

さすがに意味がわからない…。

と言うか、concrete5ってアドオンとかは別フォルダ別ファイルから本体もといコアファイルをoverrideして機能を実装する方式で、本体を汚染することは無いはずなのですが…

アンインストールしても、直らないってことは**本体汚染してんじゃね？？？**

もちろん、キャッシュの削除等考えられる対策は全てとったが、変化なし。
うわ、これどうしたらいいんだ、concrete5再インストール？め、めんどくさい…
という感じで途方に暮れていたんですが、ちょうどその頃5.6系で起きていた、IE11で編集モードに入りテキストブロッグを追加すると編集ができない問題を解消したバージョン5.6.3.3が公開されたところだったので、再インストール代わりにアップデートで本体ファイルを上書きしちゃえば直るんじゃね？という安易な考えでアップデート。

すると、ブロックCSSが適応されていなかったところが適応されており、その他特に問題なく直っていることを確認。ようやく一件落着。

concrete5のアドオンは本体汚染の心配はまずなく、どんどん気になるアドオンを気兼ねなく試せる！！って考えてたんですけども、認識を改める必要があると痛感しましたね…
というか、本体おもいっきり汚染とかテスト環境でも対応めんどくさすぎるんじゃ（）
##まとめ
concrete5でも最適化などコア部分に手を加えるようなアドオンについては導入には慎重になるべき（

思いの外記事が長くなってしまったので他にやった高速化については別の記事にしますかね…。
【iOS】【Swift】 Snapshotting a view that has not been rendered results in an empty snapshot

iOS8でUIImagePickerControllerをpresentViewControllerする際、表題のワーニングが出ます。
どうやらiOS8のバグのよう。
[stackoverflow--iOS 8 Snapshotting a view that has not been rendered results in an empty snapshot](http://stackoverflow.com/questions/25884801/ios-8-snapshotting-a-view-that-has-not-been-rendered-results-in-an-empty-snapsho)
*"You can even download Apple's Using UIImagePickerController sample app, run it, and it will generate the same error out of the box." - 2014 Sep 24*

とあるので、一旦無視で。
Webアプリ開発におけるセキュリティ

社内LT用資料なのでマストでおさえておかなきゃいけない重要なところだけ。

> *Never trust user input*
>          -- モット・セキュアナコード

# SQLインジェクション（SQLi）

## 問題点
プログラムがユーザからの入力値を受け取り、その値をパラメータとしてSQLを実行する際に、悪意あるSQL文がInjectされ意図しない結果をまねくこと。

## 対策
Prepared Statementを使うこと。

```php
# bad example
$query = "SELECT * FROM user WHERE id=".$_GET['id']
# what if $_GET['id'] comes with "1; DELETE FROM user"??

# good example
$sth = $dbh->prepare('SELECT * FROM user WHERE id = ?');
$sth->execute(array(11));
```

# クロスサイトスクリプティング（XSS）
## 問題点
HTMLにプログラムで扱った値を表示する際に、Javascriptを埋め込まれ、Cookieを盗まれたり悪意ある動作をさせてしまう。

## 対策
エスケープしましょう。DB上に格納するときにエスケープするのではなく、HTMLで表示するときにエスケープするように。

```php:view.php
<?php
  function h($str) {
    return htmlspecialchars($str)
  }
?>
<body>
  <?php echo h($value) ?>
</body>
```

JavascriptもDOMの使い方によっては脆弱性になりえるので注意。

```js
$.ajax({
  url: /someurl,
  success: function(data) {
    var str = data.sample_string;
    $("#foo").text(str); // Good!
    $("#foo").html(str); // Badddd!
    $("#foo").append(str); // Badddd! You need to escape by yourself.
  }
});
```
```js:escape.js
  var h = (function (String) {
    var escapeMap = {
      '&': '&amp;',
      "'": '&#x27;',
      '`': '&#x60;',
      '"': '&quot;',
      '<': '&lt;',
      '>': '&gt;'
    };
    var escapeReg = '[';
    var reg;
    for (var p in escapeMap) {
      if (escapeMap.hasOwnProperty(p)) {
        escapeReg += p;
      }
    }
    escapeReg += ']';
    reg = new RegExp(escapeReg, 'g');

    return function h (str) {
      str = (str === null || str === undefined) ? '' : '' + str;
      return str.replace(reg, function (match) {
        return escapeMap[match];
      });
    };
  }(String));
```


# クロスサイトリクエストフォージュリ（CSRF）
## 問題点
たとえばアカウントのステータスを変更するプログラムがあったとして、そのURLが
`http://www.example.com/user/status_change?id=a123&new_status=1`
だったとき、悪意あるユーザがこのIDを自由に変更できてしまうと、権限を超えた操作ができてしまう。
## 対策
アクセスしているユーザしかわからない値をもちいて、リクエストを受け付けるときに必ずその値をValidateする。
最近のフレームワークはたいていCSRFに対応していのでその機能を用いること。

```php:prog.php
// this sample is just ONLY sample. Use the feature which is implemented in framework.

$csrf_token_base = "some_random_string_with_enough_length"
$action_name = "user_status_change"; // unique value that identifies page relatively.
$base = $_SESSION['id'].$action_name; // use something unique for each user which only user can know such as session_id stored in cookie.
$crumb = hash_hmac('sha256', $base, $csrf_token_base);

if (count($_POST) == 0) {
  view('user_status_change.html', $crumb);
} else {
  $p_crumb = $_POST['csrf_crumb'];
  if ($p_crumb == $check_crumb) {
    // OK!!
  } else {
    // Not Good!!
  }
}

```

```html:user_input.html
<form action="prog.php" method="post">
  <input type="hidden" name="csrf_crumb" value="<?php echo $crumb?>">
  <select name="new_status">
    <option value="start">Start</option>
    <option value="stop">Stop</option>
  </select>
  <input type="submit" value="change">
</form>
```
# Cookie
 - httponly : JavascriptからCookieにアクセスできないようにする。XSSの対策に有効。
 - secure : HTTPSでのみやりとりされるCookie

# パスワードの取り扱い
 - bcryptベースでハッシュを行う
 - 復号できるようにはしない。一方向ハッシュ


# 参考資料

参考資料：
https://www.owasp.org/images/7/79/OWASP_Top_10_2013_JPN.pdf
web-mode.el のタグを自動で閉じる機能が動かない場合


Emacs拡張のweb-mode.elは、ERBのタグ等が混在しているHTMLファイルの編集において便利になるように色々な機能が盛り込まれている。
そのひとつがタグを自動で閉じる機能である。
たとえば

    <div>hogehoge

と入力した後に、 `</` とだけ入力すると

    <div>hogehoge</div>

といった具合に閉じタグが自動で入力される。

この機能が、一部の環境のEmacsでは動くのに、別の環境のEmacsでは全く同じ設定をしているはずなのに動かない、という困った状況になった。

## 原因

調べてみたところ、一部の環境のEmacsでのみタグを自動で閉じる機能が動作しないのは、そのようになるように作られているためであることがわかった。

> if you work in a terminal (not in window mode), it is normal that the autoclosing does not work.
if you wan't to force it, add (setq web-mode-tag-auto-close-style 1) in your .emacs
> https://github.com/fxbois/web-mode/issues/358

開発者曰く、ターミナルで動作している場合にはデフォルトで無効になるように作ってある、ということらしい。

## 対策

下記の設定を.emacsに追加すればよい。

~~~
(setq web-mode-auto-close-style 1)
(setq web-mode-tag-auto-close-style t)
~~~

さらに、ERBのタグ `<% %>` を自動で閉じてくれる機能(auto pairing)もターミナル上のEmacsではデフォルトで無効になっている。これを有効にするには次の設定を .emacs に追加すればよい。

~~~
(setq web-mode-enable-auto-pairing t)
~~~
Swiftに文字列定数連結がない理由を考えてみた

C言語と似通った構文であるにもかかわらずSwiftでは文字列定数連結がありません。

```c
    char *str = "hoge"
                "hage";
```
こういうやつね。


```swift
    let str: String = "hoge"
                      "hage"
```
これは出来ない。


なぜなのか考えた結果得た結論。

```swift
    let str: String = "hoge";  // <- セミコロンある
                      "hage"
```
と区別が付かないから。
GitBucketをwarで動かしてみた

## インストール

```bash:
sudo apt-get install -y default-jre
```

https://github.com/takezoe/gitbucket/releases/ から最新版をダウンロード

```bash:
wget https://github.com/takezoe/gitbucket/releases/download/3.4/gitbucket.war
java -jar gitbucket.war
```

* データは `~/.gitbucket/` に保存されている。

## ログイン

![a11.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8c0235a7-4eed-cfa6-e337-c0380d8310fc.png)


* http://localhost:8080 にアクセス
  * root,rootでログイン

## アカウントの作成

* http://localhost:8080/admin/users/_newuser にアクセスしアカウント作成

![a12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5e9bbd2f-34cc-928e-97bc-520e6766e3e9.png)

作成完了

## リポジトリの作成

* http://localhost:8080/new

![a14.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8f8315a7-e9b4-cf59-53ff-6ffc8edf695b.png)

![a15.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9afae07e-8842-18f3-6418-87ebe5295ffa.png)

```bash:
git clone http://localhost:8080/git/tukiyo3/test1.git
```

色々編集しコミット、push

![a17.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fc77667b-8c44-aa69-4114-ecd3ac8fd960.png)

pushできた。
OCSNGクライアント セットアップ

忘備録

実行ファイル
以下のファイルをローカルにコピーし、解凍する。Windows版で進めるので、対象はOCSNG-Windows-Agent-2.1.1.zip

[Windows]　 OCSNG-Windows-Agent-2.1.1.zip
[Mac]　 Ocsinventory_Agent_MacOSX-2.1.1.pkg.zip
[Unix系]　 Ocsinventory-Unix-Agent-2.1.1.tar.gz
[Android]　 OCSNG-android-agent-2.1.zip

セットアップ
解凍後の手順を以下に記す。Windowsを例に記載。
解凍後のフォルダ内、OCSNG-Windows-Agent-2.1.1.1\OCS-NG-Windows-Agent-Setup.exeを実行。
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/bf3e5a23-3e71-200f-e0ed-2a3dad9c782c.png)
「Next」を実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/def845ce-a473-d660-943b-88f605ac6d74.png)
「I Agree」を実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/caacf2ae-50b1-212e-2709-4103fb249530.png)
「Next」を実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/ba7c3994-45ae-96b7-c465-9c809023de28.png)
「Server URL」の箇所を以下に変更
　http://localhost/ocsinventory
「Validate certificates」のチェックボックを外す
「Next」実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/f0ea021d-245d-b40d-e618-7525fb523d46.png)
「Next」を実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/36452100-f39c-b0e8-83de-2d5e5015fcf4.png)
「Next」を実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/b1bd1586-2ad8-d2ad-2d74-f99166915c0e.png)
「Install」を実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/b360729a-bac4-cf47-7ccb-e7f6624fd60a.png)
セットアップ完了

注
デフォルトでは、スタートアップに登録されますので、Windowsを起動する度にエージェントが起動されます。PCのリソースを使用しますので、調査期間完了後には、スタートアップより外してリソースを確保して下さい。

通信失敗時
サーバと通信が失敗する場合もあります。その場合は以下の方法でツールを動かして下さい。
タスクバー右端のインジケータ内にエージェントのアイコンが隠れています。アイコン上で右クリックより、「Run OCS Inventory NG Agent now」を実行して下さい。
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/5149a0cb-dd99-0080-a32a-daa6fbc859f0.png)

参考サイト
http://wiki.ocsinventory-ng.org/index.php/Documentation:WindowsAgent
http://wiki.ocsinventory-ng.org/index.php/Documentation:MacAgent
http://wiki.ocsinventory-ng.org/index.php/Documentation:UnixAgent
http://wiki.ocsinventory-ng.org/index.php/Documentation:AndroidAgent
クラス > オブジェクト作成失敗時にNULLを返す > コンストラクタの中から例外を投げられた場合の良い方法を教えていただいた。 

以下の方法(C#で実装)を見つけた。
~~http://blogs.bitlan.net/ito/?p=1261~~
[オブジェクト生成時に失敗したら null で受け取りたい @ 伊藤達也さんのブログ(ITO BLOG)](http://aitos.jp/blogs/ito/?p=1261)


```txt:動作確認
C++ Builder XE4
```

cppにて実際に作ったコード

```sample.h
private:
   // 外部から呼ばないためプライベートにする
   __fastcall TTestClass();
public:
   static TTestClass* __fastcall CreateInstance();
```

```sample.cpp
__fastcall TTestClass::TTestClass() // コンストラクタ
{
    // コンストラクタの処理
}

TTestClass* __fastcall TTestClass::CreateInstance()
{
    if (error) {
       return NULL;
    }
    TTestClass *testClass = new TTestClass();
    return testClass;
}
```

このやり方の問題点というのはまだ理解していない。

<hr>
(追記 2017/01/22)

@SaitoAtsushi さんの[コメント](http://qiita.com/7of9/items/5d0612fda6420d84454f/#comment-56d591ecd7c3ff0fdf42)にて、コンストラクタの中の例外の場合の対応方法を教えていただきました。

情報感謝です。
python初心者がNo module named　'http.server'で詰まった話

##環境
* windows 7 64bit
* python 3.4.3

##コード
```py:http.py
# -*- coding: utf-8 -*-

import http.server

server_address = ("", 8000)
handler_class = http.server.CGIHTTPRequestHandler #1 ハンドラを設定
server = http.server.HTTPServer(server_address, handler_class)
server.serve_forever()
```

上記のように、localhostの8000でLISTENするhttpサーバを立てた時に、
以下のメッセージが出力されて悩んだのでTips。

##エラーメッセージ
```py:error_log
C:\Python34\python.exe C:/Users/xxx/PycharmProjects/untitled/http.py
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 2218, in _find_and_load_unlocked
AttributeError: 'module' object has no attribute '__path__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/xxx/PycharmProjects/untitled/http.py", line 3, in <module>
    import http.server
  File "C:\Users\xxx\PycharmProjects\untitled\http.py", line 3, in <module>
    import http.server
ImportError: No module named 'http.server'; 'http' is not a package
```

##原因
ファイル名をhttp.pyとしてしまったので、test.pyなどに変更するとうまくいく。
※import http.serverのhttpと競合した模様

今回はhttpだがimportする外部のmoduleによっては、
他のファイル名でもアウトになることがあるので注意しましょう。
.fabricrc 以外のファイルを設定ファイルとして利用する方法

以下のようにすれば .fabricrc 以外のファイルも使える。（ただしリストとかは使えない）

config.txt

```
dummy = hogehoge
```

fabfile.py

```
from fabric.main import load_settings

env.update(load_settings('config.txt'))

print env.dummy
```
Javaパッケージ(jar, apk)のサインキーを確認する方法

`keytool`というプログラムはJDKに同梱されてます、JREはわかりません‥

### キーストアファイルから読む

    keytool -list -v -keystore KEYSTORE

### apkフィアルから読む

apk(即ちpkzip)から`META-INF/CERT.RSA`を解凍して、

    keytool -printcert -file META-INF/CERT.RSA

### パスワードがわからないキーストアから読む

[キーストアPWをリセットする手段](https://gist.github.com/zach-klippenstein/4631307)で、キー一覧を読める。（ただしキーパスワードないと相変わらず使えない）
migrationのバージョン齟齬で起動しない場合

![20150701130945.png](https://qiita-image-store.s3.amazonaws.com/0/83911/58ec9733-e123-aab8-d0bc-4d9cb4aa0f38.png)

[Rails - ActiveRecord::PendingMigrationError - Qiita](http://qiita.com/SOJO/items/9ff0bc944ba2888d9291)

リンクのとおり、基本は、db:migrate をしろって話なんだけど、環境的にdatabaseがいろいろあって、そんなことしてられねえよ、という場合。

schema_migrationsに、最新版のファイルのバージョン番号を突っ込む。

20141110100215 とかなんとか。ごにょごにょ。（非推奨）
itamae使ってみた

## 参考

* [Resources · itamae-kitchen/itamae Wiki](https://github.com/itamae-kitchen/itamae/wiki/Resources)
* [fuagawa.rb - itamae 入門 - Qiita](http://qiita.com/rasenn/items/8e234489b0d92ed74cfe)

## 気に入った点

* dry-runの出力が少なくて良い, コマンドが短い, rubyで書ける
* クライアントに何もインストールしなくてよい(ansibleと同じく)

## インストール

```bash:
gem install itamae
gem install highline
```

* highline を入れておかないとプロンプトでパスワード入力時、そのまま出力される！

# パッケージの追加,削除

* [package resource · itamae-kitchen/itamae Wiki](https://github.com/itamae-kitchen/itamae/wiki/package-resource)

```rb:recipe.rb
package "mutt" do
  action :install  #追加
  #action :remove  #削除
end
```

```bash:dry-run
itamae local recipe.rb --dry-run
もしくは
itamae local recipe.rb -n
```

```bash:実行
sudo itamae local recipe.rb
```

## 複数パッケージの扱い

```rb:recipe.rb
%w(tig mutt vim).each do |pkg|
  package pkg do
    action :install
  end
end
```

# sshで投入

* [Getting Started · itamae-kitchen/itamae Wiki](https://github.com/itamae-kitchen/itamae/wiki/Getting-Started)

```bash:
itamae ssh --host srv1 recipe.rb
```

```bash:
itamae ssh --vagrant --host vm_name recipe.rb
```

# テキスト作成

```bash:hello.txtに書き込み
file 'hello.txt' do
  content "Hello, World\n"
end
```

```bash:実行
itamae local hello.rb -n
itamae local hello.rb
```

```bash:hello.txtの内容を変更
file 'hello.txt' do
  content "Hello, \nWorldです\nこんにちは\n"
end
```

```bash:実行
itamae local hello.rb -n
itamae local hello.rb
```

# メッセージ出力 (puts)

```rb:
puts ENV['HOME']+'/Documents/aaa'
```

## ディストリビューション判定

* http://serverspec.org/host_inventory.html

```rb:
puts node[:platform] # ubuntu
```

# ファイル転送 (remote_file)

* ~/Documents/aaa に ~/.bashrc を転送する例

```rb:
remote_file ENV['HOME']+'/Documents/aaa' do
  source '~/.bashrc'
end
```

## テンプレート(erb)利用

```rb:sample.erb
こんにちは <%= @name %>.
```

```rb:sample.rb
template "sample.txt" do 
 source "sample.erb"
 variables({"name" => "太郎"})
end
```

```txt:sample.txt
こんにちは 太郎.
```

ここまで来ると[Itamaeチートシート - Qiita](http://qiita.com/fukuiretu/items/170aa956731f2ffb5715)が少し読めてくる。
そうだ、NetCommons3 を開発しよう。

NetCommons とは、国立情報学研究所が開発している教育用のオープンソースのCMS(死語ですね。。)です。
サイトはこれです。
http://www.netcommons.org 
私は、NetCommons が、XOOPSベースだったころから、かかわっていて、いちおうユーザの立場です。
ユーザなので、発展してほしいので、、開発者になる人を増やそうとここで呼びかけをしています。

NetCommons ですが、普通のIT関係者には、ほとんど知られていません。そもそも、国立情報学研究所のことを知らない人が多いでしょう。ここです。国立情報学研究所は、ここです。http://www.nii.ac.jp/
日本の情報学の学術系での総本山です。国立情報学研究所のサイトも、NetCommons でつくられています。
それに、研究者のデータベースhttp://researchmap.jp も NetCommons です。

大手もつかっているようです。富士通のufinity は、 NetCommons ベースです。
http://www.fujitsu.com/jp/solutions/industry/education/campus/library/ufinity/

で、NetCommons の特徴を

１．国が予算だしてつくっているオープンソースで、成功している（といえるでしょう。）
教育関係では、デファクトです。

２．開発リーダが女性数学者の新井紀子先生。
最近は、『ロボットは東大に入れるか』の研究で忙しく、やや、NetCommons はお留守状態な
気がいていましたが、最近は、また、NetCommons の次世代を頑張ってつくらねばと、ボルテージ
をあげているようです。

３．コミュニティがビジネス的に、そこそこ機能している。
給料をもらってNetCommokns を開発しているコアメンバーがいて、そのまわりに、NetCommons だけで
ビジネスしている企業もあれば、そこそこ収益をあげている企業もあったりします。
ただ、数は少ないのと、大手企業は、やや及び腰のようです。そして、個人で開発に
関わっている人は、あまりいません。


さて、本題です。

このNetCommons ですが、現状のバージョンは、NC2ですが、次世代のNC3の
開発がはじまっています。
github で公開中です。
https://github.com/NetCommons3
NetCommons は、複数の機能をもっているので、その機能ごとの開発が、バラバラとされています。
個人でも、やる気になれば、小さなモジュールぐらいは開発可能なところがよいのです。
というわけで、NetCommons3　（以後NC3と略）の開発に関わりませんか？　という呼びかけです。

どうでしょうか？

NetCommons は、今後どう発展するか？
開発にかかわるなら、今後どうなるかは、気になるところでしょう。

1.アンケート機能をキラーアプリに、
するそうです。前から、アンケート機能はキラーアプリの雰囲気があったのですが、
今後、NC3ではさらに強化して、教育行政の中でも、十分に機能するものにするそうです。
ただ、この話は、NC3が今後、生き残るという話です。
開発に係る人には、あまり関係ないです。

２．ビジネス的には、データベース連動
お金儲けになるのは、この部分です。NetCommons は、学校向けなので、そこそこ
複雑な権限を設定できます。もともとあるその機能をつかって、データベース連動する
部分だけ、カストマイズでモジュールをつくるのがビジネス的にバランスがとれています。
そこそこ大きな金額をもらうことが可能です。データベース連動は、CSVのバッチを
読み込むので十分な場合もあるので、開発の手間がかからず、安いので客もおお喜び
というスイートスポットがあります。ここが大手企業が入りにくいところなのかもしれません。

３．入札条件にNetCommons の固有名詞がでることがある。
http://www.kosen-k.go.jp/procurement/250524-nyusatsu-portal-siyo.pdf
ですが、NetCommons と書いてあります。
今後も、こういった事例は、教育関係では続くと思われます。スクラッチから、
NetCommons の機能を実装するのは、費用対効果で非現実的です。
今後もこういった入札は増えると思われます。

４．NetCommons 関連の求人が増えそう。
NC3の開発がうまくいけば、今後、もっとNC3がらみの仕事が増えると思われます。
今の、NC2 は、フレームワークに、maple ,javascript のライブラリに、prototype.js 
なんで、興味持つ人いるはずないですし、カスタマイズも大変です。
NC3は、cake に、jquery なので、そこそこ面白いでしょうし、動きだせば、開発案件
もたくさんきそうです。

それで、NC3 の開発状況はどうかというと、

まだ、発展途上です。いくらでも、関与する余地がありです。
github を見ればわかるでしょう。

で、これからは、こうなってほしいなと思うところです。

１．NetCommons にコミットするサーバレンタルベンダーがでてくるといいですね。
レンタルサーバにNetCommons をつかってもらうおうとする動きもありましたが、
うまくいっていないように見えます。NetCommons 使うなら、このレンタルサーバ
がいいよというところがほぼ定番となると、やりやすくなるような気がします。
高専研究者ポータルは、NetCommons で構築されています。
http://research.kosen-k.go.jp/
高専出身者が、社長の大手レンタルサーバが興味をもってくれるといいのですが、
どうでしょうか？

２．教育関係IT大手も、NC3 なら、乗ってくるかも。
NetCommons は、学校内部の閉じたポータルとして利用されているケースが結構あるようです。
構内システムを構築している教育関係ITのベンダさんは、おそらく競合と意識しているはずです。
無料のNetCommons で十分だと言われてしまったこともあるのではないでしょうか？
そういった教育IT大手も、NC3の開発に興味をもっているかもしれません。自前のシステムを
今後も頑張って開発継続するのか？　それともサービスモデルに転換して、従来あったシステム
の機能は、NC3 に吸収していくのかは、考えどころのはずだと思うのですが、どうでしょうか？


で、最後ですが、

どうしたらいいかというのですが、まずは、ダウンロードして、動かしてみましょう。
chef や vagrant などの学習にもなります。（すごく大変ですが。。。）
８月２５日には、ユーザカンファレンスもあります。
http://www.netcommons.org/userconf/
そこにでてみるのもいいでしょう。

特に、高専関係者で、プログラミングの実力がある人は、縁のあるアプリケーションですから、
開発にかかわってほしいと思う次第です。
これだけはやりたいGit初期設定

Gitを利用しはじめるとき、これだけはやっておきたい設定をまとめてみました。
とくに、開発のときは問題なくてもLinuxなど本番配備時には **権限変更** が発生すると思います。
デフォルトのままだと、chmodなどのパーミッションの変更も、`git status`で変更とされてしまうため、 **chmodのパーミッション変更を無視する** を設定しましょう。

## ユーザーを設定する

```
$ git config --global user.name "<設定する名前>"
$ git config --global user.email <設定するメールアドレス>
```

## 自己証明書(オレオレ証明書)を許容する

    $ git config --global http.sslVerify false

## コマンドのエイリアスを設定する

```
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.up rebase
$ git config --global alias.ci commit
```

## chmodのパーミッション変更を無視する

```
git config core.filemode false
```

初期設定が終わったら、gitの基本的なコマンドは以下を参照してください。

[Gitでよく使うコマンドまとめ](http://qiita.com/y_arakawa/items/3cefb482205f51b16912)
FET > 相互コンダクタンス g_m

引用: ダイオード・トランジスタ回路入門 by 岡山 努さん
5.1 接合形電界効果トランジスタ

> 入力が電圧で出力が電流ですから、[A]/[V]の単位を持つ相互インダクタンス g_m で増幅率を表示します。式(5.1)をV_{GS}で微分して

```math
g_m = -\frac{2 I_{DSS}}{V_P}(1 - \frac{ V_{GS}}{V_P})
```

I_DSS : ドレイン電流
V_P : ピンチオフ電圧
V_GS : ゲート・ソース電圧
MongoDBでコレクションの中身を全て削除

単純なメモ書きです。

mongoDBでコレクションの中身全て削除したい時にMongoDBのバージョンが2系統と3系統でほんの少しだけ方法が違ったので、書きます。

ver 2.*

```
> db.Room.remove();
```

ver 3.*

```
> db.Room.remove({});
```

ちなみにver 3.0.2で2系統の書き方をすると以下のようなエラーが出ます。

```
> db.Room.remove();
2015-07-09T06:55:59.582+0900 E QUERY    Error: remove needs a query
    at Error (<anonymous>)
    at DBCollection._parseRemove (src/mongo/shell/collection.js:305:32)
    at DBCollection.remove (src/mongo/shell/collection.js:328:23)
    at (s
```

今回は小さな部分ですが、バージョンは気を付けないといけないと思い知らされますね。
技術英語 > moot 'version' property from bower.json

https://github.com/mrdoob/three.js/commit/44884bdb79ee96c25f38cc0e6be8c3012371f98a

> Remove moot `version` property from bower.json

mootという単語は知らなかった。

http://eow.alc.co.jp/search?q=moot&ref=sa
> 1. 議論の余地がある、疑わしい、未決定の、純粋に学問的な
> 2. 非現実的な、現実的［実際的］意味［価値］のない、理論上の、仮定の、空理空論で


jsonのversionプロパティについては、以下に記載がある
http://stackoverflow.com/questions/24844901/bowers-bower-json-file-version-property
scalaでソート


集計とかするときに使えるかも

タプルだとsortByが使える

```scala
scala> val list = List(("aaa",2),("bbb",1),("ccc",4))
list: List[(String, Int)] = List((aaa,2), (bbb,1), (ccc,4))
scala> list.sortBy(_._2)
List[(String, Int)] = List((bbb,1), (aaa,2), (ccc,4))
```

マップ型だとtoSeqでSeqにしてあげる必要がある

```scala
scala> val list = Map("aaa" -> 3, "bbb" -> 1, "ccc" -> 4, "ddd" ->2 )
scala.collection.immutable.Map[String,Int] = Map(aaa -> 3, bbb -> 1, ccc -> 4, ddd -> 2)
scala> list.toSeq
Seq[(String, Int)] = ArrayBuffer((aaa,3), (bbb,1), (ccc,4), (ddd,2))
scala> list.toSeq.sortBy(_._2)
Seq[(String, Int)] = ArrayBuffer((bbb,1), (ddd,2), (aaa,3), (ccc,4))
```

scala難しい。。。
ATOMでのAutoSaveの仕方

#設定方法
`Settings` :arrow_right: `Packages`から `autosave`で検索して`Core Packages` の `settings` から `Enabled` にチェックを入れる。  
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/60144/a902c10f-bc7a-20e6-001f-a763a4b433f1.png)

#別の方法：config.csonを編集することでも変更できる。

```lang:config.cson
  autosave:
    enabled: true
```

***
ウィンドウを閉じたりフォーカスが外れると自動でセーブされるので、コードの確認に便利かなぁと。

[パッケージの説明はこちら](https://atom.io/packages/autosave)（atom.io）

***
つい最近、ATOM使い始めました。
……最初から入ってるなら、もっと簡単に設定できてもいいんじゃないかな！ かな！
HttpURLConnection とリダイレクト

http://developer.android.com/reference/java/net/HttpURLConnection.html
Response Handling　の説明によると、

HttpURLConnectionの場合、
リダイレクトは5個まで。
HTTPSからHTTP、HTTPからHTTPSのリダイレクトは使えない。

ポート80から443にrewriteなどで転送している場合は、要注意かも。
I-O Data USB-BT40LE


中身がbroadcomチップだという理由で買ったbluetooth USBドングル。Linuxで動かす手順。試したのはUbuntu15とArch現行最新。

まず単純にUSBドングルを差し込む。`journalctl -f` で眺めて、下のようなエラーが出ると思う。気持ちが悪いのでこれをやっつける。

```text
Bluetooth: hci0: BCM: patch brcm/BCM20702A0-0a5c-21e8.hcd not found
```

この、Firmwareの読み込みに失敗したというメッセージが出ている場合は、手動でファームウェアを用意する。broadcom が配っているはずのものなのだけど探した範囲では見つけられなかった。その代りに dropbox からダウンロードしろとか、ちょっと使うのが怖い方法ばかりが出てくる。

実は firmware は Windows 版ドライバに入っている hex ファイルを変換して得ることができる。

まず `lsusb` で USB ドングルの Vendor ID, Product ID を調べる。私の場合 `0a5c 21e8` だった。

Windows に移動する(もともと Windows 用なので)。ドライバーをインストールしておく。私の場合はThinkPadのプリインストールが`C:\Program Files\ThinkPad\Bluetooth Software\bin`にあった。インストールした bcm20702 系ドライバの入った `bcbtums-win8x64-brcm.inf` ファイル見つけ出して、中を見る 。ずらずらーとエントリがある中に、対象の ID が見つかるはず。

```text:bcbtums-win8x64-brcm.inf
%BRCM20702.DeviceDesc%=RAMUSB21E8,          USB\VID_0A5C&PID_21E8                           ; 20702A1 dongles
 :
[RAMUSB21E8.CopyList]
bcbtums.sys
BCM20702A1_001.002.014.0889.0896.hex
```

というわけで、`BCM20702A1_001.002.014.0889.0896.hex` が目標のファイル。これを`hex2hcd` で変換する。bluez 5.28 以降で付属するほか、単体では https://github.com/jessesung/hex2hcd で見つかる。

```bash
hex2hcd BCM20702A1_001.002.014.0889.0896.hex BCM20702A0-0a5c-21e8.hcd
```

ファームウェアの置き場所は `/lib/firmware/brcm/` 固定で、ファイル名はエラーメッセージの通りのものにする。

USB を抜き差しすれば、今度は正常にパッチが当たって、認識されるようになるはず。
milkcocoaを使ってページカウンターを作る


# 動機
ふと、一昔前にブログや簡単な自作Webページにページカウンターを入れようとしたときに、CGI作ってテキストの文字をカウントアップして・・・みたいなことを考えていた時期があったのを思い出したのですが、milkcocoaを使えば簡単にできそうな気がしてやってみました。


# 登録まで
milkcocoa（[こちら](https://mlkcca.com)）からユーザ登録をして、Dashboardからアプリを登録しておきます。名称は任意で、分かりやすい名前をつけておきます。難しいUIでもないので迷うことはないと思います。

アプリの登録が完了すると次のような画面がでてきます。

![スクリーンショット 2015-07-09 0.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/48393/92a9e3bc-4edb-d27c-ff28-9559ba6428e3.png "スクリーンショット 2015-07-09 0.43.18.png")

ここのコードは次節で使います。


# 実際に書いてみる
難しいことはないのでコードだけ載せておきます。こんな感じです。

milkcocoaに保存した現在のカウント数を取得して、1足して再度milkcocoaに保存しているだけです。
`dataStore`の`id`を分ければ例のコードのように「今日のカウント」と「トータルのカウント」を分けたりもできます。

milkcocoaを使うために、対象のHTMLにscriptタグを埋め込んでおきます。

```html:index.html
	<script src='https://cdn.mlkcca.com/v2.0.0/milkcocoa.js'></script>
```

```javascript:script.js
$(document).ready(function() {

    // この行はdashboardからコピペして置き換えてください
    var milkcocoa = new MilkCocoa("[your-app-id].mlkcca.com");

    var countDataStore = milkcocoa.dataStore('count');

    countDataStore.get('todayCount', function(err, datum) {
        var todayCount = datum.value.count * 1;
        todayCount++;
        console.log(todayCount);

        countDataStore.set('todayCount', {'count' : todayCount.toString(10)});
        
        // あとはDOMで自由に
        // $('.classname').text = todayCount;
    });

    countDataStore.get('totalCount', function(err, datum) {
        var totalCount = datum.value.count * 1;
        totalCount++;
        console.log(totalCount);

        countDataStore.set('totalCount', {'count' : totalCount.toString(10)});
    });
});

```

クライアントの処理に依存するところもあるので、アクセスが集中すると正確に計測できないとかあるかもしれないですが、JavaScriptで書いておけるので GitHubやAWS S3等の静的ホスティングサービスを使うときにも使えて便利ではないでしょうか。

案の定とても簡単にできたので、個人サイト運営しているけどサーバいじるのもなぁという方には結構おすすめだと思います。

# 注意点
これは何か良い解決策があるのかもしれませんが、一番最初、milkcocoaサーバ上にdataStoreが存在していない状態で、`countDataStore.get('todayCount', function(err, datum) {}`を実行すると`0`ではなく`NaN`が返ってきてうまくカウントアップできないので、始め実行するときは使用する`id`を含む`dataStore`を初期値`0`で作成しておきます。

そのままにしておくと、２回目以降も0で初期化してしまって永遠カウントアップできないので、一度データストアが作成されたことを確認できたら消してしまいます。
データストアに任意のデータが入れられているかどうかは、[Webのdashboard](https://mlkcca.com/edit/)のアプリ管理画面からも確認できます。

（もちろん`NaN`のときだけ新しくデータセットにセットするような条件分岐で書いてもよさそうです）

```javascript:script.js
$(document).ready(function() {

    // この行はdashboardからコピペして置き換えてください
    var milkcocoa = new MilkCocoa("[your-app-id].mlkcca.com");

    var countDataStore = milkcocoa.dataStore('count');

	countDataStore.set('todayCount', {'count' : '0'}); // ここ
	countDataStore.set('totalCount', {'count' : '0'}); // ここ

    countDataStore.get('todayCount', function(err, datum) {
        var todayCount = datum.value.count * 1;
        ...

```

# リンクなど
* [milkcocoa](https://mlkcca.com)
【トラブルシューティング】ElasticBeanstalk on VPCで発生するエラーと対処


ちょっとハマったので、ElasticBeanstalk on VPCに関するトラブルシューティングを紹介します。
EBはあまり細かいログを出してくれないので私は結構苦戦することがありますが、以下の流れで切り分けていくといいと思います。（私の経験と知識の範囲内の話です）

## インターネットGWの設定は適切か

確認のポイント

- VPCにインターネットGWがアタッチされているか確認する。
- VPCサブネットのルートテーブルにサブネットとインターネットGWが設定されているか確認する。
- EBのConfigurationのVPCの設定で、Associate Public IP Addressにチェックが入っているか（PublicなIPアドレスが設定されているか）確認する。
- また同じくEC2やELBのサブネットの関連付けが正しい確認する。

## セキュリティ設定は適切か

確認のポイント

- セキュリティグループの設定でhttp(80)のアクセスは許可されているか確認する。
- ネットワークACLの設定でインバウンドにhttp(80)の許可設定、アウトバンドに一時ポート[^1]の許可設定があるかを確認する。
- 一番手っ取り早い方法は、セキュリティグループもネットワークACLもすべて許可にして問題が解決するかを確認する。

## アプリケーションのデプロイは成功しているか

確認のポイント

- EBのLogsからRequest Logsですべてのログを取得してエラーが起きていないかを確認する。（ログを取得できない場合、上記のいずれかに問題がある可能性が高い）

[^1]: ポート番号はOSの種類による（[ネットワーク ACL - Amazon Virtual Private Cloud](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_ACLs.html#VPC_ACLs_Ephemeral_Ports)）