OmniAICreator/Qiita-1.07M huggingface dataset:
Golangのconst識別子iotaの紹介

[Go AdventCalendar2016](http://qiita.com/advent-calendar/2016/go)の9日目(2016/12/09)の記事です。
前の記事は massa142さんの[「Hacker Newsを一覧表示してくれるCLIツールを書いた」](http://qiita.com/massa142/items/df181fc77a4d67e0f2a4)でした。

# はじめに
ちょっとマイナーなGolangの言語仕様である、iotaについて紹介します。
結構入門書とかにも書いてあるんですが、読み飛ばしがちなんですよね。
特に新規性がある内容ではないので、タイトルでもう知ってるわ！という方はそっ閉じしてもらって大丈夫です。


# iotaとは
iotaは、定数宣言(const)の内での既定された識別子です。
型なしの整数の連番を生成します。具体例を見ましょう。

```go
package main

import "fmt"

const (
	zero  = iota
	one   = iota
	two   = iota
	three = iota
)

func main() {
	fmt.Printf("zero:%v\n", zero)
	fmt.Printf("one:%v\n", one)
	fmt.Printf("two:%v\n", two)
	fmt.Printf("three:%v\n", three)
}

```
https://play.golang.org/p/9uycXahdRE
結果はこうです。
>zero:0
>one:1
>two:2
>three:3


最初の1つのみ設定しておけば、あとは省略することが可能です。
（ちなみにこれはiotaに限らず、定義する値を省略すると、直前に定義されたものが流用されます。）

```
package main

import "fmt"

const (
	zero  = iota
	one
	two
	three
)

func main() {
	fmt.Printf("zero:%v\n", zero)
	fmt.Printf("one:%v\n", one)
	fmt.Printf("two:%v\n", two)
	fmt.Printf("three:%v\n", three)
}

```
https://play.golang.org/p/IFkQnrwujr

ConstSpec毎にインクリメントされ、次の予約語constが現れたらリセットされます。

```go
const (
	zero = iota // 0
	one  = iota // 1
)
const (
	two   = iota // 0
	three = iota // 1
)
```


また、constの中であれば、式のなかで利用することもできます。

```go
const (
	zero  = iota * iota // 0
	one                 // 1
	two                 // 4
	three               // 9
)
```

```go
const (
	zero  = iota != 1 // true
	one               // false
	two               // true
	three             // true
)
```


他の定義と混在しても、ConstSpecのたびにインクリメントしています。

```go
const (
	zero  = "zero" // zero
	one   = iota   // 1
	two   = "弐"    // 弐
	three = iota   // 3
)
```

また、const内で先にiotaを設定すると結構面白かったです。iotaの機能ではなく、定数が優先されました。

```go
const (
	iota  = "iota" // iota
	zero  = iota   // iota
	one            // iota
	two            // iota
	three          // iota
)
```

型なしの整数なのでconstで使用した定数をTypeOfするとintになります。

```go
package main

import (
	"fmt"
	"reflect"
)

const (
	zero = iota
)

func main() {
	fmt.Printf("zero type:%v\n", reflect.TypeOf(zero))
}
```
https://play.golang.org/p/851VyBBlgs

ですので、このような定義をすると変換できないのでコンパイルエラーとなります。

```go
const(
	zero string = iota
)
```
>.../main.go:6: cannot convert 0 to type string


# Githubではこういう感じで使われてたよ

軽く見た感じ単純にフラグ的なものをconstするソースが殆どだったんですが、


```go
type ByteSize float64

const (
	_           = iota // ignore first value by assigning to blank identifier
	KB ByteSize = 1 << (10 * iota)
	MB
	GB
	TB
	PB
	EB
	ZB
	YB
)
```
https://github.com/golang/go/blob/964639cc338db650ccadeafb7424bc8ebb2c0f6c/doc/progs/eff_bytesize.go
このソースはシフト演算子でByteSize型の値作ってて面白かったです。

# おわりに
というわけで、iota列挙子のご紹介でした。

ひらめき次第で楽しく使えそうなので、こういうとこで使うと便利、こういう感じで使ってるとこあった、などあったら教えていただけるとうれしいです。

# 参考文献

Iota · golang/go Wiki
https://github.com/golang/go/wiki/Iota

The Go Programming Language Specification - Iota
https://golang.org/ref/spec#Iota

Yosssi's blog - Go言語の識別子iotaについて
http://yosssi.hatenablog.com/entry/2014/01/27/000135

Big Sky:: Recent entries from same category
http://mattn.kaoriya.net/software/lang/go/20141208093852.htm
AutoLayoutで問題のある制約を可視化する

小ネタを書きます。

# はじめに
AutoLayoutを使用したアプリで、実行時に以下のようなエラーログが出る時がたまにあります。

```swift
2016-12-09 14:43:14.502 ViewTest[19217:700173] Unable to simultaneously satisfy constraints:
(
    "<NSLayoutConstraint:0x618000086860 H:[NSButton:0x618000140840'Button'(196)]>",
    "<NSLayoutConstraint:0x618000086900 H:[NSButton:0x618000140840'Button'(<=30)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x618000086900 H:[NSButton:0x618000140840'Button'(<=30)]>
```

「設定してる制約を同時に満たすことができないよ」って言われているんですけど、たまーにstoryboard見ても何が原因かすぐわからなかったりすることがあると思います。

macOSアプリならこのような場合に、以下のように問題部分が可視化できます。

![スクリーンショット_2016-12-09_15_02_27.png](https://qiita-image-store.s3.amazonaws.com/0/61792/3808a211-c2a4-b998-cb87-d469a3623eaa.png)

画像↑のオレンジの矢印部分をクリックするとコンソールに以下のようなログが出力されるのでこれをもとにデバッグします。

```swift
2016-12-09 15:06:54.303 ViewTest[19217:700173] Clicked on overlapping visualized constraints: (
    "<NSLayoutConstraint:0x618000086860 H:[NSButton:0x618000140840'Button'(196)]> (Actual Distance - pixels):196",
    "<NSLayoutConstraint:0x618000086900 H:[NSButton:0x618000140840'Button'(<=30)]> (Actual Distance - pixels):196"
)

```

これはボタンの長さが196pxと30px未満の制約がそれぞれあり、ぶつかってるよと言っています。

# やり方
以下の一文を```applicationDidFinishLaunching```にでも追加します。

```swift:AppDelegate.swift
func applicationDidFinishLaunching(_ aNotification: Notification) {
        UserDefaults.standard.set(true, forKey: "NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints")
}
```
以上。

# 補足
この記事の一番上のエラーログの続きに以下の記載があります。

> Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.

要は`NSWindow`に`visualizeConstraints:`というメソッドがあり、ウィンドウに制約を渡すと可視化できます。
```NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints```をtrueにすると、問題のViewが表示された時に自動で`visualizeConstraints`を呼びます

とあります。

# 参考
* [AutoLayoutガイド](https://developer.apple.com/jp/documentation/AutolayoutPG.pdf)
* [How to set NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints? - stackoverflow](http://stackoverflow.com/questions/11721656/how-to-set-nsconstraintbasedlayoutvisualizemutuallyexclusiveconstraints/13044693)
AMPプロジェクトの第４四半期（10月～１2月）のロードマップの中間報告について

AMPプロジェクトに関することは、[ロードマップ](https://www.ampproject.org/roadmap/)ページに常に最新情報が載っています。なので、基本的にAMPプロジェクトの最新情報を知りたいときは、このページをチェックしておくと良いです。


ロードマップは、四半期ごとに、中間と期末の２回更新されるので年に８回の予定です。

例えば、

### 2016年Q3（７～９月）のときは、


* Q3中間： [8月16日](https://amphtml.wordpress.com/2016/08/16/amp-roadmap-update-for-mid-q3-2016/)
* Q3期末： [9月30日](https://amphtml.wordpress.com/2016/09/30/amp-roadmap-update-for-end-q3-2016/)（９月最終日）


に更新があり、

### 2016年Q4（１０月～１２月）においては、


* Q4中間： [11月23日](https://amphtml.wordpress.com/2016/11/23/amp-roadmap-update-for-mid-q4-2016/)


に更新がありました。


上は英語での発表になりますが、その後、日本語の記事もグーグルの開発者向けブログにも投稿されます。


### 最近の日本語での発表をまとめると、

* Q3期末： [10月20日](https://googledevjp.blogspot.jp/2016/10/amp-roadmap-update-for-end-q3-2016.html)
* Q4中間： [12月7日](https://googledevjp.blogspot.jp/2016/12/amp-roadmap-update-for-mid-q4-2016.html)


このように、約２～３週間後に日本語でも発表になることになるので、最新の情報を追うためには、英語の記事を読むことが必須です。


今回は昨日、[第４四半期中間の日本語での発表](https://googledevjp.blogspot.jp/2016/12/amp-roadmap-update-for-mid-q4-2016.html)もあったので、その内容について紹介します。


## フォーマット（メインの機能や要素）について


### Q4中間時までに行われたこと


* [`<amp-form>`](https://github.com/ampproject/amphtml/blob/master/extensions/amp-form/amp-form.md)のサポート・・・ECサイトの商品詳細ページでのカラー選択や、ニュースでのメルマガ購読フォームの設置が可能に。
* [`<amp-app-banner>`](https://github.com/ampproject/amphtml/blob/master/extensions/amp-app-banner/amp-app-banner.md)の実装・・・AMPページにネイティブアプリへのバナーが設置可能に。
* PWA（Progressive Web App）のサポートの強化
* [`<amp-lightbox>`](https://github.com/ampproject/amphtml/issues/4152)の改善


### 残りのQ4で予定しているもの


* [ネイティブアプリへのディープリンク](https://github.com/ampproject/amphtml/issues/5284)
* [クイックスタート サンプルコード](https://github.com/ampproject/amphtml/issues/2851)の準備
* [要素の動作をユーザー アクションにバインドする仕組み](https://github.com/ampproject/amphtml/issues/6199)の開発

## アナリティクス（アクセス解析）について

### Q4中間時までに行われたこと

* [`<amp-carousel>`のアナリティクス対応](https://github.com/ampproject/amphtml/issues/4292)


### 残りのQ4で予定しているもの


* `<amp-form>`のアナリティクス対応・・・フォームの送信成功や送信エラーもトラッキング出来るように
* 動画とECサイトのアナリティクスのサポート強化


## 広告について


### Q4中間時までに行われたこと


* 広告のためのAMPページ（A4A AMP for Ads）・・・これまではAMPページ内で広告バナーの読み込みが遅かったA4Aにより広告バナーが即座に反映。
* [フライングカーペット広告のサポート](https://github.com/ampproject/amphtml/issues/3126)・・・一応クリック先にgifアニメーションがあるので、どんな広告かはわかると思います。
* [複数サイズの広告リクエストをサポート](https://googledevjp.blogspot.jp/2016/10/multi-size-ad-request-support-in-amp.html)


## アクセスについて

### Q4中間時までに行われたこと

* amp-access機能のサーバーサイドでの作業

### 残りのQ4で予定しているもの

* ログイン操作の委譲機能の実装

機能制限があるAMPページですが、新たな機能が急速に追加されており、今後が楽しみです。
また12月末か年明けにロードマップが更新されると思いますので、更新されたら、また共有させていただきます。
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 4日目(クエスト選択からクエスト画面表示)

【非公式】C&M GAMESゲリラ Advent Calendar 2016 7日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

クエスト選択画面から、クエスト画面を表示するようにします。
ついでにクエスト画面の背景を選択ごとに変えてしまいます。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#レベル切り替え

タイトル画面とクエスト画面は別のレベルで作成されているため、レベル切り替えを実装します。
また、ついでにステージごとに背景を変えたいので、レベル間で共通の値を参照するようにします。

というわけで、GameInstanceに値を保存して参照するようにします。
GameInstanceについてはalweiさんの[Let's Enjoy Unreal Engine レベルを跨いで値を保持するGameInstanceについて](http://unrealengine.hatenablog.com/entry/2014/08/28/203638)を見ると分かると思います。

##GameInstance

とりあえずGameInstanceを継承したブループリントクラスを作ってしまいましょう。
ブループリント作成時にGameInstanceと検索すれば出てきます。
![GameInstance2.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8f0a9fe7-41f3-27a8-42a9-20a94d7d3fbd.png)

作成したら変数を追加します。
![GameInstance.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8a7bde96-e526-c95c-ade3-840bdebfaea5.png)

最後にプロジェクト設定↑マップ＆モードの一番下にGameInstanceという項目があるので、先ほど作ったGameInstanceをセットします。
![GameInstance3.png](https://qiita-image-store.s3.amazonaws.com/0/104377/122eefff-9d28-334a-a56a-a04af71558ed.png)

##背景修正

レベル間の移動を実装する前に背景の画像を切り替えられるようにします。
まずActorを継承したブループリントクラスを作成します。
![BG.png](https://qiita-image-store.s3.amazonaws.com/0/104377/c738ea6d-9a7a-972b-0511-ffc0d0ab37c1.png)

コンポーネントにPaperSpriteを追加、変数にPaperSpriteのArrayを作成します。
最後にGameInstanceから該当の変数を呼び出して、配列にセットしたSpriteをSetSpriteでセットするだけです。
![BG2.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a3a221a7-86e0-f2fd-23e9-f7272aa43acf.png)

エディタからSpriteの配列をセットします。これで背景の切り替え準備が出来ました。
![BG4.png](https://qiita-image-store.s3.amazonaws.com/0/104377/0e39341f-c6b4-ec1b-f630-e99e9ea9454a.png)

PaperSpriteを継承してしまうと、SetSpriteを呼んでもSpriteが切り替えられないので注意が必要です。

##クエスト選択のUI修正

クエスト選択のスクリプトを修正します。

まずは各ボタンからOnClickのイベントを追加します。
![UI3.png](https://qiita-image-store.s3.amazonaws.com/0/104377/97738633-4486-a6a7-82c0-742384a0c4db.png)

レベル移動は６つとも、渡す数値が違う以外はほぼ共通の処理なので、関数化してしまいます。
![UI2.png](https://qiita-image-store.s3.amazonaws.com/0/104377/d26c15e5-e2ae-fb31-2625-baf2fe11fd73.png)
StageIDはGameInstanceで作成した変数に保管します。

最後にイベントから先ほど作成した関数を呼び出します。
![UI.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a02270f8-5353-8683-1a18-c82c50ac2d7a.png)

以上で終わりです。

#クエスト選択からクエスト画面が呼び出せるようになった

切り替えが出来るようになりました！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">レベル切り替えと背景切り替えを実装 <a href="https://t.co/q4QXU4qcgK">pic.twitter.com/q4QXU4qcgK</a></p>&mdash; 荻野雄季＠クルーズから出荷された豚 (@YuukiOgino) <a href="https://twitter.com/YuukiOgino/status/807101558286520320">2016年12月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

クエストのプロトタイプとしては十分な実装といえます。

次はバトル画面かエンカウント演出入れるか迷ってます。
どちらにしても時間がないので、さっさと決めて実装してアドカレをバンバン書いていきます！
依存されまくっているファイルのリファクタ

_[mixiグループ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mixi)用の記事です_

そこそこ大きな Web ページ等を運営していると、

- ModelA でバグの温床になりそうなコード発見（でも今のところ正しく動いている？？）
- ModelA を使っているページが20ページもある！！！
- リファクタするのも正しく動くか確認するのも大変だ :fearful: 

こんなことがよくあります。
そんな場合のプラクティスを紹介いたします。

# ケース

```pl
# ModelA
sub is_kuso_code {
    my $self = shift;
    my $is_kuso = ...;
    return $is_kuso ? 'y' : 'n'; # bool ぽい値じゃなくて文字列の y/n を返している・・だと！
}
```
上記のようなクソコードが有ったとします。
ちなみにこいつ `if (is_kuso_code()) ..` とすると全てをクソコードとして判定してくれます:anger: 
DB に enum で y/n とか格納しているのを引っ張ってくると稀にこういうことが起こるかもしれません。

# 対応
まず前提としてこれらは各モジュールで UnitTest が書かれているべきです。それは当たり前にやっているとして、どうやってこいつをリファクタしていくかを考えます。

全てをいっぺんに直すのは実装もチェックも大変なので少しずつ直しましょう。
全てを直す！！！と息ごんでも途中で挫折してこの負債が残り続けるのがオチです。

## 1. これ以上負債への依存が増えないようする
既存の挙動を変えないようにしつつ、新規に使おうとすると自然と良い方の仕様が使われるようにします。
ここでは `uses_deprecated_kuso_condition_output` という長ったらしくていかにも怪しげなプロパティを ON にすると、 y/n という文字列を返すようにしましょう。
（もしくは、 `is_kuso_code()` を `is_legacy_kuso_code()` など改名して新規に `is_kuso_code()` を作るのでも構いません。）

```pl
# ModelA

# モデルのプロパティ
__PACKAGE__->mk_accessors(qw/
    uses_deprecated_kuso_condition_output
/);

sub is_kuso_code {
    my $self = shift;
    my $is_kuso = ...;
    if ($self->uses_deprecated_kuso_condition_output) {
        # こっちは新規では使わないでね
        return $is_kuso ? 'y' : 'n';
    } else {
        # perl では true/false は 1/0 とか 1/undef とかだよ
        return $is_kuso ? 1 : 0;
    }
}
```

ModelA を改修したら、そいつを使っている部分を全て uses_deprecated_kuso_condition_output: true にしていきます。

```diff
# some page

- my $modelA = ModelA->new();
+ my $modelA = ModelA->new({uses_deprecated_kuso_condition_output => 1});

my $is_kuso = $modelA->is_kuso_code();
if ($is_kuso == 'y') {
...
```

これで ModelA を使っているページの挙動を変えることなく、新規に ModelA が使われるときには悪い使われ方をしないようになりました。
とりあえず、これで状況はこれ以上悪くはならなくなりました。
（テストが書かれていないと、これで本当に影響が無いのか・・とかが自信がなくなりますので、テストはある前提です。）

## 2. 既存の古い使われ方をしている場所を直していく
uses_deprecated_kuso_condition_output とかで grep して、時間をかけて少しずつこのプロパティを使っている部分を直していきます。

一つづつやっていくことによって、動作確認の範囲も小さくできますので事故の少ないリファクタができます。
また、小分けにすることによって空いた小さな時間でリファクタを進めていくことや、複数人で並列して負債の返済をしていくことができます。
Wordの数式(MathML)をLaTeXの文字列に変換する

# はじめに
Wordの数式は、内部的にはMathML形式で保持されています。これをクリップボード経由でLaTeXの形式に変換する方法を述べます。

# 手順
1.  https://sourceforge.net/projects/xsltml/ からXSLT MathML Libraryをダウンロードします。
2. 上記を解凍すると*.xslファイルが含まれていますので、これをC#のプログラムから参照可能な任意の場所に設置します。
3. 以下の様に、クリップボードにコピーされたWordの数式(MathML)をLaTeXに変換します。

``` C#
using System.IO;
using System.Xml;
using System.Xml.Xsl;
…
var mathMlMemoryStream = Clipboard.GetData("MathML") as MemoryStream;
var mathMlByteArray = mathMlMemoryStream.ToArray();
var mathMlText = Encoding.Unicode.GetString(mathMlByteArray);
mathMlText = mathMlText.Replace("utf-16", "utf-8");
mathMlText = mathMlText.Replace("UTF-16", "utf-8");
File.WriteAllText("mathML.xml", mathMlText);

var inputUri = @"mathML.xml";
var stylesheetUri = @"解凍したファイルに含まれるmmltex.xslのパス";

// XSLTファイル の読み込み
var xslt = new XslCompiledTransform();
xslt.Load(stylesheetUri);

// 出力先を 文字列 として準備
var output = new StringBuilder();

// 出力フォーマット の指定
var settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = false;
settings.ConformanceLevel = ConformanceLevel.Auto;

// XSLT を利用した 変換処理
using(var writer = XmlWriter.Create(output, settings)) {
    xslt.Transform(inputUri, writer);
}

// LaTeXの文字列はoutput.ToString()で得られる
Console.WriteLine(output.ToString());
```  

# 参考
https://garafu.blogspot.jp/2014/04/c-xml-xslt.html
【Scrapy】エンドポイントだけクロールして巡回してくれない

Scrapy使って、エンドポイントだけクロールするのではなく、エンドポイントから順繰りできるようにしたいと思って実装しはじめたものの、はまったのでメモしておく。

このあたりの内容を参考にさせていただいて、スクレイピングを実装。
http://qiita.com/meltest/items/b445510f09d81276a420
http://qiita.com/checkpoint/items/0c8ad814c25e85bbcfa2#_reference-2f452f48c4e974829586
http://qiita.com/tamonoki/items/ce58ff209f8eae808162
http://web-tsukuru.com/570


## 状況
上記サイトの見よう見まねでスクレイピングルールを実装してみたが、なぜかエンドポイントしかクロールしてくれなかった。

```py
    # スクレイピングルール設定
    rules = (
             # スクレイピングするURLのルールを指定
             Rule(LinkExtractor(deny=deny_list,unique=True), callback='parse'),
             # spiderがたどるURLを指定
             Rule(LinkExtractor(), follow=True)
            )

    def parse(self, response:
```


## 原因
Callbackで読んでいるfunction名(parse)に問題があったみたい。
もしかしたら下記に書いてあるのかな？英語読めん。
https://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.spiders.Spider.parse


## 対応
function名を変更するだけでエンドポイントから順繰りスクレイピングしてくれるようになった。

```py
    # スクレイピングルール設定
    rules = (
             # スクレイピングするURLのルールを指定
             Rule(LinkExtractor(deny=deny_list,unique=True), callback='downloadPic'),
             # spiderがたどるURLを指定
             Rule(LinkExtractor(), follow=True)
            )

    def downloadPic(self, response):
```
PHPでURL文字列を解析・変更する（pear/Net_URL2）

## やりたいこと
PHPでURL文字列のポートとかパスとかを書き換えたい。

たとえば、 http\://localhost/hoge/moge というURLから、
http\://localhost:8888/hoge/moge を作ったりだとか、
http\://localhost/uge を作ったりしたい。

正規表現でぐりぐり弄っても良かったけれど……
可読性の低いコードになりそうだったので、今回はライブラリを探して利用してみることにした。

## 使ったもの
**pear/Net_URL2**
https://github.com/pear/Net_URL2

> Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.

スキーム、ホスト、パスなどの解析を行ったり、組み立てたりできる、便利そうなやつ。

## 使い方

### インストール
**Composer**にも置かれていたので、以下のコマンドでインストールした。

```bash
$ composer require pear/net_url2
```

### ソースコード

```url.php
// ライブラリの読み込み
require('vendor/autoload.php');


// 元となるURL文字列からインスタンスを生成
$url = new Net_URL2('http://localhost/hoge/moge');

// 情報を書き換える
$url->setPort(8888);
$url->setPath('/uge');

// http://localhost:8888/uge
echo $url->getURL();
```

## 参考
- composer入門  
http://qiita.com/milano/items/3c36d3dee16390de4ef2
- Net_URL2クラス  
https://pear.php.net/package/Net_URL2/docs/latest/Net_URL2/Net_URL2.html
Javaはもう学ぶ必要は無いのかどうか

#<i class="fa fa-cubes" style="font-size:1em;"></i> 自己紹介
ジーズアカデミーの4期生で卒業制作はライブハウスの生配信ができるサービスを作成。卒業制作発表会では実際に生配信をして時間が足りなくて、全くサービスの話ができないという、プレゼンでは絶対にやってはいけない事をしてしまった男です。
現在はJavaの開発現場で働いる新米エンジニアです。最近Javaの勉強をする機会が多く、今回はちょっと難しい印象のあるJavaについて簡単に書いてみたいと思います。

#<i class="fa fa-cubes" style="font-size:1em;"></i> Javaとは
この記事を読まれていてプログラミングに少しでも興味のある方であれば、「Java」というプログラミング言語をご存知の方も多いと思います。

現在主流であるオブジェクト志向の代表的な言語であり、Androidアプリ開発で採用されている言語としても知られています。
ちなみに、これから学ばれるという方は「Java Script」とは全くの別物なのでお気をつけ下さい。

Javaは90年代〜2000年代頃に主にWeb開発で主に用いられた言語で現在でも多くの開発現場で幅広く用いられています。

#<i class="fa fa-cubes" style="font-size:1em;"></i> Javaは古い？
前述の如く現在も幅広く使われているJavaなのですが、人によっては古ぼけた印象を持たれている人もいるかと思います。（逆に昔からC言語で開発をしている人からしたら新しいらしい）
近年スクリプト系の言語の台頭や他言語のライブラリ,APIの豊富さからスピード重視の開発現場ではあまりJavaは採用されていません。なぜなら、スクリプト系,Javaどちらも経験のある人ならわかると思うのですが、記述一つ一つが遠回しだったりするわけです。（逆にモダンと言われる言語は分かりやすく端的な記述）
人間に例えるなら、理屈っぽく全ての情報を伝えすぎて逆に伝わりづらくなってしまう理系の人間がJava、細かい情報は置いといて、とりあえず伝わればOK。コミュニケーションや連携重視の文系の人間がスクリプトといった具合でしょうか…

#<i class="fa fa-cubes" style="font-size:1em;"></i> なぜJavaは使われる？
ではなぜ遠回しなJavaはなんだかんだ未だに現役なのでしょうか。
それは大手企業などの資金源のある開発現場で今まで主に使っていた言語がJavaだから、というのが一つ。
もう一つは安全性。青色の銀行なんかでもシステムの問題がありましたし、大手企業は安全のためであればいくらでもお金を払う。結果効率の悪い手法でもより安全性の高い手法をとる結果Javaになるのでは？と自分の中で解釈しています。

#<i class="fa fa-cubes" style="font-size:1em;"></i> いわゆるWeb系の人はJavaはやらなくていいの？
ぶっちゃけ、起業をしたいとかって人はやらなくてもいいと思います。ただ、個人的な意見としては純粋にプログラミングを教養として学びたいという場合には是非やるべきというのが考えです。（C言語を学んできた人に怒られそうですが。。。）
とりあえず早く作りたい！って人はやる必要はないかも。
ただ、いろいろな言語をマスターしたい、という変人プログラマーを目指すのであれば是非やっておいたほうが良いと思います（笑）
なぜなら、オブジェクト指向の代表的な言語ということもあって、いろいろな言語がJavaの影響を受けて開発されています。
よく、プログラミング言語の習得に関して、横の移動は楽だと言います。はじめがJavaだと横の移動がしやすいそうです。（私は他の言語の経験が薄いためそこまで言えませんが・・・）
また、Javaの開発環境上で動くScala,jrubyといった流行りの言語もあるわけです。

#<i class="fa fa-cubes" style="font-size:1em;"></i> 結論
自分で変人の自覚がある人はJavaをやるべし！！それ以外はやらなくて良い！！
新米エンジニアが何言ってんだという感じですが、遠からず近からずな感じなのではないかと思います。

#<i class="fa fa-cubes" style="font-size:1em;"></i> Javaをやろう！！
回りくどくてめんどくさいやつかもしれないけど、愛してやまないファンが多い事も事実。
Javaなんて古いと言われ続けてもう何年も経つが、私の現場ではバリバリの現役。まだこれから先も使われ続ける事は間違いのない言語です。
ジーズでJavaをやっている人は少ないですが、Android開発でパフォーマンスを上げようと思うと避けては通れないJava。勉強するのも大変な言語だけど、それを乗り切ったらエンジニアとして一つレベルアップできるかも。
パスワードが平文で送られてきた

![image](https://qiita-image-store.s3.amazonaws.com/0/142397/bdc4caf2-1d1d-4f6d-4514-182e0c99fc99.png)


アプリの会員登録したら、登録したパスワードが平文で送られてきました :scream: 

アプリ名は本文内から分かるので、このメールをゲットできたらアプリをインストールしてログインすることが出来てしまいます。生年月日や住所、メールアドレスなどが見ることができます。。

**駄目なんだよ。** :rage:
って警報を鳴らしたい。

アプリの種類はお薬手帳で、薬局から薬と一緒に貰うQRコードを読み取って履歴を管理できるものです。ちょっと見たところ薬関連のアプリは沢山あったので流行ってるんですかね。

勝手な推測ですが、恐らくアプリの所有者はアプリやセキュリティの知識はなく、開発会社が仕様を決めたのかなと思いますが、酷すぎますね。実装したプログラマーも指摘するべきでしょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/142397/76cfb4f1-bedd-ab5a-6783-bdf67d526c3d.png)

↑ 知らない人に届いてしまうことを想定してるのになぜ気づかない！

きっとデータベースにも平文のまま保存されているはずです。
きっとこんな感じ

```
+-----------+-------------+
| login_id  | password    |
+-----------+-------------+
| userA     | password    |
| userB     | 11111       |
| userC     | 0000        |
...
```

**駄目なんだよ。** :rage:

不正にアクセスされてしまった場合でも被害を最小限にするために解読に時間が掛かるようにしておかなければなりません。どんな暗号化やハッシュ化しても時間があれば解読されてしまうことは注意してください。
例えば、パスワードとして `5f4dcc3b5aa765d61d8327deb882cf99` が保存されてたとすると、悪い人は直ぐMD5のハッシュ値だなと分かってしまいます。するとこのハッシュ値をもつ文字列を見つけるだけです。

```shell-session
$ echo -n 'password' | md5
5f4dcc3b5aa765d61d8327deb882cf99
```

パスワードの保存は、以下が一般的なので参考にしてもらいたい。
[PHP: 安全なパスワードハッシュ](http://php.net/manual/ja/faq.passwords.php)

上記を補足すると、ソルトキーをユーザー毎に用意してパスワードと共にハッシュ化します。さらにハッシュを数千〜数万の単位で繰り返し（ストレッチング）て解読を遅くする方法です。
ソルトキーでレインボーテーブル（パスワードとハッシュ値の対照表）攻撃を遅くして（ユーザー毎のソルトキーなのでユーザーごとにレインボーテーブルを準備しないといけないので）、さらにストレッチングでブルートフォース攻撃（総当たり攻撃）を遅くするというものです。

コンピュータの処理性能は日々進化しているので、本来であれば日々ストレッチング回数を上げて遅くさせる時間を一定に保つことがベストなのです。ですが現実は難しいのでPHPの文献にあるような標準の1024回（2^10）ぐらいで個人的には良いと思ってます。少ない！と思う人が居たらごめんなさい、、

最後に。
こんな大変なことをしてまで保存しなくてはならないパスワードをメールで簡単に送ってはいけません。

**駄目なんだよ。絶対に。** :rage: :rage:

追伸：
このアプリは改修検討してくれるそうです。直してくれる事を願ってます。 :bow:
設計やライブラリのせいでPeekを実装できなかった話

Peek＆Popを実装したかったのに、設計やライブラリのせいであきらめざるをえなかった話です。

## Viewは反転させないほうが良い
チャット画面のように、上に無限スクロールする画面を作る場合、上にデータを追加するたびにスクロール位置がずれてしまうので、なかなか実装がめんどうです。

[メッセージアプリのように UITableView に下詰めで\(下から順に\)表示する \- Qiita](http://qiita.com/takecian/items/11e80d62559adb6ba2be) を参考にViewを反転させる形で実装したら、コスト的にもパフォーマンス的にも良い感じに実装できました。

が、Viewを反転させるとPeekの挙動が変になってしまいました。具体的にはこうなります。（２のところが反転しています）

![peek&pop失敗.gif](https://qiita-image-store.s3.amazonaws.com/0/12352/1a2987c5-0df1-9b8e-8ed9-d0d5516f691d.gif)


頑張って反転中のViewを再度反転できないか試したんですが、うまくできませんでした。**なので、Viewを反転させるのはやめた方がよさそうです。**


## Method Swizzlingはやめた方がよい
https://github.com/icanzilb/EasyAnimation というライブラリを使うと、Peek時に左上から濃いグレーの領域が広がるという、変な挙動になりました。

![peek&pop_easyanimation.gif](https://qiita-image-store.s3.amazonaws.com/0/12352/8696f492-4e14-1567-dd60-4a0de784606e.gif)


おそらく、EasyAnimationがMethod swizzlingを使って、View系のメソッドを書き換えているためです。なので、**View系のMethod Swizzlingはやめた方がよいです。**


[Apple公式 アプリ改善のベストプラクティス \- Qiita](http://qiita.com/motokiee/items/31da03d7e8e40640410c#peek-pop-quick-actions%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86) にもあるように、全アプリがPeek&Pop実装することを目指すべきなので、技術選定の結果Peekをあきらめることにならないよう注意しましょう。
備忘録_ctags


ctagsを使おうとしたらエラーでtagファイルが作れなかった。
今回は解決したので未来の自分への備忘録

##ctags導入

下記のフローで導入。

```
brew install ctags
```

※ちなみに「ctags-5.8_1」をいれた

ここまでは問題なし

##tagファイル作れない・・・

下記コマンドを実行

```
ctags -R
```

下記のようになる

```
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ctags: illegal option -- R
usage: ctags [-BFadtuwvx] [-f tagsfile] file ...
```

ググった結果、aliasを貼ればいいらしいと気づく。

## 問題へ対応

aliasをはる

```
alias ctags="`brew --prefix`/bin/ctags"
```

## 解決

下記コマンドで無事にtagファイルができた。

```
ctags -R
```
fishとdvmを使い、.docker-version を参照してdockerのバージョンを切り替える

`cd`でディレクトリが切り替わったタイミングで`.docker-version`ファイルがあるかどうか調べ、存在する場合は`dvm use 1.x.y` のように所定のdockerクライアントにバージョンを切り替えたいという事があります。

fishのイベントハンドラを使って`PWD`変数が変更されたタイミングを補足すれば実現できそうです。まず、`funced __check_dvm`で適当な関数を作り、エディタを開き、以下のような関数を記述します。

```fish
function __check_dvm --on-variable PWD
  if test -f .docker-version
    source .docker-version
  end
end
```

あとは保存して閉じ、`funcsave __check_dvm` して fish を起動しなおせばok。`.docker-version`ファイルは中身を実行しているだけなので、

```
dvm use 1.12.3
```

のような中身にしておきます。
最大マッチング(PHP)

```php
	// maximum matching algorithm
	// unweighted bipartite graph
	// dfs hungarian algorithm

	function dfs($bigraph, $u, &$path, &$matching){
		foreach($bigraph[$u] as $v){
			if(!isset($path[$v])){		// not in path already
				$path[$v] = true;
				if(!isset($matching[$v]) || dfs($bigraph, $matching[$v], $path, $matching)){
					// not matching node, the path is agumenting path, switch path, and return true
					$matching[$v] = $u;
					$matching[$u] = $v;
					return true;
				}
			}
		}
		
		return false; 					// not agumenting path
	}
	
	function hungarian($bigraph){
		$matching = [];

		foreach($bigraph as $u=>$x){
			if(!isset($matching[$u])){	// not a matching node
				$path = []; 			// save the nodes in path
				dfs($bigraph, $u, $path, $matching);
			}
		}
		
		return array_intersect_key($matching, $bigraph);
	}

	// left node idx is key
	// right nodes is value
	// eg. left nodes: 0 - 4, right nodes = 5 - 9
	$bigraph = [0 => [6, 9], 1 => [7], 2 => [6, 8], 3 => [8, 9], 4 => [5, 7]];
	$r = hungarian($bigraph);
	print_r($r);
?>
```
javascriptでフォームの内容をいい感じにJSONにしてくれる関数作りました

---
###経緯
普通にGETなりPOSTなりしても良いのだけど、サーバー側でJSONで処理する事が増えてきたし、APIの通信テストページみたいなのをHTMLで作ってたら、こういうニーズが出てきました。
すごく局所的なニーズかなｗ

``` $("#form").serializeArray(); ``` でも良かったんだけど、これだと

・チェックの入っていないチェックボックスが取得できない（パラメータ数が変わってしまう）
・```{name:"aaa", value:"bbb"}```　形式が使いにくい（APIテストとしては、入力形式が変わってしまう）
・multipleのselectboxで同じnameのパラメータが複数送られてしまう

という問題があったので、
```{param1:"val1","param2":"val2",}```
となるような関数を作ったのです。

ネットでググると、```$("#form").serializeArray();``` した後に、ループで回してるのが多かったのですが、multipleのselectboxがArrayで入ってくるように対応したかったので、まとめて一つの機能にしてみました。

###ソース

```javascript
/**
 * フォームの内容を成形されたJSONにして返す
 * チャックボックスは空白ならfalse としてパラメータに追加
 * 
 * @param	{Jquery}		form			フォームオブジェクト
 * @param	{Boolean}		isReturnArray	戻り値を配列にするか 無指定でfalse
 * @returns	{Array|String}	JsonのStringかArray
 */
function formToJson(form,isReturnArray){
	isReturnArray === undefined ? false : isReturnArray;
	var inputs = form.find('input,select,textarea');
	var inputValues = {};
	inputValues['form_id'] = form.attr('id');
	inputs.each(function (){
		var type = $(this).attr('type');
		var tag = $(this).prop('tagName');
		var name = $(this).attr('name');
		var checkd = $(this).prop("checked");
		if(tag === 'SELECT'){
			var options = $(this).find('option');
			inputValues[name] = [];
			options.each(function(){
				var checkd = $(this).prop("checked");
				var selected = $(this).prop("selected");
				if(checkd || selected){
					inputValues[name].push($(this).val());
				}
			});
		}else if(type === 'checkbox' ){
			inputValues[name]=checkd;
		}else if(type === 'radio'){
			if(checkd){
				inputValues[name]=$(this).val();
			}
		}else{
			inputValues[name]=$(this).val();
		}
	});
	
	if(isReturnArray){
		return inputValues;
	}else{
		return JSON.stringify(inputValues,null,2);
	}
}
```

こんな感じです。
大した出来でもないのですが、自分が今後も使いそうなので、投稿しておきます。


---
Mithrilで選択されるたびにもとに戻る<select>

選択されると、要素を作るUIが作りたいとします。本来は、その要素数分、ボタンを並べれば良いのですが、スペースの関係でボタンを隠しておきたい場合があります。CSSをがんばるのもあれなので、コンボボックスにしておいて、それが選択されたらボタンが押されたようにふるまうようにしてみようと思います。

例えば、シムシティで、序盤のチュートリアルからよく使う「住宅地区」「商業地区」「工業地区」「警察」「消防」「発電所」「道路」あたりは専用のボタンを置いておくとして、ちょっと大きくならないと使わない娯楽施設系も全部表示されていると邪魔ですよね。そういうあまり使わない建物を隠しておく感じのUIです。

* [今回のサンプル](https://jsfiddle.net/shibukawa/ge023qgv/1/)

## だめな例

``<option>``タグの``selected``属性が選択されている``<option>``を表すので、先頭要素だけ常にtrueならいけるでしょうか？シムシティを例にあげといてなんですが、スーパーファミコン時代のしかやったことがなくて詳しくないので[名前の一覧はここ](http://simcitybuildit.wiki.fc2.com/wiki/%E5%A8%AF%E6%A5%BD)を参照しました。

```js
const labels = [
    '(娯楽施設建造)',
    'ホテル', '円形劇場', 'エキスポセンター', 'グローブ座', 'スタジアム',
    'シドニー・オペラハウス', '観覧車', '相撲会館', 'オスロ・オペラハウス'];	

return m('select', {
    onchange: m.withAttr('selectedIndex', ctrl.selected),
}, labels.map((label, index) => {
    return m("option", {selected: index === 0}, label);
}));
```

コレではダメです。というのも、表示後にユーザが操作すると、実際のDOMの選択状態が変更されるだけで、仮想DOM上はMithrilが「先頭要素が選択されている」と思い続けている状態になります。そのため、再更新が走ったとしても、「変更がない」と判断されてしまいます。

## OKな例

次のような関数を作り、実DOM上でインデックスをリセットすればOKです。

```js
function resetIndex(element, isInitialized) {
    if (isInitialized) {
        window.requestAnimationFrame(() => {
            element.selectedIndex = 0;
        });
    }
}
```

```js
const labels = [
    '(娯楽施設建造)',
    'ホテル', '円形劇場', 'エキスポセンター', 'グローブ座', 'スタジアム',
    'シドニー・オペラハウス', '観覧車', '相撲会館', 'オスロ・オペラハウス'];	

return m('select', {
    onchange: m.withAttr('selectedIndex', ctrl.selected),
    config: resetIndex
}, labels.map((label, index) => {
    return m("option", label);
}));
```

## これはバグではなくて規定の動作

さて、これはバグでしょうか？そうではありません。Mithrilはある程度の実DOM上だけの状態は仮想DOMと切り離してそのまま放置しています。そうでなければ、テキスト入力フォームが毎回再生成されてしまいます。IMEがONの状態で入力中のテキストなどはJavaScriptで取得したり復元したりはできないため、仮想DOMの再生成が厳しく行われると困ったことになってしまいます。そのため、これはこれでいいのです。
symfonyのデモをバージョン2.7で始める

#symfonyのデモをやろうとしたら、バージョンが最新でつまづいた
デモアプリのインストールが完了したので、php app/check.phpを実行すると
could not open input file: app/check.php　のエラー。

どうやら、でもアプリのバージョンが最新だとcheck.phpファイルはないらしい。

そこで[このサイト](http://juku90.com/post-1934/)を参考にデモアプリを入れ直した。
私が読んでいる本と同じバージョンの2.7で。

参考サイトのコマンドが一箇所間違えているので、注意。
(4)のところの[php composer.phar install –no-interaction]は[php composer.phar install –-no-interaction]です。

で、でもアプリもインストール完了したので、php app/check.phpを実行。
エラーが出る。
php.iniファイルのtimezone設定ができてないとのこと。

##php.iniはどこにあるのか？
macかlinuxであれば、php -i | grep php.iniで場所がわかる。
/etc/php.iniと出る。
探せど探せど、そんなフォルダは見つからない。

が、finderで/etcに移動すると、見つかった。
timezoneを修正して、php app/check.phpを実行する。
okの文字。。。。。。

完成です
プロセスの自動再起動を超お手軽に

長いスクリプトをずっと回していたい時がある。例えば以下のように、ずっと起動しっぱなしにしたいスクリプト。

```rb:script.rb
while true do
  # ここで何か処理
  sleep(10) # 10秒おきに
end
```
ただ、rubyが何かの例外でとまっちゃうと処理が終わっちゃう。プロセスIDを監視して再起動って手も有るけど、大げさ。

そこで、処理が中断したら、もう一回起動するように、シェルスクリプトで覆ってあげればいい。

```sh:loop.sh
#!/bin/sh
while :
do
  ruby script.rb
  # ここで落ちちゃったよ！ってメールを送る
  sleep 1s
done
```
数値をフォーマッティングして表示する


doubleなどの数値をフォーマッティングした文字列を表示する方法です。

```java
String.format("%1$,.0f" + " KB中、" + "%2$,.0f"+ " KB処理しました。" + "%3$,.0f" + " %%処理完了", 
a / 1024.0, b / 1024.0,  c / 1024.0);
```

なかのプレースホルダは、それぞれ

```java
%1$ -> a / 1024.0
%2$ -> b / 1024.0
%3$ -> c / 1024.0
```

って可変長の引数に対応。さらに

```java
,.0f
```

で、「３ケタでカンマ区切り」「小数点以下は０ケタ」って意味。


ちなみにフォーマット内で%を使う場合は、上記のように%%ってエスケープ。。
C++ Builder XE4, 10.2 Tokyo > TStopwatchを使った経過時間の表示

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

イベント開始後の経過秒数を表示したい。

TStopwatchを使ってみた。

参考 http://www.gesource.jp/programming/bcb/110.html

- 以下が必要
  - `#include <System.Diagnostics.hpp>` //
  - `#include <TimeSpan.hpp>` //

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>

#include <System.Diagnostics.hpp> //
#include <TimeSpan.hpp> //
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TTimer *Timer1;
	TLabel *Label1;
	TButton *B_start;
	TButton *B_stop;
	void __fastcall Timer1Timer(TObject *Sender);
	void __fastcall B_startClick(TObject *Sender);
	void __fastcall B_stopClick(TObject *Sender);
	void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:	// ユーザー宣言
	TStopwatch m_stopwatch;
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	m_stopwatch = TStopwatch::Create();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
	int elpsd_sec = m_stopwatch.ElapsedMilliseconds / 1000;

	String msg = IntToStr(elpsd_sec);
	Label1->Caption = msg;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_startClick(TObject *Sender)
{
	m_stopwatch.Reset();
	m_stopwatch.Start();

	Timer1->Interval = 1000;
	Timer1->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::B_stopClick(TObject *Sender)
{
	Timer1->Enabled = false;

	m_stopwatch.Stop();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
	m_stopwatch.Stop();
}
//---------------------------------------------------------------------------
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e6cf9576-64a8-9706-9ce0-17db943aaa89.png)

m_stopwatchという１つのインスタンス変数で管理できるのは利点かもしれない。
MySQL5.7におけるPerformance_Schemaのメモリ消費量

最近知った知識を忘れないようメモに残そうのコーナー。

#### 【 導入 】

https://yakst.com/ja/posts/3784

上記のURLにある通り、MySQL5.7からPerformance_Schemaは動的にメモリを確保、つまり必要になったら
必要な分だけ追加でメモリを使うようになりました。この機能により、下記2つの課題が解消されました。

> ・インストゥルメントのインスタンスがあまり使われないと、確保されたメモリの多くが利用されないままとなる
> ・ メモリ確保が十分でない状態で、インストゥルメントのインスタンスが多く使われると、パフォーマンススキーマの追加の統計情報が失われはじめる

ただし、逆に「Performance_Schemaが際限なくメモリを消費する可能性がある」という懸念も生じます。
そこで、Performance_Schemaの消費するメモリを制限する方法を調べました。

#### 【 内容 】

Performance_Schemaが使用するメモリを制限するためには、以下のマニュアルに記載されたパラメータ変数の
設定を変更することが有効です。

https://dev.mysql.com/doc/refman/5.7/en/performance-schema-memory-model.html
> ・ performance_schema_accounts_size
> ・ performance_schema_hosts_size
> ・ performance_schema_max_cond_instances
> …（中略）…
> ・ performance_schema_max_table_lock_stat
> ・ performance_schema_max_thread_instances
> ・ performance_schema_users_size

上記の変数のデフォルトは「-1」（auto-scaled）になっています。これにより、メモリが必要に応じて動的に確保されるみたいです。

もし、Performance_Schemaの消費メモリを制限したい場合は、これら変数の設定値を「-1」以外の固定値にすれば、それが上限値となります。色々な設定値に変更しながら、ベストな値を探す形になるのかなー、と思います。

※ どうやらMySQL5.6では、「-1」 ＝ 「auto-sized」 を意味しており、起動時に自動的に設定値を決定する挙動だった模様

#### 【 余談 】

「performance_schema_max_memory_size」 のようなパラメータ変数が存在すれば楽なのに、と思ったりする今日この頃。そもそも、MySQLのバージョンが上がるにつれて Performance_Schema の消費メモリ量自体少なくなっているので、メモリが極端にカツカツな環境で動かすな、という話ですね…。
CordovaのAndroidアプリでアイコンやスプラッシュ画面を変更できなかった件

ハイブリッドアプリを開発するためにCordovaを使っていますが、Androidアプリをビルドする際に、アイコンやスプラッシュ画面の画像を変更できずにハマってしまったのでメモを残します。

## 環境
環境は以下の通りです。
- cordova: 6.4.0
- cordova-android: 6.0.0
- cordova-plugin-splashscreen: 4.0.0

## 事象
Cordovaでアイコン画像やスプラッシュ画面の画像を変える方法は色々な所で書かれています。

基本的には、`res/`配下のディレクトリに自前のアイコンや画像を配置し、config.xmlにファイルのパスを記載し、buildすれば`platforms/android/res`配下のディレクトリに反映されるという流れです。

ところが、iOSでは公式サイトなどの記事を参考にすれば簡単に変更できたのですが、Androidではどうやっても自前の画像が`platforms/android/res`配下のディレクトリに反映されませんでした。

## 結論
結論から言うと、まさに該当の事象がissueに上がっていました……

Custom app icons and splash screens not working in cordova-android v6.0.0
https://issues.apache.org/jira/browse/CB-12077

cordova-androidの6.1.0で修正されたとのことなので、以下のようにcordova-androidをアップデートしたらすんなり反映されました。

~~~
cordova platform update android@6.1.0 --save
cordova platform rm android
cordova platform add android
~~~

疲れた……
Node.jsとExpressを導入して、とりあえずサンプルページを表示するまでにやったこと。

CentOS6.4にNode.jsとExpressを導入して、サンプルページを起動するまでにやったことをメモとしてのこします。

とりあえず動かすだけなので特殊な訓練を受けたスタッフがrootで実行しています。
良い子はマネしないでください。

## Node.jsのインストール

[node.jsをyumでインストールする(centos6.5)](http://qiita.com/you21979@github/items/4efd9fc4363573191b5c)
こちらの記事を参考にインストール。
私の環境には既にg++が入っていたのでインストールを省略。

- リポジトリを追加します 

```
# yum install epel-release
```

- node.jsをインストールします

```
# yum install nodejs npm --enablerepo=epel
```

- npmをインストールします

```
# yum install -y npm --enablerepo=epel
```

- プロジェクトフォルダを作成します

```
# mkdir プロジェクトディレクトリ; cd $_
```

- node.jsのプロジェクトファイルを作成します
 
```
# npm init
name: (Hogehoge) Hogehoge
Sorry, name can no longer contain capital letters.
name: (Hogehoge) hogehoge
version: (1.0.0)
description: Fugafuga
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
```
※nameに大文字は使えないそうです。
サンプルページを表示するだけが目的なので、上記のように適当なカンジで入力。

- プロジェクトファイル(package.json)の確認

```
# ls
```
package.json があることを確認します。



## Expressのインストール

Expressはnpmをつかってインストールします。
上で作ったpackage.jsonが存在するディレクトリで作業します。

- Expressをインストール

```
# npm install express --save
```

- Expressで利用するディレクトリやファイルを作る

```
# express -e ExpressSample
```

- ディレクトリやファイルが作られているか確認する

```
# ls
app.js  bin  package.json  public  routes  views
```

## サンプルの起動

- app.jsを実行する

```
# node app.js

module.js:340
    throw err;
          ^
Error: Cannot find module 'serve-favicon'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/var/www/html/Hogehoge/app.js:3:15)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
```
無事、怒られる。

そもそも

```
# node app.js
```

ではなく、

```
# node bin/www
```

で実行できるらしい。

- 見つからないモジュールがあるようなので、不足しているモジュールをインストールする

まずは不足モジュールを見つけてくれる便利なヤツをインストール

```
# npm install npm-install-missing -g
```

そして不足モジュールをインストール

```
# npm-install-missing
```


- 改めてサンプルを起動

```
# node bin/www
GET / 200 40.421 ms - 207
GET /stylesheets/style.css 200 11.732 ms - 111
```
無事、起動。
デフォルトではlocalhost:3000で起動するようです。

## ブラウザで表示してみる
上の手順はあくまでサンプルページの起動でした。
他の環境からアクセスしてページを表示させてあげるには、httpサーバを利用する必要があります。

特殊なことはなにもなく
1. httpdのインストール
2. httpd.confにVirtualHostを追加
3. VertulHostでポート80へのアクセスを127.0.0.1:3000へプロクシ
4. httpdの起動
とかやってあげれば適当に見れるはずです。
※iptablesを設定している場合は、ちゃんと穴をあけてください。
※このあたりは別にnginxでもApacheでもアクセスを受け付けることができればなんでもよい。（今回は表示するだけなので）


- ブラウザでアクセスしてみる

node.js+Expressの環境を構築したサーバのIPアドレスをブラウザに入力する。

きっと

```
Express

Welcome to Express
```

って表示されるはず。


以上。
Elmのライブラリの探し方

# 概要
ただ目についたライブラリを少しまとめてあるだけの内容でしたが、初心者向けにライブラリの探し方にしてみました

## [Elm Package](http://package.elm-lang.org/)
Elmで開発を始めるときelm-makeで基本的なパッケージ(coreとか)はinstallされます。
他のライブラリは```elm-package install author-name/package-name```でinstallできます

ライブラリを探すときは[Elm Package](http://package.elm-lang.org/)で探しましょう。検索できます
elm-langなどのライブラリはPopular Packagesとして右に出てます

右上にリンクがある[Fancy Search](http://klaftertief.github.io/elm-search/)では型で検索できます
例えば"Color -> String"と検索するとeskimoblood/elm-color-extraのライブラリの中のcolorToCssXX系の関数が出てきます
すごい

なにかあるかなーと探していると面白いです。
以下では使ってたり気になったりしたライブラリを適当にすこしまとめました。

## [etaque/elm-response](http://package.elm-lang.org/packages/etaque/elm-response/latest)
使ったことある

```.elm
type alias Response model action = ( model, Cmd action )
```

initやupdateの値をaliasして、便利に使えるも関数を提供している

```.elm
model ! [] == model |> withNone
```

|>で繋げてwithTask, withCmd, withNoneするだけ。

## [eeue56/elm-flat-matrix](http://package.elm-lang.org/packages/eeue56/elm-flat-matrix/latest)
常にマス目を作りたいのでこれを使っている。
使いにくいとかはないけど、これじゃなきゃダメ感はないので自分用に作ってみるのもありかもしれない。

```.elm
type alias Matrix a = 
    { size : (Int, Int)
    , data : Array a
    }
```

sizeを持った1次元の配列で2次元を作っている。
0.18への対応がすごく早かった気がする

## [elm-lang/navigation](http://package.elm-lang.org/packages/elm-lang/navigation/2.0.1/Navigation)
elm-langだし、わざわざ紹介するまでもないのだけれど。

```.elm
program
    :  (Location -> msg)
    -> { init : Location -> (model, Cmd msg), update : msg -> model -> (model, Cmd msg), view : model -> Html msg, subscriptions : model -> Sub msg }
    -> Program Never model msg
```

locationが変化したらmsgを投げれるようになったprogram
わかりやすいなーと思った。

## [eskimoblood/elm-color-extra](http://package.elm-lang.org/packages/eskimoblood/elm-color-extra/latest)
色をCSS用に変換するためだけにいつも使っている
自分で変換用の関数作れ感は否めない

## [elm-community/random-extra](http://package.elm-lang.org/packages/elm-community/random-extra/latest)

乱数生成はとても大事。choicesで自分で定義したユニオン型の中から1つ選ぶとか、combineでGeneratorのListをListのGeneratorにするとか。
Random.ColorやRandom.Dateもあるので自作する前に探そう。

randomに限らずelm-communityのpackageにはxx-extraがいっぱいあるのでcoreで機能足りないときはまず探すようにしています

## [Fresheyeball/elm-nearly-eq](http://package.elm-lang.org/packages/Fresheyeball/elm-nearly-eq/latest)

ニアリーイコール。数値計算するときに

この記事のテーマを書くことに決めたきっかけになったライブラリです。アドベントカレンダーどうしようって考えてたとき、見てちょっとまとめてみようかなって。
シンプルで特定用途にでもいいから使えるライブラリを作って出したい

# まとめ
Elmのライブラリはいっぱいあります
こないだ0.18にupgradeしたところですけど対応がすごく早いなって思いました。

package周りも使いやすい（他のはぼ使ったことないですが）のでElmいいよElm

よいElmライフを～
marginの上下・左右だけを一行で指定するMixin

## CSSのショートハンド仕様の疑問点

CSSを使ったレイアウトにはmargin/padding/borderなどボックスモデルに関するプロパティが欠かせませんが、標準で用意されている短縮記法（ショートハンド）では「上下だけ」や「左右だけ」を簡潔に指定する方法がありません。

```css:example01.css
.example01 {
  margin: 10px;                /* 上下左右 */
  margin: 10px 20px;           /* 上下 左右 */
  margin: 10px 20px 30px;      /* 上 左右 下 */
  margin: 10px 20px 30px 40px; /* 上 右 下 左 */
}
```

（参考: [ショートハンドプロパティ \- CSS \| MDN](https://developer.mozilla.org/ja/docs/Web/CSS/Shorthand_properties)）

これらのショートハンドは4辺のプロパティを一度に指定するため、必要以上に"0"の記述が増えたり、レスポンシブデザインのサイトでは重複指定が発生しやすい点が個人的に気になっていました。

```css:example02_with_shorthand.css
.example02 {
  margin: 10px 0; /* 左右に無駄な"0"の指定 */
}

@media (min-width: 768px) {
  .example02 {
    margin: 10px 20px; /* 上下の値が上書きされるため重複が発生 */
  }
}
```

```scss:example02_without_shorthand.scss
.example02 {
  margin: {
    top: 10px;
    bottom: 10px; // 値が上下で分かれるのが不便
  }
}

@media (min-width: 768px) {
  .example02 {
    $spacing: 20px; // 変数化すると行数が増える
    margin: {
      left: $spacing;
      right: $spacing;
    }
  }
}
```

## SassのMixinを使った試案

Sass（SCSS）を使うと任意のプロパティを組み合わせてMixin化できるため、「上下だけ」や「左右だけ」のmarginをピンポイントで指定するためのMixinを作ってみました。

```scss:example03.scss
@mixin margin-row($top: 0, $bottom: null) {
  margin: {
    top: $top;
    bottom: if($bottom != null, $bottom, $top);
  }
}

@mixin margin-column($left: 0, $right: null) {
  margin: {
    left: $left;
    right: if($right != null, $right, $left);
  }
}

.example03 {
  @include margin-row(10px); /* 無駄な"0"の指定が必要ない */
}

@media (min-width: 640px) {
  .example03 {
    @include margin-column(20px); /* 上下の値は上書きされない */
  }
}

@media (min-width: 1024px) {
  .example03 header {
    @include margin-row(30px, 40px); /* 上下別の値も一度に指定可能 */
  }
}
```

同じパターンでpadding/borderなど任意のプロパティの組み合わせをMixin化することもできます。

```scss:example03.scss
@mixin padding-row($top: 0, $bottom: null) {
  padding: {
    top: $top;
    bottom: if($bottom != null, $bottom, $top);
  }
}

@mixin padding-column($left: 0, $right: null) {
  padding: {
    left: $left;
    right: if($right != null, $right, $left);
  }
}

@mixin border-row($top: none, $bottom: null) {
  border: {
    top: $top;
    bottom: if($bottom != null, $bottom, $top);
  }
}

@mixin border-column($left: none, $right: null) {
  border: {
    left: $left;
    right: if($right != null, $right, $left);
  }
}
```
INSERT IGNORE INTO の実現


目からうろこ

CIの Active Record クラス でサポートされていない INSERT IGNORE INTO を実現する方法

```php
$insert_query = $this->db->insert_string('TABLE_NAME', $array );
$insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query);
$this->db->query($insert_query);

```

これって他にも転用できますよね、いいかどうか別として。
Selenium つれづれ2016

去年の記事をテンプレートに今年版を書いてみます

#公式

何は無くともとりあえず本家
http://www.seleniumhq.org

## Webdriver

今年の最終バージョンは　3.0.1。
2014年に「クリスマスにリリースって言ったけど、いつのクリスマスかは言ってなかったよね」ってなコメントが出てきて驚かされたけど、無事リリース


サードバーティー製のドライバー「（仮称）ジャスタウェイ」についてはいずれもVer.3に対応してきましたね。

Selenium3からは　FireFoxも　ドライバーを自前で用意する必要があるので
それぞれが更新されているかをチェックする必要がありますね

[Seleniumでブラウザーと一緒に用意しなきゃいけないアレの更新がめんどいのをどうにかしよう](http://qiita.com/hiroshitoda/items/8bb1c6a8947c80e275cc)


w3cに出されている　web driverのステータスはworking draftで去年と同じですが更新はされていますね
http://www.w3.org/TR/webdriver/



## safari driver
Firefox Chrome IE についてはそれぞれドライバーが用意されていますが Safariについては　Ver.10から標準実装されているので特にダウンロードする必要はなく、設定すればOKですね



##SeleniumIDE

SeleniumIDEは　2.9.1。
よくよく見ると、去年と同じ！！
こちらの記事にありますが[Selenium IDEはこの先生きのこるのか](http://qiita.com/hiroshitoda/items/7903c07b076e1d394e5f) 
WebExtensions化で　Ver3.0.0になってくれるかなぁ・・・・・

##SeleniumBuilder

ガツガツ更新されているわけではないですが、機能的に安定して使えるところまで来てますか？？？
https://github.com/SeleniumBuilder/se-builder/graphs/commit-activity


## appium
1.6.2が最新バージョン
http://appium.io

つい最近Appium Essentialsが翻訳されて「実践Appium」が出ましたね


##selenese-runner
selenium3に伴い大きく変わった点に　seleniumRCがサポートから外れたことがあります。
これまで　seleniumIDEで記録したテストケースをコマンドラインから実行するといった場合（Jenkinsで実行する場合などですね）SeleniumRCモードで実行していましたがこれからは、これに頼ることになるのではないかと。こちらも今後の対応が気になるところです。
　
https://github.com/vmi/selenese-runner-java/releases/tag/selenese-runner-java-2.13.0

## selendroid

selendroidは　0.18　こちらは　単発で使うよりも　Appiumから呼び出されるシーンの方が多いでしょうし対応機種も減ってくるでしょうからそろそろ開発は止まるかもしれませんね
http://selendroid.io

## SeleniumBasic(旧SeleniumVBA)

　v2.0.9.0ですが最後の更新が３月で　対応も　2.52.0で止まっていますね
同様のツールたちは Ver.3にどう合わせていくのでしょうかね？？？
http://florentbr.github.io/SeleniumBasic/

##selenide
Java用のwebdriverラッパーですね
最近なんとなくよく使われている感（あくまで個人的な印象です）　v４．１ですね
http://selenide.org/

## Geb

ついに　1.0にバージョンアップ!!
http://www.gebish.org

今年は　G*ではなく、単独でアドベントカレンダーも建ってますね
[Geb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/geb)



# コミュニティー

## SeleniumConf

今年のカンファレンスは6月にインド、開催でした。
http://2016.seleniumconf.in/

１１月には　ＵＫで開催でしたね
http://2016.seleniumconf.co.uk/
こちらは日本からも参加された方がいらっしゃるようなのでお話が聞けるとうれしいですね

##日本Seleniumユーザーコニュミティー
12月18日に第４回の勉強会が開催です
すでに定員オーバー状態ですが、いろいろなお話が聞けそうですね
[第4回 日本Seleniumユーザーコミュニティ勉強会](https://seleniumjp.connpass.com/event/45208/)


## slackチャンネル

こちらも　回を重ねて今年も　
第9回Selenium 談話会 in Slack (みんなで集まってしゃべろうの会)
が開催されていろいろな話題が飛び出しましたね
https://seleniumjp.slack.com/


#周辺ツール
##pitalium

公式に「マルチデバイスを対象としたWebアプリ開発におけるリグレッションテストを自動化・省力化するためのライブラリ」とあります。「スクリーンショットを取得して、期待結果と画像比較」とあるので、seleniumではテストしにくいと言われている見た目の変更部分に対応できそうですね。
テストの実行結果をブラウザ上で一覧できる補助アプリケーション「Pitalium Explorer」も魅力的。

　Ver 1.1.1が最新版ですね。

https://www.htmlhifive.com/conts/web/view/pitalium/



#書籍
今年は　　２月に　実践的な内容となる　良書がでましたね。

- Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

１１月に出たのがこちらですね

- 実践 Appium 

# えーっと

以上、seleniumについて、つれづれに書いてみました。
複数人へAPIな仕組みを展開する時にMilkcocoaで手軽に行えた話

この記事は<a href="http://qiita.com/advent-calendar/2016/milkcocoa" title="Milkcocoa Advent Calendar 2016 - Qiita" target="_blank">Milkcocoa Advent Calendar 2016</a>の9日目の記事です。

複数人へAPIな仕組みを展開する時にMilkcocoaで手軽に行えた話を書きます。

# 使った状況 :pencil: 

<a href="http://www.1ft-seabass.jp/memo/2016/11/14/mojowaraku2016-fukuoka-event-report/" title="明星和楽2016というイベントでTokyo IoT Devチームとして展示してきました – 1ft-seabass.jp.MEMO" target="_blank">明星和楽2016というイベントでTokyo IoT Devチームとして展示</a>してきたときに使った手法です。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/d9192b8a-2c50-1861-761d-3da24e2faa73.png)

このようにハッシュタグの盛り上がりを検知して、複数人がそれぞれ担当する展示物（デバイス）に対して、ツイート検知した反応を伝えるという状況でした。

# 悩んだところ :thinking: 

今回、悩んだところとしては

* お互いがそれほど時間が取れない状況だったので接続だけでトラブルという状況は避けたく手軽な接続にしたい
* ツイート検知は該当ハッシュタグのツイートの流量によって変わるので随時レスポンスは変えたい
* 中のデータも当日まで変わることがあり得るので変更しても流しやすいようにしたい
* デバイスと親和性の高い通信方法を使いたいがどの程度か読めないので柔軟に対応したい

といったところで悩んでいました。

# 最初やろうとしたこと :runner: 

上記の図の通りで、HerokuサーバーからWebSocketを立ててDynoを増強して対応する富豪的な実装を考えました。

ただ、これは結局、HerokuサーバーでWebSocketが立つので集約的になりすぎて、ちょっとの変更でも影響が出そうというところと、仮に本番前に一度接続がうまく行っても「あ、こういう風にしよう！」とあとあと変更が起こった時に、このように集約してるがゆえに、受け手が影響が出やすそうな印象でした。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/7bb24c46-6b88-94f3-d6cf-b14034d2c985.png)

# 実際どうしたか :coffee: 

結局、考えついた手法が

**「各個人のMilkcocoaのアプリIDに対してHerokuサーバーから投げてやる」** 

ことでした。

図にするとこういうことですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/64b6a7a6-3c51-7cd4-7c32-a269dffcc4a1.png)

# 良かったところ :ok_hand: 

当日へ向けてこのやり方はやりやすかったです。

良かったところを挙げると、

* 一番気をつかう最初の疎通という点でも、Milkcocoaのつなぐナレッジに寄せることが出来るので「なんかWebSocketサーバーにつながらないっぽいです」的なことが避けれた
* Herokuサーバーはただ投げるだけになるので（1日展示レベルでは）負荷を気にせずにデータを決めたり作り込んだり制作に集中できた
* Milkcocoa以降のデバイスへの流し方に関しては、それぞれの実装に任せられて切り分けがわかりやすかった
* Milkcocoaが中間に立つので送受信が調子悪い際もモニタリングできるので検証がしやすかった
* Milkcocoaのリクエスト数の管理を個々のアプリIDに任せられるので無料プランの制限にハラハラしなくなった

といったところで、おもに切り分けがしやすくつなげやすいMilkcocoaの良さが発揮された印象です！

# 困ったところ :confounded: 

一応、困ったところも上げておきます

* Milkcocoa依存になるので当日Milkcocoaサービスが落ちないか祈ることになってしまう
* 同様の理由で当日までMilkcocoa障害に過敏になってしまう
* Milkcocoaでデバイスを一斉に動かすのが楽しくなってしまい、今は一旦閉じているアップグレードで展示時のみ増強したくなってしまう

いやー困りましたね :crying_cat_face:

（2016/12/09現在）

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/0f3dc7c9-e2f0-7828-a304-5e13163b5ae1.png)

おそらく、いまは課金フローなど様々兼ね合いで調整中だと思うんですが、アップグレードが早く復活してほしいと切望しております。

# さて、次回のアドベントカレンダーは…

[Milkcocoa Advent Calendar 2016](http://qiita.com/advent-calendar/2016/milkcocoa)も明日で10日目。

書いてくれるのは、手軽にIoTできるフリスクサイズのIoTデバイス<a href="http://nefry.studio/" title="Nefry - フリスクサイズのIoTデバイス" target="_blank">Nefry</a>をはじめ、MilkcocoaとつながるCocoaBitなど様々なデバイスを作られMilkcocoaとつなげる @wamisnet さんの「Milkcocoaであそぶよ！」です！