OmniAICreator/Qiita-1.07M huggingface dataset:
TestFlight利用メモ

# TestFlight？
App Store公開用のiOSアプリを、公開前にテストする仕組み。
(公開されるアプリを事前検証できるので、利用していきたい)

- iOS 8以降で利用可能です。
- 利用するためには、TestFlightのアプリをインストールする必要があります。
- テスト公開したアプリの利用期間は30日間
- 内部テストと外部テストの2つから選択できる

|          |テスト前のアプリ審査|最大ユーザー数|Apple ID|
|----------|------------------ |------------|--------|
| 内部テスト| 不要              |25ユーザー(各ユーザー10端末まで利用可能|必要|
| 外部テスト| 必要              |1000ユーザー(各ユーザー1端末)|不要|

# 利用方法
## 内部テスト
内部テストの場合、iTunes Connectの「ユーザーと役割」で事前にテストユーザーを登録する必要があります。
1.テスト対象アプリのアップロード
2.iTunes Connectへサインインし、テスト対象アプリのマイAppページを開く
3.[TestFlight]内の[内部テスト]を押下
4.[テストするバージョンを選択]を押下
5.アップロードしたアプリを選択
6.「テストを開始」を押下
ここまでが開発者の作業です。
もし内部テスターにテストアカウントが存在しない場合は事前に追加してください。
以降はテスト担当者の作業です。
テスト端末に開発中のアプリがインストールされている場合は、事前に削除しておいてください。
7.テスト用端末に内部テスターのApple IDでサインイン
8.TestFlightを開く
9.テスト対象アプリが存在するので[INSTALL]を押下
以上で内部テストの利用準備は完了です。

## 外部テスト
1.テスト対象アプリのアップロード
2.iTunes Connectへサインインし、テスト対象アプリのマイAppページを開く
3.[TestFlight]内の[外部テスト]を押下
4.[テスト対象ビルドを追加]を押下し、テスト対象アプリのビルドバージョンを選択して追加
5.アプリの概要や連絡先などを入力する画面になるので、適宜必要な情報を入力
6.追加したバージョンが"ベータ版アプリ審査待ち"状態となるため、審査が完了するのを待つ
※審査完了すると、「Your app アプリ名～～～has been approved for beta testing.」というタイトルでメールが届きます
7.再度[外部テスト]ページを開く
8.外部テスターに、テスターのメールアドレスを追加し、保存を押下
ここまでが開発者の作業です。
テスターに登録したメールアドレス宛にTestFlightの招待メールが送信されます。
以降はテスト担当者の作業です。
テスト端末に開発中のアプリがインストールされている場合は、事前に削除しておいてください。
9.通知された外部テスターのメールをiOS端末で開く
10.メール中央の"Start Testing"をタップ
11.TestFlightが起動してアプリインストール画面が表示されるので[INSTALL]をタップ

 
以上です。
C#でXMLをJSONにコンバート（最短・エラーチェックなし）

xmlをjsonにしたいことってありますよね。でもサクッとやる方法がおもいつかず。。困っていたんですが。

**C#、もとい<a href="https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%82%B9%E3%83%BB%E3%83%98%E3%83%AB%E3%82%B9%E3%83%90%E3%83%BC%E3%82%B0" target="_blank">アンダース・ヘルスバーグ</a>ならなんとかしてくれる。**

と信じて書いてみたら**3行で望みの結果を得られた。**

# 環境
- VisualStudio 2015

```csharp:xmltojson.cs
using Newtonsoft.Json;
using System.IO;
using System.Xml;

namespace Lib
{
    class XmlToJson
    {
        static public void ToJson(string path_to_xml, string path_to_json)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(File.ReadAllText(path_to_xml));
            File.WriteAllText(path_to_json, JsonConvert.SerializeXmlNode(doc));
        }
    }
}
```

```csharp:Usage
static void Main(string[] args)
{
    XmlToJson.ToJson("hoge.xml", "hoge.json");
}
```

```xml:変換元のxml
<?xml version="1.0" encoding="utf-8"?>
<persons>
  <person id="1">
    <firstname>イチキータ</firstname>
    <lastname>山田</lastname>
    <birthday>2001/10/01</birthday>
  </person>
  <person id="2">
    <firstname>ニキータ</firstname>
    <lastname>山田</lastname>
    <birthday>2004/11/09</birthday>
  </person>
</persons>
```

```json:変換後のjson
{
  "?xml": {
    "@version": "1.0",
    "@encoding": "utf-8"
  },
  "persons": {
    "person": [
      {
        "@id": "1",
        "firstname": "イチキータ",
        "lastname": "山田",
        "birthday": "2001/10/01"
      },
      {
        "@id": "2",
        "firstname": "ニキータ",
        "lastname": "山田",
        "birthday": "2004/11/09"
      }
    ]
  }

}
```

#所感

C#すっげえ。
FuelPHPのタスクをコントローラーからも実行する

CSVを作るとか、サイトマップを作るとか、再利用性のある処理はいつもタスクに書いてしまいます。
そのタスクをコントローラーからでもモデルからでも呼べれば、「ブラウザのボタンクリックでCSVをDLする」ような処理をどこにでも簡潔に記述できそうです。

# やってみる

```php:fuel/app/classes/controller/item.php
public function post_download()
{
	$time = \Date::forge()->get_timestamp();
	$path = APPPATH.'tmp/export/item/'.$time.'.csv';
	
	//
	\Package::load('oil');
	
	$bf= \Fuel::$is_cli;
	\Fuel::$is_cli =true;
	$_SERVER['argc'] = 1;
	Oil\Refine::run('export_items', array($path) );
	\Fuel::$is_cli = $bf;
	
	if( file_exists($path) ){
		File::download($path,sprintf('item-%s.csv',date('Ymd_Hi',$time)));
	}
}
```

# できた

ポイントは、

* ```\Fuel::$is_cli```を偽装してCLI実行を装う（後で戻す）
* 引数の数を```argc```で指定する

# だがしかし

タスクは、<b>戻り値がとれない</b>ので、タスク内でエラーが出てもよくわからないし、結果も取得できません。
なので、ファイルの場所を引数で指定するとか、結果を得る工夫は必要です。

あと、タスク内でechoとかされると画面に出力されてしまうので、```ob_start()```するなりして回避しないとかもしれないです。
macOSでzipファイルを作って鍵をつける方法

## 手順
1. zipファイルを作る
2. zipファイルに鍵をつける

## 1.　zipファイルを作る

test.txtからtest.zipを作りたいとします。

terminalを起動し、以下の1行目を実行。

```lang:bash
zip test.zip test.txt
adding: test.txt (deflated 37%)
```

## 2.　zipファイルに鍵をつける

以下の1行目を実行。
パスワードを聞かれるので、2回入力する。

```lang:bash
zipcloak test.zip
Enter password: 
Verify password: 
encrypting: test.txt
```


## 参考サイトなど
[特別なソフトなし！Macでパスワードつきでzip圧縮する方法](https://digitalfan.jp/76756)
XCodeショートカット


|キー                 |効果                         |
|---------------------|-----------------------------|
|[Ctrl]+[A]           |カーソルを行頭へ              |
|[Ctrl]+[E]           |カーソルを行末へ              |
|[command]+[「]       |インデント(半角スペース4つ)    |
|[command]+[」]       |アンインデント(半角スペース4つ)|
|[command]+[R]        |ビルドして実行                |
|[command]+[B]        |ビルド                       |
|[command]+[Z]        |Undo                         |
|[command]+[Shift]+[Z]|Redo                         |
[Twig] 動的なキーで配列要素を取得する

# やりたかったこと
こんなことがやりたかった。

```php
$arr = array('key' => 'hoge');
$key = 'key';
print $arr[$key]; // hoge
```

# 結論
attribute を使う
http://twig.sensiolabs.org/doc/functions/attribute.html

```jinja:ex
{% set arr = {'key': 'hoge'} %}
{% set key = 'key' %}
{{attribute(arr, key)}} // 'hoge'
```
他スクリプトから変数の値を取得する．(ゲッター，セッター)


プレイヤーの弾の残り数など，他のスクリプトの変数の値が欲しいことがある．
その方法について紹介する．

```csharp:PlayerScript.cs
private int bulletCount = 5;
```

この，bulletCountを取得したいとする．
方法は3つある．
1. publicにする．
2. プロパティーを使う．
3. それ用の関数を作る．

それぞれ紹介するが，おすすめは，2のプロパティーである．

# publicで取得

```csharp:PlayerScript.cs
public int bulletCount = 5;
```

private ではなく，public を使用する．

```csharp:OtherScript.cs
public PlayerScript playerScript;

void Start(){
    int bCount;
    bCount = playerScript.bulletCount;
    Debug.Log(bCount); //5
}
```

playerScript.bulletCountという形で取得することができる．
#### 問題点
- 外部から値を入力できてしまうため，バグの原因になる．


# プロパティーを使う．
```csharp:PlayerScript.cs
private int bulletCount = 5;
//プロパティー
public int BulletCount{
    get{ return this.bulletCount; }  //取得用
    private set{ this.bulletCount = value; }　//値入力用
}
```

setの方にはprivateをつけることで，他のスクリプトからの入力はできないようにする．

```csharp:OtherScript.cs
public PlayerScript playerScript;

void Start(){
    int bCount;
    bCount = playerScript.BulletCount;
    Debug.Log(bCount); //5
}
```

取得の方はあまり変わらない．

#### 問題点
- 初心者にとっては何のためにやるのかわからない．


# 関数を作る．
```csharp:PlayerScript.cs
private int bulletCount = 5;
//取得用関数
public int GetBulletCount(){
    return bulletCount;
}
```

取得用の関数を作る．関数の頭にGetを作るのが主．
逆に値入力の場合はSetがつけられることが多い．SetBulletCount

```csharp:OtherScript.cs
public PlayerScript playerScript;

void Start(){
    int bCount;
    bCount = playerScript.GetBulletCount();
    Debug.Log(bCount); //5
}
```

この方法でもバグは起こりにくいため，
こっちの方法でも問題はない．

取得の際に処理を行う場合はこれでもいいと思う．

#### 問題点
- 長い
gulp-data ＋ json で title, description, keyword を一括管理する

ディレクトリ構造は以下の前提での設定。

gulpfile.js
package.json
/dist
/src
　└ /_jade
　　　└ /_data
　　　　　└ setting.json
　└ /aaa
　　　└ index.html
　└ /bbb
　　　└ index.html





```gulpfile.js
var data        = require('gulp-data');

var DEST = './dist';
var SRC = './src';
var SRC_HTML = ['./src/**/*.jade', '!./src/**/_jade/*.jade', '!./src/**/_*.jade'];

gulp.task('jade', function() {
  return gulp.src(SRC_HTML)
  .pipe(data(function(file) {
    var c, filename;
    if (file.path.length !== 0) {
      c = file.path.split('\\').join('/');
      filename = c.split('src/')[1].replace('.jade', '');
      return setJson(filename);
    }
  }))
  .pipe(jade({
    pretty: true,
    basedir: './src/_jade/',
    doctype: 'html'
  }))
  .pipe(gulp.dest(DEST));
});

// .jade のファイル名を keyに、jsonの項目を各ファイルにセットする
var setJson = function(filename) {
  var setting = require('./src/_jade/_data/setting.json');
  if (setting[filename]) {
    return setting[filename];
  } else {
    return setting.defalut;
  }
};
```

jade側では変数を #{title}, #{description}, #{keywords} この形で入れておく。

```index.jade
doctype html
html(lang="ja")
  head
    meta(charset="UTF-8")
    title #{title}
    meta(name="description" content="#{description}")
    meta(name="keywords" content="#{keywords}")
```

setting.json にはファイルパスと各値を記述。
こちらに記述がないファイルには default で設定した値が入る。

```setting.json
{
"default": { "title":"ページタイトル", "description":"ディスクリプション", "keywords":"キーワード"},
"aaa/index": { "title":"AAA｜サイト名", "description":"AAAディスクリプション", "keywords":"AAA,AAA,AAA"},
"bbb/index": { "title":"BBB｜サイト名", "description":"BBBディスクリプション", "keywords":"BBB,BBB"}
}
```
FuelPHPのテストをテスト環境で実施するパッケージ「Fuel-Tasks-Testontest」

[goosys/Fuel-Tasks-Testontest: The package for FuelPHP](https://github.com/goosys/Fuel-Tasks-Testontest)


3年前くらいに作ったパッケージなのでよく覚えてないのですが、、
FuelPHP1.7でテストを動かしたいとき、ただ```oil r test```するとdevelop環境のDBに繋がったような気がします。もちろん、```FUEL_ENV=test```を付ければいいだけの話なのですが、当時はついでにmigrationも初期化してもらいたいようなテストの書き方だったのでパッケージにしていたような気がします。

使い方はこんな感じです。

```
oil r testontest 
oil r testontest --group=Model
oil r testontest --group=AppModel
```

これを実行すると、本当のテストを実行する前に、以下の前処理を行います。

1. ```Fuel::$env```にtestをセット（Configの再ロードまではしません）
2. テスト環境のDBを```migrate:down``` （全削除）
3. テスト環境のDBを```migrate``` （初期化）

# 実装

```php:tasks/testontest.php
namespace Fuel\Tasks;
/**
 * テスト環境でテストを実行
 */
class Testontest {
	public static function run() 
	{
		
		\Fuel::$env = \Fuel::TEST;
		
		$argv = self::_trim( $_SERVER['argv'] );
		
		self::init();
		
		\Oil\Command::init( array_merge( array('oil','test'), $argv ) );
		
	}
	
	protected static function init()
	{
	
		\Package::load('oil');
		
		ob_start();
		
		$_SERVER['argv'] = array('oil','r','migrate:down','--version=0');
		\Cli::set_option('version',0);
		\Oil\Command::init( $_SERVER['argv'] );
		
		$_SERVER['argv'] = array('oil','r','migrate');
		\Cli::set_option('version',null);
		\Oil\Command::init( $_SERVER['argv'] );
		
		ob_end_clean();
	
	}
```
弱点克服 Angularjs クライアントに処理させるということ

AngularJS はご存知有名jsフレームワークである。

最近 jsフレームワークが流行っているのは
【クライアント端末が一般的に高速に成ったから】
とされているわけだけど、、

あれだよね。
当たり前だけどいろんなアプリケーションを開いてると重くなっちゃうよねｗ

そんな弱点を克服するために
http://qiita.com/itoufo/items/52c4df4576675a7d4a76
を書いてみたんだけども、もう少し考察してみた。

# クライアント環境はピンキリ
最近のWEBサービス技術者で "マルチデバイス" を考えたことがない人はいないはず。

でもなにか違うの？って聞かれた時、模範的な解答は

- OS
- ブラウザ
- 画面サイズ

あたりだと思う。

これらを解決するのが結構な負担だったために、レスポンシブデザインやそれに対応するLibraryが充実してきたわけである。

ここで一つ思い出してみる、

- クライアント環境の処理速度

は重要でなかったのか？


...ぶっちゃけWEB界隈では重要ではなかったのだ。

# なんでもできるjsさん
従来からWEB技術者の仕事は表示用のデータを端末に配信するまで、後はブラウザさんにお任せしますね〜ってスタンス。

「処理が重い端末で心地よく動作させるには？」の解は「js処理を減らすかlightにしよう」ってだけの話。


ところがところが、新しい時代になった今js世界に革命機が訪れ、js on ブラウザでもなんか色々できるようになった。

- 通信
- ストレージ
- URLルーティング
- 本格的オブジェクト指向
- パッケージ管理
- 細かなビルド設定

さて、これらができるようになって、
 
- 従来ボトルネックとなっていた通信処理が非同期化できる！
- 割りとセキュアにデータを扱える！
- 開発環境が充実してきた！
- jsだけでも覚えれば色々できるぜ！
- ブラウザ依存減ってきた〜〜

って声がちらほらと。
js で何でもできる時代が来てしまったのだ〜

# クライアントで動作するということ
ここからが本題である。

上記のように、jsで色々やることには大きなメリットが有る。
でもこれだけは意識しておきたい。

`クライアント端末のCPUを使うことは WEB技術者にとってリスクが大きい`
ってこと

だって、
ユーザがブラウザをどう使ってるかわかんないんだもの
ネイティブアプリと違ってCPUとかメモリの面倒見れないんだもの
っていうかWEB技術者としてその辺の知見薄いんだもの


ざっくり言うと、特定の処理に特化しておいてあるサーバと何に使ってるかわからんクライアント端末のどっちに面倒な処理を任せるべきかって話。

# じゃあどうすればいいのよ？
## とりあえず Loading icon

とりあえず、下記のタイミングではloading iconを表示させておこう。
できればclickやscroll等のイベントも無効にしちゃおう。

- URL変更に伴うページ遷移時
- 通信時
- Directive が変化した時
- Direcvive を追加した時

二重処理のリスクは非同期処理につきもの。
細かくはこっち更新します
http://qiita.com/itoufo/items/52c4df4576675a7d4a76

## 実ユーザでベンチマーク
環境ごとにベンチマークをとっておきたいけど、めんどくさい。
ユーザ毎に待ち時間とかとる
※いつか書くさ、きっと書くさ

# 結論
jsフレームワークが流行っているからって、
jsが書き放題！とかjs万能！ってわけじゃない。

css文法だけでどうにかできるならその方がいいし、
サーバに任せられるとこは任せたほうがいい。

開発機では動いているからといって、
一般ユーザの端末で動くとは限らない。

ベンチマーク方法とか面倒だよね、、
考えとこ、、
IAMポリシー設定について


## 基本

* [ポリシーの構造 - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-policy-structure.html)
* [IAM ポリシー言語の文法 - AWS Identity and Access Management](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_grammar.html)


ARN について

* [Amazon リソースネーム（ARN）と AWS サービスの名前空間 - アマゾン ウェブ サービス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-ec2)

EC2インスタンスは以下の構文で表される

```
arn:aws:ec2:region:account-id:instance/instance-id
```

## 特定のEC2インスタンスに対する権限を設定する

* <a href="http://xoxo-infra.hatenablog.com/entry/2013/11/13/215850">IAMポリシーで特定のEC2インスタンスへの操作権限付与 - 雑多なインフラエンジニア日記</a>

* [aws - AWSでIAMのPolicyの設定で特定のインスタンス以外のインスタンスを閲覧できないようにしたい - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/12048/aws%E3%81%A7iam%E3%81%AEpolicy%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E4%BB%A5%E5%A4%96%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E9%96%B2%E8%A6%A7%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84)

結論として、「特定のインスタンス以外を閲覧させない」という設定はできない(ec2:Describe* APIアクションはリソースレベルのアクセス許可に対応していない）

ポリシーの Action で指定できるアクションは以下に定義されている

* [AWS Service Actions and Condition Context Keys for Use in IAM Policies - AWS Identity and Access Management](http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_actionsconditions.html)

リソースレベルのアクセス許可に対応しているAPIアクションは以下を参照

* http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html



## EC2のAPIアクション

* [ポリシーの構造 - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-policy-structure.html#UsingWithEC2_Actions)
* [Actions - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Operations.html)
* [IAMのEC2権限をまとめてみた « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2014/02/07/iam-ec2/)

## サンプル

* [AWS CLI、Amazon EC2 CLI、または AWS SDK で使用するサンプルポリシー - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html)
Windows10のコマンドプロンプトの機能で知らなかったことをメモっていく


# ディレクトリの移動

+ `cd <tab>`を使うことで現在のディレクトリにあるファイル・フォルダを１つずつ確認できる
+ **Linux**でいう**`ls`コマンド**（現在のディレクトリの一覧を表示するコマンド）は**`dir`**

# パッケージマネージャ Chocolatey

+ `cinst <パッケージ名>` or `choco install <パッケージ名>`で**パッケージのインストール**
+ `cuninst <パッケージ名>` or `choco uninstall <パッケージ名>`で**パッケージのアンインストール**
+ `choco list`で**インストールできるパッケージ一覧（全種）**
+ `choco list <検索ワード>`で**パッケージの検索**
+ `choco list -lo(cal)`で**インストール済みのパッケージ一覧**

# PHPのデバッグ・開発

+ `php <phpファイル名>`でデバッグ
+ `php -S localhost:8000`で簡易Webサーバが**8000番ポート**に起動するので、ブラウザからアクセスしてデバッグもできる

*順次追記予定*
UINavigationControllerでStatusBar設定を反映する

基本的にはViewControllerの`prefersStatusBarHidden`がtrueになっていれば良いのだけどUINavigationControllerの場合は上手く行かない場合がある。（恐らく一番上にあるUIViewControllerのステータスバー設定が反映させるために、UINavigationControllerの子ViewControllerは設定が上手く通らないのだと思う）

```swift:NavigationController.swift
class NavigationController: UINavigationController {
  private var statusBarStyle = UIStatusBarStyle.Default
  private var statusBarHidden = true
  
  override func viewDidLoad() {
    super.viewDidLoad()
    delegate = self
  }
  
  override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return statusBarStyle
  }
  
  override func prefersStatusBarHidden() -> Bool {
    return statusBarHidden
  }
}

extension NavigationController: UINavigationControllerDelegate {
  func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    statusBarStyle  = viewController.preferredStatusBarStyle()
    statusBarHidden = viewController.prefersStatusBarHidden()
    setNeedsStatusBarAppearanceUpdate()
  }
  
  func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
    statusBarStyle  = viewController.preferredStatusBarStyle()
    statusBarHidden = viewController.prefersStatusBarHidden()
    setNeedsStatusBarAppearanceUpdate()
  }
}
```

このようにしてpop/pushの際にそのViewControllerの設定を取得して反映させればおｋ
Xamarin FormsとReactiveUIでMVVMなハイブリッド？なアプリ開発するメモ

Xamarin Formsを使ってスマホアプリを作る中で
ビューとビューモデル間のBindingをするのに
ReactiveUIを使ったので、使い方をメモします

## 開発環境
  - OS
     * Mac OS X El Capitan
  - Xamarin環境
     * Xamarin Studio 5.10.2 (build 56)
     * Mono 4.2.2 
     * Xamarin Android Version: 6.0.1.10 (Indie Edition)
     * Xamarin iOS 9.4.2.27(Indie Edition)
  - ライブラリバージョンなど: Nugetパッケージからインストールします
     * Xamarin.Forms 2.1.0
     * reactiveui-xamforms 6.5.0
     * Rx 2.2.5
     * Splat 1.6.2

## サンプル
### ビューモデルの実装. 
  * ``ReactiveUI.ReactiveObject``を継承したTestViewModelクラスを作成
  * プロパティAttrを定義し、setter内で``RaiseAndSetIfChanged``を実行

```csharp
using ReactiveUI;

namespace Sample.ViewModels
{
    public class TestViewModel : ReactiveObject
    {
        #region properties
        private string attr= "";
        public string Attr { 
          get { return attr; }
          set { this.RaiseAndSetIfChanged(ref attr, value); } 
        }
        #endregion
    } 
```

### ビューの実装
  * ``ReactiveUI.XamForms.ReactiveContentPage``を継承したTestPageクラスを作成
     - 1.で定義した``TestViewModel``を型パラメータに指定します
  * ViewModelとViewのインスタンスをそれぞれ生成し、Bindメソッドを実行
     - ``ViewModel``プロパティにTestViewModelのインスタンスを設定
     - attrEntryというビューを生成
        * テキスト入力フィールドを表す``Xamarin.Forms.Entry``クラスを使用
     - TestViewModelの``Attr``プロパティとBindします
        * ビューで入力した値のビューモデルへの反映(及びその逆)が自動的に行われます

  * 注意
     - usingディレクティブで名前空間``ReactiveUI``がインポートが必要
       * これがないと下記のBindメソッドの定義が見つからずエラーになります

```csharp
using System;
using Xamarin.Forms;
using ReactiveUI;
using ReactiveUI.XamForms;
using Sample.ViewModels;

namespace Sample {
  
  public class TestPage : ReactiveContentPage<TestViewModel>
  {
    private Entry attrEntry;
    public TestPage() {
      // ViewModelを生成
      this.ViewModel = new TestViewModel();
      // 入力フィールドを生成
      this.attrEntry = new Entry {
        /*中略*/
      };
      
      // ViewModelとViewを双方向バインド
      this.Bind (
          ViewModel, vm => vm.Attr, v => v.attrEntry.Text
      );
      
      Content = new StackLayout {
        HorizontalOptions = LayoutOptions.FillAndExpand,
        VerticalOptions = LayoutOptions.Center,
        Children = {
          this.attrEntry
        }
      };
    }
  }
}

```

以上！
僕のためのデザインガイドライン



##1. 文字

###1-1フォントサイズ
####最小
欧文: 12px、和文: 13px

####本文
14px〜15px

####見出しなど
タイトル: 21px
サブタイトル: 17px
キャプション: 13px
ボタン: 15px


13px→15px→17px→21px→24px→34px→45px→56px→112pxの流れ

###1-2. 文字色
####白背景の場合
基本は **#212121**
キャプションのみ **#757575**
####黒背景の場合
基本は **#ffffff**
キャプションのみ **#b3b3b3**

####比率
文字色と背景色の輝度を「4.5:1」以上の比にする


###1-3. 行長
####欧文
本文: 60字以内
見出し: 40文字以内

####和文
本文: 32字以内
見出し: 24文字以内

###1-4. 字間
文字が小さいほど字送りは広く、大きいほど狭くさせ、相対的に変化させる。
大きな文字は狭く（-5～-10）、小さい文字は広く（+5～+10）


###1-5. 書体

書体の種類、ウエイトはできるだけ少なく。
できれば **1種類** で統一する

##2. ボタン

###2-1. サイズ

タッチ領域は縦48px×横48px
基準は縦58px×横58px以上

###2-2. 形
一般的な形状で、種類は3つ以内にする
フラット（文字のみ）
ライズド（長方形）
フローティングアクション（円形）


###2-3. 装飾

最低限の装飾に留める。
立体表現やグラデーションなどの使いすぎには注意。


###2-4. マージン
ボタン同士は16px以上の間隔をあける

###2-5. ラベル

シンプルな動詞を使う


###2-6. 配置

目的を達成するボタン（「確認」や「実行」）を右側
行動を取り消すボタン（「キャンセル」「クリア」など）を左側に置くのが基本

##3. 配色

###3-1. 原則

色を多用せず、基本色は **2色** 以内におさめる。
プライマリカラーとセカンダリカラーの2色を選び、さらにその各色から3色相を選ぶ。

###3-2. コントラスト

前景色と背景色の輝度を「4.5:1」以上にする


##4. アイコン

###4-1. 形

判別のできるシンプルなもの。

###4-2. 色

色に意味がある場合を除いて、基本は単色にする。

###4-3. サイズ

24 x 24 px～50 x 50 pxの間


##5. その他

###5-1. イメージ

**「画像は飾りではなくツールである」**
必然性のある自然で具体的な画像のみ


###5-2. レイアウト

左上が起点。グルーピングと階層化を活用。
**8**で割り切れる数字でのグリッドを意識。


##まとめ
デザインの知識乏しいし、とりあえずガイドラインに沿って進めるのが無難だという意識低めの精神です。


##参考文献
**UI設計の基本事項**
https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/BasicsPart/BasicsPart.html#//apple_ref/doc/uid/TP40006556-CH2-SW1

**Google Design**
https://design.google.com/


**Appleとgoogleのデザインガイドライン比較～スマートフォン向けwebデザインのポイント～**
http://www.slideshare.net/arasunatomoyuki/applegoogleweb-50201232?ref=http://baigie.me/sogitani/2015/07/apple-google-design-guideline/
css 重なり z-index 効かない 解決法

#cssでz-indexが効かないの事態を解決する方法

cssにて、position: relative; を追記する。

```
.class1{z-index:0;
       　position: relative;}

.class2{z-index:1;
        position: relative;}
```

参考：[http://cafe.76bit.com/creative/web-design/2259/ z-index が効かない！入れ子でも階層構造でもz-indexを効かしてデザインしたい！]
(http://cafe.76bit.com/creative/web-design/2259/)
検索条件の組み合わせを導き出す良い公式は無いものか

５つの検索条件があるとして、そのテストをすることを考えると下記の31通りのパターンがあり、それに対して該当があるなしを確認しないといけません。SELECTのテストは結構大変。

## 1件だけ

A,B,C,D,Eの5通り

## 2件

- A-B,A-C,A-D,A-E
- B-C,B-D,B-E
- C-D,C-E
- D-E

合計10通り

## 3件

- A-B-C,A-B-D,A-B-E
- A-C-D,A-C-E
- A-D-E
- B-C-D,B-C-E,
- B-D-E
- C-D-E

合計10通り

## 4件

- A-B-C-D
- A-B-C-E
- A-B-D-E
- A-C-D-E
- B-C-D-E

合計5通り

## 5件

- A-B-C-D-E

合計1通り

## まとめると31個の組み合わせがある

| 1件 | 2件 | 3件 | 4件 | 5件 |
|:---:|:---:|:---:|:---:|:---:|
| 5 | 10 | 10 | 5 | 1 |

絶対にうまいこと数式化出来る気がする。不動産の検索条件とか鬼のようにあるし。

数学に詳しい方に届け〜
Thor でサブコマンドを作らず利用したい

Thor はユーティリティも豊富で cli を作るときに使うと便利なので、サブコマンド無し(thor 自体はサブコマンドが割と前提の作り)でも使いたい。

そんなときは default_command でメインとなるコマンドを指定する。

```ruby
require 'thor'

class Mycommand < Thor
  default_command :foo
  desc "foo", "foo is my default_command"
  def foo
    puts 'hello foo'
  end
end

Mycommand.start
```

```
$ ruby mycommand.rb
hello foo
```

しかしこれだと help がダメ。

```
$ ruby mycommand.rb -h
Commands:
  mycommand.rb foo             # foo is my default_command
  mycommand.rb help [COMMAND]  # Describe available commands or one specific command
```

ううっ。ソースコードをざっと見た感じ、うまいやり方が無いので無理矢理 help() をオーバーライドすれば使える。

```ruby
require 'thor'

class Mycommand < Thor
  default_command :foo
  desc "foo", "foo is my default_command"
  def foo
    puts 'hello foo'
  end

  def help(*args)
    self.class.command_help(shell, @default_command)
  end
end

Mycommand.start
```

```
$ ruby mycommand.rb -h
Usage:
  mycommand.rb foo

foo is my default_command
```

うーん。
Elixirのdefmacro内の__MODULE__はどのモジュールを指しているのか

Elixirのdefmacro内のコードには`__MODULE__`というマクロが頻出しますが、これが「マクロが定義されているモジュール」を指しているのか、それとも「マクロを呼び出しているモジュール」を指しているのか、ちょっと分かりにくいので下記のように実験してみました。

```ex
defmodule A do
  defmacro __using__(_opts) do
    IO.inspect "__MODULE__ = #{__MODULE__}"
    IO.inspect "unquote(__MODULE__) = #{unquote(__MODULE__)}"
    quote do
      IO.inspect "__MODULE__ = #{__MODULE__}"
      IO.inspect "unquote(__MODULE__) = #{unquote(__MODULE__)}"
      @before_compile unquote(__MODULE__)
    end
  end
  defmacro __before_compile__(env) do
    IO.inspect "env.module == #{env.module}"
  end
end

defmodule B do
  use A
end
```

iex上での実行結果は下記のようになります。

```ex
"__MODULE__ = Elixir.A"
"unquote(__MODULE__) = Elixir.A"
"__MODULE__ = Elixir.B"
"unquote(__MODULE__) = Elixir.A"
"env.module == Elixir.B"
```

要するに、defmacro内のquote式内で`__MODULE__`と書いた場合のみ呼び出し側のモジュールが参照され、それ以外の場合はマクロが定義されているモジュールが参照される、ということになるようです。

attributeを操作する関数(`Module.register_attribute`等)を使う場合は「呼び出し側のモジュール」を参照する必要がありますが、それ以外は基本的に「マクロが定義されているモジュール」を参照するケースの方が多いと思いますので、「基本的にはunquote(\_\_MODULE\_\_)を使う、attributeを操作するときだけ\_\_MODULE\_\_を使う」というような覚え方でも良さそうな印象です。
`carrierwave_backgrounder`で`NameError (uninitialized constant CarrierWave::Workers::ProcessAssetMixin)`がでる

解決策

```ruby:Gemfile
gem 'carrierwave_backgrounder'
```
 ↓
 
```ruby:Gemfile
gem 'carrierwave_backgrounder', github: 'lardawge/carrierwave_backgrounder'
```


https://github.com/lardawge/carrierwave_backgrounder/issues/235 より

もし古いバージョンのRailsを使っていて`mime-types` gemのバージョンが解決できない場合は以下のRefをつける

```ruby:Gemfile
gem 'carrierwave_backgrounder', github: 'lardawge/carrierwave_backgrounder', ref: 'bff7bc3954b9184157812f948b9a6a4f64ff36d3'
```
iOSアプリの開発を始めた時に戸惑った用語

iOSアプリの開発を始めた時に戸惑った用語について調べた時のメモです。同じような人の助けになれば。
(自分で使ったことのあるものしか書いてないです・・・)

情報が増えたら追記するかもです。

# 証明書の種類
## iOS App Development
開発用証明書。Xcodeでデバッグ実行したり、Webインスペクタを利用したい場合はこの証明書で作ったプロビジョニングプロファイルを使用する。

## App Store and Ad Hoc
配布用証明書。App Storeへ公開したり、Ad Hocアプリを作成して配布する場合はこの証明書で作ったプロビジョニングプロファイルを使用する。Ad Hocアプリというのは、事前に登録した端末のみ利用可能なアプリ。

# プロビジョニングプロファイルの種類
## iOS App Development
開発用プロビジョニングプロファイル。XcodeでのデバッグやWebインスペクタを利用する時に利用する。

## App Store
App Store公開用プロビジョニングプロファイル。

## Ad Hoc
Ad Hocアプリ作成用プロビジョニングプロファイル。

# 開発用契約の種類
## Apple Developer Program(旧：iOS Developer Program)
App Storeへアプリを公開するための契約。

## Apple Developer Enterprise Program(旧：iOS Developer Enterprise Program)
社内業務で利用するアプリを開発するための契約。App Storeへの公開はできない。
旧名のイニシャルでiDEPと呼んだり、インハウス版と呼んだりする。

# 開発補助ツール
## Webインスペクタ
Mac版SafariのWebコンテンツデバッガーのこと。
MacとiOS端末を繋ぐと、Mobile Safari以外に、UIWwebViewやWKWebViewで開発しているアプリでも利用できます。
※iOS端末でWebインスペクタを有効にする必要があります

# iOS関連用語
## 構成プロファイル
iOS端末の構成情報(機能制限など)をまとめたファイルのこと。

## Webクリップ
Webコンテンツへのショートカットリンクのことです。
iOS端末のホーム画面に生成されます。
jo すごいよ jo

[mattn さんのツイート](http://mattn.kaoriya.net/software/20160309091404.htm)で知った [`jo`](https://github.com/jpmens/jo) が便利そうだったので速攻で導入しました。
これを使えば、CLI で JSON 文字列を生成するのがずいぶん楽になりそう！！
そして例によって [AlpineLinux](/pottava/items/970d7b5cda565b995fe7) で [Docker 化した](https://hub.docker.com/r/pottava/jo/)（転送量: 5MB）ので
Docker さえ動いていればどんな環境でも使えます。

おもむろに `.bash_profile ` やらにエイリアスを定義。

```sh:alias
echo 'alias jo="docker run --rm pottava/jo"' >> ~/.bash_profile
source ~/.bash_profile
```

これだけで `jo` れます

```sh:jo
jo -p $(env)
jo -p -a spring summer fall winter
jo time=$(date +%s) dir=$HOME
```

mattn さんのブログにあるコマンドもちゃんと通ります。

```sh:nested
$ jo -p name=JP object=$(jo fruit=Orange hungry@0 point=$(jo x=10 y=20) number=17) sunday@0
{
   "name": "JP",
   "object": {
      "fruit": "Orange",
      "hungry": false,
      "point": {
         "x": 10,
         "y": 20
      },
      "number": 17
   },
   "sunday": false
}
```

すごくよさそう〜
JobSchedulerEngineでハマったこと

# firewall-cmdからポート4444をremoveしてもアクセス可能

* やった事
 * JobSchedulerEngine単体でGUIに認証をかける設定を見つけられなかったので、nginxのリバースプロキシ＋nginxでBASIC認証を設定。
* 事象

リバプロの設定後に

> firewall-cmd --permanent --remove-port=4444/tcp
> firewall-cmd --reload

としたが、相変わらずポート4444でのhttpアクセスが可能。

* 原因
 * インストール時に指定した`<entry key="schedulerAllowedHost" value="0.0.0.0"/>`が`~/sos-berlin.com/jobscheduler/scheduler/config/scheduler.xml`に残っていた。
 * これがあるとfirewall-cmdの設定にかかわらずポートを開けるらしい。
Googleカレンダー設定もろもろ

#朝と夜を非表示
![スクリーンショット 2016-03-10 13.00.27.png](https://qiita-image-store.s3.amazonaws.com/0/114923/812e2d42-03b4-bc5e-245e-98b4e41e3117.png)

1. 設定を押す
2. Labsを押す
 ![スクリーンショット 2016-03-10 13.00.52.png](https://qiita-image-store.s3.amazonaws.com/0/114923/ecfd18d7-5f78-08e1-8ec7-6e4ba1081535.png)

3. 「朝と夜を非表示」を有効にして、保存
![スクリーンショット 2016-03-10 13.00.43.png](https://qiita-image-store.s3.amazonaws.com/0/114923/aecc2d74-5a01-79bf-b7f8-54a771c11298.png)
4. カレンダー左側の灰色の部分で非表示領域を調整
![スクリーンショット 2016-03-10 13.06.53.png](https://qiita-image-store.s3.amazonaws.com/0/114923/01b1773d-2670-184e-bd14-8b6da9e08e25.png)
このつまみを調整する。
![スクリーンショット 2016-03-10 13.07.21.png](https://qiita-image-store.s3.amazonaws.com/0/114923/1f20b59e-e621-1faf-4b46-c301aaa55b5c.png)
ユーザの24時間表示の設定を取得する

```swift
let _24 = (NSDateFormatter.dateFormatFromTemplate("HH", options: 0, locale: .currentLocale())!.rangeOfString("a") == nil)
```
つらい。
どうやら `NSLocale.currentLocale()` には24時間表記かどうかの情報が含まれているっぽいのだが、APIが生えていない。

日本語設定の時に、12時間表示か24時間表示かを取得して、
`16:32` と `4:32 PM` を切り替えたいだけなのに。
`16:32` と `午後4:32` なら簡単なのになぁ。

`NSDateFormatter.dateFormatFromTemplate("HH:mm", options: 0, locale: .currentLocale())` で取っちゃうと、
`"aK:mm"`になるから、`PM4:32`になっちゃう。

結局こう。

```swift
let locale = NSLocale(localeIdentifier: "en_US")
formatter.locale = locale
let _24 = (NSDateFormatter.dateFormatFromTemplate("HH", options: 0, locale: .currentLocale())!.rangeOfString("a") == nil)
formatter.dateFormat = _24 ? "H:mm" : "K:mm a"
```

なんかかっこ悪いなぁ。
vagrant-proxyconfをマニュアルインストール

1.vagrant plugin installで入れられない

```bash
Installing the 'vagrant-proxyconf' plugin. This can take a few minutes...
The plugin 'vagrant-proxyconf' could not be found in local or remote
repositories. Please check the name of the plugin and try again.
```

 => なので[ここ](https://github.com/tmatilai/vagrant-proxyconf/issues/48)を参考にマニュアルインストールを行う

2.git clone

```bash
git clone https://github.com/tmatilai/vagrant-proxyconf
cd vagrant-proxyconf
```


※途中rubyのversion問題でコケてrbenvでversionアップ対応しようとしたらversionアップでつまった・・
[こちら](https://github.com/sstephenson/ruby-build/wiki#make-error-for-200-p247-and-lower-on-fedorared-hat)を参考にパッチを当てて解決

3.bundle install
 => bundleが入ってなかったのでインストール(proxy環境下)

```bash
 sudo gem install bundler --http-proxy http://<proxy_host>:<proxy_port>
```


4.再びbundle install

```bash
bundle install
```

5.bundle exec rake buildでビルド

```bash
bundle exec rake build
```

6.vagrant plugin installでインストール

```bash
vagrant plugin install pkg/vagrant-proxyconf*.gem
```
underscoreコードリーディング（isString）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isStringとは


###[underscorejs.orgのisString](http://underscorejs.org/#isString)

こんな説明。
>####_.isString(object) 
Returns true if object is a String.

```javascript
_.isString("moe");
=> true
```

------------- 
objectがStringだった場合trueを返します

###[underscore.isString](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1218)
コード的にはこのあたり。

```javascript
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });
```

引数はobj
toString.call(obj)した結果が[object String]と合致した場合はtrueを返す
Google Cloud SDKをインストール（CentOS5 & 6）

* Google Cloud SDKではPython2.7が必要だが
* CentOS6ではpython2.6がインストールされているので2.7をインストールする必要がある。
* CentOS5でも同様だが少し追加の設定が必要だった

## インストール

### python2.7インストール

* CentOS5,6ではpython2.7が入っていないのでインストールして使えるようにする

```
yum install zlib-devel openssl-devel bzip2-devel
cd /usr/local/src/
wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
tar xvzf Python-2.7.11.tgz
cd Python-2.7.11
./configure --prefix=/usr/local
make
make altinstall
※バージョンを確認する
python2.7 -V

cd /usr/local/bin/
ln -s -i python2.7 python
ln -s -i python2.7-config python-config
※バージョンを確認する
python -V
```

※yumコマンドに影響が出ていないか念のため確認

### gcloudインストール

* 使いたいユーザになって

```
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud --version

Google Cloud SDK 100.0.0

bq 2.0.18
bq-nix 2.0.18
core 2016.03.04
core-nix 2016.02.05
gcloud 
gsutil 4.17
gsutil-nix 4.15
```

### CentOS5では

```
$ curl https://sdk.cloud.google.com | bash 

Welcome to the Google Cloud SDK!
  File "/home/ユーザ/google-cloud-sdk/bin/bootstrapping/install.py", line 110
    to_install = (override_components if override_components is not None
                                       ^
SyntaxError: invalid syntax
```

のようなエラー（python2.4を使ってしまいエラー？）なので

```
which python2
  /usr/bin/python2
cd /usr/bin/
ln -s -i /usr/local/bin/python2.7 python2
```
後、再度gcloudインストール
linux > How to auto run python script > v0.3

This article is for my hackaday.io project (BYOP).
https://hackaday.io/project/9526-bring-your-own-pizero-byop

## About

How to auto run python script.

There are several ways to auto run python script.

Here's one way to do that.

## setup /etc/rc.local

```Environment
Raspberry Pi2 + raspbian
```

Setup by following http://qiita.com/7of9/items/ec9e38f84bc4351c5ee3


With root priviledge, add following lines to auto-run python script:

```
## for FileMessenger
cd /home/pi/python-160227-FileMessenger
nohup ./FileMessenger.py &

## for BYOP:Bring your own PiZero
cd /home/pi/python-160224-BYOP-main/
nohup ./BYOP-main.py &

exit 0
```

After the restart of the Raspberry Pi, you can check the scripts running by ps command.

BYOP-main.py will be automatically finished. So, ps command may not show the BYOP-main.py depending on the time.

```
pi@raspberrypi ~ $ ps aux | grep 15
...
root       560  0.1  0.6  10348  5936 ?        S    08:40   0:00 python ./FileMessenger.py
...
```
python > coding guide > PEP 0008 -- Style Guide for Python Code

http://qiita.com/7of9/items/a6df8041991d8e3227df#comment-24841076230d3749572c
にて紹介いただいたpythonの coding guide のリンクを以下に示す。

https://www.python.org/dev/peps/pep-0008/#programming-recommendations
CentOS6.7でChainerをインストール

簡単だと聞いていたわりにかなり時間がかかったので、
参考にしたページをメモします。

ちなみに自分の環境は：
・グラボ：NVIDIA TITAN Z
・OS:CentOS 6.7
・python:2.7.8
・chainer:1.7.0
・cuda:7.5
こんな感じです。

・Chainerの公式HP
（まずはここから。）
http://docs.chainer.org/en/stable/install.html

・CUDA7.5のインストール
（CentOS6と7でランレベルの変更方法が異なる点に注意。
　でもランレベルの変更が今回必要だったかは自信がありません。）
https://www.softek.co.jp/SPG/Pgi/TIPS/public/accel/cuda75_install.html

・CuDNNの設定
（includeとlibにファイルを手でコピーする必要がありました。）
http://takatakamanbou.hatenablog.com/entry/2015/08/25/120326

・CentOS6でのTIPS
（gccのバージョンが古いと、GPUで計算できないようです。）
http://qiita.com/naoh16/items/2693645ab2733faf1aa5
　→そのままではうまくいかなかったので、wgetの手順を試してみたらうまくいきました。
　http://www.task-notes.com/entry/20151114/1447492231

・chainer1.5のTIPS集
（いろいろ環境変数の設定が必要です。）
http://qiita.com/unnonouno/items/c491b6df59352159cbf0
AWS Identity and Access Management (IAM)を理解するためのドキュメント

AWS Identity and Access Management (IAM) は、グループやユーザー、ロールや各AWSサービスに対してアクセス権限を制御するための仕組みです。
IAM の利用自体が課金対象になることはありません。
IAM を理解するには IAM アイデンティティを理解することが必要です。
IAMアイデンティティにはIAMユーザー、IAMグループ、IAMロール、IAMポリシーがあります。
この中で、アクセス権限そのもの定義はIAMポリシーで行います。
IAMポリシーには管理ポリシーとインラインポリシーがあります。
さらに、管理ポリシーにはAWS管理ポリシーとカスタマー管理ポリシーがあります。
AWS管理ポリシーはAWSが作成および管理する管理ポリシーです。
カスタマー管理ポリシーはAWSアカウントで作成および管理する管理ポリシーです。カスタマー管理ポリシーは、AWS 管理ポリシーに比べ、より正確にポリシーを管理できます。
インラインポリシーは自身で作成および管理するポリシーです。
各IAMポリシーにはポリシードキュメントがあり、それに具体的なアクセス権限に関する記述を行います。
IAMポリシーの概要については、http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html に書いてあります。
ポリシードキュメントはポリシーエレメントで記述しますが、主要なポリシーエレメントはResource, Action, Effectです。
Resourceで何に対して、Actionでどんなアクションを、Effectで許可するのか禁止するのかをそれぞれ定義できます。
ポリシーエレメントの詳細については、http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements.html に書いてあります。
IAMではポリシーをグループ、ユーザー、ロールに対してアタッチすることでアクセス権限を管理します。
ポリシーをグループにアタッチし、そのグループにユーザーを所属させることで、複数のユーザーに同一のアクセス権限を付与するというのが一般的な使用方法っぽいです。
もちろん、個別のユーザーにポリシーをアタッチすることも可能です。
また、IAMにはロールという概念があります。
これは、一時的なアクセス権限や、グループに所属しているけど、特定のユーザーにだけ特別なアクセス権限を付与したいときなどに使用されるらしいです。
ほかにも、あるAWSサービスでアクセス権限を管理したいときにロールを使用するといったユースケースもあります。
phantomjsとselenium

# javascriptに対応する

## 備考
- Debian wheezy

- Selenium
- Phantom.js
- PyVirtualDisplay

## インストール
単純にSeleniumとPhantom.jsをインストールしてテストするがエラーも何も出ず実行もされていない様子

Phantom.jsのみ実行するとエラーに
```
phantomjs QXcbConnection Could not connect to display
```

デスクトップも入っていない環境なのでそもそも描画すらできないために出た模様。
調べると以下が見つかる

[Python - Taking Browser Screenshots With No Display (Selenium/Xvfb)](http://coreygoldberg.blogspot.jp/2011/07/python-taking-browser-screenshots-with.html)

xvfbとPyVirtualDisplayをインストールして正常にphantom.jsが動くようになったことを確認。pythonからPyVirtualDisplay経由でも問題なし。

Phantom.jsはDebianでもaptに上がっていた
[phantomjs_2.1.1](https://packages.debian.org/sid/amd64/phantomjs/download)

適当に環境作っているのでいいかげん汚くてしょうがない。
pyenvかコンテナを使った方がいいのか。
AndroidStudioでのJavaDocの記述と生成

# JavaDocの記述

## [JavaDoc(intellij-javadocs)](https://github.com/setial/intellij-javadocs/wiki)プラグインをインストールする
1. Android Studio > Preferences > plugins > Browse repositories...
1. 検索窓に`JavaDoc`と入力 > JavaDocをインストール

### JavaDocプラグインのショートカット

* To generate javadocs for active element press "shift + alt + G".
* To generate javadocs for all elements in current java file press "shift + ctrl + alt + G".
* Remove javadocs on current/selected element: "shift + alt + Z"
* Remove javadocs on all elements of current class: "shift + ctrl + alt + Z"


# JavaDocの生成

app/build.gradleに以下を追記する

```java
// app/build.gradle:

project.ext {
    if (android.hasProperty('applicationVariants')) {
        androidVariants = android.applicationVariants
    }else if (android.hasProperty('libraryVariants')) {
        androidVariants = android.libraryVariants
    }
}
project.androidVariants.all { variant ->
    task("javadoc", type: Javadoc, overwrite: true) {
        title = "YOUR_APP_NAME"
        source = variant.javaCompile.source
        ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)

        options {
            links("http://docs.oracle.com/javase/jp/7/api/");
            linksOffline("http://d.android.com/reference", "${android.sdkDirectory}/docs/reference")
            setMemberLevel(JavadocMemberLevel.PUBLIC)
            docEncoding = 'UTF-8'
            encoding = 'UTF-8'
            charSet = 'UTF-8'
        }

        exclude '**/BuildConfig.java'
        exclude '**/R.java'
    }
} 
```

ターミナルで以下のコマンドを実行する

```
### 環境変数を設定
# java 1.6を使用する
$ export JAVA_HOME=`/usr/libexec/java_home -v 1.6`

# 以下は必要なら行う
$ export ANDROID_DAILY_OVERRIDE=4a50f93953bc93b160920b1956a20e4942372a86

# javadocを生成
$ gradlew javadoc

# javadocを開く
$ open app/build/docs/javadoc/index.html
```

# 参考

- [AndroidのJavaDocをgradleで生成する](http://osa030.hatenablog.com/entry/2015/06/03/183247)
githubからファイルを直接ダウンロード

Github限定ですが、レポジトリの中から特定のファイルだけをHTTPでダウンロードするコマンドを作ってみました。
レポジトリの中の1ファイルだけダウンロードしたい場合に使えます。
1ファイルが100MBまでダウンロードできます。

https://gist.github.com/wf9a5m75/56cdb6a297d38aaa6440

# 準備

Githubの**Personal access token**を事前に作成しておきます。
https://github.com/settings/tokens

![Screen Shot 2016-03-09 at 6.15.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/39529/962b89e1-94d3-c489-29b1-8780a619bc65.png)

# ファイルをダウンロード

```shell-session
$ git clone https://gist.github.com/56cdb6a297d38aaa6440.git
もしくは
$ curl https://gist.githubusercontent.com/wf9a5m75/56cdb6a297d38aaa6440/raw/f5af8da3424b9a0df407125cb69d6355e6c0f19a/filedownload.sh -O 
```

環境変数として、`~/.profile`に以下を追加します。

```shell-session
export GITHUB_ACCESS_TOKEN="<YOUR PERSONAL ACCESS TOKEN IS HERE>"
export GITHUB_USERNAME="<YOUR GITHUB ACCOUNT NAME>"
export REPO_OWNER="<REPOSITORY OWNER NAME>"
```

# 使い方1

```shell-session
./filedownload.sh "レポジトリ名" "ファイルパス"
```

例えば `MyRepository`というレポジトリから、`tools/bin/stericson.busybox-1.23.2.apk`をダウンロードします。

```shell-session
$ ./filedownload.sh MyRepository tools/bin/stericson.busybox-1.23.2.apk
---DONE
```

これで`stericson.busybox-1.23.2.apk`がローカルにできているはずです。

# 使い方2

githubのblobのURLを直接渡すことも出来ます。

```shell-session
$ ./filedownload.sh https://github.com/MyName/MyRepository/blob/tools/bin/stericson.busybox-1.23.2.apk
```

# 何が嬉しいの？

`pssh`コマンドと合わせて使うとハッピーになれます。

```shell-session
$ pssh -h hosts.txt --inline-stdout  -t 0 "filedownload.sh https://github.com/MyName/MyRepository/blob/tools/bin/stericson.busybox-1.23.2.apk"
```
Sinon.JS で存在しない環境変数を stub すると Error になる

# 問題

[Sinon.JS v1.17.3](https://github.com/sinonjs/sinon/tree/v1.17.3) で発生する。

```js
// before
const apiKey = 'xxx'; // ダミーの値
const sandbox = sinon.sandbox.create();
sandbox.stub(process.env, 'API_KEY', apiKey); // 存在しない環境変数 API_KEY (`process.env.API_KEY`) を apiKey で stub したい
//=> TypeError: Cannot stub non-existent own property API_KEY

// after
sandbox.restore(); // 元に戻す
```

# 解決策

ひとまず強引に `null` を代入して回避した。この方法だと `null` が戻されてしまうため、厳密には誤りがある。`delete` するほうが良いが、実害はないので、この方法で対応している。

```js
// before
const apiKey = 'xxx'; // ダミーの値
const sandbox = sinon.sandbox.create();
if (!process.env.hasOwnProperty('API_KEY')) process.env.API_KEY = null; // この行を追加し、強引に対応。
sandbox.stub(process.env, 'API_KEY', apiKey);

// after
sandbox.restore(); // 元に戻す
```

Sinon.JS での実装については source code を参照。

https://github.com/sinonjs/sinon/blob/v1.17.3/lib/sinon/collection.js#L92-L94

# 補足

個人的には勝手に追加して `delete` してくれると嬉しいので、Pull Request してみたい。
gulpでSCSSのパーシャルがエラー

gulpでscssをコンパイルしたときに、パーシャルのscssがエラーになっておかしくなった

gulp-minify-cssが影響しているらしい

@import　の書き方を
@import url('_xxx.scss');
↓
@import "_xxx.scss" ;

にしたら解決
YosemiteのISOイメージを作成

# 手順
インストーラーが存在しない場合は、App Storeで事前にダウンロードしておいてください。

1.インストール用イメージをマウント

```bash
$ hdiutil attach /Applications/Install\ OS\ X\ Yosemite.app/Contents/SharedSupport/InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/install_app
```

2.インストールイメージ内のBaseSystem.dmgをスパースイメージに変換

```bash
$ hdiutil convert /Volumes/install_app/BaseSystem.dmg -format UDSP -o /tmp/Yosemite
```

3.スパースイメージのディスクサイズを8GBまで拡張

```bash
$ hdiutil resize -size 8g /tmp/Yosemite.sparseimage
```

4.スパースイメージをマウント

```bash
$ hdiutil attach /tmp/Yosemite.sparseimage -noverify -nobrowse -mountpoint /Volumes/install_build
```

5.パッケージ一覧をYosemiteのものに差し替え

```bash
$ rm /Volumes/install_build/System/Installation/Packages
$ cp -rp /Volumes/install_app/Packages /Volumes/install_build/System/Installation/
```

6.ブータブルイメージにするため、BaseSystem.dmgとBaseSystem.chunklistをスパースイメージのルートにコピー

```bash
$ cp /Volumes/install_app/BaseSystem.dmg /Volumes/install_build/
$ cp /Volumes/install_app/Basesystem.chunklist /Volumes/install_build/
```
7.インストール用イメージとスパースイメージをアンマウント

```bash
$ hdiutil detach /Volumes/install_app
$ hdiutil detach /Volumes/install_build
```
8.イメージサイズを、8GB固定から実サイズまでストレッチ

```bash
$ hdiutil resize -size `hdiutil resize -limits /tmp/Yosemite.sparseimage | tail -n 1 | awk '{ print $1 }'`b /tmp/Yosemite.sparseimage
```
9.スパースイメージをISOイメージへ変換

```bash
$ hdiutil convert /tmp/Yosemite.sparseimage -format UDTO -o /tmp/Yosemite
```
10.スパースイメージを削除

```bash
$ rm /tmp/Yosemite.sparseimage
```

以上です。
Mamp Proで.htmlでphpを動かす


Mamp Proで.htaccessに.htmlでPHPを動かせるようにしていたが、Mamp Proでは動かなかった。

```.htaccess
AddHandler application/x-httpd-php .php .html
```

## 症状
- PHPは読み込まれているが、表示されない
- .htaccess自体は読み込まれている（変更すると500になる）

## 回避方法
/Application/MAMP/conf/apache/httpd.confの138行目を下記のように修正し、MampのPHPのモードを「すべてのホストに同じPHPバージョンを使用（モジュール）」にすると動くようになる。

```/Application/MAMP/conf/apache/httpd.conf
AddType application/x-httpd-php .php .phtml .html .htm
```

CGI版で動かす方法をご存知でしたら、教えてください。

参考：[MAMP htmlでphpを動かす](http://qiita.com/TetsuTaka/items/0e97ee47fd0ac439861d)
makeでビルドするCライブラリをBITCODE対応する

xcodeを使ってビルドする時は情報があったのですが、Makefileでビルドする
CやC++のライブラリについてbitcode対応をどうやってするか意外とはっきりとやり方が書かれているものがなかったので、記録として残しておきます。

といってもやることはほぼなくて、

`CFLAGS` 的なものに `-fembed-bitcode` を追加すればおk。


また、うまくbitcodeが入っているかチェックするには

`otool -l libXXX.a | grep bitcode`

を叩いて

> sectname __bitcode
> sectname __bitcode
> ...
> sectname __bitcode
> sectname __bitcode

みたいなのが出ていれば大丈夫のようです。


#### 参考にしたもの：

- https://gist.github.com/steipete/ce09ba176a4b8ef66b2d
- http://stackoverflow.com/questions/32755775/how-to-check-a-static-library-is-built-contain-bitcode
Qt4のソースをQt5に移管するときの修正点

・プロジェクトファイル
Qt4
`#QT       += core gui`
Qt5
`QT += core gui network webkitwidgets`
`greaterThan(QT_MAJOR_VERSION, 4): QT += widgets`

・QtGui/QApplication
`//#include <QtGui/QApplication>         // Qt4`
`#include <QtWidgets/QApplication>       // Qt5`

・QGraphicsView
`//#include <QGraphicsView>              // Qt4`
`#include <QtWidgets/QGraphicsView>      // Qt5`

・QDialog
`//#include <QDialog>            // Qt4`
`#include <QtWidgets/QDialog>    // Qt5`

・QGraphicsRectItem
`//#include <QGraphicsRectItem>          // Qt4`
`#include <QtWidgets/QGraphicsRectItem>  // Qt5`

・QWidget
`//#include <QWidget>            // Qt4`
`#include <QtWidgets/QtWidgets>  // Qt5`

・QMouseEvent::posF
`//drawRectTo(event->posF());        // Qt4`
`drawRectTo(event->localPos());      // Qt5`

・アプリ配布
Qt5でWindowsアプリを配布するときはexeと同じ場所に
platformsフォルダ
　├ qminimal.dll
　└ qwindows.dll

参考1：http://qiita.com/yasumodev/items/b304966f6999fbea920d
参考2：http://www.kohgakusha.co.jp/support/qt/
解凍圧縮用のjavaライブラリを調査

# 要求
* MUST
    * ファイルを解凍圧縮できること
    * windows, Linuxの環境に、実行できること
* WANT
    * 階層構造でファイルを圧縮できること
    * 実装コスト低い


# ざっくり調査
* http://stackoverflow.com/questions/9324933/what-is-a-good-java-library-to-zip-unzip-files

# 比較

| ライブラリ名 | google検索数 | stackoverflow検索数 |ライセンス|階層構造で圧縮|更新(mvnrepository)|
|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|
| [zip4j](http://qiita.com/fukuramikake/items/43a1453175ea2bd93097)   | 約 25,100 件 |     207 results     |Apache 2.0|?|Dec, 2013|
| [Apache Ant(zip tool)](http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/api/overview-summary.html)     |      約 525,000 件 |    589 results    |Apache 2.0|×|Jun, 2015|
| [zt-zip](https://github.com/zeroturnaround/zt-zip)| 約 496,000 件 |  16 results     |Apache 2.0|○|Dec, 2015|
| [java.util.zip](http://docs.oracle.com/javase/8/docs/api/index.html)| 約 417,000 件 |  194 results    |-|×|2015(java8)|


# 結果

* zt-zip
    * 階層構造対応できて、実装コスト低い
    * 最近の2年間に、更新が多い
    * http://stackoverflow.com/questions/15968883/how-to-zip-a-folder-itself-using-java
    * https://github.com/zeroturnaround/zt-zip/tree/master/src/test/java/example

* 予備用
    * Apache Ant(zip tool)
    * java.util.zip
pythonのmilkcocoa SDKで数時間で通信エラー

# 概要

3時間ほど経過すると、下記のような例外を吐いて止まってしまう。。
モバイルルータの問題なのかlinuxのWifiの設定なのかpythonのコードの問題なのかが切り分けられないのだけど、似たような報告↓があるので既知の問題を踏んでいる？

pythonでsendを使ってデータ送信を行う際のエラーについて
https://teratail.com/questions/21990

## 例外
```
  File "/home/t/servo/hat/Adafruit-Raspberry-Pi-Python-Code/Adafruit_PWM_Servo_Driver/python_sdk/milkcocoa/milkcocoa.py", line 63, in connectWithApiKey
    return Milkcocoa(app_id, "k" + key + ":" + secret, useSSL=useSSL, blocking=blocking)
  File "/home/t/servo/hat/Adafruit-Raspberry-Pi-Python-Code/Adafruit_PWM_Servo_Driver/python_sdk/milkcocoa/milkcocoa.py", line 31, in __init__
    self.client.connect(self.host, port, 36)
  File "/home/t/servo/hat/Adafruit-Raspberry-Pi-Python-Code/Adafruit_PWM_Servo_Driver/python_sdk/milkcocoa/paho/mqtt/client.py", line 612, in connect
    return self.reconnect()
  File "/home/t/servo/hat/Adafruit-Raspberry-Pi-Python-Code/Adafruit_PWM_Servo_Driver/python_sdk/milkcocoa/paho/mqtt/client.py", line 734, in reconnect
    sock = socket.create_connection((self._host, self._port), source_address=(self._bind_address, 0))
  File "/usr/lib/python2.7/socket.py", line 571, in create_connection
    raise err
socket.error: [Errno 110] Connection timed out
Exception in thread Thread-361 (most likely raised during interpreter shutdown):Exception in thread Thread-428 (most likely raised during interpreter shutdown):Exception in thread Thread-340 (most likely raised during interpreter shutdown):Exception in thread Thread-398 (most likely raised during interpreter shutdown):
```

# 切り分け1

So-netの0SIMを使って試していたのだけど、どういう振る舞いなのかアヤシイのでsoracomのSIMに差し替えて試験しても再発した、のでSIMではない。

14時台に通信がないのがSORACOMのUser consoleで見るとわかる。SORACOM便利。
![image](https://qiita-image-store.s3.amazonaws.com/0/54356/5acb09ca-7d41-d2f8-b35c-e3cc8c5e9e14.png)


## 例外拾って再接続処理入れた

再接続しようとしまくってパケ死するとこだった・・・速度制限するようにしてたから良かったけどSORACOM怖い。

いったん切断されても、パケット自体は流れているみたいなのでpythonのpahoかmilkcocoa SDKの問題？

![image](https://qiita-image-store.s3.amazonaws.com/0/54356/246c7b3e-1fbd-faf0-87ea-a6640bfbc0a5.png)
ESXiでSSHを有効化

# 環境
ESXi 5.0/ESXi6.0で確認できています。

# 有効化
## コンソールで有効化
1.ESXiをインストールしているサーバーへコンソール接続
2.[F2]キーを押下してログイン
3.<TroubleShooting Options>を開く
4.<Enable ESXi Shell>を選択して[Enter]キーを押下
5.<Enable SSH>を選択して[Enter]キーを押下

## vSphereで有効化
1.vSphereでログインしてインベントリを選択
2.<構成>タブの<セキュリティプロファイル>を選択
3.<サービス>右の<プロパティ>を選択
4.<SSH>を選択して[オプション]ボタンを押下
5.任意の起動ポリシーを選択して[起動]ボタンを押下

# 確認
ここではTeraTermで確認します。
1.TeraTermを起動し、ESXiのIPアドレスを指定して接続
2.ユーザー名を入力し、「チャレンジレスポンス認証を使う」を選択して[OK]ボタンを押下
3.パスワードを入力して[OK]ボタンを押下

以上です。
はてなのAPIを使う際に503エラーが出る問題と解決策

はてなブックマークの人気エントリーRSSを表示するAPIを使って何か作りたい
下記のサイトを参考に動かしてみたのですが上手く動かなかった！

ということで、原因と対策を書いておきます。

#参考にしたサイト
https://syncer.jp/hatebu-api-matome#sec-2
こちらのサイトを参考にPHPでRSSの取得をしようとしたところ

```
<?php

	// 取得するフィードURLを指定
	$feed = 'http://b.hatena.ne.jp/hotentry?mode=rss' ;

	// フィードを取得してオブジェクトに変換
	$obj = simplexml_load_string( @file_get_contents( $feed ) ) ;
 
	// エラー判定
	if( !$obj || !isset( $obj->item ) || empty( $obj->item ) )
	{
		echo '<p><a href="' . $feed . '" target="_blank">フィード</a>を取得できませんでした…。</p>' ;
	}
	else
	{
		// HTML
		$html = '' ;

		// 個々のエントリーを読み込んでいく
		foreach( $obj->item as $item )
		{
			// 各値の整理
			$url = (string)$item->link ;									// URL
			$date = $item->children( 'dc' , true )->date ;					// エントリーの日付
			$title = (string)$item->title ;									// タイトル
			$category = $item->children( 'dc' , true )->subject ;			// カテゴリ
			$count = $item->children( 'hatena' , true )->bookmarkcount ;	// ブクマ数

			// 日付の整形
			$date = date( 'Y/m/d H:i:s' , strtotime( $date ) ) ;

			// HTML
			$html .= '<dd>' ;
			$html .= 	'[' . $category . '] - ' . $title . ' (' . $date . ') ' . $count . 'users' ;
			$html .= 	'<br><a href="' . $url . '" target="_blank" rel="nofollow">' . $url . '</a>' ;
			$html .= '</dd>' ;
		}

		// 出力
		echo '<h2>実行結果</h2>' ;
		echo '<dl>' ;
		echo 	'<dt>取得したフィード</dt>' ;
		echo 		'<dd><a href="' . $feed . '" target="_blank">' . $feed . '</a></dd>' ;
		echo 	'<dt>取得結果</dt>' ;
		echo 		$html ;
		echo '</dl>' ;
	}

?>
```

##エラーが発生
![kako-BjrC88bNOEN6Rtf5.png](https://qiita-image-store.s3.amazonaws.com/0/58437/71d5151c-cc0c-4462-256d-65cf1e0beffc.png)


##しかし、ブラウザから直接APIのURLを叩いて確認すると、問題なく表示される

<img width="908" alt="スクリーンショット 2016-03-10 8.13.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/58437/3e8dc371-f0cb-61b5-a1c7-0d209ba36980.png">

#原因を調べたところ
http://q.hatena.ne.jp/1451205850
**ユーザーエージェントが不足しているのが原因のよう**

##対策
リクエストのヘッダーにユーザーエージェントを追加すると正しく取得できました。

```
$options = array(
	  'http' => array(
	    'header' => 'from_rss_application',
	  ),
	);
	$context = stream_context_create($options);

	// フィードを取得してオブジェクトに変換
	$obj = simplexml_load_string( @file_get_contents( $feed ,false,$context) ) ;
```