OmniAICreator/Qiita-1.07M huggingface dataset:
【WordPress】Really Simple CSV ImporterでACFのチェックボックスの値を読み込む

[Really Simple CSV Importer](http://notnil-creative.com/blog/archives/3465)は、CSVファイルをインポートして一括で投稿を登録できる便利なプラグインですが、[ACF](http://www.advancedcustomfields.com/)でチェックボックスを使用していると上手く読み込むことでできません。
というのも、ACFのチェックボックスはDBに保存される値がa:1:{i:0;s:0:"";}のような値になってしまうためです。

例えば、ACFで以下のようにチェックボックスを設定しているとします。

- red:赤
- blue:青
- green:緑

上記の選択肢から赤と青を選択した場合、DBに保存される値はa:1:{i:0;s:0:"red";i:1;s:1:"blue";}のような値になってしまいます。
CSVファイルに「red,blue」とカンマ区切りで指定すればいけそうですが、DBに保存されている値がおかしいため、これでは上手く読み込まれません。

「red,blue」ではなく「a:1:{i:0;s:0:"red";i:1;s:1:"blue";}」と指定すれば上手く読み込まれますが、こんなことはいちいちやってられないです。そこで、Really Simple CSV Importerのフィルターフック「really_simple_csv_importer_save_meta」を使ってACFの値をパースしてあげます。

```functions.php
function rsci_meta_filter( $meta, $post, $is_update ) {
  foreach ($meta as $key => $value) {
    // checkeboxフィールドの場合
    if($key == 'checkebox_field_key') {
      // $valueが空の場合、データに a:1:{i:0;s:0:"";} という空データが入ってしまうため
      // 空ではない場合にパースする
      if ($value != "") {
        $meta[$key] = preg_split("/,+/", $value);
      } else {
        $meta_array[$key] = "";
      }
  }
  return $meta;
}
add_filter( 'really_simple_csv_importer_save_meta', 'rsci_meta_filter', 10, 3 );
```

このようにすることで、チェックボックスの値もちゃんと読み込む事ができます。

### 参考

- <a href="http://notnil-creative.com/blog/archives/2497" target="_blank">Really Simple CSV Importerを使ってAdvanced Custom FieldsのRepeater Fieldにデータをインポートする</a>
- <a href="http://blog.medical-design.co.jp/archives/1592" target="_blank">Really Simple CSV Importer を使って Advanced Custom Fields で作ったフィールドを登録する</a>
- <a href="http://enjoy-pcworks.com/infotech/wordpress/355" target="_blank">Really Simple CSV ImporterでCSVインポート時のデータ整形</a>
mysqlのsocketエラーでrailsアプリが起動できない

Railsアプリ起動でmysqlのエラーが出た。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
(注)ただ起動していないだけかもしれないので

```
sudo mysql.server start
```
して「SUCCESS!」と出なかったら以下を実行する

ここで注意したいのがsudoつけ忘れでも"permission denied"のエラーがでないということ

```
mysql.server start
```
にはsudoつける
sudo つければ普通に起動できる

自分が確認した順にまとめたので順番おかしかったらコメント等お願いします。

## 原因１：読み込み先がとsocketの位置が合ってない
config/database.ymlのsocketで指定してるとこと合ってるか確認

```
mysql_config --socket
```
でsocketの位置が確認できる。

```
mysql --help | grep my.cnf
```
で設定ファイルの場所を確認できる。

##原因２：socketがない
上で確認した場所にsoketがない

```
$ sudo touch /tmp/mysql.sock
```
で作成して

```
$ mysql -u root -p
```
したら

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```


## 原因３：mysqlが起動していない

```
$ ps ax | grep mysqld
```

起動できていない場合↓

```
6359 s002  S+     0:00.00 grep mysqld
```

起動できている場合↓

```
28424   ??  S      0:00.02 /bin/sh /usr/local/Cellar/mysql@5.7/5.7.25/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid
28532   ??  S      0:01.71 /usr/local/Cellar/mysql@5.7/5.7.25/bin/mysqld --basedir=/usr/local/Cellar/mysql@5.7/5.7.25 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql@5.7/5.7.25/lib/plugin --user=mysql --log-error=hogehogenoMacBook-Pro.local.err --pid-file=/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid
29875 s001  R+     0:00.00 grep mysqld
```


## 原因３：socketに権限がない

```
$ chmod 777 /tmp/mysql.sock
```

してmysql -u root -pしても

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```

```
$ chmod g+w /tmp/mysql.sock
```

↑こっちでも同じエラーだった。

これしたら起動できた。

```
$ sudo chown mysql:mysql /tmp
```


どれが一番いい権限の付与の方法かはわからない。

## 原因４：mysql.server startしてないのにmysqlにログインしようとしてた

```
$ mysql -u root -p
```

はmysql起動してないとできるわけがない(当たり前すぎる)

socke作ったり、権限付与したらちゃんと

```
$ sudo mysql.server restart
```
してから

```
$ mysql -u root -p
```
すること。

## まとめ

- socketの指定位置確認
- socket自体あるか確認
- なければ作る
- 権限あたえる
- restart
- mysql -u root -p


## 補足

mysql.server startにsodoを忘れると

```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXXXXXXXXXXX.pid).
```

というエラーが出る。
electronでWebSpeecAPIの音声認識を利用するときの注意点

## 結論
electronはChromeじゃなくてあくまでもChromium。

## 内容
electronでwebSpeechAPIを使ったアプリケーションを書いていました。
色々はしょりますが、こんな感じです。

```js
const speech = new webkitSpeechRecognition();
speech.lang = 'ja-JP';

speech.onresult = event => {
	const results = event.results;
	if (results[0] && results[0][0]) {
		const said = results[0][0].transcript.trim();
		console.log(said);
	}
};
```

しかし、途中から以下のようなエラーが発生しました。

```
SpeechRecognitionError {error: "network", message: "", type: "error" ...
```

ネットワークのエラー？エラーメッセージは空ですし何だかよくわからりません。
とりあえず、Chromeで同様のコードを実行。すると、普通に動きます。
一瞬、すわElectron固有の問題か、と思いましたが、少し前まで動いていたはずです。
調べると、ネットワークエラーはどうやらAPI制限のエラーらしいです。

参考

- [Google 音声認識api の制限なしで使う方法(裏ワザ的な) - Qiita](http://qiita.com/GushiSnow/items/864fe1e72865b8011429)

Web Speech APIはChromeから使う分には無制限だけど、ElectronはChromiumだから50リクエストだよということらしいです。
ChromiumからWebSpeecAPIを使うにはAPIを取得して設定するらしいですが、我らがElectronにも`process.env`を見るとやはり`GOOGLE_API_KEY`が設定されています。

electronのソースから確認できます。

- [electron/google_api_key.h at master · atom/electron](https://github.com/atom/electron/blob/master/atom/common/google_api_key.h)

## まとめ
Chromeだと思ってelectronアプリケーションを書いているとハマることがあるよという話でした。
また、electronの音声認識アプリケーションは現状ちょっと厳しいのかなというのが私の結論です。
まあ音声認識アプリケーションにどの程度需要があるがわかりませんが。
php もしくは Perl でMySQLのdumpデータを取得する

データベース名、ユーザー名、パスワードはわかっているのに、SSH接続できない。

(クライアントが付き合っていたウェブ制作者と契約が切れた、連絡がつかない、など)

しかし、CMSの現状調査や移行作業のために、どうしてもMySQLのdumpデータがほしい。

そんなシチュエーションになった時に、やむを得ずphpやPerlを利用して取得したことがあったため、メモ書き程度に残しておきます。

(やってることは単純で、関数を利用してmysqldumpコマンドを叩いているだけです)

## phpでMySQLのdumpデータを取得

以下のファイルを仕込んで、ブラウザからアクセス。

dump.php

```
<?php
$cmd = "mysqldump -u hogehoge -ppassword dbname > mysql.dump";
shell_exec($cmd);
print "dump complete";
?>
```

## Perl でMySQLのdumpデータを取得

以下のファイルを仕込んで、ブラウザからアクセス。
アクセスするときは、CGIのパーミッションを実行可能に。

dump.cgi

```
#!/usr/bin/perl

$cmd = "mysqldump -u hogehoge -ppassword dbname > mysql.dump";
system($cmd);
print "Content-type:text/html\n\n";
print "dump complete";
```

## 注意

hogehogeはMySQLのユーザー名。
passwordはMySQLのパスワード。
dbnameはデータベース名。
-p と password は、空白を開けずにくっつけて記述します。


phpの shell_exec関数、Perlのsystem関数は、使い方によっては危険を伴うため、禁止しているホスティングサービスもあるでしょう。

目的を達成したら、すみやかにdumpデータ、スクリプトともに削除しておいたほうが良いです。アクセスがあるたびにdumpを取得してしまいます。

mysqldumpのオプションなどは [MySQLのマニュアルを](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)
shell_exec 関数の詳細は [phpのマニュアルを] (http://php.net/manual/ja/function.shell-exec.php)
Perl の system 関数の詳細は [Perlのドキュメントを](http://perldoc.jp/func/system)
ご参照ください。
開発環境でのDEVISEの認証方法　[ 自分用メモ ]

ブラウザで新規登録(sign_up)を実行後、<br><br>/users/confirmation?confirmation_token=ランダムな文字列<br><br>をURLの末尾に追記して再読込を行い、メール認証がされたのと同様の操作を行う。<br><br>ランダムな文字列については、コンソールで<br><br>rails c<br>User.all<br>を行い、<br><br>confirmation_token: "hogehogehogehoge"<br><br>の、hogehogehogehogeを代入する。<br><br>例)<br> /users/confirmation?confirmation_token=hogehogehogehoge
メモ：Visual Studio Express で UnitTest

# Microsoft.VisualStudio.TestTools.UnitTesting
Express Editionではテスト機能がないものと思っていたが、2012には入っている模様[^1]
- http://hara8bunme.blog.so-net.ne.jp/2013-01-20

[^1]: 2013でも使えた

# NUnit
- VS への統合
 - http://d.hatena.ne.jp/tueda_wolf/20120308/p1
- 外部ツールとして利用
 - http://ylgbk.hatenablog.com/entry/2013/12/14/194249
【Git】間違ってpushした場合の取り消し方

ローカルでrevertを使って取り消して、それをリモートへ反映する。

revertは相殺で取り消すのでログからは消えない。（正確には取り消しではなくて打消し）
resetだとログから完全に消えていまい危険なのでrevert推奨らしい。

１．取り消したいコミットのコミットIDを取得する。

```
$git log 
commit XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Author: Foo Bar <XXX@XXXX>
Date:   Tue Mar 15 10:26:14 2016 +0900

    XXXを修正
```

２．取り消したいコミットをrevertする。
複数のコミットを消したい場合はこれが複数になるだけ。

```
$git revert <commit id>
```

３．リモートへpushする

```
$git push
```
デザイン制作に役立つツール集（随時更新


意外に知られてない便利系まとめ

## wordmark.it

マシンにインストールしているフォントをブラウザ上で一覧表示してくれる

http://wordmark.it/

![スクリーンショット 2016-02-01 10.51.17.jpg](https://basicinc.qiita.com/files/57f02a0b-81e8-f222-e27d-914262d3c544.jpeg "スクリーンショット 2016-02-01 10.51.17.jpg")

## ココアポットレース
Cocoapotrace.html
画像をドラッグ・アンド・ドロップ　するだけで、モノクロのベクター画像へ変換してくれる

http://www.geocities.jp/applescriptdepot/iWeb/AppleScriptDepot/

![スクリーンショット 2016-02-01 10.54.43.jpg](https://basicinc.qiita.com/files/e207d453-3546-9c34-41df-56034efa4b5c.jpeg "スクリーンショット 2016-02-01 10.54.43.jpg")

## Promotee

iPhoneやMacなどにスクリーンショットを埋め込んだ画像がさくっと作れる。
サービスサイトとかによく使われてるようなモックアップ。

https://itunes.apple.com/jp/app/promotee/id578071639?mt=12

![スクリーンショット 2016-02-01 10.57.47.jpg](https://basicinc.qiita.com/files/12dc955b-d287-71c2-6eeb-26b7af8fb44e.jpeg "スクリーンショット 2016-02-01 10.57.47.jpg")

## Sparkbox

マシン内の画像をiPhotoのような感じで管理できる。
タグ・カラーサーチなど細かい検索が出来てDropboxで複数Macに同期してさいつよ。
http://www.icyblaze.com/sparkbox/

![sparkbox_banner.png](https://basicinc.qiita.com/files/7d03650a-bec2-9b0f-7af3-0a37a6cb2aae.png "sparkbox_banner.png")


## 0to255

簡単にグラデーションを作成してくれるWebサービス
http://0to255.com/

## Placehold.it
ダミー画像を超手軽に生成出来るWebサービス
https://placehold.jp/


## デザイン/UIの参考サイト

https://www.behance.net/
http://land-book.com/
http://io3000.com/
http://capptivate.co/
https://dribbble.com/
Nginxでメンテナンスページに編集なしで即時切り替える方法

メンテナンスをする度にnginxの設定ファイルを編集するのはドキドキする ＆ 構成管理的によろしくない。何より障害発生時は一刻を争うので、nginx の設定で時間を浪費したくない。

そこで、編集なしでメンテナンスページに切り替える方法を検討してみた。


## 実現したいこと

 1. 設定ファイルを編集することなく、メンテナンスページに切り替えたい
 2. 内部アクセス（例えばオフィス）では検証のため、メンテナンスにはしたくない
 3. オフィスのIPアドレスは増えるかもしれないのでそれを見越しておきたい


## 設定

いろいろ調べた上での結論から。

```nginx
http {
  geo $access_from {
    default        external;
    203.0.113.0/24 internal;
  }

  server {
    error_page 503 @maintenance;

    set $maintenance false;

    if (-e /var/tmp/nginx/maintenance) {
      set $maintenance true;
    }
    if ($access_from !~ external) {
      set $maintenance false;
    }
    if ($maintenance = true) {
      return 503;
    }

    location @maintenance {
      root /var/www/html/static;
      rewrite ^(.*)$ /50x.html break;
    }
  }
}
```

こうしておけば、メンテナンスモードはファイルに touch するだけで発動することができます。便利。

```bash
$ touch /var/tmp/nginx/maintenance
```


## 調査 & 工夫したこと

#### geo

[ngx_http_geo_module](http://nginx.org/en/docs/http/ngx_http_geo_module.html) を利用して、 $access_from という独自変数を定義しています。

オフィスのゲートウェイIPが増えたとしても、 geo モジュールで internal とラベリングするだけでよく、if 文を連発しなくても済むいうのがミソ。

今回の設定例では一筆書きですが、/etc/nginx/conf.d/geo.conf 等に分離するのもアリです。


#### If is Evil?

[If Is Evil](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/) という有名？ なドキュメントがあります。設定間違えると、SIGSEGV するかもよ、と書かれててドキリとします。


よく読むと、 

 "Directive if has problems when used in location context" 

や

 "There are cases where you simply cannot avoid using an if, for example, if you need to test a variable which has no equivalent directive."

と書かれているので、用法用量を間違わなければ問題ナシです。

今回の例も evil にならないような設定をしている（はず）。
Genymotionでandroidデフォルトブラウザのデバッグをする


# Genymotion

# androidデフォルトブラウザ

![android_default_browser.png](https://qiita-image-store.s3.amazonaws.com/0/52774/1903fa1e-f6fb-6a93-39e3-f32619aff71d.png)

# chromeで

[chrome://inspect/](chrome://inspect/)
にアクセス

すると以下のような画面が出てきます。

![google_inspect.png](https://qiita-image-store.s3.amazonaws.com/0/52774/c983015f-18ed-c6ad-6651-e0690d7c8ff8.png)

`inspect` をクリック

別windowでdevelopertoolが開きます。

あとはいつもどおりに
要素を検証する感じで！

![geny_debug.png](https://qiita-image-store.s3.amazonaws.com/0/52774/aa211173-8c93-6aab-2c3e-0a380843a31a.png)
CSSでFOOTERを常に下に表示する方法

# サンプル
https://jsbin.com/vipofu/edit

# ソース
```css:css
html {
  min-height: 100%;
  position: relative;
  margin-bottom: 20px;
}
header {
  width: 100%;
  background: #eee;
  height: 20px;
  color: #333;
  padding: 4px;
}
footer {
  width: 100%;
  background: #333;
  height: 20px;
  color: #eee;
  padding: 4px;
  position: absolute;
  bottom: 0px;
}
```

```html:html
<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.min.css">
</head>
<body>
  <header>HEADER</header>
  <main>
    <h1>Main Content</h1>
  </main>
  <footer>FOOTER</footer>
</body>
</html>
```

# コメント
とりあえずできたのでメモ。

# 疑問点
- `html`と`body`の`height`の挙動がわからない。
- `html`と`body`が何をするものかわからない。
- `main`が何をするものかわからない。
- `HTML5`がよくわからない。
SharePoint Client Object Model でリストフィールドコレクション オブジェクトを取得するコード

```javascript
// コンテキスト取得
var custCtx = SP.ClientContext.get_current();
 
// サイトオブジェクト取得指示
var custWeb = custCtx.get_web();

// リスト（ライブラリ） オブジェクトの取得指示
//var custList = custCtx.get_web().get_lists().getByTitle("(リスト・ライブラリの表示名)");
//// リストコンテキスト内のページ（ビュー、フォーム等）の場合に現在のリストを取得する場合
var custList = custCtx.get_web().get_lists().getById(_spPageContextInfo.pageListId);

// リストフィールドコレクション オブジェクトの取得指示
var custFields = custList.get_fields();

// リストフィールドコレクション オブジェクト取得予約
custCtx.load(custFields);

// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）
custCtx.executeQueryAsync(
    function(sender, args) { // クエリー実行時コールバック処理

        console.log(custFields.get_count());

        var listFieldEnumerator = custFields.getEnumerator();
        while (listFieldEnumerator.moveNext()) {
            var oField = listFieldEnumerator.get_current();
            
            console.log(String.format(
                "ID:{0}, Name:{1}({2}), Type:{3}({4}), Hidden:{5}, Schema:{6}",
                oField.get_id(), oField.get_title(), oField.get_internalName(),
                oField.get_typeDisplayName(), oField.get_typeAsString(),
                oField.get_hidden(), oField.get_schemaXml()
             ));

            // 特定の列を非表示にするサンプル
            //if ((oField.get_internalName() == 'fRecurrence')
            //    || (oField.get_internalName() == 'Description')
            //    || (oField.get_internalName() == 'Location')) {
            //
            //    oField.set_hidden(true);
            //    oField.update();
            //}

          }

          // 列の設定を更新したら、サーバーに送信が必要です！
          //custCtx.executeQueryAsync(
          //    function(sender, args) { // クエリー実行時コールバック処理
          //        console.log('送信ヨシ！');
          //    },
          //    function(sender, args) { // クエリー失敗時コールバック処理
          //        console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
          //    }
          //);
    },
    function(sender, args) { // クエリー失敗時コールバック処理
        console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
    }
);
```
Realm+JSONが使い勝手悪いので、リレーションはるために考えてみた。

### まず

__ツッコミ大歓迎！！__

未熟な部分が多いと思うので、ぜひご教授願います。

---

[Realm+JSON](https://github.com/matthewcheok/Realm-JSON)は素晴らしいと思います。
以前からMANTLEを利用していたので、同じノリで使えるのかと思っていましたがリレーション周りがあまりよくありませんでした。

### こんなケース

公式によく乗っている例だと、以下のようなjsonで使っています。 ( そもそも、こういうケースしか想定していないのだと思いますが... ) 

```json 
{
  "article" : {
    "id"          : 1,
    "title"       : "title",
    "comments" : [
      {"id" : 1, "text" : "text"},
      {"id" : 2, "text" : "text"},
      {"id" : 3, "text" : "text"}
    ]
  }
}
```

こういうのは[公式](https://realm.io/jp/docs/objc/latest/#section-20)を参考にしてください。

今回、書くのは以下のような形式です。

```json 
{
  "article" : {
    "id"          : 1,
    "title"       : "title",
    "comment_ids" : [
      1,
      2,
      3
    ] 
  }
}
```

上記の場合は、どうすればいいでしょうか？ ( ネットの記事を見てもあまり書かれておらず、自分も迷っていました。 ) 

### 自分なりの回答

`Realm+JSON` + `NSValueTransformer`

Realm+JSONは割愛します。 ( [Github](https://github.com/matthewcheok/Realm-JSON)をご参考ください。 ) 

#### NSValueTransformer

NSValueTransformerは、クラスの必要なメソッドを用意してインスタンスに対して `- transformedValue:` を呼べば値の変換を行ってくれます。

```objc
NumberTransformer *t = [[NumberTransformer alloc] init];
[t transformedValue:@"1"];  // => @(1)
```

これをモデルに対して行ってしまおうということです。

#### NSValueTransformerの実装

必要なメソッドを用意します。

* `+ (Class)transformedValueClass`
* `- (id)transformedValue:(id)value`

普通のNSValueTransformerのsubclassだと上記2つのメソッドが必要なのですが、Web APIだとjson形式のものが多いと思うので独自にメソッドを定義してみます。

* `- (id)transformWithDictionary:(NSDictionary *)dic`

--- 

* `+ (Class)transformedValueClass`

変換後のクラスを返します。 
NSNumberだったら`[NSNumber class]`

* `- (id)transformedValue:(id)value`

コメントアウト、または削除しても構いません。

* `- (id)transformWithDictionary:(NSDictionary *)dic`

モデルの実際の変換処理を書きます。ここでは、上のarticleを例に実装してみましょう。

```objc
- (id)transformWithDictionary:(NSDictionary *)dic
{
    NSArray<NSString *> *keys = dic.allKeys;
    
    // Realm+JSON でリレーション以外の値を埋める。ここは別クラスで実装しておく。
    Article *article = [[Article alloc] initWithJSONDictionary:dic];
    
    // "comment_ids"のkeyがあれば、リレーションを作成する
    if ([keys containsObject:@"comment_ids"]) {
        for (NSString *commentID in dic[@"comment_ids"]) {
            // コメントモデルある前提のコード。
            Comment *comment = [Comment objectForPrimaryKey:@([commentID integerValue])];
            
            if (comment) {
                [article addObject:comment];
            }
        }
    }
    
    return article;
}
```

仮に、これを CommentTransformerとすると以下のようにして使えます。

```objc
[[[CommentTransformer alloc] init] transformWithDictionary:dic];
```

これでリレーションが貼れるようになったかと思います。
SharePoint Client Object Model でリスト オブジェクトを取得するコード


```javascript
// コンテキスト取得
var custCtx = SP.ClientContext.get_current();
 
// サイトオブジェクト取得指示
var custWeb = custCtx.get_web();

// リスト（ライブラリ） オブジェクトの取得指示
var custList = custCtx.get_web().get_lists().getByTitle("(リスト・ライブラリの表示名)");
//// リストコンテキスト内のページ（ビュー、フォーム等）の場合に現在のリストを取得する場合
//var custList = custCtx.get_web().get_lists().getById(_spPageContextInfo.pageListId);

// リストオブジェクト取得予約
custCtx.load(custList);

// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）
custCtx.executeQueryAsync(
    function(sender, args) { // クエリー実行時コールバック処理
        console.log(custList);

        // ここで各種処理

    },
    function(sender, args) { // クエリー失敗時コールバック処理
        console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
    }
);
```
Java SE7 Gold 取得を目指して (10)

Java SE7 Gold をとりたい…!
===

本日は第10回目です。

## 今日のこぼれ話

示唆に富んだ記事を見つけました。
http://www.gizmodo.jp/2016/03/gvb1000.html?utm_source=atom&utm_medium=rss
割と似たような経験ありますよね。一つのことに目を向けすぎたら基本的なことに目がいかないという。
XSS対策とかXSRF対策万全にしてたけど、WebサーバーへのSSH接続はID&Passで試行回数の制限もしていないとか。
ネットワークがつながらねー!と設定周り見直しまくってたら、LANケーブルが抜けてたとか。
調子に乗ってテキストエディタでJava書いたらどうしてもコンパイルが通らず、うんうんうなってたら全角スペースが紛れ込んでたとか、ね…。

## 本日知ったこと(8章)

* File
  * システムプロパティからOS依存のプロパティを取得できる

    プロパティ | 取得方法 | Windows | Linux
    :---|:---|:---|:---
    改行コード| `System.getProperty("line.separator")`<br>`System.lineSeparator()`(Java7から)|`\r\n`|`\n`
    ファイルセパレータ|`System.getProperty("file.separator")`|`\\`|`/`
    パスセパレータ|`System.getProperty("path.separator")`|`;`|`:`

* ストリーム

  * FileInputStream/FileOutputStream
     * バイトストリーム
     * 読み書きはByteデータで行う(文字列を出力すると文字コードで書きだされる)
  * DataInputStream/DataOutputStream
     * バイトストリーム
     * 基本データ型のデータを入出力できる 
     * 単体では使用できず、他のStreamをデコレートして使用する
     * 文字列データはUTF-8でエンコーディングされる
  * FileReader/FileWriter
     * キャラクタストリーム
     * 入出力データは自動で変換される
  * BufferedReader/BufferedWriter
     * 文字列をブロック単位で書き込む
     * `mark(int readAheadLimit)` 現在位置をマークする 引数はマークを保持して読み込める上限値
     * `reset()`  markされた位置へリセットする
     * `skip(long n)` 指定された文字数スキップする

* シリアライズ
  * インスタンス変数をシリアライズ対象から外す場合は `transient` 修飾子
  * 配列・コレクションをシリアライズ対象に含める場合は、要素がすべてシリアライズ可能である必要がある
  * オブジェクトを参照している場合、参照されるオブジェクトもシリアライズ可能である必要がある
  * スーパークラスがSerializableを実装していればサブクラスもシリアライズ可能
  * デシリアライズの際はコンストラクタは呼ばれない
  * サブクラスのみでSerializableを実装していた場合、デシリアライズの際スーパークラスはデフォルトコンストラクタを呼び出してインスタンス化する
  
* コンソール
  * Java6から
  * `System.console()` で取得
  * `readPathword()` エコーバックのないユーザ入力
  
* 書式化(format)
  * `%[インデックス$][+|0|,][最小文字数].[精度](b|c|d|f|s|n)`  
  http://docs.oracle.com/javase/jp/7/api/java/util/Formatter.html#syntax

* ストリームの解析
  * Scannerクラスで簡単な解析を行える
  * `useDelimiter(String pattern)` で区切り文字設定(デフォルトは空白)
  * `hasNext()` → `next()` でトークンを取得していく
  * 型ごとに `hasNextInt()` → `nextInt()` のようなメソッドが用意されている
  * 型違いを `hasNextXXX()` で取得しようとすると `InputMisMatchException`

かつて習ったStringTokenizerが非推奨になったときから、正規表現かSplit()で急を凌いできましたがScannerクラスなどというものがあったとは。
まだまだ学ぶことは多そうですね…!
ズンドコキヨシ with PowerShell(One-liner)

[ズンドコキヨシまとめ - Qiita](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)

ちょっと遅いけど乗ってみる。

```ps1
$res="";do{"ズン","ドコ"|Get-Random|%{$res+=$_}}while(!$res.EndsWith("ズンズンズンズンドコ"))Write-Host $res "キ・
ヨ・シ！"
```

[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（PowerShell） - Qiita](http://qiita.com/shoooo/items/5494192779ebb6a8fd1b)
とほぼ同じ。
SharePoint Client Object Model でサイト オブジェクトを取得するコード

```javascript
// コンテキスト取得
var custCtx = SP.ClientContext.get_current();
 
// サイトオブジェクト取得指示
var custWeb = custCtx.get_web();

// サイトオブジェクト取得予約
custCtx.load(custWeb);

// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）
custCtx.executeQueryAsync(
    function(sender, args) { // クエリー実行時コールバック処理
        console.log(custWeb);

        // ここで各種処理

    },
    function(sender, args) { // クエリー失敗時コールバック処理
        console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
    }
);
```
railsのcontrollerごとのviewにclass="active"をつけたいとき

<h2>動的なclass="active"をcontrollerごとにつけたい、、、、</h2>
<p>こんなことってよくあると思います。webサイトではよく見かけることも多いですね。</p>
<p>RailsではApplicationHelperという便利なmoduleがあるので利用していきましょう</p>

```ruby:application_helper.rb
module ApplicationHelper
  def is_active_controller(controller_name)
    params[:controller] == controller_name ? "active" : nil
  end

  def is_active_action(action_name)
    params[:action] == action_name ? "active" : nil
  end

  def is_active_actions(action_names)
    action_names.include?(params[:action]) ? "active" : nil
  end

  def is_active_controller_and_action(controller_name, action_name)
    if params[:controller] == controller_name && params[:action] ==  action_name
      "active"
    else
      nil
    end
  end
end
```
<p>このように、たとえば一番はじめの</p>

```ruby:ruby
 def is_active_action(action_name)
    params[:action] == action_name ? "active" : nil
  end
```
<p>
に対して、たとえばproducts#indexを見ていたとします。<br>
そのとき対応しているcontrollerはproducts_controllerなので
</p>
```html:html
  ....
   <li{class: "#{is_active_controller('products')}"}></li>
  ....
```
<p>
というようにすれば、これで
</p>
```ruby:ruby
  resources :products
```
<p>
で生成されるアクション<b>全て</b>に対し、activeを付けることができます。<br>
(とはいってもupdateやdestroyなどはviewが基本的にないので実際はshow,index,newあたりでしょうか)
</p>
<p>
もしアクションごとにもactiveを付ける、つけないを選択したいのなら２番目の
</p>
```command:ruby
 def is_active_action(action_name)
    params[:action] == action_name ? "active" : nil
  end
```
を使えばよくて、さらに用途を細分化すると

```command:ruby
def is_active_action(action_name)
    params[:action] == action_name ? "active" : nil
end
#一つだけのアクションをactiveにしたい(controllerは関係ない)

def is_active_actions(action_names)
    action_names.include?(params[:action]) ? "active" : nil
end
#複数のアクションをactiveにしたい(controllerは関係ない)

def is_active_controller_and_action(controller_name, action_name)
    if params[:controller] == controller_name && params[:action] ==  action_name
      "active"
    else
      nil
end
#controllerとそのアクションを指定(controllerは関係する)
```

activeをcss(sass)でカスタマイズすればさらに良い感じになります( ^_^)/~~~
JPAのキャッシュ無効化


自分用備忘録

JPAのキャッシュを無効にし、常にDBからデータを取得するように設定する方法を以下に記載。

persistance.xmlにshared-cache-modeを指定する

```text:persistance.xml
<jta-data-source>jdbc/PostgreSQL9.4</jta-data-source>
<shared-cache-mode>NONE</shared-cache-mode>
```
技術英語 > That's the best [head start] I can give you. / outstanding / overwhelming

@ Star Trek Voyager > RESISTANCE

Chakotay とキムが方法について議論しているなか、キムが

> That's the best head start I can give you.

字幕はきちんと訳されていなくて

> そう思います

<hr>
http://ejje.weblio.jp/content/head+start
>【競技】 ヘッドスタート 《競走などでハンディを与えられた有利なスタート》.

方法について議論していて、「有利なスタート」というのは未消化。
誰かと競争しているという状況でもなかったようだが。

複数の案のなかで突出している(outstanding)なものを示しているのだろうか?

http://eow.alc.co.jp/search?q=outstanding&ref=sa

<hr>
関連して思い出したのは

> overwhelming
http://eow.alc.co.jp/search?q=overwhelming

> 〔感情的に人を〕圧倒する、打ちのめす
C++17, C++14, C++11 に併せた std::shared_mutex, std::shared_timed_mutex, std::mutex から mutex_type, read_lock_type, write_lock_type を扱う例

# 概要

C++11 から標準ライブラリーに入った `std::mutex` から C++14 では `std::shared_timed_mutex` 、 C++17(予定)では `std::shared_mutex` が追加される事で、 READ アクセス向けと WRITE アクセス向けにロックレベルを制御できるようになりました。

そこで、翻訳環境の C++ 規格の対応に応じて READ / WRITE 向けのロックを使い分ける簡単なコード例を示したいと思います。

# 例

- usagi/mutex.hxx

```cpp
#pragma once

#if __cplusplus >= 201402
  #include <shared_mutex>
#else
  #include <mutex>
#endif

namespace usagi
{
  namespace mutex
  {
#if __cplusplus > 201402
    // C++17
    using read_write_mutex_type = std::shared_mutex;
    using read_lock_type = std::shared_lock< read_write_mutex_type >;
    using write_lock_type = std::lock_guard< read_write_mutex_type >;
#elif __cplusplus == 201402
    // C++14
    using read_write_mutex_type = std::shared_timed_mutex;
    using read_lock_type = std::shared_lock< read_write_mutex_type >;
    using write_lock_type = std::lock_guard< read_write_mutex_type >;
#elif __cplusplus >= 201103
    // C++11
    using read_write_mutex_type = std::mutex;
    using read_lock_type = std::lock_guard< read_write_mutex_type >;
    using write_lock_type = std::lock_guard< read_write_mutex_type >;
#else
    #error not supported
#endif
  }
}
```

## 使い方

```cpp
class my_example_type
{
  my_something_type                   my_something;
  usagi::mutex::read_write_mutex_type my_mutex_for_something;
  
public:
  
  auto get_something_sum_of_xyz()
  {
    usagi::mutex::read_lock_type read_lock( my_mutex_for_something );
    return my_something.x + my_something.y + my_something.z;
  }
  
  auto set_something_sum_of_xyz( const somevalue_type x, const somevalue_type y, const somevalue_type z )
  {
    usagi::mutex::write_lock_type write_lock( my_mutex_for_something );
    my_something.x = x;
    my_something.y = y;
    my_something.z = z;
  }
}
```

# Reference

- [cpprefjp - &lt;shared_mutex&gt; (C++14, C++17)](http://cpprefjp.github.io/reference/shared_mutex.html)
- [cpprefjp - &lt;mutex&gt; (C++11)](http://cpprefjp.github.io/reference/mutex.html)
Raspberry Pi3 ベンチマーク

#はじめに
技適版RaspberryPi3が手元に届いたのでとりあえず簡単にセットアップしてみた。

#関連リンク(28/9/2016 Update)
[NanoPiNeo ベンチマーク](http://qiita.com/rimria/items/f0e5ca4dce920282a36d)

#購入先
現在のところ、RS Compornentsのパッケージを購入すれば技適マーク入りの取扱説明書も封入されている。
![tec.jpg](https://qiita-image-store.s3.amazonaws.com/0/2754/b6f4ad05-4c1e-d0b1-7c93-c669767bcd00.jpeg)

私は以下から購入した。
ModMyPi
https://www.modmypi.com/

#使用環境
Raspbian 2016-2-26

#ベンチマーク
とりあえずまずはUnixBench 5.1.3を動作してみる。
結果は以下の通り。

| System Benchmarks Index Values   | RPi2 | RPi3 |
|---|---|---|
| Dhrystone 2 using register variables     |    1031.4  |   1375.1  |
| Double-Precision Whetstone               |     317.3  |    537.4  |
| Execl Throughput                         |     288.0  |    535.0  |
| File Copy 1024 bufsize 2000 maxblocks    |     295.8  |    600.0  |
| File Copy 256 bufsize 500 maxblocks      |     196.5  |    381.2  |
| File Copy 4096 bufsize 8000 maxblocks    |     545.0  |    987.8  |
| Pipe Throughput                          |     600.1  |    921.8  |
| Pipe-based Context Switching             |     305.2  |    524.4  |
| Process Creation                         |     211.2  |    421.0  |
| Shell Scripts (1 concurrent)             |     618.7  |   1092.5  |
| Shell Scripts (8 concurrent)             |     583.1  |    958.3  |
| System Call Overhead                     |    1111.6  |   1684.9  |
|---|---|---|
| System Benchmarks Index Score            |     435.3  |    750.8  |
単純に性能向上しているのでセルフビルド等も快適になっている模様。

#無線LAN
Raspbian導入時点で認識している。
ネットワークに接続するには
/etc/wpa_supplicant/wpa_supplicant.conf に記述を行う必要がある

以下のコマンドを使用
YourSSID及び、YourPASSWORDにはそれぞれ使用する内容へ変更。
$ sudo sh  -c "wpa_passphrase YourSSID YourPASSWORD" >> /etc/wpa_supplicant/wpa_supplicant.conf 

設定後、再起動にてネットワークに接続、IPアドレスが取れているか確認。
$ ifconfig wlan0
ズンドコキヨシ with JavaScript

日本人プログラマーの登竜門、ズンドコキヨシです。
JavaScriptですと95文字で書いてしまう人もいるようですが、参加することに意義があるということで自分なりに書いてみました。

```html:zundoko.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Zundoko</title>
</head>
<body>
    <script>
        const ZUNDOKO = ["ズン", "ドコ"];
        const FEVER = 4;
        
        var zun = 0;
        var kiyoshi = false;
        
        while (! kiyoshi) {
            var sound = ZUNDOKO[Math.floor(Math.random() * ZUNDOKO.length)];
            document.write(sound);
            
            if (sound == ZUNDOKO[0]) {zun++;}
            
            switch (true) {
                case zun < FEVER:
                    if (sound == ZUNDOKO[1]) {
                        zun = 0;
                    }
                    break;
                case zun == FEVER:
                    if (sound == ZUNDOKO[1]) {
                        kiyoshi = true;
                        continue;
                    }
                    break;
                case zun > FEVER:
                    zun = 0;
                    break;
            }
        }
        document.write("キ・ヨ・シ！");
    </script>
</body>
</html>
```
文字列「ズンズンズンズンドコ」を予め用意して答え合わせをするやり方ではなく、「ズン」の連続発生数が4回になった直後に「ドコ」がきたらキ・ヨ・シ！を出力というロジックです。

猛者プログラマの方々のズンドコキヨシはこちらにまとまっています。
http://qiita.com/shunsugai@github/items/971a15461de29563bf90
Rails Application Templatesを使ったRails4のローカルインストール&セットアップ

```rails new```してからコードを書くまでって結構色々とセットアップがありますよね。それぞれの作業はとても小さなものでも、チリツモで結構な時間を費やすことになってしまいます。多分1年間開発したら、1日分は```rails new```後のセットアップに費やしているんじゃないかと。。。

そこで、自前のApplication Templateをようやく観念してこしらえることにしました。今後はラクするため、コピペでセットアップ済みのRailsアプリを作成する手順をQiitaに記しておくことにします。

## インストールの下準備
とりあえずRailsをローカルにインストールするための準備。とりあえず

```
$ rbenv exec bundle init
```

してGemfileを作成し、中身を

```
# A sample Gemfile
source "https://rubygems.org"

gem "rails", "4.2.6"
```

の様な感じに編集します。```rails```は出来るだけその時点での最新版に。その後、

```
$ rbenv exec bundle install --path vendor/bundle -j4
```

で保存先を```vendor/bundle```に指定し、```-j4```を指定することで並列処理された```bundle install```を実行します。

## テンプレートを指定してrails newする
テンプレートをGitHubからCloneしてきます。そして、そのテンプレートにある```initialize.rb```を参照する形で```rails new```します。

```
$ git clone git://github.com/KazuyaHara/Rails4-Template-FullStack.git
$ bundle exec rails new appname -BT -d postgresql -m ./Rails4-Template-FullStack/initialize.rb
```

テストはRSpecを使うので```-T```して（Test::Unitをスキップ）、データベースはpostgresqlを指定（MySQLなら```-d mysql```、SQLiteならオプション無しで）し、```bundle install```をスキップしながら（```-B```部分）新規アプリを作成しています。

その後、ローカルインストールの為に用意したbundler環境を削除します。

```
$ rm -f Gemfile
$ rm -f Gemfile.lock
$ rm -rf .bundle
$ rm -rf vendor
```

## 作成されたアプリケーションをセットアップする
セットアップの手順は、先ほどcloneしてきたテンプレートの```setup.rb```に書かれていますので、そちらを適用させます。

```
$ cd appname
$ bin/rake rails:template LOCATION=../Rails4-Template-FullStack/setup.rb
```

ここでは、データベースの作成やRSpecなど諸々のgemの初期設定を行っています。詳しくは[Rails4 FullStack Template](https://github.com/KazuyaHara/Rails4-Template-FullStack)の[setup.rb](https://github.com/KazuyaHara/Rails4-Template-FullStack/blob/master/setup.rb)を確認してみてください。
ESP8266 - 電圧ブザーでメロディを奏でる

# ESP8266でメロディを奏でる
ESP-WROOM-02 + 電圧ブザーとArduino IDEで音階を鳴らす方法を備忘録として記録します。
## ハードウェア
 ESP-WROOM-02のGPIO1に電圧ブザーの出力に設定していますが、他のGPIOでも変わりなく動きます。
## ソースコード
```lang:melody.ino
#define BEAT 300    // 音の長さを指定
#define SOUNDER 1  // 出力ピン

void setup() {
}

void loop() {
  analogWrite(SOUNDER, 500) ;

  analogWriteFreq(262) ;  // ド
  delay(BEAT) ;
  analogWriteFreq(294) ;  // レ
  delay(BEAT) ;
  analogWriteFreq(330) ;  // ミ
  delay(BEAT) ;
  analogWriteFreq(349) ;  // ファ
  delay(BEAT) ;
  analogWriteFreq(392) ;  // ソ
  delay(BEAT) ;
  analogWriteFreq(440) ;  // ラ
  delay(BEAT) ;
  analogWriteFreq(494) ;  // シ
  delay(BEAT) ;
  analogWriteFreq(523) ;  // ド
  delay(BEAT*2) ;

  analogWrite(SOUNDER, 0) ;
  delay(3000) ;           // ３秒後に繰り返す
}
```
OS X El Capitan 上の VirtualBox に OS X El Capitan をインストールする

## 検証環境
- OS X 10.11.3（15D21）
- Oracle VM VirtualBox Version 5.0.10 r104061

## 0. 事前準備
- [Mac App Store](https://itunes.apple.com/jp/app/os-x-el-capitan/id1018109117?mt=12) から **OS X El Capitan のインストーラ** をダウンロードしておく
- **VirtualBox** をインストールしておく

## 1. ISO イメージを作成
- 以下のページを参考に、**OS X El Capitan のインストーラ** から **ISO イメージ** を作成
    - [Creating a bootable El Capitan ISO image - 0xcafebabe](http://anadoxin.org/blog/creating-a-bootable-el-capitan-iso-image.html)

## 2. VirtualBox 上に仮想マシンを作成
- VirtualBox 上に OS X El Capitan 用の仮想マシンを作成する
- 以下のページの「OS X Yosemite用の仮想マシンを作成する」セクションを参照
    - [VirtualBoxにOS X Yosemiteをインストールする - OTTAN.XYZ](http://ottan.xyz/virtualbox-yosemite-1605/)

## 3. 仮想マシンに OS X をインストール
- 仮想マシンに OS X El Capitan をインストールする
- 以下のページの「仮想マシンにOS X Yosemiteをインストールする」セクションを参照
    - [VirtualBoxにOS X Yosemiteをインストールする - OTTAN.XYZ](http://ottan.xyz/virtualbox-yosemite-1605/)

## OS X の使用許諾契約について
- [Mac OS X を仮想OS として使用する場合のライセンスについて再確認した](http://beadored.com/mac-osx-virtual-machine/)
- OS X El Capitan の使用許諾契約の中で「仮想 OS 環境へのインストール」について以下のように書かれている

> (iii)お客様が所有または管理する各Macコンピュータの仮想オペレーティングシステム環境内で、Appleソフト ウェアの最大2つの追加コピーまたはインスタンスをインストールし、使用し、稼働させることができます。 これらは、(a)ソフトウェア開発、(b)ソフトウェア開発中の試験、(c)OS X Server の使用、または(d)個人的、非営利的使用を目的として行うことができます。

**/Library/Documentation/License.lpdf** より引用
サーバ不要の自己複製base64ページ作った。

##Base64
Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式である。(Wikipediaより)

例えば
![hiyoko.jpg](https://qiita-image-store.s3.amazonaws.com/0/22392/5d83a006-2311-8930-5559-b46eecf7590b.jpeg)
こんな画像
base64コマンドを使って

```bash
$ base64 hiyoko.jpg

/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAoACgDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBAcD/8QALBAAAQMDAwMEAAcBAAAAAAAAAQIDBAAFEQYSITFBURMUFXEiI0JSYZGhwf/EABkBAAMBAQEAAAAAAAAAAAAAAAMEBQYAAv/EACERAAICAgICAwEAAAAAAAAAAAECAAMREgQhMVETQcHw/9oADAMBAAIRAxEAPwCYvnvZ0hMmyzI3rN7d6Nm0+RhR46GmlnssrUN2gOSwzEUtYEj8xLm1I6qTjjJHY8Zpu8h+Xb3TGSmLIBKdrqMoVnx3Bx/VeWlLFMi3N6St5Ts1/DbTKDlDScZUVEdSfPishv19fs1orz/dTqtpn6f06x7W1MJaUOd6sKWs+Sev/KeqXZ9TRDHuUVl5C04/GnkZ/nqK5nD0vCTcflp0cfIekWfU3FRCepA5x/macxpLUNSERxsSkYGTk0v8hVgVOfcA3EVs+/eZL670ONLvNvW9yOIS0nY/JClFKuwPOKK65HiRtTWH20zlIUFA4GQR35opoIbRuo8wScpahpaexN9jtVmtMYMw4jKf3LWkKWo+STU1qCFb496XPiRGUP7CnLY27vsdCa1PSynkHFJ7hJ9TJJqraqsmpEU49bK+2fM8PkW5DYwQPNL31NlWVDPPepG43I228raOQ2s7kn7req6JdSAk8cd+tQm76MsBdfEtrFdxDe2JUQgnkUVDx5yivIXgKOAaKJXaUGBA2cVLDsZXPTkn9VKZ1xQAcqFFFUXczwqgSRmz7ROdUJb7rvp5LiW28+j2znz0OP8Aaj3pkli0LuUdMh+F7lbGxtBK0JHIcUOgSaKKSFS5z7IjfZWNtCz/AJhR3RZayRuTgc47/R+6KKKHYgDkCdYxQgCf/9k=
```

こんな風に文字列で表現されるようになる。
上で生成された文字列の先頭に```data:image/jpg;base64,```とつけるとDataURIとして扱える。
![スクリーンショット 2016-03-15 1.16.26.png](https://qiita-image-store.s3.amazonaws.com/0/22392/5d55534e-fe7b-4c84-c53d-d60d144e5b21.png)
こんな感じ。

##本題
画像だけでなくHTMLもbase64形式での表現が出来るので、

textareaなんかで自ページのソースコードを書き換える。→base64エンコードしてlocation.hrefで更新
というような事が可能。
↓実際に作った。
http://anochick.github.io/rat/

![スクリーンショット 2016-03-15 1.32.24.png](https://qiita-image-store.s3.amazonaws.com/0/22392/72392d91-00d6-9931-952d-da22ad114582.png)
コレがデフォルトページ。適当に加工してみてからUpdate
**ちなみに、日本語を使う場合は更にエンコードが必要この記事では紹介してない。**

こうなる
![スクリーンショット 2016-03-15 1.40.22.png](https://qiita-image-store.s3.amazonaws.com/0/22392/0742664d-af25-a1de-3f7b-384c77788be1.png)

```
data:text/html;base64,PGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMi4xLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICAkKGZ1bmN0aW9uKCl7CiAgICAgICAgJCgnI2h0bWwnKS52YWwoJCgnaHRtbCcpLmh0bWwoKSkKICAgICAgICAkKCcjcmVmcmVzaCcpLm9uKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSAnZGF0YTp0ZXh0L2h0bWw7YmFzZTY0LCcrd2luZG93LmJ0b2EoJCgnI2h0bWwnKS52YWwoKSk7CiAgICAgICAgfSkKICAgICAgfSkKICAgIDwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgo8IS0tCmJvZHl7CmJhY2tncm91bmQtY29sb3I6I2VkYzsKfQotLT4KPC9zdHlsZT4KICA8L2hlYWQ+CgogIDxib2R5Pgo8aDE+SGVsbG8sV29ybGQhPC9oMT4KPG1hcnF1ZWU+d2VsY29tZSEgPC9tYXJxdWVlPgogICAgPHRleHRhcmVhIGlkPSJodG1sIj48L3RleHRhcmVhPgogICAgPGJ1dHRvbiBpZD0icmVmcmVzaCI+VXBkYXRlPC9idXR0b24+CiAgCjxwPkNvcHlyaWdodCA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2Fub0NoaWNrIj5hbm9DaGljazwvYT4gcGl5b3BpeW8gKCk7PC9wPgo8L2JvZHk+
```
リンク先とか、画像とか全部base64表現にしたら１サイトまるまるサーバレスで出来上がるのではないか。

ちなみに、URL短縮サービスとか使って普通のURLとして扱えそうだけど軽く探した感じDataURIに対応しているサービスが見当たらなかった。
ズンドコキヨシ with Python

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
なんか流行ってるらしいのでPythonでも書いてみた。

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import random


def say_zundoko(kiyoshi):
    word=["ズン", "ドコ"]
    kiyoshi = kiyoshi + word[random.randint(0,1)]
    if re.search(r"ズンズンズンズンドコ", kiyoshi):
        print (kiyoshi + "  キ・ヨ・シ！！")
    else:
        say_zundoko(kiyoshi)


if __name__=='__main__':
    say_zundoko('')

```

```bash:出力例
$ python zundoko.py 
ズンズンドコドコズンドコドコドコドコズンドコズンズンドコズンドコズンドコドコドコズンドコズンドコドコドコドコドコドコドコズンズンズンドコズンドコドコドコドコズンズンドコドコズンドコズンズンドコズンドコズンドコズンドコズンズンズンズンドコ  キ・ヨ・シ！！
```
Emacs: (シェル)コマンドキューのパッケージを作成して MELPA に登録してみました。

# 背景

emacs の中で生活をしていると、シェルのコマンド実行を、キューに積みながら実行したい場合があります。たとえば、データベースへの操作を行って、フラッシュして、検索してみる、とか。こういったコマンドは、基本的に一連の操作として行いたいのだけれども、どれか一つでも fail したら abort してほしい。だからといって、いちいちその処理をしっかりとスクリプトに落としてから実行するのも、面倒臭い。OS にバッチキューの機能があればそれを使えばいいけれども、基本的に OS 依存で実行するしかない。 Windows 上の emacs でも、 Ubuntu の emacs でも、同じようにキューを実行したい。

なので、シェルコマンドをキュー的に実行するパッケージを作成しました。 MELPA に登録されているんで、よかったら使ってください。

# 使い方

1. `M-x list-packages` で、 MELPA から `command-queue` をインストール。
2. `M-x command-queue-publish-command` が、シェルコマンドをキューに積むための関数です。キューに積まれたコマンドは、逐次的に実行されていきます。
3. 失敗した関数があったら、 abort します。

# disclaimer

まだ、さくっと作ってみた段階で、いろいろと粗雑です。

https://github.com/Yuki-Inoue/command-queue

で issue・PR などあればお願いします。
ビンの区切り値を ndarray で持っているときに、与えられた値がどのビンに入るかを知るには

#まとめ
ビンの区切り値が `ndarray: bin_edges` に昇順で入っているとき、値 `x` がどのビンに入るかは

```get_bin_idx.py
bin_idx = np.where((bin_edges[:-1] <= x) & (x < bin_edges[1:]))[0][0]
```

で得られる。

追記(2016/03/16)：

```get_bin_idx2.py
bin_idx = np.searchsorted(bin_edges, x) - 1
```

でも同様なことができる (thanks to termoshtt)。

追記(2017/01/02):
さらに

```get_bin_idx3.py
bin_idx = np.digitize(x, bin_edges) - 1
```

でも同様なことができる。
実際、Numpyのドキュメントによると、`np.digitize()`の実装は`np.searchsorted()`そのものらしい。
これらの違いは単に、`np.digitize(x, bin_edges)`では「`x`の各要素をを`bin_edges`で定義されるビンに振り分けたときのビンのインデックスを求める」という用途が想定されている一方、`np.searchsorted(y, x)`では「ソート済みの配列`y`に`x`の各要素を挿入する際のインデックスを求める」という用途が想定されている、というだけのようだ。

#例
適当なビンを乱数で作る

```gen_bins.py
bin_edges = np.hstack(([0., 1.], np.random.rand(9)))
bin_edges.sort()
```

0 < x < 1 の値とビンの関係を図示すると

```plot_bins.py
plt.step(bin_edges, np.arange(len(bin_edges)), where='post')
plt.ylim(-0.5, 9.5)
plt.xlabel('x')
plt.ylabel('Bin index')
```

![bins.png](https://qiita-image-store.s3.amazonaws.com/0/68258/3d0a81b3-d9c8-4575-d41b-6ec85fe98f99.png)

適当な x に対して、どのビンに入るかを知るには

```get_and_plot_bin_idx.py
x = np.random.rand()
bin_idx = np.where((bin_edges[:-1] <= x) & (x < bin_edges[1:]))[0][0]
plt.axvline(x, c='r')
plt.axhline(bin_idx, c='r')
```

![bins2.png](https://qiita-image-store.s3.amazonaws.com/0/68258/b2e56319-d690-0afc-27a8-018f5e18533c.png)

もう一度、別の x で

```get_and_plot_bin_idx_again.py
x = np.random.rand()
bin_idx = np.where((bin_edges[:-1] <= x) & (x < bin_edges[1:]))[0][0]
plt.axvline(x, c='g')
plt.axhline(bin_idx, c='g')
```

![bins3.png](https://qiita-image-store.s3.amazonaws.com/0/68258/13ae9aa9-940c-5e89-5057-55842e721705.png)

以上。
pythonの標準ライブラリのみでElasticsearchにPOSTする

お知らせ
=======

AWS IoTから直接ESにデータがロードできるようになりました (3/17)

https://aws.amazon.com/jp/about-aws/whats-new/2016/03/aws-iot-integrates-with-elasticsearch-service-and-cloudwatch/

概要
====

AWS Lambdaはとても使い勝手の良いサービスです

しかし、npmやpipが必要なものを動かすときには、zipで固めてアップロードする必要があります
OSXやLinuxな方はいいのですが、Windowsな方にはまだまだハードルが高いようです

一方でIoTな場面においてAWS IoTから発生したデータをElasticsearch ServiceにPOSTするときにはAWS Lambdaを使うことになりますが、やっぱりnpmやpipが必要となり、面倒です

Lambdaファンクション作成のWeb画面でコピペするだけでESへぶっこみたい、そんな要望に応えるPythonスクリプトなのです

※[JAWS DAYS 2016 - HackDay(ハンズオン) 初級編](http://jawsdays2016-handson-beginner.readthedocs.org/ja/latest/04.html)で使ったスクリプトそのままです

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">みんながAWS HUBにインスタンスしているのに、俺と来たらハンズオンのテキスト書き直してるよ＼(^o^)／<br>でもいいの、ESへのbulkをpython標準ライブラリのみで書き直したから。</p>&mdash; Kohei MATSUSHITA (@ma2shita) <a href="https://twitter.com/ma2shita/status/708315276681420800">2016年3月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

論よりコード
----------

* es\_* は適当に書き換えてください
* _deviceId_ なるキーが来ることを想定してたりと、環境依存なところもありますので、自分でなんとかしてください

```lambda_handler.py
## example) es_endpoint = "search-jawsdays20160312handson-***.ap-northeast-1.es.amazonaws.com"
es_endpoint = "YOUR_ES_ENDPOINT"

es_index = "es-test"
es_type  = "awsiot0"

# REF: https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-logging.html
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

http_req_headers = {
    "pragma"      : "no-cache",
    "content-type": "application/json"
}

# REF: http://takatoshiono.hatenablog.com/entry/2014/12/18/192726
from datetime import timedelta, tzinfo
class JST(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=9)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self, dt):
        return "JST"
# Usage;
from datetime import datetime
#print datetime.now(tz=JST()).strftime("%Y-%m-%dT%H:%M:%S%z")

import urllib2, json
def lambda_handler(event, context):
    logger.info('got event: {}'.format(event))
    body = []

    es_bulk_header = {"index": {}}
    body.append(es_bulk_header)

    payload = event["state"]["reported"] # When data of client pass through the AWS IoT, become {state: {reported: {PAYLOAD}}}
    es_bulk_row = {
        "deviceId"  : payload["deviceId"],
        "@timestamp": datetime.now(tz=JST()).strftime("%Y-%m-%dT%H:%M:%S%z"),
        "payload"   : payload
    }
    body.append(es_bulk_row)

    post_body = "\n".join(map(json.dumps, body)) + "\n"
    logger.debug('post_body: {}'.format(post_body))

    # REF: http://takuya-1st.hatenablog.jp/entry/2014/08/23/023707
    invoke_url = "http://" + "/".join([es_endpoint, es_index, es_type, "_bulk"])
    logger.debug('invoke url: {}'.format(invoke_url))
    req = urllib2.Request(invoke_url, post_body, http_req_headers)
    res = urllib2.urlopen(req)
    logger.info('res body   :{}'.format(res.read()))

    return "done"
```

あとがき
-------

Lambdaファンクション作成時にパラメータ設定できるとうれしいよ

そして `context.params["hoge_param"]` とか、そんな感じで参照できると嬉しい

数々のコードの感謝！
vim(ビム)入門編

定番といえば
vimかemacsですね。
私の場合はvimなのでこちらを扱っていきます。

#vimの起動、終了、保存など

起動 vim
終了 :q
保存 :w
名前を付けて保存 :w ファイル名
強制終了 :q!
他のファイルを開く :e ファイル名

#vimチュートリアル

```
$ vimtutor
```

#vimのモード
そのまま　ノーマルモードから
i insert(入力モード)
: コマンドモード
v ViSUALモード(選択モード)
各モードからノーマルモードに戻る時はESCキーを押す

#ノーマルモードで移動を使う

gg 先頭に戻る
G 一番最後の行
control+f　一画面下
control+b　一画面上
単語単位で
w　前に進む
b　後ろに進む

^　行頭に
$ 行末に
f 文字　その行の指定された文字にカーソル移動　その次に;を押すと次の文字(検索文字)に移動
かっこの上で%で対応するカッコ末に移動

#ビジュアルモード
ノーマルモードからvを押す　文字単位で選択
ノーマルモードからVを押す　行単位で選択
ノーマルモードからCTL+v　ブロック選択　びっくり

応用
すべての内容を選択
gg
shift+v
G

#カット、コピー、ペイスト

x 一文字カット
dd 行カット
数字+dd　数字分行をカット
p (ペイスト)貼り付け
yy（ヤンク）コピー　数字指定すればその分コピー

#検索
ノーマルモード
/文字列　下方向n　上方向N
*下検索　#上検索 今カーソルがある位置の単語を検索

#置換
コマンドモードで
:s/state/State/　指定した文字列を変換(一箇所)

:s/i/I/g 行内の指定文字列を全て変換

:%s/i/I/g ファイル内の指定文字列を変換

:%s/i/I/gc ファイル内の指定文字列を確認しながら変換

#操作の取り消し

UNDO処理 u　取り消し
REDO処理 CTL+r UNDO処理の取り消し

#ウィンドウの分割

:sp (スプリット)　上下分割
上下移動は　CTL＋w　w

:vs (ブイスプリット)　左右分割

いらないウィンドウは :close

#タブを使う
ノーマルモード上で :tabnew
指定したファイルは新しいタブで開く :tabe ファウル名

タブ間の移動はgt(go to next tab)
タブを閉じる :tabclose
タブを初めから使う場合 vim -p　ファイル名１　ファイル名２
全てのタブで置換
:tabdo %s/html/HTML/g

#直前の操作を繰り返す
.　直前の操作を実行

#インデントを揃えよう
インデントが崩れているときに便利
行単位で選択できる

gg SHIFT+v SHIFT+g =

#補完機能
INSERT中に　文字列途中　ctrl+n

#矩形(ブロック)選択後の編集
ノーマルモード ctl+v shift+i or x　矩形の指定部分をいっぺんに編集

#テキストオブジェクト
htmlタグや""の中身を編集するのに便利
ノーマルモード　c i t
c/d/y  change(delete & insert)
i/a 中身or全体
t/"/)/}/] タグ

#便利な設定
コマンドモード
:set number　行番号
:set nonumber
:syntax on　コードの色分け
:syntax off
:set tabstop=4　タブが４
:set ignorecase 大文字小文字両方検索
:set noignorecase
ズンドコキヨシ with DFA(決定性有限オートマトン)

流行のあれを以前会社の同僚と勉強会をした[アンダースタンディング・コンピューテーション](https://www.oreilly.co.jp/books/9784873116976/)で学んだDFA(決定性有限オートマトン)とRubyで実装してみる。ちなみに本の内容はほとんど理解出来てないので、詳しいツッコミには解答できない可能性が高いです！

### 状態遷移図
たぶんこんな感じ(訂正しました、@kroton さんありがとうございます)

[訂正前はこちら](https://qiita-image-store.s3.amazonaws.com/0/30838/2dcedb85-aa82-6146-c2f8-4af0fcb3c340.jpeg)

![2016-03-15 00.54.08.jpg](https://qiita-image-store.s3.amazonaws.com/0/30838/3607d0d4-23f3-596c-9f23-d7a49a332764.jpeg)


### コード
DFAの部分はアンダースタンディング・コンピューテーションのほぼ写経です

```rb
# 有限オートマトンの規則
class FARule < Struct.new(:state, :character, :next_state)
  def applies_to?(state, character)
    self.state == state && self.character == character
  end

  def follow
    next_state
  end
end

# 決定性有限オートマトンの規則集
class DFARulebook < Struct.new(:rules)
  def next_state(state, character)
    rule_for(state, character).follow
  end

  def rule_for(state, character)
    rules.detect { |rule| rule.applies_to?(state, character) }
  end
end

# 決定性有限オートマトン
class DFA < Struct.new(:current_state, :accept_states, :rulebook)
  def accepting?
    accept_states.include?(current_state)
  end

  def read_character(character)
    self.current_state = rulebook.next_state(current_state, character)
  end
end

# ズンドコ節生成器
class ZundokoMachine
  ZUNDOKO = %w(ズン ドコ)

  def initialize
    rulebook = DFARulebook.new([
      FARule.new(1, 'ズン', 2) , FARule.new(1, 'ドコ', 1),
      FARule.new(2, 'ズン', 3) , FARule.new(2, 'ドコ', 1),
      FARule.new(3, 'ズン', 4) , FARule.new(3, 'ドコ', 1),
      FARule.new(4, 'ズン', 5) , FARule.new(4, 'ドコ', 1),
      FARule.new(5, 'ズン', 5) , FARule.new(5, 'ドコ', 6),
      FARule.new(6, 'ズン', 6) , FARule.new(6, 'ドコ', 6),
    ])
    @dfa = DFA.new(1, [6], rulebook)
  end

  def run
    begin
      zundoko = ZUNDOKO.sample
      puts zundoko
    end until read(zundoko).accepting?
    puts '＼キ・ヨ・シ！／'
  end

  private
  def read(zundoko)
    @dfa.tap{|dfa| dfa.read_character(zundoko)}
  end
end

# 実行
ZundokoMachine.new.run
```

### 実行結果の例
```
ドコ
ズン
ドコ
ドコ
ズン
ドコ
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ドコ
＼キ・ヨ・シ！／
```
SSL証明書更新についてメモ

最近仕事でSSL証明書の更新作業が多いので、覚えているうちにコマンドなどのメモ

CSRや秘密鍵のファイル名、発行された証明書のファイル名はコモンネームにして管理したほうが分かりやすいです。

秘密鍵ファイルのパーミッションには注意してください。

**環境、バージョンの想定**

```
cat /etc/redhat-release 
CentOS release 6.7 (Final)

rpm -q openssl
openssl-1.0.1e-42.el6_7.4.x86_64

httpd -v
Server version: Apache/2.2.15
```

#秘密鍵作成(パスフレーズ無し)
```
openssl genrsa -out example.com.key 2048
```
#秘密鍵作成(パスフレーズ有り)
```
opnessl genrsa -des3 -out example.com.key 2048
```

パスフレーズを後から外すこともできる。
```
copy example.com.key example.com.key-old
openssl rsa -in example.com.key -out example.com.key
```
#CSR作成
openssl req -new -key example.com.key -out example.com.csr

#認証局にSSL証明書の申し込みをする
作成したCSR使って、認証局にSSL証明書の申請。



#認証局から証明書が発行されたらサーバにインストール(差し替え)
ここはWebサーバのapacheを使用している想定。(メールサーバとかで指定するときも、あまり変わらんです。)
```ssl.conf
証明書ファイル
SSLCertificateFile /証明書までのパス/example.com.crt
中間証明書ファイル
SSLCertificateChainFile /中間証明書までのパス/example.com.chain.crt
秘密鍵ファイル 
SSLCertificateKeyFile /秘密鍵までのパス/exapmle.com.key
```
暗号スイート等はここでは省略。

#証明書の整合性確認
下記のそれぞれの出力結果を比較し、相違がないことを確認する。
```
秘密鍵
openssl rsa -pubout -in example.com.key | openssl sha1
``````
SSLサーバ証明書
openssl x509 -noout -pubkey -in example.com.crt | openssl sha1
```

#サーバ再起動
ここもapacheを想定
```
apachectl -k graceful
```

#証明書のインストールができたら確認する
webサーバの証明書ならブラウザから簡単に確認できる。

ここではコマンドで確認する方法をメモ。(メールサーバ(SMTPS, POP3S)などの証明書を確認したいときに使える)
※以下はHTTPSの例です。
```
openssl s_client -connect example.com:443 -showcerts
```
これで、Verify return code: 0 (ok)という文字列が最後の方に出てきていれば設定上の問題はないです。
ズンドコキヨシワンライナー with Ruby

## ワンライナー

ズンドコキヨシ発動のため5個バッファする

```rb
Array.new(5).instance_eval { rotate! and puts self[-1] = [:ズン, :ドコ].sample until last == :ドコ and count(:ズン) == 4 and not puts :キヨシ }
```

## 実行例

```console
   _╰╰,   /ﾊﾞｼｮ % ~/tmp
  _/o ŏｧ  / ﾀｲﾁｮｰ% ﾔﾊﾞｲ
∈ミ;ﾉ,ﾉ   ＼ｺﾏﾝﾄﾞ% ruby hikiyoshi.rb
ドコ
ズン
ズン
ドコ
ズン
ズン
ズン
ズン
ズン
ズン
ドコ
キヨシ
```

## その他のキヨシ

- [ズンドコキヨシ Quine with Ruby](http://qiita.com/hanachin_/items/856ecb53fe486c6d4a12)
- [歌うズンドコキヨシ with Ruby](http://qiita.com/hanachin_/items/a4547d88e9008d390f58)
- [ズンドコキヨシオートマトン with Ruby](http://qiita.com/hanachin_/items/2242c7bd33af39cc6cab)
- [ズンドコキヨシマシーン with Ruby](http://qiita.com/hanachin_/items/b037b2e602c0bdee6a89)
- [ズンドコキヨシ物語 with Ruby](http://qiita.com/hanachin_/items/055881be542afceca9d9)