OmniAICreator/Qiita-1.07M huggingface dataset:
D3.jsなどで出力されるsvgを画像として表示する方法


D3.js(http://d3js.org/ )などで出力されるsvg要素を画像として使いたくなったので、d3.jsでsvgとして表示し、javascriptでsvgデータをbase64形式にして保存し、base64形式の画像データを画面上に表示する方法をまとめました。

![d3_image.png](https://qiita-image-store.s3.amazonaws.com/0/1418/69dc1d74-8b77-5bf8-0d86-91b50ab12615.png "d3_image.png")


##【手順】
1. データをD3.jsを使ってグラグフィカルに表示する
2. 出力されたsvg要素を画像に変換して保存する(※今回はbase64にして保存にしました)
3. 画像として保存したデータを表示する

という三段階でやり方をまとめてみました。
***


## 1.については、たくさん種類があるのでD3.jsのexampleページを参考にしてみてください。
https://github.com/mbostock/d3/wiki/Gallery


## 2.出力されたsvg要素を画像に変換して保存する

```svg_to_png.js

var svg = document.querySelector( "svg" );
var svgData = new XMLSerializer().serializeToString( svg );
var canvas = document.createElement( "canvas" );
canvas.width = 970;
canvas.height = 600;

var ctx = canvas.getContext( "2d" );
imgsrc = "data:image/svg+xml;charset=utf-8;base64," + btoa(unescape(encodeURIComponent(svgData))); //svgデータをbase64に変換
img.attr( "src", imgsrc );
var image = new Image;
image.src = imgsrc;
image.onload = function() {
  ctx.drawImage( image, 0, 0 );
  var canvasdata = canvas.toDataURL("image/png");

  $.ajax({
	method: "post",
	url: "/api/save_photo_as_png",
	data: "data="+canvasdata.replace(/^.*,/, ''),
	success: function(data,status){
      //ここには保存に成功したときの動きを実装
	}                                                                                                                           
  });
};

```

```app/controllers/api_controller.rb

def save_photo_as_png
  photo = Photo.create(user_id: user.id, data: params[:data].gsub(" ","+"))
  render :json => { success: true, photo_id: photo.id }
  #ajaxのsuccess時に保存したphoto_idを使いたいのでphoto_idをcallbackとして返す。
end

```


## 3.画像として保存したデータを画像として表示する

```app/controllers/photo_controller.rb

def show
  @user = User.find(params[:id])
  @photo = Photo.find(params[:photo_id])
end

```

```app/controllers/api_controller.rb

def get_photo_as_base64
  @image = Photo.find(params[:id])
  send_data @image.data.unpack('m')[0], :type => 'image/png', :disposition => "inline"
end

```

```app/views/photo/show.html.erb
  <%= image_tag url_for(:controller => '/api', :action => 'get_photo_as_base64', :id => @photo.id) %>
```


これで、svg要素をbase64形式に変換してデータベースに保存して、それを読み込んで画像として表示することができました。
javascript でnew Array(count) をやっても意味が無い？

## はじめに
色々回答がもらえたこっちの記事http://azumaxlife.smile-systems.com/archives/971
で初期化意味あるんじゃないと回答があったので。

## 試したこと

1. ループは1000000回
2. `[]`で初期化するか、`new Array(count)`で初期化
3. `i`を配列に入れる

## 期待値
`new Array(count)`の方が格段に速い

## テスト
http://jsperf.com/array-init-length

## 結果
`[]`で初期化したほうが速い。IEを除いて。
理由は何でしょうか。Array初期化の方がコストが高いってこと？

Qiitaとブログの役割、悩んだ末に、ブログは英語化という方針で。
ブログはまだ閲覧数がorz
http://azumaxlife.smile-systems.com/archives/1026?lang=en
[RSpec] FactoryGirlの文法を簡潔にする


```ruby
FactoryGirl.xxx
```

と何度も書くのは面倒！という時は


```spec/spec_helper.rb
RSpec.configure do |config|
  ~
  config.include FactoryGirl::Syntax::Methods
  ~
end
```

これで

```ruby
FactoryGirl.create(:hoge)
```

のところを

```ruby
create(:hoge)
build(:user)
```

と`FactoryGirl.`を省略して書けるようになる。
git logで日本語が文字化けしたので対処


意識が高まってMac (OSX 10.9.3) を英語表記で使うようにしたら、
`tig`コマンドでgitの変更履歴などを見るときなどに、日本語が文字化けするようになってしまった。

これは嫌なので対策。

`.zshrc`(`.bashrc`)に以下を追加。

```
export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
```

一応これで回避可能。
objectをmatch-caseでパターンマッチさせるには

classのノリでやってみたら動かなくってプチハマったので解決策をメモしておく。

```scala
object Main extends App {
  trait X { def msg: String }

  object Foo extends X { def msg = "foo" }
  object Bar extends X { def msg = "bar" }

  def whoAreYou(x: X): String = x match {
    case f: Foo => f.msg
    case b: Bar => b.msg
  }

  println(whoAreYou(Foo))
  println(whoAreYou(Bar))
}
```

このコードはコンパイルエラーになる。

> error: not found: type Foo
> error: not found: type Bar

caseのところを以下のように修正すると期待通り動作するようになる。

```scala
case f: Foo.type => f.msg
case b: Bar.type => b.msg
```
関数型言語ってなに？

最近はやりのSwiftは関数型言語の影響を受けているとかよく目にするけどそもそも関数型言語ってどういうものなのか。
調べてもいつも忘れてしまうのでメモ。
関数型言語の詳しい解説ではなく、「どのような言語が関数型言語にあたるのか？」の解説。

#Wikipediaのページ
[関数型言語 - Wikipedia](http://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E)
Wikipediaには以下の用に書かれてある。

>関数型言語（かんすうがたげんご、functional language）は、関数型プログラミングに向いた特徴を持つプログラミング言語、関数型プログラミング言語である。

ここには関数型プログラムという単語が出てきているが、では関数型プログラムとはなんなのか？
Wikipediaの記事の続きに詳しく書いてあるが以下のようなことを述べている。

* 第一級関数があること。
* 式や関数が副作用をもたない。
* カリー化の機能を持つことが多い。

ここで気になることは、Lispは副作用をもったプログラミングを行うことができるにも関わらず、一般的に関数型言語に分類されることである。
それにWikipediaには厳格な定義が書かれていない。
第一級関数があることや副作用がないこと、カリー化できることが条件であるならC++やJavaScriptのような言語も関数型言語なのか？という疑問が出てくる。

Wikipediaのページに以下のような記述がある。

>LISPは、その多くが副作用のある式や関数が多数あり、手続き型スタイルでのプログラミングも可能だが、理論的なモデル（「純LISP」）の存在や副作用を使わないプログラミングが基本であること、歴史的理由などから、関数型とされる。

歴史的な理由という単語が少し気になるが注目すべきは

>副作用を使わないプログラミングが基本であること

という箇所だ。
つまり、C++でもJavaScriptでも関数型っぽい書き方はできるが、これらの言語の主流の書き方は関数型っぽい書き方ではないので関数型言語とは呼ばれないのである。

#結論
関数型言語の厳格な定義はない。
関数型っぽく書くのが主流な言語は関数型言語である。
Debian jessie にGoogle earth 導入なメモ


検索するとそれらしいパッケージが

```
% apt-cache search googleearth
googleearth-package - utility to automatically build a Debian package of Google Earth
libgeo-googleearth-pluggable-perl - module to generate GoogleEarth Documents
```

FlashPlayer みたいにDL してInstall してくれるのかな?と思いながら導入．

```
% sudo apt-get install googleearth-package
```

導入された感じがしない．中身見てみると

```
%  dpkg -L googleearth-package
/.
/usr
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/make-googleearth-package.1.gz
/usr/share/doc
/usr/share/doc/googleearth-package
/usr/share/doc/googleearth-package/README.Debian
/usr/share/doc/googleearth-package/copyright
/usr/share/doc/googleearth-package/changelog.gz
/usr/bin
/usr/bin/make-googleearth-package
```

導入ではなくパッケージを作ってくれるツールのよう．
`/usr/bin/make-googleearth-package` を叩いてみるとDL，展開，必要パッケージの導入，パッケージ作成をやってくれたよう．

```
% /usr/bin/make-googleearth-package
   :
-----------------------------
Success!
You can now install the package with e.g:

sudo dpkg -i googleearth_6.0.3.2197+1.1.0-1_amd64.deb
-----------------------------
```

てことで，

```
% sudo dpkg -i googleearth_6.0.3.2197+1.1.0-1_amd64.deb
:
dpkg: 依存関係の問題により googleearth の設定ができません:
 googleearth は以下に依存 (depends) します: libfreeimage3 ...しかし:
  パッケージ libfreeimage3 はまだインストールされていません。
```

漏れ?

```
% sudo apt-get install libfreeimage3
```

今度こそ導入

```
% sudo dpkg -i googleearth_6.0.3.2197+1.1.0-1_amd64.deb
```
Ubuntu12.04 に Debian 用の HarooPad pkg を導入


http://pad.haroopress.com/
https://dl.dropbox.com/s/urnoicuv5euqfwm/haroopad-v0.12.0_amd64.deb


```
$ haroopad 
/usr/share/haroopad/haroopad: error while loading shared libraries: libudev.so.0: cannot open shared object file: No such file or directory
```

```
$ ls -l /lib/x86_64-linux-gnu/libudev.so.*
lrwxrwxrwx 1 root root    16  5月 10 05:29 /lib/x86_64-linux-gnu/libudev.so.1 -> libudev.so.1.3.5
-rw-r--r-- 1 root root 67600  5月 10 05:29 /lib/x86_64-linux-gnu/libudev.so.1.3.5
```

```
$ sudo ln -sf /lib/x86_64-linux-gnu/libudev.so.1 /lib/x86_64-linux-gnu/libudev.so.0
```

```
$ ls -la /lib/x86_64-linux-gnu/libudev.so.*
lrwxrwxrwx 1 root root    34  6月 16 01:07 /lib/x86_64-linux-gnu/libudev.so.0 -> /lib/x86_64-linux-gnu/libudev.so.1
lrwxrwxrwx 1 root root    16  5月 10 05:29 /lib/x86_64-linux-gnu/libudev.so.1 -> libudev.so.1.3.5
-rw-r--r-- 1 root root 67600  5月 10 05:29 /lib/x86_64-linux-gnu/libudev.so.1.3.5
```
No such file or directory - /usr/local/bin/phantomjs って言われて困る

selenium-webdriverでphantomjs使ってたら `No such file or directory - /usr/local/bin/phantomjs`って言われたけど

```shell-session
$ ls /usr/local/bin/phantomjs 
/usr/local/bin/phantomjs
```

どうみてもある。困った。

## 原因

64bitのシステムに間違えて32bitのを入れてたのが原因らしい。

phantomjsを単体で起動させるとこんなエラーが出る。

```shell-session
$ phantomjs 
-bash: /usr/local/bin/phantomjs: /lib/ld-linux.so.2: bad ELF interpreter: そのようなファイルやディレクトリはありません
```
jQueryのAjax系関数のデフォルト設定を指定する

`$.post`や`$.getJSON`を使っていたのだけど、どうもIEだけ挙動がおかしいと思ったらパラメータが同じなのでキャッシュしていたらしく、サーバにデータを取得しに行ってくれなかった。

キャッシュを無視してアクセスすれば良いのだけど、時刻を数値化したパラメータを全部のAjaxしている箇所に付加するのも面倒だし、全部を`$.ajax`に書き直すのも辛いなあ……と思って調べたらデフォルト設定を指定するメソッドがあったのでメモ。

```js
$.ajaxSetup({
  cache: false
});
```

これを実行すると、以降のAjax系メソッドはキャッシュを無視して毎回必ずサーバにデータを取得しに行ってくれる。

cache以外も当然指定できて、[jQuery#ajax](http://api.jquery.com/jquery.ajax/)のsettingsに指定できるオプションが指定できる（はず）。

---

- 参考
  - http://stackoverflow.com/questions/13391563/how-to-set-cache-false-for-getjson-in-jquery
【備忘録】読んだらにゅぅってでてくるYes/Noダイアログ



なんかこんなの作った

使い方
* CommonDialog.Open("たいとる","めっせーじ",OKButtonEvent,NoButtonEvent);
Openの中ではInstantiateしていてそのInstantiateされた際にTweenがいい感じににゅぅってしてくれるだけ

↓実際に使っているダイアログの構成

![6e707cd4110aaf12f15670ed8804f141.png](https://qiita-image-store.s3.amazonaws.com/0/12129/a06b9870-67d0-883b-a7b7-fa0dd8021dfc.png)

↓ソース

```csharp:CommonDialog.cs
using UnityEngine;
using System.Collections;
using System;

public class CommonDialog : MonoBehaviour
{
	
	public UILabel Title = null;
	public UILabel Message = null;
	
	public UIButton AcceptButton;
	public UIButton DeclineButton; 
	public Action OnAccept = null;
	public Action OnDecline = null;

	static public void Open(string title, string message, Action accept, Action decline)
	{
// Prefabのパスは人によって違うので注意
		var clone = Instantiate( Resources.Load("Prefabs/SelectDialogPanel"),Vector3.zero,Quaternion.identity) as GameObject;
		var dialog = clone.GetComponent<CommonDialog>();

		dialog.SetDialog(title,message,accept,decline);
	}

	void Start()
	{
// UIRootに入った瞬間にスケールが直されるので一旦0にする
		transform.localScale = Vector3.zero;
	}

	public void SetDialog(string title, string message, Action accept, Action decline)
	{
		Title.text = title;
		Message.text = message;
		OnAccept = accept;
		OnDecline = decline;

		Title.UpdateNGUIText();
		Message.UpdateNGUIText();

		if (decline == null)
		{
			DeclineButton.gameObject.SetActive(false);
			AcceptButton.transform.position =new Vector3(0,AcceptButton.transform.position.y);
		}
	}

	public void OnAcceptButton()
	{
		if (OnAccept!=null)
			OnAccept();
		Close();
	}

	public void OnDeclineButton()
	{
		if (OnDecline!=null)
			OnDecline();
		Close();
	}

	void Close()
	{
		Destroy (this.gameObject);
	}
}

```
Rails で Form をウィザード化する例

# 課題

Railscast に
- http://railscasts.com/episodes/346-wizard-forms-with-wicked?language=ja&view=asciicast
＃ 346 Wizard Forms with Wicked　(日本語訳)

として Rails で ウィザード形式の画面を作る例の記事があります。
これを Rails4 で作りなおしてみました。

# 例 その１

- https://github.com/katoy/rails4-form-before-wizard  (wizard 化する前の Form 画面)

- https://github.com/katoy/rails4-form-after-wizard   (wizard 化した Form 画面)

# 例 その２
また、この ralscast ページのコメント欄
- http://railscasts.com/episodes/346-wizard-forms-with-wicked?view=comments 
に temporaary な DB を使う例が投稿されています。
- https://github.com/vlado/rails_temporary_data

これを適用してみた例もつくってみました。  

- https://github.com/katoy/rails4-form-after-wizard-with_temporary

# スクリーンショット

作成した３つのアプリは どれも  rake spec とすると、screenshots/*.png にいくつかのスクリーンショットが保存されるようにしてあります。(github にも commit 済み)


ウィザード化前の Form
![0004_before_edit.png](https://qiita-image-store.s3.amazonaws.com/0/14958/26e931a1-b29a-1ef4-6dc2-f286c517d35b.png)  

ウィザード化後の Form の最初の画面
![0002_before_step1_commit.png](https://qiita-image-store.s3.amazonaws.com/0/14958/5ad0690a-5372-3afc-03aa-518a1ba75ff8.png)
Railsでvendor/assets/javascripts以下にあるファイルを特定のページでのみ使用する



# AssetPipelineについて
RailsのAssetPipelineは、JavaScriptや、cssの結合・圧縮を自動でやってくれて便利だが、以下の点が気になった。

* ***特定のページでしか使用しないPlugin等のファイルはapplication.jsで管理したくない。***

結合・圧縮をしているとはいえ、不要なjsファイルまで一緒に読むこむのは重くなる原因になり、微妙だなと感じた

## 特定ページでのみ特定のJavaScriptを読み込む
かといって、<code>vendor/assets/javascripts/hoge.js</code>などを作成し、
<code>javascript_include_tag</code>で読み込もうとすると、assetprecompileで読み込めないとエラーが出るので、
<code>config/initializers/assets.rb</code>を作成し、そこにファイルパスを追加する。

1. <code>$ vim config/initializers/assets.rb</code>

1. ```config/initializers/assets.rb
Rails.application.config.assets.precompile += [
		"hoge.js",
]
```

追加後、Serverを再起動し、<code>javascript_include_tag</code>で以下の様に追加する
1. <code>$ vim app/views/layouts/application.html.erb</code>

1. ```app/views/layouts/application.html.erb
....

	<%= javascript_include_tag 'hoge.js', 'data-turbolinks-track' => true %>
....
	```

ページのソースを確認すると、hoge.jsがapplication.jsとは別に読み込まれていることが確認出来るはず。


## 参考
[The Asset Pipeline — Ruby on Rails Guides](http://edgeguides.rubyonrails.org/asset_pipeline.html)
Xamarin.Forms の TabbedPage について

Xamarin.Forms のタブページについて調べましたので備忘録として残します。

タブページの実装方法は Xamarin のサンプル Form Gallery の
[TabbedPageDemoPage](https://github.com/xamarin/xamarin-forms-samples/blob/master/FormsGallery/FormsGallery/FormsGallery/TabbedPageDemoPage.cs)
のように ItemSource, ItemTemplate を使用する方法と、
以下のサンプルのように TabbedPage を new して、Children にそれぞれのページを指定する方法があるようです。

iOS プロジェクトの Resources/xxx.png を配置し、各ページの Icon Property にファイル名を指定すると iOS のタブのアイコンになります。png のサイズは良く分かっていませんが、30px だとちょうどいい感じでした。(iOS は 40px が普通ですかね？)

なお、この画像リソースは同じファイルを Android プロジェクトの Resources/drawable/xxx.png に配置しておけば PCL から参照できそうな感じがします。


```csharp:App.cs
using Xamarin.Forms;

public static Page GetMainPage ()
{	

	var tabPage1 = new ContentPage () { 
		Title = "Page 1",
		Icon = "1.png",
		Content = new Label { 
			Text = "Page 1 Label",
			HorizontalOptions = LayoutOptions.Center,
			VerticalOptions = LayoutOptions.Center,
		},
	};

	var label = new Label { 
		Text = "Page 2 Label",
		TextColor = Color.White,
		HorizontalOptions = LayoutOptions.Center,
	};

	var button = new Button {
		Text = "Page Name",
		HorizontalOptions = LayoutOptions.CenterAndExpand,
	};

	var tabPage2 = new ContentPage () { 
		Title = "Page 2",
		Icon = "2.png",
		Content = new StackLayout {
			Children = {
				label,
				button,
			},
			HorizontalOptions = LayoutOptions.Center,
			VerticalOptions = LayoutOptions.Center,
		},
		BackgroundColor = Color.FromHex("666666"),
	};

	var mainPage = new TabbedPage { 
		Children = {
			tabPage1,
			tabPage2,
		},
	};

	button.Clicked += (sender, e) => {
		mainPage.DisplayAlert("Alert Title", mainPage.CurrentPage.Title + " is selected.", "OK", "Cancel");
	};

	return mainPage;
```

こんな感じです。

![スクリーンショット 2014-06-16 00.24.14.png](https://qiita-image-store.s3.amazonaws.com/0/32453/b459a3cb-edfd-adfb-b23f-9f0a498c1f0d.png)


以上です。
Vagrantで作成したCentOSにrbenvとbundlerを入れてrailsアプリケーションを起動するまで


色々なところに書かれていますが、構築メモとして。
CentOS 6.5、ruby 2.1.2、rails 4を使用し、Chef等を使わずに、手動でインストールする方法です。

## VagrantでCentOSの仮想マシンを作成

```mac
$ vagrant init centos_64
$ vagrant up --provider=vmware_fusion
$ vagrant ssh
```
centosのboxを適当に使用しています。ここは適宜変えてください。また、providerにvmware_fusionを指定していますが、VirtualBoxを使っていればこのオプションは入力しないでください

## openssl-develをインストール
rubyをビルドする際にopenssl-develが入っていないとエラーになるため、インストール

``` bash
$ sudo yum install -y openssl openssl-devel
```

## mysqlをインストール

DBにmysqlを使用するため、インストールする

``` bash
$ sudo yum install -y mysql mysql-devel mysql-server
```

## gcc, gcc-c++をインストール

therubyracerのgemをインストールする際に使用するので、インストールしておく

```bash
$ sudo yum install -y gcc gcc-c++
```

## readline, readline-develをインストール
rails consoleをする際に使用するため、事前にインストール

```bash
$ sudo yum install -y readline readline-devel
```

## rbenvをインストール

http://qiita.com/inouet/items/478f4228dbbcd442bfe8
こちらを参考に、インストールしました。ありがとうございます。
rubyのバージョンは、2.1.2を使用。
※一応コマンドを下記に書きますが、参考サイトを見てインストールした方が良いです

```bash
$ sudo yum -y install git
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -v 2.1.2
$ rbenv rehash
$ rbenv global 2.1.2
$ ruby -v
```

## bundlerをインストール

```bash
$ gem install bundler
$ rbenv rehash
```
※rehashしないとbundlerコマンドが使えません


## bundlerでrailsアプリケーションを作成

#### bundleコマンドで初期化し、Gemfileを作成

```bash
$ cd ~
$ mkdir testapp
$ cd testapp
$ bundle init
$ vi Gemfile
```

#### gem "rails"をコメントインする

```Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "rails"
```

#### railsをインストール

```bash
$ bundle install --path vendor/bundle
```

#### railsアプリケーションを作成（mysqlを使用）

```bash
$ bundle exec rails new . -d mysql
```

自動でbundle installが実行される
※ sprockets関連のエラーが出たら、Gemfile.lockを削除し、もう一度bundle installする

#### Gemfileを編集する

```bash
$ vi Gemfile
```

#### therubyracerや必要な物をコメントインする

```Gemfile
gem 'therubyracer',  platforms: :ruby // コメントインする
gem 'unicorn'
gem 'capistrano-rails', group: :development
```

#### rails consoleで起動確認（ここでreadline関連のエラーがでたら、yumでインストールしてrubyも再インストールをしてください）

```bash
$ bundle install
$ bundle exec rails c // railsコンソールが起動すれば成功
$ bundle exec rails s
```

これでサーバー起動まで完了です。iptablesの設定でポート3000を開けてアクセスして、つながるかどうかを確認してください。
mysqlのDBを作成していないため、エラーが出るはずです。

#### mysqlを起動して、DBを初期化

```bash
$ sudo /etc/init.d/mysqld start
$ bundle exec rake db:create
$ bundle exec rake db:migrate
```

これでRailsの初期画面が表示されると思います。
以上で完了です。

![スクリーンショット 2014-06-16 0.11.15.jpg](https://qiita-image-store.s3.amazonaws.com/0/7980/9b0521fb-f568-d8c6-bb9e-02ac920d6090.jpeg "スクリーンショット 2014-06-16 0.11.15.jpg")
[Ruby] pryやirbで日本語入力を可能にする


## rbenv利用時の場合

```
# 適用したいrubyバージョンが既にインストール済みの場合は一度uninstall
$ rbenv uninstall 2.1.1

# readlineのinstall
$ brew install readline
$ brew link readline --force

# readlineを利用してruby再install
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.1.1
```

これで日本語入力可能に。

```
$ pry
[1] pry(main)> 'ぷらい'
=> "ぷらい"

$ irb
irb(main):001:0> 'あいあーるびー'
=> "あいあーるびー"
```


## rvmの場合

以下の記事が参考になりそうです！

irbやpryで日本語を入力できるようにする
http://www.iwazer.com/~iwazawa/diary/2012/03/irbpry.html
pecoが便利過ぎる件


#pecoとは
説明するより、Demoをみてもらったほうが早いです。
####[Peco Demo](https://github.com/peco/peco#demo)

使いかた次第で何でも出来そう。

##個人的な使い方
1. 管理しているRepositoryの一覧を表示  
<code>$ find ~/repos -mindepth 1 -name "*" -type d | grep -v "\/\." | peco</code>

1. 実行コマンドの絞込
<code>$ history | peco</code>

1. 管理しているRepositoryへcd
<code>$ cd $(find ~/example ~/hoge -mindepth 1 -name "*" -type d | grep -v "\/\." | peco)</code>

1. Repositoryのブランチを絞り込んでチェックアウト
<code>$ git checkout $(git branch | peco)</code>

3, 4に関してはよく使うのでaliasに設定しています。

```bash:zshrc
$ vim ~/.zshrc

.....
.....


alias repos='cd $( find ~/example ~/hoge -maxdepth 3 -mindepth 1 -name "*" -type d | grep -v "\/\." | peco )'
```

* 実行  
<code>$ repos</code>

```bash:~/.gitconfig
[alias]
	detect-branches = !git checkout $(git branch | peco)
```

ぜひお試しあれ。

##参考
[peco（Simplistic interactive filtering tool）を作った話](http://lestrrat.ldblog.jp/archives/39427929.html)
ベンチマークの取り方についてのメモ

2008年はパフォーマンスよくなかった

インスタンスを選ぶ

計測を行うときに何ではかるのがよいか

計測方法が間違ってたら、どうやってはかっていくかなにをはかっていくか

たった１回、ひとつのインスタンスでベンチマークと言えるのか

複数の角度からはかる

interger CPU performance

## tool
### UnixBench

でもCPUの計測にはそんな向いてない

標準偏差

IPブリッジを使った

ハイパースレッドをいかしたもの

### SysBench

mysqlサーバのテストに使う

fileio, cpu, memory, thread, mutex, oltp

### sysbench script

C.O.V,  RT(min)

データセットを増やして

c3.8xlarge

m2は旧世代のプロセッサを使ってる

10個のテストを繰り返して40回テストしてる

### Spec INt

きちんとしたツール

# Testing Disk I/O

##Storade Option

##Test Parameter

##Storage configuration

##I/O metrics


F I/O

beyond simple disk I/O

applicationを使うのが理想
カーブす？
最適なベンチマークがアプリケーションから見てなんなのか

何がゴールなのかを分析して決める必要がある

十分な量のテストをしないと満足な結果にはならない

ベースラインを決める

いろいろなサンプルをとる
serverspec,configspec,syllabus,specinfra

# serverspec

サーバ構成管理ツール

puppet

chef

ansible

オライリー ウェブオペレーション

宣言的なにをするか
抽象化  かわりにやってくれる
べきとうせい 必要なことしかしない
収束か ほっとけば、インストールされて

Immutableだとべきとうせいはいらない？

Immutableだと、適用したかしてないかだから収束かいらない？
手動でイメージつくっとく？

再現可能な手順は残しておきたい

shell scriptや dockerfile

Dockerfile

抽象化には構成管理ツールが必要

# configspec

rspecで構成管理を書くツール

# syllabus

シンプルな記述でかける


コラボレートする

実行形式の差異

# SpecInfra

## configspecの実装

backend.install


Immutableは毎回１からだと時間かかるのでは？

configspecがdockerfileを出力する

configspecがshellscriptを出力する
AngularJSの勉強会(2014/07/05 福岡）


#ソースについて

##今の開発環境
Spring Boot(Java8)

ng-app属性を見つけるとAngularJSが動く

##Controllerと$scope

$scopeはDOM(HTML)とControllerの接着剤

##Moduleという箱

angular.module("hoge",[])のように第二引数があると新規作成
angular.module("hoge)のように第二引数がない場合は、利用（参照）します


##ng-bindを使用して$scopeに設定された値を画面に表示する

ng-bindと{{}}波カッコは同じ意味

##$scopeはオブジェクトも紐付けすることができる


##Controller兄弟の$scopeは別物

##親子関係のControllerは、子は親のscopeを使えます

##ng-modelで入力

##Angularのサービスを作成
angular.module("hogehoge").factoryメドッドでデータと振る舞いを持つオブジェクトを登録します。  
AngularのサービスはControllerからはいつも同じオブジェクトが呼び出されます。

## ngShow.Directive

今まではタグにJSは書かないのが推奨されていたが、angularはタグにコードを書く。

## ngRepeat
標準機能のngRepeatディレクティブは火もついたデータ配列分繰り返し表示する

## ngOptions
SELECTの要素はngOptionで指定できます

## 自作Directive
Directiveは自作できます。
タグも自作できます。

## クリックイベントハンドラ　Directive
クリックイベントはHTMLに書くことになります


## 監視
angularは常に値の変化を監視している。


#使われ方

## Single Page Application
SPAにはANGULARJSが良いのでは？

**他のシステムや外部サービスとマッシュアップ**


## ANGULARJSについて
* 2009年のGoogkeFeedbackプロジェクト
* 17,000行のコードが1,500行に  
* テンプレートとデータバインディングが基本


## いいところ
* RESTfuk APIとの相性が良さそう
* JSTLっぽい
* EL式っぽい
* Railに乗っているかぎりはなんとかなりそう

## だめなところ
* 概念を理解するのに時間がかかる
* ちょっとRailから外れると一気にハードルが上がる
* SEOと相性が悪そう
* 認証／認可や例外系のロジックはやっぱりJava
* 処理速度についてはObject.observer()に期待

## MEANスタック
MEAN.IN
LAMPからMEANへそんな時代が来るかもしれません

#ANGULARJSとTypeScript

##TypeScript
* MSが開発したオープンソース言語
* JSを生成するAltJSの一部。
* 2014年4月にVer.1がリリース

##TypeScriptの開発環境
* VSならIntelligenceが使えて便利
* VSのバージョンに注意

* 必須なEssentials
Web Essentials


##定義ファイル
* JavScriptライブラリをTypeScriptで利用できるように変換したファイル
* 拡張子はd.ts

##NuGet
* VSで定義ファイルを導入するにはNuGetを使うと簡単

##まとめ
**TypeScriptって何か便利そう**







#個人的に気になったこと
JSFIDDLEが便利そうだった。
テンプレート内でquerystring付きのURLを生成するには？


routes.php内では以下の用に定義しておいて

```php
Route::get('example', array('as' => 'example.index', 'uses' => 'ExampleController@getIndex'));
```

テンプレートでは以下の用に記述する

```php
{{ URL::route('example.index', array('key' => 'value')) }}
```


コントローラに直接渡したい場合は、

```php
{{ URL::to(action('ExampleController@anySearch') . '?' . http_build_query(array('key'=>'value'))) }}
```

以下のようなURLが生成される

```
http://localhost:8000/example/search?key=value
```
paredit-modeチートシート

検索が面倒だったので、メモ。

* 外側のリストと結合する : M-s

```el
;; (b c)内にカーソル
(a (b c)) => (a b c)
```

* カーソル下の要素だけを残して、外側のリストと結合する : M-r

```el
;; bにカーソル
(a (b c)) => (a b)
```

* 任意の括弧を挿入するprefix : C-q
サブフォルダにある複数zipファイルのある特定のファイルだけを指定したフォルダにサブフォルダを作成せずに解凍(長っ


タイトル長過ぎですね。下記のコマンドにたどり着くのに苦労しました。環境はMac OSX 10.9です。

```bash
find ./path/to/src -name '*.zip' | xargs -IX -n 1 unzip -j X -d ./path/to/dst \*.xml
```

## ポイント
- findの結果をxagrsに渡すところは、調べればたくさん出てくるので、それほど苦労は無いと思います。
- findの結果をxargsで指定するコマンド(この例だとunzip)に１つずつ渡すのに`-n 1`を指定します。
- 結果を渡す位置を指定するのに、`-I`オプションを使います。Iに続いて任意の文字列(1文字でもいい)を書き、unzipの結果を渡す位置にもその文字列を書きます。(上の例だとXです)
- unzipの解凍先を指定するのは`-d`オプションです。
- `-j`は、サブフォルダを作らないオプションです。
- zipファイル中の特定のファイルを指定する場合、ワイルドカードが使えますが、`*`はエスケープする必要があるらしく、`\*`としなければなりません。`\`を付けないと、no matches found: *.xmlの様なエラーになります。
python3でsubsonicAPIを使う


subsonicのAPIの使い方を調べたメモ
Basic認証使う場合は、サーバーから401コード返ってから認証する方法は使えないし注意。
どうせ暗号化されてないからu,pパラメータ使ってもいい気がするけど、どうなんだろ。

```python:
import httplib2
import base64

httplib2.debuglevel = 1 #debug出力ON
h = httplib2.Http('.cache') #引数の.cacheはキャッシュ保存ディレクトリ

top_level_url = 'http://my_server/'
url = top_level_url + 'rest/ping.view?v=1.8.0&c=myapp'

user_id = 'id'
passwd = 'pw'

encoded = str(base64.b64encode(bytes(user_id + ':' + passwd ,'utf8')),'utf-8') #base64変換

_headers={'Authorization':'Basic '+ encoded} 
response, content = h.request(url,headers=_headers)
```

httplib2の勉強にもなった。

参考にしたサイト
http://diveintopython3-ja.rdy.jp/http-web-services.html
RuboCop | Style/HashSyntax

# RuboCop | Style/HashSyntax

## 概要

RuboCopの「Style/HashSyntax」警告について。

Hashの key/value の記述方法をチェックします。
デフォルトでは、Ruby1.9から追加された

~~~ruby
{ key: value }
~~~

の記法を有効とします。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|EnforcedStyle|ruby19|Ruby1.9で導入された, key: value 形式を有効とする|○|
|EnforcedStyle|hash_rockets|key => value 形式を有効とする|--|

## HashSyntax

各設定値での検証結果をまとめます。

### 検証プログラム

guard_clause.rb

~~~ruby
ruby19_hash = { key: :value }
fat_arrow_hash = { :key => :value }
print ruby19_hash, fat_arrow_hash
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
HashSyntax:
  EnforcedStyle: ruby19
~~~

~~~bash
$ rubocop hash_style.rb
Inspecting 1 file
C

Offenses:

hash_style.rb:2:20: C: Use the new Ruby 1.9 hash syntax.
fat_arrow_hash = { :key => :value }
                   ^^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 ファットアローを利用した書式を有効にします

.rubocop.yml

~~~yaml
HashSyntax:
  EnforcedStyle: hash_rockets
~~~

~~~bash
$ rubocop hash_style.rb
Inspecting 1 file
C

Offenses:

hash_style.rb:1:17: C: Always use hash rockets in hashes.
ruby19_hash = { key: :value }
                ^^^^

1 file inspected, 1 offense detected
~~~

## 補足

この警告は rubocop -a で修正可能です。
C言語の文字配列の挙動が謎すぎる

char配列で宣言した長さより長い文字列を詰め込んでも普通に動いてしまいます。

なんででしょう・・・

環境:gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)

```c
#include <stdio.h>
#include <string.h>

int main()
{
    char s[2];
    strcpy(s, "very long long string");
    printf("%s\n", s);
    printf("strlen = %d\n", (int)strlen(s));
    printf("size = %d\n", (int)sizeof(s));
    return 0;
}
```

## 実行結果
```
very long long string
strlen = 21
size = 2
```
Cask で Org mode をインストールする

`(depends-on "org")` は失敗します．


## 答え


    (source org)
    
    (depends-on "org-plus-contrib")



## 解説

* `(source org)` で  http://orgmode.org/elpa/ のアーカイブが追加される．
* `org` アーカイブを追加すると `org-plus-contrib` パッケージをインストールできる．
  - このパッケージは Org mode 本体と contrib ライブラリがセットになったもの


## おわりに

Cask も楽ではないなあと思いました（小並感）．
Twitterの検索APIがUser名を巻き込んで検索してくれる問題

つまりどういうことかというと，

```html
http://api.twitter/com/1.1/search?q=""Ruby" "Mine""
```

とか投げると，

![6faafa7b-d9d7-2e07-41b3-9fff2be77cbf.png](https://qiita-image-store.s3.amazonaws.com/0/37097/032e4a58-7bf3-4c4a-7604-070241fda100.png)


こんなIDとか，名前(これ名前もMineでした)も引っかかってくる．

どうしたらいいんですかねぇ……

> 仕様です

とのこと．
SurfaceのTypeCoverでend keyをinsert keyにする

SurfacePro2を買って、使っていたのだけれど、TypeCoverが欲しくなったので買って浮かれていたら、このキーボードにはInsertKeyが存在しなかった

このままでは色々と支障をきたすのでEndKeyをInsertKeyにする事にした。

（要管理者権限）
windows + R で「regedit」と入力してレジストリエディタを立ち上げる

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
上記に移動して、右クリック→新規→バイナリ値
「Scancode Map」

```
00 00 00 00 00 00 00 00
02 00 00 00 52 E0 4F E0
00 00 00 00 00 00 00 00
```

左のCapsをCtrl変更も一緒にしたい場合は以下

```
00 00 00 00 00 00 00 00
03 00 00 00 1D 00 3A 00
52 E0 4F E0 00 00 00 00
00 00 00 00
```
CircleCIでsitecustomize.pyを設定する。


`sys.getdefaultencoding() != 'ascii'`なプロダクトの場合、sitecustomize.pyが要る。

```sitecustomize.py.cirlceci
# -*- coding: utf-8 -*-
import sys
sys.setdefaultencoding('utf-8')
```

```circle.yml
dependencies:
  pre:
    - cp circleci/sitecustomize.py venv/lib/python2.7/sitecustomize.py
```
こんな感じ。

ずっと`venv/lib/python2.7/site-packages`にコピーしてて動かなくて泣きべそかいてた。これだと、CircleCIはDebian系なので/usr/lib/python2.7/sitecustomize.pyにファイルがあってそっちが優先されてしまう。
PolymerでCustom Elementsは簡単に作れるのか

エモい話はブログに書きました
http://nekova.hatenablog.com/entry/2014/07/05/211303

##簡単に作るために必要なこと
自分で一から作るより、generatorに作らせた方が早いし便利

```shell-session
npm install -g generator-element
yo element:repo
```

+ [?] What do you want to use?
    + Polymer
+ [?] What's the GitHub repository?
   + your-repo
   + 小さなコンポーネントだと your-repo と your-element は同じになることが多い
+ [?] What's your GitHub username?
   + username
+ [?] What's the name of your element?
   + your-element
+ [?] How would you describe the element?
   + [Descriptionは書かないとIssue投げられて「書け」って怒られるから書いた方がいい](https://github.com/nekova/markdown-awesome/issues/2)
+ [?] Do you want to include lifecycle callbacks?
   + どっちでもいい。後で説明
+ [?] Do you want to include some useful Grunt tasks?
   + 絶対にYes。後で説明

###lifecycle
っていうのは、pylemer-element内の

```html
Polymer('your-element', {
            created: function() {},
            domReady: function() {},
            ready: function() {},
            attached: function() {},
            detached: function() {},
            attributeChanged: function(attr, oldVal, newVal) {}
        });
```

こういうcallbackのscaffoldが必要かどうか。
僕はいらないから作ってない。

###Grunt
ないと困る

```shell-session
$ grunt build
//内部的にはsrc/your-element.htmlやcssをコピーした後、bower_componentのpathを変更してるだけ
//大抵src/your-elemnt.htmlに変更を加えた後、pushする直前に実行する。ないと困る。

$ grunt server
//index.htmlをブラウザで開いてくれる。便利。ないと困る。

$ grunt deploy
//pushした後にデモページをgh-pagesにpushする時に使う。デモページはないと困る。
```

ちなみに```<hatebu-button>```とか```<markdown-awesome>```とか作った。
https://github.com/nekova?tab=repositories

##簡単じゃなかった、という知見の共有
実戦投入するつもりでCustom Elementsを作って欲しい。作った人すらproductionでゴリゴリは使ってないっぽくて、単純なところで普通に動かなくて困る。
https://github.com/zenorocha/twitter-button/pull/11

よく分かんない所で躓いたらそのコンポーネントorライブラリのissueを遡る必要があったりする。(Web Components特有の問題があったりなかったり)
https://github.com/chjj/marked/issues/283

コンポーネント用にパッチを当てる必要があった
（さきのissueは化石になってる。当時のregexは問題あったけど、今のregexは問題ないっぽい。情報が錯綜してる。そういうの調べるのも面倒）
https://github.com/nekova/marked

まだ若い。出来ないこともあるから諦めたり、ベタ書きでなんとかする
http://stackoverflow.com/questions/22076302/how-do-you-scope-polymer-imports-stylesheets-which-are-dynamically-injected-int

PolymerチームはわりとStack overflowをwatchしてるみたいだから、調べても出てこないならどんどん質問したりMailing listに投げて見るのも良い。
https://groups.google.com/forum/#!forum/polymer-dev

早い時期からPolymerを触ったり、記事書いたり、Stack overflowに質問投げてる人はDartとかにも触ってたりする（僕もそう）。
Polymer.jsにおいても重要なことが、Polymer.dartの記事のコメント欄に書かれてたりするから、Dartやったことないからって完全に無視するのはどうかと思う。

さっきのgeneratorを使ってGitHubにpushすると、http://customelements.io/ っていうところに自動で登録される。
困った時にそこのコードを見るとわりと便利。でも一番良いのはPolymerチームのリポジトリを見る方のが良い。 https://github.com/polymer
120個くらいrepoがあって、しかもPolymerに精通してる人が書いてるからめっちゃ参考になる。

``` <shadow></shadow> ```とか ```<content></content>```とか振る舞いが難しい。
最初はWeb Components特有のShadow Domとかに悩まされると思うけど、最悪ベタ書きで良いと思う。
```<twitter-button>```とかも、普通に```<a>```のベタ書きの方が良いと思う。そういう諦めも大事。（僕は意地でもforkして使ってる）

僕からは以上。

##追記
大変だけどそれでも全力で投資したいと思ってます。
http://nekova.hatenablog.com/entry/2014/07/05/211303
Swiftで使い方がよくわからなくてググったところ


##文法系

###?!の使い方がよくわからない

Swiftでは安全性のため、ある型の定数や変数にnilを代入することは禁止されている。
ある値が存在しないことを示すため変数にnilを代入可能にしたい場合には、?をつける。
?をつけた変数はOptional型と呼ばれ以下と同じ

```Swift
var l: Optional<Int> = nil // var l:Int? = nil と同じ
```

Optional<Type>型の値からType型の値を取り出すことを、アンラップするという。
Optional型の値をアンラップするには、値のうしろに"!"を付ける。
アンラップする場合には、値が確かに存在すること（nilではないこと）を確認しなければならない。

Optional型のままだと動かない場合もあるみたい。例えば以下のコードはコンパイルエラーに。

```Swift
var dict:Dictionary<String,String>? = Dictionary<String,String>()
dict["a"]="abc" //subscriptがないという理由でコンパイルエラー！
```

なので一度アンラップしてから触る

```Swift
var dict:Dictionary<String,String>? = Dictionary<String,String>()
var dict2 = dict!
dict2["a"] = "abc"
dict = dict2 //アンラップ時は参照渡しじゃない模様
```

コンパイルエラーの原因は、Optional型の場合immutable(変更不可)な変数になるため
(Objective-cで言うとNSMutableDictionaryからNSDictionaryに変わるってことです。)
オブジェクトが変わるので参照渡しじゃないため再代入になるってことですね
 


参考：http://ja.wikipedia.org/wiki/Swift_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)#Optional.E5.9E.8B


##文字列処理系

文字列をTrimしたいと思った場合

```Swift
var string = "      \n   "
string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
```

参考：http://www.learnswiftonline.com/reference-guides/string-reference-guide-for-swift/


##その他

###NSTimerでブロック構文&Swiftで使う

毎秒１秒間隔でブロック箇所の処理を実行するコード

```objective-c:base
[NSTimer scheduledTimerWithTimeInterval:1.0f target:[NSBlockOperation blockOperationWithBlock:^{
  NSLog(@"Timer event fired after 1.0s");
}] selector:@selector(main) userInfo:nil repeats:NO];

```

これをSwiftで書くと・・・・


```Swift:swift版
NSTimer.scheduledTimerWithTimeInterval(1.0, target: NSBlockOperation({
	println("Timer event fired after 1.0s");
}), selector: "main" /* Selector("main") という書き方も可 */, userInfo: nil, repeats: true)

```

参考：http://blog.geta6.net/post/40001464316/nstimer

つづく・・・
IntelliJで一部のコードを自動フォーマット対象から外す

Setting > Code Style > General > Enable formatter markers in comments
で設定可能。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/24305/d4cedd86-1d2f-57e5-ac94-373837240fca.png)

あとはソースコードに`@formatter:off`と`@formatter:on`を記述する。

```java
@Override
public void configure(WebSecurity web) throws Exception {
	// @formatter:off
	web
		.ignoring()
			.antMatchers("/resources/**")
			.antMatchers("/setup**")
			.antMatchers("/signup**");
	// @formatter:on
}
```

ちなみにIntelliJでソースの自動フォーマットは `Ctrl + Alt + l`
[MySQL]権限の確認と付与


※sql文は、英語の大文字小文字の区別はない。

# データベースの権限確認
## 登録されてるホストとユーザー名の確認
```mysql
select user, host from mysql.user;
```

## 特定のユーザーの権限確認
```mysql
show grants for 'ユーザー名'@'ホスト名'
```

# 権限の付与
`GRANT 権限 ON レベル TO ユーザ IDENTIFIED BY PASSWORD '****'`の形式で権限を付与できる。
このコマンドにより、既存でないユーザー名を書けば新たにユーザーが生成される。

- GRANTコマンドで権限付与
- 権限のところには`select`、`update`、`insert`、`delete`、の組み合わせや`all`などを記述。
- レベルは以下の4種類
  - グローバルレベル：`GRANT 権限 ON *.* TO user;`
  - データベースレベル：`GRANT 権限 ON db_name.* TO user;`
  - テーブルレベル：`GRANT 権限 ON db_name.table_name TO user;`
  - カラムレベル：`GRANT 権限 (カラム1, カラム2, ...) ON db_name.table_name TO user;`
- ユーザー名は、既存のユーザーなら権限上書き、既存でないユーザーなら新しくユーザーが生成されて権限付与。
- `IDENTIFIED BY PASSWORD '****'`でパスワード設定

(例)

```
grant select, update on db_name.* to 'hoge_user'@'localhost' identified by 'passwd';
```
【iOS】Missing Push Notification Entitlement 対処方法


プッシュ通知を実装して、申請したところ、以下のような通知がきた

>Missing Push Notification Entitlement - Your app appears to include API used to register with the Apple Push Notification service, but the app signature's entitlements do not include the "aps-environment" entitlement. If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the "aps-environment" entitlement. See "Provisioning and Development" in the Local and Push Notification Programming Guide for more information. If your app does not use the Apple Push Notification service, no action is required. You may remove the API from future submissions to stop this warning. If you use a third-party framework, you may need to contact the developer for information on removing the API.

>If you would like to update your binary for this app, you can reject this binary from the Binary Details page in iTunes Connect. Note that rejecting your binary will remove your app from the review queue and the review process will start over from the beginning when you resubmit your binary.

要約すると、
アプリにはプッシュ通知の機能が含まれているようですが、署名にはプッシュ通知の資格が含まれていません。プロビジョニングポータルでアプリケーションIDのプッシュ通知をオンにして、プッシュ通知権限のある証明書を設定してね。ということらしいです。

色々やってみた結果、証明書を作り直すことで回避出来ました。
申請までに行ったことは、

* リリース後の改修で、プッシュ通知機能を実装
* プロビジョニングポータルの該当アプリケーションIDのプッシュ通知をオンにする
* APNs証明書を作って、mBaasに設定
* テストでプッシュ通知使えたので、リリース用のAPNs証明書作成＆設定して、申請

今回、アプリケーションIDのプッシュ通知をオンにした後、証明書を再作成していなかったので、プッシュ通知の権限が反映されなかった模様

きちんと反映されたどうかは、Provisioning Profileの情報を見ればわかります。


```
<plist version="1.0">
<dict>
	<key>application-identifier</key>
	<string>prefix.BundleID</string>
	<key>aps-environment</key> --> これが入ってればOK
	<string>production</string>
	<key>com.apple.developer.team-identifier</key>
	<string>prefix</string>
	<key>get-task-allow</key>
	<false/>
	<key>keychain-access-groups</key>
	<array>
		<string>prefix.BundleID</string>
	</array>
</dict>
</plist>
```
5行目の\<key>aps-environment\</key> が入ってればOKです。

* Provisioning Profileの確認方法
 * Xcodeの[Window] - [Organizer] - [Archives] - [Distribute] を選択
 * 「Save for Enterprize ・・・」を選択しNext
 * App store公開用のProvisioning Profileを選択しExport
 * パッケージファイル（.ipa）保存先を指定しSave
 * ターミナルで解凍コマンド実行「unzip <パッケージ.ipa>」
　※Payload/フォルダに展開される
 * ターミナルで署名状況を確認するコマンド実行
　「codesign -d --entitlements :- Payload/<パッケージ.app>」

[参考：[エラー]Missing Push Notification Entitlement](http://ios-iam.blog.so-net.ne.jp/2014-03-06)


何か間違いやアドバイスがございましたら、コメントお願いいたします。
リモートサーバのhub browseでMacのブラウザのGithubを開く

# はじめに
`hub browse` 便利ですよね。
ただ一つだけ問題なのはリモートサーバからではMacのブラウザ開けないことです。
今までは`export BROWSER=echo`と設定してURLをechoして⌘+クリックして開いてました。

iTerm2の設定をいろいろ弄っていたところ、Triggers機能とCoprocess機能でこれが実現できたので紹介します。

# 想定環境

- Macの[iTerm2](http://www.iterm2.com)からsshでサーバに入り操作
- サーバには[hub](https://hub.github.com/)コマンドがインストール済み


# 設定
まずiterm-https://~というURL schemaをechoするシェルスクリプトを作ります。

```shell-session:iterm
#!/bin/sh
echo "iterm-$@"
clear
```
これを実行権限を与えてPATHの通った場所に置き、BROWSERに指定します。

```shell-session
chmod +x iterm
mv iterm /path/to/bin/
echo "export BROWSER=iterm" >> ~/.zshrc
```

続いてiTerm2の環境設定を開き、Profiles > Advanced > Triggers を開きます。
ここに以下の様な設定を追加します。

| Regular Expression | Action | Parameters |
|:-----------|:------------|:-------------|
| iterm-(https?://[\w/:%#\$&\?\(\)~\.=\+\-]+) | Run Coprocess... | open \1 |

![スクリーンショット 2014-07-05 19.30.49.png](https://qiita-image-store.s3.amazonaws.com/0/5391/41234c53-eb9e-2e48-9c90-f9629b862523.png)


以上でOKです。
`hub browse`でMacのブラウザが起動するようになりました！

# しくみ
iTerm2のTriggers機能はターミナル画面を監視して、設定した正規表現に対してActionを起こします。
Actionに設定したRun CoprocessというiTerm2の機能は、コプロセスを **Mac上** で実行します。

今回はiterm-https://~という文字に反応してhttps://~部分を引数に`open`コマンドを実行するように設定しています。
[エラー]jQplotでz-index指定をしたときの話

jqplotで、htmlのdiv要素に style="z-index: -1" という形でマイナス指定をした場合に、highlighterが機能しなくなりました。

なぜ、っていうのはよく分かってません。とにかく、z-indexにマイナスを指定するとhighlighterが途端に機能しなくなります。

興味のある方は調べてみても良いかもしれません。。あたしは断念しています。
pep8を用いてpythonのコードのスタイルをチェックする

#2019.08.01
古いので以下を参照してください。
**カウボーイには嫌がられるPythonの話**
https://qiita.com/mima_ita/items/cabcf014aa08e27c8de7

#概要
本ドキュメントでは、Python コードのためのコーディングスタイルであるPEP8に違反していないかチェックする方法について説明する。

PEP 8 -- Style Guide for Python Code 
http://legacy.python.org/dev/peps/pep-0008/

訳:
https://dl.dropboxusercontent.com/u/555254/pep-0008.ja.html


#インストール方法

PEP8  - Python style guide checker をインストールする
https://pypi.python.org/pypi/pep8/

```
easy_install pep8
```

または

```
pip install pep8
```

これによりコマンドラインからpep8を実行できる。

```
pep8 test.py
pep8 /test/directory
```
ディレクトリを指定した場合はサブディレクトリもチェックする


#主なオプション

|オプション名|説明|
|:-----------|:---|
|--version|バージョンを表示する|
|-h,--help|ヘルプを表示する|
|-v,--verbose|チェック中のファイル名などの状態メッセージを表示する。--vvでデバッグメッセージが表示される|
|-q,--quiet|ファイル名のみ表示する。-qqはなにも表示しない。|
|--first|同じエラーの場合、最初のみ表示する|
|--exclude=patterns|除外するファイル名やディレクトリ名のパターンを記述する。コンマで区切ることで複数していできる。<BR>デフォルト：.svn,CVS,.bzr,.hg,.git,__pycache__|
|--filename=patterns|ディレクトリを検索する場合に、ここで指定したパターンのファイルのみ検索する。コンマ区切りで複数指定できる。<BR>デフォルト: *.py|
|--select=errors|エラーや警告を指定する <BR>例：E,W6|
|--ignore=errors|指定のエラーを無視する <BR>例：E,W6|
|--show-source|各エラーにソースを表示する|
|--show-pep8|各エラーにPEP8の説明を追加する。--firstと伴につかったほうがいい|
|--statistics|エラーや警告の数を集計して最後に表示する|
|--count|最後にエラーと警告の総数を表示する|
|--config=path|設定ファイルの場所を指定できる。|


#設定ファイル
configオプションで指定できる設定ファイルには、各オプションの値を指定することができる。

```
[pep8]
ignore = E111
```


#Pythonからの使用
pep8をimportすることでPythonから使用することもできる。

```py
import pep8
pep8style = pep8.StyleGuide(quiet=True)
ret = pep8style.check_files(['test.py']);
print ret.total_errors
```

#Jenkinsからの利用
Jenkinsのプラグインである、Violationsを使用すれば集計が可能である。

![pep8_2.png](https://qiita-image-store.s3.amazonaws.com/0/47856/df3ba6ef-e494-f96c-54fe-bf4e3084aa91.png)


シェルスクリプトから実行する場合は次のように先頭に「#!/bin/sh」を記述するのと最後にエラーコードを返さない処理を行う必要がある。

```
#!/bin/sh
pep8 /share/py/test.py > ${WORKSPACE}/test.txt
echo "....finished"
```

このような処理をする必要がある理由としては、下記のページを参照の事。
[Jenkinsのシェルの実行について](http://qiita.com/mechamogera/items/f689b95670127d5bf046 "Jenkinsのシェルの実行について")
Violationsの設定は下記の通り。

![pep8_1.png](https://qiita-image-store.s3.amazonaws.com/0/47856/4e6d8492-359f-873c-5cdd-640fa296d1b5.png)

XMLで出力する必要はない。
NSURLSessionを使って進捗をblockで取る

## NSURLSessionDownloadDelegate
NSURLSessionDownloadDelegateの`URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:`でダウンロードの進捗が取れます。

対象のtaskが引数で渡ってくるので、taskとblockの組み合わせをDictionaryで持っとけばいいです。

## SessionTaskManager
SessionTaskManagerなるクラスを作って、`[NSURLConnection sendSynchronousRequest:returningResponse:error:]`みたいに手軽に非同期リクエストを投げつつ進捗を取れるようにしてみます。

ほんとはもちろんcompletionブロックとか要るし、progress blockが溜まっていく一方なのでまずいですが、ごちゃごちゃするのでここでは省略しますネ

```objc:SessionTaskManager.h
@interface SessionTaskManager : NSObject
- (NSURLSessionTask *)executeRequest:(NSURLRequest *)request progress:(void (^)(int64_t doneBytes, int64_t totalBytes))progress;
@end
```
```objc:SessionTaskManager.m
#import "SessionTaskManager.h"

@interface SessionTaskManager ()<NSURLSessionDownloadDelegate>
@property NSURLSession* session;
@property NSMutableDictionary* progressBlockMap;
@end

@implementation SessionTaskManager
- (instancetype)init
{
    self = [super init];
    
    if (self) {
        _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        _progressBlockMap = [NSMutableDictionary dictionary];
    }
    
    return self;
}
- (NSURLSessionTask *)sendRequest:(NSURLRequest *)request progress:(void (^)(int64_t, int64_t))progress
{
    NSURLSessionTask* task = [_session downloadTaskWithRequest:request];
    //NSURLSessionTaskはNSCopying準拠してるのでkeyに使える
    [_progressBlockMap setObject:[progress copy] forKey:task];
    [task resume];
    return task;
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    void (^progress)(int64_t, int64_t) = _progressBlockMap[downloadTask];
    progress(totalBytesWritten, totalBytesExpectedToWrite);
}
@end
```

NSURLSessionManagerはcancelとかが柔軟にできてよいですね。
nginxでperlを動かす


```bash
$ sudo apt-get install nginx fcgiwrap libgcgi-perl
```

例）/var/www/vhosts/example.com/cgi-bin以下のperlファイルをhttp://example.com/cgi-binで動かす場合

```
location /cgi-bin/ {
  gzip off;
  root /var/www/vhosts/example.com/;
  include fastcgi_params;
  fastcgi_pass unix:/var/run/fcgiwrap.socket;
  fastcgi_index index.pl;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
```

起動

```
$ /etc/init.d/fcgiwrap start
$ /etc/init.d/nginx start
```
CircleCIにRedisのデータを読み込む


* (追記1) s3cmd signがうまく動かない事があったので、sign用のスクリプトを書いた


# 前置き

CircleCIを使い始めたのだけど、現プロジェクトではRedisに住所データみたいな定数データをぶち込んで使っているので、テスト前にそのデータを読み込まないと完動しないなぁと困っていたのだが、[CircleCIのドキュメント](https://circleci.com/docs/configuration#database)を読んでも特にオススメの方法は無いようなので作ることにした。

dump.rdbをそのまま差し替えようかと思ったのだけど、キャッシュ用の、テストに必要の無いデータももりもり入っていて肥大化しているので、今回は必要なデータだけをCircleCIにセットアップするようにした。

また、でかいバイナリデータをgithubにぶち込みたくないので、データのやりとりにはS3を使うようにした。

# RedisデータのImport/Export

REDISのImport/Exportネタを探しても"RDBを差し替えようぜ"みたいな話しか無いので困ったなぁと思ってたらいいのがあった。

https://github.com/sripathikrishnan/redis-rdb-tools
http://redis.io/topics/mass-insert

REDISのバイナリプロトコル用のデータを吐き出して、ソレをredis-cliを使って流し込むというもの。コレで良さそう。

テキストプロトコルでの例は http://uokada.hatenablog.jp/entry/2012/12/01/021131 にあった。今回使うデータはバイナリデータを含んでいるのでこちらは使えない。

今回作ったスクリプトはこちら https://gist.github.com/shnjp/886eda28061c37047cd5


## Export

まず、redisで念のためbgsaveする。

```sh
basetimestamp=`redis-cli lastsave`
redis-cli bgsave
while [ 1 ]
do
  curtimestamp=`redis-cli lastsave`
  if [ $basetimestamp != $curtimestamp ]
  then
    break
  fi
  sleep 1
done
```

必要なデータだけバイナリプロトコルに変換してgzipする。

```sh
rdb --command protocol --key KEY-PATTERN $REDIS_DUMP_RDB gzip --stdout > $REDIS_PROTOCOL_FILE
```

s3cmdでs3に送る

```sh
s3cmd -c S3-CONFIG-FILE put $REDIS_PROTOCOL_FILE $S3_BACKUP_BUCKET
```

## Import

Importはcurlで取ってredis-cliに流せば良いのだけど、CircleCIから取得するためにS3のOne time tokenを使ってURLを生成する必要がある

~~https://github.com/hajoeichler/s3cmd-signed-url/blob/master/s3cmd-signed-url コレ参考にして必要なところだけ書いた https://gist.github.com/shnjp/886eda28061c37047cd5#file-get_s3_object-sh~~
`TIMESTAMP`の値によってシグネチャエラーが出る問題の原因がわからなかったので、botoを使って書きなおした。

```python
#!/usr/bin/env python
"""
s3sign.py [ACCESS KEY] [SECRET KEY] [BUCKET] [KEY]
"""
import sys
from boto.s3.connection import S3Connection

access_key, secret_key, bucket_name, key_name = sys.argv[1:5]
connection = S3Connection(aws_access_key_id=access_key, aws_secret_access_key=secret_key)
key = connection.get_bucket(bucket_name).get_key(key_name)
print key.generate_url(600)
```

こんなかんじのスクリプトを作って、circle.ymlに

```yaml
database:
  post:
    - curl `./s3sign.py S3-ACCESS-KEY S3-SECRET-KEY S3-BUCKET-NAME redis-cache-data.raw.gz` | gunzip | redis-cli --pipe
```

こんなのを追加した。

# おハマりどころ

シェルスクリプトはあまり書いたこと無いので色々詰まった。

## echoの仕様

echoって仕様違うのね。`echo -e`が無くて困った。

## redis-rdb-toolsがバイナリデータを扱えない

redis-rdb-toolsがutf-8しか見てくれなくてバイナリプロトコルに変換するときにコケた。
パッチ書いてなんとかした。

https://github.com/shnjp/redis-rdb-tools/commit/242305a8319971a5727ba3a21bc9705c288cd6d6
RubyでCSV.tableを使うことに関して

RubyでCSVを扱う時にちょっと調べたのでまとめておきます。

``` data.csv
time,text,user
10:00,Hello,tarou
20:10,GOODNIGHT,miki
03:00,SINTYOKUDAME,se
```

```rb:csv_table.rb
require 'csv'

csv = CSV.table('data.csv')

time = csv[:time]  #ヘッダーを指定する場合

puts time.class # => array
puts time # => 10:00
          #    20:00
          #    03:00

one = csv[1] #行を指定する場合
puts one.class # => CSV::Row
puts one # => 20:10,GOODNIGHT,miki
puts one[:time] # => 20:10
```

CSVライブラリで.tableした際、ヘッダーを指定した場合は配列として扱うことが出来る。一方、行を指定した場合はCSV::Rowとして扱われる。なので、行指定の場合は、そこからさらにヘッダーを指定したりも出来る。
FuelPHPで(※wmv)ファイルのアップロード


IE死ね。

最近FuelPHPでwmvファイルをアップロードする機会があったので以下メモ。

Uploadについては[以前ちらっと書きました](http://qiita.com/yumura_shiho/items/4b94a377e9f2cc3a0ca1)が、やはり足りないと思うのでそれもちまちま。

参考はこちらのサイト様：[FuelPHPのUploadクラスを詳しくまとめてみる。≫新人Webエンジニアの記録。](http://blog.fagai.net/2013/04/23/fuelphp_upload/)

## Uploadの基本形(DB登録あり)
```php
// 初期設定
$config = array(
    'path' => DOCROOT.DS.'assets'.DS.'img'.DS.'profile',
    'normalize' => true,
    'ext_whitelist' => array('img', 'jpg', 'jpeg', 'gif', 'png'),
        );

        // アップロード基本プロセス実行
        Upload::process($config);

        // 検証
if (Upload::is_valid())
{
    // 設定を元に保存
    Upload::save();
}
// 正常系
foreach (Upload::get_files() as $file){
	DB::insert('images')->set(array('filename'=>$file['saved_as']))->execute();
}

// 異常系
foreach (Upload::get_errors() as $file){

}
```
上記は、POSTされた画像をassets/img/profileにアップロードした後保存ファイル名をDBに登録する形のサンプルです。
パスおかしくね？って件については、あれです、セキュリティとかの関係上フレームワークをちょっといじったのでそのへんの関係です。
ここについても後々(最近いろいろ試してる時間がないのです)記事にしたいと思っています。

で、wmvなどの特殊な拡張子を扱うための設定等が以下。

## 1.MIMEタイプが認識されていない
Windowsの独自拡張子なので当然といえば当然。POST自体受け取ってもらえません。
COREPATH/config/mimes.phpに以下を追記。

```mines.php
	return array(
		/* --- 中略 --- */
		'wmv'	=>	'video/x-ms-wmv'
	);
```

これを書くことでAPPPATH/config/upload.phpのホワイトリストに記述することが出来ます。

## 2.ファイルサイズが大きすぎてアップロードできない
これはphp.iniの設定の話ですので、そちらを修正。

```php.ini
post_max_size = 30M
upload_max_filesize 30M
```

数字に根拠はありません。今回のシステム上妥当っぽい数字が入っています。
これは各々環境と必要分に合わせて調整するしかないと思います。

以上！
第23回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://yhpg.doorkeeper.jp/events/12339 )を行っています。

問題は「くねくね増加列」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間ぐらいあれば足りるかな、と思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
MacOSX+DockerでQGIS-Documentationをビルドしてみる


QGIS-Documentationのディレクトリにdocker-run.shというファイルがあったので、せっかくなのでMacOSX上でビルドできるようにしたみた。

## boot2dockerインストール

以下のサイトからboot2dockerのパッケージを入手してインストール。

https://github.com/boot2docker/osx-installer/releases

boot2dockerではVolumeのマウントができないので、[boot2docker でボリュームの共有を行う - Qiita](http://qiita.com/superbrothers/items/1095ce71da4d425b6f36) を参考にマウントできるようにする。

```bash
$ wget http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso -O ~/.boot2docker/boot2docker.iso
$ boot2docker init
$ VBoxManage sharedfolder add boot2docker-vm -name home -hostpath /Users
$ boot2docker up
# DOCKER_HOSTはboot2docker upしたときに出てくるものを利用、ちゃんとbashrcとかzshrcとかにぶっこんでおくこと
$ export DOCKER_HOST=tcp://192.168.59.103:2375
```

なお、上記の方法で取得してるboot2dockerのイメージはバージョン依存があるので、boot2docker 1.0.1以外を使っている場合はそれっぽいイメージファイルを探して下さい＞＜

## qgis/sphinx:1.0イメージを作成
qgis/sphinx:1.0というDockerのイメージを作成します。
これはQGIS-Sysadminというレポジトリのものを利用します。
ちなみに、イメージ作ると2GBぐらいあるので注意。

```bash
$ git clone git@github.com:qgis/QGIS-Sysadmin.git
$ cd QGIS-Sysadmin/docker/sphinx
$ sh docker-build.sh
```

## ドキュメントを生成
最後にDockerを使ってドキュメントを生成します。
今回はTransifexから最新の翻訳ファイルを取ってきます。
ちなみに、REQUIREMNTS.txtにあるtransifex-clientが古く(0.9)、エラーになってしまったので最新版(0.10)にアップグレードしています。

```bash
$ git clone git@github.com/qgis/QGIS-Documentation.git
$ cd QGIS-Documentation
$ virtualenv-2.7 virtualenv
$ source virtualenv/bin/activate
$ pip install -r REQUIREMENTS.txt
$ pip install --upgrade transifex-client
$ rehash
$ tx pull -l ja
$ ./docker-run.sh html LANG=ja
$ ./docker-run.sh pdf LANG=ja
```

あとはoutputディレクトリにあるファイルを確認します。
SpriteStudio Mavericks ベータ版 x Unity メモ


> 現在進行形でつかっていて、おもったことをつらつら書いてみる
> なお組み込みの環境は、SS5Player for Unity

## バグっぽい

- ファイルダイアログで、詳細表示だと、スクロールとかして強制リフレッシュしない限り、なにも表示されない
- TexturePackerではいたファイルをインポートするとパースエラー（一応読めてる）
- .sspjをダブルクリックして起動すると、空のプロジェクトが立ち上がる
- xmlパーサをstandardにすると、xml読み込み時にクラッシュする。
- アトリビュートで小数点が入力出来ない。（致命傷）現状回避は、矢印連打して0.01刻みで力技入力。
- アトリビュートの入力がいくら入力しても反映されずにもとの値に戻る（というかアトリビュートの入力エリア自体が全体的に挙動不振。
- 同一セルを参照してるノードが存在するとき、「個別の設定を使用」をしても、個別に値が設定出来ない。（回避方法は、セル別名定義して、同一ソースを参照させる。
- 総フレームが1とか小さい値だと、Unity上でout of range で死ぬ。10フレーム以上に設定すると回避出来る
- 最終フレームは再生の対象外となる。

## 仕様として辛い

- ** レイアウトパネルがスクロールできない？ので、基準枠をセンター以外にすると画面に治まらなくて死ぬ **
- トラックパッドのスクロールを拡大縮小で解釈されてしまい、誤操作（切れるといいなぁ...
- 各種パネルの配置レイアウトがもっと自由にできるといいなぁ...（レイアウトパネルを大きくして作業すると、実質、セルマップとかのパネルが使えなくなるので
- 非表示ノードはUnity上では反映されず、非表示アトリビュートで制御しないといけない。