OmniAICreator/Qiita-1.07M huggingface dataset:
macでC# (monoでzip)

cでzipを扱おうとして挫折した経験がある。c#では簡単！なはず、で、macでもc#ができる！？ということで初めてC#をやってみました。

* mono

以下のように、.Netの実行コンパイル環境のmonoをインストール。これでC#プログラムtest.csのコンパイル、実行ができる。

```bash:terminal
brew install mono  # インストール

mcs  test.cs  # コンパイル

mono test.exe  # 実行
```

* プログラム

> https://msdn.microsoft.com/ja-jp/library/system.io.compression.zipfile(v=vs.110).aspx

のサンプル通り、vscodeで以下のプログラム（ziptest.cs）を作成

```csharp
using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string startPath = @"/Users/xxx/srcdir";
            string zipPath = @"/Users/xxx/srcdir.zip";
            string extractPath = @"/Users/xxx/dstdir";

            ZipFile.CreateFromDirectory(startPath, zipPath);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}
```

普通に、

```
mcs  ziptest.cs  # コンパイル
mono ziptest.exe  # 実行
```

とすると、エラー。

```
ziptest.cs(18,13): error CS0103: The name `ZipFile' does not exist in the current context
```

確かにソースにはZipFileの定義なし（が、参考にしたサンプルでも定義なし）。調べると、System.IO.Compression.Filesystemがいるらしい。以下のように明示的に指定してコンパイルと、これで動いた！。

```bash:terminal
mcs -r:System.IO.Compression.Filesystem ziptest.cs
```


実際の手順では、後述するように、nugetでSystem.IO.Compressionを持ってきていたが、それはおそらく不要なのではと思われる。ただ、もし上記の-r:で指定だけではダメな場合、試しても良いかも。

# nuget (-r:System.IO.Compression.Filesystemにたどり着くまで)

まずは、System.IO.Compression.Filesystemを探せ！、nugetなるものがあるようだ、ということで、以下のようにして、System.IO.Compressionをとってきた。

```bash:terminal
brew install nuget  # nugetインストール

nuget install System.IO.Compression  # ライブラリのインストール？？

```

これでカレントディレクトリにSystem.IO.Compression.4.1.1なるファルダが作られ何かダウンロードされた。がとってきたは良いが、使い方（リンク方法）が分からない。。。どこかのシステムディレクトリに移動するのか？。とりあえずディレクトリを見るとdllがあるようなのでこれのリンクを試みる。
　mcs -L System.IO.Compression.4.1.1/lib/net46/
もダメ、
　macs -r:System.IO.Compression.4.1.1/lib/net46/System.IO.Compression.dll
もダメ。

途方に暮れていたところ、manを見ると-r:オプションは、ライブラリの
実体ではなく、名前を指定するみたいなので、-r:System.IO.Compression.Filesystemとしたら、できた。（-r:System.IO.Compressionではダメ。しかしなぜコロン）

以下備考：

- オフィシャルのnugetページ、https://dist.nuget.org/index.htmlを見ると、Mac用バイナリが見えない！？。まあbrewにあったからそこからインストール

- 明示的な必要クラス指定（-r:System.IO.Compression.Filesystem）とか、本当に毎回必要なのか？？というのは疑問。普通、インストールパスかライブラリパスに入っていれば何の指定もなく、コンパイルできるだろう。何か間違っているのか。。

- どうも最初(monoをインストールした時点で)から、System.IO.Compression.Filesystemはあった（=nugetでの追加インストールは不要だった）。なような気がする。が、不明。

- 実は40-System.IO.Compression.FileSystemが先に見つかった（が個人作成なので、これは違うと思いやめておいた、個人ソフトを動かした場合のセキュリティーも確かでないし）

- 果たしてこのexe(.Net中間フォーマット)は別環境、例えば、windowsでも動くのか。という疑問はある。
Angular2正式リリースされましたね


# 2016/09/15に正式リリース！
9月15日にAngular2正式リリースされてました。
待望のリリースですね。

[公式サイト](https://angular.io/)
[GitHub](https://github.com/angular/angular)

最近のリリース間隔を見て、10月頭くらいかなーと思ってたのでうれしい誤算です。

# バージョンアップについて
正式リリース2日前の9月13日にRC.7がリリースされてるようです。
RC.6からRC.7は破壊的変更がありますが、RC.7から正式版では破壊的変更はないようです。
RC.7を早々にバージョンアップしてた人は、簡単に正式版にできますね。

RC.6だった人もそれほど大きな変更じゃないようです。
どうもMetadataという接尾辞を持つクラスがなくなっただけのようですので、それを使ってなければ簡単にバージョンアップできるかと思います。
私も今朝、RC.6からバージョンアップしましたが、特におかしくはなりませんでした。

RC.5以前だとそれぞれのバージョンアップごとの変更点を適用する必要があるので、大変かもしれません。私もRC.5からRC.6のバージョンアップ時には結構手直しが必要でした(コンポーネントの動的読込あたりがガラッと変わったので)。

とりあえず、しばらくは破壊的変更がないとのことなのでこれ機に導入してみるのもいいのではないでしょうか？

# 参考
[Angular2 Info](https://ng2-info.github.io/2016/09/angular-2-final/)
cordovaがMinimum supported Gradle version is 2.xxとエラーになるとき

こんな感じのエラー

```shell-session
Minimum supported Gradle version is 2.14.1. Current version is 2.13. If using the gradle wrapper
```

# 解決方法

[ptコマンド](https://github.com/monochromegane/the_platinum_searcher/releases)で、バージョン番号をもとに検索して、発見した。

以下を指定して解決

```txt
set CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=http://services.gradle.org/distributions/gradle-2.14.1-all.zip
```

たまたまWindows10で試していたが、他の環境でも環境変数「CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL」に怒られないバージョンのGradleのURLを指定すれば大丈夫そう。
技術英語 > A single loop usually has [three cases of interest].

@ Code Complete (No. 12708 / 36077)

> A single loop usually has <font color=red+three cases of interest</font>.

http://ejje.weblio.jp/content/of+interest
> 興味ある, 興味深い, 対象の, 目的の, 着目した

意訳「...興味深い(着目すべき)3つのケースがある」
rpmbuild/centos5 の使い方

## 参考

* [https://hub.docker.com/r/rpmbuild/centos5/](https://hub.docker.com/r/rpmbuild/centos5/)

## 準備

* [tenshi](http://qiita.com/tukiyo3/items/916b3308d035973db700)のrpmをビルドしてみる。

```bash:ファイル構成
./rpm/tenshi-0.15.tar.gz
./srv/pkg
```

* ./srv/pkg には実行権限を付けておくこと。

```bash:srv/pkg
cd /srv
tar xzf /home/builder/rpm/tenshi-0.15.tar.gz 
cd tenshi-0.15
sudo rpmbuild -bb tenshi.redhat-spec
```

```bash:run.sh
docker run -it \
  -v `pwd`/srv/:/srv/ \
  -v `pwd`/rpm/:/home/builder/rpm/ \
  rpmbuild/centos5:latest
```

* ./rpm/x86_64/tenshi-0.15-1.x86_64.rpm が出来ていることを確認。

## i386版の作成方法

```diff:srv/pkg
- sudo rpmbuild -bb tenshi.redhat-spec
+ sudo rpmbuild --target=i386 -bb tenshi.redhat-spec
```

* ./rpm/i386/tenshi-0.15-1.i386.rpm が生成される

## noarch版の作成方法

```diff:srv/pkg
- sudo rpmbuild -bb tenshi.redhat-spec
+ sudo rpmbuild --target=noarch -bb tenshi.redhat-spec
```

* ./rpm/noarch/tenshi-0.15-1.noarch.rpm が生成される

## 今回使用したファイル

* [tukiyo/rpmbuild-tenshi: centos5](https://github.com/tukiyo/rpmbuild-tenshi)
PCRE の u オプションや intl の grapheme 関数は不正なバイト列を扱うことができない


概要
----

PCRE の u (PCRE_UTF8) オプションは mbstring、iconv、intl 拡張モジュールがインストールされていない環境のためのフォールバックライブラリで活用されています (例: Symfony の Polyfill コンポーネント)。u オプションを使う上の課題は不正なバイト列を扱うことができないことです。PCRE の関数は不正なバイト列を引数にとると false を返します。grapheme 関数も不正なバイト列を扱うことはできません。

UTF-8 の文字列に対して1バイト単位しか扱えない関数を間違って使ったり、文字を壊すバグをもつ関数を使ったサーバーやデータベースから不正なバイト列を受け取る場合を想定するのであれば、不正なバイト列であるかをチェックして、受け取ることを拒否するか、不正なバイト列を無害な代替文字に置き換えることを考える必要があります。


不正なバイト列を削除する方法の問題
----------------------------

iconv の場合、不正なバイト列を削除するオプション (IGNORE) が存在しますが、セキュリティチェックをすり抜けるために悪用される可能性がありますので、無害な代替文字に置き換える方法のほうが望ましいことが Unicode のセキュリティのドキュメントで述べられています (例: `dan\x80ger_code` -> `danger_code`)。

不正なバイト列を含む文字列の数え方
----------------------------

Unicode の仕様で不正なバイト列を含む文字列の数え方が示されています。くわしくは[こちら](http://qiita.com/masakielastic/items/432b774569b44f959b1c)の記事をご参照ください。

コードによる再現
-------------

まず正常な文字列の長さを求めてみましょう。

```php
$str = "あいうえお";

var_dump(
    5 === mb_strlen($str, 'UTF-8'),
    5 === preg_match_all('/./su', $str),
    5 === grapheme_strlen($str)
);
```

次に不正なバイト列を含む文字列の長さを求めてみましょう。

```php
$str2 = "あい\x80うえお";

var_dump(
    6 === mb_strlen($str2, 'UTF-8'),
    false === preg_match_all('/./su', $str2),
    NULL === grapheme_strlen($str2)
);
```

対策
---

不正なバイト列を置き換える手段として、`mb_convert_encoding`、`mb_scrub` (PHP 7.2 開発版)、`UConverter::transcode`、｀htmlspecialchars｀ があります。

```php
mb_substitute_character(0xfffd);

$str = "あい\x80うえお";

var_dump(
    "あい\u{fffd}うえお" === mb_convert_encoding($str, 'UTF-8'),
    // "あい\u{fffd}うえお" === mb_scrub($str),
    "あい\u{fffd}うえお" === UConverter::transcode($str, 'UTF-8', 'UTF-8'),
    "あい\u{fffd}うえお" === htmlspecialchars_decode(htmlspecialchars($str, ENT_SUBSTITUTE))
);
```

代替文字であれば、PCRE や grapheme 関数で扱うことができます。

```php
$str = "あい\u{fffd}うえお";

var_dump(
    6 === mb_strlen($str, 'UTF-8'),
    6 === preg_match_all('/./su', $str),
    6 === grapheme_strlen($str)
);
```

PCRE 関数の正規表現を使って置き換えることもできますが、正規表現のパターンのコードが長くなるので、パフォーマンスの点で見劣りします。コードの例は stackoverflow の[回答](http://stackoverflow.com/a/13695364/531320)をご参照ください。
MacでPasori(RC-380S)を利用しFeliCaを読む


Macをはじめ、UNIXでFeliCaを読み取る場合、Pythonで[nfcpy](http://nfcpy.readthedocs.io/en/latest/overview.html)を使うのが楽ですね。
2.6x以上で3.xには対応していないようです。Macには最初から2.7.xが入っているようです。

##下準備

###必要なツール

とりあえずHomebrewとpipのインストールがまだの人はインストールお願いします。
Homebrewに関しては本家のスクリプトをコピー。pipについては、

```bash
curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python
```
などとします。

###OpenSSL問題
普通にインストールするとOpenSSLに起因したエラーがでます。どうやらOpenSSLのバージョンが古いとダメなようです。これに対し、2016年8月頃までは、

```bash
brew install openssl
brew link openssl --force
```

>既にインストールされてる場合はbrew upgrade openssl

として、Macにプリインストールされたopensslを強制的にbrewのものにすることで問題が解決できたのですが、最近 --forceでの強制リンクができなくなったようで、手動でリンクを作成する必要があるようです。

私の場合、下記のようにopensslインストール後、必要なシンボリックリンクを作成することで対応しました。nfcpyにかぎらず、OpenSSLが古い問題はこれで解決できるかと。

```bash
brew install openssl

ln -s /usr/local/opt/openssl/bin/openssl /usr/local/bin/openssl
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/libcrypto.dylib
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/libssl.dylib
```

>これを行わないと、AttributeError: dlsym(0x7f8328411ff0, EC_KEY_set_public_key_affine_coordinates): symbol not foundというようなエラーが出ます。

###Pasoriを認識させる

読取り装置であるPasoriを認識させるために幾つかのライブラリをインストールします。

```bash
$ brew install libusb
$ brew install libusb-compat

$ sudo pip install pyusb
$ sudo pip install libusb1
$ sudo pip install pyserial
```

##nfcpyの取得とサンプルの実行

nfcpyはBazzar（gitみたいなバージョン管理ツール）経由かpip経由で取得できるようです。
ここではBazzarをインストールし、取得します。

```bash
#Bazzarのインストール
brew install bzr
#Bazzarを利用してnfcpyを取得（gitでいうclone）
bzr branch lp:nfcpy
```
とするとnfcpyフォルダができます。その下にあるexamples/tagtool.pyというIDm等を読み取るサンプルを実行してみます。

```bash
cd nfcpy
python examples/tagtool.py show
```

すると、

```bash
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:253:006
** waiting for a tag **
Type4ATag MIU=255 FWT=0.038664
```

こんな感じになりました。おサイフケータイはNFC Type4 Tagとして認識されるようです。
Source treeの古いバージョンのダウンロード

Source Treeの新しいバージョンのUIがどうにも使いにくい。。。という方は、
古いバージョンをダウンロードできます。

**Mac**
http://downloads.atlassian.com/software/sourcetree/SourceTree_2.0.0.dmg

**Windows**
https://downloads.atlassian.com/software/sourcetree/windows/SourceTreeSetup_1.7.0.32509.exe
iOS10 Safari document.fonts バグ

# Promise.all が突然とまった

Promise.allにスタックした以下のPromiseがありました
[FYI]
- [Can I use CSS Font Loading](http://caniuse.com/#feat=font-loading)
- [What's New in Safari](https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html)

```document.fontsを知ってるor知らないブラウザ.js
funcion loadDocumentFonts() {
  return new Promise((resolve, reject) => {
    if(document.fonts === undefined) return reject(); // え？ document.fonts？ 知らないよ、帰ります
    document.fonts.addEventListener('loading',()=> { console.log('now loading') }); // 始めまーす
    document.fonts.addEventListener('loadingerror', reject); // 失敗したので、帰りますすみません
    document.fonts.addEventListener('loadingdone', resolve); // ロード終わったよ、どうぞー
  })
}
```

```ios10_safari.js
funcion loadDocumentFonts() {
  return new Promise((resolve, reject) => {
    if(document.fonts === undefined) return reject(); // え？ document.fonts？ え、も、もちろん知ってるよ！
    document.fonts.addEventListener('loading',()=> { console.log('now loading') }); // ...
    document.fonts.addEventListener('loadingerror', reject); // ...
    document.fonts.addEventListener('loadingdone', resolve); // ...
     // ...え？
  })
}
```

### > 約束をすっぽかされたの巻  (´・ω・｀) <
秋到来! NanoRT で始めよう双方向パストレーシング

秋到来! 芸術の秋ですね! 漢なら双方向パストレーシングやりたいですね!

やりましょう!

優秀な若人が人類史上最速(約 6 日)で NanoRT に双方向パストレーシングを実装してくれました！

https://github.com/lighttransport/nanort/tree/master/examples/bidir_path_tracer

![render_bidir_1000_8_bounces.png](https://qiita-image-store.s3.amazonaws.com/0/36275/2d9a2d47-41bc-0a5a-525f-3cdad3e49af9.png)

素晴らしいですね, 優秀な若人のありがたいコードで秋の夜長の学習にぴったりですね!

## りろんは知ってる

復習しようね!

* http://www.graphics.cornell.edu/~eric/Portugal.html
* http://graphics.stanford.edu/papers/veach_thesis/

**Google を救った**伝説の人物 Eric Veach と, Eric Lafortune が同時期に発案したんだよ!


## TODO

* パストレと結果が違う(輝度の差がある)原因を突き止める(同じく優秀な若人さまに作成いただいた nanogi と比較してみる https://github.com/lighttransport/nanogi )
* 輝点を suppress する(singularity?)
* **優秀な若人が双方向パストレーシングを極め, 若人に伝授していくことにより, 世界人類全てが双方向パストレーシングを日々切磋琢磨し極めてくれるスキームを確立したい**
通信規制（検閲）のある海外で、SOCKSプロキシ経由でブラウジング

# Googleが使えないので、どうにかしよう
旅行や学会などで、通信規制のある国へ行くとGoogleやFacebook、Twitterなど、日常使っているサイトへアクセスできません。
これをsshでポート転送し、SOCKSプロキシを用いることで回避します。
エンジニアならsshコマンドが使えるし、何かssh接続できるサーバーも持っているだろうという前提です。

「知ってる人は知っている、知らない人は覚えてね」くらいのTipsだと思います。
sshポートがファイアウォールで規制されていた場合は使えない方法です。

# 方法

単純です。

```shell-session
# 方法１：ポート転送し、ログイン
ssh -D 1080 user@servername.xxx.jp
# 方法２：バックグラウンドで実行し、シェルを開かない
ssh -f -N -D 1080 user@servername.xxx.jp
```

あとはブラウザやシステムのインターネット設定で、SOCKS5プロキシを設定します。
ホストはlocalhostで、ポートは1080です。

.ssh/configにsshの設定を書くと楽です。

```shell-session
Host humidai
  User user
  ForwardAgent yes
  DynamicForward 1080
  ...
```

これを書いておくと、以下のコマンドでOKになります。

```
ssh humidai
```

Windowsマシンなどでも、Teratermなどでポート転送をすると大丈夫だと思います。

sshでポート転送していて、なおかつサービスはhttps接続なので、勝手に安全だと思っています。
これは少し調べてみます。

# 参考にしたサイト
[ssh経由のSOCKSプロキシを通じてMac上のGoogle Chromeでブラウジング](http://blog.wktk.co.jp/ja/entry/2014/03/11/ssh-socks-proxy-mac-chrome)
[[linux]SSH経由でブラウジングする方法](http://d.hatena.ne.jp/phyten/20100709/1278693891)
[セキュリティ高めSSH経由でブラウジングする方法](http://news.mynavi.jp/news/2010/03/30/009/)
UTF-8 な CSV を Excel が読めるように先頭 BOM をつけるシェルスクリプト

# こんな感じのを用意した。

超単純

```bash
#!/usr/bin/env bash
printf '\xef\xbb\xbf'
exec cat
```

なんとなく bomber というファイル名にして実行可能にし、パスを通した。

```console
$ cat > ~/.bin/bomber << 'EOF'
#!/usr/bin/env bash
printf '\xef\xbb\xbf'
exec cat
EOF
$ chmod +x ~/.bin/bomber
```

# 使い方

ごく単純。

```console
$ bomber < example.before.utf8.csv > example.after.utf8.csv
```

# 背景

(日本語環境の) Excel は BOM がなければ CP932 エンコーディングで CSV ファイルを読もうとする。
BOM アリだとちゃんと判別できる。
親切なブラウザのように、勝手に判定してはくれない。

[Wikipedia: バイトオーダーマーク](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF)

# 注意

はっきりとしたバージョンはわからないが Excel 2007 などの古い Excel 環境では、この方法でも文字化けせずに開く事はできない。
LaravelでLIKE BINARYを使う

# `@abandoned` この記事は役目を終えました

Laravel は 5.0 から、LIKE BINARY というオペレータをサポートしているので、普通に使えます。ありがとうございました！

```php
>>> Specie::where('fulltextindex','like','%ベンケイソウ%')->first()->fulltextindex
=> "ベンケイソウ科 コチレドン"

>>> Specie::where('fulltextindex','like','%ぺンケイソウ%')->first()->fulltextindex
=> "ベンケイソウ科 コチレドン" // [ペ]なのに[べ]にヒットする

>>> Specie::where('fulltextindex','like binary','%ベンケイソウ%')->first()->fulltextindex
=> "ベンケイソウ科 コチレドン"

>>> Specie::where('fulltextindex','like binary','%ぺンケイソウ%')->first()->fulltextindex
PHP error:  Trying to get property 'fulltextindex' of non-object on line 1
```

以下は、古いのでスルーでお願いします。

# サポートしていません

MySQLのLIKEで、濁点などのあいまい検索を適用せずに、厳密に一致させるときに使える `LIKE BINARY` ですが、

```php
$user->where('name','like binary','%よしだ%');
```
としたいところですが、どうもサポートしていません。

## 解決策１. whereRaw を使う

困ったときの生SQL。

```php
$user->whereRaw('name like binary \'%よしだ%\' ');
```

## 解決策２. サポートさせてしまう

http://git.foo.mobi/laravel/framework/commit/76f6da4dab1e9e4847362a2b2b0c428e25805f0c
コチラを参考に。
Laravelのソースコードを書き換えます。

```php:src/Illuminate/Database/Query/Builder.php
class Builder {
	...
 	protected $operators = array(
 		'=', '<', '>', '<=', '>=', '<>', '!=',
		'like', 
		'like binary', // ←この行を追加 
		'not like', 'between', 'ilike',
 		'&', '|', '^', '<<', '>>',
 		'rlike', 'regexp', 'not regexp', 
 		'~', '~*', '!~', '!~*', 'similar to',
```

元のソースコードを書き換えるとバージョンアップなどにうまく対応できなさそうで、ちょっと勇気いります……。
サクラエディタでPowerShellコマンドを実行し、入力補助機能として使用するための3行マクロ

# 概要
サクラエディタで選択中の文字列をPowerShellのコマンドとして読み取り、結果値に置換します。

# 実装

```js:invoke-expression.js
//PowerShellコマンドを実行し結果を出力
Editor.ExecCommand('powershell -command "' + Editor.GetSelectedString(0) + '"', 3);

//余分な改行を削除
Editor.Right(0);
Editor.DeleteBack(0);
```

# 使用方法
１．invoke-expression.jsをサクラエディタのマクロに登録する
※詳細は[サクラエディタでマクロの登録](http://mashiki-memo.blogspot.jp/2010/07/blog-post.html)を参照

２．サクラエディタにて実行したいPowerShellコマンドを選択し、invoke-expression.jsを実行する

# 活用例
### １．簡易電卓

```text:実行前
1 + 2
```

```text:実行後
3
```

### ２．文字列生成マクロ

```text:実行前
'X'*10
```

```text:実行後
XXXXXXXXXX
```

### ３．連番マクロ（基本）

```text:実行前
1..10
```

```text:実行後
1
2
3
4
5
6
7
8
9
10
```

### ４．連番マクロ（応用）

```text:実行前
1..10 | %{$_.ToString('00') + ':'}
```

```text:実行後
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
```

### ５．文字列置換

```text:実行前
'2016年9月16日'.Replace('年','/').Replace('月','/').Replace('日','')
```

```text:実行後
2016/9/16
```

### ６．テキストファイル読込

```text:sample.txt
@echo off
@echo on
set <Name>=<Value>
set /a <Name>=<Formula>
for /f "tokens=*" %%a in('<Command>') do set <Name>=%%a
powershell -ExecutionPolicy RemoteSigned -File <Path>
```
上記ファイルがC:\workに配置されているとして

```text:実行前
type C:\work\sample.txt | ?{$_ -like 'set*'}
```

```text:実行後
set <Name>=<Value>
set /a <Name>=<Formula>
```

# まとめ
PowerShellは、一般にはサーバ管理用の言語というイメージが強いと思いますが、ある程度慣れれば日常業務でも本当に便利に活用できるのでおすすめです。
Haskellで素数

素数ってどうやるんだっけ?
思い出しながら、100までの素数のリストを計算してみました。


```Haskell
primes :: Int -> [Int]
primes 2 = [ 2 ]
primes n =   primes (n - 1) ++ isPrime n
  where
    
    isPrime :: Int -> [Int]
    isPrime 3 = [ 3 ]
    isPrime n
      | even n      = [ ]
      | notPrime n  = [ ]
      | otherwise   = [ n ]
   
    notPrime :: Int -> Bool
    notPrime n = 
      elem 0 . map (mod n ) . tail .  primes . floor . sqrt . fromIntegral $ n
        
main = print $ primes 100

```


実行結果

```Haskell
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
```

primesは素数のリスト。
nを素数かどうか判定して、n-1までのリストと結合します。

isPrimeは素数判定。
n が 偶数か、素数でないものなら [ ] 、
そうでなければ [ n ] を返します。

notPrimeは素数でないかどうか。
奇数 n の平方根以下の素数(2を除く)で割って、割り切れたらTrue、そうでなければFalse。
2で割る、というのが偶数判定とかぶるので tailで取りました。

primesからもisPrimeを呼んでるし、isPrimeからもprimesを呼んでるしで何かエラー出たら面倒だなと思ってたんだけど、何ごともなく動いてちょっと感動。

あるかないかわからないものを簡単に足すために ++ を使ってみました。
でも足す中味が一個なのでちょっとおもしろくないかな?

もっといい方法があればご教示ください。
##追記
コメントで教えていただいた記事を勉強してみましたメモ。
[99 Haskell Problems より、[31] でもその前に](http://qiita.com/bra_cat_ket/items/6a99a9b01682886607d0)
[Haskell で「素数列」をつくる。](http://qiita.com/little_Haskeller/items/614a3ae20a517c19bb1f)
最新(修正)版を引用。

```Haskell:primes.hs
--
-- 素数列（修正版）
--
-- http://d.hatena.ne.jp/notogawa/20110114/1295006865 を参考に
-- gcd の使い方が秀逸
--
primes :: Integral a => [a]
primes = map fromIntegral $ [2, 3] ++ primes'
    where
      primes' = [5] ++ f 1 7 primes'
      f m s (p : ps) = [n | n <- ns, gcd m n == 1] ++ f (m * p) (p * p) ps
          where ns = [x + y | x <- [s, s + 6 .. p * p - 2], y <- [0, 4]]
```
　
まだ全貌は理解できていませんが、わかったことなど。
### 有限でなく、無限リスト

小さい方から、ちょっとずつ(なにかの二乗まで?)計算して,さらにその先を再帰的に追加している。

###効率よく
6n+1とか、ん?と思ったが、なるほど。
要するに、あらかじめ 2 と 3 の倍数を除いたリストを直接、生成している。

すべての素数で割ってみるのと、すべての素数をかけたものと最大公約数をとってみるのと同じ。
しかもコストが安い。
UWP+Prismでナビゲーションが効かない（初歩的な）問題

# 引っかかったところ
　UWPとPrismを使ってアプリを作ろうとしたけど、最低限のコードを動かそうとしても、MainPage.xmlのところまで飛ばずにナビゲーションが失敗してしまう（例外が投げられる）現象に遭遇した。

## コード
```csharp:App.xaml.cs
    protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
    {
        //ここで失敗する
        NavigationService.Navigate("Main", null);
        
        return Task.FromResult<object>(null);
    }
```

## 遭遇する現象
```csharp:App.g.i.cs
//ここでブレークする
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
```

### 例外の内容
{"The page name Main does not have an associated type in namespace [プロジェクト名].Views\r\nParameter name: pageToken"}	System.ArgumentException


# 解決方法
 ナビゲートするView（ここではMainPage.xml）はViews名前空間下にないといけないらしい。

```xml:MainPage.xaml
<Page
    x:Class="SosowaReader.Views.MainPage"
    <!--略-->
/>
```

## 追記
[書いてあった。](http://qiita.com/kiichi54321/items/7b7a7b0caa2f09ba4147#prism%E3%81%AE%E5%90%8D%E5%89%8D%E8%A6%8F%E5%89%87)
Python:文字列の結合とか

動作環境
・Windows10
・Python2.7

#文字列の扱い方
文字列連結は+で連結していたのですが、それだと速度に影響したりメモリをたくさん使ってしまうと聞いたのでいい方法はないかと思い、検索してみました。

##リストに格納してから文字列に連結
```Test1.py
# -*- conding: utf-8 -*-

class Test():

    def __init__(self):
        # 文字列を格納するためのリストを作成
        self.testList = []

    def main(self):
        self.testList.append("abc")
        self.testList.append("def")

        # 半角スペースでリストないの要素を連結する
        self.testStr = " ".join(self.testList)

        print self.testStr

if __name__ == '__main__':
    test = Test()
    test.main()
```

```Test1.pyの出力
abc def
```

このやり方が速くていいらしいです！
javaだと、StringBuilderがあるのですが似たような感じですね
### 追記（2016/10/14）
@_ha1f さんからのコメントの方法をやってみました！

```Test2.py
# -*- conding: utf-8 -*-

if __name__ == '__main__':
    print "{} {}".format("abc", "def")

    print u"{} {}".format(u"あいう", u"えおか")
```

```Test2.pyの出力
abc def
あいう えおか
```

変数名についても、Listやstrではないものに変更させていただきました。

参考サイト
[HDEラボ](http://lab.hde.co.jp/2009/02/python-1.html)
[超言理論](http://blog.maqua.tech/entry/2014/01/27/164155)
9/16　今日の学習内容〜レイアウトテンプレートについて学習②〜

###今日の学習内容
***
今日も昨日に引き続き、**レイアウトテンプレート**について学習していきました( ´ ▽ ` )ﾉ

####レイアウトテンプレートの切り替え
***
コントローラごとやアクションごとにレイアウトテンプレートを切り替えて、一つのウェブサイトで複数のデザインを使うことができます。

レイアウトテンプレートを指定する方法は3つあるようです。(・ω・)ノ

#####ファイル名が``コントローラー名.html.erb``のファイルを置く
***
ファイル名が``コントローラー名.html.erb``のファイルを``app/views/layouts``フォルダに置くという方法が一つ目ですね(￣▽￣)

そのテンプレートが、コントローラ名の場所に入れたコントローラのテンプレートになります。

``app/views/layouts``フォルダの場所については下の画像を参考にしてください。

![スクリーンショット 2016-09-16 22.53.36.png](https://qiita-image-store.s3.amazonaws.com/0/137880/ebabdbd9-ed22-3a80-e38a-e112872fe1a9.png)

#####コントローラで``layout``メソッドを利用する
***
コントローラで``layout``メソッドを利用することが、二つ目の方法です。

例えとして、``TopController``のレイアウトテンプレート`に``sample.html.erb``を使いたいときの場合を説明したいと思います(・ω・)ノ

まず、``sample.html.erb``を``app/views/layouts``フォルダに作成しておきます。

次に、``top_controller``に

```ruby:top_controller.rb
layout "sample"
```
を書き足します。

引数に入るのは、上の画像のように拡張子を除いた名前になります(・ω・)ノ
ちなみに、シンボルではなく、文字列にする必要があるようです。

#####アクション内で``render``メソッドにオプションをつける
***
最後に三つ目の方法です。

アクション内で``render``メソッドに``layout``オプションをつけることで指定することができます。

例として、``sample``アクションを作って指定してみたいと思います。↓

```ruby:sampleアクション
def sample
   if "何らかのエラーが発生"
      render layout: "Error!"
   end
end
```

このように、ある条件の時にだけレイアウトを切り替えられます( ´ ▽ ` )ﾉ
便利ですね(￣▽￣)

なお、レイアウトテンプレートを使わずに、アクション用のテンプレートをHTML全体にしたい場合は、``render layout: false``とするそうです。

こんなことまで書かれている[改定基礎3版RubyOnRails](https://www.amazon.co.jp/dp/4844338153)は親切だな、としみじみ思いますね(￣▽￣)

###あとがき
***
今日も[改定基礎3版RubyOnRails](https://www.amazon.co.jp/dp/4844338153)で学習していったわけですが、細かいところまで書かれていてわかりやすい、と改めて感じましたね(*^^*)
お世話になってますm(__)m

明日は、時間があれば**部分テンプレート**の学習に進んでいこうと思います。

ここまで読んでくださり、ありがとうございましたm(__)m
###参考にさせていただいたサイト・文献
***
- [改定基礎3版RubyOnRails](https://www.amazon.co.jp/dp/4844338153)
- [cloud9](https://ide.c9.io/)
MPU9250にArduinoからSPIで接続する方法



```mpu9250_spi.ino

#include <SPI.h>

//チップセレクトピンに10を使用
#define CS 10

void setup() {
  Serial.begin(115200);

  SPI.begin();

　　　　/* MPU9250のSPIでのRead/Writeは1MHz。 */
  SPI.setClockDivider(SPI_CLOCK_DIV16);

  /* この二つの設定があまり理解できてない... */
  SPI.setBitOrder(MSBFIRST);//SPIバスの入出力に使用するビットオーダー(LSBFIRST or MSBFIRST)
  SPI.setDataMode(SPI_MODE0);//SPIの転送モード

  /* チップセレクトピンをアウトプットに設定 */
  pinMode(CS, OUTPUT);

}

uint8_t readByte(uint8_t regAddr) {
  uint8_t data;;
  digitalWrite(CS, LOW);
  SPI.transfer(regAddr | 0x80);
  data = SPI.transfer(0x00);
  digitalWrite(CS, HIGH);
  return data;
}

void writeByte(uint8_t regAddr, uint8_t value) {
  digitalWrite(CS, LOW);
  SPI.transfer(regAddr | 0x80);
  SPI.transfer(value);
  digitalWrite(CS, HIGH);
}

```

0x75(WHO_AM_I)を読んで0x71が読めれば正常。
あとは0x6Bに0x00、0x37に0x02を書き込む。
この状態で0x3Bからの14バイトに加速度 X,Y,Z, ジャイロ X,Y,Z のデータが出力される。

9250にはDMP (Digital Motion Processor) という補正済みのデータ出力してくれる機能がついている。6050でDMPを使用しているサンプルはたくさんあるけど9250でDMPを使ってるサンプルが見つけられない...。6050のサンプルを読みつつ9250でのDMPの使い方を模索中...
AWS apacheのログを毎日自動的にS3に保存

amazon linuxでapacheのログを圧縮してs3に送ったのでメモ
インスタンスに残っているログで一週間すぎたものは自動的に削除される


#goofysでS3をマウントする
マウントの仕方は[過去の記事](http://qiita.com/mint/items/20f77d81726eecba6a22#iam%E3%81%AE%E8%A8%AD%E5%AE%9A)から
（自分はrootのホームディレクトリに`logs_s3`という名前でマウントした。）

#シェルスクリプトを作る

```
$sudo su 
#cd ~
#vi logs_s3_apache.sh
```

```text:logs_s3_apache.sh
#!/bin/bash
TODAY=`date +"%Y%m%d"`
HOST_NAME=hostname
DIR=`date +"%Y"`/`date +"%m"`/`date +"%d"`

 mkdir -p /root/logs_s3/logs/apache_log/$DIR/$HOST_NAME 2>/dev/null
 cp /var/log/httpd/access_log-$TODAY  /root/logs_s3/logs/apache_log/$DIR/$HOST_NAME/access_log 2>/dev/null
 cp /var/log/httpd/error_log-$TODAY  /root/logs_s3/logs/apache_log/$DIR/$HOST_NAME/error_log 2>/dev/null
 gzip /root/logs_s3/logs/apache_log/$DIR/$HOST_NAME/*
```
マウントしたS3にディレクトリを作って、アクセスログとエラーログをS3にコピーし、圧縮している処理です。


実行権限を与える
`#chmod u+x logs_s3_apache.sh`

#自動で実行させるためlogrotateを使用

```
#vi /etc/logrotate.d/httpd
```

```:httpd
/var/log/httpd/*log {
    daily
    missingok
    rotate 7
    notifempty
    delaycompress
    compress
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
        /root/logs_s3_apache.sh
    endscript
}
```

きちんとS3に保存されていて、サーバーには一週間過ぎたログは自動的に削除してくれました。
slack chat bot コンテスト(the serverless chatbot competition)

#このハッカソンのこと
英語
https://awschatbot.devpost.com/
日本語
https://aws.amazon.com/jp/blogs/news/enter-the-aws-serverless-chatbot-competition/

#サンプルでハマるとこ
サンプルコードはこちら
https://github.com/awslabs/aws-serverless-chatbot-sample

この手順通りにしてもlambdaのroleにlambda:getFunctionの権限が不足していると動きません。
このエラーはcloudwatchのログにもダッシュボードのエラーにも現れないのでハマります。
lambdaのデフォルトに従って、[create from template]でroleを作ってもこの権限は入ってないです。

とりあえずroleにAWSLambdaFullAccessのポリシー(lambda:*が含まれる)を与えてやっとけば大丈夫です。

#他にも
###apigateway+lambda+searchconsoleの例
http://qiita.com/horike37/items/3e37ff6416f6cf2a7934
###


#一番の難関は
このハッカソンは審査が英語。
使い方やテストの仕方のドキュメントは英語で書く必要がある。
あと動画も撮って送らないといけない。
ここが僕にとってこのハッカソンの一番の障壁です。
socket.io-php-emitter で PHP から emit する方法

動かすには Redis と PHP の Redis ライブラリが必要です。

## 使用したバージョン

- PHP 7.0.10
- Redis 3.2.3
- Node.js 4.3.2
- npm 2.14.12

## サンプルソース

### server/package.json

```
{
  "name": "sample-server",
  "main": "index.js",
  "dependencies": {
    "express": "^4.10.2",
    "socket.io": "^1.4.8",
    "socket.io-redis": "^1.0.0"
  },
  "devDependencies": {
    "nodemon": "^1.9.1"
  }
}
```

### server/index.js

```js
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var redis = require('socket.io-redis');
var adapter = io.adapter(redis({ host: '127.0.0.1', port: 6379 }));

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

http.listen(3000, function(){
  console.log('listening on *:3000');
});
```

### server/index.html


```html
<script src="https://cdn.socket.io/socket.io-1.4.8.js"></script>
<script>
  var socket = io.connect('http://localhost:3000/');
  
  socket.on('update', function(socket){
    console.log('received emit!');
  });
</script>

```

### php-emitter/composer.json

```
{
    "name": "sample-client",
    "type": "project",
    "require": {
        "ashiina/socket.io-emitter": "^0.8.0"
    }
}
```

2016年09月16日現在、`rase/socket.io-emitter` には互換性の問題があり動作しないため、代わりに有志の方が公開した修正版の `ashiina/socket.io-emitter` を使用しています。詳細は [socket.io-php-emitter 0.7.0が動作しない問題](http://sousaku-memo.net/php-system/1590) の記事を参照してください。

### php-emitter/src/client.php

```php
<?php
require_once('../vendor/autoload.php');

$redis = new \Redis();
$redis->connect('127.0.0.1', '6379');

$emitter = new SocketIO\Emitter($redis);
$emitter->emit('update', 'data'));
```

### 確認方法

以下のコマンドで node サーバを起動した状態で、ブラウザで index.html (http://localhost:3000/) を表示しておきます。

```bash
node index.js 
```

その状態で client.php を実行してコンソールに `received emit!` と表示されれば疎通成功です。🎉

## 疎通確認時のデバッグに便利な方法

最初試したときに中々繋がらなくて苦労したので、役に立ったデバッグ方法を書いておきます。

### 1. サーバのデバッグモードの有効化

デバッグモードを有効にして node サーバを起動しておくと emit 時に詳細な情報が流れます。

```bash
DEBUG=* node index.js
```

### 2. Redis のモニタリング

Redis を介して emit するため、Redis のコンソールで `monitor` コマンドを実行しておくと実際の通信内容 (msgpack) の文字列を確認できます。
ggplot2で日本語フォントを指定したい

## Q

ggplot2で日本語のフォントを指定したいです。


## A

基本は`theme()`レイヤーでフォントを設定したい部分を指定しながら設定していきます。ただ、**ggplot2の古いバージョンによってはうまく動かない**可能性があります。ここでは`v2.1.0`以降を念頭に説明します。

指定するフォントを先に変数に入れておきます。今回のコードではこのフォント名を差し替えてもらえればいいかと思います:


```r
font_A <- "IPAMincho"
font_B <- "IPAGothic"
```

なお、フォント名については、各実行環境で様々なので省略します。

### テーマとして日本語のフォントを指定する

そのプロット全体にテーマフォントとしてフォント指定する場合は、`theme(text = element_text("FontName"))とフォントを指定すればOKです:


```r
library(ggplot2)

d <- data.frame(X=rep(1:5, 2), Y=c(1:5, 5:1), A=rep(c('a','b'), each=5))

ggplot(data=d, aes(x=X, y=Y, group=A, color=A)) +
  geom_line(size=2) +
  labs(x="えっくす", y="わい", color="えー", title="たいとる") + 
  theme(text = element_text(family = font_A))
```

![unnamed-chunk-2-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/c5f7e32c-47e8-4630-65a7-a5c8ee313f44.png)

この`element_text()`関数の第一引数は`family=`なので、いきなりフォント名を当ててもOKです。詳しくは`?elemet_text`でヘルプを確認してください。

### 個別にフォント指定

個別に設定する場合は、`theme()`内の引数にaes属性を指定して`element_text()`を渡します:


```r
ggplot(data=d, aes(x=X, y=Y, group=A, color=A)) +
  geom_line(size=2) +
  labs(x="えっくす", y="わい", color="えー", title="たいとる") + 
  theme(text = element_text(family = font_A), 
        axis.title.x = element_text(family = font_B))
```

![unnamed-chunk-3-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/cc9e5f3f-3923-7216-ae2b-a104d5c566c4.png)

上の例では、全体設定でfontA(IPAMincho)を設定し、x軸のタイトルを個別にfontB(IPAGothic)に設定しています。どの属性にどの属性に与えるかは、以下のリンクにある公式ドキュメントを参照してください:

http://docs.ggplot2.org/current/theme.html

このリンク先で、`element_text`が設定できる要素について設定できます。主なものを記述した例です:


```r
ggplot(data=d, aes(x=X, y=Y, group=A, color=A))+
  geom_line(size=2) +
  labs(x="えっくす", y="わい", color="えー", title="たいとる") + 
  theme(text = element_text(family = font_A),  #全体設定
        title = element_text(family = font_B),  #プロット、軸、凡例のタイトル全体設定
        axis.title = element_text(family = font_A),  #軸タイトルの全体設定
        axis.title.x = element_text(family = font_B),  #x軸のタイトル設定
        axis.text = element_text(family = font_A),  #軸テキスト(目盛りなど)の全体設定
        axis.text.y = element_text(family = font_B),  #y軸テキストの設定
        legend.text = element_text(family = font_A),  #凡例テキストの設定
        legend.title = element_text(family = font_B),  #凡例タイトルの設定
        plot.title = element_text(family = font_A)  #プロットタイトルの設定
        ) 
```

![unnamed-chunk-4-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/910523d6-2d1d-1d29-8cd4-4bc7b99ffa93.png)


## 参考資料

- http://qiita.com/uri/items/615653e83642d7e475de
- http://docs.ggplot2.org/current/theme.html
楽して高圧縮のRails用アセット生成

# 以前の記事
以前に[Rails on EBの最強アセット展開術](http://qiita.com/jkr_2255/items/764a71beb427e9662c4d)という記事（以下で「前記事」と呼びます）を書きましたが、その後状況が変化したので、現在やっていることを改めてメモ書きしてみました。

# 変わったこと、変えたいこと

## Sprocketsによる自動圧縮
一度導入されて外れていたのですが、Sprocketsの3.5.0で[gzip圧縮機能が復活しました](https://github.com/rails/sprockets/pull/193)。

ということで、ふつうにgzipをかけるだけなら、前記事のような処理を入れなくても、Sprockets単体で行ってくれるようになりました。asset_syncにつなげれば、自動でgzipを上げてくれます。

## Zopfliによる圧縮
ただ、自分はひとひねりを加えていたので、逆に面倒なこととなってしまいました。というのも、生成したアセットに対して[Zopfli](http://qiita.com/jkr_2255/items/f3dfdf08267f2a8b590a)を適用して、単なるgzipよりさらに圧縮したファイルを生成していたからです。とはいえ、そのためだけに自動生成をわざわざ止めるのも、癪にさわるものです。

# モンキーパッチしてみた
幸い、RubyからZopfliを呼べるようなgem（[miyucy/zopfli](https://github.com/miyucy/zopfli)）があったので、Sprocketsのgzip圧縮部分をZopfli経由に差し替えてみました。

```config/initializers/zopfli_sprockets.rb
# バージョンずれの時は安全上モンキーパッチをやめる
if Sprockets::VERSION == '3.7.0'
  require 'zopfli'
  module Sprockets
    module Utils
      class Gzip # :nodoc:
        alias zlib_compress compress

        # zopfliで圧縮
        def compress(target)
          mtime = PathUtils.stat(target).mtime
          PathUtils.atomic_write("#{target}.gz") do |f|
            f.write Zopfli.deflate @source, format: :gzip, mtime: mtime
            f.close

            File.utime(mtime, mtime, f.path)
          end

          nil
        end

      end
    end
  end
end
```

念のため、もとの`#compress`メソッドを別名でバックアップした上で、Zopfli呼び出しに差し替えています。

## 差し替え結果
予想通り、反映時間は少し伸びて、その反対に圧縮後のファイルは少し縮んでいます。あまり実行頻度が高くなく、所要時間への要求がそこまで高くない＆ファイルサイズ縮小のメリットが大きい本番環境では、積極的に取り入れていくのもありかなと思いました。

# Sprocketsでの提案
Sprockets側でも、[圧縮アルゴリズムを差し替え可能とする提案](https://github.com/rails/sprockets/pull/241)などがなされていますが、今のところ進展していないようです。
GitHub新機能「required review」の使い方

GitHubに新しく「required review」という機能が追加されました。この機能を利用すると、変更が承認されない限りはプルリクエストをマージできないようにする、といったプルリクエストの運用が可能になります。これまでのように、上がってきた差分にコメントを付けるだけでなく、修正を要求したり承認するフローがプルリクエストのレビュー機能として提供されているのが特徴です。masterブランチや、マージにフックしてCIでのビルドやデプロイが実行されるようなブランチに対しては厳格な運用が行えるため、部分的に取り入れるメリットは大きそうです。

GitHubから[公式のリリースノート](https://help.github.com/articles/reviewing-proposed-changes-in-a-pull-request/)は発表されていますが、日本語での資料がなかったため翻訳してみました。原文に忠実であることよりも翻訳文の読みやすさを意識したため、意訳も多いですが、ぜひご一読ください。

↓↓↓以下翻訳文↓↓↓

# プルリクエストのレビューコメントについて

プルリクエストが作られると、リポジトリのread権限を持っている人なら誰でもそのプルリクエストの差分をレビューしコメントすることが可能です。レビューコメントは、そこで上がってきた差分について議論したり、リポジトリの[コントリビューション・ガイドライン](https://help.github.com/articles/setting-guidelines-for-repository-contributors/)に沿っているか、などのクオリティチェックを促進する働きがあります。

レビューコメントには以下3つの種類があります。

- コメント（comment）: 変更内容を承認したり追加修正を要求することはせず、一般的なフィードバックとしてコメントを残す
- 承認（approve）: 該当する変更のマージを承認するコメントを残す
- 修正要望（request changes）: プルリクエストがマージされる前に修正を求めるためのコメントを残す


Tips:

- 「必須レビュー（required review）」機能がオンになっており、リポジトリにwrite・admin・owner権限を持つユーザーが「修正要望」コメントを残すと、そのコメントをしたユーザーによって「承認」コメントがつかない限り、プルリクエストはマージできなくなります。
- リポジトリのownerあるいはadministratorは、レビューコメントが「承認」されていなかったり、「修正要求」コメントを残したレビュワーがそのorganizationを離れたりしていても、プルリクエストをマージすることができます。



## 「必須レビュー」機能について

リポジトリのadministratorは「[保護されたブランチ（protected branch）](https://help.github.com/articles/about-protected-branches/)」機能を使うことで、どんなプルリクエストであっても、マージされるまでに最低でも1つは「承認」レビューコメントがつかない限りマージできないようにすることが可能です。すでに「修正要望」コメントの付いたプルリクエストが存在する場合、保護されたブランチに対して「必須レビュー」コメントをつけることはできません。


## さらに詳しく

- [Reviewing proposed changes in a pull request](https://help.github.com/articles/reviewing-proposed-changes-in-a-pull-request)
- [Enabling required reviews for pull requests](https://help.github.com/articles/enabling-required-reviews-for-pull-requests)
Bluemix：簡易ETLサービスDataConnect（欠損データ対応-NULLを0にする）

**サービスの名前が変わったようなので、タイトルだけ名前変えてます**
**旧：DataWorks 
新：DataConnect**

Dataworksではデータのクレンジング、整形をやってくれるようです
試しに欠損値保管、NULLを数値の0(zero)にする、ということを試してみました（小ネタ、ですね）

## どの画面から作業するのか

データ元を指定する画面で**「REFINE DATA」**をクリックします。
![スクリーンショット 2016-09-07 22.21.22.png](https://qiita-image-store.s3.amazonaws.com/0/119378/14c61f18-f9d1-1672-350d-7ccb647cac24.png)

## 特定列のNULL値を0(zero)にする

### 列を選択

欠損データのある列の「▼」をクリックして「Operations」をクリックします。
nullは「----」という点線？で表現されるようですね。
![スクリーンショット 2016-09-07 22.21.42.png](https://qiita-image-store.s3.amazonaws.com/0/119378/724694b4-2ccb-d6d1-4af8-c8e08a96641a.png)

### Cleanseを選択
![スクリーンショット 2016-09-07 22.21.53.png](https://qiita-image-store.s3.amazonaws.com/0/119378/305ea81a-f825-49a8-3568-77bf86a3108f.png)


### Change valueをクリック
![スクリーンショット 2016-09-07 22.22.01.png](https://qiita-image-store.s3.amazonaws.com/0/119378/36cd9c42-baec-a164-23a2-61ac99016f90.png)

### どう値を変えるのか、を選ぶ
NULL to zeroをクリックして、下の「APPLY」をクリック
![スクリーンショット 2016-09-07 22.22.21.png](https://qiita-image-store.s3.amazonaws.com/0/119378/d41f57b4-943a-30d8-60ca-2a81d55f3a02.png)

## 結果を確認する
プレビュー的に、どのように値が変わるのかを確認することができます。
先ほど「---」（＝NULL）だった、Kellyのdeptidに「0」が入りました。
![スクリーンショット 2016-09-07 22.22.30.png](https://qiita-image-store.s3.amazonaws.com/0/119378/b81125e1-5884-5667-15ff-df842a0f11a2.png)

## おまけ
ちなみに、データに対してこういう変更を行いましたよ、という履歴も確認することができます。
![スクリーンショット 2016-09-07 22.22.40.png](https://qiita-image-store.s3.amazonaws.com/0/119378/84cca120-bd6e-80ef-ef84-a9efe01790aa.png)
Redisへの外部サーバからの接続許可設定方法



* 初めてredisを使ってみて、AP-DB構成配下で「Connection refused [tcp://192.168.xxx.xxx:6379]」エラーにしばらく悩まされたのでメモ。

## 設定方法

* /etc/redis.confにbind項目を変更する。

	``` console
	sed -i -e "s/^bind *127\.0\.0\.1$/bind 0\.0\.0\.0/g" /etc/redis.conf
	```
	
	``` /etc/redis.conf
	- bind 127.0.0.1
	+ bind 0.0.0.0
	```

## まぁ、
* エラーメッセージに書かれてる通りだわな…蓋開けて見りゃ(汗
Java 乱数&for文&出力

#【問題】
1から10までの乱数を発生させ、その数を表示した後forループを用いてその数だけ■マークを表示するプログラムを作りなさい。

#【回答】
```java
// Randomというクラスに属している乱数発生関数(nextInt)を
// 使いたいため、ランダムクラスをインポートします
import java.util.Random;

public class Study {

	public static void main(String[] args) {
		// Randomクラスのインスタンス化（初期化）
        Random rand = new Random();

        // 1～10までの乱数を発生
        // nextInt(10)は0～9までの数字を発生させる
        // そのためプラス1をして1～10までの数字をrandomNum変数に代入している
        int randomNum = rand.nextInt(10) + 1;
        // ランダムに発生した数を表示
        System.out.println(randomNum);

        // for文で使用する変数の宣言
        int i;
        // 1～randomNum以下まで繰り返します
        for (i = 1; i <= randomNum; i++) {
        	// ■マークの表示
        	// 横一列に並べたいため改行をしないprintを使用
        	System.out.print("■");
        }
	}
}
```


#【参考サイト】
[乱数の作成](http://sasuke.main.jp/ranjava.html)
【Unity】アバターをまとめて1SetPassにする

ランタイム時に、アバターなどの複数のTextureを
１枚にまとめてSetPassを減らす.
Atlas化するTextureとMeshはそれぞれ
Read/Write Enable　フラグをOnにしておく必要があります

![screenshot_2016_9_16.png](https://qiita-image-store.s3.amazonaws.com/0/67497/2176086a-86a0-a56b-29df-41a196dfbce1.png)

```csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;

public class RuntimeCharacterAtlasTest : MonoBehaviour
{
    public Texture2D BodyTex;
    public Texture2D HairTex;
    public Texture2D EyeTex;

    public Texture2D AtlasTex;
    public Material AtlasMaterial;

    public SkinnedMeshRenderer[] BodyMeshs;
    public SkinnedMeshRenderer[] HairMeshs;
    public SkinnedMeshRenderer[] EyeMeshs;

    public Rect[] Rects;

    public IEnumerator Start()
    {
        // AtlasTextureの生成.
        AtlasTex = new Texture2D(2048, 2048);

        // Unity起動直後は正確に計測できないのでしばらく待つ.
        yield return new WaitForSeconds(3f);

        // ~~~~~計測開始~~~~~
        Stopwatch sw = new Stopwatch();
        sw.Start();

        // TextureのAtlas化を行う.
        // Rects に各Textureの領域情報が返ってくる、順番は引数のTexture配列と同じ.
        Rects = AtlasTex.PackTextures(new [] {BodyTex, HairTex, EyeTex}, 2);

        // Atlas用のMaterialにAtlasTextureを割り当てる
        AtlasMaterial.mainTexture = AtlasTex;

        // PackTextureに渡した順番でUVを更新
        ApplyUVAndMaterial(BodyMeshs, Rects[0], AtlasMaterial);
        ApplyUVAndMaterial(HairMeshs, Rects[1], AtlasMaterial);
        ApplyUVAndMaterial(EyeMeshs, Rects[2], AtlasMaterial);

        // ~~~~~計測終了~~~~~
        sw.Stop();
        //UnityEngine.Debug.Log("total atlas create time = " + sw.ElapsedTicks + " ticks");
    }

    // UVを更新して、AtlasMaterialを割り当てる
    public void ApplyUVAndMaterial(SkinnedMeshRenderer[] meshs, Rect rect, Material atlasMaterial)
    {
        foreach (var mesh in meshs)
        {
            var uvs = new List<Vector2>();
            // 元のMesh情報を上書きしないように、Instanctiateしてメッシュをコピー
            mesh.sharedMesh = Instantiate(mesh.sharedMesh);
            // 元々のUV情報を取得
            mesh.sharedMesh.GetUVs(0, uvs);
            // Atlasマテリアルを割り当て
            mesh.material = atlasMaterial;

            for (int i = 0; i < uvs.Count; ++i)
            {
                // Atlas化してずれたUVを更新する.
                uvs[i] = new Vector2(uvs[i].x * rect.width + rect.x, uvs[i].y * rect.height + rect.y);
                // 新しいUVを割り当て
                mesh.sharedMesh.SetUVs(0, uvs);
            }
        }
    }
}
```
(bikeshed)Web APIにおけるJSONのキーはsnakeかcamelか

これは [Frontend Meetup vol.1 - SPAを語り尽くす会!](http://connpass.com/event/38112/) で飛び入りLTした内容を、(だいたい喋った内容に基づき)加筆、および修正したものです。

## Today's Bikeshed

Web API (JSON)

キー名は?

- camelCase
- snake_case

---

## 経緯

FiNCでは・・・

- Backend ... Ruby on Railsがメイン
  - 今まではsnake_case
- Client
  - iOS ... Swift
  - Android ... Java
  - Browser ... JavaScript (React)
  - (全てcamelCaseな言語)

---

## 経緯 

- 複数のBackendをたばねるフロントエンドサーバ(BFF)を
GraphQLを利用して作っている
- GraphQLはcamel前提っぽい雰囲気あり
  - GitHubのREST APIはsnake_case
  - なのに、新しく公開されたGraphQLのAPIはcamelCase
- フロントサーバは、透過的な感じにしたい
  - GraphQLTypesは書いた上で
  - Backendのレスポンスをそのまま通すイメージ
  - すなわちcamelでくると嬉しい
- この機会に、今後作るAPIはこうと決めたい、snake/camel決着つけね?

---

## stats

- 10以上のMicroservices
- 大半はRails
  - すべてsnake_case
- もちろん、今後特定の技術にロックインされるべきではないが

---

## 今日のつぶやき on slack

- クライアントはどうなの
  - Javaはどっちでも良いっぽい
  - JavaScript的には、destructuringとかがある関係上、使う変数名とキー名がそろってたほうが嬉しいことがある。そうするとcamel.
    - Swiftも同じ感じっぽい

- バックエンドはどっちでもOK & GraphQLサーバがcamelに変換、という選択肢は?
  - フロントサーバが、変換の役目を持つことになる
    - できればフロントサーバはあんまりバックエンドのことを知っていたくない、来たものをそのまま集約して返すようなサーバになっていたい。だからあんまりキーの変換表みたいのはもちたくない。
  - フロントサーバで、snakeをcamelで自動で変換するのは
    - 一つはパフォーマンスの問題が起こりうる。とくに再帰的にsnakeをcamelにする処理とかは結構重くなりがち。
    - jsonをパースするときはどうせ文字列全体をなめてるので、「jsonをパースしながらsnake caseをcamel caseに変換するようなパーサ」があれば良いのではないか
      - もちろんC++とか低いレイヤで実装する
      - まー現実的ではない。
    - snake => camel 自動変換だけど、ランタイムにスキーマを生成して、何回かリクエストしてるうちに速くなる的な何かを作ることはありうる気がする。

---

## まとめ

はーbikeshed楽しい

camel or snake どっち派ですか?

---

## 結果

camelCase10人, snake_case8人. そして50%以上の人はどっちでもよさそう、

この結果は、社内での調査とほぼ同じ割合。
Homebrew caskの場所変更

# Homebrew caskの場所変更

Homebrewをインストールしなおしたので、torchを入れ直そうとしたら場所変わったから直
してって言われた。

```bash
Warning: The default Caskroom location has moved to /usr/local/Caskroom.

Please migrate your Casks to the new location and delete /opt/homebrew-cask/Caskroom,
or if you would like to keep your Caskroom at /opt/homebrew-cask/Caskroom, add the
following to your HOMEBREW_CASK_OPTS:

  --caskroom=/opt/homebrew-cask/Caskroom
For more details on each of those options, see https://github.com/caskroom/homebrew-cask/issues/21913.
```

どうやらこれ一発でいけるようなのがissuesに書いてある。

```bash
brew cask install --force $(brew cask list)
```

消し忘れていたため、同じのが出てしまった。
CASKで入れたのは新しい場所にインストールされてるので、消しましょう。（確認して下しあ）

```bash
rm -rf /opt/homebrew-cask/Caskroom
```


## 結論
できた。



### 参考
> How to migrate to the new location? · Issue #21913 · caskroom/homebrew-cask · GitHub
> https://github.com/caskroom/homebrew-cask/issues/21913
brew update できなくなった

# brew update できなくなった
```bash
$ brew update
fatal: pack has 1 unresolved delta
fatal: index-pack failed
Error: Fetching /usr/local/Library/Taps/homebrew/homebrew-versions failed!
```

とまあこんな感じに。

結果的には再インストールしました。綺麗さっぱり。

# Homebrewを再インストール
```bash
$ cd /usr/local
$ sudo rm -rf /usr/local/Cellar /usr/local/.git && brew cleanup
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
全部消したはずが再び同じエラーが。
問題のディレクトリに移動して下記コマンドで無理くり修正。

```bash
$ cd ./Library/Taps/homebrew/homebrew-versions
$ git checkout -f master; git reset --hard origin/master
```

全部消す必要なかったかも…
まあ、メンテしてなかったのもたくさんあったので、一旦よしと。

### 参考
> brew update すると Error: Failed while executing と言われるときの対処法
> http://qiita.com/bird_nitryn/items/b010f809880d61ff2c2b

> brew update: unable to read again · Issue #2804 · Homebrew/homebrew-core · GitHub
> https://github.com/Homebrew/homebrew-core/issues/2804
CoffeeScriptチートシート

## コマンド

### `coffee`コマンド

オプション | 内容
--- | ---
-i | インタプリタ起動
-c <file> | コンパイル
-l <file>| 構文チェック
-o <file> | ファイル出力する
-w | ソースの監視と自動リコンパイル
-p | 標準出力する
-e <code> | evalする
-r <file> | 依存するライブラリの読込
-v | バージョン

## 構文
### コメント
- `#`: 単行コメント

	```coffee
	# 単行コメントはjsへの変換時に消える
	```

- `###`: 複数行コメント

	```coffee
	###
	複数行コメントはこのように書く
	このコメントはjsへの変換後も/* */ の形で残る
	###
	```

### 変数宣言
- `var`: 宣言は必須ではない
- `?=`: デフォルト値の設定が可能

	```coffee
	# 変数がundefinedまたはnullの場合のみ代入する
	i ?= 123
	```

### 文字列リテラル
- `”#{val}”`: 変数展開

	```coffee
	result = 123
	msg = ‘result: #{result}’
	```

- `””” … “””`:  ヒアドキュメント

	```coffee
	longmsg = “””
	a
	b
	c
	“””
	```

### 真偽値リテラル
- true/false以外の真偽値リテラルが使える

	```coffee
	isReady = yes		# yes/no
	someFlag = on		# on/off
	```

### 配列リテラル
- 範囲演算子が使える
	
	```coffee
	x = [0…5]		# [0, 1, 2, 3, 4, 5]となる
	```

### 論理演算子
- 三項演算子は使えない
- 等価演算子`==`は使えない
- 英文形式の論理演算子を使える

	```coffee
	a is b		# a === b
	a isnt b		# a !== b
	not c		# !c
	a and b		# a && b
	a or b		# a || b
	a?			# aがundefinedでもnullでもない場合に真
	```

- 演算子の連結が可能

	```coffee
	a < b < c		# a<b && b<c と書かなくていい
	```

### 制御構文
#### if / unless
- 括弧は必須でない
- ブロックではなくインデントで表現する

	```coffee
	if x is y
	    foo()
	else
	    bar()
	```

- 単行で書く場合は`then`を使う

	```coffee
	if x is y then foo() else bar()
	```

- 後置構文も使える

	```coffee
	foo() if x is y
	```

- unless(ifの否定)も使える

	```coffee
	unless(x is y)
	    foo()
	```

#### switch
- caseではなく`when`を使う
- defaultではなく`else`を使う
- `break`は__明示不要__

```coffee
switch x
    when 0:
    when 1:
    when 2:
```

#### while / until
- untilはwhileの否定形
- 後置構文が使える

	```coffee
	foo while a is b
	```

#### for~of
- `for~of`: ハッシュに対するイテレーション

	```coffee
	for key, val of hash
		foo key, val
	```


### 関数
- 呼出時に関数の括弧は必須でない(ruby式)

	```coffee
	someFunc ‘a’, ‘b’, ‘c’
	```

- 定義時は`() ->` を使う
- returnの明示は不要(最後の式文の評価値が返る)

	```coffee
	foo = (a, b, c)->
		a + b + c
	```

- デフォルト引数が使える

	```coffee
	foo = (flagged=true)->
		# …
	```

- 可変長引数が使える

	```coffee
	foo = (list…) ->
		# …
	```



### オブジェクト
- `?`: 対象の関数/メソッド/プロパティが存在する場合のみ実行

	```coffee
	someFunc?()
	foo?.bar
	```

### クラス
- `class`, `constructor`などOOP系の予約語が使える

	```coffee
	class Foo
		constructor: (@bar, @baz)->

		# プロトタイプメンバ
		someProp: ‘bar’
		someFunc: ()->
			alert ‘someFunc’

		# クラスメンバ
		@someConst: ‘CONST’
		@someStatic: ()->
			alert ‘someStatic’
	```

- `extends`, `super`も利用可能

- `@`はthisと等価

	```coffee
	class Foo
		some: ->
			alert @message	# this.messageに相当
	```

### スコープ
CoffeeScriptファイルは、コンパイルされた時点で__ファイル別に即時関数でラップされる__。そのためデフォルトでは、スクリプト間のアクセスはできない。

アクセスの許可はwindowオブジェクトへのプロパティの追加で対応する

```coffee
class Cafe
	# …

# これでグローバルになる
window.Cafe = Cafe
```

### 参考
- [CoffeeScript入門](http://www.buildinsider.net/web/rubyonrails4/0901)
Python pip の proxy を設定する (pip.ini に記述する)

# %APPDATA%\pip\pip.ini を作成する

%APPDATA%\pip\pip.ini ファイルに作成し、下記を記述しましょう。

```ini

[global]
proxy = [user:passwd@]proxy.server:port
```


~/pip/pip.ini は古い記述です。
に下記を記述すればOK。(Linuxの場合は、~/pip/pip.conf)

## 参考
https://pip.pypa.io/en/stable/user_guide/#configuration
Cakephp3.xの覚書

#Modelの2->3における変化
初心者なりにまとめてみたことをメモ
まだ3.xについては記事が少ないのでcakephpを使っている人達の1人でも役に立ってもらえるとうれしいです。

##まとめ
できるなら新しいプロジェクトを始めるなら3.x系で作るほうがいいと思います。

##TableとEntitiy
Tableはデータベースと、Entityは取り出したQueryの一つの要素を体現している。
たとえばTableはFinderを定義できるし、Entityでは仮想フィールドの設定やアクセサの定義が可能。
なので2.x系に比べて(自分的には)データの扱いが柔軟になったような気がする。
また2.x系では意識してFat controller を避ける必要があったが、3.x系はそれも抑制している気がする。

##View
Viewは2.x系ではViewsフォルダの下にそれぞれのコントローラに対応するビューフォルダがあったが、3.x
系ではそのような機能がTempleteに移動した。

##Controller
authコンポーネント等の扱いやなどが結構変わったが、それ以外はあまり変わっていない印象。

##その他
特に気になったのはルーティング機能について。
3.x系ではクイックスタートガイドでそれに触れていたので、ブログチュートリアルをやってみたら結構いろいろできた。

##参考
クイックスタートガイド
http://book.cakephp.org/3.0/ja/quickstart.html
クックブック
http://book.cakephp.org/3.0/ja/index.html
.wsdlあげてSOAPリクエスト投げられるツールつくった

https://github.com/cloudpack/oops

社内要望を解決するやーつ第二弾！
wsdlをアップロードすると、関数一覧がでてきてヘッダーとかつけられる！やつ！

doc_rootにwsdl置いちゃうのでローカルでお試しくだされ！
[論文紹介] Pixel-Level Domain Transfer

# 論文
https://arxiv.org/abs/1603.07442

# 概要
生成モデルを用いて画像ドメインのtransferを行う。

ファッションの分野において、あるアイテムの商品画像とそれをモデルさんが着た画像は大きく異なる問題に注目する（pixel level domain transfer probrem）
提案手法では、GANを用いてモデル画像から商品画像を生成している
<img width="493" alt="スクリーンショット 2016-09-16 19.26.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/66317/304ea5e2-f658-5eca-c2c7-3786ae242524.png">

# 貢献
- pixel levelでsource domainからtarget domainへの意味的な転写を行っている
- domainの関係を学習するdiscriminatorを提案する
- ファッション画像のでかいデータセットに適用している（<-実はそんなにでかくない

# アプローチ
3種類のネットワーク｛Converter， Real/Fake Discriminator， Domain Discriminator｝を学習させる
Discriminatorの学習には生成画像、本物の画像（positive）、本物だけど異なるアイテムの画像（negative）のtripletを用いる

## Converter
EncoderとDecoderの組からなる、構造はGANと同様
ただし逆伝播させるlossを工夫して、入力画像をそのまま再構成するのではなく、source domainの画像からtarget domainの画像を生成できるように学習させる（Domain transfer）

## Real/Fake Discriminator
入力された画像が本物かConverterが生成した偽物かを学習する
GANと同様

## Domain Discriminator
（Converterの生成画像， target domainのpositive画像， target domainのnegative画像）のうちどれかひとつとsource domainの画像をchannelについてconcatした画像を入力として、その組み合わせの関連性の有無を判別する


実際に絵で見たほうが早い
<img width="490" alt="スクリーンショット 2016-09-16 19.25.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/66317/be34ae95-a958-3eab-162b-e50260f56132.png">

# 誤差関数
Discriminatorはそれぞれの判別誤差
Converterは2つのDiscriminatorの誤差の平均

# 議論
## なぜDiscriminatorの判別誤差を利用するのか（MSEじゃだめなの？）
MSEの課題は2つ

- pixelのRGB値の差分がある程度小さくなると学習が止まってしまうため、生成される画像がボケる
    - そもそもRMSEで仮定している誤差分布は正規分布だけど、画像のpixelは正規分布じゃない
- target domainの画像はuniqueじゃない
    - 例えば、商品画像なら色んな角度から撮影されているので、MSEだと正しく学習できない

# 実験
optimizerの学習率など、設定は論文に細かく書かれていて、とても親切
生成画像の自然さについて、アンケートによる定性評価とRMSE,SSIMによる定量評価

## 結果
<img width="480" alt="スクリーンショット 2016-09-16 19.26.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/66317/ac1555fc-176e-8e16-307f-afe4da720159.png">


# その他
モデルの構造とか実験設定が細かく書かれててありがたい