OmniAICreator/Qiita-1.07M huggingface dataset:
RECESS は CI には使えないという結論にたどり着きましたがみなさんいかがでしょうか?


# RECESS ?

- [RECESS](https://twitter.github.io/recess/)

これ。 Twitter 社製。 `.recessrc` でルールを決められる。 CSS Linter 。


# 何がしたかったか

CircleCI で CSS Lint しておかしなルールで書いてたら怒ってほしかった。


# デモ

デモ用のリポジトリを用意しました。

- [kyokutyo/RECESS_demo - CSS](https://github.com/kyokutyo/RECESS_demo)

`sample.css` は fail するよう `0` とすべきところを `0px` と書いてあります。
が、しかし・・・

https://circleci.com/gh/kyokutyo/RECESS_demo/1

`$ npm test` の中を覗くと確かに `FAILURES: 1 failure` とある。にも関わらず Green 。。

ローカルで

```
$ npm run css:lint; echo $?
```

すると最後に `0` が出力されます。 RECESS は fail 時にも exit code 0 を返すようです。

<img alt="" src="https://qiita-image-store.s3.amazonaws.com/0/16646/f8645f37-b9f3-1d98-0ec8-dff433e38f22.png" width="300px" />

# 結論

RECESS は CI に使うものではないんだな、と思いました。
代替として以下を検討しています。

- [stylelint](http://stylelint.io/)
- [CSScomb: Makes your code beautiful](http://csscomb.com/)
- [CSS Lint](http://csslint.net/)

----

# 追記

- [Option to return exit code on any lint error · Issue #23 · twitter/recess](https://github.com/twitter/recess/issues/23)
- [Ending process with exit code of 1 for fatal error or validation failure by dominicbarnes · Pull Request #92 · twitter/recess](https://github.com/twitter/recess/pull/92)

exit code に関する issue も PR も既にありましたが、 2015.7.30 に README が更新されてて `NO LONGER MAINTAINED` とのことでした。

- [Merge pull request #166 from josephfinlayson/patch-1 · twitter/recess@146143b](https://github.com/twitter/recess/commit/146143bc0876e559e16a9895bd2d5212eee8730d)
RedisでMISCONF Redis is configured to save RDB snapshots,うんぬん言われた時の対応メモ

PHPでRedisを使っていたところ、突然タイトルのようなメッセージが表示されてredisが死んだ。
どうやらディスク容量がいっぱいになったりとかでsaveがこけると起きるらしい。

一旦以下コマンドで回避できるようなので対応したところ直った。

```bash
$ redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
```

<b>ただしこれは、ディスク異常でエラーが発生しても無視するという設定なので、だいぶよろしくない。</b>


さらに調べて見たところ、以下の対応の方がよさそう

一時対応の場合はredis-cliで

```bash
$ redis-cli
127.0.0.1:6379> CONFIG SET dir /どこか/ディスクに/余裕が/あるところ/
127.0.0.1:6379> CONFIG SET dbfilename dump.rdb
```

恒久対応の場合はredis.confのdirを書き換える

```vim:/etc/redis.conf
# デフォルトはコメントアウト
# dir ./
dir /どこか/ディスクに/余裕が/あるところ/
```

これでとりあえず復活した模様！
やったことは、壊れたrdbファイルを捨てて、余裕があるディスクに新しいrdbファイルを作った、みたいなことなので、これはこれで他にやりようがあるかもしれない、、、
ffmpeg と ImageMagick で、ちゃんと最適化が効いた動画 gif をつくる

- ffmpeg で動画 gif を作成したら、とてもザラザラした gif になってしまった。
- ImageMagick で 動画 gif を作るとサイズが巨大な gif になってしまった。
- ImageMagick で 動画 gif を作ったら爆速で再生される gif になってしまった。

という問題をまとめて解決する単一の記事が見つからなかったので、覚書です。

以下のとおりコマンドを実行すると、 input.mp4 から 10 コマ/秒 の動画 output.gif を生成します。

```shell-session
$ mkdir work 
$ ffmpeg -i input.mp4 -r 10 work/%04d.png 
$ convert work/*.png -delay 100 -layers optimize output.gif
```

`convert` オプションの `-delay` は 1コマあたりの表示時間を ms で指定します。上記の例だと 10コマなので、1000ms/10 = 100 を指定しています。

出来上がった gif の例は以下のとおり。541KBあります。もし`-layers optimize` オプションを与えなかったら 8.4MB になってしまいます。

![unescape.gif](https://qiita-image-store.s3.amazonaws.com/0/43781/b18430f4-2d51-b48d-7871-2a9c8c2ba148.gif)
TwitterAPIで取得したJSONからツイート本文を抽出する

# perlコード
```parse_twitter_json.pl
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use JSON;

while ( my $str = <> ) {
	chomp $str;
	my $item = JSON->new()->decode($str);
	$item->{text} =~ s/\n/ /g;
	utf8::encode($item->{text});
	print "$item->{created_at}\t$item->{text}"."\n"; # 日付とtextを表示
}
```

#実行
```
$ ./parse_twitter_json.pl twitter.json
Wed Jan 13 02:24:55 +0000 2016	ザクがいい
Wed Jan 13 02:24:55 +0000 2016	ご飯作った
Wed Jan 13 02:24:55 +0000 2016	明日か明後日あたり
```
(メモ)UE4でスクロールリストを作る。

# 概要
UE4でのスクロールリスト取り扱い方法について備忘録。
中身を必要な分だけ動的に作るやーつ。
※尚、この手法が正しいのか否かは不明。

# 手順
## 1. 普通にウィジェットをレイアウトする
### ベースとなるウィジェットを作る
![scroll_01.png](https://qiita-image-store.s3.amazonaws.com/0/97611/03e6c711-0c0d-7cce-4840-7482bf8e4331.png)
`新規作成` -> `ユーザーインターフェイス` -> `ウィジェットブループリント` でファイルを作るよ。
今回は「<b><font color=#ffaec9>testScrollWidget</font></b>」という名前を付けたよ。

### レイアウトする
![scroll_02.png](https://qiita-image-store.s3.amazonaws.com/0/97611/750d3210-14fd-a0d1-5b34-c5b6fa7b3420.png)
`パレット`から`Scroll Box`をベースにして、アイテムが1つ配置された状態のレイアウトを作ってね！

![scroll_03.png](https://qiita-image-store.s3.amazonaws.com/0/97611/26b75475-0ea9-4e51-85bb-802beac28a1b.png)
こんな感じ！

## 2. アイテム(中身)を別のウィジェットに分離する
### アイテムを分離するためのウィジェットを作る
![scroll_04.png](https://qiita-image-store.s3.amazonaws.com/0/97611/383e6f82-caaa-f735-2fd4-b746f758ed58.png)
`新規作成` -> `ユーザーインターフェイス` -> `ウィジェットブループリント` でファイルをもう一つ作ってね！
今回は「<b><font color=#00a2e8>testItemWidget</font></b>」という名前を付けたよ。

### 「<b><font color=#00a2e8>testItemWdget</font></b>」からデフォルトで配置されている`Canvas Panel`を削除
![scroll_05.png](https://qiita-image-store.s3.amazonaws.com/0/97611/3e894d1b-7e02-e7bb-069b-3d4cc94dca49.png)
アイテムを分離して配置するにあたり、ベースの`Canvas Panel`は不要になるので削除してね。

### 「<b><font color=#ffaec9>testScrollWidget</font></b>」からアイテムのレイアウトを切り取って
![scroll_06.png](https://qiita-image-store.s3.amazonaws.com/0/97611/20bae994-4e63-943b-a2d0-d47b799fe7a1.png)

### 「<b><font color=#00a2e8>testItemWidget</font></b>」に貼り付け
![scroll_07.png](https://qiita-image-store.s3.amazonaws.com/0/97611/c9ee4cf4-2c4f-affd-140f-80b3a3faa175.png)

こんな感じになればOK!
![scroll_08.png](https://qiita-image-store.s3.amazonaws.com/0/97611/73a7a009-862e-4ece-471c-b164b8152f3c.png)


## 3. 動的に生成するスクリプトを作る
![scroll_09.png](https://qiita-image-store.s3.amazonaws.com/0/97611/a4e5f037-b011-4a80-7529-692ec7d6fdb3.png)
「<b><font color=#ffaec9>testScrollWidget</font></b>」のブループリントをこんな感じにしてね！

## 4. テスト
![scroll_10.png](https://qiita-image-store.s3.amazonaws.com/0/97611/e70507f4-e3b9-7b4c-3213-7eb517f7d96e.png)
とっても簡単ね！

# Tips
## アイテムのトップを`Canvas Panel`にする
そうすることで、アイテムの高さ(幅)を自由に設定できるようになるよ！
Google 日本語入力辞書を Google スプレッドシートで管理する

Google 日本語入力の辞書を以前 Github で管理していました.
が、すごく使いづらかったです.

で、Google スプレッドシートに委ねました.

超楽になりました.

# コード

```js:onOpen.gs
function onOpen() {
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var subMenus = [
    {
      name: 'エクスポート',
      functionName: 'export'
    }
  ];
  spreadSheet.addMenu('辞書', subMenus);
}
```

```js:export.gs
function export() {
  var CONTENT_TYPE = 'text/plain';
  var CHARSET = 'utf-8';
  var SEPARATOR = '\t';
  var NEWLINE = '\n';
  
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow(); 
  var range = SpreadsheetApp.getActiveSheet().getRange(1, 1, lastRow, 4);
  var values = range.getValues();
  
  var dicList = [];
  for (i = 0; i < values.length; i++) {
    dicList.push(values[i].join(SEPARATOR));
  }
  var string = dicList.join(NEWLINE);
  
  var filename = Browser.inputBox('保存名');
  // var filename = SpreadsheetApp.getActiveSheet().getName();
  
  filename = filename + '.txt';
  
  var blob = Utilities.newBlob("", CONTENT_TYPE, filename).setDataFromString(string, CHARSET);
  DriveApp.createFile(blob);
}
```

# シート

`よみ, 単語, 品詞, コメント` で構成されています

下の例ではコメントがないですが本当は必要です

![スクリーンショット 2016-01-29 16.00.45.png](https://qiita-image-store.s3.amazonaws.com/0/30241/eec4d8e3-8659-6b73-60f3-c591bcf2c6f9.png)

# 品詞一覧

```
名詞
短縮よみ
サジェストのみ
固有名詞
人名
姓
名
組織
地名
名詞サ変
名詞形動
数
アルファベット
記号
顔文字
副詞
連体詞
接続詞
感動詞
接頭語
助数詞
接尾一般
接尾人名
接尾地名
動詞ワ行五段
動詞カ行五段
動詞サ行五段
動詞タ行五段
動詞ナ行五段
動詞マ行五段
動詞ラ行五段
動詞ガ行五段
動詞バ行五段
動詞ハ行五段
動詞一般
動詞カ変
動詞サ変
動詞ザ変
動詞ラ変
形容詞
終助詞
句読点
独立語
抑制単語
```

# 品詞一覧の設定方法

[データ] - [検証…]

`データの検証` 画面でセル範囲を選択、条件を `リストを範囲で指定` にして [保存] を押す.

![スクリーンショット 2016-01-29 16.00.10.png](https://qiita-image-store.s3.amazonaws.com/0/30241/5bc5a3ee-9291-a2aa-38b0-494472c1aa4f.png)

![スクリーンショット 2016-01-29 16.00.28.png](https://qiita-image-store.s3.amazonaws.com/0/30241/6c90ce54-e868-e76a-05cd-ce4dc72f81fb.png)
golang製WAFのgojiでfastcgiを使ってnginxと連携する

NGINXの設定
-----------

```nginx.conf
server {
    listen       80;
    server_name  example.com;

    location / {
        fastcgi_pass  unix:/var/run/go-fcgi.sock;
        include       fastcgi_params;
    }
}
```

この辺りは[nginx + Go-FCGI で Web アプリを動かす](http://qiita.com/senda-akiha/items/0f37c8239caeeec2ba06)の投稿を見ていただいて

終了時にUNIXソケットのファイルを削除するようにする
-----------------------------------------------

```main.go
	listener, err := net.Listen("unix", "/var/tmp/go-fcgi.sock")
	if err != nil {
		return
	}

	// ここから
	sigc := make(chan os.Signal, 1)
	signal.Notify(sigc, os.Interrupt, os.Kill, syscall.SIGTERM)
	go func(c chan os.Signal) {
		// Wait for a SIGINT or SIGKILL:
		sig := <-c
		log.Printf("Caught signal %s: shutting down.", sig)
		// Stop listening (and unlink the socket if unix type):
		listener.Close()
		// And we're done:
		os.Exit(0)
	}(sigc)
	// ここをコピペする

	fcgi.Serve(listener, goji.DefaultMux)
```


#### 備考
- 不正に落ちた場合は削除されないので、起動時に削除したほうが良い？
- deferとかで出来無いだろうか・・・

参考
====

- [nginx + Go-FCGI で Web アプリを動かす](http://qiita.com/senda-akiha/items/0f37c8239caeeec2ba06)
- [How to reliably unlink() a Unix domain socket in Go programming language](http://stackoverflow.com/questions/16681944/how-to-reliably-unlink-a-unix-domain-socket-in-go-programming-language)
CS-Cart: エラーをログに出したり、Slackに通知したりする

CS-Cartはアーキテクチャがしっかりしていないというか、10年くらい前のアーキテクチャというか、とにかくフレームワークの作りがゆるいので、改修していると今時当たり前の仕組みが無かったりする。

その1つが、エラーの通知。CS-CartでFatalエラーやExceptionが発生しても、開発者は知るすべがない。致命的なエラーになると、ユーザには下のような画面が表示され、HTMLのソースコードにコメントでエラー情報が出力されるが、顧客から連絡がないと発見することができず、後手後手になってしまう。

<img width="610" alt="Service_unavailable.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/b675ede8-7f4a-ae72-f3f6-c4679c8a2a8e.png" class="img-thumbnail">

## CS-Cartはエラーをどうハンドリングしているか

CS-Cartがエラーをどう処理しているかだが、DEVELOPMENT環境かどうかで挙動が違う。まず、DEVELOPMENT環境ではない いわゆる本番環境では、次の処理をしている

* `register_shutdown_function`で、Fatalエラーになっても最悪画面が真っ白にならないようにエラー処理をしている
* ログは取っていない

DEVELOPMENT環境では、これに加えて、

* `set_error_handler`で開発者用エラー画面を出すのと、error_logを実行する

くらいはやっている。

ソースコードをgrepしてみたが、exception handlerは使っていないので、Exceptionが発生してcatchされないと画面が真っ白になる。


## CS-Cartでエラーをログに出す方法

CS-Cartならhookを使ってエラーハンドリングしたいところだが、エラー処理部分には残念ながらフックがない。したがって、エラーを捉える処理を実装しないとならない。

と言っても難しいことはなく、`set_error_handler`, `set_exception_handler`, 
`register_shutdown_function`でエラーハンドラをバインドしておけばいい。どこに、エラーログの処理を書くか悩ましいが、とりあえずlocal_conf.phpに書いておけばよいかと思う。

```php:local_conf.php
$reportError = function (Exception $exception) {
    // ここでログをとる
};

set_error_handler(function ($severity, $message, $file, $line) use ($reportError) {
    if (error_reporting() & $severity) {
        $reportError(new ErrorException($message, 0, $severity, $file, $line));
    }
});

set_exception_handler(function (Exception $exception) use ($reportError) {
    $reportError($exception);
});

register_shutdown_function(function () use ($reportError) {
    $error = error_get_last();
    if (isset($error['type']) and in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING])) {
        $reportError(new ErrorException($error['message'], 0, $error['type'], $error['file'], $error['line']));
    }
});
```

`set_error_handler`は1プロセスに1個しか登録できないのがPHPの仕様だが、CS-CartはDEVELOPMENT環境でないと、`set_exception_handler`を使わないので気にせず登録してしまってOK。

`register_shutdown_function`はPHPの仕様上、複数登録できるので問題ない。`set_exception_handler`はそもそも使われていないので、登録してしまって構わない。


## Slackにエラーを通知する方法

[PHP: Slackにメッセージを投稿するクラス - Qiita](http://qiita.com/suin/items/b647aed3dfcaf9755270)を使って、Slackにエラーを投げるようにする。

エラーをログにとるなら、エラーの文脈もあるとデバッグしやすいので、つけておく。

```php
require_once __DIR__ . '/app/SlackNotifier.php';
$webhookUrl = 'https://hooks.slack.com/services/...';
$slackNotifier = new SlackNotifier($webhookUrl);
$reportError = function (Exception $exception) use ($slackNotifier) {
    $user = \Tygh\Registry::get('user_info');
    $slackNotifier->exception($exception, [
        'HTTP_HOST'      => @$_SERVER['HTTP_HOST'],
        'REMOTE_ADDR'    => @$_SERVER['REMOTE_ADDR'],
        'REQUEST_METHOD' => @$_SERVER['REQUEST_METHOD'],
        'url'            => @"http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]",
        'user_id'        => @$user['user_id'],
        'HTTP_REFERER'   => @$_SERVER['HTTP_REFERER'],
        'ajax?'          => defined('AJAX_REQUEST') ? 'yes' : 'no',
    ]);
};
```

<img width="825" alt="Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/22783e64-1eed-43bf-0f3a-04bd34756ab1.png" class="img-thumbnail">
heroku に single page app (SPA) をサクっとデプロイ

`package.json` をこんな感じにしておけば動いた。

```json:package.json
  ...
  "scripts": {
    "postinstall": "npm run build",
    "build": "webpack",
    "start": "python -m SimpleHTTPServer $PORT"
  },
  ...
```
Alipayからnotifyの通知が来ない時に考えること


1、サーバーのファイアーウォール

2、httpsの場合、正しく証明書が設定されているかどうかの確認

```basn
curl https://example.com/notify
```

こんな感じのエラーが出た場合は、root証明書をcrtに追加する必要があります。
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:

注意事項としては、curlでエラーが出ていても、ブラウザではエラーが出ていません。
【AWS】初めてのECR

AWSで提供されているECR（EC2 Container Registry）を使ってみました。

# リージョン
~~今のところus-east-1のみでの提供です。~~ Tokyo（ap-northeast-1）にもきました。

# 事前準備
aws cliのconfigureでecr用のプロファイルを作成しておくと便利です。
~~※リージョンを聞かれるので、us-east-1を指定して下さい。~~
利用したいリージョンを指定します。

```
aws configure --profile ecr
```

# リポジトリ作成
とりあえず初めてなので、AWSマネージメントコンソールから作成しました。

手順
1. AWSマネージメントコンソールにアクセス
~~2. 右上のリージョンをUS EAST(N. Virginia)に変更~~
2. 右上のリージョンを選択
3. ECSサービスを選択
4. 左サイドバーの Repositories を選択
5. Create repositoryボタン押下

作成するとその後の操作方法がコマンドライン表記で表示されます。

# ECRへDockerイメージをプッシュ
表示された操作方法を元にイメージをプッシュします。

**ECRにログイン**
まずは最初に表示されているコマンドを実行

```
aws ecr get-login-password --region ＄REGION | docker login --username AWS --password-stdin $REGISTRY_URL
```

~~そうするとレスポンスにログイン用コマンドがコマンドラインに表示されるので、それをそのまま実行するとログインが完了します。~~

**プッシュするイメージを作成**
ここで作成するイメージ名は、前段で作成したECRのリポジトリ名に合わせてください。

```
docker build -t 【イメージ名】 .
```

**ECRにプッシュする為のタグを追加**

```
docker tag 【イメージ名】:latest ************.dkr.ecr.＄REGION.amazonaws.com/【イメージ名】:latest
```

**ECRにプッシュ**

```
docker push ************.dkr.ecr.＄REGION.amazonaws.com/【イメージ名】:latest
```

**ECRからプル**

```
docker pull ************.dkr.ecr.＄REGION.amazonaws.com/【イメージ名】:latest
```

# 結果
うまくいきました！

会社等外部へ公開できない環境ででDocker運用する際などはprivate registoryを運用しないといけませんが、運用コスト等考えるとなかなか手がつけづらい部分でした。

だがしかしECRでかなり捗りそうですね！

# 追記
記事が古いですね。申し訳ありません。tokyoリージョンでもできます！最高！Fooooo!
これにより、今いる会社では本番環境でもECSでイメージ保存から実際の運用、サービス提供までやっています！コンテナで運用するとリソースの無駄遣いがマジでなくなりますね！感激！
El Capitan で Sequel Pro のSSH接続 が出来なくなったので解決する

# 現象
MacのOSをYosemiteからEl Capitanに変更しました。
すると、Sequel Pro を立ち上げてSSH接続しようとしてもエラーが出てきて出来ません。

# 対策
最新版のSequel Proをダウンロードし直しましょう。
http://www.sequelpro.com/blog/

この記事を書いた今日 2016/1/29にSSH接続に対応したバージョンの安定版が出来たようです。
バージョン 1.1.0.1 で対応出来たので、それ以降のバージョンであれば対応できているかと。

こちらからダウンロード。
http://www.sequelpro.com/

# 原因

以下の記事に書かれているように、El Capitanは新しいSSHのバージョンを採用しており、それの影響でSSH接続に制限がかかったようです。それに対応したRC版が一応出ていたようですが、安定版が今日公開されたみたいです。

[SSHトンネルはOS X El Capitanでツンデレになっちゃう](http://qiita.com/sinri/items/a09a7e51cd7145969e7d)

[MacOSをEl CapitanにアップデートするとSequel ProでSSHできなくなる問題とその解決。](http://callofventure.hatenablog.com/entry/2015/12/21/203923)
ansible2.0を使った環境構築−準備編

# 動機
いつの間にか、ansibleの2.0が正式リリースされていた。
現在使っている仮想環境は、知り合いからもらった設定ファイルを使って構築したものなので、再勉強がてら開発環境の再構築をしていこうと思い立つ。

参考にしたサイトはこちら: http://dev.classmethod.jp/server-side/ansible/using_ansible_2-0_and_1-0_via_pyenv-virtualenv/

# 現状確認
まず現在の環境を確認

    $ ansible --version
    ansible 1.9.1
      configured module search path = None
    $ python --version
    Python 2.7.5

ansibleはbrewを使ってインストールしたものだったので、これをアンインストール

    $ brew uninstall ansible --force
    Uninstalling ansible... (1527 files, 18M)
    $ 

# pythonの準備
pythonのバージョンは2.6、2.7系が必要とのこと。
現状のままでも要件をみたいしているが、せっかくなので参考サイトにならってpyenv-vitualenvを導入してみる。

    $ brew install pyenv-virtualenv

installはbrewコマンドで問題なく完了したものの

    $ pyenv install 2.7.10
    python-build: definition not found: 2.7.10

    See all available versions with `pyenv install --list'.

    If the version you need is missing, try upgrading pyenv:

      brew update && brew upgrade pyenv

となり、python2.7.10のインストールに失敗。
エラーメッセージによるとbrewのバージョンに問題があるようなので、素直にbrewを更新後再実行すると、今度は成功。
globalのバージョンを2.7.10に指定する。

    $ pyenv virtualenv 2.7.10 ansible2
    $ pyenv global ansible2
    $ python --version
    Python 2.7.5

…うまくいかない。
少しの調査後、pyenvの設定が正しくなかったと判明
http://qiita.com/Kodaira_/items/feadfef9add468e3a85b
こちらを参考にbash_profileを更新したところ

    $ python --version
    Python 2.7.10

無事pythonの準備完了

# ansible2.0のインストール
ansibleの最新版のインストールはpipを使って行う

    $ pip install ansible

これだけ。
ちなみに、準備開始前に環境確認した際にはpipコマンドは動かなく別途用意する必要があると思っていたが、この段階では問題なく動作した。
どうやらpyenvを使ってpythonをインストールする際に一緒に導入されるようだ。

    $ ansible --version
    ansible 2.0.0.2
      config file = 
      configured module search path = Default w/o overrides

これでansible2.0のインストールも完了。
環境構築編へ続く。
Qitalk - PepperのTabletを扱いやすくするライブラリ


PepperのTablet(qimessaging)を扱いやすくするライブラリを、GitHubに公開しました。

https://github.com/hikouki/qitalk

qimessagingをラップして、Viewの切り替えをサポートしたものになります。

## 依存ライブラリ

```
<script src="/lib/jquery/jquery.min.js"></script>
<script src="/libs/qimessaging/2/qimessaging.js"></script>
<script src="js/qitalk.js"></script>
```


## インストール方法

- bowerからインストールする

```
bower install qitalk
```

- GitHubリポジトリから直接取得する

```
release
├── qitalk.js
└── qitalk.min.js
```

## 使い方

### Qitalkを初期化

※ 利用するServiceはpreloadしておく必要があります。

```html
<script>
Qitalk.init({
    // host: 'pepper1', pepper外からpepperとつなぐ場合はpepperのホストを指定
    root    : '#qitalk', // QitalkのView起点となる要素ID
    tplDir  : './tpl'    // テンプレートディレクトリのパス
    preload: {
        tpl: ['welcome'], // テンプレートファイルをpreloadします
        service: ['ALMemory', 'ALTextToSpeech', 'ALAudioPlayer'] // サービスをpreloadします。(必須)
    },
    handle: {
        start: function() {
            // preload処理終了後に通知
        },
        presented: function() {
            // 画面遷移後に通知
        }
    }
});
</script>
<div id="qitalk"></div>
```

### Pepper/Tablet間のイベント通知

- Pepper -> (Tablet)


```javascript
/**
 * Qitalk.on(memoryName, callback, id);
 * 第三引数のIDはイベントの重複防止です。
 * 既に同じIDのイベントを監視している場合は無視されます。
 */
Qitalk.on('/Signal/Pepper/PresentView', function(tpl) {
    Qitalk.presentView(tpl);
}, 'PresentView');
```

- (Tablet) -> Pepper

```javascript
/**
 * Qitalk.send(memoryName, value);
 */
Qitalk.send("/Signal/Tablet/Touched", 1);
```

- Qitalk.onしたイベントにシグナルを送る

Pepperからシグナルを送れない場合は、コンソールなどから送ることができます。

```javascript
Qitalk.trigger('/Signal/Pepper/PresentView', 'welcome');
```

### 画面遷移

Pepperの場合、Pepper側からタブレットをメモリ経由で操作することが
多いため、シングルページが扱いやすいです。

ですが、シングルページの場合、1ファイルが大きくなりすぎてしまい可読性が落ちるため
Qitalkでは、シングルページで複数のHTMLを切り替える仕組みとしています。

デフォルトでは以下のディレクトリにあるtplファイルを読み込むようになっています

```javascript
tplDir  : './tpl'
```

./tpl/welcome.tplを読み込む例です。

```javascript:./tpl/welcome.tpl
<h1>Welcome!</h1>
```


```javascript:main.js
Qitalk.presentView("welcome");
```



### 画面間の値の受け渡し
`Qitalk.presentView(tplName, value)`の第二引数に値を入れることで
次のViewに対して値を受け渡すことができます。


```javascript:main.js
Qitalk.presentView("welcome", "hikouki!");
```

`Qitalk.params`で受け取る

```javascript:./tpl/welcome.tpl
<script>
alert(Qitalk.params); // open alert hikouki!
</script>
<h1>Welcome!</h1>
```

### Serviceを使う

Qitalk経由でServiceを使う場合は、preloadしておく必要があります。
`Qitalk.proxy.<サービス名>`でサービスを呼び出せます。

- sayしてみる

```javascript
Qitalk.proxy.ALTextToSpeech.say("hello");
```
ほんきで学ぶSwift+iOSアプリ開発入門

<h2> 開発環境のセットアップもしっかり解説</h2>
Swift2.1に対応したiOSアプリ開発の入門書です。
今回は電子書籍版を見てみました。
この本は、iOSアプリ開発の教科書あるいは独習書として使えるような構成になっています。したがって開発環境の説明やセットアップについてもある程度しっかり解説されています。XCodeの画面や各種ツールについてもしっかり丁寧に解説されています。環境のダウンロードから実行するまでの環境周りでCHAPTER01とCHAPTER02を費やしていて、全体の15%程度を費やしています。
それぞれの項目をレッスン形式で実習をしながら進めるような構成になっていて、CHAPTERごとに簡単な練習問題をいれてあります。
<h2>最初はPlaygrroundで基本的な学習</h2>
CHAPTER03でSwiftの基本的な文法をCHAPTER04で基本的なUI部品の使い方をPlaygroundを使って学習するようになっています。UI部品の動作までPlaygroudで学習するようになった入門書は今までなかったように思います。
なお、文法の説明ではプロトコルやエクステンション、エラーハンドリングまで解説されています。この辺りまで来ると入門書としてはどうかなと思います。文法解説の章だから入れたのでしょうが、実際のアプリを作ってみていない状態だとなかなか実際にどう使うのかを理解するのは難しいのではないかと思います。プロトコルやエラーハンドリングについては、やはりもっと後の方で実際にそれらを使うアプリを例題にして解説した方が理解できるのではないかと思います。
<h2>アプリケーションは５本だけど幅広い技術を学習</h2>
CHAPTER05からは、章ごとに１本のアプリを作るようになっています。入門書とはいいながらCHAPTER06ではCocoaPodsやRealmを使うことまで解説されています。また、CHAPTER09ではSpriteKitを使うアプリまで用意されています。最後のCHAPTER10は付随的なアイテムとして、ローカライズとiAdが解説されています。
本書を最後までやると５本のアプリケーションができることになりますが、その中でかなり多く、幅広い学習内容があります。
それぞれの実習では、スクリーンショットをふんだんに使って、XCodeでの操作まで丁寧に解説されているので、この通りにやればまず問題なくアプリを作ることができます。一方であまりに操作の説明が懇切丁寧な割に、その操作で一体どういうことが行われているのかという点についての説明があまりないので、初心者には応用が難しいように思います。
<h2>最後に</h2>
最後のLESSON55では広告表示まで解説されている割には、最初の環境整備の段階でApple Developer Programについてはほとんど解説されていません。現在は、Deeloper Programの契約がなくても、Developer登録さえすればアプリの開発まではできるようになっているので、金銭が絡んでややこしいDeveloper Programは解説を省略したのでしょうが、iAdのようなアプリストアに公開することが前提の機能を説明しながらDeveloper Programを解説しないのはちょっと片手落ちではないでしょうか？
とりあえず、最後のLESSON55までやりきれば、なんだか動作するアプリが５本できてしまいましたというような入門書です。
php-fpmをAnsibleで入れようとしたらしょーもないことに遭遇した話

# はじめに
ちょっとAnsibleでNginx+PHP+MySQLな環境を作ろうとしていたら本当にしょうもないことに出くわしました。php-fpmの設定ファイルを反映するところで何度やっても事故るという。

最終的にただの笑い話でよかったですが。(~~仕事しろ~~)

# 事象
Playbook実行時のエラーがこれ
![playbookerror.png](https://qiita-image-store.s3.amazonaws.com/0/16309/08359f57-2e17-c322-4287-fd78ca4a7a6f.png)

```
AnsibleError: file: /Users/.../playbook/roles/php70/templates/php-fpm.d/www.conf.j2, line number: 288, error: Encountered unknown tag 'Y'.
```

なるほど設定ファイルのテンプレにへんなタグがあるよと。タイポかな？とりあえず該当箇所見てみよう。

<img width="726" alt="www.conf.j2.png" src="https://qiita-image-store.s3.amazonaws.com/0/16309/110345b7-b6c6-1e55-a873-7e8f584e5040.png">

まずコメント行だから初期のままなんだけどなぁ...。
あ、とりあえずタイポではないけど、ブラケットがいる...。
でも確かplaybookの変数は二重波括弧(`{{ hoge }}`)だったはず...？
<a href="http://jinja.pocoo.org" target="_blank">Jinja</a>というテンプレートエンジンを使ってたはずなので見てみよう。

<img width="876" alt="jinjahome.png" src="https://qiita-image-store.s3.amazonaws.com/0/16309/e54df272-025d-b9cd-61bf-cc8e5d88eb59.png">

ん...？

![img1454044305491.png](https://qiita-image-store.s3.amazonaws.com/0/16309/138ca65d-1d67-c491-fb1c-b2a0a9aba477.png)
![img1454044423243.png](https://qiita-image-store.s3.amazonaws.com/0/16309/f633a7e6-7173-5d02-d4b1-5a1899e8c86d.png)

▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわああああああああああ
Jinjaの文法ちゃんと知っていなかったがために数分無駄にしましたとさ...。
~~知っててもしょうがなかったけども~~

# 顛末
コメントなので消してしまっても良いかと思ったのですが、usage系のコメントは消したくなかったのでJinjaのページを漁って対応方法を探しました。
シンタックスの文字をそのままレンダリングするためのタグがあるので、それを使用するとバッチリ通りました。

(๑•̀ㅂ•́)و✧ﾔｯﾀﾈ

```
;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
↓↓
{% raw %}
;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
{% endraw %}

```

# おしまい
今回に限らず起きそうなので笑いのネタ程度に残しました。
ここまでお読みいただきありがとうございました！

追記：[IWAI Masaharu](http://qiita.com/iwaim@github) 様、ひどい誤字にご指摘いただきありがとうございました!
Railsがuglifierを読み込めなくて動かない時の話

## 動作環境

Docker上にUbuntuを構築。
Ubuntu: 14.04

Rubyをppaからインストール
Ruby: 2.3.0p0
Gem: 2.5.1

Rails: 4.2.5.1
Uglifier: 2.7.3

## 何が起こるか

rails serverしようとすると以下のエラーで動かない

```
There was an error while trying to load the gem 'uglifier'. (Bundler::GemRequireError)
```

## 解決策

Gemfileからuglifierさんを削除して動いた。
どこかで副作用が起きそうだけど、とりあえずサーバーとして起動できました。
Expressでテンプレートエンジンjadeを使う時の参考


Express + jadeでアプリケーションを作っています。もとい、作り始めています。

jadeの記法は、インデントに意味があるので気をつけることと、テキストエディタのプラグインは必須かと思います。

エディタのプラグイン
- Jade - Packages - Package Control 
https://packagecontrol.io/packages/Jade
- How to add Jade syntax highlighting in Sublime Text 2? 
Quora https://www.quora.com/How-to-add-Jade-syntax-highlighting-in-Sublime-Text-2



## まずこれを読む

- Jade公式リファレンス
	- Template Engine http://jade-lang.com/reference/

- formの部品がすべてかかれているgitHub
	このままコピーペースト、クラスの部分をカスタマイズでできそうなくらいform部品が揃っています。
	- https://github.com/lmaccherone/sb-admin-2-meteor/blob/master/client/forms.jade


- Bootstrapでのjadeの書き方
	各コンポーネント毎になっているのでリファレンスに便利。Bootstrapを使ってサイトを作る時などに
	- https://github.com/ALT-F1/bootstrap3-jade-node-express-grunt/tree/master/app/views/bootstrap3-templates



##Sample

### node.jsからの値の表示

文字列

```jade
p #{name}
```

配列

```jade
each item in publishers
	p #{item}   
	
### Javascriptの読み込み分岐

```node.js

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
	res.render('ccc', {layout:'ccc' });
});

module.exports = router;
```


```jade
case layout
  when "ccc"
    script(src='/javascripts/ccc.js')
  when "ppp"
    script(src='/javascripts/ppp.js')
    script(src='/bower_components/dropzone/dist/min/dropzone.min.js')
  when "input"
    script(src='/javascripts/input.js')
  default
    - script(src='/javascripts/def.js')
```

### セレクトボックス


```node.js
var express = require('express');
var router = express.Router();




/* GET home page. */
router.get('/', function(req, res, next) {
	var res_vals ={}
	res_vals.publishers={
		'1111':'A',
		'2222':'B',
		'3333':'C'
	}

console.log(res_vals);
    res.render('score_input', res_vals);

});

module.exports = router;
```


```jade
.form-group
  .row
      label.col-md-2.control-label 出版社
      .col-md-10
          select#publisher
              each publisher, i in publishers
                  option(value=i)  #{publisher}
                  
```

### ラジオボタン

```jade
.form-group
  .row
      label.col-md-2.control-label 貨幣単位
      .col-md-10
        label.radio-inline
          input#optionsRadios(type="radio", name="currency", value="option1", checked="")
          | 円
        label.radio-inline
          input#optionsRadios(type="radio", name="currency", value="option2")
          | ドル
        label.radio-inline
          input#optionsRadios(type="radio", name="currency", value="option3")
          | ユーロ
```

### ファイル受付フォーム

```jade
.form-group
  .row
      label.col-md-2.control-label カバー写真
      .col-md-10
          input#inputImage(type="file")
```


またふえるかも

## おまけ

東洋経済オンラインで「エンジニア夫婦のあるある日記」を連載中です

[エンジニア夫婦のあるある日記](http://toyokeizai.net/category/diary)

![あるある日記.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/14d59814-449c-7cec-c463-59650d3ab1a3.jpeg)
Elixir の `import/2` macro について整理する

`import/2` macro(以下 `import/2`)の `except` オプションについて理解が正しくなかったため正しく理解した内容をもとに整理する。

早い話がドキュメントを正しく見ておけばよかったという話ではあるが、ここでは自分の中で飲み込んだ内容を記載する。`import/2` の公式ドキュメントは[こちら Elixir version 1.2](http://elixir-lang.org/docs/v1.2/elixir/Kernel.SpecialForms.html#import/2)。

## まず `import/2` macro について

Elixir の `import/2` を使うと import した module の関数や macro を、`Module.` の prefix なしで呼び出すことができるようになる。
例えば `List.first/1` を例にとると以下のようになる。

```iex
iex> List.first([1])
1
iex> first([1])
** (CompileError) iex:4: undefined function first/1

iex> import List
nil
iex> first([1])
1
```

`import/2` を使うことでショートカットが提供されるイメージだ。

さらに `import/2` に渡すオプションを変更することで、特定の関数または macro のみを import したり、除外したりすることが可能になる。

下記は `only` オプションの例で、`List.first/1` を指定しているため、それ以外の関数/macro は import されず、`List.last/1` は `List.` なしでは呼び出すことができない。

```iex
iex> import List, only: [first: 1]
nil
iex> first([1])
1
iex> last([1])
** (CompileError) iex:2: undefined function last/1
```

同様に `except` オプションの例が以下であり、`List.first/1` 以外を import しているため `List.` なしで `List.first/1` を呼び出せない。

```iex
iex> import List, except: [first: 1]
nil
iex> last([1])
1
iex> first([1])
** (CompileError) iex:3: undefined function first/1
```

## `import/2` は後から呼び出し可能

`import/2` は後から呼び出して、動作を変えられる。これは公式のドキュメントにも例として載っている。公式からの引用だが、例えば以下のようにすることができ、`flatten/1` を後から除外することができる。

```
import List, only: [flatten: 1, keyfind: 4]
import List, except: [flatten: 1]
```

試しに `Macro.Env` の状態がどう変わるのかを見ることで `import/2` の挙動を追ってみる。`Macro.Env` にはコンパイル時の環境が格納されており、現在の状態は `__ENV__` にてアクセスできる。`__ENV__` には例えば現在の module、file 行数、require している module などの情報が含まれている。import を行うことで `Macro.Env.functions`、`Macro.Env.macros` の情報が変更されるので、この状態推移を見ることで `import/2` の挙動を観測できる。

最初の例と同様に `List.first/1` で `only` した後に、`except` で除外してみると以下のようになった。`Macro.Env` 全体を出力すると見づらいため、関連する `List` module 部分のみを表示するようにしているが、後で呼び出した `except` オプション付きの `import/2` 呼び出しによって `List.first/1` が除外されている様子が分かる。


```
iex> __ENV__.functions |> Enum.filter(fn({x, y}) -> x == List end)
[]
iex> import List, only: [first: 1]
nil
iex> __ENV__.functions |> Enum.filter(fn({x, y}) -> x == List end)
[{List, [first: 1]}]
iex> import List, except: [first: 1]
nil
iex> __ENV__.functions |> Enum.filter(fn({x, y}) -> x == List end)
[]
```

私が一番勘違いしていたところはこの点で、これを理解していなかったばかりに PowerAssertEx の実装で macro ガチャガチャのよくない実装をしてしまっていた。
ちなみに良くない実装の部分については v0.0.8 で[解消している](https://github.com/ma2gedev/power_assert_ex/commit/31425355c1ccdfd9ea00c5ac0609577ed5c4ddb8)。

何故勘違いしていたかというと `import/2` を何となく理解しており、てっきり先に import されてしまったものは元に戻らないと考えていたため。関係ないけど最近子供達がカルタに興味を持ち出して私にクイズを出してくるのだが、`急いては事を` と言われると何かツラいものを感じる。


## まとめ

`import/2` は何度も呼び出し可能で、後で呼び出したものの指定が優先される。


## 参考

- 公式ドキュメント
    - [import/2 Elixir version 1.2](http://elixir-lang.org/docs/v1.2/elixir/Kernel.SpecialForms.html#import/2)
gh-pagesコマンドで瞬殺deploy

先日、久々にgithub pagesにコンテンツをuploadしようとして知ったマメ知識.

```sh
npm install -g gh-pages
```

成果物が入ったディレクトリ(例: `dist`)を引数にして叩くだけ。瞬殺！

```sh:distは成果物が入ったディレクトリ
gh-pages -d dist
```

初回のbranch用意や、checkoutしてcommitして、の手間が不要になる。
メモ：Docker ホスト用軽量 OS の比較

| | [Barge OS](https://github.com/bargees/barge-os) | [RancherOS](https://github.com/rancher/os) | [Boot2Docker](https://github.com/boot2docker/boot2docker) |
| --- | --- | --- | --- |
| **Release** | 2022/06/07 | 2021/02/05 | 2020/06/30 |
| **Version** | 2.15.0 | 1.5.8 | 19.03.12 |
| **Size** | 15 MB | 141 MB | 56 MB |
| **Kernel** | 4.14.282 | 4.14.138 | 4.19.130 |
| **User Land** | Buildroot(glibc) + BusyBox v1.35.0 | Buildroot(glibc) + BusyBox v1.27.2 | Tiny Core Linux v10.1(glibc) + BusyBox v1.29.3 |
| **Docker** | 1.10.3 [^9] | 19.03.15  [^9] | 19.03.12 |
| **Storage Driver** | overlay / overlay2 [^13] | overlay2 [^2] | overlay2 [^2] |
| **TLS** | [^8] | ✓ | ✓ |
| **Vagrant box** | ✓ | ✓(0.4.3) [^10] | [^3] |
| **VirtualBox SF** | 6.1.34 | - | 5.2.34 [^4] |
| **NFS Mount** | ✓ | [^5] | [^3] |
| **xhyve** | ✓ | ✓ | ✓ |
| **Boot Time** [^7] | 5s | 20s | 17s |

[^2]: 上記以外のストレージもサポートしている。
[^3]: Vagrant 用には NFS をサポートしたサードパーティ製が数多く存在する。
[^4]: VMware, Parallels, HyperV, XenServer Tools も標準装備。
[^5]: rsync をサポート。ただし、User Docker の Volume として使用する場合は、sync 先に要注意。
[^7]: MacBook Pro (13-inch, 2020), 2.3 GHz Quad-Core Intel Core i7, macOS Monterey 12.3.1 にて。
[^8]: https://github.com/bargees/barge-packer/tree/master/contrib/vagrant/secure
[^9]: Docker のバージョンの切り替えが可能。
[^10]: Vagrant Box のサポートは終了してしまった。https://github.com/rancher/os-vagrant
[^13]: overlay2 は、Docker v1.12 以降で利用可能。


https://gist.github.com/ailispaw/da3ea53c1f42569770e0
Taberareloo Patch: Fix Tumblr.iframe 2015.12-2016.01

またまた Tumblr のページの仕様が変わったみたいなのでパッチを更新しました。

https://gist.github.com/ailispaw/a1934684cdee9a10506a

iframe タグの name 属性が `desktop-loggedin-controls` から `desktop-logged-in-controls` に変わってる。。。
AWS でSTSで権限取得してファイルアップロード

Stsを使用して権限を作成しバケットの生成からファイルアップロードまでしてみた。
以下サンプルソース
※ちなみに、だだがきしてます。そのうち綺麗に書いて使う予定。

```php
$config = array(
    'key'=>XXXXXXXX
,   'secret'=>XXXXXXX
);

$stsClient		= StsClient::factory($config);
$policy	= '
	{
	  "Id": "XXXXXXXXXXXXXXXX",
	  "Version": "2012-10-17",
	  "Statement": [
	    {
	      "Sid": "XXXXXXXXXXXXXXX",
	      "Action": [
	        "s3:CreateBucket",
		    "s3:ListBucket"
	      ],
	      "Effect": "Allow",
	      "Resource": "arn:aws:s3:::*"
	    }
	  ]
	}'
;
// JSON整形しとく。
$json			= json_encode(json_decode($policy));
$result 		= $stsClient->getFederationToken(array(
			'Name'				=> 'Statement'
		,	'DurationSeconds'	=> 3600
		,	'Policy'			=> $json
		)	
	);
$credentials = $result->get('Credentials');
$config			= array(
	'key'		=> $credentials['AccessKeyId']
,	'secret'	=> $credentials['SecretAccessKey'] 
,	'token'		=> $credentials['SessionToken'] 
);
		
// トランコーダーのクライアントを作成する。
$bucket			= 'bucketname';
$s3Client		= S3Client::factory($config);
// 本当は$s3Client->headBucketして確認したいけどエラーが取れないのであきらめ
$s3Client->createBucket(array('Bucket' => $bucket));
$s3Client->waitUntil('BucketExists', array('Bucket' => $bucket));

$policy	= '
	{
	  "Id": "XXXXXXXXXXXXXXXX",
	  "Version": "2012-10-17",
	  "Statement": [
	    {
	      "Sid": "XXXXXXXXXXXXXXXX",
	      "Action": [
	        "s3:GetObject"
	      , "s3:PutObject"
	      , "s3:DeleteObject"
		  ],
	      "Effect": "Allow",
	      "Resource": "arn:aws:s3:::'.$bucket.'/*"
	    }
	  ]
	}';
// もう少し権限減らしたものを作成し、オブジェクトを上げる権限を与える
$json			= json_encode(json_decode($policy));
$result 		= $stsClient->getFederationToken(array(
				'Name'				=> 'Statement'
			,	'DurationSeconds'	=> 3600
			,	'Policy'			=> $json
		)
	);
$credentials = $result->get('Credentials');
$config			= array(
	'key'		=> $credentials['AccessKeyId']
,	'secret'	=> $credentials['SecretAccessKey'] 
,	'token'		=> $credentials['SessionToken'] 
);
$s3Client		= S3Client::factory($config);

$inFile	= 'アップロードするファイル';
$key	= basename($inFile);
if($s3Client->doesObjectExist($bucket,$key)) {						// 存在した場合は削除
	$s3Client->deleteObject(array("Bucket"	=> $bucket,"Key"	=> $key));
}
$finfo	= finfo_open(FILEINFO_MIME_TYPE);
$mime	= finfo_file($finfo,$inFile);
$rParams			= array(
		'Bucket'		=> $bucket
	,	'Key'			=> $key
	,	'ACL'			=> CannedAcl::PRIVATE_ACCESS
	,	'ContentType'	=> $mime
	,	'Body'			=> EntityBody::factory(fopen($inFile, 'r'))
);
$result = $s3Client->putObject($rParams);

```
RegexでvbCrLfを取り除く

http://qiita.com/keita1987/items/7fad5baec334d4889a4f
の別解。

    Dim s As String = "hoge,piyo,foo,bar" + vbCrLf
    s = System.Text.RegularExpressions.Regex.Replace(s, "\r\n", "")
RailsでUserAgentに応じてlayoutを切り替える

UserAgentに応じてlayoutをかえる方法の備忘です。

UserAgentの判定は[rack-user_agent](https://github.com/k0kubun/rack-user_agent)というGemを使います。
UserAgentをパースしてrequestの中にosや端末の種類などをいれてくれる便利なGemです。

## レイアウト切り替え

ポイントはlayout関数の引数を関数にしている点です。
関数にすることで動的に切り替えが可能です。

## ソース

```rb
class ApplicationController < ActionController::Base
  layout :select_layout
  #スマートフォンのときは縮小版レイアウトを表示
  def select_layout
    if request.from_pc? || request.from_android_tablet? || request.from_ipad?
      "sp_layout"
    else
      "application"
    end
  end
```
VB.NETでvbCrLfを取り除く

VB.NETでvbCrLf（改行）を取り除くためのメモ

```
Dim s As String = "hoge,piyo,foo,bar" + vbCrLf
' s = s.Replace(vbCrLf, "") これだと取り除けない
s = s.Replace(Chr(13), "").Replace(Chr(10), "")
```
UITextFieldのsecureTextEntryを切り替えた時の挙動


UITextFieldのsecureTextEntryのプロパティをtrueにすることでパスワード入力に切り替えることができます。
![スクリーンショット 2016-01-29 12.37.03.png](https://qiita-image-store.s3.amazonaws.com/0/19043/7989130e-07a3-cf8b-3aae-9b17d7afdd8c.png "スクリーンショット 2016-01-29 12.37.03.png")

これをボタンなどでfalseからtrueに切り替え、パスワードが表示されている状態から非表示の状態に切り替えた時の挙動をメモ。

この表示を切り替えた後、入力しようとしたら前に入力されていたものが全てクリアされてしまいました。
これは仕様なのでしょうか。
もし回避しようとしたら、プロパティか何かに入力された文字列を保持しといて、必要な場合に反映させるとかやる必要があるのかな。
VisualStudio2015でEmacsキーバインドを使う

[以前の記事](http://qiita.com/scnsh/items/c2ecdefa376358d4da3e)の続きみたいなものですが、
VisualStudio2015でも環境を構築したので、備忘録的にまとめます。

# Emacsキーバインドの適用

前回同様に、Emacs拡張機能をインストールします。

今回は以下の投稿を参考に導入しています。
[Using Emacs bindings in Visual Studio Community 2015](http://stackoverflow.com/questions/32618036/using-emacs-bindings-in-visual-studio-community-2015)

* VS2010の拡張機能を次のリンク([Emacs Emulation Extension Now Available!)](http://blogs.msdn.com/b/visualstudio/archive/2010/09/01/emacs-emulation-extension-now-available.aspx)からダウンロードします。
* ”EmacsEmulations.vsix" というファイルの拡張子を ".zip"にリネームして、適当な解凍プログラムで解凍します。
* ".vsixmanifest"という拡張子のXMLファイルをエディタで開いて、\<VisualStudio Version="10.0">と書かれた場所を書き換えます。書き換えると以下のようになります。

> \<SupportedProducts>
> 　　\<VisualStudio Version="14.0">
> 　　\<Edition>Pro\</Edition>
> 　　\</VisualStudio>
> \</SupportedProducts>

　\<Edition>の中身はProのままでも大丈夫でした。(Communityでも）

* 次に解凍したファイル達を再度zipで固めて、"EmacsEmulations.vsix"を作ります。
* そして管理者権限でそのファイルを実行します。実行すると、インストールしますかといったダイアログが出るので最後まで進めていきます。

以上で、インストールは完了です。

インストールできたかは、VS2015を起動して、ツール→オプション→キーボードと辿り、
"次の追加キーボードマップスキームを適用” の下のリスト内に ”Emacs” があれば認識されています。
同様に、ツール→拡張機能と更新プログラムと辿り、
インストール済みのすべての中から ”Emacs emulation” を見つけることでも確認できます。

ちなみに、これでインストール出来ない場合は、解凍した中にあったEmacs.vskというファイルを
> C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE

に置いておくと良いと書いてありました。（自分は必要なかったです。）

# Emacsキーバインド割当の変更

以下のコマンドが使えない状態でしたので割当を変更しました。
<dl>
  <dt>Ctrl + H(テキストエディター)</dt>
  <dd>編集.後退削除</dd>
  <dt>Ctrl + M(テキストエディター)</dt>
  <dd>編集.Emacsの改行</dd>
</dl>

元々割り当てられていた以下のコマンドはそれぞれ別の割当に変更しました。
Ctrl+H　→　Ctrl+Alt+H
Ctrl+M　→　Ctrl+Alt+M

# VisualStudio同士でテキストのコピペができない問題

コレ前も書いた内容ですね、VS2015になっても以下のやり方しか見つからないです。
他に良いやり方知ってる人がいれば教えてほしいですね。

<dl>
  <dt>Ctrl+Y(テキスト エディター)</dt>
  <dd>編集.クリップボードリングの切り替え</dd>
</dl>
[Swift] UIViewでアニメーション中の現在位置を取得する

普通にcenterを取ると、アニメーション後の位置になるのでレイヤーから取得する。

```
extension UIView {
  func currentCenter() -> CGPoint{
    if let presentationLayer = layer.presentationLayer() {
      let pf = presentationLayer.frame
      return CGPoint(x: pf.origin.x + pf.size.width/2, y: pf.origin.y + pf.size.height/2)
    }else{
      return center
    }
  }
}
```
会社の問い合わせフォームから同一ドメイン（GoogleAppsで管理）にメールが届かなかった問題

**会社のサイトの問い合わせフォームから**、**会社のメールアドレス(Google Appsで管理)**に問い合わせ内容メールを送りたかったのですが、届かなくて困ったので記載しておきます。
#環境
今回の環境は
・**VPS**
・**メールはGoogleAppsを利用**
・WordPressを設置
・問い合わせフォームとしてContact Form 7を利用
です。
#起こった問題と状況
問い合わせフォームからのメールを**会社のメールアドレスで受信できませんでした**。
ですが、**Gmailなど、別のアドレスでは受信できました。**（⇦ここ重要です）
#原因
ローカル配送されていた（**メールの送信元と送信先が同一**だったので、メールの送受信のやり取りが**サーバー内部で完結**してしまっていた）ことが原因だったようです。
今回のパターンでは、メールアドレスはGoogleAppsで管理していたので、本来であればメールのやり取りは一度外に出す必要があります。
##原因（図解）
文章だけだと分かりづらいので、こんな感じです。
![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/58437/e8553ed7-f428-99a4-45aa-8640ee30400c.png)

#解決策
Postfixというメールサーバーの設定で、同一ドメインだとしても**ローカル配送をさせないように設定する**ことが必要です。
###設定方法
>/etc/postfix/main.cf

この設定ファイルに書いてある
**mydestination**が宛先（＝サーバー自身が担当していると認識しているアドレス）なので、ここを書き換えましょう。
今回は$myhostname に 会社のドメインが設定してありましたので、

```
mydestination = $myhostname, localhost.$mydomain, localhost
```

これを下記のように書き換えました。

```
mydestination = localhost.$mydomain, localhost
```
#最後に
同じ現象かどうかを確認するポイントとしては
**問い合わせメールの送信先をGmailなど、他のアドレスにしてみて、届くかどうかで判断すると良いです。**
もしも、その他のアドレスにも送れなかった場合はメールの送信自体が出来ていない可能性があります。
Gmailには送れるが、同一ドメインに送れない場合は同じケースである可能性が高いです。

###参考にしたサイト
http://www.communitycom.jp/2012/08/21/google-apps-contact-form-7-smtp/
http://www.ksknet.net/postfix/postfix_2.html
シェル芸 Project Euler - Problem 6


## はじめに

@gin_135 さんの「[Project Eulerをシェル芸で解いてみる](http://qiita.com/gin_135/items/c0fde5686f33d947aa6c)」シリーズが大変面白いです.
大抵は @gin_135 さんの Qiita 投稿, @eban さんの別解 on ブログ, @MasWag さんの別解 on Twitter を楽しく読ませていただき, 読んだだけで分からないものは, 手元で再現などして楽しんでいますが, 方針として大きく異なる別解を思いついたものについて, 自分のエントリを立てようと思います.

「Project Euler」の解説, 問題文の引用などは省略します.

本エントリは Problem 6 ([問題原文](https://projecteuler.net/problem=6), [問題文日本語訳](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%206)) の解答です.

環境は

```sh:
$ /bin/sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.
```

です.

## 方針

本題は, 
『数列に対して「和算」を「畳み込ん」で「二乗」したもの』から,『数列に対して「二乗」を「写像」したものを「和算」で「畳み込ん」だもの』を引けば良いです.

写像スクリプトと左畳み込みスクリプトを用意して解答します.

写像って何? という方は「[写像 in シェル](http://qiita.com/kohyama/items/f6dc633ce79789e6d5b8)」をご覧ください.

畳み込みって何? という方は「[左畳み込み in シェル](http://qiita.com/kohyama/items/2796960ebbd842227821)」をご覧ください

九つのプログラミング言語で, 同じ方針でこの問題を解く例が「[Ntmux を用いたマルチリンガル開発](http://qiita.com/kohyama/items/d2399fd1d58cd8aec72a)」にあります.

## 写像

```sh:map
#!/bin/sh

f=$1
while read line
do
  set "$line"
  echo `eval $f`
done
```

を `map` として保存し, PATH に含まれるディレクトリに保存 (または保存したディレクトリを PATH に追加), 実行パーミションを与えてあるとします.

解説は「[写像 in シェル](http://qiita.com/kohyama/items/f6dc633ce79789e6d5b8)」にあります.

解説にあるように, 写像は, スクリプトを用意しなくても `xargs` でも実現できます.

## 左畳み込み

```sh:reduce
#!/bin/sh

f=$1
i=$2
if [ "X$i" = "X" ]
then
  read i
fi
while read line
do
  set "$i" "$line"
  i=`eval $f`
done
echo $i
```

を `reduce` として保存し, PATH に含まれるディレクトリに保存 (または保存したディレクトリを PATH に追加), 実行パーミションを与えてあるとします.

解説は「[左畳み込み in シェル](http://qiita.com/kohyama/items/2796960ebbd842227821)」にあります.

## 例題解答

1 から 10 までの自然数について, 二乗の和は 385 です.

```sh:
$ seq 10 | map 'expr $1 \* $1' | reduce 'expr $1 + $2'
385
```

`map` の代わりに `xargs` を用いて

```sh:
$ seq 10 | xargs -n 1 sh -c 'expr $0 \* $0' | reduce 'expr $1 + $2'
385
```

としても構いません.

1 から 10 までの自然数について, 和の二乗は 3025 です.

```sh:
$ seq 10 | reduce 'expr $1 + $2' | xargs -I{} expr {} \* {}
3025
```

後者から前者を引くと 2640 です.

```sh:
$ expr `seq 10 | reduce 'expr $1 + $2' | xargs -I{} expr {} \* {}` \
>    - `seq 10 | map 'expr $1 \* $1' | reduce 'expr $1 + $2'`
2640
```

(`>` は継続行入力のプロンプトです)

`map` の代わりに `xargs` を用いる場合は

```sh:
$ expr `seq 10 | reduce 'expr $1 + $2' | xargs -I{} expr {} \* {}` \
>    - `seq 10 | xargs -n 1 sh -c 'expr $0 \* $0' | reduce 'expr $1 + $2'`
2640
```

のようになります.

## 本題解答

本題, 1 から 100 までの自然数について, 和の二乗から二乗の和を引いたものは

```sh:
$ expr `seq 100 | reduce 'expr $1 + $2' | xargs -I{} expr {} \* {}` \
>    - `seq 100 | map 'expr $1 \* $1' | reduce 'expr $1 + $2'`
```

で求められます.

`map` の代わりに `xargs` を用いる場合は

```sh:
$ expr `seq 100 | reduce 'expr $1 + $2' | xargs -I{} expr {} \* {}` \
>    - `seq 100 | xargs -n 1 sh -c 'expr $0 \* $0' | reduce 'expr $1 + $2'`
```

とします.

## 参考

@gin_135 さんの解答「[Project Eulerをシェル芸で解いてみる(Problem 6)](http://qiita.com/gin_135/items/019c2bac36a744601a0e)」およびコメント欄
@eban さんの解答「[Project Euler Problem 6 #シェル芸 - jarp](http://jarp.does.notwork.org/diary/201601a.html#201601091)」
[Laravel]Laravelで別々のDB（MySQL）に接続させる方法

# Laravelで別々のDB（MySQL）に接続させる方法
## 経緯
**MySQL**で部分的に外部DBに接続する必要に迫られたので調査して実践。

## config/database.php
- 外部DBの接続情報を追加します
- デフォルトで接続するDBを見直します。（デフォルト接続先の名前を変更する場合）

### まずはデフォルトの状態（MySQL部分のみ抜粋）

```PHP
'default' => 'mysql',
	
'connections' => [
    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ]
],
```

### 修正後（MySQL部分のみ抜粋）

```PHP
'default' => 'mysql_one',
	
'connections' => [
	'mysql_one' => [
		'driver'    => 'mysql',
		'host'      => env('DB_HOST_ONE', 'localhost'),
		'database'  => env('DB_DATABASE_ONE', 'forge'),
		'username'  => env('DB_USERNAME_ONE', 'forge'),
		'password'  => env('DB_PASSWORD_ONE', ''),
		'charset'   => 'utf8',
		'collation' => 'utf8_unicode_ci',
		'prefix'    => '',
		'strict'    => false,
	],
	'mysql_two' => [
		'driver'    => 'mysql',
		'host'      => env('DB_HOST_TWO', 'localhost'),
		'database'  => env('DB_DATABASE_TWO', 'forge'),
		'username'  => env('DB_USERNAME_TWO', 'forge'),
		'password'  => env('DB_PASSWORD_TWO', ''),
		'charset'   => 'utf8',
		'collation' => 'utf8_unicode_ci',
		'prefix'    => '',
		'strict'    => false,
   ],
],
```

- mysql_twoを新たに接続先として追加しました
- 識別しやすいようにデフォルトの名前を変更しました
- env()で取得している値は「.env」ファイルに設定しています
- デフォルトの接続先は「mysql_one」で設定しています
	- これにより接続先を明示しない限り「mysql_one」で繋がります

これにて設定は完了です。

## コード上での接続切り替え
上記設定で接続先を増やすことができました。  
次は実際の切り替え方法を記載しています。  
今回は以下2つのDB操作について記載します。

### クエリビルダーでの切り替え
SELECTする場合を例にします。

#### mysql_one（デフォルトDB）

```sql
DB::select('select * from users');
```

mysql_oneはデフォルト接続先に指定しているので、  
何も明示せずとも接続が可能となっています。  
勿論明示しての接続もできます。

```sql
DB::connection('mysql_one')->select('select * from users');
```

#### mysql_two(外部DB)

```sql
DB::connection('mysql_two')->select('select * from members');
```

mysql_twoについては接続先を明示する必要があります。  
上記で接続可能となっています。

### Eloquentでの切り替え

#### mysql_one（デフォルトDB）
とくに必要ありません。

#### mysql_two(外部DB)

```PHP
class Members extends Model
{
	protected $connection = 'mysql_two';
}
```

プロパティ「$connection」を設定することで切り替えが可能です。

## 接続テスト
- 外部接続可能なMySQLを作る
	- [２，３分で、MySQLをインストールしてから、外部の端末から接続できるようにする](http://divide-et-impera.org/archives/271)
- config/database.php を編集する
- Laravel側から接続切り替えできていることを確認する
ubuntu-essential: 最小構成の Ubuntu Docker Image


Docker Image でサイズの小さい Ubuntu と言えば公式の

https://hub.docker.com/_/ubuntu-debootstrap/ (87MB)

ですが、残念ながら DEPRECATED になってしまっています。
さて、どうしたものか、自分で Build しようかと調べていたら、公式では無いもののさらに小さいイメージを発見しました。

https://hub.docker.com/r/textlab/ubuntu-essential/ (61MB)

比較しますと、

```
+--------------+----------------------------------+----------+---------------------+
|      ID      |            NAME:TAGS             | SIZE(MB) |     CREATED AT      |
+--------------+----------------------------------+----------+---------------------+
| 6cc0fc2a5ee3 | ubuntu:14.04.3                   |  187.900 | 2016-01-20 08:31:24 |
| 8e0aa5f79abe | ubuntu-debootstrap:14.04.3       |   87.066 | 2015-10-14 12:34:58 |
| ceec11e38a60 | textlab/ubuntu-essential:latest  |   60.831 | 2014-12-09 05:15:37 |
+--------------+----------------------------------+----------+---------------------+
```

ちょっと残念なのは作成されたのがかなり古いということ。

https://github.com/textlab/glossa/blob/master/script/build_ubuntu_essential.sh
こちらのスクリプトで作られているようなので、最新の ubuntu:14.04 をベースに自分で Build してみました。

```
+--------------+----------------------------------+----------+---------------------+
|      ID      |            NAME:TAGS             | SIZE(MB) |     CREATED AT      |
+--------------+----------------------------------+----------+---------------------+
| e8e309a7dd00 | ailispaw/ubuntu-essential:latest |   61.219 | 2016-01-27 19:41:27 |
| 6cc0fc2a5ee3 | ubuntu:14.04.3                   |  187.900 | 2016-01-20 08:31:24 |
| 8e0aa5f79abe | ubuntu-debootstrap:14.04.3       |   87.066 | 2015-10-14 12:34:58 |
| ceec11e38a60 | textlab/ubuntu-essential:latest  |   60.831 | 2014-12-09 05:15:37 |
+--------------+----------------------------------+----------+---------------------+
```

これで最新の状態で最小構成の Ubuntu Image が出来ました〜
ダウンロードも速いし、必要なパッケージのみ追加すればいいので、これをベースにすれば小さいイメージになります。

https://hub.docker.com/r/ailispaw/ubuntu-essential/
https://github.com/ailispaw/ubuntu-essential
[セキュリティ] 弥生会計アップデートがブロックされる

UTM,Firewall,セキュリティソフトが間違って弥生会計アップデートをブロックするのでURLフィルタリングで除外する

※2016-01-29時点
弥生会計アップデート関係URL
acu-act.yayoi-kk.co.jp
acu-cdn.yayoi-kk.co.jp
acu-upd.yayoi-kk.co.jp
info.yayoi-kk.co.jp
それぞれポート80と443
Macをスマホ用に提供している携帯会社の公式wifiにつなぐには？

最近、自分は上級ノマドに憧れ下級ノマドになること恐れながら上見て頑張ってるんだと気づいたモバイルワーカーです。

iPhone3が出た時は早々乗り換え、その動きのチグハグ感に愛着を覚えながらマイノリティーやアーリーアダプターな生き方を演じ、その暮らしに苛立ちを感じて今じゃすっかりレイトマジョリティーになってます。そっちの方が安定した品質のものを提供してもらえサービスのクオリティーも一巡して良くなってるので気持ちよさを感じている今日このごろです。

#公共wifiなんかヤダ#
いまどきの飲食店ならどこもキャリアの競争のおかげでwifiアンテナがありますし、FreeSpotのようなwifiスポットもあります。セブンイレブンもローソンも、街角の自販機にも今じゃwifiスポットを提供していて無料で使えます。

でも悪い意図をもって"FreeSpot"を名乗ってwifiアンテナ立てることだってできます。名前つけるのは自由ですから。なので油断するとデータを盗まれたりすることもあり得ます。心配ですね。

そこをちゃんと考えてフリーwifiは提供してくれてはいますが、そのためにブラウザー立ち上げて個人情報を求めてくる場合がありますね。「本当に大丈夫なの」と心配になります。

それに、調子よくアクセスしていたのに突然ページが開かないとかありません？
セブンとかローソンとかひしめき合ってる街なかだと、何かの具合で違うwifiとつながりを変えてしまって、、、ちょっとイラッとしますね。

#Macをキャリアのwifiに繋ぎたい！#
2016年<del>2月</del>１月末でauが"au Wi-fi"のサービスをやめるというアナウンスがありました。これはauの公式wifiですからなんか安心だった（気のせいかもしれないけど…）。キャリアって通信傍受されてましたってなると大問題になるから「なんか対策してるだろう」と安心していたのですが（勘違いかもしれないけど…）。

そんながっかり感がいなめない2015年の年の瀬に神戸の素敵な某スタバでMacBookProを開き、「あ、iPhoneの電池が切れかけ」と気付き、でもMacもコンセントに繋ぎたかったので、電源はMacを優先し、USBにケーブルでiPhoneをつなぎそれで仕事を始めました。

メールをチェックしgit-hubにつなぎプルしたりプッシュしたりしていたのですが、改めて画面を確認したらWi-Fiを切りっぱなしにしているのに気がついたんです。

**「あれ？え！繋がってる。どういうこと！？」**

さっきまで有線LANで仕事していたので、LANケーブルにつないでいるときはいつもそうしているのです。

それで改めて画面をチェックすると、たしかにWi-Fiは無線LANをOFFにしてしかもBluetoothまでその時は切っていました。
で、iPhoneの画面を確認すると「4G」ではなく、Wi-Fiにつながっているのです。

私の場合は、セブン-イレブンが提供する7spotやローソンが提供するwi-fiなどはもう使わない設定にして"au Wi-fi2"だけに繋がるようにしていたので、これでMacがiPhone経由でau公式wifiしかもスマホ用のよりセキュリティーが高いと信頼できそうなwifiにつながってくれたんですね。

**「あ、なんだか安心(^-^)n」**

#それで結論#
MacbookならiPhoneにケーブル接続すれば携帯会社の公式wifiに直接繋げられますっ！

もちろん、iPhone側がどのwifiアンテナと繋がるかは個人の責任でちゃんと意識して設定しないといけません。
でもその自己責任をクリアすれば繋がります。
電波が弱いところなら当然4Gにつなぎに行きます。（仕事で使う私としては、切断されないほうが大事）

これならMacbookとiPhoneの無線通信で消費するパケット上限の心配から開放されます。
ケーブルが邪魔ってのもありますが、（電波状態では4Gに切り替わっちゃうが）「安心して仕事できる」には変えられません。
なので一応auなので「切り替えてね」アナウンスには緊急避難用に応えますが、仕事用はこれで行きたいと思います。

#追記：テザリング無料が終了して…
ほかのモバイルWifiルーター用意するより500円/月で済むので、電車移動しながらでパソコンパチパチするひとはいいと思います。モバイルワークには欠かせないですからね。