OmniAICreator/Qiita-1.07M huggingface dataset:
CSV から構造化された JSON を生成するツールを Go で作った

https://github.com/shiwano/master

ゲームのマスターデータってだいたい CSV で書かれると思うんですが、それに一つツールを噛ませて、バリデーションもしつつプログラムで扱いやすいデータ構造にできたら便利かなと思って作ってみました（主に趣味プロジェクト用）。
名前はちょっと微妙かもしれない…

具体的には、

* CSV のフラットな行データから構造化された JSON を生成したい
* CSV ファイルのエンコーディングで CP932 とかいろいろ考慮しなくてもいいようにしたい
* バリデーションしたい

上記の問題解決にフォーカスしたツールです（それ以外のことはやらない）。

## インストール方法

[リリースページ](https://github.com/shiwano/master/releases) から実行ファイルをダウンロードするか、
Mac の人は Homebrew でインストールできます。

```bash
brew tap shiwano/formulas
brew install master
```

## 使い方

ヘルプテキストをべたり。

```
Usage:
  master [options] <file-or-directory>
  master -h | --help
  master --version

Options:
  -d, --output-directory string  Specify the output directory (default: <file-or-directory>).
  -s, --schema-directory string  Specify the JSON Schema directory (default: <file-or-directory>).
  -e, --encoding string          CSV file encoding [default: auto]. Supported encodings are https://goo.gl/T3zICN
  -E, --fix-encoding             Fix the CSV file encoding if it is different from --encoding.
  -n, --no-output-file           No file output. If file is given, print JSON string to stdout.
  -S, --output-schema            Output JSON schema from CSV files.
  -V, --skip-validation          Skip validation by JSON Schema.
  -h, --help                     Output help information.
  -v, --version                  Output version.
```

## 構造化フォーマット

ドット区切りで CSV のカラム名を指定すると、以下のようなルールで JSON にパースされます。

入れ子オブジェクトの場合:

|user.id|user.name|
|---|---|
|100|Alice|

```json
[
  { "user": { "id": 100, "name": "Alice" } }
]
```

配列の場合:

|items.0|items.1|items.2|
|---|---|---|
|1|2|3|

```json
[
  { "items": [ 1, 2, 3 ] }
]
```

配列と入れ子のミックス:

|users.0.id|users.0.name|users.1.id|users.1.name|
|---|---|---|---|
|100|Alice|200|White Rabbit|

```json
[
  {
    "users": [
      { "id": 100, "name": "Alice" },
      { "id": 200, "name": "White Rabbit" }
    ]
  }
]
```

うちの会社で似たようなフォーマットで CSV 組んでて便利だったので、参考にさせていただきました。

## バリデーション

生成された JSON バリデーションには JSON Schema を使います。foo.csv を変換する際に、
foo.schema.json が schema directory にないか探してきて、あったらそれをバリデーションに用います。
なかったらバリデーションしません。バリデーションに失敗したら、エラーで変換が止まります。

`--output-schema` オプションをつけると、CSV から JSON Schema のテンプレが生成されるので、
ゼロから作るのかったるいなと思った人はそれで作るとちょっと楽です。

## エンコーディング

`--fix-encoding` オプションをつけると、CSV を変換する前にエンコーディングのチェックを行って、
`--encoding` オプションで指定されたエンコーディングと違ったら、正しいエンコーディングで
ファイルを上書きして直します。

UTF-8 の場合は、エクセルで読み込めるようにするために必ず BOM を付与するので、少し注意が必要です。
JSON-RPC経由でEthereumのContractを作る

Ethereumのブロックチェインにプログラムからアクセスする場合、 ` web3.js ` とか Node.js用ライブラリとかのJavaScriptAPI(https://github.com/ethereum/wiki/wiki/JavaScript-API) を使うのが一般的だ（Ethereum自体がまだそれほど一般的ではないのは置いておいて・・・）。documentも結構が充実しているし、分かりやすい構造なので、とりあえずEthereumに繋げられればいいやというときには、もうこの一択。  
んが、使用言語など、作る際の制約が制約が色々出てくると、JSON-RPC(https://github.com/ethereum/wiki/wiki/JSON-RPC ) 経由でのアクセスが必要となってくる。  
JavaScriptAPIも、JSON-RPCをJavaScriptが持つキャッチーかつフニャフニャな衣で包んでるだけなので（内部は完全にJSON-RPC）、そっちでできることは、全てJSON-RPCでも出来る。  
まずは `Contract` を作らないと始まらないということで、とりあえず今回は、 `Contract` を作る方法を書き殴ります。

## 準備

### Contractのコードを書く

コンストラクタにパラメータがある場合のアクセスにもの凄く苦戦したので、

* コンストラクタ無し
* パラメータ付きのコンストラクタあり

の２つの `Contract` 準備したものとして説明する。下はサンプル。言語は `Solidity` 。

``` コンストラクタなし
contract Nassy {
	// ... functionとか変数とか
}

```

``` パラメータ付コンストラクタあり
contract Ariinu {
	function Ariinu(int nanika, address dokoka) {
		// ... 何かの処理
	} 
	// ... functionとか変数とか
} 
```

### コードをゲット

で、こいつをコンパイル。コンパイルは、 `cpp-ethereum` の `solc` コマンドで行うか、 JavaScriptAPIの、 `web3.eth.compile.solidity()` ファンクション( https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcompilesolidity )から行う。  
で、出来上がった、0からfの文字が繰り返される諸行無常（ZAZEN-BOYSを聴きながら書いてる・・・）のコードを退避。自分は、`solc`の実行からできたコードをGO言語のソースコードにまで落としこむスクリプトを作って、どっからでもかかってこい状態にしている。  

## ブロックチェイン上に作成

### コンストラクタなし

コンストラクタなし（または、パタメータなしコンストラクタ）の方は、割とスムーズに作成できた記憶がある。  
こんな感じ。

```
{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[

{
  "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",// 作成アカウントアドレス（左記はテキトー)
  "gas": "0x76c0", // 作成に使っていい最大GAS値,
  "data": "0xd46e8dd6..." // ゲットしたコード
}


], "id":(どのコールのレスポンスかを判別するためのテキトーな番号)}

```

よし、これで行ってみよう。GASが不足していなければ、デキるはず。


### パラメータ付きコンストラクタあり

とりあえず、パラメータありコンストラクタのコードを書いてみたものの、これ、使う時、コンストラクタのパラメータ、どこで指定すんの？？ と、JSON-RPCの説明を片っ端から読み漁ったけど、書いていない。   
仕方なく、24時間体制でCRYPTOジャンキー野郎の吹き溜まりと化しているGITTER( https://gitter.im/orgs/ethereum/rooms )で、ルー大柴ばりの英語で質問すると、１時間以上放置された後（多分誰もわからないんじゃ・・・）、こーやんじゃねーの的な回答が。

```
"params":[

{
  "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",// 作成アカウントアドレス（左記はテキトー)
  "gas": "0x76c0", // 作成に使っていい最大GAS値,
  "data": "0xd46e8dd6..." // ゲットしたコード	
},
{
  "data":(パラメータ値)
}
]

```

やってみたけど、出来ない。色んなパラメータ追加したりしてみたけど、全くできない。
ちなみに下の素っ気ないメッセージが出る。

```
{"code":-32602,"message":"insufficient params, want 1 have 2"}
```
  
仕方なく、 `web3.js` を解析・・・・  

そして試した結果、こうすることが分かった。

```
"params":[

{
  "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",// 作成アカウントアドレス（左記はテキトー)
  "gas": "0x76c0", // 作成に使っていい最大GAS値,
  "data": "0xd46e8dd6..." // ゲットしたコード ＋ パラメータ
}
]
```

コンパイルしたコードの後にパラメータ値をペタッとくっつけるのだ。このパラメータ値は、ルールに則って0からfの文字で繰り返す諸行無常加工をする。(そのルール：https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#function-selector-and-argument-encoding )  

よし、これで行ってみよう。GASが不足していなければ、デキるはず。
[Swift]自分のコードがコンパイラを殺した話


```swift
final class Killer {
  var dogs  = [Dog]()
  var cats  = [Cat]()
  var foxes = [Fox]()
  var animals: [Animal] {
    return dogs.map{$0} + cats.map{$0} + foxes.map{$0}
  }
}

class Dog: Animal {
}
class Cat: Animal {
}
class Fox: Animal {
}

class Animal {
}

```

これをコンパイルしようとするとコンパイラのCPU使用率が100%になる。

恐らくAnimalクラスのサブクラスのオブジェクトの配列たちをAnimalクラスの配列として連結するとコンパイラの型推論がおかしくなって死ぬんだと思う。


同じように

```swift
let hoge = [0..<10, 1..<4, 5...6, 7..<9,0..<10, 1..<4, 5...6, 7..<9]
```

などのように長いrangeの配列などでもコンパイラの型推論がおかしくなって死ぬ
[JavaScript]部屋の灯りが消えたら自動でGet Wildを再生してGet Wild退勤する

https://twitter.com/kozeni_shkt/status/709743397196541953
http://www.b-ch.com/ttl/index.php?ttl_c=467

[[iOS]部屋の灯りが消えたら自動でGet Wildを再生してGet Wild退勤する](http://qiita.com/oubakiou/items/b9b78b00906415d056b2)のJavaScript版です。

Mac+Firefoxで動作確認した。Macの照度センサーはカメラの辺りにある。

# ホスティング
http://iwata-n.github.io/GetWild-js/

localStorageに設定値を記憶しているのでブラウザ閉じても、また開けばすぐに使えるはず

# 実装
https://github.com/iwata-n/GetWild-js

``` html
<!DOCTYPE html>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<title>GetWild</title>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

<div id="value">CurrentValue: -</div>
<div id="threshold">-</div>
<div id="slider"  style=" margin:5px;width: 700px;"></div>
<input id="url" type="text" value="" style=" margin:5px;width: 700px;"/>

<script>
$(function() {
  var isGetWild = false;
  var threshold = 100;
  var getwild_url = "https://youtu.be/LgBxze0ye94?t=1m45s";

  // GetWild退勤
  function getWildAndTough() {
    window.open(getwild_url);
  }

  // 設定値読み込み
  if ("url" in localStorage) {
    getwild_url = localStorage["url"];
  }
  if ("threshold" in localStorage) {
    threshold = localStorage["threshold"];
  }

  // Url
  $("#url").val(getwild_url)
  $("#url").on("change", () => {
    getwild_url = $("#url").val();
    localStorage["url"] = getwild_url;
  });

  // しきい値設定
  $("#threshold").html(threshold);
  $( "#slider" ).slider({
    max:1000,
    min:0,
    value:threshold,
    step: 1,
    slide: (event, ui) => {
      threshold = ui.value;
      localStorage["threshold"] = threshold;
      $("#threshold").html(threshold);
    }
  });

  // センサ
  window.addEventListener('devicelight', function(event) {
    var lux = event.value;
    $("#value").html("CurrentValue: " + lux + 'lux');
    if (lux < threshold) {
      if (!isGetWild) {
        isGetWild = true;
        getWildAndTough();
      }
    } else {
      isGetWild = false;
    }
  });
});
</script>

```

# メモ
- 2016/4月現在では、照度センサーが使えるブラウザがFireFoxしかない
- Youtubeを新しいタブで開いているからポップアップ許可が必要
- Youtubeの再生開始時に広告が入るとGetWild退勤じゃなくてCM退勤になる
- devicelightイベントがロード時に発生しないのか、初期値が取れない

# 他のGetWild退勤方法

- [[iOS]部屋の灯りが消えたら自動でGet Wildを再生してGet Wild退勤する](http://qiita.com/oubakiou/items/b9b78b00906415d056b2) [oubakiou氏](http://qiita.com/oubakiou)
- [[Android]部屋の灯りが消えたら自動でGet Wildを再生してGet Wild退勤する](http://qiita.com/napplecomputer/items/6afa7866c99becf56a0d) [napplecomputer氏](http://qiita.com/napplecomputer)
- [[Arduino]部屋の灯りが消えたら自動でGet Wildを再生してGet Wild退勤する](http://qiita.com/Shinichi-Ohki@github/items/1edbe910c8659b20b3fd) [Shinichi-Ohki氏](http://qiita.com/Shinichi-Ohki@github)
- [[windows10]部屋の灯りが消えたら自動でGet Wildを再生してGet Wild退勤する](http://qiita.com/iwata-n@github/items/0ace766ee98326723b5f) 自分
google docsからChatworkへポストする

google docsの内容をChatworkにポストさせたいと思い、調べてやったことを書きます。

用途としては、ドキュメントの内容をChatworkに知らせたり、など。
バグ管理表をgoogle docsで管理してる場合等に使えればなと思った。

#Chatwork側の準備
- 自動ポストさせるアカウント作成
- APIトークンを発行
-> http://developer.chatwork.com/ja/authenticate.html

# google docs側の準備
- 該当のgoogle docsページにいく
- メニュー＞ツール＞スクリプトエディタ選択
- エディタ画面に遷移する。
- エディタ画面＞リソース＞ライブラリ＞ライブラリを検索
- 下記リンクを参考にプロジェクトキーをいれる

http://c-note.chatwork.com/post/69590585422/chatworkapi-gas-library

- これで```ChatWorkClient```が有効になる
- postのしかたも上記リンクを参考に
- メニュー＞時計アイコンクリック　で定期実行もできます
AD2 > Link > 50オーム終端 @ 指先サイズのチップ型光電子増倍管「マイクロPMT」内蔵モジュールの使い方

@ トランジスタ技術 2016.04 > 指先サイズのチップ型光電子増倍管「マイクロPMT」内蔵モジュールの使い方 by 中谷崇典さん

> 図9 50Ω終端で測定するとマイクロPMTからの素の出力が見える

抵抗を入れる前と後で明確に出力が変わっている。

Analog Discovery 2の[ＢＮＣコネクタ拡張ボード](http://akizukidenshi.com/catalog/g/gM-07743/)に50Ω切り替えがついているのと関係あるのかもしれない。
要調査。

<hr>
関連しそうなリンク

http://electronics.stackexchange.com/questions/101634/terminating-a-50-ohm-source-into-1m-ohm-oscilloscope-input

> a T-connector with a 50Ω termination should work just as well

50Ω は終端にすることになりそう。
Bluemixにある、オープンソースDBのDBaaS 「Compose」ってなに・・？

Bluemixから色々ノリで試したみたけれども↓　・・・
**PostgreSQLとかMongoとか、OSSのDBの環境を簡単に作れるらしい**
http://qiita.com/azzeten/items/e9e09c3586c153916332
**Bluemixで、お手軽PostgreSQL（ by Compose.io）**
http://qiita.com/azzeten/items/c1e72b3fe3cb9421e3ba

##もともとは、MongoHQ　というサービス名だったらしい
MongoDBのホスティングサービスをやってたんですね。なるほどなるほど。で、飽きたか何かで、OSSDB全般に手を広げたのかしら・・。2014年に名前が変わったそうです。

##いまは、7種類のOSSのDBaaSをやっている
従来からやっているMongoに加えて、こないだ紹介したPostgreSQLだったり、Elasticsearchなど全部で7種類のDBaaSをやっている。豊富だ！
全部触ったことあるわけではないですが、たぶんこんな自分でも名前はなんとなく知っている（読めないけど）くらいだから、有名どころ・主要どころは押さえられている！という感覚？

##2015年にIBMが買収
へー。なんか、Enterpriseってのがあるけど、このへんで、なんか、あるのかしら。
https://enterprise.compose.io/

http://www-03.ibm.com/press/jp/ja/pressrelease/48389.wss
http://japan.zdnet.com/article/35067826/
http://www.publickey1.jp/blog/15/ibmmongodbdbaascomposebluemix.html
https://www.compose.io/articles/compose-is-joining-ibm/

##結論：とりあえずfree trialのアカウント作ってみて遊ぶ！！
まだ自分も遊びきれていませんが、とりあえずこの前記事にも書いたように、「とりあえずアカウント作って遊んでみる」と、どれだけ簡単にできるかとか、どれだか使いやすいか/あるいはもっとこうだったら良いなー。が見えてくると思うので、タダだし、気軽に使えるので、試してみると、面白さが広がるかもしれません
windows10 導入後にやること

#勝手にスリープから復帰する
[「勝手なスリープ解除」を全部中止させる方法](http://freesoft.tvbok.com/win10/tips/sleep_released_unintentionally.html)

#Program Files へのアクセスに毎回管理者権限を要求される
[「Program Files」内のファイルを変更できるようにする方法](http://fanblogs.jp/kikuichimonji/archive/25/0)
→所有者の変更だけでOKでした

#スリープモードへのショートカットがない
[Windows10にて開くだけでシャットダウン等が出来るショートカットの作り方](http://o-way.net/shortcuts-of-power-supply-for-windows10/)


#スタートアップを設定する方法
[Windows 10でスタートアップを設定する方法](http://jmatsuzaki.com/archives/15784)

#マウスでスリープから復帰させない設定
[スリープ(休止)状態をキーボード・マウスから復帰させないようにする]
(http://128bit.blog41.fc2.com/blog-entry-329.html)
jQueryでスマホ向けドロップダウンメニューを作る	


## はじめに
スマホでよく見るようなドロップダウンメニューを作る。
jQueryを使えば簡単に実装することができる。

## HTML

以下のコードを`<head>`に書いてjQueryを読み込む

```html:head
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
```

`<header>`は画面上部に表示されるメニューバー、`<header>`内部の`<nav>`がドロップダウンメニューの中身になる。
`<ul>`がメニューのリスト。`<li>`がそれぞれのメニューを示している。
`#menu_button`を押すと`<ul>`が開閉するように実装する。
`<main>`はメインコンテンツを示す。

```html:body
<header>
	<div class="menu_button"><span>menu</span></div>
    <nav class="nav">
		<ul>
	    	<li>メニュー１</li>
	    	<li>メニュー２</li>
	    	<li>メニュー３</li>
		</ul>
    </nav>
</header>
<main>
    <div style="width: 50%; height:1000px; background-color: #aaa; margin: 0 auto;">
		メイン
    </div>
</main>
```

## メニューの基本構造

`<hearder>`の高さを定めてその分だけ`<nav>`と`<main>`を下に配置する。
以下の例では`height`を40pxにしている。
`<nav>`と`<main>`の`position`をabsoluteに設定して、`top`をそれぞれ100%, 40pxとした。
`<nav>`は`<header>`の内部にあるので100%と設定すれば`<header>`の下に配置される。
また常にメニューバーを表示させるために`position`をfixed、`z-index`を大きな値である1000にしている。

```css:基本構造
header {
    height: 40px;
    z-index: 1000;
    position: fixed;
}
header nav {
    position: absolute;
    top: 100%;
}
main {
    position: absolute;
    top: 40px;
}
```

## デザイン

デザインは以下のとおり。
これでドロップダウンメニューが開かれた状態が表示される。

```css:デザイン
header {
    background-color: #111;
    color: white;
    width: 100%;
}
header .menu_button {
    border-left: solid 1px white;
    float: right;
    width: 70px;
    height: 100%;
    text-align: center;
}
header .menu_button span {
    line-height: 40px;
}
header nav {
    background-color: #111;
    color: white;
    width: 100%;
}
header nav ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
}
header nav ul li:first-child {
    border-top: solid 1px white;
}
header nav ul li {
    border-bottom: dotted 1px white;
    text-align: center;
    padding: 1em;
}
main {
    width: 100%;
}
```

## jQueryによるドロップダウンの実装

初期設定として`.nav`の`display`をnoneにしてメニューが閉じた状態にする。
`.menu_button`のクリック時に`$(".nav").slideToggle()`が実行されるようにして[完成](http://tetsuyanegishi.github.io/Warehouse/drop_down_menu/index.html)。

```js:ドロップダウン
$(function() {
    $(".nav").css("display","none");
    $(".menu_button").on("click", function() {
		$(".nav").slideToggle();
    });
});
```
SolidityのMappingについて

最近、Ethereumを触っていまして、contract作成用のSolidityという言語を触っています。

下記のページにSolidityの説明が詳細に載っています。
[Solidity by example](https://solidity.readthedocs.org/en/latest/solidity-by-example.html)

読み進めてる途中、mappingというのが出てきまして、

```lang:
mapping(address => Voter) public voters;
```

これが一体何なのか、何となく分からなかったのですが、３月半ばにEthereumのサイトが一新されまして、その中にcontract作成の例が複数のってあり、説明を見つけました。

[CREATE YOUR OWN CRYPTO-CURRENCY WITH ETHEREUM]
(https://www.ethereum.org/token)

上記ページのはじめの方に、
A mapping means an associative array, where you associate addresses with balances.
と書いてあり、なるほど連想配列か、と理解。

つまり下記の例だと、

```lang
mapping (address => uint256) public balanceOf;
mapping (address => bool) public frozenAccount; 
mapping (address => mapping (address => uint256)) public allowance;
mapping (address => mapping (address => uint256)) public spentAllowance;
```

balanceOfはaddressを添字としたuint256型の配列、frozenAccountはaddressを添字とたboolean型配列、allowanceとspentAllowanceはaddressを添字としたuint256型の二次元配列、ということですね。


Ethereumのページのどこかにわかり易い説明が載っているのかもしれませんが、私が見つけることができたのはこの説明だけでしたので、こちらに簡単にまとめました。

ご参考になれば幸いです。
display = "block";

divタグとかの表示、非表示を切り替える関数を作った。けど、。

``` change_menu.js
function change_menu(num) {
  var ul1 = document.getElementById('menu1');
  var ul2 = document.getElementById('menu2');

  ul1.style.display = "none";
  ul2.style.display = "none";

  if(num==1) ul1.style.display = "block";
  if(num==2) ul2.style.display = "block";
}
```
だと正常に表示されない。

```
  if(num==1) ul1.style.display = "block";
  if(num==2) ul2.style.display = "block";
```

この部分を

```
setTimeout(function(){
  if(num==1) ul1.style.display = "block";
  if(num==2) ul2.style.display = "block";
},0}
```
のように書き換えることで正常に動くようになった。
ちなみに実行環境はpanasonicテレビのアクトビラで用いられているwebブラウザ。
Lubuntu 14.04 で ASTEC-X


## 環境
- Linux: Lubuntu 14.04.4 LTS (64bit)<br>[くまさんISO](http://kumasan1949.zouri.jp/down-ubuntu-f.html)から Lubuntu-14.04.4-64bit-kuma0317.iso
- Windows 10 (64bit)
- ASTEC-X (8.0アップデート適用)

## Lubuntu側

1. `/etc/lightdm/lightdm.conf.d/20-lubuntu.conf`に、以下を追加

    ```txt:/etc/lightdm/lightdm.conf.d/20-lubuntu.conf
[XDMCPServer]
enable=true
```
2. 再起動

## ASTEC-X
1. Control Panelを開いて、
    1. 接続: XDMCPを使用する<br>![AstecX1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/66c7b68c-3076-57c3-df88-c052e4788755.png)
    2. XDMCP接続のプロパティ: インダイレクト、ホスト名<br>![AstecX2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/240ee3fd-255a-6bd9-426a-c27102d2021c.png)
    3. シングルウィンド: シングルウィンドウモードを使用する<br>![AstecX3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/26285eca-fff0-8434-e188-e9cf65bbd64b.png)
2. ASTEC-X 本体起動
    1. ログイン画面がでてくる<br>
![AstecX4.png](https://qiita-image-store.s3.amazonaws.com/0/75594/71610c15-eecd-5306-e505-89ca1b85b24a.png)
    2. ログインして、ブラウザを開いたところ。<br>![AstecX5.png](https://qiita-image-store.s3.amazonaws.com/0/75594/9c88712a-33f9-0411-3459-7cafdfbbc3b7.png)

- ん？　Windowsの上の部分が黄色い？
技術英語 > and suddenly began picking up some very [high readings] of chromium. / Your bio-neural energy readings are normal.

@ LOE > March 7, 2003
http://loe.org/shows/shows.html?programID=03-P13-00010
> and suddenly began picking up some very <font color=red>high readings</font> of chromium. 

chromium の値が高くなっている。

<hr>
Star Trek Voyagerのfiction
http://www.ralst.com/Eternal.HTM

> Your bio-neural <font color=red>energy readings are normal</font>.
rules.before 覚書

``/etc/ufw/before.rules`` のコメント行の和訳。

before.rules には ufw コマンド行がルールへ追加される前に実行するべきルールを記述する。 
設定するルールは下記のチェーンの一つとして登録する:

* ufw-before-input
* ufw-before-output
* ufw-before-forward

下記の行を削除してはならない。これを削除した場合、エラーが発生する。

```
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
```

必須の行はここまで。

loopback における送受信を許可する。

```
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT
```

既に存在する接続のパケットを処理する。

```
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```

不正なパケットを破棄する。(loglevel が medium 以上である場合に記録を残す)

```
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
```

受信における icmp コードを受入れる。

```
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
```

転送における icmp コードを受入れる。

```
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
```

dhcp クライアントの動作を許可する。

```
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT
```

ufw-not-local

```
-A ufw-before-input -j ufw-not-local
```

if LOCAL, RETURN

```
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
```

if MULTICAST, RETURN

```
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
```

if BROADCAST, RETURN

```
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
```

上記以外の non-local パケットは破棄する。

```
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP
```

MULTICAST mDNS のサービス探査を許可する。 
(必ず前述の MULTICAST 行のコメントを外しておくこと)

```
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT
```

MULTICAST UPnP のサービス探査を許可する。 
(必ず前述の MULTICAST 行のコメントを外しておくこと)

```
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT
```

COMMIT 行を削除してはならない。削除した場合、ルールは適用されない。

```
COMMIT
```
IntelliJ IDEA ショートカットリンク集（随時更新）

## 概要
IntelliJ IDEAの便利なショートカット等を紹介しているリンク集（随時更新します）

## リンク
- [知らないと損?RubyMine(IntelliJ)で役立つ細かいテクニック７つ](http://qiita.com/Avene/items/756c17f87d28d2ee47a4)
- [忙しい人のためのIntelliJ IDEAショートカット集（´-`）](http://qiita.com/yoppe/items/f7cbeb825c071691d3f2)
- [Rubymine 個人的ショートカット、設定](http://dany1468.hatenablog.com/entry/2013/11/25/005658)
- [RubyMineの初期設定とショートカット](http://qiita.com/moriyaman/items/5006447cbf785ce94b8c)
- [IntelliJ IDEAのショートカットでコメントを付ける](http://qiita.com/pugiemonn/items/ad238f70d4b5f23a3653)
- [PhpStormでまず覚えるべきショートカット](http://qiita.com/crifff/items/bbdf850f0d90ad16415a)
- [知らないと｢PhpStormのライセンス料をドブに捨ててる｣も同然のショートカットキーを教えてください](https://qiita.com/suin/items/bda682201fed0936cf95)

## 個人的によく使うショートカット
※全てMacOXでの操作です。

- 検索（grep的な）
    - ```command + shift + F```

- 検索（grep）をして置き換える
    - ```command + shift + R```

- 検索（ファイル）
    - ```Shiftを2回押す```

- 指定した行数にジャンプする
    - ```command + L```

- 選択した文字列を大文字にする（もう一度押すと元に戻る）
    - ```command + shift + U```
hubot-chatworkアダプタをプロキシ対応する

# cahtworkアダプタはプロキシ対応していない
（正確には、httpsリクエストでプロキシを作るように作りこんでいない？？）

なのでハックします。
もし筋が悪いやり方をしていたら、すみません。

#　やりかた

1. node_modules/hubot-chatworkに移動します
1. npm install tunnel します
1. 下記の行を足す＆変更します。
 
```coffeescript:chatwork.coffee
tunnel = require 'tunnel'

##add
@proxy = 
	"host" : '127.0.0.1'
	"port" : 8080
tunnelAg = tunnel.httpsOverHttp {@proxy}

#############略####################

options =
　　　　　　　　　 　# "agent" : false
      "agent"  : tunnelAg
      "host"   : @host
      "port"   : 443
      "path"   : "/v1#{path}"
      "method" : method
      "headers": headers
```

ただ、この場合、すべてのリクエストがプロキシに飛ぶので
プロキシ内外のアクセス制御をする場合は、別途何とかする必要があります。



# 余談

おい！ChatWork用のjenkinsプラグインあるじゃんか！
hubotに通知してもらおうと思ったけど…、要らないんじゃん…。
https://wiki.jenkins-ci.org/display/JENKINS/ChatWork+Plugin
マイナンバー占い

# はじめに

マイナンバーとは、国から日本人ひとりひとりに交付される、12桁の数字からなる番号である。この番号を用いて、男女間などである占いができるが、マイナンバーを無闇に他人へ教えてはならない。この記事ではまず、“マイナンバー占い”について解説し、マイナンバー占いをマイナンバーを公開せずに行う方法について説明する。

# 概要

マイナンバー占いとは、マイナンバーを持つ人物$A$と$B$の間で行う占いである。まず、$A$と$B$のマイナンバーをそれぞれ$N_A$と$N_B$とする。また、$N_A$の1桁目を$N_{A_1}$、2桁目を$N_{A_2}$とする。同様に$N_B$の1桁目を$N_{B_1}$、2桁目を$N_{B_2}$とする。
マイナンバー占いは次のように相性を決める。

1. $N_{A_i} = N_{B_i} (i = 1, 2, \dots, 12)$となる$i$を紙にメモする
2. メモされた数字のかぞえ、メモされた数字が$0$個だったら相性はよくなく、$12$に近ければ近いほど相性がよい[^identity]

[^identity]: 従って、このマイナンバー占いでは自分と自分の相性は最大となる。

しかし、この占いをナイーブに二者間で実行しようとすると、$N_{A_1}$や$N_{B_5}$などを相手に公開しなければならず、他者にマイナンバーが流出する。そこでこの記事では各桁を公開することなく、マイナンバー占いを実行する方法について解説する。

# ハッシュ関数

この占いを達成するには、**ハッシュ関数**と呼ばれる関数が必要になる。この関数は、入力された値から決った値を計算する関数であるが、出力された値から入力された値を計算するような逆関数が作れない関数である。このようなハッシュ関数として有名なアルゴリズムにSHA256やMD5といったものがあるが、これらは人間が紙やペンを使って計算するにはやや難しすぎるので、マイナンバー占いというカジュアルさにあわせたハッシュ関数を使う。
まず、素数$p$とその素数の生成元$g$を用意する。生成元とは、$1$から$p-1$までの全ての$x$について、$g^x \bmod p$が全て異なる値になるような$g$のことを指す。
これらを用いて、ハッシュ関数$H$を次のように定義する。

```math
H(x) = g^x \bmod p
```

この関数によって得られたハッシュ値$H(x)$から$x$を求めることは、離散対数問題と呼ばれ困難なことが知られている。

# 電子署名

この占いでは**ブラインド署名**と呼ばれる技術が必要になる。ブラインド署名を解説する前に、それを構成するための署名について計算がシンプルなRSA署名を例に説明する。

## RSA署名

電子署名とはそもそも、ある文書が確実にその署名鍵を持つ人が生成したことを示すための技術である。RSA署名では次のように署名を行う。
まず、署名者は素数$p, q$を生成し、検証鍵$(e, n = pq)$と署名鍵$d$を生成する。ただし、この検証鍵$e$と署名鍵$d$を全てのメッセージ$m$について、次が成り立つ。

```math
(m^e)^d = (m^d)^e \equiv m \pmod{n}
```

この特徴を用いて、次のように$A$と$B$の間で署名をすることができる。

1. $A$は素数$p, q$を生成し、検証鍵$(e, n = pq)$を$B$へ送信する
2. $B$は検証鍵$(e, n)$を保存する
3. $A$は署名したいメッセージ$m$について、その署名$x = m^d \bmod n$を計算し$(m, x)$送信する
4. $B$は検証鍵$(e, n)$を用いて、$m = x^e \bmod n$が等しいことを調べる

このRSA署名は、素数$p, q$を知っている署名者は署名鍵$d$を容易に作れる反面、素因数分解の困難さから合成数$n$しか知らない検証者は署名鍵$d$を計算するのが困難であるという性質の上に成り立っている。

## ブラインド署名

ブラインド署名はRSA署名とはやや異なり、「署名者が署名しているメッセージが分からない」という特徴を持つ。ブラインド署名は一般的な用途として電子投票などで使われている。さきほどのRSA署名を次のように改造することで得られる。

1. $B$はメッセージ$m$に検証鍵$(e, n)$と乱数$r$を用いて$x = r^e m \bmod n$を計算し$x$を$A$へ送信する
2. $A$は$x$に対して、署名鍵$d$を用いて$y = x^d \bmod n$を計算し$y$を$B$へ送信する
    
    ```math
    y = x^d = (r^e m)^d = (r^e)^d m^d \equiv r m^d \pmod{n}
    ```
3. $B$は乱数[^random]$r$を用いて$y / r \bmod n$を計算する

    ```math
    y / r = (r m^d) / r \equiv m^d \pmod{n}
    ```

このようにすることで、$B$（検証者）は$A$（署名者）にメッセージ$m$を知られることなく$m^d \bmod n$を計算できている。

[^random]: 乱数はコイントスなどを用いてカジュアルに生成できる。

# 秘密共通集合計算によるプロトコル

ハッシュ関数$H$とブラインド署名を用いることで、マイナンバーを知られることなくマイナンバー占いができるようになる。次のようにする。

1. $A$はRSA署名の鍵生成を行い、検証鍵$(e, n)$を$B$へ送信する
2. $B$は乱数$r$を生成し、$s_i = r^e M_{B_i} \bmod n$を計算し、集合$\\{s_i\\}$を$A$へ送信する
3. $A$は$t_i = (s_i)^d \bmod n$を計算して、集合$\\{t_i\\}$を$B$へ送信する
4. $A$は$u_i = H\left((N_{A_i})^d \bmod n\right)$を計算して、集合$\\{u_k\\}$を$B$へ送信する
5. $B$は$v_i = H\left(t_i / r \bmod n\right)$を計算する
6. $B$は$u_i = v_i$となるか検証し、等しい$i$を紙にメモする
7. $B$はメモされた$i$を$A$に公開し、数をかぞえる

このようにすることで、マイナンバーを知られることなくマイナンバー占いを行うことができる。

# まとめ

暗号技術を使うことで、マイナンバーを秘密にしたままマイナンバー占いを行うことができることを示した。この占いを応用すれば、たとえばマイナンバーを教えることなくマイナンバーの共通の約数を共有することなどができる。
視点がさまよっているif文,for文は読みにくい

リファクタリングが必要になってC++のソースコードを読んでいる。

わかりにくいソースコードの１つの要因は、ソースコードで変数に着目する際に視点がさまよっていることであることに気づいた。

for文の場合、制御変数にしたがって視点が動いていく。その制御変数に沿った視点で現象を記述していくことで現象が理解しやすくなる。

よいと思われる例

```.cpp:
for(int x = 0; x < n; x++){
    if(x > a){
	doSomething(x);
    }
}
```


推奨しかねる例

```.cpp:
for(int x = 0; x < n; x++){
    if(a < x){
	doSomething(x);
    }
}
```

いま、xが物事を評価するうえでの基準となる着目している変数だとしたら、
if(x > a){
	doSomething(x);
}
と書くべきと考える。



よいと思われる例

```.cpp:
//　new[i]が [a[i], b[i]]の範囲になるようにクリッピングする。
for(int i=0; i<n; i++){
    if(new[i] < a[i]){
        new[i] = a[i];
    }else if(new[i] > b[i]){
        new[i] = b[i];
    }
}
```

この例ではnew[i]に着目していて、いわば文の主語になっていることがわかる。


推奨しかねる例

```.cpp:
//　new[i]が [a[i], b[i]]の範囲になるようにクリッピングする。
for(int i=0; i<n; i++){
    if(a[i] > new[i]){//ここしか変えていない
        new[i] = a[i];
    }else if(new[i] > b[i]){
        new[i] = b[i];
    }
}
```


ここでは、1箇所しか変えていないのに、先の表現に比べるとわかりやすさを低下させているように思う。
左辺式になって値が書き換えられる側は、目立つようにするのがよい（比較の左側におく）。

英文を書く際に、能動態の文と受動態の文が混在して視点が定まらない文章はよくない文章だという指摘を受けたことがある。
それと同じことがC/C++などのプログラムのソースコードについても言えるのではないでしょうか。
本番とステージングをシェルで見分けるためのアイデア

 
 
 .bashrcで、コンソールのプロンプトの色付けをしてみる。
 
 以下で赤い文字でPRODと入る。
 
 
 ```
 PS1='[\[\u@\h \W \e[31mPROD\e[m\]]# '
 ```
 ※2016/04/05　上手く改行できていなかったので、修正
  
##色と番号は以下のとおり
 
|no|color|
|----|-----|
| 0 |Black	|
| 1 |Red	|
| 2 |Green	|
| 3 |Yellow|	
| 4 |Blue	|
| 5 |Magenta|	
| 6 |Cyan	|
| 7 |White|
GCCイースターエッグ

[GCC Easter Egg: C++ Undefined Defined Behavior](http://feross.org/gcc-ownage/?1?1)

GCC 1.17[^1]に存在したらしいイースターエッグ。未知の`#pragma`に遭遇すると、勝手にNetHackやRouge[^2], Emacs上でハノイの塔シミュレータを起動する。いずれも存在しなければメッセージ"You are in a maze of twisty compiler features, all different"[^3]を表示する。

（引用元でも言及されている通り、現在のC/C++言語仕様上は未定義動作(undefined behavior)ではなく、処理系定義(implementation defined)な動作であるといえる。ANSI C言語仕様が1989年策定ということを考慮すると野暮な話ではあるが。）

[^1]: GCC 1.17は[1988年にリリース](https://gcc.gnu.org/releases.html)されたバージョン。
[^2]: いわゆるローグライクゲームの元祖。
[^3]: PDP-10用アドベンチャーゲーム [Colossal Cave Adventure](https://en.wikipedia.org/wiki/Colossal_Cave_Adventure) からのパロディらしい。
Ruby2.3&Twitter Ruby GemでTwitterキーワード検索を試す

[だいぶ前に書いた記事](http://qiita.com/d_shimizu/items/05e42ba15cd13e45cfca)のアップデート版です。
2016/4/1時点での最新版のRuby2.3とTwitter Ruby GemでTwitterキーワード検索の動作確認しました。

## 環境
- [Ruby (v2.3.0)](https://www.ruby-lang.org/ja/news/2015/12/25/ruby-2-3-0-released/)
- [Twitter Ruby Gem (v5.16.0)](https://github.com/sferik/twitter)
- [Twitter REST API](https://dev.twitter.com/rest/public)

## サンプルコード
```Twitter_KeywordSearch.rb
#!/bin/env ruby
#encoding:UTF-8
require "twitter"

# アプリケーションキー(consumer key/secret)の読み込み
# OAuth アクセストークンの読み込み
@client = Twitter::REST::Client.new do | cnf |
  cnf.consumer_key = "****************************************"
  cnf.consumer_secret = "****************************************"
  cnf.access_token = "****************************************"
  cnf.access_token_secret = "****************************************"
end

# 変数の初期化
since_id = 0
counter = 0

# 無限ループ
while counter == 0  do
    begin
      # 引数で受け取ったワードを元に、検索結果を取得し、古いものから順に並び替え
      # ※最初はsince_id=0であるため、tweet ID 0以降のTweetから最新のもの上位100件を取得
       @client.search(ARGV[0], count: 100, result_type: "recent").take(100).reverse.collect do |tweet|

        # Tweet ID, ユーザ名、Tweet本文、投稿日などなど・・・を1件づつ表示
        p tweet.user.id
        p tweet.user.screen_name
        p tweet.user.description
        p tweet.user.location
        p tweet.text
        p tweet.retweet_count
        p tweet.favorite_count
        p tweet.geo
        p tweet.place
        p tweet.source
        p tweet.created_at
        print("\n")

        # 取得したTweet idをsince_idに格納
        # ※古いものから新しい順(Tweet IDの昇順)に表示されるため、
        #  最終的に、取得した結果の内の最新のTweet IDが格納され、
        #  次はこのID以降のTweetが取得される
        since_id=tweet.id
      end

    # 検索ワードで Tweet を取得できなかった場合の例外処理
    rescue Twitter::Error::ClientError
      # 60秒待機し、リトライ
      sleep(60)
      retry
    end
    sleep(60)
end
```

## 実行
```
% ruby Twitter_KeywordSearch.rb 検索ワード
```
SlackのUser GroupにHubot経由で全体通知する

# やりたいこと
Hubotから `@usergroup` でユーザグループに通知を飛ばしたい。

## ユーザグループとは？
特定のチャンネルの全員ではなく、特定の人に通知をしたい場合に使える機能。
グループに参加すると特定のチャンネルにjoinさせることもできる。

### ユーザグループの利用シーン
- チャンネルはトピックごとに参加者がいる（例えば開発チャンネルには開発に関わる全ての人がいるはず）。そのうちの一部（例えばインフラエンジニア）だけに通知したいとか。
- 新入社員が1000個あるチャンネルから必須チャンネル10個とかを登録してもらうとかめんどくさい。グループにjoinしてもらうと一括で必須チャンネルに登録できる。

### 詳細は公式の説明をお読み下さい
- [Group Messages Come to Slack — Several People Are Typing — The Official Slack Blog — Medium](https://slackhq.com/group-messages-come-to-slack-65e3fafea534#.ek2u997a4)
-  [User Groups – Slack Help Center](https://get.slack.help/hc/en-us/articles/212906697-User-Groups)

# やり方
以下のドキュメントに方法が書いてある。
[Message Formatting | Slack](https://api.slack.com/docs/formatting)

## 制限
> For paid teams

とあるように、有料で使っていないとできない。

## グループIDを取得する
usergroups.list APIを使って通知したいグループのIDを取得する。
ドキュメント：[usergroups.list method | Slack](https://api.slack.com/methods/usergroups.list)

### 取得結果が以下だったと仮定する
- "id": "S0*******"
- "team_id": "T0*******"
- "is_usergroup": true
- "is_subteam": true
- "handle": "mygroup"

## 指定のフォーマットで通知先を書く
`<!subteam^ID|handle>`の項目を埋めていく。

```rb
"<!subteam^S0*******|mygroup>"
```
hubot経由で上の文字列をSlackにポストすると、`@mygroup`としてグループに通知される。
Atomのmarkdown-previewのフォントを変更する方法


Atomのエディタ部分のフォントは簡単に設定できるけど、それだけではmarkdown-previewで表示されている部分のフォントは別のフォントになってしまう。
markdown-previewのフォントを変更するには下記のような設定が必要なようだ。

# 環境

* Windows7
* Atom 1.6.1

# 設定前の状態

我慢すれば使えるレベルだけど、いくつかの文字が変な状態になってしまう。
特に「、」と「。」の位置がおかしいのが気になってしまう。

![2016040101.jpg](https://qiita-image-store.s3.amazonaws.com/0/119609/f57dd25a-c58b-db56-28a8-80b74fe52044.jpeg)


# 設定方法

+ ツールバーの「File（ファイル）」から「Setting（環境設定）」をクリック。
+ 「Open Config Folder（設定フォルダを開く）」をクリック。
+ 別ウィンドウが開くので「styles.less」をクリック。
+ 右側のエディタの一番下に下記のコードを追加。
（'MS UI Gothic'の部分は使いたいフォントに変更）

```css
.markdown-preview.markdown-preview {
  font-family: 'MS UI Gothic';
}
```
+ ツールバーの「File（ファイル）」から「Save（保存）」で設定を保存して、Atom関係のウィンドウをすべて閉じる。
+ もう一度Atomを起動する。

# 設定後

こんな感じでmarkdown-preview側のフォントを変更できます。

![2016040102.jpg](https://qiita-image-store.s3.amazonaws.com/0/119609/725d2303-28e2-7037-dfa1-4dda6eb9683a.jpeg)

# 参考
+ [Qiita:atomのmarkdown-previewで日本語が豆腐になる(Ubuntu)](http://qiita.com/Mokkeee/items/cca4ba3a6bf334fa7934)
【その他】フリーのサーバ監視ソフト


備忘録としてメモ。

-

#1.フリーのサーバ監視ソフト
- mrtg（http://www.mrtg.jp/doc/）
- cacti（http://www.cacti.net/）
- nagios（http://pepabo.github.io/docs/nagios/learning.html）
Qiitaに動画を埋め込む方法

## 結論
**Twitter**の埋め込み動画を使いましょう。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">The Oculus Rift review: The dream and the reality <a href="https://t.co/IOBliynobN">https://t.co/IOBliynobN</a> <a href="https://t.co/aluC01HrsU">pic.twitter.com/aluC01HrsU</a></p>&mdash; CNET (@CNET) <a href="https://twitter.com/CNET/status/714459992745766913">2016年3月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## HOW TO
IoTのデモのような画面上だけで完結しない場合や音が必要な場合、また、解像度が必要な場合では、GIFでは些か不十分であります。しかし、youtube等のリンクではインラインで動画が再生できないため、心理的障害が高くなり、あまり見てもらえません。

そこで、Twitterのインライン展開です。

QiitaはTwitterのインライン展開をサポートしているため、twitterに埋め込まれた動画やGIF、Vineの動画も見ることができます。手順としては、Twitterから「ツイートをサイトに埋め込む」または、「動画を埋め込む」をクリックし、コピペをするだけで終了です。GIFに変換する手間も減り、一石二鳥ですね。

## 例

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">The Oculus Rift review: The dream and the reality <a href="https://t.co/IOBliynobN">https://t.co/IOBliynobN</a> <a href="https://t.co/aluC01HrsU">pic.twitter.com/aluC01HrsU</a></p>&mdash; CNET (@CNET) <a href="https://twitter.com/CNET/status/714459992745766913">2016年3月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Microsoft Research、HoloLens越しに等身大の相手とのリアルタイム遠隔対話「holoportation」の映像を公開 <a href="https://t.co/YNHFKy7Byx">https://t.co/YNHFKy7Byx</a> <a href="https://t.co/ufG3MUHI69">pic.twitter.com/ufG3MUHI69</a></p>&mdash; 白ペンギン (@shiropen2) <a href="https://twitter.com/shiropen2/status/713541491654676480">2016年3月26日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 2016/04/03 追記
Chromeではデスクトップおよびスマホでも展開されますが、残念ながら、firefoxではtwitterの展開がされないようです。
【Linux】カーネルパラメータの変更


備忘録程度に整理。

-

# 1.全カーネルパラメータの確認

````コマンド
# sysctl -a
````

````実行例
test:~ test$ sysctl -a
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin
user.bc_base_max: 99
user.bc_dim_max: 2048
user.bc_scale_max: 99
user.bc_string_max: 1000
user.coll_weights_max: 2
user.expr_nest_max: 32
・
・
・
````

-
# 2.特定パラメータの確認

````コマンド
# sysctl <パラメータ名>
````

````実行例
test:~ test$ sysctl user.bc_base_max
user.bc_base_max: 99
test:~ test$ 
````

-
# 3.パラメータ変更

````コマンド
# sysctl -w <パラメータ名>=<値>
````
Gebがxpathをサポート

0.12.0でサポートされてました。

厳密には、WebDriverのByセレクターをサポートしたことにより実現されています。
[メーリングリスト](https://groups.google.com/forum/#!searchin/geb-user/release/geb-user/2LXtg0pP4Do/HhaKehvlfBgJ)で、リリースのハイライトと言及されてました。

# サンプル
本家のドキュメントによれば、こんな感じで呼べるみたい。

```groovy
$(By.xpath('//p[@class="xpath"]'))
```

WebDriverのByをサポートしているので、他のidなども書けるようになっています。

```groovy
$(By.id("some-id"))
$(By.className("some-class"))
```

# 参考

- [本家のドキュメント](http://www.gebish.org/manual/current/#using-webdriver-s-code-by-code-class-selectors)
- [Gebのメーリングリストの関連投稿](https://groups.google.com/forum/#!searchin/geb-user/release/geb-user/2LXtg0pP4Do/HhaKehvlfBgJ)
- [関連するstackoverflow](http://stackoverflow.com/questions/15753134/get-element-by-xpath-geb)
Groovyで引数ありのメソッドを引数なしで呼べる？

ちょっとハマったのでメモ。タイトルの通りだけど。
Groovy:2.4.6, Gradle:2.12, Spock:1.0で試しています。

# 引数つきメソッドが引数なしで呼べる（やりようによってはテストも通る）

```groovy:Sample.groovy
class Sample {

    String say(String message) {
        return "Hello!"
    }
}
```
上記のように、引数を1つ取るメソッドが定義されていて
それを下記のように引数なしで呼ぶテストを書いてみる。

```groovy:SampleSpec.groovy
class SampleSpec extends Specification {

    def "引数ありのメソッドに引数なしで呼べる"() {
        given:
        def sut = new Sample()

        when:
        def actual = sut.say()

        then:
        actual == "Hello!"
    }
}
```

Javaならコンパイルエラーになるところだけど、Groovyだと通る。
しかもRedではなくGreenとなる。

# テストをRedにしたい場合
たとえば上記のクラスを変更して、

```groovy:Sample.groovy
class Sample {

    String say(String message) {
        return "Hello! $message"
    }
}
```
としてみると、下記のように落ちる。

<img width="749" alt="Screen Shot 2016-03-28 at 22.25.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/5180/d77bd9a9-dfec-3011-cceb-4a5003e9fe93.png">

## 引数なしで呼んだものはnullが入る。

テスト結果から見てわかったけど、引数なしで呼ぶと引数のところはnullが入るのね。
ちなみにコンソールでは、

```bash
org.spockframework.runtime.SpockComparisonFailure at SampleSpec.groovy:13
```
ってな感じのエラーになる。一応コンパイルエラー扱い？となっている。

# 類似事例

しらべてみたところ、同じような問題に言及しているブログ見つけた。

[Groovy gotcha: Passing zero arguments to a method that expects one](https://objectpartners.com/2015/09/02/groovy-gotcha-passing-zero-arguments-to-a-method-that-expects-one/)

コメントとかまで見ていると、```もしnullがnothingってことなら、引数なし呼び出しと引数にnull渡して呼ぶのは等価だね。``` みたいな話が出てる。

油断すると気づかずにいそうだったので、シグニチャ変更するときは気をつけましょう。
C#のLINQで扱う無限リスト

# 今日は μ’ｓ final LoveLiveの最終日です

C#で無限リストを扱いたい時の例です。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;

static class MuseSaying {
    public static IEnumerable<IEnumerable<string>> SayInfinite() {
      var words = new [] {
            "ファイトだよ！"
          , "ﾗﾌﾞｱﾛｰｼｭｰﾄｯ!!"
          , "ﾖｷﾆﾊｶﾗｴﾐﾅﾉｼｭｰ!"
          , "ﾀﾞﾚｶﾀｽｹﾃｰ!!"
          , "にゃー！！"
          , "ｲﾐﾜｶﾝﾅｲ!!"
          , "にっこにっこにー！"
          , "ぷしゅっ！"
          , "ﾊﾗｼｮｰ"
      }
      .Select(x => string.Format(@"\{0}/", x));
      while(true) {
        yield return words;
      }
    }
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> xs) {
        return xs.OrderBy(_ => Guid.NewGuid());
    }
}

class Muse {
    public static void Main(string[] args) {
        MuseSaying.SayInfinite()
            .Select(xs => xs.Shuffle())
            .Take(100)
            .ToList().ForEach(xs => xs.ToList().ForEach(Console.WriteLine));
    }
}
```

ShuffleメソッドはIEnumerable<T>をシャッフルするShuffleメソッドです。

LazyでInfinityなListなのですが、Take()しないと無限に評価されてしまうので  
Take()やTakeWhile()で打ち止めて上げてください。

***μ’ｓの皆さん、今日という日をおめでとうございます！！ そしてありがとうございます！！***
***μ’ｓのみんなからもらった大切なものを大切にしていきます…！***

以上がC#のLINQで無限リストを扱う話でした。

- - -
参考URL

[ラブライブ！μ's Final LoveLive!〜μ’sic Forever♪♪♪♪♪♪♪♪♪〜](http://www.lovelive-anime.jp/otonokizaka/sp_finallive.html)
[LINQメソッドにShuffleを追加する](http://qiita.com/kuchikios/items/6cfc1140a023e3928a17)
[MSDN System.Linq.Enumerable](https://msdn.microsoft.com/ja-jp/library/system.linq.enumerable%28v=vs.110%29.aspx)
[C#でフィボナッチ数列を求める](http://gushwell.ldblog.jp/archives/51894000.html)
Android androidTestCompile に遭遇したConflict with dependencyエラー

androidTestCompile時に以下のエラーに遭遇した。

```
Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (23.1.1) and test app (22.2.0) differ.
```

`com.android.support:support-annotations:22.2.0`  
をどこかで間接参照している可能性があるので、各ビルドの依存関係を確認する。

`./gradlew app:dependencies`

```
androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.android.support.test:runner:0.3 
    +--- com.android.support.test:exposed-instrumentation-api-publish:0.3 
    +--- junit:junit:4.12
    |    \--- org.hamcrest:hamcrest-core:1.3　
    \--- com.android.support:support-annotations:22.2.0
```
runnerの0.3で間接的に参照していた。

`com.android.support.test:runner:0.5`にバージョンを上げて解決。
MySQLでAES_ENCRYPTとAES_DECRYPTでvarbinary型のINDEX動作


## 前提
AES_ENCRYPTとAES_DECRYPTを使いvarbinary型へのデーター保存で暗号化

```
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mail` varbinary(768) NOT null,
  PRIMARY KEY (`id`),
  KEY `mail` (`mail`(112))
);
```

## 登録

```
INSERT INTO `user` SET
`mail` = AES_ENCRYPT('hoge@hoge.com','鍵文字列');
```

## 複合

```
SELECT
AES_DECRYPT(`mail`,'鍵文字列')
FROM `user`;
```

## 検索

### INDEX効く

```
mysql> EXPLAIN SELECT * FROM `user` WHERE `mail` = AES_ENCRYPT('hoge@hoge.com','鍵文字列');
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
|  1 | SIMPLE      | user  | ref  | mail          | mail | 114     | const |    1 | Using where |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)
```

### INDEX効かない

```
mysql> EXPLAIN SELECT * FROM `user` WHERE AES_DECRYPT(`mail`,'鍵文字列') = 'hoge@hoge.com';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.01 sec)
```
kibana4の使い方

2016年3月末現在、AWS ElasticsearchServiceで提供されているkibana(4.0.3)の大まかな使い方をまとめます。

簡単な手順は、
1. Settingsでインデックスの作成
2. Discoverで各インデックスのビューの作成
3. Dashboardで複数のログを見るためのまとまりを作る
となる

### ◆Settingsでインデックスの作成

Elasticsearchに貯められているログのインデックスを作成する場所。
基本的に"logstash-*"形式でkibanaに渡ってくるので、インデックスの形は"log-2016.03.31"や"log_log-2016.04.01"のように

    tag名＋ハイフン＋日付

という形になっている。
kibanaでログを見るためには、Settingsタブで必要なインデックスを作成する必要がある。

例えば、ElasticsearchServiceコンソールのindicesタブにできているログが"test-2016.03.31"の場合、Settingsでは"test-*"というインデックスを作成すれば良い
このとき、"Index contains time-based events"のチェックをはずすとCREATEボタンが緑色になる。

### ◆Discoverで各インデックスのビューの作成

各index内の全てのログを見たり、フィルタリングしたSearches（ビュー）を作成したりする。

右上の各メニューの説明

- New Search：新しいビューを作る（Settingsタブで★印のついた項目の初期の表示にしてくれる）
- Save Search：フィルタリングしたビューの保存を行う(Dashboardで確認できるようになる)
- Load Saved Search：すでに作成済みのフィルタリングしたビューの読み込み
- Settings：見たいindexをここで選択できる

左のリストから自分が見たい項目だけをaddしてくることで、必要な情報の揃ったSearches（ビュー）を作成できる。
のちのち、このSearchesを複数組み合わせて、Dashboardを作成することになる。

### ◆Dashboardで複数のログをまとめて見る

Discoverで作成されたSearchesを一つのDashboardで閲覧する機能を提供する。

右上の各メニューの説明

- New Dashboard：新しいDashboardを作る。ボタン押下で↓まっさらな画面を用意してくれる
- Save Dashboard：作成したDasnboardの保存を行う
- Load Saved Dashboard：すでに作成済みのDashboardを読み込む
- Share：第三者に作成されたDashboardを共有するためのリンクが表示される
- Add Visualization：Dashboard作成時に、SearchesとVisualizationsを検索して、追加できる

Dashboardの作成手順

1. Add Visualizationボタン選択後、Searchesタブに移り、Searchesの名前を検索すると表示される
- Dashboardには複数のSearchesを保存可能
- 見たいSearchesの揃ったDashboardが完成したら、Save Dashboardで名前をつけて保存する

### データのフィルタリング方法

DiscoverやDashboardで検索窓があるが、そこでログを絞り込むことができる。
→lucene queryを使う

    基本の構文：【項目名(列の名前)】：【探したい単語】
        例：message_level:ERROR  (rdsのログでERRORのものだけを表示したいとき)

    複数条件検索：【項目名(列の名前)】：【探したい単語】AND【項目名(列の名前)】：【探したい単語】/ 【項目名(列の名前)】：【探したい単語】OR【項目名(列の名前)】：【探したい単語】
文字列中のサロゲートペアをU+FEFFに置き換えてみる

はるか昔、Shift JIS で随分と苦しんだ気がするのに、Unicode (というか Java の char なので UTF-16BE かな?)を使っていてもサロゲートペアに苦しめられている気がする。
とりあえず、サロゲートペアを無かったことにしたい気分なので、[U+FEFF](http://www.fileformat.info/info/unicode/char/feff/index.htm)(word breakしない幅ゼロの空白)に置き換えて見ようと思う。

## 正規表現でやってみる

サロゲートペアの範囲(`[\\uD800-\\uDFFF]`)を指定したら上手くマッチしてくれなかったので、コードポイントで U+10000 〜 U+10FFFF の範囲を指定しています。

http://d.hatena.ne.jp/miyakawa_taku/20160208/1454942816 で以下の記述をみつけたので、おそらくはマッチしないのが正しい振る舞いなのだろう。
> UTF-16を使う場合、先行するサロゲートと後続するサロゲートのペアからなるシーケンスは、マッチにおいて単一のコードポイントとして扱わなければならない。

実際に正規表現で置き換えてみた。

```java
String text = "[\uD83D\uDC27] ペンギン";
String replacement = "\uFEFF";

Pattern pattern = Pattern.compile(String.format("[\\x{%X}-\\x{%X}]",
                                                Character.MIN_SUPPLEMENTARY_CODE_POINT,
                                                Character.MAX_CODE_POINT));
String replaced = pattern.matcher(text).replaceAll(replacement);

System.out.println("    text = " + text);     //     text = [🐧] ペンギン
System.out.println("replaced = " + replaced); // replaced = [﻿] ペンギン
```

## Character.isSurrogate を使ってみる

単純に `char[]` を `for` 文で回してみる。

ちなみに、これが一番早かった。toCharArray のなかが arraycopy なので、for 文で１つずつ char[i] に値をいれていくより早いのだろうと思う。

```java
char[] replaced = text.toCharArray();
for (int i = 0; i < replaced.length; i++) {
    if (Character.isSurrogate(replaced[i])) {
        replaced[i] = '\uFEFF';
    }
}

System.out.println("    text = " + text);                 //     text = [🐧] ペンギン
System.out.println("replaced = " + new String(replaced)); // replaced = [﻿﻿] ペンギン
```

別解。個人的にはこっちのほうが好みな書き方。

```java
char[] replaced = new char[text.length()];
for (int i = 0; i < replaced.length; i++) {
    char ch = text.charAt(i);
    replaced[i] = Character.isSurrogate(ch) ? '\uFEFF' : ch;
}
System.out.println("    text = " + text);
System.out.println("replaced = " + new String(replaced));
```
npm script を試す (サンプル付き忘備録)


## はじめに

こんにちは、[UNIBA](http://works.uniba.jp/) の monpy です。
今回は `npm script` の話です。 `npm` の資産を利用してフロントエンドのソースコードをビルドしている人向け。

私は `grunt`, `gulp`, `webpack` を経て `npm script` でフロントのコードをビルドするという運びとなりました。

理由としては、`grunt`, `gulp`, `webpack` のパッケージが邪魔な気がした&疲れた + `npm script` 信者からの圧倒的圧力

## npm script

`package.json` の `scripts` フィールドにコマンドが書けます。
`node_modules/.bin/` の中のエイリアスを直接利用できます。普段使っているコマンドも使用可能。

ちなみにカレントディレクトリは `package.json` があるフォルダとなります。


### その他細かいルールなど

[Grunt/Gulpで憔悴したおっさんの話](http://t32k.me/mol/log/npm-run-script/) このページが非常に参考になったりします。
あとは [公式](https://docs.npmjs.com/cli/run-script)を見るのが良い


## サンプル

https://github.com/monpy/npm-script_sample

ここに用意した。

このビルドの目的は

* 複数の js, css をビルドする
* minify をさせる
* watch をさせる
* es6, post-css を利用する

としています。サンプルとしてはこんなもんかと。


## 解説

フォルダ構成はこんな感じになる

```フォルダ構成
.
├── .babelrc
├── bin
│   ├── css-build.sh
│   ├── css-minify.sh
│   ├── css-watch.sh
│   ├── develop.sh
│   ├── js-build.sh
│   ├── js-uglify.sh
│   ├── js-watch.sh
│   ├── production.sh
│   └── watch.sh
├── node_modules
├── .postcss.json
├── .postcss.production.json
├── package.json
├── public
│   ├── javascripts
│   └── stylesheets
└── src
    ├── javascripts
    │   ├── a.js
    │   ├── b.js
    │   └── libs
    └── stylesheets
        ├── a.css
        ├── b.css
        └── libs

```

`./src` のファイル群を `./public` に吐き出したい。
それぞれ a, b と２種類ずつエントリがあるとします。

### 複数のエントリを処理するときにしたこと。

`js` の処理を考えた時に

愚直に一つ一つ書く方法をまず考えます。

```package.json

"js:build:a": "browserify ./src/javascripts/a.js > ./public/javascripts/a.js",
"js:build:b": "browserify ./src/javascripts/b.js > ./public/javascripts/b.js"

```

ただ、こんな書き方をしていると辛くなります。

ということで、`シェルスクリプト` を利用して処理を引数から動的に変更できるようにしましょう。

次のようにします。

```package.json
"js:bin:build": "./bin/js-build.sh $filename"
```

```js-build.sh
#!/bin/bash

browserify ./src/javascripts/$1 > ./public/javascripts/$1
```
と準備して、次のように実行します

```実行script
npm run js:bin:build -- a.js
npm run js:bin:build -- b.js
```

こうすることで、`a.js`と`b.js` を一つのタスクで処理することが可能になります。

`npm script` は引数を渡すことができます。 

```example
npm run script -- hoge
``` 

と渡す決まりになっていて
この時に

```実行結果
command hoge
``` 

という風に実行されます。つまり `シェルスクリプト` とは違って純粋に後ろに文字列が引っ付いて実行される形になります。
というわけで、引数をコマンド上に展開したい場合は一旦 `npm script` を経由しても良いです。

ちなみに タスクの方では `$filename` という引数を追加していますが、これには何も代入されず空文字列として処理されます。
ただ、`シェルスクリプト` の中身は `package.json` からは伺えないので、
**このタスクは引数を取るよ** ってことを伝えるには便利かなと思って入れてます。

### css の minify について

今回は、`.postcss.production.json` という、minify の処理を追加しただけの `post-css` ようのファイルを用意した。
正直微妙な気もする。

### 諸注意

あとは、よくあるズッコケ

* `シェルスクリプト` の 実行権限
* 出力先のディレクトリがあるかどうか、ないとエラーが出たりする

## 感想

設計の仕方は人それぞれだと思います。
正直、`watch`, `build`, `production` の `シェルスクリプト`を1個ずつ用意したほうがコストは安いかも。。。と思ったりしました。
ただそれよりかは、シェルスクリプトをそれぞれに機能にバラして、どんなタスクがあるかを `package.json` から見れたほうがいいかなーとか思ってこのサンプルを作りました。


ここら辺のベストプラクティスを共有したいなぁと思いますね。
俺はこうやっているよ。という方がいれば是非教えて欲しいですね。

あまりとりとめのない話になってしまった。誰かの参考になれば何より。
gitbook pluginにおけるパス解決周り


Gitbook Pluginでリソーフファイルを使いたい場合のパス解決方法など。
[公式](https://developer.gitbook.com/plugins/api.html) に記載が無いっぽかったので自分で調べた。


例えば、こういうディレクトリ構成だった場合に、

```
/mybook/  #<-- bookルート
└─sec1/
   ├─page.md  #<-- ベースとなるmarkdownファイル
   └─resource.json  #<-- pluginで使用するリソースファイルなど
```


あなたのプラグインがこうで、

```js
module.exports = {
  blocks: {
    yourplugin: {
      process: function(block) {
          console.log(block.kwargs.src);
          console.log(this.ctx.file.path);
          console.log(url.resolve(this.ctx.file.path, block.kwargs.src));
          console.log(path.resolve(this.book.root, url.resolve(this.ctx.file.path, block.kwargs.src)));
      }
    }
  }
};
```

こういうプラグインブロックを書くと、


```text:sec1/page.md
{% yourplugin src="./resource.json" %}
{% endyourplugin %}
```


こう出力される。

| how to | value | what is |
|----|----|---|
| block.kwargs.src | ./resource.json | a. 与えられたパス(相対指定) |
| this.ctx.file.path | sec1/page.md | b. ベースとなるmdファイルの、bookルートからの相対パス |
| url.resolve(this.ctx.file.path, block.kwargs.src) | sec1/resource.json | a のbookルートからの相対パス |
| path.resolve(this.book.root, url.resolve(this.ctx.file.path, block.kwargs.src)) | /Users/myname/mybook/sec1/resource.json | a の絶対パス |


あとは `require('fs').readFileSync;` して `readFileSync()` すればいいと思うよ。


ちなみに、
- url.resolve せずに `readFileSync(block.kwargs.src)` とかやるとbookルート直下にあるものとして扱われる。
- `fs.realpathSync('./hoge/')` すると bookルート直下にあるものとして扱われる。
open-uri のパスワード付きプロクシ情報の環境変数利用

こんにちは。
Ruby の open-uri は、環境変数のプロクシ情報を使ってくれますが、パスワード認証付きプロクシ情報 proxy_http_basic_authentication を付けると（下記の```username:password```）、エラーと見なすポリシーのようです[^1] [^2]。

```console
$ env |grep proxy 
http_proxy=http://username:password@proxy.example.com:8080
ftp_proxy=http://username:password@proxy.example.com:8080
https_proxy=http://username:password@proxy.example.com:8080
```

エラーを起こさせず、さらにそれらの情報も使って欲しい場合は、自己責任でパッチを当てる必要があるようです[^3] [^4]。

```diff
--- /usr/lib/ruby/2.0.0/open-uri.rb.orig
+++ /usr/lib/ruby/2.0.0/open-uri.rb
@@ -253,6 +253,10 @@
   def OpenURI.open_http(buf, target, proxy, options) # :nodoc:
     if proxy
       proxy_uri, proxy_user, proxy_pass = proxy
+      if proxy_uri.userinfo
+        proxy_user, proxy_pass = proxy_uri.userinfo.split(':')
+        proxy_uri = URI.parse("#{proxy_uri.scheme}://#{proxy_uri.host}:#{proxy_uri.port}")
+      end
       raise "Non-HTTP proxy URI: #{proxy_uri}" if proxy_uri.class != URI::HTTP
     end
```
----
[^1]: 「[open-uriで環境変数http_proxyを使うときに認証付きのProxyが使えません](https://bugs.ruby-lang.org/issues/4388)」を見ますと、提案が拒絶されているようです。
[^2]: 「[認証Proxy環境やBasic認証ページにopen-uriでアクセスする](http://qiita.com/mas0061/items/7a026b6268025d83c001)」にも同じ話題をみつけました。
[^3]: homebrew（の search コマンドなど）の利用でも、この[エラー](https://github.com/Homebrew/homebrew/issues/32041)回避のために、このような対策が必要になってきます。
[^4]: MacOSX 10.11 では System Integrity Protection による保護対象なので、パッチ作業はそれを無効化する必要があります。
nginxのドキュメントルートがsymlinkの場合、デプロイで最新反映されない問題

参考：　https://github.com/zendtech/ZendOptimizerPlus/issues/126

nginxで下記の設定をすることで、解決できる。

```
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
```