OmniAICreator/Qiita-1.07M huggingface dataset:
Angular ASP.NET FileSaver.jsを使ってファイルのダウンロードを実装する





##HTML側

```html
    <script src="~/Scripts/Blob.js"></script>
    <script src="~/Scripts/FileSaver.min.js"></script>
    

    <button type="submit" class="btn btn-default" ng-click="DownloadExcel()">
        <img src="~/Images/blue-document-excel.png" />{{filename}}
    </button>
    
```



##Angular 側

```js
//ファイルネームを指定してダウンロードする
$scope.DownloadExcel = function () {
    url = '/FileDownload/Download/';

    $http({
        url: url,
        responseType: "blob",
        params: { fileName: $scope.filename },
    })
    .then(function (response) {
        var blob = new Blob([response.data], { type: "application/octet-stream" });
        saveAs(blob, $scope.filename);
    }, function (response) {
        alert("error downloading file from " + downloadUrl);
    });
}
```
$http.getやpostを使うとファイルダウンロードがうまくいかなかったので、
$http()を使っている。




##ASP.NET側

```csharp
public class FileDownloadController : Controller
{
    public FileResult Download(string fileName)
    {
        var filepath = @"c:\temp";
        string fileFullPath = System.IO.Path.Combine(excelRepositoryPath, fileName);

        return File(fileFullPath, "application/excel", fileName);
    }
}
```
突然Binary treeが書けなくて悔しかったので in Swift



突如Binary Searchを実装する機会があったのですが、removeに戸惑ってしまいました。というわけでこの場を借りてRewrite。貴方は書けますか？基礎は大事です。

```Swift:
func * (lhs: [Int], var rhs: Int) -> [Int] {
  var next: [Int] = []
  while rhs > 0 {
    next += lhs
    rhs -= 1
  }
  return next
}

class BinaryTree {
  var value: Int
  var R: BinaryTree?
  var L: BinaryTree?
  var parent: BinaryTree?
  var count: Int

  init(_ v: Int, _ p: BinaryTree? = nil) {
    self.value = v
    self.count = 1
    self.parent = p
  }
  func insert(n: Int) {
    if n < self.value {
      if let l = self.L {
        l.insert(n)
      } else {
        self.L = BinaryTree(n, self)
      }
    } else if n == self.value {
      self.count += 1
    } else {
      if let r = self.R {
        r.insert(n)
      } else {
        self.R = BinaryTree(n, self)
      }
    }
  }
  func contains(n: Int) -> Bool {
    if n < self.value {
      if let l = self.L {
        return l.contains(n)
      }
    } else if n == self.value {
      return self.count > 0
    } else {
      if let r = self.R {
        return r.contains(n)
      }
    }
    return false
  }
  func list(n: Int) -> [Int] {
    let left = self.L != nil ? self.L!.list(n) : []
    if n > self.value {
      let right = self.R != nil ? self.R!.list(n) : []
      return left + ([self.value] * self.count) + right
    } else if n == self.value {
      return left + ([self.value] * self.count)
    } else {
      return left
    }
  }
  func maximum() -> BinaryTree {
    if let r = self.R {
      return r.maximum()
    }
    return self
  }
  func replace(tree: BinaryTree, with: BinaryTree?) {
    if tree.value == self.R?.value {
      self.R = with
      with?.parent = self.R
    } else if tree.value == self.L?.value {
      self.L = with
      with?.parent = self.L
    }
    tree.parent = nil
  }
  func remove(n: Int) {
    if n < self.value {
      if let l = self.L {
        l.remove(n)
      }
    } else if n == self.value {
      self.count -= 1
      if self.count == 0 {
        if let l = self.L, _ = self.R { // both
          let maxValue = l.maximum().value
          self.value = maxValue
          self.count = 1
          l.remove(maxValue)
        } else if let l = self.L { // L only
          self.parent?.replace(self, with: l)
        } else if let r = self.R { // R only
          self.parent?.replace(self, with: r)
        } else {
          self.parent?.replace(self, with: nil)
        }
      }
    } else {
      if let r = self.R {
        r.remove(n)
      }
    }
  }
}

```
型消去の話で出てきたポケモンの例題を理解する #tryswiftconf

http://www.tryswiftconf.com/

1日目お疲れ様でした！あの人やこの人や皆さんが渋谷に集結して熱かったですね。

以下、[Gwendolyn Weston](https://twitter.com/purpleyay)さんの発表「Keep Calm and Type Erase On」のコードをもとに勝手に解釈しました。解釈が間違ってたらご指摘ください……

発表そのものの解釈ではないのでそれについては録画の方にお願いします。コードの完全版はすでに上がっています↓
https://gist.github.com/gwengrid/d8aacf2118fa12c9b475

# ポケモン

ポケモンを考える。ポケモンの要件は「何らかの属性を持つ」「その属性の攻撃をする」とすると

```swift
protocol Pokemon {
  typealias PokemonType
  func attack(move: PokemonType) -> Void
}
```

と表すことができる。 `protocol Pokemon<T>` は不可。仕様。また、ポケモンというのは哺乳類とかと同じ感じなので `class Pokemon<T>` も不適切。

moveってなんだと思ったらポケモンの"わざ"を指すらしい。
ポケモンのわざ：move
わざマシン：TM(technical machine)
ひでんマシン：HM(hidden machine)

# ピカチュウ

ポケモンとひとくちにいってもいろいろな種族のポケモンがいる。ピカチュウはでんきタイプのポケモンである。これを実装すると

```swift
class Electric { /*略*/ }

class Pikachu: Pokemon {
  typealias PokemonType = Electric
  func attack(move: Electric) -> Void {}
}
```

である。ピカチュウはでんきタイプなので、 `attack(move: PokemonType)` の引数としては `Electric` 型のわざである10まんボルトなどが想定される。ピカチュウ、10まんボルトだ！

早速このクラスを用いピカチュウを数匹作り出す。が、これでは問題が起きる。

```swift
// OK
let p0 = Pikachu()
let p1: Pikachu = Pikachu()

// NG
let p2: Pokemon = Pikachu()
```

`p0` および `p1` の型は `Pikachu` であり `PokemonType` というgenericなものは `Electric` と確定しているので何の問題もない。ところが、 `p2` は `Pokemon` であって `PokemonType` が抽象的なままなのでエラーとなる。

つまり、「ポケモンならなんでも入れられる型」を持つ定数が作れないという問題が起こる。 `class Pokemon<T>` ではないので `Pokemon<Electric>` として「でんきタイプならなんでも入れられる型」にするという手段も取れない。

# 特定タイプのポケモンをなんでも入れられる型

というわけで `class AnyPokemon<PokemonType>: Pokemon` を作る。
完成形は

```swift
var e: AnyPokemon<Electric> = AnyPokemon(Pikachu())
e = AnyPokemon(Raichu())
```

というふうに、イニシャライザで何らかのポケモンのインスタンスを取るようにする。
これでいくと、上記で作った `var e: AnyPokemon<Electric>` に対し、くさタイプである[フシギダネ(Bulbasaur)](https://github.com/czechboy0/Buildasaur/)を持ってきて `e = AnyPokemon(Bulbasaur())` とすることはできない。

具体的にはこうなる↓

```swift
class AnyPokemon<PokemonType>: Pokemon {
    private let _attack: ((PokemonType) -> Void)

    required init<U:Pokemon where U.PokemonType == PokemonType>(_ pokemon: U) {
        _attack = pokemon.attack
    }

    func attack(move: PokemonType) {
        return _attack(move)
    }
}
```

イニシャライザで `attack` を `_attack` に控えておく。そして `class AnyPokemon` が `attack` を使えるようにする。
`private let _pokemon: Pokemon` はできない(先述の通りgenericなPokemonTypeが抽象的なまま解決されない)。


あとは適当にタイプとかわざとか実装してやればポケモンマスター間違いなし。

# 実例

[ikesyo](https://twitter.com/ikesyo)さんが実例を出してました。

https://github.com/Carthage/Commandant/blob/0.8.3/Sources/Commandant/Command.swift#L32-L66

Carthageの `struct CommandWrapper` も、 `class AnyPokemon` 同様に

* イニシャライザで適当なインスタンスを受け取って型を確定させる
* インスタンス自体ではなくそれの持つフィールドやメソッドを控える

ということをやっている。役割としては `Any〜` だけど、実装面からすると確かに `〜Wrapper` がしっくりくる……気がする。
【BurpSuite】BurpExtender作成メモ2 MessageViewで取得できる情報について

Extender APIからMessageViewの内容にアクセスしようとした際のメモです。
結論としては全ての要素にアクセスすることはできませんでした・・・。

# 環境
Burp Suite Free Edition v.1.6.32
java version "1.8.0_45"
MacOS X 10.11.3

# 経緯
以下の状態のMessageViewの値（1,2,3,4,5,6）に、追加したメニューアイテムからアクセスして云々したいと思いました。
<img width="893" alt="burpextender2.png" src="https://qiita-image-store.s3.amazonaws.com/0/82043/dd35b698-f9a4-0375-54ba-a5b904bd7839.png">

# で
IContextMenuInvocation の getSelectedMessages() がIHttpRequestResponse[] を返してくれるので、それでいこうと。

が配列に複数の要素が返ってこない…。

#理由
https://portswigger.net/Burp/extender/api/burp/IContextMenuInvocation.html#getSelectedMessages()

パフォーマンスの理由からだそうですが…（ではなぜ配列に）

#取得できる値
というわけで、上記画像の3と6は取得できます。

足りない(´Д` )
ビルドするとShader.Findに失敗する

ざっと検索して見つけられなかったので、いつも通りの備忘録。

```Shader s = Shader.Find("Sprites/Diffuse");
if (s == null) throw new System.NullReferenceException();
```
上記のスクリプトを実行したとき、Unityエディタ上で実行するには問題ないが、PC, Mac & Linux Standaloneビルドしたゲームではヌルチェックにひっかかって例外がスローされる。
スクリプトリファレンスを見たら解決方法が書いてあった。

http://docs.unity3d.com/ScriptReference/Shader.Find.html から該当箇所を抜粋
>add it under "Always Included Shaders" list in ProjectSettings/Graphics

Unityエディタのメニューにある Edit → Project Settings → Graphics を選択。
Inspector に GraphicsSettings が表示されるので、Always Included Shaders に Sprites/Diffuse を追加すればＯＫ

設定前の GraphicsSettings
![before.png](https://qiita-image-store.s3.amazonaws.com/0/59425/10f927df-387e-b5c7-e101-9c3534123f9f.png)

設定後の GraphicsSettings
![after.png](https://qiita-image-store.s3.amazonaws.com/0/59425/bfeee48c-75f5-2e78-25b3-f30b17937cee.png)
Always Included Shaders の Size を 1 増やして、追加された Element 6 に Sprites/Diffuse を設定。
C初学者に捧ぐ、入門書じゃ説明されないキャリッジリターンは面白い


# エスケープシーケンス
Cプログラマならだれでも知ってるエスケープシーケンス。その理由としてprintf関数においてこいつは一生付き合わなくてはいけない存在だからだろう。RubyやPythonなどの高級言語からCを勉強した人はちょっと苦しむかもしれないその”書式付き”には
- エスケープシーケンス
- 変換仕様

この二つが必須だ。
ある程度の入門書ならエスケープシーケンスの説明のなかで

```
\n
\t
\b
```
この三つの説明は絶対というほどするであろう。それ以外にもエスケープシーケンスがあることも当然説明する。そのなかでひっそりと端の方に書いてあるのがキャリッジリターン

```
\r
```
の紹介があるだろう。でも説明を読んでも何かよくわからないし、どう使うかわからない、私も最初そう思いました。ということでキャリッジリターンの使い方を書いていきたいと思います。

# そもそもどんなもの？
言葉だけで説明すると、標準出力の行に戻るというもので、別名「復旧」とも言われます。ようするにこれを使えばコマンドプロンプトの一行を変えることができるのです。
原理としては

```
aaaaaa
```
と出力されたあとにキャリッジリターンをすれば、

```
bbbbbb
```
と変えることができるのです。
一つ注意点としては
行の最初に戻って再度出力するだけなので、表示してあるものよりも短い文字数文出力しようとするともとの文字が少し残ってしますので、空白などで文字を稼いでください。

```c:例えば01
printf("abcdef");
printf("\rb");
```

とすると

```
bbcdef
```
と出力されてしまいます。ので適当に文字の後ろに空白を入れてやるとうまく出力できます。

```c:例えば02
printf("abcdef");
printf("\rb     ");
```

# 使ってみる

```c:r.c
#include <stdio.h>

int main(int argc, char const *argv[]) {
	int i;

	for(i=0;i<=100000.0;i++){
		printf("\rProgress: %f%%", i/1000.0);
	}
	printf("\nDone");

	return 0;
}
```
このコードは進行状況をパーセンテージを使って表しています。実行すると
一行で0～100％まで表示が変わります。
【cakephp3】hasMany, belongsToManyアソシエーション先の 取得フィールド指定の方法

CAKEPHP3 では，アソシエーションの種類により，取得するアソシエーション先のフィールドの指定方法が異なる．

belongsTo と hasOne （つまり JOIN にて結合するもの）では `Query::select()` にてアソシエーション先のフィールドを指定できるのだけれど，hasMany と belongsToMany ではそれができなかったので調べてみた．

## まとめ
+ finderを使うといい．
+ 設定方法はとりあえず二つ見つけた（以下参照）
+ フィールドには外部キーを含まなければならない (CAKEPHP v3.2.3)
  + SQLログ上ではアソシエーション先のレコードが取得できているのに，Entity上では存在しない，というような現象が発生した．

## 方法１：アソシエーションの設定時に`finder`を指定
アソシエーション先のテーブルクラスにて，finderメソッドを定義する．
定義したfinderで返す`Query`に，`Query::select()`にて取得するフィールドを指定する．

```php:FugasTable.php
class FugasTable extends Table
{
    // 'sample' finder
    public function findSample(Query $query, array $options) {
        return $query->select(['id', 'fuga_id', 'content']); // ここで設定
    }
}
```

そしてアソシエーションを設定する際に，オプション 'finder' を設定する．
設定値は，先ほど定義した `sampleFinder` を利用して欲しいので `'sample'`とする．

```php:HogesTable.php
class HogesTable extends Table
{
    /*
     * One hoges has many fugas.
     */
    public function initialize(array $config)
    {
        $this->hasMany('Fugas', [
            'finder' => 'sample',  // finderを指定
        ]);
    }
}
```
これにて，HogesのアソシエーションによりFugaエンティティを取得する際には，クエリがFuga::findSample()を経由するため，`Query::select()`により取得フィールドを指定することができる．

## 方法２：`Query::contain()`にて指定する
こちらでは，HogesTableにてFugasTableに対するアソシエーションの finder の指定はしていないものとする．

```php:HogesController.php
class HogesController extends AppController
{
    public function index()
    {
        $query = $this->Hoges
            ->find()
            ->contain(['Fugas' => function($query){
                return $query->select(['id', 'fuga_id', 'content']); // ここで設定
            }]);
        $hoges = $query->all();
    }
}
```
これにて Fugaエンティティの取得フィールドが設定される．
なお，ここで FugasTableで定義したfinderを呼んでもいい．

```php
// return $query->select(['id', 'fuga_id', 'content']); // ここで定義
return $query->find('sample'); // finderを呼び出す
```

## 注意: 外部キーは取得フィールドに含ませるべし(v3.2.3)
`Cake\ORM\Association::__construct()`を見て，'finder'のオプション値があったことから，方法１はすぐに見つかったのだが，そのあとで思うように行かずに何時間か停まってた．

方法１にて`return $query->select(['id', 'content']);`というようなことをしていたのだけれど，Fugaエンティティが取得できなかったのだ．
しかも，DebugKitのSQL Logを見ると，クエリは実行されて一つのレコードを獲得していることがわかった．

いろいろ試してみた結果，hasManyやbelongsToManyにて追加実行されるSQLの結果は，元のエンティティに格納される際に外部キーによりフィルタリングされるらしいことがわかった．
外部キーのフィールドを取得しないと，このフィルタリングで弾かれてしまう．

なので例えばfinderにて

```php
$query->orWhere(['Fugas.id']);
```
などとしても，アソシエーション先の外部キーがこちらのバインディングキーと一致するレコードしか取得エンティティには含まれない．

### 原因箇所
おそらく`Cake\ORM\EagerLoader::LoadExternal()`のどこかにてこのフィルタリングが行われているらしいところまではわかったけれどここまで．
実際にどの処理が原因なのか，またこの挙動は仕様なのかなどはわかりませんでした．(英語苦手)
フィルタリングは仕様としても，フィールドリストに外部キーが自動で組み込まれるとか例外投げるとかした方がいいような．
変更ファイルにだけSwiftLintを適用する

## 背景
[SwiftLint](https://github.com/realm/SwiftLint)を利用していて、ドキュメントにあるとおり、 Build Phaseに以下のスクリプトを追加していました。

```
if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
 ```
はじめは問題なかったのですが、Swiftのファイルが増えてきたことで、Lintに時間がかかるようになってきてしまいました。
`$ swiftlint` では全ファイルを対象にしてしまうためです。

## 解決
基本的には変更分のファイルにのみLintを行いたいので、以下のスクリプトに変更しました。

```swiftlint.sh
#!/bin/sh
if which swiftlint >/dev/null; then
    swiftlint version
else
    echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
    exit
fi

parse_yaml() {
    local prefix=$2
    local s
    local w
    local fs
    s='[[:space:]]*'
    w='[a-zA-Z0-9_]*'
    fs="$(echo @|tr @ '\034')"
    sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
        -e "s|^\($s\)\($w\)$s[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" "$1" |
    awk -F"$fs" '{
    indent = length($1)/2;
    vname[indent] = $2;
    for (i in vname) {if (i > indent) {delete vname[i]}}
        if (length($3) > 0) {
            vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
            printf("%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, $3);
        }
    }' | sed 's/_=/+=/g'
}

# Excluded pathes from .swiftlint.yml
EXCLUDEDS=`parse_yaml ./.swiftlint.yml | grep excluded | sed -e "s/^.*(\(".*"\)).*$/\1/" | tr -d "\""`

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Redirect output to stderr.
exec 1>&2

IFS=$'\n'
# Target the swift files that has been changed.
for FILE in `git diff-index --name-status $against -- | grep -E '^[AUM].*\.swift$'| cut -c3-`; do
  # Skip if excluded
  EXCLUDE_FLAG=0
  for EXCLUDED in $EXCLUDEDS; do
    if [[ $FILE =~ ^$EXCLUDED.* ]]; then
      EXCLUDE_FLAG=1
      break
    fi
  done
  if [[ $EXCLUDE_FLAG == 0 ]]; then
    # Lint
    swiftlint lint --path "$FILE"
  fi
done
```
（http://blog.manaten.net/entry/645 を参考にさせていただきました）

以上です。
お役に立てばと思います。m(_ _)m

## 追記
- 2016/03/04 pathにスペースが入っていた場合にビルドが通らなくなる不具合を修正しました。
- 2016/03/04 swiftlintでexcludedに含まれていた場合にビルドが通らなくなる不具合を修正しました。
地球儀のように球状に画像を配置する


デモ：http://mo49.tokyo/threejs/raycaster2.html


```javascript:javascript
var vector = new THREE.Vector3();
var ary_length = 20; // meshの数
var radius = 600; // 半径

for (var i = 0; i < meshs.length; i++) {

	var phi = Math.acos( -1 + ( 2 * i ) / ary_length );
	var theta = Math.sqrt( ary_length * Math.PI ) * phi;

	meshs[i].position.x = radius * Math.cos( theta ) * Math.sin( phi );
	meshs[i].position.y = radius * Math.sin( theta ) * Math.sin( phi );
	meshs[i].position.z = radius * Math.cos( phi );

// 裏表を反転させる
vector.copy( meshs[i].position ).multiplyScalar( 2 );

	// 中心に向かせる
	meshs[i].lookAt( vector );

}
```




> 参考
http://webnaut.jp/markup/618.html
raycasterでクリックイベントの実現



デモ：http://mo49.tokyo/threejs/raycaster2.html

つくったmeshをrayReceiveObjectsに集める。

```javascript:javascript
var rayReceiveObjects = []; // 光線を受けるオブジェクト配列

for (var i = 0; i < 20; i++) {
	rayReceiveObjects.push( meshs[i] );
}
```

光線と交わるオブジェクトとしてrayReceiveObjectsを登録し、
mousedownイベントの中でraycasterを実行。


```javascript:javascript
var raycaster = new THREE.Raycaster(); 
var mouse = new THREE.Vector2();

window.addEventListener( 'mousedown', onDocumentMouseDown, false );
function onDocumentMouseDown( event ) {

	// イベントの伝播の無効化
	event.preventDefault();

	// マウスポインタの位置座標の取得
	mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1; 
	mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;	

	// 光線を発射
	raycaster.setFromCamera( mouse, camera );
	// 光線と交わるオブジェクトを収集
	var intersects = raycaster.intersectObjects( rayReceiveObjects );

	// 連想配列をとりだす
	var bookAry = {
		'火花' : 'http://www.amazon.co.jp/dp/4163902309',
		'流' : 'http://www.amazon.co.jp/dp/4062194856',
		'朝が来る' : 'http://www.amazon.co.jp/dp/4163902732',
		'王とサーカス' : 'http://www.amazon.co.jp/dp/4488027512',
		'君の膵臓をたべたい' : 'http://www.amazon.co.jp/dp/4575239054'
	};
	
	// 交わるオブジェクトが１個以上の場合
	if ( intersects.length > 0 ) {
		// 最も近いオブジェクトの名前をアラート表示する
		alert(intersects[0].object.name + "をご購入ですね？");
		console.log("カメラ位置座標からの距離：" + intersects[0].distance);
		console.log("光線との交差座標(" + intersects[0].point.x + ", " + intersects[0].point.y + ", " + intersects[0].point.z + ")" );
		console.log(intersects[0]);

		for(var i in bookAry){
			if (intersects[0].object.name == i) {
				window.location.href = bookAry[i];
			}
		}
	}
}
```


> 参考
[three.jsによるHTML5 3Dグラフィックス〈上〉―ブラウザで実現するOpenGL(WebGL)の世界](http://www.amazon.co.jp/three-js%E3%81%AB%E3%82%88%E3%82%8BHTML5-3D%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%80%88%E4%B8%8A%E3%80%89%E2%80%95%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8BOpenGL-WebGL-%E3%81%AE%E4%B8%96%E7%95%8C-%E9%81%A0%E8%97%A4/dp/4877833242/ref=sr_1_1?ie=UTF8&qid=1456909415&sr=8-1&keywords=three+js)
『adb shell wm size』が多解像度での表示を確認するのに便利だった




今まで知らなく、使えばかなり便利だったのでメモ

#adb shell wm size 
端末の解像度をイジイジすることができるらしく、任意の解像度に変更出来たりする。
しかもエミュレータだけでなく、実機でも変更できるのでかなり捗る。

#使用例
引数無しの場合は、端末のデフォルトの解像度が表示される

```lang
$ adb shell wm size
Physical size: 720x1280
```

1080x1920の解像度に変更したい場合

```lang
$ adb shell wm size 1080x1920
```
と実行すると、端末の解像度が切り替わります！

この状態で最初の引数無しで実行すると

```lang
$ adb shell wm size
Physical size: 720x1280
Override size: 1080x1920
```
`Override size`として現在設定されている解像度が表示されます。

リセットしたい場合は

```lang
$ adb shell wm size reset
```
です。

こんな感じで、解像度を自由にいじることができるわけです。

#正方形の端末で表示したらを確認する
これを使えば、もし正方形の端末で表示したら…
なんてことも確認できてしまいます。

```lang:
$ adb shell wm size 2048x2048
```
上下に黒い余白ができて、正方形の解像度での表示になりました。
![4f85cb89-8301-1f71-f454-bc50e9376d33.png](https://qiita-image-store.s3.amazonaws.com/0/995/a4c76ab5-b3a5-4677-f864-9faee5a6bb4f.png)


試しにGoogle Playは…

![6f4d4744-ea6c-f0c5-c28f-61ac589ad539.png](https://qiita-image-store.s3.amazonaws.com/0/995/3db0e374-c8b2-d244-508c-b86a08fa9083.png)

バナーでいっぱいいっぱいですね（笑）
rakeタスクでDBのレコードが更新出来なかった時の解決法


##事象
rakeで数千件分のレコードを更新する処理を走らせたら以下のエラーが発生した。

```
rake aborted!
ActiveRecord::TransactionIsolationConflict: Transaction isolation conflict detected: Lock wait timeout exceeded; try restarting transaction
```


##原因
MySQLでトランザクションがコミットされる前にプログラム何らかの原因で終了してしまい、ロックを握ったまま放置されたことが原因みたいです。
おそらくですがrails cのsandboxモードを終了しないままrakeタスクを走らせたからではないかと思います。


##解決方法

1:mysqlにターミナルからログイン`mysql -u root -p`
2:`SHOW ENGINE INNODB STATUS`で一覧が表示されるので"TRANSACTIONS"の項目を見る


```
MySQL thread id 35, OS thread handle 0x13291e000, query id 107117 localhost 127.0.0.1 root cleaning up
---TRANSACTION 421810, ACTIVE 16448 sec
```

3:16448秒もcommitされないままのトランザクションを発見！このプロセスid 35を`kill 35`で消す
4:再度rakeタスクを実行すると成功した






##参考
[トランザクションを強制的に終了させる](http://hhelibex.hatenablog.jp/entry/20110329/1301421815)
Route53 に EC2 の Name タグと PublicIp で A レコードを一発で登録する

「[Route53 に Internet facing ELB の ALIAS レコードを一発で登録する](http://qiita.com/ngyuki/items/6764620f3c811dc0e9f6)」とほとんど同じで、違いは json の作成だけです。

```sh
# 登録先の Route53 の DNS 名
dns_name="aws.example.com"

# 登録先の Route53 のゾーンの ID を取得
zone_id="$(aws route53 list-hosted-zones-by-name --dns-name "$dns_name" \
  --query 'HostedZones[].Id' --output text)"

# ゾーン ID から余計なプレフィックスを除去
zone_id=${zone_id##*/}

# change-resource-record-sets の入力になる JSON を作成
json="$(
  aws ec2 describe-instances | jq --arg domain "$dns_name" '{
    Changes: [
      .Reservations[].Instances[] | select(.PublicIpAddress != null) | {
        Action: "UPSERT",
        ResourceRecordSet: {
          Name: (.Tags[] | select(.Key == "Name").Value + "." + $domain),
          Type: "A",
          TTL: 60,
          ResourceRecords: [{
            Value: .PublicIpAddress
          }]
        }
      }
    ]
  }'
)"

# Route53 に レコードを登録する
aws route53 change-resource-record-sets --hosted-zone-id "$zone_id" --change-batch "$json"
```
Windows C++で排他制御

#排他制御の種類(windows)
クリティカルセクション
ミューテックス
セマフォ
ファイル
#排他制御はオブジェクト指向で！
C++ではコンストラクタとデストラクタというのがあり、これを使った排他制御が便利です。
ロックの解放忘れることもありません。
functionの中でインスタンス生成時にコンストラクタでロックし、
functionが終了すればインスタンス消滅時にデストラクタでロック解除する。
そんなプログラムを書いてみました。

#基本ファイル
<dl><dt>Lock.h</dt>
<dd>
<pre>
class LockObject {
public:
	LockObject() {}
	virtual ~LockObject() {}
	virtual void Lock() = 0;
	virtual void Unlock() = 0;
};
class Lock {
private:
   LockObject *pLock;
public:
   Lock(LockObject *obj) { pLock = obj; pLock->Lock(); };
   ~Lock(){ pLock->Unlock(); }
};
</pre>
</dd>
</dl>
#クリティカルセクション
<dl><dt>CriticalLock.h</dt>
<dd>
<pre>
#include &lt;windows.h>
#include "Lock.h"
class CriticalLock : public LockObject {
private:
	CRITICAL_SECTION CritSect;
public:
	CriticalLock();
	virtual ~CriticalLock();
	virtual void Lock();
	virtual void Unlock();
};
</pre>
</dd>
</dl>
<dl><dt>CriticalLock.cpp</dt>
<dd>
<pre>
CriticalLock::CriticalLock()
{
	InitializeCriticalSection(&CritSect);
}
CriticalLock::~CriticalLock()
{
	DeleteCriticalSection(&CritSect);
}
void CriticalLock::Lock(void)
{
	EnterCriticalSection(&CritSect);
}
void CriticalLock::Unlock(void)
{
	LeaveCriticalSection(&CritSect);
}
</pre>
</dd>
</dl>
<dl><dt>使い方</dt>
<dd>
<pre>
#include &lt;windows.h>
#include &lt;Lock.h>
CriticalLock cObj;


void hoge(){
  Lock lk(&cObj);
   
   ここは排他制御で１スレッドしか実行できません

}
</pre>
</dd>
</dl>
#その他の排他制御
CriticalLockと同じように書けば
セマフォでもミューテックスでもできると思う。
Linuxでも可能だと思います。
Cronの文法確認をPHPでする感じなメモ


Laravel5 系で定期実行で`cron`の設定がかけるけど、文法が合ってるか確認する方法的な。

```php
$ php artisan tinker
Psy Shell v0.7.0 (PHP 5.5.30 — cli) by Justin Hileman
>>> \Cron\CronExpression::factory('1 9,12,15,18 * * * *')->isDue( '2016-03-01 09:01:00' );
=> true
>>> \Cron\CronExpression::factory('1 9,12,15,18 * * * *')->isDue( '2016-03-01 09:01:10' );
=> true
>>> \Cron\CronExpression::factory('1 9,12,15,18 * * * *')->isDue( '2016-03-01 09:02:10' );
=> false
>>> 
```
try!Swiftで聞いたHoundCIを試してOSSをきれいに保つ

# try!Swiftめちゃめちゃ楽しい
CoreAnimationからツールからユーザーコンテキストに踏み込んだ話までかなり幅が広くて聞いてて常に飽きないいいカンファレンスだと思いました！残り2日も楽しみ。

# 1st session
[いけしょーさん](https://twitter.com/ikesyo)の話の中であったHoundCIっていうのが自分で知らなかったので合間に早速触ってみました。

# [HoundCI](https://houndci.com/)
<img width="75" alt="スクリーンショット 2016-03-02 19.33.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/31237/a0052a57-42e1-6745-edc1-cba072f83d1b.png">

最近流行りのCIホスティングサービスの一つです。これはLintに特化していて各種言語のフォーマットや、構文チェックをしてくれるサービスです。以下にはSwiftは書いてありませんが
<img width="754" alt="スクリーンショット 2016-03-02 19.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/31237/005b62af-cf29-8adb-c05e-e4959f97c663.png">

[Docs](https://houndci.com/configuration)を見るときちんとサポートされています。
内部的には[SwiftLint](https://github.com/realm/SwiftLint)が走ります。

# 料金形態
OSSであれば無料のようなので、OSSのリポジトリをお持ちの人はぜひ導入してみるといいかもしれませんね。
<img width="767" alt="スクリーンショット 2016-03-02 19.35.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/31237/36895f16-74d7-78b3-9045-fb6b5feb21c3.png">

# 使ってみる。
## 1. ファイル準備
**ROOTのディレクトリに2つのファイルを置くだけで、Pull Request時に番犬が吠えてくれるようになります。**


```  /.hound.yml
swift:
  config_file: .swiftlint.yml
```

``` /.swiftlint.yml
# これは空でも動きます
```

## 2. アカウント登録
Githubでログインすると以下のようにリポジトリを選択できるようになるのでActivateしてみましょう。
あとはこれでプルリクを送るだけ！
<img width="1107" alt="スクリーンショット 2016-03-02 19.39.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/31237/b9a9ab76-d6fd-92fd-df74-fd12cb909be3.png">

ためしにTableViewControllerを追加したPullRequestを投げてみましょう。

## 3. Pull Request
そのプルリクがこちら
https://github.com/jumbo-in-Jap/HoundCi/pull/4

SwiftLintで定義されるデフォルトのチェックで指摘されますね。わんわん言ってます。
<img width="788" alt="スクリーンショット 2016-03-02 19.41.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/31237/e3ff0d9a-133d-b4b5-c03e-03eef9c84c9c.png">

デフォルトのSwiftLintの設定でTableViewControllerの追加で**11わんわん**指摘されました。

[平松さんに指摘](https://twitter.com/himara2/status/705194201881792512)してもらいましたが、このLintはdiffに対して実行されるようです。

基本的にSwiftLintの構文は[Github Stype Guide](https://github.com/github/swift-style-guide)に即しているし、ルールもちゃんと.swiftlint.ymlに書けば無視させることもできるので、OSSを管理して自由なコードを書かれがちな人は導入してもいいんじゃないでしょうか！

残り二日も楽しみだ〜
UITextFieldの入力後に入力用キーボードを閉じる方法


iOSアプリでUITextFieldで入力フィールドを実装した際に、入力用キーボードが表示されたままの状態の際に取れる対処方法です。

## 1. キーボード入力の決定

### 入力用キーボードの右下部分を決定表記にする

以下のようにUITextFieldの「Return Key」を「Done」に設定する

![スクリーンショット 2016-03-02 19.24.59.png](https://qiita-image-store.s3.amazonaws.com/0/44140/40dc94ac-ed7d-4c17-9c8f-b8d276df9fbc.png)


### UITextFieldDelegateをViewControllerに実装
```ViewController.swift
class ViewController : UIViewController, UITextFieldDelegate {
    
    @IBOutlet var textField : UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.textField.delegate = self
    }
    
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    ...
}
```

ポイントは下記2点。

* UITextFieldDelegateの実装箇所をUITextField.delegateに設定する
* textFieldShouldReturnメソッドにUITextField.resignFirstResponder

上記を実装することで、キーボード入力の決定ボタンで、入力用キーボードを非表示にできます。

## 2. UITextField以外の部分をタッチ

もう一つがUITextField以外の部分をタッチした場合に非表示にする方法です。
ViewControllerのtouchesBeganメソッドをオーバライドして以下の内容を実装することで対応できます。

```
　　override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if (self.textField.isFirstResponder()) {
            self.textField.resignFirstResponder()
        }
    }
```

## 参考元
* [[iPhone] TextField のキーボードを閉じる方法を３つ(Swift)](https://akira-watson.com/iphone/textfield.html)
* [テキストフィールドにテキスト入力後、Returnでキーボードを隠す方法 [Swift1.2][UITextField]](http://anthrgrnwrld.hatenablog.com/entry/2015/06/26/204031)
各Processingのバージョンでフルスクリーン表示にする方法

# Processingでフルスクリーン
## はじめに
Processingではフルスクリーン表示を行う様々な方法が用意されています。
しかし、バージョンによって使えない方法があります。
環境に合わせて適切な方法でフルスクリーン表示を行いましょう。
## Presentで実行(全バージョン共通)
とにかくフルスクリーン表示にしたい場合は、
`Sketch->Present`または`Ctrl+Shift+R`でフルスクリーンで実行できます。
ウィンドウが画面中央に表示され、余白はグレーになります。また、左下の`stop`ボタンで終了させることもできます。
`size()`で、ディスプレイと同じサイズを指定すれば、当然ウィンドウは画面の最大サイズになります。
この機能は全バージョン共通して使うことができます。

## fullScreen()を使う(バージョン3.0以上)
`void setup()`内に`fullScreen()`を書くことで簡単にフルスクリーン表示にすることができます。
しかし、この方法は**Processing3.0以上**でなければ使えません。
また、この場合`width`と`height`は画面の大きさ（`displayWidth`と`displayHeight`）になります。そして、`size()`を使うことができなくなります。

```java:fullScreen()を使う
void setup() {
  fullScreen();
}
```


## size()を使う(バージョン1.x, 2.x)
`size()`関数でディスプレイの大きさを指定することでフルスクリーンにできます。
この場合、タイトルバーを消すために、`frame.removeNotify()`などを記述する必要があります。
また、`frame.setLocation(0,0)`でウィンドウの左上の位置を画面の左上に合わせていますが、この関数は`void setup()`で使うことができないので、`boolean setLocation_flag`を使って`void draw()`の最初に1回だけ実行しています。
**Processing1.xの場合、displayWidthとdisplayHeightをそれぞれscreen.widthとscreen.heightに変更**する必要があります。
そして、**Processing3.xでは、frameが使えなくなった**のでこの方法は使えません。

```java:size()を使う
boolean setLocation_flag;

void setup() {
  frame.removeNotify();
  frame.setUndecorated(true);
  frame.addNotify();
  size(displayWidth, displayHeight);
  setLocation_flag = true;
}

void draw() {
  if (setLocation_flag) {
    frame.setLocation(0, 0);
    setLocation_flag=false;
  }
}

```

## Fullscreen APIを使う(バージョン1.x, 2.x)
`Processing1.x, 2.x`では、フルスクリーン用のライブラリをインポートすることでフルスクリーン表示ができます。
[Fullscreen API](http://www.superduper.org/processing/fullscreen_api/)
また、**Processing2.xでは、一部機能（Fullscreen APIのキー入力での操作）が使えない**ため推奨されません。
FullScreen APIでは、`size()`で指定できる数値が決まっていて、非対応の場合、コンソールに
`「FullScreen API: Display mode not supported: width x height」`
と表示されます。
一般的なモニタ解像度が対応していると考えられるので、それに合わせて`size()`を決めると正常に使えるはずです。
[モニタ解像度の一覧](http://www.quel.jp/etc/monitor-size/)



```java:
Fullscreen APIを使う
import fullscreen.*; 
FullScreen fs; 

void setup() {
  size(640, 480);
  fullScreen();
  fs = new FullScreen(this); 
  fs.enter(); 
}
```
地味に忘れる accepts_nested_attributes_for した時の国際化の定義



```ruby
class ParentModel < ActiveRecord::Base
  has_one  :child, class_name: 'ChildModel'
  accepts_nested_attributes_for :child
end

class ChildModel < ActiveRecord::Base
  has_many :grand_childen, class_name: 'GrandChildModel'
  accepts_nested_attributes_for :grand_childen
end

class GrandChildModel < ActiveRecord::Base
  attr_accessible :name
end
```

上記の様な model が定義されている場合、 `ActiveModel::Translation` 内では以下のように国際化処理が行われる。

```ruby
I18n.translate('activerecord.attributes.parent_model/child/grand_childen.name')
```

よって、`ja.yml` ファイルには以下のように定義すれば良い。

```
ja:
  activerecord:
    attributes:
      parent_model/child/grand_childen:
        name: 孫の名前
```
Mac(osX10.11.3 El Capitan)にEclipseインストール


久しぶりにEclipseをインストールしてみる。

１．Eclipseのダウンロード

https://eclipse.org/downloads/

ここから、「Eclipse IDE for Java EE Developers」をダウンロード。
展開したEclipse.appを任意のフォルダーに配置。

２．Eclipseの起動１

起動したところ、

>Eclipseを開くには、Java SE 6 ランタイムが必要です。

てきなメッセージが表示。そうなの？と思いながら詳細ボタンをおすと、appleのダウンロードページが表示されたので早速ダウンロードしインストール。

https://support.apple.com/kb/DL1572?locale=ja_JP

補足）Java6以前はapple、Java7以降はoracleが提供してるんだって

３．Eclipseの起動２

これで起動するのかなと起動すると次なるエラー

>Version 1.6.0_65 of the JVM is not suitable for this product. Version 1.7 or greater is required.

...
Java6が必要と言われてインストールしたのに1.6は相応しくない1.7以降を入れろと怒られたぞ。。

最新版のJavaをインストールしよう。
本家からダウンロードしてインストール。

http://www.java.com/ja/download/mac_download.jsp

インストール後、ターミナルでバージョンを確認。


```java-version
$ java -version
java version "1.8.0_73"
Java(TM) SE Runtime Environment (build 1.8.0_73-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)
```

４．Eclipseの起動（完結）

こんどこそエイヤ！起動した。workspaceの選択画面がなつかしい。
![kobito.1456914408.119929.png](https://qiita-image-store.s3.amazonaws.com/0/102238/5fbd5c20-5f17-7a98-6602-805b8abd27f6.png "kobito.1456914408.119929.png")
Implementing functional languages を頑張って読む.9日目

# 9日目

## Chapter 2
_template instantiation_ を元にしたグラフ簡約機をつくる.
グラフ簡約とtemplate instantiationを一緒に勉強していこうな.

- 式の評価で実行される
- 式はグラフで表現される
- 評価は簡約を実行すること
- 簡約はグラフ中の簡約可能な式(_reducible expression_)を簡約後の形に置き換えること.'reducible expression'を'redex'という
- redexがない式を_normal form_,正規形といい,この時評価は終了する
- redexが複数ある時,どの順序で簡約するか決めなければならないが,どのような経路を辿っても,(簡約が終了するならば),正規形は一意に定まる.`KI(MM)`は終了しない簡約が存在するので,一意には定まらない
- 我々は_normal order reduction_,正規順序評価を採用する.これは,最も外側の簡約可能な式を置き換える戦略である

すなわち,評価の手順は以下のようになる.

```
until there are no more redexes
  select the outermost redex
  reduce it
  update the (root of the) redex with the result
end
```

引数のポインタをコピーして置き換えているのは,参照透過性が保たれているから?
今は副作用を持つ演算子は存在しないが,sq x = x * x;sq (x++)をsq (x++) (x++)とは置き換えられない.
1引数にするためにカリー化をする.

グラフ簡約の3ステップ

1. redexを探す
1. 簡約する
1. redexを置き換える

redexの見つけ方

1. 構文木の「適用」の左側の枝をsuper combinatorかbuilt-in functionが出るまで降りていく.この「適用」の連鎖を式の_spine_といい,この手順を_unwinding_ the spine, spineをほどく,という.戻る場所を覚えるためにスタックがよく用いられる
1.  sc/bfが何個の引数をとっているか調べる.これで最も外側の関数のrootが見つかったことになる

関数の引数が全部埋まってなかったりすると, _weak head normal form_, 弱頭部正規形となり,そこで一旦簡約は終了する.
型チェッカが入っているとここで型チェックが走るらしい.
まだ一番外側の関数がredexどうかはわからない.scならいいけど,bfなら引数に依る.
プリミティブの場合,引数がredexかどうか新しいスタックを用い調べる.
スタックのスタックを作る._dump_, ダンプと呼ばれる.

アップデートは_lazy evaluation_, 遅延評価を使う.
同じ式は1回しか評価しないようにする.
引数を取らない関数を_constant applicative forms_, 定数適用形(この訳語は独自)といい,これは最初っから簡約する.
でもカリー化してるだけだったらどうするんだろ.読解できてない?
あー,そうか,WHNFになるだけか.

**2.1まで読んだ.コードは書いてない**
ADBでAndroidのIPアドレスを取得したい

こういうコマンドを打ってみよう！

```
adb shell ip addr show | grep -oP 'inet \d+\.\d+\.\d+\.\d+' | grep -v 127.0.0.1 | grep -oP '\d+\.\d+\.\d+\.\d+'
```

## 出力例

```
192.168.10.64
```

## 解説

```
adb shell ip addr show 
```

ネットワークの状態を表示します。ただしIPアドレス以外にもいろいろなテキストが表示されます。
表示例:

```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
    link/sit 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN
    link/tunnel6 :: brd ::
4: p2p0: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DORMANT qlen 1000
    link/ether 92:b6:86:c1:01:6b brd ff:ff:ff:ff:ff:ff
    inet6 fe80::90b6:86ff:fec1:16b/64 scope link
       valid_lft forever preferred_lft forever
5: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 90:b6:86:c1:01:6b brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.97/24 brd 192.168.10.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::92b6:86ff:fec1:16b/64 scope link
       valid_lft forever preferred_lft forever
6: rmnet_mhi0: <UP,LOWER_UP> mtu 3584 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/[530]
7: rmnet_data0: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
8: rmnet_data1: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
9: rmnet_data2: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
10: rmnet_data3: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
11: rmnet_data4: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
12: rmnet_data5: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
13: rmnet_data6: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
14: rmnet_data7: <> mtu 1500 qdisc noop state DOWN qlen 1000
    link/[530]
```

この中で必要なのは`inet`の後にあるIPアドレスです。

```
grep -oP 'inet \d+\.\d+\.\d+\.\d+'
```

`-o`オプションはマッチした部分のみを出力するための指定です。何も指定しないと、grepはマッチした行を出力します。
`-P`オプションはPerlの正規表現を利用する指定です。これを付けないと`\d`などの指定ができません。

`-o -P`と書いても良いのですが、まとめて`-oP`と書くこともできます。

```
grep -v 127.0.0.1
```

`-v`オプションは、マッチした行を除外するための指定です。`127.0.0.1`というアドレスは自分自身を指すものなので、今回取得したいアドレスではありません。なので除外します。

```
grep -oP '\d+\.\d+\.\d+\.\d+'
```

再び`-o`と`-P`を使って、今度は`inet 192.168.10.64`のような文字列から`192.168.10.64`の部分のみを抜き出します。

これで見事コマンドラインでIPアドレスだけを取得できました！


## おまけ

```
adb tcpip 5555
adb connect [端末のIPアドレス]
```

とすることでWi-Fi越しにadbコマンドが打てるようになるのですが、毎回IPアドレスを調べて手入力するのが面倒だったので、これを1コマンドでできるようにしてみました。

```
adb tcpip 5555 & adb wait-for-device & adb shell ip addr show | grep -oP 'inet \d+\.\d+\.\d+\.\d+' | grep -v 127.0.0.1 | grep -oP '\d+\.\d+\.\d+\.\d+' | xargs adb connect
```

`xargs`を使うと標準出力を引数にできることを利用しました。
Xcodeのクラッシュ解析ツールCrashes Organizerを使う

# Crashes Organizerとは

Xcode 6.3 から追加されたクラッシュ解析ツールです。
それよりも前は Crashlytics などのサードパーティを利用する必要がありました。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/991d35aa-eb50-a2fc-3712-eccd1f5bdf07.png)

※本ドキュメントの画像は [About the Crashes Organizer](https://developer.apple.com/library/ios/recipes/xcode_help-crashes_organizer/AboutCrashesOrganizer/AboutCrashesOrganizer.html#//apple_ref/doc/uid/TP40015147-CH1-SW1) のものを引用しております。

# 環境

Xcode 7.2 時点での情報です。

# 必要な作業

* すでに該当アプリが AppStore で配信されている必要があります
* **アプリ利用者** がAPPデベロッパとクラッシュデータを共有することに同意している必要があります（これは開発者側ではコントロールできないですね）
<img width="375" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/8292/efc41625-bd3d-8f92-1c49-9f4e6ee9ec82.png">

* iTunes Connect にアプリをアップロードする際にシンボルを含んでいる必要があります（Include app symbols...にチェック）
![image](https://qiita-image-store.s3.amazonaws.com/0/8292/4a6e06d5-5f9a-3e47-6c6d-1fc78f7779e3.png)

* Xcode に iTunes Connect で使用している Apple ID アカウントを追加しておきます
![image](https://qiita-image-store.s3.amazonaws.com/0/8292/98e5446d-b310-3f76-8bed-1aec71ed819f.png)

# 使い方

Xcode の Window メニューから Organizer を起動しておきます。

1. 画面上部の「Crashes」をクリックします
![image](https://qiita-image-store.s3.amazonaws.com/0/8292/7c92c59d-1af8-9840-672e-4240e415bc26.png)
2. 「iOS Apps」から該当アプリを選択します
3. クラッシュレポートを見たいバージョンを選択します
4. クラッシュ一覧から気になるものを選択します
    * 各セルには影響を受けているデバイスの数が表示されています
    * 検索バーからクラッシュを検索することもできます
5. 詳細エリアに各スレッドのスタックトレースが表示されます
    * クラッシュが発生したスタックフレームがハイライトされます
6. クラッシュにはメモを書き込むことができます
    * 「Mark as Resolved」ボタンをクリックすることで解決済みとしてマークできます（こうしておくことで、一覧でのフィルタリングが可能） 
7. デバイス毎・OS毎の比率も確認できます 



# 使ってみた感想

* SDKを組み込む必要が無いのは嬉しい
* 閲覧できるのは **過去2週間に発生したクラッシュ数が最も多い上位のものだけ** だけど、個人で使う分には十分だった
* もっとがっつりクラッシュ解析したい場合はサードパーティのサービスを使えば良いと思う

# 参考リンク

* [About the Crashes Organizer](https://developer.apple.com/library/ios/recipes/xcode_help-crashes_organizer/AboutCrashesOrganizer/AboutCrashesOrganizer.html#//apple_ref/doc/uid/TP40015147-CH1-SW1)
* [New Features in Xcode 6](https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html#//apple_ref/doc/uid/TP40014509-SW21) - 6.3 から Crashes Organizer 追加
1つの画像内に複数リンクを設置したい

# イメージマップを使う
```
<img src="img/sample.png" usemap="#Map">
<map name="Map">
<area shape="rect" coords="600,17,833,134" href="リンク先">
<area shape="rect" coords="329,17,562,134" href="リンク先">
<area shape="rect" coords="60,17,293,134" href="リンク先">
</map>
```

shape属性が"rect"だとリンク枠が四角形となり
coords属性に「左上の座標(X1,Y1) , 右下の座標(X2,Y2)」(合計4つの値)を指定すればよい

ちなみにshape属性を変えることで円形のリンク枠にすることも可能
Jupyter上でProcessingを動かす

# はじめに
オンラインのプログラミング学習環境として今[Jupyter Notebook](http://jupyter.org)が熱いです。ブラウザ内でテキスト（Markdownで記述可能）を参照しながらコードをインラインで実行できます。もともとはPython向けだったのですが、現在ではRやScalaなどさまざまな言語に対応しています。[Generative Design](http://www.amazon.co.jp/dp/4802510136)の日本語版が出たこともあり、今回はJupyter上にProcessingの環境を構築してみます。

# 環境

- Mac OS X 10.10.5
- Anaconda (Python 2 or 3) 2.5.0

# 参考
- [Jupyter notebook で Processing を](http://what-alnk.hatenablog.com/entry/2016/02/05/210000_1)

# 構築手順
## Anacondaのインストール
https://www.continuum.io/downloads よりダウンロード後、インストーラに従ってインストール。

## Jupyterのインストール
Anacondaを使って入れます。

`conda install jupyter`

*Proxyを経由する場合は環境変数の`HTTP_PTOXY`および`HTTPS_PROXY`を設定しておくこと。*

## calysto_processingのインストール

Jupyter用Processingモジュールです。pipでインストールします。

`pip install --upgrade --ignore-installed calysto_processing`

*`--ignore-installed`を指定しないと"Cannot remove entries from nonexistent file"というエラーが出ます。*

## Processingのインストール

最新版は3.xですが、動作確認できている2.2.1を入れます。
https://processing.org/download/

Macの場合はprocessing-javaを別途インストールする必要があります。本体のインストール後、Processingを起動し、"Tools"メニューから"Install processing-java"を選択します。"Install processing-java for all users?"と聞かれるのでYesを選択しましょう。

## kernel.jsonの編集

~~/usr/local/share/jupyter/kernels/calysto_processing/以下のkernel.jsonを編集します。~~
Macならprocessing-javaが/usr/binにインストールされ、すでにパスが通っているので編集は不要。

## kernel.pyの編集（Python 2.7の場合のみ）

Python 2.7の場合このまま実行するとエラーが出るので、
~/anaconda/lib/python2.7/site-packages/calysto_processing/kernel.pyを編集します。

```lang:変更前
stdout, stderr = [str(bin, encoding="utf-8") for bin in p.communicate()]
```

```lang:変更後
stdout, stderr = [str(bin) for bin in p.communicate()]
```

# 動作確認

## Jupyterの実行

- ターミナルで``jupyter notebook``と実行
- ブラウザが立ち上がるので右上から"New" > "Calysto Processing"を選択
- セルに``println("Hello!")``と入力しShift-Enterを押す
- ウィンドウ下のコンソールにHello!と出たらOK！

![Screen Shot 2016-03-02 at 16.42.41.png](https://qiita-image-store.s3.amazonaws.com/0/54852/b8ad52f0-e4c1-1186-6c90-d9ee4ab40668.png)

## 図形を描画する

```
ellipse(50, 50, 100, 100);
```

![Screen Shot 2016-03-02 at 16.44.07.png](https://qiita-image-store.s3.amazonaws.com/0/54852/0bbe9f47-d078-f141-86f3-d6a3fcf0d44c.png)

## インタラクティブにしてみる

ふつうのProcessingと同様に``setup()``と``draw()``関数を用意します。

```
void setup() {
    size(400, 400);
}

void draw() {
    background(0);
    ellipse(mouseX, mouseY, 10, 10);
}
```

![Screen Shot 2016-03-02 at 16.56.30.png](https://qiita-image-store.s3.amazonaws.com/0/54852/b27d3c32-da84-d330-be0f-e025c394cf85.png)

## アニメーション

下のdraw()と書かれたボタンをクリックすると1ステップずつ処理を進めることもできます。

```
int cx = 200;
int cy = 200;
int r = 100;
float deg = 0;

void setup() {
    size(400, 400);
    frameRate(30);
}

void draw() {
    background(0);

    noFill();
    stroke(255);
    ellipse(cx, cy, 2 * r, 2 * r);

    deg += 0.1;
    float x = cx + r * cos(deg);
    float y = cy + r * sin(deg);

    fill(255);
    ellipse(x, y, 10, 10);
}
```

![Screen Shot 2016-03-02 at 18.50.05.png](https://qiita-image-store.s3.amazonaws.com/0/54852/773449b1-d4e5-372b-86d7-b910ac137b45.png)

# 終わりに

とりあえず現状は基本的な動作ができたところまでの確認ですが、これからいろいろ動かしてみてまた何かあれば追記したいと思います。
OS X El Capitan で 有線LANが繋がらなくなった時の解決事例

# 伝えたいこと
OS X El Capitan で 有線LANが繋がらなくなったので
その解決までの記録です。


# 環境
iMac 2014年版　El Capitanにアップデート済み

# 症状
有線LANが繋がらない

# 自分で試したこと
### １．
システム環境設定の「ネットワーク」で「内蔵Ethernet」を見ると
「ケーブルが繋がれていない」と表示されている

### ２．
問題を切り分けるために、そのケーブルを別のMacに接続してみると
問題なく繋がった。　したがって、回線側の問題ではない

### ３．
thunderboltのLANアダプタを取り付けて、LANケーブルを繋いでみたが、これでも接続できない

### ４．
「システム情報」の「Ethernetカード」の項目を見ると、なにも認識していない

### ５．
Apple Diagnosticsを試すが、異常なし。
それどことろか、診断結果をAppleに送信するために立ち上がる
復元モード（？）でのSafariでは、インターネットに繋がっている
（Yahooも見れた）
↓
つまり、機械的にEthernetは壊れていない

### ６．
セーフブートをしてみたが、何も変わらず


# ここまでの考察
要は、回線に問題はなく、Ethernetも機械的に壊れていない
が、OSを通常起動した状態では、Ethernetカードが認識されていない
という、状態だと思います。


# 手詰まりになったので Appleに電話

最近出始めた症例であるということが分かった 
まだ、日本語での情報はなく、英語でのみ解決策がアップされているらしい
(2016/3/2 時点)

# 解決までの手順

## 復元モードで起動
command+R を押しながら起動して、復元モードで立ち上げる

## ヘルプ情報を取得
起動すると「OS X　ユーティリティ」が立ち上がるので
「ヘルプ情報をオンラインで取得」を選択する。

するとSafariが立ち上がるので、「HT205956」を検索する
検索結果から、下記URLのページを開く
https://support.apple.com/en-us/HT205956
（もしくは、このURLを直接入力する）

## Wi-Fi が使えない場合の対応をする
今回のマシンはWi-Fiの環境がなかったので
「If you can't connect to Wi-Fi, follow these steps to update to version 3.28.2」
の項目に書いてある対策を行う

## コマンドをコピーする
手順９に書いてある、下記のコマンドをコピーする。
（あとで、ターミナルにペーストするため）
```
rm -rf "/Volumes/Macintosh HD/System/Library/Extensions/AppleKextExcludeList.kext"
```

## Safari を終了させる
メニューバーから、Safariを終了。画面には「OS X　ユーティリティ」が表示されるはず。

## ターミナルを起動
メニューバーの「ターミナル」からターミナルを起動

## コマンドを実行
先ほどコピーしたコマンドをターミナルに貼り付けて実行。
エラーなどが出ず、次行にプロンプトが表示されれば、OK

## 再起動して確認
OSを再起動して、状態を確認する。今回は、これで復旧しました。
もし、これでダメな場合は、OSの再インストールが必要だとAppleの人に言われました。



以上が、今回の解決までの手順でした。
同じ症状の人の役に立てば幸いです。
apktool実行時に「ERROR: Asset package include 」が発生する

# Problem

apktool実行時に、以下のエラーが発生する。

```
$ apktool b /home/hoge
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building resources...
ERROR: Asset package include '/home/hoge/apktool/framework/1.apk' not found.
```

aaptのバージョンによっては、上記のエラーが発生することがわかった。
参考: [AAPT 21.0.2 failed to build with error Asset package include '%s' not found.](https://code.google.com/p/android/issues/detail?id=78354)

# Solution

適切なaaptを使うことで解決する。
以下のサイトの「aapt」と「apktool_1.5.2.jar」の組み合わせで試したところ、正常に動作した。

[Index of /apktool](http://connortumbleson.com/apktool/)
jQuery UI Dialogでオープン時のフォーカスを外す

## jQuery UI Dialog

最初の入力部品にフォーカスが当たってしまうのを対処します。
以下のように、openイベントであれこれやってもダメな場合。

```js
$("#dialog").dialog({
    ...
    open: function(event, ui) {
        $(this).find('input').blur();
    }
});
```

ダイアログを表示するhtmlに以下のようなダミーを追記する。
とりあえず、これでうまくいきました。

```html
<span class="ui-helper-hidden-accessible"><input type="image"/></span>
```

inputタイプが *image* なのは、*text* とかだとスマホで表示した場合にキーボードが出てきてしまうためです。
ダイアログの詳しいドキュメントはこちら。
[Dialog | jQuery UI](https://jqueryui.com/dialog/)

**以下、追記（2023/08/04）**
ダミーでうまくいかない場合は、以下 *hidden* タグの追加でフォーカス外れます。

```html
<input type="hidden" autofocus="autofocus" />
```
エディタ拡張　備忘録




## Unityエディタ起動時にスクリプトを実行

　・**[InitializeOnLoad]**属性をクラスに付ける。
　・**スタティックコンストラクタ**に処理を書く

　参考URL：http://docs.unity3d.com/ja/current/Manual/RunningEditorCodeOnLaunch.html

```
[InitializeOnLoad]
public class ExportAssetBundles : MonoBehaviour
{

    static ExportAssetBundles()
    {
        // なんか処理
    }
}
```

## チェックを付ける事が出来るメニューの作成

```
 // チェックを付ける(=true)、はずす(=false)
 UnityEditor.Menu.SetChecked(メニュー内でのパス, true or false);
 // チェック状態を取得
 bool val = UnityEditor.Menu.SetChecked(メニュー内でのパス);

```



だけど・・・**スタティックコンストラクタ**内でPlayerPrefsから取得した状態をセットしようとしたら
エラーになった。
メニューにそんなパスないよって・・・・・・どうやらタイミングが早すぎるらしい。


下記処理でわざと遅延を起こすと、うまく動作しました。

参考URL：http://tsubakit1.hateblo.jp/entry/2015/07/21/233000

```
    static void Initial()
    {
　　　　 // なんか処理
　　　　 // チェックを付ける(=true)、はずす(=false)
　　　　 UnityEditor.Menu.SetChecked(メニュー内でのパス, true or false);
        EditorApplication.delayCall -= ExportAssetBundles.Initial;

    }

    // スタティックコンストラクタ
    static ExportAssetBundles()
    {
        EditorApplication.delayCall += ExportAssetBundles.Initial;
    }
```


ただ、コンパイルする度によばれるので、そこはまた改修する必要がある。
<textarea>にルーラーをつけたい

# この会話はフィクションです

―textareaの上にルーラーつけて欲しいんすけど。
「ブラウザのフォントによって横幅が違うんで無理っす。」

―うるさいやれ。
「じゃあせめてtextareaはMSゴシック固定にしやがれください。」

―それは却下だ。やれ。
「プロポーショナルとか半角とかでずれるじゃん。」

―そこは目をつぶってやるからありがたくおもえ。あとやれ。
「」

# 参考サイト様

[javascriptで文字列の描画幅を取得する方法](http://qiita.com/Sinraptor@github/items/1b3802db80eadf864633)

# コード

```html:ruler.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>すべてのExcel方眼紙と戦うものたちへ</title>
<style>
* {
  margin:0;
  padding:0;
  font-family: meiryo, "ＭＳ ゴシック";
  font-size: 30px;
  box-sizing: content-box;
}
.ruler {
  font-size: 0;
  padding: 5px;
  width: 100%;
  white-space : nowrap;
  overflow : hidden;
}
.ruler li {
  display: inline-block;
  font-size: 9px;
  text-align: right;
  border-bottom: 1px solid #000;
}
.ruler li:nth-child(odd) {
  color: #aaa;
  border-bottom: 1px solid #aaa;
}
textarea {
  border:none;
  width:100%;
  padding:5px;
}
</style>
</head>
<body>
<ul class="ruler">
  <li class="ruler-scale">5</li>
  <li class="ruler-scale">10</li>
  <li class="ruler-scale">15</li>
  <li class="ruler-scale">20</li>
  <li class="ruler-scale">25</li>
  <li class="ruler-scale">30</li>
  <li class="ruler-scale">35</li>
  <li class="ruler-scale">40</li>
  <li class="ruler-scale">45</li>
  <li class="ruler-scale">50</li>
</ul>
<textarea>あいうえおかきくけこさしすせそ</textarea>
<span id="sample" style="visibility:hidden;position:absolute;white-space:nowrap;"></span>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script>
$(function(){
  function strWidth(str) {
    var e = $("#sample");
    var width = e.text(str).get(0).offsetWidth;
    e.empty();
    return width;
  }
  $(".ruler-scale").each(function(){
    $(this).css({
      "width": strWidth("あ") * 5 + "px"
    });
  });
})
</script>
</body>
</html>
```
Linuxでディレクトリ配下のtgzファイルをすべて解凍する

仕事でVMのサポートファイルをチェックしなくちゃならなくなり、ホストが多すぎて泣けてきたので、Shellつかってみた結果を記載。

tgzファイルがおいてあるディレクトリで以下を順番に実行

```bash
for i in $(ls)
do
tar xvfz $i
done
```

shellマンセイ
同じ秘密鍵でSSH接続できるユーザーを追加する

#意味深なユーザー追加の経緯
勉強しようしようと思っていたらAWSの無料期間が過ぎ、IDCFクラウドの方が安いっぽいので乗り換えました。
AWSは「ec2-user」がデフォルトでしたが、IDCFは特に無いので、「root」以外のユーザーを追加します。
それでもって、rootと同じ秘密鍵でログインできるようにします。
セキュリティ的にビミョーな気がしますが、業務ではなく個人の趣味程度の環境なので、ユーザーを増やしても鍵は増やしたくなかったので。。。
だったらrootだけでいい気もしますが、お勉強のためという事で。。。


#同じ秘密鍵でSSH接続できるユーザーを追加する
##とりあえずユーザーを追加する
まずはrootで

```
# useradd ユーザー名
# passwd ユーザー名
```

最初はユーザーを追加するだけでいいかなと思ったんですが、
デフォルトではパスワードのみのログインが許可されていないようです。
>[Q.A. SSH Keyなしで作成した仮想マシンへ接続方法は？](https://www.faq.idcf.jp/app/answers/detail/a_id/195/c/17)

せっかくなので秘密鍵を使うようにしてみようかなと！

###先ほど作ったユーザーに変更

```
# su - ユーザー名
```

##公開鍵を入れるディレクトリ、ファイルを作成

```bash
#ディレクトリを作成
$ mkdir ~/.ssh
$ chmod 0700 ~/.ssh
#公開鍵ファイルを作成
$ touch ~/.ssh/authorized_keys
$ chmod 0400 ~/.ssh/authorized_keys
```

※全てrootで作ってもいいが、所有者とグループがrootになってしまいchownしないといけなくなってしまうため、今回はユーザー変更

###rootに戻る
```bash
$ exit
```

##公開鍵のコピー
作成したユーザーにも同じ鍵をコピーします。

```
# cp /root/.ssh/authorized_keys /home/ユーザー名/.ssh/authorized_keys

公開鍵はココ↓に入っていました
/root/.ssh/authorized_keys

```

これで終了！
後はいつもsshでrootのところを任意のユーザー名にすれば、いつもの秘密鍵でログインできると思います。

自分でもこれって意味あるの？って気もするのですが、、、ｗ
何かツッコミ等ありましたらお願いしますm(_ _)m

次は普通に新しい鍵を使うユーザーを追加しますｗ
MySQLにはunicode_ci照合順序においてバックスラッシュを含む文字列を検索できないバグがある


MySQLのLIKE句で「ほげ」を含む文字列を検索したい場合、以下のように書く。

```sql
SELECT * FORM items WHERE name LIKE '%ほげ%'
```

MySQLのLIKE句はデフォルトでバックスラッシュがLIKE句のエスケープ文字なので、バックスラッシュを含む文字列検索したい場合は二重にエスケープして以下のように書く。

```sql
SELECT * FROM items WHERE name LIKE '%\\\\%'
```

……のだが、utf8_unicode_ciなどの照合順序で検索した場合、このクエリはバックスラッシュにマッチしないバグが報告されている。

[MySQL Bugs: #63829: Search containig backslash doesn't work if field collation is utf8_unicode_ci](http://bugs.mysql.com/bug.php?id=63829)

手元で確認したところ、このバグはまだ修正されていない。

# ワークアラウンド

## エスケープ文字を別の文字で置き換える

```sql
SELECT * FROM items WHERE name LIKE '%\\%' ESCAPE '$'
```

この場合、バックスラッシュの代わりにドル記号が検索できなくなる。

## CHARINDEXを使う

```sql
SELECT * FROM items WHERE CHARINDEX('\\', name) > 0
```

この場合、「含む文字列」以外のマッチングはできなくなる。
MySQLでutf8mb4なテーブルで照合順序を明示的に指定した際にエラーが発生した

MySQLのバージョン: 5.5.44-0+deb8u1 (Debian)

普段はutf8で利用しているデータベースで、utf8mb4なテーブルを作成する必要があった。

```sql
mysql> CREATE TABLE items (name VARCHAR(30)) DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO items (name) VALUES ('hogehoge');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * from items;
+----------+
| name     |
+----------+
| hogehoge |
+----------+
1 row in set (0.00 sec)
```

で、このテーブルからSELECTする際に照合順序を明示的に`utf8mb4_unicode_ci`に指定すると、エラーが出る。

```sql
mysql> SELECT * FROM items WHERE name LIKE '%ge%' COLLATE utf8mb4_unicode_ci;
ERROR 1253 (42000): COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'utf8'
```

調べたところ、このエラーは`character_set_database`が関係しているらしい。

```sql
mysql> SHOW VARIABLES LIKE 'character_set_database';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.00 sec)
```

LIKE句の文字列をutf8mb4でキャスト(?)すると解決する。

```sql
mysql> SELECT * FROM items WHERE name LIKE _utf8mb4'%ge%' COLLATE utf8mb4_unicode_ci;
+----------+
| name     |
+----------+
| hogehoge |
+----------+
1 row in set (0.00 sec)
```

Railsだと以下のように書く。

```rb
Item.where('name LIKE _utf8mb4? COLLATE utf8mb4_unicode_ci', '%ge%')
```