OmniAICreator/Qiita-1.07M huggingface dataset:
今すぐ試せる、遊べるターミナルのコマンドを集めてみた


#ターミナルで遊ぼう
他でもいっぱい紹介されてるけど、ターミナルで遊べるコマンドを集めてみた。


<b>メリット</b>
・ターミナル操作知らない人の前でやると、ほんのちょっとウケる。
・仕事の息抜き。
・授業とかで、ターミナルのとっつきにくさを解消するのに使えるかも。

動作環境:Mac OSX 10.10.2 (Yosemite


#喋らせる(音量注意)　: sayコマンド

```
say hello 
say こんにちは
```
say の後に書いた文字が読み上げられる。
例えばこんなに長くてもちゃんと読んでくれる。
```
say じゅげむじゅげむ　ごこうのすりきれ　かいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつ　くうねるところにすむところ　やぶらこうじのぶらこうじ　ぱいぽぱいぽぱいぽのしゅーりんがん　しゅーりんがんのぐーりんだい　ぐーりんだいのぽんぽこぴーのぽんぽこなのちょうきゅうめいのちょうすけ
```
#歌わせる(音量注意)　: say -v goodコマンド　
```
say -v good
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
```

say -v good  の後に入力した文字を歌ってくれる。満足したら [Ctrl] + [c] を押して閉じよう。

基本のメロディーはヘンデルの「見よ勇者は帰り来ぬ」。
他の歌い方なども[引用:Macが歌いだす！？](http://veadardiary.blog29.fc2.com/blog-entry-1645.html) などで沢山紹介されているので、自分のPCの美声を堪能しよう。

その他パターン
```
osascript -e 'say "Dum dum dee dum dum dum dum dee Dum dum dee dum dum dum dum dee dum dee dum dum dum de dum dum dum dee dum dee dum dum dee dummmmmmmmmmmmmmmmm" using "Pipe Organ"'
```

```
osascript -e 'say "Dum dum dee dum dum dum dum dee Dum dum dee dum dum dum dum dee dum dee dum dum dum de dum dum dum dee dum dee dum dum dee dummmmmmmmmmmmmmmmm" using "Pipe Organ"'
```

```
osascript -e 'say "Dum dum dee dum dum dum dum dee Dum dum dee dum dum dum dum dee dum dee dum dum dum de dum dum dum dee dum dee dum dum dee dummmmmmmmmmmmmmmmm" using "Pipe Organ"'
```
```
osascript -e 'say "Dum dum dee dum dum dum dum dee Dum dum dee dum dum dum dum dee dum dee dum dum dum de dum dum dum dee dum dee dum dum dee dummmmmmmmmmmmmmmmm" using "Hysterical"'
```


#テトリス
```
emacs
(emacsが起動したら「esc」 + 「x」を押す)
tetris
```
![スクリーンショット 2015-07-13 3.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/58976/bd9adc31-2f22-93b8-28d3-c59432c415f1.png)

ちょっと縮尺が歪んでいるけど、十分に遊べる。
だんだん落ちる速度も早くなってくるのが凝ってる！

ちなみに、emacsには他にもいろいろゲームがあるそうな。

##スネークゲーム
```
emacs
(emacsが起動したら「esc」 + 「x」を押す)
snake
```
![スクリーンショット 2015-07-13 2.59.46.png](https://qiita-image-store.s3.amazonaws.com/0/58976/44695a2e-1477-0c38-3c37-21d964c77f03.png)

##ライフゲーム
```
emacs
(emacsが起動したら「esc」 + 「x」を押す)
life
```
![スクリーンショット 2015-07-13 3.04.44.png](https://qiita-image-store.s3.amazonaws.com/0/58976/c4ce4d65-a14a-f88f-958a-9d7b222c51d0.png)

他:
[引用:emacsで暇つぶし](http://komaba.sodan.ecc.u-tokyo.ac.jp/2002/article/tips/leisure/)

#でっかい文字を表示させる : bunnerコマンド

```
banner hello
```

bannerの後に打った文字が巨大化されて表示される。
*ウィンドウを大きくしないと何書いているか分からない。
![スクリーンショット 2015-07-13 3.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/58976/add01f0c-d82f-1c83-ebea-e1390c9dba4f.png)



#結論
以上、今すぐ試せる遊べるターミナルコマンドでした。
他にもLINUX系のコマンドを使えるようにすれば、SLコマンドなどまだまだ遊べるコマンドがありそうだけど、遊びすぎて上司に怒られないようにしよう！

他:
[引用:SLコマンド](http://chitan.hateblo.jp/entry/2011/12/04/001957)
HaskellでのJSONパースがこんなに簡単だったとは

Webが絡むプログラムを書こうと思うと必ずJSONを扱う必要が出てきますよね
HaskellでJSONにはどうすればいいでしょうか？

最初は自分でパーサーを書いたり対応するレコードをいちいち定義する必要があるんだと思っていたのですが[lens-aeson](https://hackage.haskell.org/package/lens-aeson)を使うと思った以上に簡単にJSONを扱うことが出来ました。

例えば以下の様なJSONがあったとします


```json
{
    "title": "The Godfather",
    "year": 1972,
    "starring": [
        "Marlon Brando",
        "Al Pacino",
        "James Caan"
    ]
}
```

`lens-aeson`を使ってデータをいろいろ取り出してみましょう。

```hs
{-# LANGUAGE OverloadedStrings #-}
import Control.Lens
import Data.Aeson.Lens

jsonString :: String
jsonString = "{\"title\": \"The Godfather\",\"year\": 1972,\"starring\": [\"Marlon Brando\",\"Al Pacino\",\"James Caan\"]}"

main = do
    print $ jsonString ^? key "title"
    -- Just (String "The Godfather")

    print $ jsonString ^? key "title" . _String
    -- Just "The Godfather"

    print $ jsonString ^? key "year"
    -- Just (Number 1972.0)

    print $ jsonString ^? key "year" . _Integer
    -- Just 1972

    print $ jsonString ^? key "starring" . nth 1 . _String
    -- Just "Al Pacino"
```

どうでしょうか
JSONの文字列をパースするコードを一切書いていませんね
実は`key`を使ってアクセスした段階で秘密裏に変換が行われています
[定義](https://hackage.haskell.org/package/lens-aeson/docs/Data-Aeson-Lens.html#t:AsValue)を見ればわかるとおり`String`でも`ByteString`でも`Value`でもJSONを表しているものであれば同じようにアクセスすることができます。
iOSアプリのwebviewでinput[type=file]が正常に動作しない時

## 背景

webviewベースのiOSアプリで画像upload機能をつくろうとしていた時の話

## 症状

html上に以下を記述。

```html
<input type="file" name="image" accept="image/*"/>
```

ボタンをクリックすると以下の様なダイアログが表示され、
![IMG_3575_Fotor.png](https://qiita-image-store.s3.amazonaws.com/0/6269/87bbc117-cb33-66fc-4ce2-13163b191fcb.png)
`Cancel`以外をクリックすると

```
Warning: Attempt to present <UIImagePickerController: 0x150b1200> on <YourViewController: 0x14d5bef0> whose view is not in the window hierarchy!
```

のようなメッセージとともにwebviewが初期化されてしまうというもの。

(再現環境: iOS8.4, iPhone 6)

## 解決方法

### その一

http://stackoverflow.com/questions/25942676/ios-8-sdk-modal-uiwebview-and-camera-image-picker

```objc
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
    if ( self.presentedViewController)
    {
        [super dismissViewControllerAnimated:flag completion:completion];
    }
}
```
当該Controllerに上記コードを仕込む。

### その二

http://stackoverflow.com/questions/25898564/ios-8-0-uiwebview-file-input-crashes-my-app

```html
<input type="file" name="image" accept="image/*" multiple/>
```
`input`タグに`multiple`属性をつける。
これだとそのままカメラで撮影した画像を利用することはできないが(上の画像で言う、`Take Photo`がない)、
サーバー側のhtmlの修正だけで取り急ぎ画像uploadできるようになったので今回はコチラを採用しました。
BeagleBone Blackで1-WireセンサのDS18B20を使う - Part1: SDカードのUbuntuの復旧

ことの始まりは1-Wireセンサの[DS18B20](http://victory7.com/?pid=65664796)をBeagleBone Blackに接続しようとしたことです。SDカードにインストールしていたUbuntu 14.04はカーネルが3.14と新しく[Capemgr](http://elinux.org/Capemgr)が存在していません。[dtb-rebuilder](https://github.com/RobertCNelson/dtb-rebuilder)を使って[DTS](https://github.com/RobertCNelson/dtb-rebuilder/tree/3.14-ti/src/arm)を編集してビルドした後、/boot/uEnv.txtのDTBを書き換える必要があります。ところが書き間違えてSDカードからbootしなくなりました。なんとかSDカードは復旧したのですが、カーネルが3.8.13のDebian 7.8を入れ直した方がよさそうです。


## eMMCのDebianからSDカードの復旧

SDカードのUbuntu 14.04はDebian 7.8に入れ替えますが、備忘のため`/boot/uEnv.txt`を書き間違えてbootしなくなったSDカードの復旧についてメモしておきます。まずSDカードを抜いてeMMCからbootします。この場合はDebianが入っています。起動後にSDカードを挿します。fdiskで確認すると、SDカードは`/dev/mmcblk1`のデバイスのようです。

```bash
$ sudo fdisk -l
...
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk1p1   *        2048     3481599     1739776   83  Linux
Disk /dev/mmcblk1: 15.7 GB, 15720251392 bytes
```

lsblkでデバイス名とmount pointも確認します。

```bash
$ lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
mmcblk0boot0 179:8    0     1M  1 disk
mmcblk0boot1 179:16   0     1M  1 disk
mmcblk0      179:0    0   1.8G  0 disk
├─mmcblk0p1  179:1    0    96M  0 part /boot/uboot
└─mmcblk0p2  179:2    0   1.7G  0 part /
mmcblk1      179:24   0  14.7G  0 disk
└─mmcblk1p1  179:25   0   1.7G  0 part /media/rootfs
```

SDカードにある`/boot/uEnv.txt`が見つかりました。

```bash
$ ls -al /media/rootfs/boot/
-rw-r--r--  1 root root     414 Jan  6  2015 uEnv.txt
```

あとは間違えて設定した`dtb=`の記述を消します。

```bash
$ sudo vi /media/rootfs/boot/uEnv.txt
```

SDカードを挿したままrebootすれば、SDカードのUbuntuが起動するようになりました。

```bash
$ sudo reboot
```
実例で学ぶ、PostgreSQLだとJOINが必要ないケース


クソリプです

[RDB - 実例で学ぶ、JOINが遅くなる理屈と対処法 - Qiita](http://qiita.com/yuku_t/items/208be188eef17699c7a5)

上記の記事は内容も正しく解説も丁寧で大変素晴らしいのですが、例示されているユースケースであれば、PostgreSQLでは配列型とGINインデックスを使うことでJOINそのものをなくせます。

## 実例

### テーブル定義

```sql
CREATE TABLE articles (
  id serial PRIMARY KEY,
  created_at timestamp DEFAULT current_timestamp,
  tags int[]
);

CREATE INDEX articles_created_at ON articles (created_at);
-- 記事のタグリストに対するインデックス
CREATE INDEX articles_tags ON articles USING gin(tags);

```

### サンプルデータ投入

```sql
INSERT INTO articles(created_at, tags)
SELECT
    current_timestamp + interval '1 minute' * i,
    array_uniq(ARRAY[0, i%11, i%13])
FROM
    generate_series(1,100000) as t(i);

/*
array_uniqはこんなの
CREATE OR REPLACE FUNCTION array_uniq(anyarray) RETURNS anyarray AS $$
SELECT
    array_agg(DISTINCT e)
FROM
    unnest($1) as t(e);
$$ LANGUAGE sql STRICT IMMUTABLE;
*/
```

### ある記事（ID=1とする）のタグ一覧
```sql
test=# SELECT unnest(tags) FROM articles WHERE id = 1;
 unnest
--------
      0
      1
(2 rows)

test=# EXPLAIN SELECT unnest(tags) FROM articles WHERE id = 1;
                                   QUERY PLAN
---------------------------------------------------------------------------------
 Index Scan using articles_pkey on articles  (cost=0.42..8.93 rows=100 width=32)
   Index Cond: (id = 1)
(2 rows)
```

### あるタグの新着記事10件
```sql
test=# SELECT * FROM articles where tags @> ARRAY[1] ORDER BY created_at DESC LIMIT 10;
   id   |         created_at         |   tags
--------+----------------------------+----------
 199997 | 2015-09-20 09:51:21.284207 | {0,1,7}
  99997 | 2015-09-20 09:51:11.733148 | {0,1,7}
 199991 | 2015-09-20 09:45:21.284207 | {0,1,8}
  99991 | 2015-09-20 09:45:11.733148 | {0,1,8}
 199984 | 2015-09-20 09:38:21.284207 | {0,1,5}
  99984 | 2015-09-20 09:38:11.733148 | {0,1,5}
 199980 | 2015-09-20 09:34:21.284207 | {0,1,10}
  99980 | 2015-09-20 09:34:11.733148 | {0,1,10}
 199971 | 2015-09-20 09:25:21.284207 | {0,1,3}
  99971 | 2015-09-20 09:25:11.733148 | {0,1,3}
(10 rows)

test=# EXPLAIN SELECT * FROM articles where tags @> ARRAY[1] ORDER BY created_at DESC LIMIT 10;
                                                 QUERY PLAN
------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.42..4.22 rows=10 width=44)
   ->  Index Scan Backward using articles_created_at on articles  (cost=0.42..12277.11 rows=32293 width=44)
         Filter: (tags @> '{1}'::integer[])
(3 rows)
```

## コメント

記事に対するN:MのようなJOINは、上記のように配列型を利用することでJOINを減らし効率よく検索できる可能性があります。

デメリットとしては外部参照による制約が利用できるなくなる、更新の処理が重くなる（かも）などが挙げられます。配列型の利用は、元記事で言及されている、非正規化したキャッシュの一種だと考えられるでしょう。

万能ではないので選択肢の一つとして頭の片隅においておくといいと思います。
mongodb3.0のwiredtiger storage engineを試す

# mongodb3でドキュメントの圧縮が可能になる

mongoは、私の好きなプロダクトの一つだ。ただひとつ困ったことがあって、あれもこれもと入れていくと、ディスクサイズが増えがちだということだ。

mongodbは3から今までのストレージエンジンmmapv1と併用して、WiredTigerというストレージエンジンを選べるようになった。

[こちらの記事](http://qiita.com/fetaro/items/d2d7e52ea0e40dc8defb)によると

> ドキュメントロックになり、書き込み性能7〜10倍UP
> ドキュメント圧縮が選べるようになり、最大80%圧縮

とのこと。私の場合、スクレイプしたデータの保存場所に、mongoを使うことが多いので、ドキュメントの圧縮が効くというのはすごく魅力的だ。ドキュメントを圧縮出来るので、昔ながらのHDDではなく(小容量だが速度が早い)SSDに保存も可能になった。

# ubuntuにmongodb3を入れる

ubuntu14.04にmongodbを入れた。入れ方はこちらの記事を参考。

[Install MongoDB on Ubuntu](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/)

特に迷うことなくmongodbが入る。変更点は、/etc/mongodb.confから/etc/mongod.confに名前が変わる。yaml表記が可能になるの２点だ。

# mongodb3で圧縮を有効にしたconf

圧縮方式はsnappyにした。[こちらの記事](http://www.acmebenchmarking.com/2015/02/mongodb-v30-compression-benchmarks.html)で速度と圧縮率でバランスがとれていると感じたからだ。

confファイルは次のようにした。[こちらの記事](http://qiita.com/fetaro/items/2b39a1006ceab9df7fb7)を参考にした。

```yaml

storage:
    dbPath: "/var/lib/mongodb/wt"
    engine: "wiredTiger"
    wiredTiger:
        collectionConfig:
            blockCompressor: "snappy"
        engineConfig:
            cacheSizeGB: 1
            statisticsLogDelaySecs: 5
            journalCompressor: "snappy"
            directoryForIndexes: true
systemLog:
   destination: file
   path: "/var/log/mongodb/mongodb_wt.log"
   logAppend: true
storage:
   journal:
      enabled: true
net:
   bindIp: 127.0.0.1
   port: 27017

```

mongodb如何にwtディレクトリを掘ってデータを格納する。wtの所有者はmongodbにしておくと良い。

# 効果測定

mongodb2で250GB程度のコレクションを、読み込んでみてどの程度圧縮されるか検証した。

## mmapv1

従来のmmapv1は251GBあった。

```console
ubuntu@xxx/var/lib/mongodb$ du -h
3.1G    ./journal
251G    .

```

## wiredtiger

wiredtigerでは、約53GBだった。大体1/5になり、当初書かれていた様に80%削減出来た。

```console
ubuntu@xxxxxxxxx:/var/lib/mongodb/wt$ du -h
201M    ./journal
48G     ./collection
4.0K    ./_tmp
4.7G    ./index
53G     .
```

## 読み込み速度

圧縮した分、速度低下が起こるかと思ったが、ざっと触ってみたところ、速度低下はなかった。


## webサイトのスクレイパー向き

個人的によくwebサイトのスクレイピングをするが、そのような用途ではすぐディスクサイズが圧迫される。webサイトは多種多様な形式のため、あまりカラム型で圧縮も難しい。wiredtigerは手軽に容量を1/5に圧縮できるので、そのような用途では良いかもしれない。、
iPhoneの画像uploadで向きが思い通りにならなくて困った時に

## 背景

webviewベースのiOSアプリ作成中、(サーバーサイドはRails)
iPhoneの画像をS3にuploadして表示するという機能を作っていた時のこと

## 症状

uploadした画像を`img`タグで表示すると問題ないが、cssの`background-image`で画像を表示しようとすると向きが90°ずれている

## 原因

[[PHP] iPhoneからメールで送信した画像の向きを修正する方法](http://blog.diginnovation.com/archives/1104/)

まさにこれ。

> Phoneを縦向き状態で縦画像を撮影した場合でも、iPhone内には横画像(横長の画像)として保存されています。
ではなぜiPhoneでは縦画像を問題なく表示できるかというと、画像データの中に含まれている『Exif』という画像情報に画像の向きが書きこまれているためです。

## 解決方法

[ImageMagickでjpegの縦横(exifのOrientation)情報を元に画像を回転する](http://lxyuma.hatenablog.com/entry/2013/12/07/095742)

こちらを参考に、`Magick::Image#auto_orient!`を利用することで解決しました。
Rails勉強メモ

resourcesメソッドのオプション

```
resources :users, only: [:index, :new]
```
指定したルーティングを設定

```
resources :users, :except [:index, :new]
```

指定された物以外のルーティングを設定

```
resources :users, controller: 'hoge'
```

コントローラの変更

```
resources :users, path: 'hoge'
```

URLパスの変更

```
if @user.save
```

saveメソッドはバリデーションに失敗するとfalseを返す。

```
expect { patch :update, id: user.id, user: params_hash }.not_to change { user.hashed_password.to_s }
```

Rspecのテストでchangeマッチャーはターゲット（BCrypt::Passwordオブジェクト）の==メソッドで比較をするので、to_sで文字列に変換して合わせる。

```
    create_table :user_events do |t|
      t.references :user, null: false
    end
```

TableDefinitionオブジェクト(t)のreferencesメソッドは指定された名前の末尾に_idを追加して整数型のカラムを定義する(:user_id)。
Go入門 その1 Hello World


# 開発環境  
環境は下記の通り  
- [Go入門@環境構築編(IntelliJ IDEA 14.1.4)](http://qiita.com/makoto2468/items/3ced77de947ea997e72f)

# 実装
IntelliJ IDEAは補完機能が充実しているため、
写経もほとんど必要なし

1. File->New->新規Project
1. Goを選択でOK
1. 新規->GoFile->Name[main(任意)] Kind[Simple Application]
![go_01_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/2b289976-0e9e-2c76-4e71-b645d65ea5a6.jpeg)
1. func main() の中に実装。補完候補が出るのでfmt->Printlnで補完入力。
1. 補完で入力すれば、importまで自動で行ってくれる。ページ末を写経。  
1. 右クリック 実行Run main.go で実行
  
###
    package main
    import "fmt"
    
    func main() {
        fmt.Println("HalloGo")
    }
###
Firefox OS 導入まで

「関西おうちハック」という勉強会に参加して、FirefoxOSとOpenWebBoardの導入までを行ってきたのでそのメモ。

## 開発環境とシュミレータ

まずFirefoxOSで動作するアプリケーションの準備。

1.できるだけ最新のFirefoxブラウザを用意する（現時点ではv39.0）

2.開発ツール > WebIDEを選択する
![image](https://qiita-image-store.s3.amazonaws.com/0/35271/9d102680-559e-9005-d708-425f1ef0dd4b.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/35271/ec645d6b-7942-c514-1995-3513668c6fc7.png)

3.ランタイム選択 > シュミレータをインストール > 適当にシュミレータをインストールする
※実際に利用するデバイスによっては対応しているバージョンがあるようです。OpenWebBoardを使用する場合はv1.3とADB Helperをインストールする必要があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/35271/88297d52-a024-e475-e3a5-7a7589098c50.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/35271/b65cd449-7545-7d72-0e5f-b04ed6447e89.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/35271/e561a27f-1674-a2d0-e5a4-5aae10d0374e.png)

4.インストールが完了すれば、左上のアプリを開く > 新規アプリでアプリを選択後、右上のランタイムを選択　>　先ほどのシュミレータを選んで真ん中の▶(Run)ボタンでアプリケーションが実行されます。ここまではFirefoxのブラウザだけで完結です。

## OpenWebBoardとつながる
OpenWebBoardとはKDDIが提供している開発用ボード。ハッカソンとかに参加するといただけたりするらしい。。
[KDDI、Firefox OS採用の開発ボードOpen Web Boardを無料配布。GUI開発環境Gluinも用意 - Engadget Japanese](http://japanese.engadget.com/2014/10/02/kddi-firefox-os-open-web-board-gui-gluin/)

HDMI、microUSB、USBの端子が1つずつついており、それぞれモニター表示、電源供給、開発用（PC）に接続される。
接続自体はとっても簡単だが、接続のための下準備が少し必要。

ここからはMac限定。Windowsももちろんできますが手順、必要な物が変わります。
参考 [au Firefox OS 関連技術情報](http://opensource.kddi.com/owb/)

1.Android SDKをインストールもしくはHomebrewから`brew install android-platform-tools`でインストールする。

2.adbコマンドが使えるようになる。（SDKからインストールした方はパスを通す必要があり、唯自分の場合このSDKに苦戦・・SDKアプリはインストールしたもののコマンドの場所がわからず結局Homebrewから落としました）

3./Users/ユーザ名/.android内のadb_usb.iniの最後の行に`0x2207`を追記。これがOprenWebBordのベンダーIDとなっているようです。

4.あとはOprenWebBordをモニター、PCに接続して、`adb devices`と打ってみてデバイス名が表示されていたら接続完了。先ほどのシュミレータ一覧(Firefoxブラウザ)の上の段にUSB項目があるのでそこでデバイス名が表示されればOKです。

あとはこのIDEでアプリケーションを開き、Runボタンを押すとOpenWebBord上で実行されます。

## FirefoxOSのアプリについて

もっともシンプルなHelloWorldを見ると
manifest.webapp
iconsフォルダ
上記以外は普通のhtml、css、jsファイルで構成されていて本当にWEBの技術でできているんだ！と実感できます。

アプリ一覧が並ぶHOME画面などもWEBページの仕組みになっているらしく、
WEBサイトのソースをほぼそのまま突っ込むだけでそのまま表示されます。
当たり前といえば当たり前ですが。。

今回はこのほかにToCoStickという無線通信機器を利用した温度センサーの値をリアルタイムに取得し、Twitterに投稿するというデモを見せていただきました。
これとOpenWebBordの連動もできるのでセンサーの値をjavascript制御で出力するなんてことも。。次はなにか作ります！
UnityでXcodeとAndroidのプロジェクトを作成し実行してみる

UnityがどのようにAndroid、Xcodeコードに変換して動かしているの知りたかったのプロジェクトを作成してみることとします.

Mac Yosemite
Unity: 4.6.5p3 (Xcodeは諸事情により5.1.1f1)
Xcode: 6.4
Android Studio: 1.1.2
上記バージョンでやってみます.

#Xcode
あらかじめ下記をしておきます.
<dl>

<dt>Xcodeをインストール.</dt>
<dd>適当に各種シュミレーターなどのダウンロード、インストールしておきます.</dd>

<dt>Unityをインストール.</dt>

</dl>

##UnityからXcodeプロジェクト作成
Unityのメニューバーの「File」-「Build Settings...」
iOSにSwitch Platformした後、「Build」します。

今回はiPoneシュミレーターで動かすので
Inspectorの設定で「Bundle Identifier」と「SDK Version」を"Simulator SDK"に設定しておきます.
![ios_project_inspector.png](https://qiita-image-store.s3.amazonaws.com/0/17192/c31e64e9-394c-45ee-e9fe-e565a241f753.png)

##実行
iOSはエミュレーターで実行してみます.
プロジェクトをダブルクリックしてXcodeを開きます.
![select_xcoddeproj.png](https://qiita-image-store.s3.amazonaws.com/0/17192/10503720-a46b-69a9-22dd-01e4299c0757.png)

※実行してエミュレーターを起動すると以下のようなエラーがでましたが、Unityのバージョンによってはこうなるようです。
![run_xcode_error.png](https://qiita-image-store.s3.amazonaws.com/0/17192/1040028e-61fb-f8f4-c075-1241e5db0db4.png)

Unityバージョンを変えたら実行できました.
![run_ios.png](https://qiita-image-store.s3.amazonaws.com/0/17192/e25a776f-2c8e-e921-d295-6a0921d42195.png)

#Android
あらかじめ下記をしておきます.
<dl>

<dt>Android Studio(AndroidSDK含む)をインストール.</dt>
<dd>AndroidSDKManagerで適当に各種ダウンロード、インストールしておきます.</dd>

<dt>JDKをインストール.</dt>
<dd>公式サイトからダウンロード、インストールしておきます.
今回のバージョンは下記.

```bash
% java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
```

</dd>

<dt>Unityをインストール.</dt>

</dl>

##UnityからAndroidプロジェクト作成
Unityのメニューバーの「File」-「Build Settings...」
AndroidにSwitch Platformした後、「Google Android Project」にチェックをいれ「Export」します。ここにチェックをいれないとapkファイルが作成されます.
あと、「Bundle Identifier」を忘れずに設定しておいてください.
![android_build_settings.png](https://qiita-image-store.s3.amazonaws.com/0/17192/e32e7cd8-29e1-7c19-13a9-22a357942394.png)

##Android Studioにimport
ExportしたAndroidプロジェクトをAndroidStudioにインポートしてみます.
「Import〜」を選択しインポートします.
![android_studio_welcom.png](https://qiita-image-store.s3.amazonaws.com/0/17192/3c363327-a3d8-b912-3e18-0f01a8f2abdf.png)

##実行
Androidはシュミレーターが重いことで有名なので実機で実行してみます.
USBでデバックモード有効でつないで、AndroidStudioから実機を選択して実行すればいけると思います.
![run_android.png](https://qiita-image-store.s3.amazonaws.com/0/17192/925b7237-af8a-4bd6-b850-7a0bb6a82a2a.png)
GLS Unity入門講座 メモ


2015/7/11
これに行ったときのメモ
[第一回GLS for Education「初心者向けUnity講座」]
(http://connpass.com/event/16894/?utm_campaign=event_participate_to_owner&utm_source=notifications&utm_medium=email&utm_content=title_link)

## GLSの紹介
Global Lab Sendai
DATE APPS アプリコンテスト

## 講座で作るもの
TempleRunみたいなやつ
TempleRun Gameplay
[Temple Run - Universal - HD Gameplay Trailer](https://www.youtube.com/watch?v=cJwkboCnzKE)

TempleRunをお手本にしたTempRunを作る
ゲームの概要：

- くま（かわいい）が自動的に走るので、上下キーの操作によりジャンプ/スライディングを行い障害物を避ける
- 障害物に当たるとくまは即死

## 成果物

[WebPlayer]
(http://www.googledrive.com/host/0B4ge1cYfczXgWGJKMWxsRlBmaDQ)
カメラワーキングはKiller7を意識。

[Unityパッケージファイル]
(https://drive.google.com/file/d/0B4ge1cYfczXgZV9aX0NYUVEyMWc/view?usp=sharing)


## 作業内容

- くまのモデルおよびアニメーションは配布されたアセットを使用
- アニメーションビューでくまにアニメーションを設定。遷移条件を設定。
- ステージの床、障害物はUnity上でCubeを引き延ばして作成
- 障害物のマテリアルはUnity上で作成、適用
- プレハブの活用
- くまへのRidgedbody, Colliderの適用
- 当たり判定は、障害物に衝突した時点のくまのアニメーション状態で判断
- 障害物へのタグ付けでUpper/Lower障害物を判断
- キー入力、当たり判定のスクリプティング


## Tips

SoftShadowよりHardShadowのほうがパフォーマンスがよい（軽い）

Playmode（プレビュー）中の変更はプレビュー終了時にすべて破棄されてしまうので、解りやすいようにPlay中のときのエディタカラーを変える。
Preference>Colors Playmode Tintの色を変える


## Animation

animation clip のアセットをAnimation view にD&Dして状態が追加される
遷移条件になる変数を+で追加
矢印を作成したあと矢印をクリック→遷移条件をinspectorで設定する

can transition to self -> falseにすると自分自身の状態に遷移しない

```
function LateUpdate() {
	this.GetCompornent(Rigidbody).velocity.x = 0.0f;
}
```





## Unityの最近の取り組み
Unity マッチングサイト
Unity Solution Conference
Unite
学生向け　就職大作戦
高校生　Unityインターハイ


## Unityエディタ
エディタは５つのViewで構成される
- Scene View
- Game View
- Hierarchy View
- Project View
- Inspector

Pivot Gobal

alt+opt rotate
wheel 拡大縮小
マウス中ボタン
alt+opt 
f key Focus to Object





i-saint 
メガデモ
tokyo DEMO fes
ShaderLab
Qmarion
anyenvでYosemiteにまっさらからRuby,PHP,Pythonを入れてみる

Macbookを買い換えたことをきっかけに、OS X Yosemite 10.10.3にanyenvで

* rbenv
* phpenv
* pyenv

をインストールし，それらを使って任意のバージョンのRuby,PHP,Pythonを入れてみた。それまでは、rbenvとphpenvのバッティングに悩んでしまってスクリプト直すのめんどくさいのでそこまではしていなかった。今回は、anyenvを使ってrbenvなどを導入してみる。
brewやbrew caskはインストール済。

```bash:anyenvのインストール
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
```

```bash:
$ anyenv install rbenv
$ anyenv install phpenv
$ anyenv install pyenv
$ exec $SHELL -l
```

ここから

```bash:
$ rbenv install --list
```
をしてみて，その時点の安定最新版であったRuby 2.1.6,Ruby 2.2.2を入れてみた。

```bash:
$ rbenv install 2.1.6
$ rbenv install 2.2.2
```

するとrbenvがそれぞれのインストールで毎回，Opensslをインストールしようとしているっぽいので，いったんrbenvを止め，入れたRubyをuninstallして，homebrewで全体にopensslを入れてみる。

```bash:
$ brew install openssl
```

その後、改めて

```bash:
$ rbenv install 2.1.6
$ rbenv install 2.2.2
```

次にPHP 5.6.8を入れてみる。
これはすんなりいった。

```bash:
$ phpenv install --list
$ phpenv install 5.6.8
$ phpenv versions
* system
  5.6.8
```

あとPHP 5.5.24を入れようとするとこうなった。

```bash:
$ phpenv install 5.5.24
（略）
[Downloading]: http://php.net/distributions/php-5.5.24.tar.bz2
[Preparing]: /var/tmp/php-build/source/5.5.24

-----------------
|  BUILD ERROR  |
-----------------
-----------------------------------------
configure: WARNING: bison versions supported for regeneration of the Zend/PHP parsers: 2.4 2.4.1 2.4.2 2.4.3 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7 (found: 2.3).
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: jpeglib.h not found.
-----------------------------------------
```

macにphpenv,php-build,apacheで開発環境を構築したのでメモ
http://box406.hatenablog.com/entry/2013/04/01/232212

```bash:
$ brew install re2c
$ brew install jpeg
$ brew install libpng
$ brew install libmcrypt
```

pyenvに関しては、こんな感じ。

```bash:
$ pyenv install 3.4.3
Downloading readline-6.3.tar.gz...
-> http://ftpmirror.gnu.org/readline/readline-6.3.tar.gz
Installing readline-6.3...
```

readlineが要求されている模様。そこで

```bash:
$ brew install readline
```
としてreadlineをインストール。
あらためて```pyenv install```を実行するが

```bash:
$ pyenv install 3.4.3
（略）
Ignoring ensurepip failure: pip 6.0.8 requires SSL/TLS
```
と怒られて途中で止まった。
コンパイルにつかうOpenSSLが上手く指定できていない模様。

こちらを参考にしてxcodeの設定をコマンドで。

pyenv installで"Missing the OpenSSL lib?"と叱られる
http://otiai10.hatenablog.com/entry/2014/10/07/113040

```bash:
$ xcode-select --install
```

その後、

```bash:
$ pyenv install 3.4.3
$ pyenv versions
* system
  3.4.3
$ pyenv global 3.4.3
$ python -V
Python 3.4.3
```
Pythonのバージョン確認は大文字の```-V```らしい。
paramsに関するメモ

ルーター

```rb
TechReviewSite::Application.routes.draw do
  root 'top#index'
  get 'products/:id' => 'products#show'
end

```


ターミナル

```bash
[1] pry(#<ProductsController>)> params
=> {"controller"=>"products", "action"=>"show", "id"=>"1"}
[2] pry(#<ProductsController>)> params.permit(:id)
=> {"id"=>"1"}
[3] pry(#<ProductsController>)> params[:id]
=> "1"
[4] pry(#<ProductsController>)> Product.find(params[:id])
```

products/:idは表示されているidを取ってくるのでbinding.pryをしたあとparamsと入力するとidの値をとることができる。params[:id]とするとvalueの1だけをとることができる
Unityでローカルストレージ

ローカルにjsonを書き込んだり、読み込んだりするための簡単なメモ書き。

####ローカルストレージへのパスを取得
```
string savePath = Application.persistentDataPath;
```
####ディレクトリがあるか無いか調べる
```
Directory.Exists ("パス");
```
####ディレクトリ作成
```
Directory.CreateDirectory("パス");
```
####読み込み
```
File.ReadAllText("パス" + "ファイル名.txt");
```
####書き込み
```
File.WriteAllText("パス" + "ファイル名.txt", json);
```
##簡単なサンプルコード
```
using UnityEngine;
using System.Collections;
using System.IO;

public class LocalStorage : MonoBehaviour 
{
	string myJson = "[{\"NUM\":\"1\",\"TEXT\":\"HELLO\"},{\"NUM\":\"2\",\"TEXT\":\"BONJOUR\"},]";
	string dataName = "data.txt";

	void Start()
	{
		LoadLocalStageData ();
	}

	// ローカルストレージから読み込み
	public void LoadLocalStageData()
	{
		string savePath = GetPath ();

		// ディレクトリが無い場合はディレクトリを作成して保存
		if ( !Directory.Exists (savePath) )
		{
			// ディレクトリ作成
			Directory.CreateDirectory( savePath );
			// ローカルに保存
			SaveToLocal( myJson );
		}
		else
		{
			// ローカルからデータを取得
			string json = LoadFromLocal ();
			Debug.Log (json);
		}
	}
		
	// 保存
	void SaveToLocal( string json )
	{
		// jsonを保存
		File.WriteAllText( GetPath() + dataName, json );
	}
		
	// 取得
	string LoadFromLocal()
	{
		// jsonを読み込み
		string json = File.ReadAllText( GetPath() + dataName );

		return json;
	}

	// パス取得
	string GetPath()
	{
		return Application.persistentDataPath + "/AppData/";
	}
}
```
Unity > 実行時にブレークする > 実行 > プロセスにアタッチ > Unity Editor (Unity)

Unityでの実行時ブレークの仕方

Monodevelop-Unityにおいて行を選択してから
[実行]>[プロセスにアタッチ]>[Unity Editor(Unity)]
を選択すると実行時にそこでブレークできる。
Qiitaで読んでタメになった（気がする）初心者向け記事

##プログラム経験０のおじさんが、プログラムってどんなものか知るためにQiitaで読んだ記事

[キャリア1年未満だった僕が、社内にGitの運用を布教するために読みあさったもの ( +ちょ〜簡単に各Gitの運用方法のメリット・デメリット )](http://qiita.com/h0ng0yut0/items/d0ef7224abc5e07525d4)

[機械学習クソ素人の俺がプロダクトをリリースするまでの2ヶ月で覚えたこと](http://qiita.com/puriketu99/items/c519a95c0b16ea63c1ac)

[エヴァンゲリオンでわかってしまうJavaScript](http://qiita.com/hirokidaichi/items/346d5aa8b194cfe1b6aa)

[エンジニアで稼ぐために大切な１３のコト](http://qiita.com/kazukichi/items/7379b75fba2f90d3cf45)

[［初心者向け］こんなときどうする⁉︎ GitのTips26選！]
(http://qiita.com/Keisuke69/items/35d60e4e375fc525ccbd)

[技術的な文章を書くための1歩、2歩、3歩](http://qiita.com/vvakame/items/d657baf26cf83ac98bd0)

[ノンプログラマーが3ヶ月でWebサービスを作ってみた](http://qiita.com/tabbyz/items/6513e84f319843c316d5)

[MacBookAirで使っている便利ツール](http://qiita.com/syui/items/73a822970742b317aede)

[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](http://qiita.com/tag1216/items/5d06bad7468f731f590e)

[新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡](http://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)

[ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習](http://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7)

[初心者にネットワークを教えるとき](http://qiita.com/masatsugumatsus/items/734a43cf114095f25fbb)



markdown記法楽しいなｗ
何か初心者向けにいい記事あったら教えて下さい :laughing:
omniauth-facebook＋GraphAPI ver 2.4でemailフィールドが取得されない件の対応


## 問題
`omniauth-facebook`でFacebookログイン機能を実装しようとしたら、何故か`email`フィールドが取得されません。
`omniauth.auth`の値はこんな感じです。

```ruby
"omniauth.auth":{
  "provider":"facebook",
  "uid":"xxxxxx",
  "info":{
    "name":"xxx",
    "image":"http://graph.facebook.com/....."
  },
  "credentials":{
    "token":"...",
    "expires_at":1441880921,
    "expires":true
  },
  "extra":{
    "raw_info": {
      "name":"xxx",
      "id":"xxxxxxxxx"
    }
  }
}
```

## 原因
[graph-api ver 2.4](https://developers.facebook.com/blog/post/2015/07/08/graph-api-v2.4/) で、下記の変更があったようです。

> Fewer default fields for faster performance: To help improve performance on mobile network connections, we've reduced the number of fields that the API returns by default. You should now use the ?fields=field1,field2 syntax to declare all the fields you want the API to return.

デフォルトは、上記サンプルのように、`name`と`id`と`image`しかないです。

## 対応方法
- `omniauth-facebook`~~側の対応を待つ~~ を使う
	- 試しに[PullRequest #209](https://github.com/mkdynamic/omniauth-facebook/pull/209)を出してみましたが、**一応マージされました！！** ~~英語が下手なので説明が理解されるかどうか、マージしてくれるかどうかはあんまり自信がない。。。~~
	- 一応上記の修正で今までどおりに`email`の値を取得出来ました。
	- PullReuqstはマージされましたが、gemの新しいバージョンまだリリースされてないので、Gemfileでgithub直接指定する必要がある ⇒ `gem 'omniauth-facebook', github: 'mkdynamic/omniauth-facebook'`
- `omniauth-facebook`の`info_fields`オプションで対応する
	- 普段はあんまり使われてないオプションかも知れません ⇒ `info_fields`
	- 注意： **`email`だけに設定すると、`name`フィールドの値もメールアドレスになるため、`name,email`に設定する必要があります。**

```ruby
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'],
           :scope => 'email,user_birthday,read_stream', :display => 'popup',
           :info_fields => 'name, email' # ←追加する部分
end
```
UIView のコピー

stackoverflow 先生より

```objc
UIView *copyOfView = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
```

> http://stackoverflow.com/questions/4425939/can-uiview-be-copied
> http://stackoverflow.com/questions/10614276/clone-or-copy-uiviewcontroller-or-uiview
２０件画像を取得して表示する！

```rb
  <div id="main_cnt_wrapper">
    <div id="yjContentsBody">
      <div class="yjContainer">
        <span class="yjGuid"><a id="yjContentsStart" name="yjContentsStart"></a><img alt="ここから本文です" height="1" src="http://i.yimg.jp/yui/jp/tmpl/1.1.0/audionav.gif" width="1"></span>
        <div id="yjMain">
          <article class="section">
            <div class="container">
              <header class="header header--section">
                <h2 class="text-middle">
                  <i class="icon-movie color-gray-light"></i>新着作品
                </h2>
              </header>
              <ul class="thumbnails thumbnail--movies row grid4 js-lazy-load-images js-my-check-stats" id="list-module">
                <li class="col">
                  <a href=""><div class="thumbnail__figure" style="background-image:url(http://image.eiga.k-img.com/images/movie/79576/poster2/200.jpg?1410346831)"></div></a>
                  <div class="thumbnail__caption">
                    <h3 class="text-xsmall text-overflow" title="神さまの言うとおり">
                      <span><i class="icon-rate-60 text-xxsmall opacity-60" title=""></i></span>神さまの言うとおり<small 2014=""></small>
                    </h3>
                    <p class="text-small">
                      <span class="rating-star"><i class="star-actived rate-00"></i></span>
                    </p>
                  </div>
                </li>
              </ul>
            </div>
          </article>
        </div>
        <div id="yjSub">
```
この文を、データベースに応じて変化できるようにする。

```rb
<% @products.each do |product| %>
                <li class="col">
                  <a href=""><div class="thumbnail__figure" style="background-image:url(<%= product.image_url %>)"></div></a>
                  <div class="thumbnail__caption">
                    <h3 class="text-xsmall text-overflow" title="<% product.title %>">
                      <span><i class="icon-rate-60 text-xxsmall opacity-60" title=""></i></span><%= product.title =%><small 2014=""></small>
                    </h3>
                    <p class="text-small">
                      <span class="rating-star"><i class="star-actived rate-00"></i></span>
                    </p>
                  </div>
                </li>
              <% end %>
```

ちなみに@productとはコントローラーで指定したものである。

```rb
class TopController < ReviewController
    def index
      @products = Product.limit(20)
    end
end
```
Boot2dockerでホストとファイル共有

##やりかた
シンプルにオプションで設定してみる。
boot2docker1.7がでたのでそっちでやってみた。

##boot2dockerを取ってくる
[前回](http://qiita.com/ranran/items/cce41e0e363631d66c72)と重複する内容は省略
https://github.com/boot2docker/boot2docker-cli/releases

##起動してログイン
すでに起動している人はstopしてから
```
./boot2docker-v1.7.0-linux-amd64 start --vbox-share="/home=home"
./boot2docker-v1.7.0-linux-amd64 ssh
```
オプションで/homeをゲストOSのhomeという名前で設定

##マウント
```
mkdir host_home
sudo mount -t vboxsf home -o rw,gid=50,uid=1000 ./host_home
```
gidはstaff
uidはdocker
idコマンドで参照できます。boot2dockerのイメージでやってるからみんな共通のはず。

###おまけ
古いboot2dockerの人用にguest-addition取得するコマンド（いないと思うけど・・・）
boot2docker download vbox-guest-additions
（ほぼJSを使わない）スクロールバーのない横スクロールコンテナ

`mousewheel`や`touchstart`をハンドリングしないタイプの、横スクロールコンテナです。まずはライブサンプルをご覧ください。

![スクリーンショット 2015-07-12 19.48.30.png](https://qiita-image-store.s3.amazonaws.com/0/84193/2fcc12c4-e0e8-4386-3dae-12e35bfc252c.png)

https://jsfiddle.net/lovalotta/5a3ouah9/

コードに一部JSが入ってますが、スクロール位置を検出して、現在地がどこであるかを`.slider`に割り振っているからです。ここは省略可能だし、たいがいのiPhoneアプリ的なものでは横スクロール位置はでていないので、目的には合致すると思います。ということで「ほぼJSを使わない」感じで実装できます。

原理は簡単で、コンテナの外に任意の高さをもったラッパーを作ります。今回は`.showcase`としました。こいつが`200px`をもっていて、子供にあたるコンテナはそれより`50px`だけ多くなっています。これがブラウザが実装しているスクロールバーの実体です。ここはラッパーにより`overflow:hidden`されます。`50px`だけ大きくした分を`padding-bottom`に指定して、子の`height`とラッパーの`height`を同じにしておきます。

`display:inline-block`と`white-space:nowrap`でひたすら横に並べる指定にし、`font-size:0`で、改行や空白のサイズを0にしています。これ最小フォントサイズ規定にひっかからないか不安でしたが、とりあえず私の環境（MacのChrome/Firefox/Safari）では空白のサイズが0になりました。

あとは泥臭く`margin`を`10px`にしたりしてる感じですが、ここはフレーバー要素です。


# 追記
コンテナの下にアキがでてしまう環境があったらしいので、後日調べてみます。
Spotlight コメントをファイル名の先頭に付加する AppleScript

## 背景

これまで Mac だけで管理していた某ファイル群を NAS に移し，Windows マシンとも共有できるようにしたかったのですが，そこで問題になるのが「ファイルに付与していた Spotlight コメントどうしよう問題」です．Spotlight コメントをタグ的に使っていたので，これが消えてしまうと目当てのファイルを検索しづらくなってしまいます．

## 本題

今回は，Spotlight コメントをファイル名の先頭に付加することで強引な解決を図りました．あらかじめ Finder で対象のファイルを選択しておいて，下記の AppleScript を実行すると，ファイル名を `[コメント]ファイル名.txt` みたいな感じにリネームしてくれます．フォーマットが気に入らないときは7行目を編集してください．

例によって処理速度はあまり早くないので，まずは100ファイル位から，ちょっとずつ実行しましょう．

```applescript
tell application "Finder"
	set theFiles to selection
	repeat with aFile in theFiles
		set comm to comment of aFile
		if not (comm = "") then
			set fileName to name of aFile
			set name of aFile to "[" & comm & "]" & fileName
		end if
	end repeat
end tell
```

## おまけ

そもそも Spotlight コメントが消えてしまっていることがよくあります．
原因は不明ですが，下記サイトのスクリプトで復活できました．ありがとうございます！

[★ 消えてしまったSpotlightコメントを復活させるアップルスクリプト | § 使って楽しいアップルスクリプト集 §](http://obton.blogspot.jp/p/blog-page.html#spotlight)

```applescript

tell application "Finder"
	set slct to (selection)
	repeat with x in slct
		set thepath to POSIX path of (x as alias)
		set spcomment to (do shell script "mdls -name kMDItemFinderComment " & quoted form of thepath & "| awk -F\\\" '{print $2}'")
		if spcomment is "" then
			
		else
			set comment of x to spcomment
		end if
	end repeat
end tell
```
通信

##同期通信と非同期通信のおおまかな違いは？

###クライアント・サーバーの基本的な流れ

①ユーザーがサーバーにリクエスト
②サーバー処理中
③サーバーからレスポンスが帰ってきて表示

②の処理中にクライアントが他の操作（作業）ができるのが非同期通信で、データが帰ってくるまでフリーズしているのが同期通信
RailsのArelでPostgreSQL Syntaxエラー

RailsでArelからSQLを発行した場合、
PostgreSQLのバージョン9.2でエラーが出る。9.4の場合にはエラーが出ない。
CIとして利用しているサービスのPostgreSQLバージョン次第ではローカルでエラーにならずに、
CI上でエラーになったりして混乱するのでメモ。

#### エラー内容

```
ActiveRecord::StatementInvalid:
       PG::SyntaxError: ERROR:  syntax error at or near "FROM"
       LINE 1: ...ions".* FROM "reservations" WHERE (EXISTS (SELECT FROM "stor...
                                                                    ^
       : SELECT "reservations".* FROM "reservations" WHERE (EXISTS (SELECT FROM "stored_reservations" WHERE "reservations"."id" = "stored_reservations"."id"))
     
```

#### Railsのモデルでのscope

以下のように記述していた。

```
  scope :exists_in_stored, -> do
    arel_stored_reservations = Stored::Reservation.arel_table

    condition = reservations[:id].eq(arel_stored_reservations[:id])
    where(arel_stored_reservations.where(condition).exists)
  end
```

#### SQL

上記のscopeは以下のSQLを発行する。

```
SELECT "reservations".* 
FROM "reservations" 
WHERE (EXISTS (
	SELECT FROM "stored_reservations" 
	WHERE "reservations"."id" = "stored_reservations"."id")
)
```

#### 原因

EXISTS内のSELECT後にFROMが来る場合にSyntaxエラーとなる。
PostgreSQLのバージョンが9.2の場合にエラーとなる。

#### 解決策

scopeの記述を以下のように変更する。

```
  scope :exists_in_stored, -> do
    arel_stored_reservations = Stored::Reservation.arel_table

    condition = reservations[:id].eq(arel_stored_reservations[:id])
    where(Stored::Reservation.where(condition).exists)
  end
```

すると、SQLは以下のようになる。

```
SELECT "reservations".* 
FROM "reservations" 
WHERE (EXISTS (
	SELECT "stored_reservations".* FROM "stored_reservations" 
	WHERE "reservations"."id" = "stored_reservations"."id")
)
```

これならPostgreSQL9.2でもエラーにならない。

ちなみにwerckerでPostgreSQLのバージョンを指定するには、wercker.ymlで以下のように記述する。

#### wercker.yml

```
box: wercker/rvm
no-response-timeout: 10

services:
    # 使用できるserviceを検索するには以下を参照
    # https://app.wercker.com/#explore/boxes/search/ 
    #- wercker/postgresql
    #- wercker/postgresql@0.0.4
    - wercker/postgresql9.2@0.0.7
    #- bolek-kurowski/postgresql9.3@0.0.8
    #- userminddeployer/postgresql9.3@0.0.7-usermind-9.3-1
    #- userminddeployer/postgresql9.4@0.0.7-usermind-9.4-3

    #- wercker/redis@1.0.1
    - wercker/redis
build:
    steps:
      - rvm-use:
```
windows + gulp 環境で sassをコンパイル ⇒ 日本語が文字化け

gulpでsassをコンパイルしていて、ふと気が付くと font-family の日本語部分が文字化けしている。
どうやらWindows環境でRuby製のツールを使おうとすると、デフォルトエンコーディングがUTF-8じゃないため、文字化けしてしまうらしい。

ターミナルでコンパイルのコマンドを入力するときは、

```
set RUBYOPT=-EUTF-8
```

と打ってからコンパイルすればよいらしい。

【参考】
* [SASSファイルをWindowsコマンドプロンプトから文字化けさせずにコンパイルする方法](http://increment-log.com/sass-character-code/)
* [WindowsでEncoding.default_externalをUTF-8にするには](http://sugamasao.hatenablog.com/entry/2013/08/24/224521)


だけど gulpからコンパイルしている場合はどう設定してやればよいものやら。。
途方に暮れていたら見つけた！
システム環境設定から指定すればOK！

「ユーザの環境変数」でも「システム環境変数」でもどちらでOK。

```
変数名：　RUBYOPT
変数値：　-EUTF-8
```

いけた！いけた！
文字化け解消されました。


以下のサイトの記事を見つけ、助けられました。感謝。
[SASSでCOMPASSのWINDOWS -31Jエラーが出たときの対応（RUBY 2.0向けかも）](http://sssssn.com/archives/28)
画面の外にあるかどうかを取得する【Unity】

##OnWillRenderObject
- 画面内に描画されている間ずっと呼び出される
- SceneView内にあっても呼び出される

##OnBecameInvisible
- 画面内に入った瞬間呼び出される
- SceneView内にあっても呼び出される

##OnBecameVisible
- 画面外に出た瞬間呼び出される
- SceneView内にあっても呼び出される

いずれもSceneView内にあっても呼び出されるので、ちょっと使い勝手がよろしくないです。
コリジョンを使うのがいいのかなとも思ったりしています。
CakePHPを使ってみる


# 環境

* Ubuntu
* 参考: http://book.cakephp.org/2.0/ja/getting-started.html#id2

# インストール

* https://github.com/cakephp/cakephp/tags
* GitHub: git://github.com/cakephp/cakephp.git

DocumentRoot内でこうなるように配置する

```
/path_to_document_root
    /app
    /lib
    /plugins
    /vendors
    .htaccess
    index.php
    README
```

`app/tmp` にapacheのパーミッションを設定する必要がある。デフォルトだとApacheのユーザー名は `www-data` 。ユーザー名を知りたかったら `<?php echo exec('whoami'); ?>` すればよい。

```
$ chown -R www-data app/tmp
```

これでwebからアクセスしてみて、 `CakePHP: the rapid development php framework` が出れば良い。tmpのパーミッションがおかしいとCache errorみたいなのが出てくる。

# セキュリティ関連の設定

`salt` と `seed` はデフォルトから書き換えておいた方がいいようだ。 `/app/Config/core.php` に設定がある。 `salt`は長いランダム文字列、 `seed` は大きなランダム整数に適当に変えておくべき。

```php
/**
 * A random string used in security hashing methods.
 */
Configure::write('Security.salt', 'pl345e-P45s_7h3*S@l7!');

/**
 * A random numeric string (digits only) used to encrypt/decrypt strings.
 */
Configure::write('Security.cipherSeed', '7485712659625147843639846751');
```

# mod_rewritable

とりあえず動いているように見えるが、まだ赤文字で `URL rewriting is not properly configured on your server.	1) Help me configure it 2) I don't / can't use URL rewriting` という警告が出ていると思う。これはURL rewritingが有効になっていないことを示している。

ApacheのURLリライティングを適切に設定しなければならない。apacheのmvcモデルは、基本はindex.phpに対するパラメータを見てルーティングを行っており、urlリライティングをすることで、 `index.php?q=hoge` のようなURLに `/hoge` でアクセスできるようにしている。

mod_rewrite.so があるディレクトリを確認する。私の環境の場合は、apacheのディレクトリが `/etc/apache2` で、 `/etc/apache2/modules/mod_rewrite.so` というのが存在している。phpアプリケーションが `/var/www/html/hoge/` で動いているとし、以下のように設定を追加する。

```
LoadModule modules/mod_rewrite.so
<Directory /var/www/html/hoge>
	Options FollowSymLinks
	AllowOverride All
</Directory>
```

要するに mod_rewrite のモジュールと、AllowOverrideがAllになっていることが需要なようだ。

これでも動かなかったら、 `.htaccess` といった隠しファイルがちゃんと存在しているかを見ましょう。


# Macの場合

* apacheのディレクトリ: `/etc/apache2`
* htmlディレクトリ: `/Library/WebServer/Documents`


# 感想

Ruby on Rails にかなり近いフレームワークだと思った。次はSymfonyかLaravelを使ってみたい。
MySQLのテーブル定義(Markdown形式)

# 経緯
最近ドキュメント関連をMarkdownで書くようにしていて、テーブル定義書をMarkdownで書けないか試してみました。
ネットで調べてみると、うまいことMarkdownに変換してくれるツールが見つからなかったので、自分でスクリプトを書いてみました。

ソースコード↓
[MySQL_table_define](https://github.com/moichi82/MySQL_table_define)

# なにを出力しているのか？？
- テーブル定義
- インデックス情報

の2つを出力しています。
コマンドとしては

```
# テーブル定義
show full fields from テーブル名

# インデクス情報
show index from テーブル名
```
となります。
それぞれ出力された情報から
必要かなーと思うところを抜き出し
Markdownで出力しています。

# 動作確認済みMySQLバージョン
- MySQL5.6.20
  - おそらく5.6系なら動くと思われます。
  - 5.5など古いバージョンでは動作を確認してません。
  - 古いMySQLで実行した場合、セルがずれて表示される可能性もあります。

# 今後(予定)
information_schemaから、リレーションの情報を取ってきて出せるようにしようと考えてます。
数秒おきに処理を実行する【Unity】

# コルーチンを使用する

AS3のTimerみたいな一定時間おきに処理を実行するものがほしかったんですが、コルーチンがそれっぽかったです。

``` C#
void Start () {
	// コルーチンを設定
	StartCoroutine(loop());
}

private IEnumerator loop() {
	// ループ
	while (true) {
		// 1秒毎にループします
		yield return new WaitForSeconds(1f);
		onTimer();
	}
}

private void onTimer() {
	// 1秒毎に呼ばれます
	Debug.Log("on timer");
}
```
yieldの意味がよくわかりません…
AngularJSのチュートリアルで躓いたE2Eテストの対応


AngularJSのチュートリアルを進めていたのですが、途中E2Eテストのところでエラーになりました。
あまり日本語での対応話がなかったので書きました。

## エラー内容

エラー内容は以下

````
npm verb pkgid angular-phonecat@0.0.0
npm verb cwd /Users/*/angular-phonecat
npm ERR! Darwin 14.3.0
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "protractor"
npm ERR! node v0.12.6
npm ERR! npm  v2.11.2
npm ERR! code ELIFECYCLE
npm ERR! angular-phonecat@0.0.0 protractor: `protractor test/protractor-conf.js`
npm ERR! Exit status 100
npm ERR! 
npm ERR! Failed at the angular-phonecat@0.0.0 protractor script 'protractor test/protractor-conf.js'.
npm ERR! This is most likely a problem with the angular-phonecat package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     protractor test/protractor-conf.js
npm ERR! You can get their info via:
npm ERR!     npm owner ls angular-phonecat
npm ERR! There is likely additional logging output above.
npm verb exit [ 1, true ]

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/*/angular-phonecat/npm-debug.log
````

## 対応

色々探してみるとどうもchromeDriverの指定がなっていないんじゃないかと指摘が。
とりあえずやってみたのは以下の様な感じ。

- chromeDriverの取得
- protractor-conf.jsでchromeDriverのパス指定
- protractor-conf.jsにdirectConnect: trueを追加

### chromeDriverの取得
以下のコマンドを実行

````
npm install chromedriver --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
````

### protractor-config.jsでchromeDriverのパス指定
/angular-phonecat/test/protractor-conf.jsに以下を追加

````protractor-conf.js
chromeDriver: '../node_modules/chromedriver/bin/chromedriver',
````

### protractor-conf.jsにdirectConnect: trueを追加
/angular-phonecat/test/protractor-conf.jsに以下を追加

````protractor-conf.js
directConnect: true,
````

以上で、````npm run protractor````を実行すれば動くはずです。
動かす際には、ターミナルの別タブ及び別ウィンドウで````npm start````してから実行して下さい。

## 参考URL
https://github.com/angular/protractor/issues/1495
zsh5.0.8に存在するローカル変数のパーサバグ

# 概要

zsh5.0.8には `local a=()` を **`a=`という関数** だとパースしてしまうバグがあります。後ろに続くリテラル次第でセグフォを起こします。

※ メーリングリストでバグ報告済みです。

# バグ再現方法

以下のファイルを作成します。

```zsh:funcs.zsh
func1() {
    a=( )
    b=false
    echo "a in func1 length: ${#a[@]}"
}
func2() {
    local a=( )
    local b=false
    echo "a in func2 length: ${#a[@]}"
}
func3() {
    a=()
    b=false
    echo "a in func3 length: ${#a[@]}"
}
func4() {
    local a=()
    local b=false
    echo "a in func4 length: ${#a[@]}"
}
```

検証するときは`zsh`セッション内であっても`zsh`を新たに起動してください。最後にセグフォで死んだときのエラーメッセージが見れるようになるからです。

```shell-session:検証
example@local:~$ zsh
example@local:~$ zsh --version
zsh 5.0.8 (x86_64-apple-darwin14.3.0)
example@local:~$ source funcs.zsh
example@local:~$ func1
a in func1 length: 0
example@local:~$ func2
func2:1: unknown file attribute:
example@local:~$ func3
a in func3 length: 0
example@local:~$ func4
a in func4 length: 0
[1]    35208 segmentation fault  zsh
```

func4が落ちるならfunc2のようにスペース開ければ回避出来ないかなぁと考えたのですが、これはこれでダメみたいですね。

**後から気づいたので追記します。どうやら空配列かどうかに限らず、`local`をつけて配列を宣言すること自体が出来ない模様です。**

# バグ回避方法

宣言と代入を別にすることで回避出来るようです。

```zsh
local a
a=()
```

# 関連するツイート

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">zshのバグ見つけたかもしれない</p>&mdash; 院死 (@mpyw) <a href="https://twitter.com/mpyw/status/620135001510707200">2015, 7月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">zsh 5.0.8 (x86_64-apple-darwin14.3.0) でこの関数セグフォします&#10;whichで確認すると内部で「a=」っていう関数が作られているのが分かります <a href="http://t.co/Hqmk2HM6Z1">pic.twitter.com/Hqmk2HM6Z1</a></p>&mdash; 院死 (@mpyw) <a href="https://twitter.com/mpyw/status/620142225197023232">2015, 7月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">local a=() &#10;&#10;localと空配列の初期化がかぶると関数になっちゃうみたいですね <a href="http://t.co/A2ame8WxpF">pic.twitter.com/A2ame8WxpF</a></p>&mdash; 院死 (@mpyw) <a href="https://twitter.com/mpyw/status/620144740692930562">2015, 7月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

環境によってはセグフォまではいかないみたいです。

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/mpyw">@mpyw</a> バグっぽいけどうちの環境だとセグフォはしなかった <a href="http://t.co/tV5Mqu1rBp">pic.twitter.com/tV5Mqu1rBp</a></p>&mdash; れに (@rhe__) <a href="https://twitter.com/rhe__/status/620143053769064448">2015, 7月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/mpyw">@mpyw</a> local なしの a=() ls だと a っていう空配列と ls の実行になるけど、local つけると local &#39;a=&#39;() { ls } とパースされちゃうっぽい....？せぐふぉするのは謎</p>&mdash; れに (@rhe__) <a href="https://twitter.com/rhe__/status/620146460512747520">2015, 7月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Swiftで「エラトステネスの篩」を書いた

[エラトステネスの篩 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)

学習を兼ねて書きました。

- 準備

計測には、下記記事のBenchmarkクラスをそのまま使います。
[Swiftで重い処理の処理時間を測定する - Qiita](http://qiita.com/tady/items/40d7c4feecda337cf271)

```swift
extension Array {   
    func reject(excludeElement: (T) -> Bool) -> [T] {
        return filter { !excludeElement($0) }
    }
}
```

- 実装

```swift:prime1
func prime1(n: Int) -> [Int] {
    var ns = Array(2...n)
    let upper = Int(sqrt(Double(n))) // maxの平方根
    return reduce((2...upper), ns) { (r: [Int], n: Int) -> [Int] in
        return r.reject {
            ($0 % n == 0) && $0 > n
        }
    }
}
```

```swift:prime1計測
Benchmark.measure("prime1") {
    prime1(200) // 0.971(s)
}
```

Swiftでも副作用を排除する関数型のアプローチで書ける！

只、`prime1`の実装だとUshio@githubさんがご指摘をしてくださった通り、問題点があります。

- 4（2の時点で落とされていたはずのもの）が計算されている
- 剰余が発生している

そこで、素直に副作用を許容して書いたのが下記です。

```swift:prime2
func prime2(n: Int) -> [Int] {
    var ns = Array(2...n)
    let upper = Int(sqrt(Double(n)))
    for i in 2...upper {
        let index = i - 2
        if ns[index] != 0 {
            for var j = index + i; j < ns.count; j += i {
                ns[j] = 0
            }
        }
    }
    return ns.filter { x in x != 0 }
}
```

```swift:prime2計測
Benchmark.measure("prime2") {
    prime2(200) // 0.190(s)
}
```

ベンチマークを取ってみると、`prime1`に比べて`prime2`の方が5倍近く早くなってますね!

### まとめ
アルゴリズムの特性や性質を理解して、
素直に手続き型のアプローチで書いた方が可読性も高いし、速度も出るのなら
そちらを使うべしだし、適材適所だなと感じました。
LaravelでPhpunitをステップ実行するシンプルな方法


#概要

Laravel4.2で、ユニットテストをステップ実行する方法です。
既にxdebugを利用して、ブラウザでのステップ実行を行っている人は、phpunitをブラウザで実行すれば、すぐにphpunitのステップ実行ができます。phpunitをブラウザで実行する方法を紹介します。

#対象
・ブラウザでxdebugからステップ実行の設定がすでにできている人
・ごくたまに、phpunitをステップ実行してソースやライブラリの動きを確認したい人

#手順

PHPUnitを実行するルートを追加して、ブラウザから通常通りxdebugでデバッグできます。

```
//route.phpにphpunit実行用のルートを作成
Route::get("phpunit", function(){
	//通常コマンドラインで渡す以下のようなパラメタを、配列に入れます。
	// phpunit -c phpunit.xml --filter testMyUnitTest app/tests/MyUnitTest
	// ファイルは、route.phpからのパスになるので、必要に応じて変更してください。
	$argv = array(
		"-c",
		"../phpunit.xml",
		"--filter",
		//ステップ実行したいテスト名
		"testMyUnitTest",
		//ステップ実行したいテストのあるファイル
        __DIR__."/tests/MyUnitTest.php"
		);
		
	$_SERVER['argv'] = $argv;
	$command = new PHPUnit_TextUI_Command();
	$ret = $command->run($argv, false);
});
```
Java List の比較

Java Doc みたら分かるんですが振る舞い見たほうがパッと思い出しやすいのでしょぼいですがメモ。

```Main.java

import org.apache.commons.collections.ListUtils;

public class Main {
    public static void main(String[] args) {
        List<String> sourceList = Arrays.asList(
            new String[]{"a", "b", "1", "c", "2", "d"});
        List<String> targetList = Arrays.asList(
            new String[]{"1", "2", "3"});

        ListUtils.intersection(sourceList, targetList)
            .stream()
            .forEach(l -> System.out.println("intersection : " + l));

        ListUtils.subtract(sourceList, targetList)
            .stream()
            .forEach(l -> System.out.println("subtract : " + l));

        ListUtils.sum(sourceList, targetList)
            .stream()
            .forEach(l -> System.out.println("sum : " + l));

        ListUtils.union(sourceList, targetList)
            .stream()
            .forEach(l -> System.out.println("union : " + l));

    }
}
```

```実行結果
List<String> sourceList = Arrays.asList(new String[]{"a", "b", "1", "c", "2", "d"});
List<String> targetList = Arrays.asList(new String[]{"1", "2", "3"});

元リストと対象リストを比較して対象リストにある要素を返す
intersection : 1
intersection : 2

元リストから対象リストを差し引いた要素を返す
subtract : a
subtract : b
subtract : c
subtract : d

２つのリストで重複する要素を Distinct して結合（順番はリストの要素順）
sum : a
sum : b
sum : c
sum : d
sum : 1
sum : 2
sum : 3

２つのリストの順番を維持して結合
union : a
union : b
union : 1
union : c
union : 2
union : d
union : 1
union : 2
union : 3
```