OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3のFolderおよびFileユーティリティを使う

CakePHP3にはFolderとFileというユーティリティがあり、ファイルやフォルダの操作がわりと簡単にできます。
ファイルの一覧を取得したり、ファイルがなかったら作成してコンテンツを書き出したり、コピーや削除といったことをするのに、あまり色々(エラー処理とか)考えなくてできるので便利だと思います。

参考：[Cakebook 3.x Folder & File](http://book.cakephp.org/3.0/en/core-libraries/file-folder.html)

# 指定したフォルダのファイルを検索する

```php
$dir = new Folder('/path/to/folder');
$files = $dir->find();
```

`find()`は引数に何も指定しない場合は、指定したフォルダのすべてのファイルが対象になります。
引数を指定する場合は、`find('.*\.txt')`のように正規表現でファイル名を指定します。(`^`と`$`が前後に自動的に付与されるので、引数では`^`と`$`は書きません。)
結果は`['file1.txt', 'file2.jpg', ...]`のようなファイル名の配列になります。

# フォルダのパスを取得する

```php
$dir = new Folder('/path/to/../folder');
$path = $dir->realpath();
```

「..」が入っているパスを指定していても、`realpath()`で綺麗なパス(というのか何と言えばいいのか)が取得できます。
最後にスラッシュが付いた形のものが返ってきます。

# フォルダの作成、コピー、移動

```php
$dir = new Folder('/path/to/folder', true);
```

第2引数に`true`を指定すると、フォルダがない場合は作成されます。第3引数で`0755`等のモードも指定できます。

```php
$dir = new Folder('/path/to/from');
$dir->copy('/path/to/destination');
// または
$dir->copy([
    'from' => '/path/to/from',
    'to' => '/path/to/destination'
]);
```
stringでコピー先のパスを指定するか、配列でtoとfromを指定してコピーができます。
`move()`も同様に指定して移動ができます。

# ファイルの作成

```php
$file = new File('/path/to/file.txt', true);
```
Folderと同様に第2引数に`true`を指定すると、ファイルがない場合は作成されます。

# ファイルの名前と拡張子

```php
$file = new File('/path/to/filename.txt');
$name = $file->name();
$ext = $file->ext();
```

上記の例だと、`$name`には`filename`が、`$ext`には`txt`が入ります。

# ファイルの存在確認

```php
$file = new File('/path/to/file.txt');
if ($file->exists()) {
    // ファイルがある時の処理
}
```

# ファイルの読み書き

```php
$file = new File('/path/to/file.txt');
$content = $file->read();
$file->write($content);
```

`read()`と`write()`で読み書きができます。
Thymeleaf 環境ごとにjsやcssのリンク先URLを切り替える

# 前提
- Spring Boot 1.3
	+ Parent POMとしてspring-boot-starter-parentを使用
- Thymeleaf 2.1.4

# やりたいこと

## ローカル環境と開発・本番環境で、js/cssを見に行くパスを変えたい
環境ごとに、以下のように参照するコンテンツを切り替えたい。

- ローカル環境 : jarにincludeされたコンテンツ
    - `classpath:static`配下のコンテンツ
- 開発・本番環境 : `http://example.com/hoge`以下のコンテンツ


# 経緯
- 事情により、本番環境では特定ドメイン(`http://example.com`)の指定されたディレクトリ配下(`/hoge/*`)にjs/cssを配置する必要がある
	+ この特定ドメインは、アプリケーションのドメインとは異なるので、jar内のjs/cssを参照させることができない
- そのため、ローカルでアプリケーションを起動して確認するために、開発環境のサーバにjs/cssをいちいち置く必要がある
	+ その際、他のメンバーが同じファイルをいじってると、「あれ、動かない？デグレ？」となって混乱する
	+ ローカルで開発してるのにDEVで何かやらなきゃいけないとか面倒すぎる
- 一応ローカル環境で`http://example.com`のためにProxy設定を施せば、jar内のjs/cssを参照するようにできるが、開発メンバー全員にいちいちそんなことさせるの面倒


-> __ローカルで動かしたときと開発・本番環境で動かしたときで、js/cssのパスが変わればいいのに！！__


# アプローチ

## property + environment.getProperty('property.code')

まずは、application.propertiesに下記を追加。


```properties:application.properties
testapp.static-file.path=http://localhost:8080/testapp
```

```properties:application-dev.properties
testapp.static-file.path=http://example.com/hoge
```

(application.propertiesに記述するのは、profile依存のファイルで手っ取り早かったから)

次に、対象のcssを読み込むために、linkタグを以下のように記述
(`th:href`については[公式ドキュメント](http://www.thymeleaf.org/doc/articles/standardurlsyntax.html)で詳解されている)

```html:solved.html
<link rel="stylesheet" type="text/css"
          th:href="@{${@environment.getProperty('testapp.static-file.path')}/css/style.css}"/>
```

こうすることによって、以下のようにhrefの値が設定される。

- ローカル環境(profile指定なし) : `http://localhost:8080/testapp/css/style.css`
- 開発環境(spring.profile.active = dev) : `http://example.com/hoge/css/style.css`

### @environment.getProperty()
読み込んだpropertyの値を取得することができる。
↓のリンクにも記載があるけど、システム環境変数を取得することもできる模様。
c.f. [ThymeleafでSpringの環境変数を使う | Tagbangers Blog](https://blog.tagbangers.co.jp/ja/2015/01/18/thymeleaf-environment-properties)

## Utility Objectを使って、もっと使いやすく

- 別件で、もう一つpropertyの値をURLに付記したくなった
- そうすると、`th:href`の記述が超長くなる&全てのjs/cssに書かなくちゃいけなくて冗長

という理由でmacro(helper)を作りたくなったので、
最終的に、Utility Objectを使って以下のようになった。

```html:solved2.html
<link rel="stylesheet" type="text/css" th:href="@{${#pathBuilder.build('/css/style.css')}}"/>
```
(Utility Objectの作り方については[Thymeleaf Springのpropertyを利用したUtility Objectを作る](http://qiita.com/IsaoTakahashi/items/cb2a14051bdb14dcdec0)を参照のこと)
memcachedインストール（Windows&Ubuntu）

# Windows
1.memcachedをダウンロード
https://commaster.net/content/installing-memcached-windows

　→http://downloads.northscale.com/memcached-win64-1.4.4-14.zip


2.memcachedをインストール
コマンドプロンプトから

cd [memcached.exeの配置パス]
memcached.exe -d install

3.memcachedを起動
memcached.exe -d start

4.接続確認
telnet 127.0.0.1 11211

stats
 →　いろいろ表示される・・

# Ubuntu
1.memcachedをapt-getでインストール
sudo apt-get install memcached

2.起動確認
service --status-all | grep memcached

 [ + ]  memcached

3.接続確認
telnet 127.0.0.1 11211

stats
STAT pid 8072
STAT uptime 45
STAT time 1457424426
STAT version 1.4.14 (Ubuntu)
STAT libevent 2.0.21-stable
STAT pointer_size 32
STAT rusage_user 0.000000
STAT rusage_system 0.000000
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 262144
STAT hash_is_expanding 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END
【MT】MovableTypeのサーバー移行時のトラブルと対処法

MovableTypeを新しいサーバーへ移行したときのトラブルと対処法です。
下記の手順でサーバー移行しています。

+ [【MT】MovableTypeのサーバー移行手順](http://qiita.com/4cres/items/b59f1868c59e7ed8b8a5)

他に対処法があれば、教えてください。

#**エラーが表示される その1**

###現象

+ 管理画面にアクセスすると「`Can't load error template; got error 'テンプレート「error.tmpl」のロードに失敗しました`」のようなエラーが表示される。

###対処法
+ MT関連のファイルのアップロード漏れの可能性が大なので、再度アップロードし直す。移行前のサーバーから全てのファイルをダウンロードしているかも要確認。

+ 上記で解決しないときは、移行先のサーバーへ最新版のMTをアップロードし、アップグレードする。

#**エラーが表示される その2**

###現象

+ 「変更を保存」を選択すると「`エラーが発生しました。不正な要求です。`」と表示される。

###対処法

+ 書き換えたmysqlのデータに不備があったため、正しく書き換えし直したmysqlデータを利用する。

#**投稿した画像などが表示されない**

###現象

+ 一部の画像やPDFファイルなどが表示されない。

###対処法

+ <del>表示されない画像やPDFファイルの名前に日本語が使用されているか確認し、日本語を使用していたときは、泣きながら一つ一つMT上から投稿し直す。</del>

泣きながら投稿し直してましたが、文字コードを適切に指定すればアップロードできました。
FFFTPを使った場合ですが、下記のように文字コードを指定して、アップロードできます。

![ffftp.jpg](https://qiita-image-store.s3.amazonaws.com/0/42231/917716ad-5382-7d4b-cbc7-b2a8cac3c545.jpeg)

###補足

+ FTPソフトを使用しているとサーバー上にある日本語のファイル名が表示されなかったり、文字化けして表示されるときがあります。そのときはFTPソフトのエンコーディングの設定をUTF-8やshift-JISなどに変更すると表示されます。
+ [Movable Type 6.2](http://www.movabletype.jp/documentation/mt6/release/62.html)から日本語ファイル名を自動変換する機能が追加されましたが、それ以前では日本語ファイル名を変換してくれません。
SSHポートフォワード設定

#概要
DMZにあるWEBサーバー（サーバーA)にTrustからブラウザアクセスしたい（あまり需要無いですかね？）
サーバーAからSSHサーバー（サーバーB）のみに対して22番と80番ポートを空けてもらっている状態。

WindowsPCからサーバーBへSSHアクセスしてサーバーAのWEBコンテンツを確認する。

##やり方
minttyの場合
$ ssh -L 適当なポート:サーバーA:80 サーバーB
```
$ ssh -L 10080:server-a:80 server-b
```

あとはWindowsPCのWEBブラウザからlocalhost:10080とやればアクセス確認できる。

[Teratermだともうひと手間必要な感じ（Qiita外リンク）](http://www.puniokid.com/tips/linux/95/)
expressを最小構成で試す

node.jsだとバックエンドにexpressを利用することが多いと思いますが、プロトタイプ作成など、さっとつくるときの最小構成を試してみます。

```
$ npm i -S express
```

```js
'use strict';
const app = new (require('express'))();
const port = 3000;

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html')
});

app.listen(port, error => {
  if (error) {
    console.error(error);
  } else {
    console.info('listen: ', port);
  }
});
```

```index.html
<h1>Hello, Express</h1>
```
embulk-encoder-pgp_encryption: 出力ファイルをPGPで暗号化するEncoder Plugin


はじめに
===========

[Embulk](http://www.embulk.org/docs/) は「(IN)データ→変換→(OUT)データ」なバッチ処理を簡単に実現するbulk data loaderです。

ファイルを暗号化して欲しいと言われたので暗号化Zipを使ったら、
鍵の漏洩リスクを減らしたいので gpg のような仕組みで暗号化鍵と復号化鍵を別々にしたいと言われることがあります。 orz

いまいち PGP とか GPG とかしっかりと理解していないのですが、公開鍵のみを用いてファイルを暗号化するencoder pluginを作りました(この表現が正しいのかも少し自信がない...)。
※ ちなみに署名とかしていないからかdecryptしたときに警告が出ます。微妙だ。

Version
--------

* Embulk: 0.7.4, 0.8.6

で動作確認しています。

Code
-------

https://github.com/mokemokechicken/embulk-encoder-pgp_encryption

使い方
============

install
-----------

```
embulk gem install embulk-encoder-pgp_encryption
```

設定例
--------

encoder plugin なので、 `out` の配下に設定を書きます。

```yaml:config.yml
out:
  encoders:
    - type: pgp_encryption
      public_key_ring: ./sample/pubring.gpg
      key_name: mokemokechicken@example.com
  type: file
  path_prefix: ./path/to/output/data
  file_ext: gpg
  formatter:
    type: csv
```

* public_key_ring: GPGなどの key ringファイルのPathを指定します
* key_name: key ringの中のどの鍵を使うか指定します（省略時には最初にみつかった鍵を指定します)。この指定は完全一致ではなく、部分一致です。見つかった最初の鍵を使います。

メモ
--------
### public_key_ring の値
`gpg --list-keys` を実行したときに出てくるファイルへのPATHを指定します。 下記で言うと `/Users/k_morishita/.gnupg/pubring.gpg` になります。

```
% gpg --list-keys
/Users/k_morishita/.gnupg/pubring.gpg
-------------------------------------
pub   2048R/59E5A4C4 2016-03-08
uid                  Yamada Taro (test user) <mokemokechicken@example.com>
sub   2048R/3623FEBE 2016-03-08
```

### decrypt

出力されたファイルは 下記のコマンドで decryptできる形式になります。

```
% gpg -d sample/result000.00.csv.gpg

次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:“Yamada Taro (test user) <mokemokechicken@example.com>”
2048ビットRSA鍵, ID 59E5A4C4作成日付は2016-03-08

gpg: 2048-ビットRSA鍵, ID 59E5A4C4, 日付2016-03-08に暗号化されました
      “Yamada Taro (test user) <mokemokechicken@example.com>”
id,account,time,purchase,comment
1,32864,2015-01-27 19:23:49.000000 +0000,2015-01-27 00:00:00.000000 +0000,embulk
2,14824,2015-01-27 19:01:23.000000 +0000,2015-01-27 00:00:00.000000 +0000,embulk jruby
3,27559,2015-01-28 02:20:02.000000 +0000,2015-01-28 00:00:00.000000 +0000,"Embulk ""csv"" parser plugin"
4,11270,2015-01-29 11:54:36.000000 +0000,2015-01-29 00:00:00.000000 +0000,NULL
gpg: 警告: メッセージの完全性は保護されていません
```

`gpg: 警告: メッセージの完全性は保護されていません` と出力されるのが微妙な感じです。


さいごに
=======

GPGとか懐かしい名前を久しぶりに聞いたなぁ・・・
`git log` を抜けるとスクリーンがクリアされてしまう

#問題

* git の pager が less になっている。
* `git log` を見て、less を抜けるとスクリーンがクリアされて log が見えなくなる
* log をみながら作業がしたいので、画面はそのままにしておいてほしい

#対策A

less にオプションを追加する

```
git config --global core.pager "less -XF"
```


# 対策B

件数をしぼって表示する

```
git log -5
```

# 採用した対策

特に画面をクリアして欲しい場合がないので、pager に `less -XF` を設定した。

CentOS7 ではこれでうまくいった。
Xamarin for VisualStudioでHTTP GET

# この記事でやること
VS2015でHTTP通信（GETリクエスト）できるAndroidアプリを作る

# 開発環境
IDE：VisualStudio2015 Community
言語：C#
その他：Xamarin.Androidを使う

# とりあえずソースコード
MainActivityクラスの中身

```csharp:MainActivity.cs
string httpGetTag = "HTTP GET";

protected override void OnCreate( Bundle bundle )
{
	base.OnCreate( bundle );
	HttpGet( "http://www3.city.sabae.fukui.jp/xml/refuge2/refuge2.xml" ); // 鯖江のオープンデータ
}

private async void HttpGet( string url )
{
	// HttpClient
	HttpClient httpClient = new HttpClient();
	// GET
	Stream stream = await httpClient.GetStreamAsync( url );
	// Streamで処理
	StreamReader sr = new StreamReader( stream );
	while ( !sr.EndOfStream )
		Log.Debug( httpGetTag, sr.ReadLine() );
	}
}
```
## HttpClientを使うために
デフォルトではHttpClientを扱えないので、
[ソリューションエクスプローラ]の[参照]を右クリックして、
[参照の追加]→[System.Net.Http]にチェックを付けて、下を追加

```csharp:MainActivity.cs
using System.Net.Http;
```

# ソースコードの解説
HttpGet関数の引数に、任意のURL（URI）をぶちこめば、それをDLしてくれる

## なんで非同期処理になってるのか
Androidの場合、メインスレッドでHTTP通信ができないようになっているので、
通信部分は別スレッド（つまり非同期）で処理しなければならない
なので、async、awaitなどの非同期処理に関するキーワードが出てきている

簡単にasync、awaitの説明をしておくと、
まず、中身で非同期処理を実行する関数の定義に、「async」というキーワードをつける
これで、その関数の中で「await」を使うことができるようになる
で、「await」は、非同期で何か処理をする関数の前につける演算子
非同期処理の関数の呼び出しには、かならずこれをつける必要がある

非同期処理の関数が呼ばれると、１回その関数を呼び出した関数の外に抜ける（ここでいうと、HttpGet関数から抜け、OnCreate関数に戻ってくる）
と同時に、別スレッドが生成され、HTTP通信でデータのやり取りが始まる
非同期関数の処理が終われば、HttpGet関数の中で、次のプログラムに進んでいく

詳しくはMSDN参照。図がとてもわかり易い
[Async および Await を使用した非同期プログラミング (C# および Visual Basic)](https://msdn.microsoft.com/ja-jp/library/hh191443.aspx)

## Streamについて
Streamとは、ファイルやメモリなどとデータをやり取りするためのクラスで、
ユーザは、直接ファイルを操作するのではなく、このStreamを介して操作する
このプログラムでは、HTTP通信の関数が、Streamを返してくるので、
それを、StreamReaderに変換して、データを１行ずつ読み込んで出力している

# ソースコードでDLしているデータ
[データシティ鯖江（避難所、一時避難所等（ＸＭＬ））](http://www.city.sabae.fukui.jp/pageview.html?id=11617)

# 参考にしたサイト
https://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/
もっとみんなjavadoc.ioを使おう！

[![javadoc-io.png](https://qiita-image-store.s3.amazonaws.com/0/11219/703851c3-c9a8-8899-b318-788dd1bbab88.png)][javadoc.io]

[javadoc.io]というサービスが素晴しいと思うのですが、日本語での紹介記事があまりなかったので紹介させてもらいます。

# [javadoc.io]とは？

[Central Maven Repository]で公開されているプロジェクトのドキュメントをホスティングするサービスです。

`http://javadoc.io/doc/<org>/<artifact>/<version>`

というURLにアクセスすると、対応するドキュメントを閲覧することができます。例えば[OkHttp]のv3.2.0であれば、

<http://javadoc.io/doc/com.squareup.okhttp3/okhttp/3.2.0>

のようなURLになり、こんなドキュメント（と言ってもJava 8のJavaDocそのものですが）が表示されます。

![javadoc-io-okhttp.png](https://qiita-image-store.s3.amazonaws.com/0/11219/86b1e6b6-afcf-3d67-d2e1-c9cf39c4f233.png)


## よいところ

  - Javaだけではなくて[Scala](http://www.javadoc.io/doc/org.scala-lang/scala-library/2.12.0-M3)やGroovyにも対応している。
  - Central Maven Repositoryに上がっているプロジェクトであれば、どんなプロジェクトのものでも見ることができる。
  - フリー
  - 複数のバージョンのドキュメントをすぐに切り換えることができる。
  - ドキュメントをZipでダウンロードすることができる

従来であればJavaDocをGitHub Pagesなどで公開していたかもしれませんが、GitHub Pagesで公開する場合はGitHubのフックを使ってJavaDocをビルドしてアップロードする必要があったものを、URLを指定するだけでドキュメントを公開できるのは楽でいいのではないかと思います。

## ダメなところ

  - Javaの標準ライブラリのドキュメントは見れない
  - Kotlinには対応していない模様
  - [Sonatype]や[JitPack]といったリポジトリにも対応していない
  - GitHubの最新版のドキュメントが見れるわけじゃない
  - 初回にドキュメントを取得するため表示されず、一度リロードする必要がある。

と、ここら辺かなと思います。Kotlinに対応してたり、SonatypeやJitPackに対応していたら使える幅も広がるのですけど‥。

それと、GroovyDocがどういうプロジェクトなら表示されるのかよく分かりません。

また、最後の問題はタイトルにあるとおり、**もっとみんな**[javadoc.io]を使えば解消されるかもしれません（それでも生成が完了したら自動リロードしてくれる機能が欲しいものですが）

これらはこれからの更新に期待したいところです。

# まとめ

Javaのプロジェクトを作ったら、[![javadoc.io](https://img.shields.io/badge/javadoc-here-yellowgreen.svg)](http://javadoc.io/doc/com.squareup.okhttp3/okhttp/3.2.0)みたいなバッジを置いておくと便利なんじゃないでしょうか。

IDEの補完でドキュメントを見るだけだとライブラリの全体の設計が見えてこないことがあるので、こうしてドキュメント全体に一度目を通しておくことは大切だと思います。

それでは、こんなスクショで量を誤魔化した記事にお付き合いいただきありがとうございました。


[javadoc.io]: http://javadoc.io/
[Central Maven Repository]: http://search.maven.org/
[OkHttp]: http://square.github.io/okhttp/
[Sonatype]: http://www.sonatype.com/
[JitPack]: https://jitpack.io/
jQueryプラグイン テンプレート 


プラグインを自作する際のテンプレート
”test”（仮称）を任意の名前に変換して使う

```javascript
(function($){

  var methods = {
    init : function( options ) {
      var elements = this
      var settings = $.extend(true, $.fn.test.defaults, options);
      console.log(settings)
      elements.each(function() {
     	 // 処理をここに記述する
      });
      return this;
    }
  };

  $.fn.test = function( method ) {
    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.test' );
    }
  };
  $.fn.test.defaults = {
    default: true,
  };
})(jQuery)

```
DEVISEでサインアップ用のユーザ登録フォームに、独自のカラムを追加する。サインアップ後のリダイレクト先を変更。

参考サイト
http://easyramble.com/add-field-devise-signup-form.html

<h2>name入力欄を作る場合</h2>
1. usersテーブルにnameカラムを追加
rails g migration AddNameToUsers name:string
rake db:migrate<br>
コマンドを実行する。<br>※ この作業を行う前にusersテーブルに既存のレコードがあったら、削除すること！<br><br>

2. ビューにname用の入力フィールドを追加<br>

```
<div class="field">
  <%= f.label :name %>
  <%= f.text_field :name, autofocus: true %>
</div>
```

3. nameフィールドを許可するstrong parametersの設定

```controllers/application_controller.rb
以下を記述する
before_action :configure_permitted_parameters, if: :devise_controller?
protect_from_forgery with: :exception

新規会員登録時にお名前を登録
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:email, :password, :password_confirmation, :name)}
end
```

4. モデルにバリデーションを記述

```user.rb
validates :name, presence: {message: 'を入力してください'}
```

以上


## サインアップ後のリダイレクト先を変更
```registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController

  protected

  def after_sign_up_path_for(resource)
    # サインアップ後のリダイレクト先をrootに変更
    root_path
  end

  def after_update_path_for(resource)
    user_path(current_user)
  end

  def update_resource(resource, params)
    resource.update_without_password(params)
  end

end
```

http://morizyun.github.io/blog/devise-customize-login-register-path/#3-ユーザー登録完了後のリダイレクト先の変更
sedの-iオプションの非互換


`sed` コマンドには `-i` というファイルを書き換える時に便利なオプションがある。

```
$ cat <<EOF > test.txt
foo
bar
baz
EOF
$ sed -i'.bak' 's/a/A/g' test.txt
$ ls
test.txt
test.txt.bak
# 書き換えられたファイル
$ cat test.txt
foo
bAr
bAz
# 元のファイル
$ cat test.txt.bak
foo
bar
baz
```


さて、バックアップが欲しい時には拡張子に空文字列を渡したいのだがここでGNUとBSDの互換性の問題が発生する。

Ubuntuだとこういう挙動をする


```
$ sed -i'' 's/a/A/g' test.txt
$ cat
foo
bAr
bAz
```

普通のようだ。次にOS Xで実行してみる。

```
$ sed -i'' 's/a/A/g' test.txt
sed: 1: "test.txt": undefined label 'est.txt'
```

これは `-i` の直後に続いた`''` がなかったことにされて `-i` として扱われ、`'s/a/A/g'` が拡張子、 `test.txt` がsedコマンドとして解釈されている。

これを避けるには `-i` と `''` の間にスペースを開けてあげれば良い。

```
$ sed -i '' 's/a/A/g' test.txt
```

ところがUbuntuでスペース付きを実行するとこうなる。

```
$ sed -i '' 's/a/A/g' test.txt
sed: s/a/A/g を読み込めません: そのようなファイルやディレクトリはありません
```

Ubuntuのsedは `-i` の直後に文字列が続かなかったらそのまま空文字列が渡されたとして解釈し、次の `''` をsedコマンド、 `'s/a/A/g'` 以後をファイル名として解釈しようとする。

まとめると、こうだ。

|        | `-i''`           | `-i ''`
|--------|------------------|--------
| Ubuntu | 正常             | `''` がsedコマンドに
| OS X   | `''` が無視される | 正常


空文字列を渡す互換性のある方法がない。

因みに空でない文字列を渡すとこうなる。

|        | `-i'str'` | `-i 'str'`
|--------|-----------|--------
| Ubuntu | 正常      | `'str'` がsedコマンドに
| OS X   | 正常      | 正常


Ubuntuの方は一貫性があるが、OS Xは何をとち狂った、といった感じだ。

まあ、これは `-i''` は見た目上 `-i''` に空文字列を渡しているが実際はシェルレベルで `-i` と解釈されるので空文字列を渡したのか次に文字列が続くのかコマンドに渡った時には判断出来ないからだ。
BSDツールを作った人が空文字列を特別扱いした訳ではなくて逆に渡される文字列が空の時のエッジケースを考えなかったらこうなったのかもしれない。
GNUツールの方はそこも考慮して作ったのかもしれない。


シェルの非互換問題は根深い。
Linux / Unix | 標準エラー出力を捨てる

次でOK。

```bash
[command] 2>/dev/null
```

この場合。

**標準エラー出力** だけを捨てるので。
**標準出力** はそのまま使える。

# 例

たとえば特定のファイルを探したい場合。

普通にコマンドを打つと。
権限がないディレクトリに対して、たくさん警告される。

```
find / -name example.txt

find: `/etc/directory1': Permission denied
find: `/etc/directory2': Permission denied
find: `/etc/directory3': Permission denied
find: `/etc/directory4': Permission denied
find: `/etc/directory5': Permission denied
```

標準エラー出力を捨てれば、欲しい結果だけを得られる。

```bash
find / -name example.txt 2>/dev/null

/tmp/example.txt
/var/example.txt
```

## 参考

- [いい加減、>/dev/null 2>&1と書くのをやめたらどうか](http://dqn.sakusakutto.jp/2012/06/shell_dev_null_2_1_crontab.html)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
キャレットで 排他的論理和 (XOR)

（タイトルを変更）

```
$ for i in $(seq 1 10) ; do  for j in $(seq 1 10) ; do echo $i^$j = $(($i ^ $j)) ; done ; done
1^1 = 0
1^2 = 3
1^3 = 2
1^4 = 5
1^5 = 4
1^6 = 7
1^7 = 6
1^8 = 9
1^9 = 8
1^10 = 11
2^1 = 3
2^2 = 0
2^3 = 1
2^4 = 6
2^5 = 7
2^6 = 4
2^7 = 5
2^8 = 10
2^9 = 11
2^10 = 8
3^1 = 2
3^2 = 1
3^3 = 0
3^4 = 7
3^5 = 6
3^6 = 5
3^7 = 4
3^8 = 11
3^9 = 10
3^10 = 9
4^1 = 5
4^2 = 6
4^3 = 7
4^4 = 0
4^5 = 1
4^6 = 2
4^7 = 3
4^8 = 12
4^9 = 13
4^10 = 14
5^1 = 4
5^2 = 7
5^3 = 6
5^4 = 1
5^5 = 0
5^6 = 3
5^7 = 2
5^8 = 13
5^9 = 12
5^10 = 15
6^1 = 7
6^2 = 4
6^3 = 5
6^4 = 2
6^5 = 3
6^6 = 0
6^7 = 1
6^8 = 14
6^9 = 15
6^10 = 12
7^1 = 6
7^2 = 5
7^3 = 4
7^4 = 3
7^5 = 2
7^6 = 1
7^7 = 0
7^8 = 15
7^9 = 14
7^10 = 13
8^1 = 9
8^2 = 10
8^3 = 11
8^4 = 12
8^5 = 13
8^6 = 14
8^7 = 15
8^8 = 0
8^9 = 1
8^10 = 2
9^1 = 8
9^2 = 11
9^3 = 10
9^4 = 13
9^5 = 12
9^6 = 15
9^7 = 14
9^8 = 1
9^9 = 0
9^10 = 3
10^1 = 11
10^2 = 8
10^3 = 9
10^4 = 14
10^5 = 15
10^6 = 12
10^7 = 13
10^8 = 2
10^9 = 3
10^10 = 0
$
```

キャレット、なに。
JavaScriptでHTMLエスケープ処理


JavaScriptでHTMLエスケープする必要があったのでメモ。

一般的なWebアプリの場合、基本的にはサーバサイドでのHTMLエスケープが出来てれば問題無いケースが多い。

ただ、例えばDOMからテキストを取得して再度DOMに突っ込む、みたいな処理をクライアントサイドでやろうとした場合は、JavaScriptで改めてHTMLエスケープする必要がある。

ので、JavaScriptで最低限のHTMLエスケープするメソッド作った。

```javascript
function escape_html (string) {
  if(typeof string !== 'string') {
    return string;
  }
  return string.replace(/[&'`"<>]/g, function(match) {
    return {
      '&': '&amp;',
      "'": '&#x27;',
      '`': '&#x60;',
      '"': '&quot;',
      '<': '&lt;',
      '>': '&gt;',
    }[match]
  });
}
```

おしまい。
Flood fillで部屋認識をやってみました

# 経緯
TerrariaやDQ Buildersなどで一定の条件を満たすと、壁やドアで囲まれた空間が部屋として認識され、プレイヤーにあるメリットを与えられますよね？
それを見ているうちに「部屋認識はどうやって出来たんだろう」と疑問が出てしまいました。
![House.png](https://qiita-image-store.s3.amazonaws.com/0/48530/ba3356a7-eeea-b5b4-a849-5be26f10d98e.png)
しかし、色々探したのですが、この機能についての文章や説明はあまりないのようです。
一番の疑問は「どうやって囲まれた空間を識別しているんだろう？」という点ですよね？
偶然、wikipediaで読んだflood fillアルゴリズムがここで使えそうので、今回はそれを使って実験してみました。

# Flood fillとは
Flood fillは色々な画像編集ツール（例えば、windowsのペイント）にある「塗りつぶし」機能で使われているアルゴリズムです。
この機能を使ったことがある方は既に思い付いたと思いますが、クリックしたピクセルと繋がっている同じ色の区域しか色を塗らない機能です。
つまり、下図のような感じで、囲まれた空間を識別することが出来ます。
![fill.gif](https://qiita-image-store.s3.amazonaws.com/0/48530/2878d55f-2cf1-69c5-97ba-b144a9f12ef6.gif)

Flood fill、実はかなり簡単です。
パフォーマンス改善のため、バリエーションは大勢ありますが、今回は一番理解しやすい再帰を使っている方法で原理を説明します。

現在処理しているポイントをnといいます：
0.　あるスタートポイントをnにします。
1.　もしnが既に処理済みであれば、以下の処理を全部スキップして戻ります。
2.　もしnが処理すべきポイントとして認識する条件（壁ではないこと、色が指定値であることなど）を満たせなければ、以下の処理を全部スキップして戻ります。
3.　nを処理すべきポイントとして認識し、処理を行います（あるエリア（壁に囲まれた領域）に所属するポイントリストに追加、色を指定値に変更するなど）。
4.　nを処理済みとマークします。
5.　n下のポイントをnとして1から実行し直します。
6.　n左のポイントをnとして1から実行し直します。
7.　n上のポイントをnとして1から実行し直します。
8.　n右のポイントをnとして1から実行し直します。

![algorithm](https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif "By André Karwath aka Aka (Own work) [CC BY-SA 2.5 (http://creativecommons.org/licenses/by-sa/2.5)], via Wikimedia Commons")

# 簡単なflood fill実装例
再帰を使って、実際のコードも非常に簡単です。

```csharp
void FloodFill(Node node, Predicate<Node> shouldProcess, Action<Node> process)
{
    if (node.IsProcessed) return;
    if (!shouldProcess(node)) return;

    process(node);
    node.IsProcessed = true;

    foreach (Node neighbour in node.Neighbours)
    {
        FloodFill(neighbour, shouldProcess, process);
    }
}
```
# 部屋認識
では、部屋認識においてどうやってflood fillを応用するんでしょうか？

実はそれもとても簡単です。
上記のコードを使う場合、マップ上全部のポイントを一つずつnodeに入れ、shouldProcessに壁かどうかの判断ロジックを入れ、
processに応じるエリアのポイントリストに追加する・エリア情報を更新するロジックを入れて実行すればマップにあるエリアが全部識別されます。
その後、エリア毎に部屋として認識する条件（例えば、ライトがあるかどうか、エリアサイズが合っているかどうかなど）に満たしているかどうかをチェックすれば完了です。

# 例

```csharp
void ScanForHouses(Map map)
{
    List<Area> areas = new List<Area>();

    foreach (Node node in map.Nodes)
    {
        Area area = null;

        FloodFill(node, n => !n.IsWall, n =>
        {
            if (area == null) area = new Area();

            area.Nodes.Add(n);
            if (n.IsLight) area.LightCount++;
        });

        if (area != null) areas.Add(area);
    }

    foreach (Area area in areas)
    {
        // ライトが一つ以上、サイズが10～100間のエリアを部屋として認識します
        area.IsHouse = area.LightCount > 0 && area.Nodes.Count > 10 && area.Nodes.Count < 100;
    }
}
```

# 結論
案外簡単に部屋認識を実装できました。
もちろん、再帰でflood fillを実装するのがパフォーマンス的にいいとは言えません。Stack overflowする可能性もあります。
その場合、再帰ではなく、stackやqueueを使ってflood fillを実装すれば大体解決出来ます。どちらも結構簡単です。
もっと詳しいの話や他の実装バリエーションを知りたい方はレファレンスを読めばいいと思います。基本的な原理が変わることがありません。

# レファレンス
* https://en.wikipedia.org/wiki/Flood_fill
facebookログインで、「指定されたURLは、アプリケーションの設定で許可されていません。」というエラー

# 発生現象
![image](https://qiita-image-store.s3.amazonaws.com/0/83412/960c6e8c-e1ce-1f67-6174-d010a58106ad.png)

>指定されたURLは、アプリケーションの設定で許可されていません。: 指定されたURLの中にアプリの設定で認められないものが含まれています。ウェブサイトまたはキャンバスのURLと一致しているか、ドメインがアプリのドメインのサブドメインである必要があります。

RailsでFacebookログインを久しぶりに実装したら、結構ハマったので共有致します(*ﾟ∀ﾟ)

# 解決方法

facebook developerのsettingにて設定することができる、
![image](https://qiita-image-store.s3.amazonaws.com/0/83412/7f0b854e-2519-b7f3-e188-50931073876e.png)

AppDomainsを設定すれば、解決できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/83412/787d30b1-66ef-6a4d-97d4-ee5ad2f6f2a6.png)
Itamaeでシェルの再起動が必要になった場合の対応


Itamaeでanyenvを使ってrbenvやndenvを入れようと思った時に、公式通りにやろうとして次のように書いてもうまく動作しません。理由については参考URL1,2のリンク先に詳しく書いてありますが、要するにanyenvのインストールを反映させるにはシェルの再起動が必要だがItamae実行中にシェルを再起動することはできないということです。

```cookbooks/anyenv/default.rb
HOME_DIR = "/home/vagrant"

# anyenvのインストール
execute 'git clone https://github.com/riywo/anyenv ~/.anyenv' do
  not_if "test -d #{HOME_DIR}/.anyenv"
end

remote_file "#{HOME_DIR}/.bashrc" do
  source './files/.bashrc'
end

# シェルの再機動
# ここでItamaeが止まってしまう。
execute 'exec $SHELL -l'

# rbenvのインストール
execute 'anyenv install rbenv' do
  not_if "test -d #{HOME_DIR}/.anyenv/envs/rbenv"
end
```


シェルの再機動をしないとanyenvのインストールとbashの設定が反映されないし、でも再起動できないしで困ったと思ったんですが、下記のようにやればうまくいきました。
-lオプションを使ってログインシェルとして`/bin/bash`を起動することで、anyenvのインストールが反映されます。.bashrc等の設定の変更も反映されるので、コマンドが無いと怒られることもありません。


```cookbooks/anyenv/default.rb
HOME_DIR = "/home/vagrant"

# anyenvのインストール
execute 'git clone https://github.com/riywo/anyenv ~/.anyenv' do
  not_if "test -d #{HOME_DIR}/.anyenv"
end

remote_file "#{HOME_DIR}/.bashrc" do
  source './files/.bashrc'
end

# rbenvのインストール
execute '/bin/bash -lc "anyenv install rbenv"' do
  not_if "test -d #{HOME_DIR}/.anyenv/envs/rbenv"
end
```

ただ、事前にシェルの再起動が必要なコマンドには毎回同じことを書かなきゃいけないので、もっと良い方法があれば教えて下さい！


### 参考URL
1. http://qiita.com/yusabana/items/c4de582c6f85a42817d8
2. http://stackoverflow.com/questions/33048024/exec-shell-executes-from-ssh-wont-execute-in-playbook
3. http://qiita.com/FGtatsuro/items/2366c93131c47aef8dfe
Mac で Mercurial の HTTPS 認証のパスワードを(ある程度)安全に取り扱う


HTTPS でしか Mercurial レポジトリを提供してないサービス (mbedとかmbedとかmbed とか…) でパスワードをファイルシステム上に平文保存せずに、できるだけ安全に取り扱いたい。

- [MacでMercurialのHTTPS認証のパスワードをキーチェーンに保存する](http://d.hatena.ne.jp/yuheiomori0718/20140131/1391183766)

で書かれている方法ほぼまんまだけど覚え書きとして。

# pyenv 入れる

この後使う pip を system の物を使いたくないので、ユーザー権限で python を扱える pyenv を brew 経由で入れます。

- https://github.com/yyuu/pyenv#homebrew-on-mac-os-x

あとは適当に python を入れます。

```
$ pyenv install 2.7.11 # お好みの python をどうぞ
$ pyenv global 2.7.11
```

# pip 経由で mercurial を入れる

brew で入っていたら一度消して、pip 経由で percurial を入れます。

```
$ pip install mercurial
```

続いてパスワードを保存するための keyring を mercurial で使うための mercurial_keyring を入れます。

```
pip install mercurial_keyring
```

keyring は CUI のインターフェイスも提供していて、知らなかったけど便利そう。Mac なら標準だと OSX のキーチェインを使う。

- (参照情報)[python:keyringによるパスワード管理](http://qiita.com/hidelafoglia/items/cf84870dd7939524e3e9)

# ~/.hgrc を弄る

extensions で mercurial_keyring を使う (path が違う場合は直接指定するみたいだけど、pyenv + pip で入れた場合、空欄で問題ないはず) ようにする。

また [auth] にサイトごとの項目を書く。

```
[extensions]
mercurial_keyring = 

[auth]
developer.mbed.org.prefix = https://developer.mbed.org/
developer.mbed.org.username = hotchpotch
```

これで一回目はパスワードを聞かれるが、二回目からは keyring 経由で取得して取ってくる。

なおタイトルに(ある程度)と書いたのは、どちらにしろ Mac なら keychain にアクセスできちゃうと見れちゃうから。~/.hgrc に生パスワードを書いてしまうよりかは幾分安全ぐらいなキモチ。

例えば

- https://bitbucket.org/Mekk/mercurial_keyring/src/9e9a74eb0637a1571f383dd74a174247eeace50c/mercurial_keyring.py?fileviewer=file-view-default#mercurial_keyring.py-180

見れば入れている key 名が解るので、

```
$ keyring get Mercurial '{username}@@https://developer.mbed.org/'
```

すると平文でパスワードが見れます。
Raspberry Pi 2で初の「Lチカ」


前回の初期設定に続き、「Lチカ」を試してみようとおもいます。

プログラミングの初歩の初歩として、
"Hello, world!"という文字列を出力するという慣例？があるのですが、
それの電子工作版を「Lチカ」というらしいです。
「LEDライトをチカチカさせる」から来ているんでしょうか。

さて、早速試してみたいと思います。

#１．準備
以下のモノを準備しました

- ブレッドボード
- LED
- 抵抗器
- ジャンパワイヤ（オス-メス）２本

#２．配線・設定
図のように配線しました。
![LED_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/95868/68abec54-d594-a143-3ad3-f5fc472a0992.png)

LEDはプラスとマイナスがあるので取り付ける際に注意しましょう。
配線図の作成にはFritzingというソフト使っています。下記のURLからダウンロードできます。
http://fritzing.org/download/
Mac版だけではなく、Windows版もあります。
初めての利用でしたが使いやすかったです。

#３．Pythonプログラム
せっかくなので、Raspberry Pi上からプログラムでLEDを点滅させてみようと思います。
Pythonというプログラム言語を使いました。

## （１）Python開発環境構築
Raspberry Pi上にPythonの開発環境を構築します。

```
$ sudo apt-get update
$ sudo apt-get install python-dev
```

ついでに、pipもインストールしておきます。
`$ curl https://bootstrap.pypa.io/get-pip.py -o - | sudo python`

RPi.GPIOパッケージをインストールします。
`$ sudo apt-get install python-rpi.gpio`

## （２）Pythonプログラム

```led.py
# coding: utf-8
# 1.ライブラリのインポート
import RPi.GPIO as GPIO
import time

# 2.ピン番号の割り当て設定
GPIO.setmode(GPIO.BOARD)

# 3.ピン番号を変数LEDにセット
LED = 40

# 4.出力設定
GPIO.setup(LED, GPIO.OUT)

# 5.点滅/点灯を3回繰り返す
for i in range(3):

    print 'Count=' + str(i)

    # ハイレベルを出力し、5秒待機
    GPIO.output(LED, GPIO.HIGH )
    print 'LED High'
    time.sleep(5)

    # ローレベルを出力し、5秒待機
    GPIO.output(LED, GPIO.LOW)
    print 'LED Low'
    time.sleep(5)

# 6.GPIOの解放
GPIO.cleanup()
```
上記のプログラムをnanoエディタを使って保存します。

`$ nano led.py`
でファイルを開き上記のプログムを貼付け、
"control + x"で「保存しますか？」と聞かれるので、"y"を選択して保存します。

# ４．実行
最後に下記のコマンドで実行してみましょう。

`$ sudo python led.py`

![anime_LED3.gif](https://qiita-image-store.s3.amazonaws.com/0/95868/3cdcfc83-6fb9-a360-fed7-06ce3a3dbb51.gif)


# ５．感想
なんで抵抗が必要なんだろうとか、オームの法則とか学生時代を思い出しました。
電子工作って、ハンダ付けのイメージがありますが、ブレッドボードを使えば、差し込むだけなので、手軽に色々と試すことができますね。

※以下のサイトを参考にしました。ありがとうございます。

オームの法則覚えてますか？ 電子工作の基礎を身につけ、Raspberry PiでLEDを光らせよう
http://codezine.jp/article/detail/9128
PHPの文字列結合ってｉｍｐｌｏｄｅが良いんだっけ？

「あー確か引数のコピーと、関数呼び出しのコストが重いからループで良いんじゃなかったっけ？」
「いやいや、そんなコスト無視レベルでC言語内で結合する方が速いに決まってるっしょ」
と、脳内で机上の空論が繰り広げられたので試してました。

```php
<?php
function getmicrotime() {
    list($msec, $sec) = explode(" ", microtime());
    return ((float)$sec + (float)$msec);
}
$winner = array(
  'result' => array('implode' => 0, 'loop' => 0, 'loop2' => 0, 'implode2' => 0),
  'details' => array(),
);
for ($i = 1000; $i < 100000; $i += 1000){
  $result = array();
  $src = range(0, $i);
  $string = '';
  $before = getmicrotime();
  foreach ($src as $elm) $string .= $elm . ',';
  $result['loop'] = (getmicrotime() - $before);

  $string = '';
  $before = getmicrotime();
  foreach ($src as $elm) $string .= "'$elm',";
  $result['loop2'] = (getmicrotime() - $before);

  $string = '';
  $before = getmicrotime();
  $string = implode(',' , $src);
  $result['implode'] = (getmicrotime() - $before) ;

  $string = '';
  $before = getmicrotime();
  $string = implode(',' , array_map(function($elm){return "'$elm'";}, $src));
  $result['implode2'] = (getmicrotime() - $before) ;
  asort($result);
  list($first) = array_keys($result);
  $winner['result'][$first]++;
  $winner['details'][] = $result;
}
var_dump($winner);
```

という訳で普通にimplodeが速かったですね。
array_mapとからめると段違いに遅くなるんで、そこは注意ということで。
systemctl status nginxでPermission Errorが発生した場合の対応


### 事象
CentOS 7にNginxをインストールし、設定ファイルを他からコピーしてくると
`systemctl start nginx` 実行のタイミングで

``` error.log
[root@localhost ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 火 2016-03-08 14:09:21 JST; 11min ago
  Process: 3012 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)

 3月 08 14:09:21 localhost.localdomain systemd[1]: Starting The nginx HTTP and reverse proxy server...
 3月 08 14:09:21 localhost.localdomain nginx[3012]: nginx: [emerg] open() "/etc/nginx/addtional.conf" failed (13: Permission denied) in /etc/nginx/nginx.conf:52
 3月 08 14:09:21 localhost.localdomain nginx[3012]: nginx: configuration file /etc/nginx/nginx.conf test failed
 3月 08 14:09:21 localhost.localdomain systemd[1]: nginx.service: control process exited, code=exited status=1
 3月 08 14:09:21 localhost.localdomain systemd[1]: Failed to start The nginx HTTP and reverse proxy server.
 3月 08 14:09:21 localhost.localdomain systemd[1]: Unit nginx.service entered failed state.
 3月 08 14:09:21 localhost.localdomain systemd[1]: nginx.service failed.
```

が発生することがある。
設定ファイルを当該サーバ上で作成せずに、他のサーバからコピーしてくると発生しやすい。

### 対応内容
[CentOS7.1 64bit SELinuxによるアクセス制御 | kakiro-web カキローウェブ](http://www.kakiro-web.com/linux/selinux.html) を参考にして実施。

``` bash
chcon -t httpd_config_t /etc/nginx -R
ls -lZ /etc/nginx/addtional.conf
```
コピーしてきたものがファイルのみだとファイル指定で良いけど、ディレクトリ毎だとディレクトリ指定で` chcon /etc/nginx/addtional.conf ` しないといけない。
font-familyのgeneric font familyがiOSやAndroidで日本語フォントに効かない

こんなコンテンツ

```html
<head>
  <style>
  .sansserif {
    font-family: sans-serif;
  }
  .serif {
    font-family: serif;
  }
  .cursive {
    font-family: cursive;
  }
  .fantasy {
    font-family: fantasy;
  }
  .monospace {
    font-family: monospace;
  }
  </style>
</head>
<body>
  <p><span class="sansserif">sans-serif<span/> <span class="sansserif">ゴシック体</span></p>
  <p><span class="serif">serif<span/> <span class="serif">明朝体</span></p>
  <p><span class="cursive">cursive<span/> <span class="cursive">筆記体</span></p>
  <p><span class="fantasy">fantasy<span/> <span class="fantasy">装飾体</span></p>
  <p><span class="monospace">monospace<span/>  <span class="monospace">等幅フォント</span></p>
</body>
```

で描画結果

<img width="642" alt="font.png" src="https://qiita-image-store.s3.amazonaws.com/0/4044/3d47d6d1-f68f-a831-5035-3b468fa5b38f.png">

左がPCのGoogle Chrome(version48) 右が iOS9.1(シミュレータ)のWebView

iOSのWebViewは日本語が等幅フォント以外はすべてゴシック体のフォントになってしまっている。
AndroidのWebView(Android5.0/Nexus9)も同様。

generic font familyが効かないと
明朝体(serif)で描画してほしいのに、ゴシック体などの意図しないフォントで描画されてしまう。。。

解決方法はないだろうか。
laravelでメール送信時にcontent-transfer-encodingを指定するメモ

滅多に使わなくて忘れそうなのでメモ。

Mail::send時に以下のようにすればOK。

```php
Mail::send('mail.twig', $params, function ($message) {
    // 7bitに指定してみる。
    $message->setEncoder(new \Swift_Mime_ContentEncoder_PlainContentEncoder('7bit'));
});
```
backlogのgit用 .ssh/configの設定方法

ハマったので個人的メモ

```~/.ssh/config
Host hoge.git.backlog.jp
  HostName hoge.git.backlog.jp
  IdentityFile ~/.ssh/id_rsa_backlog_git
  User hoge

```

- hoge ... backlogのID
- id_rsa_backlog_git ... backlog用の秘密鍵。公開鍵はbacklogサーバー側に登録されている前提

github用の設定でportを指定していたので、こっちでも惰性で指定していたら繋がらなくて困った。
いっぱい動いているJavaのプロセスを種類別にカウントする


バッチをJavaで作っていて、いろんな種類のものが多重起動しているサーバでどれがいくつ動いているかカウントしたい時ってあるかもしれませんよね？
そんな時はuniqコマンドにcオプションをつければ簡単！

```
$ jps | cut -f 2 -d " " | sort | uniq -c
      8 AAABatch
      1 BBBBatch
      3 CCCBatch
      1 Jps
```

単純にuniq -cが便利だったという話でした。。。
Swiftで文字列または数値のみを許容する型を作ってDictionaryのキーとして使う

[JSONRPCKit](https://github.com/bricklife/JSONRPCKit)という、Swiftで[JSON-RPC 2.0](http://www.jsonrpc.org/specification)を扱うライブラリを作っているときに必要になったので作ってみました。

# 文字列または数値のみを許容する型を作る

JSON-RPC 2.0の`id`は文字列か数値をとる仕様なので、その制限を型で表現してみました。以下のように`enum`を使うと簡単です。

```swift
public enum RequestIdentifier {
    case NumberIdentifier(Int)
    case StringIdentifier(String)
}
```

使うときにはJSON、つまり`[String: AnyObject]`との相互変換が必要になるので、便利メソッドをいくつか用意しておくと使いやすくなります。

```swift
extension RequestIdentifier {

    public init?(value: AnyObject) {
        switch value {
        case let number as Int:
            self = .NumberIdentifier(number)
        case let string as String:
            self = .StringIdentifier(string)
        default:
            return nil
        }
    }
    
    public var value: AnyObject {
        switch self {
        case NumberIdentifier(let number):
            return number
        case StringIdentifier(let string):
            return string
        }
    }
}
```

`RequestIdentifier`から`AnyObject`へ変換

```swift
let id = RequestIdentifier.NumberIdentifier(1)
let json: [String: AnyObject] = ["id": id.value]
debugPrint(json) // ["id": 1]
```

`AnyObject`から`RequestIdentifier`へ変換

```swift
if let id = json["id"].flatMap(RequestIdentifier.init) {
    debugPrint(id) // RequestIdentifier.NumberIdentifier(1)
}
```

# Dictionaryのキーとして使えるようにする

ライブラリ内部でこの型を`Dictionary`のキーとして使いたかったので、[`Hashable`](https://developer.apple.com/library/tvos/documentation/Swift/Reference/Swift_Hashable_Protocol/index.html)プロトコルに準拠させました。ハッシュ値として、数値の場合はその値を、文字列の場合は`hashValue`を返すようにしてみました。

```swift
extension RequestIdentifier: Hashable {

    public var hashValue: Int {
        switch self {
        case NumberIdentifier(let number):
            return number
        case StringIdentifier(let string):
            return string.hashValue
        }
    }
}
```

`Hashable`は[`Equatable`](https://developer.apple.com/library/tvos/documentation/Swift/Reference/Swift_Equatable_Protocol/index.html#//apple_ref/swift/intf/s:PSs9Equatable)を継承しているので、これにも準拠させる必要があります。ハッシュ値が同じときの同値判断のためですね。`if case let`で２つの値を取り出しながら比較する形にしてみました。

```swift
public func ==(lhs: RequestIdentifier, rhs: RequestIdentifier) -> Bool {
    if case let (.NumberIdentifier(left), .NumberIdentifier(right)) = (lhs, rhs) {
        return left == right
    }

    if case let (.StringIdentifier(left), .StringIdentifier(right)) = (lhs, rhs) {
        return left == right
    }

    return false
}
```

ここまでやると、以下のようにDictionaryのキーとして直接使えるようになります。

```swift
var array: [RequestIdentifier: String] = [:]
array[RequestIdentifier.StringIdentifier("a")] = "string key"
array[RequestIdentifier.NumberIdentifier(1)] = "number key"
debugPrint(array) // [RequestIdentifier.StringIdentifier("a"): "string key", RequestIdentifier.NumberIdentifier(1): "number key"]
```

ちなみに、同じ`enum`でもAssociated Valuesを持たない場合はそのままDictionaryのキーとして使えるようです。

# 参考
https://github.com/bricklife/JSONRPCKit/blob/master/JSONRPCKit/RequestIdentifier.swift
http://qiita.com/kishisuke/items/c803b1ce2bbc91e5b278
https://ez-net.jp/article/5D/T5i2IddA/E6FDjcBSY6e1/
Unity StreamingAssets 備忘録

■Android実機内ではApplication.streamingAssetsPathはつかえない。

　Assets/StreamingAssets の直下に**FileList.txt**を置いた場合、
　下記のようなパスにしないと取得できない

 こちらのサイトを参考にしました。
　http://halcyonsystemblog.blog.fc2.com/blog-entry-78.html

```
TextReader txtReader;
string description = "";
string txtBuffer = "";　
string textFileName = "FileList.txt";
string path = "jar:file://" + Application.dataPath + "!/assets" + "/" + textFileName;
WWW www = new WWW(path);
yield return www; 
        
txtReader = new StringReader(www.text);
while ((txtBuffer = txtReader.ReadLine()) != null)
{
    description = description + txtBuffer + ",";
}
```
プロジェクトメンバー間で使っているnodejsのバージョンを合わせる方法

nodejsは進化が速く最新の機能がどんどん入ってきます。
個人的に`gulpfile.js`や簡単なスクリプトぐらいならリスクも少ないのでes6の機能を素で使うために、どんどんバージョンアップしていきたいです。
当然複数人で開発していると、メンバー内で使っているnodejsのバージョンを揃える必要があります。
つらつらREADMEに書いてもいいんですが、何かうまい方法がないかと考えてみました。

rubyやrbenvであれば、`.ruby-version`で指定したり、`Gemfile`でも指定できます。
同様にnodejsの場合、`package.json`内の`engines`プロパティでサポートするenginesを指定するのでこれで解決かと思いましたが、これはライブラリとしてインストールされる時に使われるもののようで、プロジェクト自身が`npm install`した時や実行時にチェックはしてくれるものではないようです。

そこで [check-engines](https://github.com/kruppel/check-engines)というのを使いたいと思います。これは`package.json`の内の`engines`を見て現在実行しているnodejsがサポートされているものかをチェックしてくれるライブラリみたいです。cliも提供されています。以下のようなメッセージが出力されます。

> [Error: Error: node version (4.0.0) does not satisfy specified range (>=5.0.0)]


これと`postinstall` scriptsを組み合わせれば、`npm install`した時にチェックできそうです。

最終的に以下のようにすれば、`npm install`時に使っているnodejsのバージョンがサポートされていなければエラーメッセージが出るようになりました。

```json:package.json
{
  "name": "LooksLikeTeenSpirit",
  "version": "1.0.0",
  "description": "...",
  "repository": "...",
  "main": "index.js",
  "engines": {
    "node": ">=4.0.0"
  },
  "scripts": {
    "postinstall": "node_modules/check-engines/bin/check-engines"
  },
  "author": "Kurt Cobein",
  "license": "ISC",
  "devDependencies": {
    "check-engines": "^1.2.0",
  }
}

```


`npm install`はまず欠かせない作業なので問題ないでしょう。
これで無事プロジェクトで使っているnodeのバージョンを合わせることができました。


でも自分が知らないだけで他に何かちゃんとした方法があるような気がするので、
もっといい方法知っていれば、教えてください。
jMeterでjson形式のデータをpostする



jMeterを使ってjson形式のデータを送りたいときは、

HTTPリクエスト内のBody Dataという入力画面にjsonを書いていけばよいです。

![スクリーンショット 2016-03-08 13.48.58.png](https://qiita-image-store.s3.amazonaws.com/0/43677/ef17674c-0553-64da-2b21-7fa2be153b26.png "スクリーンショット 2016-03-08 13.48.58.png")


ただしデフォルトの状態だと、サーバー側はリクエストをjson形式で受け付けてくれないのでその設定もしましょう。

スレッドグループを右クリックして、

```
追加＞設定エレメント＞HTTPヘッダマネージャ
```

の順に進みHTTPヘッダマネージャの項目を追加します。
そして、ヘッダの名前に "Content-Type"、値に "application/json" を追加すればうまくjson形式で値を送ることができます。
JINS MEME ACADEMIC PACKでUSBドングルが認識されないとき

# JINS MEME ACADEMIC PACKに付属しているUSBドングルが認識されない現象発生。調べてみたらSilicon labsの標準？ドライバがインストールされていないのが原因っぽかったです。


##### 以下からソフトをダウンロードしてインストしたら上手くいきました。
 `[Silicon Labs](http://jp.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
) `

#### 検証環境は以下
- Windows8.1
- 日本語OS
表領域とディスクグループの使用量確認

表領域の使用量確認

```sql
SELECT d.tablespace_name "Tablespace Name",
  TO_CHAR(a.bytes                     / 1024 / 1024, '9,999,990.900') "Total(MB)",
  TO_CHAR((a.bytes - NVL(f.bytes, 0)) / 1024 / 1024, '9,999,990.900') "Usage(MB)",
  '  ' || TO_CHAR(NVL((a.bytes - NVL(f.bytes, 0)) / a.bytes * 100, 0), '990.00') "Usage(%)",
  a.autoextensible "Autoextensible"
FROM sys.dba_tablespaces d,
  (SELECT tablespace_name,
    SUM(bytes) bytes,
    autoextensible
  FROM dba_data_files
  GROUP BY tablespace_name, autoextensible
  ) a,
  (SELECT tablespace_name,
    SUM(bytes) bytes
  FROM dba_free_space
  GROUP BY tablespace_name
  ) f
WHERE d.tablespace_name = a.tablespace_name
AND d.tablespace_name   = f.tablespace_name
AND NOT (d.extent_management LIKE 'LOCAL' AND d.contents LIKE 'TEMPORARY')
UNION ALL
SELECT d.tablespace_name "Tablespace Name",
  TO_CHAR(a.bytes          / 1024 / 1024, '9,999,990.900') "Total(MB)",
  TO_CHAR(NVL(t.bytes , 0) / 1024 / 1024, '9,999,990.900') "Usage(MB)",
  '  ' || TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "Usage(%)",
  a.autoextensible "Autoextensible"
FROM sys.dba_tablespaces d,
  (SELECT tablespace_name,
    SUM(bytes) bytes,
    autoextensible
  FROM dba_temp_files
  GROUP BY tablespace_name, autoextensible
  ) a,
  (SELECT tablespace_name,
    SUM(bytes_used) bytes
  FROM v$temp_space_header
  GROUP BY tablespace_name
  ) t
WHERE d.tablespace_name = a.tablespace_name
AND d.tablespace_name   = t.tablespace_name
AND (d.extent_management LIKE 'LOCAL' AND d.contents LIKE 'TEMPORARY')
ORDER BY 5, 4 DESC;
```

ディスクグループの使用量確認

```sql
SELECT name "Diskgroup Name",
  type "Redundancy",
  TO_CHAR(total_mb, '999,999,990') "Total(MB)",
  TO_CHAR(total_mb - free_mb, '999,999,990') "Usage(MB)",
  ' ' || TO_CHAR((total_mb - free_mb) / total_mb * 100, '990.00') "Usage(%)",
  TO_CHAR(usable_file_mb, '999,999,990') "Usable(MB)"
FROM v$asm_diskgroup
ORDER BY group_number;
```
AWS SDK for PHP バージョン 3動かしてみた

必要環境の確認
SDKのインストール
クレデンシャルの作成
は割愛

デプロイツールでよくあるEC2のRoleを元にデプロイ先のIPを取得する感じです。

```
require_once(realpath(__DIR__ ."/../vendor/autoload.php")); // 別の階層で利用するので

use Aws\Ec2\Ec2Client;

$keys = array(
		'key'	=> '**********************',
		'secret' => '*********************************',
	);
$config = array(
	'credentials' => $keys,
	'region' => 'ap-northeast-1',
	'version' => 'latest',
);

$ec2 = new Ec2Client($config);
$instances = $ec2->describeInstances(array(
	'Filters' => array(
		array(
			'Name' => 'instance-state-name','Values' => array('running'),
		),
	),
));

$role = 'app'; // 探したいRole
$hosts = array();
$reservations = $instances['Reservations'];
foreach ($reservations as $reservation) {
	$instances = $reservation['Instances'];
	foreach ($instances as $instance) {
		foreach ($instance['Tags'] as $tag) {
			if ($tag['Key'] === 'Role') {
				if ($tag['Value'] === $role) {
					$hosts[] = $instance['PrivateIpAddress'];
					break;
				}
			}
		}
	}
}

var_dump($hosts);
```
電子工作 > 51Ω抵抗 > 5本のカラーコード

オシロスコープ(Analog Discovery 2)のノイズ低減用に51Ω抵抗を購入した。

ひっかかっているのは 5本のカラーコードが以下になっていること。

緑
赤
黒
黒
金色

普通に読むと
510 * 10^0 = 510Ω
になるような気がする。

デジボルで測定しても51Ω。

何が間違っているのか。

<hr>
@ozwkさんのコメント

> 緑茶黒黒金じゃなくて
緑茶黒金だったり？

これでした。

緑茶黒金茶
で
金は 10^(-1)なので

510 * 10^(-1) = 51Ω
のようでした。

乗数がマイナスというのは今回初めてでした。

http://bake-san.com/led020.htm
[pepper]pythonのrequestで取得したJSONデータをタブレットに丸々渡す。

メモです。
python側
        import requests
        # GET通信
        res = requests.get('https://hogehoge.org/fugafuga.json)
        data = res.json()
        self.memory.raiseEvent("myapp/data", json.dumps(data).encode("utf-8"))

として渡して、受け側Javascriptで、
               $.subscribeToALMemoryEvent("myapp/data", function (data) {
                    data = JSON.parse(data);
                    console.log(data);
                });
で、OK!!
Windows ServerによるGroup Policyの適用でVPNを作成したときにDefault GatewayをVPNにする

# VPNを作ってもデフォルトゲートウェイがVPNじゃなくて意味がない

`Computer Configuration` -> `Preferences` -> `Control Panel Settings` -> `Network Options` からVPNを作成する時に、Windowsいくつかから（確実に10はおかしい)、デフォルトゲートウェイがVPNではないので対応策メモ。

# iniの書き換え

なぜかIPv6の設定だけ書き変えられるという状態で、いくらVPNの設定をいじっても変えられなかった。
よってVPN接続設定の実態であるiniファイルを書き換える。

`Computer Configuration` -> `Preferences` -> `Windows Settings` -> `ini Files`

から`New` -> `ini File`で新規設定を作り


```
File Path: C:\ProgramData\Microsoft\Network\Connections\pbk\rasphone.pbk
Section Name: VPN接続名
Property Name: IpPrioritizeRemote
Property Value: 1
```
AD2 > Link > The Analog Discovery 2 user pins are overvoltage protected. 

https://reference.digilentinc.com/analog_discovery_2:refmanual#power_supplies_and_control

6.1の最後の文章

> The Analog Discovery 2 user pins are overvoltage protected. Overvoltage (or ESD) diodes short when ...

電圧保護機能があるようだ。

> Circuit Under Test

Code Under Test は Grenningの本で見た気がする。

CUTの正式名称(long form of the abbreviation)は環境によって変わってくる。
AD2 > Link > 電流制限(USB) > 1A | 10.2 msec

https://reference.digilentinc.com/analog_discovery_2:refmanual#power_supplies_and_control

式(46)あたり

> When enabled, (in USB or Racing modes), IC21 limits the current consumed from the USB port to:

式(46)では 1A が`I_{limit}`とある。

式(47)から
`t_{fault}`は10.2 msec

> If the consumed current does not fall below Ilimit before tfaulttfault, IC21 turns off Q2A. A hot swap retry is initiated after:

1Aの電流が10.2 msec超えると上記の仕組みが動作する。
[Survey]Training deep neural networks with low precision multiplications

Deep Neural Netowrk(DNN)における、乗算器の精度に関する[論文](http://arxiv.org/pdf/1412.7024v5.pdf)

# Multiplier-Accumulators
DNNの主要なOperationは、Weightの乗算と乗算後の値の積算。下の表のH/W cost でみると乗算器の精度にH/W costが依存している。
乗算器と積算のBit幅が16, 32の時と１６，１６の時でそれほど変わらないのに対し、乗算器と積算のBit幅が32,32の時と１６，３２の時ではH/W costが大きく変化している。乗算器のBit数を減らそうという根拠。

![範囲を選択_146.png](https://qiita-image-store.s3.amazonaws.com/0/100523/107ef561-c889-78cb-901a-3499e656d7b1.png)

# Floating point
Floting Pointでは下記のようにDataを表現する。
![範囲を選択_148.png](https://qiita-image-store.s3.amazonaws.com/0/100523/a88f6295-cf56-4910-bc4b-db634d333271.png)

signは符号ビットで1bit、Exponent, MantissaはFromat毎に決まっている。各Formatとbit数の関係。
![範囲を選択_147.png](https://qiita-image-store.s3.amazonaws.com/0/100523/780b0c86-5588-648d-7b47-34748c9c460f.png)

# Fixed Point
Fixed Pointは符号付きMantissaとglobalなscaling factorに分けて考えることができ、scaling factorを全変数でshareしているFormatと考えることができる。
通常Scaling factorはshift演算で置き換えられるような値になっている。
これによりFixed Pointは、unique shared fixed exponentとみなせる。
![範囲を選択_149.png](https://qiita-image-store.s3.amazonaws.com/0/100523/72ae6f6e-4c60-36ba-bc49-6dab61a9eadd.png)

# Dynamic Fixed Point
DNNの学習では、変数に以下の特徴がある
・activations,gradients, parametersの値の範囲が異なる
・gradientsは学習中徐々に減少する

fixed point formatでは、DNNには適さない。

dynamic fixed point formatは、groupごとにscaling factorをもつ方式。
それぞれのscaling factorは初期値として持っておいて、一定頻度で更新する。
![範囲を選択_001.png](https://qiita-image-store.s3.amazonaws.com/0/100523/35222ca6-5e67-874f-2e74-0bd9fcd6c48e.png)

# Evaluation 
## Dataset
評価で使用したDataset
![範囲を選択_150.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c143af7a-5e54-1d48-e3ba-0043a5c18e32.png)

## Error Rate
![範囲を選択_151.png](https://qiita-image-store.s3.amazonaws.com/0/100523/9393f139-cb37-28bb-e98e-e1ee3af4ff38.png)


## Low Precision Results
radix point(小数点の位置）ごとのtest error率のグラフ
5bitぐらいで性能は保たれている。値の範囲が[-32,32]。
![範囲を選択_152.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ffe64c41-5f7f-4ccd-3ea0-2153f4e7b4c8.png)

Fixed Pointでは、符号ビットを含めて20bitまでは性能を維持している。
Dynamic fixed Pointでは、10bitぐらい。
**Propagation**
![範囲を選択_153.png](https://qiita-image-store.s3.amazonaws.com/0/100523/1cf1ab13-f0de-7eed-4f07-f5a344e78d37.png)
**Parameter**
![範囲を選択_154.png](https://qiita-image-store.s3.amazonaws.com/0/100523/d5be2dd0-ee5c-fb27-82c3-1f60728f37ae.png)

Overflow Rateを変えた時のError率の変化
エラー率を緩めると性能も悪くなる。
![範囲を選択_155.png](https://qiita-image-store.s3.amazonaws.com/0/100523/aa492309-18d8-f760-b534-5b88fc6c7915.png)

# 最後に
　Dynamic Fixed Pointに関しては、H/Wであればだいたい行っていること。ただしError率によってScaling Factorを変えるというのはないかも。
Scaling Factorを変更できるようにするためにそれ専用の回路になってしまうので、その分だけH/W CostがUpしそう。
　ただし、こういった知見はH/W 実装の時に重要だと思われる。
NVIDIAのGPUも16bitのFloating Pointに対応している。
ただし、16年３月時点でこれに対応しているPlatformはあまりなかったと記憶している。
underscoreコードリーディング（isArguments）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isArgumentsとは


###[underscorejs.orgのisArguments](http://underscorejs.org/#isArguments)

こんな説明。
>####_.isArguments(object) 
Returns true if object is an Arguments object.


```javascript
(function(){ return _.isArguments(arguments); })(1, 2, 3);
=> true
_.isArguments([1,2,3]);
=> false

```

------------- 
objectがArguments objectだった場合にtrueを返します。

###[underscore.isArguments](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1224)
コード的にはこのあたり。

```javascript
  // Define a fallback version of the method in browsers (ahem, IE < 9), where
  // there isn't any inspectable "Arguments" type.
  if (!_.isArguments(arguments)) {
    _.isArguments = function(obj) {
      return _.has(obj, 'callee');
    };
  }


```

_.isArguments( arguments )がfalseだった場合に、引数objを元に_.has( obj, 'callee' )の結果を返す。
(callee)[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments/callee]はarguments変数のプロパティの一つ。