OmniAICreator/Qiita-1.07M huggingface dataset:
wakatimeでEmacs上の作業時間の計測をする

<!---


--->

この記事は [Emacs Advent Calendar 2017](https://qiita.com/advent-calendar/2017/emacs) 及び [しむどん Advent Calendar 2017](https://adventar.org/calendars/2179) の20日目の記事です。

# wakatime

https://wakatime.com/

プログラミングの作業時間を自動的に収集してグラフ化してくれます。org-modeなどでタスクの時間計測をしている方も多いと思いますが、wakatimeではファイルがあるディレクトリからリポジトリなどの情報を用いてプロジェクトごとの時間を計測します。

# Emacsでwakatimeを使う

https://github.com/wakatime/wakatime-mode

wakatimeには各種エディタやブラウザ向けにプラグインが提供されています。Emacsにはwakatime-modeが提供されています。wakatime-mode自体はMELPAからインストールできます。

wakatime-modeの内部ではCLIコマンドの[wakatime](https://pypi.python.org/pypi/wakatime)を利用しているためそちらもインストールする必要があります。これはPython製のコマンドのためpipでインストールします。

```
$ pip install wakatime
```


# 設定

wakatimeの設定は.wakatime.cfgに記述します。 `api_key` にwakatimeのサイトで発行したapi_keyを設定します。


```$HOME/.wakatime.cfg
[settings]
debug = false
api_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
hidefilenames = false
exclude =
    ^COMMIT_EDITMSG$
    ^TAG_EDITMSG$
    ^/var/(?!www/).*
    ^/etc/
include =
    .*
offline = true
timeout = 30

```

あとは.emacs.d/init.elに次を記述します。

```
  (global-wakatime-mode t)
```

この状態でgitリポジトリ内のファイルを開くとリポジトリをプロジェクトと見立てて時間計測をしてくれます。

# ファイルのないものに対して計測を行う

上記であればプロジェクトの時間計測を行ってくれますが、ファイルがないもの(例えばtwittering-modeなど)では集計してくれませんでした。ファイルじゃないバッファの場合もプロジェクトとして計測したかったので、バッファ名をプロジェクトとしてみたてるようにカスタマイズして使っています。

wakatime-client-commandはwakatimeコマンドを生成するための関数です。これを上書きしてファイル名がなかったらバッファ名を用いるように変更しています。

```
  (defun wakatime-client-command (savep)
    "Return client command executable and arguments.
   Set SAVEP to non-nil for write action."
    (format "%s%s--file \'%s\' %s --plugin \"%s/%s\" --time %.2f%s%s"
            (if (s-blank wakatime-python-bin) "" (format "%s " wakatime-python-bin))
            (if (s-blank wakatime-cli-path) "wakatime " (format "%s " wakatime-cli-path))
            (or (buffer-file-name (current-buffer)) (buffer-name))
            (if (buffer-file-name (current-buffer)) "" (format " --entity-type app --project \'%s\' " mode-name))
            wakatime-user-agent
            wakatime-version
            (float-time)
            (if savep " --write" "")
            (if (s-blank wakatime-api-key) "" (format " --key %s" wakatime-api-key))))

  (defun wakatime-save ()
    "Send save notice to WakaTime."
    (wakatime-call t))

  (defun wakatime-bind-hooks ()
    "Watch for activity in buffers."
    (add-hook 'after-save-hook 'wakatime-save nil t)
    (add-hook 'auto-save-hook 'wakatime-save nil t)
    (add-hook 'first-change-hook 'wakatime-ping nil t))

  (defun wakatime-unbind-hooks ()
    "Stop watching for activity in buffers."
    (remove-hook 'after-save-hook 'wakatime-save t)
    (remove-hook 'auto-save-hook 'wakatime-save t)
    (remove-hook 'first-change-hook 'wakatime-ping t))
```
pythonを触ってみた。

###この記事を書いた人
23歳エンジニア1年目のエンジニア。
pythonに興味を持ち本を購入して学習中。
今回購入して参考にした書籍：[～短期集中講座～ 土日でわかる Pythonプログラミング教室](http://www.sbcr.jp/products/4797388978.html?sku=4797388978#supportDl)

#最初に不安だった・思っていたこと
- pythonってすごい難しそうだ。
- 難しい処理とか出てきて挫折しそう。
- 環境構築苦手だし大丈夫かな…
- AIを触ってみたい・作りたい！

*まあとりあえずやってみよう的なノリで始めました！*

#今回やったこと
- docker-toolbox での環境構築。
- 実際にpythoｎの処理を学ぶ。
- AIアプリを触ってみた。
- まとめ
 
###1.dockeｒtoolbox での環境構築。
こちらに関しては先出しした[docker-toolbox をmacにインストールするのに色々迷った話](https://qiita.com/ranmaru_genki/items/bbffb904ed223e1bffb5)に書かせて頂きました。
初めてでしたので本の中で紹介されていたdocker-toolboxを使用しました。
次回はdockerで環境構築がしてみたいです。

###2.実際にpythonの処理を学ぶ。
事前に[プロゲート](https://prog-8.com/)にて一通りpythoｎについて学習していました。
わかりやすいのでプロゲートにはいつもお世話になってます(^o^)
今回は環境構築から自分の手でやったので処理が流れた時は嬉しかったですね。

この段階ではPHPやJavascriptでも学んだif文やfor文など復習しながら
python独特の文法にも慣れていきました。

基礎固めにも役立ったのでやって良かったです！

###3.AIアプリを触ってみた。
一通り処理を学んだら用意されているAIアプリを触ってみます。
ある程度処理を学んでからさわると自分で拡張させてみたいことや
改善してみたいことに気づけたので現在処理を付け足したりしています。
<img width="414" alt="AIアプリ.png" src="https://qiita-image-store.s3.amazonaws.com/0/199085/61455778-e37d-3e3a-66c3-9a32d277a8c0.png">

個人的に返答のパターンなどを豊富にしたりしました。


##まとめ
pythonが巷で話題だったので今回触ってみました。
新しい言語を独学で学ぶのは不安もありましたが今回は本に沿って進めていき、プロゲートなどを併用したので一人でも進めることができました。

また環境構築からバック、フロントを踏まえてアプリを一通りさわれたのもいい経験になったのかなと思います。

これからも興味のある言語は触ってみるフットワークの軽さを大事にしていきたいです。

色々と穴の多い記事になってしまいましたが暖かい目でみていただけると幸いです。
ここまでお読みいただきありがとうございました。
ICOS(IBM Cloud Object Storage)のaccess_key_idとsecret_access_keyが見つからない件

IBM Cloud Object Storageがクラウドで使えるようになってから約一年、旧Bluemixのポータルからもオーダーできるようになっております。
![スクリーンショット 2017-12-20 17.50.52.png](https://qiita-image-store.s3.amazonaws.com/0/59741/41cf29c6-f112-e0ab-905d-5d4ca5358b7b.png)

しかしながらサービス資格情報で新規資格情報を追加してJasonを見てもaccess_key_idとsecret_access_keyがない！？　という状況でおこまりの方がいらっしゃると聞きました。
![スクリーンショット 2017-12-20 17.52.22.png](https://qiita-image-store.s3.amazonaws.com/0/59741/e4e08839-b060-6b11-57e0-c0c33b55923b.png)

AWS S3のツールAWS S3 CLI、CloudBerry, TNT Drive, Trasmit 4などはこの情報でアクセスするのでこれがないと困ります。

どうすればいいかと言うと新規資格情報を作るときにオプションで以下のように設定するのです。
オプションのところに {"HMAC":true} です。
参照ページ：https://console.bluemix.net/docs/services/cloud-object-storage/iam/service-credentials.html#service-credentials

![スクリーンショット 2017-12-20 17.55.07.png](https://qiita-image-store.s3.amazonaws.com/0/59741/0b5695f8-66a0-b051-5c58-252fc96a51cc.png)
そうすると以下のように２つの値（access_key_id、secret_access_key）が出てきます。
![スクリーンショット 2017-12-20 17.58.03.png](https://qiita-image-store.s3.amazonaws.com/0/59741/ac70b756-c432-2922-46b0-013785213119.png)

ちょっと設定のところのユーザーインターフェースを改良して簡単にできるようにして欲しいですね。
2017年ベクトルタイル利用の代表的な成功例

2017年には、ベースマップ提供者以外で、バイナリベクトルタイルを使って成功されている例が見られました。その代表的な例を紹介したいと思います。

バイナリベクトルタイルは、転送量を低下させサービスの速度を向上させるというデータ提供側にとっての利点も大きいですが、地物の属性を利用し、ウェブ上のほかのリソースに接続し、表示内容を動的に変化させることができる、というデータ消費側にとっての利点も大きいです。今回紹介する成功例は、この利点を強く活用されていると思います。

# [NYCPlanning Labs](https://planninglabs.nyc)
NYCPlanning Labs は次のことを標榜されている組織のようです。

>We believe better outcomes can be achieved using modern design and development practices along with open technology. We are civic technologists here to help support the Department of City Planning's mission.

NYCPlanning Labs には ZoLa, Community Profiles, Migration Visualization, Tax Lot Selector の4つの作品が[あります](https://planninglabs.nyc/projects/)が、Migration Visualization を除く3つはすべてウェブ地図を伴うもので、その3つすべてでバイナリベクトル技術が活用されています。

## [ZoLa](https://zola.planning.nyc.gov/#11.42/40.7177/-73.9479)
ニューヨーク市のゾーニング及び土地利用の情報を表示するために、バイナリベクトルタイルが使用されています。行政界や地下鉄路線、3D建物、2016年の航空写真も見ることができるように設定されています。ここでは、主題ベクトルタイルは planninglabs.carto.com というサーバにホストされているもよう。

## [Community Profiles](https://communityprofiles.planning.nyc.gov/manhattan/6)
ニューヨーク市の区ごとに、人口構成や各種指標、ゾーニング情報、施設情報、浸水想定区域等が表示されるようになっています。

区の形状を示すポリゴンやゾーニング情報、施設情報、浸水想定区域について、バイナリベクトルタイルが使用されています。ここでは、主題ベクトルタイルは planninglabs.carto.com というサーバにホストされているもよう。

## [Tax Lot Selector](https://lotselector.planning.nyc.gov/#16/40.7508/-73.98)
筆を選択すると、その筆に関する情報が CSV や Shapefile でダウンロードできるという渋いサービスのようです。ここでは、主題ベクトルタイルは planninglabs.carto.com というサーバにホストされているもよう。

NYCPlanning Labs の作品には以前 [jane-maps](https://github.com/NYCPlanning/jane-maps) というものもありましたが、こちらは退役した模様。

# [ひなたGIS](https://hgis.pref.miyazaki.lg.jp/hinata/hinata.html)
ひなたGISでは多くのバイナリベクトルタイルが使われています。特に、統計情報との統合の部分が秀逸だと私は思います。タイルの観点から見てみますと、執筆時点では、技術的な構成は次のようになっているようです。

- https://hgis.pref.miyazaki.lg.jp/hinata/js/layer-mvt.js にバイナリベクトルタイルの設定がグローバル変数の形で定義されているようです。
- https://hgis.pref.miyazaki.lg.jp/hinata/js/layer-vt.js に GeoJSON ベクトルタイルの設定がグローバル変数の形で定義されているようです。

使われているバイナリベクトルタイルの一例を紹介しますと、次の通りです。非常に多くのバイナリベクトルタイルが使われていますね！

- OSM ベクトルタイル
- 全国河川中心線
- 全国道路中心線
- 全国用途地域
- 500Mメッシュ
- 全国土壌図
- エコリス植生図
- 全国文化財
- 全国土地利用図
- 熊本県遺跡
- H17全国小地域人口等
- H22全国小地域人口等
- H27全国小地域人口等
- ...

# 感想
ベクトルタイルの消費サイドを見るに、やはり統計情報・帳票情報と地理空間情報の融合というような文脈において、ベクトルタイルは大きな力を発揮するのではないかと思います。相互運用性と速度、これらがバイナリベクトルタイルの成功にとってのチャンスでありチャレンジであろうと改めて思いました。
peco + fasd

- Requirements
    - https://github.com/peco/peco
    - https://github.com/clvv/fasd

- How to use
 
```shell
fasd_peco() {  
    cd "$(fasd -ld | peco)"  
}
alias z=fasd_peco
```

- Gif  
- ![Untitled.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/45012/ffe11d95-5c33-3f1c-bcd3-a918f4a3fc0a.gif)
Chaliceを使ってみた話

#**Chaliceについて(基礎)**

###**Chaliceを使ったきっかけ**

仕事でAWS Lambdaを使うことになりましたが、AWS Lambdaを使う方法は色々ありました。
AWS Lambdaで実行するコードを作成して、AWSコンソールにアップロードしたら、
API Gatewayで設定する方法もありますが
最近話題になっているServerless Frameworkを使って、簡単にServerless Architectureができました。
また、Serverless Frameworkも色々ありますが、
先輩の提案でChailceというFrameworkを使うことにしました。


###**Chaliceとは**

PythonベースであるServerless Frameworkとして、
AWS LambdaとAPI GatewayをまとめてServerless ArchitectureができるFrameworkです。
さすがに動かしてみないと分からないので、簡単にやってみました。

###**Chalice使い方**

1.**Vitualenv Install**
Chaliceを使う時、Vitualenvをお勧めします。

```
$ pip install virtualenv
$ virtualenv ~/.virtualenvs/{virtualenv名} (virtualenv作成)
$ source ~/.virtualenvs/{virtualenv名}/bin/activate (仮想環境を有効化)
```

2.**Chalice　Install**

```
$ pip install chalice
```

3.**Project作成**

```
$ chalice new-project {project名}
```
4.**File構成**

```
 /.chalice
 /.gitignore
 /app.py
 /requirements.txt
```
確認できたら、実際にchaliceを動かすapp.pyを見ると下記のようです。

```python:app.py
from chalice import Chalice

app = Chalice(app_name='helloworld')


@app.route('/')
def index():
    return {'hello': 'world'}


# The view function above will return {"hello": "world"}
# whenever you make an HTTP GET request to '/'.
#
# Here are a few more examples:
#
# @app.route('/hello/{name}')
# def hello_name(name):
#    # '/hello/james' -> {"hello": "james"}
#    return {'hello': name}
#
# @app.route('/users', methods=['POST'])
# def create_user():
#     # This is the JSON body the user sent in their POST request.
#     user_as_json = app.current_request.json_body
#     # We'll echo the json body back to the user in a 'user' key.
#     return {'user': user_as_json}
#
# See the README documentation for more examples.
#
```

5.**Deploy**

ひとまず、Deployをやってみます。

```
$ chalice deploy

Initial creation of lambda function.
Creating role
Creating deployment package.
Lambda deploy done.
Initiating first time deployment...
Deploying to: dev

https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/
```

コマンドの下に表示されるURLにアクセスすると、
{'hello': 'world’}がresponseされていることが確認できます。

Deployの流れをDiagramでみると下記のようです。
<img width="886" alt="スクリーンショット 2017-12-20 23.13.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/115632/dfed6952-f999-e58e-fe4b-18e8c3483370.png">

###**感想**

何よりもAWSを触ってみて非常におもしろかったです。
Serverless Frameworkを通じて、エンジニアは他のところを気にせずに、
ビジネスロジックだけ夢中になれることに気づきました。
また、API Gateway + AWS Lambda + 他の技術が触れることを考えると、
もっとやってみたいと思いました。

###**参考資料**
https://aws.amazon.com/jp/blogs/developer/preview-the-python-serverless-microframework-for-aws/
https://github.com/aws/chalice
Karate を使ったWebサービス テスト その２

[その１](https://qiita.com/ihgs/items/90c9a093384375f9beca)では、Webサービスのテストツールである Karate の簡単な紹介をしました。


その２は、宣言通りポーリングが必要なケースについて紹介したいと思います。

手軽にポーリングを試せるWebサービスがなかったので、以下のようなシナリオでポーリングを組み込んだテストをしたいと思います。


1. 「[Karate を使ったWebサービス テスト その１](https://qiita.com/ihgs/items/90c9a093384375f9beca)」の情報を取得し、いいね数を記録
2. １０秒おきに情報を取得し、「記録したいいね数」から増えると成功。60秒を超えるとテスト失敗。


## 詳細

今回追加したのは以下の2ファイルです。

### [GetItem.feature](https://github.com/ihgs/karate-sample/blob/sample%232/src/test/java/qiita/libs/GetItem.feature) 

与えられたidを元に投稿記事を取得する再利用のためのfeature 
ignoreをつけないと、これもテストだと勘違いされ実行されますが、id が定義されていないのでエラーになります。

```gherkin
@ignore
Feature: Get item
Background:
* url urlBase

Scenario: Get item

Given path "items", id
And header Accept = 'application/json'
When method get
Then status 200
```

### [polling.feature](https://github.com/ihgs/karate-sample/blob/sample%232/src/test/java/qiita/polling.feature)

polling のテストfeature

[JavaScript 関数](https://github.com/intuit/karate#javascript-functions)を定義し、その中でGetItem.featureを使ってpollingする処理を書いています。
また、シナリオの最初でも、現在のいいね数を取得するために、GetItem.feature を使います。
シナリオ中に書く場合と、JavaScript 関数中では呼び方が微妙に違うので注意が必要です。


```gherkin
@polling
Feature: Karate sample2

Background:
* url urlBase
* def waitUntil =   ------------(1) 10秒おきに投稿詳細を取得し、options.desired_countを越えた時点で0を返却するJavaScript 関数
"""
function(options) {
    karate.log(options.item_id);
    for (var i=0; i< 6 ;i++) {
        java.lang.Thread.sleep(10000);
        var result = karate.call('./libs/GetItem.feature', {id: options.item_id}); 
        var item = result.response;
        if (item.likes_count >= options.desired_count){
            karate.log('いいねが押されたよ');
            return 0;
        }
        karate.log('waiting...');
    }
    return -1;
}
"""


Scenario: Wait 

* def item_id = '90c9a093384375f9beca'
* def result = call read('./libs/GetItem.feature') {id: #(item_id)}　------------(2) GetItem.featureを利用して、投稿詳細を取得。
* def current = result.response.likes_count
* print 'current likes_count: ' + current
* def target = current + 1 
* def ret = call waitUntil {item_id: #(item_id),  desired_count: #(target) }  ------------(3) Background で定義したポーリングする関数を呼びます。
* match ret == 0
```
 
## 実行してみる


ソースは以下です

https://github.com/ihgs/karate-sample/tree/sample%232/


```
gradle clean test -Dcucumber.options="--tags @polling"
```

さぁ、「いいね」を押してみましょう。
テストが成功するはずです。
もう一度実行して、放置するとテストが失敗します。


この方法を使うことで、たとえば「仮想マシンの起動命令を行い、ある程度の時間が経った後に起動状態になることを確認」といったテストがかけるようになります。



## 最後に

まだまだ使っていない機能も多いので、引き続き使ってみて記事も追加していこうかなと思います。
エンジニアが絶対に知っておくべきネットワークの最低限知識

#誰のための記事か
ネットワークについて知りたい方
プログラミングを学び始めた初心者の方
プログラミングはある程度できるがネットワークについてはさっぱりという方
※まだ途中なので随時更新していきます。

###IX(インターネットエクスチェンジ)
ネットワークの接続点のことをIXと言います。
プロバイダなどが運営しており、我々がインターネットを使うときは間接的にこのIXに接続されています。
そのため、どこか1箇所のIXに接続していれば世界中どこでも通信ができるのです。

###IPアドレス
IPアドレスはインターネット上の住所の役割を持っています。
誰かと通信をするときにその通信相手を間違えないために使用する唯一無二のアドレスです。
ちなみにIPアドレスは4つの数字を.で繋げた「0.0.0.0」から「255.255.255.255」までです。(IPv4)
IPアドレスを管理しているのは「IANA」という団体で、その下に
「APNIC」「RIPENCC」「ARIN」「LACNIC」「AFRNIC」という5つの団体があります。

###SSL
SSL(Secure Sockets Layer)
ネットワークを通じて情報をやりとりする時、データを盗み見られる危険性があります。
そこでSSLという仕組みを使ってデータを暗号化します。

###HTTP
HTMLなどを送受信する為のプロトコルです。

###ポート
データを振り分ける仕組みです。
例えばHTTPは80、HTTPSは443と決まっています。

###サーバ

###Cookie
Cookie(クッキー)はユーザーの操作情報を保存するファイルです。


###セッション



##以上
ネットワークについて簡単にまとめてみました。
興味のある方はさらに調べてみてください♫
それでは:hugging:
Apple TVからHDMIケーブルを抜くとアプリはどうなるの？

こんにちは。
小ネタです。

# はじめに

以下のようにApple TVからHDMIケーブルを抜いた場合どうなるのでしょうか？

1. tvOSネイティブアプリを動かす
2. アプリ使用中にApple TVからHDMIケーブルを抜く

# HDMIケーブルを抜くと applicationWillResignActive が呼ばれる

下記コードを使った実験から、HDMIケーブルを抜くと `applicationWillResignActive` が呼ばれることがわかりました。

```swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        print("\(Date()), \(#function)")
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        print("\(Date()), \(#function)")
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        print("\(Date()), \(#function)")
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        print("\(Date()), \(#function)")
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        print("\(Date()), \(#function)")
    }

    func applicationWillTerminate(_ application: UIApplication) {
        print("\(Date()), \(#function)")
    }
}
```

実行当時のログ。

```text
2017-12-10 01:41:41 +0000, application(_:didFinishLaunchingWithOptions:) // アプリ起動
2017-12-10 01:41:42 +0000, applicationDidBecomeActive                    // アプリ起動の流れで didBecomeActive が呼ばれた
2017-12-10 01:41:44 +0000, applicationWillResignActive                   // アプリが画面に映ったあとにHDMIケーブルを抜いた
2017-12-10 01:41:55 +0000, applicationDidBecomeActive                    // HDMIケーブルを挿してSiriリモートのボタンを押した
```

# まとめ

tvOSのネイティブアプリを実行中にHDMIケーブルを外した場合、`applicationWillResignActive` が呼ばれることを紹介しました。
pryでメソッド定義をすぐ見つける方法

[こちら](https://qiita.com/jnchito/items/fc8a61b421d026a23ffe)の記事にコメントを残されていた方のrubyのメソッド定義を見つける方法がかなり楽だったので共有させていただきます。

```pry``` gemを入れてるのが前提です。

## ```?　reciever.method``` => メソッドのドキュメント表示

```map``` はc言語で実装されてるらしい

```irb
[1] pry(main)> ? [1,2,3].map

From: array.c (C Method):
Owner: Array
Visibility: public
Signature: map()
Number of lines: 9

Invokes block once for each element of self. Creates a
new array containing the values returned by the block.
See also Enumerable#collect.

If no block is given, an enumerator is returned instead.

   a = [ "a", "b", "c", "d" ]
   a.collect {|x| x + "!" }   #=> ["a!", "b!", "c!", "d!"]
   a                          #=> ["a", "b", "c", "d"]

```

```presence``` は便利メソッドがいっぱいあるgem```activesupport```で定義されている。
説明もわかりやすい。


```irb
[2] pry(main)> ? "".presence

From: /$HOME/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.4/lib/active_support/core_ext/object/blank.rb @ line 27:
Owner: Object
Visibility: public
Signature: presence()
Number of lines: 16

Returns the receiver if it's present otherwise returns nil.
object.presence is equivalent to

   object.present? ? object : nil

For example, something like

  state   = params[:state]   if params[:state].present?
  country = params[:country] if params[:country].present?
  region  = state || country || 'US'

becomes

  region = params[:state].presence || params[:country].presence || 'US'

return [Object]
```

## ```$　reciever.method``` => メソッドのソースコード表示

さっき見た通りc言語で実装されている```map```メソッド

```irb
[3] pry(main)> $ [1,2,3].map

From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 13

static VALUE
rb_ary_collect(VALUE ary)
{
    long i;
    VALUE collect;

    RETURN_ENUMERATOR(ary, 0, 0);
    collect = rb_ary_new2(RARRAY_LEN(ary));
    for (i = 0; i < RARRAY_LEN(ary); i++) {
	rb_ary_push(collect, rb_yield(RARRAY_PTR(ary)[i]));
    }
    return collect;
}
```

```presence``` もしっかり定義されている

```irb
[4] pry(main)> $ "".presence

From: /$HOME/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.4/lib/active_support/core_ext/object/blank.rb @ line 43:
Owner: Object
Visibility: public
Number of lines: 3

def presence
  self if present?
end
```
CSSに入門してみたら怖くなかった

CSS Advent Calendarが17日だけ空いていたので書いてみます。

# TL;DR

- 食わず嫌いだったCSSに入門してみたら思ったよりも理解できた
- わかりやすいサイトで入門して、写経して、なんか作ってみた
- CSSを避けてきた人もやってみると案外いけるかもしれません

# はじめに

サーバーサイドとかなんでもやるけどCSSだけは触りたくないし勉強もしたくないというエンジニアの方は割と多いんじゃないでしょうか。僕もそんな感じだったのですが、あるきっかけでCSSもできるようになろうと思い勉強してみると思ってたよりも理解できた気持ちでなったので、やったことについて書いてみます。

# やったこと

## 入門する

- [サルワカ HTML&CSS入門：イチからWebデザインを習得する講座](https://saruwakakun.com/html-css/basic)

<img width="1131" alt="スクリーンショット 2017-12-20 22.04.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/59312/4d07ee73-bcbe-f06f-1ef6-2126d5153b05.png">

すげーーわかりやすいです。電車の中で1週間くらいで一通り読んでこれまで疑問だったとこが解決しまくりました。inline/blockの概念をわかってなかったレベル:rolling_eyes:だったのでそこのなるほど感すごかったです。 

- [Webクリエイターボックス 日本語対応！CSS Flexboxのチートシートを作ったので配布します](https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet)

<img width="1105" alt="スクリーンショット 2017-12-20 22.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/59312/5e52ace0-857b-f424-ac8f-c0729c8dc009.png">

CSSって特にモノを中央に置く・右に寄せるみたいなことがしたいときにわけわからないイメージがあったのですが、このサイトを見てFlexbox使えば大体のやりたいことはできるのではという気持ちになっています。要するにモノが縦か横に並んでいて、並び方向の設定(`justify-content`)と並びと垂直方向の設定(`align-items`)をすれば思ってるレイアウトになるよね的なイメージ :thinking: 

- [HTML5 Experts.jp これからのCSSはmargin禁止！？CSSグリッドレイアウトやコンポーネント指向なCSSについて、矢倉さんに聞いてきた！](https://html5experts.jp/shumpei-shiraishi/24439/)

<img width="1058" alt="スクリーンショット 2017-12-20 22.16.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/59312/d5ecf6cf-e900-1de1-6d6e-f5f12b33a45e.png">

Webサイトって大体はヘッダーとフッターがあって、Flexboxよりももっと枠線引いたみたいにレイアウトできるとわかりやすいのかなと思ってたらGridレイアウトというのがあり、使ってみるとそれはそれは分かりやすかったです。IEがGridレイアウトの古い仕様を実装しているという辛みがあるみたいです。 https://caniuse.com/#search=grid

## 写経する

[HTML5&CSS3デザインブック](http://www.socym.co.jp/book/964)

一からHTML/CSSを書いてWebサイトを構築していく内容の本やWebサイトを見て写経していきました。この本はモノを中央や右に寄せたりするのにfloatを使っているのですが、そこをFlexboxに置き換えて本の半分くらいまで写経しました。写経するときの定番としてちょっと値変えてみたりしていちいちなるほどーとなっていました。この本がすげーオススメというわけではなく他に何かいい本があればそれでいいと思います。

## なんかつくってみる

dev.toっぽいレイアウトのQiita
https://qiita-to.herokuapp.com
https://github.com/adwd/qiita-to

<img width="1164" alt="スクリーンショット 2017-12-20 22.42.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/59312/c9ca09a3-410b-85cc-8425-3488ff1cc0f7.png">

[QiitaのAPI](https://qiita.com/api/v2/docs)から記事とタグを取得してdev.toっぽい雰囲気で表示するNuxt.jsアプリを作ってみました。画面は一つだけで、記事とタグ以外の箇所は全部ダミーです。アプリケーションのヘッダー、左右・中央の配置、フッターはGridレイアウトを使っています。dev.toのレイアウトをにらみつつ、わからないところはDevtoolsでCSSを拝見させてもらったりすると色々発見がありました。もうちょっと手をかければそれっぽくなるかも？Nuxt.jsとVue.jsを初めて触ったのですがなんか良かった気がします。
一応レスポンシブにしてみました。

<img width="469" alt="スクリーンショット 2017-12-20 22.43.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/59312/7c0573dc-e038-216d-b312-584a8d87fe1c.png">

<img width="203" alt="スクリーンショット 2017-12-20 22.43.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/59312/52db53a1-1fc8-f625-3396-c64ca895478a.png">

# まとめ

食わず嫌いですごい苦手意識があったCSSですが、わかりやすいサイトがあってそこから写経となんかつくってみたら勉強になって(今のところ)CSS怖くないという話でした。
これでCSS初心者くらいにはなったんでしょうか？めちゃくちゃ凝ったランディングページとかは作れる気がしないですが、ふつうのWebページのレイアウトを整えるくらいはできるようになりたいなあと思っております。
Bloxはどうなったのか

この記事は[Amazon Web Services Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aws) 21日目の記事です。

早速ですが、皆さん[Blox](https://blox.github.io/)を覚えてますでしょうか？

昨年のre:Invent 2016で`Amazon ECS`のカスタムスケジューラとして発表され、しかもAWSにしては珍しくOSSということで発表時は話題になったあのBloxです。

今年のre:Invent 2017では[Amazon EKS](https://aws.amazon.com/jp/about-aws/whats-new/2017/11/introducing-amazon-elastic-container-service-for-kubernetes/)、[Amazon Fargate](https://aws.amazon.com/jp/about-aws/whats-new/2017/11/introducing-aws-fargate-a-technology-to-run-containers-without-managing-infrastructure/)とコンテナ関連の新サービスが2つも発表され賑わっているAWSのコンテナ界隈ですが、そんな中Bloxが今どうなっているのか気になったので軽く調べてみました。

※Bloxについては[「Amazon ECS対応のスケジューラBloxを試してみた」](https://dev.classmethod.jp/cloud/blox-ataglance/)や[「第二回 合同勉強会 in 福岡 で Blox と ECS について発表しました 」](https://dev.classmethod.jp/cloud/aws/gb-fukuoka-2nd-nakayama-koji/)がとても詳しいです。

# Bloxとは
Bloxは`Amazon ECS`で動作するコンテナのカスタムスケジューラーです。
ユーザーが独自に開発したコンテナのスケジューラを`Amazon ECS`に組み込むことを可能としてくれます。

# v0.3.0とv1.0
Bloxには`v0.1.0～0.3.0`と`v1.0`（未リリース）が存在します。

`v0.1.0～0.3.0`はBloxを利用する上で必要なAWSリソース（CloudWatchEvent、SQS）を構築した上で、カスタムスケジューラーをローカル or AWSに用意する必要がありました。
カスタムスケジューラー自体はDockerでコンテナを起動するだけなので、それほど手間がかかるわけではありませんが、構築の必要があったことに変わりはありません。
方針としては「各々がBloxで手軽にカスタムスケジューラーを構築する」だったのかと思います。

ですが、`v1.0`では`Amazon ECS`の機能の一つ、つまりマネージドサービスとして提供するという方向に大きく舵をきるようです。
[Github](https://github.com/blox/blox)のREADME.mdをみても、`Amazon ECS`の管理コンソール、APIおよびCLIから提供されると記載があります。

方針が大きく変わったのに合わせて`v0.3.0`以降は開発言語も変わっています。
`v0.1.0～v0.3.0`はGoで開発が進められていましたが、`v0.3.0`以降はJavaに変更となっています。


# 何故方針が変わったのか
上記のように`v0.1.0～0.3.0`と`v1.0`では大きく内容が変わっており、
その理由は正式に発表等があった訳ではないので本当の所は分かりませんが、個人の見解では`Amazon EKS`の存在があるのかと思います。

皆さんご存知の通り、`Amazon EKS`はコンテナ管理のソフトウェアである`Kubernetes`をAWSから利用できるようになるものです。
この`Kubernetes`は非常に高機能でスケジューリングも柔軟に行うことが可能なので、Bloxでカスタムスケジューラーを用意しなくても`Amazon EKS`を利用すればカスタマイズしたスケジューリングを行えるということになります。

また、Bloxが方針を変えたのは[Github](https://github.com/blox/blox)を見てるとおそらく8月頃ですが、これは`Kubernetes`の開発をホストするCloud Native Computing FoundationにAWSがプラチナメンバーとして参加した時期と重なります。

なので、AWSはこの頃には`Amazon EKS`を提供することを決める、もしくは考えていて、Bloxはそれに合わせて`Amazon ECS`をマネージドでより便利にする方向に舵を切ったのかなと思います。

# Bloxの開発状況は？
[Github](https://github.com/blox/blox)を見てる限りでは、少しずつ前に進んでいるようです。

# v1.0はいつになるのか？
これは不明です...。
ただ、前には進んでいるようなので、その内動きがあるのかと思います。

# まとめ
簡単ですがBloxのことについて書きました。

大きく方針の転換があったBloxですが、マネージドサービスとして提供されるようになれば、`Amazon ECS`がより便利になるのは間違いないと思います。

`Amazon EKS`、`Amazon Fargate`だけでなくBloxも忘れずに:-)!
キャノンショット的な演出

#最初に
ハイスコアとか出したときにキャノンショットっぽい演出したくなりませんか？
私はなりましたｗ
ちなみにキャノンショットって呼んでいるのは↓のようなやつ。
https://www.youtube.com/watch?v=nkUoz0l8GFg

というわけで、それっぽい演出を検討してみました。

#ぐぐったけど
まずぐぐりました。

[CSS Kami Fubuki](http://bl.ocks.org/hunzy/9954481)
[ [canvas] 紙ふぶき](http://jsdo.it/aq_yoshida/2eOg)

なるほどそれっぽい演出したい人は自分だけじゃないんだとわかりました。
少し安心したところで、後者のを~~パクって~~インスパイヤして作ろうかなぁと思ったところ、いささか問題が。
1.３D計算をまじめにやっている
2.その割に重力計算されてない
3.それでいてなんか華やかさがない

うーん、もっといい例ないのかーと思いながら、方向性を決めました。
**1.3D計算は~~めんどうなので~~負荷が高そうなのでしない**
**2.重力計算はphina.jsに頼る**
**3.キラキラした感じを増やそう**

#しょうがない作るか…
どうもそれっぽいのが見当たらないのとphina.jsを利用して実装したかったので上記方向性に基づいて作りました。
[キャノンショット的なやつ](http://runstant.com/damacchi/projects/12c71447)

##ポイント１．3D計算はしない
でもそれっぽく見せないといけないわけで、それを紙吹雪１つ１つのサイズ（width,height）と傾き（rotation）をランダムにすることで対応してみました。
まぁ完璧とは思いませんが、それっぽくは見えてるかなと。

##ポイント２．重力計算はphina.jsに頼る
せっかくgravityなるありがたいメソッドがありますので、それを使わせていただきました。
なお、いろいろ遊んでいると、逆向きとかx方向にも重力設定できたりとかするのがわかったので、最大限に生かすとロケット発射的なこともできたので、応用しました。

##ポイント３．キラキラした感じを増やそう
先の例２つを見ててなんか足りないなーと思ったのですが、光の加減で見える色って変わるはずなのにずっと同じ色ってことに気が付きました。
よって、ランダムに補色に変更するようにしました。（これが一定時間で必ず変わるとそれはそれで不自然なんです…）

#最後に
つくりは雑ですが、それっぽくなったかなと。
くす玉っぽくするのもちょっと応用すれば簡単にできます。
Pod install するときに古いversionのReactもインストールしようとするのを阻止する。

## 課題
https://github.com/facebook/react-native/issues/16912
https://github.com/invertase/react-native-firebase/issues/324

react-native-firebaseなど、PodFileでReactを参照している場合に
`pod install`するとReact の古いversionをインストールしようとしててんやわんやになる

## 対応
node_module内のReactやYogaを使うようにする

```swift

  react_native_path = "../node_modules/react-native"
  pod "yoga", :path => "#{react_native_path}/ReactCommon/yoga"
  pod "React", :path => react_native_path, :subspecs => [
  'Core',
  'BatchedBridge'
  ]
```

注意：
↓だと動かない。 小文字でyogaにしたらOKだった。 
`pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga'`

## 別案
最初のissueからのリンクにあったみたいに
"ignorePodSpec": true
とかでやる方法もあるみたいですが、ちょっとしっくり来なかったので、podで手元のReactを読むようにする方法で対応。
bats ファイルのグローバルスコープには正常終了するコマンドだけを書く

# はじめに

* Bash のテストフレームワーク `bats` に関する記事
* bats ファイルのグローバルスコープ [^1] に書いたコマンドが異常終了 (`$? -ne 0`) すると、bats も異常終了する話

# bats とは?

Bash スクリプトのテストツールです。参考サイトを以下に挙げます。

* 公式 [sstephenson/bats](https://github.com/sstephenson/bats)
* [Batsを使って手軽にCLIプログラムのテストをする](https://qiita.com/5t111111/items/c4a382c7dd896c353d03)
* [Bashアプリケーションをテストする](http://postd.cc/bash%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B/)

# 起きた問題

## bats コード

以下を行うだけのコードです。わかりやすくするために実際のテストコードは端折っています。

* env.sh を読み込む
* /tmp/buffer.txt を初期化する

```bash:test.bats
#!/usr/bin/env bats

source ./env.sh

function setup() {
  : > /tmp/buffer.txt
}
```

## 実行結果

想定していた処理結果は以下です。

```bash:想定
$ ./test.bats 

0 tests, 0 failures
$ echo $?
0
```

しかし、実際は以下のように処理に失敗してしまい、テストも行われませんでした。

```bash:想定外
$ ./test.bats
$ echo $?
1
```

## 原因

`source ./env.sh` が原因でした。
具体的には、以下のように env.sh 内で開発環境か否かのチェックを行っていました。

```bash:env.shでダメだった箇所
hostname | grep 'dev'
if [ $? -eq 0 ]; then
  # 開発環境向けの処理
else
  # 本番環境向けの処理
fi
```

問題が発生するのは `hostname | grep 'dev'` の実行結果が `1` となるとき、すなわち開発環境でないときです。
ここで bats は、グローバルスコープに記述したコマンドが正常終了しなかった場合に、 bats 自体も異常終了して落ちてしまうようです。

# 解決策

2つ考えられます。

## ラップする方法

異常終了するコマンドを if でくくり、異常終了をラップします。

```bash:ダメだったやり方
hostname | grep 'dev'
if [ $? -eq 0 ]; then
  # 開発環境向けの処理
  :
```
```bash:良さげなやり方
if hostname | grep 'dev'; then
  # 開発環境向けの処理
  :
```

後者の方がスマートでいいですね。

## 無理やりな方法

正常終了しないコマンドは `|| :` で無理やり正常終了させたことにします。

```bash:test.bats
source ./env.sh || :
```

`source` が失敗した場合は、 `:` つまり「何もしない」コマンドが実行されて必ず正常終了を返します。
これによって、 `source` がどちらに転んでも正常終了を返す仕組みを作ります。
ただ、エラーハンドリングという観点でみると杜撰なので、前者の if を使った方法を好ましく思います。

# まとめ

* bats を使うときはコマンドの戻り値 `$?` を意識する
* 異常終了しそうなコマンドは if でラップするか、無理やり正常終了化させることで bats の強制終了を回避する

# 所感

* bats の思想に触れてみると、「スクリプト内のすべてのコマンドは 0 で終了すること」がシェルスクリプトの1つの理想形なのかな、と感じたりした

[^1]: 本記事では「`setup` や `teardown`、`@test` などのファンクション外」のことを指しています。もっとも、シェルスクリプトにおいてはどこでもグローバルと呼べそうな気もしますが…
オープンデータを活用して交通系WebAPIの世界をより便利にしよう！

[ヴァル研究所 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/val) 20日目の記事です。

今日はちょっとポエミーな話をしつつ、公共交通向けAPIへの新しい取り組み(まだβ版だけど！)についてご紹介できればと思います。

## 経路探索だけでなくゲームでも使われている駅すぱあとWebサービス

ヴァル研究所では[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)を通じて、[駅すぱあと](https://ekiworld.net/service/package/about.html)の機能をWebAPIとして提供しています。

お客様の利用事例としては、公共交通機関を利用した移動時の経路探索、定期券や会社での交通費精算から、[ゲームアプリ](https://ekiworld.net/case/c002)での利用という、ちょっと意外な事例もあります。

お客様からの問い合わせの中には、「なるほど、こういう活用方法もあるのか！たしかにこれができたら便利かも！」とこちらが逆に気づかされることもあり、WebAPIでサービスを提供することは新鮮に思えることが多いです(逆にどう使われるのかが想像しきれず悩むこともあります...)。

## もっとWebAPIを活用して世界を便利にしたい！

### WebAPIによるオープンデータの活用

[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)を活用することで、駅の情報や時刻表といったデータを取得・利用できますが、公共交通に関連するデータはさまざまな種類があり、全てをカバーしきれているわけではありません。

公共交通に関連するデータとしてホットな話題として、[オープンデータ](http://www.soumu.go.jp/menu_seisaku/ictseisaku/ictriyou/opendata/)が挙げられます。地方自治体の中には、駐輪場や地域のリアルタイムな交通情報といったデータをオープンデータとして公開しているところもあり、これらのデータをWebAPIとして活用できたら、世界はもっと便利になるのでは...！ と思ってしまうのです。

### 世界をWebAPIで便利にしてみよう！(まだβ版だけど)

こういった公共交通に関するオープンデータを活用する試みとして、[ValAPIs](http://valapis.jp/v1/index.html)というサービスを作ろうとしています。まだβ版なので不安定なところはありますが、弊社の[エヴァンジェリスト](https://twitter.com/maruyamahiakru)があちこちの技術系LT等で折に触れて[ValAPIsの紹介](https://speakerdeck.com/hmaruyama/20171219)をしておりますので、ValAPIsや「こんなデータあるけどAPI化したいんだよねー」といった、ご興味のある方はぜひお話を聞かせてもらえればと思います。
(WebAPI談義をしたい、というのもあります...)

### ValAPIs、どんなAPIを提供しているの？

で、どんなAPIを提供しているの？という話ですが、まだβ版、まだβ版なので、以下の2つのAPIに留まっています...。
(とはいえ、API事態は日々改善を続けています！)

 * [駐輪場API](http://valapis.jp/v1/index.html?doc=bicycle_parkings)
 * [WiFi Spot API](http://valapis.jp/v1/index.html?doc=wifi_spots)

### 実際にValAPIsのAPIを呼んでみる
例として、[駐輪場API](http://valapis.jp/v1/index.html?doc=bicycle_parkings)を呼んでみましょう。リクエストパラメータに `name=秋葉原` と指定すると、「秋葉原」という名称を含んだ駐輪場のみを抽出できます。また、 `fields` パラメータに必要なフィールドのみを指定してレスポンスを取得することができます(指定可能なフィールド名は[駐輪場API](http://valapis.jp/v1/index.html?doc=bicycle_parkings)(ドキュメント)をご参照ください)。

```json
$ curl -s 'http://valapis.jp/v1/bicycle_parkings?name=秋葉原&fields=code,name,latitude,longitude,neighborStations.name' | jq .
{
  "resultSet": {
  ...
    "dataSet": {
      "max": 1478,
      "offset": 1,
      "bicycleParkings": [
        {
          "code": 1,
          "name": "秋葉原駅東口第1自転車駐車場",
          "neighborStations": [
            {
              "name": "秋葉原駅前／都営バス"
            },
            {
              "name": "秋葉原駅(高速・連絡バス)"
            },
          ...
          "latitude": 35.699715,
          "longitude": 139.773078
        }
      ]
    }
  }
}
```

### 駅すぱあとの駅情報と連携してもっと便利に活用しよう

実は駅すぱあとの駅情報を活用しているので、駐輪場データ自体はオープンデータだけど、駐輪場の最寄り駅情報も一度に取得可能という、地味に便利な利用も可能なのです。

開発者としては「(まだβ版だけど)これ便利かも...」と思うこともあるのですが、どんな活用方法があるのか想像しきれていません。LTやハンズオンのようなイベントを通じて、ValAPIsを広く知ってもらう過程で活用方法やアイデアが見えてくるはず、と考えています。

### まとめ

ValAPIsという、公共交通に関する新しいAPIサービスについて紹介させていただきました。12/1の記事で紹介した、[地図への情報マッピング](https://qiita.com/valsitoh/items/2827330da383179ffa01)の内容と[駐輪場API](http://valapis.jp/v1/index.html?doc=bicycle_parkings)を活用するだけでも便利なアプリが作成できそうなので、いずれはハンズオン等の題材と絡めて紹介できればと考えています。
PandasでDataFrameGroupByに対する列追加の処理は？

GroupByした後に集約処理以外の普通のスキャン処理をやるのに標準の方法は無いようです。列を追加するにもDataFrameGroupByオブジェクトにそのままmulti indexで列結合する方法は面倒です。

以下のようなデータフレームに対して、集約以外のグループごとの処理を書いて、さらに列に追加する方法を整理しました。

```Python
df = pd.DataFrame({'group' : [1,1,2,3,3,3,3,2,2,4,4,4] , 'value' : [1,2,1,1,3,2,4,2,1,3,2,1]} )
    group  value
0       1      1
1       1      2
2       2      1
3       3      1
4       3      3
5       3      2
6       3      4
7       2      2
8       2      1
9       4      3
10      4      2
11      4      1
```

基本的にグループ化前のdfにグループ化→処理→フラット化した結果を代入するというのが素直な方法のようです。関数内で列を追加する方法もあるようですが。

# DataFrameGroupByに対応した関数

以下のような場合は、特にそのまま関数を使えばよさそうです。

```Python
df['new'] = df.groupby('group')['value'].cumcount()

    group  value  new
0       1      1    0
1       1      2    1
2       2      1    0
3       3      1    0
4       3      3    1
5       3      2    2
6       3      4    3
7       2      2    1
8       2      1    2
9       4      3    0
10      4      2    1
11      4      1    2
```

```Python
df['new'] = df.groupby('group')['value'].rank()

    group  value  new
0       1      1  1.0
1       1      2  2.0
2       2      1  1.5
3       3      1  1.0
4       3      3  3.0
5       3      2  2.0
6       3      4  4.0
7       2      2  3.0
8       2      1  1.5
9       4      3  3.0
10      4      2  2.0
11      4      1  1.0
```

groupごとに行われることは暗黙のうちになされ、結果はフラット化されるようです。

# DataFrameGroupByに対応しない関数をrow-wiseに処理したいとき

これは、特に特筆することはないですがapplyで可能です。

```Python
df['new'] = df.groupby('group')['value'].apply(lambda x:x+1)

    group  value  new
0       1      1    2
1       1      2    3
2       2      1    2
3       3      1    2
4       3      3    4
5       3      2    3
6       3      4    5
7       2      2    3
8       2      1    2
9       4      3    4
10      4      2    3
11      4      1    2
```

これも結果はフラット化されます。ただし、あくまでもgroup化されたSeriesに対して行っていますが、row-wiseではそれは意識することはないでしょう。

# DataFrameGroupByに対応しない関数をgroup-wiseに処理したいとき

例えば、group化されたSeriesごとに直前の値との差分をとるような以下の関数の結果を見ると、グループごとに処理されていることがわかります。

```Python
df['new'] = df.groupby('group')['value'].apply(lambda y : y - y.shift() )

    group  value  new
0       1      1  NaN
1       1      2  1.0
2       2      1  NaN
3       3      1  NaN
4       3      3  2.0
5       3      2 -1.0
6       3      4  2.0
7       2      2  1.0
8       2      1 -1.0
9       4      3  NaN
10      4      2 -1.0
11      4      1 -1.0
```
同じく結果はフラット化されます。

もう少しシンプルな方法もあるのでしょうか？
GPUの浮動小数点精度の話

やまだです。人生の何割かをGPUを酷使することに捧げています。

スマートフォンゲームにおいてはPCで開発し、スマートフォンに転送して実行することが多いと思います。
特にシェーダを書かれる方はPCではうまく動くが、スマートフォンではうまく動かないという経験があるのではないでしょうか。
その中でも私の周りで比較的トラブルとしてよく耳にするのが浮動小数点演算の精度です[^1]。
[^1]: 浮動小数点数のトラブルはCPUの世界でもよく耳にします。我々は永遠に戦い続ける。

# 結果が異なる例
百聞は一見にしかずということで例を見てみましょう。
以下のシェーダを実行してみてください、どのような結果になったでしょうか？
http://glslsandbox.com/e#39354.3

PCから実行した場合は以下のような結果になります。

![PC](https://qiita-image-store.s3.amazonaws.com/0/100085/ea36dc46-1ea5-1ddc-dffd-b7f1af565f66.png)

一方でiPhone6で実行した場合は次のような結果になります。

<img width="375" alt="iPhone6.png" src="https://qiita-image-store.s3.amazonaws.com/0/100085/639a5b56-f1f0-9255-5d46-bfd732e475f5.png">

この結果の違いはPCとスマートフォンの浮動小数点数の精度の違いによるものです。

# GPUの世界での浮動小数点数
スマートフォンではシェーダ言語としてGLSL ESが使用されます。
GLSL ESではフラグメントシェーダの冒頭に以下のような記述がされていることがあります。

```glsl
precision mideump
```

これは、浮動小数点数の演算精度をすべて中精度で行うことを宣言しています。
ソースの先頭に記述するほかに `mediump float v;` のように変数に個別に精度を与えることもできます。
精度は`highp`, `mediump`, `lowp`の3種類あり、それぞれ高精度, 中精度, 低精度で浮動小数点演算を行うことを意味します。

これらは最低要件が定義されています[^3]。

[^3]: [OpenGL ES Shading Language](https://www.khronos.org/files/opengles_shading_language.pdf)の33ページ付近より

||範囲|精度|
|:-:|:-:|:-:|
| highp | $(-2^{62}, 2^{62})$ |浮動小数点数 $2^{-16}$|
| mediump | $(-2^{14}, 2^{14})$ |浮動小数点数 $2^{-10}$|
| lowp | $(-2, 2)$ |固定小数点数 $2^{-8}$|

注目すべきポイントとして `highp` および `mediump` は浮動小数点数ですが `lowp` は固定小数点数となっている点です。
加えて `lowp` は範囲も `mediump`と比較して著しく狭いため、値のオーバーフローには注意が必要です。

一般的に低精度浮動小数点数は高精度浮動小数点数と比較してバンド幅を節約できるため、演算が高速に行えます。
そのため複雑な演算は `highp` を使用し、それほど精度が必要でない演算は `mediump` や `lowp` を積極的に使用するなどの使い分けが必要です。

前述のとおり、これらは最低要件であり、実際はこれ以上の精度を持つことがあります。
先程のシェーダは帯が下に進めば進むほど数値が大きくなり、 `highp` で計算したものを赤色で、 `mediump` は緑色で、 `lowp` が青色で出力しています。
PCではすべて白い帯で描画されていますが、iPhone6の結果は赤い帯のみが下にのびています。
これはPCにおいては `highp`, `mediump`, `lowp` の精度が全て同じ高精度であることを意味し、
iPhone6では `mediump` と `lowp` の精度が同じで、 `highp` がそれらよりも高い精度であること意味しています[^2]。
[^2]: 近年では、PC向けGPUも精度よりも演算速度が重要な機械学習分野の需要の高まりもあり、低精度浮動小数点演算にも注目が集まっています。
もちろん `mediump` と `lowp` が異なる精度であるスマートフォンもありますし、スマートフォンによって微妙に精度が異なることもあります。
これがスマートフォンのGPUのシェーダプログラミングの難しさのひとつでもあります。

UnityのShaderLabでは`highp`, `mediump`, `lowp` がそれぞれ `float`, `half`, `fixed`にあたります。
[Unityのマニュアル](https://docs.unity3d.com/jp/540/Manual/SL-DataTypesAndPrecision.html)に浮動小数点の精度と使い分けについて詳しく書かれています。

# 最後に
GPUによって浮動小数点数の精度が異なるのがスマートフォンのシェーダプログラミングの難しさのひとつです。
PCで動作したから大丈夫、iPhoneで動作したから大丈夫、というわけではないということを意識してシェーダを書くようにしていきましょう！
RubyのブロックとProcオブジェクトについて調べてみた

rubyを書いていると時たま```array.map(&:to_i)```みたいな書き方を見るけど、あまり理解できてなかったのでちょっと調べてみた。

そうすると、rubyの「ブロック」だったり「Procオブジェクト」とかの理解もなかったなーと思ったので```array.map(&:to_i)```を解説しがてら「ブロック」と「Procオブジェクト」も解説する。

## ブロックとは
一言で説明するなら「処理のまとまり」のこと。
メソッドは受け取ったブロックを、メソッド内で```yield```を呼び出すことで実行することができる。
例えばこのように

```ruby:block.rb
def block_test
  puts "first"
  yield 
  puts "second"
end

block_test do
  puts 'called block'
end

# "first"
# "called block"
# "second" の順に表示される
```


この例だと、```block_test``` メソッドは 処理```puts 'called block'```をブロックとして受け取り、メソッドの中で```yield```が呼ばれたら受け取ったブロックを実行する。

## Procオブジェクトとは
上記で説明したブロックは「処理のまとまり」としてメソッドに渡すことはできるが、オブジェクトではないので変数に代入したりとかはできない。もし変数に代入して流用などしたい場合には、Procを使う。

簡単に説明すると、Procはブロックをオブジェクト化したものであり、変数への代入ができたりするので処理の使い回しができる。

```ruby:proc.rb
def proc_test(&block)
  puts 'first'
  block.call if block
  puts 'second'
end

proc_test do
  puts "hello, I'm Proc"
end

# 'first'
# 'hello, I'm Proc'
# 'second' の順に表示される
```

まず```proc_test``` メソッドの呼び出しだが、ここは```block.rb```の例と変わらない。呼び出し時にブロックを渡している。

```block.rb``` と異なるのは```proc_test``` メソッドの定義で```(&block)```という仮引数が指定されているところである。
```&``` を仮引数に前置することでメソッド呼び出し時に受け取ったブロックを、Procオブジェクト化して変数```block```に納めている。

そして、メソッド内でProcオブジェクトを呼び出すには```block``` に対して ```call```メソッドを呼ぶと実行できる。

## じゃあ、```map(&:to_i)```とは...?
まずよく見るmapの使い方はこのような

```ruby:map.rb
s_nums = ["1", "2", "3"]
nums = s_nums.map {|n| n.to_i}
puts nums
# [1, 2, 3]と表示される
```
じゃあ```map(&:to_i)```は何が行われているかと言うと、

```ruby
s_nums.map(&:to_i)
```
シンボル化したメソッド```:to_i``` に ```&``` を前置すると、自動的に```:to_i``` に対して```to_proc``` メソッドが呼び出される。そうすると```to_i```がProcオブジェクトとなる。

このProcオブジェクトがレシーバの```s_nums```の要素に繰り返し呼ばれて、新たに整数の配列を返す、と言うことが行われている。


## 参考

https://qa.atmarkit.co.jp/q/35
[パーフェクトRuby](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Ruby-PERFECT-6-Ruby%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA/dp/4774158798)
maxやmin関数を使って一発でリスト内から所望の要素をgetする

# やりたいこと
あるリストの中から、特定の値が最大（最小）の要素を取得したい

活用例１：
文字列のリストの中から、文字数が最大のもの

活用例２：
あるクラスのメンバ変数の値が最大(最小）のもの

# コード例
## 文字列の最大・最小の要素を特定する

```py
strlist = [ "bcd", "fg", "abcdefg", "xyz" ]
max_len_element = max(strlist, key=len)
min_len_element = min(strlist, key=len)
print(max_len_element) # -> "abcdefg"
print(min_len_element) # -> "fg"
```
なお、`key=len`を指定しない場合、文字列の1文字目の`ord`の最大の要素を返す仕様みたい
（pythonの[max](https://docs.python.jp/3/library/functions.html#max)には特に明記されていないように感じますが、検証したところそうみたいでした）


## クラスのメンバ変数の値が最大(最小）の要素を特定する

```py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Foo(object):
    """
    Sample class
    """
    def __init__(self, name, age):
        """
        initialize method
        """
        self.name = name
        self.age = age

    def __repr__(self):
        """
        representaion method
        """
        return self.name

foolist = [ Foo("foo1", 10), Foo("foo2", 15), Foo("foo3", 4) ]
max_age_foo = max(foolist, key=lambda x:x.age) # foo2 のインスタンス
min_age_foo = min(foolist, key=lambda x:x.age) # foo1 のインスタンス

print(max(foolist, key=lambda x:x.age)) # -> foo2
print(min(foolist, key=lambda x:x.age)) # -> foo3
```

sortして一番大きい(小さい）要素を取得するよりも速度も速かったので、
最大（最小）のみを利用するのであれば、maxやminを使うのがよさげ。

```py3
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import random

from timer import Timer

class Foo(object):
    """
    Sample class
    """
    def __init__(self, name, age):
        """
        initialize method
        """
        self.name = name
        self.age = age

    def __repr__(self):
        """
        representaion method
        """
        return self.name

timer = Timer()

foolist = [ Foo("foo%d" % i, random.randint(0, 1000)) for i in range(1000) ]

timer.start("using max")
max_foo = max(foolist, key=lambda x:x.age)
timer.stop("using max")
print("using max: %.3f" % timer.get_result("using max"))

barlist = [ Foo("foo%d" % i, random.randint(0, 1000)) for i in range(1000) ]
timer.start("using sort")
max_foo = sorted(barlist, key=lambda x:x.age, reverse=True)[0]
timer.stop("using sort")
print("using sort: %.3f" % timer.get_result("using sort"))
```

出力結果

```
using max: 0.001
using sort: 0.003
```

# 参考
- [Python リスト内で文字数が最小の要素を特定するには？](https://qiita.com/TBeaR/items/4629c24973c171cc3c1c)
sudoコマンドについて

## はじめに

一度くらいAdventカレンダーに参加してみたくての投稿です。
拙い文章になりますが、ご容赦願います。
ご指摘いただければ幸いです。

よく使っているsudoコマンドについて、最近 おお！ と思ったことについて書きたいと思います。

## 環境
- Ubuntu 16.04

## sudo コマンドのメリットってなに？

rootユーザに成らなくてもrootユーザの権限で処理を実行できるコマンドになります。
認識的にrootユーザにログインしないから、セキュリティにつよい？くらいのメリットしか
思っていませんでした。

### 本題

ところが、` sudo su -` コマンドを実行すると現在のユーザのパスワードでrootユーザとして
ログインすることができます。これにより、そもそもrootユーザ自体を有効にしなくても管理者権限で
処理を実行することができます！

個人的にすごく楽なメリット（セキュリティ的にどうなの？とも思いますが...）だと思ってます。
具体的には

- rootユーザのパスワードを覚えなくてもいい

この１点につきます。
他にも色々ありますが、最近この使い方をしって、sudoコマンドへの価値観が変わりました。
便利な反面、デフォルト状態で設定されているユーザのsudo状態だとこの使い方を知っていれば
rootユーザの権限を使えるので、通常編集できないファイルやアクセスさせたくない箇所にアクセスできてしまうのでsudoコマンドの設定周りについて調べたいと考えております。

このあたりはまとめられ次第qiitaで公開したいです。


ここまでお付き合いいただきまして、ありがとございました。
他の皆様の記事に比べると内容が薄くて恐縮ですが、アウトプットを増やして行けたらと考えております。

以上です。
goroutineと仲良くする（2）

この記事は[goroutineと仲良くする（1）](https://qiita.com/kpppn/items/970e13fdcf4fce98bd00)の続きです。
前回はgoroutineの実行方法を今回はgoroutineの止め方についてです。

## sync.WaitGroup
syncパッケージのWaitGroup関数を使用したgoroutineの止め方です。
前回の記事で使用していた以下のコードですが、
プログラムの処理が非同期処理も早く終了してしまうために、結果が出力されないので0.1秒遅延させてます。

```go
package main

import (
    "fmt"
    "time"
)

func printNumbers(begin, end int) {
    for i := begin; i < end; i++ {
        fmt.Println(i)
    }
}

func main() {
    fmt.Println("--- start ---")

    printNumbers(1, 5)
    go printNumbers(6, 10)  // goroutine1
    go printNumbers(11, 15) // goroutine2

    time.Sleep(100 * time.Millisecond) // 0.1秒遅延
    fmt.Println("--- finish ---")
}
```

本来であれば、goroutineの処理が終了するのを待ってからプログラムの処理を終了させたいところです。
そんな時に`sync.WaitGroup`を使うことができます。
以下のようにコードになります。

```go
package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func printNumbers(begin, end int) {
	for i := begin; i < end; i++ {
		fmt.Println(i)
	}
}

func goPrintNumbers(begin, end int) {
	for i := begin; i < end; i++ {
		fmt.Println(i)
	}
	wg.Done() // wgの数を1つ減らす
}

func main() {
	fmt.Println("--- start ---")

	printNumbers(1, 5)

	wg.Add(2)                 // goroutineの数を2つ増やす
	go goPrintNumbers(6, 10)  // goroutine1
	go goPrintNumbers(11, 15) // goroutine2
	wg.Wait()                 // goroutineが完了するまで待つ

	fmt.Println("--- finish ---")
}
```
WaitGroupの値を作成し、`Add`メソッドを使用して、使用するgoroutineの数分追加をする。
`Done`メソッドを使用して、1つのgoroutineの処理の終了時にWaitGroupの値を1つ減らす。
`Wait`メソッドはWaitGroupの値が0になるまで待つ処理です。

## context.WithCancel
さらに途中でgoroutineの処理を停止させる必要がある場合があると思います
そんな場合は、go1.7以上であれば`context`パッケージを使用することでgoroutineの処理を停止させることができます。

```go
package main

import (
	"context"
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func goPrintNumbers(ctx context.Context, ch chan int) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("goroutine finish")
			wg.Done() // wgの数を一つ減らす
			return
		case num := <-ch:
			for i := num; i < num+5; i++ {
				fmt.Println(i)
			}
		}
	}
}

func main() {
	fmt.Println("--- start ---")

	// contextを生成
	ctx, cancel := context.WithCancel(context.Background())
	ch := make(chan int)
	for i := 0; i < 2; i++ {
		wg.Add(1) // goroutineの数を追加
		go goPrintNumbers(ctx, ch)
	}

	for number := 1; ; {
		// numberが16になったらgoroutineを停止させる
		if number == 16 {
			cancel() // ctxを終了させる
			break
		}

		ch <- number
		number += 5
	}
	wg.Wait() // goroutineが完了するまで待つ

	fmt.Println("--- finish ---")
}
```
`ctx.WithTimeout`を使用することでタイムアウト処理とキャンセル処理を行うこともできます

## 参考
[みんなのGo言語【現場で使える実践テクニック】](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEGo%E8%A8%80%E8%AA%9E%E3%80%90%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%80%91-%E6%9D%BE%E6%9C%A8%E9%9B%85%E5%B9%B8/dp/477418392X/)
Intellijのeditor-based Rest Clientをおためし

IntelliJ IDEA 2017.3から導入された機能 [REST Client in IntelliJ IDEA Code Editor](https://www.jetbrains.com/help/idea/rest-client-in-intellij-idea-code-editor.html) を試してみます。

## ファイル作成
`.http`または`.rest`を拡張子とします。スクラッチのhttp requestでもよい。


## GETを投げてみる
URLを書いてみどりの矢印をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33357/c0b4f49b-97f0-ace8-55fc-6ebf703c04e7.png)
URLの前にHTTP Methodを書くが省略するとGETになる

2017-12-20T093341.200.htmlなるファイルに出力されました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33357/e8f13cb6-9f55-7717-9bef-c01bcbfde1dc.png)

出力ファイルは `.idea/httpRequests/` 以下に吐かれているようです

## POSTを投げてみる
こんな感じに書ける

```
POST http://hoge.api/resources/id
Content-Type: application/json
Cookie: key=val

{
"key" : "value",
}
```
request bodyをファイルからとりたいときは
`< path/to/file`などと書く

## 環境変数
project内に`rest-client.env.json`というファイルがあると、プレースホルダ`{{key}}`で値を利用できる

```json:rest-client.env.json
{
 "env-name": {
   "key": "value"
 },
}
```
どの環境を使うかは実行時に選択をせまられる

## 所感
補完やサジェストを効かせてくれるのがうれしい。
GETで取得したなにやらを変数に格納できたり、ファイルの上から順に実行できたり、プログラマブルになったらよいなと思いました。
まぁinsomniaでいいや。
Google Home で AQUOS を動かしてみる

Google Home Mini を購入したので、早速何か使えないかと思い、実家にある SHARP AQUOS テレビを操作してみました。
「実家のテレビをつけて」あるいは「実家のテレビを消して」というフレーズに対して、実際にテレビをつけたり消したりできるようになることを目指します。

# 処理の流れ
処理の流れは下図の通りです。
![処理の流れ](https://qiita-image-store.s3.amazonaws.com/0/171449/7d673c78-c706-1858-cbd7-b0d96bc303e7.png)
IFTTT で Google Home と連携し、特定のフレーズが読まれた時にリクエストを投げ、それを Node.js サーバーで受け取り、AQUOS を操作する流れになります。

# 1. AQUOS 側の設定
AQUOS のいくつかの機種には、「AQUOSコネクト」と呼ばれるリモコン操作用のTCPソケットサーバが搭載されています。
まずは、下記手順で AQUOSコネクト を立ち上げます。

1. AQUOS をネットワークに接続する
2. 電源をつけ、「ツール」ボタンを押し、ツールメニューを開く
3. 「設定」→「通信（インターネット）設定」→「AQUOSコネクト設定」の順に進める
4. AQUOSコネクト状態を「する」に変更し、ログインIDとパスワードを設定する

# 2. AQUOS 操作用の Node.js サーバーの作成

AQUOS を外部から操作するために、 AQUOS と同じネットワーク上に AQUOS 操作用のサーバーを立てます。
今回は、Node.js で実装し、ごく簡易的に ngrok で外部に公開しました。

AQUOS を操作するためのライブラリはすでに作られている方がいらっしゃったので、そちらを使用します。
https://github.com/benburkhart1/sharp-aquos-remote-control

ソースは下記にて公開しております。とりあえず電源の ON/OFF ができるところまで作成しました。
立ち上げてからしばらくするとタイムアウトのようになり、AQUOSが反応しないことがあるのでご注意ください。
https://github.com/ShinnosukeOka/aquos-remote-ngrok-server

まず、ライブラリの初期設定を行います。

```js
var Aquos = require('sharp-aquos-remote-control').Aquos;

// AQUOS接続のための設定
var gw = new Aquos('xxx.xxx.xxx.xxx', portNo, 'UserID', 'Password');
var webapp = express();
```

それぞれGETで受け取れるエンドポイントを用意して、ライブラリを使って AQUOS に電源の ON/OFF を行うリクエストを送っています。

```js
// 電源をつける操作のエンドポイント 
webapp.get('/turnon', function(req, res) {
    // AQUOSに電源ONのリクエストを送る
    gw.power(true, function(err, data) {
        return;
    });
});

// 電源を消す操作のエンドポイント 
webapp.get('/turnoff', function(req, res) {
    // AQUOSに電源ONのリクエストを送る
    gw.power(false, function(err, data) {
        return;
    });
});
```

サーバーの公開には簡易的に ngrok を使用していますので、一度起動して、どのURLでアクセスできるか確認しておきます。


# 3. IFTTT の設定
Google Home と 2. で作成したサーバーとのやり取りは IFTTT で行います。
IF ...  の部分は Google Assistant を、 THEN ... の部分は Webhook を選択し、「あるフレーズが発言された時に、サーバーにリクエストを送る」よう設定していきます。

電源ON側の設定はこちら。
「実家のテレビをつけて」というフレーズが認識された時、サーバーの電源ONのエンドポイントにリクエストを送るようにします。
![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/171449/d45788af-b6f6-f914-cdbf-255122075266.png)

一方の電源OFF側の設定はこちら。
「実家のテレビを消して」というフレーズが認識された時、サーバーの電源OFFのエンドポイントにリクエストを送るようにします。
特に、「消して」という単語をひらがなで解釈する場合があるので、それを吸収できるようにするため、ひらがなの方もフレーズとして登録しています。
![スライド2.PNG](https://qiita-image-store.s3.amazonaws.com/0/171449/0865bb03-40fb-c332-5f34-9621bd9d56fd.png)

# 4. 完成！
ここまでできれば無事動作してくれるはずです。
限られた時間の中でとりあえず「まずは動かしてみよう！」という所まで作成しましたので、サーバーの起動の度に IFTTT の設定を変えなければいけないなど、不便なところがあります。

今後は、今現在 IFTTT で作成しているところを Actions on Google で実現し、いろんなフレーズで柔軟にできるようなものを作っていきたいと思っています。

以上です。最後までお読みいただきありがとうございました。
PHPの多重代入についての検証

## PHPの多重代入とは  
複数の変数に同じ値を一行で代入すること。
多くの言語では`$a = $b = 100;`といった形で表現できる。


## 検証する点  
クラスの外や関数の中では多重代入可能だが、**プロパティでは不可能**なのか

## 結果
+ グローバル変数の多重代入->可能
+ 関数内でのローカル変数への多重代入->可能
+ 関数内での静的変数への多重代入->**エラー**
+ クラスプロパティでの多重代入->**エラー**
+ クラスメソッドでの多重代入->可能

## 検証  
1. グローバル変数の多重代入  

    ```php
    $a = $b = 100;
    echo 'a is ',$a,PHP_EOL;
    echo 'b is ',$b,PHP_EOL;
    //////////////////////////////////
    a is 100
    b is 100
    ```
    可能 

1. 関数内でのローカル変数への多重代入  

    ```php
    function test($value)
    {
    	$a = $b = $value;
        echo 'a is ',$a,PHP_EOL;
      	echo 'b is ',$b,PHP_EOL;
    }

    test(3939);
    /////////////////////////////////////
    a is 3939
    b is 3939

    ```
    可能

1. 関数内での静的変数への多重代入  

    ```php
    function test($value)
    {
        static $a = $b = $value;
        echo 'a is ',$a,PHP_EOL;
        echo 'b is ',$b,PHP_EOL;
    }

    test(765);
    /////////////////////////////////////
    Fatal error: Constant expression contains invalid operations
    ```
    エラー

1. クラスプロパティでの多重代入  

    ```php
    class testClass
    {
        public $a=$b=100;
    }

    $test = new testClass;
    echo 'a is ',$test->a,PHP_EOL;
    echo 'b is ',$test->b,PHP_EOL;
    /////////////////////////////////////
    Fatal error: Constant expression contains invalid operations
    ```
    エラー

1. クラスメソッドでの多重代入

    ```php
    class testClass
    {
        public $a;
        public $b;
        public function assign($value)
        {
            $this->a = $this->b = $value;
        }
    }

    $test = new testClass;
    $test->assign(5);
    echo 'a is ',$test->a,PHP_EOL;
    echo 'b is ',$test->b,PHP_EOL;
    //////////////////////////////////
    a is 5
    b is 5
    ```
    可能



## 考察  
クラスプロパティでの多重代入 については変数を参照できないためと思われる。[^1]
関数内での静的変数への多重代入 についてはなぜエラーになるのかわからなかった。が、マニュアルの記述を見るにクラスプロパティと同じような理由だろう[^2]


[^1]: >プロパティを定義するには public、protected あるいは private のいずれかのキーワードのあとに通常の変数の宣言を続けます。 宣言時に初期値を設定することもできますが、初期値は定数値でなければなりません。 つまり、コンパイル時に評価可能な値でなければならず、 実行時の情報がないと評価できない値であってはいけないということです。[PHP: プロパティ - Manual ](http://php.net/manual/ja/language.oop5.properties.php)  
[^2]: >PHP 5.6 以降は、これらの変数に式の結果の値を代入できます。 しかし関数は使えません。関数を使おうとするとパースエラーが発生します。[PHP: 変数のスコープ - Manual ](http://php.net/manual/ja/language.variables.scope.php)