OmniAICreator/Qiita-1.07M huggingface dataset:
ESP-WROOM-02: ATコマンドによるWifi動作確認

ESPRESSIF公式ドキュメント (ESP-WROOM-02 & ESP8266)
http://espressif.com/en/support/download/documents

#  動作確認 

デフォルトFWのシリアル設定
* 115200bps, 8N1
* 改行コード: RX=CR, **TX=CR+LF**

※ 起動直後は76800bps でboot logが出力される．

```
 ets Jan  8 2013,rst cause:1, boot mode:(3,0)

load 0x40100000, len 1396, room 16
tail 4
chksum 0x89
load 0x3ffe8000, len 776, room 4
tail 4
chksum 0xe8
load 0x3ffe8308, len 540, room 4
tail 8
chksum 0xc0
csum 0xc0

2nd boot version : 1.4(b1)
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000


SDK
```

## ATコマンド動作確認

ATコマンド詳細は [ESP8266 AT Instruction Set](http://espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf) を確認．

```
AT+GMR
AT version:0.40.0.0(Aug  8 2015 14:45:58)
SDK version:1.3.0
compile time:Aug 11 2015 17:02:18
OK
```

## macの確認 

```
AT+CIPSTAMAC?
+CIPSTAMAC:"xx:xx:xx:xx:xx:xx"

OK
```

## station modeにしてAPのリスト取得

```
AT+CWMODE=1
OK
AT+CWMODE?
+CWMODE:1

AT+CWLAP
+CWLAP:(<ecn>, <ssid>, <rssi>, <mac>, <ch>, <freq offset>, <freq calibration>)
+CWLAP:(<ecn>, <ssid>, <rssi>, <mac>, <ch>, <freq offset>, <freq calibration>)
```

> \<ecn>  
0 : OPEN
1 : WEP
2 : WPA_PSK
3 : WPA2_PSK
4 : WPA_WPA2_PSK
5 : WPA2_Enterprise)

## AP に接続

```
AT+CWJAP="ssid","passwd"
WIFI CONNECTED
WIFI GOT IP

OK
AT+CWJAP?
+CWJAP:"ssid","xx:xx:xx:xx:xx:xx",<channel>,<rssi>

OK
AT+CIFSR
+CIFSR:STAIP,"192.168.11.xx"
+CIFSR:STAMAC,"xx:xx:xx:xx:xx:xx"

OK
```

## 適当なwebサーバにTCPコネクションを張ってみる

```
AT+CIPSTART="TCP","192.168.11.1",80
CONNECT
OK
AT+CIPMODE=1    # 1:UART-WiFi passthrough mode
OK
AT+CIPSEND
OK
>
```

この状態で例えば下記のようにGETを送信するとresponseが返ってくる．(うまく動作しないときは先に telnet で試すとよいかも)

```
GET / HTTP/1.0

```

AT+CIPSEND使い方については， [4b-esp8266_at_command_examples_en.pdf](http://espressif.com/sites/default/files/documentation/4b-esp8266_at_command_examples_en.pdf)  参照

AT+CIPSENDからは，"+++"で抜けれるが，keyboardでタイプしてもダメ．コピーして貼り付けなどで，ターミナルに一気に送信すること．

TCPを切断．(放っておいても切れる)

```
AT+CIPCLOSE
CLOSED
```


## AP切断

```
AT+CWQAP

OK
WIFI DISCONNECT
```
なぜかブラウザでリロードしてもコンテンツが更新されない時の対処法

非常にレアケースかもしれないけど、将来また起こってしまった時のために投稿。

localhost で開発をしている時に、ロードしてもなぜかコンテンツが更新されず、`Command+Shift+R` でリロード（Mac の Chrome の場合）すると更新される状況に。

いろいろ調べてみたところ、以前にお試しした Service Worker のワーカーが残りっぱなしで、それが悪さをしていることが判明。

残っているワーカーを unregister するために、Chrome のスニペットで下記を実行した。

```JavaScript
navigator.serviceWorker.getRegistrations().then(function(regs) {
    console.log(regs);
    regs.forEach(function(reg){
        reg.unregister().then(function(result){
            console.log(result ? 'Unregistered' : 'Error');
        });
    });
})
```

スニペット機能は開発ツール内にあり、任意の JavaScript を保存して実行することが可能。下記のスクリーンショットを見てもらえれば、なんとなくわかると思います。実行するときは、左のリスト上で右クリックして「Run」を選択します。

![Screen Shot 2016-12-23 at 14.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/4617/111a5fbf-c2c1-641d-f21f-c1fe81a0306a.png)
【Java上達事例】30歳を過ぎてからプログラミングを始めた

※こちらの記事は、プロスタ編集部が現在大変人気の高いJavaの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【Java上達事例⑩】30歳を過ぎてからプログラミングを始めた](http://programming-study.com/case/thirty/)


30歳を超えてからプログラミングを学び始めた男性の体験談です。

目次
1 [30歳を超えてプログラミングを始めた](##30歳を超えてプログラミングを始めた)
2 [新しいことを始めたいと思ったのがきっかけ](##新しいことを始めたいと思ったのがきっかけ)
3 [使い勝手がいいJavaを選択](##使い勝手がいいJavaを選択)
4 [書籍とネットを使って隙間時間に学習](##書籍とネットを使って隙間時間に学習)
5 [わかりやすいJava入門編](##わかりやすいJava入門編)
6 [とりあえず一つの言語を徹底的に学ぶ](##とりあえず一つの言語を徹底的に学ぶ)

#【Java上達事例】30歳を過ぎてからプログラミングを始めた

##30歳を超えてプログラミングを始めた

私は30歳を過ぎてからJavaのプログラミングを勉強し始めた、文系の元ど素人です。どこまで出来ればプログラミングを習得したと言えるのかわかりませんが、プログラミング学習歴は約２年、自称中級者にて現在進行形で勉強中の身です。自己レベルを分析すると、初心者に毛が生えてた程度じゃないでしょうか。

まあ、こんな感じだと「２年もやっててそんなもんか！」とツッコミが入りそうですが、その通り。そこそこ忙しい毎日で「1日1時間はキーボードをたたこう」とか考えても、出来たり出来なかったりなので仕方ありません。完全にマイペースですが、プログラミングを学ぶ事は楽しいですし、少しずつでも前進している自分がいるので勝手に良しとしています。

##新しいことを始めたいと思ったのがきっかけ

そもそもプログラミングを始めようと思ったきっかけは、新しいことを学びたいと思ったのと、現在の仕事を発展させる何か足掛かり的なものになるのではないかと考えたからでした。現在、家族経営の零細企業で働いており、9年目になるのですが、慣れと安定を得られているのと同時に、マンネリ感や何か新しい要素を取り込みたいという向上心が出てきました。何か始めなきゃと思いたったところ、プログラミングがあったのです。

##使い勝手がいいJavaを選択


そんな流れでさっそくやってみようとしたのですが、当然何からどうすればいいのか全くもってわかりませんでした。まずは、どんな言語があるのか調べてみることにしたのですが、ここでまずビビります。ITの世界にはこんなにもたくさんの言語があるのかという事にビビったのです。これらはみんな違うルールで動くものなのか？どの言語を選びどこまで学ぶべきなのか？もう何だかこれは大変だぞと、テンションが下がったのを覚えています。

ビビってばかりじゃ始まりませんので、自分は地道にやっていけばいいんだと心に決め、とにかくどの言語を学ぶか決めようと考えました。とりあえず選定の基本条件は素人でも始めやすく、使い勝手がいいということです。そんなこんなで色々ネットで調べ、結果、最終的に選んだのがJavaでした。

Javaはオブジェクト指向であり、多くのプラットフォームで動く様に設計されているので汎用性を感じますし、記述の方法や文法も非常にとっつきやすく、プログラミングの基本となる考え方が身につきやすいのではないかと判断しました。特にアンドロイドがJavaでできているため、「アプリを作ったり出来たらいいなあ～」といった思いもありました。さらに、Javaはネットや書籍など独習できる情報量が比較的多いので、そこもポイントでした。

##書籍とネットを使って隙間時間に学習

周りにプログラミング経験者がいない環境である以上、当然書籍やネットの情報で勉強していくしかありません。書籍は現在までに20冊ぐらいは読んだと思いますが、完全に自分のペースで進められるので、仕事が忙しい毎日で時間をみつけて勉強するスタイルの自分には、すごく向いているのかなと思っています。

当初、「プログラミングを始めるのに、費用はどのくらいかかるのだろうか？」と言う心配もあったのですが、実際Javaを独習するのにかかる費用は書籍代ぐらいなもので、開発環境などは無料で使うことが出来ます。ただ、学ぶ範囲や掘り下げる深さによっては当然必要な知識が増えますし、新しい技術もこれから出てくるわけなので、学習を続けていく以上は継続して書籍代が増えるのは仕方がありません。それでも比較的安く始められることには変わりないと思います。

さらに言えば、ネット上にオープンな入門サイトも数多くあるので、その情報のみで学習することも可能です。この場合はもう費用ゼロですね。

##わかりやすいJava入門編

```	
新わかりやすいJava入門編
中古価格
￥1,457から
(2016/3/23 15:27時点)
```

こんな初心者だった自分が、はじめに読んでためになった書籍があります。「わかりやすいJava入門編:川場 隆 (著)」です。プログラミングやJavaに全く触れたことがない人の第一歩にはとても適していると思います。この本は基本中の基本から丁寧に書かれていますし、練習問題の設定が章ごとだけではなく、各パートごとにも細かく設定されているので、しっかりと手を動かしながら学ぶことができます。

また、まとめページもしっかりしていて見やすいです。学習が進むうちに「まえに覚えたんだけどなんだっけ～？」と忘れてしまうことがあっても、そのまとめページに戻ればスムーズに確認ができます。

本当の初心者を考え、ステップバイステップで構成されているので非常に理解が深まりやすく、挫折せずに知識を積み重ねていく事ができます。これからJavaを始める人にはおすすめの一冊です。

##とりあえず一つの言語を徹底的に学ぶ

ITの世界には多くの言語があり、どれからやったらいいか迷うかもしれませんが、とにかく学ぶ言語を１つ決め集中して学んでいくことがいいのではないでしょうか。Java以外の言語であっても、プログラムというのは基本的なコードの組み立て方や概念は同じような気がします。とりあえず何か1つを抑えておけば、他の言語の習得は書き方の違いだけを理解すればスムーズに身に付きそうです。

とりあえず言語を１つ選び基礎を勉強する。そうしてとりあえず走り出すことをすれば、どんどん次のレベルを学びにいく意欲や実力がついてくるのだと思います。これからプログラミングをやってみようと思っている方はぜひ頑張ってください。

【オススメ記事】
➡︎ [【Java上達事例⑨】独学の限界とその先のレベルに到達する方法](http://programming-study.com/case/limit/)
私がRails Girlsのことを知った理由

# はじめに
大阪府在住、仕事ではExcel VBAと、あとPerlをちょこっと修正する程度です。
Rails Girlsには一度も参加したことがないのですが、Rails Girls Advent Calendarを書いて頂きたい方の中に**参加していないけど、Rails Girls に特別な思いを抱いている方**というのがありましたので、書かせていただきます。

# そもそもRuby on Railsを知ったきっかけ
2年前になりますが、プログラミングを学びたいなぁと漠然と思っていたときに、[初心者が0からプログラミングを学ぶ時、読むとやる気が出る記事7選という記事](http://shosugi.com/2014/03/27/programming_beginner/)という記事が話題になったので読みました。
その中に、Wantedly仲暁子さんの[転びまくりながら、やっとここまできた](http://blog.wantedly.com/post/109536176463/here-we-are)というのがありました。
そして彼女が独学でRuby on Railsを勉強し、Wantedlyやその基となるサービスのプロトタイプを作った話に影響を受け、
よし、私もRuby on Railsやろう(๑•̀ㅂ•́)و✧
とひとりで盛り上がりました。

で、とある有名な学習サイトを参考にRuby on Rails勉強を始めたのですが……。
その前段階である仮想環境の構築（VurtialBoxのインストール→Vagrantのインストール→TelNetクライアントのインストール……）で疲弊し、ようやくRubyとRailsをインストールするところまでたどり着きました。
その後、「rails -v」を実行しましたが、

バージョン情報が返ってこない:sob:
RubyやPHPはインストールできてるのに、なぜかRailsだけ:sob:
エラーの一部が文字化けして調べられない:sob:
わかる部分でぐぐっても出てこない（英語で理解できない）:sob:

という状況になりました。周りに相談できる人もおりませんでした。
社内にSEやプログラマーはいますが、**今更新しい言語やフレームワークを持ち込まれても、覚えることが増えて困る**という状況。

というわけで、そこで挫折してしまいました。

# Rails Girlsを知ったきっかけ
今年に入って、[CoderDojo](http://www.coderdojo.jp/)という、子ども達のプログラミングのためのコミュニティに関わるようになりました。
そして、**忍者（子どもたち）も頑張ってるんだから、自分ももう一回Ruby on Railsに挑戦しようかな**と思うようになりました。

でも、とてもスクールに通うお金は捻出できない……そこで出会ったのが[Schoo](https://schoo.jp/)という動画学習サービスの[Ruby on Rails 入門 〜ミニブログの制作〜](https://schoo.jp/class/2226)という講座でした。
そして、その講座の講師をなさっていたのが、鳥井雪さんという Rails Girls Tokyoのオーガナイザーの方でした。

講座を受けるにあたり、[Rails Girls インストール・レシピ](http://railsgirls.jp/install)を参考に、環境を準備してくださいとのことでした。

そこでまず、[nitrous.io](http://railsgirls.jp/install)の手軽さに興奮。
もうRailsがインストールされてる！　これなら別のパソコンでも勉強の続きができる！
こんな便利なのもっと早く知りたかった～:exclamation:

そして、scaffoldジェネレータの手軽さに感動。
え？　もう掲示板出来たの:question:　え、編集とか削除もできるの:question:
Perlで同じようなのを作ろうと思ったら、めっちゃ大変やん。すごい～:sparkles:

それから、インストールレシピの手順に沿って作業したところ……自分のWindowsパソコンで、Railsが動いた:joy:
rails -vでバージョン情報が返ってきた:joy:
嬉しい～:heart:

というわけで、一度は遠ざかっていたRuby on Railsの勉強を再開することができました。

ただ、日程が合わなかったり、「小さい子をおいて参加するのってどうなんだろう」という葛藤もあったりで、Rails Girsにはまだ参加できていません。

# 今後どうするか
今年8月に、CoderDojoのカンファレンスである[DojoCon](http://dojocon.coderdojo.jp/)に参加し、そこでRuby関西で活動するRubyistのCoderDojoチャンピオン（地域のCoderDojoのオーガナイザー）の方とお話することができました。
Rails Follow-up Osakaにも誘ってくださっているのですが、まだ参加できておりません……。
2017年もRails Girls Osakaを実施するということですので、ことしはこういったコミュニティ活動にも参加したいと思っています。

# 余談
[nitrous.io](https://www.nitrous.io/)が**11月に閉鎖してしまったの**で、今は[RailsTutorial](http://railstutorial.jp/)で紹介されていた[cloud9](https://c9.io/)を使っています。

ただ、なぜか私がRailsTutorialをみながらCloud9上で作ったものを、herokuにデプロイすると、「An error occurred in the application and your page could not be served. Please try again in a few moments. If you are the application owner, check your logs for details. 」というメッセージが出てしまって先に進めません。

しかしながら、nitrous.ioからのデプロイであれば問題なかったので、そのままnitrous.io上でRailsTutorialを最後までやりました。
RailsTutorial、1周めはテストを全て回避したので、「2周めやらないとな……」と思っています。
機会があればこのエラーの原因を相談したいです。
また、前述のRubyistさんに「nitrous.ioが無くなって困ってます」と話したところ、**「ローカルでがんばってください」**と爽やかにご回答いただきました。
もう一度、ローカル環境の構築にもチャレンジしようかな。
2016-12-23 Jupyter / matplotlib > 2Dイメージをファイル保存する > plt.savefig("foo.png") / ただし、plt.show()があると保存に失敗する模様

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

関連　http://qiita.com/7of9/items/639e4790759dc6fb2cf0

２Dイメージをファイル保存したい。
plt.savefig()を使うらしい。

```py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

data_1d = np.random.rand(22500)
print(data_1d)
data_2d = np.reshape(data_1d, (150,150))

plt.imshow(data_2d, extent=(0,150,0,150),cmap=cm.gist_rainbow)
#plt.show()

plt.savefig("foo.png")
```

`plt.show()`はコメントアウトした。
これが実行されるとfoo.pngのファイルが正しく保存されないから。

バグなのか、仕様なのかは未調査。
死んだ牛肉だけが届く日々からの脱却 (LINE BOT)

LINE BOT の制作中、よくわからない問題が起こりました。

死んだ牛肉しか届かないのです。

状態
----

- HTTPS 接続可能な公開サーバーに BOT 本体をアップロード済み。
- BOT は受け取ったメッセージをログファイルに書き出す機能を有している。
- Webhook URL は正常に登録されている。
  - LINE developers → Webhook URL → VERIFY で確認。
  - BOT のログファイルに記録あり。
- サーバーのホワイトリストにも、公開サーバーの IP アドレスを登録済み。
  - LINE developers →  Server IP Whitelist
- LINE 上で BOT を友達登録し、メッセージを送っても無反応。
  - BOT のログファイルに記録なし。

### ログファイルの記録

Webhook URL によって送られたメッセージです。

~~~json
{"events":[{"replyToken":"00000000000000000000000000000000","type":"message","timestamp":1451617200000,"source":{"type":"user","userId":"Udeadbeefdeadbeefdeadbeefdeadbeef"},"message":{"id":"100001","type":"text","text":"Hello,world"}},{"replyToken":"ffffffffffffffffffffffffffffffff","type":"message","timestamp":1451617210000,"source":{"type":"user","userId":"Udeadbeefdeadbeefdeadbeefdeadbeef"},"message":{"id":"100002","type":"sticker","packageId":"1","stickerId":"1"}}]}
~~~

userId の部分が deadbeafdeadbeaf ... 死んだ牛肉。

> "userId":"Udeadbeefdeadbeefdeadbeefdeadbeef"

何やら不吉ですが 16 進数で作れるおもしろ単語ということで、一部の界隈では好まれているらしいです。

原因
----

Webhook の機能自体が有効化されていませんでした。

LINE @ MANAGER → アカウント一覧の中から BOT を選択 → アカウント設定 → BOT 設定 → リクエスト設定 → Webhook 送信 を「利用する」に設定。

無事 deadbeef 以外のメッセージも届くようになりました。

単純。

しかし設定が LINE @ MANAGER にあると気付かず LINE developers ばかり見ていて相当な時間を浪費してしまいました。

また忘れそうなので、備忘録として投稿。
Node-RedでBluemixでお天気情報をMongoDBに格納する（The Weather Company）

タイトルの通りです。
分析に使いたいなーというデータをとりあえずMongoにどかどか突っ込むのです。

## Node-Redではこんなかんじ。
![スクリーンショット 2016-12-23 13.31.00.png](https://qiita-image-store.s3.amazonaws.com/0/119378/2d53e462-c1e1-8bf2-3d01-36be8867fd8a.png)

## 必要なもの
injectノード：60分感覚で実行されるようにやってみました。
![スクリーンショット 2016-12-23 13.33.29.png](https://qiita-image-store.s3.amazonaws.com/0/119378/ac57f413-0bf2-fdae-19d8-4706cfb9c32f.png)


http requestノード：weatherのデータをゲットするためのURLを入れます。どうやったらそんなURLが。。というのは末尾記載のご参考情報の記事を見て下さい。
![スクリーンショット 2016-12-23 13.35.11.png](https://qiita-image-store.s3.amazonaws.com/0/119378/5e14f115-1c35-4555-a2be-638a37071633.png)


mongo2ノード：どのmongoのどのdbに入れるか（＝insert）を書きます。
![スクリーンショット 2016-12-23 13.36.24.png](https://qiita-image-store.s3.amazonaws.com/0/119378/7d2e075c-a9d1-1eef-2e6d-12fe8193ec2f.png)


debugノード：そのままです。

あとはdeployして挙動を確認します。debugノードを入れているので、Node-redの画面からもちゃんとお天気情報がゲットできているのかを見ることができます。
![スクリーンショット 2016-12-23 13.37.51.png](https://qiita-image-store.s3.amazonaws.com/0/119378/637f2fbf-8876-a196-1671-c8dc890974fd.png)


## 結果
compose.ioのMongoのデータブラウザで確認します。わんさか入っています。
![スクリーンショット 2016-12-23 13.33.00.png](https://qiita-image-store.s3.amazonaws.com/0/119378/867fc0a2-52cf-fa24-74ec-9788fe285622.png)


##ご参考
Bluemixでお天気情報ゲットだぜ
http://qiita.com/azzeten/items/46155f34fb16e0bd67c7

【Bluemix】Node-RED ｘ MongoDB@Composeを組み合わせて遊ぶ
http://qiita.com/azzeten/items/674c77f856ec857a7aa0
PySideでモデルイテレータを作る

PySideでツリー型のモデルを作成した際に、すべてのアイテムを順次アクセスしたい場合がある。

QTreeWidgetを使用ている場合は、QTreeWidgetItemIteratorで順次アクセスする事ができる。（C++用のライブラリなのでpythonだと若干使い勝手が悪いが）
QStandardItemModelや独自のモデルでもイテレータを使いたいので作成した。

コードはpython2だが、xrangeを使っていないのでpython3でもそのまま動く。

## コード
```python
#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
from PySide.QtCore import *
from PySide.QtGui import *


def model_iter(model, parent_index=QModelIndex(), col_iter=True):
    """ モデルのイテレータ
    :rtype: generator(QModelIndex)
    :type col_iter: bool
    :type parent_index: QModelIndex
    :type model: QAbstractItemModel
    """
    index = model.index(0, 0, parent_index)

    while True:
        if col_iter:
            for col in range(0, model.columnCount(parent_index)):
                yield index.sibling(index.row(), col)
        else:
            yield index

        if model.rowCount(index) > 0:
            for _ in model_iter(model, index, col_iter):
                yield _

        index = index.sibling(index.row() + 1, index.column())
        if not index.isValid():
            break
```

使い方は簡単で、モデルを渡すだけでイテレータを返してくれる。

```python
tree_model = QStandardItemModel()

item = QStandardItem("A")
item.appendRow(QStandardItem("A-1"))
item.appendRow(QStandardItem("A-2"))
tree_model.appendRow(item)

item = QStandardItem("B")
item.appendRow(QStandardItem("B-1"))
item.appendRow(QStandardItem("B-2"))
tree_model.appendRow(item)

item = QStandardItem("C")
tree_model.appendRow(item)

print([_.data() for _ in model_iter(tree_model)])
>>> [u'A', u'A-1', u'A-2', u'B', u'B-1', u'B-2', u'C']
```

ツリー型だけでなく、テーブル型のモデルにも対応している。

```python
table_model = QStandardItemModel(3, 3)
for r in range(3):
    for c in range(3):
        table_model.setItem(r, c, QStandardItem("%d-%d" % (r, c)))

print([_.data() for _ in model_iter(table_model)])
>>> [u'0-0', u'0-1', u'0-2', u'1-0', u'1-1', u'1-2', u'2-0', u'2-1', u'2-2']
```

## 逆順イテレータ
ついでに逆順イテレータも作成した。

```python
def model_iter_r(model, parent_index=QModelIndex(), col_iter=True):
    """ モデルのイテレータ（逆順）
    :rtype: generator(QModelIndex)
    :type col_iter: bool
    :type parent_index: QModelIndex
    :type model: QAbstractItemModel
    """
    index = model.index(model.rowCount(parent_index) - 1, 0, parent_index)

    while True:
        if model.rowCount(index) > 0:
            for _ in model_iter_r(model, index, col_iter):
                yield _

        if col_iter:
            for col in range(model.columnCount(parent_index) - 1, -1, -1):
                yield index.sibling(index.row(), col)
        else:
            yield index

        index = index.sibling(index.row() - 1, index.column())
        if not index.isValid():
            break
```

使い方は、正順のものとまったく同じ。

```python
print([_.data() for _ in model_iter_r(tree_model)])
>>> [u'C', u'B-2', u'B-1', u'B', u'A-2', u'A-1', u'A']

print([_.data() for _ in model_iter_r(table_model)])
>>> [u'2-2', u'2-1', u'2-0', u'1-2', u'1-1', u'1-0', u'0-2', u'0-1', u'0-0']
```

ちゃんとツリー構造も逆順に辿っている。

モデルの順次アクセスはよく使う機能だが、再帰を使うためいちいち実装するのは面倒である。
この関数をコピペしておけば何かと便利だ。

次回は、この関数を使って検索オブジェクトを作成する。
トレーニング - 計画する？それともしない？

http://tastycupcakes.org/2016/09/to-plan-or-not-to-plan/ から転載、翻訳を行ったものです。
この資料は、元の文章と同じく [CC-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) の元で公開されます。

## 概要

このゲームは、2つの活動で構成されます。絵を描くことと、ストーリーを伝えることです。これらの活動によって、チームは2つに別れます。1つのチームには、決められた時間と事前に計画する指示が与えられます。2つの活動が完了した後、ファシリテーターは、それぞれのチームの仕事について、ディスカッションをリードします。こうして、それぞれのチームは自分たちの経験を比較する機会を得ます。

## 時間

30〜45分

## 人数

2つのチームに分けるため、6〜8人が理想です。

## 必要なもの

- 書くもの (紙など)
- 赤、緑、青いペン
- [ジャバウォックの詩](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A3%E3%83%90%E3%82%A6%E3%82%A9%E3%83%83%E3%82%AF%E3%81%AE%E8%A9%A9) を印刷したもの1枚。(詩の部分のみ) 全てのチームが見れるほどの大きさがよいでしょう。(プロジェクターに写してもよいです。)
- 以下の指示書を印刷したもの2枚。1枚ペラで下の順番で記してください。

1. 赤い四角を描いてください
2. 緑色の四角２つ、緑色の長方形１つを、赤い四角の中に描いてください
3. 犬を描いてくだい
4. 三角を描いてください
5. 三角は赤い四角の上に描いてください
6. 犬は青で描いてください
7. 旗ポールを描いてください
8. 2つの緑色の四角を、窓のようにしてください
9. 1つの緑色の長方形を、ドアのようにしてください
10. 7羽の鳥を描いてください
11. 三角は、赤で描いてください
12. 草を生やしてください
13. 旗ポールに、『ジャバウォックの詩』の23行目から引用した文字の書かれた旗を掲げてください

印刷用資料
- https://docs.google.com/document/d/1AsAG6R8dq8nZIZh7E1AqgKsgOiG8R6AJO8E1Lp8OiuI/edit?usp=sharing
- https://docs.google.com/document/d/1th2gT2gIMS3KRDx7uBWS2LWq5jKMG0VQxzyfxcycMEE/edit?usp=sharing

## 説明

チーム1と、チーム2の2つのチームに分けてください。これから行われるエクササイズでは、計画のあるチームと、計画のないチームのどちからになるということを知らせてください。

アクティビティ1:  絵を書いて！

指示書に従って絵を描くことをチームに説明してください。まずは、チーム１は部屋から退出させてください。チーム2から活動を開始します。

チーム2:

1. 1分間指示書を確認する時間と、4分間の絵を描く時間ががあることを説明します。
2. 指示書を手渡して1分間の計画がスタートします。この時点で絵を描くことはできません。ファシリテーターは、彼らがどのような仕事の分割をするかを観察してください。彼らが始める前に家の絵を書けるかどうかを確認してください。
3. 計画時間が終わったら、絵を描くように指示してください。

絵を描く時間が終わったら、1, 2分、彼らの出来上がりについてふりかえり、議論する時間を与えます。その後、絵を隠し、チーム1を招き、チーム2には部屋から退出するように指示します。チーム1にはこのように指示します。

チーム1:

1. 彼らには計画の時間がないことを説明します。しかし、絵を完成させるために1分間のボーナスがあると説明します。
2. 指示書を手渡して5分間の書く時間が与えられます。彼らが、計画を始めるか、すぐさま図形を描いてしまうかを確認してください。彼らが、作業分担したり、やり直したりする状態を観察してください。

絵を描く時間が終わったら、小休憩後、チーム2を呼んで別のアクティビティをスタートさせます。

![image](https://qiita-image-store.s3.amazonaws.com/0/61997/cad15e27-c948-3b31-e209-f88644c18918.png)


アクティビティ2: ストーリーを教えて！

2つのチームに、5分である有名な詩を分析することを知らせます。今度は、チーム2が部屋を退出し、チーム1から活動開始します。

チーム1: 

1. 彼らには、ヒーロー、悪役、そしてストーリの概要を特定するプレゼンテーション方法を計画するために1分間の時間が与えられます。ラップトップを含めた手持ちの素材を使うことが許されます。
2. 1分間の計画が終了したら、『ジャバウォックの詩』を提示し、4分間のタイマーをスタートします。このときは、電話やラップトップを使って質問に対する答を見ることはできません。
3. 4分間が終わったら、ヒーロ、悪役、そしてストーリの概要のプレゼンを聞きます。正しい答えかどうかに加えて、他の詳細をこのグループが追加するかどうかに注意を払います。

一度、詩を隠します。チーム2を招待し、同じような手順を踏みます。ただし、このときははじめに明らかな計画時間を持たせず、5分間与えます。


## バリエーション

- 各チームのアクティビティを完成させるために、時間が必要になるかもしれせん。あなたは完成させるために時間を与えたくなるかもしれませんが、成果物を焼き直したり、洗練させる必要はありません。
- もし、絵を書くアクティビティをよりトリッキーにしたければ、青いペンを部屋から取り去ってください。彼らが青いマーカーが必要な時に、彼らを見て、「青いマーカーはあっちにあるわ」などと言い、彼らが聞いてきた1分後に青いマーカーを届けるようにしてください。

## ふりかえり

2つの違ったアクティビティを2つのチームがどのように行っていったかを解説します。絵描きアクティビティでは、最初指示書を読まないと手戻りが発生するように作られていますが、物語の場合はより単純です。ソフトウェアプロジェクトのように、ときには計画が重要なときもあれば、大したことのないこともあるのです。おそらく、各チームにはそのことが反映されているでしょう。

いくつかの質問を投げかけてみましょう:

- どのような障害がありましたか？
- もしチームが計画を行わなかったとしたら、それはなぜか聞きましょう。
- 絵を書く前に成果物を理解してましたか？
- 手戻りはありましたか?
- 2つのアクティビティに違いがあったとすれば、それは何ですか? 計画時間はもっと必要でしたか?
- 計画はよりよい結果に繋がりますか? 2チームの絵と、ストーリーの分析を比べてみましょう。
- 日々の仕事に関係ありそうなことはありましたか? 何が計画で効果的なことか、やりきるのに必要なことはなんでしたか?
- どんな種類のことが起きたら、開発の送れややり直しにつながっていますか? それは、どのように計画によって解消できるでしょうか?
Realmで非同期トランザクション(kotlin)

```kotlin
val defaultRealm = this.getDefaultRealm()
try {
    defaultRealm.executeTransactionAsync({ realm ->
            realm.copyToRealmOrUpdate(XXXX)
        }
    }, {
        defaultRealm.close()
    }, { error ->
        defaultRealm.close()
    })
}finally {
    Log.d("Save Teachers", "finally")
}
```

注意点がfinallyでcloseしちゃうとonSuccessもonErrorも呼ばれないこと。
重めの保存や更新しているときはこうしてやる。
調整

[CentOS/CentOS6をMinimalインストールした後の作業](http://linux.just4fun.biz/CentOS/CentOS6%E3%82%92Minimal%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AE%E4%BD%9C%E6%A5%AD.html)
[mod_rewriteの設定方法](http://centoshome.seesaa.net/article/118972004.html)
ちょっと気になったSQLまとめ

## はじめに
こんなこともできる！っていう実験をまとめた投稿です。
こんな使い方もできる！と書いている箇所がありますが、その使い方を推奨しているわけではありません。
また、パフォーマンスに関しては一切検証しておりません。

## WHERE句 サブクエリ

```sql
SELECT
    *
FROM
    Table_A
WHERE
    a = (SELECT a FROM Table_B)
AND
    b = (SELECT b FROM Table_B);
```
上記のような冗長なクエリを下記のようにまとめて書くことができる。
`=`以外の比較演算子でも使える。

```sql
SELECT
    *
FROM
    Table_A
WHERE
    (a, b) = (SELECT a, b FROM Table_B);
```

## 変数
MySQLにはユーザー定義変数というものがある。
これを使えば、`INSERT...ON DUPLICATE`や`join`、サブクエリを使った時に値を使い回せる。

```sql
SET @a = 1;
SET @b = 2;
SET @c = 3;
SET @d = 4;

INSERT INTO
    Table_A
    (a, b, c, d)
VALUES
    (@a, @b, @c, @d)
ON DUPLICATE KEY UPDATE
    a = @a,
    b = @b;
```
他にも、下記のような使い方ができる。
Table_Aの結果に、1から順番にカウントアップした番号を割り振っている。
UPDATE文とWHERE句等を上手く組み合わせれば、番号の再振り分けなんかもできる。

```sql
set @a = 0;
select @a := @a+1, a, b from Table_A;
```

## おわりに
他にも何かあれば追記していきます。
今日はとりあえずここまで。
MySQL-python でパラメータの自動エスケープ

# まとめ

Python の MySQL-python (MySQLdb) モジュールを使ってクエリを構築するときは `Cursor.execute(self, query, args=None)` の説明にある placeholder を活用しよう。

```
query -- string, query to execute on server
args -- optional sequence or mapping, parameters to use with query.

Note: If args is a sequence, then %s must be used as the
parameter placeholder in the query. If a mapping is used,
%(key)s must be used as the placeholder.
```

# テスト用のテーブル

テスト用に以下のようなテーブルを作っておく。

```
mysql> select * from testdb.person;
+------+--------+
| id   | name   |
+------+--------+
|    1 | foo    |
|    2 | bar    |
+------+--------+
```

# 悪い例

```py:bad.py
import MySQLdb


def select(name):
    connection = MySQLdb.connect(db='testdb', user='testuser')
    cursor = connection.cursor()
    cursor.execute("select * from person where name='%s'" % name)
    print("[query]")
    print(cursor._last_executed)
    print("[result]")
    result = cursor.fetchall()
    for rec in result:
        print(rec)
```

`select("foo")` とすると、いい感じに動いているように見える。

```
[query]
select * from person where name='foo'
[result]
(1L, 'foo')
```

しかし、 `select("foo' or name=name-- ")` のようにすると

```
[query]
select * from person where name='foo' or name=name-- '
[result]
(1L, 'foo')
(2L, 'bar')
```

と SQL injection ができてしまう。

# 良い例

```py:good.py
import MySQLdb


def select(name):
    connection = MySQLdb.connect(db='testdb', user='testuser')
    cursor = connection.cursor()
    cursor.execute("select * from person where name=%s", name)
    print("[query]")
    print(cursor._last_executed)
    print("[result]")
    result = cursor.fetchall()
    for rec in result:
        print(rec)
```

変えたのは `cursor.execute()` の引数の部分のみ。

`select("foo")` とすると、先程の例と同じように動作する。

```
[query]
select * from person where name='foo'
[result]
(1L, 'foo')
```

`select("foo' or name=name-- ")` としてもちゃんとエスケープしてくれる。

```
[query]
select * from person where name='foo\' or name=name-- '
[result]
```

# 参考文献

http://stackoverflow.com/questions/1947750/does-python-support-mysql-prepared-statements
Jupyter / matplotlib > 1Dの数値を2Dに変換して画像化 > v0.1 [失敗] / v0.2 [成功]

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

関連 http://qiita.com/7of9/items/c91db1a7d193d4857c6b

http://qiita.com/7of9/items/4aa9f546a4ff1bf2e1aa
で読み込んでいる1次元(27984要素)の値をmatplotlibで表示しようとしている。

1次元データから2次元画像を作る方法を検討中。
とりあえず乱数リストを画像化してみる。

### v0.1 
Jupyterコード

```py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

data_1d = np.random.rand(22500)
print(data_1d)
data_2d = np.reshape(data_1d, (-1,2))
print (data_2d)

plt.imshow(data_2d, extent=(0,150,0,150),cmap=cm.gist_rainbow)
plt.show()
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/08d5e426-11b2-3ab9-2a8d-118df92ea3a0.png)

横線が入っているので、何か間違っているようだ。

### v0.2

参考 http://www.kamishima.net/mlmpyja/nbayes2/shape.html

np.reshapeする時`, (-1,2)`でなく`, (150,150)`が正しかった。

```py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

data_1d = np.random.rand(22500)
print(data_1d)
data_2d = np.reshape(data_1d, (150,150))

plt.imshow(data_2d, extent=(0,150,0,150),cmap=cm.gist_rainbow)
plt.show()
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2504fa04-0ab7-1806-158f-6df521927068.png)

できた。ついてる。
IntelliJ IDEAでflash開発時にデバッグflashPlayerを立ち上げる設定

こちらはFlasherアドベントカレンダーその2の17日目、、に後付けにした記事です。空いてたので、ええ。
http://qiita.com/advent-calendar/2016/flasher2

#IntelliJでswf開発

AIRアプリの開発でなく、ブラウザで動くswf開発を久々にしてみたら、IntelliJでのデバック実行ごとにブラウザが立ち上がって面倒だったので、設定をいじってFlashPlayerを起動するようにしました。そのやり方のメモ投稿です。今バリバリas3書く人はほぼAIR開発でしょうし、IntelliJでswf開発ってかなりニッチですね。まあ問題なくできます。

![スクリーンショット 2016-12-23 10.48.34.png](https://qiita-image-store.s3.amazonaws.com/0/8302/b4ef9b90-2f43-00a9-37cc-2fcf20130d3a.png)
まず、メニューバーのRUNからDebug...という項目を開きます。

![スクリーンショット 2016-12-23 10.48.40.png](https://qiita-image-store.s3.amazonaws.com/0/8302/d369bd57-5b4a-7116-14e7-916af37338c9.png)
小さいサブメメニューが開くのでEdit Configurations...を選択します。なお、下にある`qiita2`ってのは開発中のプロジェクトファイルの名前です。

![スクリーンショット 2016-12-23 11.18.11.png](https://qiita-image-store.s3.amazonaws.com/0/8302/874cb6b9-817d-54ea-83b0-742f54deec9b.png)
このような大きなコンフィグ画面が立ち上がります。ここで色々設定できます。

![スクリーンショット 2016-12-23 10.48.53_.png](https://qiita-image-store.s3.amazonaws.com/0/8302/969a01aa-bf68-95b9-ec50-f0d228157977.png)
この項目で開くswfファイルを指定します。自分の場合開発プロジェクトフォルダ直下のout以下の深いところに出ていたのでそのswfを選択。(本番ビルドぽいフォルダに出てますがデバッグビルドもここに出てました。)

![スクリーンショット 2016-12-23 10.49.10.png](https://qiita-image-store.s3.amazonaws.com/0/8302/f8902a76-ce71-c1a3-2831-69cd41978bd1.png)
この項目で起動するFlashPlayerを選択します。

![スクリーンショット 2016-12-23 11.08.23.png](https://qiita-image-store.s3.amazonaws.com/0/8302/3e6d95de-2815-e750-ccc0-c4a85ac4109a.png)
MacでAnimateCCを使っているので'/Applications/Adobe Animate CC 2017/Players/Debug/Flash Player Debugger.app/Contents/MacOS/Flash Player Debugger'を選択しました。AnimateCCを持っていない場合などでも、スタンドアロンのDebug版FlashPlayerはここから落とせます。
http://www.adobe.com/jp/support/flashplayer/debug_downloads.html
FlashPlayerでなくともswfが開けるなら別に何のアプリでもいけるかもしれません。

![スクリーンショット 2016-12-23 11.10.18.png](https://qiita-image-store.s3.amazonaws.com/0/8302/c356569d-929f-39e3-0962-38838be0f37c.png)
デバッグ設定パネル右上の Single instance only にチェックを入れていると、デバッグ起動ごとにFlashPlayerが増えていかず都合がいいです。

デバッグ実行のショートカットは `Ctrl` + `D` です。(気持ちとしては`Ctrl` + `Enter` とかに変えたいところですが。)もしくは最初に開いたメニューバーから `Debug 'プロジェクト名'`でデバッグ実行できます。これで晴れてDebug版FlashPlayerが起動して、コンソール画面にもtraceのログが流れて来るはずです。当然ブレークポイントも効きます。


以上となります。日本に何人この情報を必要としてるかわかりませんが、数年後の自分は助かるでしょう。しかし、この記事の前にAIR SDKとIDEAを連携して開発を始めるまでの投稿の方が必要な気がしてきたな。
[Swift] スクリプトが存在するディレクトリを絶対パスで取得する

以下で取得可能。

```swift:path-to-me.swift
#!/usr/bin/env swift

import Foundation

guard let pathToMe = URL(string: "\(#file)", relativeTo: URL(fileURLWithPath: FileManager.default.currentDirectoryPath))?.path else {
  print("Error: current path of #file")
  exit(-1)
}
print( "path to me: \(pathToMe)" ) // path to me: /Users/uchcode/Desktop/path-to-me.swift

let __file__ = pathToMe as NSString
print( "NSString:")
print( "  full path: \(__file__)" ) // full path: /Users/uchcode/Desktop/path-to-me.swift
print( "  file name: \(__file__.lastPathComponent)" ) // file name: path-to-me.swift
print( "  directory: \(__file__.deletingLastPathComponent)" ) // directory: /Users/uchcode/Desktop
```
bash > 今いるディレクトリの拡張子一覧を表示する実装 > v0.1

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
GNU bash, バージョン 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

Jupyterノートの拡張子は何だったかを思い出そうとしてファイルリストを見ることがある。
拡張子のリストを見ればすぐに見つかるだろう。

## v0.1

```bash:disp_ext_exec
#/usr/bin/env bash -X

getfilelist() {
for afile in $(ls -F | grep -v "/")
do
	extension=${afile##*.}
	echo $extension
done
}

getfilelist | sort | uniq
```

```txt:実行
$ bash disp_ext_exec
161203_2025
161210
161210_1910
161210_1920
batch1
cp
csv
csv@
cut
disp_ext_exec
feed_dict
ipynb
learn0p001
learn0p01
learn_161203_2040
learn_batch2
learn_correctHidden_0p0003
learn_correctHidden_0p003
learn_correctHidden_0p03
learn_dropout:
learn_noEval
learn_noShuffle
learn_no_reshape
learn_non_qmc
learn_original
learn_placeholder@
learn_qmc
learn_sigmoid_onlyHidden
no_pack
npy
org
py
pyc
qmc
reprod_sine
sys
tmp
```

- 失敗: 拡張子を持たないファイル名(例: disp_ext_exec)はその名前がそのまま(disp_ext_exec)表示されている
- ファイル名の付け方は要改善
   - 拡張子の種類が多すぎる

> Jupyterノートの拡張子は何だったかを思い出そうとしてファイルリストを見ることがある。
拡張子のリストを見ればすぐに見つかるだろう。

他の無関係のファイル拡張子が多すぎて、目的を果たしていない。

jupyter-notebookを起動して、一覧からノートアイコンを確認して選択して開く方がはるかに簡単。
[Ruby] かしゆかの誕生日!

題名からしてネタにするつもり満載ですが、ネタです。

なお、これでも[Ruby Advent Calender2016](http://qiita.com/advent-calendar/2016/ruby) 23日めのネタになります。申し訳ありません。

コメントいただいて中身を少し変えました(12/25)。

# かしゆか様誕生日おめでとうございます

12月23日:今日はなんの日?
「かしゆかの日」
1988(昭和63)年12月23日に、かしゆか(樫野有香)生誕されたことを祝し、平成元年12月23日 (かしゆか満1歳) より、国民の祝日として制定される。今年で 28回目。

[樫野有香](https://ja.wikipedia.org/wiki/%E6%A8%AB%E9%87%8E%E6%9C%89%E9%A6%99) from Wikipedia

# ということで、かしゆかの誕生日だけに反応するモジュール

を準備してみました。

このモジュールを組み込んで、`Kashiyuka.birth` をコールすると、返り値として、かしゆかおめでとうメッセージが返ってきます。

12月23日しか反応しません。それ以外はnilです。潔いです(追記:12/25現在、試したら、ほんとにnilしか返ってこなくて、ちょっと悲しい)。

```ruby:perfume.rb
#!/usr/bin/env ruby
# coding: utf-8
require 'date'

module Kashiyuka
  BirthYear = 1988
  def self.birth
    case Date.today.to_s
    when /^(\d{4})-12-23$/
      "キューティクルの神様、かしゆか #{$1.to_i - BirthYear}歳の誕生日!"
    end
  end
end

```

なぜ、わざわざ `case` 文を使っているのかというと、module名を `Perfume` にしたら、3人分使えるなーという発想があったので、今後はそのように拡張していけたらいいなとか考えています!(ぉぃ

C言語の呪縛が長らく続いているので、「関数はreturnしなきゃ!!」みたいな強迫観念がありますが、Rubyだと大半の処理が式として処理されて、それなりにうまいことやってくれるので、一所懸命 `return` しなくても良いです。が、個人的には素人向け・素人さんはつけておいたほうがしばらくは安心だと思います。わたしの場合は、ただの強迫観念です。C言語怖い。`return`ないと落ち着かない病です。

# 言い訳だけすると

ホントは、何も考えずにRubyの文字コードについて何も考えずに、変数内にUTF-8な文字列が含まれてしまったときに、自分のケースではとんでもない挙動を起こしてしまうことの回避策・パターンをいくつか編み出したつもりになっていたら、ほんとに編み出したつもりだっただけで動いたり動かなかったり、恐ろしい出来事になってしまったので、封印しました。

この点については、[Ruby M17N の設計と実装](http://magazine.rubyist.net/?0025-Ruby19_m17n)にて理解した上で、まとめておきたいと考えてます。

Salesforce の Force.com Canvas という機能では、スケルトンとして Java と Ruby だけが準備されていて、フロントエンドの JavaScript と署名要求をやり取りするときに、この文字コード問題がわんさか発生するので、これにあわせてまとめてあげたら、良いステマになるんじゃないかと考えていましたが、それとは別に Force.com Canvas については来週まとめておきます。JavaScript 怖い。

# 追記

`Perfume` タグつけるような変態は一人で十分だと思ったら、もう一人いました。素晴らしいです。

[Atomをstyle.lessの記述のみで光らせる](http://qiita.com/sho-fukutomi/items/7766c7a394294b72becf)

# 更に追記(12/25)

無駄に github に置きました

`https://github.com/sho7650/perfume.git`
[C#][.NET 4.5~] WeakReference<T>/弱参照の使い方

C# で弱参照を使用したい場合の方法メモ

# 目的

+ インスタンスへの参照は保持したいが、強い参照を持ってGCの回収対象にならないのを避けたい
+ 循環参照の回避
+ コンポジションしている子のインスタンスから親のインスタンスを参照したい場合
    + => ただもし、ViewModel => Viewの操作で考えてるなら、Messenger パターン使ったほうが良い

# 使い方

```csharp:初期化
var wref = new WeakReference<Hoge>(new Hoge);
```

```csharp:参照時
Hoge obj;
if (wref.TryGetTarget(out obj))
{
    // 参照が必要な処理
}
```

`WeakReference<T>.TryGetTarget(out obj)` は取得成功/失敗をboolean型で返す。
注意点として、強い参照の保持期間は当然ながら、if式の間だけではなく、上記の例でいうと取得後、`obj` が破棄されるまでになる。一時変数ではなく、長い生存期間をもつ変数が束縛してしまうと弱参照で持った意味がなくなる。

# メモ

`WeakReference<T>` は、`.NET Framework 4.5` 以降で使用可能。
それ以前は `WeakReference` がつかえたが、書き方によってはGCで回収された後に参照できる方法がとれてしまった。
そこらへんは以下の記事が詳しい。

[WeakReference・WeakReference<T> の違いと、そこに潜む罠 - Qiita](http://qiita.com/zakuro9715/items/99962062b986c7dc301d)

`WeakReference<T>` は、`TryGetTarget` の文法上、使用中は強い参照を持つことが強制されるため上記の問題は解決された。

# どうやって実現されているか

TODO: `WeakReference<T>` は内部的に `IntPtr` で持っているとかなんとかの記事を見かけたことがあるけれども、その記事が見当たらないのと正確かどうかがわからないので追記する

# C# 7.0から
## 出力変数宣言
[C# 7 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](http://ufcpp.net/study/csharp/cheatsheet/ap_ver7/#out-var)

`C# 7.0` からは、新しい文法として`出力変数宣言`が使えるため、書き方が簡略化できるようです。

```csharp:C#7.0からの書き方
if (wref.TryGetTarget(out var obj))
{
    // 参照が必要な処理
}
```

# 参考
[WeakReference(T) クラス (System)](https://msdn.microsoft.com/ja-jp/library/gg712738(v=vs.110).aspx)
[【雑記】弱参照 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](http://ufcpp.net/study/csharp/RmWeakReference.html)
[【.NET】弱いつながりでWeakReference | 創造的プログラミングと粘土細工](http://pro.art55.jp/?eid=1109086)
総務チームとスクラムで取り組んだ1年～空から降る一億のカイゼン～

こんにちは、Gaiaxの技術開発部の長南(ちょうなん)です。
2014年にCSM(認定スクラムマスター)の認定を受け、
現在はPMOというチームに所属し、「強いチームをつくる」をミッションとして活動しています。
具体的には、総務チームや、開発チームへスクラムマスターとしての参加、
エンジニアの新人研修の企画、新卒/中途採用など...ジャンルを問わず携わっています。

今回は、12月17日に公開された「[総務のかんばんについて](http://gaiax.hatenablog.com/entry/2016/12/20/114005)」に関連して、
総務チームでスクラム実践の振り返りを書いてみます。
([Gaiax Advent Calendar](http://qiita.com/advent-calendar/2016/gaiax)には、実はこっそり総務のメンバーが参加しています！必見！)

# なぜ総務でスクラム？
きっかけは、社内のイントラのリニューアルです。
総務としての通常の業務に加えて、イントラの仕様を考える所からリリースまで行うのは
マルチタスクすぎて気が遠くなる状態でした。

そのため、総務チームの通常の業務を見える化して、業務改善/効率化を図り
余裕が出来たところでイントラのリニューアルを進めよう！という方針になりました。
今回はイントラのリニューアルの事例紹介は割愛しますが、
イントラのリニューアルは総務チームとして大規模な取り組みの1つでした。

# スクラムを導入した当初のチーム構成
* チーム: 総務チーム2名
* プロダクトオーナー(PO): 経営管理 1名
* スクラムマスター(SM): 1名(※私です)

計5名体制でスタートしました。
まずは幅広い業務を全て洗い出せるよう、プロダクトオーナーとスクラムマスターは
総務チーム以外のメンバーが担当しています。

#現在の総務チームの構成とスクラムイベント
* チーム: 総務チーム3名
* プロダクトオーナー(PO): 無し
* スクラムマスター(SM): 1名(※私です)

業務内容の全貌把握と大きな効率化は落ち着いたため、
現在はプロダクトオーナーを置かない体制を取っています。
また、1スプリントは2週間としており、
スプリントの中で実施しているのは、アサカイと、レトロスペクティブ(振り返り会)です。

# スクラム以外で実施したこと
総務チームでインセプションデッキを行った際に我々はなぜここにいるのか？を考えました。
複数の視点で、何を成したいのかを考えました。

> * 対総務: 総務チームの負担減
> * 対社内: 全ての情報をイントラから。働きやすさを提供する。
> * 対社外: 働きやすさを世の中へ！情報発信する総務チームへ。

忙殺されたり、目的を見失った時に思い出し立ち返れるため、チームで考えてみることをオススメします。

# 年内最後の振り返り(望年会)をやってみて
通常の振り返り会では、KPTを利用していますが、2016年最後の振り返り会では
今年できて良かったこと、来年チャレンジしたいこと、の2点を考えました。

色々と出てきたのですが、今年できて良かったことの一部紹介します。
> * 総務カンバンがリニューアル、仕事がしやすくなった
> * 業務内容がシンプルになった
> * 共有事項が確認しやすくなった
> * スケッチブックに歴史が刻まれている！
> ※日々のタスクはスケッチブックに貼って保管しています。現在5冊目です。
> * 壁を前にすると逃げてばかりだったけど、今年は1つ乗り越えられた！

小さい改善は思い出し切れないかも?というほどあるのだそう。
そして、来年チャレンジをしたいことはこちら。

> * カンバンをもっと使いやすく改善したい
> * 業務は増えてもシンプルな改善とを続けたい
> * 備品発注を自動化したい
> * 業務は増えてもシンプルに改善を続けて総務の知見としたい
> * 引き続き改善あるのみ！

スクラムを導入した当初は、
共有のファイル名も「～空から降る一億のふせん～」だったりと、
どこか追われている感がありました。
しかし、現在はタスク量が多くてもそれをこなす為の改善にフォーカスしようという雰囲気がチームにあります。

# これからの目指すべきところ
年明けには[オフィスの移転](https://grid.tokyo.jp)という一大イベントを控えており、今と異なる業務や課題も出てくると予想しています。
その一方で、「それぞれの働き方に合わせて、リモートワークを本格化したい」
という新たなチャレンジも話題に上がっています。
いずれにせよ、場所に囚われない共有方法や見える化を模索し、
総務チームとしても、個人としても働きやすいスタイルを再構築する事が目標と言えます。

# まとめ
1年を振り返ってみて、本当に色んなチャレンジをした1年だったと感慨深くなりました。

かれこれ1年以上、スクラム実践を通して改善を重ねています。
そして、改善の内容も小さなことから大きなことまで
数え切れないほど取り組んでいるというのも付箋で厚みを増したスケッチブックから見て取れます。
課題があれば改善しようという自律的なチームの姿勢は、私自身も日々刺激を受けるばかりです。

日々パワーアップしていく総務チームから目が離せません。
引き続き、Gaiax総務チームに乞うご期待！

皆さま、よき年末年始をお過ごし下さい★
SQLアンチパターン：メタデータトリブル (メタデータ大増殖)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- スケーラビリティを高める
- クエリの実行速度を劣化させずに、データが増加し続けるテーブルに対応できるよう、 データベースの構造を設計すること

# アンチパターン

- テーブルや列をコピーする

```sql
CREATE TABLE Customers (
  customer_id NUMBER(9) PRIMARY KEY,
  contact_info VARCHAR(255),
  business_type VARCHAR(20),
  revenue NUMBER(9,2)
);
```

カラム名に「2002」といった西暦があるカラムを増やしていくと、nullのカラムがどんどん増える

```sql
ALTER TABLE Customers ADD (revenue2002 NUMBER(9,2));
ALTER TABLE Customers ADD (revenue2003 NUMBER(9,2));
ALTER TABLE Customers ADD (revenue2004 NUMBER(9,2));
```

そこで、西暦ごとにテーブルを分割しようとする

```sql
CREATE TABLE Bugs_2008 ( . . . );
CREATE TABLE Bugs_2009 ( . . . );
CREATE TABLE Bugs_2010 ( . . . );
```

2011年のテーブルを作り忘れて不具合発生

- データの整合性の課題
  - 2009 のテーブルに、2010が入っていた、ということが起こる
- データの同期
  - 2009年1月3日のデータを、2008年12月28日にupdateすると整合性が保たれない
- 一意性の保証
  - プライマリーキーの値をつくるためのテーブルが必要になる
- テーブルをまただいたSQL
  - UNION で
  - 新しい年になれば、SQLの更新が必要になる
- カラムの追加
  - 全テーブルにする必要がある。そうしないと、UNION の対応が必要になる
- 参照整合性の管理
  - 外部キーは単一のテーブル指定が必要だけれど、複数テーブルがあるのでできない

## 用いてもいいパターン

過去データを最新のデータから分離するようなアーカイブが目的のときです。

# 解決策

パーティショニングと正規化を行う
- 水平パーティショニング
- 垂直パーティショニング
- 従属テーブルの導入

# まとめ

データにメタデータを増殖させないように気をつけましょう。

# 感想

- ソーシャルゲームの開発のときには、パーティショニングを使っていたので、解決策として正しかったのか、と安心
  - でも、自前でやったらいけない
- メタデータって？
 - データーのためのデータ
 - 書籍であれば、筆者、出版社
 - 写真であれば、Exif（f値、カメラ、色などなど）

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
Maximaで線分上の最も近い点

(参考)

http://qiita.com/yuba/items/2f35d1e5e162f44fc1b3

```
LP:matrix([0,0,1]);
LQ:matrix([1,1,1]);
SP:matrix([0,0,1]);
SQ:matrix([sqrt((LP[1,1]-LQ[1,1])^2+(LP[1,2]-LQ[1,2])^2),0,1]);
A:matrix(
 [LP[1,1],-LP[1,2],1,0],
 [LP[1,2],LP[1,1],0,1],
 [LQ[1,1],-LQ[1,2],1,0],
 [LQ[1,2],LQ[1,1],0,1]
);
K:invert(A).transpose(matrix([SP[1,1],SP[1,2],SQ[1,1],SQ[1,2]]));
T:matrix(
 [K[1,1],-K[2,1],K[3,1]],
 [K[2,1],K[1,1],K[4,1]],
 [0,0,1]
);
IN:matrix([1,0,1]);
SP1:T.transpose(IN);
OT:transpose(invert(T).transpose(matrix([SP1[1,1],0,1])));
```
HoloLensで使える地図アセット

この記事は [Unity Assets Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity-asset) 22日目の記事になります。

大量にあるUnity Asset Storeの地図アセットから現在唯一HoloLensで動いたアセットを紹介します。

## Online Maps 2.5.1 (Dec 22, 2016)
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/71b06fe8-8a7f-3211-3381-10b8efcd0c1d.png)](https://www.assetstore.unity3d.com/jp/#!/content/13261)

## サンプルのデモシーンをHoloLensに対応する
- Main CameraをHoloLensに対応
- Holographic Remoting PlayerでMapオブジェクトの位置合わせ

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/ae69f197-bc0d-570a-eb83-4b24ce0f66c9.png)

- 地図のタイルデータをネットから取得するため、PlayerSettingsのCapabilitiesでInternetClientをON
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/0c772170-5d0f-9f80-633b-46af860742a9.png)

- 最初に表示する地域の指定
 ![image](https://qiita-image-store.s3.amazonaws.com/0/32347/3bb9851c-e5a3-006f-6bf4-f54adf377426.png)


## Buildエラーの対応
`error CS0266: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Reflection.FieldInfo>' to 'System.Reflection.FieldInfo[]'. An explicit conversion exists (are you missing a cast?)`

```
FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public);

↓

FieldInfo[] fields = (FieldInfo[]) type.GetFields(BindingFlags.Instance | BindingFlags.Public);
```

## 完成

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/b35e328b-18cf-83ae-69f6-59a3a272e2a5.png)
オレオレ証明書なGitへの新規リポジトリ作成

# やること

オレオレ証明書を適用したGitLabCEに新規リポジトリを作成する

# まずはGitLab上で新規リポジトリ作成

GitLab上に(空の)新規リポジトリを作成してリポジトリのURLをコピーする。

最近まともにGitを触り始めたからわかっていないのだけれど、ローカルから新規リポジトリを作成することはできないのかな？

どうしてもローカルから作らなければならない理由があるわけではないので、良いか。

例として作成したリポジトリはこれ。
https://gitlab.xxx.xx/husky774rr/hoge.git/

# ローカルでの作業

いろいろとトライ&エラーの結果まとめた手順

```bash
git config --global user.name "username" # 設定済みであれば不要
git config --global user.email "email" # 設定済みであれば不要

mkdir hoge
cd hoge
git init
git remote add origin "https://gitlab.xxx.xx/husky774rr/hoge.git/"
echo "# hoge!" > README.md
git add README.md
git commit -m "First commit."
git push -u origin master
```

ここで下記のエラーが発生します。

`fatal: unable to access 'https://gitlab.xxx.xx/husky774rr/hoge.git/': Peer's certificate issuer has been marked as not trusted by the user.`

ですよね。そこで、オレオレ証明書に対応。

# オレオレ証明書への対応

ググると、

```bash
git config --global http.sslVerify false
```

すればOKだよ！
という情報がちらほら。わかるけど…、さすがになぁ。せめて

```bash
git config --local http.sslVerify false`
```
の方がまだ良いのではないかと思うけど、これもどうかな。
と思って実際にやってみたら、clone取る前だからlocal使えない。

そして、それ言い出したら、オレオレ証明書もどうなのよ？って話は抜きにして、
ちゃんとオレオレ証明書を公的な証明書として指定します。

```bash
git config --global http.sslcainfo /home/hoge/gitlab.xxx.xx.crt
```

再度pushすればOKなはず！

```bash
git push -u origin master
```
【Swift】最前面のUIViewControllerを取得する方法

# 取得

```.swift
extension UIApplication {
    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }
}
```

# 使い方

```.swift
if let topController = UIApplication.topViewController() {

}
```
Excelのグラフの左上にグラフ名を表示してみた

```vbnet
'①グラフを選択して要素を表示する方法がありますか？
Option Explicit

Sub aaa_Excelのグラフの左上にグラフ名を表示()
    Const x0 As Double = 0
    Const y0 As Double = 0
    Const boxW As Double = 60
    Const boxH As Double = 18
    Dim i As Long
    Dim x As Double
    Dim y As Double
    Dim boxN As String
    For i = 1 To myグラフ数()
        Call myグラフ情報(i, x, y, boxN)
        '原点から線を引きます
        Call myLine(x0, y0, x, y)
        Call myTextBox(x, y - boxH, boxW, boxH, boxN)
    Next
    SendKeys "{ESC}", True
End Sub

Function myグラフ数() As Long
    myグラフ数 = ActiveSheet.ChartObjects.Count
End Function

Sub myグラフ情報(iBango As Long, x As Double, y As Double, name As String)
    x = ActiveSheet.ChartObjects(iBango).Left
    y = ActiveSheet.ChartObjects(iBango).Top
    name = ActiveSheet.ChartObjects(iBango).name
End Sub

Sub myLine(x1 As Double, y1 As Double, x2 As Double, y2 As Double)
    ActiveSheet.Shapes.AddConnector(msoConnectorStraight, x1, y1, x2, y2).Select
End Sub

Sub myTextBox(boxX As Double, boxY As Double, boxW As Double, boxH As Double, boxT As String)
    ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, boxX, boxY, boxW, boxH).Select
    Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = boxT & Chr(13) & ""
    Selection.ShapeRange(1).TextFrame2.TextRange.Characters(1, 4).ParagraphFormat. _
        FirstLineIndent = 0
    With Selection.ShapeRange(1).TextFrame2.TextRange.Characters(1, 4).Font
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.ObjectThemeColor = msoThemeColorDark1
        .Fill.ForeColor.TintAndShade = 0
        .Fill.ForeColor.Brightness = 0
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 11
        .name = "+mn-lt"
    End With
End Sub
```
Python > link > 2D arrayの初期化と代入

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

2次元のデータをファイルから読込みしようとしている。
今後のために2D arrayで扱うように考えた。　

2D arrayの初期化と代入は以下を参考にした。
http://stackoverflow.com/questions/7745562/appending-to-2d-lists-in-python


```python_study161223.py
mylist = [[] for idx in range(5)]
mylist[0] = [3, 1]
mylist[2] = [4, 1]
mylist[3] = [5, 9]
print(mylist)
```

```txt:実行
$ python python_study161223.py 
[[3, 1], [], [4, 1], [5, 9], []]
```
深夜メンテ(AM4時)まで暇だったのでビットコインを掘る

正確にはアルトコインですが。
# データベースマスター切り換え
AM4時にするメンテ、それはデータベースマスター切り換えです。
AWSを利用していますが、やっぱそろそろAuroraだよねってことで、MySQL(RDS)からAuroraに移行する事にしました。
データベースの移行はやっぱり大仕事なので、ユーザーが一番いないAM4時あたりをメンテ時間としました。
# 早すぎた準備
## メンテ手順
やはり相手はマスターデータベースです。大事なのは事前準備です。
切り換え方式は、現マスター(RDS)から新マスター(Aurora)にレプリケーションを組み、参照クエリはマスターの切り換え前にAuroraのリード側に向ける様にします。
更新の切り換えはコードのデプロイと同時に行う様にします。

マイクロサービスでシステムを作っているため、1アプリが1データベースを使用するという単純な構成であり、デプロイによるきれいな切り換えを実現出来ています。
例えば、複数アプリがデータベースを共有している様な構成の場合、全ての書き込みをアトミックに切り替えられないので、データベースの切り換えが困難になります。

実際には、複数プロセスが立ち上がっていてそれらの再起動タイミングにより一時的に書き込み口が２つになる可能性があるため、プロセスの再起動直前に旧マスターへの書き込みをブロックするといった小技が必要になりますが詳細は割愛します。

## AM0時には準備完了
事前に新Auroraを作って、レプリも組んで、監視も入れて、全てが順調に進んだ為、AM0時時点で何もする事が無くなりました。
ここで怖いのが寝落ち。
さてどうするか？

# 暇になってしまったのでビットコインを掘る事にした
という事で、4時までビットコインで遊ぶ事にしました。
## 激安VPSとの出会い
そもそも仮想通過のマイニングは個人レベルでは到底ペイしないのですが、最近超激安なVPSを見つけたのでこれならいけるじゃないかなあ〜と気になっていました。
## time4vps
こちら
https://www.time4vps.eu/
![2016-12-23_9.24.46.png](https://qiita-image-store.s3.amazonaws.com/0/62421/d14faffb-fdef-e116-99fe-6299e3e31214.png)

月0.66ユーロ、、、約80円、、、さすがに安すぎないか、、、
リトアニアの会社らしいです、電気代とかその辺の優位性があるのでしょうか。

ちなみに、この最安プランは、cpu 1core、メモリ500Mで、2年契約の場合、です。
Paypalで支払ったら1時間もしないうちにサーバーが用意されました。素晴らしい。

## 対象はbytecoin
ざっと調べて一番簡単そうなこのサイトを参考に、bytecoinを掘ってみます。
https://minergate.com/

今回は、bytecoinとかの説明は全て割愛します。
簡単には、コンピューターの計算能力を使って仮想通貨を見つけるゲームみたいなものです。

# 結果発表〜
## 1時間で０．０００３８ユーロ
結果のスクショ。
![スクリーンショット 2016-12-23 9.17.03.png](https://qiita-image-store.s3.amazonaws.com/0/62421/3a25c724-9aef-b622-c0f0-187eb3e394e7.png)

月に換算すると、約0.28ユーロ、、、あれ、、、ペイしない。
これだけマシンが安くても駄目なのか、、、
個人での、しかもCPUでのマイニングはどんなに頑張っても駄目そうですね、、、

# 終わりに
ビットコインというかブロックチェーンの技術はかなりホットだと思っていて、今後も技術的に色々と勉強していきたいと思っています。
個人で簡単にちょっとしたマイニングが出来るのはこの辺の勉強するモチベーションを上げてくれて非常に良いなあと感じました。


ところで、気になる深夜メンテですが、無事に完了しました。
めでたし。
ElasticSearch(v2)でCuratorを使う

## indexの内容を消したい時

curatorとは、Elastic searchのindexの操作やスナップショットを管理できる機能を持っています。
運用していてそろそろこれを動かそうと思ったらv4以前とv4ではコマンドが変わっていてそのままだと動きません。WEB上にもv4系の情報は少なめ。

今まではこういう設定をしていたかと思います。

```
curator --host 127.0.0.1 close indices --prefix logstash --older-than  7 --time-unit days --timestring %Y.%m.%d
```

2016.12.23現在の最新はv4.2
pip/apt/yum/zip/msiでインストールできます。

[コマンドラインリファレンス](https://www.elastic.co/guide/en/elasticsearch/client/curator/current/command-line.html)

`pip install elasticsearch-curator`

## ymlファイルで管理できるようになっていた。
 こんな感じで書く

````
actions:
  1:
    action: close
    description: Close indices older than 30 days (based on index name), for logstash
    options:
      delete_aliases: False
      timeout_override:
      continue_if_exception: False
      disable_action: True
    filters:
    - filtertype: pattern
      kind: prefix
      value: logstash-
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 30 #何日前
      exclude:
````

## 今までコマンドでやっていたからコマンドでやりたい
  こんな風に設定しています

 細かく設定したい時はymlで設定する方が良いかも。

```
/$PATH/curator_cli --config /path/to/curator.yml
```

または、cronなどにはこのように設定している。

```
/$PATH/curator_cli --host 127.0.0.1 delete_indices --filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":120},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]' >/dev/null 2>&1
```
文字列の長さを取得するときはlengthを使ってはいけない

自分の進捗表示用パッケージ[progress](https://github.com/kotet/progress)にPRが来た。

[Bars: bug on narrow terminals when non-ascii fill character is used](https://github.com/kotet/progress/issues/31)

どうやら文字列の長さを得るときは`length`ではいけない時があるそうだ。

## どういうことか

```d
import std.stdio;

void main()
{
    string ascii = "a";
    string non_ascii = "あ";
    writeln(ascii.length);
    writeln(non_ascii.length);
}
```

```text:出力結果
1
3
```

`"a"`も`"あ"`も1文字のはずだが、`"あ".length`は`3`になってしまっている。

```d
writeln(cast(void[]) ascii);
writeln(cast(void[]) non_ascii);
```

```text:出力結果
[97]
[227, 129, 130]
```

`length`は文字列のバイト数を返しているようだ。

## std.range.primitives.walkLength

`std.range.primitives.walkLength`は、`empty == true`になるまで何回`popFront()`ができるか実際に試してみて、それで得られた長さを返す。

```d
import std.stdio;
import std.range : walkLength;

void main()
{
    string ascii = "a";
    string non_ascii = "あ";
    writeln(ascii.walkLength);
    writeln(non_ascii.walkLength);
}
```
```text:出力結果
1
1
```

ちゃんと正しい文字数が得られている。
AngularJSでスコープに登録したイベントリスナを削除する

## この記事は？
以下のコードのように，スコープにイベントリスナを登録した場合，そのイベントリスナを削除する方法について解説する記事です．

```js
$scope.$on('eventName', function($e) {
  // nanika
});
```

## 解決法
`$scope.$on`の返り値は，そのリスナを削除する関数になってますので，
返り値をそのまま呼び出してあげましょう．
`$scope.$$listeners`をそのままいじったりせず，こちらを使いましょう．

```js
var offEvent = $scope.$on('eventName', function($e) {
  // nanika
});

// 上で登録したイベントリスナを削除する
offEvent();
```

該当部分のソースコードはこちら．
https://github.com/angular/angular.js/blob/master/src/ng/rootScope.js#L1170
forの初期化　Javaの問題をTypeScriptにしてみる5-4

次のプログラムの実行結果を選びなさい

```java:java.java
public class Main{
 public static void main(String[] args){
  for ( int i = 1,long j = 2; i < 5; i++){
   System.out.print(i * j);
  }
 }
}
```




A.2468と表示させる
B.246810
C.コンパイルエラー
D.実行時に例外がスローされる

答えはC
javaで変数の初期化を同時に２つ行う際には、型が同じじゃないといけません。
つまり

```java:java.java
public class Main{
 public static void main(String[] args){
  for ( int i = 1,j = 2; i < 5; i++){
   System.out.print(i * j);
  }
 }
}
```

であれば、Aの回答どうりになっています。

これをTypeScriptでやると

```ts:TypeScript.ts
for(var i=1,j=2;i<5;i++){
 console.log(i*j);
}
``` 


のように書くことになります。
Typescriptには型宣言がありますが、forの初期化には明示的に型を宣言することができません。
よって

```ts:TypeScript.ts
for(var i=1:number,j=2:number;i<5;i++){
 console.log(i*j);
}
``` 


このように書くとコンパイルエラーとなります。
初期値を入れることによって型推論が走り適切な型で定義されます。

また、Java側では整数intと実数longに分かれています。このように型が違ったとしても型推論は正常に動作します。

```ts:TypeScript.ts
for(var i=1,j="masao";i<5;i++){
 console.log(i*2);
}
``` 

このように記述しても何の問題もありません。