OmniAICreator/Qiita-1.07M huggingface dataset:
ParaViewでCSVファイルを読み込んで３次元上に点で表示する

#ParaViewのダウンロード
http://www.paraview.org

#CSVファイルの仕様
カンマ区切りで要素が指定され、１行目にカラム名が書かれたテキストファイルです。

例

```:sample.csv
x,y,z,value,
0,0,0,0,
1,0,0,0.5,
0,1,0,0.2,
0,0,...,
....,
```


上記の例は、x,y,z,valueという４種類のデータが連なっているファイルです。

#ParaViewにcsvを読みこませる
<img width="507" alt="スクリーンショット 2015-12-22 13.01.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/4caadb5f-75d3-ff53-f7b8-242995be3f5e.png">

ParaViewを起動し、Openからcsvファイルを選択します。
Pipeline Browserエリアへドラッグアンドドロップすることもできます。
**この時、csvファイルのディレクトリパス内に日本語が含まれていると正しく読み込めません。**

<img width="350" alt="スクリーンショット 2015-12-22 13.08.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/e4410229-b24e-87f6-a1c5-640cc1457a5f.png">
Pipeline Browserのcsvを選択し、PropertiesからApplyを選択します。
ApplyするとSpreadViewが表示され、cvsの中身が表として表示されます。
ここで、データが正しく読まれているか確認してください。
![スクリーンショット_2015-12-22_13_09_11.png](https://qiita-image-store.s3.amazonaws.com/0/24979/8ebce127-1a3d-2c2d-2a5a-7424688e9b8c.png)

#読み込んだデータを点で表示する
<img width="1153" alt="スクリーンショット 2015-12-22 13.12.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/482445aa-5ba6-530e-938f-a28459d7d7f6.png">
Filter>Alphabetical>Table to Pointを選択します。

選択すると、Pipeline Browserに`TableToPoints1`が追加されるので、選択します。
PropertiesのX Column,Y Column,Z Columnからそれぞれcsvファイルのどのカラムに対応したものなのかを選択しApplyします。

<img width="348" alt="スクリーンショット 2015-12-22 13.15.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/8a94e2bd-66fc-eb16-1086-afffe212d39a.png">

以下のようにRenderViewにデータが表示されることを確認します。

<img width="538" alt="スクリーンショット 2015-12-22 13.16.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/56eac6d5-f873-bae5-6207-ee7fdb5d7d73.png">

このままでは座標を表示しただけなので、データの中身を色として可視化させます。
さきほどx,y,z座標を指定したPropertiesから
Display>Coloring
にあるフォームでカラム名を指定すると、そのデータの最小値を青・最大値を赤として色を付けてくれます。

<img width="333" alt="スクリーンショット 2015-12-22 13.18.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/c68452a6-3c27-d3ef-869e-2c8c9de3395a.png">

適用↓

<img width="875" alt="スクリーンショット 2015-12-22 13.19.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/7b50151f-1774-5ae5-d06f-8e7b0311a22c.png">

n/aやnullなど、データが不正な部分は黄色として表示されます。
Vagrantのはじめかたメモ

久しぶりに使ったら忘れていたので備忘録

# 前提
・Vagrantが導入されていること

1.サイトへアクセスして、boxを見つける。

http://www.vagrantbox.es/
たくさんリストが出てくるので、使いたいやつのURLをコピーする。

2.設定ファイル(Vagrantfile)を作成したいディレクトリに移動して以下のコマンド

```
vagrant box add {title} {url}
vagrant init {title}
```

3.Vagrantfileの編集
編集してPrivateIPの設定を行う。
以下の部分の#を外して、コメントを解除する。
で、任意のIPアドレスに変更する。

```
config.vm.network "private_network", ip: "192.168.33.200"
```

4.起動する。

```
vagrant up
vagrant ssh
```


なので、例えば

```
mkdir centos7
cd centos7
vagrant box add centos7x64 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
vagrant init centos7x64
vi Vagrantfile
vagrant up
vagrant ssh
```

みたいな感じで接続までいける。
設定画面で文字入力をした時に改行でキーボードを閉じる方法

Tweakで何かしらユーザーが文字列を入力して設定に反映させるとき、キーボードを閉じる必要があります。

今回は簡単にキーボードの改行（return）で、キーボードを閉じる方法を紹介します。

##PreferenceBundles
Resourcesフォルダに必要なファイルを入れますが、設定用のplistで文字入力する部分を作成します。

```lang:NotifyWifi.plist
<dict>
			<key>PostNotification</key>
			<string>com.ichitaso.NotifyWiFi.preferencechanged</string>
			<key>cell</key>
			<string>PSEditTextCell</string>
			<key>cellClass</key>
			<string>NWEditTextCell</string>
			<key>default</key>
			<string></string>
			<key>defaults</key>
			<string>com.ichitaso.NotifyWiFi</string>
			<key>key</key>
			<string>whiteList1</string>
			<key>label</key>
			<string>White SSID 1</string>
			<key>placeholder</key>
			<string></string>
</dict>
```
key:cellは「PSEditTextCell」にします。

そこにcellClassを追加します。今回は、<strong>NWEditTextCell</strong>という名前で入力しておきます。

##設定側でのコード
```objc:Preference.m
@interface NWEditTextCell : PSEditableTableCell
@end
@implementation NWEditTextCell
- (BOOL)textFieldShouldReturn:(id)arg1
{
    return YES;
}
@end
```
これを「PreferenceLoader」のxxx.mないしxxx.mmファイルに追記することによって、改行を押した時にキーボードが閉じて設定が反映されるようになります。

ポイントは、cellClassと同じ名前でクラスを記述して下さい。

簡単ですがちょっとした気遣いになりますね！

以上で私の「iOS Jailbreaking Advent Calendar 2015」はおしまいです。

ありがとうございました！
プログラムコンテスト攻略のためのアルゴリズムとデータ構造 ALDS_1_1_D:Maximum Profit p46

<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/4839952957/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4839952957&linkCode=as2&tag=masakinihirota-22">プログラミングコンテスト攻略のためのアルゴリズムとデータ構造</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=masakinihirota-22&l=as2&o=9&a=4839952957" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
p46 の Maximum Profit

Jは最大値を探せばいいからn回探索になる。
**Jから左側の最小値を記憶しておけば良い。**＜＜この発想ができる事が鍵。
毎回最小値を探しに行かなくてよくなる。
計算量はこれでO(n)となる。
これは特殊な番兵問題だろうか？

[SublimeText3でC++を気軽に実行する環境を作る。 - Qiita](http://qiita.com/masakinihirota/items/c86cc07c89f87c671928)
sablime txt3からの実行では入力ができないので手動入力部分をコメントアウトした。

```cpp
#include "iostream"
// #include "algorithm"
using namespace std;
// static const int MAX = 200000;

int main()
{
	/* 手動入力
	int R[MAX],n;

	cin >> n;
	for (int i = 0; i < i < n; ++i) {
		cin >> R[i];
	}
    */
	const int n = 6;
	int R[n]={5,3,1,3,4,3};

	int maxv = R[1] - R[0];
	int minv = R[0];

	for (int j = 1; j < n; ++j) {
		maxv = max(maxv, R[j] - minv);
		minv = min(minv, R[j]);
	}

	cout << maxv << endl;

	return 0;
}

```



|入力|出力|
|:-----------|:-----------|
|6個|利益 3|
|R[0] = 5|
|R[1] = 3|
|R[2] = 1|
|R[3] = 3|
|R[4] = 4|
|R[5] = 3|

maxv R[1]-R[0] = -2(もしくは-10^9以下)
minv R[0] = 5	R[j]の最小値

R[j]よりも左側の最小値を記憶しておく。
それをR[j]の最高値から引けば答えが出る。

アルゴリズム
Jを1からn-1まで（＝全部調べる）
maxv maxvとR[j]-minvの大きい方＜＜利益
minv minvとR[j]のうち小さい方


| j | R | maxv | minv | 
|:-----------|:-----------|:-----------|:-----------|
|  | R[0] = 5 | -2 | 5 | 
| 1 | R[1] = 3 | -2 | 3 | 
| 2 | R[2] = 1 | -2 | 1 | 
| 3 | R[3] = 3 | 2 | 1 | 
| 4 | R[4] = 4 | 3 | 1 | 
| 5 | R[5] = 3 | 3 | 1 | 


参考図書
<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/4839952957/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4839952957&linkCode=as2&tag=masakinihirota-22">プログラミングコンテスト攻略のためのアルゴリズムとデータ構造</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=masakinihirota-22&l=as2&o=9&a=4839952957" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

すぐに理解できなかったのでメモ。
いまだに２重ループになると、どの数値がどのように動くのか瞬時に理解できない、これは回数を重ねて問題を解くしか無い・・orz。
Swiftで覚えておくと地味に役立つ機能3選

Swiftで知られてない事が多いけど時々役に立つ機能を上げてみました。

## 2重for文の外側をbreakで抜ける
Swiftでは指定のfor文をbreakで抜ける構文が用意されています。
ラベルを指定してbreakする事で対象のfor文を抜ける事ができます。

```swift
label: for i in 0...1 {
    for j in 0...10 {
        if j == 4 { break label }
    }
}
```

continueも使う事ができます。

```swift
label: for i in 0...1 {
    for j in 0...10 {
        if j == 4 { continue label }
    }
}
```

whileに対しても使えます。

```swift
var i = 0
label: while true {
    if i == 5 { break label }
    i++
}
```

if文に使う事もできるようです。

```swift
label: if true {
    if true {
        break label
    }
}
```

switch文にも使う事ができます。

```swift
label: switch 1 {
case 1:
    break label
default: break
}
```

## dynamicTypeで自分のクラス名を知る
dynamicTypeを使うと自分のクラスを知る事ができます。
AnyObjectの中身を知る時などに重宝します。

```swift
print("".dynamicType) // → String
```

dynamicTypeなのですが、これは自分のクラスを返すものです。
なのでdynamicTypeを使えばクラスメソッドを呼び出す事もできます。

```swift
class MyClass {
    class func classMethod() {}
}

MyClass().dynamicType.classMethod()
```

自分のインスタンスを返したい時はselfを使います。

```swift
class MyClass {
    func instanceMethod() {}
}

MyClass().self.instanceMethod()
```

## インスタンスの生成を送らせてくれるlazy
lazyを使うとインスタンス生成のタイミングを利用時までずらす事ができます。

```swift
class FirstViewController: UIViewController {
    lazy var myClass = MyClass()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 1 → initialized の順番でログが出力される
        print(1)
        _ = myClass // この時に初めてMyClassのinitが走る
    }
}

class MyClass {
    init() {
        print("initialized")
    }
}
```

下のように「BaseViewControllerの上にViewControllerが2つある」「初期表示の高速化の為に表示しないViewControllerの初期化はギリギリまで待ちたい」というケースで良く利用しています。

<img width="307" alt="スクリーンショット 2015-12-22 11.27.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/61598/df0d8c1a-2f0e-e211-70f2-ba660d79700e.png">

```swift
class BaseViewController: UIViewController {
    lazy var firstViewController  = UIStoryboard(name: "FirstView",  bundle: nil).instantiateInitialViewController()
    lazy var secondViewController = UIStoryboard(name: "SecondView", bundle: nil).instantiateInitialViewController()
}
```
mysqlに登録されているユーザ一覧を確認したい

# 概要
* MySQLに登録されているユーザの一覧を見たい

# SQLの例

* 対象のMySQLサーバへroot権限でログイン後下記のSQLを実行

```bash
select User,host from mysql.user;
```

* 結果

```bash

mysql> select user,host from mysql.user;
+--------------+-----------+
| user         | host      |
+--------------+-----------+
| root         | 127.0.0.1 |
| root         | ::1       |
| root         | localhost |
+--------------+-----------+
3 rows in set (0.00 sec)
```
RailsからGoogle Cloud Vision APIを使ってみる


ようやく、アーリープレビューのアクセスがきたので、Railsから使ってみたいと思います。

## リクエストとレスポンス

まず、APIのリクストとレスポンスは、例えば画像に写っているものを認識するためのリクエストはこんな感じのを送ります。

```json
{
  "requests": [
    {
      "image": {
        "content": "jisYIujijJIUJI....";
      },
      "features": [
        {
          "type": "LABEL_DETECTION",
          "maxResults": 10
        }
      ]
    }
  ]
}
```

`content`にはBase64でエンコードした画像がはいります。

レスポンスは画像を解析した結果がはいります。

```json
{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/07dm6",
          "description": "tiger",
          "score": 0.9995195
        },
        {
          "mid": "/m/01280g",
          "description": "wildlife",
          "score": 0.96001059
        },
        {
          "mid": "/m/09686",
          "description": "vertebrate",
          "score": 0.85704827
        },
        {
          "mid": "/m/04rky",
          "description": "mammal",
          "score": 0.85094059
        },
        {
          "mid": "/m/089v3",
          "description": "zoo",
          "score": 0.788213
        },
        {
          "mid": "/m/0cdnk",
          "description": "panthera",
          "score": 0.73796427
        },
        {
          "mid": "/m/0307l",
          "description": "felidae",
          "score": 0.57086021
        },
        {
          "mid": "/m/01lrl",
          "description": "carnivora",
          "score": 0.56989247
        },
        {
          "mid": "/m/0891tx",
          "description": "toyger",
          "score": 0.52950406
        }
      ]
    }
  ]
}
```

適当にAPIを呼ぶクラスを作成して、コンストラクタをこんな感じにします。

```
def initialize(file_path)
  @endpoint_uri = "https://vision.googleapis.com/v1alpha1/images:annotate?key=#{ENV['SERVER_KEY']}"
  @file_path = file_path
end
``

`http-client`を使ってAPIをたたきます。

```ruby
def request
  http_client = HTTPClient.new
  content = Base64.strict_encode64(File.new(file_path, 'rb').read)
  response = http_client.post_content(endpoint_uri, request_json(content), 'Content-Type' => 'application/json')
  result_parse(response)
end
```

たたくときのリクエストはJSONに変換して、

```ruby
def request_json(content)
  {
    requests: [{
      image: {
        content: content
      },
      features: [{
        type: "LABEL_DETECTION",
        maxResults: 10
      }]
    }]
  }.to_json
end
```

受信したレスポンスをパースして、一番scoreが高いのだけとりだします。

```ruby
def result_parse(response)
  result = JSON.parse(response)['responses'].first
  label = result['labelAnnotations'].first
  "これは、#{label['description']}です。"
end
```

あと、CarrierWaveで画像などをあげれるようにします。そこら辺は以下のソースを参考にしてください。

https://github.com/hirotaka/google-cloud-vision


## 実行

適当に写真をアップロードします。

![虎.png](https://qiita-image-store.s3.amazonaws.com/0/4116/fe979db9-3383-4575-8406-374f48989ad4.png "虎.png")


ちゃんと虎と認識してくれますね。

## まとめ

あと、物体以外にもテキスト、顔、ロゴ、ランドマークなどを認識できるようです。

いままででも技術的にこういったことはできるとは思うのですが、Google Cloudにユーザ登録して数時間でここまでできてしまうのはすごいなと思いました。
unity > Mac版で作成したプロジェクトがWin版で動作が異なる > ProjectSettingsフォルダのupload忘れ

```txt:動作確認
Unity 5.1.3f
```

Mac OS X 10.8.5上でUnity 5.1.3fを使ってソフトを作成しているのだが、その同じプロジェクトを同じ5.1.3fのWindows版(64bit)でビルドすると、UI > Panelの重ね合わせ処理がWindows版ビルドではうまく動作しないことが分かった。

下の動作画像で本来Setting関連の項目が消えるはずなのだが、Mac版ビルドでは消えて、Win版ビルドでは消えない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6cd5383e-eb39-4175-fcea-923f96ab0baf.png)


問題の原因は以下のいずれなのか

- 64bit版はだめ 32bit版はOK
- Windows版はだめ 同じMac版はOK
- その他、環境の違い

Unity 5.3が出たが、5.2のバグで時間をとられて5.1.3fに戻した経緯があるので、5.3を試すかどうかも微妙なところ。

<hr>
Win64bit版でも、プレイモードではSettingパネルは隠れる。.exeファイルにして実行するとおかしくなる。

## 5.3.1f1でも改善せず

Unity 5.3.1f1(64bit) Win版を試したが同じ症状だった。

## 32bit版でも改善せず
(追記 2016/05/24)

Unity 5.3.1f1(32bit), 5.3.5f1(32bit), 5.2.4f1(32bit)などで試したが改善しなかった。

## フォルダごとコピーで正常動作
(追記 2016/05/24)

Mac上でビルドに使ったファイルを含むフォルダを丸ごとWindows(64bit)にコピーしビルドすると正常動作となった。

githubにあげたファイルでは足りないようだ。

### 正常動作のものから順次削除

正常動作するものからフォルダなど順次削除してみた。

ProjectSettingsフォルダを削除した段階で、動作がおかしくなった。

ProjectSettingsをgithubになぜあげてなかったか不明だが、これで対応できそうだ。
【C#】マウス操作event内でのsenderとeの操作。

# マウスダブルクリック時（DoubleClickイベント）
```lang:C#
private void hoge_DoubleClick(object sender, EventArgs e)
{
	if(((System.Windows.Forms.MouseEventArgs)e).Button == MouseButtons.Left)
	{
		//hoge
	}			
}
```


# マウスダブルクリック時（MouseDoubleClickイベント）

```lang:C#
private void hoge_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
	if (e.Button == MouseButtons.Left)
	{
		//hoge
	}
}
```




# マウスクリック時（MouseDownイベント）

```lang:C#
private void HeaderPanelOnMouseDown(object sender, MouseEventArgs e)
{
    if (e.Button != MouseButtons.Left) {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
    }
}
```


# マウスダブルクリック時（MouseDownイベント）

```lang:C#
private void HeaderPanelOnMouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && e.Clicks >= 2) {
        MaximizeOnClick(sender, e);
        return;
    }

    if (e.Button != MouseButtons.Left) {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
    }
}
```
JSでカーニングエンジンを作ってみる 3回目



[前回](http://qiita.com/s_s_k/items/56db30196492ebab6308)は行頭処理を実装しました。実は不具合がちらほらあるのが発見されました。それは後ほど解説します。

今回は各文字のカーニングを実装します。


### 文字のペアを定義
文字"A"と文字"B"のセット、というようにカーニングを指定したペアを設定します。
まずは効果が大きい約物を設定しましょう。
こんな感じです。

```PIPKerningHiragino.js
module.PIPKerningTable.table = {
    '、*' : -0.1,
    '「*' : -0.2
};

```

約物は様々な文字との組み合わせが発生するので、"*"をワイルドカードとして設定します。
もちろん普通の文字も設定できます。

```PIPKerningHiragino.js
module.PIPKerningTable.table = {
   'って': -0.5,
   'ちょ': -0.5 
};
```

実際はカーニングテーブルにたくさんのペアを設定していきます。


### カーニング値を反映

先ほど作ったテーブルデータを利用して、文字のカーニングを設定します。
カーニング値を反映する場合は

1.ワイルドカード設定を調べる
2.具体的なペアの値を調べる

という順番で進めます。より具体的な方を優先するということです。

```PIPKerning.js
var characters = str.split('');
var table = PIPKerningTable.table;
var len = characters.length - 1; // 最後の文字は何も指定しない。
var output = "";
for(var i = 0; i < len; ++i){

    // 次の文字ワイルドカードのペアを調べる
    var pair   = characters[i] + '*';
    var result = table[pair];

    // ワイルドカードと次の文字
    if(!result) {
        pair  = '*'+characters[i+1];
        result = table[pair];
    }

    // 文字のペア
    pair = characters[i] + characters[i+1];
    if(table[pair]) result = table[pair];

    if(!result) result = 0;
   // result = 0;
    output += '<span style="display: inline-block; letter-spacing: '+ result +'em;">' + characters[i] + '</span>';
}

// 最後の文字
output += '<span style="display: inline-block; ">' + characters[len] + '</span>';
```


こんな感じで実装できます。
これでそれなりにカーニングが効くようになりました。
しかし前回の行頭処理に不具合が発生します。それは本来は改行される文字が、カーニングによって改行位置がずれるということです。
また、ブラウザがリサイズされた場合の処理も必要です。
この辺りは次回に対方法を紹介します。

ソースコードについては、完成した時にgithub上にでも公開します。(すみません、まだ開発中なので...)
ECCUBE2 で管理画面を中央表示させる


html\user_data\packages\admin\css\admin_contents.css

を編集

/* コンテンツ
----------------------------------------------- */以下に

#container div{
    margin: 0 auto;
}
と記入する。

これでサブタイトル以外は中央へ

data\Smarty\templates\admin\main_frame.tpl
を編集

\<!--{if $tpl_subtitle}-->
\<h1><span class="title"><!--{\$tpl_maintitle|h}--><!--\{if strlen(\$tpl_maintitle) >= 1 && strlen(\$tpl_subtitle) \>= 1}-->＞<!--{/if}--><!--{$tpl_subtitle|h}--></h1>
\<!--{/if}-->

これをdivでくくってもmargin autoが効かないので
すぐ上のナビのdivの中に一緒に放り込む
ulの下　/divの上

このような感じ


 \</ul>
<!--{if $tpl_subtitle}-->
\<h1><span class="title"><!--{\$tpl_maintitle|h}--><!--{if strlen(\$tpl_maintitle) >= 1 && strlen(\$tpl_subtitle) >= 1}-->\＞<!--{/if}--><!--{\$tpl_subtitle|h}--></h1>
\<!--{/if}-->
\</div>
\<!--{* ▲NAVI *}-->

これですべてが中央ぞろえになる。

![center.jpg](https://qiita-image-store.s3.amazonaws.com/0/87543/89403118-ef6a-9ba9-f2eb-cdfb323de5b2.jpeg)
初めてのElectronを作るためのアドバイス

Electronアドカレの19日目の記事になります。いろんな事情で、3日遅れてすみませんでした。 :bow: :bow: :bow:

「Write once, run anywhere（一度書いて、どこでも実行できる）」は一度Javaのスローガンでした。Universal Javascriptが躍進したおかげで、昨今のJavaScriptは多分もっとこのスローガンが描いた姿に近いです。

その中、特にNode-WebkitやElectron（昔のAtom-shell）のおかけで、デスクトップの開発経験のまったくないWeb開発者にとっても、デスクトップアプリケーションを簡単に作れる世の中になりました。しかもJavaScriptのスタックで。

これから初めてElectronアプリケーションを作る方には、自分が初めてアプリを作った時の気づきをいくつか共有したいと思います。

## まずどこから始める？

Electron開発を始めるに一番の近道はまずアプリを作ることです。公式の[「Quick Start」](http://electron.atom.io/docs/v0.36.0/tutorial/quick-start/#quick-start)からはかなり手軽に始められますが。
日本語のチュートリアルなら、nyanchuさんの[「30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで」](http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29)がおすすめです。

最初のアプリを立ち上げたら、次はどんどん自分の入れたい機能を盛り込んでいいです。

もしどう実装するかについて迷ったら、ほかのElectronアプリを参考することはおすすめです。そのなかにもAtomはデスクトップアプリとしてはかなり広くいろいろな機能を実装しているので、そのソースコードは特に参考になります。

## アーキテクチャに慣れよう

Electronの潜在力を引き出すには、アーキテクチャをよく把握する必要があります。Electronの内部は2つの空間にわけられています。一つはメインプロセス（Node.jsのコードを実行する空間）、もう一つはレンダラープロセス（ブラウザ側のJavaScriptを実行する空間）。

大体の場合は「ipcMain/ipcRenderer」モジュールと「remote」モジュールで、メインプロセスとレンダラープロセスの間で通信すると思いますが、この方法にはすこし副作用があります。

「ipcMain/ipcRenderer」はAPIドキュメント通りにメッセージとイベントを通じて通信する仕組になります。逆に「remote」モジュールは一見同期通信のように見えますが、本当はちょっと違っています。「remote」モジュールは実際裏側では「ipc」と同じようなことをやってますので、「remote」を通じて得たオブジェクトは多く場合、Getter関数の集まりになります。しかも、遅延評価の関数の場合が多いですので、もし「remote」を使って通信する場合、予期しない挙動が起こる可能性があります。十分注意を払わないといけません。

## クロスプラットフォーム対応に気をつけよう

メインプロセスを重宝するアプリでしたら、ちゃんと対応OSでテストすることが大事です。特にElectron以外のNode.js側のNPM依頼を持ってる場合、MacOSとLinux環境しかサポートしないケースが多いです。

さらに、OSごとのUIガイドラインやショットカットキーのパターンが違っているので、使いやすいUXを実現するには、やはりOSごとのチューニングが必要になってきます。Electronはクロスプラットフォームのローレベルの面倒をけっこう見てくれますが、UXに関しては自分でブラッシュアップしないといけないところが多いです。

## 適材適所にパッケージを選ぼう

初めてElectronのアプリを作るとき、〇〇の機能は一体メインプロセスとレンダラープロセスのどっちに置くかは絶対迷うと思います。例えば、ショットカットキーはメインプロセスの「Menu」モジュールで実装できれば、レンダラーで「Mousetrap」とかのライブラリーでも実装できます。

そこには絶対的な正解はありません。例えば、Nativeと全く同じような挙動をしたい、メニューバーにも見せたい場合は、前者が一番あってます。もしElectronアプリとしてだけではなく、Chrome Web Storeにも出したければ、Electronのモジュールから疎結合して、なるべくブラウザ側のライブラリを使うのが正解に近いかもしれません。Slackのアプリのように、両方を混ざるというアプローチも全然アリです。

オープンソースのプロジェクトもまたいい参考資料になれます。例えば、Atomはatom-keymapという別のパッケージを持っていて、そこで各モードやOS別のショットカットキーを一括管理しています。もちろん自分のアプリにも導入できます。

## 参考資料

* Awesome Electron https://github.com/sindresorhus/awesome-electron  
  Electron参考資料のまとめといったらこれですねw
* Building a desktop application with Electron https://medium.com/developers-writing/building-a-desktop-application-with-electron-204203eeb658#.xkfy8j4k0  
  ステップ・バイ・ステップでElectronアプリを作成手順を紹介する記事、初心者にはオススメ
JAVA System.out.printlnを記述することが面倒なので、省略する方法

ソースコードの先頭で、
<FONT color="#ff0000">import static java.lang.System.*;</font>
という宣言をしておくことで、次のようなコードの記述も可能になります。

▪️例

```java
import static java.lang.System.*;

public class Test68 {
	public static void main(String[] args) {
		out.println("System.部分を省略出来ます");
		out.println("Java");
		System.out.println("Hello World");
	}
}
```

▪️実行結果
System.部分を省略出来ます
Java
Hello World
D言語でPortAudioとかlibsndfileを叩いてたらコマンドラインで動く音楽プレーヤーが出来てた。

# 初めに
ふとしたきっかけで、D言語で音を扱いたいなぁって思って調べていると
[PortAudioを使ってD言語で波形を鳴らす](http://qiita.com/ueshita/items/98e6a45d2ab0bda1bd43)
という記事を発見しました。

そこで、ビビビッときた僕はこれで上手いことやれば、コマンドラインで動く音楽プレーヤーが開発できるのでは...?と考えて手を動かしたところ、
出来ました。

こちらです: [Github alphaKAI/yacmp](https://github.com/alphaKAI/yacmp)
`yacmp`という命名に関しては、Yet Anotoher Console Music Playerの各単語の頭文字をくっつけただけという安直なネーミングです。


# 技術的な話。
まずはじめに使っているライブラリとかについて。
`PortAudio`を ウォルター先生がポーティングしてくださった、バインディングを用いて使っています。
バインディング : [PortAudio D bindings](https://github.com/D-Programming-Deimos/portaudio)
また、`libsndfile`に関しては適当に`dub`で検索していた所、以下のバインディングを見つけたのでそれを使いました。
[derelict_extras-sndfile](http://code.dlang.org/packages/derelict_extras-sndfile)


次に、コードについて。
最初に断っておくと、あまり綺麗な実装では無いです。_
操作のためにマルチスレッドで色々としているのですが、とりあえず動けばいいや、といった考えで手を動かしていたらいつの間にかできていた、ということもあってフラグ管理とかが普通に甘いです。
多分適当に触ってると普通にバグを踏みそうです。(幾つかケースは想定できていますが、面倒なのでいつか時間があれば...)。

簡単に何が汚いかを書いておくと、
`shared static`な変数を用いて関数間を横断して色々と情報を共有しています。
これ用のクラスを作って隠蔽して〜とかもやればよかったなぁとは思いますが、先ほど行ったとおりいつの間にかできていたので、はい。

実際の所、このプログラムはほとんど`PortAudio`と`libsndfile`に関するサンプルをネットで検索している中で見つけたサンプルをD言語にコンバートしてチョットだけミュージックプレイヤーっぽくしただけ、というようなものです。
それ故に、コードに関する解説はあまり必要ないと思いますのでここでは言及しないことにします。


とりあえず、動くようになってはいるので
適当にforkするなどして、`Dlang UI`等のGUIツールキットと組み合わせれば簡単にD言語でミュージックプレイヤーアプリケーションが開発できます。

また、最後に注意としては
音楽ファイルの読み込みに`libsndfile`を用いているのですが、READMEに

> ##Supported formats
> Supported formats are based on that of libsndfile.  

と書いたとおり、読み込める音楽ファイルのフォーマットは`libsndfile`がサポートしているフォーマットに基づきます。
したがって、`libsndfile`は`MP3`に対応していないので`yacmp`も`MP3`には対応していません。
何故、`libsndfile`が`MP3`をサポートしていないのかということは`libsndfile`の公式ページの`FAQ`に書いてあります。
[libsndfile : Frequently Asked Questions. / Q20 : Why doesn't libsndfile support MP3? Lots of other Open Source projects support it! ](http://mega-nerd.com/libsndfile/FAQ.html#Q020)


とりあえず、D言語で`PortAudio`と`libsndfile`を叩いていたらいつの間にかコマンドラインで動く音楽プレーヤーができていたのでそれの紹介をしました。
(手を動かしていたらいつのまにか音楽プレーヤーができているとか、D言語ってやっぱり強力だなぁと思いました。)
社内ツールもHomebrewで配布する


[Homebrew](http://brew.sh/)は本家のFormula以外も`tap`コマンドで取り込む仕組みをもつ ([HomeBrewで自作ツールを配布する](http://deeeet.com/writing/2014/05/20/brew-tap/))．

`tap`は基本的にはGithub上のレポジトリを前提にしているが，Github以外のレポジトリ（e.g., GHEやBitbucket）でも使うことができる．つまり外部には公開したくない社内ツールもHomebrewで配布することができる．

以下のようにする．

```bash
$ brew 	username/tapname https://private-repo.com
$ brew install tapname
```

### 参考

- [Set up a homebrew tap with a git repository on a private network](http://stackoverflow.com/questions/28241061/set-up-a-homebrew-tap-with-a-git-repository-on-a-private-network)
CoreAnimationでカスタムのEasing Functionを使う

CoraAnimationでは、timingFunctionで、Easing Functionを設定できます。これにより、やりリアルで自然なアニメーションを表現できます。

```swift
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
```

ですが、標準で用意されているのは、次の５つのみです。

- Linear
- EaseIn
- EaseOut
- EaseInEaseOut
- Default

## カスタムのEasing Functionを使う
上記の５つ以外にもEasing Functionはたくさんあります。

![image](https://qiita-image-store.s3.amazonaws.com/0/12352/8a5aa8be-fda7-88cf-a977-c3ee3be19adf.png)

[Easing Function 早見表](http://easings.net/ja)をみると、その一覧と実際のアニメーションも見ることができて便利です。例えば、この中の[EaseInOutBack](http://easings.net/ja#easeInOutBack)を使う場合は、cubic-bezierの値をコピペしてこうします。

```swift
animation.timingFunction = CAMediaTimingFunction(controlPoints: 0.55, 0, 0.59, 0.13)
```

完全に値をカスタマイズしたい場合は、[cubic-bezier.com](http://cubic-bezier.com/#.17,.67,.83,.67) を使って、cubic-bezierを調整しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/12352/00d08ed8-bef1-6892-02bc-4c192c98daad.png)


## おまけ
EaseInとかEaseOutとか単語が多くて混乱するときは、こういうふうに覚えるといいです。

- EaseIn：Ease（ゆっくり）In（入る）
    - ゆるやかに始まるアニメーション
- EaseOut：Ease（ゆっくり）Out（出る）
    - ゆるやかに終わるアニメーション

easeはeasyからきていて、「気楽さ」とか「ゆっくり」といった意味があります。
HCIアドベントカレンダー　Bloctopus: A Novice Modular Sensor System for Playful Prototyping

#はじめに
こんにちは．
この記事は[「ヒューマンコンピュータインタラクション論文紹介 Advent Calendar 2015」](http://qiita.com/advent-calendar/2015/hci)の22日目です．アドベントカレンダー自体書くのが初めてですが，今回はTEI（The ACM International conference on Tangible, Embedded and Embodied Interaction）という学会の論文を読んでみました．

今回紹介するのは，[「Bloctopus: A Novice Modular Sensor System for Playful Prototyping」](http://dl.acm.org/citation.cfm?id=2680581&CFID=567921748&CFTOKEN=61046530)という論文です．自分が電子工作支援の研究をやっているので面白そうだな，と思って選んでみました．
#論文紹介
動画
[![動画](https://i.vimeocdn.com/video/478726457_300x168.jpg)](https://vimeo.com/98114917)

USBで素子を挿す電子工作，（回路作成はビジュアルプログラミング言語で）という感じです．

##概要
- タンジブルはプロトタイピングに適している
- しかし複雑なことをしようとするとセンサが必要
- これには初学者が技術的なことを学ぶ必要性
- Arduinoは確かに簡単にしているが，手動で回路を作る必要がある
- Bloctopus（提案システム）ではUSBで接続でき，MIDIを用いて通信する
- データフローだけに注目してプロトタイピングできる！

##はじめに
- 機能を持つ電子機器のプロトタイプを作るのは初学者にとってチャレンジングだ！
- (i)回路を作ること (ii)プログラミング　はプロトタイピングの障壁
- 今までのツールキットは簡単にして抽象化（LEGOマインドストーム）またはtextual programingと連携が必要になる（Arduino）
- 最近のトレンドはその中間！
- アイデアの発案と動くプロトタイプを作ることのギャップを埋める！

##寄与
- システムの実現可能性のデモ　USBとMIDIを用いてダイレクトにつなげる
- ウェブベース　「executed live」「hybrid visual-textual」プログラミング
- モジュラーにした時のトレードオフの測定
- ケーススタディ

##THE BLOCTOPUS SYSTEM
- スタンダードMIDIデバイスとしてよくあるUSBを使用
- Hartmann「でかいモジュールはデザイナが作るプロトタイプを制限」→できるだけ外のガワを減らした
- Web-Based Visual Programmingを使用（Javaアプレット）
torus - pt のホモトピー型

この記事は、とある理由でタイトルにあることの説明をする必要があったため、まぁどうせだし投稿するか、で書いたものです。
駄文です。

本論
======

torus を 

```math
\mathbb{C}/ \Lambda \\
or \\
\mathbb{I}^2 / \sim
```

で考えることが多いように思う。上の $\Lambda$ は複素平面の lattice と言うやつだ。今回は全く関係ない。
別にこのままでも構わないが、今日は変位レトラクトを考えるために今日は

```math 
D^2/ \sim
```

で考えることとする。この時の同値関係は $D^2 \cong \\mathbb{I}^2$ 　から自然に導かれる同値関係を使う。
さて、次の写像

```math
f_t : D^2 - \left\{0\right\} \to S^1 \\
f_t(x, y) = \left\{ (1-t) + \frac{t}{\sqrt{ x^2+y^2} }\right\}(x, y)
```

とすると、これが変位レトラクトになることが分かる。
かつ、この写像は同値関係を保つ。

以上より


```math
\begin{align}
T^2-\left\{pt\right\} &= \mathbb{I}^2 -\left\{pt\right\}/ \sim \\
&= D^2 - \left\{0\right\}/  \sim \\
&\underset{h.e.}{\sim} S^1 / \sim \\
&= S^1 \vee S^1
\end{align}
```

上の $S^1$ 二つはそれぞれ meridian と longitude にあたることは明らかだろう。
リモートホスト上で、ローカルにあるスクリプトを動かす

# 概要

bashやpythonのスクリプトを改変なしで、ファイルのコピーをせず、リモート実行する。

# 詳細

こんなスクリプトを動かしたい

```sample.sh
#!/bin/bash

for arg in init ${@};do
    echo "$(date +%Y-%m-%dT%H:%M:%S) $(hostname) ${arg}"
    sleep 1
done
```

```
$ ./sample.sh a b c
2015-12-22T11:30:26 local-host init
2015-12-22T11:30:27 local-host a
2015-12-22T11:30:28 local-host b
2015-12-22T11:30:29 local-host c
```

# 基本的なアイデア

## 1. sshで、リモートのshellのstdinにスクリプトを投入できる。

```
$ cat sample.sh | ssh user@remote-host
2015-12-22T11:31:43 remote-host init
```

## 2. bashは、stdinの内容をファイルとして受け取れる

```
$ cat sample.sh | bash <(cat -) a b c
2015-12-22T11:33:47 local-host init
2015-12-22T11:33:48 local-host a
2015-12-22T11:33:49 local-host b
2015-12-22T11:33:50 local-host c
```

## 3. hereドキュメントを使えば、ファイルを作らなくてもスクリプト実行できる

```
$ cat << 'EOT' | bash <(cat -) a b c
> for arg in init ${@};do
>     echo "$(date +%Y-%m-%dT%H:%M:%S) $(hostname) ${arg}"
>     sleep 1
> done
> EOT
2015-12-22T11:40:17 local-host init
2015-12-22T11:40:18 local-host a
2015-12-22T11:40:19 local-host b
2015-12-22T11:40:20 local-host c
```

# 実装

こんなスクリプト

```rdosh.sh
#!/bin/bash
echo -e "cat << 'EOT' | bash <(cat -) ${@:2}\n$(cat ${1}|sed -e 's/\\/\\\\/g')\nEOT"
```

* catしたままだと、\nなどがエスケープされるため、sedで\をエスケープする

実験

```
$ ./rdosh.sh sample.sh a b c | ssh user@remote-host
2015-12-22T11:42:48 remote-host init
2015-12-22T11:42:49 remote-host a
2015-12-22T11:42:50 remote-host b
2015-12-22T11:42:51 remote-host c
```

できた

# pythonも

こんなスクリプト

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

import sys
import os
import time
for arg in ["init"]+sys.argv[1:]:
    sys.stdout.write("{0} {1} {2}\n".format(time.strftime("%Y-%m-%dT%H:%M:%S"),os.uname()[1],arg))
    sys.stdout.flush()
    time.sleep(1)
```

```rdopy.sh
#!/bin/bash
echo -e "cat << 'EOT' | python <(cat -) ${@:2}\n$(cat ${1}|sed -e 's/\\/\\\\/g')\nEOT"
```

pythonも動いた

```
$ ./sample.py a b c
2015-12-22T13:20:29 local-host init
2015-12-22T13:20:30 local-host a
2015-12-22T13:20:31 local-host b
2015-12-22T13:20:32 local-host c
$ ./rdopy sample.py a b c | ssh user@remote-host
2015-12-22T13:20:46 remote-host init
2015-12-22T13:20:47 remote-host a
2015-12-22T13:20:48 remote-host b
2015-12-22T13:20:49 remote-host c
```
babel で出来ないこと

とりあえずメモ程度。
ES2015、stage-0 使用。

## 共通
- プライベートメンバ
- プライベートメソッド

## IE9
- `static` なメンバ、メソッドの継承。
- ~~`lodash` の `template` 中の arrow function。（とりあえずIE9で確認）~~  
  よく考えたら別に `babel` 変換するわけじゃないので `babel` の問題じゃなかった。  
  よく考えなくても分かるだろって感じだけど。
Androidアプリのwebviewで、https/http混在コンテンツを表示したい時の対応方法(Android L以降)

セキュリティ上の理由から、Android L以降ではhttpとhttpsの混在コンテンツのあるページをwebviewで表示しようとすると通信がブロックされるようになった。
※例えば、httpsのページ内でhttpの画像を表示しようとすると通信がブロックされ正しく表示されなくなった。

本来はサーバ側でhttpまたはhttps通信に統一するようにHTMLを修正するのが一番いいんでしょうけど、どうしても対応出来ない時の対応方法。

```java
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {

    WebView webView = (WebView) findViewById(R.id.webView);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // Andoird L未満と同じ設定にする「MIXED_CONTENT_ALWAYS_ALLOW」
        webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    }

}
```


・参考URL
http://developer.android.com/intl/ja/reference/android/webkit/WebSettings.html#setMixedContentMode%28int%29
Django で LESS を使う

# インストール

まずは、 node.js と lessc をインストール。ぐぬぬ。

```bash
$ brew install node
$ npm install -g less

$ which lessc
/usr/local/bin/lessc

$ lessc
lessc: no input files

usage: lessc [option option=parameter ...] <source> [destination]
...
```

インストールできました!

# PyCharmで Watcher 編 (オススメ)

PyCharm を使われている方は、自動コンパイルを簡単にすることができるのでオススメです。

まず、拡張子 .less のファイルを作ります。

そうすると、自動で 「ファイルウォッチャーに登録する? 」と聞いてきますので、すかさず Add watcher します。

![スクリーンショット 2015-12-22 10.46.30.png](https://qiita-image-store.s3.amazonaws.com/0/68302/aa81f208-378f-77bf-2546-8b0e74d2adb2.png)


すると、Less のウオッチャー登録のウインドウが現れます。

![スクリーンショット 2015-12-22 10.46.56.png](https://qiita-image-store.s3.amazonaws.com/0/68302/a67f6334-598e-59e0-5778-0cc116a0cd41.png)


先ほどインストールした lessc を認識していますので、このまま OK をクリック。

これでウォッチャーが動作してますので、less を編集し、保存すると自動で css をビルドします。簡単!

![スクリーンショット 2015-12-22 10.48.30.png](https://qiita-image-store.s3.amazonaws.com/0/68302/d67f1a98-1fce-8c1d-6449-eb35c2b599a8.png)

↑ 表示上は階層構造に見えますが、同一ディレクトリに CSS が自動で作られます。

# Django compresser でオンライン変換編

```bash
$ pip install django-compressor
```

`INSTALLED_APPS` に `compressor` を追加

参考のため、Django oscar の HTML ファイルを見てみると

```html:layout.html
    {% compress css %}
      {% if use_less %}
        <link rel="stylesheet" type="text/less" href="{% static "oscar/less/styles.less" %}" />
      {% else %}
        <link rel="stylesheet" type="text/css" href="{% static "oscar/css/styles.css" %}" />
      {% endif %}
    {% endcompress %}
```

こうなっています。 use_less は、settings.USE_LESS がそのまま使われます。

このような状態で、settings で

```settings.py
COMPRESS_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'compressfiles')

USE_LESS = True

COMPRESS_ENABLED = True

COMPRESS_PRECOMPILERS = (
    ('text/less', 'lessc {infile} {outfile}'),
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder'
)

```
こう設定すると、compless css ブロック内の less をまとめて ビルドしてくれます。

PyCharm でウォッチする場合と同様、ビルドされるのを意識しなくて良いためこれも便利です。

参考: [Settings — Django Compressor 1.6 documentation](http://django-compressor.readthedocs.org/en/latest/settings/)



# Django compresser のマネジメントコマンドでオフライン変換編

マネジメントコマンドでコンパイルする場合は、上記設定に加えて

```python:settings.py
COMPRESS_OFFLINE = True

COMPRESS_OFFLINE_CONTEXT = {
    'STATIC_URL': STATIC_URL,
    'use_less': USE_LESS,
}
```

この追加設定を加えます。これで、

```bash
$ ./manage.py compress
```

で less のコンパイルを行うようになります。

参考: [How to change Oscar’s appearance — django-oscar 1.1 documentation]
(http://django-oscar.readthedocs.org/en/releases-1.1/howto/how_to_handle_statics.html)
Theosのlogify.plがメソッド探しにかなり便利。

この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の18日目の記事です。

# はじめまして
おそらく初めましての方が多いと思いますので少し自己紹介を。。(緊張気味)
ちくわと申します。m(_ _)m

- Twitter:[@ChikuwaJB_blog](https://twitter.com/ChikuwaJB_blog)
- Github:https://github.com/ChikuwaJB/
- CydiaUpdates.com:https://cydiaupdates.net/author/Chikuwa

まだ中2(14歳)なので少々日本語がオカシイところ、英語がオカシイ所はどうかお許し下さいm(_ _)m

# 本題
メソッドを特定する時に`%log`を使ってsyslogに吐かせますが、

例えばこんなヘッダファイルがあって、

```
@interface FooClass : NSObject
{
}

- (void)amethod:(id)arg1;
- (bool)bmethod:(id)arg1;

@end


```

全てのメソッドの動作を確認したい時は
Tweakのコードは


```
%hook FooClass
-(void)amethod:(id)arg1{
 %log;
 %orig;
}
-(bool)bmethod:(id)arg1{
 bool r=%orig;
 NSLog(@"%d",r);
 return r;
}
%end

```

こんな感じです。
今回の場合はメソッドが少ないので簡単ですが、メソッドが大量にある場合はかなり面倒です。

#そこで役立つのがlogify.pl！
使い方はいたって簡単です。
ターミナルで
`~$ $THEOS/bin/logify.pl ヘッダファイルまでのパス`
と打つと…

```
~$ $THEOS/bin/logify.pl ヘッダファイルまでのパス
%hook FooClass
-(void)amethod:(id)arg1{
 %log;
 %orig;
}
-(bool)bmethod:(id)arg1{
 bool r=%orig;
 NSLog(@"%d",r);
 return r;
}
%end
~$ 

```
とこの様に**自動**でコードを生成してくれるんです！
あとはリダイレクトで
`$THEOS/bin/logify.pl ヘッダファイルまでのパス > Tweak.xm`
でTweak.xmに書き出せますね。

いちいち`$THEOS/bin/logify.pl`と打つのも面倒なので`PATH`に`$THEOS/bin/`を追加してあげると便利です。

# 〆
知ってるわそんなの！ヽ(`Д´)ﾉ
みたいな記事でしたが、ここまで読んでくださった方ありがとうございます。
もっといい方法や、間違っている所があればコメント欄で教えてもらえるとありがたいです
～

ではでは～
[Rails] URLにlocaleの情報を入れたい時、Devise と OmniAuth で OAuth認証しようとすると、callbackでエラーになる場合

config/routes.rbをいじって、omnicauth_callbacksだけ、localeを入れるscopeから外してあげればいいです。

```rb
Rails.application.routes.draw do
  devise_for :users,
  skip: [
    :session,
    :password,
    :registration,
    :confirmation
  ],
  controllers: {
    omniauth_callbacks: 'users/omniauth_callbacks'
  }

  scope '(:locale)', locale: /en/ do
    get 'omniauth/:provider' => 'users/omniauth#localized', as: :localized_omniauth
    devise_for :users,
    skip: :omniauth_callbacks,
    controllers: {
      sessions:            'users/sessions',
      registrations:       'users/registrations',
      passwords:           'users/passwords',
      confirmations:       'users/confirmations'
    }
end
```
enforceIDE作りました

# Webブラウザゲーム開発IDE
もともとコマンドライン操作で使うWebブラウザゲーム開発フレームワーク「enforce」を公開していましたが、このenforceのプロジェクトを統合環境で管理出来るIDEを作りました。

[enforceIDE](https://www.prominence.tv/enforceide/)

使うにはアカウント登録が必要です。
登録するには有効なメールアドレス、もしくはTwitterアカウントが必要です。
（Twitterログインのほうがお手軽です）

ツール内のボタンにはツールチップで説明が出るようにしているので、そのまま使えるとは思いますが、いずれ説明動画でも作ろうと思います。
WWDC15に参加した話


#WWDC15に参加してきました！

こんにちは、村井研kumo所属のmaikouです。

今回はAdvent Calendarに投稿するとのことなので、6月に参加したWWDCについての話をしようと思います。


皆さんはWWDCをご存知でしょうか？年に一度San FranciscoでAppleが主催するディベロッパーカンファレンスです。5000人以上が参加する、祭典のようなものですね。
今回日本人の学生は他にいなかったのですが、現地では何十カ国もの人が参加していました。


![IMG_9283.JPG](https://qiita-image-store.s3.amazonaws.com/0/106288/970a5ba7-d48c-828c-63c7-4a6adf04d68f.jpeg)
(会場はこんな感じです。)

では次に、実際に参加したセッションやLabについての様子を紹介していきます。

#Keynote
keynoteというのは、このWWDCの最初に行われる講演です。Appleのアナウンスはいつもここで行われます。今回はEl CapitanやiOS9、Apple Musicの発表がありましたね。

ちなみに私はCEOのTimさんを非常に非常に尊敬していてこの講演を非常に楽しみにしていたので、夜中の０時から並びました。同じく世界各地から参加してる友達と一緒に寒い夜を苦しみながら乗り越えました(涙)
(前から20番目くらいでした。)

![IMG_9306.JPG](https://qiita-image-store.s3.amazonaws.com/0/106288/51064bdc-2dba-ccf1-bdc7-5a5797a43223.jpeg)
(夜が更けていく…この時間は非常に寒くて色々辛いです。)

その甲斐もあって、非常に良い席を取れたり、keynoteの後には学生はステージのところでCEOのTim Cookさんや他の幹部の方と集合写真を撮ったりお話する時間も！

![IMG_9447.JPG](https://qiita-image-store.s3.amazonaws.com/0/106288/7dcc3156-1815-5837-1747-a336b2df93c1.jpeg)
(Timさんにはずっと憧れていて今回お話できたことは貴重な経験です。)
![IMG_9247.JPG](https://qiita-image-store.s3.amazonaws.com/0/106288/577c154f-9a5d-4fa1-0fc2-c53e9f35c979.jpeg)
(後ほどSan Franciscoの新聞にて皆で写ってる写真が使われたそうです、幸せです。)

keynoteが終わるといくつものsessionやLabにて様々な質問ができます。
私もswiftの仕様がどのように変わったのかというセッションであったり、Labで自分の作成中であったアプリの中で変更したい部分についてどうやれば良いのかという技術的なアドバイスを教えてもらったりしました。

#参加した感想
ここまでざっと概要を述べてきましたが、実際に参加して気づいたこと、感じたことを書きたいと思います。

まずはなんといっても**「英語力」**です。嫌でも英語ができないと辛いです、とにかく英語できるかできないかで楽しめる度合いが本当に変化します。
特に学生は日本人がいないので１週間日本語を話す機会がないといっても良いくらい、英語のみで過ごします。世界各地から来る人みんな英語を話すので、コミュニケーションにしても、セッションで学ぶ際も、Labで質問したい時も**英語**です。思う存分カンファレンスを楽しみたかったり、友達も作りたいという人はとにかく英語の練習をするのがオススメです！

次に、**「世界の勢い」**です。もちろん今回、私は非常にカンファレンスを楽しむことができました。しかし、それ以上に焦りや悔しさを感じました。世界から参加した学生の中には最年少が12歳でした。中学生高校生が当たり前のように参加しているんです。自分より英語ができて、自分より熟知している技術分野もあって…年数であったり育った国の環境的にも当たり前だと思いますが、とにかく私は良い意味で非常に刺激になりました。
日本で行動を起こして満足するのではなく、今回知り合えた友達とお互いを刺激しあってもっと頑張ろう！、そう思えた濃い１週間でした。

#食事
おまけなんですが、WWDC期間中に堪能したご飯をシェアしておきます。
![IMG_9881.jpg](https://qiita-image-store.s3.amazonaws.com/0/106288/ccdee373-9d16-d92c-1332-6d9603a35853.jpeg)
(WWDCではこんな風に時間ごとにご飯も出ます、甘い、甘すぎる、けど美味しい！)
![IMG_9882.jpg](https://qiita-image-store.s3.amazonaws.com/0/106288/8f249988-7a7d-cb83-2093-8a19397bbdb3.jpeg)
(WWDC名物と言われてるOdwalla。今年復活したみたいですね。)
![IMG_9426.JPG](https://qiita-image-store.s3.amazonaws.com/0/106288/3c9b25f7-13e6-8223-eaa4-6d8604c827ea.jpeg)
(正直に言うべきなのか迷うんですが、美味しくないです…お昼ご飯はここで食べずに外でとるというのが皆の共通認識だそうです笑)

#最後に
年に一度、刺激的な人が集まって過ごす濃い１週間。自分の今後の人生の気づきを得るほど、私は大きな影響を受けました。

ぜひWWDCに行きたいとい人にこの記事が役立つことを願っています！

![IMG_9887.JPG](https://qiita-image-store.s3.amazonaws.com/0/106288/981920af-b5cb-ad8f-6170-dc14233ef3d6.jpeg)
(参加した学生とTim Cookさん、Eddy Cueさん、Phil Schillerさんと)


Maiko Wakatsuki (若月舞子)
@maiko_109
【停止】Qiitaのデイリーストックランキング！ウィークリーもあるよ

# この記事について

現在こちらの記事は停止しました。昔はQiitaのトレンド機能がなく、現在の注目の記事が見当たらず作成したのですが、今はQiitaの公式のトレンドを参照していただければと思います。

長らくありがとうございましたm(_ _)m

※ またLGTM機能に切り替わった際に、正常に動作をしていなかったようです。ご迷惑をおかけして申し訳ございませんm(_ _)m

# デイリーいいねランキング


# ウィークリーいいねランキング
Alamofireを使っていてEXC_BAD_ACCESSが出た時の対処法

Alamofireを使用したプロジェクトをビルドしたら、 `EXC_BAD_ACCESS` が出た。

# 対処法

DerivedDataを削除する
（何故こうなるかは書かれていない…）

## DerivedDataの場所の確認

Xcode > Preference > Locations > Derived Data から確認できる

## 消し方

DerivedData以下をFinderでごそっと消してしまう。
プロジェクトをXcodeで開けば生成されるファイルなので、気にせず削除。

# 参考
EXC_BAD_ACCESS · Issue #881 · Alamofire/Alamofire
https://github.com/Alamofire/Alamofire/issues/881
Evernoteに保存したミイルのノートに位置情報を追加するハンドラ


* 食事記録SNS[ミイル](http://miil.me/)
* iOS版ミイル内で「シェア」＞「Evernote」＞「保存」したノート
* ノートのソースURLにはミイルに投稿したURLが含まれる
	* `http://miil.me/g/...`または`http://miil.me/p/...`
* Mac版EvernoteでミイルのノートからURLを取得してSafariでページを開く
* 投稿ページ中部にある店情報からミイルの店舗ページへ移動
	* `http://miil.me/v/...`
* 店舗ページ中部に埋め込まれた地図から位置情報を取得
* ミイルのノートに位置情報を追加


```applescript:setAddressToMiilNoteInEvernote.scpt
tell application "Evernote"
	set {miilNote} to selection
end tell
my setAddressToMiilNoteInEvernote(miilNote)

on setAddressToMiilNoteInEvernote(miilNote)
	tell application "Evernote"
		tell miilNote
			set {lat:latitude, lng:longitude} to my getLatlngOfRestaurantFromMiil(source URL)
		end tell
	end tell
end setAddressToMiilNoteInEvernote

on getLatlngOfRestaurantFromMiil(miilURL as text)
	if miilURL does not start with "http://miil.me/" then
		error
	end if
	my openURLinSafari(miilURL)
	tell application "Safari"
		if character 16 of miilURL is in {"g", "p"} then
			set JSResult to "loading"
			repeat while JSResult = "loading"
				set JSResult to do JavaScript "if(!document.getElementsByClassName('detailphoto')[0]) {
	'loading';
} else {
	var elements = document.getElementsByClassName('venueHdl mb20');
	if(!elements[0]) {
		'error';
	} else {
		elements[0].firstChild.click();
	}
}" in document 1
				if JSResult = "error" then
					error "店舗を取得できませんでした"
				end if
			end repeat
		end if
		set latlng to missing value
		repeat while latlng = missing value
			delay 1
			set latlng to do JavaScript "var latlng = document.getElementById('venueMapView').firstElementChild.children;
latlng[0].getAttribute('content') + '\\n' + latlng[1].getAttribute('content');" in document 1
		end repeat
		close current tab of window 1
	end tell
	return {lat:paragraph 1 of latlng as number, lng:paragraph 2 of latlng as number}
end getLatlngOfRestaurantFromMiil

on openURLinSafari(aURL)
	tell application "Safari"
		open location aURL
		repeat
			try
				set aTab to current tab of window 1
				exit repeat
			on error number -1719
			end try
		end repeat
	end tell
	my waitForSafariLoading(aTab)
	return aTab
end openURLinSafari

on waitForSafariLoading(aTab)
	repeat while my loadingOfSafari(aTab)
		delay 1
	end repeat
end waitForSafariLoading

on loadingOfSafari(aTab)
	try
		tell application "Safari"
			return (URL of aTab = missing value) or (do JavaScript "document.readyState" in aTab) ≠ "complete"
		end tell
	on error
		return true
	end try
end loadingOfSafari
```


## 更新情報

* 2015-10-15: Mac用Twitterクライアント「夜フクロウ」経由で試作
* 2015-12-21: EvernoteのノートからURLを取得するように変更
* 2015-12-22: 店舗の位置情報取得元を住所から地図へ変更
* 2015-12-26: 店舗情報がない投稿に対応
Google Play にアップロードした Android アプリが更新されかをスクレイピングで確認する


これは [クローラー／Webスクレイピング Advent Calendar 2015](http://qiita.com/advent-calendar/2015/crawler) の２２日目(12/22)の投稿です。

![screen12.png](https://qiita-image-store.s3.amazonaws.com/0/35733/dc16161f-be54-ddcb-909f-058e679f9eaa.png "screen12.png")

私は最近は Android エンジニアをやっていまして、現在は [Android版ネイルブック](https://play.google.com/store/apps/details?id=jp.nailbook) の開発に携わっています。

今回は [CasperJS](http://casperjs.org) を利用して、Google Play に新しいバージョンの Android アプリをアップロードした際に、Google Play へ反映されたか確認する方法について紹介します。

> 背景として、Google Play に Android アプリのバイナリ(*.apk)をアップロードしても反映というか全ユーザが見えるよう伝搬するまで数時間かかる、という事情があります。

ちなみに CasperJS はサーバサードで動作する PhantomJS のラッパーで、任意のWEBサイトをスクレイピングすることができます。画面キャプチャも撮れる他に、内部に WebKit を内蔵しているので、JavaScriptで動的に描写されているWEBサイトのスクレイピングが可能です。過去にも何本か、環境構築等の記事を Qiita に書いたので宜しければ。

- [CasperJSでWEBサイトの画面キャプチャを取得してみた](http://qiita.com/hkusu/items/ef6dc5999dae39471e93)
- [CasperJSでWEBサイトをスクレイピングしてみる](http://qiita.com/hkusu/items/e08226ca2e2e57d8ab97)
- [CasperJSで、EXCELに貼付ける為のスクリーンショットを撮る](http://qiita.com/hkusu/items/c00093232501b228aaec)

## 方法

環境構築の方法はググるか上記の Qiita の投稿を見てもらうとして、こちらが CasperJS 向けのスクリプトです。

```coffee:check-google-play.js
var casper = require('casper').create();

var url = casper.cli.get(0); // コマンドライン引数からスクレイピング対象のURLを取得

var results = [];

casper.start(url, function() {
  // 対象のURLにアクセスし条件に一致するタグの中身を取得
  results = this.evaluate(function() {
    var elements = document.querySelectorAll('.content[itemprop=\"softwareVersion\"]');
    return Array.prototype.map.call(elements, function(e) {
      return e.innerHTML;
    });
  });

  // 余分な半角スペースを削除
  var i, length = results.length;
  for (i = 0; i < length; i++) {
    results[i] = results[i].replace(/\ /g,"");
  }

  //this.capture('foo.png'); // もしキャプチャ画像もとる場合
});

casper.run(function() {
  this.echo(results.join(' ')); // 複数ある場合は半角スペースでつなぐ
  this.exit(); // 終了
});
```

何をやっているかというと、スクレイピング対象(Google Play)のページから「バージョン」の文字列をスクレイピングして抜き出しています。

![スクリーンショット_2015-12-21_16_00_24.png](https://qiita-image-store.s3.amazonaws.com/0/35733/fbc65c9c-346e-5487-bc8b-b11ecec9d3a0.png "スクリーンショット_2015-12-21_16_00_24.png")

このスクリプトを、対象の Android アプリの Google Play 上の URL を引数にして実行します。

```
$ casperjs --ignore-ssl-errors=yes check-google-play.js https://play.google.com/store/apps/details?id=jp.nailbook
```

> スクレイピングの対象が `https://` のサイトだとエラーになるので `--ignore-ssl-errors=yes` という風にエラーを無視するようにしています。

成功すると次のように「バージョン」が出力されます。

![スクリーンショット_2015-12-21_16_09_14.png](https://qiita-image-store.s3.amazonaws.com/0/35733/1da7c9cc-99c8-a664-a65d-d797ccd68979.png "スクリーンショット_2015-12-21_16_09_14.png")

# おわりに

この程度なら Google Play をブラウザで見にいった方が早いだろ、という感じがするかもですが、コード化しておくことが重要で、任意のツールと組み合わせることが出来るかなと思います。
あと Google Play の HTML の仕様が変わるとスクレイピングできないので^^; 注意ください。
スマホサイト用の Qiita 新着投稿リーダーを AngularJS 1系で作った思い出


これは [AngularJS Advent Calendar 2015](http://qiita.com/advent-calendar/2015/angularjs) の２２日目(12/22)の投稿です。

このアドベントカレンダーの説明に次のようにあったので、

![スクリーンショット 2015-12-21 16.26.50.png](https://qiita-image-store.s3.amazonaws.com/0/35733/bbccc275-f9d4-dcc6-8d82-e64abe3c1a77.png "スクリーンショット 2015-12-21 16.26.50.png")

思い出というか、２０１５年の初め頃に AngularJS 1系で表題のものを作ったので、AngularJS でスマホサイト用の SPA を簡単に作れるよ！という例として紹介したいと思います。

> 過去記事はこちら。
>
> - [モバイルWEB用の Qiita 新着投稿リーダーを作った](http://qiita.com/hkusu/items/5b2be1d4b263b420cfe4)
> - [[電車やカフェでの暇つぶしに] Qiita 新着投稿リーダーに検索機能をつけた](http://qiita.com/hkusu/items/e088e189ac287ab31a8a)


## Qiita リーダー

AngularJS 1系と [ionic](http://ionicframework.com/) で作っています。Qiita の投稿の取得には [Qiita API v1](https://qiita.com/api/v1/docs) を利用しています。（`v2` だとクロスオリジン制約にひっかかるので。現在ではもしかして解消されているかもしれない。）

http://hkusu.github.io/qiita-newpost-reader/dist

![qiita1.gif](https://qiita-image-store.s3.amazonaws.com/0/35733/7dada7ff-21a8-7182-8802-dea694fb102e.gif "qiita1.gif")


> 静的リソース(JavaScript/CSS/HTML/画像)のみで構成されてるので、GitHub Pages から配信しています。

おすすめポイントとしては、iOS/Android ともに最近の端末は大きくて、戻る系の操作が片手でできず辛かったりするのですが、この Qiita リーダーは開いた記事の画面をどこでもいいのでタップすることで画面を閉じれるようにしています。ですので満員電車で片手しか使えなくても、スムーズに記事を確認することが出来ます。

![qiita2.gif](https://qiita-image-store.s3.amazonaws.com/0/35733/4f78d691-6b5f-bad1-d957-e1797e3959b5.gif "qiita2.gif")

またタグをクリックすると、そのタグの投稿が閲覧できます。

![qiita4.gif](https://qiita-image-store.s3.amazonaws.com/0/35733/225a804f-09d7-22a0-06cc-8bbdf395b9de.gif "qiita4.gif")

任意のキーワードで投稿を検索することもできます。

![qiita3.gif](https://qiita-image-store.s3.amazonaws.com/0/35733/075fc649-b37f-8b26-f5bb-7cd3b1a010fd.gif "qiita3.gif")

# おわりに

わりと簡単に AngularJS(とionic)でリッチなスマホサイト用の SPA が作れるということが伝われば幸いです。
ちなみに AngularJS 2系はまだ個人的には触ってないので^^; 機会があれば（あと安定すれば）キャッチアップしたいなと思っています。

ソースコードは GitHub に置いてあります。ご自由にどうぞ。
⇒ https://github.com/hkusu/qiita-newpost-reader
git ローカルの変更を元に戻す方法

ローカルでごちゃごちゃ弄ったけど元に戻したい！
そんな時には以下コマンド。

```
git checkout <filename>
```

特定のファイルではなく、全て元に戻したい場合

```
git checkout .
```

すぐ忘れるのでメモ。
Ecripceに頼らず、コマンドで扱えるようになろう...。
スクリプト言語でtelnet使うときの(略) (NetOpsCoding Advent Calendar 2015)

#スクリプト言語でtelnet使うときの(略) (NetOpsCoding Advent Calendar 2015)

@s1061123と申します。

本記事は[NetOpsCoding Advent Calendar 2015](http://qiita.com/advent-calendar/2015/netopscoding)の24日目の記事となります。メリークリスマスイブ!!

昨日は@miyahanさんの[PHPでもTelnetがしたい！](<XXX:URL>)でした。

さて本日は先日お話しした["スクリプト言語でtelnet使うときの落とし穴"](http://qiita.com/s1061123/items/3425fee2ed80e36aa7f9)をふまえた形でちょっとした話をしてみようと思います。

前回のお話ではコマンドをスクリプト言語で実行する話をしました。ルータのちょっとした情報(インターフェースのUp/Down等)を得るためにコマンド1つ打つことをスクリプト言語で実行するというのもありますが、たとえば設備メンテナンス的な形で複数のコマンドをまとめてスクリプト言語等で自動化するケースというのもあります。
本日はそういった複数のコマンドを自動化する際のお話です。

##スクリプトによる処理の自動化の一例
例えば、ネットワーク装置の情報を収集するために以下のようなコマンドの出力結果を、複数装置(例えば5台)から入手することを考えてみましょう。
(注:ここでは特定ベンダーの話ではないので適当に僕が想像した嘘showコマンドで書いてます)

```
show interface (想定完了時間1分)
show hyper-tech-support (想定完了時間20分)
show running-config  (コンフィグが長いため、完了時間は10分を想定)
```

これを、そのままスクリプトにしてみましょう。ここではPythonっぽい嘘コードでちょっと書いてみようと思います。

```
for i in [rtr1, rtr2, rtr3, rtr4, rtr5]:
    i = <ルータiにTelnetでログイン>
    i.exec_command("show interface")
    i.exec_command("show hyper-long-tech-support")
    i.exec_command("show running-config")
    <ルータiからログアウト>
```

このスクリプトの場合、一台あたり1+20+10=31分、5台で155分(=2.5時間)かかることになります。映画一本分です。[スター・ウォーズ／フォースの覚醒](http://starwars.disney.co.jp/)は136分なので、見終わってコーヒーを飲むことだって可能です。もっと短かくならないでしょうか。

## Threadによる並列化

まずスレッドを使うことで各ルータの実行を並列にすることができます。Python,Ruby等最近のスクリプト言語では通常Thread機構は存在しますので、それをそのまま利用することが可能です。
もし可能ならば同時並列実行を調整できるようにスレッドプールやワーク・キュー[(参考: Javaの理論と実践: スレッド・プールとワーク・キュー)](https://www.ibm.com/developerworks/jp/java/library/j-jtp0730/)を利用すると便利です。

さて、スレッドを使うと上の嘘コードは以下のようになります。

```
def get_show_commands(name)
    i = <ルータnameにTelnetでログイン>
    i.exec_command("show interface")
    i.exec_command("show hyper-long-tech-support")
    i.exec_command("show running-config")
    <ルータiからログアウト>

for i in [rtr1, rtr2, rtr3, rtr4, rtr5]:
   t = Thread(target=i, args=(i))
```

これをやることで並列に取得することで、5台分の情報が1台分の時間(31分)で可能になりました。
さて、最適化としてはこれでも十分ですが更に最適化することは可能でしょうか？

ちょっと強引とも言えますが、もう一つ高速化できる事が可能です。

## 更なる並列化
先ほどの3つの'show ...'コマンドですが、'show'コマンドは情報収集のコマンドであるので、装置に副作用を与えない可能性があります。もし、実際にその場合、つまり各コマンド毎に独立したコマンドで依存関係が無い場合、3つのスクリプトを同時に平行で走らせることで更に最適化が可能です。

つまり、上のスクリプトでは1ルータで1スレッドを割り当てていたのを、1コマンドに1スレッドを割り合てるといった形にします。

スクリプト的にはこんな感じになります。

```
def get_show_commands(name, cmd)
    i = <ルータnameにTelnetでログイン>
    i.exec_command(cmd)
    <ルータiからログアウト>

for i in [rtr1, rtr2, rtr3, rtr4, rtr5]:
   for c in ["show interface", "show hyper-long-tech-support", "show running-config"]:
      t = Thread(target=i, args=(i, c))
```

こうすることにより、5台分の情報が1コマンド分の時間(20分)で可能になります。ですが、この場合1ルータへの負荷も上がってしまうので、それぞれの環境でそういった最適化が本当にシステム的に納得できるかも考える必要があります。また、コマンド毎にtelnetをするのでルータに設定されている最大telnetセッション数にも注意する必要があります。まさに諸刃の剣ってやつですね。注意して使いましょう。

ということで本日は"スクリプト言語でtelnetを使う際の高速化とその副作用"についてお話しました。

ちなみにこれを使うとかなり並列化することが可能ですが、30台を越えるルータでの場合に躓いてしまいました。どこに躓いてしまったのか、どう解決したのかについてはまた別の機会にでもお話できたらと思います(スマートな解決ではないことだけは告白しておきますww)。

明日はついに最終日ですね。最終日は[@junpei-yoshino](https://github.com/junpei-yoshino)さんの"pull requestベースの設定変更"です。設定変更履歴って案外忘れがちなのですが、結構なタイミングで重要な意味を持つケースがあるのでgitを使っての変更の話は楽しみです。