OmniAICreator/Qiita-1.07M huggingface dataset:
ノンプログラマーお勉強メモ

最近ノンプログラマーさんが「○カ月でプログラム技術を身につけた」とか「○○を作ってみた」とかいう記事をよくみかける。
こういうのいいなーと毎回思っていたので、仕事で時間ができたときに限り自分もゆるゆるとトライしてみようと思う。
家では違うことをしたいので、あくまでも、会社の空いた時間（昼休みや、待ち時間など）に限定しようと思う。（最低1日15分位はとりたい。）

#言語どうっすかなー問題

ここをみてRubyに決定。
[Rails - ノンプログラマーが3ヶ月でWebサービスを作ってみた - Qiita]
(http://qiita.com/tabbyz/items/6513e84f319843c316d5?utm_content=buffer3d13f&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)

#Rubyが勉強できるサイト
積読本が他にもあるので、今回は本は買わずにやってみる。
お金をかけずにどこまでできるか。

とりあえずこの辺りは目を通してみようと思う。

- [Ruby on Rails チュートリアル：実例を使って Rails を学ぼう](http://railstutorial.jp/)
- [小学生でもわかるRuby on Rails入門 | OpenBook](http://openbook4.me/projects/92)
- [Ruby on Rails 4入門 (全28回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_rails_v2)


プログラミング学習webサービスだとこういうのもある様子。

- [Progate | プログラミングの入門なら基礎から学べるProgate (プロゲート)](http://prog-8.com/)
- [CODEPREP -オンラインでプログラミングを学ぼう-](http://codeprep.jp/ja)
- [Learn to code | Codecademy](https://www.codecademy.com/)
- [ミニツク - Rubyのe-ラーニング研修システム](http://www.minituku.net/)


#他
バッグエンド周りがちんぷんかんぷんなので、軽くお勉強したい。
あと、よくブログで良書として紹介されているものには目をとおしておきたい。

##オンライン

- [Vagrant入門 (全13回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_vagrant)
- [MySQL入門 (全19回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_mysql_v2)
- [Heroku入門 (全12回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_heroku)


##書籍

- [Webを支える技術 -HTTP、URI、HTML、そしてREST](http://www.amazon.co.jp/gp/product/4774142042/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4774142042&linkCode=as2&tag=bookslink-22)
- [体系的に学ぶ 安全なWebアプリケーションの作り方　脆弱性が生まれる原理と対策の実践](http://www.amazon.co.jp/gp/product/4797361190/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4797361190&linkCode=as2&tag=bookslink-22)
- [リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック ](http://www.amazon.co.jp/gp/product/4873115655/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873115655&linkCode=as2&tag=bookslink-22)
- [GitHub実践入門 ~Pull Requestによる開発の変革](http://www.amazon.co.jp/GitHub%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~Pull-Request%E3%81%AB%E3%82%88%E3%82%8B%E9%96%8B%E7%99%BA%E3%81%AE%E5%A4%89%E9%9D%A9-PRESS-plus/dp/477416366X)
C++でchunkedデータからmsgpackデシリアイズ

標準入出力、パイプ、ネットワーク通信のようなデータストリームで断片化される可能性があるデータをmsgpackでデシリアイズする方法。ちなみにデータストリーム（例えばstd::cin）から読み込める場合は自分でデータを読み込むまでもなく `msgpack::Unpacker unpacker(std::cin); ` などとしてデシリアイザを作成できる。

毎回忘れるのでメモ。

```cpp
#include <msgpack.hpp>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  // 標準入力から読み込みのための変数
  static const size_t BUFSIZE = 4096;
  int rc;
  char buf[BUFSIZE];

  // Unpacker
  msgpack::unpacker unpkr;

  // 標準入力から読み込み                                                                                                                                                                                           
  while (0 < (rc = read(0, buf, sizeof(buf)))) {

    // 残りバッファの確保                                                                                                                                                                                           
    unpkr.reserve_buffer(rc);
    // データのコピー                                                                                                                                                                                               
    memcpy(unpkr.buffer(), buf, rc);
    // バッファの読み込み                                                                                                                                                                                           
    unpkr.buffer_consumed(rc);

    msgpack::unpacked result;
    // 結果の取得                                                                                                                                                                                                   
    while (unpkr.next(&result)) {
      const msgpack::object &obj = result.get();
      printf("%d\n", obj.type);

      // メモリ解放                                                                                                                                                                                                 
      result.zone().reset();
    }
  }

  return 0;
}
```
MySQL データベース移行手順


1. 移行元データベースからダンプを作成する

    ```bash
    mysqldump -h HOST_NAME -u USER_NAME -p DATABASE_NAME > DUMP_OUTPUT_FILE_PATH
    ```

1. 移行先データベースを作成する

    1. 移行先データベースに接続

    ```bash
    mysql  -h OTHER_HOSTNAME -u USER_NAME -p
    ```

    1. データベースを作成（文字コードをお忘れなく！）

    ```sql
    create database DATABASE_NAME default character set utf8 default collate utf8_general_ci;
    ```

1. 移行先データベースにダンプファイルの中身を読み込む

    ```bash
    mysql -h HOST_NAME -u USER_NAME -p DATABASE_NAME < DUMP_OUTPUT_FILE_PATH
    ```

### 参考URL

MySQL データベースのほかのマシンへのコピー（MySQL 5.6 リファレンスマニュアル）

* [英語](https://dev.mysql.com/doc/refman/5.6/en/copying-databases.html)
* [日本語](https://dev.mysql.com/doc/refman/5.6/ja/copying-databases.html)
composer dumpautoload -o はクラスマップを生成する

# composer dumpautoload -o は全クラスマップを生成する

`-o` は `--optimize` の意味です。
公式マニュアルにも書かれている既知の機能なのですが、ダダハマりしたのでメモっておきます。

結論から述べると `-o` を付けると「オートロードされるであろうファイルのクラスマップ」を生成するのではなく、「指定ディレクトリ以下のクラスマップ」を生成します。


## ディレクトリ構成

下記です。

```bash:tree
/path/to/project
├── composer.json
├── main.php
└── src
    └── package
        └── sab
            └── Test.php
```

確認用の composer.json です。

```json:composer.json
{
	"autoload" : {
		"psr-4" : {
			"vendor\\package\\" : "src/package"
		}
	}
}
```

実行用の php です。

```php:main.php
<?php
require __DIR__ . '/vendor/autoload.php';

var_dump(new \vendor\package\sub\Test());
```

オートロードされる Test クラスです。

```php:src/package/sab/Test.php
<?php
namespace vendor\package\sub;

class Test {}
```


## -o で composer install する

`composer install -o` します。

```bash
$ composer install -o
Loading composer repositories with package information
Installing dependencies (including require-dev)
Nothing to install or update
Generating optimized autoload files
```

4行目で「Generating optimized autoload files」となっており、`-o` が効いています。
そして確認用 php を実行します。

```bash
$ php main.php
class vendor\package\sub\Test#2 (0) {
}
```

きちんとオートロードできていることが確認できます。


## -o なしで composer install する

`composer install` します。

```bash
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
Nothing to install or update
Generating autoload files
```

4行目で「Generating autoload files」となっており、`-o` なしの install が実行されています。
そして確認用 php を実行します。

```bash
$ php main.php
Fatal error: Class 'vendor\package\sub\Test' not found in /path/to/project/main.php on line 5

Call Stack:
    0.0001     223328   1. {main}() /path/to/project/main.php:0
```

オートロードできませんでした。

## なんで？

気づいている人もいると思いますが、psr 的に「Test.php」が配置されるであろうパスが間違っています。

正：`src/package/sub/Test.php`
誤：`src/package/sab/Test.php`

`-o` で dumpautoload すると `vendor/composer/autoload_classmap.php` にクラスマップが生成されるので覗いてみます。

```php:vendor/composer/autoload_classmap.php
return array(
    'vendor\\package\\sub\\Test' => $baseDir . '/src/package/sab/Test.php',
);
```

sub と sab に注目です。
間違った？パスでクラスマップが生成されています。

どうも `-o` があると、指定ディレクトリ（この場合 composer.json の「autoload.psr-4」のディレクトリ）以下を単に総なめしてクラスマッピングするだけのようです。
いわゆる psr 的な名前空間とパスの対応は見てくれません。

この例だとまぁ分かりやすいですが、実際にハマった例だと

正：UnitTest
誤：UniTest

でした。数週間の間、「なんか最近 `-o` が無いとオートロードが効かないなぁ」と？？？な心境になっていました。

ただ `-o` するにしても、普通は「本番環境で `-o` 、開発環境では `-o` なし」のような運用になると思うので、そこまで致命的な事にはならないと思います。
疑問 > mobile network serviceに対比するサービス(ADSL, ISDN, 光ファイバ回線)の総称の英語名 > landline


海外のプロバイダーのサービスにてモバイル回線のサービスの英語名については「mobile network service」でいいのだろう。
https://en.wikipedia.org/wiki/List_of_mobile_network_operators

一方で、ADSL, ISDN, 光ファイバ回線を使うサービスの総称の英語名というのがよくわからない。

「有線」という意味のWired networkは物理形態なので、違う気がする。

「Broadband Internet Services」なのだろうか? でも、mobileのブロードバンドが出てきたらかぶってわかりにくい。
[AT&T](http://www.business.att.com/enterprise/Service/network-services/internet-connectivity/business-dsl/#fbid=A31E2wSEa5t)


知っている人がいたら教えてください。

<hr>
(追記)

knoguchi さんに教えていただいた landline について、下記のような使用例があるのを見つけた。

http://www.telitec.com/internet/
> WIRELESS
If you do not have a landline in Spain, cannot get ADSL or are not happy with your current connection, then we may be able to help with our wireless internet service. 

http://www.pcadvisor.co.uk/how-to/broadband/how-get-broadband-without-landline-save-money-on-line-rental-3606231/
> How to get broadband without a landline: Satellite broadband
Rails : VCRでリクエスト内容が足りないと言われる時の対策

```
An HTTP request has been made that VCR does not know how to handle:
GET http://example.com
```

こんなエラーが出るとき。
VCRで生成されたYAMLファイルを開いて見てみると、リクエスト内容が足りないはずだ。

本来なら

```yaml
- request:
    method: get
    uri: http://example.com
```

っていう行があるべき。

今送ろうとしているリクエストの内容に対して。
キャッシュファイルの内容が足りないと、このエラーが起きる。

この場合はひとつの解決策として。いったんキャッシュファイルを削除して、新しく作りなおすと良い。

なぜこんなケースに行き当たったかというと。
アプリケーション側でキャッシュ機能を使っており、一部のリクエストが足りない状態で、VCRのキャッシュファイルが生成されていた。

「アプリケーション側のキャッシュ」は状況によって、有効だったり無効だったりするので。
「リクエスト内容が足りないVCRファイル」と「すべてリクエストしようとする時の動作」が食い違って、偶発的にエラーが起きていた。

VCRのファイルは、キャッシュ機能が無効な状態で作成すると良い。
なぜなら、キャッシュファイルの内容が「足りない」場合にだけエラーが起こる。多い場合には問題ない。（おそらく）



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
nvmwでalias default

はできない(2015-09-14現在)ので、運用でカバーしてみる.  
下記の変更を行えば、DOS窓を起動するたびに`nvmw use`する必要がなくなります.

## ユーザ環境変数の定義 ##
* PATH ... %HOMEDRIVE%%HOMEPATH%\.nvmw;%NVMW_CURRENT_PATH%;
* NODE_PATH ... %NVMW_CURRENT_PATH%\node_modules

## バッチファイルの修正 ##

修正前のnvmw.batの抜粋
```bat
if %NVMW_CURRENT_TYPE% == iojs (
  set "PATH=%NVMW_HOME%;%NVMW_HOME%%NVMW_CURRENT_TYPE%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%;%PATH_ORG%"
  set "NODE_PATH=%NVMW_HOME%%NVMW_CURRENT_TYPE%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%\node_modules"
) else (
  set "PATH=%NVMW_HOME%;%NVMW_HOME%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%;%PATH_ORG%"
  set "NODE_PATH=%NVMW_HOME%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%\node_modules"
)
```
この直後に、次の処理を追加する.

```bat
if %NVMW_CURRENT_TYPE% == iojs (
    set NVMW_CURRENT_TYPE_PATH=%NVMW_CURRENT_TYPE%
) else (
    set NVMW_CURRENT_TYPE_PATH=.
)

(
    SETX /M NVMW_CURRENT_PATH "%NVMW_HOME%\%NVMW_CURRENT_TYPE_PATH%\%NVMW_CURRENT%%NVMW_CURRENT_ARCH_PADDING%"
    SETX /M NVMW_HOME "%NVMW_HOME%\"
    SETX /M NVMW_CURRENT_TYPE "%NVMW_CURRENT_TYPE%"
    SETX /M NVMW_CURRENT_ARCH "%NVMW_CURRENT_ARCH%"
    SETX /M NVMW_CURRENT "%NVMW_CURRENT%"
    SETX /M NVMW_CURRENT_ARCH_PADDING "%NVMW_CURRENT_ARCH_PADDING%"
) > nul
```

##
使ってみる. いい感じ.

```bat
> nvmw install v0.12.7
> nvmw install v0.12.7 x86
> nvmw install iojs-v1.0.1
> nvmw ls
node:
v0.12.7
v0.12.7-x32

iojs:
v1.0.1
```

```bat
> nvmw use v0.12.7
Now using node v0.12.7 x64
> node --version
v0.12.7

> nvmw use v0.12.7-x32
Now using node v0.12.7-x32 x64
> node --version
v0.12.7

> nvmw use iojs-v1.0.1
Now using iojs v1.0.1 x64
> node --version
v1.0.1
```

## nvmwについて ##
Copyright (c) 2011 Kazuyuki Honda <hakobera@gmail.com>
Released under the MIT license
http://opensource.org/licenses/mit-license.php
Swiftでラインモーション


[こちらの記事](http://qiita.com/s_s_k/items/93915e823fac0e307c7a)の追加で、ラインモーションのサンプルを入れました。
詳細コードは[GitHub](https://github.com/SuguruSasaki/SwiftProcessing)で。
MyCanvasLine.swiftに具体的なコードがあります。


# 実装
今回は幾つかのコントロールポイントを持つラインを作成します。
ラインは横に伸び、先頭のコントロールポイントが画面タッチの位置を追従します。
それによって、ラインがアニメーションするというものです。


### コントロールポイントを作る
ラインを制御するために、コントロールポイントを作成します。

```Swift
for var i = 0; i < 10; ++i {
  var p: Particle = Particle(center: CGPointMake(self.frame.midX, self.frame.midY))
  var vx: CGFloat = Math.randomBetweenNumbers(0.0, secondNum: 0.0)
  var vy: CGFloat = Math.randomBetweenNumbers(0.0, secondNum: 0.0)
  p.setVelocity(vx, y: vy)
  self._particles.append(p)
}
```

### updateの実装
self._targetはCGPointインスタンスで、ここに画面タッチ時の座標を入れます。

```swift

var dx:CGFloat = self._target.x - self._particles[0].position().x
var dy:CGFloat = self._target.y - self._particles[0].position().y
        
self._particles[0].setVelocity(dx * 0.1, y: dy * 0.1)
self._particles[0].update()
        
var max = self._particles.count
for var i = 1; i < max; ++i {
  var old = self._particles[i - 1] as Particle
  var dx: CGFloat = old.position().x - self._particles[i].position().x
  var dy: CGFloat = old.position().y - self._particles[i].position().y
  self._particles[i].setVelocity(dx * 0.1 + 5, y: dy * 0.05)
  self._particles[i].update()
}
```

### drawの実装
ラインを描画します。今回は二次曲線のメソッドを利用します。

```Swift
var max = self._particles.count - 1
var path: UIBezierPath = UIBezierPath()
path.moveToPoint(self._particles[0].position())
for var i = 1; i < max; ++i {
  var p2: Particle = self._particles[i] as Particle
  var p3: Particle = self._particles[i + 1] as Particle
  var cx2: CGFloat = (p2.position().x + p3.position().x) / 2
  var cy2: CGFloat = (p2.position().y + p3.position().y) / 2
  path.addQuadCurveToPoint(CGPointMake(cx2, cy2), controlPoint: p2.position())
}
path.lineWidth = 1
path.stroke()
```

エンドポイントは

エンドポイント = (次のコントロールポイント座標 + 現在のコントロールポイント) / 2

で計算します。

以上です。
SNMPWALKでLLDP情報を取得した結果



自分用のログとして。
LLDPのsnmpwalkの実行結果を貼り付けておく。

<pre>
[root@localhost ~]# snmpwalk -v 1 -c public 192.168.0.1 .1.0.8802.1.1.2.1.4.1.1
iso.0.8802.1.1.2.1.4.1.1.4.0.60.20 = INTEGER: 4
iso.0.8802.1.1.2.1.4.1.1.5.0.60.20 = Hex-STRING: 00 11 22 33 44 55
iso.0.8802.1.1.2.1.4.1.1.6.0.60.20 = INTEGER: 3
iso.0.8802.1.1.2.1.4.1.1.7.0.60.20 = Hex-STRING: 66 77 88 99 AA BB
</pre>


<pre>
[root@localhost ~]# snmpwalk -v 1 -c public 192.168.0.2 .1.0.8802.1.1.2.1.4.1.1
iso.0.8802.1.1.2.1.4.1.1.4.0.1.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.4.0.4.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.4.0.5.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.4.0.6.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.4.0.24.1 = INTEGER: 4
iso.0.8802.1.1.2.1.4.1.1.5.0.1.1 = STRING: "test.sv"
iso.0.8802.1.1.2.1.4.1.1.5.0.4.1 = STRING: "Cat2900XL-1-1"
iso.0.8802.1.1.2.1.4.1.1.5.0.5.1 = STRING: "Cat2900XL-1-1"
iso.0.8802.1.1.2.1.4.1.1.5.0.6.1 = STRING: "Cat2900XL-1-2"
iso.0.8802.1.1.2.1.4.1.1.5.0.24.1 = Hex-STRING: 00 11 22 33 44 55
iso.0.8802.1.1.2.1.4.1.1.6.0.1.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.6.0.4.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.6.0.5.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.6.0.6.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.6.0.24.1 = INTEGER: 7
iso.0.8802.1.1.2.1.4.1.1.7.0.1.1 = STRING: "FastEthernet0/2"
iso.0.8802.1.1.2.1.4.1.1.7.0.4.1 = STRING: "FastEthernet0/2"
iso.0.8802.1.1.2.1.4.1.1.7.0.5.1 = STRING: "FastEthernet0/4"
iso.0.8802.1.1.2.1.4.1.1.7.0.6.1 = STRING: "FastEthernet0/9"
iso.0.8802.1.1.2.1.4.1.1.7.0.24.1 = STRING: "24"
</pre>
char2vecを作ってみた

日本語は漢字の数が多いので、単語単位ではなく文字単位でベクトル表現しても意味のある結果が得られるのでは？ということで、char2vecを作ってみました。

https://github.com/koji-ohki-1974/char2vec

オリジナルのword2vecはこちら
https://code.google.com/p/word2vec/


ウィキペディアで学習した結果でうまくいったものを載せます。

####■文字の類似性（distance)
```
Character: 私  Position in vocabulary: 860

      Character  Cosine distance
------------------------------------------------------------------------
         僕             0.546389
         俺             0.474454
         噂             0.473720
         ち             0.462748
         独             0.451800
         孫             0.448622
         昔             0.444323
         誰             0.422753
         彼             0.420957


Character: 犬  Position in vocabulary: 1319

      Character  Cosine distance
------------------------------------------------------------------------
         猫             0.727828
         羊             0.590153
         狐             0.575378
         牛             0.561064
         虎             0.543004
         猿             0.527262
         鬼             0.521105
         蛇             0.514800
         狼             0.508942


Character: 愛  Position in vocabulary: 493

      Character  Cosine distance
------------------------------------------------------------------------
         略             0.408893
         識             0.399666
         唄             0.382650
         夢             0.378747
         名             0.378549
         能             0.374202
         許             0.372498
         児             0.367996
         恵             0.351598


Character: 夢  Position in vocabulary: 1153

      Character  Cosine distance
------------------------------------------------------------------------
         闇             0.671510
         涙             0.648715
         恋             0.640480
         虹             0.625041
         瞳             0.606751
         僕             0.606210
         絆             0.567457
         夜             0.554111
         魂             0.553650

```

####■類推(analogy)
男→父⇒女→
母

東→右⇒西→
左

花→桜⇒木→
柳

冬→雪⇒夏→
雨
Androidのレイアウトでやりがちなこと 〜 FrameLayoutの時に気をつけること

Androidアプリの開発初学者が苦戦することのひとつに挙がるのは、やはりレイアウトだと思います。思ったところにボタンが行かなかったり、クシャッと潰れてしまったり……。

ここでは、開発しながらわかってきたことをまとめようと思います。 
特に、今回は、FrameLayoutを使用するときに気をつけることをまとめます。

- 画面やレイアウトのサイズと、配置するUIのサイズ
- layout-gravityとgravity
- marginとpadding

また、今回の内容で参考になった資料がこちらです。
[SlideShare | 【第4回】デザイナーがコードから読み解く、Androidアプリのデザインの幅を広げるコツとTips](http://www.slideshare.net/toooommmmmmmmy/4androidtips-14883482)


# 画面やレイアウトのサイズと、配置するUIのサイズ

FrameLayoutは、UIを重ねて配置することのできる便利なレイアウトです。このレイアウトで特に気をつけなければいけないのが、FrameLayoutの持っているサイズと、配置するUIのサイズです。

FrameLayoutは基本的に、**フレームの中の指定した場所にUIを置くだけ**です。LinearLayoutのように、UIのサイズを調整することはしてもらえません。つまり、フレームの幅の半分以上の幅を持ったUIを2つ横並びに配置すると、UI同士が重なり、みっともないことになります（テキストがダブって表示される、ボタンの一部が隠れるなど）。高さ方向についても、同様です。

これが顕著に感じられるのは、画面の向きを縦や横にした時。一方のレイアウトを定義しない場合は、向きを変えてUIが重ならないかをチェックすることをおすすめします。

# layout-gravityとgravity

これはどのレイアウトにも共通することですが、layout-gravityとgravityを適切に設定することです。

レイアウトで指定できるパラメータに、「layout-」から始まるものがあります。これは、「配置先のレイアウトに対して」という意味合いがあります。

たとえば、layout-gravityをrightに設定すると、
配置された先のレイアウトに右寄せでUIが配置されます。幅をもったTextViewを配置した場合、左から文字が始まるので、画面の中途半場な位置からテキストが始まったりします。

一方、gravityは、「自分の持っているViewに対して」設定するgravityです。たとえば、Layoutにgravityをrightで設定すると、その中にある全てのUIに対して、右寄せを設定することができます。幅を持ったTextViewにgravityをrightに設定すると、文字が右寄せになります。

# marginとpadding

余白という意味では、marginもpaddingも同じなのですが、それぞれ用途は異なります。

marginは、自分以外の他のViewに対しての余白。
paddingは、自身のコンテンツに設定する余白。

同じ余白なのですが、他のViewを離れさせるか、自分を小さくするか、意味は異なります。

### おわりに

後半2つは他のレイアウトにも共通する話題でしたが、私がFrameLayoutを使う際に気をつけるようになったことは以上です。FrameLayoutは、使い方がわかると、つい多用してしまいがちです。用途に応じて、適切なレイアウトを選ぶようにしたいですね。
技術英語 > 名詞的動名詞はdoと結びつきやすい > do the shopping / do all the talking

引用: 冠詞マスター教本 by 石井隆之さん

> 名詞的動名詞は do という動詞と結びつきやすいんですよ。
...
I will do some reading today.
...
The woman did all the cooking and the man did all the talking.

<hr>

githubで使用例を検索したが関係ないのしか見つからなかった。

コーディングで関連しそうな使い方としては以下のようなものだろうか。

I did some coding during the last holiday.
Spring Bootでコマンドラインアプリを作る時の注意点

次の点に注意しましょう。

- spring-boot-starter-webは使わない
- 本処理の実装でCommandLineRunnerは使わない(私見)

# spring-boot-starter-webは使わない

コマンドラインアプリを作る時にpom.xmlのdependencyにspring-boot-starter-webを使ってはいけません。

spring-boot-starter-webを使ってしまうと、自分ではコマンドラインアプリを作ってるつもりでも、起動するとWebサーバーが立ち上がってしまいます。ログを注意して見ればWebサーバーを起動しているのがわかるはずです。

コマンドラインアプリケーションの場合は`spring-boot-starter`を使いましょう。

pom.xmlの雛形は次のようになります。

```pom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.2.5.RELEASE</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

```


# 本処理の実装でCommandLineRunnerは使わない(私見)

***※これは個人的な見解で、はっきりと断定できるものではありません。***

よく見かけるサンプルでは、メインクラスを`CommandLineRunner`の実装クラスとして作成して、runメソッドにアプリの本処理を書いています。
自分も最初はこういう作り方をするものだと思ってました。

```Application.java
@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args) {
        System.out.println("main()");
        SpringApplication.run(Application.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        System.out.println("処理開始");
        //アプリの処理
        System.out.println("処理終了");
    }
}
```

しかし、この使い方だとJUnitを使う時に問題が生じます。

次のような空のテストメソッドを作成して実行してみます。

```ApplicationTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTest {
    @Test
    public void test() {
    }
}
```

```:実行結果
:
処理開始
処理終了
:
```


なんということでしょう。呼び出してもいないアプリの本処理が実行されてしまうではありませんか。
これではRepositoryクラスなどのコンテナからインスタンスを取得してテストするケースで毎回本処理が実行されてしまい、厄介なことになります。

なので、本処理の実装にCommandLineRunnerを使うのはやめて、次のようにmainメソッドから本処理を自分で呼び出すようにしましょう。

```Application.java
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        System.out.println("main()");
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args)) {
            Application app = ctx.getBean(Application.class);
            app.run(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void run(String... args) throws Exception {
        System.out.println("処理開始");
        //アプリの処理
        System.out.println("処理終了");
    }
}
```

ちなみにSpringBootのドキュメントには次のように書かれています。

[22.6 Using the CommandLineRunner](http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features-command-line-runner)
> If you want access to the raw command line arguments, or you need to run some specific code once the SpringApplication has started you can implement the CommandLineRunner interface. The run(String…​ args) method will be called on all Spring beans implementing this interface.

CommandLineRunnerを使うのは、

- コマンドライン引数を参照したいとき
- 起動時に一度だけ実行したい処理があるとき

と書いてあり、どちらかというと補助的な処理を実装するのが目的のように読み取れます。
new/delete演算子の対応付け

通常のnew/delete(an usual (de)allocation function)には以下の書き方があります。

```
void* operator new(std::size_t);
void operator delete(void*);
void operator delete(void*, std::size_t);
```

deleteには二通りの書き方がされていますが、両方書かれた場合は上のものが優先されます。

配置new/delete(a placement (de)allocation function)は上の物に引数を足したものを総称して言うものです。

```
void* operator new(std::size_t, ...); // 第二引数以降は何でもいいけど、１つ以上は必要
void operator delete(void*, ...); // 同上
```

配置deleteは聞き慣れないかもしれないので、ここで説明しておきます。
通常、newを呼び出して領域の確保に成功したもののコンストラクタで例外が発生した場合、自動でdeleteが呼び出され、領域が解放されます。(デストラクタは呼ばれません。)これは、配置newでも同じで、配置newの場合は同じシグニチャの配置deleteを呼ぼうとするのです。
従って、対応するdeleteがなければ、deleteが呼ばれず、解放処理が行われません。（配置newでは領域を確保するとは限りませんが、明示的に空のdeleteを用意することが望ましいです。）

```
struct something
{
  something() {}

  static void* operator new(std::size_t n, void* place)
  {
    return ::operator new(n, place);
  }
  static void operator delete(void*, void*);
};
```

このようなクラスを書き、newするとdeleteが定義されていないと怒られます。コンパイラの作るnew構文内の例外ハンドラでdeleteが参照されている証拠ですね。ちなみに、コンストラクタをnoexceptに指定すると最適化で例外ハンドラが消滅し、deleteが参照されなくなってコンパイルが通ったりするかもしれません。

ここで、`void* operator new(std::size_t, std::size_t);`を定義し、さらに`void operator delete(void*);`がなく、`void operator delete(void*, std::size_t);`のみが定義される場合、deleteが通常とも配置とも受け取れるためにill-formatとなります。


参考
>結構誤字がひどい。
>[これだけ読めば全部がわかるC++のoperator new/deleteオーバーロードの注意点](http://cflat-inc.hatenablog.com/entry/2014/01/28/214820)
Xcode Info.plistのローカライズ画面は何処

ローカライズ設定をネットで調べると、project選択後のInfo画面がでてくるのですが、
自分の環境では、見つけられなかったんです。（画面が違うように見えた）
てっきりXcodeのバージョンの差と思っていて諦めかけましたが、ネットで困っている方々がいなかったので何か間違ってると思い、Xcodeの中で探しました。

環境
Xcode 6.4

勘違いの始まり
![info0.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/d9821cef-243c-4db6-a7c5-e1020e9d9f4c.jpeg)
見つけてからわかったのですが、これはTargetのInfoなんですね。

本物は、
![info1.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/87824e1e-4ff3-aeb8-49c2-e88e7714f0f0.jpeg)
![info2.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/be5f4365-fc0a-b38d-deb2-a48341310409.jpeg)
ここに隠れていたんですね
![info3.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/1a0567d0-22c5-7ae9-7ee4-7931500a3152.jpeg)

ちゃんちゃん
rake db:seedのようなことをPhoenixFrameworkでもやりたい！


出来るさ、seed.exsならね。
というわけで、今回は初期データをDBに突っ込むことが出来る`rake db:seed`をPhoenixFrameworkでもやってみようとおもいます。

## やり方

`rake db:seed`の時は`db/seeds.rb`がありましたが、Phoenixには`prev/repo/seed.exs`というファイルがあります。

```elixir:seed.exs
# Script for populating the database. You can run it as:
#
#     mix run priv/repo/seeds.exs
#
# Inside the script, you can read and write to any of your
# repositories directly:
#
#     TestApi.Repo.insert!(%SomeModel{})
#
# We recommend using the bang functions (`insert!`, `update!`
# and so on) as they will fail if something goes wrong.
```

ここに書かれているように、insert処理を書いて`mix run priv/repo/seeds.exs`を実行すれば初期データが突っ込まれます。

では、試しにTestApiプロジェクトにHogeモデルが存在すると仮定してinsert処理を書いてみましょう。

```elixir:seed.exs
TestApi.Repo.insert!(%Hoge{
  name: "HOGE"
})
```

これで`mix run priv/repo/seeds.exs`を実行すればHogeモデルに対応したテーブルにデータが追加されます。

## 応用編

それでは一歩進んだやり方として、`alias`を使いつつ多次元連想配列をinsertしましょう。

```elixir:seed.exs
// エイリアス
alias TestApi.Hoge
alias TestApi.Repo

// 多次元連想配列
initial_hoges = [ 
    [   
        {:name, "Hoge"},
        {:info, "Programming Slang in Japanese."}
    ],  
    [   
        {:name, "Fuga"},
        {:info, "Programming Slang in Japanese."}
    ],  
    [   
        {:name, "Foo"},
        {:info, "Programming Slang in Foreign countries."}
    ],  
    [   
        {:name, "Bar"},
        {:info, "Programming Slang in Foreign countries."}
    ] 
]

// ループ処理
for initial_hoge <- initial_hoges do
    Repo.insert!(
        %Hoge{
            name: initial_hoge[:name],
            info: initial_hoge[:info]
        }   
    )   
end
```

このように`alias`を使えば簡潔に書くことが出来、多量のインサートデータがあったとしても多次元配列にすればループ処理で簡単にinsertさせることが出来ます。

まだ他にも色々な記述方法があると思いますので、色々と試してみてください。
PhoenixFrameworkでREST APIを作ってみよう


PhoenixFrameworkでは簡単にREST APIを作成することが出来ます。
簡単なやり方ですが、一つ間違えば`mix test`で盛大にコケるので、備忘録として書いておきます。

## やり方

Phoenixのプロジェクト作成から順にやっていきます。

```
$ mix phoenix.new test_api
$ mix ecto.create
$ mix phoenix.gen.json Hoge hoge name:string
```

次に`web/router.ex`を編集しましょう。

```elixir:router.ex
  # Other scopes may use custom stacks.
  # ↓のコードはデフォルトでコメントアウトになっているので外しましょう
  scope "/api", TestApi do
    pipe_through :api
    resources "/hoge", HogeController, except: [:new, :edit] # 追加
  end 
```

最後に`migrate`をしてから`mix test`してみましょう。

```
$ mix ecto:migrate
$ mix test
```

これでテストがコケなければOKです。

ここから更に、`/api/v1/hoge`などAPIのバージョニングする時は以下の記事が参考になります。
[Phoenix でバージョニングした REST API を構築する](http://fiveteesixone.lackland.io/2015/08/05/building-a-versioned-rest-api-with-phoenix/)
（Thanks for WAKASUGI！）
angular-simple-bemというライブラリを作った

ngRepeatばりのオレオレ記法でbemを楽に書けるようにしたライブラリです。
レポジトリ: [ukyo/angular-simple-bem](https://github.com/ukyo/angular-simple-bem)

# Install and Setup

bower

```
bower install --save angular-simple-bem
```

```js
angular.module('your-module', ['angular-simple-bem']);
```

npm

```
npm install --save angular-simple-bem
```

```js
angular.module('your-module', [require('angular-simple-bem')]);
```


# Usage

上: ソース、 下: 展開後

## Nest block or element

`__foo`で親要素のブロックを辿ってネスト。
 
```html
<div bem="block">
  <div bem="__elem1">
    <div bem="__elem2">nest block or element</div>
  </div>
</div>
```

```html
<div bem="block" class="block">
  <div bem="__elem1" class="block__elem1">
    <div bem="__elem2" class="block__elem1__elem2">nest block or element</div>
  </div>
</div>
```

## Modifier

いつも通り書けるが、`--mod1,mod2`のようにカンマ区切りで書ける。

```html
<div bem="block--mod">
  <div bem="__elem--mod1,mod2">modifier</div>
</div>
```

```html
<div bem="block--mod" class="block block--mod">
  <div bem="__elem--mod1,mod2" class="block__elem block__elem--mod1 block__elem--mod2">modifier</div>
</div>
```

## Modifier with Binding

`--key:value`形式で`value`がtruthyなときだけmodifier付きクラスを付与。`--::`でone time binding。

```html
<div ng-init="foo = true; bar = false;">
  <div bem="block--mod1:foo,mod2:bar">modifier with binding</div>
  <div bem="block--::mod1:foo,mod2:bar">modifier with one time binding</div>
</div>
```

```html
<div ng-init="foo = true; bar = false;">
  <div bem="block--mod1:foo,mod2:bar" class="block block--mod1">modifier with binding</div>
  <div bem="block--::mod1:foo,mod2:bar" class="block block--mod1">modifier with one time binding</div>
</div>
```

## Modifier with Expression

`--(foo)`で`foo`をangularのexpressionとして評価。`--{key: value}`のようにオブジェクト形式なときは括弧省略可。`::`でone time binding有効になるが、括弧内がどうせangularのexpressionなので`--(::foo)`でもOK。

```html
<div ng-init="foo = {mod1: true}; bar = true;">
  <div bem="block--(foo)">modifier with expression</div>
  <div bem="block--::{mod2: bar}">modifier with expression(one time binding)</div>
</div>
```

```html
<div ng-init="foo = {mod1: true}; bar = true;">
  <div bem="block--(foo)" class="block block--mod1">modifier with expression</div>
  <div bem="block--::{mod2: bar}" class="block block--mod2">modifier with expression(one time binding)</div>
</div>
```

## Animation

ngAnimateでいうところの `add`, `remove`が使える。詳しくは[AngularJS: API: ngAnimate](https://docs.angularjs.org/api/ngAnimate)を参照。

# License

MIT License
【golang】gxuiに日本語フォントを埋め込む。

# 【golang】gxuiに日本語フォントを埋め込む。

[gxui](https://github.com/google/gxui)はデフォルトフォントとしてdroid sansとroboto regularがリソース埋め込みされています。
ただ、これらはCJKフォントではないのでそのまま日本語を表示できず、
アプリ側で動的にロードするのも面倒なので、試しにライブラリに日本語フォントを追加してみました。
※Windows10でのみ動作確認済み。

## 表示サンプル
![](https://i.gyazo.com/f5d40b765ee274dc30557fd881a2c42e.png)

## 埋め込み手順
0. ファイル「$GOPATH/src/github.com/google/gxui/gxfont/mkfont.go」にフォントのリポジトリURLを追記。
1. mkfontを実行して各フォントのgoソースを生成。
2. ファイル「$GOPATH/src/github.com/google/gxui/gxfont/gxfont.go」のフォント指定を追加フォントに差し替え。
3. gxui.aの再ビルド。

## 利用コードサンプル
```
//$GOPATH/src/github.com/google/gxui/samples/file_dlg/main.go

func appMain(driver gxui.Driver) {
	theme := flags.CreateTheme(driver)

	font, err := driver.CreateFont(gxfont.Default, 18)
	if err != nil {
		panic(err)
	}
	theme.SetDefaultFont(font)

	window := theme.CreateWindow(800, 600, "Open file...")
```

## 備考
* 触り程度しか確認してませんが、WindowsでのIME日本語入力はソース変更無しに受付可でした。
 * カーソルキャレット位置の半角全角の識別も可。
PuLPを使った線形計画法(Linear Programming)

カーネルやら何やらを理解するために、非線形計画法を勉強中。
で、その前に線形計画法で実際に手を動かしたくなったので無償で使えるPuLPを使ってみた。

今回例題として解いたのは[「これならわかる最適化数学」](http://www.amazon.co.jp/dp/4320017862)の第6章、線形計画法。


似たような例題がいくつか並ぶので、ピックアップしてPuLPでモデル化してみた。


####【例題6.2】(P161)
2種類の容器A,Bを作るのに, 機械M1,M2を使う. 容器Aを1個作るのにM1を2分, 機械M2を4分使う必要がある.一方,容器Bを1個作るのに、機械M1を8分,機械M2を4分使う必要がある. 容器A,Bを作る利益は一つあたりそれぞれ29円,45円である. 利益を最大にするにはどのように計画すれば良いか.


利益を目的関数f、容器の個数をそれぞれx,yを問いてモデル化すると式は下記のようになる。
制約条件:
2x + 8y <= 60
4x + 4y <= 60
x >= 0, y >= 0

目的関数：
f = 29x + 45y → max
 

で、これらの式をそのまんまPuLPに突っ込んで解かせるコードが下記。
今回は容器の個数を求めるので、解は整数であり、変数はIntegerで指定する。

```python
#Creat variables
x = pulp.LpVariable("x", cat = "Integer")
y = pulp.LpVariable("y", cat = "Integer")

#Create object function
problem = pulp.LpProblem("Container", pulp.LpMaximize)
problem += 29*x + 45*y  #(6.6)

#constrained condition
problem += 2*x + 8*y <= 60 #(6.4)
problem += 4*x + 4*y <= 60 #(6.4)
problem += x >= 0 #(6.5)
problem += y >= 0 #(6.5)

status = problem.solve()
print "Status", pulp.LpStatus[status]

print problem

print "Result"
print "x", x.value()
print "y", y.value()
```

結果は、

```python
Status Optimal
Container:
MAXIMIZE
29*x + 45*y + 0
SUBJECT TO
_C1: 2 x + 8 y <= 60
_C2: 4 x + 4 y <= 60
_C3: x >= 0
_C4: y >= 0

VARIABLES
x free Integer
y free Integer

Result
x 10.0
y 5.0
```


####【例題6.3】(P161)
2種類の金属M1,M2を用いて2種類の合金A,Bを作る. 合金A,Bはそれぞれ1トン当たり30,000円、25,000円の利益がある。合金Aは金属M1,M2を1:1の割合で混合し、合金Bは金属M1,M2を1:3の割合で混合する。金属M1,M2はそれぞれ1日当たり10トン,15トンの供給が可能である. 利益を最大にするのに合金A,Bを作るにはどのように計画すればよいか.

モデル化すると、
制約条件:
0.5x + 0.25y <= 10
0.5x + 0.75y <= 15
x >= 0, y >= 0

目的関数：
f = 30x + 25y → max


今回はコード化にあたり、解は連続値であるので、変数はContinuousで指定する。

```python
#Creat variables
x = pulp.LpVariable("x", cat = "Continuous")
y = pulp.LpVariable("y", cat = "Continuous")

#Create object function
problem = pulp.LpProblem("Alloy", pulp.LpMaximize)
problem += 30*x + 25*y  #(6.9)

#constrained condition
problem += 0.5*x + 0.25*y <= 10 #(6.7)
problem += 0.5*x + 0.75*y <= 15 #(6.7)
problem += x >= 0 #(6.8)
problem += y >= 0 #(6.8)

status = problem.solve()
print "Status", pulp.LpStatus[status]

print problem

print "Result"
print "x", x.value()
print "y", y.value()
```

結果は、

```python
Status Optimal
Alloy:
MAXIMIZE
30*x + 25*y + 0
SUBJECT TO
_C1: 0.5 x + 0.25 y <= 10
_C2: 0.5 x + 0.75 y <= 15
_C3: x >= 0
_C4: y >= 0

VARIABLES
x free Continuous
y free Continuous

Result
x 15.0
y 10.0
```


####【例題6.7】(P164)
今回の例のように目的関数が発散して、最適解が存在しない場合は下記のように、"Status Unbounded"と表示される。

制約条件:
-x - y <= -1
-2x + y <= 1
x - 2y <= 1
x >= 0, y >= 0

目的関数：
f = x + y → max

```python
#Creat variables
a = pulp.LpVariable("a", cat = "Continuous")
b = pulp.LpVariable("b", cat = "Continuous")

#Create object function
problem = pulp.LpProblem("Test", pulp.LpMaximize)
problem += a + b  #(6.16)

#constrained condition
problem += -a - b <= -2 #(6.14)
problem += -2*a + b <= 15 #(6.14)
problem += a - 2*b <= 15 #(6.14)
problem += a >= 0 #(6.15)
problem += b >= 0 #(6.15)

status = problem.solve()
print "Status", pulp.LpStatus[status]

print problem

Status Unbounded
```
ルートとなるfont-sizeはhtmlへ?, bodyへ?

自分は``html``か``body``両方へfont-sizeを指定してしまうことが多い。
本当はそれで良いのか ?

```css
html,
body {
  font-size: 14px;
}
```

こういった細かな仕様がわからないので自分はにわかCSSerっぽい

## 結論

__htmlにのみ基本となるfont-sizeは指定する__

たとえば単位のremはhtmlを見ている。

[Font Size Idea: px at the Root, rem for Components, em for Text Elements](https://css-tricks.com/rems-ems/)
ちなみにサンプルコードみるとdevice-widthを見てルートのfont-sizeを
調整するなど細やかなことやってて感動する。

## 指定例

htmlに``10px``指定で、bodyに全体の基本となる``14px``をrem指定し、他要素へフォントサイズを継承
見出し等で設定させたい場合はhtmlを基準にrem指定すると良いんじゃないでしょうか。

```css
html {
  font-size: 10px;
}

body {
  font-size: 1.4rem;
}

.heading {
  font-size: 1.6rem;
}
```

ここでhtml,body共に14px指定してしまうと、あらためてremで計算する際に非常に面倒

## 疑問

bodyに``62.5%``する方法が一般的っぽくてちゃんと比較したい。
[簡単に em に換算するために、body の font-size を 62.5% に設定](http://weblog.masakiyoshida.com/memo/easy-em-convert-font-size-setting/)

あと海外の記事探るとhtmlへ``62.5%``やってる例もある。
とりあえず%指定のほうがブラウザやデバイスへの柔軟性、という面で良いっぽい。


気になってコード書いてみたましたが、html,body両方にfont-size指定をすると優先されるのは当然ですがhtmlです
[サンプルコード](http://codepen.io/8845musign/pen/PPZoOo)
※ Chrome最新版で確認

そもそも実案件ではIE8対応でremとか使えないとか闇っぽいです
僕が（一部を）考えた公平なガチャシステム

> 新しい手法を開発しました。
> [僕が（ほとんどを考えた）公平なガチャシステム](http://qiita.com/yyu/items/90db09c57514758bd68c)

# はじめに

ソーシャルゲームのガチャは、あらかじめ運営からSSRなどのレアリティに基づいた出現確率が公表されているが、それはあくまで運営が公表した値でしかなく、本当にその通りなのか疑う余地があった。そこでこの記事では[前回の記事](http://qiita.com/yyu/items/c342c3c90ac78f26d5e1)で紹介したハッシュの衝突に基いて、ユーザーにとっても運営にとってもガチャによるカードの出現確率が明らかな方法を提案する。何か質問や意見などがあれば、気軽にコメントして欲しい。

# プロトコル

この計算量を利用した方法はどこかのCTFで出題されたと友人から聞いて、それを使っている。

## 日本語による手順

1. 運営はカードとそれに対応する**マスク**を公開する。このマスクは$n$ビットで構成されていて、カードの種類と一対一に対応している。このマスクはSSRなど希少なカードほど1のビットが多く、Nなどありがちなカードほど0が多くなるようにしておく。
2. ユーザーがガチャを引こうとすると、アプリケーションがサーバーへそのことを通知する
3. サーバーは、無作為な文字列**A**と$n$ビットのデータ**B**をデータベースへ書き込み、**A**と**B**をアプリケーションへ送信する
4. アプリケーションは**A**に任意の文字列を追加して、文字列**C**を生成する
5. アプリケーションは文字列**C**のハッシュ値を計算し、**B**とのAND（論理積）を計算し、それを**D**とする
    - $D = B\, \\&\, hash(C)$
6. アプリケーションは**D**に対応する**マスク**を持つカードを表示し、**A**と**B**と**C**をサーバーへ送信する
    - もし**D**に対応する**マスク**が一つもない場合は（4）からやりなおす
7. サーバーは次のことを検証する
    - サーバー側のデータベースに**A**と**B**が記録されているか
    - 文字列**C**の中に**A**が含まれているか
7. サーバーは**C**からアプリケーションと同じように**D**を計算する
    - $D = B\, \\&\, hash(C)$
8. サーバーは**D**と同じ**マスク**を持つカードをユーザーに与える
    - もし**D**に対応する**マスク**が一つもない場合はエラーを返す
9. データベースから**A**と**B**を削除

## シーケンス図

https://gist.github.com/yoshimuraYuu/95b4d8134e283ddeb920
![diagram-4885526936437794416.png](https://qiita-image-store.s3.amazonaws.com/0/10815/ec9bb04b-495a-36f2-27a2-09f4e32b76e3.png)

# レアリティの操作

ソーシャルゲームの多くはレアリティがSSRだと1%、Nだと50%などと決められている。このような確率を表現する手段として、**マスク**の立っているビットの量を使う。例えば**マスク**で立っているビット数が1つであれば、ユーザーにとって**C**を求めるのが容易になるし、一方で$n$に近い数であれば**C**を求めるのは困難になる。このように、ハッシュ値を計算する試行回数を利用して、レアリティを操作することができる。

# 公平性

これのポイントは、ガチャを**サーバーが生成した（と思われる）乱数**から**ハッシュ値の衝突確率**という問題に切り替えたことだと思う。こうすることで、不透明なサーバー内でのガチャ処理を行わずに、透明なハッシュ値によるガチャを行うことができる。ユーザーは、サーバーにデータを送る前に自分が引いたガチャの結果を知ることができるし、もしサーバーで検証して自分で確かめた結果と異なる場合は、どちらが悪いのか確かめることができる。
また、これは計算の直前に**A**を与えている。これがソルトのような役割を果すので、あらかじめ大量に計算するのは無駄と思われる。

# 課金

ユーザーが課金した場合、多くのゲームは無課金のガチャに比べてレアカードの出現率が高くなる。このような処理は、ユーザーのIDに課金情報を持っておいて、課金状態やガチャの種類によって**マスク**の一覧を変えればいい。ただし、これら**マスク**は全てユーザーに公開されている必要がある。

# データ**C**の販売

業者などが介入した場合、業者は**A**と**B**を入手した後、ハッシュ値を求めるための高性能なコンピューターやハードウェアを用いて、高速に**C**を計算し、それをオークションなどで売りさばく可能性がある。これを防ぐためには次の手順を実行すればよい。

1. **A**と**B**をサーバーが発行する際に、データベースへユーザー情報を保存する
2. アプリケーションが**C**を送る際、ユーザー情報をともに送信する
3. サーバーはデータベースからユーザー情報を取得し、それと送信されたユーザー情報を検証する
bower経由でインストールしたbootstrapをbrunchを用いて使えるようにする


Phoenix frameworkを使ったことがある人なら見たことがあるであろう[brunch](http://brunch.io/)。
今回はこのbrunchでbower経由でインストールしたbootstrapを使えるようにしようという話になります。
例としてPhoenix framework上で動作するようにしてみるという前提で書いていきます。

## はじめに

`brunch-config.js`の`files`フィールドは初め以下のようになっていると思いますが、

```brunch-config.js
  files: {
    javascripts: {
      joinTo: 'js/app.js'
    },  
    stylesheets: {
      joinTo: 'css/app.css'
    },  
    templates: {
      joinTo: 'js/app.js'
    }   
  },
```

これの`joinTo`に`vendor.js`・`vendor.css`を加え、`bower_componets`を参照するようにしましょう。

```brunch-config.js
  files: {
    javascripts: {
      joinTo: {
          'js/app.js': /^(web\/static\/js)/,
          'js/vendor.js':  /^bower_components/
      },  
    },  
    stylesheets: {
        joinTo: {
          'css/app.css': /^(web\/static\/css)/,
          'css/vendor.css':  /^bower_components/
        }   
    },  
    templates: {
        joinTo: 'js/app.js'
    }   
  },
```

これでbower_componentsにあるjs、cssを参照して`vendor.js`・`vendor.css`に結合してくれるようになりました。

しかし、bootstrapの場合これでは動かない箇所があります。

## 何が動かないのか

それはbootstrapのディレクトリ内にある`fonts`にあたる箇所です。
例えばglyphiconなどですね。

では、どうすればbrunchを使って動くようにできるでしょうか？
答えは簡単でプラグインを使いましょう！

## brunchのプラグイン

brunchには様々な機能を補填するためにプラグインが作れるようになっています。
[このページ](http://brunch.io/plugins.html)を見れば存在する代表的なプラグインが一覧で見れます。
プラグインをbrunchに組み込むことでTypeScriptなどのプリコンパイルや、SASSやLESSなどの対応も可能になります。

で、今回は`after-brunch`を使いましょう。
この`after-brunch`はbrunchによる処理の終了後に行いたい処理を実行させることが出来るプラグインです。

## after-brunchを使う

まずは、プラグインのインストールから行いましょう。

```
$ npm install --save after-brunch
```

そして、`brunch-config.js`を編集します。
今度は`plugins`フィールドに追加していきます。

```
  plugins: {
    babel: {
      // Do not use ES6 compiler in vendor code
      ignore: [/web\/static\/vendor/]
    }
    // 追加
    afterBrunch: [
      'mkdir -p priv/static/fonts', // fontsディレクトリを作成して
      'cp -f bower_components/bootstrap/dist/fonts/* priv/static/fonts', // bower_componentsからfontsディレクトリにをコピーする
    ]    
  },
```

このように、`after-brunch`を使って直接fonts内のフォントを移動させてあげるという形になります。
その他にも色々な用途に使える便利なプラグインになっています。


これでglyphiconも使えるようになり、bootstrapの全機能を使うことができるはずです。
この他にもプラグインには様々な便利なプラグインがあるので、是非ともbrunchを使う前に一度覗いてみてください。
※僕はlessプラグインやsassプラグインなど使っています:)
AWS CLIのレスポンス処理は jq 使う前に --query オプションの利用を考えてみよう！

# AWS CLIのレスポンス、どう処理してますか？:scroll:

AWS CLIの各種コマンドは特に指定しなければ、レスポンスがJSONフォーマットで返ってきますよね。
なので皆さんその中から情報探そうとした時に、 `jq` とかをインストールして使ってたりすることが多いです。

でも、 `jq` ってLinux標準のコマンドじゃないしわざわざインストールしないといけなかったりして、
そのためだけにAMI作ったりしないといけないなんて事になると非常に面倒くさかったりします。

# そこで `--query` オプション！:angel:

はい、そういうわけで、ほぼすべてのAWS CLIに利用できる標準オプションの `--query` を利用して、
ほとんど `jq` と遜色ない程度のフィルタリングを実現しちゃいましょう！

## メリット

まず最初にこれを使うことのメリットとして、

- AWSコマンドが使えるならインストール等不要で必ず使える。
- ので、独自にAMIとか作る必要もない。
- AWS CLIの `--output` が `json` でなくともちゃんとフィルタリングできる。

などなど、上記の欠点をすべて解消しちゃいます！:sparkles:

## 実際の使い方

基本的には `--query` に続いてクエリ文字列をJMESPath[^1]でつけるだけです。
例えばElasticBeanstalkのAutoScalingGroup名から、そのASGにぶら下がっているインスタンスの一覧をスペース区切りで出力させるには以下のようにします。

[^1]: 詳しくは [【個人メモ】JSONのパースにjmespathを使ってみよう - Qiita](http://qiita.com/futoase/items/320f408ae1cfff6dd6da) を参照

```bash:ASGからその配下のインスタンス一覧を取得する
aws --output text autoscaling describe-auto-scaling-instances \
  --query 'AutoScalingInstances[?AutoScalingGroupName==`awseb-e-hogehoge-stack-AWSEBAutoScalingGroup-FUGAFUGA`].InstanceId'
```

上記で、 `awseb-e-hogehoge-stack-AWSEBAutoScalingGroup-FUGAFUGA` *という名前のAutoScalingGroupにぶら下がっているすべてのインスタンスをスペース区切りで出力する* という意味になります。

どうしてスペース区切りで取れるのかというと、AWS CLIのオプションに `--output text` を指定しているからです。
こうしておくと、このコマンドの戻り値を*シェルの配列として直接変数定義*することができちゃいます！
`--output text` をつけた時点で、返ってくるフォーマットがTSV形式になってしまうので
`jq` では処理できず、こんなに簡単にはいきませんよね:relaxed:

## デメリット

一方で以下のような若干のデメリットを感じる部分もあります。

- JMESPath自体があまり浸透していない(そして結構慣れるまで大変)
- 1度のリクエストの結果(Response)を使いまわしていろんな情報を取得することができない(同じクエリで都度通信しなければならない)

特に2つ目はかなり手間の面では大きいので、こういった場合にはローカルで動く `jq` コマンドの方が向いていると言えます。

1つ目のJMESPathがあまり浸透していない件は、まぁ公式ドキュメントや[チュートリアル](http://jmespath.org/tutorial.html)も充実しているので、
ちょっと勉強すればなんとかなる反面ハマりどころも多いのと、
 `jq` 使いにはちょっと勝手が違う事もあうので `jq` に慣れちゃってると最初は戸惑うかもしれないといった程度でしょうか。

# 最後に:sake:

やはりどのコマンドでも準備なしで使えて出力フォーマットを自分で調節できる `--query` オプションは優秀だと思うので、
`jq` 使う前にまずは一度どちらがいいのか考えてみると良いかもしれませんね！
`--query` オプション、オススメです！:+1:

※ 以前は `--query` がサーバサイドで処理されると思っていましたが普通にaws-cliがデータを受け取ってから処理していたようでしたので、記事を訂正しました。
[Java1.8] java.timeを使ってBetweenを作ってみる

IntStream.range(int from,int to)のようなものがDateでもほしいなあと思い、作ってみました。

# 実装

```Java:Between.java
@ValidTrue("from < to")
public class Between<T extends Temporal & Comparable<? super T>> {
	private T from;
	private T to;

	public Between(T from, T to){
		this.from = from;
		this.to = to;
	}
	public Stream<T> each(ChronoUnit unit, UnaryOperator<T> adjuster, int skip){
		T adjfrom = adjuster.apply(from);
		while(from.compareTo(adjfrom)>0) adjfrom = unit.addTo(from, 1);
		
		long size = adjfrom.until(to, unit)/skip;

		return Stream.iterate(adjfrom, d -> unit.addTo(d, skip)).limit(size);
	}
}
```
TemporalAdjusterというのが、Temporal -> Temporalの修正変換をしてくれるのですが、これ `TemporalAdjuster<T extends Temporal>`じゃないんです・・・adjustすると型を失ってしまうので使えないという・・・・T型を復活する方法がありませんかね。
TemporalQueryを自分で作るのだろうか。

# Test

```Java:BetweenTest.java
public class BetweenTest {
	@Test
	public void test(){
		//毎日
		Between<LocalDate> between = new Between<>(LocalDate.now(),LocalDate.now().plusDays(50));
		between.each(ChronoUnit.DAYS , d -> d ,1).forEach(System.out::println);
		System.out.println("***********");

		//隔週日曜日
		between.each(ChronoUnit.WEEKS , d -> d.with(DayOfWeek.SUNDAY) ,2).forEach(System.out::println);
		System.out.println("***********");

		//毎月最終日
		Between<YearMonth> between2 = new Between<>(YearMonth.now(),YearMonth.now().plusMonths(12));
		between2.each(ChronoUnit.MONTHS , m -> m , 1  ).map( YearMonth::atEndOfMonth ).forEach(System.out::println);
		System.out.println("***********");

		//毎月第３日曜日
		between2.each(ChronoUnit.MONTHS , m -> m , 1  ).map( d -> d.atDay(1).with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.SUNDAY ))).forEach(System.out::println);
		System.out.println("***********");

		//毎年４月１日
		Between<Year> between3 = new Between<>(Year.now(),Year.now().plusYears(10));
		between3.each(ChronoUnit.YEARS, y -> y, 1).map( y -> y.atMonthDay(MonthDay.of(4, 1))).forEach(System.out::println);
	}
}
```
というわけで、いろんなTemporalのリストが作れそうです。


# 総括
考え中・・・

## 課題

* TemporalAdjuster・・・
* Day型がない
* T型を復活する方法
* `y -> y` これを書くクールなラムダ式を教えてください。

### (追加)

```java
		//毎週土曜日と日曜日
		between.each(ChronoUnit.WEEKS , d -> d.with(DayOfWeek.SATURDAY) ,1).flatMap( d -> Stream.of(d,d.plusDays(1))).forEach(System.out::println);
```
まあ、

```Java:
between.stream().filter( d -> d.getDayOfWeek()==DayOfWeek.SUNDAY ||d.getDayOfWeek()==DayOfWeek.SATURDAY)
```

みたいに全部フィルタでいいよと言われるとまあそれでもいいんですが、全日走査するより早いじゃん、と言う気分です。
OpenShiftで変更できねー

##概要
**OpenShiftで変更できない**
初回のデプロイはできるが二回目以降のデプロイに失敗するときの対応

こんなメッセージ出てます？？？
![画面.jpg](https://qiita-image-store.s3.amazonaws.com/0/29940/fef4dc57-14d5-d855-74de-4fb822116d14.jpeg)

.openshift/markers/　以下に force_clean_build という名前の空ファイルを作って再デプロイすればよろしい。

以上
configを使ってGithubに公開したくない定数や設定値を管理する


TwitterのSECRET_KEYなど、公開したくない情報はサーバー環境変数や環境変数を[dotenv](https://github.com/bkeepers/dotenv)で管理する方法がありますが、configというGemを使って設定値を管理してみました。

[railsconfig/config](https://github.com/railsconfig/config)

## configのinstall

#### 1. Gemfileに下記追加  
```
gem "config"
```
#### 2. Install  
```
rails g config:install  
```  
インストールすると環境毎に設定ファイルが作られる。

```
$ bin/rails g config:install
      create  config/initializers/config.rb
      create  config/settings.yml
      create  config/settings.local.yml
      create  config/settings
      create  config/settings/development.yml
      create  config/settings/production.yml
      create  config/settings/test.yml
      append  .gitignore
```

#### 3. 定数や設定値を記載する
公開してもいい定数はinstall時に作成されたファイルに記載すればいいが、公開したくないものに関しては下記のようにymlファイルを作成し記載します。  

```
$ vim config/settings/development.local.yml
```

```
twitter: 
  app_id: "YOUR_APP_ID"
  app_secret: "YOUR_APP_SECRET"
```

また、`config/settings.local.yml`に記載した場合もDevelopment環境で利用できるようです。

#### 4. 定数を利用する
上記の例でいうと、下記のようにデータを取得できます。

```
Settings.twitter.app_id
=> "YOUR_APP_ID"
```

#### 5. Commitし、Pushする
そのままCommitしてPushしても公開されないので便利です。
.gitignoreを見ると、末尾に下記三行が挿入されてるので、local.ymlは公開されません。

```
config/settings.local.yml
config/settings/*.local.yml
config/environments/*.local.yml
```

### 参考
* [railsconfig/config](https://github.com/railsconfig/config)
* [Railsで定数を一元管理する(config)](http://blog.hello-world.jp.net/ruby/2268/)
在 devise 創建的 user 加入自定義的欄位


用 devise 創建 User 之後，只有基本的欄位，如果要新增自定義的欄位，因為 strong parameter 的關係，必須要加入 permit 中，避免資料無法存入。

註： 表單 view 以及 model 的 migration 變更請先自行完成

### 建立 controller class

這時候先新增一個檔案： 

``` bash
touch app/controllers/users/registrations_controller.rb
```

如果沒有 users 這個資料夾，就先建立一個

``` bash
mkdir app/controllers/users
```

接著編輯檔案內容，定義 class

``` ruby:app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
end
```

### 加入想要新增的欄位

這時候，要複寫一個 method - `configure_permitted_parameters`


#### 新增 permit

在不同的表單內新增 permit ，需要各自設定在 devise_parameter_sanitizer 的 `for()` 的參數

- 註冊 - `:sign_up`
- 編輯帳號 - `:account_update`

#### 傳入欄位

在後面接上 `<<` 輸入要新增的欄位，如果只有一個，就可以直接放 `:name` 就可以；一個以上的話，就可以用陣列包起來傳入。

``` ruby
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) << [:name]
  devise_parameter_sanitizer.for(:account_update) << [:name]
end
```

### 加入 before_filter

為了要讓 devise 知道要讓這個我們定義的欄位通過，必須加入 before_filter

``` ruby
before_filter :configure_permitted_parameters
```

### Controller 最後的樣子

``` ruby:app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :name
    devise_parameter_sanitizer.for(:account_update) << :name
  end
end
```

## 導向 controller

最後，讓 devise 知道要使用我們自己新增的 registrations controller

``` ruby:config/routes.rb
devise_for :users, :controllers => { :registrations => "users/registrations" }
```

最後，重啟 `rails s` ，變更就可以生效了。
rubyでsnake_caseをCamelCaseへ変換する

コード生成とかしてる時に `_` で要素を繋いだ `snake_case` から、大文字小文字の組み合わせで単語の繋ぎ目を表現する `CamelCase` へ変換する必要に駆られる事があります。
Rails使ってればActiveRecordがなんとかしてくれるのですが、RailsばかりがRubyではありません。

書けば済む話ですが、ググってもそのものズバリのスニペットが見当たらなかったのでおいておきます。

```rb:
class String
  def to_camel()
    self.split("_").map{|w| w[0] = w[0].upcase; w}.join
  end
end
```

こう書いておくと

```
"snake_case".to_camel # => SnakeCase
```

こうなります。

ちなみに逆方向は

```rb:
class String
  def to_snake()
    self
      .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
      .gsub(/([a-z\d])([A-Z])/, '\1_\2')
      .tr("-", "_")
      .downcase
  end
end
```

こんな感じに書くらしいです。
参考URL: [Converting camel case to underscore case in ruby](http://stackoverflow.com/questions/1509915/converting-camel-case-to-underscore-case-in-ruby)
コンソールでGithubのReadme.mdを取得するコマンドを作ってみた



コマンドのヘルプを表示するには「man」を使うと便利です。

しかしmanが用意されていないコマンドも多く、まだインストールしていないツールのインストール方法などは、manでは調べることができません。
いわゆる「服を買いに行くための服がない」状態です。


というわけで、GithubのReadme.mdをコンソールから簡単に取得するコマンド「gman」を作ってみました。
これならばまだインストールしていないツールでも使い方やインストール方法をサクッと調べることができます。

~~curlでいいじゃん~~ とても便利です。


![gman](https://cloud.githubusercontent.com/assets/4569916/9836529/51cd4bf6-5a58-11e5-8712-67debb5e3ef8.gif)



## gman

コンソールで

```
 $ gman kurehajime/gman
```

と打てばreadmeを取得できます。


```
 $ gman node
```

このようにユーザー名を省略した場合は、一番人気のあるスターのついたリポジトリが選択されます。

-l オプションでその名称のリポジトリの一覧を確認することもできます。

```bash:
 $ gman -l node
 
nodejs/node
atom/node
goerlang/node
oVirt/Node
nwjs/node
openwsn/node
MiniProfiler/node
kissyteam/node
tutumcloud/node
```

-o オプションを使えばブラウザが起動してリポジトリのページを表示します。

```
 $ gman -o nodejs/node
```





## Github API
このgmanコマンドではGithubのAPIを利用しています。
Githubは開発者向けサービスだけあって、APIがとても充実しています。
公開情報の取得だけならばAPIキーも不要なので楽チンです。

### 検索

検索する場合は、`q=KEYWORD`に任意の単語を入れて以下のURLにアクセスします。

`https://api.github.com/search/repositories?q=KEYWORD`

するとJSONファイルが返ってくるので、それを利用します。
返されるJSONの形式については[こちら](https://developer.github.com/v3/search/)のドキュメントが詳しいです。

### リポジトリの情報の取得

リポジトリ情報の取得も簡単です。

`https://api.github.com/repos/USERNAME/REPOSITORY`

というように、USERNAMEとREPOSITORYをURLに埋め込めば、リポジトリの情報が一式取得できます。

返されるJSONの形式は[こちら](https://developer.github.com/v3/repos/#get)のドキュメントから。

・・・

このように、Github APIの利用は非常に簡単です。
何よりAPIキーや認証が不要なところが敷居が低くて捗ります。

## まとめ
gmanは[こちら](https://github.com/kurehajime/gman/releases)からダウンロードできます。
Windows,Linux,Mac...いろんなOSで動きます。