OmniAICreator/Qiita-1.07M huggingface dataset:
virt-install実行にの設定値メモ

virt-installを使用したKVMゲスト構築方法で細かい設定を記述したものがなかったので
ざっくりと標準的なものをメモ程度においておく。

結構昔に趣味で作ったので説明内容は怪しいかもですが、ご愛嬌ということで。


| オプション | サプオプション | 値 | 説明
|:-----------|:------------|:------------|:------------|
|connect||qemu:///system|URIでハイパーバイザに接続します。|
|name||vm-hostname|作成するゲストのドメイン|
|hvm|||完全に仮想化されたゲストとしてゲストを設定します。|
|accelerate|||カーネル加速化機能を使用します。|
|disk|||ディスクファイルやサイズ(GB)|
||path|/var/lib/libvirt/images/vm-hostname.img||
||size|10G||
||device|disk||
||bus|virtio||
||format |raw||
|vcpus||1||
|ram||1024||
|network|||ネットワークタイプ指定|
||bridge=br0|||
||model=virtio|||
|vnc||--vnc||
|keymap||ja||
|os-type|linux||完全な仮想化ゲストのオペレーティング・システム・タイプを設定します。 設定可能な値は、windows、unix、otherおよびlinuxです。|
|os-variant|rhel6||完全な仮想化ゲストのオペレーティング・システム・バリアントを設定します|
|location|http://ftp.iij.ad.jp/pub/linux/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso||準仮想化ゲストのインストール・ソースを設定します（nfs:host:/path、http://host/path、ftp://host/pathなど）|
|noautoconsole|||ゲスト・コンソールに自動的に接続しません|
|extra-args|||準仮想化ゲストのインストーラに渡される追加の引数です。ksとかnetwork設定が出来る|
|pxe||-–pxe|pxebootしたい場合に使用する。|


### サンプルコマンド

```
virt-install \
--connect=qemu:///system \
--name=vm-host-xxx \
--hvm \
--accelerate \
--disk path=/var/lib/libvirt/images/vm-host-xxx.img,size=20G,device=disk,bus=virtio,format=raw \
--vcpus=2  \
--ram=1024 \
--network bridge=br0,model=virtio \     
--network bridge=br1,model=virtio \
--keymap=ja \
--location=http://ftp.iij.ad.jp/pub/linux/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso \
--noautoconsole \
--os-type=linux \
--os-variant rhel6 \
--vnc \
--extra-args="ksdevice=eth0 ks=http://どこかのドメイン/ks.cfg ip=192.168.0.11 netmask=255.255.255.0 gateway=192.168.0.1 dns=8.8.8.8　console=tty0 console=ttyS0,115200n8"

```


### 一言メモ

#### disk

* modelは特に指定がない限り、標準のvirtioが良い。

#### network

* modelは特に指定がない限り、標準のvirtioが良い。
* 複数インターフェースを作成するときはbridgeを複数作る。

#### pxe

* pxebootは「 -- pxe 」で設定するとpxebootします。
* locationと併用した場合はどっちが優先とかはわすれた。。。
* pxeの話ですが、設定IPを指定したい場合はextra-agesでipなどの設定項目を渡してあげる。

#### extra-args

* ksファイルを指定出来る
* network設定が出来る
* nicが複数のばあい ksdeviceで指定できる。
 

cf: 
* http://otndnld.oracle.co.jp/document/products/oracleVM/220/generic/B57076-01/commandline.htm 
* http://e-garakuta.net/techinfo/doku.php/linux/kvm
State Machine CompilerのWebUI付きDockerコンテナの使い方


はじめに
==========

[State Machine Compiler](http://smc.sourceforge.net/)は、複雑なStateMachineを簡単に生成してくれる便利ツールです。
ただし、JavaのInstallが必要だったり、図を出力しようとしたらGraphvizが必要だったり、割と準備が大変です。

そこで、SMCをWebから操作できるUIを付けたサービスを

http://goodparts.d.yumemi.jp/

に公開しているのですが、誰がメンテしているかわからないサービスを業務などで利用するのは気が引けると思います。

そこで、誰でもPrivateに使えるようにDockerに詰めて公開してあるので、その使い方について紹介します。

準備
=====

対象システムにDockerをInstallしておきましょう。
今回試したversionは1.2.0になります。
それ以前のDockerでも多少コマンドは違うかもしれませんが、大抵動くと思います。

サービスの利用方法
===========

起動方法
-------
動作として、過去に変換したデータを保存する仕組みになっています。
その内容はsqliteファイルとして存在します。
その部分のみ dockerコンテナが再起動しても残しておきたいので、dockerのHost側のDirに配置されるようにします。

そのdocker host側のDirを `/var/lib/smc` とした場合、
以下のコマンドを実行することで、サービスが起動します。

```bash:start_service
% docker run -d -p 8000:8000 -p 9000:9000 -p 10022:22 -v /var/lib/smc:/application/GoodParts/mnt mokemokechicken/smc_service
```

ワンライナー！ｗ Dockerすごい！！

ちなみに初回はネットワークから数GBのImageを取得するので時間がかかりますが、2回目以降は一瞬です。

### 注意1： 8000,9000番portを開けて下さい
`<docker host>`の8000と9000番 portにアクセスできる必要があります。
AWSなど使っている場合はportを開けるようにしてください。

### 注意２： Macでboot2dockerを使っている時

boot2dockerを使っている場合、 sqliteファイルが置かれる docker host の dir というのは、
Macのファイルシステムではなく、VirtualBox内のVMのファイルシステムになります。
`boot2docker ssh` などでVMにログインすると、確かにファイルがあることが確認できます。

アクセス方法
------------

無事起動したら、ブラウザで `http://<docker_host>:8000/` にアクセスします。
この `<docker host>` は、ブラウザからみたDocker HostのIPかHost名になります。

Macでboot2dockerを使っている場合、 `export DOCKER_HOST=tcp://<XX.XX.XX.XX>:4243` などとすると思いますが、その `<XX.XX.XX.XX>` が`<docker host>`になります。


SSHでログインしたい時
------------

動作中のDockerコンテナにアクセスしたい場合は、SSHが起動しているのでそこから可能です。

```bash:ssh_login
% ssh -p 10022 root@<docker_host>
(password is 'rootroot')
```


良い所・悪い所
==========

良い所
----------

### このSMC WebUIの良い所


* ブラウザからアクセスできるので、誰でも（使い方がわかっていれば）使える。
* 生成したStateMachine CodeにURLを埋め込む機能があるので、そのURLをクリックすると、StateMachineの状態図などを見ることができるし、編集もでき、誰とでもStateMachineを共有できる
* swift対応（まだベータ版）の独自拡張がしてあるので、swift用のStateMachineも生成可能！

### オススメの使い方

オンプレミスでもクラウドでもどこでも良いので１つ配備しておくと良いです。
すると、「アクセスできる人たち全員で共有」でき、「昔の状態もソースに埋め込まれたURLから復元できるので修正も容易」です。

### コンテナの作成方法が公開されている

下記に公開しています。悪い物は入っていないので安心して下さい。
https://github.com/mokemokechicken/smc_service_docker

ちなみにbuildするのに、私のMac Miniで30分くらいかかります。

悪い所
-------

* ソース、汚い。（なんかいつも、そんなこと言っている気がする --）
* もっと拡張する予定の仕組みだったのに、SMCしかないので、そういう意味でUIが全然イケてない
* そもそもUIがいけてない
* Docker内でrootアカウントでサービスが起動している…

つまり、動くから良いよね、というシロモノです。すみません。

さいごに
=====

こういうちょっとしたシステムを配布するのに Docker はかなり便利ですよね。
でも、今後のUpdateをどう配布するのかとかイマイチイメージできていません。
こういうのも徐々に慣れていきたいですね。

もしgeneratorやUIやDockerなどをカスタマイズしたら、pull request頂けると非常にありがたいです！

SMC便利なので是非使ってみてください。
[Objective-C] iOS8のUITextView.textに特殊文字を入れるとクラッシュする


未だに不明なクラッシュ・・。
以下のようなコードだけでクラッシュします。
（ちなみにiOS7では問題なく起動できる）

[追記]
過去に似たような問題（[Mac OS XとiOSで特定のアラビア語文字列を表示させるとクラッシュする問題が見つかる | スラッシュドット・ジャパン アップル](http://apple.slashdot.jp/story/13/09/03/0824238/Mac-OS-XとiOSで特定のアラビア語文字列を表示させるとクラッシュする問題が見つかる)）があった。
もしかしたらこれがiOS8で再燃したのかもしれない。


```objc:HogeViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *text = @"(੭ु´͈ ᐜ `͈)੭ु⁾⁾";
    CGRect frame = CGRectMake(200, 200, 150, 88);
    UITextView *view = [[UITextView alloc] initWithFrame:frame];
    view.text = text; // ←ここでクラッシュ！
    [self.view addSubview:view];
}
```

この顔文字の文字列を`textView.text`に設定しようとするとクラッシュします。
文字列の並びを変えたりすると落ちないのでコードの並び？

ちなみに`UITextField`で試すとクラッシュしませんでした。
謎い・・。


[追記2]

社内のエンジニアがクラッシュする文字列を特定してくれました。
ただ、これも組み合わせなどでクラッシュしたりしなかったりなので確定ではなさそうです。

が、とりあえず組み合わせ文字のため、一括して消してしまっても見た目はそれほど変わらないため、iOSの対応が終わるまでは一括して消してしまってもいいかもしれません。

以下のようにすることでクラッシュしないことを確認できました。

```objc:non-crash
// クラッシュする文字
static NSString *text = @"(⌯˃̶᷄ ॣ˟ ॣ˂̶᷄⌯) ";

// 以下のunicodeを持つものを組み合わせるとクラッシュする
- (NSArray *)exceptUnicode
{
    return @[
        @"0900", @"0901", @"0902", @"0903",
        @"093a", @"093b", @"093c", @"093e", @"093f",
        @"0940", @"0941", @"0942", @"0943", @"0944", @"0945", @"0946", @"0947", @"0948", @"0949",
        @"094a", @"094b", @"094c", @"094d", @"094e", @"094f",
        @"0953", @"0954", @"0955", @"0956", @"0957",
        @"0962", @"0963"
    ];
}

// パターンを生成
NSMutableString *pattern = [NSMutableString string];
for (NSString *unicode in self.exceptUnicode) {
	[pattern appendString:[NSString stringWithFormat:@"\\u%@|", unicode]];
}
    
    
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                       options:0
                                                                         error:nil];
 
    
NSString *t1 = text.mutableCopy;   
[regex replaceMatchesInString:t1
                      options:0
                        range:NSMakeRange(0, t1.length)
                 withTemplate:@""];
```
aws-sdk-rubyを使ってSESでメール送信する


参考： http://akasata.com/articles/293

ここを参考にしてみたんですが、~~NKF使ってutf8に変換してるのに、 ISO-2022-JP指定していたりして、謎だったので、素直に何もせずに送信してみたらうまく動いたので残す。~~
→よく見たら `-w`じゃなくて `-jw`ですね。ソース見たらISO-2022-JPになってるようなのでウソでした。すみません。

あと、SESはregionが限られてるので、SESだけ別regionはどうすんの？って思って調べたら AWS.configであっさりと動いたのでここも改善。かなりシンプルになりました。

もちろん受信したメールのソースも見ましたが、タイトルもMIMEエンコードされてるし、utf8指定されてるので、大丈夫そうでした。

蛇足：まさか今さらISO-2022-JP対応必須とか無いとは思いますが、必要ならリンク元のNKFのところをちゃんとiso-2022-jp変換にしてあげれば良いのでは無いかと。

```
AWS.config(
  access_key_id: 'ACCESS_KEY_ID',
  secret_access_key: 'SECRET_ACCESS_KEY',
  region: 'ap-northeast-1',
  ses: { region: 'us-west-2' }
)

ses = AWS::SimpleEmailService.new

body_text = <<-EOS
こんにちは。
このメールはテストメールです。

おしまい
EOS

subject = 'サブジェクトです'

from_email = "test@from.com"
to_email = "test@to.com"

ses.send_email(
  :subject => subject,
  :to => to_email,
  :from => from_email,
  :body_text => body_text,
)

```
scipyはpython 2.7.8だとpip installでつまずく

pyenv virtualenv@Mavericks環境下でpython 2.7.8を使っている際に`pip install scipy`でエラーが発生しインストールできない現象に遭遇．
python 2.7.5や3.4.1だと問題なくインストールできた．

原因
===
`pip install scipy`を実行すると普通はwheelがダウンロードされ，コンパイルされることなくインストールされる．
python 2.7.5や3.4.1などではwheelがダウンロードされるため何事もなくインストールされる．
しかし，python 2.7.8だとなぜかwheelではなくソースコードのtar.gzがダウンロードされ，コンパイルが始まってしまう．
その際にscipyのnumpy依存が適切に処理されず，エラーが起きる．scipyのバグ？


解決方法１
========
Python 2.7.8を使うのをあきらめ2.7.5を使う．
wheelを使ったインストールがされるため，依存関係のトラブルがおきない．
scipyを使ったモジュールのインストールでもトラブらなくなる．

解決方法２（未確認）
================
先にnumpyをインストールしてからscipyをインストールすることで依存関係はクリアできる．
しかし，scipyインストール時にFortran compilerが必要だと怒られる．
ここから先は，
https://gist.github.com/goldsmith/7262122
に手順がのっているが，自分は試していない．
PHPでGeoIPを使う

## 概要
GeoIPはIPアドレスから国を特定することができるPHPのライブラリ。
アクセス解析で役に立つ。
※CentOS 6.5を使用

## pearのインストール
インストール済みなら、不要。

    $ yum install php-pear

## Net_GeoIPのインストール

    $ pear install Net_GeoIP

## データベースのダウンロード

    $ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
    gunzip GeoIP.dat.gz

## ソースコード
```php:geoip.php
<?php
  require_once "Net/GeoIP.php";

  $geoip = Net_GeoIP::getInstance("./GeoIP.dat");

  try {
    echo $geoip->lookupCountryCode("1.161.19.32");
    // 結果 TW
  } catch (Exception $e) {
    // 例外処理
  }
```

## ドキュメント
http://pear.php.net/manual/ja/package.networking.net-geoip.php
iMac上のVirtualBoxでWindows 10 Technical Previewのネットワーク接続を有効にする方法

VirtualBoxのアダプタータイプがPC-net FAST IIIではつながりませんでした。
Intel PRO/1000 MT Serverにしたらつながりました。

![スクリーンショット 2014-10-03 17.47.42.png](https://qiita-image-store.s3.amazonaws.com/0/6800/054ca760-c0d9-b6d6-7dad-8c301c39fcb2.png)
【備忘録】Swiftでプロジェクト内のplistを読み込む方法

需要があるかわからないですが、Swiftであらかじめプロジェクトに入れておいた設定ファイル(.plist)を読み込む必要があって、小一時間詰まったのでメモ。

test.plistがtest.swiftと同じ階層にあるなら、次のように書けます。階層が関係するかはわかりませんが。

```lang:test.swift
    var filePath = NSBundle.mainBundle().pathForResource("test.plist", ofType:nil )
    var dic = NSDictionary(contentsOfFile:filePath!)
```

これだけで、.plistファイルをNSDictionary型で取り出せます。
意外と簡単です。
複数メンバ変数をキーにソート処理

http://qiita.com/piyo7/items/e23670cd89502680649c より。

```cpp:sort_by.hpp
#include <algorithm>
#include <iterator>
#include <tuple>

template <
  typename Iterator,  // RandomAccessIterator
  typename... Ts,
  typename U = typename std::iterator_traits<Iterator>::value_type>
void sort_by(Iterator begin, Iterator end, Ts U::*... pm)
{
  static_assert(0 < sizeof...(Ts), "empty sort key");
  std::sort(begin, end, [&pm...](const U& x, const U& y){
    return std::tie(x.*pm...) < std::tie(y.*pm...);
  });
}
```

```cpp:demo_sort_by.cpp
#include <iostream>
#include <vector>

struct S { int x,y,z; };

int main()
{
  std::vector<S> vs = {{2,4,6}, {2,3,7}, {1,5,6}, {1,3,8}, {0,5,7}, {0,4,8}};

  std::cout << "--sort vector by x" << std::endl;
  sort_by(std::begin(vs), std::end(vs), &S::x);
  for (auto& e : vs)
    std::cout << e.x << e.y << e.z << std::endl;

  S as[] = {{2,4,6}, {2,3,7}, {1,5,6}, {1,3,8}, {0,5,7}, {0,4,8}};
  std::cout << "--sort array by (z,y)" << std::endl;
  sort_by(std::begin(as), std::end(as), &S::z, &S::y);
  for (auto& e : as)
    std::cout << e.x << e.y << e.z << std::endl;
}
```

実行結果：

```
--sort vector by x
057
048
156
138
246
237
--sort array by (z,y)
246
156
237
057
138
048 
```

備考：`std::tie()`と`operator<`の動きについては[このへん](http://d.hatena.ne.jp/yohhoy/20120218)を
デザインがリニューアルされたCakePHP3でbakeしよう！

# デザインがリニューアルされたCakePHP3.0でbakeしよう！

## 前提条件

CakePHP 3.0 をインストール済みであること  

○参考
[CakePHP 3.0 インストール](http://qiita.com/kozo/items/263de91d659cef7d5ab5)

## 実際にbakeを行う

実際に`bake`を行います。  
注意点は、Cake2系とはコンソールの設置場所が変更されていて、**binディレクトリ**の下になります。
また、bakeの実行方法もパラメーターで指定するように変更されています。

```
php bin/cake.php bake controller Users
php bin/cake.php bake model Users
php bin/cake.php bake template Users

// controller, model, templateを一括で作成するallもあります。
php bin/cake.php bake all users
```

## 完成
今までのCakeとは、デザインが一新されています！
実際にbakeして確認してみましょう！

![CakePHP3](https://qiita-image-store.s3.amazonaws.com/0/49429/727c8fb8-a4f6-3e43-8c41-8e825e0c8417.png)
SublimeText3でCoffeeScriptをシンタックスハイライトする


## 概要
デフォルトではCoffeScriptのシンタックスハイライトが用意されていないのでPackageを導入します。
使用環境はOSX 10.9.5です。

## 手順
事前に[Package Controlをインストール](http://qiita.com/lunatea/items/53f4adcc6ea3f316e781#1-1)しておいて下さい。

1. `Cmd + ,`で設定画面を表示
2. `Cmd + Shift + P` より Install Packageを選択
3. 「Better CoffeScript」と入力、エンター押下
4. 以下のような設定ファイル（長い）を[ここ](https://github.com/aponxi/sublime-better-coffeescript)からペースト
5. とりあえず`Cmd + Q`から再起動

![スクリーンショット 2014-10-03 17.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/29945/5355c210-86ed-bf6d-b7b2-600e009c4e04.png "スクリーンショット 2014-10-03 17.35.26.png")

## 作業後
![スクリーンショット 2014-10-03 17.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/29945/e386b50d-b860-7064-3d4f-a406de06af04.png "スクリーンショット 2014-10-03 17.37.49.png")
.coffeeにハイライトを適用できるようになります。
カスタムキーボードのデフォルトサイズ一覧


興味が湧いたので調べてみました。
デフォルトの場合、カスタムキーボードのサイズはシステムキーボードと等しくなります。
システムキーボードのサイズはというと、画面サイズと端末の向きによって決定されます。

*※単位はピクセルではなくポイントです*


10/3 iPhone6,6Plusの互換モード、拡大モードを追記しました。
参考にさせていただいたページを紹介しておきます。
http://qiita.com/tomohisaota/items/f8857d01f328e34fb551

10/6 "iPhone6,6Plusに最適化されていないアプリについて"を追記しました。


# Portrait


| デバイス | 画面サイズ | キーボードサイズ |
|:------:|:------:|:------:|
| iPhone4,4s | 480×320 | 216×320 |
| iPhone5,5c,5s,6(互換/拡大),6Plus(互換)| 568×320 | 216×320 |
| iPhone6Plus | 736×414 | 226×414 |
| iPhone6,6Plus(拡大)| 667×375 | 216×375 |
| iPad | 1024×768 | 264×768 |



# Landscape

| デバイス | 画面サイズ | キーボードサイズ |
|:------:|:------:|:------:|
| iPhone4,4s | 320×480 | 162×480 |
| iPhone5,5c,5s,6(互換/拡大),6Plus(互換)| 320×568 | 162×568 |
| iPhone6Plus | 414×736 | 162×736 |
| iPhone6,6Plus(拡大)| 375×667 | 162×667 |
| iPad | 768×1024 | 352×1024 |


# iPhone6,6Plusに最適化されていないアプリについて

6,6Plusの大画面を最大限利用するには、そのアプリの6,6Plusに最適化されている必要があります。最適化されていないアプリでは画面表示の標準/拡大設定が無視され、常に互換モードで表示されます。iPhone5の画面がiPhone6,6Plusの画面サイズに引き伸ばされて表示されることになります。
## キーボードのモードは、キーボードを呼び出すアプリのモードに準ずる
互換モードで呼び出されるキーボードは想像以上に拡大され、操作しづらいといった問題が発生します。



# おわりに
ちなみに、カスタムキーボードの幅は画面横幅と同じ値で固定とされています。
このデフォルトサイズにキーボードを詰め込むのか、はたまた高さを変えるのか。
画期的なカスタムキーボードの出現を期待したいところです。
google/cloud-sdkで作ったコンテナから認証情報を読み取れないとき

google/cloud-sdkで認証情報をコンテナに格納するときは

```
docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login
```

だとgcloudがcredentialを保存する場所が$HOME/.config/gcloudになっててうまく動かないので(2014/10/3現在）,

```
docker run -ti --name gcloud-config -e CLOUDSDK_CONFIG=/.config/gcloud google/cloud-sdk gcloud auth login
```

とすると--volume-from gcloud-configでクレデンシャルを使う他のコンテナが今までのようにうまく動く。
Symfony2.5未満でもプログレスバーにメモリ使用量出したい


## 前置き
Symfony2.5 だと
[Progress Bar (Symfony Console component)](http://symfony.com/doc/master/components/console/helpers/progressbar.html)
↑こんな感じに、すごくいい感じでメモリを表示することができるけど、それ以下だと出来ないので

## やっつけ的に

```php
protected function execute(InputInterface $input, OutputInterface $output)
{
    $tmpProgress = $this->getHelperSet()->get('progress');

    $progress = function () use (&$tmpProgress) {
        $tmpProgress->setFormat(
            ProgressHelper::FORMAT_VERBOSE .
            sprintf(
                ' Memory: %.2f MB / %.2f MB',
                memory_get_usage(true) / 1024 / 1024,
                memory_get_peak_usage(true) / 1024 / 1024
            )
        );

        return $tmpProgress;
    };

    $max = 50;
    $progress()->start($output, $max);

    $i = 0;
    $data = [];
    while ($i++ < $max) {
        $progress()->advance();

        $data = array_merge($data, range(1, $i * 100));
    }

    $progress()->finish();
}
```
こんな感じで

```
$ ./app/console test
 50/50 [============================] 100% Elapsed:  1 sec Memory: 53.00 MB / 54.25 MB
```
やったりすることもあった。でも効率悪そう。
構造体を波カッコで初期化

### 構造体の宣言
```c++
    struct GateMaster {
        int gateId;
        int stageId;
        int nextGateId;
        int x;
        int y;
        GateType gateType;
    };
```
### 変数の宣言
```cpp
const static std::map<int, GateMaster> DUMMY_GATE_MASTER_LIST;
```
### 初期化
```cpp
const std::map<int, Gate::GateMaster> Gate::DUMMY_GATE_MASTER_LIST = {
    {1, {1, 1, 2, 100, 100, Gate::GateType::NORMAL_V}},
    {2, {2, 2, 1, 200, 100, Gate::GateType::NORMAL_V}},
    {3, {3, 2, 4, 300, 100, Gate::GateType::NORMAL_V}},
    {4, {4, 3, 3, 400, 100, Gate::GateType::NORMAL_V}},
    {5, {5, 3, 7, 500, 100, Gate::GateType::NORMAL_V}},
    {6, {6, 3, 8, 600, 100, Gate::GateType::NORMAL_V}},
    {7, {7, 4, 5, 700, 100, Gate::GateType::NORMAL_V}},
    {8, {8, 5, 6, 800, 100, Gate::GateType::NORMAL_V}},
};       
```
Kobito 2.0にアップグレードしたときに"The file couldn't be opened"となったら


![BzAVbrTCUAA7jbB.png](https://qiita-image-store.s3.amazonaws.com/0/889/aa2ab08a-7061-c654-1fb3-3e441c4fe36e.png "BzAVbrTCUAA7jbB.png")


~/Library/Kobitoの中からシンボリックリンクしていると、Kobito2.0へのアップグレードがうまくいかないみたい。

1. ~/Library/Kobito のシンボリックリンクをやめて、実ファイルを ~/Library/Kobito に置く。
2. ~/Library/Containers/com.qiita.Kobito を消す
3. Kobito 2.0を立ち上げる。

これで解決した。


<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/suin">@suin</a> <a href="https://twitter.com/reoring">@reoring</a> App Store アプリの sandbox 環境の制限で、コンテナ外を指すシンボリックリンクが辿れないようになっています。ファイルの実体を ~/Library/Containers/.../Kobito に戻してもらえれば動きます</p>&mdash; 霊長の腕 (@uasi) <a href="https://twitter.com/uasi/status/517941298485944320">2014, 10月 3</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
jr を使って GitHub API から自分がよく使う言語ランキングを作る

[jr](https://github.com/yuya-takeyama/jr) は jq 風の JSON フィルタリングを Ruby で行えるコマンドラインツールです。
今回はこの jr を使って、GitHub の自分のリポジトリ一覧を取得して、自分が良く使う言語をランキング化してみます。
なお、言語については GitHub の自動検出によるものなので、必ずしも実情を反映しているというものではありません。

# jr のインストール

gem コマンドでインストールできます。
多分 Ruby 2.0 以降なら動きます。

```
$ gem i jr-cli --no-ri --no-rdoc
```

gem 名は `jr` でなく `jr-cli` である点に注意してください。

# ランキングの作成

以下のコマンドを実行するのみです。
ユーザ名は自分のものに置き換えてください。
GitHub API は 1 ページあたり 100 件まで取得することができます。
私はリポジトリ数が 160 個ほどなので 2 ページ必要ですが、ここも必要に応じて書き換える必要があります。

```
$ jr 'flat_map(&:itself).group_by{|j| j[:language] }.map{|k, v| [k, v.size] }.sort_by{|k, s| -s }.to_h' <(curl -s 'https://api.github.com/users/yuya-takeyama/repos?per_page=100&page=1') <(curl -s 'https://api.github.com/users/yuya-takeyama/repos?per_page=100&page=2')
{
  "PHP": 59,
  "Ruby": 47,
  "": 19,
  "JavaScript": 16,
  "Go": 5,
  "CSS": 5,
  "Shell": 4,
  "CoffeeScript": 2,
  "Haskell": 2,
  "Perl": 2,
  "C": 2,
  "XSLT": 1,
  "VimL": 1,
  "Python": 1
}
```

試行錯誤するときは、Rate Limit に注意しましょう。
予めファイルに保存して、それを読み込むようにすると安心ですね。

自分でドッグフーディングしてみて、ユースケースを探りながら機能追加していきたい。

## 2014-10-06 01:00 追記

jr Ver. 0.0.2 で `Kernel#itself` を追加したのと、その他の修正により、コマンドが少し短くなりました。
Physical Web とは何か?



## ざっくり概要

* Googleが2014年10月に発表したプロジェクト
* スマートデバイス(賢い通信できる機器)の近くでスマホをタップすると近くにあるスマートデバイスのURLをリストで表示する。ユーザは必要なサービスのURLをタップしてブラウザを開いて利用する
* サービスごとにアプリをインストールする必要性をなくしたい
* プッシュ通知はしない(ユーザが動作しないとリスト取得ができない)
* スパムにはリストのランキングで対処
* みんなで使える標準を作る予定
* まずは、BLE(Bluetooth Low Energy)を利用。


## どんなことができる?

* バス停の近くに行ってスマホをタップすると、バスの情報を得られる

## Internet of Things (モノのインターネット)

* モノ(機器)をネットに繋いでやりとりさせる


## Ethereum と Smart Contract

これができると、目の前の車のSmart Contractとスマホでタップして、すぐにレンタルの契約(など権利の譲渡)が、P2P上でサーバを使わず自動で、できるようになるかと思います。


## 日本語ニュース記事

* [グーグル、「Physical Web」プロジェクトを発表--URL使用でIoT機器接続を可能に - CNET Japan](http://japan.cnet.com/news/service/35054656/ "グーグル、「Physical Web」プロジェクトを発表--URL使用でIoT機器接続を可能に - CNET Japan")
* [Google、アプリを介さずモノのインターネットと会話できる標準規格Physical Webを開発中 - TechCrunch](http://jp.techcrunch.com/2014/10/03/20141002google-the-physical-web/ "Google、アプリを介さずモノのインターネットと会話できる標準規格Physical Webを開発中 - TechCrunch")


## 引用元

Google の GitHub での紹介

* [google/physical-web](https://github.com/google/physical-web "google/physical-web")
* [Introduction](https://github.com/google/physical-web/blob/master/documentation/introduction.md "physical-web/introduction.md at master · google/physical-web")
* [Technical Overview](https://github.com/google/physical-web/blob/master/documentation/technical_overview.md "physical-web/technical_overview.md at master · google/physical-web")
iOS8からのArtwork取得注意点

```objc
    MPMediaItemArtwork *artwork = [content.mediaItem valueForProperty:MPMediaItemPropertyArtwork];
    UIImage *image = [artwork imageWithSize:CGSizeMake(250,250)];
```

このように今までは取得出来ましたが、iOS8からはimageWithSizeでサイズ指定を行う事はできなくなりました。

```objc
    MPMediaItemArtwork *artwork = [content.mediaItem valueForProperty:MPMediaItemPropertyArtwork];
    UIImage *image = [artwork imageWithSize:artwork.bounds.size];
```

iOS8からはこのようにMPMediaItemArtworkのサイズを指定し、生データを一度取得してからリサイズする必要があります。
[fork][ruby] webdriver を使って amazon.co.jp での購入履歴情報を取得する

## [ruby] webdriver を使って amazon.co.jp での購入履歴情報を取得する
http://qiita.com/katoy/items/2256ad7b59b8f59161cf

ありがたく使わせてもらった。自分の使い方をメモ。

### 必要なファイル
記事中にあるファイルのうち、以下のものを作成して同一ディレクトリへ保存しておく必要がある。

* amazon.rb
* Gemfile
* head.csv
* make-index.rb

このままだと最新年（2014年）の分しか取得できない。

### 過去の年の分を取得する

過去の年の分を取得するにはamazon.rbのXPathを指定している場所を書き換える必要がありそうだが、うまくいかなかったので手っ取り早く購入履歴ページのURLを書き換えた。

* 購入履歴ページのURLを差し替え
https://www.amazon.co.jp/gp/css/order-history?opt=ab&digitalOrders=1&unifiedOrders=1&returnTo=&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&orderFilter=year-2013

* 以下の2行を削除

```ruby:amazon.rb
unless wd.find_element(:xpath, "//form[@id='order-dropdown-form']/select//option[4]").selected?
        wd.find_element(:xpath, "//form[@id='order-dropdown-form']/select//option[4]").click  # 今年の注文
end
```
Eagleでライブラリを作る方法


## 新規ライブラリファイルを作成
File -> New -> Libraryを選びます。

![NewFile.png](https://qiita-image-store.s3.amazonaws.com/0/41825/9163be13-64cb-aa93-c462-5435d0557e40.png "NewFile.png")

## メインファイル
新規ファイルを作成すると、下のような画面になります。
ここから各図面を作成します。

![MainScreen.png](https://qiita-image-store.s3.amazonaws.com/0/41825/97c6ed4f-06b3-7493-e40c-c9675edaf13f.png "MainScreen.png")

## Package作成
まずはPackageを作成します。
Packageは実際の部品の寸法を計って、作成します。


まず、はんだづけするPad部分を作ります。
![AddSmd.png](https://qiita-image-store.s3.amazonaws.com/0/41825/8d80d6d9-a7f4-672b-9e61-79660d89e714.png "AddSmd.png")


それから部品の外形をWireコマンドで描きます。
![DrawWire.png](https://qiita-image-store.s3.amazonaws.com/0/41825/9c56e44b-0d62-ba50-a7f3-7d65fb218506.png "DrawWire.png")

各Padに名前をつけます。
![AddNameToPins.png](https://qiita-image-store.s3.amazonaws.com/0/41825/cc549e55-1d58-7600-ebee-fadae5f97988.png "AddNameToPins.png")

デバイス自体の名前と値をふるためにTextコマンドでテキストを書きます。
![AddNames.png](https://qiita-image-store.s3.amazonaws.com/0/41825/dcfad3b2-0520-885d-f668-955be13e15eb.png "AddNames.png")

Packageが作図できましたら、保存しておきましょう。

## 次にSymbleを描きます。
Symble作成画面を以下のようになります。
PinコマンドでPackage画面で作成したPadと対応したピンを描きます。
Symbleの外形を描きます。
![symble.png](https://qiita-image-store.s3.amazonaws.com/0/41825/a6607cfa-cff3-09a9-3c2d-c1a1b26b61f4.png "symble.png")

Symbleを描いたら保存します。

## Device画面を開きます。

先ほど作成したPackageとSymbleを統合して、Deviceを作成します。
Addコマンドで先ほど作ったSymbleを呼び出し、NewwをクリックしてPackeageを呼び出します。
Connectをクリックして、PackageとSymbleのそれぞれのピンを接続します。

![device.png](https://qiita-image-store.s3.amazonaws.com/0/41825/f6f07836-be63-fcd9-08bd-364e62411277.png "device.png")

接続できたら、保存しましょう。

これでLibraryに部品が新たに追加されました。
CircleCIからCapistranoを利用してAWS（EC2）にデプロイする


CircleCIからEC2上に構築しているサーバにデプロイする方法です

## 前提

- ローカルなどからcapistranoでデプロイできる状態

## 準備

### セキュリティグループ

SSHをセキュリティグループで制限している場合、CircleCI上からのアクセスを許可しなくてはなりません

#### VPC

VPCでは他セキュリティグループからの許可ができません

CircleCIはEC2 US East region上に構築されているのでその[IP](https://forums.aws.amazon.com/ann.jspa?annID=1701)を全部許可すればよいのですが現実的ではありません（よね？）

[AWS CLI](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)を使ってビルドの開始時にコンテナのIPをSSH許可して、終了時にSSH許可を取り消す事で対応します

SSH許可

```
aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
```

SSH許可を取り消し

```
aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
```

#### VPC以外

VPC環境で構築していない場合は、CircleCIのセキュリティグループのIDが公開されていますので[AWSで別のアカウントのセキュリティグループを使う](http://qiita.com/71713@github/items/535105946803c3fa7c19)を参考にしてアクセスを許可してください

### 秘密鍵の設定

EC2にログインする為の秘密鍵を設定してください

`Project Settings` -> `SSH keys`から設定できます

設定した秘密鍵はビルド時に自動的に`ssh-agent`に追加されます

またGitHubへのアクセスも`ssh-agent`を利用している場合はGitHubへアクセスできる秘密鍵も設定してください

### AWS CLI

CircleCI上にインストールされている`AWS CLI`はバージョンが古い為、以下のエラーが出てしまいます

```
--group-id: mispelled meta parameter?
```

`dependencies`で最新版をインストールする事で回避できます

```yml
dependencies:
  pre:
    - sudo pip install awscli
```

### 環境変数

AWSにアクセスする為に必要な環境変数を設定してください

- `AWS_ACCESS_KEY_ID` - アクセスキーID
- `AWS_SECRET_ACCESS_KEY` - 秘密アクセスキー

環境変数は`Project Settings` -> `Environment vairables`で設定できます

## サンプル

### circle.yml

masterにpush時にstagingにデプロイするサンプルです

```circle.yml
machine:
  ruby:
    version:
      2.1.2

dependencies:
  pre:
    - sudo pip install awscli

test:
  override:
    - bundle exec rake rubocop
    - bundle exec rake spec

deployment:
  staging:
    branch: master
    commands:
      - sh script/deploy_staging.sh
```

### script/deploy_staging.sh

```bash
#!/bin/sh

export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
export AWS_DEFAULT_REGION="ap-northeast-1"

MYSECURITYGROUP=”セキュリティグループID"
MYIP=`curl -s ifconfig.me`

aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
bundle exec cap staging deploy
aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
```

## Links

- [Circle's EC2 IP addresses and AWS security group](https://circleci.com/docs/ec2ip-and-security-group)
- [[AWS][CLI] EC2にSSHするときだけ、security groupに自分のアドレスを追加する](http://dev.classmethod.jp/etc/ssh_with_adding_ingress_rule/)
- [What Is the AWS Command Line Interface?](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)

以上
Protractor + PhantomJS + Grunt + AngularJSでE2Eテスト環境構築

# 前提

[PhantomJS](http://phantomjs.org/)はブラウザを起動させずにtestを実行させるためのものです。

今回は、以前投稿した[AngularJS + CoffeeScript + Protractor + GruntでE2Eテスト環境構築](http://qiita.com/rneuo/items/27b045f70bfcfb71fd09)のbrowser driverをPhantomJSに変更するだけです。

# インストール

```
npm install phantomjs --save-dev
```

# 設定

以前投稿した[AngularJS + CoffeeScript + Protractor + GruntでE2Eテスト環境構築](http://qiita.com/rneuo/items/27b045f70bfcfb71fd09)からの修正点です。

- [修正点](https://github.com/rneuo/sample-angular/commit/d8bb35ff956951c795006ec127e481fc56fd0430)

# 備考

PhantomJSではブラウザが起動しないので、もしもうまくレンダリングなどが実行されていない場合、かなりはまる事になります。

なので、もしエラーが出てそうなら`test/protractor.conf.js`をいったんchromeを起動するように戻す(要は[AngularJS + CoffeeScript + Protractor + Grunt](http://qiita.com/rneuo/items/27b045f70bfcfb71fd09)の環境)
一旦ブラウザを起動させエラーが出てればその時点でブラウザを閉じずにストップさせるように以下のように`test/protractor.conf.js`を書き換えて後はconsoleにエラーが出てないか確認するといいのではと思います。

```js:test/protractor.conf.js
capabilities: {
 'browserName': 'chrome',
 'chromeOptions': {
   'excludeSwitches': ['ignore-certificate-errors']
 }
},
onPrepare: function() {
  jasmine.getEnv().afterEach(function () {
    var spec = jasmine.getEnv().currentSpec;
    if (spec.results().failedCount > 0) {
      browser.pause();
    }
  });
}
```
Allow loopback mounting file inside LXC containers

TeXを使いたいときにinstall-tl-ubuntuを使っている。
ただし、vagrant-lxcのようなコンテナ環境でprovisioningするときにそのままこのコマンドを使うと、そのたびに大量のダウンロードが発生するので好ましくない。
そこで

```{.sh}
$ sudo bash install-tl-ubuntu -i /vagrant/texlive2014-20140525.iso
```
としたいわけだが、
```
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only
```
などと怒られてマウントできない。
このようなときは、host側で以下の操作でiso9660でもloopbackデバイスを使えるようにする。

```{.bash}
sudo tee /etc/apparmor.d/lxc/lxc-default-with-mounting-custom <<EOF
profile lxc-container-default-with-mounting-custom flags=(attach_disconnected,mediate_deleted) {
  #include <abstractions/lxc/container-base>
  mount fstype=ext*,
  mount fstype=xfs,
  mount fstype=btrfs,
  mount fstype=iso9660,
}
EOF
sudo apparmor_parser --replace /etc/apparmor.d/lxc-containers
```
自分のコンテナ起動用のVagrantfileはこんな感じ

> VAGRANTFILE_API_VERSION = "2"
> 
> Vagrant.configure(VAGRANTFILE_API_VERSION) do config
>   config.vm.box = 'fgrehm/trusty64-lxc'
>   config.vm.define "test"
>   config.vm.provider :lxc do lxc
>     # allow_loop-back_device
>     lxc.customize 'aa_profile', 'lxc-container-default-with-mounting-custom'
>     lxc.customize 'cgroup.devices.allow', 'b 7:* rwm'
>     lxc.customize 'cgroup.devices.allow', 'c 10:237 rwm'
>   end
>   config.vm.provision :shell, :path =>　 "https://gist.githubusercontent.com/ごにょごにょ/raw/site.sh", :privileged => false
> end

で、立ち上げると

```{.bash}
vagrant@vagrant-base-trusty-amd64:~$ sudo mount -t iso9660 -o loop,ro /vagrant/texlive2014-20140525.iso /mnt
vagrant@vagrant-base-trusty-amd64:~$ ls /mnt
archive index.html install-tl-advanced.bat LICENSE.CTAN README
readme-txt.dir release-texlive.txt texlive-doc tl-tray-menu.exe
autorun.inf install-tl install-tl-windows.bat LICENSE.TL readme-html.dir
README.usergroups source tlpkg
vagrant@vagrant-base-trusty-amd64:~$
```

これで install-tl-ubuntu -i /vagrant/texlive2014-20140525.iso ができるようになった
Swift vs. C#: Subscripts



> Classes, structures, and enumerations can define subscripts, 

> which are shortcuts for accessing the member elements of a collection, list, or sequence.


- C#: [インデクサ](http://msdn.microsoft.com/ja-jp/library/6x16t2tx.aspx)


# Subscript Syntax

Swift:

~~~
 19> struct Point { 
 20.     var i = 0
 21.     subscript(i: Int) -> Int { 
 22.        get { return i * 10 }
 23.     } 
 24. } 
 25>  
 26> var p1 = Point()
p1: Point = {
  i = 0
}
 27> p1[1]
$R0: Int = 10


 28> p1[2]
$R1: Int = 20
~~~

C#:

~~~
public struct Point{ 
  int i = 0;
  public Point(int i){ this.i = i; }
  public int this[int idx] { get { return idx * 10;} }
}

Point p;
Console.WriteLine(p[27]);

270
~~~

# Subscript Usage

- p[3] だけじゃなくて p["Cat"] などもできます (Swift/C#)
- プロパティ同様 get だけじゃなくて setもできます


# Subscript Options

Swift:

~~~
 36> Point()[3, 4]
$R2: Int = 7
 37>  struct Point {  
 38.      var i = 0  
 39.      subscript(x: Int, msg: String) -> String {
 40.          return "\(msg) \(x)"
 41.      }    
 42.  } 
 43. 
 43> Point()[3, "hoge"]
$R3: String = "hoge 3"
~~~

C#:

~~~
public struct Point{ 
  int i = 0;
  public Point(int i){ this.i = i; }
  public string this[int x, string msg] { 
        get { return string.Format("{0} {1}", msg, x);}
  }
}

Point p;
Console.WriteLine(p[3, "hoge"]);

hoge 3
~~~
objc_msgSendで "Too many arguments to function call"と怒られる

xcode6で既存のライブラリを再コンパイルしていたら objc_msgSendで怒られるようになった。

![スクリーンショット 2014-10-03 14.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/3847/37360db7-a445-232c-fc63-a54719c76130.png)

```objc
  objc_msgSend (_delegate, @selector(hogeAction:), opt);
```

こういうのは下のようにキャストするか typedefで定義して使うことになったらしい。

```objc
  ((void(*)(id, SEL, id))objc_msgSend)(_delegate, @selector(hogeAction:), opt);
```

参考: 

* http://stackoverflow.com/questions/24922913/too-many-arguments-to-function-call-expected-0-have-3
* http://kamanii-square.tumblr.com/post/97859283168/ios-too-many-arguments-to-function-call-expected-0 
* http://goo.gl/R320Ox
cargoで覚えたコマンド

# make cleanみたいなやつ

```
cargo clean
```

# 更新する

git pull

しても、依存ライブラリは固定されているので

これを更新する必要がある場合に使う

```
cargo update
```

# 関連投稿

- [Rustを始めてみた - Qiita](https://qiita.com/kjunichi/items/ca8314c10384e40a0303)
- [Cargoで任意の共有ライブラリをリンクするには - Qiita](https://qiita.com/kjunichi/items/31aef0cf3f4f7fe6dc32)

# 関連記事

- [RustでGoのライブラリを使うときのCargoのbuild.rsの書き方](http://abrakatabura.hatenablog.com/entry/2017/10/22/110223)
laravelにyoでangularJs&coffeescriptを使えるようにする。

![スクリーンショット 2014-10-03 14.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/14914/3ddc613c-26f5-34fd-fda9-79137f9a37cf.png "スクリーンショット 2014-10-03 14.27.29.png")



## 前提laravelは動作できているものとする

## generatorの設定等

### まずyoコマンドを利用出来る必要があるので以下でインストール

```
npm install -g yo bower generator-angular grunt-cli
```

### globalにインストールしたところでlaravelのプロジェクトルートに移動。

#### クライアントのコードを管理するディレクトリを作成、移動する。

```
mkdir client

cd client
```

#### クライアントの環境作成

```
yo angular --coffee
```

これで雛形まで完成。

このまま```grunt build```を実行するとわかるがエラーになる。

原因は```Gruntfile.js```の中で```wiredep```というタスクのoptionsが設定されてるから。

optionsの```cwd```をコメントアウト

```Gruntfile.js
      options: {
        //cwd: '<%= yeoman.app %>'
      },
```

修正したら再度、ビルドを実行。

```
grunt build
```

すると```client/```の中に```dist/```というディレクトリが作られて中にコンパイルされたファイルが出来上がってる。
ただし、こんなとこにファイルがあってもアクセスできないので```laravel```の```public```ディレクトに作成されるように```Gruntfile.js```を修正する。

ちなみに今作成した```dist/```は必要ないので削除する。

##### laravelのファイルを移動。

まず```Gruntfile.js```を変更する前にファイルを退避する必要がある。
```grunt build```を実行するたびに```public/```の中身が削除されるて再作成されてしまうのでlaravelの```index.php, .htaccess```を```client/app/```に移動させる。

##### 出力先の変更　```client/dist/```→```public/```

```Gruntfile.js
  var appConfig = {
    app: require('./bower.json').appPath || 'app',
    dist: '../public'
  };

```

##### clean時に階層が上のファイルも消せるようにオプションを追加

```Gruntfile.js
    // Empties folders to start fresh
    clean: {
      options: {
        force: true
      },
      dist: {
        files: [{
          dot: true,
          src: [
            '.tmp',
            '<%= yeoman.dist %>/{,*/}*',
            '!<%= yeoman.dist %>/.git*'
          ]
        }]
      },

```

#### 退避させたindex.phpもコピーされるようにする

「src」に「'*.php',」を追加。

```Gruntfile.js
    copy: {
      dist: {
        files: [{
          expand: true,
          dot: true,
          cwd: '<%= yeoman.app %>',
          dest: '<%= yeoman.dist %>',
          src: [
            '*.{ico,png,txt}',
            '.htaccess',
            '*.html',
            '*.php',
            'views/{,*/}*.html',
            'images/{,*/}*.{webp}',
            'fonts/*'
          ]
        }, {

```

修正したら再度、ビルドを実行。

```
grunt build
```

実行後にブラウザでアクセスすると```http://localhost/#/```となり以下のような画面が表示されます。

![スクリーンショット 2014-10-03 14.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/14914/3ddc613c-26f5-34fd-fda9-79137f9a37cf.png "スクリーンショット 2014-10-03 14.27.29.png")

### laravelのルーティング

今回、私の環境ではlaravelはapiのみ担当させるので以下のようにした

```app/routes.php
Route::group(array('prefix' => 'api'), function() {
  Route::resource('users', 'UserController');
```

URLを```http://localhost/api/users```とかするとjsonを返すようにしてる。


#### 雛形完成

あとはangularJsからlaravelにアクセスして実装してくださいー

## 参考にしたサイト
[generator-angular](https://github.com/yeoman/generator-angular#generators "generator-angular")
↑初期生成だけじゃなくてcontoller等もコマンドで作成できるらしいので見といたほうが良い(まだ試してない)。

```
yo angular:controller user
```

http://qiita.com/tetsuya/items/a488b66a88369307a213#1-9
http://shoheik.hatenablog.com/entry/2014/02/26/214235

:wq
virtualenv + flask + apache + wsgi で動かすまで

# virtualenv + flask + apache + wsgi で動かすまで

`apache`で_flask_アプリケーション動かすまでのフローを駆け足で。

`Werkzeug` ならけっこう簡単に起動までできるけど、
`apache` + `mod_wsgi` になると途端にハードル上がるので、ざっくりまとめてみた。

全てmacの場合なので、適宜パス等は読み替えてください。

## 初期設定

この辺を参考に _virtualenv_ 入れる。
http://qiita.com/k2tanaka/items/5f111612ec1b6d7584a6

```
mkvirtualenv -p ~/.pythonz/pythons/CPython-2.7.6/bin/python2.7  v2.7.6
```

_workon_ して `pip` で _flask_ まで入れる。

```
workon v2.7.6
pip install flask
```

## アプリケーション部分

中身はすごい適当。
とりあえず最小限の例示で。

### 構成

ファイルパスとかはこの後の`apache`のconfに合わせるように。

```
/Users/kuryu/workspace/test/flask
├── app.wsgi
├── app_templates
│   └── index.html
└── main.py
```

### 中身

```py:app.wsgi
# -*- coding:utf-8 -*-

import sys, os

import logging
# apacheのログに出すために必要
logging.basicConfig(stream = sys.stderr)

sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

from main import app as application
```

```py:main.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
from flask import Flask, render_template
from jinja2 import FileSystemLoader

app = Flask(__name__)
# jinja2のtemplateディレクトリ変更してみる
# 別になくてもいい。
# 省略した場合はこのファイルと同じ階層の "templates" になる。
app.jinja_loader = FileSystemLoader(
        os.path.join(os.path.abspath(os.path.dirname(__file__)), 'app_templates')
    )

@app.route("/")
def index():
    from flask import render_template
    return render_template('index.html')

@app.route("/foo")
def foo():
    return "foo"

@app.route("/foo/bar")
def foo_bar():
    return "foobar"

if __name__ == "__main__":
    app.run()
```

```app_templates/index.html
hogehoge
```

## apacheの設定

### `mod_wsgi` の入れ方

は省略。
多分linuxなら`apt`か`yum`で入るか、最初から`apache`に同梱されてる。

macなら

```
brew tap homebrew/apache
brew install mod_wsgi
```

して

```
brew info mod_wsgi
```

すればパスとかわかると思う。

### confの設定

_vitualenv_ 使うので、_WSGIPythonHome_ で `python` の場所を指定する。

```apache:flask.conf
## mod_wsgi
LoadModule wsgi_module /usr/local/Cellar/mod_wsgi/3.5/libexec/mod_wsgi.so

WSGIPythonHome /Users/kuryu/.virtualenvs/v2.7.6
WSGIDaemonProcess test user=kuryu group=staff threads=5
WSGIScriptAlias /test /Users/kuryu/workspace/test/flask/app.wsgi
WSGISocketPrefix /var/run/wsgi

<Directory /Users/kuryu/workspace/test/flask>
    Options +ExecCGI
    SetHandler wsgi-script
    AddHandler wsgi-script .wsgi
    Order deny,allow
    Allow from all
</Directory>
```

`apache`再起動しておく。

```bash
sudo apachectl restart
```

### 叩いてみる

_WSGIScriptAlias_ で `/test` って指定してるので、urlはこう。

```
curl localhost/test/
curl localhost/test/foo
curl localhost/test/foo/bar
```

以上。

めんどくささの原因の9割は`apache`なんだよな…
Eclipseのメモ

## キーバインド
* Emacs風キーバインドに変更

```
「Eclipse」->「環境設定」->「General」->「Keys」
"Scheme:"で"Emacs"を指定
```

* チートシート
http://loumo.jp/wp/archive/20120409231416/

```
Alt+\ : 補完
C-x u : undo
C-x r : redo
cmd 3 : Quick Access
```

* デフォルトの変更

```
C-m : "画面の最大化"になっているので、unbindする。
C-h : "検索窓を開く"になっているのでunbindし、"前を駆除"を割り当てる
```

## Tips
* コンストラクタ、ゲッター、セッターの自動生成

```
メニューの「Source」からそれぞれの項目を選び、使用するフィールドなどを選ぶ。
```
* メソッドのオーバーライド

```
メニューの「Source」から「Overrride/Implement Method」を選び、親クラスとメソッドを選ぶ。
java1.5以上だと、"@override"アノテーションも自動で付く。
```

## Android
* 実機テスト
http://web.showjin.me/eclipse_android-device_debug.html
* エミュレーター
 * API Level of 20をvirtual deviceで指定すると失敗する。19が良い。（http://stackoverflow.com/questions/24587218/android-util-androidruntimeexception-you-cannot-combine-swipe-dismissal-and-the）
Mavericks コマンドラインキッチンタイマー「ゴージャスラーメン」オプション

# tir - Tea is ready

春に、[tir](https://github.com/kaz-utashiro/tir) という [Mac OS X Mavericks 用のコマンドラインキッチンタイマーを作った](http://utashiro.hatenablog.com/entry/2014/03/02/164732)。
なぜ Mavericks 用かというと、AppleScritp と通知センターの機能を使っているからだ。

経過時間がわかった方がいい気がしてきたので、カウントダウン機能を追加した。デフォルトでは、

- 100分、90分 ... 10分
- 9分、8分 ... 1分
- 30秒、20秒、10秒

というタイミングでカウントダウンを読み上げる。

ついでに、専用ショートカットを追加してみた。

- -R ラーメンオプション
- -U うどんオプション

それぞれ、待ち時間を3分と5分に設定するだけなので手で入力してもいいのだが、-G オプションと組み合わせると荘厳な感じになる (どうなるかは[はてな](http://utashiro.hatenablog.com/entry/2014/03/02/164732)にYouTubeを貼ってある)。

- -GR ゴージャスラーメンプション
- -GU ゴージャスうどんオプション

待つ間やることがない人は、こんな風にすると暇つぶしにはなるが、やめた方がいいだろう。

```
tir -rGRc10
```

これまでは iTunes が再生中だと一旦ポーズして再開するようにしていたのだが、試しに半分のボリュームにフェードアウトするようにしてみたら、こっちの方がずっといいので、それをデフォルトにした。

[github.com/kaz-utashiro/tir](https://github.com/kaz-utashiro/tir) からどうぞ。
UnityのLauncherにコマンドラインで*.desktopファイルを登録する方法

Ubuntu上で動くちょっとしたアプリを作ったのですが、起動をLauncherから行わせたくなりました

インストールスクリプトを書いていた過程で見つけた、UnityのLaunhcerをコマンドラインから操作する方法を書いておきます。

デスクトップ設定ファイル `*.desktop`
------------------------------------

```:/tmp/start.desktop
[Desktop Entry]
Version=1.1
Name=HOGEシステムの起動
Comment=HogeSystem startup
Path=/example
Icon=/example/appicon48x48.png
Type=Application
Categories=Utility;Application;
TryExec=dash
Terminal=false
Exec=dash ./start.dash -l
```

同等のコマンドライン

```
$ cd /example   ==> Path
$ test -x `which dash`  ==> TryExec
$ dash ./start.dash -l  ==> Exec
```

参考資料:

Ubuntu ディレクトリーエントリー・デスクトップエントリー その5 - デスクトップエントリーグループのエントリー（TryExec・Exec・Path・Terminal） - Ubuntu kledgeb
http://kledgeb.blogspot.jp/2013/05/ubuntu-5-tryexecexecpathterminal.html

リファレンス
http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.1.html


### TIPS :`*.desktop`から起動されたプロセスの環境変数等を確認する方法 ###

先ほどのstart.desktopのうち、

```:/tmp/start.desktop
Terminal=true
Exec=dash -i
```

以上のようにすると、dashがインタラクティブで起動しTerminalが表示された状態となりますので、これでexportなりを実行すれば状況がわかるようになります



Unity Launcher操作
------------------

Launcherは`gsettings`コマンドを通じて操作できます

```console
$ gsettings get com.canonical.Unity.Launcher favorites
['application://nautilus.desktop', 'application://firefox.desktop', 'application://unity-control-center.desktop','application://google-chrome-beta.desktop', 'application://thunderbird.desktop', 'application://skype.desktop','unity://running-apps', 'unity://expo-icon', 'unity://devices']
```

setはできますが、addやremoveという概念が無いため、get後に追加/削除して文字列を再構成したあと、setする操作が必要です。

これをやるRubyコードがこちら

```ruby:launcher-editor.rb
module Launcher
  extend self
  def get
    eval(`gsettings get com.canonical.Unity.Launcher favorites`.strip)
  end

  def set(list)
    `gsettings set com.canonical.Unity.Launcher favorites '#{list.to_s}'`
  end

  def add(path)
    set([path] + get)
  end

  def remove(path)
    set(get - [path])
  end
end

if __FILE__ == $0
  def usage_and_exit
    puts <<-EOT
Unity Launcher panel add/remove script
Usage: #{$0} <command>
  get         : Print the current setting.
  add PATH    : Add PATH to Launcher panel
  remove PATH : Remove PATH from Launcher panel
    EOT
    exit 1
  end

  case (ARGV[0].downcase rescue nil)
  when "get"
    puts Launcher.get.to_s
  when "add", "remove"
    usage_and_exit if ARGV[1].nil?
    Launcher.send(ARGV[0], ARGV[1])
  else
    usage_and_exit
  end
end
```

```console
$ ruby launcher-editor.rb get
["application://nautilus.desktop", "application://firefox.desktop", "application://unity-control-center.desktop", "application://google-chrome-beta.desktop", "application://thunderbird.desktop", "application://skype.desktop", "unity://running-apps", "unity://expo-icon", "unity://devices"]
$ ruby launcher-editor.rb add application:///tmp/start.desktop
$ ruby launcher-editor.rb remove application:///tmp/start.desktop
```


あとがき
--------

役に立たない事ばかりやっている気がする
Rails メソッドを参照 ソース まとめ

# Ruby コアの API
###http://ruby-doc.org/core-2.1.3/

#Ruby 標準ライブラリの API
###http://ruby-doc.org/stdlib-2.1.3/

#Rails API
###http://api.rubyonrails.org/

#Rails Guides 公式（英語）
###http://guides.rubyonrails.org/

#Rails Guides の和訳（非公式）
###http://ruby.studio-kingdom.com/rails/guides/getting_started

#Ruby on Rails 4 アプリケーションプログラミング(書籍)
海外のエンジニアとのやりとりでよく使われる英語 ～ 学校では教わらない英語

海外のエンジニアとのチャットやソースコードレビューなどで、よく使われる英語(インターネットスラングなど)をあげてみました。

|英語|意味と用例|
----|----
|yep|Yes. この他にyeppやyupなども同じ。ちなみにNoはnope|
|Okay|OKと同じ意味。OKでいいぢゃんと思ってしまいますが...|
|ditto|(〃) 同上。私も同意見です、という感じで使う。|
|sounds good|いいね～。賛成。|
|thx|Thanks. ありがとう。|
|np|No Problemの省略形。問題無いよ thanks as alwaysの返しにnpとか|
|:-)|(にっこり)。 :smile: |
|:-(|(うーん)。 :confused: |
|BTW|By the way, ところで。|
|AFAIK|As far as I know, 私が知る限り。|
|ASAP|as soon as possible|
|Apologies|すんません。（軽いミスしたときに）|
|IIRC|If I remember correctly, 私の記憶が正しければ|
|LOL|lot of laugh / laughing out loud.  (爆笑)。|
|IM(H)O|in my (humble) opinion. 私の(つまらない)意見だけど。|
|FYI|For Your Information. ご参考までに|
|LGTM|Looks good to me. 俺的にはよさそう。主にソースコードレビューなどで、問題無い時に使う。|
|LGTM 2|Looks good to me too. 俺もよさそう。LGTMの後に使う。|
|Kudos to 誰々！|誰々に賞賛を！（コードプロジェクトで大きな貢献をした人やチームを褒めるときに。）|
|good catch|よく見つけたね。レビューで目の付けどころがいい修正ができたときなどに使う|
|same here|ここも同じ。レビューでこの行も上の修正同じ修正が必要というような場合に使う|
|make sense|なるほどね～。|
|oops, my bad|うぅ、やっちまった。ちょっとしたミスをしたときに使う|
|got it|分かりました。I understand.と同じ意味|
|will do|やりまーす。|
|done|完了。ここ直しておいて→doneみたいな感じ|
|w/|withの略。w/oはwithout|
|i.e.|すなわち|
|HRU?|How are you? 元気？|
|Sup?|What's up? 元気？|
|typo|タイプミス、誤記。|
|segfault|segmentation fault|
|NPE|NullPointerException|
|OOM(OOME)|OutOfMemoryError|

他にもあれば教えて下さい。
OSX でmaven でビルドするとjava.lang.UnsupportedClassVersionErrorで失敗する

こういう例外が出る。

```java
Caused by: java.lang.UnsupportedClassVersionError: org/elasticsearch/index/query/Query : Unsupported major.minor version 51.0
```

いやでもJava 1.7入れてるし…。

調べると、java の指しているJDKのバージョンと、mavenが見ているJDKのバージョンが違うと発生するらしい。

```bash
$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
$ mvn --version
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-12T05:58:10+09:00)
Maven home: /usr/local/Cellar/maven/3.2.3/libexec
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: ja_JP, platform encoding: SJIS
OS name: "mac os x", version: "10.7.5", arch: "x86_64", family: "mac"
```

なるほど〜。

JAVA_HOMEをちゃんと指定してmavenを走らせるとオッケーだった。

```bash
JAVA_HOME=`/usr/libexec/java_home -v 1.7` mvn install
```
学内でプロキシ下でapt-getするまでの設定（Ubuntu 14.04）

学校の研究室でPCを使う際に設定したプロキシの防備録です。

## apt系のコマンドをプロキシ下で利用できるようにする。
やることは主にふたつ

* 環境変数の設定
* sudoつけるときはオプションに'-E'をつける

### 環境変数(http,https)を設定する。
* export http_proxy="http://[UID]:[PW]@[プロキシサーバのアドレス]:[プロキシサーバの指定するポート番号]/"
* export https_proxy="http://[UID]:[PW]@[プロキシサーバのアドレス]:[プロキシサーバの指定するポート番号]/"
* bashrcやらzshrcか何かに記述しておけばおｋ

### sudo -E で実行する
* apt-getする際、sudoをそのまま使うと環境変数を引き継がないそうで、プロキシ通ってくれない
* 実行するときにオプションで'-E'をつけると、環境変数を引き継いでsudoしてくれるそう
* 例: sudo -E apt-get update
* これで無事いろいろインストールできる

### 参考にした人
* http://qiita.com/aKenjiKato/items/18f9b8553f8ad4117d79

おせわになりました
open $file, '>', \"..." によるエラー

open で書き込み先が読み取り専用の scalar の reference だった時の動作が 5.20 で変わったようです。

```perl
$ perl -e 'printf "%vd\n", $^V; open $file, ">", \""; print "No exception\n"'
5.14.2
No exception
```

```perl
$ perl -e 'printf "%vd\n", $^V; open $file, ">", \""; print "No exception\n"'
5.18.2
No exception
```

```perl
$ perl -e 'printf "%vd\n", $^V; open $file, ">", \""; print "No exception\n"'
5.20.0
Modification of a read-only value attempted at -e line 1.
```

今までエラーにならなかったのがバグだったようですね。敢えて書き込めない値を指定する意味はありませんが、巡り巡って実はというのはありそう。
自分用メモ 3

［未完成］

とりあえずなんだかよくわからないので、元々入っているアプリケーションを一つ一つ見ていく。
と、同じような機能を持ったものが複数入っていることが判明した。なんで何個も同じのが入っているのだろう…？

で、Konsoleが２つあることに気がついた。
日本語化していればKonsoleと端末ってやつになってると思う。
何が違うのかなと思って色々見てみたが端末の方が個人的に設定ができて好みだったので今までKonsole使ってたけど乗り換えた。
色々見た目であったり設定が変更できたわけだが、Winのcmdも実は出来たりするのかな。
知らないだけで。

で、こういうのって片方消したりできないもんだろうか。また時間のあるときに調べようと思う。


;#echo "/usr/bin/setterm -blank 0" >> /etc/rc.local
で消灯オフにできるらしい、一応コマンドは打っておく。
しかしちょっと別のことをしているとロックがかかってしまう、これは何とかして外さないと少し手間かな。

そういえばAndroidがどうやらそのままでは認識してくれないようなのでこのへんの設定も後々。
ちなみに機種はHTC j butterfly,USB差してみたけどカメラのあたりの設定？を入れているところでエラー後に強制終了。

よくわからなくなってきたのでここでパネルに置くアプリを選別して弄り始める。楽しい。
よく見たら強制終了アプリとかも入っている。
便利なアプリがとても多く入っているなと感じた。
とりあえずシャットダウン用ボタンも出しておいた。(いちいちシステムまで行くのがめんどくさくて…)

エディタを選択しなければならないので土日でちょっと触ってみようと思う。
GEditはサーバの方のファイルを直で触れるのを確認した。
Chrome Dev Editorも見た目は良さそうだけど日本語にできないから迷う所。

後、すごく便利そうなサイト見つけましたので載せておきます。たぶんほとんどがここからのコードの引っ張りになりそう。
http://www.linuxpc.pro/query?os=CentOS_6&p=download

Ubuntuserverを利用しているためそちらの文字化けをようやく解消。
; $ vim /.bashrc
元々書いてあるものの一番下に付け加える形で書き込み開始。
; case $TERM in
; linux) LANG=C ;;
; *) LANG=ja_JP.UTF-8 ;;
; esac
保存。
; $ source ~/.bashrc

で一応文字化け解消されました。

参考:http://seesaawiki.jp/frogapp/d/ubuntu%20server%A1%A1%CA%B8%BB%FA%B2%BD%A4%B1
PHP GDで画像を自動で縮小してアップする

PHP で画像を自動で縮小してアップする方法をメモします。

# やりたいこと

* 画像を1枚アップする
* JPG画像のみアップできる
* 指定サイズ以上の画像のみアップできる
* 指定サイズより大きい場合は指定サイズに自動で縮小
* 縮小する際は幅・高さの長いほうを指定サイズに合わせる

# ソース

```example.tml
<form action="example.php" method="post" name="FormName" enctype="multipart/form-data">
<input type="file" name="up_img" value="参照" class="example">
<input type="submit" name="submit" value="送信">
</form>
```


```example.php
if ($_POST['submit']) {
	if (is_uploaded_file($_FILES["up_img"]["tmp_name"])) {
		$file1 = $_FILES["up_img"]["tmp_name"]; // 元画像ファイル
		$file2 = "../img/example.jpg"; // 画像保存先のパス
		$in = ImageCreateFromJPEG($file1); // 元画像ファイル読み込み
		$width = ImageSx($in); // 画像の幅を取得
		$height = ImageSy($in); // 画像の高さを取得
		$min_width = 500; // 幅の最低サイズ
		$min_height = 500; // 高さの最低サイズ
		$image_type = exif_imagetype($file1); // 画像タイプ判定用

		if ($image_type == IMAGETYPE_JPEG){ // JPGかどうか判定
			if($width >= $min_width|$height >= $min_height){
				if($width == $height) {
					$new_width = $min_width;
					$new_height = $min_height;
				} else if($width > $height) {//横長の場合
					$new_width = $min_width;
					$new_height = $height*($min_width/$width);
				} else if($width < $height) {//縦長の場合
					$new_width = $width*($min_height/$height);
					$new_height = $min_height;
				}
				//　画像生成
				$out = ImageCreateTrueColor($new_width , $new_height);
				ImageCopyResampled($out, $in,0,0,0,0, $new_width, $new_height, $width, $height);
				ImageJPEG($out, $file2);
			} else {
				echo "サイズが幅".$min_width."×高さ".$min_height."以上の画像をご用意ください";
			}
		} else {
			echo "JPG画像をご用意ください";
		}
}
```
manやtreeコマンド等の出力結果から特殊文字を除去するcolコマンド

* tree, man等の出力結果には特殊文字・制御コードが含まれる
* ので、エディタでそのまま開くとコンソールの描画が乱れたりする
* 神戸在住の [colコマンド - 神戸美女Linux](http://bijo-linux.com/kobe/command/c/col%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/) を使うと、こうした特殊文字を除去できる


```bash
$ tree | col -bx > tree.txt
$ vi tree.txt

$ man | col -bx > man.txt
$ vi man.txt
```

* manは「普段使ってるエディタで」「特殊文字を除去した状態で」読むのが一番読みやすく効率も良い。
* ということでvimmerの自分は`.bashrc`(or `.zshrc`)に下記のような関数を追加した。`manv <コマンド名>`でmanをvim read-onlyで開く

```bash
function manv() {
  c=$1
  man ${c} | col -bx | vim -R -
}
```