OmniAICreator/Qiita-1.07M huggingface dataset:
【laravel5】 tinkerを利用してpryのように楽にデバッグする！


みなさんこんにちは、youkyllです。

laravelでデバッグをする時、```dd()``` を利用している方は多いのではないのでしょうか。

今回は rubyのpry、phpdbgと似た、
REPLである```tinker```コマンドをご紹介します。

## 基本的な使い方
tinkerコマンドによる対話的シェルを立ち上げるには、
プロジェクトディレクトリ内で下記のコマンドを実行します。

```bash
$ php artisan tinker
```

シェルが立ち上がるので ```help```と入力します。
利用できるコマンドが表示されます。

![help](https://gyazo.com/65b9e087d69a758c949e0bfef71f868c.png)

 
 それでは手始めにグローバル変数の一覧を表示してみましょう。

```
>>> ls -gl
```
すると、グローバル変数一覧が表示されます。
```$_SERVER``` を見たいときは単に

```
>>> $_SERVER
```

と打ち込むだけで中身を確認できます。

また、下記のようにphpを逐一実行する事ができます。

```
>>> base_path()
=> "/home/youkyll/project/test_app"
```

## tinkerでデバッグする

実は公式ドキュメントにもtinkerコマンドを利用したデバッグについては記載されていません。

tinkerコマンドは[PsyPH](http://psysh.org/)のラッパーです。
ですので、こちらの公式ドキュメントを見ましょう。

REPLによるデバッグを行うには、デバッグを行いたい箇所で

```php
eval(\Psy\sh());
```
と追記します。

続いて、servコマンドでサーバーを立ち上げましょう。

```bash
$ php artisan serv
```

該当のコードが通過するURLでブラウザからアクセスします。

すると、servコマンドで待機していたシェルにtinkerが起動します！

先ほどコマンドから実行した場合と同じ要領でデバッグをすることができます！

現在の自分の居場所を確認してみましょう。

```
>>> whereami
```

![whereami](https://gyazo.com/4d95d77698be930e6aa64596d1cde84e.png)

このように、現在のbreak pointが分かります。

## 便利コマンド
ここではデバッグ時に便利なコマンドを抜粋して簡単に紹介します！

### ls -fl -G 関数名
現在のスコープで利用できる関数の一覧をgrep検索して表示します。
-Gはgrep、-fは関数、-lは詳細表示と言った意味です。
ヘルパーで定義した関数探すときなどに便利ですね。

### doc 関数名 or オブジェクト
詳細情報(phpdoc, 引数など)が見られます。

### show 関数名 or オブジェクト
なんとコードが見られます！変数にも利用できて便利！

### trace
現在ストップしている場所までのtraceが確認できます。

### wtf or last-exception
最後に投げられたexceptionとその詳細を表示します。



その他のコマンドについては

```
>>> help [command]
```

で参照ください。    

## まとめ
tinkerコマンドはこのように手軽にデバッグすることができます！
    

それでは良いコーディングライフを!
Sails.jsでcreatedAtとupdatedAtを切る方法

## はじめに

Sails.jsではモデルにcreatedAtとupdatedAtというattributesをデフォルトで持っている。
DB上のテーブルにちゃんとこの名前のカラムがあれば問題は無い。
しかしそれが無い場合は、そんなカラムは無いよ？と怒られる：

```bash
ER_BAD_FIELD_ERROR: Unknown column 'user.createdAt' in 'field list'
ER_BAD_FIELD_ERROR: Unknown column 'user.updatedAt' in 'field list'
```

そんな場合の対処法は2つある。

## 対処法1：該当するカラムが別名である場合

例えばcreatedAtの代わりにinsert_date、updatedAtの代わりにmodified_dateというカラムを使ってる場合。
このように該当するカラムが別名で存在する場合は、モデルのattributesを次のように設定する：

```js
module.exports = {

  attributes: {
    createdAt: {
      type: 'datetime',
      columnName: 'insert_date'
    },
    updatedAt: {
      type: 'datetime',
      columnName: 'modified_date'
    },
    //以下省略
  }

  //以下省略
};
```

## 対処法2：該当するカラムが無い場合

そもそも該当するカラムが無い場合は、models.jsで以下のように設定する：

```js:config/models.js
module.exports.models = {

  autoCreatedAt: false,

  autoUpdatedAt: false,

  //以下、connectionやmigrateの設定
};
```
Sails.jsでプライマリキーをid以外のカラムに持たせる方法

別システムからの移植だったり、政治的事情があったりして、id以外のカラムがプライマリキーになることがある。
ところがCoCなSails.jsではデフォルトの設定がidをプライマリキーに設定してある。
そんな時は、該当するテーブルのモデルでattributesを次のように設定すれば良い：

```js
module.exports = {

  attributes: {
    id: {
      type: 'integer',
      columnName: 'user_id'  //DB上でuser_idとなってるカラムをsails上ではidとして扱う
    },
    //以下省略
  }

  //以下省略
};
```
Sails.jsでmigrateの設定を永続的に行う方法

「sails lift」した際に毎回次のような中断（interruption）が入って煩わしい。

```
Excuse my interruption, but it looks like this app
 does not have a project-wide "migrate" setting configured yet.
 (perhaps this is the first time you're lifting it with models?)
 
 In short, this setting controls whether/how Sails will attempt to automatically
 rebuild the tables/collections/sets/etc. in your database schema.
 You can read more about the "migrate" setting here:
 http://sailsjs.org/#/documentation/concepts/ORM/model-settings.html?q=migrate

 In a production environment (NODE_ENV==="production") Sails always uses
 migrate:"safe" to protect inadvertent deletion of your data.
 However during development, you have a few other options for convenience:

 1. safe  - never auto-migrate my database(s). I will do it myself (by hand) 
 2. alter - auto-migrate, but attempt to keep my existing data (experimental)
 3. drop  - wipe/drop ALL my data and rebuild models every time I lift Sails

What would you like Sails to do?

info: To skip this prompt in the future, set `sails.config.models.migrate`.
info: (conventionally, this is done in `config/models.js`)

warn: ** DO NOT CHOOSE "2" or "3" IF YOU ARE WORKING WITH PRODUCTION DATA **

prompt: ?:
```

マイグレーションをどうするかの設定がされてないので、それをどうするか聞かれている。
設定方法はここに書かれている通り、次の2通り：

* 環境変数でNODE_ENVの値をproductionに設定しておけば、毎回「safe（自動マイグレートなし）」で実行される。
* config/models.jsでmigrateの値をsafeかalterかdropに設定しておけば、毎回そのモードで実行される。

以上、英語をちゃんと読まずにエラーメッセージでググった人向けの情報（←me）でした。
c++ builder XE4, 10.2 Tokyo > TMemo > 行頭からのバイト数を数える

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

TMemoに表示されている文字列に関して、行頭からのバイト数を数えたい。

TMemoのKyeUpにて以下を実装する。

参考
http://www.geocities.jp/asumaroyuumaro/program/tips/memolineindex.html

```cpp
void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)

{
	int lineidx, linest;

	lineidx = Memo1->Perform(EM_LINEFROMCHAR, UINT(-1), 0);
	linest = Memo1->Perform(EM_LINEINDEX, UINT(-1), 0);


	int pos = Memo1->SelStart - linest;

	L_pos->Caption = String().sprintf(L"%d バイト(配列の[%d])", pos, pos - 1);
}
```

通信キャプチャした文字列において特定の文字(Bなど)が何文字目にあるかなどをチェックするのに使える。
POH6+『「え、妻が松江？」松江Ruby会議07協賛 回文作成プログラミングコンテスト』 ポイント編

#概要
POH6は易化していたが、**ここからが本当の地獄だ……**。
もっとも、POH5+に比べればまだ簡単だと思う。あっちは15パズル解かせるとかいうガチ問題だったから最初から投げてたからね……。
ただ、あちこちに罠を巡らせた素敵仕様なので、何も考えず解こうとするとコーナーケースにひっかかるのは間違いない。よって、ネタバレとなりうる詳細な解説は次回に移して、今回はポイントだけ解説する。
**※2015/09/04：重大なミスが見つかりましたので修正しました。**

#ポイント
端的に言えば、**問題文をよく読むこと**が重要である。
と言うと、そんなの簡単だろ、と思うかもしれないが冗談じゃない。プログラミングコンテストにおいて文章をよく読むのは重要なことである。その**主な目的は思い込みをなくすこと**だ。
例えば、今回の問題は、文章にするとこんな感じになる。

>問題
>N個の単語のリストw_1～w_Nが与えられる。
>単語は英小文字のみからなる文字列である。
>この際、リストから作られる最長の回文で辞書順最小のものを一行に出力せよ。
>最後は改行し、余計な文字、空行を含んではならない。
>ただし、1 ≦ N ≦ 1000・1 ≦ |w_i| ≦ 10であり、すべての単語は同じ長さである。

何気ないようだが、既に幾つもの罠が動き出している。 ~~その力の源はタワーだ~~

* 単語長は全て同じなので、回文を生成しやすい(いちいち探索せずとも生成できる)
* リスト中に単語が重複していることもありうる
* 「最長」でかつ「辞書順最小」でなければならない(両方満たす必要がある)

つまり、サンプルで与えられた2つの入出力例に加え、次の例について正答しなければならない。

・入力例3(対称な単語が存在しない場合)

>5
>tcp
>udp
>ppm
>aac
>pct

・出力例3

>pcttcp

・入力例4(対称な単語しか存在しない場合)

>5
>pnp
>sos
>aaa
>www
>tst

・出力例4

>aaa

・入力例5(対称な単語が重複している場合1)

>5
>aaa
>aaa
>vvv
>aaa
>aaa

・出力例5

>aaaaaaaaaaaaではなくaaaaaavvvaaaaaa

・入力例6(対称な単語が重複している場合2)

>5
>vvv
>vvv
>aaa
>aaa
>vvv

・出力例6

>vvvvvvvvvではなくaaavvvvvvvvvaaa

・入力例7(巨大なデータ相手の場合)

>1000
>(以下、「abbbbbbbbb」が500個、「bbbbbbbbba」が500個並んでいる)

・出力例7

>abbbbbbbbb(中略)abbbbbbbbbbbbbbbbbba(中略)bbbbbbbbba

・入力例8(ごちゃごちゃしている場合)

>10
>ac
>bc
>cc
>aa
>ca
>cb
>cb
>ac
>ca
>cc

・出力例8
>acacbccccccbcacaではなくacacbcccaacccbcaca

#まとめ
**通らないテストケースがあったらプログラムを見直してみよう！**
LVMパーティションを縮小(やらないほうがいい)

## 参考

* [linux - How can I shrink a Logical Volume, and re-allocate the freed space into a new partition on the same drive? - Super User](http://superuser.com/questions/734468/how-can-i-shrink-a-logical-volume-and-re-allocate-the-freed-space-into-a-new-pa)

## LVMパーティションを縮小したい

* proxmox3.4をインストールしたDISK(80GB)のLVMが以下図上のようになった。
* 図下のように設定できたのでメモ (少し未割り当てが残った・・・)
![LVM.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/7b8bb295-0700-9918-99d4-b20a857b7d8a.jpeg)

## 設定

```bash:pvscan
# pvscan
PV /dev/sdc3 VG pve lvm2 [74.40 GiB / 48.15 GiB free]
Total: 1 [74.40 GiB] / in use: 1 [74.40 GiB] / in no VG: 0 [0 ]
```

* 74.40 - 48.15 = 26.25

```bash:26.25GBを指定したら怒られた
# pvresize --setphysicalvolumesize 26.25G /dev/sdc3
/dev/sdc3: cannot resize to 6719 extents as 6720 are allocated.
0 physical volume(s) resized / 1 physical volume(s) not resized
```

```bash:27GBの指定で成功
# pvresize --setphysicalvolumesize 27G /dev/sdc3
Physical volume "/dev/sdc3" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
# pvs
PV VG Fmt Attr PSize PFree
/dev/sdc3 pve lvm2 a-- 27.00g 764.00m
```

```bash:確認
# gdisk -l /dev/sdc
Number Start (sector) End (sector) Size Code Name
1 34 2047 1007.0 KiB EF02
2 2048 262143 127.0 MiB EF00
3 262144 156301454 74.4 GiB 8E00
```

```bash:gdiskでsdc3のサイズを変更
# gdisk /dev/sdc
Command (? for help): d
Partition number (1-3): 3
Command (? for help): n
Partition number (3-128, default 3):
First sector (262144-156301454, default = 262144) or {+-}size{KMGTP}:
Last sector (262144-156301454, default = 156301454) or {+-}size{KMGTP}: +27G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8E00
Changed type of partition to 'Linux LVM'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
```

* 念のためOS再起動した。
pingとarpコマンドで機器を推定

windows 7 にて確認。

```
ping 192.168.100.3
```

を実施。

```
arp -a
```

にて 192.168.100.3 のMACアドレスを確認。

そのMACアドレスを以下サイトで検索

* [MACアドレス検索](http://mac.uic.jp/)

機器のメーカーがわかるのでおおよその推測がつく。
Google新ロゴ　なんでごっついの？

googleの新しいロゴを理解するための覚えがき。
[公式ガイドライン](https://design.google.com/articles/evolving-the-google-identity/)より。

新しく発表したロゴは３種類。
##**① Google logotype**
![](https://g-design.storage.googleapis.com/production/v5/assets/renditions/g-logo-360.png)
従来のロゴデザインから、ごっついSans Serif系へフォントの書体を変更。その意図は、マルチデバイス時代に即し、スマートウォッチのようなちいさなディスプレイの中で解像度が下がっても印象を変えることなくロゴを表示することにある。
「みなの期待を良い意味で裏切る」という意図を込めて、最後のeの文字は少し傾けられている。

##**② Dots**
![](https://g-design.storage.googleapis.com/production/v5/assets/renditions/g-dots-360.gif)
今回のロゴ変更で最も注目すべき変更。
インタラクティブなアクション時に使われる、googleのテーマカラーをあしらった４つの色のドット。このドットがどのような動きをしているかによって、ユーザーは自分がどのようなアクションをしているのかうかがい知ることができる。Listening, User Speaking, Thinking, Replying, Incomplehension,  Confirmationなどが、モーションが示唆するアクション。[こちらのムービー参照。](https://g-design.storage.googleapis.com/production/v5/assets/g-dots.mp4)

##**③Google G**
![Screen Shot 2015-09-03 at 01.02.15.png](https://qiita-image-store.s3.amazonaws.com/0/54076/40884ef0-c194-dd04-63d5-04fe9ee3f44d.png)

ロゴがすべて入りきらない限られたスペースでもGoogleの存在が目立つよう、4つの原色をすべて一文字の中に詰め込んでいる。必要以上にbyte数をとらないために、完全な円形ではなく、横棒が入り込む青色の部分ではやや円を変形させている。


##**Color**
色と色同士で間に空白を挟んでいる場合と隣接している場合で、微妙に色の明るさを変えている

![Screen Shot 2015-09-03 at 01.08.25.png](https://qiita-image-store.s3.amazonaws.com/0/54076/f39c1245-975c-bbeb-7143-81ad11c40c62.png)

![Screen Shot 2015-09-03 at 01.07.13.png](https://qiita-image-store.s3.amazonaws.com/0/54076/16e2cc90-c906-3148-a7d0-970dd7692745.png)


##**Product Sans**
![Screen Shot 2015-09-03 at 09.05.43.png](https://qiita-image-store.s3.amazonaws.com/0/54076/5818a253-0494-85f6-9486-94d0f9b53563.png)

Google Map, Google Storeのように、Googleの後につくプロダクト名のために新たにSans-seril系にロゴタイプを作成。題して、"Product Sans"。"Google"ロゴと適度な共通性をもちつつ、区別している。


##**ペーパーファーストからスクリーンベースへ**
静止画のペーパーファーストからよりダイナミックなアニメーションが可能なスクリーンベースのデザインへ。さらにPCやモバイル端末以外にもGUIが装填されるIoT時代も見越した、非常にシステマティックなロゴ。ロゴのデータ容量は305バイトに収められている。

![ロゴになりきれなかったロゴたち](https://g-design.storage.googleapis.com/production/v5/assets/renditions/g-sprint-1240.jpg)

さらに、今回は、選ばれなかったデザインも発表。
８色バージョン、小文字のgのケース
プリミティブな円形をベースに作り込むデザインも考案途中にはあったようである。




**参考**
Google [公式デザインガイドライン](https://design.google.com/articles/evolving-the-google-identity/)
FastCompany [Google's New Logo Is Its Biggest Update In 16 Years](http://www.fastcodesign.com/3050613/googles-new-logo-is-its-biggest-update-in-16-years)
[Sails.js]Passport.jsでログイン時にセッションを再生成する

`req.login()`をする前に`req.session.regenerate()`をすると良い。

```js:セッション再生成
callback: function(req, res) {

  passport.authenticate(strategy, {
    callbackURL: ''
  }, function(error, user) {

    if (error) {
      sails.log.error(error);
      return res.redirect('errors/500', {});
    }
    else if (!user) {
      // OAuthがキャンセルされた場合、error = null, user = falseになる
      sails.log.verbose('OAuth Denied');
      return res.redirect('/');
    }

    // セッションの再生成
    req.session.regenerate(function(error) {
      if (error) {
        sails.log.error(error);
        return res.redirect('/');
      }

      req.login(user, function(error) {
        if (error) {
          sails.log.error(error);
        }

        res.redirect('/'+redirectTo);
      });
    });
  })(req, res);
}
```

# 詰まるポイント
上記の例はPassport0.2系だと動かない。0.2系で動かすにはさらに以下の2行を追加する必要がある。

```js:passport0.2系の処理
req.session.regenerate(function(error) {
  // この2行を追加
  req.session.passport = {};
  req._passport.session = req.session.passport;

  req.login(user, function(error) {
```

`session.regenerate()`はexpress-sessionの機能、`req.login()`はpassportの機能で、実はこの2つにはモジュール間の関連があまりない。passportを使うときにはexpress middlewareに`passport.initialize`を追加しているはずだが、そこで初期化時にsessionオブジェクトに入れた値が、`regenerate()`することにより消えてしまう。
0.3系なら`req.login()`時にその初期化処理を再度実行するような修正が入っていて、以下の2行は不要になっている。

というところの調査に半日費やし、GitHubで最新のコードを読むと修正が入ってたので0.3系にあげたら動いたという悲しい話。

ちなみに`regenerate()`や`login()`のタイミングではDBへのsession情報のInsertなどは実行されず、sessionオブジェクトに値を書き込んでいるだけ。レスポンスが返却されるときにデータは保存されるらしい。
POH6「漫画版: 女子高生プログラマーの大バトル！～コボール文明の逆襲～」

#概要
さあ今回もやってまいりましたPOH(Paiza Online Hackathon)。
どう見ても某ゲーム小僧っぽいポーズで笑いを誘いつつ、遺跡より蘇るスフィンクスっぽい敵を迎え撃つは美少女プログラマー3人！
プログラミングで世界を、地球を救うことはできるのか！？

……いや今回のは前回より簡単なんでマなら解けないと困りますマジで。

#霧島京子編
まずはランク1 ~~オッツダルヴァ~~。一部で不人気とか言ってる声もあるけどふざけるな、可愛いやろ！　`あっ俺は六村さんでお願いします`
[本来は動的計画法で解く問題](http://qiita.com/nia_tn1012/items/25bc3dcb0fb3343d5509)らしいのだが、思いつかなかったので普通にシミュレートして実装した。説明する前にコード貼った方が早いよね？

```code1.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
	// 入力
	int n;
	cin >> n;
	vector<int> t(n);
	for(int i = 0; i < n; ++i){
		cin >> t[i];
	}
	int m;
	cin >> m;
	vector<int> d(m);
	for(int i = 0; i < m; ++i){
		cin >> d[i];
	}
	// 処理
	vector<string> result(m);
	for(int i = 0; i < m; ++i){
		// 出目の値が大きすぎるとゲームオーバーなので"No"
		if(d[i] >= n){
			result[i] = "No";
			continue;
		}
		// 移動をシミュレートして、ゴールに行けない場合を弾く
		vector<int> check(n, 0);
		check[0] = 1;	//最初のマスに印を付けておく
		int pos = d[i];
		while(true){
			// ゴールに着いた場合は"Yes"
			if(pos == n - 1){
				result[i] = "Yes";
				break;
			}
			// 移動先がすごろくの外なら"No"
			if(pos + t[pos] >= n){
				result[i] = "No";
				break;
			}
			if(pos + t[pos] < 0){
				result[i] = "No";
				break;
			}
			// 移動先が既に行った所なら"No"
			// (無限ループの恐れがあるので)
			if(check[pos + t[pos]] != 0){
				result[i] = "No";
				break;
			}
			// 移動を行う
			check[pos] = 1;
			pos += t[pos];
		}
	}
	// 出力
	for(int i = 0; i < m; ++i){
		cout << result[i] << "\n";
	}
}
```

正直、無限ループ考慮するので地味に面倒だなと思いました(小並感)

#六村リオ編
ナンバー2さんの登場だ。[言語別集計](https://paiza.jp/poh/joshibato)から察するに一番人気っぽいねこの子。ぱっと見解きやすい、というわけでもないのに何故だろう？
霧島と同じくシミュレートして解ける問題だけど、見ての通りコードはより簡単。だけど、テストケース5で躓く人が続出しているそうな。何故だろう？

```code2.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
	// 操作回数を入力する
	int N;
	cin >> N;
	// 各手順を実行する
	double water = 0.0, coffee = 0.0;
	for(int i = 0; i < N; ++i){
		// 手順を読み込む
		int t, s;
		cin >> t >> s;
		// 手順を処理する
		if(t == 1){
			// お湯を入れる
			water += s;
		}else if(t == 2){
			// コーヒー粉末を入れる
			coffee += s;
		}else{
			// 中身を飲む
			double water_ = water - water * s / (water + coffee);
			double coffee_ = coffee - coffee * s / (water + coffee);
			water = water_;
			coffee = coffee_;
		}
	}
	// 濃度を計算する
	cout << static_cast<int>(coffee * 100 / (water + coffee)) << endl;
}
```

[躓いた方に伺った](https://twitter.com/vipt_info/status/639054315169013760)ところ、どうやらテストケース5には「中身を飲む」操作が入っているらしい。コードを読めば分かるように、**中身を飲む場合は副作用の問題があるので、一旦更新前の水・コーヒー粉末量をコピーしてから更新するのが安全**。
最後は四捨五入じゃなくて整数型にキャストしているのは問題文通り。

#緑川つばめ編
そして第三位。黒髪ロング、そして「なでしこ(ハッカー)」とかいうヲタ受けしそうな実装なのにも関わらず投稿数も第三位なようで……。**アイエエエエ! フニンキ!? フニンキナンデ!?**
コードも何気に一番簡単に済んだ。マジでランクごとに難易度も下げているのかと思ったじぇ(まあ全体的に易化しているが)。

```code3.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
	// 整数を入力する
	int N;
	cin >> N;
	// 報酬を計算・出力する
	cout << (N + static_cast<int>(N / 10) + (N % 10)) << endl;
}
```

#振り返って
前回のPOHに比べて易しすぎる感がある……まあ温い方がストーリーを楽しめるからいいか、と思ってたが**ストーリー部分も薄い**からつらたん。
POH6+は骨があるので次回で解説。
[Unity] 高１の娘に二次関数を教える


#娘に数学を教えているんですが、

> 問題：
> $f(x) = x^2 + 2px + 3p^2-6p-36$
> において、$f(x) = 0$ を満たす x が存在するとき、p の取りうる範囲を求めよ

のような問題がありました。高校の数学Ｉです。
これは判別式がゼロ以上となるように p の範囲を求めればよく、答えは

$-3 \leq p \leq 6$

こうなるんですが、p がこの範囲を動くときに $f(x) = 0$ が解を持つ、ってわかりにくいですね。
というか、娘にわかってもらう方法が難しい。

というわけで、Unity でグラフを描画してインタラクティブに動かしてみせるのです。

[https://github.com/dsedb/math_graph](https://github.com/dsedb/math_graph)


#こうなります。

![math00.gif](https://qiita-image-store.s3.amazonaws.com/0/90046/267d66d6-6cd7-c0e2-58bd-f0469606b43e.gif "graph.gif")

p の値を変更したときのグラフの変化を可視化したわけです。
スライダはエディタ拡張にしました。あと Scene ビューです。まあ、なんでもいいのです。

こうして動かしてみると、X軸と交差するのが条件、というのがわかりやすいですね。

#娘「あーこうなるんだー」

少しは理解が進んだようです。めでたし。
Qiita以外のElectronプログラムの導入解説サイトリンク集

###コード付き解説サイト
[初めてのElectron！ HTML5でデスクトップアプリを作成しよう](http://ics-web.jp/lab/archives/7298)
[テキストエディターを作ってElectronの基礎を学ぼう！ HTML5でPCアプリ開発入門](http://ics-web.jp/lab/archives/8401)

[ElectronとHTML/CSS/JavaScriptでデスクトップアプリを作ろう【入門編】](http://liginc.co.jp/web/html-css/177611)

[Electronでクロスプラットフォームのデスクトップアプリを作る](http://www.sonix.asia/rd-reports/electron1)

[Electronでアプリケーションをつくる](http://tech.sanwasystem.com/entry/2015/05/29/225731)

[NW.jsのつもりが気づくとElectron（旧Atom Shell）でサンプルアプリ作っていた](http://m0t0k1w.tumblr.com/post/125345555748/nwjs%E3%81%AE%E3%81%A4%E3%82%82%E3%82%8A%E3%81%8C%E6%B0%97%E3%81%A5%E3%81%8F%E3%81%A8electron%E6%97%A7atom-shell%E3%81%A7%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F)

[ElectronにMilkcocoaを導入して、リアルタイムなデスクトップアプリを作る方法](http://blog.mlkcca.com/frontend/milkcocoa-on-electron/)

###解説メインのサイト
[Electron と Polymer と TypeScript でリッチなマークダウンプレビュアー Shiba つくった](http://rhysd.hatenablog.com/entry/2015/08/03/090646)

[Electron(旧atom shell)基礎+入門  Slide Share](http://www.slideshare.net/mainya/electronatom-shell)

[Rails プログラマが Electron でギャルゲをつくりはじめた　Speaker Deck](https://speakerdeck.com/tanaka51/rails-puroguramaga-electron-degiyarugewotukurihazimeta)
技術英語 > It's possible but not probable. > それはありうるが確率は高くない

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

> It's possible but not probable. (それはありうるが確率は高くない)

引用: 英語で英文法をやり直す本 by 赤井田 拓弥さん

> probabilityはchance is quite high
> possibilityはchance is rather low

<hr>
「記憶の宮殿」に格納するため、以下の無理やりな憶え方をしている。

proba... > 「プロ」 > プロだったら確率が高いだろう

こじつけ大事。
RedshiftでReadOnlyユーザを作成するサンプル


案外情報が少なかったので作成方法を書く。

# 作成クエリ
例えば publicスキーマの全てのテーブルに対してSELECTのみ実行出来るユーザを作りたい場合。
下記コマンドで設定出来る。

```sql
/* ユーザ作成 */
# CREATE USER  guest PASSWORD 'GuestUser123';

/* publicスキーマ内のオブジェクトにアクセス出来るようにする */
# GRANT USAGE ON SCHEMA public TO guest;

/* publcスキーマを参照するためのパスを通す */
# ALTER USER guest SET SEARCH_PATH TO public;

/* publicスキーマ内の全てのテーブルに対して SELECT実行する権限を付与する */
# GRANT SELECT ON ALL TABLES IN SCHEMA public TO guest;
```

# 注意点
テーブルを作成するたびに下記クエリを実行する必要が有る。

```
# GRANT SELECT ON ALL TABLES IN SCHEMA public TO guest;
```

GRANT実行時に存在してるテーブルに対して権限を付与してるので、
テーブルを増やしたり、再作成したら再度実行しなくてはならない。

# 参考
- [AWS Documentation » Amazon Redshift » Management Guide » SQL リファレンス » SQL コマンド » CREATE USER](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_CREATE_USER.html)
- [AWS Documentation » Amazon Redshift » Management Guide » SQL リファレンス » SQL コマンド » ALTER USER](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_ALTER_USER.html)
- [AWS Documentation » Amazon Redshift » Management Guide » SQL リファレンス » SQL コマンド » GRANT](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_GRANT.html)
GNU Globalを使いこなしたい

## はじめに

職場でGNU Globalを使っていますが、使いこなせていないです。慣れるために、
自宅のOSXにもGNU Globalをインストールしました。

職場ではHomebrewを使っていますが、自宅ではRudixを使っています。結論から述べると、Rudixを使ってGNU Globalをインストールすると、GNU Globalのパーサーの１つであるPygmentsパーサーはExuberant Ctagsを利用しませんでした。

[gtags - GNU GLOBALの対応言語を大幅に増やすPygmentsパーサーを導入する - Qiita](http://qiita.com/yoshizow/items/9cc0236ac0249e0638ff)

こちらの記事を参照すると、GNU Globalのビルド時にpythonやctagsをチェックしていることが分かります。ビルドの手間を省くことができるけれど、Rudixは今回のようなカスタマイズみたいなことに弱いのかもしれません。

この記事では、忘備録として、GNU GlobalのインストールとPygments導入手順を紹介したいと思います。

## 準備

### コマンドラインツール

GNU Globalをビルドするため、コマンドラインツールが必要になります。

```
$ xcode-select --install
```

これで、コマンドラインツールをインストールします。確か、通信量は250MBくらいでした。

### Rudix

ビルドせずにパッケージをインストールするために、Rudixが必要になります。

[Rudix!](http://rudix.org/index.html)からrudix-2015.6.1-0.pkgをダウンロードして、インストールします。

### Exuberant Ctags

GNU Globalで使うため、Exuberant Ctagsが必要になります。

```
$ sudo rudix install ctags
```

これで、Exuberant Ctagsをインストールします。

### pip

Pygmentsをインストールするために、pipが必要になります。

```
$ sudo rudix install python-pip
```

これで、pipをインストールします。

### Pygments

GNU Globalで使うため、Pygmentsが必要になります。

```
$ sudo pip install --upgrade
$ sudo pip install pygments
```

これで、Pygmentsをインストールします。

### GNU Global

[GNU GLOBAL source code tagging system](https://www.gnu.org/software/global/)から最新のソースコードアーカイブをダウンロードして、ビルドして、インストールします。

[人間とウェブの未来 - GNU GLOBALとvimで巨大なコードでも快適にコードリーディング](http://blog.matsumoto-r.jp/?p=2369)

ディレクトリ構成などは、こちらを参考にしました。

シンボルリンクだけ少し変えました。

```
$ sudo ln -s /usr/local/global/bin/gtags /usr/local/bin/gtags
$ sudo ln -s /usr/local/global/bin/global /usr/local/bin/global
```

## .globalrc

快適にPygmentsを使うために、設定ファイルが必要になります。

```
$ cp /usr/local/global/share/gtags/gtags.conf ~/.globalrc
```

これで、設定ファイルをコピーします。

[yoshizow/global-pygments-plugin](https://github.com/yoshizow/global-pygments-plugin)

こちらを参考に編集します。

```
 default:\
-        :tc=native:
+        :tc=native:tc=pygments:
+pygments:\
+:tc=pygments-parser:tc=htags:
```

これで、Pygmentsパーサーを使うように編集します。編集することで、Pygmentsパーサーために環境変数を設定する必要やコマンドラインオプションを指定する必要がなくなります。

この記事で紹介した内容だと、/usr/local/global/libにpygments-parser.laがありますので、設定ファイルの編集が必要になります。

## 動作確認

問題なさそうですが、少し期待した結果ではありませんでした。よく分からない状態です。。

```
global-test % gtags -d GTAGS
 __.COMPNAME	 __.COMPNAME
 __.COMPRESS	 __.COMPRESS ddefine ttypedef
 __.VERSION	 __.VERSION 6
Hello	2 @n 1 class @n
hello	2 @n 2 def @n
message	2 @n 6 def @n; 'hello, world'; end

global-test % gtags -d GRTAGS
 __.COMPACT	 __.COMPACT
 __.COMPLINE	 __.COMPLINE
 __.COMPNAME	 __.COMPNAME
 __.VERSION	 __.VERSION 6
message	2 @n 3
puts	2 @n 3
```

## まとめ

GNU GlobalのインストールとPygments導入手順を紹介しました。GNU Globalを使いこなしたいですね。
モデルとフォーム

# hasAndBelongsToMany

hasAndBelongsToManyでフォームを生成する方法

```php

//Model
class Item extends AppModel {
    public $hasAndBelongsToMany = array(
        'Tag' => array(
            'className' => 'Tag',
            'joinTable' => 'items_tags',
            'foreignKey' => 'item_id',
            'associationForeignKey' => 'tag_id',
            'unique' => 'keepExisting'
        )
    );
}

class ItemTags extends AppModel {
    public $belongsTo = array(
        'Item' => array(
            'className' => 'Item',
            'foreignKey' => 'item_id',
        ),
        'Tag' => array(
            'className' => 'Tag',
            'foreignKey' => 'tag_id',
        ),
    );
}

class Tag extends AppModel {
    public $hasAndBelngsToMany = array(
        'Item' => array(
            'className' => 'Item',
            'joinTable' => 'items_tags',
            'foreignKey' => 'tag_id',
            'associationForeignKey' => 'item_id',
            'unique' => 'keepExisting'
        ),
    );
}

// Controller
class ItemController extends AppController {
    public function index() {
        $this->set('tags', $this->Item->Tag->find('list'));
    }
}

// View

echo $this->Form->input('Tag');
```

Controller側では、モデル名の複数形を変数名にしてViewへ渡す。
View側ではモデル名（単数形）を指定することで、表示させることが出来る。

## belongsTo, hasOne
Node.jsのMongoDBでauto_increment

##  やりたいこと
「Node.jsから[mongodb](https://www.npmjs.com/package/mongodb)を利用してauto_incrementしたい」

例として、以下のようなusersコレクションがあり、

```js
db.createCollection('users');
```

以下のようなidの増加をプログラムで制御します

```js
db.users.insert({id: 1, name: 'Taro'});
db.users.insert({id: 2, name: 'Jiro'});
db.users.insert({id: 3, name: 'Saburo'});
```

## countersコレクションの設定
ターミナルでmongoと打って、useを使ってデータベースを切り替えてから、
以下のスクリプトを実行します

```js
db.counters.insert({
      id: "user_id",
      seq: 0
});
```

## Node.js側

以下のスクリプト内の```countersColl.findAndModify({id: "user_id"}...```の```"user_id"```はcounterコレクションに設定した文字列と同じものをしてします

```js:server.js
// MongoDB
var MongoClient = require('mongodb').MongoClient;

// MongoDBに接続をする
MongoClient.connect('mongodb://localhost:27017/test', function(err, db){
	// countersコレクションを取得
	var countersColl = db.collection('counters');
	// usersコレクションを取得
	var usersColl = db.collection('users');

	countersColl.findAndModify({id: "user_id"}, [], { $inc: { seq: 1 } }, {new: true}, function(err, ret){
		// auto_incrementされたuser_idが取得できた
		var newUserId = ret.value.seq;
		// ユーザーを追加
		usersColl.insert({
			id: newUserId,
			name: "Taro"+newUserId
		});
	});
});

```

## 動作確認
server.jsを三回実行して、mongoコマンドで確認します
（Ctrl+cでの終了が無理やりな感じがしますが...）

```sh
$ node server.js 
^C
$ node server.js 
^C
$ node server.js 
^C
```

```sh
$ mongo
MongoDB shell version: 3.0.3
> use test
switched to db test
> db.users.find()
{ "_id" : ObjectId("55e72eb0469dba70dd789b4b"), "id" : 1, "name" : "Taro1" }
{ "_id" : ObjectId("55e72f6fb770fc2fdecb4fed"), "id" : 2, "name" : "Taro2" }
{ "_id" : ObjectId("55e72fa2d117804fde08606d"), "id" : 3, "name" : "Taro3" }
> 
```


## 参考
- http://docs.mongodb.org/master/tutorial/create-an-auto-incrementing-field/
- http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findAndModify
SFC: A0ポスターを印刷する方法

よく端に空白が生まれて、はさみでカットしている人を見かけるので、メモ程度に。



1. ***プレビュー*** でPDFを読み込む。
<br>
2. ①「プリンタ」を ***"Canon PRO-4000"*** 、<br>②「用紙サイズ」を ***"A0 縁なし"*** 、<br>③「用紙サイズに合わせる」が***"イメージ全体をプリント"***になっていることを確認して、<br>④***"プレビュー"*** をクリック。<br>
<img width="752" alt="スクリーンショット 2017-12-05 13.26.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/91959/b2ee0c7d-0581-8a96-34e6-42a2f44ddeeb.png">
<br>

3. ***"品位と用紙の種類"***をクリックして、***"印刷プレビュー"***にチェックを入れる。<br>これで印刷後の仕上がりを確認することができる<br>
<img width="239" alt="スクリーンショット 2017-12-05 13.34.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/91959/e319061f-1078-92a5-03ac-6ab1f18e3fc7.png">
<img width="770" alt="スクリーンショット 2017-12-05 13.34.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/91959/12bf058b-24cb-18cd-ac86-40c6664ce36a.png">
<br>

4. ***"ページ加工"*** をクリックし、<br>①「ロール紙幅」を***"36 in ロール（914.4mm）"***、<br>②「ロール紙の幅に合わせる」を***"オン（フチなし）"***、<br>③「フチなしはみ出し量」を***"小"***に設定し、<br>④***"プリント"***をクリック。
<img width="249" alt="スクリーンショット 2017-12-05 13.34.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/91959/2359e084-f9ab-037d-c936-6723d20327f6.png">
<img width="770" alt="スクリーンショット 2017-12-05 13.35.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/91959/16904ef9-be43-daae-a34b-f85fc0ec7c21.png">
<br>

ここまで終わると、プレビュー画面にポスターが表示されるので、体裁を確認して印刷。
これで、印刷後に端を切り取る作業がなくなるはずです。
備忘録ImageMagick

ImageMagick は、画像のことなら何でもできるツール。
コマンドラインで書けるので、よく使う処理をバッチファイルで書いておくと便利。

* [本家サイト](http://www.imagemagick.org/script/index.php)
    * ダウンロードはここから
    * 英語が苦手でなければ、コマンドとオプションの説明はここだけで十分
* [Windowsでの使い方](http://comicmall.jp/wiki.cgi?page=ImageMagick)
    * インストールの方法が詳しく載ってある
    * バッチファイルを書く時の注意点は要参照
* [コマンドの書き方例](http://www.riem.nagoya-u.ac.jp/~ohta/ImageMagick.html)
* [シェルスクリプトの書き方例](http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/image/magick_process.html)
    * cygwin や Linux はこちら
* [コマンドと出力見本](http://hashi4.civil.tohoku.ac.jp/soft/node43.html)
    * どんな画像加工をしたいか迷った時はこちら
プロミス処理のラッパーをつくる。


**UPDATE** 「即時関数」って連呼してたけど、非同期処理に対する同期処理の意味だった。言葉間違えてました!

[jQuery](https://jquery.com/) の [Deferred オブジェクト](https://api.jquery.com/category/deferred-object/)で Promise の実装をしていて、Deferred オブジェクト生成部分を共通化したくなったので、高階関数化して同期処理を Promise に変換する関数をつくってみた。

```javascript
// Underscore.js と jQuery が必要。

var promisify = function (func) {
  var funcPartial = function () {
    var funcArgs = _.toArray(arguments);
    var dfr = new $.Deferred(), promiseArgs = [ dfr.resolve, dfr.reject ];
    var timeoutId = setTimeout(function () {
      clearTimeout(timeoutId);
      func.apply(undefined, _.union(promiseArgs, funcArgs));
    }, 1);
    return dfr.promise();
  };
  return funcPartial;
};
```

これを使うと例えば;

```javascript
// 画像プリロードをする処理を上記高階関数内で定義して;
var imageLoaded = promisify(function (resolve, reject, url) {
  return $(document.createElement('img'))
  .on('load', resolve)
  .on('error', reject)
  .attr('src', url);
});

// 画像プリロード結果を返す Promise を生成できる。
imageLoaded('http://lorempixel.com/400/200/');
.then(function (ev) {
  var $el = $(ev.target), width = $el[0].naturalWidth, height = $el[0].naturalHeight;
  console.log('完了!', width, height);
}, function (err) {
  console.error('エラー!', err.message);
})
```

この高階関数 `promisify` を使って関数を定義すれば、単純な値から同期処理、イベント等全ての処理を、非同期処理として Promise を返すようにできる。

また、Deferred オブジェクトの生成過程をカリー化して集約しているので、jQuery の Deferred オブジェクトから [Q](https://github.com/kriskowal/q) や [ES6 の Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise) に変更したい時も、関数一つ修正すれば、全ての Promise の内部処理を入れ替えられる。

かなり便利! だと思う。
VALUE-DOMAINから他社へのドメイン移管（指定業者変更）を行うための前準備

## 概説
VALUE-DOMAINから他社へのドメイン移管を行う際の前準備をまとめました。

## FAQページで手順を確認

VALUE-DOMAINのサイトに、[「ドメインを他社へ移管したいのですが、手続き方法を教えてください」](https://www.value-domain.com/userguide/faq/53/)というタイトルでおおまかな移管手順が記載されていますので、まず確認しておきます。

## ドメインロックの解除

「ドメインロック」とは他社への移管を拒否する設定です。この設定が有効な場合、移管先で移管申請を行った際に自動的に拒否されてしまいますので、無効化しておきます。

メニューから「コントロールパネル」をクリックします。
![コントロールパネルボタン.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/32b4dbea-26c9-3ac5-6c5b-c6345c36885c.png)

「ドメイン」をクリックします。
![ドメイン.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/f2e5224e-fae1-8e08-96d8-ab421bbd0328.png)

「ドメインの設定操作」より「ドメインパスワード、ドメインロックの設定」をクリックします。
![ドメインの設定操作.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/643f4860-60e4-92d3-3e82-7dd789ab87f0.png)

ドメインロックが無効状態であれば、特に操作は不要です。
![無効状態.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/3039d203-c674-2f5c-9a8a-25a55ca086a1.png)

ドメインロックが有効状態であれば、チェックを外して変更ボタンをクリックします。
![有効状態.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/16cb6c9f-51a6-ae11-4ffd-a0e164775aa4.png)


## WHOIS登録情報の変更

WHOIS登録情報に管理会社の情報（代理公開の情報）が記載されていると、正しく移管できないため、すべてドメイン登録者の情報になっていること確認し、異なる場合は書き換えて更新します。

「ドメインの設定操作」より「WHOIS情報の管理・変更」をクリックします。
![ドメインの設定操作.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/643f4860-60e4-92d3-3e82-7dd789ab87f0.png)

「登録者番号のデータベースへの登録・変更」の画面で、すべて登録者の情報に書き換えて、登録・変更ボタンをクリックします。

![登録者番号のデータベースへの登録・変更.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/0fb8f08f-a334-36dd-a871-af115836732f.png)


## ネームサーバーの変更

VALUE-DOMAINのネームサーバーが設定されたままの状態の場合、ドメイン移管後に名前解決ができなくなってしまうため、あらかじめ移管先のネームサーバーを設定しておきます。


「ドメインの設定操作」より「ネームサーバーの設定」をクリックします。
![ドメインの設定操作.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/643f4860-60e4-92d3-3e82-7dd789ab87f0.png)


「ネームサーバー変更」の画面で、ドメイン移管先のネームサーバーを設定し、保存ボタンをクリックします。
※移管先のネームサーバーは各社によって異なるため、あらかじめ調べておきます。

![汎用JPのネームサーバー変更.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/448827a7-bc3a-8144-db94-f32d917776b3.png)


## 認証鍵（Auth-Code）の取得

認証鍵は「ドメインのパスワード」のようなもので、[FAQ](https://www.value-domain.com/userguide/faq/53/)には、「認証鍵（Auth-Code）をご確認の上、反映されましたら移管先のレジストラにて移管申請を行ってください。」との記載があるため、認証鍵を取得する必要があります。

また、[「認証鍵（Auth-Code）とは何ですか？どこにありますか？」](https://www.value-domain.com/userguide/faq/57/)のページには、「WHOIS情報変更の「認証鍵情報」より、認証鍵（Auth-Code）が取得可能となっております。」、「認証鍵をご希望の場合はサポートトピックよりご連絡ください。」といった記述があります。（若干矛盾してる気が）

上述の記載のとおり「WHOIS情報変更」の画面を確認しても、画面上には「認証鍵」といった情報が記載されていないため、サポートに問い合わせてみたところ以下の回答がきました。

「お問い合わせについてですが、JPドメインに認証鍵は存在しませんので、表示されません。」

そういうことは早く言ってくれよ。

ということで、私が管理している汎用JPドメインは認証鍵不要で移管申請が可能なことが分かりました。

汎用JPドメイン以外でも認証鍵が不要な可能性が十分に考えられるため、この辺りはご自分で問い合わせされた方がよいかと思います。

## ドメイン移管先で移管申請

ここまでの手順でVALUE-DOMAIN側の準備は整いましたので、移管先にて移管申請を行うことが可能です。

 - 参考URL
   - [ドメインを他社へ移管したいのですが、手続き方法を教えてください](https://www.value-domain.com/userguide/faq/53/)
   - [認証鍵（Auth-Code）とは何ですか？どこにありますか？](https://www.value-domain.com/userguide/faq/57/)
Yosemite風のアイコンが簡単に作れるツール作った


## はじめに
最近Electronを使った最強のTwitterアプリとかが話題ですが、みなさんアイコンのデザインとかどうしてますか？
UIはともかくとして、Dockにブチ込めるいい感じのアイコンデザインちょっと面倒くさい……。
そんな人のためにこんなツールを作ってみました。

![ogp.jpg](https://qiita-image-store.s3.amazonaws.com/0/74461/b86fbd35-8b99-2491-713e-199b7b65f393.jpeg)
Yosemite風アイコンジェネレーター
http://ls8h.com/yosemite-icon/

## API
使い方としては2通り用意しました。
まず、アイコンジェネレータのページから直接マウスやペンタブなどで普通に書いてみる方法。
もう一つは、APIです。
ここはQiitaですので、とりあえずkobitoのアプリアイコンを元にAPIを使って自動生成してみたいと思います。
まずは元となるアイコンを用意します。
![kobito.png](https://qiita-image-store.s3.amazonaws.com/0/74461/757b4fae-ce4a-8312-4d33-9109f90a18fd.png)
大きいですね。1024*1024のサイズで作っています。
Dockにあるアイコンを参考に、マークをいい感じの大きさにするといい感じです。
これをローカルに`kobito.png`という名前で保存しまして、保存先のディレクトリ内で下のようにコマンドを実行してみてください。

```
$ curl ls8h.com/yosemite-icon/api -F "icon_image=@kobito.png" -F "base_color=#79b74a" > icon-name.png
```

すると少しだけまったのちに、実行したディレクトリ内にicon-name.pngというファイルがダウンロードされているはずです。
作られたアイコンはこんな感じになります。
![icon-name.png](https://qiita-image-store.s3.amazonaws.com/0/74461/1dece09b-04eb-971f-4509-2fe6f9a5c7ee.png)

お手軽です。
実際にアプリで使うにはicnsに変換する必要があります。
今回はオンラインのサービスで変換しました。

Online icon converter for png, ico, and icns - iConvertIcons
https://iconverticons.com/online/

下のように、「icns file」とかかれば場所をクリックすればicnsファイルが手に入ると思います。
![スクリーンショット 2015-09-03 16.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/74461/01f092af-e83e-afd1-7d8b-b82de1d89eee.png)

生成されたアイコンをアプリの中にあるデフォルトのものと置き換えて、実際にDockに入れてみると下のような見た目になります。
![スクリーンショット 2015-09-03 16.18.16.png](https://qiita-image-store.s3.amazonaws.com/0/74461/c61a1860-50a9-e5e6-bba1-abf259db94b0.png)

いい感じですね！

それではみなさんよいネイティブアプリライフを！
Apache Chef で AWS EC2 を管理する

# 目標
* Chef 管理下で EC2 インスタンスに以下の環境設定を行う
  * locate コマンドを使えるようにする
  * Oracle Instant Client を Chef 管理の下、インストールする

# 環境
* Amazon Linux AMI 2015.03.1 x86_64 HVM GP2

# Chef Solo 導入手順

## 前提確認

```ruby:
$ ruby -v
ruby 2.0.0p645 (2015-04-13) [x86_64-linux]
```

## Chef Client インストール

公式から Chef Client をダウンロードする。Amazon Linux なので RHEL 版を使用。

```ruby:
$ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/7/x86_64/chef-12.4.1-1.el7.x86_64.rpm
$ sudo rpm -ivh chef-12.4.1-1.el7.x86_64.rpm
warning: chef-12.4.1-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:chef-12.4.1-1.el7                ################################# [100%]
Thank you for installing Chef!
```

# Chef Server 導入手順
T.B.D

# 参考


* Chef Server を始める#1
  * http://dev.classmethod.jp/server-side/chef-server-install/
Wekan(旧Libreboard）のインストールメモ

メモ程度に
さくらVPSで使用したい
・LibreboardはWekanに変更された

・https://github.com/wekan/wekan/wiki/Install
にインストール方法が記載されている。DockerとかSanddtormはわからん。

・node.jsは必ずv1.10.*を使うこと。（1.10.40で動いた）
http://qiita.com/sawapi/items/adfc11465d034f4f2cf9
あたりがnodeのインストールに使える

・MongoDBはインストールしたら起動しなければ途中でエラーを吐く
　http://qiita.com/ykyk1218/items/1c1824e77fb8af78bcf5
このあたり参照
コマンドプロンプト(cmd.exe)上でuniqするワンライナー

- uniq

```bat
for /f "usebackq tokens=*" %a in (`type ファイル名`) do @(if not !BK!==%a echo %a)&&set BK=%a
```

- uniq -d

```bat
for /f "usebackq tokens=*" %a in (`type ファイル名`) do @(if !BK!==%a echo %a)&&set BK=%a
```
DataDogはホスト名がRFC 1123に準拠してないとインストール失敗する

インストールコケたのでメモ
# 確認した環境
- Amazon Linux  (2015.03.0.x86_64)
- datadog-agent (1:5.4.3-1)


# インストール

```
[root@hoge_hoge ~]# DD_API_KEY=******************* bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/dd-agent/master/packaging/datadog-agent/source/install_agent.sh)"
.....
.....
2015-08-26 11:24:15,824 | WARNING | dd.collector | util(util.py:161) | Hostname: hoge_hoge is not complying with RFC 1123
2015-08-26 11:24:15,825 | CRITICAL | dd.collector | util(util.py:227) | Unable to reliably determine host name. You can define one in datadog.conf or in your hosts file
Traceback (most recent call last):
  File "/opt/datadog-agent/agent/agent.py", line 375, in <module>
    sys.exit(main())
  File "/opt/datadog-agent/agent/agent.py", line 219, in main
    hostname = get_hostname(agentConfig)
  File "/opt/datadog-agent/agent/util.py", line 228, in get_hostname
    raise Exception('Unable to reliably determine host name. You can define one in datadog.conf or in your hosts file')
Exception: Unable to reliably determine host name. You can define one in datadog.conf or in your hosts file
.....
```

こんな感じのエラーが多数出てくる。
RFC 1123 に準拠しないのでエラーと出てる。


# 回避策
エラーメッセージに書いてある通り、 datadog.conf を編集してRFC1123に準拠する名前に書き換える必要が有る。
AmazonLinuxの場合は /etc/dd-agent/datadog.conf を編集


vim /etc/dd-agent/datadog.conf

```
[Main]

....


# Force the hostname to whatever you want.
hostname: hogehoge
```


# 関連するソース 
https://github.com/DataDog/dd-agent/blob/master/util.py

RFC1123に準拠しているか正規表現でチェックしてる。

明示的にチェックしてる理由は分からないけれど、Datadog導入を考えている場合はホスト名はRFC1123に準拠してた方がベター。
Hadoop2をJava8で動かしたときにハマった

Java 8でHadoopを動かしていたハマった点です。

# エラー事象

非力なノートPCで動かすために、各プロセスのヒープサイズを軒並み下げてから実行しようとしたのですが、いつものPi計算MRジョブを実行しようとして以下のエラーにハマリました。


```
15/09/02 22:49:41 INFO mapreduce.Job: Job job_1441201719441_0001 failed with state FAILED due to: Application application_1441201719441_0001 failed 2 times due to AM Container for appattempt_1441201719441_0001_000002 exited with  exitCode: -103
For more detailed output, check application tracking page:http://localhost:8088/cluster/app/application_1441201719441_0001Then, click on links to logs of each attempt.
Diagnostics: Container [pid=39344,containerID=container_1441201719441_0001_02_000001] is running beyond virtual memory limits. Current usage: 71 MB of 1 GB physical memory used; 2.7 GB of 2.1 GB virtual memory used. Killing container.
```

なんじゃこのエラーは...
ん？

```
Current usage: 71 MB of 1 GB physical memory used; 2.7 GB of 2.1 GB virtual memory used.
```

(　ﾟдﾟ)

(つд⊂)ｺﾞｼｺﾞｼ

(；ﾟдﾟ)

(つд⊂)ｺﾞｼｺﾞｼ
　　_, ._
（；ﾟ Дﾟ）
えっ、virtual memoryが2.7GB!?

そりゃ、だめだ。



# 原因

職場の有識者の人に聞いたら、「Java 8からVirtual memoryの使用量が大きくなったんですよー」とのこと。

知らなかった。。。

どうやらクラスやメソッドをノードしていた領域がヒープ領域からネイティブ領域に移動されたことが主な原因のようです。

ググってみつけた以下のブログがわかりやすかったです。

Java8のHotSpotVMからPermanent領域が消えた理由とその影響
http://equj65.net/tech/java8hotspot/

MaxPermSizeオプションが使えなくなるという形で気づくひとが多いみたいですね。
Java 8からはMaxMetaspaceSizeで指定せいや、とのこと。

# 対策

HadoopのJIRAだと以下チケットにて報告されています。
https://issues.apache.org/jira/browse/HADOOP-11364

* JVMオプションにて以下でネイティブ領域の使用最大量を制限する
    * -XX:ReservedCodeCacheSize
    * -XX:MaxMetaspaceSize 
    * -XX:CompressedClassSpaceSize
* Hadoopのvirtual memory チェック機構を無効化する：
  yarn-site.xmlにてyarn.nodemanager.vmem-check-enabledをfalseに
* Hadoopのvirtual memory チェックのしきい値を上げる：
  yarn-site.xmlにてyarn.nodemanager.vmem-pmem-ratioの値をデフォルトの2.1より大きくする（エラーがでなくなるまで）

どれかで対応する感じみたいです。
とりあえず１つ目の対処でエラーが出なくなったのでよしとします。
uGUIで円グラフ

NGUIからそろそろuGUIを勉強しようと思って作ったもの。
マスクが便利だったので円グラフをさくっと作ってみました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/da2f1e1d-0955-521b-fdac-c6ddc9a055e6.gif" width="400px">

##仕組み
仕組み的には簡単で、画像のImage TypeをFilledにして、zの回転角度を足しただけ。
アニメーションはマスク
使用画像は円の白い画像１枚のみです。

##ヒエラルキー
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/21758ae4-c276-f8fc-0b50-e35f9009cd86.png" width="200px">
Canvas配下はこんな感じ。

- Bg :背景画像
- Roulette : Maskとマスク用の画像をアタッチしたもの(ルーレットじゃないけど)
 - Plate : 一つの色。これを複製して円グラフを作っています  
- ResetBtn : リセットボタン
- AnimBtn : アニメーションボタン

Imageの設定は

- imageType:Filled
- FillMethod:Radial 360
- FillOrigin:Top

にしています
##script
実はルーレットを作ろうとしていたのでRouletteManager.csという名前になっております。

```csharp

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class RouletteManager : MonoBehaviour {

	public Transform roulette;
	public GameObject plate;
	
	private int[] sizeList;

	void Awake()
	{
		Init();
	}

	public void Reset()
	{
		Init();
	}

	public void Show()
	{
		StartCoroutine(ShowAnim());
	}

	// 円グラフが表示される演出
	private IEnumerator ShowAnim()
	{
		bool flg = true;
		roulette.GetComponent<Image>().fillAmount = 0;
		float speed = 0.05f;
		while(flg)
		{
			roulette.GetComponent<Image>().fillAmount += speed;
			if(roulette.GetComponent<Image>().fillAmount >= 1) flg = false;
			yield return new WaitForSeconds(0.01f);
		}
	}

	private void Init()
	{
		// 既に作成したグラフがあれば削除する
		foreach(Transform tran in roulette)
		{
			if(tran.name != "Plate") Destroy (tran.gameObject);
		}

		int kindCount = Random.Range(3, 8);	 // 最大の色の数
		sizeList = new int[kindCount];		 // 割合のリスト
		int max = 100;						// グラフの比率 100が最大　ここからどんどん引いていく
		for(int i = 0; i < kindCount; i++)
		{
			if(max <= 0) break;
			// Plateをコピーしてサイズなどを調節
			GameObject plateCopy = Instantiate(plate) as GameObject;
			plateCopy.transform.SetParent(roulette);
			plateCopy.transform.localPosition = Vector3.zero;
			plateCopy.transform.localScale = Vector3.one;

			// 最後の１つの場合は残りの全てをあてはめる
			if(i == kindCount - 1)
				sizeList[i] = max;
			else 
			{
				// あまりに大きいのと小さいのはいやだったのでちょっといじいじ
				int no = max;
				if(max > 40) no = 40;

				if(max < 10)
					no = max;
				else
				{
					sizeList[i] = Random.Range(1, no + 1);
					if(max - sizeList[i] < 10) sizeList[i] = max;
				}
			}
			// zの角度を設定
			plateCopy.transform.localEulerAngles = new Vector3(0, 0, (100f - (float)max) / 100f * -360f);

			// 円のサイズをfillAmountに設定
			plateCopy.GetComponent<Image>().fillAmount = (float)sizeList[i] / 100f;

			// 色をランダムに設定 明るめにしてます
			plateCopy.GetComponent<Image>().color = new Vector4(Random.Range(0.6f, 1f), Random.Range(0.6f, 1f), Random.Range(0.6f, 1f), 1);;
			plateCopy.SetActive(true);
			max -= sizeList[i];

		}
		roulette.GetComponent<Image>().fillAmount = 1;
	}
}

```
ElixirのシェルIExの履歴の保存

## 【更新】OTP20

OTP20からErlangの`-kernel shell_history enabled`というフラグで履歴が保存されるようになったので、常にこの設定が使われるように`ERL_AFLAGS`を設定すれば良いです。例えば`~/.zshrc`辺りに

```
export ERL_AFLAGS="-kernel shell_history enabled"
```

を追加すれば良い。

## 元記事

最近Elixirを使い始めているのですが、Elixirのシェルに１つ不満がありました。セッションを閉じると履歴が保存されません。pryやipythonに慣れていたもので、その機能が欲しかったです。

調べてみたところで、Elixirの問題ではなく、Erlangの問題らしいので、Erlangで使われているワークアラウンドで行けるとのことでした。

[erlang-history](https://github.com/ferd/erlang-history)というプロジェクトが問題なく動いてくれました。

```sh
git clone https://github.com/ferd/erlang-history.git 
cd erlang-history
make install
```

で無事に履歴が保存されるようになれました。Erlangのインストールディレクトリに書き込み権限がない場合は、`make install`の時は`sudo`が必要になります。
PostgreSQLでbyteaデータをファイルに書き出す関数

PostgreSQLのpg_file_write()を参考に、byteaデータをファイルに書き出す関数pg_file_write_binary()を作成します。

以下の内容のpg_file_write_binary.cを用意。

```c
#include "postgres.h"

#include <sys/stat.h>

#include "utils/builtins.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(pg_file_write_binary);

Datum
pg_file_write_binary(PG_FUNCTION_ARGS)
{
	FILE	   *f;
	char	   *filename;
	text	   *data;
	int64		count = 0;

	if (!superuser())
		ereport(ERROR,
				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
			  (errmsg("only superuser may write file"))));

	/*
	 * Basically convert_and_check_filename() should be called to
	 * validate the given filepath. But text_to_cstring() is used instead
	 * for simplicity's sake.
	 */
	filename = text_to_cstring(PG_GETARG_TEXT_P(0));
	data = PG_GETARG_BYTEA_P(1);

	if (!PG_GETARG_BOOL(2))
	{
		struct stat fst;

		if (stat(filename, &fst) >= 0)
			ereport(ERROR,
					(ERRCODE_DUPLICATE_FILE,
					 errmsg("file \"%s\" exists", filename)));

		f = fopen(filename, "wb");
	}
	else
		f = fopen(filename, "ab");

	if (!f)
		ereport(ERROR,
				(errcode_for_file_access(),
				 errmsg("could not open file \"%s\" for writing: %m",
						filename)));

	if (VARSIZE(data) != 0)
	{
		count = fwrite(VARDATA(data), 1, VARSIZE(data) - VARHDRSZ, f);

		if (count != VARSIZE(data) - VARHDRSZ)
			ereport(ERROR,
					(errcode_for_file_access(),
					 errmsg("could not write file \"%s\": %m", filename)));
	}
	fclose(f);

	PG_RETURN_INT64(count);
}
```

pg_file_write_binary.cをコンパイル。
/PATH_TO_PGSQLにはPostgreSQLのインストール先ディレクトリを指定。

```bash
$ gcc -fpic -c pg_file_write_binary.c -I/PATH_TO_PGSQL/include/server
$ gcc -shared -o /PATH_TO_PGSQL/lib/pg_file_write_binary.so pg_file_write_binary.o
```

pg_file_write_binary()をPostgreSQLに登録。

```psql
CREATE FUNCTION pg_file_write_binary(text, bytea, boolean default false) RETURNS bigint AS 'pg_file_write_binary' LANGUAGE C STRICT VOLATILE;
```

pg_file_write_binary()は、以下の引数を受けとり、書き出したデータのバイト数をbigint型で返却します。

- 引数1: データを書き出すファイルのパス (text型)
- 引数2: 書き出すデータ (bytea型)
- 引数3: データをファイルに追記するかどうか (boolean型)
 - 未指定の場合はfalseで、追記しない

pg_read_binary_file()で読み込んだバイナリデータ(bytea型)を、pg_file_write_binary()で別ファイルに書き出してみる。

```psql
SELECT pg_file_write_binary('pg_control.bak', pg_read_binary_file('global/pg_control'));
```

元のファイルglobal/pg_controlと書き出し先のファイルpg_control.bakを比較する。

```bash
$ diff $PGDATA/global/pg_control $PGDATA/pg_conrol.bak
```
PackerでDocker Imageを作成してcowsayする

PackerでDocker Imageを作成してcowsayします

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 前提
dockerがインストールされていること

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-files-o" style="font-size:1em;"></i> 仕様
|項目|内容|
|:--|:--|
|ホストOS|Ubuntu 14.04 LTS|
|プロビジョンニング|shell|

コンテナにはcowsayをインストールします

### <i class="fa fa-file-text" style="font-size:1em;"></i> json
```json:demo.json
{
    "builders":[{
        "type": "docker",
        "image": "ubuntu:trusty",
        "export_path": "image.tar"
    }],
    
    "provisioners":[
    {
        "type": "shell",
        "inline": [
            "apt-get -y update",
            "apt-get install -y cowsay"
        ]
    }
    ],
    
    "post-processors": [{
        "type": "docker-import",
        "repository": "tbpgr/demo",
        "tag": "0.1"
    }]
}
```

### <i class="fa fa-cubes" style="font-size:1em;"></i> Packer build
```bash
$ packer build demo.json
```

### <i class="fa fa-image" style="font-size:1em;"></i> imageの確認
```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
tbpgr/demo          0.1                 ec18fd15e1f0        52 seconds ago      186.7 MB
ubuntu              trusty              91e54dfb1179        12 days ago         188.4 MB
```

### <i class="fa fa-child" style="font-size:1em;"></i> コンテナの起動
```bash
$ docker run tbpgr/demo:0.1 /usr/games/cowsay "Packer"
docker run tbpgr/demo:0.1 /usr/games/cowsay "Packer"
 _________________________
< Packer >
 -------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Docker - Builder - Packer](https://www.packer.io/docs/builders/docker.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Packerを使ってChef/Puppet/AnsibleでDockerのイメージをつくる - SOTA](http://deeeet.com/writing/2014/03/02/build-docker-image-by-packer/)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [VagrantでPackerの作業環境を整える](http://qiita.com/shiwork/items/d95210cb1dd26b167610)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [docker-pull failing after docker-import - Packer Issues](https://github.com/mitchellh/packer/issues/1269)
TitaniumでAndroidのPush通知を実装したときにめちゃくちゃつまった


タイトルの通り，TitaniumでAndroidのPush通知を実装しようとした際，結構詰まったので備忘録的に．

参考にした記事
---
[Titanium の Android で GCM(Push通知) Google Play Service版](http://qiita.com/hntn/items/a83072e441ccf4fc715c)

参考にさせていただきました．
他にもAndroidManifest.xmlについての記事を結構読んだ．

AndroidManifest.xmlを置いておくとうまく動かない
---
もう上の記事で実装までやってるし，正直そこまで詰まらないだろうなと思ってた．
詰まった原因は`project/platform/android/AndroidManifest.xml` 
AndroidManifest.xmlを置いてると上の記事の流れに沿ってやっていくだけじゃうまくいかなかった．
流れに沿ってやっただけだとdeviceTokenも取れなかった．
ただ，deviceTokenを取得するところまではさほど難しくなかった．
通知を受け取る部分がうまくいかず結構詰まってた．

ちなみにregistration IDを取得するためには，AndroidManifest.xmlに`<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>`を追加すれば取得できる．(確か)

timodule.xmlの中身をAndroidManifest.xmlに書き写すことで通知を受け取れるようになった
---
下記のAndroidManifest.xmlはnet.iamyellow.gcmjsのtimodule.xmlから書き写した部分やら通知を受け取るための権限やらを抜粋したもの．

```xml:project/platform/android/AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.pushtest" android:versionCode="1" android:versionName="1.0">
	<application ...>
       .
       .
       .
		<activity android:name="net.iamyellow.gcmjs.GcmjsActivity" android:noHistory="true" android:theme="@style/Theme.Titanium">
			<intent-filter>
				<action android:name="android.intent.action.VIEW"/>
				<category android:name="android.intent.category.DEFAULT"/>
				<category android:name="android.intent.category.BROWSABLE"/>
			</intent-filter>
		</activity>
       .
       .
       .
		<service android:name="net.iamyellow.gcmjs.GCMIntentService"/>
		<service android:name="net.iamyellow.gcmjs.GcmjsService"/>
		<receiver android:name="net.iamyellow.gcmjs.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
			<intent-filter>
				<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
				<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
				<category android:name="com.example.pushtest"/>
			</intent-filter>
		</receiver>
	</application>
	<permission android:name="com.example.pushtest.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
	<uses-permission android:name="com.example.pushtest.permission.C2D_MESSAGE"/>
	<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
	<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
	<uses-permission android:name="android.permission.WAKE_LOCK"/>
	<uses-permission android:name="android.permission.INTERNET"/>
    .
    .
    .
</manifest>
```

今回，android:name="net.iamyellow.gcmjs.~"としなきゃいけないところをandroid:name="com.example.pushtest.~"としていたため，`Unable to instantiate receiver com.example.pushtest.~`みたいなエラーをずっと吐かれて詰まってた．
重要なのは android:name="net.iamyellow.gcmjs.~" のように android:name の値を`使いたいモジュールのID.モジュールで定義したクラス名`にするということ．
あとは通知を受信するために必要な権限などを追加すること．(permissionやらuses-permission)

AndroidManifest.xml置いておくと，timodule.xmlって読み込まれないっぽい...?

結構初歩的なところでつまずいてた気がする...(´･ω･`)