OmniAICreator/Qiita-1.07M huggingface dataset:
デザイナーが事業責任者になったら

この記事は[WHITEPLUS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/whiteplus) 15日目になります。

ホワイトプラスで「[くつリネット](http://www.kutsulenet.jp/)」「[ふとんリネット](https://www.futonlenet.jp/)」のプロダクトオーナー
兼デザイナーをしている @UomoriAtsushi です。

今回は「デザイナーが事業責任者になったら」というテーマで書きたいと思います。

#今回お伝えするのは5点
1. そもそも事業責任者って？
2. @UomoriAtsushi の経歴
3. なんで事業責任者になったのか
4. デザイナーが事業責任者になることのメリット
5. 企業に務めるデザイナーさんに

#1.そもそも事業責任者って？
事業の数字に責任を持ち、
決定権を持ち、
事業部内をマネジメントし、
今後どう事業を伸ばしていくか…
みたいなのを考えていく人？ですか？
なんかもっといろいろあると思いますが…
なんとなくそんな感じです。

事業部長、プロダクトマネージャー、プロダクトオーナーetc...
呼び方はなんでも良いと思います。

ちなみに私が務める[ホワイトプラス](https://www.wh-plus.com/)では
プロダクトオーナーと呼ばれることが多いです。

何の事業責任者になったのかというと
ホワイトプラスの運営する宅配クリーニングサービス

* [くつリネット](http://www.kutsulenet.jp/)
[![スクリーンショット 2016-12-14 10.25.56.png](https://qiita-image-store.s3.amazonaws.com/0/67668/e797b67c-c037-5a8c-6f41-25fd920b1fec.png)](http://www.kutsulenet.jp/)

* [ふとんリネット](http://www.futonlenet.jp/)
[![スクリーンショット 2016-12-14 10.26.14.png](https://qiita-image-store.s3.amazonaws.com/0/67668/ce42921d-1ae4-271a-ad26-0ea490ceaeb3.png)](http://www.futonlenet.jp/)

この2つの事業責任者を現在させていただいています。

#2.@UomoriAtsushiの経歴
    * デザイナー歴　18年(社会に出てから11年）
    * 紙のデザイナーを経てWEBデザイナーに
    * 高校からデザイン科で数学とかほとんど勉強してない

そんな、高校からこれまでデザインしかやってこなかった男がどうして事業責任者になったのか…次はそのことについて

#3.なんで事業責任者になったのか
社会に出て11年デザイナーをやっていると
企業で働くデザイナーのキャリアプランってどういう道があるのだろう？
と考えることが多くなりました。


大きく分けて4つくらいに分かれるのではないかなと思います。

    * デザインを極めるTHEデザイナー
    * フロントもできるデザインもできる最近重宝されるデザイナー
    * マーケと一緒に数字や企画に入り込めるデザイナー
    * 独立して受託で稼ぐデザイナー

ん〜どれもかっこいい。

かっこいいけれど、
いまいち自分の中でピンと来なかったんですね。

そんな時に、会社の方針として、
「ふとん事業とくつ事業の2つにも力を入れよう！」

「社内でプロダクトオーナーやりたい人〜」（もっとちゃんとした感じで）

って募集があったんですね。
<br>
もうね

「これだ！」って思いましたね

応募動機をありったけの熱意を持って書き、

その後、取締役との面談を経て

選んで頂きました！

採用理由は

「とても熱意が伝わったこと」
「作り手だからこそ見えるもの、作り手がトップに立った事業がどういう成長を見せるのか」
「今後、ホワイトプラスの文化として、作り手を大事にしていく文化を作っていきたいこと」
などなどいただきました。

これで成功すればデザイナーのキャリアプランに（少なくともホワイトプラスでは）
1行「事業責任者」という道が付け加えられる！！！

若いデザイナーたちに選択肢を増やしてあげられる！（←これ結構大事にしたい）

そんな思いで2016年5月から事業責任者になりました


#4.デザイナーが事業責任者になることのメリット
では、デザイナーが事業責任者になって
果たして上手くやっていけるのか？
##メリット
* サービスデザインが得意
* さくっといろんなものが作れちゃう
* 制作者(デザイナーやエンジニア)の気持ちがよく分かるから調整がしやすい

###ーサービスデザインが得意
デザインとは基本的に何かを伝え、解決するものだと思っている。
デザイナーが事業責任者になるということはサービス全体をデザインすることと同じ
サービス全体を俯瞰し、どこがお客様のどんなニーズに応えていくのか、
チーム全体を俯瞰し、何が事業のボトルネックになっているのか、
普段、デザインをする上で使っていた脳みそと同じ部分を使って考えられる。
それがデザイナー。

###ーさくっといろんなものが作れちゃう
サービスを運用しているとここでお客様にこういうコミュニケーションを取りたい
このバナー変更したいな〜と思った時に
↓
「だれか作ってくれる人いないかなーーー」
となるわけですが、

それがデザイナーだとさくっと作れちゃうんですね。
もしくはどれくらいの工数がかかるかなんとなく分かるというのも強みです。

###ー制作者(デザイナーやエンジニア)の気持ちがよく分かるから調整がしやすい
もともとデザイナーとエンジニアは共にお仕事させていただくことが多いと思うのですが、
デザイナーだから分かる調整の仕方、お願いの仕方、みたいなものって
実はあるはずなのです。
そういうものも含めて事業のことを考えれる。
これも強みかもしれませんね。

#5.企業に務めるデザイナーさんに
案外、デザイナーって事業責任者にしてみたら頑張るかもしれませんよ。
もちろん、得意、不得意、はあるので全てのデザイナーが向いているとは言いませんが、
選択肢の一つとして考えてみるのも有りだと思います。
何かのヒントになれば幸いです


#そんなホワイトプラスにすこしでも興味を持った方
ホワイトプラスではエンジニアさんを大募集中でございます。
ホワイトプラスではエンジニアさんがプロダクトオーナーになった事例もあります！
軽い感じで話聞きに来るとかでもOKだと思うので興味のある方はぜひ
[こちらからご応募いただければと思います](https://www.wantedly.com/projects/69257)
機械学習論文読みメモ_20

[SDCA without Duality, Regularization, and Individual Convexity](http://jmlr.org/proceedings/papers/v48/shalev-shwartza16.pdf), ICML2016
Stochastic dual coordinate ascent(SDCA)は正則化項付きの凸関数和損失最小化問題において、一般的に用いられる最適化手法である。
本論では正則化項を陽に要求せず、かつ双対性に頼らない手法を提案する。
また期待損失が強凸性を持つのであれば、個々の損失が非凸であっても、線形収束を実現出来る事を示した。

[Stochastic Quasi-Newton Langevin Monte Carlo](http://jmlr.org/proceedings/papers/v48/simsekli16.pdf), ICML2016
stochastic gradient MCMC, 例えばstochastic gradient langevin dynamicsなど、は大きなデータに対して事後分布MCMCをやるために有効である。
しかし従来手法では変数間に強い相関がある、変数同士でスケールが異なる、などすると、MCMCのmixing rateが悪くなる。
本論では、quasi newton methodの考え方を援用し、局所的な幾何構造を考慮する事でこの問題に対処した。
少量のサンプルとその勾配値に関する履歴を保持する事で、各点まわりの2次勾配情報を近似する事が出来る。
一方で次元に関して時間とメモリが線形オーダーにしか増えていかないようになっている。

[Actively Learning Hemimetrics with Applications to Eliciting User Preferences](https://arxiv.org/pdf/1605.07144.pdf), ICML2016
ユーザーの嗜好情報を元にアイテム間の距離を学習する。
この距離は、ユーザーがあるアイテムを別のアイテムに入れ替える際に感じるコストを示す。
対象の構造を考慮しない場合、単純にｎ個のアイテムに対しn^2オーダーのクエリが全アイテム間距離を知るために必要である。
本論では、対象構造を考慮し、能動学習に基づくクエリを行う事で少ないsample comlexityでアイテム間距離を学習する。
多くのタスクにおいて提案手法は最適なsample complexityを実現する。
NSColorから色情報を取得する

少しつまづいたのでメモ

NSColorのRGB要素を取得したい時に、NSColorに対してColorSpaceを記述しなかったためクラッシュしました。

# こうやろうとした
```swift
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var blackColor = NSColor.black

blackColor.getRed(&red, green: &green, blue: &blue, alpha: nil)
print(red)
print(blue)
print(green)
```

## 落ちた
```swift
2016-12-14 15:45:12.840 com.apple.dt.Xcode.PlaygroundStub-macosx[4950:260043] *** -getRed:green:blue:alpha: not valid for the NSColor NSCalibratedWhiteColorSpace 0 1; need to first convert colorspace.
```

色空間を最初に設定せよと言われておる。

# こうやったら動くよ
NSColorにColorSpaceを記述します。

```swift
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var blackColor = NSColor.black

if let color = blackColor.usingColorSpaceName(NSCalibratedRGBColorSpace) {
    color.getRed(&red, green: &green, blue: &blue, alpha: nil)
}
print(red)
print(blue)
print(green)
```

# これがしたかった
NSColorを16進文字列に直したかっただけです。

```swift:NSColor+Hex.swift
func hexStr() -> String {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        
        if let color = self.usingColorSpaceName(NSCalibratedRGBColorSpace) {
            color.getRed(&red, green: &green, blue: &blue, alpha: nil)
            let redHexString = String(Int(red * 255), radix: 16)
            let greenHexString = String(Int(green * 255), radix: 16)
            let blueHexString = String(Int(blue * 255), radix: 16)
            
            return redHexString + greenHexString + blueHexString
        }
        return ""
    }
```

# 参考
* [getRed(_:green:blue:alpha:) -  Developer](https://developer.apple.com/reference/appkit/nscolor/1527848-getred)
* [NSColorクラス - Cocoa API解説(macOS/iOS)](http://cocoaapi.hatenablog.com/entry/10010211/NSColor)
C++ Builder XE4, 10.2 Tokyo > network > IPアドレスの4つ目を変更する実装

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

`192.168.79.1`というIPアドレスが分かっている時に4つ目を変更して`192.168.79.31`のようにしたい。

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

#include <vcl.h>
#pragma hdrstop

#include <memory>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static String GetIpAddress_4thReplaced(String srcStr, int num4th)
{
	std::unique_ptr<TStringList> list(new TStringList);

	list->StrictDelimiter = true;
	list->Delimiter = L'.';
	list->DelimitedText = srcStr;

	String res = list->Strings[0] + L"." + list->Strings[1] + L"."
		+ list->Strings[2] + L"." + IntToStr(num4th);

	return res;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	static const String kIPadr_original = L"192.168.79.1";

	String ipadr_modified = GetIpAddress_4thReplaced(kIPadr_original, 31);

	OutputDebugString(ipadr_modified.c_str());
}
//---------------------------------------------------------------------------
```

```txt:結果
デバッグ出力: 192.168.79.31 プロセス Project1.exe (3720)
```

XE4にIPアドレスの一部を変更するAPIがあるかもしれない。ヘルプを探そうとしたが断念した。
APIがあれば、そちらを使う方がいいと思う。
(Indyにあるかもしれない。)

関連 http://qiita.com/7of9/items/1e0de27c97d4994a8d27
スマホでtableタグを見やすくするCSS


レスポンシブデザインでページを作っていると、表組みの `<table>` タグがスマホの小さい画面だと、ちょっと見にくかったりします。じゃあ `<table>` やめるかーと思っても意味合い的に表だから `<table>` 使いたいよというわけでCSSでどうにかしてみました。

![pc.png](https://qiita-image-store.s3.amazonaws.com/0/2152/05f0ad0b-b9ca-9ca7-44f9-0d8928714823.png "pc.png")

PCだと、こういう見た目です。HTMLとCSSはこちら。まぁ、なんてことないただの表です。

```html
<table>
  <thead>
    <tr>
      <th>商品名</th>
      <th>価格</th>
      <th>個数</th>
      <th>小計</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ねこねこニャンニャン丸 限定プレミアムわんこエディション</td>
      <td>980円</td>
      <td>2個</td>
      <td>1,960円</td>
    </tr>
    <tr>
      <td>あたまおっぱいおへそ飛んでチーングッズ</td>
      <td>1,280円</td>
      <td>1個</td>
      <td>1,280円</td>
    </tr>
  </tbody>
</table>
```

```css
table {
  border-collapse: collapse;
}
th, td {
  border: 1px solid #dddddd;
  padding: 15px;
}
```

これがiPhone5の画面で見るとこうなります。

![sp1.png](https://qiita-image-store.s3.amazonaws.com/0/2152/79541daf-eadb-0049-5d3f-240ad61572e7.png "sp1.png")

文字が折れてしまってちょっと見にくいですね。これをこうします。ただの表組みからバーティカルな見た目になって、一見 `<table>` で組んでるようには見えませんね。多少マシになったと思います。

![sp2.png](https://qiita-image-store.s3.amazonaws.com/0/2152/5e33e360-e67b-9b4b-07f1-18576f8d5304.png "sp2.png")

HTMLとCSSはこちら。ちょっとゴチャゴチャしてるけど、ポイントは1点だけです。

```html
<table class="responsive">
  <thead>
    <tr>
      <th>商品名</th>
      <th>価格</th>
      <th>個数</th>
      <th>小計</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ねこねこニャンニャン丸 限定プレミアムわんこエディション</td>
      <td data-title="価格" class="col-6">980円</td>
      <td data-title="個数" class="col-6 txt-right">2個</td>
      <td data-title="小計" class="clear txt-right">1,960円</td>
    </tr>
    <tr>
      <td>あたまおっぱいおへそ飛んでチーングッズ</td>
      <td data-title="価格" class="col-6">1,280円</td>
      <td data-title="個数" class="col-6 txt-right">1個</td>
      <td data-title="小計" class="clear txt-right">1,280円</td>
    </tr>
  </tbody>
</table>
```

```css
@media (max-width: 767px) {
  .responsive {
    border-collapse: separate;
    border-spacing: 0  20px;
  }
  .responsive thead {
    display: none;
  }
  .responsive tr {
    background-color: #f6f6f6;
  }
  .responsive td {
    border: none;
    display: block;
    width: 100%;
    box-sizing: border-box;
    border-bottom: 1px solid #dddddd;
  }
  .responsive td.col-6 {
    float: left;
    width: 50%;
  }
  .responsive td.txt-right {
    text-align: right;
  }
  .responsive td:before {
    content: attr(data-title) " ";
  }
  .responsive .clear {
    clear: both;
  }
}
```

### 表見出しを操作する

普通の表だと項目が多くなるに連れて、横に長くなってしまいます。画面の横幅がせまいスマホではつらいです。というわけで、`<td>` を `display: block` にすることで縦表示にします。こうすると今度は `<th>` で表示しているテーブル要素の見出しが遠くに離れてしまって、なんの要素なのかが分かりにくくなります。

そこでCSSの `attr()` を使います。

`attr()`は対象DOMの属性値を取得できます。これと `content` を併用することでJavaScriptを使っていないのに、まるで動的に要素をいじっているかのようにできます。便利。

```css
td:before {
  content: attr(data-title) " ";
}
```

対応ブラウザはIE8から使えてるので安心。僕はこれを最近知りました…。もっと早く知りたかった…。

- [参考:Can I use?](http://caniuse.com/#feat=css-gencontent)

まぁとはいえ比較表とかの場合は横スクロールになってでも、ちゃんと表組みにしたほうが見やすいものとかもあるのでケースバイケースかもですね。
Neo4jの資料(勉強用)

自分用にまとめています．

# Neo4jの操作に関する資料
http://www.creationline.com/lab/7168

### 実行例
- https://ecpplus.net/weblog/%E3%82%B0%E3%83%A9%E3%83%95db-neo4j-%E3%81%A7%E7%B5%8C%E8%B7%AF%E6%A4%9C%E7%B4%A2/
- http://blog.adjust-work.com/1211/

# PHPによるNeo4jの操作に関する資料
https://neo4j.com/developer/php/

### 実行例
- https://www.sitepoint.com/discover-graph-databases-neo4j-php/
- https://www.sitepoint.com/adding-social-network-features-php-app-neo4j/
- https://www.sitepoint.com/efficient-user-timelines-php-application-neo4j/

# 外部サーバーによるNeo4jの運用
- http://notainu.hateblo.jp/entry/2015/09/25/005410
(GrapheneDB)
- http://qiita.com/awk256/items/74b11531db9dc71bd6e2
(AWS)
docker-composeコマンドが長いので短く打てるようにした

## docker-composeコマンドが長い

開発中、docker-composeでコンテナの立ち上げとか終了とかをやっているとこんな感じになることが多い。

```shell-session
# 終了して削除したい
docker-compose stop hoge && docker-compose rm -f hoge

# 終了して削除してビルドしてupしたい
docker-compose stop hoge && docker-compose rm -f hoge && docker-compose build hoge && docker-compose up -d hoge

# 終了して削除してビルドしてupしてログを見たい
docker-compose stop hoge && docker-compose rm -f hoge && docker-compose build hoge && docker-compose up -d hoge && docker-compose logs -f hoge
```

毎回毎回`docker-compose`とコンテナ名を打ち直すのは面倒だ。
そこで、aliasで短く打てるように`~/.zshrc`へこのように書いた。（bashの場合は`bash_profile`)

```~/.zshrc
alias dcps="docker-compose ps"
alias dcbd="docker-compose build"
alias dcup="docker-compose up -d"
alias dcst="docker-compose stop"
alias dcrm="docker-compose rm -f"
alias dclog="docker-compose logs -f"

function dcstrm() {
  dcst $1 && dcrm $1
}

function dcrl() {
  dcstrm $1 && dcbd $1 && dcup $1
}

function dcrlog() {
  dcrl $1 && dclog $1
}
```

## 大分短かくなった

```shell-session
# 終了して削除したい
dcstrm hoge

# 終了して削除してビルドしてupしたい
dcrl hoge

# 終了して削除してビルドしてupしてログを見たい
dcrlog hoge
```
なんて便利なんだろう。**もっと早くやっておけばよかった……。**

## aliasはシェルスクリプトとは書き方が違う

最初、シェルスクリプトと同じつもりで次のようなaliasを書いたところ、`dcstrm`から先がうまく動作しなかった。
`$1`がうまくパラメータとして渡らず、全てのコンテナが操作の対象となってしまうのだ。

```.zshrc
alias dcps="docker-compose ps"
alias dcbd="docker-compose build $1"
alias dcup="docker-compose up -d $1"
alias dcst="docker-compose stop $1"
alias dcrm="docker-compose rm -f $1"
alias dclog="docker-compose logs -f $1"

# ここから先がうまく動かない!
alias dcstrm="dcst $1 && dcrm $1"
alias dcrl="dcstrm $1 && dcdb $1 && dcup &1"
alias dcrlog="dcrl $1 && dclog $1"
```

ググってみると、aliasはシェルスクリプトと一緒ではなく、`$#`のようなものは使えないことが分かった。
引数を使いたいときはfunctionを定義するとのこと。

>To quote the bash man page:
>
>>There is no mechanism for using arguments in the replacement text. If arguments are needed, a shell function should be used (see FUNCTIONS below).

>So it looks like you've answered your own question -- use a function instead of an alias
>
[How to pass command line arguments to a shell alias? - Stack Overflow](http://stackoverflow.com/questions/941338/how-to-pass-command-line-arguments-to-a-shell-alias)
JavaScriptでLINQ

これは[Nextremer Advent Calendar 2016](http://qiita.com/advent-calendar/2016/nextremer)の第11日目の記事です。

# はじめに
LINQが好きなのでフロントエンド、Node.jsでもLINQしたいです。
npmで何種類かありますが[linq](https://github.com/mihaifm/linq)をつかいます。
# LINQとは
>オブジェクトやデータベース、データセット、エンティティ、XML文書など、アプリケーションで扱うさまざまなデータソースに対して、統一的な手段でアクセスするしくみ

#使用例
```
npm install linq
```
##データの準備
```js
import Enumerable from 'linq';

const objects =
    [
      { id: 1, name: 'たろう', sex: 'man', score: 100 },
      { id: 2, name: 'じろう', sex: 'man', score: 80 },
      { id: 3, name: 'さぶろう', sex: 'man', score: 40 },
      { id: 4, name: 'はなこ', sex: 'woman', score: 20 },
    ];
```
##基本
```js
Enumerable
    .from( objects ) //オブジェクトの準備
    .where( x => x.score >= 75 ) //75点以上でフィルタ
    .select( x => console.log( x.name ) ) //名前を表示
    .toArray(); //処理の実行（遅延処理）
//=>たろう
//=>じろう
```
##平均点を求める
```js
const averageScore = Enumerable
    .from( objects )
    .average( x => x.score );

console.log( averageScore );
//=>60
```
##男女の数をかぞえる
```js
Enumerable
    .from( objects )
    .groupBy(
        x => x.sex,
        null,
        ( key, g ) => console.log( `sex:${key} count:${g.count()}` ) )
    .toArray();
//=>sex:man count:3
//=>sex:woman count:1
```
##ランダムに１人選ぶ
```js
Enumerable
    .from( objects )
    .shuffle()
    .take( 1 )
    .select( x => console.log( x.name ) )
    .toArray();
//=>たろう(ランダム)
```
##100点が存在するか
```js
const anyPerfect = Enumerable
    .from( objects )
    .any( x=> x.score === 100 );
console.log( anyPerfect );
//=>true
```
##idの降順で並び替えて最初のデータ
```js
const firstOrDefault = Enumerable
    .from( objects )
    .orderByDescending( x=>x.id )
    .firstOrDefault( null, x => x );

console.log( firstOrDefault );
//=>{ id: 4, name: 'はなこ', sex: 'woman', score: 20 }
```
##他
他にもメソッドは多数あります。
[ここ](http://neue.cc/reference.htm)または[ここ](https://github.com/mihaifm/linq/tree/master/test)をみてください

#まとめ
配列の操作が簡単かつコードが見やすくなるので積極的につかっていきたいです。
EC2にキーペアが配信されるしくみ


AWS ConsoleからEC2を起動すると、指定したキーペアが知らないあいだに配信されてて、手元の秘密鍵でSSH接続できます。
どういう仕組なのか知らなかったのでちょっと調べました。

> 検証に利用した Amazon Linux AMI:
> amzn-ami-hvm-2015.09.1.x86_64-gp2 (ami-383c1956)

## SSH公開鍵 -> ~/.ssh/authorized_keys

SSHの公開鍵はここにあります。

```
[ec2-user]$ cat ~/.ssh/authorized_keys 

ssh-rsa AAAAB3NzaC1yc2E.... {キーペア名}
```

EC2が起動した時には既にあるわけですが、 (じゃないとSSH接続できない) どうやって配信？されているのでしょうか。

## Instance metadata からSSH公開鍵を取得できる

AWSでは [Instance metadata] と呼ばれるEC2インスタンス個別のデータがあります。これは HTTP GET でEC2インスタンスから参照できます。

例えば、SSH公開鍵はこうやって取れます。

```
[ec2-user]$ curl -s -L http://169.254.169.254/2011-01-01/meta-data/public-keys/0/openssh-key/

ssh-rsa AAAAB3NzaC1yc2E.... {キーペア名}
```

## 起動時に cloudinit が ~/.ssh/authorized_keys を更新

EC2インスタンスの起動時に [cloud-init] が実行されています。
[cloud-init] が [Instance metadata] からSSH公開鍵を取ってきて、 ``~/.ssh/authorized_keys`` を更新している様です。

* ``/usr/lib/python2.7/dist-packages/cloudinit/ssh_util.py``

これはAmazonが独自にカスタマイズしたPythonスクリプトで、コードを見た感じ以下の動きをします。

1. [Instance metadata] から [AWS Console >> EC2 >> Key Pairs] に登録したSSH公開鍵を取ってくる
    * GET http://169.254.169.254/2011-01-01/meta-data/public-keys/0/openssh-key/
2. ``~/.ssh/authorized_keys`` をラインパースする
3. [Instance metadata] から取って来た公開鍵とBASE64部分が一致するラインがあるか...？
    * (ある) ==> BASE64部分が一致するラインを更新する
    * (ない) ==> 一番下に新規に追加する

```py:/usr/lib/python2.7/dist-packages/cloudinit/ssh_util.py
def update_authorized_keys(old_entries, keys):
    to_add = list(keys)

    for i in range(0, len(old_entries)):
        ent = old_entries[i]
        if not ent.valid():
            continue
        # Replace those with the same base64
        for k in keys:
            if not ent.valid():
                continue
            if k.base64 == ent.base64:
                # Replace it with our better one
                ent = k
                # Don't add it later
                if k in to_add:
                    to_add.remove(k)
        old_entries[i] = ent

    # Now append any entries we did not match above
    for key in to_add:
        old_entries.append(key)

    # Now format them back to strings...
    lines = [str(b) for b in old_entries]

    # Ensure it ends with a newline
    lines.append('')
    return '\n'.join(lines)
```


[Instance metadata]:http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
[cloud-init]:https://cloudinit.readthedocs.io
[AWS Console >> EC2 >> Key Pairs]:https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#KeyPairs:sort=keyName
IoTを使ってチームを在席確認の「めんどくさい」から解放しようとした話

こんにちは。毛色の違う投稿担当(？)のvalitohです。
[前回](http://qiita.com/valitoh/items/ce4a260e0f3990a01d84)はプロダクトオーナーをめんどくさいことから解放しようとした話を書きました。
[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)、14日目は別の「めんどくさい」からの解放をテーマに書いてみようと思います。

##きっかけ：チームメンバーの状況
私の部署は新規事業開発という立ち位置から、社外の提携先・共同開発者や社内の他部署との関わりが多く、メンバーは社内打ち合わせや外出が多くなりがちです。
そのため、カレンダーだけを見ても社内にいるのか外出しているのかを把握しにくいことがありました。

##irucaをチームで使ってみる
在席状況を可視化し、ひとまとめにできるサービスはないかと探す中で[iruca](https://iruca.co/)というサービスに出会いました。[ことでんのICカード](http://www.kotoden.co.jp/publichtm/iruca/what/index.html)じゃないよ！(などと、弊社っぽい小ネタをはさみつつ)

irucaには「在席」「取込中」「離席」「外出」「休暇」のステータスがあり、在席状況が可視化されるようになります。
![スクリーンショット_2016-12-14_10_58_35.png](https://qiita-image-store.s3.amazonaws.com/0/152460/0d2e2932-f279-6025-9e93-88d7360fe5d2.png)
<br>
irucaのステータス確認のためにwebページを開くことすら省略してしまおうと、すでに社内で導入していたSlackとも連携させて使っています。Slackからのコマンド入力でステータスの変更＆ステータス更新時にSlackにメッセージを送ることができるようになりました。
![スクリーンショット_2016-12-14_10_54_42.png](https://qiita-image-store.s3.amazonaws.com/0/152460/1405f783-4c18-6833-363d-b6e2facebf10.png)
<br>
ただ、たまにステータス変更を忘れることがあり、もっと簡単にステータス変更したいと考えていました。

##MESHでirucaコントローラーを作成
もっと手軽なステータス変更方法はないかと考えて、[MESH](http://meshprj.com/jp/)の動きタグと[IFTTT](https://ifttt.com/)を使ったコントローラーを作成しました。

まず、MESHのアプリを使って動きタグの向きが変わった際にIFTTTへイベントIDを送信するというレシピを作成します。
![IMG_0304.jpg](https://qiita-image-store.s3.amazonaws.com/0/152460/388ca0cb-94f9-878c-ef28-c022f0c31e68.jpeg)![IMG_0305.jpg](https://qiita-image-store.s3.amazonaws.com/0/152460/3ac37f82-e960-f9c4-edab-02d672e6573c.jpeg)
<br>
IFTTT側では、「MESHからイベントIDが送信されたら、[irucaのAPI](https://iruca.co/api)でステータスを更新」というアプレットを作成しました。
![スクリーンショット_2016-12-14_12_57_44.png](https://qiita-image-store.s3.amazonaws.com/0/152460/a2dd3772-8ecc-cada-f641-8ab95995a965.png)
<br>
動きタグを木製のキューブに内蔵したら完成です。
![DSC_3524.JPG](https://qiita-image-store.s3.amazonaws.com/0/152460/277bad3b-ef33-fde1-3001-7450a444698f.jpeg)
<br>
木製のキューブは100円ショップで手頃な大きさのものを探してきました。金属製でなければタグからの通信に問題は無いようです。
![スクリーンショット 2016-12-14 13.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/152460/569d87d0-e7ab-8906-0a95-f72ca1830df3.png)

##まとめ
今回はMESH→IFTTT→iruca→Slackという順でやり取りをする仕組みを作りましたが、この仲介をしている「IFTTT」の汎用性は高いですね…
次の回(来週予定)ではIFTTTを活用して別の「めんどくさい」からの解放に挑戦してみようと思います。
【第１回】「Android で Widget を作りたい」ので、公式ドキュメントを読んでいく

Android の Widget についてまとめてみます。

Widgetは個人的に、iPhoneと make a difference できるポイントだと思っています。
iPhoneにもウィジェットは[あります](https://support.apple.com/ja-jp/HT207122)が、アプリのアイコンと混在することはなさそう。

インターフェースの設計的な都合なのだろうと思っています。ホーム画面には、タイル状にアイコンが並ぶべし、みたいな。

seil君から質問が飛んできてWidget熱が再燃。頑張るぞ。

[ウィジェット公式ドキュメント](https://developer.android.com/guide/topics/appwidgets/index.html) 最高。

個人で新しく勉強しながら公式ドキュメントを訳しつつまとめていくので、間違いがきっとあると思います。

間違いを見つけた際はコメントでのご指摘をいただけると嬉しいです。

【追記】[→第２回リソースフォルダ編<前編>](http://qiita.com/rild/items/43881b44a356d9888aa1)を書きました。

## まず初めに
一部のAndroid に関する記事は[日本語バージョン](https://developer.android.com/guide/index.html?hl=ja)が用意されていますが、

**Widgetの記事日本語じゃないのです！？**

エモい。

## App Widgets
公式ドキュメントのどの辺にあるか

Develop > API Guides > App Components

## Widgetとは

冒頭の部分の引用

> App Widgets are miniature application views that can be embedded in other applications (such as the Home screen) and receive periodic updates. These views are referred to as Widgets in the user interface, and you can publish one with an App Widget provider. An application component that is able to hold other App Widgets is called an App Widget host.

ウィジェットとは、「ホームスクリーンとかに埋め込まれちゃうような、ちっちゃなアプリ」

## Widget 関連記事
[App Widgets](https://developer.android.com/guide/topics/appwidgets/index.html) の記事からリンクが貼られていた記事
### デザイン
- Googleの[ウィジェットデザインガイドライン](https://developer.android.com/design/patterns/widgets.html)

に従うと良さそう

### ウィジェットのホストアプリ
- [App Widget Host](https://developer.android.com/guide/topics/appwidgets/host.html)

ウィジェットの親玉？

## Widget を作るために必要なこと
1. AppWidgetProviderInfo オブジェクトを使うこと
 - ウィジェットに関するメタデータ。
 - メタデータには、レイアウト、ウィジェットの更新頻度、AppWidgetProviderクラスに関する情報が含まれる。
 - XMLで記述される。
2. AppWidgetProvider クラスを実装すること
 - AppWidgetProviderはウィジェットを動作させる基本的なメソッドが定義されているクラス。
 - ブロードキャストイベントに基づく。
 - ウィジェットが更新、設置、停止、削除されたときAppWidgetProviderを通じて、ブロードキャストを受け取る。

3. View layout
 - 見た目の部分。
 - レイアウトの初期値を与える。
 - XMLで記述される。

以上の３つが、ウィジェットを作るために必要になるもの。

これらに加えて、ウィジェット設定を変えるためのアプリを作ることも可能。

その場合は、専用の設定が必要 [> Creating an App Widget Configuration Activity](https://developer.android.com/guide/topics/appwidgets/index.html#Configuring)

### AppWidgetProviderについて
(2. の部分、訳が自信ないので、原文を載せます。)
> **AppWidgetProvider class implementation**　　
> Defines the basic methods that allow you to programmatically interface with the App Widget, based on broadcast events. Through it, you will receive broadcasts when the App Widget is updated, enabled, disabled and deleted. 


### Broadcastについて
- [アプリケーションの基礎 > ブロードキャスト レシーバー](https://developer.android.com/guide/components/fundamentals.html?hl=ja)
- [BroadcastReceiver](https://developer.android.com/reference/android/content/BroadcastReceiver.html)

一旦ここまで、、、
Angular2をCDNから取得する方法

CDNプロバイダの https://unpkg.com を利用するとAngular2の各バージョンが取得可能です。
`@angular/core`パッケージを例にすると、URLの指定方法は以下の通りとなります。

| # | URL                                    | Summary                     |
|:--|:---------------------------------------|:----------------------------|
| 1 | https://unpkg.com/@angular/core        | 最新バージョンを取得          |
| 2 | https://unpkg.com/@angular/core@2.2.4  | バージョンを指定して取得      |
| 3 | https://unpkg.com/@angular/core@2.2.4/ | ブラウザでファイル一覧を見れる<br/>(画面右上からバージョンの切り替えも可能) |


# :one: 動作確認環境

`angular@2.3.0`を指定したサンプルをPlunkerに用意しました。

 - [Plunker: Angular2のバージョン指定サンプル](https://embed.plnkr.co/FZht0l/)


# :two: サンプルコード

```html:index.html
<!DOCTYPE html>
<html>

  <head>
    <base href="." />
    <title>angular2 playground</title>
    
    <!-- [ Load: Environment Library ] -->
    <script src="https://unpkg.com/zone.js@0.7.2/dist/zone.js"></script>
    <script src="https://unpkg.com/zone.js@0.7.2/dist/long-stack-trace-zone.js"></script>
    <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
    <script src="https://unpkg.com/systemjs@0.19.31/dist/system.js"></script>
    
    <!-- [ Load: Angular2 Library ] -->
    <script>
      System.config({
        transpiler: 'typescript',
        typescriptOptions: {
          emitDecoratorMetadata: true,
        },
        paths: {
          // 'cdn'の定義
          'cdn:': 'https://unpkg.com/',
        },
        map: {
          'typescript': 'cdn:typescript@2.1.4',
          'rxjs'      : 'cdn:rxjs@5.0.1',
          '@angular/core'                    : 'cdn:@angular/core@2.3.0',
          '@angular/common'                  : 'cdn:@angular/common@2.3.0',
          '@angular/compiler'                : 'cdn:@angular/compiler@2.3.0',
          '@angular/platform-browser'        : 'cdn:@angular/platform-browser@2.3.0',
          '@angular/platform-browser-dynamic': 'cdn:@angular/platform-browser-dynamic@2.3.0',
          '@angular/http'                    : 'cdn:@angular/http@2.3.0',
          '@angular/router'                  : 'cdn:@angular/router@3.3.0',
          '@angular/forms'                   : 'cdn:@angular/forms@2.3.0',
        },
        packages: {
          app: { defaultExtension: 'ts' },
          rxjs: { defaultExtension: 'js' },
        },
      });

      System.import('app/main.ts').catch(console.error.bind(console));
    </script>
  </head>

  <body>
    <my-app>loading...</my-app>
  </body>

</html>
```

```ts:app/mail.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { BrowserModule } from '@angular/platform-browser';
import { Component, NgModule } from '@angular/core';

/**
 * Main Application Component
 */
@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello</h2>
    </div>
  `,
})
export class App
{
}

/**
 * Application Module
 */
@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App ],
  bootstrap: [ App ],
})
export class AppModule
{
}

platformBrowserDynamic().bootstrapModule(AppModule);
```
特異クラスについてメモ

## 特異クラスとは
 - 継承階層に含まれている名前のない不可視クラス
 - インスタンスは生成できない
 - クラスメソッドやモジュールから取り込んだメソッドを格納する場所を提供

## 確認
```rb
# クラスメソッド定義時に、クラスの特異クラスが自動生成されメソッドが定義されることの確認

class MyClass
  def self.hoge
  end
end

# singleton_classで特異クラスを取得できる
p MyClass.singleton_class.instance_methods(false)　
# => hoge
```


```rb

# インスタンスに特異メソッド定義時に、インスタンスの特異クラスが自動生成されメソッドが定義されることの確認
a = MyClass.new
def a.fuga
end

# singleton_classで特異クラスを取得できる     
p a.singleton_class.instance_methods(false)
# => fuga
```
difference > shutdownコマンド > Windows / linux < 自PC / 他PC over the internet

通信経路にあるPCをshutdownする場合のコマンドについて調べた。
自PCのshutdownと合わせて記載する。


## 自PCでのshutdown

### Windows

http://www.atmarkit.co.jp/ait/articles/0601/14/news013.html

```
> shutdown -s -t 0
```

### linux

自分がよく使うのは以下。

```
$ sudo shutdown -h now
```

## 他PCからのshutdown

### Windows

[Remote shutting down computer over WiFi with cmd](http://stackoverflow.com/questions/21647488/remote-shutting-down-computer-over-wifi-with-cmd)

設定をしてから以下を実行する。

```
> shutdown -m \\mypcname -r -c "this pc will shutdown in 60 secs" -t 60
```

デフォルト設定ではないため、設定変更する場合と、自作shutdownソフトを走らせる場合の利点、欠点は検討を要する。
OSの機能として用意されているというのは１ポイント。

どのバージョンのWindows(7, 8.1, 10?)で有効かは未消化。

### linux

sshとsudoの組合せ

http://unix.stackexchange.com/questions/169443/how-to-shutdown-another-computers-by-using-their-ips-in-shell-script

```
$ ssh user@remote_computer sudo poweroff
``` 

上記の例では`shutdown -h now`の代わりに`poweroff`を使用。
pacemakerのリソースを移動しようとしたら移動禁止フラグがたってたので消した

opensslとかkernelとかの脆弱性対応でOS再起動するというとき、
冗長化してるところはリソースを移動さして極力影響ないようにしたいなーというメンテで、
よくみたら移動禁止フラグがたってたので消した話です。

corosyncではないのでpcsではなくまだcrmですね。

（ちなみにzabbix-proxyとzabbix-serverが混在する環境ではデータ取得ありでのメンテはproxyからのデータがきてしまうためか発報しまくりつつなかなか落ちないので全てのデータ取得なしでメンテする必要がありました。データ取得なしだと待つこともなく平和でした。）

・リアルタイムモニタリングしとく

```
sudo crm_mon -i1 -Af
```

・待機系に切り替えるにはforceが必要であった

```
sudo crm resource move grp1 node2 force
```

・なんか切り替わらないので設定を確認

```
sudo crm configure show
～略～
rule $id="cli-standby-rule-grp1" -inf: #uname eq node2　★これが移動禁止フラグ
～略～
```

・よくみたら移動禁止フラグがたってたので消した

```
sudo crm resource unmove grp1
sudo crm configure show
```

・OS再起動おわって移動禁止フラグけしてから主系に戻す

```
sudo crm resource move grp1 node1 force
```

状況からしてコマンド打ち間違ったり起動してないのに移動させよう等すると移動禁止フラグが出現するようだったかと。

参考にさせていただいた先輩いわく神サイト↓
http://friendsnow.hatenablog.com/entry/2013/05/29/235552

ありがとうございました。
グループプロセスをとらえる１０の視点

12月13日にアントレプレナーズラボ忘年会２０１６が行われました。
そこで、他のプロジェクトの方々とゲームなどいろいろなイベントをしましたが、
ゲームの中で少し講義も踏まえながら楽しく進行していきました。
今回はその講義の中で学んだことを紹介していきたいと思います。

##１０の視点とは
題名でグループプロセスをとらえる１０の視点と書いてありますが、実際にはどういったものなのでしょうか。
その１０の視点は
**1.メンバーシップ**
**2.メンバーの感情**
**3.コミュニケーション**
**4.グループの雰囲気**
**5.影響力のあり方**
**6.目標の共有化**
**7.時間管理**
**8.組織化＝仕事の手順の明確化と役割分担**
**9.意思決定の仕方**
**10.グループの範囲**
だといいます。私たちは実際にグループを作り、
この１０の視点を考えながらゲームを進めていきました。
このことを踏まえながら行動していくことで、とても有意義な時間を過ごすことができました。
そのなかで自分が一番大切だと思ったのは、
組織化＝仕事の手順の明確化と役割分担　です。
物事に対しての仕事の進め方や手続きが明確化されていないと
一人のやることに無駄が出てきたりします。
ここを明確化することで効率的に仕事を進めていくことができるんじゃないかと思いました。

##感じた事
今回お話を聞いて気づいたことは、
未完了を増やさないことが大切
という言葉が一番心に残っています。
私の中では未完了な部分がたくさんあり、
そのことで成果に繋がらない部分もあると感じました。
2017年度の目標の一つとして、
未完了なことを一つずつ減らしていき、成果に繋げていきたいと思いました。

##最後に
私はこの記事投稿が初めてになるのですが、最後まで読んでいただきありがとうございました。
今後は文章の作り方などもまだまだだと思うので、なおしつつ、今取り組んでいるAndroidについての記事を
たくさん書けるように勉強し、3年生がいなくてもやっていける様にプロジェクトを盛り上げていこうと思います。
ありがとうございました！
##参考文献
アントレプレナーズラボ忘年会２０１６で頂いた資料
qmailでwarning: trouble opening remoteをqueue-fixで修復

/var/log/maillog に下記警告が出ていた
> warning: trouble opening remote/13/4653741; will try again later
> warning: trouble opening remote/1/4653821; will try again later
> warning: trouble opening remote/10/4653807; will try again later
> warning: trouble opening remote/4/4653870; will try again later

調べてみると、メールキューを手動で削除・移動をすると整合性が合わなくなるみたいで、それが原因で発生した警告そうです。
メールキューを自動で整合性チェックし修復してくれるqueue-fixをやってみました。

- CentOS 5.5
- qmailadmin 1.2.15
- vpopmail 5.4.30

qmail停止
/etc/rc.d/init.d/qmail stop
queue-fixをゲット
wget http://www.netmeridian.com/e-huss/queue-fix.tar.gz
解凍
tar xzvf queue-fix.tar.gz
移動
cd queue-fix-1.4
オリジナルをバックアップ
cp -p error.h error.h.org
error.hを編集
vi error.h
> extern int errno;
> ↓コメントアウト
> // extern int errno;

conf-ccも編集※make中エラー対策
vi conf-cc
> gcc -O2
> ↓オプション追記
> gcc -O2 --include /usr/include/errno.h

makeする
make
実行
./queue-fix -i /var/qmail/queue

queue-fix実行から3時間ほど経ってログを確認するとwarningは無くなっていたので完了。
Swiftが混在したプロジェクトでObjective-Cの単体テストを動かしたら'*-Swift.h' file not foundがでた場合


Objective-CのプロジェクトにSwiftを入れていくとObjective-Cの ```.h``` ファイルに ```*-Swift.h```をimportすることがあると思います。
そのまま、単体テストを動作させようとするとコンパイルエラーになると思います。その対処方法です。

__追記__
テストクラスでswiftのクラスを操作したい場合で、且つ循環参照が起こらない場合。それ以外の場合は、前方宣言をするのが推奨パターンです。
詳細は、コメント欄を参照してください。

# 対処方法

'*-Swift.h'の生成されたパスを設定するだけです。

テストプロジェクトのTARGETSを選択して「Build Settings」で、「Header Search Paths」を検索してください。
そこに以下のパスを入力すればOKです。

```
"$(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources"
```

なお、プロジェクト名にスペースがある場合は、```$(PROJECT_NAME)``` の所に直接自分のプロジェクト名を入力してください。

また、単体テストのソースで、'*-Swift.h'をimportするとコンパイルエラーになります。importする必要はありません。
[Javaの小枝] 可視性なんてぶっつぶせ！

# はじめに

知識としてはリフレクションを使って private なメソッドやフィールドにアクセスできることは知っていた。特に [unit test の際に重宝できる](http://qiita.com/y-saito/items/5f405c9f820a8753ab1a)ことも。ただ、今まではどうも黒魔術的な API を使うのに腰が引けていたのと、そもそも unit test の際に private にアクセスしなくてはならないこと自体、ダメな設計であるということで出来る限り元ソースの方の修正を依頼する方向で仕事をしていた。

ただ考えてみたらホンの少しのコードを自分のライブラリに加えておくだけでささっと unit test できるわけで、使いどころさえしっかりしていれば別にそんなに極端に悪いことでもない。それに「Javaの小枝」っぽいネタだし。ということで以下のコードを自前ライブラリに加えることにする。(例によって Tuple は以前示したものを使っている)

```VisibilityBreaker.java
	public static class VisibilityBreaker {
		public static interface Invokable {public Object invoke(Object...args) throws Exception;}
		public static interface Readable {public Object read() throws Exception;}
		public static interface Writable {public void write(Object value) throws Exception;}

		private final List<Tuple2<Method, Invokable>> methods = new ArrayList<>();
		private final List<Tuple3<Field, Readable, Writable>> fields = new ArrayList<>();

		public Invokable getMethodInvokerBy(Predicate<Method> condition) {return methods.stream().filter(tpl2 -> condition.test(tpl2.car)).map(tpl2 -> tpl2.cdr.car).findAny().get();}
		public Readable getFieldReaderBy(Predicate<Field> condition) {return fields.stream().filter(tpl3 -> condition.test(tpl3.car)).map(tpl3 -> tpl3.cdr.car).findAny().get();}
		public Writable getFieldWriterBy(Predicate<Field> condition) {return fields.stream().filter(tpl3 -> condition.test(tpl3.car)).map(tpl3 -> tpl3.cdr.cdr.car).findAny().get();}

		public Invokable getMethodInvokerByName(String name) {return getMethodInvokerBy(m -> name.equals(m.getName()));}
		public Readable getFieldReaderByName(String name) {return getFieldReaderBy(f -> name.equals(f.getName()));}
		public Writable getFieldWriterByName(String name) {return getFieldWriterBy(f -> name.equals(f.getName()));}
		
		public VisibilityBreaker(Object source) {
			for (Method m : source.getClass().getDeclaredMethods()) methods.add(Tuple.of(m, args -> m.invoke(source, args)));
			for (Field f : source.getClass().getDeclaredFields()) fields.add(Tuple.of(f, () -> f.get(source), value -> f.set(source, value)));
			methods.stream().forEach(m -> m.car.setAccessible(true));
			fields.stream().forEach(f -> f.car.setAccessible(true));
		}
	}
```

こんな風に使う。これでみんなでバリバリ private フィールド壊しまくって遊ぼうず(違

```Main.java
	public static class Sample {
		private  void privMethod(String hoge) {System.out.println("priv " + secret + " " + hoge);}
		private int secret = 234;
	}
		
	public static void main(String[] args) throws Exception {
		Sample s = new Sample();
		
		VisibilityBreaker broken = new VisibilityBreaker(s);
		
		System.out.println(broken.getFieldReaderByName("secret").read());
		broken.getFieldWriterByName("secret").write(456);
		System.out.println(broken.getFieldReaderByName("secret").read());
		
		broken.getMethodInvokerByName("privMethod").invoke("hogehoge");
	}
```
結局アレはどうなった？　「はきだめ」もとい「Setsuna」プロジェクト

# まえがき
あー、なんてこった。
今諸事情で家を追い出されて、手持ちのラップトップで[ヒマジンマンガ](http://manzyun.bitbucket.org/blog/html/index.html)の更新しようと思って、2回OSごとぶっ飛んだ7年選手のラップトップに[Tinkerer](http://tinkerer.me/)をインストールしようとしたら、以下みたいなエラー吐いて更新できない！

``` sh
*********************************************************************************
    Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
    *********************************************************************************
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
    
    ----------------------------------------
Command "/home/manzyun/tinkerer/bin/python3.5 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-t5fjdibj/lxml/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-z22hg___-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/username/tinkerer/include/site/python3.5/lxml" failed with error code 1 in /tmp/pip-build-t5fjdibj/lxml/

```
でも時間は迫ってる。
仕方ない。Qiitaに掲載されているAdventCalenderだから、ここに書こう。

# 本題
## その前にSetsunaとは

[manzyun/Setsuna: Micro SNS or BBS, maybe.](https://github.com/manzyun/Setsuna)

一言で説明するとだ、
「投稿に寿命のついた匿名掲示板」
ってことだ。「刹那」に由来する。

### 仕様

* 投稿します
* 通常6時間後にDBからも抹消されます。魚拓でも取らない限り残らない。
* しかしレスポンス（「共感ボタン」を押される、返信される）が来ると記事の寿命が1時間伸びる
* パスワードを控えておけば、手動で消せる

それだけのくっだらない。だけども僕はとっても欲しかったSNS（？）

追加要素として以下もあった。

* 投稿画面で一定時間入力がなかったら全消し
* 時間制限付き（時間が来たら自動投稿）

## Setsunaはできたのか

多分、できてる。**サーバーサイドだけ。**
クライアントサイドはJSONをもりもりやってくれるようなことを考えていたが、僕にはそんなJavaScript能力は今もなく、片手間にちょちょいとできそうなシステムの割には、サーバーサイドの構築で2年ほどかかってる。

なぜかかったか。

### Webフレームワークの選定

まず筆者はこれを始める当初、Webフレームワークというものの存在を知らなかった。
いや、おぼろげには知っていたが、やっぱりド定番の[django](http://djangoproject.jp/)か、ちょっと個性的に[Pyramid](http://docs.pylonsproject.jp/projects/pyramid-doc-ja/en/latest/index.html)が候補として上がって、自分は後者を選んだ。そして、
「おー、なんかプロジェクト出来上がったけど、この後どうやっていじったら良いのかわっかんねー」
となって1ヶ月位パソコンの前で頭を抱えるような感じになった。
そのあたりの詳しい話はこちらも参照。

* [【散文】おそらくこの7年間くらいのWebアプリ開発とかCGIについて - Qiita](http://qiita.com/manzyun/items/21f5396ee812f4e0eb86)
* [マイクロフレームワークから始めるWebアプリ開発 - Qiita](http://qiita.com/manzyun/items/b64425caa16b026e9876)

ちょっと裏話をするとだ、この時相当テンパってて、なんでかもっと低レイヤーの[Werkzeug ](http://werkzeug.pocoo.org/)とかに手を出してもっとわけわかんなくなってたわけよ。

## サーバー公開どうするの？

**フロント出来上がってないんだから公開のしようがないだろ。**

いや、正直フロントエンド作るためのWebフォームとかのデザイン案が思い浮かばないんですorz

いや、その前にだ、深刻な問題がある。

**Pythonを動かせるサーバーなんて、VPSとか借りるしかない**

正直最近ようやくフリーターになれたような自分の財政状況では、VPSを借りるのも結構躊躇する値段である。
「月500円くらいのスペックで間に合うのだろうか。逆に月500円ほど払う価値のあるサービスなのかこれ？」
とさえ思って未だに公開していない。

※現に、今（2016/12/14）金欠過ぎてVPS代が支払えず、個人サイトの[ヒマジンマンガ](himajinmanga.info)は落ちてる。

## となると、マネタイズだよね
何も考えてない。

「マネタイズ何とかするよ（笑）」
と気さくに言ってくれた知人も、最近は多忙すぎて胃に穴が開いて、手術したくらいである。

いや、じゃあ俺が考えるしかないのだろうけど、
あとフロントエンド作れれば、本当に単純なJSONを送っては返してというアプリなんですよねえ../../

# あとがき
とまあ、このプロジェクトはいつの間にかGithubの僕のアカウントの奥底で何も更新されずにじっとしています。
お暇な人はコードをcloneしてサービス立ち上げてしまって構いませんぜ。

**ドキュメントなんてないけどな！！**

[manzyun/Setsuna: Micro SNS or BBS, maybe.](https://github.com/manzyun/Setsuna)

P.S.
クソアプリ完成させてないどころか、クソ記事生成してしまったので、問題あればQiita運営さんに報告してください。
digdag と Jenkins は共存共栄

データ収集において、バッチ処理で embulk を利用されているケースは多いんじゃないかと思います。弊社でもログを日次で BigQuery に流したり、提携している金融機関様とのデータ連携時に利用してます。
その embulk を実行する際にデータロードの一連のフローをシェルで書いて実行していましたが、最近一部のバッチ処理で digdag で管理するようにしました。
結論、digdag よいよ。Jenkins(弊社の場合) とうまく使い分けできそう。

# digdag

digdag は分散ワークフローエンジンです。ワークフローエンジンだとすでに存在しているものもいくつかありますが、それらは基本 GUI をベースとしています。
それに対して digdag はコードで定義します。つまり、git 管理、レビュー等が行えるってところがは既存にはないメリット。そもそも既存のワークフローエンジンではできないことを補うとために開発されてます。その開発背景からもわかるように、Jenkins から digdag に乗り換えるとかではない。
クーロンなどで定期実行しているスクリプトや embulk でのバッチ処理は積極的に digdag で定義することで、Jenkins の運用もかなり楽になるんじゃないかと思います。

## `.dig` ファイル

digdag は `.dig` ファイルに実行タスクを記述していきます。
`digdag init` で生成され、あとは必要なフローを記載していくだけ、楽。

```
$ digdag init sample
2016-12-14 09:46:32 +0900: Digdag v0.8.18
  Creating sample/sample.dig
  Creating sample/.gitignore
Done. Type `cd sample` and then `digdag run sample.dig` to run the workflow. Enjoy!
```

## ワークフロー定義

先ほど生成された `.dig` ファイルにフロー定義していきます。
その際、この3つのキーを覚えておけばある程度フローは組めます。

### `+`

タスクを定義する際にこのキーを使います。
例えば ディレクトリ作って -> embulk でそこにファイルアウトプットして -> slack に通知 というフローを定義したいとき、それぞれのタスクを以下のように `+` で定義。

```:sample.dig
timezone: UTC

+mkdir_tmp

+load

+notification

```

### `>`

指定したアクションを実行します。（[operators>](http://docs.digdag.io/operators.html)）
`+` で定義したそれぞれのタスクで足りたいことを追加していけばよいです。
ここではディレクトリ作って embulk 実行して、rb スクリプトを実行。


```:sample.dig
timezone: UTC

+mkdir_tmp
  sh>: mkdir -p tmp

+load
  embulk>: data/config.yml

_export:
  rb:
    require: "tasks/notifications"

+notification
  rb>: Notifications.slack
```

`_export` はフロー全体に対するパラメータを設定します。Ruby スクリプトを実行する際はここで `require` が必要。

### `${ }`

変数を埋め込むことができます。
先ほど出てきた `_export` を使います。
`${code}` で呼び出せます。

```
_export:
  code: 123
```

配列で定義してループで処理することもできます。

```:sample.dig
timezone: UTC

+mkdir_tmp
  sh>: mkdir -p tmp

_export:
  targets: ["data1", "data2", "data3"]

+load
  for_each>:
    data: ${targets}
  _do:
    +execute:
      embulk>: ${data}/config.yml

_export:
  rb:
    require: "tasks/notifications"

+notification
  rb>: Notifications.slack
```

## 実行

```
digdag run sample.dig
```

# まとめ

digdag さくっと試せますし、何より git 管理できるのはよいです。
普段業務をしていると、クーロン管理など結構煩雑になり属人化されていて、これ誰に聞けばよいんだろうってこともあるかと思います。スクリプト改修しようとしても実は手で更新する必要があったり。。
そういった属人化されているところに digdag を使うことで解決できる課題は多いと思う。
そして、これまで Jenkins でフローを組んでいてジョブの管理が辛くなってきたとか、digdag 使うことで整理できるケースもありそうですね。
Oracleで外部キー制約が設定されているテーブルを削除する方法

## 環境

- OS：Windows 8.1 Pro 64bit
- DB：Oracle Database 10g Release 10.2.0.5.0 - 64bit Production

## エラー内容

外部キー制約を設定している親テーブルを`DROP TABLE {テーブル名}`で削除しようとすると、以下のエラーが発生して削除に失敗します。

```
ORA-02449: 表の一意キーまたは主キーが外部キーに参照されています。
```

## 対応

外部キー制約ごとであれば削除することができます。
「CASCADE CONSTRAINTS」を末尾に付ければ、制約ごとテーブルを削除できます。

```sql
-- 制約ごとテーブルを削除する
DROP TABLE {テーブル名} CASCADE CONSTRAINTS;
```

## 参考リンク

- [DROP TABLE](https://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_9003.htm)
Chrome拡張を作りましょう！

Chrome拡張の入門として、Chatworkで使える拡張を作りました！
下記のstepsに従ったら、自分でも作れるよ！

##Manifestを書きましょう
Chrome拡張を書こうとおもったら、まずはManifestです。このJsonファイルがないと、どんだけコードを書いても、Chrome拡張としてリリースできない。

まず、上の部分：

```json
{
  "manifest_version": 2,

  "name": "ChatWork_TO_@Shortcut",
  "description": "チャットワークメッセージで「@@」を入力するとキーボードでTOを選択できる",
  "version": "1.0.1",
```
ここで、拡張の名前、内容とバージョンを設定する。
Chromeで使うmanifestバージョン「1」
が対応されていないため、
manifest_versionも2に設定しないといけないらしいです。

次に、browserが起動すると、拡張の行動を書く。今回は簡単なので、iconだけを設定します。iconファイルは現在のフォルダーに保存されている。

```json
  "browser_action": {
    "default_icon": "icon.png"
  }, 
```
その下に、content_scriptsを追加します。ここで、どんなurlに有効すると何のスクリプトを読み込むのを設定する。自分はchatworkの全てのチャットで使うので、「＊」を書きました。
Javascriptも使うので、2つファイルを読み込みました。

```json
  "content_scripts": [
    {
      "matches": ["https://kcw.kddi.ne.jp/*"],
      "js": ["jquery-3.1.1.js","ChatworkAtMarkTo.js"]
    }
  ],
```

最後に、permissionsを追加します。この部分はChromeから拡張になんの情報を渡すかを設定する。

```json
  "permissions":[
    "tabs"
  ]
```

全体的にmanifest.jsonは下記のようになります。

```json
{
  "manifest_version": 2,

  "name": "ChatWork_TO_@Shortcut",
  "description": "チャットワークメッセージで「@@」を入力するとキーボードでTOを選択できる",
  "version": "1.0.1",
  
  "browser_action": {
    "default_icon": "icon.png"
  }, 
  
  "content_scripts": [
    {
      "matches": ["https://kcw.kddi.ne.jp/*"],
      "js": ["jquery-3.1.1.js","ChatworkAtMarkTo.js"]
    }
  ],
  
  "permissions":[
    "tabs"
  ]
}
```

これを自分の拡張フォルダに保存して、次Javascriptに行きます。

##Javascriptを書きましょう

本拡張はJavascriptのJqueryを使うので、manifestにjqueryファイルもインポートしている。
コードは下記のように。

```js
jQuery(function () {
  //@@が削除されたかのflag
  var replacedAtMarks = false;
  //メッセージ内容boxにキーを打った（keyup）後で実行されます
  $("#_chatText").keyup(function (){
    //チャット入力textareaの内容を取得
    var text = $(this).val();
    //'@@'を探す正規表現
    var regExpAtMark = new RegExp('@{2}'); 
    
    //内容にどこかで「@@」が入力されたを判断する
    if(regExpAtMark.test(text)){
      //TOボタンをクリック。メンバーの選択はキーボードでもできる。
      $('#_to').trigger('click');
      //「@@」の分だけを削除する
      $(this).val(text.replace(regExpAtMark,''));
      //@@を削除したよ！
      replacedAtMarks = true;
    }
  });
  
  //@@を押すと、TOのリストが出てくるけど、その後ESCキーを押したら、
  //メッセージ入力画面のfocusが外れる。それを避けるため、下記のfunction
  $(document).keyup(function (e){
    //@@が削除されていた後にESCキーを押すと
    if(e.which == 27 && replacedAtMarks){
      //メッセージ入力画面にfocusを戻す
      $("#_chatText").focus();
      //flag reset
      replacedAtMarks = false;
    }
  });
});
```
簡単に言うと、Chatworkの入力画面でメッセジを入力した後、[正規表現](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)で文字列に「@@」があるかを判断して、TO画面をJqueryでクリックする。その後、「@@」を削除する。

##Chromeで使いましょう！

この2つファイルと自分で精製したicon.pngを1つのフォルダに入れて、Chromeブラウザを開く。

```
chrome://extensions/
```

までに移動して、'Load unpacked extension...'ボタンを押す。ここで、保存しているフォルダを指定して、そのままchrome拡張を使えるようになる！これで完成です！
（chrome webstoreで公開するのはまた別の記事で！）
リスニング/技術英語 > Adafruit > Battery Basics @adafruit > Part 3 > A greener alternative / drop in replacement / for the record 

Batteryについて面白そうな動画を見つけたので、技術英語関連でリスニングしてみた。

Part 1: http://qiita.com/7of9/items/2f714355dcbbe3992cb5


[Collin's Lab: Battery Basics @adafruit #adafruit](https://www.youtube.com/watch?v=8ftkn7nZSDo&index=74&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4)

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(3:16-)
Like their big sisters, these are 1.5V cells, but the capacity is one tenth (1/10) of a AA battery.
Another common size is the CR2032, a 3V lithium cell.
These are wider and flatter than the LR44.

(3:36-)
Being a 3V cell means (that) they can even be used for things like this.  
<font color=red>Classic (?).</font>

(3:49-)
Common coin and button cells are pretty inexpensive as long as you don't buy them at a drug store. For some reason, they cost like 5, 10 times more there.

(4:05-)
Alkalines are all well and good, but once they died, they head straight to the landfill. **A greener alternative** is nickel metal hydride (NiMH). 
These are relatively inexpensive rechargeable cells, and are often used as **<font color=red>???</font>** and replacements of alkalines. 

(4:24-)
But it's important to keep in mind that they only supply only 1.2V per cell compared to the alkalines 1.5V. 
This means that your flashlight might just be a little dimmer.

(4:38-)
And **for the record**, modern nickel metal hydride battery do not exhibit the memory effect, which means (that) they don't need to be fully depleted before they're recharged.

<hr>
上記のフレーズを抜粋

- A greener alternative 
   - 環境にやさしい代替品、という意味だろう
- (4:05-)の不明部分
   - @knoguchiさんに[教えていただきました(感謝)](http://qiita.com/7of9/items/bbe81576adbff6bbac90#comment-925a59765b244e9d4ef1)
   - > 4:05-の???はdrop in replacementです。互換という意味ですね。
- for the record 
   - http://qiita.com/7of9/items/1e0f85f7ef6b285c64f1
controller内で直前のリクエストパラメータをハッシュにしたい

URLのリクエストパラメータはそのままにしておきたい。
でも、パラメータ全てをリクエストに持たせるのは面倒。
そこで、リファラーのパラメータから拝借してしまおう。という作戦が提案され…

パラメータをハッシュにすればrailsのルーティングヘルパーに渡しやすいかな？
と思った所でタイトル
# パラメータに配列がない場合

```rb
# require 'uri'
uri = URI::parse(request.referer)
begin
  q_array = URI::decode_www_form(uri.query)
  q_hash = Hash[q_array]
rescue
  q_hash = {}
end
```
大体はこれでOK。
だけど、配列が混ざると困る。
例えば`"tags[]=hoge&tags[]=fuga"`は`{"tags[]"=>"fuga"}`となり、
最後のパラメータ以外が欠損する。
# パラメータに配列がある場合

```rb
# require 'uri'
# require 'rack'
uri = URI::parse(request.referer)
q_hash = Rack::Utils.parse_nested_query(uri.query)
```
これなら
`"tags[]=hoge&tags[]=fuga"`も
`{"tags[]"=>["hoge", "fuga"]}`となる。
ついでに
`"test[][hash]=1&test[][hash]=2"`は
`{"test"=>[{"hash"=>"1"}, {"hash"=>"2"}]}`。

# 注意事項
1. `request.referer`の検査は必要に応じて忘れずに
2. ルーティングヘルパーが作ったURL文字列にリファラーのパラメータを足すだけで拝借はできる。ハッシュを作る必要はない

```rb
# require 'uri'
uri = URI(request.referer)
[xxx_path, uri.query].compact.join('?')
```
# 補足
```rb
# 文字列 => ハッシュ
Rack::Utils.parse_nested_query("test[][hash]=1&test[][hash]=2")                 # => {"test"=>[{"hash"=>"1"}, {"hash"=>"2"}]}
Rack::Utils.parse_nested_query("test%5B%5D%5Bhash%5D=1&test%5B%5D%5Bhash%5D=2") # => {"test"=>[{"hash"=>"1"}, {"hash"=>"2"}]}
Rack::Utils.parse_nested_query("test%5B%5D%5Bhash%5D=1&test%5B%5D%5Bhash%5D=%E3%81%82%E3%81%82%E3%81%82") # => {"test"=>[{"hash"=>"1"}, {"hash"=>"あああ"}]}

# ハッシュ => 文字列
Rack::Utils.build_nested_query({"test"=>[{"hash"=>"1"}, {"hash"=>"2"}]}) # => "test[][hash]=1&test[][hash]=2"
Rack::Utils.build_nested_query({"test"=>[{"hash"=>"1"}, {"hash"=>"あああ"}]}) # => "test[][hash]=1&test[][hash]=%E3%81%82%E3%81%82%E3%81%82"

# おまけ
# require 'active_support'
# require 'active_support/core_ext'
{"test"=>[{"hash"=>"1"}, {"hash"=>"2"}]}.to_param # => "test%5B%5D%5Bhash%5D=1&test%5B%5D%5Bhash%5D=2"
{"test"=>[{"hash"=>"1"}, {"hash"=>"あああ"}]}.to_param # => "test%5B%5D%5Bhash%5D=1&test%5B%5D%5Bhash%5D=%E3%81%82%E3%81%82%E3%81%82"
```

# 参考文献
[[Ruby]URLのクエリ文字列からHashを生成する](http://qiita.com/gotohiro55/items/010b27b8f1db47188139)
[How to turn a Ruby Hash into HTTP Params](http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params)
[[GitHub]rack/rack](https://github.com/rack/rack/tree/1.5.2)
lsの色付き出力をファイル保存しlessするまでの流れ

例えば，/binのファイルを色付きで保存するには

```
$ ls /bin -C --color=always > bin.txt
```

--color=always オプションを付けると、パイプやリダイレクトされている場合にもエスケープシーケンスによるカラー化が有効な状態で出力される

bin.txtを色付きで見るには

```
$ less -R bin.txt
```
CakePHP3 アソシエーションされたモデルのバリデーション

##要約
patchEntityする際にassciatedにアソシエーション先モデル名を記述するだけでいけました。


##詳細
久しぶりに引っかかったので備忘録として…

アソシエーションされたモデルのバリデーションを行うには以下のように記述する。

```Controller
if ($this->request->is(['patch', 'post', 'put'])) {
  $user = $this->Users->patchEntity($user, $this->request->data, ['associated' => 'Persons']);
  if ($this->Users->save($user)) {
    $this->Flash->success('ユーザ情報を更新しました。');
    return $this->redirect(['action' => 'mypage']);
  } else {
    $this->Flash->error(__('ユーザ情報の更新に失敗しました。'));
  }
}
```

##参考URL
http://stackoverflow.com/questions/32134092/cakephp-3-saving-data-with-associations-where-dependant-on-association
リスニング/技術英語 > Adafruit > Battery Basics @adafruit > Part 2 > where space is at a premium / current consumption is low / hearing aids

Batteryについて面白そうな動画を見つけたので、技術英語関連でリスニングしてみた。

Part 1: http://qiita.com/7of9/items/2f714355dcbbe3992cb5


[Collin's Lab: Battery Basics @adafruit #adafruit](https://www.youtube.com/watch?v=8ftkn7nZSDo&index=74&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4)

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(1:56-)
Inside every 9V alkaline battery is 6 small cells providing alkalines usual 1.5V each. This trick is possible because cells are wired in series providing accumulated voltage, 1.5V times 6 equals 9.

(2:15-)
Because the terminals on the 9V are so close together, you can actually test it with your tongue. 
Ah, yeah. Don't do that. Stupid.

(2:37-)
Coin and button cells are well suited to applications **where space is that premium** and <font color=red>preconsumption(??)</font> is low. 
But the term "coin and button" really only describes a general form factor.
These little guys can be made using alkaline, zinc-air, lithium, as well as other chemistries, too.

(2:58-)
So, their characteristics can vary quite a bit. Some are even rechargeable. 
The most common coin cell size is likely the LR44 alkaline as seen in watches, **hearing aids**, and many other ultra compact devices. 

<hr>
上記の単語を抜粋

- ~~where space is that premium~~
  - 聞き間違いかもしれない
  - 「空間が貴重である」という意味なのだろう
  - @knoguchiさんに 「space is at a premium」と教えていただきました。
- preconsumption(??) is low. 
  - これは間違いです。
  - @knoguchiさんに 「current consumption is low」と教えていただきました。 
- hearing aids
  - https://en.wikipedia.org/wiki/Hearing_aid