OmniAICreator/Qiita-1.07M huggingface dataset:
複雑なリクエストをPassThroughにまとめる

あるファイルをダウンロードする時など、リクエストの前に別のリクエストを発行する必要があるとき、その処理はコールバックで複雑になりがちです。

```js
import request from 'request'

function requestLatestTarball (name, callback) {
  const url = 'https://registry.npmjs.org'
  const urlInfo = `${url}/${name}`
  request(urlInfo, {json: true}, (error, {body}) => {
    if (error) {
      return callback(error)
    }
    const version = body['dist-tags'].latest
    const urlLatestTarball = `${url}/${name}/-/${name}-${version}.tgz`

    request(urlLatestTarball, {encoding: null}, (error, {body}) => {
      if (error) {
        return callback(error)
      }

      return callback(null, {uri: urlLatestTarball, buffer: body})
    })
  })
}

requestLatestTarball('jquery', (error, tarball) => {
  console.log(error, tarball)
  // null { uri: 'https://registry.npmjs.org/jquery/-jquery-2.2.4.tgz',
  // buffer: <Buffer 7b 22 65 72 72 6f 72 22 3a 22 70 61 63 6b 61 67 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 22 7d> }
})
```

> 例として紹介するプログラムは、npmのレジストリからパッケージ情報を取得し、最終バージョンの`tgz`ファイルをダウンロードします。[^1]

[^1]: 公開済みのライブラリとして、同様の機能を https://github.com/59naga/npm-tarball で提供しています。

また、巨大なファイルを取り扱いたいので、[readableStream/writebleStream](https://github.com/substack/stream-handbook#basics) を利用して、オーバーヘッドを減らしたいと思いました。

具体的に、`request(urlLatestTarball).pipe`をすれば良いのですが、関数からstreamを返し、`writableStream`に`pipe`できる実装を求めました。

```js
requestLatestTarball('jquery').pipe(createWriteStream('jquery-latest.tgz'))
```

上記を実装するためには、`requestLatestTarball`が１つ目のリクエストを完了させてから、２つ目のリクエストをpipeする`readableStream`を返す必要があるのですが、そこで利用できたのが [stream.PassThrough](https://nodejs.org/api/stream.html#stream_class_stream_passthrough) でした。

これは、何もしないstreamを作成し、他のreadableStreamを`.pipe`で受け取ることで、任意のタイミングでデータ送出を行えます。以下は単純な利用例です。

```js:pass-through.js
import {createReadStream, createWriteStream} from 'fs'
import {PassThrough} from 'stream'

const passThrough = new PassThrough()

setTimeout(() => {
  createReadStream('foo.txt').pipe(passThrough)
}, 500)

passThrough.pipe(createWriteStream('bar.txt')).on('finish', () => {
  console.log('書き込みおわりましたゾ')
})
```

```bash
echo 'beep' > foo.txt
babel-node pass-through.js
# 書き込みおわりましたゾ
cat bar.txt
# beep
```

これを冒頭の`requestLatestTarball`に適用できます。

```js
import request from 'request'
import {PassThrough} from 'stream'
import {createWriteStream} from 'fs'

function requestLatestTarball (name, callback) {
  const passThrough = new PassThrough()

  const url = 'https://registry.npmjs.org'
  const urlInfo = `${url}/${name}`
  request(urlInfo, {json: true}, (error, {body}) => {
    if (error) {
      return passThrough.emit('error', error)
    }
    const version = body['dist-tags'].latest
    const urlLatestTarball = `${url}/${name}/-/${name}-${version}.tgz`

    request(urlLatestTarball).pipe(passThrough)
  })

  return passThrough
}

requestLatestTarball('jquery').pipe(createWriteStream('jquery-latest.tgz'))
```

例外処理は`passThrough`に集約され、引数にコールバックが不要になったため、見通しの良いコードになりました。
NSTextView のコンテクストメニューをハックする


デフォルトで左のようになっているコンテクストメニューを右のようにしたい。**辞書、Google で検索、カット、コピー、ペースト** の部分だけは最低限残す。ちなみに  **Spotlight〜テキストを全角に変換** の部分は自動挿入されるサービスメニューで、これは NSMenu のプロパティで削除できる。
<img width="246" src="https://qiita-image-store.s3.amazonaws.com/0/3603/163707cd-e9d7-3e01-ecfd-6b25e7dd49ee.png"> <img width="246" src="https://qiita-image-store.s3.amazonaws.com/0/3603/792ed1f4-df48-685b-8657-f2b7601f3322.png"> <img width="163" src="https://qiita-image-store.s3.amazonaws.com/0/3603/6ef51b0e-372f-061c-8cd4-9859f8f2a66f.png">

```swift
extension TextDelegate: NSTextDelegate {
// コンテクストメニューを返すためのデリゲートメソッド。標準のメニューは引数で渡される
func textView(view: NSTextView, menu: NSMenu, forEvent event: NSEvent, atIndex charIndex: Int) -> NSMenu? {
		let newMenu = NSMenu(title: "")
		newMenu.allowsContextMenuPlugIns = false // サービスメニューを挿入したくない場合は false
		
		var specialItems = 0
		for item in menu.itemArray {
			// 辞書で表示、Google で検索
			if item.action.description == "_searchWithGoogleFromMenu:" ||
			item.action.description == "_lookUpDefiniteRangeInDictionaryFromMenu:" {
				newMenu.addItem(item.copy() as! NSMenuItem)
				specialItems += 1
			}
			
			// 区切り線を入れる
			if specialItems == 2 {
				newMenu.addItem(NSMenuItem.separatorItem())
				specialItems += 1
			}
			
			// カット、コピー、ペースト
			if item.action.description == "cut:" ||
				item.action.description == "copy:" ||
				item.action.description == "paste:" {
				newMenu.addItem(item.copy() as! NSMenuItem)
			}
			
			// デバッグ用
			//print("\(item.target), \(item.action.description), \(item.title)")
		}
		
		return newMenu
	}
}
```

あとはよしなに好きなメニュー項目を挿入すれば良い。
HomebrewでMySQL5.6を使い続ける


Homebrewを使ってMySQL環境を得ている場合、何気なく `brew update && brew upgrade` をしているとMySQLのバージョンが5.7に上がっていて、罠にハマることが多い。
そこでMacOS上のMySQLを5.6に固定したままにする方法を紹介。

# 既存のmysqlを削除する
```
# mysqlを停止
$ mysql.server stop
# 自動起動設定をOFF
$ launchctl remove homebrew.mxcl.mysql
# mysql本体を削除(これだけだとdatabaseは削除されない)
$ brew uninstall mysql
```


# mysql56をインストールする
```
$ brew install homebrew/versions/mysql56
```

# mysql56の自動起動設定
```
$ ln -s /usr/local/opt/mysql56/homebrew.mxcl.mysql56.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql56.plist
```

# mysql56を立ち上げる
```
$ mysql.server start
```

これでエラーになる場合は、

- mysqlのプロセスが残ってしまっている場合
	- http://www.crossl.net/blog/mysql_failed_start/
- 本来、初回起動時に作成されるファイルが残ってしまっている場合
	- https://tumin.jp/answer?id=56580170dad3683b6a683a0d

などのケースがある。

前者については、プロセスを殺していく。

```
$ ps aux | grep mysql
$ kill -9 <プロセス番号>
```

後者については、

```
$ cd /usr/local/var/mysql
$ rm -rf ib_logfile*
```

うん、Homebrewやっぱり便利！！
非webエンジニアがRailsを学ぶときは・・・

#最初に
アホな記事をQiitaにアップしていた私も最近はRailsの勉強に夢中になっている。

#何度も挫折してきた
webデザイナーやweb運営をずっとやってきた私。HTMLやらCSSを書いたり、WordPressを齧ったくらいで、プログラムには何度も挫折した、非エンジニアの自分。今度こそ！と毎度思うのだけど、なかなか今度は来ないのだった。

Railsチュートリアルの存在も知っていたけど、中々手が出なかった。

#突然勉強会が始まった
突然降って沸いたRails勉強会の話。半ば無理やり（ごめん）に参加させられた。1週間から2週間に1回、勉強会に参加することになった。勉強会とはいっても、先生一人、生徒二人の少人数。喫茶店の片隅で。現在も継続中。

#メンターの存在
一人でできるもん！と強がってみたけど、やはり教えてくれる人が居るってのは強い。ヤバイくらい強い。教えてもらってからドットインストールで動画を見ると、するすると内容が入ってくる。

#まとめ
メンターになってくれる人がいるのは重要。特にエンジニアじゃない人は環境設定で躓くと思うので。
[メモ] Raspberry PiをTorプロクシにする(Wifi APルータ)

## 概要
- [Install Tor | Onion Pi](https://learn.adafruit.com/onion-pi/install-tor) のまま
- `wlan0`のTCP通信が、Port9040に渡される(?)
- Raspberry Pi自体は Tor経由にはならない。(`% curl ifconfig.me` でGlobal IP)


## 環境

- Raspberry Pi 3 
- [\[メモ\] Raspberry Pi 3で、Wi-Fi アクセスポイントルータ](http://qiita.com/mt08/items/f2e4f9d3b1ed00849e23) を設定しておく
<br>(\# Jessie-lite : `2016-05-27-raspbian-jessie-lite.img`)


## 手順
1. `sudo apt-get install -y tor`
2. `sudo vi /etc/tor/torrc`

    ```txt:/etc/tor/torrc
...
## Tor will look for this file in various places based on your platform:
## https://www.torproject.org/docs/faq#torrc
#
# 以下を追記する Log ～ DNSListenAddress のとこまで
Log notice file /var/log/tor/notices.log
VirtualAddrNetwork 10.192.0.0/10
AutomapHostsSuffixes .onion,.exit
AutomapHostsOnResolve 1
TransPort 9040
TransListenAddress 192.168.42.1
DNSPort 53
DNSListenAddress 192.168.42.1
# ここまで.
#
## Tor opens a socks proxy on port 9050 by default -- even if you don't
## configure one below. Set "SocksPort 0" if you plan to run Tor only
...
```

3. `sudo vi /etc/hostapd/hostapd.conf`

    ```txt:/etc/hostapd/hostapd.conf
...
# これは、飛ばしてもいいよな...
ssid=Onion Pi
...
```

4. iptables

    ```txt:コマンドラインへこぴぺ
# 現在の設定を消す
sudo iptables -F
sudo iptables -t nat -F
#
# wlan0: ssh(TCP22)
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 22 -j REDIRECT --to-ports 22
#
# wlan0: DNS (UDP53)
sudo iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j REDIRECT --to-ports 53
#
# wlan0: その他TCPパケットを9040ポートへ。
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --syn -j REDIRECT --to-ports 9040
#
# 設定確認.
#sudo iptables -t nat -L
#
# 設定保存
sudo sh -c "mv /etc/iptables.ipv4.nat /etc/iptables.ipv4.nat.bak"
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
#
# Log file関連.
sudo touch /var/log/tor/notices.log
sudo chown debian-tor /var/log/tor/notices.log
sudo chmod 644 /var/log/tor/notices.log
#
# サービス開始、自動起動設定.
sudo service tor start
#sudo service tor status
sudo update-rc.d tor enable
```

4. `sudo vi /etc/init.d/tor`
    - <font color='red'>(!!要確認!!) - アドバイスおねがいします</font>

    ```txt:/etc/init.d/tor
...
                else
                        AA_EXEC=""
                        AA_EXEC_ARGS=""
                fi
                #
                sleep 9  # 起動時にこけるのでWaitをいれる.
                #
                if start-stop-daemon --start --quiet \
                        --pidfile $TORPID \
                        $NICE \
                        $AA_EXEC \
                        --exec $DAEMON -- $AA_EXEC_ARGS $DEFAULT_ARGS $ARGS
...
```
6. `sudo reboot`
7. テスト
    - Windowsとかから、らずぱいのAPに接続
    - ブラウザのシークレットモード(Firefox:CTRL+Shift+P, Chrome:Ctrl+Shift+N)起動(気分的に)
    - グローバルIPを確認
        - http://www.ipchicken.com
        - http://ifconfig.me/
AGAL入門 #4 : 各AGALバージョン (Stage3D Profile) ごとのレジスタ数


AGALの各バージョンで利用できるレジスタの数については、調べる資料によってばらつきがあるなあと思っていたのですが、正しくはAGALバージョンではなく、Stage3DのProfileに紐づく事と、単純にややこしくて記述間違いがある、資料によってレジスタを網羅してない場合があるのが、ばらつきの理由のようです。

最新の情報をもとに、きちんとまとめなおしてみます。(なにか間違いがあればご指摘ください。修正します。)

|  |Baseline Constrained|Baseline|Baseline Extended|Standard Constrained|Standard|Standard Extended|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|AGAL ver.|  1 |  1 |  1 |  2 |  2 |  3 |
|登場AIR ver.||||AIR16|AIR16|AIR17|
|主なターゲット|すごく古いPC|古いPC|古いPC| | |OpenGL ES 3.0|
|Token数|200|200|200|1024|1024|2048|
|va|8|8|8|8|8|16|
|vc|128|128|128|250|250|250|
|vt|7|8|8|26|26|26|
|v |8|8|8|8|10|10|
|fc|28|28|28|64|64|200|
|ft|8|8|8|26|26|26|
|fs|8|8|8|8|16|16|

対応AIRバージョンなどはiOS/AndroidとPC/Macでずれていたりするんですが、とりあえず書きました。なお、この中で現状(2016/6)のオススメProfileは、スマホのカバー率の広さから"Standard Constrained"です。

# 情報ソースなど

AGALの各バージョンやStage3DのProfileについては上条さんのブログのここや
http://cuaoar.jp/2015/01/flash-player-16-adobe-ai.html

同じくここや
http://cuaoar.jp/2015/02/flash-player-17-adobe-ai.html

ICSさんの記事、
https://ics.media/entry/3865
https://ics.media/entry/5773

および、AGAL3(AIR17)のリリースノート(PDF)

http://labsdownload.adobe.com/pub/labs/flashruntimes/shared/air16_flashplayer16_releasenotes.pdf
http://labsdownload.adobe.com/pub/labs/flashruntimes/shared/air17_flashplayer17_releasenotes.pdf

など、を参照しました。AIR16のpdfにAGAL2までですが、より詳細な項目の票が含まれています。

ちなみに上記それぞれの記事はレジスタ周辺だけでなく、Stage3Dの歩みがわかって面白いです。一読をおすすめです。
hostnameコマンドは何気に多機能かも

多機能と言うほどではないけど、オプションは何気に結構あったり。
aliasとかfqdnで結果返せるのね。

```shell-session
$ hostname --help
Usage: hostname [-b] {hostname|-F file}         set host name (from file)
       hostname [-a|-A|-d|-f|-i|-I|-s|-y]       display formatted name
       hostname                                 display host name

       {yp,nis,}domainname {nisdomain|-F file}  set NIS domain name (from file)
       {yp,nis,}domainname                      display NIS domain name

       dnsdomainname                            display dns domain name

       hostname -V|--version|-h|--help          print info and exit

Program name:
       {yp,nis,}domainname=hostname -y
       dnsdomainname=hostname -d

Program options:
    -a, --alias            alias names
    -A, --all-fqdns        all long host names (FQDNs)
    -b, --boot             set default hostname if none available
    -d, --domain           DNS domain name
    -f, --fqdn, --long     long host name (FQDN)
    -F, --file             read host name or NIS domain name from given file
    -i, --ip-address       addresses for the host name
    -I, --all-ip-addresses all addresses for the host
    -s, --short            short host name
    -y, --yp, --nis        NIS/YP domain name

Description:
   This command can get or set the host name or the NIS domain name. You can
   also get the DNS domain or the FQDN (fully qualified domain name).
   Unless you are using bind or NIS for host lookups you can change the
   FQDN (Fully Qualified Domain Name) and the DNS domain name (which is
   part of the FQDN) in the /etc/hosts file.
```

yp も dns も シンボリックリンク。

```shell-session
$ rpm -ql hostname-3.13-3.el7.x86_64 | grep bin |  xargs ls -li
33663457 lrwxrwxrwx. 1 root root     8 Jan 20  2015 /bin/dnsdomainname -> hostname
33663500 lrwxrwxrwx. 1 root root     8 Jan 20  2015 /bin/domainname -> hostname
33663501 -rwxr-xr-x. 1 root root 15768 Jun 10  2014 /bin/hostname
33663502 lrwxrwxrwx. 1 root root     8 Jan 20  2015 /bin/nisdomainname -> hostname
33663503 lrwxrwxrwx. 1 root root     8 Jan 20  2015 /bin/ypdomainname -> hostname
```

息抜きにソースみてみっか。
yum-utilsでソースダウンロード。

```shell-session
$ yum install yum-utils
$ yum --downloadonly --source hostname
$ rpm -ivh hostname-3.13-3.el7.src.rpm
$ rpm2cpio hostname-3.13-3.el7.src.rpm| cpio -id
$ tar xvzf hostname_3.13.tar.gz
```

argv[0]みて動き変えるはUNIXだとよくやるよね。こういうのって昔はハードリンクだったのが多かったけど今は違うのかな。

```c:hostname.c
    /* If called as 'dnsdomainname', by default show the DNS domain name. */
    progname = (rindex(argv[0], '/')) ? rindex(argv[0], '/') + 1 : argv[0];
    if (!strcmp(progname, "dnsdomainname"))
        type = DNS;
    else if (!strcmp(progname, "domainname"))
        type = NIS;
    else if (!strcmp(progname, "ypdomainname"))
        type = NIS_DEF;
    else if (!strcmp(progname, "nisdomainname"))
        type = NIS_DEF;
````
WindowsでPythonをつかう（PyCharm）

#はじめに
Python、最近の機械学習の流行りを受けて、周りにも使っている人が増えている気がします。MacやLinuxでは通常Pythonはインストールされているので良いのですが、Windowsだとひと手間必要です。そこで、WindowsでPythonを使うための環境を構築する手順をごくごく簡単にまとめました。ちなみに、ここではJetBrainsが開発しているPython用のIDEであるPyCharmを使う方法を書いています。

#① Pythonのインストール
[Python公式サイト](https://www.python.org/downloads/)からWindows用のPythonインストーラをダウンロードして、インストールします。今回は、2.X系の最新版(ver. 2.7.11 : 2016年6月現在)をインストールしました。インストールパスはデフォルト設定のままCドライブ直下にしました。

#② PyCharmのインストール
Pythonのインストールが終わったら、PyCharmを[PyCharm公式ページ](http://www.jetbrains.com/pycharm/)からダウンロードしてインストールします。有料のProfessionalと無料のCommunityがありますが、今回は無料のCommunityをインストールしました。同じ会社が作っているので当たり前かもしれませんが、Android StudioとUIがそっくりですね。
　
#③ PyCharmでのプロジェクトの作成
PyCharmを起動すると、以下のようなウィンドウが立ち上がります。
 
<img width="492" alt="図1.png" src="https://qiita-image-store.s3.amazonaws.com/0/116157/deeb6147-4856-aed4-f721-6bb77432d884.png">
　
Create New ProjectをクリックするとNew Projectウィンドウが開くのでLocationのuntitledを適当にリネームしてください。InterpreterはPythonが予めインストールされていれば勝手に記入されます。もし何も記載されていなければ①でインストールしたPythonのパスをマニュアルで入れてください。最後にCreateを押せばプロジェクト作成は完了です。
　
<img width="492" alt="図1.png" src="https://qiita-image-store.s3.amazonaws.com/0/116157/daf3d1e9-a4ed-e0ee-bfd2-b33528cc1d7b.png">
Guzzle6でTwitterAPIを叩く


PHPでのOauth認証後のAuthヘッダ実装を求めてLaravel Socialiteの中身を覗いていたのですが、
そこで使われている`league/oauth1-client`がいい感じだったので使い方をまとめておきます。

個人的には以下の要件でライブラリを探していたのでドンピシャな感じでした。

- HTTP 通信ではGuzzle 使いたい
- Auth ヘッダの再実装は避けたい

Authヘッダの自力生成とかはコードもいくらか上がっているのですが、
そこを再実装するのは何か行けてないなぁ…と思っていたところちょうど良いものに出会えたって感じです。
 
`league/oauth1-client`のHTTP通信はGuzzle3に依存しているため、
HTTP通信周りは自分で書き直す必要が会ったため、そのへんは自力で加えました。


````
$ composer require league/oauth1-client:~1.0
````

やりたかったことは「既に取得済みのアクセストークンを使ってAPIを叩く」です。

アクセストークン自体が未取得のケースでは素直にSocialite使った方がよさげです。

## コード

Guzzle6なので末尾のコード修正したら非同期に投げられます。

````
$tokenCredentials = new \League\OAuth1\Client\Credentials\TokenCredentials();
$tokenCredentials->setIdentifier(env("TWITTER_ACCESS_TOKEN"));
$tokenCredentials->setSecret(env("TWITTER_ACCESS_SECRET"));

$twitter = new \League\OAuth1\Client\Server\Twitter([
    'identifier' => env("TWITTER_CLIENT_ID"),
    'secret' => env("TWITTER_CLIENT_SECRET"),
    'callback_uri' => env("TWITTER_REDIRECT_URL")
]);

$method = "POST";
$url = "https://api.twitter.com/1.1/statuses/update.json";
$body = [
    "status" => "レイバンのサングラス",
];

$options = [];
$options["form_params"] = $body;
$options["headers"] = $twitter->getHeaders($tokenCredentials,$method,$url,$body);

try{
    $client = new \GuzzleHttp\Client();
    $client->request($method,$url,$options);
}catch(Throwable $e){
    throw $e;
}

````

こんな感じで上手いこと取得済みのアクセストークンを使いつつTwitterへの投稿を行うことが出来ました。

DBにガメてるアクセストークンを使って一斉にレイバンのサングラスを売りたい時などにご利用下さい。
ValidationAttributeで開始日と終了日が正常か検証するフィルターを作成する


# 状況

> 画面に開始日と終了日を入力するUIがあり、指定した範囲のデータを表示したい。

といったどこにでもある要求に対して、

> 検索機能はAPIを利用する

といったこれもまたどこにでもある要件。

# ほしいもの

開始日と終了日が反対だったらAPIに渡る前のバリデーションで弾きたかったので、

- 開始日は入力必須
- 終了日が空の場合は終了
- 開始日と終了日が逆だったらエラー

みたいな要件を満たすバリデーションフィルターを作った。


# 作ったもの

結構ドタバタなコードなので、そのままだと堅いです。
あと開始日の入力必須は余計だったかも。

```c#
/// <summary>
/// ２つの日付が開始日と終了日が反対になっていないか検証する属性.
/// 終了日プロパティにつけて、PropertyNameに開始日プロパティ名を指定してください.
/// </summary>
public class DateTimeOppositeAttribute : ValidationAttribute
{
  public string StartDatePropertyName { set; get; }
  public DateTimeOppositeAttribute()
  {
  }

  protected override ValidationResult IsValid( object value, ValidationContext validationContext)
  {
    // 開始日プロパティ取得
    var startDateProperty = validationContext.ObjectInstance.GetType().GetProperty(StartDatePropertyName);
    if (startDateProperty == null)
    {
      throw new ArgumentException( string.Format( "対象パラメータ名が見つかりません Name:{0}", StartDatePropertyName));
    }

    // 開始日プロパティの値取得
    var startDateValue = startDateProperty.GetValue(validationContext.ObjectInstance, null );
    if (startDateValue == null)
    {
      return new ValidationResult( "開始日を入力してください", new string [] { validationContext.MemberName });
    }
    var begin = startDateValue as DateTimeOffset?;
    if (begin == null)
    {
      throw new ArgumentException( string.Format( "渡された型が違います Type:{0}", startDateValue.GetType().FullName));
    }

    // 終了日
    if (value == null)
    {
      return ValidationResult.Success;
    }
    var end = value as DateTimeOffset?;
    if (end == null)
    {
      throw new ArgumentException( string.Format( "渡された型が違います Type:{0}", value == null ? "NULL" : value.GetType().FullName));
    }
    if (!end.HasValue)
    {
      return ValidationResult.Success;
    }

    if (begin > end)
    {
      return new ValidationResult( "日付が反対です", new string [] { validationContext. MemberName });
    }

    return ValidationResult.Success;
  }
}
```

自分が作る時に他フィールドとの連携記事が少なかったので、参考になれば幸いです。
"エンタメコードでみんなに笑顔を"(笑)

##はじめに

やってる事は手の込んだHello World。
でも普通に書いても面白くないので演算子オーバーロードと拡張メソッドを濫用してみた。
もちろんJVMで動くし、JavaScriptにコンパイルしてもちゃんと動作する。

Scalaの中置記法と記号メソッドを使って

```scala
ささやき > えいしょう > いのり > ねんじろ !
```

とかやってみた事がある人向け…なのか？

この記事に書いてあるような書き方は、もしかしたら何かの役に立つかもしれないし、立たないかもしれない。
でもそれ以上に、このタイトルを見てクリックした時の「ときめき」みたいなものを（以下省略）

##至高の演算子オーバーロード・インヴォーク

```kotlin:ShowMustGoOn.kt
package smile.world

fun main(args: Array<String>) {
    "Smile World"(笑) // == println("Smile World")
}

internal object 笑 {
    fun consume(x :Any?) = println(x)
}
internal operator fun Any.invoke(em :笑) = em.consume(this)
```

###解説

最後の行でAny型の拡張メソッドとして、invokeオペレータを定義している。
invokeオペレータはレシーバーオブジェクトそのものがメソッドであるかのように呼び出せる代物。
operatorキーワードをつけずに書くと *foo.invoke(bar)* になるところを *foo(bar)* と書けるようになる。

仮引数になんでも渡せてしまうのは具合がよくないので、直前で定義している **笑***object*に制限し、ついでに処理もそちらに委譲してみた。
もちろん、objectの名称が**笑**である必要は全然ない。**爆**とか**確信**とかでも構わない。
interfaceを定義してロガーやストリームに吐き出させるようなバリエーションを持たせるのも面白いかもしれない。

ちなみに笑object自身もAny型に含まれるため *(笑)(笑)(笑)(笑)* とか書けてしまう(笑)

ただし「*できる*」と「*するべき*」は違う。
どちらかといえば、こういう書き方は「*すべきでない*」だろう。
JavaScript の組み込みコンストラクターの new の有無での動作まとめ

JavaScript の組み込みコンストラクターって new の有無でなんとも言えない素敵動作をしてくれるので ECMAScript 5.1 を前提に動作の違いをメモっとく。仕様を眺めながら書いたもののあんまり厳密ではない。

動作表の続きに覚え方もメモっといた。

# 組み込みコンストラクターの new の有無での動作表 #

<table>
<tr><th>組み込みコンストラクター</th><th>new あり（[[Construct]] 内部メソッド呼び出し）</th><th>new なし（[[Call]] 内部メソッド呼び出し）</th><th>備考</th></tr>
<tr><td>Object</td><td>引数を Object 型に型変換して返す。引数がなし／Null 型／Undefined 型の場合は新しい Object オブジェクトを返す。</td><td>同左</td><td>仕様上は微妙な違いがある。</td></tr>
<tr><td>Function</td><td>関数の仮パラメーターとなる引数と関数のボディとなる引数で新しい Function オブジェクトを返す。</td><td>同左</td><td></td></tr>
<tr><td>Array</td><td>引数が Number 型で1つだけの場合はその長さで新しい Array オブジェクトを返す。それ以外の場合は引数を要素として新しい Array オブジェクトを返す。</td><td>同左</td><td></td></tr>
<tr><td>String</td><td>引数を String 型に型変換した値を持つ新しい String オブジェクトを返す。</td><td>引数を String 型に型変換して String 値を返す。</td><td></td></tr>
<tr><td>Boolean</td><td>引数を Boolean 型に型変換した値を持つ新しい Boolean オブジェクトを返す。</td><td>引数を Boolean 型に型変換して Boolean 値を返す。</td><td></td></tr>
<tr><td>Number</td><td>引数を Number 型に型変換した値を持つ新しい Number オブジェクトを返す。</td><td>引数を Number 型に型変換して Number 値を返す。</td><td></td></tr>
<tr><td>Date</td><td>引数なしの場合は現在の時刻 (UTC) を表す時間値を持つ新しい Date オブジェクトを返す。引数1つの場合は引数を日付として解析した結果の時間値を持つ新しい Date オブジェクトを返す。引数2つ以上の場合は引数を年・月・日・時・分・秒・ミリ秒とした時間値を持つ新しい Date オブジェクトを返す。</td><td>引数を無視して現在の時刻 (UTC) を表す String 値を返す。</td><td></td></tr>
<tr><td>RegExp</td><td>正規表現のパターンとなる引数と正規表現のフラグとなる引数で新しい RegExp オブジェクトを返す。</td><td>引数が RegExp オブジェクトで1つだけの場合は引数の RegExp オブジェクトを返す。それ以外の場合は正規表現のパターンとなる引数と正規表現のフラグとなる引数で新しい RegExp オブジェクトを返す。</td><td></td></tr>
<tr><td>Error</td><td>引数を String 型に型変換した値を message として持つ新しい Error オブジェクトを返す。</td><td>同左</td><td></td></tr>
</table>

# 型変換系 #

new なしの型変換でまとめると覚えやすい。

```
var o = Object(x);
var s = String(o);
var b = Boolean(o);
var n = Number(o);
```

# リテラル系 #

リテラルや初期化子があるものでまとめると覚えやすい。

```
var o = new Object();   // var o = {};
var f = new Function(); // var f = function() {};
var a = new Array();    // var a = [];
var r = new RegExp();   // var r = /(?:)/;
```

new なしでも動作がほぼ同じになるということも覚えておこう。

```
var o = Object();   // var o = {};
var f = Function(); // var f = function() {};
var a = Array();    // var a = [];
var r = RegExp();   // var r = /(?:)/;
```

実装ではリテラルや初期化子を使用するのがいいと思う。

# ラッパーオブジェクト系 #

プリミティブ値のオブジェクト（ラッパーオブジェクト）でまとめると理解しやすい。

```
var s = new String("");
var b = new Boolean(false);
var n = new Number(0);
```

# 自然なオブジェクト系 #

new ありが自然なオブジェクトでまとめると覚えやすい。（無理矢理感は否めないまとめ方……。）

```
var d = new Date();
var e = new Error();
```

# その他系 #

new なしの `Error()` はショートハンドとしての利用価値はありそうだけど、`new Error()` でいいんじゃないだろうか。コーディング規約にもよりそうだけど。

```
var e = Error();
```

new なしの `Date()` は ECMAScript 仕様随一の Supercalifragilisticexpialidocious な動作をする。どうしてこうなった感がすごい。

```
var d = Date();
```

# 参考文献 #

ECMA-262 Edition 5.1を読む
MacOSX で brew update が error の時に、試すこと

# Overview

brew updateしようとしたら、以下のようにエラーがでたときに試したこと。

```
$ brew update
warning: unable to unlink .yardopts: Permission denied
warning: unable to unlink CONTRIBUTING.md: Permission denied
warning: unable to unlink SUPPORTERS.md: Permission denied
fatal: cannot create directory at '.github': Permission denied
Error: Failure while executing: git pull --quiet origin refs/heads/master:refs/remotes/origin/master

$ sudo brew update
Password:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- mach (LoadError)
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/Homebrew/extend/pathname.rb:2:in `<top (required)>'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/Homebrew/global.rb:3:in `<top (required)>'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/brew.rb:15:in `<main>'
```

# 解決策

```
$ cd /usr/local
$ git status
汚れている
$ git reset --hard && git clean -df
HEAD is now at 3cc2026 lzlib: update 1.7 bottle.
$ sudo brew update
```

で、その後、本当はやりたかった

```
$ brew install mosquitto
```
を正しく行うことができましたとさ。

ちなみに、brew updateをしなければと思ったのは以下のエラーが出たため

```
$ brew install mosquitto
..snip..
==> Installing mosquitto dependency: libwebsockets
==> Downloading http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.4-chrome43-firefox-36.tar.gz
######################################################################## 100.0%
curl: (56) SSLRead() return error -9806
Error: Failed to download resource "libwebsockets"
Download failed: http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.4-chrome43-firefox-36.tar.gz
```
Ajaxアクセスでなければエラーを返すdecorator

# 目的
* Ajaxリクエスト用のアクションなので、Ajaxリクエストの場合のみレスポンスしたい。
* たとえば、WebブラウザからURL直接アクセスされたり、curlとかでスクレイピングされた場合はレスポンスを返したくない。

# 対応方針
* AjaxはすなわちJavaScriptでの通信で、XMLHTTPRequest(XHR)という約束事に沿って実行されます。
* この際にリクエストヘッダに X-Requested-With ヘッダがセットされます。
* jQueryなどでは（おそらくセキュリティ的な理由から）クロスドメインアクセスの場合はこのヘッダがセットされなかったりします。
* 判定方法としては、"リクエストヘッダにX-Requested-WithがあればAjax、なければ非Ajax"とします。

# 対応方針(続き)
* Djangoにはこの判定メソッドが備わっています。 (see:[HttpRequest.is_ajax](https://docs.djangoproject.com/ja/1.9/_modules/django/http/request/#HttpRequest.is_ajax))
* リクエストがAjaxだったらJSON、そうでなければhtmlを返すような場合はそれぞれ判定すれば良さそうです。
* ただ、今回はAjaxリクエストでなければエラーにしたいので、デコレーターにしてみます。

# コード
* [gist shinsaka/ajax_required_decorator.py](https://gist.github.com/shinsaka/097800f6b4525538fe846a3fb1e0614b)

```py:utils/decorators.py
def ajax_required(ret_unexcepted):
    """
    Decorator for determing whether the request is Ajax, in Django-views.
    e.g.) in views.py
    from django.http import HttpResponseBadRequest
    from utils.decorators import ajax_required
    
    @ajax_requirxed(HttpResponseBadRequest())
    def index(request):
        pass
    """
    def _ajax_required(func):
        def wrapper(request, *args, **kwargs):
            if not request.is_ajax():
                return ret_unexcepted
            return func(request, *args, **kwargs)
        return wrapper
    return _ajax_required
```

# 具体的には
* コメントどおりなのですが、具体的には。

* utils/decorators.py に上記コードを記述
* app/views.pyに下記記述（Ajaxリクエストでない場合はBadRequestを返す）

```py:app/views.py
from django.http import HttpResponseBadRequest
from utils.decorators import ajax_required

@ajax_required(HttpResponseBadRequest())
def index(request):
    # any code
```

# 確認
* 対応前（正常にレスポンスしている）

```
 $ curl --head http://localhost:5000/app/index/
 HTTP/1.1 200 OK
 ...
```

* @ajax_required記述後（エラーレスポンスに変化している）

```
 $ curl --head http://localhost:5000/app/index/
 HTTP/1.1 400 Bad Request
 ...
```
【Rails】autodocを使ってAPIのドキュメントを作る

# 前提
rspecでrequestsのテストを書いていること

# Gemfile
```
gem 'autodoc'
```
# `autodoc: true`にする

ドキュメントを作成したいテストに`autodoc: true`を書きます

```
RSpec.describe 'Products request', type: :request, autodoc: true do

    ...

end
```
# 設定を書く

`spec/spec_helper`に設定を書いていきます

```
Autodoc.configuration.path = "path/to/doc"
Autodoc.configuration.suppressed_request_header = ['Cache-Control', 'Content-Length', 'X-Request-Id', 'ETag', 'Set-Cookie']
Autodoc.configuration.suppressed_response_header = ['Cache-Control', 'Content-Length', 'X-Request-Id', 'X-Runtime', 'X-XSS-Protection', 'ETag']
template = "path/to/template"
```

* path - ドキュメントを出力するパス
* suppressed_request_header - APIのドキュメントに表示しないリクエストヘッダー。ドキュメントに出さなくてもいいリクエストヘッダーがあれば書きます。
* suppressed_response_header - APIのドキュメントに表示しないレスポンスヘッダー。ドキュメントに出さなくてもいいレスポンスヘッダーがあれば書きます。
* template - ドキュメントに使うtemplateファイル。デフォルトではdocument.md.erb

他にオプションがあるみたいです。
https://github.com/r7kamura/autodoc#configuration
# `AUTODOC=1`にする
```
export AUTODOC=1
```
# テストを実行する
```
bundle exec rspec
```
# ドキュメントが生成される

いい感じにドキュメントを生成してくれます。

<img width="1106" alt="autodoc.png" src="https://qiita-image-store.s3.amazonaws.com/0/32184/1b16770f-819e-093b-21d5-337d9f4e1e86.png">
Codeigniterでdatabase接続確認を行う際に気をつける事

使用環境キーワード:virtualbox centos6.5 apache php5.6 mysql
mysql上でデータベースの設計をおこなっている事を前提とする。
コントローラのdatabase.phpにDB_test()を追加します。
本来はモデルに書き込む作業ですが、今回はとにかく確認だけということでコントローラでDB接続を行っています。

```php:controller/Welcome.php

public funtion DB_test()
{
    $this->load->database();
    $query = $this->db->query('select * from テーブル名');
    var_dump($query->result());
}

```

これで http://localhost/プロジェクト名/index.php/Welcome/DB_test にアクセスすればなにかしらのデータが返ってくるはず、、、エラーが発生してクエリが失敗してしまいます。
この段階ではDBに接続が上手く出来ていません。

そこで必要だったのが mysql-devel mysql-develとは開発に必要なものが入っているパッケージのようなものです。

```
sudo yum -y install mysql-devel
```

これでエラーが解消され、var_dumpによりテーブルの中身が表示され、DBに接続確認ができました。
Webサービス・アプリのレポート作成で大切なことまとめ

本稿では、ユーザー登録をして利用できるアプリケーションを例にレポート作成で大切なことをまとめます。
アプリケーションの概要は、SNSでユーザーがコミュニティを介して交流を行うというもので、これを利用してもらっていることとします。
まとめるレポートはシステム管理者が見るものとします。
レポートをまとめる目的は、最終的にどのようにユーザーを増やしていくのか考えるためです。

# どのような値をレポートとして出力すると良いか
## レポートで出力したいデータ例
- アプリ起動者数
- ユーザー会員登録者数
- ユーザー会員登録率(ユーザー会員登録者数 / アプリ起動者数)
- DAU(Daily Active Users)
 - (例：ログインした時にカウントしたログをユーザ別に週ごとで集計したもの)
- MAU(Monthly Active Users)
 - (例：ログインした時にカウントしたログをユーザ別に月ごとで集計したもの)
- コミュニティ作成数
- コミュニティ参加率
- コミュニティ作成率(コミュニティ作成人数 / コミュニティ作成数)
- ユーザー情報
 - ユーザーの都道府県ごとの集計
 - ユーザーの年代別の集計
 - ユーザーの職業分布
 - ユーザーの性別分布
 - ユーザーのログイン数
 - ユーザーのログイン率(ユーザーのログイン数 / ユーザーの総数)
 - ログイン平均回数
- 広告利用数(クリック)
- 広告利用率(ユーザーごとの広告利用数 / ユーザー会員登録者数)
- ユーザー定着度※
- ユーザーのアクションに対するコンバージョン数※

※コホート分析を利用した時に取得できる値

## コホート分析
コホート分析とは
> コホート分析とは、平たく言えば「時間の経過に伴うユーザー行動の変化」を可視化する分析方法です。
たとえば、１月に訪問のあったユニークユーザーのうち、２月は◯％戻ってきて、３月には◯％にまで減って…というように「ユーザーの定着度」を分析したり、初回アクセスから１ヶ月後に購入に至ったユニークユーザーは◯％で、２ヶ月後は…という「コンバージョン行動への変化」を分析したりします。
それらをわかりやすく表にまとめて、行動変化率を可視化する事ができます。

引用元:[例えば、Googleアナリティクスでコホート分析ができる時代になった！](http://seo-scene.com/cohort-analytics/)

ユーザー定着度とコンバージョン数を知ることでユーザーを増やすために何をするか考える材料にする

# リアルタイムで知りたい情報
- アプリケーション利用者数
 - 公開したページが一般ユーザーに正しく使われているか確認するため
 - 「1利用者あたりのCPU使用率が高い」などの不具合発見に役立つため

# レポート機能を実装するときにやるべきこと
- レポート表示に使用するデータはレポート用のデータを格納するDBに予め集計しておく
 - 毎回ページを開く度にデータを集計しないようにすることで、集計するデータ量が増えた時にページを開くまでの時間が長くなることを防ぐため
- 集計したデータの時間を表示する際にUTC時間なのか日本時間なのか記載する
- 更新履歴を記載する
 - データの取得方法を変えた時等にそれがわかるようにするため

# レポート画面にあると便利な機能
- データ絞り込み機能
- 日付範囲指定機能
SwiftのGCD（非同期処理）について

並列処理をしたり非同期で処理をしたりする処理を今まではコピペでやっていただけなのできちんと調べる。

## まずGCDとは
Grand Central Dispatchの略
mac osやiOSが持っている非同期に処理を実行する技術のこと

appleのドキュメントには

```
通常はアプリケーション中に記述するスレッド管理用のコードを、システムレベルで実装したも
のです。開発者がしなければならないのは、実行したいタスクを定義し、適切なディスパッチキュー
に追加することだけです。するとGCDは、必要なスレッドを生成し、そこでタスクを実行するよう適
切にスケジューリングします。スレッド管理がシステムの一部として組み込まれているので、全体を
見渡してタスクを管理、実行でき、従来のスレッドよりも効率が向上します。
```

と書いてあるので、プログラムを書く人はディスパッチキューに追加するだけで使用可能

## 使い方
サンプル

###2017/2/24 Swift3用に追記


```
// サブスレッドで実行
DispatchQueue.global(qos: .default).async {
  // サブスレッド(バックグラウンド)で実行する方を書く 
    DispatchQueue.main.async {
    	// Main Threadで実行する
    }
}
```

DispatchQueue.global(qos: .default) = システムで用意されたキューを使用
自分でラベル名を指定してキューを作成する場合は
DispatchQueue(label: "jp.hogehoge.app.queue")
のようにする
async = 非同期
DispatchQueue.main.async = メインスレッドで実行


## 複数並列で行う場合

複数処理を走らせ、完了したら処理を行う場合は `DispatchGroup()`にenterして、その間に `DispatchQueue`を走らせる。
完了したら` dispatchGroup.notify`の中が実行される.


```
let dispatchGroup = DispatchGroup()
// 並列なのでconcurrentを追加。指定しな場合は直列
let dispatchQueue = DispatchQueue(label: "label name", attributes: .concurrent)

// 実際はここでfor文とかで回す
dispatchGroup.enter()
dispatchQueue.async(group: dispatchGroup) {
    print("なんかの処理")
    dispatchGroup.leave()
}

// dispatchQueが完了したら呼ばれる
dispatchGroup.notify(queue: .main) {
    print("終わった")
}
```

### 以下、以前の書き方(エラー出ます)

```
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    // Backgroundで実行
 
    dispatch_async(dispatch_get_main_queue(), {
          // Main Threadで実行する
    });
});
```

これで非同期処理で実行される。
それぞれの意味
dispatch_async =非同期処理
dispatch_get_global_queue = グローバルキュー　バックグラウンドで実行する方
dispatch_get_main_queue = メインキュー　メインスレッドで実行する方
DISPATCH_QUEUE_PRIORITY_DEFAULT =　優先度
実行処理は{}の中
pythonファイルをスクリプト実行

#pythonファイルをスクリプト実行

MATLABでの.mファイルのようにpythonファイルのスクリプト実行をしたいと思い調べてみた





## %run -i (IPython 環境の場合)
条件：IPython（Jupyter Notebookなど）

「test.py」のあるフォルダで

```
%run -i test.py
```
によって、「test.py」のスクリプトでの実行ができる。

名前空間はメインのものと同じとなるもよう。
forの中に入れることも可能。


## execコマンド (IPython以外でも使える方法)　2018.9.7追記
「test.py」のあるフォルダで

```py
with open('test.py', 'r', encoding='utf-8') as f:
    script = f.read()#スクリプトのファイルを文字列として読み込む
    exec(script) #execで文字列を実行
```
によって、「test.py」のスクリプトでの実行ができる



通常、別ファイルからモジュールとしてをimportを使った場合、グローバル変数がファイル毎に異なるので、純粋なスクリプトにはならない模様。
名前空間が別ファイルにまたがり、可読性が悪化するなど、あくまで個人の実験用として使うべき。
Apple Configurator 2と構成プロファイルでWi-Fi接続情報を手軽に管理

## 構成プロファイルって？
設定アプリで設定できる内容を定義したファイルのことです。
Crashlyticsの追加時に、 設定アプリ > 設定 > 一般 > プロファイルとデバイス管理 に追加されるので、見たことがあるかもしれません。

![構成プロファイル.png](https://qiita-image-store.s3.amazonaws.com/0/33395/832592d6-23a6-bf01-373b-919150322281.png)

## 構成プロファイルを使うと何ができる？
以下が、構成プロファイルを作成するためのMacアプリ、Apple Configurator2のスクリーンショットですが、左の列を見てわかるように、設定アプリで手動で設定できるものは、概ね設定できるようになっています。
<img width="1038" alt="スクリーンショット 2016-06-09 22.51.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/33395/ed93e58d-73a3-f714-6f9c-d737be29aded.png">

## 構成プロファイルの作り方
今回は、例としてWi-Fiの設定を簡素化するための構成プロファイルを作ってみます。

- Apple Configurator2を起動
- メニューバーの ファイル > 新規プロファイル を選択
- 一般 の項目には、先程のスクリーンショットのように適当な内容を入力します。
- 次にWi-Fiを選択し、**構成** ボタンをクリックします。
- 以下のスクリーンショットのように、必要な項目を入力します。作成は以上です。
<img width="1038" alt="スクリーンショット 2016-06-09 22.53.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/33395/e05ff941-696c-c012-8a23-261c5a2f310b.png">

## 構成プロファイルをインストールする方法
構成プロファイルをインストールする方法はいくつかありますが、今回はメールに添付されたファイルを開いてインストールします。
<img width="414" alt="Screen Shot 2016-06-09 at 23.04.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/33395/548a994a-2176-4e7a-474d-0834633d4650.png">

添付したファイルをクリックすると、プロファイルのインストール画面へ遷移するので、インストールを選択

<img width="414" alt="Screen Shot 2016-06-09 at 23.06.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/33395/f634395d-a85a-32f5-8dab-55d315e4b3ef.png">

これで新しい構成プロファイルがインストールされました。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/33395/5ead9459-9072-8c48-740e-032ed5022a83.png)

## まとめ
今回紹介した方法は、検証端末のセットアップなどにも適用できるかと思いますので、使ってみてください！

## 参考
- [Configuration Profile
Reference](https://developer.apple.com/enterprise/ConfigurationProfileReference.pdf)
Nginx + Passenger + Rails で環境変数が取得できない

```
passenger HOME environment variable (or HOMEDRIVE and HOMEPATH) must be set and point to a directory
```

と言われる。

確認してみよう。

```:zsh
cd /path/to/project_direcotry
gem environment
```

色々試したが、結果的には以下のようにと書けるので、それで解決。

```:nginx.conf
server {
  server_name www.foo.com;
  root /path/to/project_direcotry;
  passenger_enabled on;

  passenger_env_var HOME /path/to/home; # ←ここ
}
```

[Passenger Configuration reference / passenger_env_var](https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var)

なお、上記で設定する `passenger_env_var HOME` の値については、 `printenv` と同じで動きました。
Fiber#resumeを呼び出せる回数

[Fiber](http://docs.ruby-lang.org/ja/2.0.0/class/Fiber.html)についてよく分からずにコードをいじったら思い通りに動かなかったので勉強した。

## 簡単な例で動作確認
無限ループで `Fiber#resume` を呼び出してみる。

```ruby:fiber_sample1.rb
f = Fiber.new do
	"fiber".each_char { |c| Fiber.yield(c) }
end

loop { p f.resume }
```

```text
"f"
"i"
"b"
"e"
"r"
"fiber"
FiberError: dead fiber called
```

`Fiber.yield(c)` は5回なのに、6回目に何か別のものが返ってきている。7回目でようやく `FiberError` 。

## コードの動き
Fiberブロックのループを展開してみる（`"fiber"` はループの戻り値）。そうすると[リファレンスマニュアルの例](http://docs.ruby-lang.org/ja/2.0.0/class/Fiber.html#I_RESUME)と同じ形になる。

```ruby:fiber_sample1a.rb
f = Fiber.new do
	# 1回目のresumeではFiberブロックの先頭から始まり、初回のFiber.yieldの引数が返る
	Fiber.yield("f")
	Fiber.yield("i")
	Fiber.yield("b")
	Fiber.yield("e")
	Fiber.yield("r")
	# 6回目のresumeでは最後のFiber.yieldから始まり、Fiberブロックの結果が返る
	"fiber"
end

p f.resume   #=> "f"
p f.resume   #=> "i"
p f.resume   #=> "b"
p f.resume   #=> "e"
p f.resume   #=> "r"
p f.resume   #=> "fiber"
p f.resume   #=> FiberError: dead fiber called
```

これまでは何となく `Fiber#resume` は `Fiber.yield` と一対一で対応していると思っていたが、実際はFiberブロックを `Fiber.yield` で区切った各区間に対応する。1回分ずれるのはそのため。

![main_and_fiber.png](https://qiita-image-store.s3.amazonaws.com/0/127130/b3c5894a-845c-59ae-e127-1ba36b8cf7d3.png)

### オブジェクトのやりとり

本題とは関係ないが、`Fiber#resume` で引数を指定してオブジェクトを渡せることを初めて知った。Fiberブロック側では、初回はブロックの引数として、2回目以降は `Fiber.yield` の戻り値として受け取れる。

```ruby:fiber_sample2.rb
f = Fiber.new do |obj|
	p obj
	5.times { p Fiber.yield }
end

1.upto(Float::INFINITY) { |i| f.resume(i) }
```

```text
1
2
3
4
5
6
FiberError: dead fiber called
```

`Fiber.yield` の引数（とブロックの結果）が `Fiber#resume` の戻り値になることと合わせれば、処理を切り替えるところ（上の図で左右に移動しているところ）で相手にオブジェクトを渡せることになる。

せっかくなので、このことを使って遊んでみた。以下のコードは[フィボナッチ数列](https://ja.wikipedia.org/wiki/フィボナッチ数)を出力する。

```ruby:fiber_sample3.rb
Fiber.new do
	p a = 1
	loop { p a += Fiber.yield(a) }
end.tap do |f|
	p a = 0
	6.times { p a += f.resume(a) }
end
```

```text
0
1
1
2
3
5
8
13
21
34
55
89
144
```

## まとめ
`Fiber#resume` を呼び出せる回数は、`Fiber.yield` の回数+1まで。少ない場合はブロックが最後まで実行されず、多い場合は `FiberError` が発生する。
UIAlertControllerでアクションシート表示

すぐに使えるようにメモ

```swift:UIActionSheet

        alert = UIAlertController(title: "シート表示", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

        alert.addAction(UIAlertAction(title: "sheet1", style: UIAlertActionStyle.Default, handler: {
            (action:UIAlertAction)in
            print("sheet1")
        }))
        
        alert.addAction(UIAlertAction(title: "sheet2", style: UIAlertActionStyle.Default, handler: {
            (action:UIAlertAction)in
            print("sheet2")
        }))
        
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {
            (action:UIAlertAction)in
            self.alert.dismissViewControllerAnimated(true, completion: nil)
        }))

        self.presentViewController(alert, animated: true, completion: nil)


```
Atomの覚え書き


# はじめに

Atomを自宅で使用する際に、効率よく使用する為の覚書です。
環境はMacOSになります。

## 執筆者のVS Codeへの移行について

Atomの本を買ったが、業務でVS Codeを利用する場面が多くて移行してしまった

## Atom更新終了について

2022/12/15をもって開発は終了となった。

# キーボード表記

>「⇪」= caps lock
>「⇧」= shift
>「^」= control
>「⌥」=「Option」= Alt
>「⌘」= Command

# コマンド一覧

アクション            |             コマンド
:--------------- | ---------------:
行頭へ移動            |         control + A
行末へ移動            |         control + E
行を指定して移動         |         control + G
単語の先頭へ移動         |       Option + B
単語の末尾へ移動         |       Option + F
インデント追加          |            ⌘ + ]
インデント解除          |            ⌘ + [
コメントアウト          |            ⌘ + /
改行削除             |            ⌘ + J
カーソル位置の単語を選択     |            ⌘ + D
検索               |            ⌘ + F
シンボルを検索          |            ⌘ + R
選択中の文字で検索        |            ⌘ + E
新規タブを追加          |            ⌘ + N
画面を閉じる           |      ⌘ + W
次のタブを選択          |        ⌘ + Shift
行の入れ替え           |    control + (↑ or ↓)
Markdownプレビューを開く | Shift +　control + M
KotlinでData Bindingをする - カスタムセッター編

簡単なサンプルですがメモとして残します。
KotlinでData Bindingのカスタムセッターを使う例です。

# カスタムセッターとは
これを用いるとレイアウトへの値のバインドをセッターを通じて行うことができます。
セッターはプログラムで書くので、プログラム内で複雑な処理を行い、その結果をバインドするようなことができるようになります。


# カスタムセッターに使われるメソッドを定義する
ポイントは、下記です。

* Kotlinの`object`構文を使ってシングルトンのオブジェクトを作成
* `@BindingAdapter`アノテーション以外に、`@JvmStatic`も付与する
* `@BindingAdapter`アノテーションの中に、任意の属性を定義する
  * ここで定義した属性をあとでレイアウトファイル内で用いる
* メソッドの第一引数は、カスタムセッターが使用されるViewとする
* メソッド名はなんでもよい

例えばカスタムセッターを使って`text`プロパティに値をバインドする場合は、以下のようになります。

````CustomizedSetter.kt
object CustomizedSetter{
    @JvmStatic
    @BindingAdapter("customAttr1", "customAttr2")
    fun customizedSetterMethod(view: TextView, attr1Value: String, attr2Value: String) {
        view.text = "first attr is " + attr1Value + ". second attr is " + attr2Value + "."
    }
}
````

# レイアウトから定義したカスタムセッターが呼ばれるようにする
カスタムセッターを使用するレイアウトファイルを開き、`@BindingAdapter`アノテーションの引数で指定した属性にカスタムセッターに渡したい引数を記載します。

````SampleLayout.kt
<layout ...>
    <data>
        <variable
            name="order"
            type="com.example.kotlinsample.model.Book" />
    </data>
    <..略..>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ここはカスタムセッター内でセットするので無視される"
            customAttr1="@{String.valueOf(order.count)}"
            customAttr2="@{order.book.title}"
        />
    </..略..>
</layout>
````

# 実行する
実行すると定義したカスタムセッター`customizedSetterMethod`が呼ばれ、結果が反映されます。
上記の例だと、

* カスタムセッターの第1引数は、TextView
* カスタムセッターの第2引数は、`customAttr1`の値
* カスタムセッターの第3引数は、`customAttr2`の値

として呼び出されます。
カスタムセッターないで`text`を設定しているので、レイアウト上で設定した`text`は無視されます。

なお、バインドしたモデルが`BaseObservable`を実装しており、適切にプロパティの変更が通知される場合にはプロパティの変更があるたびにカスタムセッターが呼び出されます。

BaseObservableの利用についての詳細は[KotlinでData Bindingをする - Observable Object編](http://qiita.com/kykomi/items/01ee72f82c6f36db0c16)を参照してください。

# Old Value と New Value
カスタムセッターのメソッドの定義によっては、これまで設定していた属性値(`Old Value`と勝手にここでは呼びます）をカスタムセッターの引数から取得できます。
メソッド定義の仕方は、`Old Value`の引数を先に、新しく設定された属性値を後に書きます。

たとえば、このような感じです。

````CustomizedSetter.kt
object CustomizedSetter{
    @JvmStatic
    @BindingAdapter("customAttr1", "customAttr2")
    fun customizedSetterMethod(
            view: TextView,
            oldAttrValue1: String?, // `customAttr1`の今までの値
            oldAttrValue2: String?, // `customAttr2`の今までの値
            attr1Value: String,
            attr2Value: String) {
        view.text = "first attr is " + attr1Value + ". second attr is " + attr2Value + "."
        println(old1 + old2)
    }
}
````

ポイントは

* Kotlinで書く場合、`Old Value`はオプショナルで受け取る必要がある
  * 初回に呼び出されたときは`Old Value`は`null`だから
* 属性の数の分、`Old Value`を先に引数として定義し、その後に新しい属性値を引数として定義する

上部のカスタムセッターと見比べれば分かりやすいと思います。

# 参考
* [Data Binding Libary の Custom Setterの章](https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters)
ImageMagicで画像処理


この画像(1613*1210)を使って画像を処理します！

![40_bb8.jpg](https://qiita-image-store.s3.amazonaws.com/0/80399/18909691-60b9-006c-012a-eb058f870188.jpeg "40_bb8.jpg")


## 画像サイズ調整
 `convert -geometry 1000*500 [対象画像] [出力画像]` 
 `convert -geometry 20%*20% [対象画像] [出力画像]` 
 `convert -geometry 20% [対象画像] [出力画像]`  

縦*横でサイズを指定して出力！
処理する対象となっている画像の元のサイズは、 `4032*3024` でした。このサイズだとqiitaに乗らなかったため、40%に縮小して載せています。便利！

## 画像を切り取る
 `convert -crop 1000x1000+160+400 [対象画像] [出力画像]` 

始点(始点(160,400)から(960 * 720)のサイズを切りとる！

![cutfile1.jpg](https://qiita-image-store.s3.amazonaws.com/0/80399/1ac0490a-5d75-8ebd-1f0f-b0c24f818f04.jpeg "cutfile1.jpg")

こうなった！(960*720)

## 画像を回転させる
 `convert -rotate [対象画像] [出力画像]` 

時計回りに30°回転！
![rotate.jpg](https://qiita-image-store.s3.amazonaws.com/0/80399/bdf54b3a-a27d-de78-a8c3-40ead2e734df.jpeg "rotate.jpg")

こうなった！(2003*1856)

## 画像の強調
 `convert -equalize [対象画像] [出力画像]` 
 
 画像を強調する！
 ![equalize.jpg](https://qiita-image-store.s3.amazonaws.com/0/80399/62c6a342-9272-b9bc-5056-5277dd858df5.jpeg "equalize.jpg")

こうなった！(1613*1210)

こんな感じで簡単に画像処理をすることができました！
RSpec でエラーを捉えらんないアレなミス

考えてみれば当たり前の話。

でも RSpec から離れるとまたやらかしそうなので、メモ。

環境
----

- RSpec 3.4.4
- Ruby 2.2.3

参考
----

- [Module: RSpec::Matchers — Documentation by YARD 0.8.7.4](http://rspec.info/documentation/3.4/rspec-expectations/RSpec/Matchers.html#raise_error-instance_method)
  - `raise_error` の項目
- [Module: RSpec::Core::MemoizedHelpers — Documentation by YARD 0.8.7.6](http://rspec.info/documentation/3.4/rspec-core/RSpec/Core/MemoizedHelpers.html#subject-instance_method)
  - `subject` の項目

捉えらんない
----

~~~ruby
expect(instance.method).to raise_error(MyError)
~~~

上記では `instance.method` の処理で起きたエラーを捉えらんない。処理は `expect` メソッドに渡される前に実行されるからだ。

当たり前。

しかし `expect` といえば検査対象を括弧に入れるものだと思い込んでいた。

### 捉える

エラーを捉えるには、エラーが発生する処理を `expect` のブロックに入れる。

~~~ruby
expect { instance.method }.to raise_error(MyError)
~~~

捉えらんない 2
----

`is_expected` を使ったときにも遭遇。

~~~ruby
subject { instance.method }
is_expected.to raise_error(MyError)
~~~

`subject` 内でエラーを起こしても `is_expected` では捉えらんない。これは捉えられてもいいんじゃないか感。

### 捉える

愚痴っていたら、コメント欄にて @jnchito さんからアドバイスを頂いた。:thumbsup:

>　is_expectedを使うときはラムダやProcを使うと、期待した動きになりますよ。
>
> ~~~ruby
> describe 'raise' do
>   subject { -> { raise 'test' } }
>   # ProcでもOK
>   # subject { Proc.new { raise 'test' } }
>   it { is_expected.to raise_error(RuntimeError, 'test') }
> end
> ~~~

アドバイスを元にコードを試したり、あらためて仕様を読んだりする。

`is_expected` の検査対象は `subject` の状態で決まる。これは `subject {}` のようにブロックを渡すことで更新できるのだけど、保持・再利用されるのはブロックそのものではなく、このブロックの返り値。

`subject` が保持する値が Proc や lambda の場合 `is_expected` は `expect {}` と同等となり、それ以外の値では `expect()` と同等となる。

問題となったコード例を書き換えるとこうなる。

~~~ruby
subject { -> { instance.method } }
is_expected.to raise_error(MyError)
~~~

こうでもいける。

~~~ruby
subject { instance.method }
expect { subject }.to raise_error(MyError)
~~~

後者の方は、例えば引数によってインスタンスの生成に失敗することをテストしたい場合等に `subject` を使いまわせる利点がある。

感謝！
Ruby | ループ内での評価はメソッドの戻り値にはならない

```rb
def example
  3.times do
    false
  end 
end
```

```rb
example # => 3
```

なんとなく false が返りそうな気がしてしまうが。

この場合は `3.times` の戻り値が、そのまま example メソッドの戻り値になる。
なぜなら `3.times` もメソッドなので、example メソッドの中で最後に評価されるのは、その戻り値だからだ。

# 環境

- ruby 2.3.1



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Github | アカウントに二段階認証を設定しよう！

セキュリティ大事。

# Settings > Security 

https://github.com/settings/security にアクセス。
[Set up two-factor authentication] を選ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/264b3ebb-f7fb-bba2-fd00-e4db1a38ac48.png)

# コードを受け取り方を選ぶ

電話とSMSがある。
ここでは右の  SMS を選ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/2457d30b-eb36-06a6-5a5e-2f2661c6838c.png)

# 認証コードを携帯に送る

Japan を選んで自分の電話番号を入力する。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/e4ee3c90-1f28-870a-155c-825f4b44fe92.png)

# 携帯で SMS をチェック

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/74bb0297-4cb0-458e-ec5f-97729bc14718.png)

# GitHubで、受け取った認証コードを入力する

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/97859336-12c2-a90d-4dce-6ba5cb9c168a.png)


# 認証成功

必要ならリカバリーコードを印刷しておくと良い。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/70872bd4-fd36-9739-f24e-c76cd392c1c8.png)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
サーバーサイドSwiftのPerfectを動かす


Perfectは[こちら](https://github.com/PerfectlySoft/Perfect)

まずはubuntu上でswiftを動かせるようにします
※前回投稿した記事で動かせるように出来ます [参考記事](http://qiita.com/AcaiBowl/items/bfd2418b9531a2661fa3)

前回同様下記でcontainer化してログインします

```
$ docker run -it --privileged ubuntu:swift-test /bin/bash
```

前回の記事でswiftのPATHを定義していない場合は定義してしまいましょう
（.bashrcでexportしないと毎回読み込まれないっぽいです。なんでかは気が向いたら調べます。。。）
そして読み込ませます

```
$ apt-get install vim
$ cd root/
$ vi .bashrc

export PATH=/swift-2.2.1-RELEASE-ubuntu15.10/usr/bin/:"${PATH}"

$ source .bashrc
$ cd /
```

ではPerfectをDLしてくるところまでやります
[Perfectの最新リリース](https://github.com/PerfectlySoft/Perfect/releases)は現在v1.0.0みたいなので落として解凍します

```
$ wget https://github.com/PerfectlySoft/Perfect/archive/v1.0.0.tar.gz
$ tar xzf v1.0.0.tar.gz

$ cd Perfect-1.0.0/
```

makefileがあるのでmakeを使うみたいです
makeとその他必要なライブラリをインストールします

```
$ apt-get update
$ apt-get install libevent-dev libsqlite3-dev libicu-dev libcurl4-openssl-dev uuid-dev libssl-dev make
```

PerfectはPerfectLibとPerfectServerによって構成されており、PerfectServerはPerfectLibが必要なのでビルドします

```
$ cd PerfectLib
$ make clean
$ make
$ make install
```

次にPerfectServerをビルドします

```
$ cd ../PerfectServer
$ make clean
$ make
$ make install
```

（実は「Perfect-1.0.0/」上でmakeをすれば勝手にやってくれるっぽい）

ここまでこればあとは下記を実行すればPerfectが動きます

```
$ perfectserverhttp
```

お疲れ様でした！
※commitを忘れずに☆

---

~追記~

動作確認までしてみましょう！

docker-machineのIPアドレスを調べておきます
出てきたIPアドレスをメモしておきましょう。

```
$ docker-machine ip
```

ポートを指定してPerfectをインストールしたimageをcontainer化します

```
$ docker run -it -p 8181:8181 ubuntu:swift-test /bin/bash
```

perfectを動かします

```
$ perfectserverhttp
```

さあ、ブラウザで確認しましょう
http://(先ほど調べたIPアドレス):8181/

The file "/" was not found.

こんな感じで出てきましたか？
以上です！
めざせNode.jsライブラリマスター （6）image-palette

#【ライブラリ説明】
　画像の色情報を抽出

#【プログラム】
　ピクセルごとの色は抽出できないのかな？
　これはあまり役に立たないかも・・・

```js:image-palette.py
var palette = require('image-palette');
var Color = require('color');
 
var colors = palette('./sasaki.jpg', function (colors) {
  data = Color().rgb(colors[0]);
  console.log(data);
  /*
  { values:
   { rgb: [ 235, 221, 215 ],
     hsl: [ 18, 33, 88 ],
     hsv: [ 18, 9, 92 ],
     hwb: [ 18, 84, 8 ],
     cmyk: [ 0, 6, 9, 8 ],
     alpha: 1 } }
  */
  console.log(data.values.rgb);
  // [ 235, 221, 215 ]
  console.log(data.values.rgb[0]);
  // 235
});
```

#【参考サイト】
　[npm](https://www.npmjs.com/package/image-palette)
　[github](https://github.com/dfcreative/palette)