OmniAICreator/Qiita-1.07M huggingface dataset:
HaxeとNull

Haxeといえば、強力な型システムが売りの1つではありますが、昨今叫ばれているNull安全があまり強力ではありません。

一応、`Int`、`Float`、`Bool`についてはnullを許容するという宣言をしない限りnullを代入することは出来ません。

```hx
// これらのコードはコンパイルエラー
var a: Int = null;
var b: Float = null;
var c: Bool = null;
```

他の型についてはnullがぬるぬる[^1]と代入出来てしまいます…

```hx
// コンパイルが通ってしまう！
var a: String = null;
var b: Date = null;
```

## どうすればいいのか？

haxeにはOption\<T\>という型が標準で付属しているので、nullの可能性がある箇所には全てOption\<T\>タイプを宣言してあげるようにするのが安全です。

```hx
import haxe.ds.Option;

// Optionタイプでラップしない型は代入出来ない
var a: Option<String> = "a";
var b: Option<String> = null;

// Some, Noneを利用すれば代入出来る
var c: Option<String> = Some("a");
var d: Option<String> = None;
```

上記のコードだと良さが分からないと思うので、関数の引き数にOption\<T\>を取ることを考えてみます。

```hx
import haxe.ds.Option;

function say(greet: Option<String>) {
    switch (greet) {
        case Some(v):
            trace("Hello " + v);
        case None:
            trace("挨拶しません");
    }
}
```

このように関数を定義しておくと、常にnull（というかNone）のケースを考慮してコードを書く必要が出てくる上に、型チェックが効くので`if (var == null) { ... }`のようなコードの書き漏れがなくなります。

`Option<T>`タイプ、しっかり活用していきたいですね。

---

[^1]: これが書きたかったんだ、ごめんね
Javaでリダイレクト元のURLを取得する時に使用したソース

# はじめに

OGPで設定するURL項目をフィールドに渡す時、
意図しない値を表示していた。
その時の調査に用いたソースです。

```Java
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
  System.out.print.ln(headerNames.nextElement());
}
Enumeration<String> attributeNames = request.getAttributeNames();
while (attributeNames.hasMoreElements()) {
  System.out.print.ln(attributeNames.nextElement());
}
```

# 苦労したこと

普段は__request.getHeaderNames()__ を多用しているのですが、今回は全く関係していませんでした。
__request.getAttribute("javax.servlet.forward.request_uri");__ 
結論として上記値で取得することができました。
コンソールで動くエディタを作る(25日目) おわりに

本稿は[自作エディタをつくる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/make_editor)の最終日です、レポジトリは[こちら](https://github.com/tinyco/tiny_code_editor)

# やってみて

機能の少なさに目を瞑ると、15日目には動くところまでできたのがよかったです。
たとえバグっていても、ある程度動くようになると面白いですね。
他のエディタと比べると色々と足りないものが多いですが、
できないことが少しづつできていく過程も楽しかったです。
自分で使いたいものを作るというのは、プログラマの原始的な楽しさだと思いますが、
普段仕事で他の人のためにプログラムを書いていると、その楽しさ忘れていくのかもしれないな、と思いました。

# ブログにしてみて

25日間連続で書き続けるのは結構大変です。
自分の場合は、平日よりも休日の遊びの予定のほうが
書く時間が取れない傾向にある気がしました。
ただ、大変でも書いていけば読んでくれる人がいて、
アドバイスをくれるのが大変助かりました。
単にOSSにするだけだと、どこに悩んでいるかまでは伝わらないので、
わからないことをわからないと書くのは重要な気がします。
文字コードとかは難しかったですね・・・。

# アドバイスについて

Qiitaのコメント、githubのプルリクエスト、twitterでのやりとり・・・。
たくさんの人が親切に教えてくださり非常に助かりました。
単に疑問が解決されるだけでなく、モチベーションにもつながりました。
本当にありがとうございます！！！

# エディタを作りたい人へ

僕はC言語で書きましたが、どのプログラム言語でもチャレンジできると思います。
ただし、一部はC言語で書かないといけないかもしれません。
(このブログでいうと3日目、8日目あたり)
C言語に慣れないと困るかもしれないですが、
僕の困ったところはできるだけ、どういうところに困ったかと解決法を書いたつもりなので
よかったら参考にしてください。
ただ、cursesを使った方が良かった気がしますね。

もし作ってみようという方がいたらコメント頂けると嬉しいです、見に行きます！

# これから

アドベントカレンダーとしては今回で最後ですが、
自分のペースでアップデートを続けていこうと思います。
その際はまたQiitaに書こうと思いますので、よかったら読んでください。

# 最後に

amazonのほしい物リストです

http://amzn.asia/hjpP4NY

あと、転職を考えています。
scalaとiOSが得意です。
どこかいいところあれば・・・w
新人が積極的に雑務をこなすことで得られる3つのメリット

本記事は[新人エンジニアAdvent Calendar 2016](http://qiita.com/advent-calendar/2016/freshman_engineer)の24日目の記事です。

#はじめに
こんにちは、@KIKUYA-Takumiです。新人エンジニアAdvent Calendar 2016 3回目の投稿です。今回は24日が空いていたので、急遽投稿しました。~~徐々に書き上げていきます。~~内容はタイトル通り雑務を積極的にこなすメリットについて書いていきます。普通なら、「雑務なんてやりたくない」、「他の人に頼んでくれ」と思うところ、「あえて自分からやってみる」メリットについて紹介したいと思います。

#メリットその1～メリハリをつけて仕事ができる～
新人なら、**結局今日1日何もできてない**という経験があるのではないでしょうか？今日は○○をやろうと計画はしたものの、ああでもない、こうでもないと悩み続けて、時間だけが過ぎていく経験があるのではないでしょうか？

そんなときこそ、雑務を1つこなしてみましょう。よっぽど手間のかかる雑務でなければ1時間もかからないと思います。逆に1時間以上かかる場合は仕事の進め方に問題があるのではないでしょうか？雑務に予想以上に時間がかかっているなら、メインタスクにかかる時間を見積もることも難しいのではないでしょうか？

自分の場合はメインタスクに1日中集中するよりも、適度に雑務を挟む方が集中できたりします。最近はポモドーロタイマーを活用して25分タスク、5分休憩を1サイクルに仕事していますが、2,3サイクルに1回雑務を入れると気分転換になります。ただし、1時間以上かかる雑務は逆に疲れるので、分割して行っています。

タスク間だけでなく、なかなかエンジンがかからない月曜日の朝にサクッと雑務をこなして、仕事の勢いをつけるのもアリではないでしょうか。


#メリットその2～雑務でタスクばらしを鍛えられる～
新人が早く身に着けるべき能力の一つがタスクばらしです。この新人エンジニアAdvent Calendar2016の記事[新卒1年目で1番役に立ったスキル、タスクばらしで業務時間を減らそう！](http://qiita.com/hiro_ike/items/ac01b1f356502110b016)でも紹介されています。

しかし、実際うまくタスクばらしができない人も多いのではないでしょうか？自分自身もできているとは言えませんが、最近コツを掴み始めました。そのきっかけが雑務です。何故、雑務からタスクばらしのコツを掴めたのか？
その理由が、

**雑務はタスクばらしが簡単で、終了条件が明確**だからです。


タスクばらしのコツを掴んだ雑務を紹介します。
出張先の先輩にPCを送り、同先輩からPCを送り返してもらう、PCの送付、返却に伴う作業がタスクです。以下がタスクとタスクばらしです。
![雑務タスクばらし.png](https://qiita-image-store.s3.amazonaws.com/0/148136/e10ea4de-e00e-a6ca-1511-806bba94978a.png)

上図で青色のタスクがPCを送るためのタスク、赤色タスクがPCを受け取った後のタスクです。

この雑務からタスクばらしのコツを掴めた1番の理由はタスクばらしの答え合わせができたことです。何故、答え合わせができたのか？それは、

**行うべきタスクが定められている**

からです。行う雑務を手順に沿って行う前に、雑務のタスクばらしをやってみましょう。ばらしたタスクが行うべき手順を網羅できていれば成功です。抜け漏れがある場合は何が足りていなかったのかチェックして、どう改善すべきか考えましょう。PDCAも鍛えられて一石二鳥です！



#メリットその3～雑務で交渉力を鍛えられる～

新人エンジニアが交渉する機会は多くはないのではないでしょうか？自分も交渉する機会が多くはないです。研修で開発するアプリの企画や雑務を簡略化させるための交渉くらいです　笑

そんな数少ない交渉で感じるのが、伝えきれてなかったり、自分でけにメリットがあったり、<font color='Red'>**相手を説得できていない**</font>ということです。

では、相手を説得させるには何を考えれば良いのでしょうか？
それは、こちらの3つの要素です。
![説得力の3要素.png](https://qiita-image-store.s3.amazonaws.com/0/148136/19322f5a-75a9-d3f2-5032-8a6f38d9e6ff.png)

* 効用：どんなメリットを与えられるか
* 必然性：交渉したいことをしないといけない理由
* 実現可能性：交渉したいことができるのか

以前、依頼された雑務のタスクを減らすためにした交渉について紹介します。

タスク：PCレンタル期間終了に伴うPC交換作業
交渉目的：レンタル期間延長で、交換作業をなくす

レンタル期間延長に対する3つの要素

 * 効用：PC交換作業がなくなる（自分と交換するPCのユーザ）
 * 必然性：PC調達に手間がかかる
 * 実現可能性：偉い人がOKを出せば

上記の3つの要素で交渉したわけですが、<font color="Red">**お前、古いPC使いたい？**</font>と一蹴。
交換するPCがどの程度古いかまで考えてなかったぁー。古いPCを使い続けるデメリットを考えると**効用**がマイナスに…

この交渉は失敗しましたが、何を考えるべき反省点も見つかったので、次回の交渉するときには改善できます。また、PDCAも鍛えられて一石二鳥ですね！

**…メリット4つじゃね？**


#注意点
ここまで、雑務を積極的にこなすことで得られるメリットを書いてきましたが、一つ注意点があります。
それは、

* あくまでも、最優先すべきは<font color="Red">**メインタスク！**</font>

当たり前のことですが…
メインタスクに手が回せない程、雑務を依頼される場合は断ることも必要です。「新人だから断りにくい」と思う人は試しに交渉してみては如何でしょうか？交渉力を鍛えられますよ。

#まとめ
雑務を積極的に行うことで得られる3つのメリット

* メリハリをつけて仕事ができる
* タスクばしを鍛えられる
* 交渉力を鍛えられる

を紹介しました。3つ全てに言えることですが、1回で出来るようになるのは難しいです。数をこなして鍛えていくしかありません。そして、雑務を思い通りにこなせるようになったらメインタスクに活用してください。むしろ、メインタスクを効率よくこなすための練習を雑務でやっているに過ぎません。

比較的タスクの粒度が小さい雑務で練習し、粒度の大きいメインタスクに活かす。ソフトウェア開発と似ています。試しに小さく作る。できたら大きいモノに挑戦するのと同じです。少しずつできることを増やしていきましょう。

#最後に
雑務をしっかりこなす、依頼者が設定した期間よりも早く完了の報告をすると普段以上に感謝されます。また、自分が困っているときに助けてもらえる確率が上がるような気がします。同じタスクをこなすなら、自分返ってくる恩恵が大きい方が良いハズです。

是非、積極的に雑務をこなしてみてはいかかでしょうか？
HaxeとVS Code

新しいプログラミング言語を始めるにはエディタは非常に重要ですよね。

Haxeを開発するにあたって、現在実用レベルに足るエディタは以下の2つになると思います。

* [FlashDevelop](http://www.flashdevelop.org/)
* [VS Code](https://code.visualstudio.com/)

FlashDevelopについてはインストールすればすぐに利用出来るようになりますが、VS Codeはちょっと設定が必要です。

本投稿ではVS Codeを利用するための設定を記載していきます。

> 手元にMacしかないため、Macで設定することを前提に記事を書いています。
Windowsで同じように設定出来るかは分かりません。

## 必須環境

* Haxe3.4以上

> この投稿を書いている時点ではhaxeの安定版は3.2です。
3.4を利用するにはHaxe公式サイトからインストーラーをダウンロードしてください。

## プラグインのインストール

<img width="870" alt="スクリーンショット 2016-12-27 18.24.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/28406/f3739935-68b9-4aa9-634e-587168ef22c4.png">

haxeのプラグインを検索すると2つ出てきますが、__Haxe Support__のほうを利用します。

## プロジェクト設定

1. プロジェクトフォルダに`*.hxml`ファイルを作成します。
2. `Cmd`+`Shift`+`P`でVS Codeのコマンドを起動し、`Haxe: Initialize VS Code Project...`を選択します。

<img width="387" alt="スクリーンショット 2016-12-27 18.28.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/28406/c1593679-7625-eaac-22c4-9aee81053010.png">

上記の手順を行うと、プロジェクトフォルダ直下に`.vscode`というフォルダが生成されます。

## 言語サーバーを再起動

`Cmd`+`Shift`+`P`でVS Codeのコマンドを起動し、`Haxe: Restart Language Server`を選択します。

これで、コード補完が効くようになり快適なコーディング環境の完成です！

---

私は普段Haxeでコードを書く時、`tink_lang`というHaxeのシンタックスを拡張してくれるマクロを利用しているのですが、このようなシンタックスシュガーを利用してもエディタはエラーを出しませんでした。
（SublimeTextはエラーだらけになった記憶が…）

VS Codeは実に強力なエディタですので、Haxeの利用を考えた時は是非利用していきたいですね！
1年の計は年末にあり EXCELでゴミの日をまとめて予定に入れる

##用意するもの
EXCEL OUTLOOK
EXCELはVBAの参照設定でOUTLOOK OBJECT LIBRARY を登録します

##エクセルに入力するときは関数を活用しよう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/7e7e0908-5658-cafa-1554-0a6fa9c3f484.png)
まあこんな感じで毎週定期的に手りゅう弾の回収があるとします
1行目は回収がある日です。
まず2017/2/1を入力します
毎週ですからこの次の行は
=DAY(7) + A2 と入力します。
のこりの部分をコピーします
それを次の行にコピーします。
繰り返します。
こんな感じで出来上がります。

##OUTLOOKの定期的な予定を使わない理由
これは超有名な「VBAで絶対できない問題のシリーズ」の一つ、定期的な予定では第5週が設定できないという問題があるからです。
もう一つは現実的にごみ収集日が祝日だと回収しないとかあります。
こうした例外を除くにはどうも定期的な予定ではうまくいきません。

##ごみ収集日を登録する場合のテクニック
- 仮の予定で入れる。他の予定が入っても重複させない
- 時間は0時間にする
- outlookは9時5時をメインに表示するので朝早いと見づらい。8時くらいにする。
- アラームは鳴らさない。毎日あるとわけがわからなくなる。
- その日の捨てるゴミの注意点、何を捨ててよいかは、いちいちBodyに書く。こうすると、「手りゅう弾？バズーカって捨ててよかったか？」というようなあやふやなことがなくなる。

##予定表を登録する場合のテクニック
- 必ずカテゴリーを登録しましょう
- このカテゴリーは複数登録できますが、とりあえず、ごみとEXCEL登録というカテゴリーを登録します。なぜでしょうか？
- それは入力した予定がいらない、間違っているという時にEXCELで登録した分だと検索しやすいようにするためです。大量に登録すればそうした事態もあります。検索して削除しやすいように、EXCELで登録したことをカテゴリーで明示するわけです。
- またここが重要ですが、この単語の区切りに半角セミコロンを使用してください。コンマは駄目です。
- 理由はこれをいったんCSVに変えたときにコンマはセルの区切りになるためです。またOUTLOOKの区切りは半角セミコロンです。イメージしやすくなります。

#VBAをまぜて使う時の修飾子
さてここから最も重要で、どのVBAの教科書にも全く乗っていない（たぶん）という重要なことを書きます。他もあるんだけど。
これから出すプログラムはいちいち変数に as excelとかついています。
これはExcelとOutlookのVBA（本当はACCESSでもそうだけど）のように混在させて使うとVBAもわけがわからなくなってときおりエラーを起こすためです。
[修飾子が無効です](https://msdn.microsoft.com/ja-jp/library/office/gg251679.aspx)
MSDNのサイトをみてもわけがわからないと思います。

修飾子については[VBA 最奥義（たぶん）クロスプラットフォームスクリプト（仮）](https://qiita.com/Q11Q/items/65987018247d96982f14)ですこしまとめています。

```VB:MakeolSchedule.vb
Sub MakeolSchedule()
Dim wb As Excel.Workbook: Set wb = ThisWorkbook
Dim ws As Excel.Worksheet: Set ws = ActiveSheet
Dim oApp As Outlook.Application
Dim Ns As Outlook.Namespace: Set Ns = Outlook.GetNamespace("MAPI")
Dim olFolder As Outlook.Folder: Set olFolder = Ns.GetDefaultFolder(olFolderCalendar)
Dim MyItem As Outlook.AppointmentItem
Dim stDt As Date, enDt As Date
Dim rng As Excel.Range
Dim olapCat As Outlook.Category
Dim Ar, buf As String
Dim i As Long, icat As Long, irow As Long, icol As Long, LastRow As Long
For i = 1 To ws.Cells(Rows.Count, 1).End(xlUp).Row
If IsEmpty(MyItem) = False Then Set MyItem = Nothing
Set MyItem = Outlook.CreateItem(olAppointmentItem)
With MyItem
.Display
.Subject = ws.Cells(i, 4).Value
.Start = CDate(ws.Cells(i, 1).Value + CDate(ws.Cells(i, 2).Value))
.End = MyItem.Start
.AllDayEvent = False
.Location = "Myhome"
.ReminderSet = False
.Categories = ""
Ar = Split(ws.Cells(i, 5).Value, ";")
For icat = LBound(Ar) To UBound(Ar)
buf = .Categories
 .Categories = buf & ";" & CStr(Ar(icat)) & ";"
Next
.BusyStatus = olTentative
'----<test is active>^^----
'Stop
'.Close (olDiscard)
'--------------------------
.Close (olSave)

End With
Next
End Sub

```
BitVisor: 保護ドメインの中のlineinput (), printf () に関する注意点

# はじめに
BitVisor Advent Calendar の昨日分では保護ドメインのインターフェイスについて説明しました．
なんだか2日ぐらいカレンダーがずれているような気がしますが，たぶん気のせいでしょう．
え，今日ってクリスマスですよね?

というわけで，本日分では，保護ドメイン内からの入出力に使われている lineinput () と printf () について気を付けないとやばそうなことについて説明します．

# lineinput (), printf () の用途
名前からある程度察せられるかと思いますが，これらは，普通のCプログラムでいうところの gets (), printf () のような使い方をします．
現在の BitVisor のコードでは，lineinput () は process/{shell,debug,monitor} で使われていて，キーボードやゲストからの入力を受け付けるようになっています．
printf () はいたるところで使われていますね．

# 注意点
わざわざ記事にしたには，それなりに言いたい注意点があったからです．
(決して前日の記事の後ろの方を切って分けたわけではない...はず)

何かというと，これら2つの関数は，**ディスクリプタ0に入力用メッセージ経路** が，**ディスクリプタ1に出力用メッセージ経路** が割り当てられていることを暗黙のうちに想定しています．
というか，コードの中にマジックナンバーで埋め込まれています(マクロですらありません)．

例えば，printf () で最終的に呼び出される putchar () では，

``` c:process/lib/lib_putchar.c
void
putchar (unsigned char c)
{
	msgsendint (1, c);
}
```

と，ディスクリプタ **1** にメッセージを投げています．

昨日の記事で，

>
* msgsenddesc () でプロセスにメッセージハンドラを紐づけます
    * 第1引数に保護ドメインのプロセスディスクリプタ，第2引数にメッセージディスクリプタを指定します．
    * **保護ドメインからはこの時登録した順に，0, 1, 2... とディスクリプタで参照できます**．

と書きました．
つまり，保護ドメインの中でこう言った標準入出力的な関数を使いたい時には，
**最初に標準入力用のメッセージディスクリプタを msgsenddesc () で登録**, 
**次に標準出力用のメッセージディスクリプタを登録** する必要があります．
これ以外の順番で登録してはいけません，**msgsenddesc() で登録する順番を変えたらうまく動かないはずです**(試してはないですが)

# おわりに
今日は保護ドメインの入出力についての注意点をを書きました．
僕は仕組みがわからなくて気持ち悪かったので調べたら，見つけてしまったという程度で，いろいろやってハマったりしたというわけでないですが，下手なことをするとたぶんハマるんじゃないかと思いますので気を付けましょう．
Google Spreadsheet の内容を Markdown Table に変換

## 動作イメージ

<img width="864" alt="Screen Shot 2016-12-28 at 17.36.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/47880/3d49ac94-c3e5-cf81-1144-46563d300750.png">

<img width="300" alt="Screen Shot 2016-12-28 at 17.36.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/47880/47926a0b-9692-4ee4-2617-789b60881b58.png">

```
| ID | 名前 | 個数 |
|:---:|:---:|:---:|
| 1 | りんご | 8 |
| 2 | バナナ | 274 |
| 3 | 全ての答え | 42 |
```

| ID | 名前 | 個数 |
|:---:|:---:|:---:|
| 1 | りんご | 8 |
| 2 | バナナ | 274 |
| 3 | 全ての答え | 42 |

## コード

少し冗長な書き方をしていますが、メインは `sheetToMarkdownTable()` のところです。
手抜きなので常に 1 行目をヘッダとして扱い、文字列は中央寄せ固定にしています。

```js
function onOpen() {
    SpreadsheetApp.getUi().createMenu('変換')
        .addItem('シート -> Markdown Table', 'sheetToMarkdownTable')
        .addToUi();
}

var ns = {};
(function() {
    ns.sheets = {};
    ns.sheets.data = {
        instance: SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"),
        ranges: {},
        fn: {}
    };

    ns.app = {};
    ns.app.fn = {};
})();

(function() {
    ns.app.fn.sheetToMarkdownTable = function() {
        var sheet = ns.sheets.data.instance;
        var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());

        var values = range.getValues();

        var outputs = [];
        values.forEach(function(cols, index) {
            if (index === 0) {
                var header = '| ' + cols.join(' | ') + ' |';
                outputs.push(header);
                outputs.push(Array(cols.length + 1).join('|:---:') + '|');
                return;
            }

            outputs.push('| ' + cols.join(' | ') + ' |');
        });

        Browser.msgBox(outputs.join('\\n'));
    };
})();

function sheetToMarkdownTable() {
    return ns.app.fn.sheetToMarkdownTable();
};
```

GAS 側でシート名を data と固定にしている都合上、シートの名前をシート1から `data` に変更する必要があります。
AzureVMのIIS10にARR(Application Request Routing Cache)がインストールできない。

#背景
 IISでReverse Proxy を建て別ポートで起動しているsonatype Nexus Repository を同期させたいと思い、WebPIでARR3.0のインストールを試みた。
###環境
- Windows Server 2016 Datacenter (Version 1607 build 14393.447)
- Internet Information Service (Version 10.0.14393.0)


#問題発生
ARR3.0の依存モジュールである URL Rewrite 2.0 のインストールでエラー発生。

#原因
URL Rewrite 2.0のインストール要件はIIS7以上だが、実際は9.99以上のMajorVerionでもエラーとなるため。

#解決法
https://forums.iis.net/t/1223421.aspx

に載っている。
- IISマネージャを終了させる。
- regedit 起動
> Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp
> Value: MajorVersion
- 上記の値を10(Decimal)から、9(Decimal)に変更する。
- IISマネージャを起動し、WebPIからARR3.0のインストールをおこなう。
- うまくいく！
- 上記のレジストリ値を9から10に戻す。
以上。
チェックをすると値をテキストエリアに自動入力(備忘録)

~~~index.html
<input tyep="checkbox" value="1" id="check" />
<textarea name="hoge" id="post">
~~~

~~~javascript.js
$("input[name='checkbox']:checkbox").on('click',function() {
        var array = new Array();
        $("input[name='checkbox']:checked").map(function() {
            array.push($(this).val());
        });
        $("#post").text(array.toString());
    });
~~~

チェックした値をテキストエリアに配列で入れてくれます。
コンソールで動くエディタを作る(24日目) コピー・カット・ペースト ver0.0.2

本稿は[自作エディタをつくる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/make_editor)の24日目です、レポジトリは[こちら](https://github.com/tinyco/tiny_code_editor)

# コピーペースト

contextと呼んでいる部分に可変長文字列のclip_boardを追加し、
そこに対してコピー・カット・ペースト操作を割り当てました。

キーバインドは以下です。

- Ctrl+X - cut selected string
- Ctrl+C - copy selected string
- Ctrl+V - paste string

あわせて、readmeも更新しました。

コードとしては

```
void cursor_copy_range(context *context) // PUBLIC;
{
  mutable_string_all_free(context->clip_board);
  context->clip_board = mutable_string_malloc();
  cursor c = cursor_sort_start_end(context->cursor);
  unum s = c.end_position_x - c.start_position_x + 1;
  unum i = 0;
  while (i < s) {
    uint byte;
    lines *head = lines_select_position_y(context->lines, c.start_position_y);
    mutable_string *ms = mutable_string_select_position_x(head->mutable_string, c.start_position_x + i, &byte);
    mutable_string_add_utf8char_to_tail(context->clip_board, &ms->string[byte]);
    i++;
  }
}

void cursor_paste_range(context *context) // PUBLIC;
{
  mutable_string *ms = context->clip_board;
  while (ms) {
    uint i = 0;
    while (i < ms->byte_count) {
      uint byte;
      lines *head = lines_select_position_y(context->lines, context->cursor.start_position_y);
      mutable_string *mutable_string =
          mutable_string_select_position_x(head->mutable_string, context->cursor.start_position_x + i, &byte);
      insert_utf8char(mutable_string, byte, &ms->string[i]);
      i++;
    }
    ms = ms->next;
  }
}
```

こんな感じで、操作する文字列が開いたファイルかクリップボードかは違いますが
やることは結構似ています。
もう少し良い感じの抽象度のメソッドを作れれば、DRYを守れて綺麗なメソッドになる気がします。


# 使いやすくする

- 終了時にコンソールをクリアする
- 範囲選択状態で文字入力した場合は先に選択範囲を削除する

等の、直感的でないと自分が思った動作を直していきます。

# バグ報告

equal-l2氏から、バグ報告を貰いました。
https://github.com/tinyco/tiny_code_editor/issues/7

改行直後等にINSERTすると、対象の文字列が空文字列ではなくNULLになっているようです。
いったん、NULLであれば空文字列をmallocするようにしましたが、
本来は改行等の際にmallocしていかないとまずそうですね・・・。
もう少し調査したいところ。


# 今日のまとめ

- copy-pasteできるようになりました

コピーペーストができるようになった記念に、verを0.0.2にしました。
Firebaseの最新情報はどこから入手すべきか（公式の情報発信サイト一覧）


この記事は本来 [Firebase Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/firebase) の22日目の記事でしたが、諸事情で大幅に遅れたことと、本来書こうと思っていた内容の裏付け調査がまったくできなかったので完全なお茶濁し記事になります……。

## はじめに

2016年5月、大規模なアップデートを実施したFirebase。その半年後の11月にもFirebase単体のデブサミが開催されるなど、Firebaseに対するGoogleの力の入れ具合を強く感じます。

実際にこの半年でも、Unity SDKがリリースされたりCrash ReportingにクラスタのON／OFFが追加されたり、Android側ではNotificationのアイコンが変更できるetc..といったアップデートも行われました。ついでに書くと、先々週はAndroid待望のproguardのマッピングファイルを自動でアップロードしてくれるGradleプラグインがリリースされていました。

そんなFirebase、実は公式だけでもいろんな方面で情報発信を行っているので「最新情報のチェックはドコ見ればいいの？」と混乱してしまいそうになります。

とはいえ「コレを見ればいい」とハッキリと明言できるものでもないので、とりあえず自分が知る限りのFirebaseが「公式で」情報を発信しているサイトをリストアップしてみました。

## 公式の情報発信先

### 諸注意

リリースノートなどのページは日本語対応されているように見えますが、 **最新情報に対応されていない**場合がほとんどなので、基本的にはEnglishページを見るようにしてください。

### リリースノート

https://firebase.google.com/support/releases

なにはともあれ、公式のリリースノートを見るのが一番です。各SDK単位のリリースノートは別ページで用意されていますが、「SDKの中身が変わらないアップデート関連」はこっちにしか記載されていない場合もあるので、基本ここをチェックして、必要に応じて各SDKのリリースノートをチェックするのが一番な気がします。

### 公式ブログ

https://firebase.googleblog.com/

基本的には通常のGoogle Developersブログと同じようなスタンスなのですが、先日のデブサミの内容を要約した記事を挙げたりしています。１〜２週間ぐらい遅くても大丈夫なのであれば、主要な記事は日本語化されたものが[Google Japan Blog](http://japan.googleblog.com/)にも掲載されています（とはいっても、全て翻訳してくれているわけではありません）。

### GitHub公式のQuick-startリポジトリ

- https://github.com/firebase/quickstart-android
- https://github.com/firebase/quickstart-ios

たぶんエンジニアはリリースノートの最新情報を見つつ、このリポジトリを見るのが一番手っ取り早い。基本的な機能の基本的な使い方が公式の更新からほぼラグなく対応されています（自分が見てる限りだと）。

### Youtube

https://www.youtube.com/channel/UCP4bf6IHJJQehibu6ai__cg

2016年のGoogle I/OのFirebase関連の講演動画や、11月のデブサミの講演動画がアップロードされています。更新頻度はかなり早いです。なにか公式のイベントが行われた場合は要チェック対象です。

なお、個人的に好きなGoogle Play ServiceおじさんことMagnus Hyttstenさんが「いつもの」ノリで出演されている動画が多いのもプラス要素ですね（最新情報とは関係ない）。

### Twitter

https://twitter.com/firebase

簡単な情報更新はこれが一番！と言いたかったのですが、どうも公式ブログとYoutubeアカウントの更新通知以外はあまり発信してくれない印象があります。

### 公式ドキュメント／APIリファレンス

https://firebase.google.com/docs/

ここはリリースノートに書かれた内容の詳細を見る時に使うのがほとんどでしょう。それと **それってドキュメントに書くべきじゃね？みたいな内容がAPIリファレンス側に記載されていることがよくある** ので注意が必要です。たとえばAnalyticsの情報送信タイミングとかそういうの。


簡単ですが以上です。発表後も凄い勢いでアップデートが行われていったFirebase、来年もどんどんアップデートされていくことに期待したいですね！
[Vue.js][Vuex]Canvasの限界値


## 概要
![イメージ](https://yoshiromasuhara.github.io/vue-canvas-performance/canvastest.gif)
Vue.js上におけるCanvas描画の影響を試してみました。
公式サイトではCREATEJS（TWEENJS）を利用した[凡例](https://jp.vuejs.org/v2/guide/transitioning-state.html)がありましたが、今回はrequestAnimationFrameで複数のCanvasに複数のarc（円）を描画しFPSを計測してみます。

## 実行環境

+ MacBook Air (13-inch, Mid 2013)
+ El Capitan 10.11.6（15G1212)
+ CPU : 1.3 GHz Intel Core i5
+ メモリ : 4 GB 1600 MHz DDR3
+ GPU : Intel HD Graphics 5000 1536 MB
+ ブラウザ：Google Chrome バージョン 55.0.2883.95 (64-bit)

[デモページ](https://yoshiromasuhara.github.io/vue-canvas-performance/)、[ソース](https://github.com/yoshiromasuhara/vue-canvas-performance)
また出来る限りフルスクリーンに近いサイズにブラウザを広げています。
※DeveloperツールのFPS Meterを利用してます

## 実行結果
| Canvasの数 | arc（円）の数 | FPS(avg) |
|----:|----:|---:|
| 1   | 1000 |60  |
| 1   | 2197 |45  |
| 1   | 4096 |25  |
| 1   | 8000 |13  |
| 5   | 1 |60  |
| 10  | 1 |50  |
| 15  | 1 |40  |
| 30  | 1 |15  |
| 5   | 125 |60  |
| 5   | 512 |33  |
| 10   | 125 |40  |
| 10   | 512 |17  |
| 15   | 125 |25  |
| 15   | 512 |12  |


また比較対象として少し雑ですがライブラリを利用してないページを試しました。
[デモページ](https://yoshiromasuhara.github.io/vue-canvas-performance/simple.html)
全パターンは試せてないですが上記の結果と同じような値となりました。
ただ利用PCによって値は大きく変動しました。


近いうちにスマホブラウザでも試してみようと思っています。ただVue.jsを利用してもFPSは大きく左右されないのでPCメインならば積極的に利用していこうかと。
ApacheでBasic認証設定

ApacheでのBasic認証設定を下記サイトを参考にやったのでメモ。

1. 基本認証でアクセス制限をかける方法(https://allabout.co.jp/gm/gc/23780/)
2. いまさらながら、Basic認証のつけかた(http://qiita.com/yuwaita/items/e406c645ae8d0cc3c3fa)


## 1.基本認証でアクセス制限をかける方法
## .htaccessファイルを作る
### .htaccessファイルとは
Webサーバの設定ファイル。

## .htaccessファイルの書き方と設置方法
https://allabout.co.jp/gm/gc/23962/

### 下記の4行を記載する。

- AuthType Basic
- AuthName 【認証領域名称】
- AuthUserFile 【ID・PASSWORD格納ファイルのパス】
- require valid-user 

↑
1行目…認証方法としてBasic認証を指定
2行目…認証に使う領域名の指定
3行目…パスワードファイルの所在
4行目…認証されたユーザにアクセスを許可する

### ファイルの保存先
アクセス制限を施したいディレクトリにアップロードする


## .htpasswdファイルを作る
### .htpasswdファイルとは
基本認証で使用する「IDとPASSWORDを格納した」ファイル。

### htpasswdファイルの構成

ID名：暗号化されたパスワード

例：）
suzuki:XkB8Ou3kAcODe
yamada:5dHw0u9s4TltI
inoue:A0e7PvhEdWyvE

ここでいうID名は素で入力するが暗号化されたパスワードは作成する必要がある。
※ID名は大文字小文字の区別がある。

暗号化リンク
http://www.nishishi.com/scripts/htpasswd/
http://www.luft.co.jp/cgi/htpasswd.php
http://orange-factory.com/tool/crypt.cgi
などなど。

### ファイルの保存先
.htaccessに記載した.htpasswdの保存先を指定。




## 2.いまさらながら、Basic認証のつけかた

### 手順（ざっと）
1. .htaccessファイルを作成する
2. .htaccess用パスワード作成ツール[ここ](http://www.luft.co.jp/cgi/htpasswd.php)や[ここ](http://www.shtml.jp/htaccess/make_htpasswd.html)で.htpasswdを作成する
3. 1,2をサーバにアップする。パーミッションは604


### .htaccessについて

#### 記述例

```.htaccess:.htaccess
AuthUserfile /フルパス/.htpasswd
AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
```

#### 詳細

- AuthUserfile /フルパス/.htpasswd
サーバーのルートディレクトリからの.htpasswdへのパスを指定する。/usr/local/...とか/home/pass/...とかそういうの。

- AuthGroupfile /dev/null
グループごとにアクセスを許可する、という指定。「/dev/null」とは、そのようなファイルは存在しないという意味。つまりグループごとでのアクセス制限はしないという意味。

- AuthName "Please enter your ID and password"
ダイアログに表示される文章を指定。日本語だと文字化けするようだ。

- AuthType Basic
AuthTypeを指定。「Basic（ベーシック認証）」と「Digest（ダイジェスト認証）」の2種類があって、Digestのほうが[安全らしい](http://www.pasokuma.net/linux/server/httpd/httpdauth.html)。

- require valid-user
ユーザーが誰であろうと、入力したIDとパスワードが合っていればアクセスできるという意味。特定ユーザーだけにアクセスさせたい場合は「require user xxx」とかする。

- その他
ファイルの最後では改行したほうがいいかもしらんね。

#### 悩み諸々

- パーミッション
パーミッションは604！これでだめなら644？

- アップする場所
.htpasswdのファイルは、DocumentRootより上に設置すること。無理な場合は「AddHandler cgi-script htpasswd」を追記。
もしくは.htaccessファイルに.htaccessと.htpasswdにアクセスできなくさせる下記のようなコードを書く。

```.htaccess:.htaccess
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>
```

- 500 Internal Server Error
.htaccessファイルに誤りがある場合。サーバの設定によって.htaccessファイルの設定が無効な場合。設置場所やディレクトリの限定的な使用によっては発生する。

- 401 Authorization Required
記号は使えません。英数字で。

- 特定のIPからのみアクセスできるようにするには
下記を.htaccessに追加する。

```.htaccess:.htaccess
Satisfy any

order deny,allow
allow from xx.xx.xx.xxx/xx.xx.xxx.xxx

deny from all
```
## 参考
- ミケネコのhtaccessリファレンス(http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/)
cssスニペット集

  
自分用のメモを兼ねて。随時追記中。

# ちょっと一手間で見た目が良くなるスニペット集

1. フォントのカーニングとアンチエイリアスの調整
2. テキストの両端を綺麗に揃える

## 1.フォントのカーニングとアンチエイリアスの調整

- `font-smoothing`でアンチエイリアスの調整
- `font-feature-settings`でカーニングの調整します
- `letter-spacing`で文字間をお好みで空ける

デモ：[http://codepen.io/kokimaekochi/pen/XNLMdx](http://codepen.io/kokimaekochi/pen/XNLMdx)

```scss

@mixin fontBeauty {
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	-webkit-font-feature-settings: "palt" 1;
	font-feature-settings: "palt" 1;
	letter-spacing: .2em;
}

section {
	@include fontBeauty;
}
```

## 2.テキストの両端を綺麗に揃える

- 基本は`text-align: justify;`でOK
- IEの為に`text-justify: inter-ideograph;`を追加

デモの右側が反映済みのやつです。  

デモ：[http://codepen.io/kokimaekochi/pen/XNLPxQ](http://codepen.io/kokimaekochi/pen/XNLPxQ)

```scss

.justify {
  text-align: justify;
  text-justify: inter-ideograph;
}
```
TFS > ソース各行を変更した日付の確認 (gitのblameに相当する機能)

```txt:動作環境
Windows 7 Pro 32bit
Team Foundation Server 2012
```

gitのblameのようにソース各行の変更日を確認したい。

参考 https://www.visualstudio.com/ja-jp/docs/tfvc/view-file-changes-using-annotate

以下の手順のようだ。

1. ソース管理エクスプローラにて対象ソースファイルを開く
  - ファイルをダブルクリックする
2. 右クリック -> ソース管理 -> 注釈の設定

以上で変更した日付と変更セット?の番号がソースの左側に表示される。

### Visual Studio 2017
(2018-10-02 追記)

Visual Studio 2017においては「ソース管理 -> 注釈の設定」は「ソース管理 -> 注釈」という表記である。
Laravel 5.3 『Whoops, looks like something went wrong.』 をやめよう！

# Whoops, looks like something went wrong.
* Whoops…
* ウープス…
* うーぷす…

.env の APP_DEBUG=false としても何かしらのエラーのタイトルの一文のみが表示されてしまう！
そもそも真っ白もありえないけど…

## はい！できるだけ何が起こってるか画面で伝えよう！
下のdiffは自分が気になった所、3点を改修！
【app\Exceptions\Handler.php】をそれぞれ上から

* トークン エラー
* Syntax エラー バリデーション エラー
* http ステータスコード

```diff:Handler.php
+ use Illuminate\Session\TokenMismatchException;
+ use Illuminate\Validation\ValidationException;

    public function render($request, Exception $exception)
    {
+         if ($exception instanceof TokenMismatchException) {
+             return redirect()->back()->with('message','セッションのタイムアウトとなりました。もう一度入力してください。');
+         }
+         if (get_class($exception) == "ErrorException" || $exception instanceof ValidationException) {
+             return parent::render($request, $exception);
+         }
+         $status = $exception->getStatusCode();
+         return response()->view("errors.common", ['exception' => $exception], $status, $exception->getHeaders());
-         return parent::render($request, $exception);
    }
```

## 解説

### **use hoge\hoge;**
例外を判断するときに必要な呪文みたいなもの！（あんまり理解してない）

### **if ($exception instanceof TokenMismatchException) {**
トークンエラーの際に、messageをセットして戻す。(oldとか改善の余地あり)

### **if (get_class($exception) == "ErrorException" || $exception instanceof ValidationException) {**
Syntaxエラー → クラスで無理やり表示（"ErrorException"）
それぞれ『parent::render』で満足いく結果になった。

### $status = $exception->getStatusCode(); 以下
httpステータスコードによりVIEW側で表示の出し分けをする。

## さいごに
**全く解説になってないけど、この辺りのドキュメントがあまりヒットしなかったら書いてみた！
そして、もっとスマートなやり方もあるんだろうなーっと！
気が向いたら編集しよう！**
Ubuntu14.04 LTS にGTX1070 + cuda8.0 をセットアップしたメモ

##問題
- NVIDIAのドライバを入れた後に、cudaを入れると、ドライバのバージョンがダウングレードされて、GPUが見えなくなる問題

##経緯
- GTX1070用のドライバを入れると、nvidia-375.26 が使われる
 - この時点では、nvidia-smi でちゃんと見えてる

> sh NVIDIA-Linux-x86_64-375.26.run

- dpkgでドライバを入れると、nvidia-361にダウングレードされる
 - これにより、nvidia-smi　で見えなくなる（怒られる）
 - dpkg -l | grep nvidia などとすると 361が使用されているとの表示 

> dpkg -i cuda-repo-ubuntu1404_8.0.44-1_amd64.deb

- repository に ppa:graphics-drivers を追加する

> add-apt-repository ppa:graphics-drivers/ppa

- apt-get updateで４０４がでる

##解決策
- /etc/apt/source.list.d/graphics-drivers-ubuntu-ppa-utopic.listを編集
 - utopic -> zesty に修正　（これはかなり適当）

- apt-get update成功
- ドライバを確認

> apt-cache search 'nvidia-[0-9]+$'

- nvidia-375を入れ直してOK!

> apt-get install nvidia-375

----
つづく！（？）
さくらのIoT Platform βを試してみる

今回試したのは以下の構成です。最初から公式ドキュメントを読んでおけば良かったのですが、α版の情報に振り回されて時間がかかってしまいました…。

- さくらの通信モジュール(β)
- Arduinoシールド(β)
- Arduino Leonardo


## ハードウェアの設定
Arduinoの上にシールドを乗せて、さらにその上に通信モジュールが乗っかるような感じです。多分、間違えようがないので詳細は割愛。マニュアル読まない人（自分）がハマるのが、ジャンパの設定です。I2Cを使う場合は以下のように接続(ショート)します。

![sakura-iot.jpg](https://qiita-image-store.s3.amazonaws.com/0/50780/2b6578d3-17c5-f8ca-8be9-d71736551130.jpeg "sakura-iot.jpg")

https://iot.sakura.ad.jp/developer/pdf/sco-ard-01_manual.pdf

## Arduinoの設定
サンプルスケッチをコンパイルして導入します。以下は公式(?)リポジトリのREADMEに紹介されているサンプルにシリアル出力を追加したものです。getConnectionStatusの戻り値が0の時は正常に通信が出来ています。

```
#include <SakuraIO.h>

//SakuraIO_SPI sakuraio(10);
SakuraIO_I2C sakuraio;
uint32_t cnt;

void setup(){
  cnt = 0;
  while((sakuraio.getConnectionStatus() & 0x80) != 0x80){
    delay(1000);
  }
}

void loop() {
  cnt++;
  sakuraio.enqueueTx(0,cnt);
  sakuraio.enqueueTx(1,cnt);
  sakuraio.enqueueTx(2,cnt);
  sakuraio.send();
  delay(1000);
  Serial.print(sakuraio.getConnectionStatus());
  Serial.print("  ");
  Serial.println(cnt);

}
```

https://github.com/sakura-internet/SakuraIOArduino



## コントロールパネル
（必要に応じて）プロジェクト、モジュール、サービスを登録します。

モジュールのIDとPASSは通信モジュールの表面に書いてあります（上記写真で塗りつぶしている箇所）ので、これをそのまま入力します。サービスはとりあえず疎通確認したいだけの時は「WebSocket」が便利そうです（通信状況を表示してくれる場所があります）。

https://iot.sakura.ad.jp/developer/

モジュール一覧画面のステータスが「オンライン」に変わって、WebSocketの詳細画面で以下のように受信データが確認できれば接続完了です。

![Screen Shot 2016-12-27 at 17.27.23.png](https://qiita-image-store.s3.amazonaws.com/0/50780/83c40ac7-b8ac-787d-2ed3-adcdd08bf1b6.png "Screen Shot 2016-12-27 at 17.27.23.png")


## 次回は…
温度センサの接続と、受信データを手元のデータベースに蓄積するところを構築します。

http://qiita.com/lumbermill/items/4cd9e8adcb8f3af2ba15

こんなIoTプロジェクトを進めています。
https://mukoyama.lmlab.net/
Railsを使わずConcernだけ使う方法と、いい感じにモジュールが読み込まれてる仕組みを調べてみた

Railsを使わずに`Concern`だけ使う方法を調べていたところ、特定のクラスの名前空間以下にモジュールを作っている方法も気になったので調べてみました。

## サンプルコード

Railsを使わずに`ActiveSupport`だけで`Concern`を使うコードは以下です。

``` Ruby:path_to/container.rb
require 'active_support'

ActiveSupport::Dependencies.autoload_paths << File.dirname(__FILE__)

class Container
  include Container::Feature
end

Container.new.instance_feature #=> "Instance features are loaded!"
Container.class_feature #=> "Class features are loaded!"
```

``` Ruby:path_to/container/feature.rb
module Container::Feature
  extend ActiveSupport::Concern

  included do
    def instance_feature
      p 'Instance features are loaded!'
    end
  end

  class_methods do
    def class_feature
      p 'Class features are loaded!'
    end
  end
end
```

Railsを使っている時と違い、`autoload_paths`に対象のディレクトリが自動で入ってないことでハマりました・・。

ここから`Container::Feature`という形で名前空間の中に入れたまま`Concern`を使っている時の感覚で別ファイルで書こうとすると以下の理由で困りました。

- モジュールを`include`する際に`Container::Feature`が定義されておらずエラーになる  
  (`uninitialized constant Container::Feature (NameError)`が起きる)
- 先に`Container::Feature`モジュールを定義すると`Container`クラスの名前空間がなくてエラーになる  
　(`uninitialized constant Container (NameError)`が起きる)
    - 先に`Container`というモジュールを定義して名前空間を作ろうとするとクラス名と被ってエラーになる

`ActiveSupport`では`const_missing`をオーバライドすることでこれらの問題を解決してくれていました。

ちなみにこれを`ActiveSupport`を使わずに同じ動作をする状態にするなら以下のようになります。

``` Ruby
class Container
  module Feature
    def self.included base
      base.extend ClassMethods
    end

    def instance_feature
      p 'Instance features are loaded!'
    end

    module ClassMethods
      def class_feature
        p 'Class features are loaded!'
      end
    end
  end

  include Feature
end

Container.new.instance_feature #=> "Instance features are loaded!"
Container.class_feature #=> "Class features are loaded!"
```

## 参考

- http://railsguides.jp/autoloading_and_reloading_constants.html#autoload-paths
- http://stackoverflow.com/questions/37507321/rails-namespacing-concerns-based-on-model-name
Cereal で optional なフィールドを読み込む

漢なら Cereal ですね!

[C++のcerealのシリアライズが快適すぎるやばい](http://qiita.com/Ushio/items/827cf026dcf74328efb7)


Cereal で JSON 形式で設定ファイルのロードに使いたくなりますね!
その場合, 設定パラメータを optional に読む機能がほしくなりますね.

https://github.com/USCiLab/cereal/issues/30

`cereal::make_optional` みたいなのが提案されているようですが, まだ master には取り込まれていないですね...

そんなわけで, issue の最後のほうにある, exception で囲むやりかたで optional なフィールドを読み込んでみましょう.

こんな感じになりました.
(フィールドは全て NVP(name-value-pair) で読むと仮定)

```
template <class Archive, class T>
static void Optional(Archive &archive, const std::string &name, T &value) {
  try {
    archive(cereal::make_nvp(name, value));
  } catch (std::exception &e) {
    (void)e;
    // OK
  }
}

// Seralize RenderConfig class.
template <class Archive>
static void LoadRenderConfig(Archive &archive, RenderConfig &m) {
  // Optional fields
  Optional(archive, "width", m.width);
  Optional(archive, "height", m.height);

  // Mandatory fields.
  archive(cereal::make_nvp("eye", m.eye));
  archive(cereal::make_nvp("look_at", m.look_at));
  archive(cereal::make_nvp("up", m.up));
  archive(cereal::make_nvp("fov", m.fov));
}
```

## 問題点

構造が深くなって再帰的にロードする場合, Cereal がより上位のレベルで例外を投げてしまい正しくパースができないことがわかりました.
(たとえば, `std::vector<MyClass>` で, `MyClass` に `std::vector` がある場合, MyClass のパースで例外をキャッチしても, `std::vector<MyClass>` のパースで例外が出てしまう)


また, 同様に構造が深い場合だと, 例外を使ってパースをスキップすると Cereal 側でメモリリークするケースがあります.

以下のようなサンプルも提案されていますが, 定義順が固定になります.

https://github.com/Enhex/Cereal-Optional-NVP

したがって, 今の所完全に optional なフィールドを Cereal で読む手段を実現するのは難しいですね... 設定ファイルをロードするなどの用途では, 普通に JSON パーサや XML パーサを使うしかなさそうです.


## まとめ

Cereal すばらしい.
Reactでaタグの中にtarget='_blank'を書いたらESLintに怒られた話

## 経緯

適当に別タブを開くリンクをjsxで書いたら `eslint-plugin-react` の `jsx-no-target-blank` で怒られいました。
ほんとに知らなかったし、気軽にできちゃうからやばいな。っと思ったのでメモしておきます。

```jsx
import React from 'react';
import ReactDOM from 'react-dom';

class Index extends React.Component {
  render() {
    return (
      <a
        href="http://example.com"
        target="_blank"
      >
        アンカーリンク
      </a>
    );
  }
}

ReactDOM.render(
  <Index />,
  document.getElementById('root')
);
```

## エラーを見る

セキュリティーリスクがあるだと。。。

```text:原文
Using target="_blank" without rel="noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener/
```

```text:意訳
rel="noopener noreferrer"つけないでtarget="_blank" 使うとセキュリティーリスクあるからやめろ！
(https://mathiasbynens.github.io/rel-noopener/)を参照しなさいっ！
```

## 攻撃方法を調べた

ざっくりいうと

- 悪さするリンクをpwを盗みたいサイトに貼る
- ユーザーがリンクを踏む
- 別のタブが開き今まで見てたタブが裏に隠れる
- 裏に隠れたタブに戻るとログイン画面になっている(実際はログインページではなくフィッシングサイトにリダイレクトされている)
- ユーザーがid/pwを入力してログインしたらもとのページにリダイレクトする

これ最近のサイト裏でセッション切れたかなにかでログインページに飛ばされてることあったりして普通に入力してしまいませんか？？？

攻撃する方が準備するのは

- ログインページ(ほぼトレースで作れるから数秒で作れちゃうはず)
- id/pwを送ってもらうサーバー(適当でいいなら数時間かかる？ぐらい)
- リンク先のページ(`window.opener.location = "http://example.com";`が実行できればどんなページでも良さそう)
- 狙ってるサイトにリンクを配置する

めっちゃかんたん。あとは勘違いしてユーザーにログインしてもらうだけ。かなりまずい気がする。

## 対策

- サイトにリンクを貼らせない(ほぼ無理)
- ユーザーにurl変わってないか判断してもらう(かなり無理)
- `rel="noopener noreferrer"`を指定する

## rel="noopener noreferrer"とは

### noopenerとは

そもそも`window.opener.location`を書き換えられなくする！
ただし対応ブラウザが少なめ。

参考サイト
https://html.spec.whatwg.org/multipage/semantics.html#link-type-noopener

```text:抜粋
its window.opener property will be null.
```

```text:意訳
window.opener プロパティnullにするよ
```

### noreferrerとは

そもそもリンクたどるときリファラー情報見れなくする!
古いブラウザでも対応してる。
別の所で情報見れなくてこまることもありそう。
noreferrerを当てるだけでESlintのエラーに対応できそうですが、 `noreferrer noopener` としっかり書かないとだめみたいです。

参考サイト
https://html.spec.whatwg.org/multipage/semantics.html#link-type-noreferrer

```text:抜粋
It indicates that no referrer information is to be leaked when following the link.
```

```text:意訳

リンクをたどるときにリファラー情報漏らさないよ
```

```html:抜粋
<a href="..." rel="noreferrer" target="_blank"> has the same behavior as <a href="..." rel="noreferrer noopener" target="_blank">.
```

```text:意訳
noreferrerとnoreferrer noopenerは同じ
```

## セキュリティーリスクを回避してESlintのエラー修正

```diff:
import React from 'react';
import ReactDOM from 'react-dom';

class Index extends React.Component {
  render() {
    return (
      <a
        href="http://example.com"
        target="_blank"
+       rel="noreferrer noopener"
      >
        アンカーリンク
      </a>
    );
  }
}

ReactDOM.render(
  <Index />,
  document.getElementById('root')
);
```

## まとめ

普段そこまでセキュリティー意識してなくてすいません。って気持ちになりました。
ESlintさまさまです。よくわからないエラーが出てたらちゃんと分かるまで調べましょうね。

僕から以上。
運用フェイズに入ってからスクラムを始めてみた

こんにちは。 Opt Tachnologies の @atsfour です。
Qiitaには初めての投稿になりますが、今回はとあるプロダクトでスクラムを始めてみたことと今後について、ポエムっぽいのを書いてみようと思います。

## きっかけは？

Opt Technologies は4月に発足し、自社でプロダクト開発を進めるべく、エンジニアを集めたり制度を整えたりして来ました。もともと作りたいプロダクトは多数あり、それを企画するビジネス側の部署はすでに機能している状態でした。

2016年7月を目標にリリースしようとしているプロダクトがあり、 Opt Technologies に在籍しているエンジニアの半分ぐらいがそのプロダクトに関わっている状態で、なんやかんやありつつもリリース（ちょっと延びた）しました。

発足後まもないタイミングでの開発ということもあり、割と時間をかけて振り返り会をやったところ、開発者と企画者のコミュニケーション不足が課題であるという意見が多数出ました。

- 工数の見積もりが甘くリスケが発生した
- 動作確認のやり方が確立されてなく、後になって要改修となることが多々あった
- ビジネス側がそれほど重視していない機能の実装難度が高いなど、うまくすれば時間を節約できる部分があった
- 仕様の共有がうまくできてなかった

などなど。

開発者、ビジネス担当者ともにスクラムの経験がない中で [SCRUM BOOT CAMP THE BOOK](https://www.amazon.co.jp/dp/4798129712) などを読みつつ、とりあえずコミュニケーション不足は解消できるだろう、と始めた感じです

## どんな体制？

リリース後に追加開発したい機能もたくさんあり、既存機能の改修やパフォーマンス改善といった要請がありつつ...ということで、以下のような体制に落ち着きました。

- 機能改善とバグFIXを担当する `Kaizen` チーム (PO + SM + 4名)
    - POはビジネス担当者から
    - スプリント期間は1週間
    - ストーリーポイントの見積もりはブロダクトバックログ単位
- 追加機能を担当する `Next` チーム (PO + SM + 4名)
    - POはビジネス担当者から
    - スプリント期間は2週間
    - ストーリーポイントは **スプリントバックログ単位**
- インフラ整備を担当する `Infra` チーム (PO + SM + 3名)
    - POは開発担当者から
    - スプリント期間は2週間
    - ストーリーポイントは **スプリントバックログ単位**

「ユーザーストーリー」の意図を考えると、スプリントバックログ単位での見積もりは邪道か？とも思いましたが、大きな追加機能だとスプリント期間内に開発が完了しないものもあり、かと言って初期からスプリント期間を伸ばすと重要な **振り返り** の頻度が下がることも考えてこんな感じに。

## やってみてどうよ？

- もともとフラットな組織ではあったが、開発メンバーのオーナーシップが向上して自主性が高まった実感
- 機能実現のためにタスクブレイクする作業にビジネスメンバーも関わることになり、 **進捗状況への合意感** か向上した
- コミュニケーションのためのコスト増加し **手を動かせないと感じる時間** は増えた
- 開発段階での仕様変更の相談が **開発者側から** 発生しやすくなり、工数の削減や手戻りの減少がみられた
- 現場主導でスクラム本読書会などの活動も活性化
- 開発とそれ以外の社内で必要な活動とで時間配分を可視化する動き

ベロシティ計測をそこまで重視していないこともあって、「本当に開発が速くなったか」は未知数な部分がありますが、全体としては **やってよかった** です！

## 今後は？

全員が手探りな中で「本当のスクラム」から乖離しているんじゃないか？という感じはずっと感じながら進めています。

年末の課題図書として [スクラム現場ガイド -スクラムを始めてみたけどうまくいかない時に読む本-](https://www.amazon.co.jp/dp/4839951993) を読み、スクラム導入そのものに対する振り返りをしていき、よりよいチームをつくるべく邁進していきます。
dabbrev-completionを置き換える！ helm-dabbrevが便利

`M-/`の`dabbrev-expand`は良いが、`C-M-/`の`dabbrev-completion`が使いにくい。

新しくウィンドウを作ってしまい、しかも`C-x o`で切り替える必要があるためだ。

そのため下記のように設定した。多分便利。

```lisp:init.el
(bind-key* "C-M-/" 'helm-dabbrev)
```

![Screenshot_2016-12-27_17-13-36.png](https://qiita-image-store.s3.amazonaws.com/0/103885/12ddee30-29a8-30d4-f4be-bd38ce9a8d0d.png)

https://github.com/emacs-helm/helm/blob/master/helm-dabbrev.el
SSH ログインしたときに tmux を開く

# 動機

* 踏み台ホストの上でいちいちログインするとき、tmux を開き直すのもめんどいし、`tmux ls` 打つのもダルい
* どうせ同じセッション名で開くならば、常に開いておいていいじゃない
* tmux が自動的に立ち上がって不便なことないし (ここ重要)
    * 自動的に立ち上がると困る人もいるとは思う
    * けど、自分はあまりそこは重視していないので見切る

# 実現方法

* 前提として bash です。zsh などの人は適宜書き換えてください
* `.bashrc` なり `.bash_profile` に以下の行を追加する

```bash
SESSION_NAME=ope

if [[ -z "$TMUX" && -z "$STY" ]] && type tmux >/dev/null 2>&1; then
  option=""
  if tmux has-session -t ${SESSION_NAME}; then
    option="attach -t ${SESSION_NAME}"
  else
    option="new -s ${SESSION_NAME}"
  fi  
  tmux $option && exit
fi
```

# 解説

* `SESSION_NAME=ope` としているので、ここでのセッション名は ope です
    * 気になる人は `tmux ls` をしてください
* tmux で起動しているときには環境変数 `TMUX`　に値がセットされます
    * それを利用して、現在 tmux 環境で開いているかどうかを判別します。
    * しないと、tmux 環境で立ち上がっているときに、さらに tmux で立ち上げようとする(かも)
* has-session を利用してすでにセッションが作成済みかどうかチェックします
    * 作成済みの場合にはすでにあるセッションに attach します
    * なかった場合には `new -s` でセッション名を作成します

# まとめ

* かなり楽になりました。ターミナルをタブで開くのもいいのですが、ウィンドウ切り替えを tmux bind でできるのはいいですねヽ(*´∀`)/
Serverless Webpack の使い方まとめ


Serverless Webpack は Serverless フレームワークを用いたNode.js開発に、Webpackのビルドをもたらしてくれます。

AWS Lambda は Node.js の4系しかサポートしていないため、一部のES6記法が未だ使えない状況にありますが、serverless webpack を使用すればそのあたりの問題は解決できます。

また、複雑なプロジェクト構成においても、必要なファイルに絞ってファイルをバンドルしてくれるので、無駄にデプロイのサイズが膨らむこともなく、loader などを用いた yamlファイルや、HTMLの組み込みなども行えるので非常に便利です。

https://github.com/elastic-coders/serverless-webpack
 
## Usage 

以下のコマンドでインストールしてから、

```
npm install serverless-webpack --save
```

`serverless.yml`にプラグインを追加します。

```
plugins:
  - serverless-webpack
```

### Configration

Webpack の設定は `webpack.config.js`に記述します。 基本の設定は以下のような形になります。

```
// webpack.config.js

module.exports = {
  entry: './handler.js',
  target: 'node',
  module: {
    loaders: [ ... ]
  }
};

```

`output`エントリを省略しても、serverless webpack側で自動的に補完されます。

serverless webpack は標準で全てのモジュールをBundleして一つのJSファイルにまとめようとしますが、これを避けたいようなケースでは、`externals`設定を適用します。

```
// webpack.config.js
var nodeExternals = require('webpack-node-externals')

modules.export = {
  // we use webpack-node-externals to excludes all node deps.
  // You can manually set the externals too.
  externals: [nodeExternals()],
}
```

上記のように `webpackl-node-externals` を利用すると便利ですが、手動で一つづつパッケージ名を記載しても大丈夫です。

externals を設定する場合、これらがパッケージに含まれるよう、serverless.ymlの設定ファイル側で`webpackIncludeModules`を有効にしておきます。

```
custom:
  webpackIncludeModules: true # enable auto-packing of external modules
```

`webpack`



## Commands 

### Webpackのビルド

```
serverless webpack 
```  

Babel の動作確認などに。`.webpack`という名前のフォルダにファイルが吐き出されます。

### API Gateway のシュミュレーション

```
serverless webpack serve
```  

完全にシュミレートというわけではなく、レスポンスだったかリクエストだったかの形式が違うとかがあったりますが、概ね使えます。

パスパラメータの付いているHTTPイベントの設定とかも普通に認識する。

たまにエラーで止まったりするので、`sls webpack`コマンドでエラーを確認する必要があったり。

### 関数の実行

```
serverless webpack invoke --function <function-name>
```

関数を単体で実行します。 `--function` は `-f` でもOK。

実行はローカルで行われます。

### デプロイ

```
serverless deploy
```

通常のserverless コマンドの実行で Webpack の Buildが走りデプロイできます。
PythonのPickleモジュールを理解したいだけの人生だった

#What's Pickle
これ
![image.jpeg](https://qiita-image-store.s3.amazonaws.com/0/28622/6710b786-b98a-1c62-17f2-c82f6be6153d.jpeg)

わぁーおいしそ〜
というボケはともかくとして、名前の由来はPicklesから来ており、オブジェクトを直列化することでオブジェクトの状態を保存することのできるPythonモジュールです。

最近深層学習の勉強をしており、頻繁に

```
train_list = load_image_list(args.train)
val_list = load_image_list(args.val)
mean_image = pickle.load(open(args.mean, 'rb'))
```
のようなコードと出会うことが多くなりました。
「pickleってなんのこと？」と思ったので、自分なりに調べたことをまとめます。

プログラミング全般的に知識が浅はかなので気になる記述があった方はご指摘ください。

#オブジェクトのPickle化、非Pickle化(*)って何？
だいたいのことはドキュメントに書いてあります。

http://docs.python.jp/2/library/pickle.html
http://docs.python.jp/3/library/pickle.html

プログラムはその性質上、メモリ上で働き、役割を終えたらメモリから削除されます。
オブジェクトも役割を終えたらGCに削除されますし、そうでなくともプログラムが実行を終えたら消えてしまいます。

プログラムを実行し終えたあとも作成したオブジェクトを保存する機能を提供してくれるのがPickleモジュールです。

保存する方法としては、バイト列などにオブジェクトを変換してファイルに書き込みます。

#実行例

簡単なクラスを書きます。

```Singer.py
class Singer(object):
    def __init__(self, lylics):
        self.lylics = lylics
    def sing(self):
        print(self.lylics)

```

このクラスはインスタンス化すると

```main.py
from singer import Singer

singer = Singer('Shanranran')
singer.sing()
```

```
$ main.py
$ 'Shanranran'
```

というように、コンストラクタに渡した歌詞を歌ってくれます。

もちろん、実行が終了した時点でSingerは歌詞を忘れてしまいます。

そこで、歌詞カードの代わりにオブジェクトの状態をPickleを使って保存します。

```dump.py
import pickle
from singer import Singer

singer = Singer('Shanranran')

with open('singer.pickle', 'wb') as f:
    pickle.dump(singer, f)
```

Singerオブジェクトの状態をsinger.pickleというバイナリファイルにすることで、dump.pyが終了したあともオブジェクトの状態を保存できます。これがPickle化です。

オブジェクトの非Pickle化にはloadメソッドを使うのですが、

```load.py
import pickle

with open('singer.pickle', 'rb') as f:
    singer = pickle.load(f)

singer.sing()
```

```
$ python load.py
$ Shanranran
```

というようにdump.py実行時のSingerオブジェクトの状態が保存されていることが確認できました。

#おわりに

簡単にPickleモジュールについて書きましたが、これはほんの序の口で、本格的に使う場合には気をつけなければならないことがまだまだあります。
私自身、勉強中なので、また調べたときに書きたいと思います。

#参考

12.1. pickle — Python オブジェクトの直列化
http://docs.python.jp/3/library/pickle.html

11.1. pickle — Python オブジェクトの直列化
http://docs.python.jp/2/library/pickle.html

Python: オブジェクトを漬物 (Pickle) にする
http://blog.amedama.jp/entry/2015/12/05/132520

*直列化、平坦化、整列化など呼び方がいろいろ存在するが、ここでは公式ドキュメントに合わせた。
コンソールで動くエディタを作る(23日目) 静的解析・範囲削除

本稿は[自作エディタをつくる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/make_editor)の23日目です、レポジトリは[こちら](https://github.com/tinyco/tiny_code_editor)

# プルリクエストを貰いました

またequal-l2氏から頂きました。

`*str = malloc(strlen(argv[1]));`

は、文字列末端のヌル文字をコピーできていないために良くなくて、

`*str = malloc(strlen(argv[1])+1);`

が正しいようです。strlenのドキュメントに明記されてました。

ちなみに、strlenを使っているもう片方の箇所はヌル文字をコピーせずに使いたい箇所なので問題ありませんでした。
つまり、もっと注意力を持って関数を呼ばないとダメですね。
C言語はmalloc/freeと配列の何番目かがとにかく大変だと思います。
これは慣れの問題ではないような・・・、つらい。
jsのようにアクセスされたところまで確保領域が伸びる配列のようにつかえるリストを作ったら流行るのでは？って思いました。

# 静的解析ツール(infer/clang-check)

tenmyo氏と19日目のコメントと、equal-l2氏の21日目のコメントをもとにいじっていると、静的解析ツールがいくつか動くようになりました。

ポイントは静的解析ツールに

`export C_INCLUDE_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include:$C_INCLUDE_PATH`

でstdio.h等の位置を教えてあげることで、

- facebook infer
- clang-check

は自分の環境では動くようになりました。

ネットを見るに、`usr/include`や`usr/local/include`にstdio.h等がある状況もあるかもしれない。
自分はなかったです。

ちなみにMacOSの10.12.2です。

```
find . | grep '\.c$' | xargs infer -- clang -c
(infer-outフォルダのbugs.txtに結果があります)

find . | grep '\.c$' | xargs clang-check -analyze 2> clang_check.txt
```

たぶんこんな感じで動きます。infer-outとplistをgitignoreすると良さそうです

19日目のcppcheckと合わせて、今回のコードに使った感想だと、指摘がほとんど重複してないです。

- cppcheckは、表面的な文法の誤りを探す雰囲気
- clang_checkは、どことなくiOSアプリを作る時のXcodeのwarningみたいな内容
- inferは、コードをよく解析して挙動自体の誤りを探してる雰囲気

がしました。cppcheckは指摘する種類が少ない気がしますね、なんとなくですが。

facebook inferはAndroidアプリ、iOSアプリの指摘もしてくれるので、そちらも使ってみました。
けっこう良い感じの指摘があったので、その用途もオススメです。

また、Macではgccがclangに置き換わっているので、
`-fno-omit-frame-pointer -fsanitize=address`をつけるとセグフォ(及びその予備軍)を教えてくれます。
色々メッセージが出て詳細なことを教えてくれますが、
とりあえずメッセージ上部ぐらいしか意味がわからず。それでも便利です。

# 余談

C言語は歴史が長いからか、コンパイラのエラーメッセージが結構親切な気がします。
74行目にセミコロンがないよ、その場合は変数名に&をつけたほうがいいよ・・・とか。
なので、そのエラーメッセージを受け取って、
自明そうなエラーであれば勝手にセミコロンをつけたり&をつけたりするツールを作ったら
便利かもって思いました。

もし変な改変されても、たぶんgitで戻せるし良いのでは？

# まとめて削除

前回、カーソルだけは範囲指定できるようになったので、
その状態で文字を打つかbackspaceを押した場合はその範囲を削除するようにしました。

文字を打つ時も、範囲指定状態であれば削除してから挿入するようにします

# 今日のまとめ

- 静的解析ツールが動くようになりました
- 選択範囲を削除できるようになりました

静的解析ツールやコードフォーマットツールはやはり便利ですね。
Paramikoでコマンドの送信、結果の記録を自動で行う

pythonでSSHやるなら[paramiko](http://www.paramiko.org/)モジュールだと思いますが、なかなか使うのに苦労しました。

以下メモです。

ログの取り方

```py:paramiko_log.py
import paramiko

#ログファイル名
LOG_FILE='log.txt'
R_HOST=''
R_HOST_USER=''
R_HOST_PASS=''

logger = paramiko.util.logging.getLogger()
paramiko.util.log_to_file(LOG_FILE)

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('R_HOST', username='R_HOST_USER', password='R_HOST_PASS', port=22, timeout=15.0,look_for_keys=False)
ssh.close()
```


リモートコマンドと結果の受け取り方(パスワード認証)

```
import paramiko

import time

R_HOST=''
R_HOST_USER=''
R_HOST_PASS=''
error_flg = False
msg = ''

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(R_HOST, username=R_HOST_USER, password=R_HOST_PASS, port=22, timeout=15.0,look_for_keys=False)

ssh_shell = ssh.invoke_shell()

time.sleep(3)

#データの受け取りができていなければエラーとして処理をする
if (ssh_shell.recv_ready()) and (not error_flg):
    msg += ssh_shell.recv(9999)
    msg += '\r\n'
else:
    print 'error'
    error_flg=True
    ssh.close()

#コマンドの送信
ssh_shell.send('ls \n')

time.sleep(3)

#データの受け取りができていなければエラーとして処理をする
if (ssh_shell.recv_ready()) and (not error_flg):
    msg += ssh_shell.recv(9999)
    msg += '\r\n'
else:
    print 'error'
    error_flg=True
    ssh.close()

#コマンドの送信
ssh_shell.send('last \n')

time.sleep(3)

#データの受け取りができていなければエラーとして処理をする
if (ssh_shell.recv_ready()) and (not error_flg):
    msg += ssh_shell.recv(9999)
    msg += '\r\n'
else:
    print 'error'
    error_flg=True
    ssh.close()

ssh.close()
```

説明程度なので簡単に書きましたが、エラー処理はちゃんとやるべきです。
途中のスリープも3秒待ちとかじゃなくて、プロンプトの入力待ち(’$’が末尾)で残りのデータが無いときに次の処理へ進むなどの処理をしてあげるといいと思います。あと、ssh.close()は必ず実行されるようにしたいですね。
marshmallowのload(deserialization)時とdump(serialization)時のデフォルト値について

[marshmallow](https://github.com/marshmallow-code/marshmallow) のschemaにデフォルト値を設定したい。

## load/dumpのデフォルト値

marshmallowでは以下のような対応になっている。

- `load()` -- 文字列表現をオブジェクト表現をする処理(deserialization)
- `dump()` -- オブジェクト表現を文字列表現にする処理(serialization)

これら２つのそれぞれについてデフォルト値を設定するオプションがある。

- `load()` -- `missing`
- `dump()` -- `default`

以下の様にして使う。

```python
from marshmallow import Schema, fields


class S(Schema):
    n = fields.Integer(missing=1, default=-1)

print(S().load({}))
# UnmarshalResult(data={'n': 1}, errors={})
print(S().dump({}))
# MarshalResult(data={'n': -1}, errors={})
```

## collectionの値に対してdefault値を設定したい場合

`many=True` は関係無いので注意。コレクションの値のfieldsは `fields.List` を使う。

```python
from marshmallow import Schema, fields


class S(Schema):
    nums = fields.List(fields.Integer(), missing=[1, 2, 3], default=[-1, -2, -3])

# # 以下ではない
# class S(Schema):
#     nums = fields.Integer(many=True, missing=[1, 2, 3], default=[-1, -2, -3])

print(S().load({}))
# UnmarshalResult(data={'nums': [1, 2, 3]}, errors={})
print(S().dump({}))
# MarshalResult(data={'nums': [-1, -2, -3]}, errors={})
```

ただしlistはmutableなので以下のように関数で包んだほうが無難

```python
from marshmallow import Schema, fields


class S(Schema):
    nums = fields.List(fields.Integer(), missing=lambda: [1, 2, 3], default=lambda: [-1, -2, -3])
```
## 参考

- [API Reference — marshmallow 2.10.5 documentation](http://marshmallow.readthedocs.io/en/latest/api_reference.html#module-marshmallow.fields)
よく使うwp-cliのコマンドチート集

よく使うWordPressのコマンドをまとめました。
随時更新予定。

## Wordpres CLI のダウンロード
まずはダウンロードから
`# curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar`

wpコマンドとして使えるようにする
`# chmod +x wp-cli.phar && mv wp-cli.phar /usr/local/bin/wp`

## wordpressのインポート
まだの場合は事前にDBを準備

```
# mysql -u root -p
Enter password:
```

```
mysql> create database {database名};
mysql> grant all privileges on {database名}.* {DBユーザ名}@localhost identified by {DBパスワード}';
```

WordPressのダウンロード
`wp core download --locale=ja`

wp-config設定
`wp core config --dbname={database名} --dbuser={DBユーザ名} --dbpass={DBパスワード} --dbhost=localhost --dbprefix=wp_`

WordPressインストール
`wp core install --url={サイトURL} --title={サイトタイトル} --admin_user={ユーザID} --admin_password={パスワード} --admin_email={メールアドレス}`

## WordPressデータベース引っ越し
データベースのエクスポート
`wp db export {ファイル名}`

データベースのインポート
`wp db import {ファイル名}`

ホスト名の検索・置換
`wp search-replace --recurse-objects [old-domain.com] [new-domain.com]`

ユーザーを削除・別のユーザーに再アサイン
`wp user delete [olduser] --reasign=[newuser] --yes`

## プラグインのセットを一発で切り替え
例えば開発・デバッグ時と公開時のプラグインをセットでオンオフしたい場合

まずはWordPressのプラグインで有効化のものを出力
`wp plugin list --status=active --field=name && paste -s -d' ' > plugin_list.txt`

いったん全て無効化してリストにあるものだけを有効化する

```
wp plugin deactivate --all && wp plugin activate `cat plugin_list.txt`
```

## よく忘れるので参考リンクメモ
[ビルトインサーバでのWPローカル環境構築](http://wald-grun.biz/web/wp/5659/)