OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】if文にアラートを出そうとするとクラッシュ…UIAlertViewでの暫定回避方法。

#if文内にUIAlertControllerを書くと落ちる！
とあるソフトを書いていて、パスワードチェックのif文を作成していた。
要は、パスワードが一致していなければelseで
「あんさん、パスワード違ゃいまっせ！」とアラートを出して、次画面へのセグエにつながらないようにしたかったのだ。

Objective-Cで同じようなことをやってきたのに…

Swiftだと何故か
<b>ク　ラ　ッ　シ　ュ　す　る</b>
※私だけでしたら、ご指摘くだされば幸いです。

なぜダメなのか全然わからなくて、3日間くらいネットを探ってやっと見つけた<a href="http://qiita.com/takabosoft/items/162b6d90e00b79a7e328" target="_blank">takabosoftさんのこの記事</a>。
・表示元のUIViewControllerのインスタンスが必要になった
・二重でアラートを表示させる事ができなくなった
（takabosoftさん、ありがとうございます！）
とのことだけれど

今の私には、まだむずかしくてよくわからない…。
（もう少し経験を積めばわかるのだろうが…
　このままだとLv.1なのに松明も持たずに洞窟に入るようなものだ！）
なぜシンプルな方法がないのか。

と思っていたところ…<b>SwiftでのUIAlertViewの出し方を書いてくださっている記事発見。</b>

#シンプルなUIAlertView(Swift)　サンプル
<a href="http://qiita.com/Night___/items/f2877236a4182c566eed" target="_blank">Night___さんのこの記事＆takabosoftさんの補足</a>に助けられた！
takabosoftさんがリンク先記事に書いていらしたコードを引用しておく。
<div class="code-frame" data-lang="she'll">
<div class="highlight"><pre>
let alert = UIAlertView()
alert.title = "Title"
alert.message = "My message"
alert.addButtonWithTitle("Ok")
alert.show()
</pre></div>
</div>

こ　ん　な　シ　ン　プ　ル　な　こ　と　で　よ　か　っ　た　の　か　！　！
これならif文の中に書いても落ちなかった。

今後UIAlertViewが非推奨になっていくのは理解っているが、
ここで躓いたままだと、ソフトが完成しないのだ。
次善の策で今は前に進み、後日UIAlertControllerにて実装しなおしたいと思う。

…takabosoftさんとNight＿＿さんに改めて感謝。
Node.jsのパッケージを公開する


## npmのアカウントを作る

以下のサイトからsignupする。

https://www.npmjs.com/

## `npm add-user`する

このコマンドを実行すると、`~/.npmrc`にトークンとかが保存される。

```bash
$ npm add-user
Username: toshiyukihina
Password:
Email: (this IS public) toshiyuki.hina@gmail.com
```

## `package.json`にprivateを設定する

`package.json`に`private: false`を設定しないと公開できない。

```json:package.json
{
  ... (snip) ...

  "private": false,
  
  ... (snip) ...

}
```

## Publishする

```bash
$ npm publish
+ hello-node-module@0.0.1
```

## Publishできたか確認してみる

```bash
$ npm search hello-node-module
NAME              DESCRIPTION        AUTHOR         DATE       VERSION KEYWORDS
hello-node-module Hello node package =toshiyukihina 2015-01-18 0.0.1   hello package
```
node.jsのパッケージをつくる


substack氏の[js-traverse](https://github.com/substack/js-traverse)を参考にした。

## モジュール仕様

コンストラクタに渡したロケールに従いあいさつを返す。
使い方は以下みたいな感じ。

```javascript
var hello = require('hello');
	
hello('ja').say();  // => 'こんにちわ！'
hello('en').say();  // => 'Hello!'
hello('???').say(); // => 'Hello!'
hello().say();      // => 'Hello!'
```

* `ja`を渡すと日本語で、`en`を渡すと英語であいさつを返す。
* 不明なロケールを渡した場合は、英語であいさつ。


## package.jsonの生成

まずは雑に`package.json`を作る。

```bash
$ npm init
```

出来上がった`package.json`は、こんな感じ。

```json:package.json
{
  "name": "hello-node-package",
  "version": "0.0.1",
  "description": "Hello node package",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "thina",
  "license": "MIT"
}
```

## 実装

パッケージのルートディレクトリに、`index.js`というファイル名で保存。

```javascript:index.js
module.exports = function(locale) {
  return new Hello(locale);
};

function Hello(locale) {
  this.locale = locale;
}

Hello.prototype.say = function() {
  var greeting = '';

  switch (this.locale) {
  case 'ja':
    greeting = 'こんにちわ！';
    break;
  case 'en': // fall through
  default:
    greeting = 'Hello!';
    break;
  }

  return greeting;
};
```

## 動かしてみる

パッケージのルートディレクトリでnodeを起動する。

```bash
 node
> var hello = require('./')
undefined
> hello('ja').say()
'こんにちわ！'
> hello('en').say()
'Hello!'
> hello('???').say()
'Hello!'
> hello().say()
'Hello!'
```

## テストする

[tape](https://github.com/substack/tape)を使う。

```bash
$ npm install tape --save-dev
```

テストは、`test`ディレクトリの下に作る。

```bash
$ mkdir test
$ touch test/hello.js
```

テストコードは以下。

```javascript:hello.js
var hello = require('../');
var test = require('tape');

test('say', function(t) {
  var en = hello('en').say();
  t.equal(en, 'Hello!');

  var ja = hello('ja').say();
  t.equal(ja, 'こんにちわ！');

  var unknown = hello('unknown').say();
  t.equal(en, unknown);

  var undef = hello().say();
  t.equal(en, undef);

  t.end();
});
```

`package.json`に`test command`を定義する。

```json:package.json
{
   ... (snip) ...

  "scripts": {
    "test": "tape test/*.js"
  },

   ... (snip) ...

}
```

テストを実行してみる。

```bash
$ npm test

> hello-node-package@0.0.1 test /Users/hina/devel/github/hello-node-package
> tape test/*.js

TAP version 13
# say
ok 1 should be equal
ok 2 should be equal
ok 3 should be equal
ok 4 should be equal

1..4
# tests 4
# pass  4

# ok
```

## Download

https://github.com/toshiyukihina/hello-node-module.git
node.jsでrequestを使ってeuc-jpのサイトをスクレイピング時に注意する事


node.jsでeuc-jpのサイトをスクレイピングしようとしたらハマった。
文字コードを指定して変換したつもりだけど、文字化けしまくってた。

ダメな例

```javascript
var request = require('request');
var Iconv = require('iconv').Iconv;
var fs = require('fs');
request('http://hoge.jp', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE');
    body = iconv.convert(body).toString();
    fs.writeFile('hoge.txt', body);
  }
});

```

良い例

```javascript
var request = require('request');
var Iconv = require('iconv').Iconv;
var fs = require('fs');
request({url: 'http://hoge.jp', encoding: null }, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE');
    body = iconv.convert(body).toString();
    fs.writeFile('hoge.txt', body);
  }
});

```

文字コードを明確に`null`を指定しないと、`request`のモジュール内で勝手に`body.toString()`とよしなに変換してくれようとするのです！

https://github.com/request/request/blob/5d515b04331b445144e625d9abc6e74b5a72722f/request.js#L1248-L1254

この辺。

ってか、参考サイトそのままコピペしたようなコードになっておる。。。

地味にハマりました。。。（泣）


## thanks

- http://niwaringo.tumblr.com/post/22655946819/euc-node-js-request
- http://blog.craftgear.net/4fa4f175aa1d381e04000004/title/2012%E5%B9%B4%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0
Android Studioでアプリ公開用KeyStoreを作成して本番ビルドする

今までコマンドで作ってましたが、最初にアプリリリースする時なんかはちょっと戸惑うかもしれません。Android StudioでGUIでできないかなと思ったらできました。

#`Build > Generate Signed APK...`をクリック

![Build_と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/15267/57c1d788-adc0-b38e-f337-1200f0efc6a4.png "Build_と_Menubar.png")

#Moduleを選択してNextをクリック

![Generate_Signed_APK_Wizard.png](https://qiita-image-store.s3.amazonaws.com/0/15267/13fa2271-36c3-0aa1-8b16-ea0e2881cba1.png "Generate_Signed_APK_Wizard.png")

#Create Newをクリック
KeyStoreを新規作成するために`Create New`をクリックします。

![Generate_Signed_APK_Wizard.png](https://qiita-image-store.s3.amazonaws.com/0/15267/c1d4bf70-3598-e959-1828-3bf5b4a5d23c.png "Generate_Signed_APK_Wizard.png")

#KeyStoreの情報を入力

ここはコマンドで作成する時と同じです。

![New_Key_Store.png](https://qiita-image-store.s3.amazonaws.com/0/15267/bfdfc789-c9d1-e35f-d7ef-6b09507bfaa8.png "New_Key_Store.png")

作成してOKをクリックすると、Key store pathが入力された状態になるので、PasswordやAliasを入力してNextをクリックします。

# BuildTypeを選択してFinishをクリック

作成先のディレクトリを指定してFinishをクリックします。

![Generate_Signed_APK_Wizard.png](https://qiita-image-store.s3.amazonaws.com/0/15267/d83d02a0-c85d-be1c-01b3-15811cdb37b2.png "Generate_Signed_APK_Wizard.png")

しばらく待つと、apkが作成されます。
Twitter フォローのアイコンURLのハッシュ一覧を取得

```php
<?php

define('ACCOUNT_ARZZUP', 0);
define('ACCOUNT_TEST', 1);
define('ACCOUNT', ACCOUNT_TEST);
require_once('./vendor/autoload.php');
require_once('./keys.php');

$to = new TwistOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);

$hashes = get_friends_profile_image_hashes();
echo implode("\n", $hashes);

function get_friends_profile_image_hashes($screen_name = NULL) {
    $hashes = array();
    foreach (get_friends_profile_image($screen_name) as $url) {
        if (preg_match('#profile_images/\d+/(?<hash>.*)_normal#', $url, $m)) {
            $hashes[] = $m['hash'];
        } else {
            echo 'no-hits -> ' . $url . PHP_EOL;
         }
    }
    return $hashes;
}

function get_friends_profile_image($screen_name = NULL) {
    global $to;
    $param = array(
        'count' => 5000,
    );
    $res = $to->get('friends/ids', $param);
    if (isset($res->errors)) {
        var_dump($res->errors);
        return;
    }
    $urls = array();
    foreach (array_chunk($res->ids, 100) as $ids) {
        $ids_str = implode(',', $ids);
        $res = $to->get('users/lookup', array(
            'user_id' => $ids_str,
        ));
        if (isset($res->errors)) {
            var_dump($res->errors);
            return;
        }
        foreach ($res as $user) {
            $urls[] = $user->profile_image_url;
        }
    }
    return $urls;
}

```

```php:keys.php
<?php
switch (ACCOUNT) {
case ACCOUNT_TEST:
    define('CONSUMER_KEY'       , '********');
    define('CONSUMER_SECRET'    , '********');
    define('OAUTH_TOKEN'        , '********');
    define('OAUTH_TOKEN_SECRET' , '********');
    break;
case ACCOUNT_ARZZUP:
    define('CONSUMER_KEY'       , '********');
    define('CONSUMER_SECRET'    , '********');
    define('OAUTH_TOKEN'        , '********');
    define('OAUTH_TOKEN_SECRET' , '********');
    break;
default:
    break;
}

```

TwistOAuth という TwitterAPI ラッパーを使う

* フォロー一覧の取得('friends/ids')
* ユーザ情報の取得('ids/lookup')
* urlからハッシュの取得

の流れ
SublimeTextの複数行選択その他便利なショートカット

##<行関連>

####行削除 
※一番使用用途が多い

削除したい行にカーソルを置いた状態で
> Control(Ctrl) + Shift + K

####行の入れ替え

入れ替えたい行にカーソルを置いた状態で

> Control + Command + ↑　または　↓

####行コピー

コピーしたい行にカーソルを置いた状態で
> Command(Ctrl) + C

####行コピーを作成＋下の行に貼り付け

コピーしたい行にカーソルを置いた状態で
> Command(Ctrl) + Shift + D

##<複数選択関連>

####変更したい対象の単語にカーソルを合わせる
> Cmd + D

####一部の単語をスキップ

>Cmd + K、Cmd + D

####同じ単語を全て選択

>Cmd + Ctrl+G
three.jsでr70になったらテクスチャマッピングが動かなくなった #solved

# 原因

```
new THREE.UVMapping()
```

r70以前は、THREE.UVMappingをnewしてインスタンス化出来たが、
r70から廃止された。

## r70以前はOKなコード
 
```
texture = new THREE.Texture(canvasScaled, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping);
```


# 解決方法

THREE.UVMappingという定数を使う。

## r70で動くコード

```
texture = new THREE.Texture(canvasScaled, THREE.UVMapping, THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping);
```

# さらに

r70以前からかもだが、以下のように指定しないと2のn乗のサイズと
なっていないテクスチャは警告を受けるようになった。


```js
texture.minFilter=THREE.LinearFilter;
texture.magFilter=THREE.LinearFilter;
```

# 関連投稿

- [THREE.CubeTextureLoaderでSkyboxする - Qiita](https://qiita.com/kjunichi/items/2d49da9e1b39af3a57aa)

# 関連記事

- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](http://abrakatabura.hatenablog.com/entry/2016/01/09/134348)
- [Windows10のBlenderをアップデートしたらThree.jsのアドオンが無くなったが、見つけた](http://abrakatabura.hatenablog.com/entry/2017/12/10/231431)
- [Three.jsでexamplesの高級車たちをblenderにExportしたが残念な結果に](http://abrakatabura.hatenablog.com/entry/2017/12/16/223318)
- [gopherくんのjsonデータがthree.jsのr85以降表示されなくてはまったjsonデータがthree.jsのr85以降表示されなくてはまった](http://abrakatabura.hatenablog.com/entry/2017/12/19/222952)
Twitter の初期タマゴアイコン画像一覧

```php
<?php
function is_image($url) {
    return !!@exif_imagetype($url);
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<?php for ($i=0; is_image($url = "http://abs.twimg.com/sticky/default_profile_images/default_profile_{$i}_normal.png"); $i++) { ?>
<img src="<?= $url ?>" alt="">
<?php } ?>
</body>
</html>
```

![範囲を選択_008.png](https://qiita-image-store.s3.amazonaws.com/0/40717/704cd3a9-3cfa-d142-7cf9-09d687011c55.png)

ここから取れる見たいだったので
http://abs.twimg.com/sticky/default_profile_images/default_profile_0_normal.png


7つしかなかったのね
現在位置の取得の確認アラートがすぐ消えてしまうところでハマった

##iOS8からの現在位置利用の際のアラート

iOS8からCoreLocationで位置情報を取得する方法が変わりました。
詳しくは以下を参照
[iOS 8から位置情報を取得する方法が変わるよ](http://qiita.com/koogawa/items/6ec24ca3201977e9642b)

##確認のアラートを出すとすぐ消える！
そこでサンプルコードを参考に実装したのですが、位置情報の取得の確認アラートを出した瞬間にアラートが消えてしまう問題が発生し、ハマりました。以下が問題のコードです。

```objc:sampleViewController.m
    CLLocationManager　*locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    
    // 認証ステータスを確認し、必要なら認証リクエストを出す
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (status == kCLAuthorizationStatusNotDetermined) {
        [locationManager requestAlwaysAuthorization];
    }
    else if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
        [locationManager startUpdatingLocation];
    }
  
    // 緯度経度を取得
    double lati = locationManager.location.coordinate.latitude;
    double longi = locationManager.location.coordinate.longitude;
    NSLog(@"Latitude = %f", lati);
    NSLog(@"Longitude = %f", longi);
```

このコードで認証リクエストを出すと、確認アラートは出るのですが、ボタンをタップする間もなく消えます。

##原因
原因は、CLLocationManagerをローカルで宣言していることでした。今回の実装では、現在位置の情報が手に入りさえすればもうCLLocationManagerは不要なので、プロパティで宣言する必要がないと判断し、ローカルで宣言したのですが、それが誤りでした。

CLLocationManagerを宣言しているメソッドがreturnすると、CLLocationManagerの変数がスタック領域から削除され、ヒープ領域からCLLocationManagerが解放されてしまいます。すると認証リクエストのアラートまで破棄されてしまったようです。

UIAlertControllerでは、ローカルで宣言して表示させてもアラートが消えることはありません。このイメージがあったため、今回ハマることになりました。

ですので、CLLocationManagerをローカルで宣言せず、プロパティ等でメソッドが終了しても解放されない位置で宣言する必要があります。念のため、修正後のコードをおいておきます。


```objc:sampleViewController.h
@property (strong, nonatomic) CLLocationManager *locationManager;
```
```objc:sampleViewController.m
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    
    // 認証ステータスを確認し、必要なら認証リクエストを出す
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (status == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestAlwaysAuthorization];
    }
    else if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
        [self.locationManager startUpdatingLocation];
    }
  
    // 緯度経度を取得
    double lati = self.locationManager.location.coordinate.latitude;
    double longi = self.locationManager.location.coordinate.longitude;
    NSLog(@"Latitude = %f", lati);
    NSLog(@"Longitude = %f", longi);
```
Boot Camp Assistant.app で 32bit Windows の Bootable USB をつくる


新しめの Apple 筐体と OSX の組み合わせでは、Windows の Bootable USB を作成できない。
少しハックすることで作成できるので方法を記す。

## 環境

![about_this_mac.png](https://qiita-image-store.s3.amazonaws.com/0/14521/86bcde7f-8142-9385-f516-e20f4c921a2d.png "about_this_mac.png")

## 注意点

Bootable USB をつくれない == 32bit に対応していない筐体なので、このハックで作ることはできてもインストールはできない。
自作 PC などのために 32bit Windows の Bootable USB を Mac で作りたいという状況の時に利用する。

## 手順

### 筐体の Model Identifier を調べる

Menubar から次の手順をたどり、Model Identifier を確認する。
この場合は MacbookPro11,1 となる。

*Apple > About This Mac > System Report > Hardware Overview*

![system_information.png](https://qiita-image-store.s3.amazonaws.com/0/14521/00461199-3703-e82c-d853-21beda594555.png "system_information.png")


### Boot Camp Assistant.app の設定を変える

まずバックアップをとる。

```bash
$ sudo cp /Applications/Utilities/Boot\ Camp\ Assistant.app/Contents/info.plist{,.bak}
```

設定ファイルを開く。

```bash
$ sudo vi /Applications/Utilities/Boot\ Camp\ Assistant.app/Contents/info.plist
```

先頭の方に `32BitSupportedModels` のキーがあるので、要素一覧の先頭に先ほど調べた Model Identifier を追加する。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>32BitSupportedModels</key>
    <array>
        <string>MacBookPro11,1</string>                                                                                                           
        <string>MacBook7,1</string>
        <string>MacBookAir5,2</string>
        <string>MacBookPro10,1</string>
        <string>MacPro5,1</string>
        <string>Macmini5,3</string>
        <string>iMac12,2</string>
    </array>

```

### codesign をアップデートする

書き換えただけでは Boot Camp Assistant.app が起動できないので codesign を変更する。

```bash
$ sudo codesign -fs - /Applications/Utilities/Boot\ Camp\ Assistant.app/Contents/info.plist
$ sudo codesign -fs - /Applications/Utilities/Boot\ Camp\ Assistant.app
```

### USB をつくる

![Screen Shot 2015-01-18 at 11.00.38 AM.png](https://qiita-image-store.s3.amazonaws.com/0/14521/6b071dc2-65ab-a4c0-07dc-8cc98480fbe3.png "Screen Shot 2015-01-18 at 11.00.38 AM.png")
フォントRictyが使いたい


installメモ。ついでに、パッケージマネージャーHomebrew使いたい（Macを新しく購入して入れてなかった）。xcodeは入手済み。

##1).Command Line Toolsインストール
以下を叩くとウィンドウが立ち上がるので、インストールを選択

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

##2).Homebrewインストール

http://brew.sh/index_ja.html
以下のコマンドでインストール

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
/usr/local/share/man/man1/brew.1

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/mkdir /usr/local
Password:
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local
==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects: 225791, done.
remote: Compressing objects: 100% (59365/59365), done.
remote: Total 225791 (delta 165214), reused 225738 (delta 165178)
Receiving objects: 100% (225791/225791), 51.65 MiB | 236.00 KiB/s, done.
Resolving deltas: 100% (165214/165214), done.
From https://github.com/Homebrew/homebrew
 * [new branch]      master     -> origin/master
HEAD is now at 53c9c02 texapp 0.6.9
==> Installation successful!
==> Next steps
Run `brew doctor` before you install anything
Run `brew help` to get started
```

上記結果の指示通り叩く

```
$ brew doctor
Your system is ready to brew.
```

##3).Rictyインストール

http://te2u.hatenablog.jp/entry/2014/07/14/211918
こちらを参考にインストール

```
$ brew tap sanemat/font
$ brew install ricty
```

上記コマンドの最後に次の作業が表示されるので、叩く

```
$ cp -f /usr/local/Cellar/ricty/3.2.4/share/fonts/Ricty*.ttf ~/Library/Fonts/
$ fc-cache -vf
```

ターミナルのfontに設定してイイ感じ。
Mac OS XのBashのモノクロ表示とプロンプトをなんとかする

Mac OS Xでは、~/.bash_profileがデフォルトで存在しない。
やたらと素っ気ないターミナルになっているのでなんとかする。

```
export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "
export CLICOLOR=1
export LSCOLORS=ExFxBxDxCxegedabagacad
alias ls='ls -GFh'
```
packerをつかってGCEでイメージを作るときの注意点


# インスタンス名に変数uuidを使用は避けたほうがよい

buildersのinstance_nameのデフォルトは`packer-{{uuid}}`と記載されていますが、明示的に`packer-{{uuid}}`を指定するとディスクからイメージを作成する際に失敗してしまう。

uuidが再度生成されてしまい、ディスクがみつけられないようでした。

# 参考

* [Google Compute Builder - Packer by HashiCorp](https://www.packer.io/docs/builders/googlecompute.html)
2015-01-18 ImageMagick > 画像ファイルの情報を見る > identify test.bmp

画像ファイルを持っているが、その情報(size、depthなど)を調べるにはImageMagickというツールにある`identify`コマンドを使う。

    $ identify test.bmp
と実行すると

    test.bmp BMP 320x240 320x240+0+0 1-bit sRGB 2c 9.73KB 0.000u 0:00.000

のように表示される。これでsize: 320x240, depth:1-bit などの情報がわかる。


さらに詳細な情報を知りたい場合は

    $ identify -verbose test.bmp
と実行すると、以下のような内容が表示される。

    Image: test.bmp
    Format: BMP (Microsoft Windows bitmap image)
    Class: PseudoClass
    Geometry: 320x240+0+0
    Units: PixelsPerCentimeter
    Type: Bilevel
    Base type: Bilevel
    Endianess: Undefined
    Colorspace: Gray
    Depth: 1-bit
    Channel depth:
      gray: 1-bit
    (以下略)

Link: [ImageMagick Identify Command-Line Tool](http://www.imagemagick.org/script/identify.php)
プログラマになること#7


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

##自身についての記述
大学では地理学を学ぶ。Fortlan、Basicを仕方なくやる。
バブリーな頃にメーカー系のソフト会社に就職。当然、汎用機、COBOL
大企業病と汎用機に嫌気が差して、退職
都市デザイン、物的デザインと転職した後、F系の会社に就職。
色々あって、独立開業する。フリーSEです。
縁あって、専門学校の講師になる。既に8年経ちました。

##コンピュータって何？
よく出来たそろばんです。只の計算機なんです。
INPUT,OUTPUTなのです。単純ですよ。

##絶対価値なぞ多分無い
残念ながら、この世に絶対価値はほとんどありません。
もしあるとしたら、数学と物理の世界。
しかし、それすらも危ういものです。
N進数、複素数、こんなもん概念です。
メソッドとしての数学は必要ですが、世界のほとんどは「相対」で成り立っています。

##哲学
是非学んで下さい。古典哲学まででいいです。
そして、いかに無力かを噛み締めて後に、できることをやりましょう。
Samsung Gear での各種センサーについてのメモ


## はじめに

* Sumsung Gear で使えるセンサーについて確認し、いくつかのセンサーを試してみましたので、そのメモです。

## Gear S/2 での対応状況と対応API

注意: HTML5 はブラウザによって対応状況が違う思われます。

| センサー        | Gear S | Gear 2 | HTML5                 | Samsung Extension / Interface |
|:---------------|:------:|:------:|:----------------------|:----------|
| 加速度センサー   | ○      | ○      | DeviceMotionEvent      | |
| ジャイロセンサー | ○      | ○      | DeviceOrientationEvent | |
| 近接センサー     | ○      | ○      | DeviceProximityEvent | Sensor API / ProximitySensor   |
| UVセンサー      | ○      | ×      | | Sensor API / UltravioletSensor |
| 気圧計センサー   | ○      | ×      | | Sensor API / PressureSensor    |
| 地磁気センサー   | ○      | ×      | | Sensor API / MagneticSensor    |
| 照度センサー     | ○      | ×      | DeviceLightEvent | Sensor API / LightSensor       |
| 心拍数センサー   | ○      | ○      | | Motion API / MotionHRMInfo |
| 歩数計          | ○      | ○      | | Motion API / MotionPedometerInfo |
| GPS            | ○      | ○      | Geolocation API | Motion API / MotionGPSInfo |
| ゼスチャー       | ○      | ○      | | Motion API / MotionHandGestureInfo |

## 動作確認

### 照度センサー

```main.js
$(window).load(function(){
	document.addEventListener('tizenhwkey', function(e) {
        if(e.keyName == "back") {
            tizen.application.getCurrentApplication().exit();
        }
    });
	
    var lightSensor = webapis.sensorservice.getDefaultSensor("LIGHT");

    function onGetSuccess(sensorData) {
    	$('#textbox').html(sensorData.lightLevel);
    }

    function lightSensorStart() {
    	lightSensor.getLightSensorData(onGetSuccess);
    }

    lightSensor.start(lightSensorStart);
});
```

### UVセンサー

照度センサーと使い方はほとんど同じですね。

```main.js
$(window).load(function(){
	document.addEventListener('tizenhwkey', function(e) {
        if(e.keyName == "back") {
            tizen.application.getCurrentApplication().exit();
        }
    });

	var ultravioletSensor = webapis.sensorservice.getDefaultSensor("ULTRAVIOLET");
	
	function onGetSuccess(sensorData) {
		$('#textbox').html(sensorData.ultravioletLevel);
	}
	
	function onSuccess() {
		ultravioletSensor.getUltravioletSensorData(onGetSuccess);
	}

	ultravioletSensor.start(onSuccess);
});
```

## 感想

* config.xml で Features や Privileges あたりの設定が必要なのかと思ったけど、そのままで動いてしまったな。
opensslが古いとpythonのいろんなところに問題が出る

この問題で3時間が消失しました．

# 一番の問題

easy_installが必要なパッケージを見つけてくれません．pipも同様です．

```
# easy_install pip
Reading https://pypi.python.org/simple/pip/
Download error on https://pypi.python.org/simple/pip/: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed -- Some packages may not be found!
Couldn't retrieve index page for 'pip'
Scanning index of all packages (this may take a while)
Reading https://pypi.python.org/simple/
Download error on https://pypi.python.org/simple/: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed -- Some packages may not be found!
Best match: pip 6.0.6
Processing pip-6.0.6-py2.7.egg
pip 6.0.6 is already the active version in easy-install.pth
Installing pip script to /home/akisato/src/downloads/python-2.7.8/bin
Installing pip2.7 script to /home/akisato/src/downloads/python-2.7.8/bin
Installing pip2 script to /home/akisato/src/downloads/python-2.7.8/bin

Using /home/akisato/src/downloads/python-2.7.8/lib/python2.7/site-packages/pip-6.0.6-py2.7.egg

# pip install setuptools --upgrade
Could not find any downloads that satisfy the requirement setuptools in ./lib/python2.7/site-packages/setuptools-12.0.1-py2.7.egg
Collecting setuptools
  No distributions at all found for setuptools in ./lib/python2.7/site-packages/setuptools-12.0.1-py2.7.egg
```

# yumすれば良いのに

yum install openssl-devel をすれば良いのでは，と思うかもしれませんが，root権限がない一般人にはできません．:p

# 差し当たりどうするか

まずはpipのtar.gzを入手して，インストールします．

```
# wget https://pypi.python.org/packages/source/p/pip/pip-6.0.6.tar.gz --check-no-certificate
# tar xzvf pip-6.0.6.tar.gz
# cd pip-6.0.6.tar.gz
# python setup.py build
# python setup.py install
```

このままだと，古いOpenSSLのせいで，pipがSSLの検証に失敗するので，pipを改造します．
（参考： docs/TSUBAME http://www.kyogoku.biz/docs/TSUBAME)

```
# vim ~/src/downloads/python-2.7.6rc1/lib/python2.7/site-packages/pip-6.0.6-py2.7.egg/pip/downloads.py
Dispatch the actual request と書いてある行の次を，
return super(PipSession, self).request(method, url, verify=False, *args, **kwargs)
と書き換える。(verify=False を書き足す．) 
```

これでさしあたりの問題は解決したはず．

```
# pip install python
Collecting ipython
  Downloading ipython-2.3.1-py27-none-any.whl (2.8MB)
    100% |################################| 2.8MB 274kB/s
Installing collected packages: ipython

Successfully installed ipython-2.3.1
```
VisualStudioのビルド時間を簡単に早くする

#目的
プログラマにとって一番時間の無駄になっているであろう「ビルド時間」を短縮する。
方法はいろいろあるが、これは今すぐ短縮したい人向け。
筆者はVisual Studio 2013 Communityで行った。

##プロパティをいじる

これは非常に簡単で、その割に効果の高い方法である。

1. まずはプロジェクト→プロパティ→構成プロパティ→C/C++→
複数プロセッサによるコンパイルを「はい」にする。

1. 構成プロパティ→C/C++→コード生成の最小ビルドを有効にするを「いいえ」にする。

これだけだ。
試しに、自分が今作っているプロジェクトのビルド時間を測定してみた。

|         |Debugビルド|Releaseビルド|
|:--------|-----------|------------|
|設定前|33222ms|33578ms
|設定後|22252ms|20123ms|


見れば分かる通り、10秒以上の短縮に成功している。
この２つの設定だけでかなり変わるので、試してみては。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」環境設定処理

# 環境設定処理
「**enforce**」では、ゲームの設定に関する情報を「**src/environ.coffee**」と、「**lib/config.ini**」に集約させています。

## environ.coffee
「**src/environ.coffee**」では、ゲームの環境設定を行います。

```coffeescript
# static values setting ***********************************************************************************
DEBUG           = true                      # デバッグモード
SCREEN_WIDTH    = 600                       # 画面の幅
SCREEN_HEIGHT   = 864                       # 画面の高さ
BGCOLOR         = "black"                   # 背景色
OBJECTNUM       = 256                       # キャラの最大数
FPS             = 60                        # FPS
GRAVITY_X       = 0.0                       # box2d用水平方向重力
GRAVITY_Y       = 9.8                       # box2d用垂直方向重力
GAMEPADMIX      = true                      # キーボードとゲームパッド1の情報を合成する
WEBGL           = false                     # WebGL使用設定

# preloading image list ***********************************************************************************
MEDIALIST       = { 
    bear    : 'media/picture/chara1.png'
}
```
各変数を説明していきます。

<dl>
  <dt>DEBUG</dt><dd>デバッグフラグ。<br>これが「<strong>true</strong>」の時は、画面に表示されているスプライトにサイズを示す赤い枠が付きます（enchant.jsの場合のみ）。<br>そして、デバッグ用チェックライト関数「<strong>JSLog()</strong>」が使えます。</dd>
  <dt>SCREEN_WIDTH、SCREEN_HEIGHT</dt><dd>ゲームの画面サイズ。<br>オリジナルのenchant.jsでは、画面が左寄せになっているのですが、enforceで使っているものはセンタリングするように修正してあります（tmlib.jsは標準でセンタリングされる）。</dd>
  <dt>BGCOLOR</dt><dd>背景色です。<br>HTMLのカラー指定と同じ方法で指定します。</dd>
  <dt>OBJECTNUM</dt><dd>ゲームで使用するオブジェクト数を指定します。<br>enforceでは、ここで指定した数のオブジェクトをゲーム起動時に予め確保してしまいます（スプライトはオブジェクト生成時）。</dd>
  <dt>FPS</dt><dd>ゲームのFrame Per Secondsを指定します。<br>enchant.jsではAndroidだと指定したFPSよりも速い速度で実行されます（原因不明）。</dd>
  <dt>GRAVITY_X、GRAVITY_Y</dt><dd>box2dの物理スプライトで使用される重力パラメーターです。</dd>
  <dt>GAMEPADMIX</dt><dd>trueにすると、キーボード操作の情報とゲームパッド1の情報を合成して、どちらで操作してもゲームパッド1の情報が更新されるようになります。</dd>
  <dt>WEBGL</dt><dd>trueにすると、enchant.jsを使用するときに、gl.enchant.jsが読み込まれます。</dd>
</dl>

最後の「**MEDIALIST**」はゲーム内で使う、画像・サウンド・3Dモデルをプリロードするリストを定義します。
ここに記述されていないメディアファイルは使うことが出来ません。
ここに記述されているメディアファイルはプリロードされます。
ゲームスクリプト内で使用するときは、連想配列のキーで指定します。

基本的にメディアファイルは「game01/media」の下の、画像は「picture」、サウンドは「sound」、3Dデータは「model」に格納して使います（これは強制ではないですが、サンドボックスの中にしか置けません）。

各変数は変更後に再コンパイルで適用されます。

---

## config.ini
「**lib/config.ini**」では、使用するライブラリの選択を行います。

```ini
[ENVIRON]
LIBRARY=enchant
TITLE=GAME TITLE
```
### LIBRARY
使用するスプライトライブラリを指定します。

<dl>
  <dt>enchant</dt><dd><a href="http://www.uei.co.jp/">株式会社ユビキタスエンターテインメント</a>が作成したゲーム用ライブラリ、<a href="http://enchantjs.com/ja/">enchant.js</a>を使用します。</dd>
  <dt>tmlib</dt><dd>個人でゲームライブラリを作成している<a href="https://twitter.com/phi_jp">phi（ファイ）</a>さんがメンテナンスしている、<a href="http://phi-jp.github.io/tmlib.js/">tmlib.js</a>を使用します。<br>
現在のenforceでは、tmlib.jsを使うと下記のようないくつかの制限事項があります。<br>・isWithIn(object, distance)が使えない<br>・デバッグモード時にスプライト枠が出ない<br>・WebGLが使用出来ない</dd>
</dl>

### TITLE
ブラウザに表示するタイトルを指定します。
\<title\>\</title\>タグで指定したのと同じ状態になります。

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
AndroidStudioでSDK Managerが起動しないとかAVD追加できないとか

Mac環境でAndroidStudio(1.0.2)を使おうとしていたら、表題の事象になったのでメモ。

まずAVD Managerで*Create Virtual Device*からデバイスを追加しても反映されない。
さらにToolsメニューからSDK Manager起動しようとしても起動しない。

```:ログ
Cannot run program "/Users/XXXXX/Library/Android/sdk/tools/android": error=13, Permission denied: Cannot run program "/Users/XXXXX/Library/Android/sdk/tools/android": error=13, Permission denied
```

Permissionが無い？
面倒なのでtools配下に全部実行権限付ける。

```
chmod +x /Users/XXXXX/Library/Android/sdk/tools/*
```

これで解消された。
scalaでRESTサービス実装を学ぶ。

> 他に、[playでmbaasというプロジェクトbaasbox](https://github.com/baasbox/baasbox)があるが、javaベースで実装されているので、ひとまず除外。

今回の対象は、spray|liftweb。・・・調査＆学習コスト云々の話が深刻となりそうだが、即座に動く例題をizmailoff氏(ガチな感じの[liftwebとspray界隈のコミッター](https://github.com/izmailoff))が公開してくれているので、メモしておこうと思った。

##選択肢① liftweb　
- liftweb(rest+model)+mongodb

OpenBankProjectが、liftで実装したAPIなどをその名の通り、公開してくれている。

https://github.com/OpenBankProject

いろいろあるので、マイナーなlift実装を比較的まとまった規模のコードで学ぶのに良い。
	
##選択肢② spray+akka+liftweb
- spray(rest)+akka+liftweb(model)+mongodb

https://github.com/izmailoff/Spray_Mongo_REST_service

mongodb動かしておけば、githubのメモとおりで例題が即動く(検証環境Ubuntu14.04系)。

```
$./Spray_Mongo_REST_service/scripts/requests $ ./createUser.sh
{
  "status":"SUCCESSFUL",
  "value":{
    "email":"alex@example.com",
    "username":"test",
    "fullName":"Aleksey",
    "_id":"54ba87191e621d782791ee03",
    "isActive":true,
    "password":"mypass"
  }
```

```
$mongo
> use twitter
switched to db twitter
> show collections
system.indexes
tweet
user
> db.user.find()
{ "_id" : ObjectId("54ba87191e621d782791ee03"), "email" : "alex@example.com", "username" : "test", "fullName" : "Aleksey", "isActive" : true, "password" : "mypass" }
```
##選択肢（番外編）　play(PredictionIO)

[PredictionIO](https://github.com/PredictionIO/PredictionIO)は、playを部分的に使った機械学習フレームワーク(レコメンド等)。5700位上のstarを集めており、2015年1月現在、github上のscalaプロジェクトの中では、もっともstarが多い。かなり大きめのフレームワークplayであり、REST実装を学ぶ目的には大きすぎそうだが、気になる存在。

PredictionIOを大づかみにするには、以下から入るといいのかも:
[Need to build a personalisation engine? Introducing PredictionIO](http://blog.monokkel.io/introduction-to-predictionio-by-example/)

※注、上の記事と異なり、PredictionIOバージョン0.84以降は、現時点では、hadoop上でなく、[spark上で動作する](http://us6.campaign-archive2.com/?u=d8c0435d851c1310fc64c6e26&id=b258a814b7&e=8e060da50e)。
AWS EC2インスタンス用のIAMロール作成手順

■はじめに
===

AWSでEC2インスタンスを運用する際、アクセスキーやIAM(Identity & Access Management)ロールを利用して、AWSリソースへのアクセスを制御する事があるかと思います。

以下はAWS Management ConsoleからEC2インスタンスに割り当てるIAMロールを新規作成する手順例になります。

■参考サイト
===

以下のサイトを参考にさせて頂きました。

http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/create-role-xacct.html
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

■IAMロール作成手順
===

・AWS Management Consoleにログインします。

IAMロールを作成したいAWSアカウントに対して、IAMロール作成権限を持ったユーザでログインします。

https://********.signin.aws.amazon.com/console

・「Identity & Access Management」->「Roles」をクリックします。

![WS000001.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/369ac912-92ab-a203-392e-a01ee3e73568.gif)

・「Create New Role」をクリックします。

![WS000182.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/872929f7-9273-670b-f442-ac9bf42dc16e.gif)

・作成したいIAMロール名を入力します。
「Set Role Name」で「Role Name」に作成したいIAMロール名を入力します。「Next Step」をクリックします。今回の例では以下のロール名でIAMロールを作成します。

![WS000183.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/38d7b8de-97f1-e4de-f7e4-7116e2351cc9.gif)


・IAMロールのタイプを選択します。
「Select Role Type」で「Amazon EC2」を選択して「Select」をクリックします。

![WS000184.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/882462d6-5fd7-b36a-cf17-dc26772162f7.gif)

・IAMロールに設定したいIAMポリシーを指定します。
「Set Permissions」でIAMロールに設定したいIAMポリシーを指定します。今回の例では「Select Policy Template」->「CloudWatch Logs Full Access」を選択して「Select」をクリックします。

![WS000185.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/324d3f0e-953d-cc1f-e7c8-c3578760ecc2.gif)

「Select Policy Template」->「CloudWatch Logs Full Access」を選択した場合、以下のようなIAMポリシーが表示されます。今回の例では「Next Step」をクリックしてIAMロールに以下のIAMポリシーを設定します。

![WS000186.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/9b71a1c0-809c-3c94-1731-38ac0eddfd3a.gif)

Policy Name:

```
CloudWatchLogsFullAccess-unbound-server-role-201501180000
```

Policy Document:

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

・IAMロールを作成します。
「Create Role」をクリックしてIAMロールを作成します。

![WS000187.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/e65d5e71-6cd7-09c6-c72a-83c43c0e4c84.gif)

以下のように作成したIAMロールが表示されている事を確認します。

![WS000000.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/88851a2c-5118-e8e8-b502-63df676fafc6.gif)

■EC2インスタンスへのIAMロール割り当て
===

作成したIAMロールについては、AMIからEC2インスタンスを新規作成する際、割り当てる事が出来ます。

「AWS Management Console」->「EC2」->「Launch Instance」でEC2インスタンスを作成画面を表示します。

「Step 1: Choose an Amazon Machine Image (AMI)」->「Step 2: Choose an Instance Type」->「Step 3: Configure Instance Details」画面の「IAM Role」で、IAMロールを選択する事によって、EC2インスタンスにIAMロールを割り当てる事が出来ます。

![WS000002.gif](https://qiita-image-store.s3.amazonaws.com/0/63647/e0ac8319-84d3-30d2-6036-7ed371282c4d.gif)

以上になります。
Slideshareを最後まで見ると勝手に次のスライドに移動する超ウザ機能を殺す

![okujou.gif](https://qiita-image-store.s3.amazonaws.com/0/18726/6140d5bc-c1a8-d222-1189-c8652bc62fbf.gif)

去年の11月くらい(?)からスライドシェアでスライドを見終わると「勝手に次のスライドに遷移する」という余計なお世話な超絶にうざい機能が導入されたのだが、いい加減うざすぎるので切れて、寝る前に無効化するChrome拡張書いた。

# Chrome拡張
[slideshare next-slide disabler](https://chrome.google.com/webstore/detail/slideshare-next-slide-dis/egmemnnmafodbgakebaabhanjmjflmbk)

実装は凄いシンプルだけど拡張で簡単導入できたら嬉しい人はいるかと思って公開した。

## 実装
`document_end`のタイミングでコレ実行してるだけ。

```js
'use strict';
!function(t){t.parentNode.removeChild(t)}(document.querySelector(".next-container"));
```

UserScript使える人はこれが自動で実行されるようにしておけば良い。
Android でインターネットに接続するためのパーミッションを設定する


Android 上でインターネットに接続するためには、そのためのパーミッションを必要とする。

``app/src/main/AndroidManifest.xml`` に以下を記述する

```AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
```

``android:name`` で発行するパーミッションを指定する。今回はインターネット接続のためのものなので、``android.permission.INTERNET`` となっている。

以下は、実際の``AndroidManifest.xml``

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.karuran.try_volley" >

    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```
IAM の NotAction で指定された権限の一部を解放してみる


NotActionで除外したものを部分的にAllowにして、そのAPIが利用できるかどうかはっきり分かっていなかったので確認してみました。

## NotAction だけの場合

※以下のようにNotActionを書くと、IAM以外にはアクセスできるので注意。

```IAM-Policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1421508859000",
      "Effect": "Allow",
      "NotAction": [
        "iam:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

```command
$ aws iam list-users
```
出力結果

```
A client error (AccessDenied) occurred when calling the ListUsers operation: User: arn:aws:iam::xxxxxxxxxxxx:user/test-user is not authorized to perform: iam:ListUsers on resource: arn:aws:iam::xxxxxxxxxxxx:user/
```

IAMへのアクセスはもちろんできません。
権限がないと言われます。


## NotAction + Allowで部分的に許可

IAMに

```IAM-Policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1421508701000",
      "Effect": "Allow",
      "Action": [
        "iam:ListUsers"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "Stmt1421508859000",
      "Effect": "Allow",
      "NotAction": [
        "iam:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

```command
$ aws iam list-users
```

出力結果

```
{
    "Users": [
        {
            "UserName": "simeji",
            "PasswordLastUsed": "2015-01-17T15:08:07Z",
            "CreateDate": "2014-12-20T12:24:28Z",
            "UserId": "AIDAXXXXXXXXXXXXXXXXXA",
            "Path": "/",
            "Arn": "arn:aws:iam::xxxxxxxxxx:user/simeji"
        },
        {
            "UserName": "test-user",
            "Path": "/",
            "CreateDate": "2015-01-17T15:25:29Z",
            "UserId": "AIDAXXXXXXXXXXXXXXXXU",
            "Arn": "arn:aws:iam::xxxxxxxxxx:user/test-user"
        }
    ]
}
```

結果が取得できました。
NotActionによって除外された物も明示的にAllowしてやればアクセスできるようです。


##  NotAction => Deny に変更 + Allowで部分的に許可

念のためDenyに変えた場合も確認してみました。

```IAM-Policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1421508701000",
      "Effect": "Allow",
      "Action": [
        "iam:ListUsers"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "Stmt1421508859000",
      "Effect": "Deny",
      "Action": [
        "iam:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

```

```command
$ aws iam list-users
```
出力結果

```
A client error (AccessDenied) occurred when calling the ListUsers operation: User: arn:aws:iam::xxxxxxxxxxxx:user/test-user is not authorized to perform: iam:ListUsers on resource: arn:aws:iam::xxxxxxxxxxxx:user/
```

権限がないと言われます。
Go 1.5 以降のビルド手順

# Go 1.5 Bootstrap

Go 1.5 以降では、Go自体をビルドするのに Go 1.4が必要になるそうです。

https://golang.org/s/go15bootstrap 

最新のツリーをビルドするには、下記のどちらかを事前に準備しておく必要がある。

* `$HOME/go1.4` を用意する
* `$GOROOT_BOOTSTRAP` を自分で設定する

ちなみに、`$GOROOT_BOOTSTRAP` の default は、`$HOME/go1.4` だそうです。

# $HOME/go1.4 を 使用する場合

## Go 1.4 ビルド

まずは、`$HOME/go1.4` をビルドしておく

```bash
git clone -b release-branch.go1.4 https://go.googlesource.com/go $HOME/go1.4
cd $HOME/go1.4/src
./make.bash
```
## 最新のGoをビルド

```bash
git clone https://go.googlesource.com/go $HOME/go
cd $HOME/go/src
./make.bash
```
Debian WheezyにHubotをインストール

Debian Wheezyだと標準のパッケージでは、Node.jsやらnpmがインストールできなくて微妙に躓いたので残しておきます。

# Redisのインストール
```
sudo aptitude install redis-server
```
`sudo service redis-server status`あたりでインストールされていることを確認。


# nodeのインストール
/etc/apt/sources.listに
deb http://ftp.jp.debian.org/debian/ wheezy-backports main
を追加
その後Nodejsをインストール


```
sudo aptitude update
sudo aptitude upgrade
sudo aptitude install nodejs
```

`nodejs`でnodejsがインストールされていることを確認。
一部のライブラリはnodejsは`node`で動くことを要求しているものの、
Debianは既に`node`コマンドが存在する。
そのため、以下をインストールしてシンボリックリンクを貼ってやる。
```
sudo aptitude install nodejs nodejs-legacy
```

# npmのインストール
面倒だがパッケージが用意されていないのでインストールスクリプトをダウンロードしてきて頑張る。

インストールスクリプトにcurlを用いるのでインストールしておく。

```
sudo aptitude install curl
```


```
wget http://www.npmjs.org/install.sh --no-check-certificate
sudo sh install.sh
```

`npm`で動作すること確認


# Hubotのインストール
```
sudo npm install -g hubot coffee-script
```

これであとはうごく。。。はず
【OSX】【swift】コマンドの実行

OS X 向けの簡単なGUIアプリを作り、ターミナルで実行していることをできれば
便利じゃないかなと思いまして。
(XcodeでiOSのように、IBActionから処理の指定ができたりするので)

まずはコマンドの実行について

##実行と引数の指定

```swift

        var  cmd:String = "/usr/bin/killall"
        var task:NSTask = NSTask()
        task.launchPath = cmd;
        //配列
        task.arguments  = ["Finder"]
        task.launch()

```


##標準出力の取得


```swift

        var  cmd:String = "/bin/echo"
        var task:NSTask = NSTask()
        task.launchPath = cmd;
        task.arguments  = ["hoge","hogehoge","hogehogehoge"]
        var pipe:NSPipe = NSPipe()
        task.standardOutput = pipe
        task.launch()
        var output:NSData = pipe.fileHandleForReading.readDataToEndOfFile()
        var outputStr:NSString = NSString(data:output,encoding:NSUTF8StringEncoding)!
        println(outputStr)
```

##対話型の場合の出力



```swift


        var  cmd:String = "/usr/bin/top"
        task = NSTask()
        task.launchPath = cmd;
        pipe = NSPipe()
        task.arguments = ["-s", "1", "-l", "3600", "-stats", "pid,cpu,time,command"];
        task.standardOutput = pipe
        task.launch()
        
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: "notificationReadedData:",
            name:NSFileHandleReadCompletionNotification, object: nil)
        pipe.fileHandleForReading.readInBackgroundAndNotify()


```

NSNotificationCenterで通知を受け取る形にし、
(taskとpipeはメンバ変数にしています)

```swift
    func notificationReadedData(notification:NSNotification)
    {
        var output:NSData = notification.userInfo![NSFileHandleNotificationDataItem] as NSData;
        var outputStr:NSString = NSString(data:output,encoding:NSUTF8StringEncoding)!
        println(outputStr)
        if task.running {
            pipe.fileHandleForReading.readInBackgroundAndNotify()
        } else {
            NSNotificationCenter.defaultCenter().removeObserver(self,
                name:NSFileHandleReadCompletionNotification, object: nil)
        }
        
    }

```

なお、コマンドの停止は

```swift

task.terminate()


```

top時についての引数指定については以下を参考にさせていただきました
参考URL:http://stackoverflow.com/questions/3557594/nstask-to-call-command-top-getting-error
Rationalリテラル(Ruby2.1から)


# 例
```rb
x = 1/2r
p x * 2
#=> (1/1) 
```
rサフィックスでRationalインスタンスを作れるか、うろ覚えだったので例外が発生するのかなと思いましたがそんなことはありませんでした。


# pryで実験

```rb

pry(main)> Rational(1, 2)
=> (1/2)

pry(main)> 1/2r
=> (1/2)

pry(main)> Rational(1, 2) * 2
=> (1/1)

pry(main)> 1/2r * 2
=> (1/1)
```

# 参考リンク
## Ruby 2.1.0 リリース (2.0 からの変更点)
https://www.ruby-lang.org/ja/news/2013/12/25/ruby-2-1-0-is-released/
>
2.0 からの変更点
.....
文法の変更
**Rational/Complex リテラル #8430**
defの戻り値 #3753
...
>


# 参考にしたツイート
以下のツイートにインスパイアされて記事を書きました。
参考： [武田哲也さんのRuby技術者認定試験受験記](http://togetter.com/li/769555)

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/hashtag/RubyGold?src=hash">#RubyGold</a>&#10;rサフィックスでRationalインスタンスを作れる&#10;<a href="http://t.co/2XRUDWvxES">http://t.co/2XRUDWvxES</a>&#10;「2r」って初めて見る書き方やけどたぶんそうやろと予想し、おそらく正解。</p>&mdash; 武田哲也 (@__takeda) <a href="https://twitter.com/__takeda/status/554109032118501377">2015, 1月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Scalaでリストをランダムに並び替えたり、互い違いに編みこんだり

どちらも適当なタプルを作ってから並び替えています。もっといい方法があったら教えて下さいませ。

# リストをランダムに並び替え
```scala
  val random = new Random()
  def shuffle[T](objects: Seq[T]): Seq[T] = objects.map((_, random.nextInt())).sortWith((a, b) => a._2 < b._2).map(_._1)
```
**2015/01/19追記：コメント欄で教えていただきましたが、以下の標準メソッドでランダムな並び替えはできました。**

```scala
scala.util.Random.shuffle(objects)
```

# リストを互い違いに編みこみ
```scala
  /**
   * Weaves sequences.
   * e.g.
   * val l1 = Seq(1,2,3)
   * val l2 = Seq(500,600,700)
   * val l3 = weave(l1,l2)
   * // l3 == Seq(1,500,2,600,3,700)
   * @param objects
   * @tparam T the type of the elements.
   * @return a new sequence resulting from weaving all element sequences.
   */
  def weave[T](objects: Seq[T]*): Seq[T] = {
    val all:Seq[(T, Int, Int)] = objects.zipWithIndex.map { case (list, i) => zipWithIndexAndPriority(list, i)}.flatten
    all.sortWith((a, b) => if (a._2 == b._2) a._3 < b._3 else a._2 < b._2).map(_._1)
  }

  private def zipWithIndexAndPriority[T](objects: Seq[T], priority: Int): Seq[(T, Int, Int)] = objects.zipWithIndex.map { case (o, i) => (o, i, priority)}
```
C#でFileのMD5を得る

使いたいなと思うときにめんどくさくなって放置してたんだけど作った

~~~CSharp
public static string GetFileMD5(string file)
{
    using(var fs = new FileStream(file, FileMode.Open))
    using(var md5 = MD5.Create())
    {
        byte[] ba = md5.ComputeHash(fs);
        return BitConverter.ToString(ba).Replace("-", "");
    }
}
~~~
かなりいい加減なBlenderエラー解決方法

Object has non-uniform scale, unwrap will operate on a non-scaled version of the mesh.
オブジェクトのスケールが均一でないため、非スケーリングバージョンのメッシュで展開します.

UV展開しようとしたら発生.
ObjectModeで対象のオブジェクトを選択し
**Ctrl + a** → *拡大縮小(scale)*
で解決.

---
Spark on Dockerで分散型機械学習を始める - Part2: UbuntuでIPython Notebookを使う


[sequenceiq/spark](https://registry.hub.docker.com/u/sequenceiq/spark/)のDockerイメージはCentOS 6.5を使っているので、そのままではIPythonのインスト-ルに失敗してしまいます。SequenceIQには[Ubuntuのbaseimage](https://github.com/sequenceiq/docker-pam/blob/master/ubuntu-14.04/Dockerfile)もあります。これから自分でSparkのDockerfileを作ろうと思いましたが、ちょどよいイメージが[LogBaseInc/docker-spark-ipython](LogBaseInc/docker-spark-ipython)がありました。


## このシリーズ

* [Spark on Dockerで分散型機械学習を始める - Part 1: インストール](http://qiita.com/masato/items/fe93157293114999b0d8)
* [Spark on Dockerで分散型機械学習を始める - Part 2: UbuntuでIPython Notebookを使う](http://qiita.com/masato/items/be383a81e323f3b5b42e)
* [Spark on Dockerで分散型機械学習を始める - Part 3: ローカルモードでspark-shellを起動する](http://qiita.com/masato/items/9398cccde46cf62aa609)
* [Spark on Dockerで分散型機械学習を始める - Part 4: AmbariでHadoopとSparkのsingle nodeセットアップ](http://qiita.com/masato/items/34cf33b6a956a2f723f9)


## CentOS 6.5の場合

[sequenceiq/spark](https://registry.hub.docker.com/u/sequenceiq/spark/)

前回作成したDockerコンテナはCentOS 6.5の[baseimage](https://github.com/sequenceiq/docker-pam/blob/master/centos-6.5/Dockerfile)を使っています。

``` bash
$ cat /etc/redhat-release
CentOS release 6.5 (Final)
```

Pythonのバージョンは2.6.6です。

``` bash
$ python -V
Python 2.6.6
```

Python 2.7以上を使わないとiPythonがインストールできません。

``` bash
$ curl https://bootstrap.pypa.io/get-pip.py -o - | sudo python
$ sudo pip install ipython
Collecting ipython
  Downloading ipython-2.3.1.tar.gz (11.9MB)
    100% |################################| 11.9MB 1.1MB/s
    ERROR: IPython requires Python version 2.7 or 3.3 or above.
    Complete output from command python setup.py egg_info:
    ERROR: IPython requires Python version 2.7 or 3.3 or above.

    ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-bzXfTe/ipython
```

## Ubuntu 14.04.1の場合

[LogBaseInc/docker-spark-ipython](LogBaseInc/docker-spark-ipython)を使いDockerコンテナを起動します。

``` bash
$ docker pull logbase/spark-ipython
$ docker run -d --name spark-ipython -p 8888:8888 logbase/spark-ipython
```

シェルを起動してバージョンを確認します。

```
$ docker exec -it spark-ipython /bin/bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
```

Pythonのバージョンは2.7.6、IPythonは2.3.1です。

``` bash
$ python -V
Python 2.7.6
$ ipython -V
2.3.1
```

## IPython Notebookを使う

ngrokを使いDockerホストの8888ポートをトンネルします。

``` bash
$ docker run -it --rm wizardapps/ngrok:latest ngrok $(docker inspect --format="{{ .NetworkSettings.IPAddress }}" spark-ipython):8888
```

ブラウザでIPython Notebookを開いて簡単なテストで動作確認します。

https://6e7e14f6.ngrok.com/


![ipython-pyspark.png](https://qiita-image-store.s3.amazonaws.com/0/43745/d2481440-7a15-22a7-4073-b7b56e6e55ad.png)
Install Linux kernel-devel


# Goal

* デバイスなどのモジュールをビルドするために必要なkernel-develをインストールする
* CentOS(rpmベースのOS)で、Linux kernel-develをkernelとの整合性を保ってインストールする
* ちなみにkernel-develはモジュールのビルドなどに必要な最低限のソースが入っているらしい

# Manual

### yum.conf編集

exclude=kernel*と記述されている箇所をコメントアウトする

```/etc/yum.conf
# exclude=kernel*
```

### yum install

```bash
sudo su -
yum install kernel-devel

## 
## install確認
## 
rpm -qa | grep kernel-devel
  # kernel-devel-2.6.32-504.3.3.el6.x86_64
  # kernel-develがインストールされたことを確認

ls -l /usr/src/kernels
  # drwxr-xr-x 22 root root 4096 Jan 17 14:02 2.6.32-504.3.3.el6.x86_64
  # ソースは上のディレクトリにインストールされる
```

### kernelとkernel-develのバージョンを確認

yum installだと新しいkernel-develをとってきてしまい、必ずしもkernelのバージョンと一致しない.
kernelとkernel-develのバージョンが整合しないとlib/modulesのパスのシムリンクがリンク切れになってしまう.

```bash
## 
## 2.6.32-431と2.6.32-504.3.3のようにバージョンが一致しない場合がある
## 

uname -r
  # 2.6.32-431.el6.x86_64
rpm -qa | grep kernel-devel
  # kernel-devel-2.6.32-504.3.3.el6.x86_64

## 
## バージョンが一致しないと、以下の/lib/modules/${VERSION}/buildのシムリンクが切れ、
## kernelモジュールのビルドができなくなる
## 

ls -l /lib/modules/2.6.32-431.el6.x86_64/build
```

## バージョン指定でkernel-develをインストール

既にkernel-develがインストールされている場合は、削除する

```bash
## 
## 誤ったバージョンを変数に格納
## 
KERNEL_DEVEL_WRONG_VERSION=`rpm -qa | grep kernel-devel`
echo ${KERNEL_DEVEL_WRONG_VERSION}
  # kernel-devel-2.6.32-504.3.3.el6.x86_64

## 
## rpmコマンドで削除
## 
rpm -e --nodeps ${KERNEL_DEVEL_WRONG_VERSION}

## 
## remove確認
## 
rpm -qa | grep kernel-devel
  # インストールされていたバージョンが消える
ls -l /usr/src/kernels/
  # インストールされていたバージョンが消える

```

新しいkernel-develをバージョン指定でinstall

```bash
## 
## 正しいバージョンを変数に格納
## 
KERNEL_VERSION=`uname -r`
KERNEL_DEVEL_EXPECTED_VERSION=kernel-devel-${KERNEL_VERSION}
echo ${KERNEL_DEVEL_EXPECTED_VERSION}
  # kernel-devel-2.6.32-431.el6.x86_64

## 
## 以下のサイトなどからrpmパッケージを探し、リンク先を保存し、ダウンロードする
## http://rpm.pbone.net/
## 

cd /usr/local/src
wget "ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/6.4/x86_64/updates/security/${KERNEL_DEVEL_EXPECTED_VERSION}.rpm"
ls -l ${KERNEL_DEVEL_EXPECTED_VERSION}.rpm
  # downloadできたことを確認

rpm -ivh ${KERNEL_DEVEL_EXPECTED_VERSION}.rpm
  # インストール実行

## install確認
rpm -qa | grep kernel-devel
  # 正しいバージョンがインストールされる
ls -l /usr/src/kernels/
  # 正しいバージョンがインストールされる

ls -l /lib/modules/${KERNEL_VERSION}/build/
  # シムリンク先が存在すること
```

# Environment

```
uname -a
  # Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

cat /etc/issue
  # CentOS release 6.5 (Final)
  # Kernel \r on an \m
```