OmniAICreator/Qiita-1.07M huggingface dataset:
react-nativeだと `import Login from '🔑Login'` と書ける



react/react-domでもbabel-pluginを使えば可能だと思うがreact-nativeだと

```js
/**
 * @providesModule 🔑Login
 */
```

とファイルの先頭に書くだけでOK。

## `@providesModule`の利点


```js
// こういう相対パスが長い、モジュールの読み込みが
import baz from '../../../src/foo/bar/baz'
// こうなる
import baz from 'baz'
```

## 目下react-native限定で、ほぼほぼundocumented

- metro-bundlerが提供してる機能なため
    - react-nativeがbundlerとして使ってるもの
- [facebook/metro-bundler: 🚇 The JavaScript bundler for React Native.](https://github.com/facebook/metro-bundler)

### Documentやリリースノートでも触れられているが・・・・

>If you've added a new module, add a @providesModule <moduleName> at the end of the comment. This will allow the haste package manager to find it.

- [How to Contribute - React Native](http://facebook.github.io/react-native/releases/next/docs/contributing.html#copyright-notice-for-files)
- react-native本体へのcontributeガイドでの言及のみ
    - コンポーネントを追加するPull Requestを作る場合は、metro-bundlerが検出できるようにするべし、と
- 以前はリリースノートで`@providesModule` の機能について言及されてた
    - `@provides` から、`@providesModule`への変更など 
    - [...If you were using @provides NameOfModule, you should now switch to @providesModule](https://github.com/facebook/react-native/releases/tag/v0.44.3)
    - 別パッケージ化されて以降は、リリース情報がゼロ

### エディタでも入力候補に出せるようにできる

-  vscodeだとそれ用のプラグインがある[@providesModule Intellisense - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=bengsfort.provides-module-intellisense)

### 挙動などその他

- 'haste module`
    -  `@providesModule` 使ったモジュールを呼び名
-  名前はproject内部でユニークでないとダメ
    -  衝突するとエラーがスローされる
-  `lodash`, `moment` などnpmモジュールと同じ名前を `@providesModule` で使ってしまうと、haste moduleが優先的に読み込まれるのが仕様、らしい


## babelでも同じことができる

[babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver) を使えばできるが、１つずつパターンを列挙していく必要がある

```json
{
  "plugins": [
    [
      "module-alias",
      [
        { "src": "./src", "expose": "src" },
        { "src": "./src/foo/bar/blah/blah/baz", "expose": "bazu" },
        { "src": "./app", "expose": "app" },
        { "src": "./app/resources/icon", "expose": "icon" }
      ]
    ]
  ]
}

```

- globパターンは使えるが、まあまあ手間




## resource

- [Alias in React Native – React Native](https://reactnatve.wordpress.com/2016/06/16/alias-in-react-native/#more-550)
- [metro-bundler](https://www.npmjs.com/package/metro-bundler)
- [NPM modules being preferred over Haste modules · Issue #18 · facebook/metro-bundler](https://github.com/facebook/metro-bundler/issues/18)
- [metro-bundler/DependencyGraph-test.js at master · facebook/metro-bundler](https://github.com/facebook/metro-bundler/blob/master/packages/metro-bundler/src/node-haste/__tests__/DependencyGraph-test.js)
Nim by Example で行列の和の例があったので


# 少し謎

[Nim by Example - Array](https://nim-by-example.github.io/arrays/)
を眺めてて　2x2の行列を定義していたので動かしていましたが，そのまま動かすと駄目でした．

```nim
type
  Matrix[W,H:static[int]] = array[1..W,array[1..H,int]]

let 
  mat1 : Matrix[2,2] = [[1,0],
                        [0,1]]
  mat2 : Matrix[2,2] = [[0,1],
                        [1,0]]

proc `+` [W,H](a,b: Matrix[W,H]):Matrix[W,H]=
  for i in 1..high(a):
    for j in 1..high(a[0]):
      result[i][j] = a[i][j] + b[i][j]


echo repr(mat1+mat2)
```

こんな感じで echo で reprをしないとコンパイル通りませんでした．　うーん．．．

# 追記（2017/10/23）
コメントのヒントを頼りに `$` を実装してみました。

```nim
type
  Matrix[W,H:static[int]] = array[1..W,array[1..H,int]]

let 
  mat1 : Matrix[2,2] = [[1,2],
                        [0,1]]
  mat2 : Matrix[2,2] = [[0,0],
                        [3,3]]

proc `+` [W,H](a,b: Matrix[W,H]):Matrix[W,H]=
  for i in 1..high(a):
    for j in 1..high(a[0]):
      result[i][j] = a[i][j] + b[i][j]

proc `$` [W,H](a: Matrix[W,H]):string = 
  var str=""
  for i in 1..high(a):
    for j in 1..high(a[0]):
      str &= $a[i][j] & " "
    str &= "\n"
  return str

echo mat1 + mat2
```
CoqでFixを使って再帰関数を定義してみる

## 概要

Coqでは `Fix` という不動点オペレータを使って再帰関数を定義することができる。より複雑な再帰関数を定義したくなった場合に便利なことがある。

## factorialの例

再帰関数といえば `factorial` 。階乗を計算する関数を考えてみる。

### 定義

```Fact_definition.v
Definition fact (n: nat) : nat.
  refine (Fix (lt_wf) (fun _ => nat)
              (fun n F =>
                 match n as k return n=k -> nat with
                 | O => fun _ => 1
                 | S n' => fun _ => n * F n' _
                 end (eq_refl _)
              ) n).
  rewrite e. auto with arith.
Defined.
```

### 便利な補題

Fixpointで定義した場合に比べて、計算したいアルゴリズムと停止性のための処理がごちゃまぜになってしまっているため、以下のような補題があるとうれしい。

```Fact_theory.v
Lemma fact_equation : forall n : nat, fact n = match n with
                                               | 0 => 1
                                               | S p => (S p) * fact p
                                               end.
Proof.
  intros n. unfold fact at 1. rewrite Fix_eq.
  - destruct n; reflexivity.
  - intros x f g F.
    destruct x; [reflexivity| now rewrite F].
Qed.

Lemma fact_ind :
  forall P : nat -> nat -> Prop,
    P 0 1 ->
    (forall n : nat,  P n (fact n) -> P (S n) (S n * fact n)) ->
    forall n : nat, P n (fact n).
Proof.
  intros P IH_0 IH_S n.
  apply (lt_wf_ind n (fun n => P n (fact n))). intros x H.
  destruct x.
  - assumption.
  - rewrite fact_equation. apply IH_S. apply H. now auto with arith.
Qed.
```
モナドを使ったモノイドのインスタンス

> https://qiita.com/tezca686/items/78d099987894ac7bec48#comment-1d42663d1411baab921e
> 対象が1つ(ここでは a )だけの圏は、合成演算によってモノイドとなることが知られてますので、 {f :: a -> m a} は >=> によってモノイドとなります。

実際にそのようなモノイドインスタンスが用意されているので、コードでの実例。ここでは `<=<` でモノイドになっている( `Control.Category.Dual` 使えば `>=>` にもできる)。

```haskell
#!/usr/bin/env stack
-- stack --install-ghc runghc --package monoid-extras
 
import Control.Arrow (Kleisli(..))
import Data.Monoid ((<>))
import Data.Monoid.Endomorphism (Endomorphism(..))
import System.Environment (getEnv)

main :: IO ()
main = do
  -- String -> IO String 型の関数を wrap するとモノイドになる
  unwrap (wrap return <> wrap readFile <> wrap getEnv) "SOME_FILE_PATH"
    >>= putStrLn
  -- putStrLn :: String -> IO () はモノイドにできない
  -- unwrap (wrap putStrLn <> wrap return <> wrap readFile <> wrap getEnv) "SOME_FILE_PATH"
  where
    wrap = Endomorphism . Kleisli
    unwrap = runKleisli . getEndomorphism
```

なんかもっと直接的なインスタンスもあったような気もするけど、気のせいかもしれない。
Nim の linalg の練習

# 本日はNim
Nimの線形代数ライブラリ [linalg](https://github.com/unicredit/linear-algebra) の練習がてら相変わらず懲りずにモンテカルロをやってみようと思います．

# import linalg

nimbleを用いてinstall します:

```shell-session
$ nimble install linalg
```

Python　でいえば pip  みたいなものですね．
nimbleはNimをインストールしたら自然とついてくるはずです．

# 実装例

方針としては

- ランダム配列`x`，`y`を生成し自分自身とのアダマール積をとってその和が1未満かどうかを判定する．
- 自作関数をlinalgのmakeUniversalでベクトル化させて各々成分に `getLessThanOne` を適用させる．
- 適用後は各々の成分が1or0のベクトルであり成分の和の計算を実施する．

```nim
import linalg
import random 

randomize()

proc getLessThanOne(x:float64): float64=
  if x < 1.0:
    return 1.0
  else:
    return 0.0

makeUniversal(getLessThanOne)

proc main(): void =
  const size=100_000_000
  var 
    x: Vector64[size] = randomVector(size, max=1.0)
    y: Vector64[size] = randomVector(size, max=1.0)
  var counter=sum(getLessThanOne((x|*|x)+(y|*|y)))
  echo 4.0*counter.float64/size.float64

when isMainModule:
  main()
```

## 注意点
アダマール積同士の和を計算するために

```nim
x|*|x+y|*|y
```

と書いていましたが，演算の優先順位が整っていないせいか期待しない値が出てしまいます．　このため円周率が3．4とかという謎の値を出してしまっていたので

```nim
(x|*|x)+(y|*|y))
```
で計算の順番を明示化することでことなきを得ました．
これに気づくまで数日かかりましたOTL...

# 実行例

```shell-session
$ nim c -d:release montelin.nim
$ time ./montelin
3.14122972
real	0m11.197s
user	0m3.926s
sys	0m4.340s
```

残念ながら単純にfor回した実装よりも遅くなってしまいました．
C++イディオム第2回

# この記事について
評判が良かったので第2回。気合が続いたら3回めがあるかも。

# Erase-Remove
STLのコンテナで特定の要素を削除するコードを書いて下さい。

```c++:erase.cpp
std::vector<int> a;
/* aに要素を加えるコードを省略 */
std::remove(a.begin(), a.end(), 100);
```

これで、消えたかというとそうではありません。
実はremove関数は特定の要素をコンテナの後ろに追いやったあと、先頭の特定の要素へのイテレータを返しているだけだからです。
ほんとに消すにはこのイディオムErase-Removeを使います。

```c++:erase-remove.cpp
std::vector<int> a;
/* aに要素を加えるコードを省略 */
a.erase(std::remove(a.begin(), a.end(), 100), v.end());
```
# Execute-Around Pointer
スマートポインターはオブジェクトのライフタイムが尽きた時に自動的に確保されたリソースを削除します。コンストラクタとデストラクタ、演算子のオーバライドをうまく使った書き方で実装されています。
この書き方を応用すると、クラスのメンバ関数が実行された時に特定の処理を実行するスマートポインタが実装できます。

```c++:execute-around.cpp
class ExecutePointer {
public:
    class proxy {
    public:
          proxy (vector<int> *v) : vect (v) {
              std::cout << "Before size is: " << vect->size();
          }
          vector<int> * operator -> () {
              return vect;
          }
          ~proxy () {
              std::cout << "After size is: " << vect->size ();
          }
   private:
          vector <int> * vect;
   };
   ExecutePointer(vector<int> *v) : vect(v) {}
   proxy operator -> () {
       return proxy (vect);
   }
private:
   vector <int> * vect;
};

int main()
{
    ExecutePointer vector(new std::vector<int>);
    
    vector->push_back (10);
    vector->push_back (20);

    return 0;
}
```

# Final Class
JavaやC#で提供されているそれ以上の継承を防ぐクラスをエミュレートするイディオムです。

```c++:FinalClass.cpp

class Finalize
{
    ~Finalize() {}
    friend class sealed; 
};

class sealed : virtual Finalize
{
/* 省略 */
};

class Forbidden : public sealed
{
/* 省略 */
//! これはインスタンス化できない
};
```
friendによりsealedのみデストラクタにアクセスが許可されています。
そのためsealedはインスタンス化できますが、Forbiddenはできません。
残念ながら、エミュレートなのでJavaやC#のファイナルクラスと異なる点があります。
このイディオムの場合Forbiddenがインスタンス化されない限りエラーが発生しません。
さらに、クラスがインスタンス化されなくても存在できる静的メンバ変数・関数は継承することができてしまいます。

# Friendship and Attorney-Client
友情と代理人と客。響きはいいけどよく意味のわからない名前ですね。
このイディオムはfriendクラスの欠点を補うためのイディオムです。
friendクラスを使うと他のクラスからfriendで紐付けられたクラスの全てのプライベートメンバにアクセスすることができるようになります。
しかし、この**全て**というのが問題です。細かいアクセス制限を設けることができません。
そこで、代理人を挟んでアクセス制限を設けます。

```c++:attorney-clien.cpp
class Client
{
private:
    int a;
    float b;
    double c;
    friend class Attorney;
};

class Attorney {
public:
     static int readA(const Client& client) { // 変数aのreadアクセス許可
         return client.a;
     }
     static void writeB(Client& client, const float& b) { // 変数bのwriteアクセス許可
         c.b = b;
     }
     static int& read_writeC(Client& c) {
         return client.c;
     }
friend class MyClass;
};

class MyClass {
// Attorneyクラスのプライベートに制限されたアクセス可能
};
```

# Include Guard Macro
知ってる。みんな知ってる。ヘッダファイルの二重読み込みを防ぐためのイディオム。
ごめんなさい。知ってるよね。

```c++:include_guard.cpp
#ifndef HEADER_NAME
#define HEADER_NAME
/* 実装 */

#endif
```

全てというわけではありませんが今日ではほとんどのコンパイラが二重読み込みを防止専用のマクロ命令があります。

```c++:pragma.cpp
#pragma once
```

後者のほうが書く量が少ないです。違いはそれだけ。後者を使いましょう。
QiitaのmarkdownでGemfileを表示する方法

些細な事だが調べても出てこなかった。
要はこれをQiitaで表示したい。
　↓

```:Gemfile
gem 'paperclip'
```

Qiitaでは ``` で文字列をくくるとコード表記をしてくれる。
しかし、Gemfileといったような拡張子の表示されないものは読み込んではくれない。

```Gemfile
gem 'paperclip'
```
上記のようになる。（```Gemfileと書いてある）

調べてみると、Qiitaのマークダウンには`PHP:index.php`といったような書き方ができるようだ。試しに該当箇所に`:Gemfile`と入れると想定していた表示になった。
chai-httpでShift-JisのレスポンスをUTF-8に変換する

chai-httpを使っていたShift-Jisで帰ってきたレスポンスを変換するのに
ハマったのでメモ

```js:test.js
chai.use(chaiHttp);

const binaryParser = (res, cb) => {
    res.setEncoding("binary");
    res.data = "";
    res.on("data", function (chunk) {
      res.data += chunk;
    });
    res.on("end", function () {
      cb(null, new Buffer(res.data, "binary"));
    });
  };

describe('test', function(){
  it('API request test', (done) => {
    chai.request('http://www.example.com')
      .post('/api/hogehoge')
      .set('Content-Type', 'application/x-www-form-urlencoded')
      .send({
        'hoge': 'value',
      })
      .buffer()
      .parse(binaryParser)
      .end((err, res) => {
        let iconv = new Iconv('SHIFT-JIS', 'UTF-8//IGNORE');
        var convertedString = iconv.convert(res.body).toString();
        fs.writeFile('output.txt', convertedString, (err) => {})
        done()
      })
  })
})
```


普通に書くと `res` から Buffer が取得できないので
`buffer`と`parse` を追加しているっぽい。

参考 : https://github.com/chaijs/chai-http/issues/126
値にリストやタプルを持つディクショナリから値の各要素をリスト内包表記で抜き出す

```py:
item_table = {
    'Bronze': ('A','B','C','D'),
    'Silver': ('E','F','G'),
    'Gold': ('H', 'I'),
    'Legend': ('J',)
    }
```

上記のディクショナリから`['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']`という単元リストを得たい場合、リスト内包表記ですっきり記述できることを知ったのでメモ。

```py:
item_name = [a for b in item_table for a in item_table[b]]
```

または、

```py:
item_name = [a for b in item_table.values() for a in b]
```

これは気持ちがいい。
いままで下記のような`for`文で表記していたので何とかならないものかと苦慮していました。

```py:
item_name = []
for b in item_table:
    a = item_table[b]
    item_name += a
```

ちなみに`[['A', 'B', 'C', 'D'], ['E','F','G'], ['H', 'I'], ['J']]`のようなリストで得たい場合は下記のようにします。

```py:
item_name = [[a for a in item_table[b]] for b in item_table]
```

または、

```py:
item_name = [list(b) for b in item_table.values()]
```

`[('A', 'B', 'C', 'D'), ('E','F','G'), ('H', 'I'), ('J',)]`のようにタプルのまま抜き出したい場合は、

```py:
item_name = list(item_table.values())
```

うーむ。自分のような初心者にはなかなかややこしいですね。
ExcelでJSONを扱う場合のつまずきポイント

ExcelでJSONを扱う場合のよく使われる手法は、
ScriptControlのオブジェクトでJSONパースの関数を作るというもの。
インターネットで調べるとこれが一般的なようである。
以下に簡単なサンプルを書く。


```
Sub ボタン1_Click()
    Dim obj  As Object
    Dim json As Object

    Set obj = CreateObject("ScriptControl")
    obj.Language = "JScript"
    obj.AddCode "function jsonParse(s) { return eval('(' + s + ')'); }"

    Set json = obj.CodeObject.jsonParse("{id:5,name:'山田',age:20}")

    MsgBox json.age

End Sub
```


これは正常にjson.ageが出力される。
しかしjson.idやjson.nameとするとエラーとなってしまう。
しかもコードをageからidやnameに書き換えると、自動で1文字目が大文字に変わってしまう。
これはVBAの予約語だからのようである。
なのでJSONオブジェクトのキーが変わり、エラーとなっている模様。。。
インターネットで調べると、これにも解決策がある。
それはCallByNameを使うこと。
ちょっと一手間かかるけれど、以下のように書く。


```
Sub ボタン1_Click()
    Dim obj  As Object
    Dim json As Object

    Set obj = CreateObject("ScriptControl")
    obj.Language = "JScript"
    obj.AddCode "function jsonParse(s) { return eval('(' + s + ')'); }"

    Set json = obj.CodeObject.jsonParse("{id:5,name:'山田',age:20}")

    MsgBox CallByName(json, "name", VbGet)

End Sub
```


直観的なアクセスとなっていないのが残念だけれど、なんとかエラーなく実行できるようになった。
第3回Watson_cafe参加ログ

2017/09/27 Watson_cafe @渋谷　参加ログ
http://ptix.co/2iVpCka

## 1 オープニングトーク
- AIを扱うためには、コミュニティ重要 <= 学習の仕方とか、ノウハウを共有する必要があるから
- think watsonでググると、活用例とか見れるよ => https://www.ibm.com/think/jp-ja/watson/


## 2 ハッカソン体験談 + Watson営業あるある
- 旅行ナビゲータを発表 「VR x Waston」
システム構成
![IMG_2150.JPG](https://qiita-image-store.s3.amazonaws.com/0/138863/cf43b5e8-3bf5-4aea-fefe-1377fdd41e76.jpeg)

- Watson API注意点 => APIがなくなる、生まれ変わることがある

参考: watson API今できること
<img width="716" alt="スクリーンショット 2017-09-27 20.04.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/138863/09ba902c-480a-eac5-fae0-281c980ee2ed.png">
ソース: https://www.ibm.com/watson/jp-ja/developercloud/services-catalog.html

### Watson営業あるある
- 勝手に学習するとか、自然な雑談できるとか幻想を抱いている人もいる

## 3 Nurve 
- VRスタートアップ、 シリーズB 7億調達
- 買ってから体験する => 体験してから買う の提供
 
### 活用例
- 空港のカウンター、登場前に　Premium Seatの体験 => グレードアップ
- 不動産内見VR
- トラベルVR

### VRでのWatson活用ハマりポイント
- VRの画像は、周辺が歪んでるので、そのまま食わせても、物体認識できない (前処理が重要)
- 間取り図の自動くり抜き (openCV + watson)


## まとめ、感想
- watsonは万能じゃないことを再確認した。
  (使い所の難しさ、前処理の必要性)
- Nurveさんのプレゼントテーションがカッコよかった。特に会社のビジョンがしっかり伝わって来たのと、VR技術を本当に役立てている部分がカッコよかった。
wysiwygエディタについての学習6


### エディターコンポーネント

https://draftjs.org/docs/api-reference-editor.html#content

contentEditable自体のAPIとプロップについて説明します。
DraftEditorPropsにプロップを定義します。

#### 基本的なもの

* EditorStateオブジェクト
* onChangeメソッド

#### 表現まわりのオプション

* プレースホルダー
* align
* 入力の方向
* カスタムブロックレンダリングのメソッド
* ブロックスタイルの指定
* カスタムスタイルマップ
* スタイルのカスタムのメソッド指定

#### 挙動まわりのオプション

* 読み取り専用
	* カスタムコンポーネントの対話の際につかったり、静的なテキストに使う
* スペルチェック
* ペーストの際の書式の除去フラグ

#### DOM、アクセシビリティ

* タブインデックス
	* ？
* エリアプロップ
	* エディタへのアクセシビリティなどを色々指定できる
* エディターキー
	* 通常は不要で、サーバーサイドレンダリングするときに指定する

#### キャンセル可能なハンドラー

返り値によってコアのハンドルを通さないようになります

* リターンキーハンドル
* 任意のコマンドをキーバインド
* beforeInput
	* 入力されつつある時に発火する、別のDOMに変換したりする時に使う
	* 顔文字の入力に利用できる
* handlePastedText
	* 貼り付け時の挙動指定
	* trueでデフォルト挙動をキャンセル
* handlePastedFiles
	* エディタへの直接のファイル貼り付け
* handleDroppedFiles
	* エディタへのファイルのドロップ
* handleDrop
	* ドロップ操作

#### キーハンドラー

よくつかうキーのハンドラーを提供する
メンションへの操作などに使われる

* エスケープ
* タブ
* 上
* 下

#### マウスイベント

* フォーカス
* ブラー

#### メソッド

* フォーカス
	* エディタへフォーカスする
* ブラー
	* エディタからフォーカスを外す

### EditorChangeType

https://draftjs.org/docs/api-reference-editor-change-type.html#content

エディタで可能な操作をenumにおさめたもの
このタイプは、Editor.pushからContentStateへ渡されるパラメータで、
直接変更はしないようにするべき	
Flowを使うと静的な型付けをしてEditorChangeTypeに従ってくれる

### EditorState

https://draftjs.org/docs/api-reference-editor-state.html#content

エディタの最上位の状態オブジェクトで、以下を含む

* テキスト
* 選択状態
* 装飾
* undo/redoのスタック
* 直近変更のタイプ

これらに対してはImmutable APIで操作せずに、用意したメソッドを使うべき

	この状態に対する操作や設定が色々できそう
	詳しくは省く

### ContentState

https://draftjs.org/docs/api-reference-content-state.html#content

以下を含む状態オブジェクト

* テキストやブロックやスタイルなど全部
* 編集前後の内容

主に、`EditorState.getCurrentContent()`で使うことができる
EditorStateは、undo/redoもContentStateの構成として保持する

	細かいメソッドは省略
【Go】go-logging における "module" は階層構造を持たない

# go-loggingライブラリとは

go-logging https://github.com/op/go-logging はGoの簡易ロギングライブラリであり、例えばHyperledger Fabric https://github.com/hyperledger/fabric などで使われている。

## Module

go-loggingは "module" 毎にログレベルを設定することができるのだが、この "module" の意味がはっきりしないので実験してみた。

# 実験コード

(略)

# 結論: moduleは階層構造を持たない、ただの文字列だった

- Moduleとはログの出力区分を表す、ただの文字列である。「ただの」というのは階層構造を持たないことを意味する。
  - たとえば、module "foo" に対するログレベルが明示的に設定され、かつ、module "foo/bar" のログレベルが明示的に設定されていないとする。この場合 "foo/bar" のログレベルを決定するにあたり、"foo" の設定を見に行くことはない。
  - ちなみに他の区切り文字を使っているということもない (たとえばNode.jsのdebugモジュール https://www.npmjs.com/package/debug は ":" がモジュール区切り文字として機能する)
- ただし、module "" に関してはルートレベルmoduleとして機能する。つまり、module "foo" に対するログレベルを決定したい場合に、それが明示的に設定されていなければ、module "" のログレベル設定を見に行く。

## ソースコードの当該部分

このあたり https://github.com/op/go-logging/blob/master/level.go#L91-L93

なお、96行目あたりを見るとログレベルのデフォルトがDEBUGであることもわかる。

以上
ChromeOSでsudoのパスワードがわからないときの対応

`crouton`を使ってUbuntuをインストールしようとしたら、sudoでパスワードを聞かれて知らんがなとなったのでメモ。

* `Ctrl + Alt + F2`で管理者用のターミナルに入れる。`F2`はキーボード最上段の→（進む）キー。
* rootでログインする。パスワードはdeveloper modeに入るときに入力したrootfsのパスワード。
* `chromeos-setdevpasswd`でsudoのパスワードを設定する。

これだけです。簡単でしたね。
リサーチを早く終わらせるためのTips

インターン先で使ったSpreadsheet界隈のリサーチTipsをまとめてあります。

# ひらがなからローマ字への変換（名前など）
1. 以下のリンクからコードをコピーする。
    - [スプレッドシート上でのひらがなからローマ字への変換 - Qiita](https://qiita.com/Haji-Fuji/items/d368e93ec7362cf9ac26)
2. 変換したいひらがなが記入されたSpreadsheetに移動。
3. 「ツール」→「スクリプト エディタ」から、Google App Scriptのエディタを開く。
4. 先ほどのコードをペースト。ファイル名を"transversion"に変更。（一番下の参考図のようになる。）
5. 「ファイル」→「保存」ののち、タブを閉じて、元のSpreadsheetへ戻る。
6. Spreadsheet上で「`=transversion(変換したいひらがな)`」を入力すると変換できる！
7. あとは適宜Pull-downを使って、全てに適用。

- （イニシャルを大文字にする場合は、Excelにコピペしたのち、PROPER関数（「`= PROPER(変換したい文字列)`」）を使って変換。）

# 列内の文字列をまとめてGoogle検索する方法
（もう少しいい方法がないかと模索中）
1. Excelに検索したい文字列をペースト（ここではA1にペーストしたと仮定）
2. 隣の列（B1）とかに以下を入力
「`=IF(A1="","",HYPERLINK("https://www.google.com/webhp?hl=ja#hl=ja&q=" & A1, "Search"))`」
3. あとは適宜Pull-downを使って、全てに適用。
4. それぞれのセルをクリックすると、新しいタブが開かれる


＜参考図＞
![スクリーンショット 2017-09-27 20.07.06.png](https://qiita-image-store.s3.amazonaws.com/0/197880/62eab22b-8e4e-b1a0-4d70-f1fcecf0a74f.png)
Movable Typeで関連記事を表示するプラグイン「SimilarEntries」を導入する場合の注意点

「SimilarEntries」は、カテゴリー・カスタムフィールド・タグなどが一致している記事を自動表示するMovable Type用プラグインです。

https://github.com/bit-part/mt-plugin-SimilarEntries

商用目的では有償となります（1サーバーあたり10,000円）。
実装手順についてはリポジトリのReadmeが詳しいので、割愛します。

Ajaxを利用しているため、MT本体に負担をかけない・静的なページでも表示できるなどのメリットがあります。
回遊率を上げるなら検討すべきプラグインですが、実装の際はいくつか注意点があります。

# 表示順を指定できない

関連記事の抽出後の結果は、表示順が固定となります（投稿日かID降順？）。このため、昇順やランダム表示はできません。

実は、以下にあるコアのJavaScriptファイルには、表示順のパラメータがありますが未実装となっています。
メンテナンス性が落ちますが、このファイルを参考にオリジナルのスクリプトを書くことで、表示順のコントロール自体は可能です。

https://github.com/bit-part/mt-plugin-SimilarEntries/blob/master/mt-static/plugins/SimilarEntries/js/SimilarEntries.js

とりあえずランダムにする方法は、以下を参照ください。

Movable Typeで関連記事を表示するプラグイン「SimilarEntries」をランダム表示にする
https://qiita.com/webbingstudio@github/items/d20ecd0abcb42fb237d8

# 条件に合致する記事が少ない場合、他の記事で埋めることができない

例えば、以下の条件で関連記事の設定をしていたとします。

- 同じカテゴリーの記事を表示する
- 10件まで表示する

にも関わらず、同じカテゴリーの記事が５件しかなかった場合は、その５件しか表示しません。

「必ず10件表示したいので、残りの5件は条件に合致しなかった記事で適当に埋めてほしい」ということはできないので、エントリーの件数が大きく影響する場合や、ウェブサイトの立ち上げ時には注意してください。

# コールバックがない

コードを見た限りでは、ないようです。
「関連記事のロードが完了した段階で、FONTPLUSやTypekitのリロードを行いたい」という場合は、先述の方法でコアファイルの末尾に直接メソッドを書いてください。

# 管理画面の場所がバレる

これはMovable Typeに限らず、どのCMSにも言えることですが、デフォルトの状態で実装すると、Movable Type本体からJavaScriptファイルを呼び出すため、ソースコードにインストール先のURLが書き出されてしまいます。

関連記事をロードする箇所に記述する「SimilarEntriesShow」タグには、スクリプトのURLを指定する属性があります。これを利用すると、公開サイト内を起点としたサーバーパスに書き換えることができます。

```HTML:similarEntries_show.mtml
<mt:SimilarEntriesShow
・・・
    script_url="/SimilarEntries/SimilarEntries.js"
・・・
/>
```
この指定を行ったうえで、以下のいずれかの対応をしてください。

<dl>
<dt>メンテナンス性重視の場合</dt>
<dd>/SimilarEntries/SimilarEntries.jsへのリクエストを、.htaccessでMovable Type本体へリダイレクトする</dd>
<dt>セキュリティ重視の場合</dt>
<dd>Movable Type本体のSimilarEntries.jsを公開ディレクトリへ移動する</dd>
</dl>

# first, lastに改行を含むHTMLを指定するとエラーになる

関連記事をロードする箇所に記述する「SimilarEntriesShow」タグには、合致する関連記事が合った場合に、最初と最後に表示するHTMLを指定する属性があります。
しかし、この属性に長いHTMLタグを書くと、シンタックスエラーとなり表示されません。

以下の通り、改行コードをすべて詰めたHTMLを変数に代入すれば表示できます。
（変数名の前後のアンダーバーは、一時変数であるという意味で個人的に入れています。なくても構いません）

```HTML:similarEntries_show_html.mtml
<mt:SetVarBlock name="__related_first__"><div class="widget widget-related"><div class="widget-header"><h2 class="widget-title">この記事もおすすめ！</h2></div><div class="widget-contents"></mt:SetVarBlock>

<mt:SetVarBlock name="__related_last__"></div><!-- /.widget --></mt:SetVarBlock>

<mt:SimilarEntriesShow
・・・
    first='$__related_first__'
    last='$__related_last__'
・・・
/>
<div id="similar-entries"></div>
```

# 補足

なんとなくわかると思いますが、基本はJSとJSONなので、同じコードを書くことができれば、他のCMSでも実装できます。
関連記事機能がないCMSを導入してお困りの方は、こちらをフォークしてみてはどうでしょう。
同じ作者さんがAjax検索ライブラリも公開しています。

https://github.com/tinybeans/jq-plugin-flexibleSearch

関連記事楽しいですね＼(^o^)／良い関連記事ライフを。
[Survey] Kaggle - Instacart 9位解法まとめ

Kaggle - Instacart Market Basket Analysis[^1]の1位解法[^2]の調査記事です．

Title:　9th place Approach
Name: KazAnova
Kaggle Discussion: https://www.kaggle.com/c/instacart-market-basket-analysis/discussion/38100

## 特徴量

下記の300以上の特徴量を利用

- sh1ng feature[^4]
- arboretum feature[^5]
- 現時点の連続購入記録(streak, リーク情報)
- 異なる期間(直近15日,30日など)でのitems/aisle/depsごとの購入回数
- 時間的な特徴量(例: 最後に買った時刻)
- 様々なカテゴリ特徴量(例: departments, products, aislesなど)
- 新商品を買うユーザーの傾向(例: 各注文ごとの新商品の購入確率)


## 備考

- F1最大化[^3](LBで0.005改善)

## 利用カーネル

- LightGBMでの予測[^8]
- XGBoostでの予測[^9]

## LightGBMで利用したパラメータ

```
LightgbmClassifier 
boosting:dart 
num_leaves:22 
num_iterations:3000
max_drop:5
drop_rate:0.01
categorical_feature:0,1,2
learning_rate:0.12
threads:12
max_depth:7
feature_fraction:0.7
min_data_in_leaf:10
bagging_fraction:0.85
lambda_l1:1
lambda_l2:0.01
bagging_freq:1
seed:1
verbose:false
```

categorical_feature:0,1,2はそれぞれproduct,aisle,departementの意.

## モデル

StackNet[^7]でモデルをStacking(ただしあんまり改善されなかった)

- LightGBM
- H2O
- KerasのNN

## 改善につながらなかった項目

- product/aisle/departmentごとのモデル
- 強調フィルタリング
- 商品の説明文の意味解析


## 最終のMetaモデル

```python
models = Sequential()
models.add(Dense(output_dim=1024, input_dim=input_d, init='lecun_uniform')) 
models.add(Activation('relu')) 
models.add(BatchNormalization())    
models.add(Dropout(0.5))  
models.add(Dense(512, activation='relu',init='lecun_uniform'))
models.add(Activation('relu')) 
models.add(BatchNormalization())    
models.add(Dropout(0.4))  
models.add(Dense(2, init='lecun_uniform'))
models.add(Activation('softmax'))    
opt = optimizers.Adam(lr=0.01)
models.compile(loss='binary_crossentropy', optimizer=opt)
```

## References

[^1]: Kaggle, [Instacart Market Basket Analysis](https://www.kaggle.com/c/instacart-market-basket-analysis)
[^2]: KazAnova, [9th place Approach](https://www.kaggle.com/c/instacart-market-basket-analysis/discussion/38100)
[^3]: Faron, [F1-Score Expectation Maximization in O(n²)](https://www.kaggle.com/mmueller/f1-score-expectation-maximization-in-o-n)
[^4]: sh1ng, [Baseline 0.4029970](https://www.kaggle.com/c/instacart-market-basket-analysis/discussion/37697)
[^5]: sh1ng, [arboretum](https://github.com/sh1ng/arboretum)
[^6]: Faron, [Order Streaks Feature](https://www.kaggle.com/mmueller/order-streaks-feature)
[^7]: kaz-Anova, [StackNet](https://github.com/kaz-Anova/StackNet)
[^8]: paulantoine, [light GBM benchmark 0.3692](https://www.kaggle.com/paulantoine/light-gbm-benchmark-0-3692/code)
[^9]: 🐳鲲(China), [LB 0.3805009, Python Edition](https://www.kaggle.com/nickycan/lb-0-3805009-python-edition)
git > 2つのコミット間のコミット数を確認する > git rev-list --count [コミットのハッシュ値] x 2回 | 数値の差分を取る

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

参考 https://stackoverflow.com/questions/677436/how-to-get-the-git-commit-count

SmartGitの場合

- Tools > Open Git-Shell
    - Git-Shellを開く
- 1つ目のコミットのcount確認
    - git rev-list --count b30dce43
    - 91
- 2つ目のコミットのcount確認
    - git rev-list --count HEAD
    - 139

差分 139 - 91 = 48が今日のコミット。

3割がrefactoringで、3割が些末な変更。残りが主な実装。
粒度は小さすぎるが、手戻りが小さくなるのは良い点。
適切なfeature branchを切ることができれば、このコミット数でも将来の参照性は高くなるが、その点はまだ未消化。
Excel で自動的に罫線を引く

試験項目を作ってるときなど項目名を記載した箇所の上だけに罫線を引きたい

``` 条件付き書式.
=AND($E6<>$E5, NOT(ISBLANK($E5)))
```

上記を数式に設定して、書式のところに 上罫線を引くように設定してやる

これと自動的に項番ふるやつで見た目は結構楽できた
【IBM Cloud k8s検証メモ】永続ストレージのサブディレクトリにマウントする方法


Bluemix k8s の PersistentVolume の最小サイズが 20GB なので、複数のコンテナから利用する場合には、ルートからマウントしてないで、サブディレクトリを作成してマウントしたいという場合の設定方法のメモです。

mountPath下にsubPathを設定することで実現できます。 このsubPathのディレクトリ mysql-data が、永続ボリュームのルート・ディレクトリにあるディレクトリの名前となり、mountPathとしてマウントされるディレクトリになります。  

~~~file:mysql_deployment.yml該当部分
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-disk1
          subPath: mysql-data
        - mountPath: /docker-entrypoint-initdb.d
          name: mysql-disk1
          subPath: initdb
      volumes:
      - name: mysql-disk1
        persistentVolumeClaim:
          claimName: mysql-claim1
~~~


言葉だけでは解りにくいので、上記の設定を施したコンテナに入って、dfコマンドを実行した結果です。このコンテナは、１つの永続ストレージの２つのディレクトリに、マウントしていることが解ります。 これで、永続ストレージを分割して使えるので、お金を節約できますね。

~~~
agrant@vagrant-ubuntu-trusty-64:~$ kubectl exec -it mysql-723758760-v8s1s bash
root@mysql-723758760-v8s1s:/# df
Filesystem                                                              1K-blocks    Used Available Use% Mounted on
overlay                                                                 101330012 4918824  96394804   5% /
tmpfs                                                                     2048028       0   2048028   0% /dev
tmpfs                                                                     2048028       0   2048028   0% /sys/fs/cgroup
fsf-dal1001c-fz.adn.networklayer.com:/IBM02SV289550_2/data01/initdb      20971520  215936  20755584   2% /docker-entrypoint-initdb.d
/dev/xvda2                                                              101330012 4918824  96394804   5% /etc/hosts
shm                                                                         65536       0     65536   0% /dev/shm
fsf-dal1001c-fz.adn.networklayer.com:/IBM02SV289550_2/data01/mysql-data  20971520  215936  20755584   2% /var/lib/mysql
tmpfs                                                                     2048028      12   2048016   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                                     2048028       0   2048028   0% /sys/firmware
~~~





# 参考資料
* https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath
定期的に可愛い女の子が「進捗どうですか？」と尋ねてくるスクリプトを書きました。

さて今回はSayコマンドを使って、Macの中に仮想美少女PMを住まわせてあげましょう。
一時間ごとに「進捗どうですか？」と発声させることで、作業の効率をアップさせる事ができます。

# 使用するもの
- say コマンド
- cron
- Mac

ここではOS Mavericksを使用していますが、より新しいOSでも実現可能なことを確認しています。

※この記事を公開しているのは2017/09/27ですが、お察しの通りMaveriscksが過去のOSになったぐらいの時期に書いたエントリです。途中まで書いていたものを掘り出して投稿しております。美少女に免じて許して下さい。なんでもしますから。（なんでもするとは言っていない）


# 手順1. Macの設定確認
まずはSayコマンドでいいかんじに喋れるように設定します。

システム環境設定から、「音声入力と読み上げ」の設定へ入ります。
<img width="782" alt="スクリーンショット 2015-11-25 10.54.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/65315/d25a5ea3-9eb2-b512-3e87-eae4fdcc4316.png">
ここでシステムの声を確認できます。他の声に変えることも出来ます。
<img width="782" alt="スクリーンショット 2015-11-25 10.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/65315/f64ba3dc-9cbb-13cb-9be5-6e0312399d66.png">
カスタマイズから、他言語を選択することも出来ます。
<img width="243" alt="スクリーンショット 2015-11-25 10.54.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/65315/21682531-2b4d-9f81-35ec-e13fcb8217e2.png">
日本語で喋らせたい場合は、KyokoもしくはOtoyaを選択しましょう。（1GB程度のDLを伴います）
<img width="782" alt="スクリーンショット 2015-11-25 10.54.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/65315/faa44710-9bec-61e0-3c35-4156dd80bdc9.png">

今回はDLがめんどいので、デフォルトのAlexで実装しますが、皆さんはKYOKOにしてタイトルを回収して下さい。

※本記事公開時2017/09/27時点ではOS Sierraなんですが、普通に`say しんちょくどうですか？`で日本語喋れているので設定しなくてもデフォでいけるかも。

# 手順2. 音声テスト
ターミナルを開き、sayコマンドでいろいろ喋らせてみましょう。
```say hello```
これだけで10分は遊べます。スピーカーに繋いで、紗霧ちゃんごっこして遊びましょう。進捗どうですか？
ところでSayコマンドがあれば、喋るのが苦手な人でもミーティングで堂々と発言できますよね。すてきだなぁ。


# 手順3. cronの設定
喋らせたい内容が決まったら、cronで定時実行しましょう。
`crontab -e`して次のように書き込んでいきます。
```
0 * * * *　say しんちょくどうですか？
```
多分これであってます。うごかんかったらごめんって紗霧ちゃんがいってた。
ちなみに`corntab -e`（エディット）は`corontab -r`（全部消すやつ）と近くてタイポで事故るので云々みたいな話がありますが、どうせこういうしょうもないやつしか入ってないので気にせず`-e`します。誰もお前を愛さない。

# ということで
1時間毎に進捗を確認してくれる可愛い女の子の完成です。こういうのをドッグフーディングっていうんですかね（ぜんぜん違う）。まあ何にせよドッグフードを食ってるみたいな気分にはなれます。

仕事中にめっちゃ鳴るのでどきっとしますし、周りの人もどきっとします。
夜にも鳴るし、家でYouTube見てても鳴ります。これで安心です。もう進捗は出たようなものですね。こちらからは以上です。
concrete5で、Googleタグマネージャーを実装する

concrete5 ver8系を前提にお話します。

# concrete5でトラッキングコードを貼るには

管理画面→システムと設定→SEOと統計→**トラッキングコード**

で設定できます。

![qiita_c5_tagm.jpg](https://qiita-image-store.s3.amazonaws.com/0/116223/0c0256ce-556d-c7b3-4e0e-9d810025ca7c.jpeg)

昔は、head要素の中に出すしかできなかったのですが、閉じbody直前でも出せるようになりました（v8から）

WordPressみたくプラグイン入れたり、はたまたテンプレートにハードコーディングしたりしなくて良いので、とても便利です。

# タグマネージャーの仕様はトリッキー

しかし、タグマネージャーはちょっと厄介です。

![qiita_c5_tagm2.jpg](https://qiita-image-store.s3.amazonaws.com/0/116223/c7a4f88e-58a3-c4fc-88ff-97b006c521a0.jpeg)

ご覧のように、

* **head開始直後**
* **body開始直後**

の２箇所に貼らなければなりません。

既に用意されている「トラッキングコード」のフィールドに貼ると、必ずしもheadの最上位に来るというわけではありません。また、「トラッキングコード」は、body開始直後にも出せません…

# サイト属性を使う

そこで、v8から用意されたサイト属性を使って対処します。

管理画面→システムと設定→**カスタム属性**

を選びます。

「属性を追加」から「テキスト（複数行）」を選択。適当な名前とハンドルをつけます。

もう１個追加します。こちらも上記と同じ処理をします。

![スクリーンショット 2017-09-27 19.43.25.png](https://qiita-image-store.s3.amazonaws.com/0/116223/b5c08951-32f1-c35d-39ad-e42d9fb6143f.png)

こういう感じ。上記は１つだけですが、要はhead開始直後とbody開始直後用のフィールドを作ってあげます。

属性の作成が終わったら、実際に入力します。場所は、

管理画面→システムと設定→基本→**サイト名＆属性（Name&Attribute）**

ここにアクセスすると、既に作成された属性がありますので、タグマネージャーの管理画面から、それぞれのトラッキングコードをコピペして終わります。

# コードサンプル

次に、テーマテンプレート側に、サイト属性を呼び出す記述を記します。

呼び出し方は、[公式](https://concrete5-japan.org/help/5-7/recipes/get-site-attribute-value/)に書いてあります。

なお、ハンドルは、ちゃんと自分がつけた名前に変えましょう。

## head開始直後
```php:header.php
<?php defined('C5_EXECUTE') or die("Access Denied."); ?>
<!DOCTYPE html>
<html class="no-js" lang="<?php echo Localization::activeLanguage()?>">
<head>

    <?= Core::make('site')->getSite()->getAttribute('gtm_head_start'); //←　ココ ?>

    <?php Loader::element('header_required');?>
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="<?php echo $view->getThemePath()?>/assets/css/app.css">
<!-- 以降続く -->
```
## body開始直後
```php:header.php
<body>

  <?= Core::make('site')->getSite()->getAttribute('gtm_body_start'); //←　ココ　?>

  <div class="<?php echo $c->getPageWrapperClass()?>">
    <div class="row expanded">
      <div class="xxlarge-2 columns l-left-column">
<!-- 以降続く -->
```

# ちなみに…
v8が出るまでは、グローバルエリアでやってました。head開始直後にグローバルエリア刻むのはキモチ悪いのですが、管理画面からブロックを入れられるので、HTMLブロックを入れてやってました。サイト属性のほうが直感的なので良いですね。
Neural Network Console(NNabla)で回帰問題(画像評価)を解いてみた。



# 概要
Neural Network Consoleを使って簡単な回帰問題を解くネットワークを作成しました。
試しに動かす程度の参考になればと思います。

# 動作環境
+ Neural Network Console　Version1.00

導入に関してはダウンロードした際に入っている日本語マニュアルを参考にしてもらえたらと思います。
# ネットワーク構成

リファレンスを参考に組み立てていきます。
[レイヤーリファレンス](https://support.dl.sony.com/181/)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/204408/427d9894-e5fb-14ee-5bb5-cb32cab44fcb.png)

512-32-1の全3層から成り、活性化関数はすべてReLUです。

入力データはTID2013データベースより2つの評価法の値と正解ラベル用に人の目による評価値の合計3種類。すべて0~1に正規化してあります。

以下のようなCSVファイルを
学習用:2400個　テスト用:400個
それぞれデータを用意しています。

    x1:FSIM   x2:FISMc   y:MOS
    0.961	 0.9596	0.45833375
    0.9402	0.9372	0.485795
    0.9569	0.9559	0.44642875
    0.8545	0.8353	0.3256575
    0.7419	0.7099	0.3618425
    0.8505	0.8371	0.3027775
                   …
# 実行結果
Training(F5)を押して学習させます。
…いい感じに学習できてる気がしますね。

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/204408/1a99f5a6-a4fc-5cb6-5628-1920b7bd7f29.png)


次にテスト結果

![resu.PNG](https://qiita-image-store.s3.amazonaws.com/0/204408/c588d47f-99cb-85af-4cfc-0b3c84dcd659.png)


y:label が正解値 y'が予測値になっています。
テキトーに選んだ2つの入力で予測していますので精度はこれくらいなんじゃないでしょうか。
一応学習してそこそこ近い値はでているようですね。

# おわりに
回帰問題のサンプルが見つからなかったので自作した訳ですが、
無事動いているようで良かったです。

初登校の拙い記事ですが、
どなたかの助けにでもなれば幸いです。
Rubocop を使っているアナタがするべき２つのこと

# 1. とりあえず `-D -E -S -P` をつけるべし

オプションはいくつもありますが、`-D -E -S` は特に副作用がないので、常に有効化することをオススメします。また、`-P` をつけると処理速度が向上します。

```bash
$ export RUBOCOP_OPTS='-D -E -S -P' # おすすめ設定
$ bundle exec rubocop
```

`export RUBOCOP_OPTS='-D -E -S -P'` は `~/.bashrc` などに書いておきましょう。


それぞれの意味はこちら：

```
-D, --display-cop-names    Display cop names in offense messages.
-E, --extra-details        Display extra details in offense messages.
-S, --display-style-guide  Display style guide URLs in offense messages.
-P, --parallel             Use available CPUs to execute inspection in
```

ただし、`-P` オプションは `--auto-gen-config` と併用できないので、`--auto-gen-config`を使う時は無効化する必要があります。

```bash
$ RUBOCOP_OPTS= bundle exec rubocop --auto-gen-config
```

# 2. `--auto-gen-config` には `--exclude-limit=99999` もつけるべし

１種類のCopについて、違反しているファイルが１５個以上になると、

```
# Offense count: 23
# Cop supports --auto-correct.
Layout/BlockEndNewline:
  Enabled: false
```

のように、Cop自体を無効化する設定が `.rubocop_todo.yml` に生成されてしまいます。これでは、新たに追加するファイルに対しても警告がされません。
そこで、`--exclude-limit` に大きな数値を指定して、`Enabled: false` が生成されないようにしましょう。

また、`--no-offense-counts` と `--no-auto-gen-timestamp` も指定しておくと、`.rubocop_todo.yml` を再生成した時の差分が小さくなり Gitのログが見やすくなります。

```
        --exclude-limit COUNT        Used together with --auto-gen-config to
                                     set the limit for how many Exclude
                                     properties to generate. Default is 15.
        --no-offense-counts          Do not include offense counts in configuration
                                     file generated by --auto-gen-config.
        --no-auto-gen-timestamp      Do not include the date and time when
                                     the --auto-gen-config was run in the file it
                                     generates.
```

```bash
$ RUBOCOP_OPTS= bundle exec rubocop --auto-gen-config --exclude-limit=99999 --no-offense-counts --no-auto-gen-timestamp
```
Rancher 2.0をGKEクラスタにデプロイして，そのGKEクラスタ自身を管理する

http://rancher.com/announcing-rancher-2-0/

Rancher 2.0では，既存のKubernetesクラスタをインポートして管理できるようになった．

Rancher server自体をKubernetes上で動かすことも，(以前と同じく)可能．

## RancherをGKE上にデプロイする

例えば以下のYAMLのようにできる．

ここではCloud SQLを使ってみたが，MySQLなら何でも良い．

そのうち，`helm install` できるようになることを期待．

```yaml
# MySQL needs to be setup as follows:
# - Create a Cloud SQL instance
# - Set up SQL Proxy via Helm ( https://github.com/kubernetes/charts/tree/master/stable/gcloud-sqlproxy  )
# - Create `rancher-secret` secret for `dbuser` and `dbpass` ( https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod )
# - Create "cattle" DB ( https://rancher.com/docs/rancher/v1.6/en/installing-rancher/installing-server/ )

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: rancher
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: rancher
    spec:
      containers:
      - name: rancher
        image: rancher/server:preview
        args: ["--db-host", "sqlproxy-gcloud-sqlproxy"]
        env:
          - name: CATTLE_DB_CATTLE_USERNAME
            valueFrom:
              secretKeyRef:
                name: rancher-secret
                key: dbuser
          - name: CATTLE_DB_CATTLE_PASSWORD
            valueFrom:
              secretKeyRef:
                name: rancher-secret
                key: dbpass
        ports:
        - containerPort: 8080

---

# Note: Rancher Host Registration URL needs to be http://$(kubectl get service rancher-port  -o json | jq -r .spec.clusterIP):8080
apiVersion: v1
kind: Service
metadata:
  name: rancher-port
spec:
  selector:
    app: rancher
  type: NodePort
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30000
```

## GKEにデプロイしたRancherでGKEを管理する

`http://<任意のminionのIP>:30000` にアクセスするとRancherのUIが表示される．

(もちろん，このポートをそのままインターネットに開放するのは危ないので，適宜 `ssh -L 8080:<任意のminionのIP>:30000 <踏み台インスタンス>`などする)

<img width="1324" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/90542/b5435a65-e0c7-3121-ba4a-4519cccea07e.png">


Host Registration URLに，`http://<rancherのclusterIP>:8080`を入力すると，RancherにGKEを登録するためのYAMLが表示される．後は`kubectl apply`するだけ．
api blueprint で複数ファイルからhtmlを生成する方法

#複数ファイルからのhtml生成
[こちら](https://qiita.com/haseshin42/items/faa389055fcecacaa528)の記事で、api blueprintを用いることでAPI仕様書を生成できることを説明しましたが、複数人で作業を分担したり、エンドポイント毎にファイルを分割しているようなケースでは、複数ファイルからHTMLファイルを生成することが可能です。

具体的には、HTMLのコメント形式で生成対象のファイルを指定する以下のようなファイルを作って、そのファイルをaglioで変換すればOKです。

```merge.txt
<!-- include(file1.apib) -->
<!-- include(file2.apib) -->
```

変換のコマンド例はこちら。
```
aglio -i merge.txt -o output.html
```
zshの補完でエラー


zshを操作していて以下のようなエラーが出た。

```bash
_arguments:450: _vim_files: function definition file not found
```

以下のページに解決策があった。
https://github.com/robbyrussell/oh-my-zsh/issues/518

`~/.zcompdump` というファイルが悪さをしている模様。

```bash
# zcompdumpは削除しても大丈夫
$ rm ~/.zcompdump

# 新しいzcompdumpが出来る
$ exec zsh
```

これで解決した。
さくらのレンタルサーバで.htaccessに418 I’m a tea potを書くと500エラーを返すようになった話

今日(2017/9/27)、さくらのレンタルサーバで公開している自分のサイトにアクセスすると500エラーを返すようになっていたので原因を調査したところ.htaccessに

```
ErrorDocument 418 error418.html
```

と書いていたのが原因だった。今まではエラーが出ることもなかったので何かの変更によるものだと思う。

↓この話に何か関係があるかも？
[HTTPで「418 I’m a tea pot」を実装してはいけない](https://qiita.com/flano_yuki/items/ea251ac6b53bc54677d2)
Rspec ログイン認証を力技で反映させる書き方

# 起きた事象
`gem devise`を使って管理者画面を作成後、Rspec でテストを書いていたが
`401 Unauthorized　`
認証周辺で引っかかりテストが通らない。

# 解決方法

```
 allow(controller).to receive(:authenticate_admin_user!).and_return(true)
```

# モックとは
> mock: 【名】擬似、偽り　参照 [weblio](http://ejje.weblio.jp/content/mock)

本物の振る舞いをするような、偽物のプログラム

**使うタイミング**
ex) web API テスト時
=> 定義しているメソッドを使ったときに、実際にリクエストしてしまうのを防ぐ。

**今回使った構文**

```
allow(♡).to receive(★).and_return(true)
```
★が♡で呼ばれた時、trueを返すという意味となる。

# 結果

今回は `authenticate_admin_user!`が`controller`で呼ばれた時に`true`を返す。

これを before do ~ end で囲ってあげる。
力技ですがこれで認証が通るはずです。

```
 before do
    allow(controller).to receive(:authenticate_admin_user!).and_return(true)
  end
```

# 参考
ありがとうございました。
今後はモックとスタブについても違いがあるようなので、調べてみたいです。

[使えるRSpec入門・その3「ゼロからわかるモック（mock）を使ったテストの書き方」](https://qiita.com/jnchito/items/640f17e124ab263a54dd)
[RspecでMockを使う](https://qiita.com/sesame/items/8d4419da0afde3bb845f)
[gem devise ~Wiki~](https://github.com/plataformatec/devise/wiki/How-To:-Stub-authentication-in-controller-specs)
ec2(amazon linux)にmysql5.7を導入

前提
　・EC2のインスタンスを作成済み（yumのupdateも完了）
　・インスタンスのセキュリティーグループでsshを許可している
　・インスタンスにSSHに繋げる
　・Macでターミナルを使用

手順
　1. リボジトリの追加
　2. mysqlインストール
　3. mysql起動
　4. ログイン
　5. パスワードの変更

##1. リポジトリを追加　
```
sudo yum install http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
```

##2. mysqlインストール
```
sudo yum install mysql-community-server mysql-community-devel.x86_64
```

###　バージョンの確認
```
mysql --version
```

## 3. mysql起動 
```
sudo service mysqld start
```
###　mysql自動起動設定
```
sudo chkconfig mysqld on
```

## 4. ログイン
ログインできなかったorz
調べたら「/var/log/mysqld.log」に
`[Note] A temporary password is generated for root@localhost: xxxxxxxxx`
と初期パスワードが書いてあるのでそれを使用してログイン
※ historyに残るからpasswordはログインコマンドと一緒に書かない方が良いと思う。。。

```
mysql -u root -p
```
## 5. パスワードの変更
パスワードの変更をしないと処理を受け付けてくれない為、パスワードを変更
※ポリシー強め
`ALTER USER root@localhost IDENTIFIED BY '新パスワード';`
※下記でパスワードのポリシーを下げる事も可能
`SET GLOBAL validate_password_length=4;`
`SET GLOBAL validate_password_policy=LOW;`

新しいパスワードで再ログインして確認する！

完了♪
アノテーションの作成 - Java vs Kotlin

## Java

```java
@Documented
@Target(CLASS) // 要件やデザインによって変わる
@Retention(RUNTIME) // 要件やデザインによって変わる
public @interface AnnotationName {
}
```

## Kotlin

Kotlin の場合、 Documented は MustBeDocumented になる

```kotlin
@Target(CLASS) // 要件やデザインによって変わる
@Retention(RUNTIME) // 要件やデザインによって変わる
@MustBeDocumented
annotation class AnnotationName
```

## 使い方

どっちでもこれを

```kotlin
@AnnotationName
```

ついたら済む

## Ref

- Target - [**Java** - ElementType](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/ElementType.html) / [**Kotlin** - AnnotationTarget](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.annotation/-annotation-target/index.html)
- Retention - [**Java** - RetentionPolicy](https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/RetentionPolicy.html) / [**Kotlin** - AnnotationRetention](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.annotation/-annotation-retention/index.html)
■Bluemix サービス作成際のエラー解決法 


★　**You have exceeded your organization's services limit.**


★　**FAILED
Server error, status code: 400, error code: 60005, message: You have exceeded your organization's services limit.**

上記のエラーが表示された場合、下記の事項を確認してください。

①不要/未使用のアプリ/サービス容量のチェックして、確実に要らないものを削除してみてください。

②ダッシュボードでサービスの使用可能個数を確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181748/b34c517e-2608-291c-d212-ff61bc7239c7.png)

↑のようにサービス(4/4)になると、★のエラーメッセージが出ています。
その場合、不要/未使用サービスを削除するか　サービスの拡張を申請するか　で試してください~~~
充電池の放電器を作ってみた


※ 本記事はそもそも発熱する事象を扱っているので、排熱に留意し、火傷や火事に十分気を付けてください。

お仕事で大量に充電池を使うので、電池を元気にするために放電器を作ってみました。

+ とくにログを取ったりするつもりはない
+ 時間もそれなりにかかってもいいので電池にやさしい放電
+ なるべく部品がすくなくシンプルに


来ない部品があるのでまだ試作段階ですけど、ちゃんと動いているようです。

![P_20170915_190257.jpg](https://qiita-image-store.s3.amazonaws.com/0/61597/2f510103-8f99-b930-e4de-a1cc7073e26c.jpeg "P_20170915_190257.jpg")

ダイソーの充電器が写っていますが、中身は抜いてただの電池ボックスになっています。電池はテスト用にダメ乾電池がはいってます。

## アナログ回路部分は:

+ 抵抗で電気を消費する
+ MOSFETをスイッチにして電流をON/OFFする

基本はこれ。写真ではこれが二つぶんです。最終的には四つにしたい。


![スクリーンショット 2017-09-27 16.18.15.png](https://qiita-image-store.s3.amazonaws.com/0/61597/ae3b0eba-721e-f222-4ccb-550ed024e2ee.png "スクリーンショット 2017-09-27 16.18.15.png")
R1で電流を熱に変えて消費します。概ね 3Ω 1Wくらいなら電池が1.5vでも電流が0.5A、消費電力が0.75W。電池が1.0vで0.33A、0.33W。十分定格内ですし、そんなに発熱しない。
写真では10Ω 1/2Wを三本並列にして3.3Ω。ほんのり暖かくなります。
R2はArduinoの出力端子を保護するためのもの。500~1kΩあればよいそうな。
MOSFETは、手元にあった2sk4017を使いました。

Arduinoに電源が入っていない時はスイッチOFFにしたいので:
![スクリーンショット 2017-09-27 16.21.26.png](https://qiita-image-store.s3.amazonaws.com/0/61597/0f768b08-5cba-a90a-c6a2-3eecdbb09bd0.png "スクリーンショット 2017-09-27 16.21.26.png")
R3 (ありもので2kΩ)でグランドに落しました。R2は要らなくなったので取りました。

スイッチ類もできるだけ省略したい。電池を抜いたらArduinoに「抜いたよ」と知らせるために：
![スクリーンショット 2017-09-27 16.22.46.png](https://qiita-image-store.s3.amazonaws.com/0/61597/31acb7e6-6650-2dd4-108b-5a83190eb866.png "スクリーンショット 2017-09-27 16.22.46.png")
R4を追加しました。電池を抜くと0Vになります。
これでArduinoにリセットの合図を送ることができます。
大きい抵抗(1MΩ)を入れてあんまり電流が漏れないようにしました。

基本これでOKなのですが、さらにR1も省略してやろうバージョン：
![スクリーンショット 2017-09-27 16.27.38.png](https://qiita-image-store.s3.amazonaws.com/0/61597/722a435e-aaf4-ca90-bd26-03d71dd9eba7.png "スクリーンショット 2017-09-27 16.27.38.png")
耐圧が大きいMOSFETはon抵抗が大きいそうで。2N60がon抵抗 3.8Ωで良さげだったのでためしに入れかえてみました。
![P_20170920_195131.jpg](https://qiita-image-store.s3.amazonaws.com/0/61597/a1e2d7e5-34e2-91d1-6adb-a99522303ad7.jpeg "P_20170920_195131.jpg")

R1なし。うん、使える。けど発熱すくないので時間かかるかな。
※他のまっとうな低on抵抗のMOSFETではやらないでください。発熱して危険です。

## Arduinoですること：

+ 電池電圧を監視し
+ 1.0~1.5vで放電(FET ON)
+ 1.0vで放電停止(FET OFF)
+ 電池を抜いたらリセット 1~1.5vの範囲に入ったら放電開始

FlexiTimer2を使って1秒ごとに電圧を計測してスイッチ制御しつつ、
メインループでは、放電中の電池をビルトインのLEDで簡易的に表示させるようにしました。

Gistに上げました。よろしければどうぞ。
[NimH_discharge_2.ino](https://gist.github.com/ttatsf/4186400f7cf43cf68cc6df16194e65c9)

何かもっといいやりかたとか、逆にまずいこととかあればコメントおねがいします。
TeX スタイルガイド（文献紹介のみ）

# 本日は

[数式, TeX 混じりの文章を書く方に軽く見て欲しい文献](https://qiita.com/SatoshiTerasaki/items/2d0ae6a9db4bc5f1681c)

の続編相当の記事です．意外と「いいね！」ボタンが押されていて驚きです．色々思うところがある方が多いのだと思われます．

学生の時にお世話になった LaTeX の入門書としては奥村さんの美文書作成入門です．第7版が今年の最初に出ているようだったので Kindle で買って眺めて見ています．5, 6版に比べるとかなりまとまってる印象があり，表紙も柔らかいデザインで気軽に楽しめそうな雰囲気を出しているのがグットです．表を書いて見たい，積分のあの記号が書きたい，書式を変えて見たい，ある種のリファレンスとしても役に立つと思います．

# スタイルガイド

ただ，一つ一つの数式，TeXコマンドが覚えられるようにはなってもそれらを「キレイに」組み合わせるためのスタイルガイドの要素がもっと欲しい印象です．いわゆるプログラム言語でのスタイルガイドに相当するものが欲しいこの頃．

例えば，真ん中を省略するドットの書き方はやろうと思えば

```math
\begin{align}
s&=1+2+\cdots+n,\\
t&=1+2+\ldots+n,\\
i&=1,2,\cdots,m,\\
j&=1,2,\ldots,n.
\end{align}
```

というような書き方ができてしまいます．いかがでしょうか．見てて違和感しか感じないですよね．

数式にフォーカスを当てたスタイルガイドについては英語の文献は調べると色々出てきます:

- [A GRADUATE STUDENT'S GUIDE TO LATEX AND AMS-LATEX](https://www.tntech.edu/files/math/reports/TR_2003_1.pdf)
- [An Introduction to LaTeX and AMS-LaTeX](http://ftp.jaist.ac.jp/pub/CTAN/info/mil/mil.pdf)
- [AMS Style Guide](http://www.ams.org/publications/authors/AMS-StyleGuide-print.pdf)

日本語で書かれてるものでは次のようなものがあるようです．随時追加していきます．


- [数学の常識・非常識—由緒正しい TEX 入力法](https://www.math.tohoku.ac.jp/tmj/oda_tex.pdf)
- [日本語 LaTeX を使うときに注意するべきこと](http://www.math.tohoku.ac.jp/~kuroki/LaTeX/howtolatex.html#amsthm2)
(内容的に古くなっている部分があるかもしれないので注意.)
- [$\Tex$ Wiki 表記の哲学](https://texwiki.texjp.org/?%E8%A1%A8%E8%A8%98%E3%81%AE%E5%93%B2%E5%AD%A6)

もちろん他にも多くの文献があります．とはいえ，これらはいわゆる数学を専門としている人間が本格的な論文を執筆する時にの注意事項，啓蒙をしているのでカジュアルな Qiita とかで全ての規則を適用すべきというわけでもないでしょう．私も全てを読んでいるわけではないし，知らなかったものもあります．「へーそいういう Tip があるんだ」というぐらいの気楽さで広まってほしいです．

# おまけ

TeXとは別に日本評論社から出ている数学ビギナーズマニュアルは自然言語として数学的な文章を書きたい人にオススメ． 大学で数学を学ぼうとしている1，2年生を対象にしており，数学がわかってる人同士であれば暗黙の了解になってるところをちゃんと文章化しているところが魅力的です．非専門家の人にも得るところは多いと思います．
(SDL1|SDL2) & (MinGW|Mac|Emscripten) & OpenGL  & C言語 のビルド方法まとめてみた

SDL2 x Emscripten x GL を利用してゲームでも作ろうかな。
と思い立って、アレコレしていたのですが、

今は、SDL2より、SDL1 の方が良いなぁーと思うに至ったり。 ついでだから、 Windows や Macようにもビルドできるようにしておきたいなぁ。
と考えたりしました。


なぜ、SDL1なの?　ビルドで困ったことは?
などなど
あれこれ、解説します。



# 結論から

- (SDL1|SDL2) & (MinGW|Mac|Emscripten) & OpenGL  & C言語　のサンプルコードは以下におきました。  
https://github.com/kyorohiro/doc_sdl2
ビルド環境付きです。

- 差異を吸収するLayerを作りました。
https://github.com/kyorohiro/capp
ifdef とか、参考までにどうぞ
TTF Image Mixer GL が使えます。



# SDL1を使おう。なぜ?
詳細は以下にかきました。
http://kyorohiro.blogspot.jp/2017/09/which-use-sdl1-or-sdl2-at-emscripten.html

- SDL2 x Emscripten のサイズがでかい。 2MBくらいある。 SDL1 x Emscriptenなら、200kbくらいで済む
- SDL2系で SDL_mixerが思い通りに動作しなかった。(今は違うかも)
- SDL1系でも、タッチイベントが使える

という理由からです。サイズが小さく済むのが、個人的には大きなポイントでした。



# デスクトップとEmscriptenの主な違い

emscriptenは、emscripten_set_main_loop_argで、イベントループを回す必要がある。

```
 emscripten_set_main_loop_arg(main_loop, obj, 60, 1);
```

おもな違いは、そのくらい



# SDL1 と SDL2 の違い
https://wiki.libsdl.org/MigrationGuide
のとおり



# MINGW x SDL x GL を利用するには、自分でGLEWをビルドする必要がある
以下にまとめましたが、MINGWように GLEWを自分でビルドしてください

http://kyorohiro.blogspot.jp/2017/09/build-sdl-x-mingw-x-opengl-s.html

以下は、ビルドできるように修正済みのコード
https://github.com/kyorohiro/glew_mingw



# PS
TTFとかですね、Imageとかの、合成方法とか、　差異が少しだけありました。
詳しくは、

https://github.com/kyorohiro/doc_sdl2
https://github.com/kyorohiro/capp
https://github.com/kyorohiro/glew_mingw

を参照してください。
(SDL1|SDL2) & (MinGW|Mac|Emscripten) & OpenGL  & C言語
での、Image、OffScreen Image、Sound、Font、GL、等、基本的なサンプルコードをおきました。
ninja build つきです。

https://github.com/kyorohiro/capp/tree/master/examples
にも、同等の、サンプルコードがあります。

また、以下もどうぞ
https://kyorohiro.blogspot.jp/search/label/Emscripten

 
  　
 　


オワリ!!
Re: 「FizzBuzzクイズ」クイズ－Ruby編

## 問題

[「FizzBuzzクイズ」クイズ－Ruby編](https://qiita.com/sumim/items/f26902f2b813c075a619)

## 答案

先行の解答を見ずに書いたら、以下の記事の解答とほぼ同じになりました。

[FizzBuzzクイズの実装例( ruby )](https://qiita.com/Nabetani/items/a02c922a21ce357b62da)

比較してみて面白かったので、変数名を参考にさせていただき、推敲しました。

```fizz_buzz_quiz.rb
module FizzBuzzQuiz
  class << self
    def included(mod)
      module_name = mod.name
      base = mod.const_get(:BASE)

      Integer.class_eval do
        define_method(module_name.downcase) do
          return self unless self % base == 0
          s = module_name
          i = self
          s.define_singleton_method(:to_fizz_buzz_i){ i }
          s
        end
      end

      String.class_eval do
        define_method(module_name.downcase) do
          return self unless self.to_fizz_buzz_i % base == 0
          s = self + module_name
          i = self.to_fizz_buzz_i
          s.define_singleton_method(:to_fizz_buzz_i){ i }
          s
        end
      end
    end
  end
end
```

```fizz.rb
require "./fizz_buzz_quiz"

module Fizz
  BASE = 3
  include FizzBuzzQuiz
end
```

```buzz.rb
require "./fizz_buzz_quiz"

module Buzz
  BASE = 5
  include FizzBuzzQuiz
end
```

```pezz.rb
require "./fizz_buzz_quiz"

module Pezz
  BASE = 7
  include FizzBuzzQuiz
end
```

```main.rb
require "./fizz"
require "./buzz"

p 1.fizz.buzz #=> 1
p 3.fizz.buzz #=> "Fizz"
p 5.fizz.buzz #=> "Buzz"
p 15.fizz.buzz #=> "FizzBuzz"
p 15.buzz.fizz #=> "BuzzFizz"
p 7.fizz.buzz #=> 7

require "./pezz"

p 7.fizz.buzz.pezz #=> "Pezz"
p 21.fizz.buzz.pezz #=> "FizzPezz"
p 35.fizz.buzz.pezz #=> "BuzzPezz"
p 105.fizz.buzz.pezz #=> "FizzBuzzPezz"
p 105.fizz.pezz.buzz #=> "FizzPezzBuzz"
p 105.pezz.buzz.fizz #=> "PezzBuzzFizz"

p 1.fizz.buzz.pezz #=> 1
p 3.fizz.buzz.pezz #=> "Fizz"
p 5.fizz.buzz.pezz #=> "Buzz"
p 15.fizz.buzz.pezz #=> "FizzBuzz"
p 15.buzz.fizz.pezz #=> "BuzzFizz"
p 104.fizz.buzz.pezz #=> 104
```

追加実装の際は、新しくモジュールを書き、それを`require`します。このためだけにわざわざモジュール使う必要あんのかという感じですが、既存コードに対して必要な変更という意味ではプラス1行だし、なんとなく波風立たなそうなので、これでいいということにします。

Rubyを久しぶりに書きましたが、こういうのはとても楽しいですね。

## 追記

* 先に`return`するなら`self`かなということでちょっと修正