OmniAICreator/Qiita-1.07M huggingface dataset:
Macのパケット・トレースで3270データストリームを解析してみる

##はじめに

[前回の記事（『Macで3270エミュレーターを使ってみる』）](http://qiita.com/yaraichou/items/68717e0d49eca4f69fe0)のフォローで、使用した3270エミュレーターのソフト・キーボードでキー・アサインの不明部分を調査するためにネットワーク・レベルで送受信パケットを捕捉し解析してみましょう。
##本編
###方法
3270エミュレーターのソフト・キーボードで発生するアテンションIDを調査するのが主目的であり、できるだけシンプルな試験手順とします。

- ツールはWireshark

[こちら](https://www.wireshark.org/download.html)からダウンロード。感覚的な使い勝手で操作はいたって容易です。パケット内容を解釈して形式化してくれるので解析対象部分もすぐに識別できます。
![スクリーンショット 2016-12-27 14.17.33.png](https://qiita-image-store.s3.amazonaws.com/0/152195/48350300-2f91-67f1-6735-0f4e1508076c.png)
（導入・起動方法は簡単なので割愛）

- 'EYECATCHER'という文字列を入力した3270画面データをソフト・キーボード（Fkey）押下によりメインフレームに送信しパケット・トレースから該当するアテンションIDを判断する
![スクリーンショット 2016-12-27 14.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/152195/e1dedc86-afb4-9515-d824-bd8e4838a2f1.png)

この画面でソフト・キーボード（FKey）からアテンション・キーを押下するとメインフレームにデータが送信されます。'EYECATCHER'の文字列はEBCDICエンコーディングでx'C5 E8 C5 C3 C1 E3 C3 C8 C5 D9'。

###結果

TN3270プロトコル接続なのでTELNETのパケットに着目し、ユーザー・データ（すなわち3270データストリーム）を解析します（下図の反転部分）。

![スクリーンショット 2016-12-27 12.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/152195/24f9950e-b6e4-48b4-f346-287fa942b33d.png)

最初の３バイトのx'7d 40 4a'が3270制御コード、それ以降がメインフレームに送信されている画面データ（'EYECATCHER'）を示しています。インバウンド・データストリーム形式の時、先頭がアテンションIDとなり、x'7d'すなわちエンター・キーのアテンションIDが送信されていることが分かります。続く２バイトはカーサー・アドレスでx'40 4a'は、24 x 80画面のスクリーン・サイズで１行目の11カラム目を指しています。

3270データストリームについては[こちら](http://www.prycroft6.com.au/misc/3270eds.html)を参照。

おまけ

最後81バイト目のx'ef'(d'239')は、[RFC885(TELNET END OF RECORD OPTION)](http://www.rfc-base.org/rfc-885.html)で規定されているTELNETデータのEnd-Of-Recordエスケープ・シーケンス。

##まとめ

上述の手順を繰り返し、不明であったソフト・キーボード(FKey)のアテンション・キーのIDを補足すると以下の通りとなります。

![スクリーンショット 2016-12-27 14.13.16.png](https://qiita-image-store.s3.amazonaws.com/0/152195/13b2c46d-e78c-aec4-11df-4c14dc5d5521.png)

使用ツールではパケットがASCIIエンコーディングで形式化・表示される為、送信データ内容（EBCDICエンコーディング）が判読できないのがちょっと残念（エンコード指定のオプションがあるかもしれません）。
Microsoft Azure Data Lakeをさわってみるか （１） ～その前に～


普段 AWSサービス(Opsworks,Kinesis,EMR,Lambdaやら)をメインに触っていますが、
そこからMicrosoft Azure Data Lakeの気になるサービスなどの思ったところなどを書いてみたり、
さわってりしてみようかと。
Microsoft関連は VisualStudioを最後にさわったのが、8年くらい前なんで
C#やらなんやらもこれから覚えながら触ってみようと思っています。
とりあえず、公式ドキュメントやらを眺めてきたのでそこで思ったことなど。


## Azure Data Lakeってなんだ？

Azure Data Lakeは、開発者、データ サイエンティスト、アナリストを対象に
ビジネスのニーズを最大限に満たすことのできるデータ解析プラットフォームとか
そういうことでいいんですかね？これってサービスなの？名前の位置づけがよくわかりません。
ソリューションの一覧にも、商品の一覧にも出てこないのでよくわからなかった。
Cloudera の Enterpize DataHubと似てるかも。
（ツッコミどころ満載だ！とかあると思いますが・・・・。）

## Azure Data Lakeのサービス

#### Azure Data Lake Analytics

Azure Data Lake Analyticsは、U-SQL,各言語、HDinsightなどを使いビッグデータ処理を
実行することができるクラウド解析プラットフォーム。

- U-SQL（Microsoftが開発したC#とSQLを統合した言語）
　C♯がつかえるから簡単に利用できるよって解説されてたりするけど、C#ってそんなに簡単だっけ（汗
　新しいことをするには結局何か覚えないといけないのは仕方ないですね。

- HDInsight（クラスタ）
　Hadoop, Apache Spark, Stormなど、ビッグデータ処理に利用されるオープンソース分散処理クラスターのマネージドHadoopサービス。
　このサービスは、普段EMRつかってるものとしては気になってる。
　特に、一つのクラスターに対してクエリの並列実行が簡単にできるのかどうかとか、バグがもし見つかったら対応できるのかどうかとか。

##### Azure Data Lake Analyticsで思ったこと
- チュートリアルのページ眺めてると、いろんなサービスが、画面からぽちぽちと設定するだけ簡単に実行できるように
ように見える。でもそれ以上のことはどこまでできるのか、よくわからなかったので動かしてみて確認したい。


#### Azure Data Lake Store

現在,米国中部、米国東部２のみで利用が可能なサービス。

```
Azure Data Lake Store は、ビッグ データの分析アプリケーション用のハイパースケールリポジトリです。
Azure Data Lake Store はギガバイトからペタバイトまでのデータに合わせてオンデマンドで簡単にスケール調整でき、
お支払いは最低料金なしで使った分だけの従量課金制です。
Azure Data Lake Store は冗長性を提供するために複数のデータ コピーを保持します。
```

[公式ページより抜粋](https://azure.microsoft.com/ja-jp/pricing/details/data-lake-store/)してきました。

なるほど、Amazon S3みたいなものなんですかね。
Azure Data Lake Analytics関連のサービスは、このAzure Data Lake storeを通してデータの連携ができますよと。

##### Azure Data Storeの特徴

- Azure Data Lake Store ファイル システム (adl://)
  Hadoop 分散ファイルシステム (HDFS)互換のストレージ
　ほとんどのHadoopエコシステムと連携することができる。
　
- 料金は、データ量とトランザクションと、サイズごとの割り引きがあるようです。

##### Azure Data storeで思ったことなど

- Azure Data Lake Storeはアーカイブがない？
　テラバイト、ペタバイト級のデータを保存できるのは良いが、アクセス頻度の低いデータまでずっと同じ値段で
　保存しておくのは高い気がする。　アーカイブサービスとかないのかな？
- APIのアクセス制限はあるのか？
　バッチ処理などで単一のIPから連続でAPIアクセスがあった場合などの制限があるのかな？
　実際にAPIをたたいて試してみたい。


## 全体を通して

Microsoft Azureのサービスって画面ばかりでほとんど出来ちゃいますね。
ドキュメント読んでるだけだと、プログラマでできることがどこまで出来るのかが見えにくいので、
次回から実際に触ってみようかと思います。
docker で --net=host でコンテナ起動するときの注意点

# 概要

なんらかの事情により、 `--net=host` をつけて、docker run する必要があるときに注意することを個人的にまとめた

# まとめ

## iptablesの設定を手動で更新する必要がある可能性がある

### 現象

コンテナは立ち上がるし、コンテナ内では、正しく動いている。
しかしホストのポートを叩いても見えない。

### なぜ

ホストで iptables が動いていて、ガッチリまもられているときでも、docker daemonがうまくいことやってくれるのだが、 `--net=host` の場合、この部分はスキップされるようなので、注意する。

## すでに、必要なポートが使われている。

### 現象

コンテナの中でとじているネットワークなどでは、うまく動いている。
しかし、 `--net=host` をつけると、うまく起動しない

### なぜ

すでに、必要なポートが使われている。
ホスト側でつかっていたり、ほかのコンテナが使っていたりする。
C++ Builder > TClientSocket の情報 > インストール / 非推奨かどうか / 代替案

```txt:動作環境
C++ Builder XE4
```

TClientSocket で動作していたソフトをBCB6からXE4に2年ほど前に移植した。その情報が必要になり見直していた。

今後も参照しそうなので整理しておく。

### インストールについて

@ht_deko さんの資料
http://edn.embarcadero.com/print/images/40857/a4.pdf
の27枚目(ネットワーク関連のコンポーネント)にインストールについて記載があります。
参考になりました。ありがとうございます。

### TClientSocket はまだ非推奨かどうか

http://stackoverflow.com/questions/4544838/is-delphi-tclientsocket-still-deprecated

> Yes, TClientSocket and TServerSocket are still deprecated, and I can't imagine that this situation will change.

### IdTCPClientを使いましょう

自分メモ (2015年1月23日)
> TClientSocket # XE4移植 @ stackoverflow > IdTCPClientを使うという記載がある

stackoverflowに上記の記載があったが、現在は質問が削除されている。

http://stackoverflow.com/questions/25711440/how-to-add-tclientsocket-and-tserversocket-in-delphi-xe7-multi-device-applicatio
iOSでカメラにアクセスすると落ちるのをUnityエディタ上で修正するメモ


[iOS10ではカメラアクセスなどの目的を明示しないと強制終了する](http://qiita.com/Takumi_Mori/items/f53c6eec1676d3df59dc)の記事の現象を、Unityで対応するメモ。

ビルドウィンドウで[Player Settings...]を開いて、"Camera Usage Description"に表示したい説明文を入力する。
（入力した文章がダイアログに表示される。）

![スクリーンショット 2016-12-27 15.26.06.png](https://qiita-image-store.s3.amazonaws.com/0/20722/938b6e62-05a0-02b3-06e1-fd638d7cd9e2.png "スクリーンショット 2016-12-27 15.26.06.png")
ターミナル上から特定のファイルを探す

`find ~/ -type f -name [file name]`で探すことができる。現在いるディレクトリ内からファイルを探す場合は`find . -type f -name [file name]`で探すことが出来る。

![vimmer8.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/05646982-2474-ef0d-f315-c8e55bc637e8.gif)
Bash on Ubuntu on Windows のルートディレクトリの場所

Bash on Ubuntu on Windows のルートディレクトリの場所は
`%localappdata%\Lxss\`
あるいは
`C:\Users\Username\AppData\Local\Lxss\`
です。 `Username`は自分のWindowsのユーザー名と置き換えて下さい。

###参考
http://askubuntu.com/questions/759880/where-is-the-ubuntu-file-system-root-directory-in-windows-nt-subsystem-and-vice
Azure上にDockerとコンテナを管理するKubernetesを使ってみた

#Kubernetesとは
Dockerは皆さんご存知のプロセス内で実行するオープンソースですが、Dockerコンテナを作ったり、壊したり、場合によってはネットワークであったり、複数のコンテナを立ち上げてそれを一つずつ管理するのは大変です。そこで登場したのが、Googleが中心となり開発された複数のコンテナを管理する**Kubernetes**です。

- Kubernetesは、Dockerコンテナ群管理フレームワークです。コンテナ群のデプロイ/オーケストレーション/クラスタリング管理/運用管理などの各機能を提供します。[引用](http://www.ossnews.jp/oss_info/Kubernetes)

- Dockerには、ネットワークルーティング/複数コンテナ連携/複数台サーバ横断的管理などの機能は提供されていません。Kubernetesは、それらの機能をサポートします。[引用](http://www.ossnews.jp/oss_info/Kubernetes)

- デプロイメント/メンテナンス/スケーリング/ノード群スケジューリング/ワークロード動的管理/ユーザ定義状態の共有と管理/ロードバランサー/死活監視などの豊富な機能を備えています。[引用](http://www.ossnews.jp/oss_info/Kubernetes)


そこで、Azure上でDockerを使いその上でKubernetesを使って管理するというのをやってみます


#Azure上にDockerコンテナ作成
Azureのポータルにて下記のように選択することで、Ubuntuが導入されているdockerコンテナを作成できる
**【新規作成】➡︎【コンテナ】➡︎【Docker on Ubuntu Server】**

![1.png](https://qiita-image-store.s3.amazonaws.com/0/130097/4ec4c3ee-bbbd-4ea6-8cba-a5d7ae6db8b2.png)

ユーザ名やパスワードは任意に決めてVMを作成しその中にDockerが動くはず

![2.png](https://qiita-image-store.s3.amazonaws.com/0/130097/ca5de7fc-9605-f48e-c46c-24af31cfae15.png)

とりあえず、作成したユーザ名とIPでDockerにSSHをすることで色々遊べる！！
普通にpipも何でもできるので、スペックが足りなくてVMが厳しい人には研究用にちょうどいいと思う

<img width="850" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/130097/697e08a4-b216-e235-e766-20433cb8d46f.png">

とりあえず、Azure上でのDocker作成はめちゃくちゃ簡単だというのがわかると思います。
次にKubernetesを使ってみます

#Azure上でKubernetesを使う
**【新規作成】➡︎【コンテナ】➡︎【Azure Container Service】**

![4.png](https://qiita-image-store.s3.amazonaws.com/0/130097/f2305c61-f358-9f65-a914-dddc3c82fac5.png)

SSHは自分のSSHのpublic keyを挿入する
また、リソースグループは新規作成する

![5.png](https://qiita-image-store.s3.amazonaws.com/0/130097/f2a9b9e8-d35f-22b8-e370-2ebb0f868799.png)

ここで**Orchestrator configuration**で**Kubernetes**を選択し、IDとSecretは任意に作成

![6.png](https://qiita-image-store.s3.amazonaws.com/0/130097/1df92129-e323-3f79-3968-c1b7b23cd353.png)


![7.png](https://qiita-image-store.s3.amazonaws.com/0/130097/e11a0a6b-f162-4f2c-5c14-86cb9ccd37d0.png)


![8.png](https://qiita-image-store.s3.amazonaws.com/0/130097/37f20729-162b-1bb0-441f-a7266a2c476e.png)

するとDockersというリソースグループ内になんか色々作成されKubernetesができた
もう少し詳しく今後やっていきたいです！！

![9.png](https://qiita-image-store.s3.amazonaws.com/0/130097/3c0f08f3-3af8-0182-94ad-85c22bf7ec4b.png)
[WordPress]管理画面にタクソノミーの絞り込みを追加


```php:functions.php
add_action('restrict_manage_posts', function($post_type) {
	$taxonomy = [];
	if ( $post_type == 'post_typeA' ) {
		$taxonomy['taxonomyAA'] = 'ラベル';
		$taxonomy['taxonomyAB'] = 'ラベル';
	} elseif ( $post_type == 'post_typeB' ) {
		$taxonomy['taxonomyBA'] = 'ラベル';
	}
	if ( empty($taxonomy) ) return;
	foreach ($taxonomy as $k => $v) {
		$selected = get_query_var($k);
		wp_dropdown_categories([
				'show_option_all' => "すべての{$v}",
				'selected' => $selected,
				'name' => $k,
				'taxonomy' => $k,
				'value_field' => 'slug'
		]);
	}
}, 10, 2);
```

件数やページネーションも反映させるには
おそらくpre_get_postsとかparse_queryのフックにも引っ掛ける必要があると思われ
New Relicのアラート機能について（AlertsとNew Relic Alertsの違い）

#はじめに
今回はNew Relicのアラート機能について取り上げます。New RelicはSaaS型のアプリケーションパフォーマンス監視サービスです。その名の通りアプリやシステムの"今"を可視化できることが特長になりますが、だからといって常に画面に張り付いてトラブルの兆候を待つわけにはいきません。トラブルはトラブルが起こったときに通知してくれればいいわけです。そこまでは常識的な話ですがNew Relicのアラート機能の場合、"Alerts"と"New Relic Alerts(Alerts New)"が存在するため、どちらを使えばよいのか混乱しがちです。意味があってわかれているのか。たんに重複してしまったのか。この点について掘り下げたいと思います。

# アラートとは
アラートとしてNew Relicでは以下の項目の閾値を定めることができます。

- Mobile application Response time
- Key Transaction Error Rate and Apdex score
- Application Error Rate and Apdex score
- CPU, disk and memory on your servers

画面はAPM（Alerts）の例。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/3d9e8cd8-0d5f-3231-8876-d4e6268482a8.jpeg)

アプリケーションのレスポンスタイム、エラーレート、Apdex Score、インフラのリソース等に閾値を定めて、基準を下回れば通知してくれます。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/2b4c677b-1875-3145-5fa6-a549b4865b46.jpeg)

アラートの通知手段のことをチャネルと呼んでます。New Relicの場合、Email、Hipchat、Campfire、PagerDuty、Webhook等に存在しています。Webookに対応しているのでSlack等と容易に連携できます。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/757b1f0e-b0da-cfa5-3d64-893279c10e15.jpeg)

#2種類あるアラート設定
New Relicの場合、アラートの設定方法が2種類あります。"Alerts"と"New Relic Alerts(Alerts New)"です。New Relicは"Alerts"のことをLegacy Alertsとも呼んでいます。それに対する新しいサービスという意味合いで"New Relic Alerts(Alerts New)"が作られました。前者はLiteプランで使え、後者はProになると使えるようになります。

#"Alerts"と"New Relic Alerts(Alerts New)"の違い
"Alerts"と"New Relic Alerts(Alerts New)"の違いは何でしょうか。アラート項目とチャネルに大差はないように見えます。違いとしては、AlertsはAPMやBrowser等のサービスにひもづくアラート機能であり、"New Relic Alerts(Alerts New)"は複数のサービスにまたがる条件設定ができる点です。現状両者を同時に設定できてしまうようですが、実際の運用ではどちらかに寄せると思います。将来的には"New Relic Alerts(Alerts New)"に統合されるようです。トラブルはシステムの担当部署ごとに都合よく発生してくれるものではないので、横断的に対応できるようにしようという発想が根底にあると考えられます。

次回以降"Alerts"と"New Relic Alerts(Alerts New)"の設定例を取り上げたいと思います。

以上
TidalCyclesとOSC経由で同期する

## はじめに
[TidalCycles](https://tidalcycles.org/)はHaskell製ライブコーディングツールで、リアルタイムでコードを実行して、SuperCollierのSuperDirt経由で音を鳴らしせたりします。そのままだと音を鳴らすことしか使えなさそうなのですが、応用として他のアプリケーションをトリガーして同期させるようにしてみます。

## 環境
TidalCycles 0.8
SuperCollider 3.8

## 内容
処理のフローは以下の通りです。

```
TidalCycles　-> SuperCollider側でOSCをキャッチ　-> SuperColliderから別ポートにOSCを送信　->　別アプリでOSCを受信
```

## TidalCyclesのOSC出力を受信する
TidalCyclesは音を鳴らす際にSuperCollider側にOSC通信を行っています。OSCのパスは`/play2`です。

これをSuperCollider側でキャッチするようにします。

```
SuperDirt.start;

OSCdef(\test,  {
	|msg, time, addr, recvPort| 'osc'.postln;
}, '/play2', n);
```

これで`/play2`を受信した際に受信したmsgを出力します。

## SuperCollider側でOSCを送信する

`/play2`が受信できたので、あとはそのタイミングで別のポートにMessageを送信します。

```
SuperDirt.start;

b = NetAddr.new("127.0.0.1", 12345);

OSCdef(\test,  {
	b.sendMsg("/hello", "there");
}, '/play2', n);
```

これで送信されます。あとは各自受信用アプリケーションでOSCを受信します。例えばoFのサンプルに入ってるoscRecieveExampleを実行してもらえればメッセージが表示されるはずです。

## 注意事項
TidalからのOSCを直接受信しているわけではないので遅延が発生する可能性はあります（深く検証はしてない）。

## 最後に
TidalもSCも情報少なすぎて死ねる・・・
Visual Studio Codeを利用する

# テキストエディタ利用変遷

これまで利用してきたエディタと所感を以下にまとめます。
※以下はあくまで個人の意見です

| 時期 | エディタ | 利用背景 | 起動速度 | おしゃれ | デフォルト設定 | 
|:----------:|:----------:|:----------|:----------:|:----------:|:----------:|
| ~2013前半  | 秀丸 | Texを書くのに便利だった | 〇 | △ | △ | 
| ~2015前半 | サクラエディタ | 同僚が使っていた | 〇 | △ | △ |
| ~2016前半 | Sublime Text 3 | 同僚が使っていた | × | 〇 | × |
| 2016後半~ | Visual Studio Code | いろいろ調べた結果 | △ | 〇 | 〇 |

# なぜ***Visual Studio Code*** なのか？  
***Visual Studio Code***とは、クロスプラットフォームエディタ（Windows、Mac、Linux）です。※詳細はWEB上にわかりやすい記事がたくさんあるのでそちらでお調べください
私が***Visual Studio Code***を選んだ理由は以下の点で優れていたためです。

 - 早い
 - 軽い
 - デフォルトの設定がいい感じ
 - git機能がついている
 - 統合ターミナル

私のテキストエディタの利用用途は主に、スクリプトや設定ファイルの確認、メモを取ったりする程度で**開発**は他のIDEで行っております。
したがって、「早さ」「軽さ」がとても重要でした。今回テキストエディタを検討する際に、最近流行りの***Atom***も検討しましたがやはりボトルネックとなるは「早さ」「軽さ」でした。(***Sublime Text 3***も同様)
IDEとして利用したり、いろいろカスタマイズした方には***Atom***や***Sublime Text 3***がおすすめかと思います。

# 用途
- 簡単なファイルの確認
- Markdown
- git連携

# インストール
- 以下URLよりダウンロードします。
https://www.visualstudio.com/products/code-vs.aspx

※exeを実行して、表示に従えば基本的に問題なくできるかと思います
※こちらも詳細はWEB上にわかりやすい記事がたくさんあるのでそちらでお調べください

# 設定（随時更新）※2016/12時点
- 基本的に変更しなくてもデフォルトでいい感じです
- 私が少し触って感じたのがMarkdownのプレビューをもっとかっこよくしたいくらい
- 以下にもありますが、CSSを変更する必要があり、後々やりたい

## プラグイン
### 設定方法
1. 拡張機能一覧を表示する
1. インストールしたい拡張機能名称を入力
1. インストールしたい拡張機能の横にあるインストールを押す

![プラグイン設定方法.png](https://qiita-image-store.s3.amazonaws.com/0/122979/1efd17d9-9476-0e00-14f6-fe474eba6de8.png)

### インストール済み一覧
| 名称 | 概要 |
|:----------:|:----------|
| Auto-Open Markdown Preview | Markdownファイルを開くと自動でプレビューしてくれる |

## ユーザ設定
### 設定方法
- [ファイル→基本設定→ユーザ設定]の手順で押すと①と②が開かれる
- ①は「既定の設定」で③を押すと一覧が出てくる
- ③の変更したい箇所をコピーして②に貼り付けて設定を変更する

![ユーザ設定方法.png](https://qiita-image-store.s3.amazonaws.com/0/122979/5c258572-e610-2877-f3fb-10c9578ec75f.png)

### 設定内容
```json:settings.json
// 既定の設定を上書きするには、このファイル内に設定を挿入します
{
    // フォントの大きさを14→16に変更
    "editor.fontSize": 16
}
```

## ショートカットキーの設定
- 現在設定なし

## CSSの設定（Markdownのプレビュー）
- 現在設定なし

# 参考
- http://qiita.com/katsu_suzuki/items/dd688c88f53f24707169
- http://www.monster-dive.com/blog/web_creative/20160115_001432.php
- http://qiita.com/yuann/items/e4d4581c331aedc6da02
数十社、数万人規模の組織のエンジニア交流会の話

この記事は[Recruit Engineers Advent Calendar 2016](http://www.adventar.org/calendars/1617) の12/25の記事です
完璧に遅れました。すみません。

#はじめに

このブログでは、かなりの大規模組織であるリクルートグループがどのようにエンジニア同士が交流をしているかを共有できればと思います。しかし、組織が巨大のため、あくまでも私自身主観の、私の観測可能範囲での話であるということを予めご了承ください。

また、私の本来の仕事はこのようなことをすることではありません。あくまでコミュニティ活動の一環として、趣味と勉強を兼ねて行っています。

#でかすぎるグループ企業

http://www.recruit.jp/company/about/group/

によると、リクルートホールディングスの関連企業は、１，２，３，４…数えるのがめんどくなりました。とにかくいっぱいあります。社員数も数万ぐらいでしょう。多分。
それぞれの企業が、それぞれの責務を負って業務をしているので、どのようなエンジニアが求められ、どのような働き方をしているのか、どのような技術を使っているか、などはバラバラです。また、隣のグループ企業はやっていることが全然ちがうので、あまり知見などが共有されない状態にありました。というか、でかすぎるので、秩序を保ってそのようなことをするのがおそらく難しかったのでしょう。

そのような状態の中、今年の2月から、リクルートグループ社員だれでも参加でき、発表できるリクルートグループ横断エンジニア勉強会、というのを始めてみました。

#エンジニア交流会

そのような背景があるなか、まあ、簡単に言えば、口コミと部署メーリングリストへの宣伝をして、半年に１回、リクルートグループ横断エンジニア勉強会行っております。
次回開催でちょうど１年のため、まだ手探り状態です。ちょうど２回にして三桁人数、二桁参加企業になることができました。

実施要領はとても単純で、

* トピックを決める
* 時間割を決める
* 登壇してくれそうな人に声をかける
* 登壇してくれそうなゲスト企業に声をかける
* ピザと飲み物を用意する
* フィードバックをもらう

これだけです。

至って普通の交流会/勉強会なのですが、毎回、ゲストとして外部の企業様にお越しいただいて、その企業内のノウハウの共有や、その企業の製品の紹介などをしていただいております。

#フィードバックをもらう

フィードバックをもらうというのはとても大切で、また、主催者のモチベーションにもなります。会の満足度の５段階評価、要望などはもちろんですが、ゲスト参加していただいたそもそもの日頃の業務で困っていることを吸い上げるにも有効活用できています。
規模がとても大きくなってしまった会社では、現場の人の声を直接、まとめて困っていることをヒアリングするのにも苦労しているのではないでしょうか。このようなイベントを開催することで、効率的に問題点の吸い上げができるかと思います。
普通の開発とは違い、イベント開催なので半年に一度しかデプロイできません。できるだけ要望を吸い上げて反映することを心がけています。

#まとめ

大規模企業でエンジニアの交流を横断的に行う、といったことを、あとから装着（「装着」ってリクルート用語なんですってね）するにはとても苦難、地道、そして泥臭い方法でしかできないということを身にしみました。しかし、それらの交流が最近広がっているとグループ内のいろいろなところで聞き、嬉しい限りです。
もし、あなたのお勤めの企業が同じような大規模な企業で、エンジニアが散らばっているのであれば、一度企画してみてはいかがでしょうか？

![会の様子](https://qiita-image-store.s3.amazonaws.com/0/36042/2d96f201-3b9e-20e7-cb5c-f05c089ae137.jpeg "14202964_1273537735991810_1945142262_o.jpg")


次回は2017/2ぐらいに開催するのですが、まだトピックは決まっておりません。来てプレゼンしてもいいよ！という企業様、コミュニティ運営者様はぜひぜひ、 [@kumakumakkk](https://twitter.com/kumakumakkk) までリプライ、DMなどいただければ幸いです。リクルートグループ全体のエンジニアさんにアプローチできる場はあまりないのはないでしょうか…？
Adobe Preview CCのちょっとしたTIPS

ネイティブアプリの見た目修正で、"取り急ぎ実機上で確認したい"みたいなケースでAdobePreviewを使うと便利です。

WebデザインであればWeb上のどこかにHTML/CSSをアップロードしてブラウザを使って確認することができますが、ネイティブアプリではそうもいきません。

AdobePreviewを使えば、デザインの元データを用意しなくてもデザイン調整/実機確認することができます。

## 1. 実機でスクリーンショットを撮る
iOS端末にてデザイン調整したい箇所のスクリーンショットを撮っておきます。
![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/147689/88892b65-7ec3-e0dc-468e-11c6b6b5e56f.png)

## 2. PreviewCCとPhotoshopと接続する
iOS端末をMacとUSB接続し、Adobe Previewを開きます。
![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/147689/7e322bab-d517-39f4-3424-9cbfc6a96441.png)

Photoshop側でスクリーンショットを開いておけば、AdobePreview上に同じサイズでフルスクリーン表示されます。
![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/147689/88892b65-7ec3-e0dc-468e-11c6b6b5e56f.png)

## 3. PreviewCCで実機プレビューしながらPhotoshopでデザイン調整する
あとはPhotoShopで普段通り作業します。
![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/147689/01944cc4-3ae2-bb48-f9d0-53ae241fee90.png)

PhotoShop側での修正内容が、リアルタイムでAdobePreiew側で反映されていきます。


## 4. FIXした内容で正式な依頼を出す

実際のiOSアプリ案件にてUIパーツの色変更が必要だったケースで、この方法を取ってデザイナーによるデザイン調整、関係者の確認完了までを30分程度で完了させることができました。
プロトタイピングツールを使う選択肢もあると思いますが、プレビュー程度あればPhotoShop > AdobePreviewの方が圧倒的に速いですし楽だと思います。

プロトタイプと違い画面遷移のようなものはできませんが、PhotoShop側で個々のキャプチャがアートワークとして登録されていれば、AdobePreview側でスワイプすることでキャプチャを切り替えることもできます。

ちょっとしたデザイン確認であればデザイナを通さず、ディレクターだけで完結するかもしれません。

限定された使い方ですが、こういった使い方があること覚えておくとよいかなと思います。
見た目に関わる部分は、やはり実機を見てもらった上でのコンセンサスが取れていた方が確実です。
lxmlで名前空間付きtagの名前を書き換える

```py3
from lxml import etree

class ElementsTagReplacer:
    """replace tag name with namespaces."""
    def __init__(self):
        self.encoding = 'utf-8'
        self.parser = etree.XMLParser(encoding=self.encoding)
        self.namespaces = {'media': "http://search.yahoo.com/mrss/"}

    def replace(self, xml):
        if isinstance(xml, str):
            xml = xml.encode(self.encoding, 'ignore')

        root = etree.fromstring(xml, parser=self.parser)

        for analytics_gn in root.iterfind('.//media:thumbnail', namespaces=self.namespaces):
            analytics_gn.tag = "{%s}image" % analytics_gn.nsmap['media']

        return etree.tostring(root, encoding='utf-8').decode('utf-8', 'ignore')


replaced_xml = ElementsTagReplacer().replace(xml)
```
WindowsでAsciidocからPDFを作成する（Asciidoctor PDF v1.5.0 alpha 13）

エディタはAtomを導入してみます。

# Atom（https://atom.io ）

インストール後、以下のPackageをインストールする。

* asciidoc-preview
* language-asciidoc

これで、Asciidocのプレビューはできちゃいます。Crtl + Shift + a でプレビューペインが開きます。

# GitHub Desktop（https://desktop.github.com ）

ドキュメントはGitリポジトリにある想定なのでGit環境を最も手軽に設定できるGitHub Desktopを導入します。

# Ruby

RubyInstaller（http://rubyinstaller.org/ ）を導入してみました。

Ruby 2.3.1 (x64)もしくはRuby 2.3.1をダウンロードしてインストール。

# Ruby gemsのアップデート

http://qiita.com/betrue12/items/059c2424f27fd31969f9

を参考にRuby gemsをアップデートしてSSL証明書の問題を解消しておきます。

# Asciidoctor PDF(https://github.com/asciidoctor/asciidoctor-pdf )

https://github.com/asciidoctor/asciidoctor-pdf#getting-started の通りにセットアップしましょう。

# PDF生成上の制約

## 和英混合文の文字揃えがおかしい

和英混合文だと半角スペースの箇所で文字揃えがおかしくなってしまい実用に値しない。最初の段落は両端揃えで間延び、1章の段落は左揃えでGLOVIAとOMの間の半角スペースで改行されてしまう。

![スクリーンショット 2017-01-18 15.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/53358/7741293c-0944-56a6-1350-6f40532fd425.png)

https://github.com/asciidoctor/asciidoctor-pdf/issues/82 を参考に、https://github.com/chloerei/asciidoctor-pdf-cjk を導入して解決する。

![スクリーンショット 2017-01-18 16.57.06.png](https://qiita-image-store.s3.amazonaws.com/0/53358/e7fa263f-c392-2d1f-f8ed-d900d28a4f54.png)

両端揃えは、まだ不完全だが、左揃えは期待する行揃えになっているので、両端揃えを使わない前提であれば、使えそう。

## 文字の装飾はまだ未完全

### alpha13で実装されてないもの
- 下線
- 赤字などの色付け

### 日本語フォントの問題で反映されないもの
- 日本語の斜体
- 日本語の太字

斜体と太字のTrueTypeフォントを指定していれば、出力されるはず...

# 所感
安易に人に勧めるのはまだ早い感じ。
CakePHPであいまい検索を行う方法 (find, 部分一致)

○○を含むという部分一致の検索をする時は以下のように記述する。

### ▼ 書き方
```
$this->Model->find(array(
    'conditions' => array('Model.Field LIKE' => '%'. '検索したいワード'. '%')
));
```


### ▼ おまけ
その他のfindのオプションは以下の様に記述する。

```
find('all',array(
    'fields' => array('Model.field1','Model.field2'), //取得するカラム。配列指定。
    'conditions' => array('Model.field' => $thisValue), //検索条件。カラムと値を連想配列で指定。
    'order' => array('Model.created', 'Model.field3 DESC'), //並び順。文字列または配列で指定。
    'group' => array('Model.field'), //group byするカラム。
    'limit' => 2, //limit句。数値で渡す。
    'recursive'=>-1//
))
```
「PHPMailer」に重大な脆弱性……ってこれ、WordPressやDrupalでも使われてる！ →大丈夫そう

サンタさんが私たちにサイトの安全性をプレゼントしてくれたよ。
年末年始休業と引き換えにね。

**PHPの人気ライブラリ「PHPMailer」にRemote Code Executionの脆弱性が出た。**

### 更新情報
2016/12/27 14:15 「マジヤバイ」と声に漏らしながら初投稿。
2016/12/27 14:29 「WordPress本体のバージョンアップ」追加。
2016/12/27 18:36 「Drupalについて」追加。ただ詳しくないのでご意見頂きたく
2016/12/28 17:12 「諸先輩方のQiita記事」を追加。色々と状況が動いてる
2017/01/01 18:34 「PHPMailer」の脆弱性、「WordPress」などでは悪用できず,のリンクを追加。伴い、タイトル修正。
2017/01/23 15:45 「WordPress 4.7.1」の話を追記。

# とりあえず落ち着いてこれを見ろ

[「PHPMailer」に重大な脆弱性、直ちにパッチ適用を](http://www.itmedia.co.jp/enterprise/articles/1612/27/news058.html)

[PHPからのメール送信ライブラリ「PHPMailer」に脆弱性、米SANS ISCが注意喚起](http://internet.watch.impress.co.jp/docs/news/1037077.html)

> WordPress、Drupal、1CRM、SugarCRM、Yii、Joomla!など、多くのオープンソースプロジェクトに使われており、およそ900万のユーザーに利用されているという。

## 詳細はCVEを確認
[CVE-2016-10033](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html)

# WordPressについて

[Critical Vulnerability in PHPMailer. Affects WP Core.](https://www.wordfence.com/blog/2016/12/phpmailer-vulnerability/)

[#37210 (Update PHPMailer to 5.2.19) – WordPress Trac](https://core.trac.wordpress.org/ticket/37210)

WordPressの中の人も当然把握済み。
対策済みのphpmailer v5.2.19を使わせる.patchファイルがダウンロードできます。が。

追記：
[「PHPMailer」の脆弱性、「WordPress」などでは悪用できず](http://www.security-next.com/077088)
>コア部分で提供されている関数「wp_mail()」を利用している限り、今回公開された脆弱性の影響を受けないとコメント。

バニラのWPや、著名なプラグインで利用している場合は大丈夫そう。
wp_mail()を使わずPHPMailerを直で叩くお行儀の悪いプラグインが存在しないことを祈りましょう。

## WordPress本体のバージョンアップ
いつになるかな。4.7.1が登場すると考えます。 → 1/12に出ました。
直接影響はないものの、本件に関するセキュリティリリースとして発表された。他にもCSRFやXSSの脆弱性も潰されているので、更新しましょう。

https://wordpress.org/news/
https://ja.wordpress.org/news/


# Drupalについて
[Drupal 6 workaround for the highly critical vulnerability in PHPMailer](https://www.mydropwizard.com/blog/drupal-6-workaround-highly-critical-vulnerability-phpmailer)

「とりまセキュリティリリースが出るまで、危険なコード削除しとくこと勧めますわ」とのこと。

追記：
[「PHPMailer」の脆弱性、「WordPress」などでは悪用できず](http://www.security-next.com/077088)
>「Drupal」に関しても、「Core」部分に関しては影響を受けないと説明。


# 諸先輩方のQiita記事
[PHPMailerのリモートコード実行脆弱性(CVE-2016-10033)の影響範囲](http://qiita.com/ichikaway/items/d2d9205c57f35b618951)

[PHPMailerの脆弱性CVE-2016-10033はWordPressにどの程度影響するのだろうか](http://qiita.com/nishimura/items/869362ab33b5e82080b7)
tcpdumpの使い方メモ

## About
頻繁には使わないのでメモ。随時更新予定

## バージョン
```
$ tcpdump -h
tcpdump version 4.5.1
libpcap version 1.5.3
```
## 見る対象を指定する
### 特定ポートの送受信を観察したい

```
$ sudo tcpdump port 24224
```

### 特定interfaceの送受信を観察したい

interfaceを指定しないと、loopbackアドレスを除いた一番最初に来るinterfaceがデフォルトで対象になるとのこと

```
$ sudo tcpdump -i enp0s8
```

### tcp/udpのみを観察したい

```
$ sudo tcpdump tcp
$ sudo tcpdump udp
```

## 見え方を変える
### 通信内容を見る

```
$ sudo tcpdump -X 
```

### ファイルに出力する

```
$ sudo tcpdump > aaa.txt
$ sudo tcpdump -w aaa.pcap
```

`-w` だとパケットをそのままの形で保存する。見るときには-rで指定して読む
C言語における共用体と構造体による、構造体の Wrapper 処理

1年目プログラマです
レガシーなプログラムになるので、
使う際は注意していただければと思います。
今回は、暫定的な対処をした際の覚え書き

** 修正済み **

# 概要
C 言語で old という構造体がもともとあり、
そのアドレスを引数として様々な関数があるプログラムに
new という構造体を追加し、使い分けたい場合、
Wrapper 処理を行うことで変更点を少なくする対処法

# コード
```
#include <stdio.h>

/* 元からある構造体 */
typedef struct oldbox oldbox_t;
typedef struct old1 old1_t; // メンバ変数 mem を持つ
typedef struct old2 old2_t;

struct oldbox
{
  old1_t _old1;
  old2_t _old2;
};

void print_struct( oldbox_t *ptr)
{
  printf("%d\n",ptr->old1.mem);
}

void main(void)
{
//略
print_struct( ptr); /* ptr は oldbox型ポインタ */ 
}
```

これに struct new1 と struct new2 をメンバとして持つ、struct newbox を作成し、print_struct を使いまわす。

# 共用体を利用した wrapper 処理
```
/* 新しい構造体 */
struct wrapper
{
  union{
    oldbox_t oldbox;
    newbox_t newbox; // struct new1 と struct new2 をメンバとして持つ
  }box_type;
};
```
二つをまとめて wrapper とした。

# print_struct を使いまわし
このままだと、 oldbox_t と newbox_t の構造体のサイズが異なる場合に、
print_struct 関数を二つ作らないといけないが、それは面倒

```
/* FLAG is (static) global variable */
#define OLD 1
#define NEW 2

print_struct ( wrapper *ptr)
{
  if( FLAG == OLD){
    oldbox_t *p = &(ptr->box_type.oldbox);
    printf("%d\n",p->old1.mem);
  }
  else if(FLAG == NEW){
    newbox_t *p = &(ptr->box_type.newbox);
    printf("%d\n",p->new1.mem2); // new1 は mem2 というメンバを持っている
  }
}
```

# まとめ
とりあえず暫定的に対処できた。
本当は、構成から考え直すべきだが、時間と量的に
今回はこの方法にした。
しかし、FLAG による分岐を利用しているため
根本的解決法にはなっていない。

よりよい方法があれば教えていただきたいです。
Spreadsheet::WriteExcelのTips


# テキスト形式での指定方法いろいろ
    # Implicitly write a number, the leading zero is removed: 1209
    $worksheet->write('A1', '01209');

    # Write a zero padded number using a format: 01209
    my $format1 = $workbook->add_format(num_format => '00000');
    $worksheet->write('A2', '01209', $format1);

    # Write explicitly as a string: 01209
    $worksheet->write_string('A3', '01209');

    # Write implicitly as a string: 01209
    $worksheet->keep_leading_zeros();
    $worksheet->write('A4', '01209');
    
    # これが正解
    # Format as a string (01209)
    my $format2 = $workbook->add_format(num_format => '@');
    $worksheet->write_string('A5', '01209', $format2);
Win10 で Xamarin のサンプル動かしたいのにエミュが動かなかった

#経緯

Codezine 見ながら Xamarin のサンプルをビルドしたけど
エミュレータが真っ黒のまま動かなかった

![black2.png](https://qiita-image-store.s3.amazonaws.com/0/19668/9fe9d468-5e0a-8889-6398-b9083ae2c267.png)

検索して`Intel x86 Emulator Accelerator(HAXM installer)`というのが入ってないのが原因では？
というのを見つけて Android SDK Manager を覗いてみたが
`Not compatible with Windows`が出てインストールできない

![not_compatible3.png](https://qiita-image-store.s3.amazonaws.com/0/19668/5ead0e72-6a48-20b4-b105-302dd5126a42.png)

(´・ω・\`) てめーこのやろー

#対応
>http://stackoverflow.com/questions/41092207/the-intel-x86-emulator-accelerator-haxm-installer-revision-6-0-5-is-showing-no

直接インストーラをダウンロードして入れたら動いた
https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager

ありがとう Stackoverflow (´＾ω＾\`)
GitbookでUMLの図入のドキュメントを書く

## 動機

ドキュメント書いてますか？ 私は気分が乗ってくればさほど嫌いではありません。
とはいえMS-Wordはイライラするし、差分把握が出来ないのでやはりテキストベースでやりたいもの。そうなるとMarkdownがテッパンですよね。
Markdownで文書を書く場合、図の扱いに頭を悩ませます。特にプログラム設計の文書だとUMLの図が必要になることがあります、というところが動機です。

Dockerでさくっと動かせるようにしてあるので良かったら使ってみてください。
https://github.com/NewGyu/gitbook-uml

## Gitbook

[Gitbook](https://github.com/GitbookIO/gitbook)はMarkdownで文書を書いて公表するためのツールセットとサービスです。

1. MarkdownをHTML,JSなどに変換するツールセット（ローカルでのプレビューもできる)
2. ドキュメントを公開できるサービス https://www.gitbook.com/

オープンな文書であれば https://www.gitbook.com/ のアカウントを取得して、git pushすればあっという間に[こんな感じの文書](https://masarakki.gitbooks.io/c89-the-way-of-programmer-life/content/)がホスティングされます。（有償プランで限定公開も可能です）

社内文書をGitbookで運用したい場合は、

1. ツールセットでHTML,JSを出力
2. 成果物を社内のWebサーバーに配置  
  （弊社の場合はS3に配置しています）

ということになるでしょう。

ツールのインストールはNode.jsが入っていれば

```shell-session
npm install -g gitbook-cli && gitbook fetch 3.2.2
```

だけです。[公式の説明](https://toolchain.gitbook.com/setup.html)や[こちらの記事](http://qiita.com/mamohacy/items/98c0d790074c9bdfef1a)などを参考にすると良いでしょう。

## PlantUML

UMLは[astah](http://astah.change-vision.com/ja/)を使って描いていたのですが、この場合、

* astahのファイルの管理
* PNG出力して配置

というところが手間でした。

この問題を解決する一つの手段として、UML自体もテキストベースで書き、UML図をコンパイルして生成する[PlantUML](http://plantuml.com/)というものがあります。
UML図のレイアウトがいうこと聞かなかったり、そもそも記法を覚える必要があったり、確認するときにコンパイルして図を出力する必要があったり…とastahの素晴らしいGUI操作性と比べると面倒はあるのですが、

* UML図自体のDiffが把握できる
* プルリクでレビューできる

というところを重視してPlantUMLを採用しました。

## GitbookとPlantUMLを組み合わせる

Gitbookには[gitbook-plugin-uml](https://plugins.gitbook.com/plugin/uml)というプラグインがあるのでこれを利用します。

環境はDockerで即座に実行できるように用意しました。

* https://github.com/NewGyu/gitbook-uml/blob/master/Dockerfile
* https://github.com/NewGyu/gitbook-uml/blob/master/docker-compose.yaml

`docker-compose up viewer` を実行することで http://localhost:4000 でGitbookをローカルで確認することが出来ます。

`AWS_PROFILE=プロファイル名 docker-compose up publish` でS3に配置します。
http://gitbook.kinoboku.net.s3-website-ap-northeast-1.amazonaws.com/

### 必要なもの

Dockerを使えれば私の用意したDockerfile, docker-composeを使っていただければそれ以外何もいらないのですが、一応解説しておきます。

* Node.js 6系（4系でも良いと思いますが確認してません）
* Java8(JRE)
* graphviz

### ハマりどころ

#### プラグイン名の微妙な違い

まず最初に[gitbook-plugin-plantuml](https://github.com/lyhcode/gitbook-plugin-plantuml)というプラグインをどこからか見つけてきて使っていたのですが、こちらは随分前のもので洗練されていませんでした。Forkして作られた[gitbook-plugin-uml](https://plugins.gitbook.com/plugin/uml)を使うと随分洗練されています。

#### 日本語化ける

alpine-Linuxを使っていたからと言えるのですが、日本語フォントが入っていませんでした。

#### Graphvizが必要

Macの場合はgraphvizが必要ということでしたが、alpine-Linuxでも必要でした。

いやぁ、Dockerは誰かがこうしてDockerfileとcomposeファイルを書けば皆のところで動くので楽ですね。
td-agentで"Elasticsearch::Transport::Transport::Errors::Unauthorized"エラーが発生した際の対応について


自分の設定漏れが原因でした。
Elasticsearch::Transport::Transport::Errors::Unauthorizedは以下に記載される原因以外でも発生する可能性はあります。

--- 

td-agentからElasticsearchにログを流し込む際、以下のエラーが発生してElasticsearchにログがインポートさ
れない問題が発生。

```
2016-12-26 22:20:29 +0900 [warn]: temporarily failed to flush the buffer. next_retry=2016-12-26 22:21:03 +0900 error_class="Elasticsearch::Transport::Transport::Errors::Unauthorized" error="[401] " plugin_id="object:3ffeb220e400"
```

x-packを入れていたため、basic認証で弾かれていたのでした。
[ドキュメント](https://github.com/uken/fluent-plugin-elasticsearch#user-password-path-scheme-ssl_verify)にあるようにtd-agent.confにuserとpasswordを追加して解決。

```td-agent.conf
 <store>
    @type elasticsearch
    host 127.0.0.1
    port 9200
    user elastic
    password changeme
    index_name uptime
    type_name uptime
    logstash_format true
    logstash_prefix uptime
    flush_interval  1s
  </store>
```
TomcatのSessionレプリケート調査

技術調査の備忘録
調査しながら追記していく

##Tomcatのクラスタリング機能
[Clustering/Session Replication HOW-TO](http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html)
FileStoreとJDBCStoreがある
どちらも速度は少し遅そう

##インメモリデータベースとの連携
インメモリデータベースがいろいろ開発された結果、セッション管理を外出ししてインメモリDBで同期化する方法がそれぞれにある模様

###Redis
https://github.com/jcoleman/tomcat-redis-session-manager

###memcached
https://github.com/magro/memcached-session-manager

###hazelcast
https://hazelcast.com/use-cases/web-session-clustering/tomcat-web-session-replication/
https://github.com/hazelcast/hazelcast-tomcat-sessionmanager

###Shiro + Ehcache + Terracotta
http://shiro.apache.org/session-management.html#SessionManagement-SessionClustering
http://www.ehcache.org/documentation/3.2/clustered-cache.html

もっとありそうだが、とりあえずここまで
TeraTermで効率良くファイル転送

Windowsを使用している開発者の方々は、LinuxサーバにSSH接続する場合にTeraTermをよく使われるかと思います。
そのTeraTermで、効率的にファイル転送（Windowsクライアント → Linuxサーバ、Linuxサーバ → Windowsクライアント）を行う方法を紹介したいと思います。

# Windowsクライアント → Linuxサーバにファイル転送
Windowsからファイルを転送する場合はとってもシンプルで、以下のような手順になります。

1. 転送したいファイルをTeraTermのウィンドウに向けてドラッグ＆ドロップ
2. 「Tera Term: ファイル ドラッグ＆ドロップ」ウィンドウの「SCP:」欄に、以下のように入力
 SCP: 転送先にするLinux上のパスを入力
3. 「SCP」ボタンをクリック
![Win→Linux.gif](https://qiita-image-store.s3.amazonaws.com/0/116762/3b289ff9-b0e3-8dd9-8c26-d3d895839b6a.gif)


# Linuxサーバ → Windowsクライアントにファイル転送

1. TeraTermのメニューの「ファイル(F)」→「SSH SCP」を選択
2. 「TTSSH: Secure File Copy」ウィンドウの下部に、以下のように入力
<br /> From: 転送したいLinux上のファイルパスを入力
<br /> To: 保存したいWindows上のパスを入力
3. 「Receive」ボタンをクリック
![Linux→Win.gif](https://qiita-image-store.s3.amazonaws.com/0/116762/f7ed287a-a369-5cc5-4242-843091b8cc3d.gif)


と、ここまでの内容はよく紹介されている内容かと思います。

# readlinkコマンドを使うとさらに便利に！

Linuxサーバ → Windowsクライアントにファイル転送する時に、上記の画面キャプチャーでは
さらっとLinuxサーバ上のファイルパスをコピペしましたが、実際には、

**「転送したいファイルのパスが分からない」**

なんてこと、よくあると思います。

そんな時に便利なのが

**readlink**

コマンドです。

このコマンド（-f オプションを付けて実行した場合）は、指定したファイルのフルパスを取得することができるコマンドです。
（まさにTeraTermで楽にファイル転送するために用意されたかのようなコマンドですね！） 

実際の使い方は以下のような感じになります。

readlink -f 【ファイル名】

以下が、実際の実行例の画面キャプチャーです。
![SnapCrab_gotodev22 - root@gotodevtmp VT_2016-12-27_12-4-26_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/116762/40822db5-d2aa-b0ec-1307-254ad16af64d.png)


readlinkコマンドを使えば、どんなに深い階層にあるファイルでも、一発で簡単にファイルのフルパスを取得することができます。
実行結果のフルパスをコピペすれば、簡単にファイル転送を行うことができます。

TeraTermとreadlinkの組み合わせ、オススメなのでぜひ活用してください。
Embulkのsftpプラグインでcsvをget

Embulkのプラグインをインストール
==============================

```bash
$ embulk gem install embulk-input-sftp
2016-12-27 11:10:04.254 +0900: Embulk v0.8.15
Fetching: embulk-input-sftp-0.2.3.gem (100%)
Successfully installed embulk-input-sftp-0.2.3
1 gem installed
```

Embulkの設定ファイルを書く(パスワード認証の場合)
============================================

`parser:`/`filter:`/`out:`はローカルCSV用に同じ(今回はCSVの内容をTreasureDataに入れた)
`in:`から`parser:`までの間を以下のように書く

```yaml
in:
  type: sftp
  host: ■sftpサーバ■
  port: 22
  user: ■ユーザ■
  password: ■パスワード■
  path_prefix: ■ディレクトリ■
  path_match_pattern: ■ファイル名パターン■
  parser:
```

先方からppkファイルをもらった場合
==============================

Windows上でOpenSSH形式に変換
---------------------------

1. Windowsにputtyをインストール http://hp.vector.co.jp/authors/VA024651/PuTTYkj.html
1. puttygen.exeを起動
1. ActionsのLoad an exisiting private fileのLoadボタン押下
1. もらったppkファイルを指定
1. 画面上部のConversionsメニューのExport OpenSSH Keyを選択
1. 「Are you sure you want to save this key without a passphrase to protect it?」と聞かれたら「はい」を押下
1. 適当なファイル名を指定する
1. ファイルの中身をクリップボードにコピー

Embulkの設定ファイルを書く
------------------------

パスワード認証用の内容から「password:」行を消して以下のようにする

```yaml
in:
  type: sftp
  host: ■sftpサーバ■
  port: 22
  user: ■ユーザ■
  secret_key_file:
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      ■puttygenからExportしたファイルの中身をクリップボードから貼付け■
      -----END RSA PRIVATE KEY-----
  path_prefix: ■ディレクトリ■
  path_match_pattern: ■ファイル名パターン■
  parser:
```

キーファイルを複数のEmbulk設定ファイルから共用したい場合は`secret_key_file:`を以下のように書き換えて

```yaml
  user: ■ユーザ■
  secret_key_file: ■キーファイル■
  path_prefix: ■ディレクトリ■
```

キーファイルの中身は以下の通り

```
-----BEGIN RSA PRIVATE KEY-----
■puttygenからExportしたファイルの中身をクリップボードから貼付け■
-----END RSA PRIVATE KEY-----
```
ExcelとCalcのGETPIVOTDATAの違い

[LibreOffice AdventCalendar 2016](http://www.adventar.org/calendars/1639) 12月21日の記事として投稿します。

使い方はほぼ一緒。
でも微妙な違いがあります。

こんなデータを用意してみました。

|date|item|price|
|:--|:-:|--:|
|11月7日|apple|100|
|11月7日|apple|100|
|11月7日|apple|100|
|10月31日|blackberry|80|
|10月31日|blackberry|80|

そしてこんなPivotTable(ピボットテーブル)を作ってみました。

|date|合計/price|
|:--|--:|
|10月31日|160|
|11月7日|300|
|総計|460|

これから、11月7日のpriceの合計を取得します。
式は下記のとおりです。

```:GETPIVOTDATA
=GETPIVOTDATA("price",$E$1,"date","11月7日")
```

でもExcelの場合、11月7日を別の書き方で取得することが可能です。
では見ていきましょう。


##Excelの場合

下図を見てましょう。

日付の部分が DATE(2016,11,7) でもデータが取得可能です。
流石、Microsoftよくて来ているなあと思いつつ、
別の書式設定で入力すると認識せずにエラー。

惜しい！

![getpivotdata_date_excel.png](https://qiita-image-store.s3.amazonaws.com/0/24550/21cd926a-f2f0-dddf-3392-64631be064dd.png)


##Calcの場合

本当に見たままの書式設定のみです。
通常はこんなもんなんでしょうね…。

![getpivotdata_calc.png](https://qiita-image-store.s3.amazonaws.com/0/24550/342df2a9-bc91-c891-2476-6d1bc20b2ec0.png)
CentOS7でsendmail + SPF

## sendmailのインストール
訳あってpostfixではなくsendmailでメールを運用しているのでpostfixをアンインストールしてsendmailをインストール。

```
$ sudo yum remove postfix
$ sudo yum install sendmail
```

## smf-spfのインストール
こちらを参照させてもらいました。
http://server-setting.info/centos/sendmail-smf-spf-install.html

```
$ sudo wget http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-13.rhel7.noarch.rpm
$ sudo rpm -import http://www.city-fan.org/ftp/contrib/yum-repo/CITY-FAN.ORG-GPG-KEY
$ sudo rpm -Uvh city-fan.org-release-1-13.rhel7.noarch.rpm
```

参照先ページにも記述されている通り、/etc/yum.repos.d の city-fan.org.repo のenabled=1をenabled=0にしてupdate時にこちらのパッケージがインストールされないようにし、--enablerepoオプションでインストール。

```
$ sudo yum --enablerepo=city-fan.org install smf-spf
```

## sendmail.cfの作成

/usr/share/doc/smf-spf-2.0.2 のreadmeの記述にしたがって/etc/mail/sendmail.mcに以下のエントリを追加。

```
define(`confMILTER_MACROS_HELO', confMILTER_MACROS_HELO`, {verify}')dnl
INPUT_MAIL_FILTER(`smf-spf', `S=unix:/run/smfs/smf-spf.sock, T=S:30s;R:1m')dnl
```

さらにメール中継を有効化。

```
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl                        
↓
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl    
```

DNS等で自ホストのFQDNを取得出来ない場合、自ホストのFQDNをsendmail.cfに直に設定します。[^1]

```
define(`confDOMAIN_NAME', `myhost.mydomain.jp')dnl
```

sendmail.cf作成

```
# m4 sendmail.mc > sendmail.cf
```

access.dbやrelay-domainsも適宜設定します。

## spf起動

```
$ sudo systemctl restart sendmail
$ sudo systemctl start smf-spf
```

## selinux対策
ログを見ると/run/smfs/smf-spf.sockファイルへのアクセスに"Permission Denied"が発生するので/var/log/audit.logを適当にgrepしてポリシーを作成。[^2]

```
# grep smf-spf /var/log/audit/audit.log > audit-smfpsf.txt
# cat audit-smfpsf.txt | audit2allow -M sendmail-smfspf
# semodule -i sendmail-smfspf.pp
```

上記の処置後もPermission Deniedが発生するので以下を実施

```
# grep spf.sock /var/log/audit/audit.log > sendmail-spfsock.txt
# cat sendmail-spfsock.txt | audit2allow -M sendmail-spfsock
# semodule -i sendmail-spfsock.pp
```

今度はPermission Deniedは発生しなくなりました。

[^1]: 詳細はこちらのドキュメント https://www.jpcert.or.jp/ed/2001/ed010002.txt の「VI. sendmail のテスト」-「(2) ホスト名が正しく取得できていることの確認」をご覧下さい。

[^2]: 別のホストでのセットアップ時には発生しませんでした。原因はよく判りません。
Xamarin.Forms 向けのピッカーコントロールを作った

iOS の [UIPickerView](http://swift-salaryman.com/uipickerview.php)、 Android の [NumberPicker](https://akira-watson.com/android/numberpicker.html) は Xamarin.Forms では、標準コントロールで用意されていないみたいだったので Custom Renderer で作りました。

特に nuget パッケージとかにはしてなくて、サンプルアプリと一緒になってます（><）

こんな感じのコントロールです。

こんな感じで使えます。

![](http://blog.amay077.net/assets/images/posts/pickerview_for_Xamarin_forms_screenshot01.gif)

``ItemsSource`` と ``SelectedIndex`` の２つのバインダブルなプロパティしかなくて、``SelectedIndex`` の方は TwoWay です。

```xml
<?xml version="1.0" encoding="utf-8"?>

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:PickerViewSample"
             x:Class="PickerViewSample.PickerViewSamplePage"
			 Title="PickerView Sample">

    <ContentPage.BindingContext>
        <local:Model />
    </ContentPage.BindingContext>

    <ContentPage.Resources>
        <ResourceDictionary>
            <local:ItemsSourceConverter x:Key="itemsConv"/>
        </ResourceDictionary>
    </ContentPage.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <local:PickerView
            Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"
            ItemsSource="{Binding ItemsSource, Converter={StaticResource itemsConv}}"
            SelectedIndex="{Binding SelectedIndex}" />

        <Label Grid.Row="1" Grid.Column="0" Text="ItemsSource" />
        <Entry Grid.Row="1" Grid.Column="1" Text="{Binding ItemsSource, Mode=TwoWay}" />

        <Label Grid.Row="2" Grid.Column="0" Text="SelectedIndex" />
        <Entry Grid.Row="2" Grid.Column="1" Text="{Binding SelectedIndex, Mode=TwoWay}" />
    </Grid>
</ContentPage>
```

ソースコードは、

* [amay077/Xamarin_Forms_PickerViewSample](https://github.com/amay077/Xamarin_Forms_PickerViewSample)

にありますので、 Fork などして使ってください。

iOS の ``UIPickerView`` は、それ自体が複数の列を持てるようですが、Android のはそうではないので、１列しか使ってません。

Custom Renderer のサンプルにもなると思います。

## 追記: PickerView を並べて数値を選択する UI も作った

![](http://blog.amay077.net/assets/images/posts/pickerview_for_Xamarin_forms_screenshot02.gif)

ソースコードは上と同じギッハブにあります。
Link > 重複したSSIDについて

http://qiita.com/7of9/items/89b24045bf5e44f97be4
において、Amazon Dash Button(以下ADB)のセットアップに失敗した。

今考えている方法は

1. モバイルルータのSSIDとパスワードでADBをセットアップ
2. ESP8266で同じSSIDとパスワードのアクセスポイントを立ち上げ
3. モバイルルータの電源を落とす
4. ADBを押す

この場合、同じSSIDを使うことが問題になるかどうか。

推奨はされないかもしれないが同じSSIDを使う、という例は以下に見つけた。
https://www.macobserver.com/tmo/answers/4-wi-fi-tips-from-former-apple-wi-fi-engineer?utm_campaign=tmo_twitter
> `1. Use same SSID for all radios on the same network

<hr>
(追記 2016/12/28)

http://qiita.com/7of9/items/758a0d9a81826bb816dd
にて実施したが、ADBからESP8266に接続していないようだった。
Androidのファイル扱う際のセキュリティについて

JSSECが公開している『Androidアプリのセキュア設計・セキュアコーディングガイド』の2016-09-01版を共有用にまとめているもののうち、「4.6. ファイルを扱う」のものとなります
詳細やサンプルコードについては原著の方を参考ください

## チェックポイント
- [ ] 出来る限り、非公開ファイルにしている
- [ ] アプリ間の情報交換を行う場合、別のAndroidの仕組みを利用して、直接ファイルにアクセスさせない
- [ ] ファイルに格納する(された)情報は、内容の安全性を確認する

### 非公開ファイル
同一アプリ内のみの読み書きを使用するため、安全です。

- [ ] ファイルはアプリディレクトリ内に作成している
- [ ] ファイルのアクセス権がプライベートモードになっている

### 読み取り公開ファイル
不特定多数のアプリに対して、内容のみを公開するためのファイルとなります

- [ ] ファイルはアプリディレクトリ内に作成している
- [ ] ファイルのアクセス権は他のアプリに対しては読み取り専用モードになっている
- [ ] MODE_WORLD_READABLEを使用していない(推奨。API LEVEL17以降でdeprecatedのため)
- [ ] センシティブな情報を含めていない

### 読み書き公開ファイル
不特定多数のアプリに対して、読み書きを許可するファイルとなります。誰でも、読み書き可能という事は、
* マルウェアが書き換えが可能であり、信頼性、安全性がない
* ファイル内のデータ形式やタイミングの制御が困難
そのため、**他アプリから読み書き可能なアクセス権を設定したファイルは原則作るべきではありません**

### 外部記憶(読み書き公開)ファイル
不特定多数のアプリに対して、読み取り公開ファイル、または、読み書き公開ファイルと同等の性質を持つため、使用は最小限にとどめるべきである

- [ ] アプリごとにユニークなディレクトリにファイルを配置する
- [ ] 利用側のアプリで書き込みを行わない仕様にする
- [ ] 原則、センシティブな情報を保存しない。使用する場合は、暗号化している
- [ ] 改竄されて困る情報を保存する場合、電子署名も一緒に保存している
- [ ] いつでも、そのファイルを削除されることを想定してアプリを設計している
- [ ] バックアップなどを出力する場合は、警告表示をしている(推奨。後述)


## Tips
### 外部記憶(読み書き公開)ファイルについて
SDカード等外部記憶デバイスは十分なアクセス権のコントロールが出来ず、また、他アプリからファイルの読み書き、削除が可能なため、機能上どうしても必要な場合のみ、最小限での利用をすべきです
例えば、容量の大きなファイルや、別の場所への情報の移動目的な場合を使用する場合には使用しますが、センシティブな情報を含めてはいけません。含める場合は、暗号化などの対策が必要となります
また、Androidアプリの慣例として、バックアップファイルは外部記憶デバイス上に作成されることが多いですが、マルウェアを含む他アプリから削除や改ざんのリスクがあります
そのため、バックアップファイルをPC等の安全な場所にコピーしてくださいといった警告表示など、アプリの仕様や設計面でのリスク最小化が必要です

### ファイルの生存期間について
アプリディレクトリ内に保存されたデータは

* アプリのアンインストール
* 各アプリのデータおよびキャッシュの消去

で削除されます。そのため、期間はアプリの生存期間より短くなります
外部記憶デバイスのファイルはアプリの生存期間より、ファイルの生存期間が長く、また、以下の状況を想定する必要があります

* ユーザ、または、マルウェアなどによるファイルの消去
* SDカードの抜き取り・差し替え・アンマウント

そのため、アプリとしての動作を実現する意味でも、ファイルの保存場所を正しく選択する必要があります

### ファイルディスクリプタ経由のファイル共有
公開ファイルを直接アクセスさせるのではなく、ファイルディスクリプタ経由でファイルを共有する方法があり、Content ProviderとServiceで使用できます。
それらの中で、非公開ファイルをオープンし、そのファイルディスクリプタを相手のアプリに渡すことで、アクセス権の制御やアクセス許可するアプリの範囲が制御できます
ただし、書き込み、追記を許可した場合、ファイルの完全性が保証しづらくなるので、読み込みのみを許可するのが望ましいです

### ディレクトリのアクセス権
ファイルのディレクトリにもセキュリティの考慮が必要です。基本的にディレクトリは非公開にすべきです。
Context#getDir( String name, int mode )を使用する場合、modeにMODE_WORLD_READABLE,MODE_WORLD_WRITABLEを使用してはいけません(API Level17から非推奨)

### Android 4.4以降の外部ストレージへのアクセスに関する仕様変更について
Android4.4以降では外部ストレージへのアクセスに関してのが以下のように仕様が変更されています

1. 外部ストレージ上のアプリ固有ディレクトリに読み書きする場合は、WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE Permissionが不要になった
2. 外部ストレージ上のアプリ固有ディレクトリ以外を読みこむ場合は、WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE Permissionが必要になった
3. プライマリ外部ストレージ上のアプリ固有ディレクトリ以外を書き込む場合は、以前と同じように、WRITE_EXTERNAL_STORAGEが必要
4. セカンダリ外部ストレージ上のアプリ固有ディレクトリ以外への書き込みが不可能(Android5.0以降では実装とユーザの許可次第では可能)

そのため、Android4.4をまたぐアプリで、1のみに該当する場合は<uses-permission>にmaxSdkVersionを指定して対応するのが望ましいです

## 参考

『Android アプリのセキュア設計・セキュアコーディングガイド』【2016年9月1日版】
https://www.jssec.org/dl/android_securecoding.pdf
middlemanでURLのパラメータを取得する方法メモ

railsだと

```haml:hoge.haml
params[:KEY]
```

で簡単に取得できますが、middlemanだと同じでは動きませんorz
しかし、案ずることなかれ！
以下のように書けば取得できました。

```haml:hoge.haml
req.[](:KEY)
```

Rackというgemが必須です（middlemanのデフォでbundleされていると思う）
sedで特定行の次の行を削除する

sedで検索文字列の次の行を消したい時に困ったので備忘録を残しておこうと思います。

# 環境
mac

# 方法

```
$ sed -e '/検索文字列/{n;d;}' ファイル名
```
例えば、

``` bash:hoge.txt
aaa
bbb
ccc
ddd
```

に対して

```
$ sed -e '/bbb/{n;d;}' hoge.txt
```

上記コマンドを実行すると

```
aaa
bbb
ddd
```

この様な結果が得られます。

注意しないといけないのは、中括弧の中の最後のコマンドにもセミコロンをつけてあげないと`extra characters at the end of d command`とエラーになります。

# 次の次の行

```
$ sed -e '/検索文字列/{n;n;d;}' ファイル名
```

# -iオプション
`-i`をつけるとファイルが直接書き換えられます。
パーセプトロンで論理回路を作る（多層パーセプトロン）

本記事は、[ゼロから作るDeep Learning](http://amzn.to/2iLPFZW)の学習メモです。　　
<a href="https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=as_li_ss_il?s=books&ie=UTF8&qid=1483626311&sr=1-1&keywords=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8Bdeep+learning&linkCode=li2&tag=nesheep5-22&linkId=db4083b79083eb2446ff31dd16bc0409" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873117585&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nesheep5-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nesheep5-22&l=li2&o=9&a=4873117585" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## 要点

- パーセプトロンとは、複数の信号を入力として受取り、一つの信号を出力するアルゴリズム。  
  「バイアス」と「重み」をパラメータとして設定し、ある入力を与えると決まった値が出力される。  
  「バイアス」は発火のしやすさを制御するパラメータ。  
  「重み」は各入力の重要性を制御するパラメータ。
- 論理回路のAND素子、NAND素子、OR素子について、(単層)パーセプトロンで表現することが出来る。
- XOR素子はAND素子、NAND素子、OR素子を組み合わせて作成できる。  
  →単層で表現できなかったものが、多層パーセプトロンで表現可能になる。

## パーセプトロンを表す式

```math
\begin{eqnarray}
y=\left\{ \begin{array}{ll}
0 & (b + w_1 x_1 + w_2 x_2 \leqq 0) \\
1 & (b + w_1 x_1 + w_2 x_2 \gt 0) \\
\end{array} \right.
\end{eqnarray}
```
※x1,x2:入力　w1,w2:重み　b: バイアス

## パーセプトロンで論理回路を実装する

```py3:perceptron.py
import numpy as np

# x1,x2:入力 w1,w2:重み b:バイアス
def perceptron(x1,x2,w1,w2,b):
    x = np.array([x1, x2])
    w = np.array([w1, w2])
    tmp = np.sum(w*x) + b
    return 0 if tmp <= 0 else 1

def AND(x1,x2):
    return perceptron(x1,x2,0.5,0.5,-0.7)

def NAND(x1,x2):
    return perceptron(x1,x2,-0.5,-0.5,0.7)

def OR(x1,x2):
    return perceptron(x1,x2,0.5,0.5,0.0)

def XOR(x1,x2):
    # 多層パーセプトロン
    s1 = NAND(x1,x2)
    s2 = OR(x1,x2)
    y = AND(s1,s2)
    return y

# 以下動作確認
print("AND")
print(AND(0,0)) # 0
print(AND(0,1)) # 0
print(AND(1,0)) # 0
print(AND(1,1)) # 1

print("NAND")
print(NAND(0,0)) # 1
print(NAND(0,1)) # 1
print(NAND(1,0)) # 1
print(NAND(1,1)) # 0

print("OR")
print(OR(0,0)) # 0
print(OR(0,1)) # 1
print(OR(1,0)) # 1
print(OR(1,1)) # 1

print("XOR")
print(XOR(0,0)) # 0
print(XOR(0,1)) # 1
print(XOR(1,0)) # 1
print(XOR(1,1)) # 0
```
レバテックプラットフォームハック

ここ半年ほど、[レバレジーズ](https://levtech.jp/)という会社さんにお世話になってました。
フリーランスエンジニアのために客先常駐開発の仕事とってきてくれる、いわゆるエンジニア派遣の会社さんです。
営業さんでもrailsとかsvgといった単語を説明なく使って普通に会話できるレベルの方が揃っているので、たいへんやりやすい会社でした。

そんなレバレジーズというか、そこが運営しているレバテックのウリの一つとして、応募したい案件の管理から就業後の勤務時間管理、請求書の作成と送信までまとめて面倒見てくれる「レバテックプラットフォーム」というのがあります。

![levp.png](https://qiita-image-store.s3.amazonaws.com/0/30743/7edaf880-854f-f362-95bb-18a444ccd116.png)

# 勤務時間をまとめて入力したい

エンジニアたるもの、こういうWEBシステムを見たらまずソース見ますよね:grinning:
で、「出勤時間を自動で入れてくれるスクリプト」とか普通書くじゃないですか？

ひょっとして、「部屋の電気を消すと自動で退勤時間を書いてくれるシステム(GetWild演奏機能付き)」みたいなものがすでに公開されてないかなと思ったのですけど、そういう奇特な方はレバテック使わないみたいだったので、ぼくが勝手に書いて使っていたコードを公開します。

# コード

```
// 開始終了休憩時間を入力
var input_selector = function(type_str){
  return 'input[name^="data[DailyReport]"][name$="['+type_str+']"]';
};
$( input_selector('start_time') ).val('10:00');
$( input_selector('end_time') ).val('19:00');
$( input_selector('relax_time') ).val('1:00');

// 休日の枠をクリア
var dayoff_tr_selectors = [
  'td.txtNormal:contains("（土）") + .reportDetail__txt ',
  'td.txtNormal:contains("（日）") + .reportDetail__txt ',
]
$.each(dayoff_tr_selectors, function(i,selector){
  $(selector).parent().find( input_selector('start_time') ).val('');
  $(selector).parent().find( input_selector('end_time') ).val('');
  $(selector).parent().find( input_selector('relax_time') ).val('');
});
// 作業時間計測を実施させる
$( input_selector('relax_time') ).trigger('focusout');
```

ブラウザでレバテックプラットフォームの勤務表編集画面に入ったら、おもむろにインスペクタを開いて上記コードを実行することで、月-金/10:00-19:00(休憩一時間)の標準的なデータが入力されます。
月初にこれを実行しておけば、あとは残業したりお休みしたときだけデータを更新すればOK。

土日月がお休みの４日勤務とかになってもかんたんに対応できるコードなのが自慢です。

レバテックプラットフォームがバージョンアップしたら使えなくなるのだけど、ぼくはもうレバさんとの契約が終了してしまってプラットフォームにアクセスできないので、その時は各自アップデートして後輩に受け継いでいってくださいね☆
vim: 対応するクーテーションマークの位置確認をする方法を探してみる（IP）

対応する`(`や`[`は認識してくれるのに何故かクォーテーションマークがない。ということでぐぐってみたら出てきたので備忘録としてメモをしておく。カーソルを片方の`"`へもっていき`vi"`で表示可能。

参照記事: <a href="http://stackoverflow.com/questions/3088164/possible-to-highlight-matching-quotes-in-vim" target="_blank">Possible to highlight matching quotes in vim?</a>

![vimmer8.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/df079d0b-4cc3-8f71-4020-3db4cee3697d.gif)

欠点としては必ずしもマッチしあうクォーテーションマークが表示されるわけではないということ。そういう点ではあまり実用的ではないかもしれません。

`set matchpairs = (:),[:],{:},":",':'`を設定してみたのですがどうやらクォーテーションマークは認識されていないみたいでした。

ということで未だパットした解決策見つからず。。。
terminalの作業ログを日付ディレクトリ別に残す

小ネタですが・・・。

macでterminalを使っているとログを残したい！けど、
TeraTermと違ってどこにログ設定があるのや？となります。
(iTermを使えば終わる話ですね！)

https://bacchi.me/mac/terminallog-autosave/
http://qiita.com/imura81gt/items/1ffaaff3cc1e9613925f
上記の記事を参考にすればログファイルは作成できます。
が、いかんせんファイル数が肥大化しがちです。
とりあえず日付ごとにディレクトリを切れば少しは安心。


# 作業

`$DIR`はお好きなディレクトリに置き換えてご使用ください。

```bash:/etc/profile
TIMESTAMP=`date "+%Y%m%d-%H%M%S"`
DATE=`date "+%Y%m%d"`
DIR="$HOME/terminal-logs/$DATE"
if [ ! -d $DIR ]; then
    mkdir -p $DIR
fi
LOGFILE="$DIR/terminal-$TIMESTAMP.log"
script $LOGFILE
exit
```

保存して、新規にTerminalを立ち上げると、
`~/terminal-logs/20161227/terminal-20161227-111321.log `
上記のような形で作業ログが保存されていきます。

## 小ネタ

`cat`等で自身のログファイルを参照するとき、
タイミングが良いとcatの出力タイミングとログの書き込みタイミングがうまいことマッチしてループする模様です。
即Ctrl+Cで終了しましたが、一瞬で30MBくらいのログファイルが出来上がっていました。

## そのうち

- bash-3.2 が気に食わない問題をどうにかする
- 前月以前のディレクトリを月ディレクトリにまとめたい