OmniAICreator/Qiita-1.07M huggingface dataset:
webフロントエンドの速度改善に取り組んでみた話

この記事は Retty Advent Calendar 10日目です。
昨日は桑原さん(@kuwahara_yusuke)の [TODOは「覚えない！」デキる人ほどやっているTODO管理法「GTD」と、その応用法とは？](http://qiita.com/kuwahara_yusuke/items/37770bd66991f0517269) でした。

こんにちは！Rettyでエンジニアをしている草山です。
先月はUX向上やSEOのためにフロントエンドの観点で速度改善に取り組んでいました。
簡単にではありますが、そこで得た知見を共有させていただきたいと思います。

## 調査方法

### PageSpeed Insights
https://developers.google.com/speed/pagespeed/insights/?hl=ja
Googleが提供しているパフォーマンス計測ツールです。
測定した結果をスコア付けしてくれて、改善案も提示してくれるのでとても重宝します。まずはこのツールを使って現状を把握してみました。

![insights.png](https://qiita-image-store.s3.amazonaws.com/0/88427/b0cefc44-666f-703d-d038-0644074c56ef.png)

今回の改善では、提供されているAPIを使用して定期的にスコアの変動を観測できる仕組みを作りました。改善の成果が目に見えるようになりモチベーションが上がったり、他の施策の影響によるスコアの下落をいち早く気づけるようになるのでオススメです。
https://developers.google.com/speed/docs/insights/v2/getting-started

### Google Analytics
https://support.google.com/analytics/answer/1205784?hl=ja
GAでも平均読み込み速度であったり、平均ダウンロード時間など速度に関する様々な指標を確認することができます。
当然フロントエンド以外の領域の影響も大きい数値ですので、ここからボトルネックの特定や改善後の効果検証をすることは難しいです。しかし実際にサービスを利用していただいているユーザーさんの状況を把握するためにもチェックしておいた方がよいかと思います。

### ブラウザ
ブラウザの開発者向けツールを使うことで実際にHTTPリクエストとレスポンスの状況を確認することができます。下記、画面はGoogle ChromeのNetworkパネルの様子です。

![inspector.png](https://qiita-image-store.s3.amazonaws.com/0/88427/96fa364b-f95a-bad7-8345-e56dafa9472f.png)

ここを確認することで、ボトルネックとなっているリソースを特定することができます。
先に紹介したツールを使って大まかに状態を把握したのち、ブラウザで詳細な調査をすると進めやすかったです。

## やったこと

### 画像サイズの調整と圧縮
必要以上に大きな画像を読み込んでいる箇所が多々あったので、適切なサイズの画像を読み込むよう修正しました。また、メタデータなどを削除していないなどの未圧縮の画像を圧縮しました。

### 共通画像のスプライト化
多くのぺージで共通して使われるような画像(アイコン画像など)は、画像サイズよりもHTTPリクエスト自体のコストが高いです。 複数の画像を1枚画像としてスプライト化して、HTTPリクエスト数の削減をしました。

![sprite.jpg](https://qiita-image-store.s3.amazonaws.com/0/88427/45fff629-7568-b502-4086-22eb7134615d.jpeg)

### ブラウザキャッシュの期間を調整
多くのぺージで共通して使われており、変更の可能性が少ないリソースに関してはブラウザキャッシュが有効です。PageSpeed Insightsでもブラウザキャッシュの未指定、1日以下の短い期間が設定されている場合は減点対象となります。

なお、外部サイトのリソースを読み込んでおり、自分でキャッシュの設定をコントロールできない場合もあります。もしそれが影響でPageSpeed Insightsのスコアにノイズが入ってしまい計測しづらいという場合はfilter_third_party_resourcesオプションを付けることで外部サイトのリソースを除いたスコアを計測できます。
https://developers.google.com/speed/pagespeed/insights/?filter_third_party_resources=true

### レンダリングをブロックしているJavaScriptを調整
ぺージ上部にで外部JavaScriptを読み込んでしまうと、レンダリングがブロックされてしまいます。こちらもPageSpeed Insightsの減点対象です。

scriptタグをぺージ下部に移す、asyncで非同期読み込むなどの手段はあります...がscript同士が依存してしまって迂闊に読み込み順を変えられないなどという状況もあったので、こちらは可能な範囲で対応を行いました。

### HTML、CSS構造の最適化
不必要なHTMLの構造であったり、cssの記述があると、当然その分リソースのサイズが大きくなってしまいます。画像ほどサイズがあるわけではないので、あまり厳密に行う必要はないですが、保守性向上のためにも見直してみました。

ちなみに速度改善とは関係ないのですが、ちょうど良い機会だったので構造化データの調整も行いました。構造化データに関してはgoogleが提供している以下のツールで設定状態を確認できます。
https://search.google.com/structured-data/testing-tool?hl=ja

![structure.png](https://qiita-image-store.s3.amazonaws.com/0/88427/ff43ad60-28c8-0b9f-b84a-5de43cf500ee.png)

## まとめ
以上、非常にざっくりとフロントエンドの速度改善の調査、手法を紹介させていただきました。

どれも基本的なことではありますが、塵も積もれば...ということで想定以上にスコア向上や読み込み時間を削減することができました。たまにはこういったフロントエンドの速度改善に目を向けてみるのもいいですね
Google 翻訳を shell から使う Translate-shell

この記事は [ACCESS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/access) の10日目の記事です。

# はじめに

みなさん、英語は得意ですか？　私は英語特化の大学を出ているはずなのに、胸を張って得意とは言えないのが辛いところです。
しかしプログラムではメソッド名やコミットメッセージ、さらには調べ物をする時に英語はつきもの。
自力で考えるのが一番ですが、「この動詞でよかったっけ？」「もうちょいいい書き方はないかな」と不安に思うことも。

そこで Google 翻訳や辞書サイトを使って訳や単語を調べるわけですが、いちいちブラウザを開かなくとも  **translate-shell** を使えば、お使いの shell から単語や文章を翻訳できます。精度が向上した Google 翻訳にも対応しています。

# 導入

インストールの方法は、公式サイトに幾つか例があります。

[Translate Shell](https://www.soimort.org/translate-shell/)

ここには載っていませんが、私は Homebrew でインストールしました。

```bash
brew install translate-shell
```

# 使い方

## 基本

基本的な使い方では、入力した文字列を英語に翻訳してくれます。
デフォルトでは入力した語の発音も表示します。

```bash
$ trans 'こんにちは世界'
こんにちは世界
(Kon'nichiwa sekai)

Hello World

Translations of こんにちは世界
[ 日本語 -> English ]

こんにちは世界
    Hello World, Hello World, Hello, world!
```

## 翻訳のみ

翻訳したやつだけ欲しい場合は、 `-b` `--brief` をつけます。

```bash
$ trans -b こんにちは世界
Hello World
```

## 意味・類義語・用例など

辞書的に使うには `-d` `--dictionary` をつけます。英英辞書や英語版Wikipediaからも情報を引っ張ってくるみたいです。
単語によっては膨大になるので、ここでの引用は控えます。

## 他の言語への翻訳

言語を指定して翻訳ももちろん可能です。どの言語に対応しているかは、開発元の [CODE LIST](https://www.soimort.org/translate-shell/#code-list) を参照してください。

```bash
$ trans -b :ja "The download manager is a system service that handles long-running HTTP downloads."
ダウンロードマネージャは、長時間実行されるHTTPダウンロードを処理するシステムサービスです。
```

## 対話型

いちいち trans -b 〜と打ち込むのが面倒な場合は、対話型での入力も可能です。

```bash
$ trans -I -b
Translate Shell
(:q to quit)
> 設定を外部ファイルに書き出す
Write the settings to an external file
```

# 未来へ

導入してしばらく使ってみましたが、まだ翻訳に違和感があったり、訳語から手直しして使った場合がありました。
しかしターミナルから簡単に翻訳できて手軽に使えるので、試してみるのも悪くないと思います。

ACCESS Advent Calendar 2016、明日は @aKatsuhiroMihara さんが担当です。こちらもぜひご購読ください！
Vim 8.0 Advent Calendar 10 日目 quickfix に追加された機能

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 10 日目の記事です。

Vim 8.0 では quickfix 周りに便利な機能が追加されました。

## quickfix の各項目の場所で Ex コマンドを実行する

quickfix の各項目に対して Ex コマンドを実行する `:cdo` Ex コマンドが追加されました。この Ex コマンドを使うことで、quickfix に対する柔軟な操作が可能になります。

例えば、プロジェクトの中から単語 `foo` を探し、それらを全て `bar` に書き換えるには以下のようにします。

```vim
" 単語 foo を探します。結果は quickfix に入ります。
:vimgrep /\<foo\>/ **/*
" 検索結果の各行にて、置換を行い、バッファを保存します。
:cdo s/\<foo\>/bar/g | update
```

## quickfix 内の各ファイルで Ex コマンドを実行する

上記の例において、検索結果の各ファイルについて複数の結果のデータがある場合に、各ファイルについて何か処理がしたい場合があるかもしれません。この場合に `:cdo` を使ってしまうと、各ファイルにて結果のデータの数だけ処理が実行されてしまいます。
こういった場合のために、`cfdo` Ex コマンドも追加されています。こちらの Ex コマンドは、quickfix に存在している各ファイルについて繰り返しが行えます。
各ファイルが開かれた際のカーソル位置は、ファイル内の最初の quickfix の項目の位置になります。

## quickfix の一番下にスクロールする

Vim の非同期機能が強化されたため、今後は quickfix の内容が非同期で更新されることもあるでしょう。そういった場合に、常に quickfix の一番下の内容が見たい場合もあります。
新しく追加された `:cbottom` Ex コマンドを実行すると、quickfix ウィンドウへ移動しなくても、quickfix ウィンドウの内容を一番下までスクロールさせることができます。

## quickfix の履歴を参照する

quickfix の内容は、最新の 10 個まで履歴が保存されていて、以前の内容に戻すことができます。詳細は [`:help quickfix-error-lists`](http://vim-jp.org/vimdoc-ja/quickfix.html#quickfix-error-lists) に記載されています。
この機能は、以前までは実際に `:colder` などを実行して前に戻ってみないと古いものが存在するかどうかがわかりませんでした。
そこで追加されたのが `:chistory` Ex コマンドです。この Ex コマンドを実行すると、quickfix にどのような履歴があり、現在どれが参照されているのかが以下のように表示されます(以下は help からの抜粋です)。

```
  error list 1 of 3; 43 errors
> error list 2 of 3; 0 errors
  error list 3 of 3; 15 errors
```

## ロケーションリスト版

上記の Ex コマンド `:cdo` `:cfdo` `:cbottom` `:chistory` はそれぞれ、ロケーションリスト版として `:ldo` `:lfdo` `:lbottom` `:lhistory` が用意されています。
Fess キーマッチの設定

Fess 10.3
キーマッチを設定してドキュメントをブーストさせてみます。

## キーマッチの設定

| 項目       |       設定値 |
|:-----------------|:------------------|
| 検索語             |  アメリカン           |
| クエリー           |   キャット AND 猫         |
| サイズ             |    10 |
| ブースト値            |   100.0 |

※サイズは最大ヒット件数の上限

検索語をキーマッチに設定すると
検索結果でブーストさせたいクエリーを設定することができます。

例ではアメリカンで検索した時に
キャットと猫に関するドキュメント10件にブースト値100.0を設定します。
ITニュース集めて分析するサイト作ってみた

Advent Calendar 2016を眺めていると、「個人で作ったものを発表していいよー」という素敵なカレンダーがあったので便乗して紹介させて頂きます。

# 事の発端

皆さん、IT関連の情報収集ってどうしてますか？
とりあえずいろんなニュースサイトを回ったりQiitaの投稿を見てみたり、最近でしたらニュースのキュレーションサービスなどを利用している方も多いでしょうか。
私もあれやこれやと登録しているうちに、頭もメールボックスも新着通知もパンクしてしまったので、「簡単にでいいからニュースと最近の動向が確認できるツールをくれ！」と思い立った結果、自分用ツールを作ることにしました。

# 作ってみた

[ITニュースのお漬物](http://tsukemono-it.com/)

![image](https://qiita-image-store.s3.amazonaws.com/0/83530/45dcef93-3741-89d0-e2e5-f5dd6299f16e.png)

まだ工事中な部分もありますが、基本的にはニュースの一覧化や今注目されている単語が表示されるようになっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/83530/e36ebfd9-9826-ce05-1cdf-be51e7cf6a54.png)

また、過去の情報を遡ってどんなニュースが話題になっていたかを記録していく試みを行っています。
現在お試しとして公開している集計結果でも10月には”VR”や”MacBook”、”Surface”などがピックアップされていることがわかり、12月に入ってからは”DeNA”の”WELQ”などが話題に上がっている様子が見られます。

ということでまだ高度な分析などを行っているわけではないですが、ちょっとニュースや最新の流行を確認したいなぁ～という方はぜひご利用ください。

# 開発の話

と、ここまででは本当に宣伝しただけの内容になってしまうので、少し開発（というよりライブラリ紹介）の話を。

## クローリングとスクレイピング

最新のニュース情報を取得するために各サイトを回っています。
更に後々分析するために本文部分をスクレイピングによって取得しています。

その時利用しているのが[phpquery](https://code.google.com/archive/p/phpquery/)というライブラリです。
すごくお手軽に使えておすすめです。

```php
#ライブラリ読み込み
require_once("./phpQuery-onefile.php");

#読み込む
$doc = phpQuery::newDocumentFile("http://xxxxx");

#セレクターで指定できます
$text = ($doc["#id_name"]->find(".class_name")->find("> p")->text());
```

## 形態素解析もどき

単語単位に集計を行うので文章を単語ごとに分解しなくてはいけません。
形態素解析と呼ばれたりする操作で、有名なライブラリに[MeCab](http://taku910.github.io/mecab/)があります。
が、結局形態素解析ライブラリは使いませんでした。
IT系では新しい用語やカタカナ語がポンポン出てくるため、形態素解析用の単語辞書にないものが多く、変に分解されることが多くありました。
そこで何も考えずに漢字・ひらがな・カタカナ・アルファベットの区切り目で分断するだけのほうがむしろきれいに単語分解できました。

## スコアリング

注目されている単語を抽出するために、現在の人気度を定義する計算を行っています。
こういった文章内の単語の評価としてTF-IDFという指標がよく使われます。
TF-IDFでは文章全体と注目する文章内でのその単語の出現傾向に着目していますが、これを真似て文章全体での出現回数や配信サイト別の出現回数、前日との差などを盛り込んで計算しています。

参考

- [特徴抽出と TF-IDF](http://qiita.com/ynakayama/items/300460aa718363abc85c)
- [TF-IDF Cos類似度推定法](http://qiita.com/nmbakfm/items/6bb91b89571dd68fcea6)

## 集計・グラフ・レポーティング

集計やレポーティングには[R Markdown](http://rmarkdown.rstudio.com/)を利用しています。サクッと集計やグラフを作成してHTMLに出力できるので非常に便利です（R使いの方限定になってしまいますが）。
折れ線グラフは[dygraph](http://dygraphs.com/)、ワードクラウド（タグクラウド）作成には[jQCloud](https://github.com/lucaong/jQCloud)を利用しています。
どれも可視化が簡単にできるありがたいライブラリです。


ざっくりとではありますが、作ったものの紹介がてらライブラリ等を紹介させて頂きました。
サイトもまだまだ発展途上ですし、「ニュースキュレーションサービスなんていくらでもあるじゃん」と言われそうではありますが、”技術者は自分で作ってなんぼ（？）”の精神で作ってみました。
「よし自分もなにか作ってみよう」とモチベーションアップになる方が少しでもいればいいなぁ…。
エンジニア1年生のみんなに伝えたいこと

## はじめに

アドベントカレンダーに初挑戦します。なほです。
今まで、C#,VB,phpを使ってお仕事してた、ガチガチのエンジニアです。
最近、転職しました。平均年齢２６歳の若い会社なので、
苦労してる新人がすごく多い・・・。

せっかくなので、今までを振り返って、新人の時にこうしておけば良かったなーてのを
まとめてみようと思いました。
弊社の新人に向けて、書いているので・・・
ある程度、業務経験ある人には当たり前の話だと思います・・・そこはご了承を・・。

## ①　質問は、どんどんした方が良かった。

仕事をしていて分からないこと、て出ると思うんですが、
ある程度調べて無理なら、周りに聞いてしまった方が良かったなー、と思います。

正直、当たり前なんですけど、私含め、できない人多いのです。

自分の力で解決しないと〜とか、
聞くことによって、自分ができないやつ、て思われたくないなーとか考えてしまって
動きたくてもプライドが邪魔して動けなかったりするんですよね。

結果的に1日中、同じことを調べてたりしてて、いやぁ、ほんま時間の無駄。
（こっちの方が仕事できないように見えるよね。）

積極的に、周りに聞いて技術を身につけている人の方が
結果的には、成長が早いし、評価も高かった気がしますね。


## ②　今日やることリスト作るとエンドレス残業からは解放される。

「今日、てどこまで残業するの？」
て聞かれて、
「いけるとこまで」
て答えてしまうの、てものすごく危なくないですか？
エンドレス残業ですよね。つまり帰れない。

スケジュールが、きちんと組まれているプロジェクトならまだしも、
炎上プロジェクトや、事情があってスケジュール通りに進めていないものに関しては、
目標を決めてやることをお勧めしたいです！

朝来たら、
今日は、ここまでやるぞ。

帰る前には、
明日は、ここまでやるぞ。

ある程度、目安を決めて、終わったらさっさと帰れば良いんです。
付き合い残業は、辞めたいものですねー。

## ③　自分の会社以外の世界を覗いてみると色々見えてくるものがある。

外部の勉強会や、セミナー、毎日どこかしらの場でエンジニア達が集まって、
技術共有をしていますねー。
私は、このことを知ったのが、去年だったりします。（遅い！）

外部の勉強会に参加することのメリットについて私が思うのは、
自社の文化を他社を知ることで客観視することができることかな、と思います。

私の会社、てこういう文化があるけど、他社ではどうなの？
て聞くと、「そんなの、ありえない！」て言われたりもたまーにしますね。
「あれ？うちの会社、ちょっとおかしいかも」て気づけて、自社の問題の一つを解決に導けるのかもしれません。

## ④ 技術力を評価してもらうのに、資格取得は分りやすい

資格を取ったからと言って、その人がプログラミング得意か、
ていうと、そうではないんだけども・・・

割と、評判は良いんですよね・・・基本情報技術者などの国家資格は・・・。

SES面談にいくと、割と評価してくださる方が多いです。
何かしら勉強してきたんだな、てことは伝わるので分りやすいのかもしれませんね。

## ⑤ 結局、技術よりチームワーク

なんだかんだ、仕事していて思うのは、
技術云々より、みんなで一つのゴール目指して、
協力しあえるかどうかだったりするのかなぁ、と思います。

そのための仕組みづくりができるならすべきだと思うし、
それも仕事としてやった方が良いな、と思ってます。

相手の心を開くためには、雑談だって必要ですよね。
そこから技術的な話に持っていけば、
相手が「実は、この部分が作れなくて困ってて・・・」
と声をあげてくれるかもしれない。

そういうちょっとした困ったことを会話の中で出し合いながら、
できる人で解決しつつ、仕事をこなした方が結果的には早い気がします。


## 最後に

新人の時、て怒られる頻度も高いし、できないことだらけだし、
辛いこと、ていっぱいありますよね。

私も、まだもがいてる最中ですが、楽しく一緒に成長していきたいですね！

読んでくれて、ありがとうございました！！
goでWebアプリケーションをつくった話


### 単純なHTTPのコード
main.go

```
package main

import (
	"log"
	"net/http"
)

func main() {

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request ) {
         w.Write([]byte(`
         <html><head><title>ちゃっと</title></head>
         <body>ちゃっと</body>
         </html>
         `))
	})

	if err := http.ListenAndServe(":8080" , nil); err != nil {
	    log.Fatal("ListenAndServe:" , err)
	}
}
```

### 実行する方法
```
$ go run main.go
```
コードレスに開発をしてみた

この記事はオールアバウトアドベントカレンダー 10日目の記事になります。

今期は業務では触れることが無い技術をキャッチアップしていこうと思っておりまして、今回はコードレスな開発に触れてみました。

コードレスで調べると*掃除機*とか出てきますがそういった類のものではなく、コードレス***開発***です。

# コードレス開発とは
意味はそのまま、コードを書かずに開発することになりますが、そういったツールはいろいろあるようです。

+ caspio https://www.caspio.com/
+ outsystems http://www.outsystems.jp/index.html

今回は、outsystemsというツールを触ってみたいと思います。
ビジュアルモデリングと呼ばれるビジュアル言語を用いて開発を行うようです。
モデル駆動型開発になっており、モデルからコードが自動生成される流れになっております。

ドメイン駆動設計とも関わりがあるよう（？）ですが、知識がまだ足りていません。。。
http://posaune.hatenablog.com/entry/20091225/1261744374

# ダウンロード
↓よりダウンロードでき、手順もあります。
http://www.outsystems.jp/product/personal-environment.html

# どうやって開発するの？
コードは書かず、基本的にUI上で完結します。
例えばif文なんかも下記のようにドラックアンドドロップで設定できます。
http://neomatsudaira.hatenablog.jp/entry/2016/01/27/113653

入門書も公開されており、サポートも充実しているようです。
http://www.outsystems.jp/outsystems_support/retool.html

youtubeにも、デモなどが上がっており調べれば色々出てきそうです。
https://www.youtube.com/watch?v=njn8cGYikds

# データベースは？
もちろん使えます。
https://outsystemsjapan.zendesk.com/hc/ja/articles/207312690-OutSystems-Platform%E3%82%92%E6%97%A2%E5%AD%98%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E3%81%A8%E3%82%82%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF

# どんなことができるの？
web・スマホ・ネイティブアプリ・バッチ処理の開発・テスト・リリースができ、さらに、分析やパフォーマンス監視などもできるようです。
http://www.outsystems.jp/product/product-devops-ops.html

また、コードでエクステンションを追加して利用することもできるそうです。（Java、C#のソースコードのみ）
http://www.outsystems.jp/product/product-integration.html

そして、outsystemsを今後使わなくなったとしても、.NETやJavaで動くようにアプリケーションを生成することもできるようです。
http://www.outsystems.jp/product/product-nolockin.html

なんでもできそうですね。

# インフラは？
AWSを利用しています。
開発、テスト、本番のサーバが用意されています。
https://outsystemsjapan.zendesk.com/hc/ja/articles/206816230-OutSystems%E3%81%AE%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3

# ソースはいじれないの？
outsystemsとソースコードはマッピングされているらしく、デタッチすることでソースコードをいじれるようです。
https://outsystemsjapan.zendesk.com/hc/ja/articles/206327164-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%87%E3%82%BF%E3%83%83%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9

が、そうすると、もうoutsystemsの環境には戻れないようですので、outsystemsを利用しなくなった時に考えればよさそうです。

# まとめ
普段はコードと睨めっこして開発をしていますが、UIでif文を表現するのは新鮮でした。
こういったサービスも今後成長していきそうですね。

コードがかけなくても開発ができるというのは、使える場面があるのではないでしょうか。
Swiftについての覚書１

#ストーリーボードでテキストフィールドの設定
![swift1.png](https://qiita-image-store.s3.amazonaws.com/0/150621/27f8d835-1022-e0b1-12fb-21cb18021d94.png)

![swift2.png](https://qiita-image-store.s3.amazonaws.com/0/150621/86a7cf2f-c320-7a5a-3458-8b32987952eb.png)

![swift3.png](https://qiita-image-store.s3.amazonaws.com/0/150621/67ad2da3-22f9-a4f3-5c46-17bda775be6c.png)


![swift4.png](https://qiita-image-store.s3.amazonaws.com/0/150621/792233e1-f8ad-c562-1816-e4d55831c6dd.png)

#ストーリーボードを使わずにテキストフィールドの設定
![swift5.png](https://qiita-image-store.s3.amazonaws.com/0/150621/f75dbb61-576e-4eec-bcc8-04c6f2a7737c.png)


![swift6.png](https://qiita-image-store.s3.amazonaws.com/0/150621/7af5b455-9a45-9101-8c7f-5a3a3e0bcaef.png)

CGRectmakeで座標x:50 y:200の位置に　横200pix 縦50pix のテキストフィールドを配置するという意味です。
borderStyleで枠線の設定をします。
addSubviewで画面にテキストフィールドを設定します。
Paletteで取得した色からボタンの色を決めてみる

# やりたいこと
ツールバーの色をPalette（特にLightVibrantSwatch）などで取得してきて色を決める時に色が赤や青の濃い色だったり黄色の明るい色が帰ってくることがあります。そうするとツールバーのボタンの色を黒か白で固定していると色によってはボタンが見辛くなることが起こります。
（YouTubeのアプリは上手く回避していましたので）真似してPaletteで取得した色からボタンの色（白か黒）を決めてみたいと思います。


```java:
    public enum ToolbarButtonColor {
        WHITE, BLACK
    }
    private Palette mPalette;

    public ToolbarButtonColor getToolbarButtonColor() {
        if (mPalette.getLightVibrantSwatch() != null) {
            float hsl[] = mPalette.getLightVibrantSwatch().getHsl();
            float hue = hsl[0];         // 色相
            float saturation = hsl[1];  // 彩度
            float lightness = hsl[2];   // 明度
            if (lightness < 0.35) {
                return ToolbarButtonColor.WHITE;
            } else if (lightness >= 0.35 && lightness <= 0.6) {
                if (saturation >= 0.6 && (hue >= 30 && hue <= 190)) {
                    return ToolbarButtonColor.BLACK;
                } else {
                    return ToolbarButtonColor.WHITE;
                }
            } else if (lightness > 0.6 && lightness <= 0.8) {
                if (saturation >= 0.5 && (hue <= 210 && hue >= 290)) {
                    return ToolbarButtonColor.BLACK;
                } else {
                    return ToolbarButtonColor.WHITE;
                }
            } else {
                return ToolbarButtonColor.BLACK;
            }
        }
        return ToolbarButtonColor.BLACK;
    }
```


# 解説
まずSwatchから色を取得するにはRGBとHSLの2通りありますがHSLの方が分岐が楽そうということだけでHSLにしました。HSLについては画像を検索してもらったり[こちら](http://www.peko-step.com/html/hsl.html)を参考にしてください。

Paletteはnullを返すことがあるのでnullチェックをします。ここではデフォルトで黒いボタンを設定していることにします。

getHsl()ではfloat型の配列が帰ってきて、0番目に色相、1番目に彩度、2番目に明度が入っています。
色相は0〜360、彩度と明度は0〜1の間です。

明度が35%以下の場合は黒っぽい暗い色になるので白、80%より大きい場合は白っぽい明るい色になるので黒を返します。35%〜80%の間は色が多くなるので明るい色は黒、暗い色は白を返すようにしています。

使い方としてはこんな感じで呼んでもらえればいいと思います。

```java:
    switch (getToolbarButtonColor()) {
        case BLACK:
           // 黒いボタンを設定
        case WHITE:
           // 白いボタンを設定
    }
```

## まとめ
これでひとまず黒い背景に黒いボタン、白い背景に白いボタンという悲惨なことにならなくなりましたが、まだまだ改善の余地が残っているので気に入らなかったら好みに合わせて範囲を修正していただけると幸いです。
Excelの関数だけでPaloAltoのAPIをたたく

# ■ はじめに

みなさん、ネットワークの構築や運用の自動化はどのようなものをお使いでしょうか。
Ansibleなどのツールを利用したり、NAPALMなどのライブラリでコードを書いて動かしていたりしていらっしゃるかと思います。
でも「この現場だとツールの導入やコード書くこと自体がハードル高くて・・」
という方もいらっしゃるのではないでしょうか。

そこで、ケースは限られてしまいますが、お手元のExcel(2013以上)で、かつ、関数だけを使ってPAN-OS（Paloalto）のAPIを叩く例をご紹介します。マクロ、VBAは使いません。

# ■ PAN-OS（Paloalto）のAPIと Excelの WEBSERVICE関数

PAN-OS（Paloalto）のAPIはHTTPでリクエストすると、XMLでレスポンスが返ってきます。
一方、Excelには、GETのHTTPリクエストをする WEBSERVICE 関数、
XMLをXPATHでフィルタするFILTERXML関数が2013から導入されています。
これらの組み合わせを利用します。

なお、認証キーの発行方法などの準備は過去に投稿した [PAN-OS(Paloalto)のXML APIの叩き方](http://qiita.com/akira6592/items/0a632c97398a6ad728e9)
を参照してください。

## WEBSERVICE関数の使い方
書式：WEBSERVICE(URL)

引数にURLを指定すると、GETでコンテンツを取得します。この関数自体はレスポンスはXMLでなくても構いません。

- 参考：[WEBSERVICE 関数 - Excel - Office Support](https://support.office.com/ja-jp/article/WEBSERVICE-%E9%96%A2%E6%95%B0-0546a35a-ecc6-4739-aed7-c0b7ce1562c4)

## FILTERXML関数の使い方
書式：FILTERXML(XML, XPath)
元データとなるXMLと、フィルタいしたいXPathを指定します。

 - 参考：[FILTERXML 関数 - Excel - Office Support](https://support.office.com/ja-jp/article/FILTERXML-%E9%96%A2%E6%95%B0-4df72efc-11ec-4951-86f5-c1374812f5b7)


# ■ 使用例：Excelによるポリシーチェック
Excelで指定した条件のパケットが、設定してあるポリシーのどれにマッチするか、
またはマッチしないかを確認してみることにします。新しい通信要件が発生したときに「ポリシーの追加する必要あるんだっけ？」を簡単に確認するようなケースを想定しています。
コマンドでいうと`test security-policy-match`です。

関数の組み合わせ方は以下の通りです。

```
=FILTERXML(WEBSERVICE(リクエスト文字列),"//response/result")
```

`リクエスト文字列`の書式は以下の通りです。

```
https://Paloalto管理IP/api/?type=op&cmd=<test><security-policy-match><source>送信元IPアドレス</source><destination>宛先IPアドレス</destination><protocol>プロトコル番号（TCPなら6）</protocol><destination-port>ポート番号</destination-port></security-policy-match></test>&key=APIキー
```
※httpsの場合、証明書のエラーがあると正常に結果が取得できません。

`リクエスト文字列`の例

```
https://192.168.1.254/api/?type=op&cmd=<test><security-policy-match><source>192.168.0.101</source><destination>2.2.2.2</destination><protocol>6</protocol><destination-port>80</destination-port></security-policy-match></test>&key=xxxdummyxxx

```

そして、指定した条件にマッチしたルールがあれば以下のような結果が返ってきます。

```
rule1 {
        from trust;
        source [ 192.168.0.101 192.168.0.102 192.168.0.103 ];
        source-region none;
        to untrust;
        destination any;
        destination-region none;
        user any;
        category any;
        application/service [ appcustom25/tcp/any/443 appcustom25/tcp/any/80 appcustom25/tcp/any/8080 ];
        action allow;
        terminal yes;
}
```

あとは、Excelのほうで料理してあげれば、こんな使い方ができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/37748fa3-7347-8e8b-41e9-e02304078e82.png)


# ■さいごに
 - Excelの関数だけでGETのリクエストができる
 - XMLをXPathでフィルタする関数がある

の2点を抑えておくと、特別な環境がなくてもちょっとした自動化ができるケースもあるのではないでしょうか？
重複インデックスを検知する「index_shotgun」

10日目ということで銃 [^ten] をモチーフにしたgemです

[^ten]: 十（銃）だけに

# index_shotgunとは?
重複インデックスを検知するためのgemです :fire: :gun: :cop:

* https://github.com/sue445/index_shotgun
* https://rubygems.org/gems/index_shotgun

# 名前の由来
[SQLアンチパターン](https://www.oreilly.co.jp/books/9784873115894/) の1つ、「インデックスショットガン（闇雲インデックス）」が由来です。

# 使い方
## アプリに組み込む時
```ruby:Gemfile
group :development do
  gem "index_shotgun"
end
```

Rails以外では下記も必要です。

```ruby:Rakefile
require "index_shotgun/tasks"
```

下記コマンドで実行 :fire:

```shell-session
$ bundle exec rake index_shotgun:fire
```

今まで作ったgemの中でこのtask名は個人的には一番気に入っています :triumph:

データベースに接続するための設定は activerecord からよしなに読み込むため、特別な設定は不要です。

## コマンドから実行する時
各プロバイダーごとにサブコマンドが用意されているのでそれらを実行してください。（細かいオプションは `help` 参照）

```shell-session
index_shotgun mysql --database=DATABASE
index_shotgun oracle --database=DATABASE
index_shotgun postgresql --database=DATABASE
index_shotgun sqlite3 --database=DATABASE
```

# 特徴
* pt-duplicate-key-checkerとだいたい一緒だけどactive_recordベースなのでMySQL以外でも使えるのが特徴
  * MySQL, PostgreSQL, SQLite, Oracle対応
* 面白い試みとして、1つのリポジトリでTravis CIとWerckerを両方使ってる
  * Travis CIだとOracleが使えないため
  * Oracleのインストールが超絶面倒くさいので、Oracleインストール済のDockerfileをWerckerで使ってる。（Rubyがインストール済のイメージにOracleを入れるよりも、Oracleがインストール済のイメージにRubyをインストールする方が楽だった）

# CIで重複インデックスを検出する
最近の自分の開発だとCIのビルドスクリプトで `rake index_shotgun:fire` を実行し重複インデックスがあった場合にはPullRequestやMergeRequestのビルドが落ちるようになっています。（下記のスクショはGitLab CI）

![image](https://qiita-image-store.s3.amazonaws.com/0/8059/f86db8f7-fefe-df7f-f1a7-c68561f1bb24.png)


本番リリースして大量のデータが入っている状態でインデックスを消すのは大変ですが、これなら開発時に重複インデックスが自動で検出できるようになります。


# 合わせて読みたい
* [index_shotgunを作った #omotesandorb - Qiita](http://qiita.com/sue445/items/72faa7a352e7c0fc4e07)
要件定義のポイント　BABOKを学ぼう！

こんにちは、エムティーアイ人事部　育成チームの高村です。
エンジニア育成と研修を中心に仕事しています。

みなさんとは少し変わってシステムを構築する際の入口にあたる、要件定義についてまとめてみます。
少し長くなりますが、ご容赦下さい。

要件定義と聞いて、何を想像するでしょうか。
業務一覧？機能一覧？非機能？といった言葉が出てくるでしょうか。

要件定義のために何をしなくてはいけないのかをBABOKをベースに見て行きます。

１．システム開発の現状
　少し古いデータですが、システム開発の成功率は約3割と言われています。
　成功とはQCDがOKなケースを指します。
　原因は沢山ありますが、多くの原因は企画作業も含めた要件定義工程の不備にあります。
　　◆品質不備の原因
　　　・要件定義が十分でなかった。
　　　・テストが不十分、移行作業に問題。
　　◆コスト超過の原因
　　　・追加の開発作業が発生
　　　・追加の設計作業が発生
　　◆納期遅れの原因
　　　・要件定義が長くなった　

　などなど
　　
　様々な要因はありますが、やはり要件がしっかりとまとまっていない事が大きなポイントを占めていると思われます。

２．要件定義における課題
　　システムを開発したい依頼者、開発者のそれぞれに、要件定義における悩みがあります。

　　◆依頼者側の悩み、要望
　　　・何をしたらよいのかわからない。
　　　・伝えたはずなのに、伝わっていない事が後からわかる。
　　　・提案してほしい。
　　　・業務を理解してほしい。

　　◆開発者側の悩み、要望
　　　・要求を明確にしてほしい。
　　　・背景がわからない。
　　　・要求が曖昧なままだと、とりあえず作らなければならない。

　形の上では要件定義出来ているが問題は中身にあり、開発者側のスコープだけで判断してはいけない。

３．何か足りないのか？
　一言で言うとビジネスとシステムの橋渡しです。
　システムの機能を考える前に、そもそも何が問題なのか？なぜそれは問題なのか？をしっかり聴く事が大切です。
　そこで、BABOKの登場です。

４．BABOKとは？
　Business Analysis Body Of Knowledge　⇒　ビジネスアナリシスの知識体系をまとめたもの。
　世の中にあるBOK集の一つです。PMBOKの要件定義版と考えると分かり易いかもしれません。
　ビジネスアナリシスで実施すべき事を定義している知識体系です。
　BABOKを知ることにより、ビジネスから要件定義へのつなぎをスムーズに進めていくきっかけになると思います。

BABOKの全体像
![image](https://qiita-image-store.s3.amazonaws.com/0/28629/8f07021b-2db9-9314-859c-638815927b7e.png)


７つの知識エリア
![image](https://qiita-image-store.s3.amazonaws.com/0/28629/fc209023-d496-17f1-c4c5-b50a0ba2620e.png)

この中から私が特に大事だなと思うのは、「引き出し」です。
（全部大事なことは大事なのですけどね。）
　
５．「引き出し」（elicitation）
　要件定義におけるヒアリングは重要なポイントです。
　相手から要求をうまく引き出すことにより、見えてなかった問題の有無や、
　本当に解決したいことの乖離などを確認していきます。

　主に以下の項目を確認していきます。

　(1) ステークホルダーは明確になっているか
　(2) 情報化テーマ(システム化するもの)は確認できているか
　(3) 業務目標（KPI)は明確か
　(4) 新しい業務は、業務の流れを十分検討出来ているか
　(5) 業務目標は※CSFの方向性と一致しているか
　(6) 業務機能は、業務課題を実現するために、必要十分か
　(7) 非機能要件は、業務の特性を踏まえて設定されていいるか
　
　※CSF(Critical Succsess Factors)⇒経営戦略、目標から落し込まれたポイント。
　
　要件に関するポイントを引き出しながら、確認を行い、CSFからのブレークダウンと現状システムのボトムアップの両面から要件定義にアプローチする。その際に上記のポイントを依頼者側に聞き、本当にやるべきことを引き出す事が重要なポイントとなるでしょう。

６．まとめ
BABOK自体は、まだまだ見どころ沢山ですし、奥が深いです。
Agile向けのExtentionも出ているので、また見て行きたいと思います。

参考：
ビジネスアナリシス知識体系ガイド (BABOKガイド) 
IIBA日本支部 BABOK翻訳プロジェクト
http://amzn.asia/eHcP6JE
実サービスでAWS Lambda内でsqlite3を使った話

この記事は[株式会社ネクスト(Lifull) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/lifull)の10日目です。

# はじめに

株式会社ネクスト(2017年4月より新社名Lifull) HOME'Sのテックリードの冨田です。
HOME'SのiOS/Androidアプリ用のAPIの担当も担当しております。

社内でgolangが流行り始めているようですが、
AWS Lambdaがgolangを素では使えないのでネイティブアプリチームではnode.jsを利用しています。

# システム構成

HOME'Sアプリの利用していたAPIはWEBサイトと共通のAPI基盤に同居しており、ネイティブアプリエンジニアは手を出しにくい環境でした。
昨年の冬頃から下記を目指しAPIのリニューアルを行い、今年の夏頃から本格的に運用し始めました。

* ネイティブアプリエンジニアでもAPIを実装できリードタイムを減らす
* 他チームとの影響範囲を減らし、リリース頻度を上げる
* コストの見える化を行い、不要なものを減らし再投資する

リニューアル後のAPIはBFF(Backends for Frontends)にAmazon API Gateway + AWS Lambda(Node.js-v4.3.2)を利用しており、1画面を構成するのに必要なデータをまとめてネイティブアプリに返しています。

ネイティブアプリ => ネイティブアプリ用BFF => HOME'S共通のAPI

Amazon API Gateway + AWS Lambdaを選択した理由としては

* セキュリティアップデートを行う時間をサービスの開発時間に当てることができる
* プッシュ通知などで突発的な負荷があってもスケールしてくれる

というところでした

# 本題

ネイティブアプリでのみ利用しており、頻繁に更新しないマスタデータに関しては、
Lambdaのソースコードとして持っていたほうが速度的に速いので、
sqlite3のファイルを一緒にデプロイし利用しています。

# 環境

* Node.js 4.3.2
* npm
	* aws-sdk 2.6.3
	* sqlite3 3.1.8

Macでの環境構築については以前の記事をご覧ください

* [MacでDockerとAmazon Linuxコンテナを使ってAWS Lambda (Node.js-v4.3.2)にデプロイしてみた。](http://qiita.com/tomiyan/items/be1ccb20b154cabb8c7c)

# サンプルコード

実際のソースコードはお見せできないのでサンプルコードをご覧ください。

https://github.com/tomiyan/lambda-sqlite3-sample

事前にdbファイルを作成する部分。

```javascript
'use strict';

var sqlite3 = require('sqlite3')
  ;

exports.exec = function (callback) {
  var db = new sqlite3.Database('data/test.db')
    , names = []
    ;

  names.push('JavaScript');
  names.push('Java');
  names.push('Go');
  names.push('Scala');
  names.push('Ruby');
  names.push('Python');
  names.push('Perl');
  names.push('PHP');

  db.serialize(function () {
    db.run('drop table if exists master');
    db.run('create table master (id integer primary key autoincrement, name text)');
    var stmt = db.prepare('insert into master (name) values (?)');

    names.forEach(function (name) {
      stmt.run(name);
    });
    stmt.finalize();
    db.each('select id, name from master', function (error, row) {
      console.log(row.id);
      console.log(row.name);
    });
  });
  db.close();
  callback();
}
```

DBからselectする部分。

```javascript
'use strict';

var sqlite3 = require('sqlite3')
  ;

exports.exec = function (callback) {
  var db = new sqlite3.Database('data/test.db', sqlite3.OPEN_READONLY)
    ;
  db.each('select id, name from master', function (error, row) {
    console.log(row.id);
    console.log(row.name);
  });
  db.close(callback);
}
```

# まとめ

DBファイルを一緒にデプロイしてあげれば、簡単に利用することができました。
頻繁に変更があるデータだと、その都度デプロイしなければなりませんが、
更新頻度が低いものであれば実用可能ではないでしょうか。

[株式会社ネクスト(Lifull) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/lifull)の11日目の記事は[先日弊社で開催したイベント](https://connpass.com/event/42448/)で名司会だった国際事業部の@rechiba3さんです。


# 関連記事

* [Node.jsでbetter-sqlite3とsqlite3のベンチマーク on AWS Lambda](http://qiita.com/tomiyan/items/df549239f79cec6cd5c9)
Scala初学者のためのテクニック集（Duck Typing）

コップ本を読み終わって、いざそれを実際の開発で応用しようとしてもなかなか難しいですよね。
そんなとき、Monadの世界にどっぷり浸かるのも良いですが、Scalaの表現豊かな言語仕様を活かしたデザインパターンや、コップ本には書かれていないテクニックを学んでみるのも良いかもしれません。

そんなわけで、今回はDuck Typingを紹介します。
（あ、ちなみに私のScalaレベルは3くらいで、次のレベルになるにはあと142の経験値が必要と言われています）

> "If it walks like a duck and quacks like a duck, it must be a duck"（もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである）by Dave Thomas

上記はDuck Typingを端的に表した言葉ですが、
要するに同じシグニチャを持ったオブジェクト同士ならば、宣言的なインターフェイスを実装していなかったとしても同じと見做せるということです。

Duck Typingは動的型付け言語の特徴ともいうべきものですが、静的型付け言語なScalaでも実現が可能です。

それでは、さっそく具体的な例で見てみましょう。

## Duck Typingの具体例

### 解決したいこと

例えば下記のような、シグニチャが全く同じなメソッドを持つ2種類のクラスがあったとします。

```scala
class CsvFormatter {
  def format(seq: Seq[String]): String = seq.mkString(",")
}

class SpaceFormatter {
  def format(seq: Seq[String]): String = seq.mkString(" ")
}
```

シグニチャは一緒ですが、`format`メソッドを持った共通の`trait`をmixinしていたり、
`abstract class`を継承しているわけではありません。

この2種類のクラスを下記の第2引数（`f: [フォーマッター]`）へ渡したい場合、どうしますか？

```scala
def duckTypingFormat(seq: Seq[String], f: [フォーマッター]) = f.format(seq)
```

Duck Typingはそんな時に使えるテクニックです。

### Duck Typingの適用

先ほどの`duckTypingFormat`メソッドを以下のように変更します。

```scala
def duckTypingFormat(seq: Seq[String], f: {def format(seq: Seq[String]): String}) = f.format(seq)
```

ここで、第2引数に注目してください。

{}の中に`CsvFormatter`と`SpaceFormatter`が持つ`format`メソッドのシグニチャを書きました。
こうすることで、{}内に定義したメソッドを持つクラスであれば、第2引数へ渡せるようになるのです。

```scala
object DuckTypingExample {

  def duckTypingFormat(seq: Seq[String], f: {def format(seq: Seq[String]): String}) = f.format(seq)

  def main(args: Array[String]): Unit = {

    val csvFormatter = new CsvFormatter
    val spaceFormatter = new SpaceFormatter

    val seq = Seq("a", "b", "c", "d")

    println(duckTypingFormat(seq, csvFormatter))    // => a,b,c,d
    println(duckTypingFormat(seq, spaceFormatter))  // => a b c d

  }

}
```

### 静的なDuck Typing

ちなみに先ほどの例で、こんな場合はコンパイルエラーになります。

```scala
// メソッド名が合ってない
def duckTypingFormat(seq: Seq[String], f: {def formatformat(seq: Seq[String]): String}) = f.formatformat(seq)

// 引数の型が合ってない
def duckTypingFormat(seq: Seq[String], f: {def format(seq: Seq[Int]): String}) = f.format(seq.map(_.toInt))

// 戻り値の型が合ってない
def duckTypingFormat(seq: Seq[String], f: {def format(seq: Seq[String]): Option[String]}) = f.format(seq)

// 引数の数が合ってない
def duckTypingFormat(seq: Seq[String], f: {def format(seq: Seq[String], value: String): String}) = f.format(seq, "")
```

このように、ScalaのDuck Typingは静的にコード解析をしてくれるので、
知らない間にシグニチャが変わった場合でもコンパイラがエラーとしてちゃんと教えてくれるのです。
この辺が、実行時に評価される動的型付け言語との違いでしょうか。

そんなわけで今回はDuck Typingの紹介でした。
Rustのimpl trait

RustでIteratorやクロージャーなどのtraitを返す関数を作ろうとするとハマります。
Rustの関数は帰り値はスタック上のサイズを知る必要があります。
つまりRustの関数は具象型しか返せません。　traitとか返せないわけです。

どうしてもtraitを関数から返したい場合はBoxなどに包んでやる必要があります　
特にクロージャーtraitは具象型をユーザーが書くのは不可能なのでクロージャー返したい場合はどうしてもBoxで包む必要がありました

```rust
fn count(n: u32) -> Box<FnMut() -> u32> {
    let mut num = n;
    Box::new(move || {num += 1; num})
}

fn main() {
    let mut counter = count(0);
    println!("{}", counter()); //1
    println!("{}", counter()); //2
    println!("{}", counter()); //3
}
```

traitを返したい場合にBox::newによるアロケートと
返されたtraitのメソッドを使う場合に動的ディスパッチが行われるのは残念です。
あと[オブジェクト安全なtrait](https://doc.rust-lang.org/beta/book/trait-objects.html)しかBoxに入れる事はできません。
オブジェクト安全ではないtraitを関数から返すのは不可能です。　ファ○ク


##impl trait 
Nightlyコンパイラの場合```#![feature(conservative_impl_trait)]```を指定するとimpl traitを使えます。
返したいtraitの前にimplをつけるとtraitを関数の戻り値の型として指定できます。
実行時の動きとしては具象型を指定した場合と変わらないはずです。
オブジェクト安全である事も要求されません。

```rust
//例
fn hoge() -> impl Fuge { .. }
```

最初の例をimpl traitで書き直してみましょう

```rust
#![feature(conservative_impl_trait)]

fn count(n: u32) -> impl FnMut() -> u32 {
    let mut num = n;
    move || {num += 1; num}
}

fn main() {
    let mut counter = count(0);
    println!("{}", counter()); //1
    println!("{}", counter()); //2
    println!("{}", counter()); //3
}
```

Box使わずにクロージャを返せました
他にもiteratorを関数から返したい時なんかにも便利です。

## impl traitが使えない場合

- 返す型が違う場合

スタック上のサイズが違う可能性があるので当たり前ですね。
諦めてBoxに包みましょう。
 
- trait内のメソッド

これは何故でしょうか。
あくまで関数の戻り値の型専用ってことでしょうか。
誰か分かる人教えて下さい。


参考
---

http://www.ncameron.org/blog/abstract-return-types-aka-%60impl-trait%60/
https://doc.rust-lang.org/beta/book/trait-objects.html
Jenkins2のPipelineを使うときのいくつかのポイント(2016/12/10現在)

えーっと別の構想があったのですが、時間足らず逃げました。
まだまだおじさんカレンダー開いているのでもしかしたら二発目行くかもしれません。

で、本題

現状Jenkins2のPipelineは発展途上にあると思っています。
惜しい部分やらなんやらが結構ありまして、そういう部分をフォローしようと思います。

本格的に使えるようになったらすべてのジョブをPipelineにしたいと思っていますが、そうもいかない現在って感じですね。
サーバーデプロイなんかはもうほとんどpipelineで行けそうなんですけどね

# 1.ほとんどのサードパーティプラグインのステップが対応していない問題 #

サーバーのデプロイなどをやっている間はあまり影響ないと思うのですが、かなりの数のプラグインがPipelineに対応していません。
例えばUnityのプラグインなんかがそうです。

これはたぶんJenkins側Pipelineがレガシーな奴も動くような対応しないと解決しないと思うのですが、現状そうなっていません。

## 解決策 ##

その部分だけフリースタイルで作って
buildステップで呼び出す

これだけでも例えばリトライ処理なんかを記述するのが簡単になるのでお勧めです。
ただ、問題として

1. ジョブのトップページから下流ジョブとしてリンクが張られない
2. もちろん下流ジョブのログが出ない

があります。

また、失敗を検出したい場合はpropagateをfalseにしないと下流ビルドが失敗した時点でメインも失敗で終わるから注意な！
ただその場合はretryコードでくくっても成功になっちゃうのでresultで結果を確かめて自前で例外投げなきゃだめだぞ！


# 2.そのままではほとんどのJava由来のクラスが使えない #

セキュリティの関係でCPSという技術があってほとんどがエラーになります。
ArrayList<E>でさえも！
いやマジで困るんですけど！！

## 解決策 ##

NoNCPS属性をメソッドにつける
というのはありますが、例えばちょっとづつforeachでジョブ回したいとか結構面倒くさいです…

また初めて使うメソッドはそれ許可されてねーよってエラーが出るので
Jenkinsの管理からIn-process Script Approvalページで許可する必要があります。
現状GUIでは一括でクラス単位での許可なんかはできません！

またNoNCPSだと例外を投げてもコンソールに出してくれないという悲しい現実もあるので
ログは過剰なぐらいはいたほうがいいです。

# 3.ドキュメントがあんまりない #

例えばjobステップの戻り値はどこにも書いてありませんが

http://[Jenkinsのurl]/pipeline-syntax/globals#currentBuild
と同じだと思います。

## 解決策 ##

ソースコード転がってるから読んでみよう！
以上

ちなみにわかりにくいけどオンラインのステップドキュメントはこちらになります
https://jenkins.io/doc/pipeline/steps/

# 4.ちょくちょくバグってる #

安定はまだもう少し先になりそうです。
ただ、Jenkins側も力を注いでいる部分なのですぐに修正されることも多いです。
イシュートラッカーみてみて、プラグインアップデートしましょう。
寿司レポを回避しようとしたが結局寿司レポを書かざるを得なくなった話

# 経緯
サークルで呑み会の予約をインターネットで行い、間違えて数週間先の同じ曜日の予約を取ってしまった。幸い呑み会当日に予約無しで同じメニューを頂くことができ、事なきを得た。
しかし、散々ネタにされた挙げ句、間違えて予約をした日のアドベントカレンダーを任されることになった。

しかも、予約をミスした店が寿司屋だったので、内容は寿司レポを含まねばならないが、純粋な寿司レポではQiitaに投稿できない。私は自宅サーバーでブログを立てたくない。

というわけで、なんとかQiitaに投稿できるよう、技術的な内容を入れたかったが、
結局完成しなかった実装の経緯を含め技術的な内容とし、加えて寿司レポという名のポエムを綴ろうと思う。

## アイデア
__「寿司レポを書きたくないのならば寿司屋で見つけた技術ネタを書けばQiitaでも投稿できるじゃん！！」__
寿司屋で伝票にバーコードがたくさんついたレシートのようなものが印刷されるのを見て、そのバーコードジェネレータを作ろうと思った。

# 実装
サーバーサイドだけでも完成させようと思ったが、[SECCON 2016](http://2016.seccon.jp/)のオンライン予選に参加するために一旦放置することにした。

大体の詰まって短時間で実装に至らなかった原因は、Pangoのセンタリングが動かないことだったので、リポジトリルートの``test.rb``あたりをみていただけるとどう詰まったかが分かると思われる。

[当該リポジトリ: fono09/sushi_slip](https://github.com/fono09/sushi_slip)

* サーバーサイド
    * Ruby
        * Sinatra
            * バーコードが付いたレシートを吐き出すAPIサーバ
        * Pango(+Cairo)
            * テキストをレイアウトしてレシート用の画像に吐き出す為
        * Barby
            * バーコード生成
    * Caddy
        * 実装が終わっていたら(とても重要)リバースプロキシとして置いてた
* クライアントサイド
    * JavaScript
        * JQuery
            * 多分急いでいたからこの程度しか書かない

# 参考にしようとしたサイト
* [【Rails】barbyでバーコードを作成してPNGで表示する【バーコード】 | Gemの紹介 | DoRuby](https://doruby.jp/users/maya/entries/_Rails_barby_PNG_)
* [とある文字列の画像をジェネレートするRubyスクリプト - my_letter](http://myokoym.github.io/entries/20130310/a0.html)
* [Cairo text align center](https://www.cairographics.org/samples/text_align_center/)
* [Rubyist Magazine - cairo: 2 次元画像描画ライブラリ](http://magazine.rubyist.net/?0019-cairo)

# 寿司レポ

12月8日、IPSJ名古屋大会の要約投稿〆切が翌日に迫った忙しい、良く晴れた日。
私は寿司レポに出かけることになった。

今回のお店はこちら。回転寿司チェーンながらもしっかりと「寿司屋」の風格を保っている、[きときと寿司長野店](https://tabelog.com/nagano/A2001/A200101/20001928/)だ。

学生の身でぼっちフルプライス寿司レポは辛いので、平日ランチの海鮮丼(¥822)を目当てに長野県長野市、海鮮とは縁の無い山の中で寿司を食らう。尚、私は生まれてこの方大学まで長野県内に収まっている。

入店後、すぐに海鮮丼を注文。少々待つ。先客が、普通に寿司をオーダーしているのが羨ましい。自分の懐事情と時間のなさを恨むしかあるまい。開店早々だったので、少々丼が届くまで時間がかかったが、問題無いレベルだろう。

![IMG_0775.jpg](https://qiita-image-store.s3.amazonaws.com/0/95389/45feeb91-f309-1198-be6d-ba60b75324bb.jpeg)

汁物とセットだったが、基本的に〆の汁物としてもずくに長ネギの刻んだ物が添えられていたものだったので、撮らないことにした。

まず見た目から。
スーパーなどにある海鮮丼よりも遙かに目に優しい盛り付けがされている。まぁ、安い価格帯のランチメニューなので無駄に高いハードルを設けてもいけないが、マグロ赤身に輸送用と思われるビニールのパターンが出てしまっているのが少々悲しい。ボリュームを求めてもいけないだろう。

味は、基本的に全て合格点。期待を裏切らないものだった。
個人的には、私は甘味をあまり摂取しないので、穴子にもたれをかけない。今回もたれをかけずに食べたが、穴子が甘めだと思った。

加えて、山葵が粉山葵だが、より美味しい良く効く山葵を知ってしまっているので、そこがちょっと残念に思ってしまうのは無理な話だろうか。確かに主役ではないが、それだけで山葵が入るネタは全て美味しくなるのだからそこは頑張って欲しい。

以上が寿司レポだが、小学校1年の夏頃まで父親が市場勤務だった関係で、流通過程だったりパッケージ品だったりというのを多少聞きかじっており、変に食レポなんかするもんじゃないと思っているので、「おいしかったです」の一言でまとめて筆を置かせて貰う。
Travis CI + Docker + go test

# Travis CI + Docker + go test

この記事は[mediba Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mediba)の10日目です。

@mediba-moritake です。auスマートパスのサーバーサイド開発をしています。
今回はTravis CIのDockerを使って、go testを実行したいと思います。

```yaml:docker-compose.yml
version: '2'
services:
  golang:
    container_name: golang_container
    build: ./docker/golang
    volumes:
      - ./:/go/src/github.com/mediba-moritake/docker-golang
```

```go:Dockerfile
FROM golang:1.7.4-alpine

RUN apk update

WORKDIR /go/src/github.com/mediba-moritake/docker-golang

CMD ["/sbin/init"]
```

```go:main.go
package main

import (
	"fmt"
	"github.com/mediba-moritake/docker-golang/hello/lib"
)

func main() {
	hello := lib.Hello{Language: "Golang"}
	fmt.Println(hello.Hello())
}
```

```go:hello.go
package lib

type Hello struct {
	Language string
}

func (f *Hello) Hello() string {
	return "Hello, " + f.Language

}
```

```go:hello_test.go
package lib

import "testing"

func TestHello(t *testing.T) {
	hello := Hello{Language: "Golang"}

	if hello.Hello() != "Hello, Golang" {
		t.Fatal("Hello() doesn't match")
	}
}
```

```yaml:.travis.yml
sudo: required

services:
  - docker

before_install:
  - docker-compose up -d

install:

before_script:

script:
  - docker-compose exec golang go test -v ./...

after_script:

notifications:
```

# 最後に

- go testはDockerを使わなくても実行可能です。
- 1つのGitHubリポジトリに複数言語コミットしている場合(Golang 1.7.4とRuby 2.3.3など、複数言語のバージョン指定)に便利です。
- Docker for Macなどでローカル開発環境を構築すると、そのままCI環境で使えるのが便利ですね。

今回使用したソースコードは[こちら](https://github.com/mediba-moritake/docker-golang)です。

明日の11日目は@kitatubaさんの「性能試験おコンテナ」です。
emscripten でドメイン層に型と速度を持ち込む

半分ネタです。できたものはこちら。

https://github.com/januswel/react-emscripten-todo

デモページもあります。

https://januswel.github.io/react-emscripten-todo/src/public/index.html

言語の内訳です。

![react-emscripten.png](https://qiita-image-store.s3.amazonaws.com/0/27516/c1ff23b6-4088-4186-68ed-3386454d1a9f.png)


コンセプト
----------

- C++ を使ってドメイン層を型安全にモデリングする
    - ドメイン層については次の記事を参照してください。
        - http://qiita.com/janus_wel/items/2661ccad4a97e68a284b
    - `template` など使って generic にモデリングしたいところだが、 JavaScript へバインディングする際に実体化させないといけないのでうまみはない
- UI は React などお好みのライブラリー、フレームワークを使えるように
- WebAssembly などが対応してくるとドメイン層のロジックがちょっぱやになるという期待

要するにロマンです。


経緯
----

最近は JavaScript フロントエンドの世界にも型が持ちこまれてきています。チームで開発するにあたっては必須だと思いますし、ひとりで開発する場合も型によってバグが減ります。

最近の関数型言語を追えていないこともあって、静的型付け言語というと個人的にはまっさきに C++ が思い浮かびます。 C のメモリーモデルとキャストは自信を持って「型付けされている」と言いづらいものでしたが、 C++ では意図しない限り型変換で危険な目にあうことはないはずです。

JavaScript にも型チェックをするための flow や型を扱える TypeScript などが出てきたのでそれでやればいいじゃんというのは最もな指摘なのですが、まあなんだ。止められない衝動というものがあるとかなんとか。

というわけで emscripten です。

http://kripken.github.io/emscripten-site/

解説
----

### ドメイン層

C++ でモデリング。今回は todo アプリを作ることにしました。

https://github.com/januswel/react-emscripten-todo/blob/master/src/domain/todo.cpp

クラスとして todo という概念をモデリングしたあと、それを JavaScript から扱えるように binding を書いてやります。かんたんかんたん。 move semantics は意味があるのかどうかまだよくわらかないです…。

### emscripten で JavaScript ファイル生成

↓に書いてあります。手元の環境は Mac OS X なので `/opt` 以下におきました。

http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html

うかつにパス通しちゃうと普段の node 環境つかえなくて焦ります。というわけで build するための sh script を書いておくと楽です。

https://github.com/januswel/react-emscripten-todo/blob/master/build.sh

最適化がどれだけ意味があるのか…。

emscripten が生成するファイルは ES Modules や Node.js で使われている CommonJS などというものは一切考慮しません。ブラウザーで読み込むと `Modules` というトップに変数を定義してその中に諸々を定義してくれます。えっ、まじで ?

### html から読み込み、使用

`script` 要素で読み込むだけで準備完了です。トップに `Modules` という空間が定義されているのでそこから使いたいクラスや関数を呼び出します。今回はクラスしか定義していないので `new` でインスタンスを作って操作、破棄してやります。

```js
const newTodo = new Modules.Todo('たすく')
newTodo.toggle()
newTodo.delete()    // !
```

えっ、破棄 ? `delete` ?

そうです。 emscripten の仕組み上 `ArrayBuffer` 上にインスタンスが作成されるので、明示的なインスタンスの破棄が必要になります。もう嫌な予感しかしませんね !!

### UI を React Redux で組んでみる

C++ から UI を操作することは難しいため、 UI についてはその他のフレームワークを使ったほうがよいようです。というわけで今回は React Redux を選択しています。

簡単なので reducer の中でもろもろの操作を定義しています。

https://github.com/januswel/react-emscripten-todo/blob/master/src/redux/modules/todos.js

state の初期状態の定義や todo を追加する際の reducer で `Modules.Todo` を `new` していますね。 todo を削除するところできっちり `delete` を呼び出しています。

普段のサンプルとちょっと違う感じがしますが、これは ducks という reducer の書き方の提案をもとに書いています。

https://github.com/erikras/ducks-modular-redux

React コンポーネントの定義については凝ったことはしていません。


感想
----

そんなにつまづくこともなくサンプルを作成できたので実はイケるんじゃ、と思わせつつも、次の点からロマン技です。

- module の仕組みがない
- 明示的にリソース管理をする必要がある

上記さえ解消されれば、型と速度を手に入れるための選択肢としては悪くないんじゃないかと感じました。


明日は @shinout さんの flow のハナシです。
DBUnitでBLOBデータをEXCELから放り込んだ話

これは[Java Advent Calendar 2016 ¥- Qiita](http://qiita.com/advent-calendar/2016/java)の10日目の記事です。
9日目の記事は[deaf_tadashi](https://twitter.com/deaf_tadashi)さんの[マイクロベンチマークツール、JMHについて](http://qiita.com/deaf_tadashi/items/8f82c22be18298654b7c) でした。
11日目は @leak4mk0 さんです。

# このページについて
DBUnitを使用して、BLOB型カラムにテストデータ（主に画像とか、PDF）を入れたいときには、
XMLでそのファイルを指定する仕組みが用意されています。

が、今回は、EXCELからBLOB型カラムにテストデータを入れる方法を紹介したいと思います。

DBUnitを使ったことがない方は、使い方については、日本語情報が沢山あるので、
ぐぐってみてください。

# 書く目的
BLOB型カラムのデータをインポートする際に躓いたので、その共有です。
レアリティの高いシチュエーションだとは思いますが、
こんな方法でいけるぜ！というのを知っていただければ幸いです。

# 依存物
※ORACLEですが、恐らく他のDB製品も同じなんじゃないかなと思います
## 環境
OS ： Redhat 6.5
Java : 1.8.20
DB : Oracle 12c

## ライブラリ
DBUnit : 2.5.3
OJDBC : 8

# ことの発端
冪等性のない単体テストコードの実行環境において（DBにデータありきだが、そのデータは人の手によって容易に変わる環境）、
テストコードがエラーになったら、原因を探して直せと言われるような開発の中、
これはイカンとCIを導入し、DBにデータありきなテストコードについては、今更そんなところまでは直せないので、
データを移行し、IDE上からいつでもデータを復元可能なようにDBUnitでインポートできるようにしとこう！という施策。

上記を行うことで、一先ずソフトの改造以外でテストが壊れる、ということを防げるようになって余計な工数かからないよ、
という点とCIをやることで得られる品質面のメリットを猛プッシュして導入しました。

# 本編
## 移行データをDBUnitでデータインポートに使うExcelに書き込む
SQL Developerからコピペするという荒業を使用して実施しました。
BLOB型カラムのデータはSELECT文でBASE64エンコードするストアドファンクション投げてコピペを実施。
※BLOBあっても、こうやればできるというのがありましたら、教えてください。

## Excelに書き込んだテストデータをDBUnitで、EXCELからDBに書き込む（本題）
### 起きた問題
DBUnitのDatabaseOperation#executeを実行すると、
BLOB列の書き込み箇所で、ClassCastExceptionが発生して処理が落ちる。

### 原因
OJDBC側としては単純に、
「俺は、BLOB列にデータを書き込みたかったら、BlobObject使うのに、
お前の流し込んでるデータがbyteだから、キャストできねーよ！」
ということみたいです。

### 対策
読み込むときならともかく、自分でBLOBを書くときは、BlobObjectなんて使わないけどなー、と思いながらも無理くりbyteで書くために、
org.dbunit.dataset.ColumnのDataTypeをBINARYに変えてあげる必要がある、ってことで以下のコードを作成。

```lang:javaコード（抜粋）

    IDataSet databaseDataSet = con.createDataSet();
    ITableMetaData tableMetaData = databaseDataSet.getTableMetaData(tableName);

    //OraclePreparedStatementがBLOBカラムに対してBLOBオブジェクトを入れようとしてくるが、
    //byteデータをセットしたいので、BINARYに変換する
    //注意点として、ITableMetaData#columnsとIDataSet#ITableMetaData#columnsとの
    //2重管理になっているため、両方ともBYNARYに更新する必要がある
    ITable table = dataset.getTable(tableName);
    Column[] cols = tableMetaData.getColumns();
    for(int i = 0; i < cols.length; i++){
        //BLOBのやつをBINARYに置き換えるぜい
        if(DataType.BLOB.equals(cols[i].getDataType())){
            Column col = new Column(cols[i].getColumnName(), DataType.BINARY);
            //配列の参照関係は要素を自由に書き換えられるから、これを利用して目的を達成する
            cols[i] = col;
            int idx = table.getTableMetaData().getColumnIndex(cols[i].getColumnName());
            table.getTableMetaData().getColumns()[idx] = col;
        }
    }

    //データの流し込み
    DatabaseOperation.CLEAN_INSERT.execute(con, dataset);

```

コメント中にもある通りで、参照状態のオブジェクトを無理矢理書き換えてあげることで実現。
※プロダクトコードでは、こんなコードを書いたらいけません。

これで、めでたくDBUnitを使ってDBにBLOB列データを書き込みができました。
同じ境遇に遭った人は是非どうぞ！

# 番外
## 何でXMLでリソースファイルの紐付ではいけなかったのか
BLOBデータが、システム側で作ったJavaのインスタンス(PDFとかイメージファイルではなく、業務処理の途中経過)だったため、
このような手法を取りました。
何でこんなことになっているのかは、突っ込まないでください。
※良い子は、マネしないでください。

あと、単純にExcelをDBのように使用する機会は多いため、
開発者がExcelにデータを定義できた方が、学習面で都合が良いためです。

# まとめ
DBUnitを使用して、BLOB列にJDBC経由でデータを放り込む場合は、
ITableMetaDataとIDataSet#ITableMetaDataのcolumnsフィールドのDataTypeをBINARYにしてあげればOK！
という、誰得なテクニックをお届けしました。
BitVisorでCPUID命令の挙動を変える

BitVisorを書き換えて、仮想マシン上のCPUID命令の挙動を変える方法を紹介します。

# コードの場所

CPUID命令が仮想マシン上で実行されると、いろんなところを通って、core/cpuid_pass.cのdo_cpuid_pass()関数というのが呼び出されます。この関数は、CPUID命令を実行して、その結果を一部改竄して返しています。改竄の内容は、主に、未実装の機能を隠蔽するものです。

```c:core/cpuid_pass.c
static void
do_cpuid_pass (u32 ia, u32 ic, u32 *oa, u32 *ob, u32 *oc, u32 *od)
```

この関数を書き換えることで、CPUID命令の挙動を変えることができます。この関数のiaとicにそれぞれ%eax, %ecxレジスターの値が渡され、この関数はCPUID命令の実行結果の%eax, %ebx, %ecx, %edxレジスターの値をそれぞれoa, ob, oc, odポインターが指す領域に格納します。

# 書き換え例

## 実装例

ここでは、"GenuineIntel"を"AuthenticAMD"に書き換えるだけの簡単な例を示します。(タブがスペースになっていますので試す時にはご注意ください。)

```diff:
diff --git a/core/cpuid_pass.c b/core/cpuid_pass.c
--- a/core/cpuid_pass.c
+++ b/core/cpuid_pass.c
@@ -42,6 +42,11 @@ do_cpuid_pass (u32 ia, u32 ic, u32 *oa, 
        else
                asm_cpuid (CPUID_EXT_0, 0, &tmpa, &tmpb, &tmpc, &tmpd);
        asm_cpuid (ia, ic, oa, ob, oc, od);
+       if (!ia) {
+               *ob += -217706502;
+               *oc += -672674571;
+               *od += 537853948;
+       }
        if (tmpa >= 1 && ia == 1) {
                /* *ob &= ~CPUID_1_EBX_NUMOFLP_MASK; */
                /* *ob |= ~CPUID_1_EBX_NUMOFLP_1; */
```

## 実行例

iMac Mid-2014での実行例を示します。Ubuntu 16.04で確認しています。

```
$ head -5 /proc/cpuinfo 
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 6
model           : 69
model name      : Intel(R) Core(TM) i5-4260U CPU @ 1.40GHz
```

AMD! AMD! (model nameはそのままですが...)
タイピングがGetWildのリズムになってしまうあなたへ

[Get Wild Advent Calendar 2016](http://qiita.com/advent-calendar/2016/getwild) の9日目です。

# はじめに

こんばんわ。
GetWild駆動開発日に日に盛り上がりをましていますね！
どの記事も本当に面白いですね＾＾

完全にROM専になっていたところ、突如代打の依頼が来まして...
現在12/9 22:40 GetWild聴きながら必死に記事を執筆しております f^^;

焦ってはいるのですが、GetWildを聴きすぎてだいぶ気持ちよくなっております！
まだまだ盛り上がって行きましょう！

# GetWild聞いていますか？

みなさまもちろん聞いていますよね？
僕もPCを触りながら、常にGetWildを流しています。
そんなとき、ついついタイピングがGetWildのリズムになってしまうことありますよね？

#### ゲッワイエンターフ！ターン！（Enterキー）

っとリズムに乗ってしまいますよね？

GetWild駆動開発の記事を色々みていると、本当に色々なGetWildの使い方があるようなのですが、
やはり初心に戻って

#### GetWildのリズムに乗りながらタイピングする


をGo言語で解決してみようと思いました。

# Demo

1. まずはGetWildを流してください。
2. ひたすらタイピング
3. サビがきたら 「g → w → a → t → return」の順番でタイピングです！

<blockquote class="twitter-video" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/O1wSI4JHIA">pic.twitter.com/O1wSI4JHIA</a></p>&mdash; けんとけんと (@tansoken) <a href="https://twitter.com/tansoken/status/807229686082191360">2016年12月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

（動画だけみるとなんともシュールですね..w）

# 実装内容

■ (0)まず、ヘッドフォンをつけて、GetWildを流す

■ (１)terminalのapiを叩ける「[termbox-go](https://github.com/nsf/termbox-go)」を使います。

参考サイト： [termbox-go 試してみた](http://mattak.hatenablog.com/entry/2015/01/04/000612)

■ (2)キーをタイプした時のエフェクトを考える

■ (3)今回表現が乏しく時間もなかったので、アスキーアートを簡単に作成できる下記のサイトにお世話になりました。 

利用したサイト： [AA変換(アスキーアート生成) Web便利ツール@ツールタロウ](https://tool-taro.com/image_to_ascii/)

## まとめ

お粗末な動画でわかりずらいかもしれませんが、当人は実はかなりノリノリです。
どうしてもタイピングがGetWildになってしまったら、このアプリを起動して気持ちよく思う存分叩いてください！
自分で気持ちの良いエフェクトを作成するのも良いと思います。

それにしてもtermbox-goを使えば、terminal上で動かせる時間つぶしアプリ簡単に作れそうですね。
以上、明日からのGetWild駆動開発の記事楽しみにしております＾＾

下記にコードはおいておきます。
https://github.com/kentokento/GetWild
色に恋をした話

[2016年 Schoo Advent Calendar](http://qiita.com/advent-calendar/2016/schoo) 10日目の記事です！
簡単に自己紹介しますとSchooではデザイナーとして、本職は美術家として活動している。（ http://so-takeshita.tumblr.com/ ） そんな私が色に恋をした話をしたいと思う。

##祈り

アートの起源は祈り、死者に花を添えたことが始まりと言う説がある。ふと疑問に思う。彼はもしくは彼女は何故死者に花を添えたのだろう？花にどんな祈りを託したのだろう。そのヒントは色にあるのではないだろうか。

##色彩の深さに恋をして
東京の冬、南国生まれの私にとっては、今、凍ってしまうのではいかと錯覚するほどに寒い。
まずは下の画像をじっくりと見てみよう。
<img width="818" alt="スクリーンショット 2016-12-09 21.45.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/151959/4353ce05-4aa5-a0e5-be83-4e2282a81bd5.png">

体が少し温かく感じるはずだ。
暖色系のオレンジを見ると体感温度が3度上がると言われている。色を見ると意識せずとも視神経が反応し脳へと刺激を届け、身体へと信号を送る。マッチ売りの少女も、最後につけたマッチの火の色に反応し、脳は誤作動し温もりという嘘を体に与えたのだろう。
私が初めて色の魅力にとりつかれ、恋をしたのは[DIC川村記念美術館](http://~)で画家マーク・ロスコの作品群である＜シーグラム壁画＞を見た時だ。ぜひ一度現物に触れて体感して欲しいのだが、それはともかく、ほぼ一色に塗られたこの絵画は壁画というほどに巨大だ。このただ沈黙しているはずの絵画の前に立つと、それは脳が強制的に座禅を組まされ、自らの記憶という記憶を呼び起こし自然と思考している。この、少ない色に限られたはずの絵画は、人それぞれに根ざした記憶を、そして、感覚をまるで色鮮やかに呼び起こす。色というのは脳に根を張た記憶に刺激を与える装置としての役割を持っているのだ。

##色と言葉の意味
さて、死者に添えた花に何を感じ取ったのだろうか。
それぞれの色に与える印象の言葉がある。例えば赤なら情熱、活気、元気というようにだ。最近手掛けたデザインの仕事に、コーポレートカラーに関するものがある。弊社のサービスであるSchooの変化に合わせ先を読み何度も検討し、サービス5年の歴史の中で先人から受け継がれ、今、この問いは私に託されたのだ。今回の変更は、CI/VI一身に合わせたカラーパレットに変更することが目論見だ。先に断っておくと少し乱暴な分け方をしているのだが、図では１年事に分けて当時のカラーパレットと、色の意味を書いている。各色の意味は以下のサイトより参照している。 
http://www.live-commerce.com/ecommerce-blog/basic-color-rule/#.WEq2_aKLTox


<img width="748" alt="スクリーンショット 2016-12-09 17.33.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/151959/8269de5b-fe8e-0b4d-ddf4-774dac2d3708.png">
まずは、図の一番上のカラーパレット、文の文字の入った旧ロゴを使用していた時の話だ。このころのコーポレートカラーはマルチカラーを採用している。楽しく学ぶことに重きを置き、情熱、活発、希望といったオレンジをベースカラーに、そして多様な学び場であることのメタファーとしてマルチカラーをキーカラーに使用していた。しかし、時代より簡素にフラットデザインの方向へと向かい、また、サービスの方向性もより研磨され、マルチカラーが仇となってきたのだ。
　では次だ。図の真ん中のカラーパレットのように、誠実さ知性そして、今までのように軽快に学習できるサービスへとブルーをキーカラーに、ブルーの意味を補う形でイエローが採用された。色を絞ることは、見た目だけではなく、色の持つ言葉の意味もシンプル、結果としてメッセージの強いものとなる。

　そして、2016年の10月に、よりCIにあったロゴを言うことで、[日本デザインセンター大黒デザイン研究室](http://daikoku.ndc.co.jp/)の元、ロゴが完成した。この人類の未来が託されたロゴに、添ったカラーパレットが必要になった。変化の印象を持ってもらうためにも、ブラックの持つ豪華、洗練を選択することには迷いはなかった。しかし、ブラックに添えるアクセントカラーをどうしてくれようか。ブルーを添えてるとブラックの弱点である、不安と、ブルーの弱点である冷たさとで、学ぶことへの不安を誘発してしまう恐れが出てくる。しかし、この先代から受け継いだブルーにはトリックがあったのた。実は少しグリーンに寄せたブルーになっている。青緑だと、カジュアルと言う言葉の意味あり、それはフランクに学べる従来のサービスの持つ強みを受け継ぐ形になっていたのだ。

　振り返っただけで、何も仕事していないのでは、と思われるので自分で自分をフォローしておくと、ここには載せてない、サービスで使用されるイエローを以前のオレンジに寄ったものから、ブラックの不安感を払拭しフレッシュさを演出する、グリーンに寄せたイエローに変更したり。注意喚起を意味するレッドをブラックに合わせたものに変更している。
少し、話が逸れてしまったが、色一つ一つに多様な意味があり、また僅かな変化や組み合わせで、メッセージが変わるのだ。

##あの日見た花の色は
話を戻そう。添えた人物は花の色に何かしらのメッセージを感じ、死者に伝えようとしたはずだ。
さて死者に添えた花は一体どんな色だったのだろう？謎は深まる一方である。


##謎の先にあるもの
そんなSchooでは現在デザイナーを募集しています。一緒に謎の答えを探しませんか？

5周年でCIも一新！Schooの全てのデザインを担う デザイナー募集
https://www.wantedly.com/projects/70697