OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyプロジェクトの始め方の備忘録


自分の記憶力が薄弱すぎて、Rubyで何か書くかとなった時にいつも下準備の仕方を調べている気がするので、後で楽するために備忘録を残しておきたいと思います。

余談ですが、自分の記憶力が薄弱すぎて(大事なことなので２回繰り返した)「自分のために残すメモ的な意味の熟語なんだっけ？忘備録だったっけ？」って思ってググったら、「備忘録」(忘れるのに備える記録で備忘録)が正しくて、よく見る「忘備録」は誤記で「備えるのを忘れた記録になる」という意味になってしまうようです。
勉強になりました。


## 前提となる環境

* Mac OS X
* giboをインストール済
* ruby-build,rbenvをインストール済


## 準備

ディレクトリを作って`git init`してからgiboで.gitignoreをお手軽に作成する。giboは、RubyとOSXとVimを引数に指定する(OSXとVimはなくてもいいかも)

```
$ mkdir rubyproject
$ cd rubyproject
$ git init
$ touch .gitignore
$ gibo Ruby OSX Vim >> .gitignore
```

> simonwhitaker/gibo · GitHub 
> https://github.com/simonwhitaker/gibo


## Rubyの設定

使用するRubyの設定をする。
rbenvでその時点での最新版のRubyを入れる。

```
$ rbenv install -l
$ rbenv install x.x.x(インストールするRubyのバージョン)
$ rbenv local x.x.x
$ rbenv rehash
```
> sstephenson/rbenv · GitHub
> https://github.com/sstephenson/rbenv


## Bundlerの設定

基本的にプロジェクトで使用するBundlerでgemはローカルディレクトリに保存するけど、Bundlerとrubocopはシステムワイドにインストールしているので、その2つを最新版にする。
その後使用するgemをローカルにインストールする。

```
$ gem update --system
$ gem update bundler
$ gem update rubocop
$ bundle init
$ vim Gemfile
(使うgemを記述する)
$ bundle install --path vendor/bundle
```

> Bundler: The best way to manage a Ruby application's gems
> http://bundler.io/


## Gemfile

プロジェクトで使用するgem以外のデバッグ等に使用するgemは以下を使っている。

```Gemfile
source "https://rubygems.org"

ruby 'x.x.x'(インストールしたRUbyのバージョン)

group :development do
  gem 'awesome_print'
  gem 'tapp'
  gem 'pry'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'pry-stack_explorer'
  gem 'refe2'
end
```

* awesome_print

デバッグ時等にオブジェクトのデータ構造を分かりやすく表示してくれる。
.pryrcに下記のように書いてpry起動時に自動的にrequireするようにしている。

```.pryrc
# awesome_print
begin
  require "awesome_print"
  AwesomePrint.pry!
rescue LoadError => e
  puts "no awesome_print"
```

> michaeldv/awesome_print · GitHub
> https://github.com/michaeldv/awesome_print


* tapp

メソッドチェーンの途中に挟むと、pp(puts)しながらレシーバを返すObject#tappやObject#taputsが使えるようになる。
プリントデバッグが捗る。

> esminc/tapp · GitHub
> https://github.com/esminc/tapp


* pry

強いirb。

> pry/pry · GitHub
> https://github.com/pry/pry


* pry-doc

`show-source` でCで書かれているRuby組み込みのクラスやメソッドのソースを見ることができる。

> pry/pry-doc · GitHub
> https://github.com/pry/pry-doc


* pry-byebug

`binding.pry`でデバッグする時にピンポイントで処理を止めてステップ実行できる。

> deivid-rodriguez/pry-byebug · GitHub
>https://github.com/deivid-rodriguez/pry-byebug


* pry-stack_explorer

デバッグ時に `show-stack` でその時のスタックの情報が見られる。

> pry/pry-stack_explorer · GitHub
> https://github.com/pry/pry-stack_explorer


* refe2

`refe` でコマンドラインからRubyリファレンスマニュアルを見ることができる。

> refe2 | RubyGems.org | your community gem host
> https://rubygems.org/gems/refe2/versions/0.9.0


## 終わりに

Ruby初心者なので、Rubyで小規模な開発を行う時に便利なgemが他にあったら教えてほしいです。
General error: 1665 になる場合の対処

環境
------

- EC-CUBE3
- Gentoo/Linux
- MySQL5.6.17
- PHP5.6.15


現象
-------

EC-CUBE3 をインストール直後に、システムエラーとなり、以下のようなエラーメッセージが出ることがある。

```error-message
General error: 1665 Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
```

対策
------

`my.cnf` に以下を追加し MySQL を再起動することで解消


```my.cnf[mysqld]
binlog-format = MIXED
```

参考
------

- https://github.com/owncloud/core/issues/16008
pow で実行した Rails アプリケーションを byebug でデバッグする

pow 側に環境変数を設定します。

```bash:~/.powconfig
export RUBY_DEBUG_PORT=3003
```

rails 側で、Byebug サーバーを立ち上げるようにします。

```rb:config/environments/development.rb
# add env by .powconfig
if ENV['RUBY_DEBUG_PORT']
  require 'byebug/core'
  Byebug.start_server 'localhost', ENV['RUBY_DEBUG_PORT'].to_i
end
```

byebug サーバーに接続します。

    bundle exec byebug -R localhost:3003

あとは通常通り、ソース内に buybug とブレークポイントを設定することにより、デバッグが可能です。


参考 : [ruby on rails 4 - How to use Byebug with a remote process (e.g., pow) - Stack Overflow](http://stackoverflow.com/questions/22794176/how-to-use-byebug-with-a-remote-process-e-g-pow)
electron でsqlite3を使うときに起こるエラー

```error文
a missing path of something like node_modules/sqlite3/lib/binding/node-v43-darwin-x64
```

エラーが起こる原因
---
electron で探しに行っているsqlite3のpathと実際にinstallしているsqliteのパスが異なっているために起こる。

詳細
---
sqliteの更新が遅れているために古いnodeのpathをそのままにされている	
　node_modules/sqlite3/lib/binding/node-v14-darwin-x64

解決策
---
```cd node_modules/sqlite3
npm run prepublish
node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v43-darwin-x64
node-gyp rebuild --target=0.27.1 --arch=x64 --target_platform=darwin --dist-url=https://atom.io/download/atom-shell --module_name=node_sqlite3 --module_path=../lib/binding/node-v43-darwin-x64
```
ここで一つ注意するべきことはtargetのelectronのversionとnode-v43の所は自分の環境に応じて変更する必要がある。





参考文献
---
http://verysimple.com/2015/05/30/using-node_sqlite3-with-electron/
【iOS】iPhoneの画面比率をiPadに適用する方法

## やりたいこと
iPhoneの画面比率を維持した状態でiPadにiPhoneアプリライクに表示させたい。

## やってみた
iPadのサイズを変更しようとしたら結構はまりました。
UIViewControllerの中で再設定するのかとか、window.rootViewControllerに設定するのかとか。
そもそも、rootViewControllerってなんだっけとか。

色々やってみたところ、UIViewControllerよりも上位にいるUIWindowに対してサイズ設定すればいい感じになりました。

```swift:AppDelegate.swift

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        // 比率計算する

        // サイズを変更する
        window?.clipsToBounds = true
        window?.frame = CGRectMake(100, 0, 500, 1200) // x, y, width, height
        window?.bounds = CGRectMake(0, 0, 500, 1200)
}
```

AutoLayoutでSizeClassを使っていい感じにできることならしたかった。

あとは、UIWindowなんて変えてしまってリジェクトされるかどうかが気になりましたが、
readonlyではなく、変更できるので問題ない気がしています。

## 参考にしたサイト
[UIWindow.rootViewControllerって？](http://www.toyship.org/archives/1326)
[self.window not working inside view controller](http://stackoverflow.com/questions/19517183/self-window-not-working-inside-view-controller)

## 2016.3.26追記
上記の対応でApple審査へ通したところ、１回目の審査はオッケーでしたが、２回目で厳しい審査のチームに当たったらしくリジェクトされました。
各々のデバイスにちゃんと合った画面を作らないといけないそうです。ハードル高い。。
コントローラーてなんだ

コントローラね。

モジュール作ると同時にやる方法と、あとでやる方法があるみたい。

同時にやる方法（まとめて登録する、とかいうみたい）

```
var moduleVar = angular.module("module",[])
.controller("controller",function($scope){
      コントローラの処理
   });
```

後でやる方法。

```
var moduleVar = angular.module("module"),[]);
moduleVar.controller('controller',function($scope){
コントローラの処理
}
```

後でやる場合は即時関数の中に入れるのが良いみたい。スコープでとっちらかないようにするため？あとStrictモードも同時に。
TypeScript使えばあまり意味ないんだろうか？

これでコントローラがモジュール（いれもん）に追加された。
モジュールを定義しているタグ内では、登録したコントローラが使えるようになると。

でもモジュールに追加するだけで使えるようになるヤワなAngularJSじゃない。
HTMLの方も修正が必要。

```
<body ng-app="module" ng-controller="contorller">
```
て、使用するコントローラも定義してやらんといかん。
めんどくせえな。なんか理由があるんだろうけど。いまはわからん。

コントローラは以上です。
MyBatisを使った実装(テーブルをJOINして返却)

[昨日](http://qiita.com/55beagle/items/99b68e6d50c17ae61e2b])の続き。

2テーブルをJOINして返却する実装を行う。
# 流れ
- 2テーブルを結合した受け口になるEntityクラスを作る
- DBとJavaを繋ぐMapperクラス(interface)を作る
- SQLの実装を書くMapperファイル(XML)を作る

感想としては、、、XMLがミスっていると実行時にエラーとなるので問題を見つけるのが大変。
特に返却値を定義する\<resultMap>の書き方は、[MyBatisのドキュメント](http://mybatis.org/mybatis-3/ja/sqlmap-xml.html)を見つつ作成したけど、生産性良くない。
記法を覚えたので、今後は良くなるかな？
JOINした結果を、それぞれオブジェクトに分けるには\<collection>タグを使用(集合になる場合は要素にjavaType="ArrayList"入れてね)。


# ハマった点
`現象：実行時、Mapperクラスで[NoSuchBeanDefinitionException]`
`原因：Mapper.xmlを手作成する時、自動作成した物を元にしたので<select>タグ内の返却値型の定義<resultType>を使っていた`
`解決策：<resultType>⇒<resultMap>に変更`

`現象：xmlのwhere句で、CheckStyleエラー「要素のコンテンツは、整形式の文字データまたはマークアップから成るものでなければなりません」`
`原因：「hoge <= #{hoge}」のように「<」を使っていた(コンパイラにタグだと思われた)`
`解決策：<![CDATA[]]>でwhere句を囲む`

(参照：http://www.taosoftware.co.jp/blog/2006/03/ibatissqlmap.html)

```xml:例
<where>
	<![CDATA[
 	AND from <= #{hoge}
 	AND to >= #{hoge}
	]]>
</where>
```
[Unity] オブジェクトの透明度を操作する方法


## オブジェクトの透明度を取得・設定する手順

MeshRender コンポーネントを取得する  

```
Meshrender meshrender = GetComponent<MeshRenderer> ();
```

Meshrender.material.color プロパティに、変更したい色を格納したColorオブジェクトを設定する。
ColorオブジェクトはRBGAの値持っているのでalphaを変えて透明度を操作する。
透明度は0.0が不透明、1.0が透明


```
meshrender.material.color = new Color(0, 0, 0, 1.0f);
```



シェーダーはTransparent > Diffuse を選択する。

![スクリーンショット 2015-11-20 18.08.39.png](https://qiita-image-store.s3.amazonaws.com/0/58251/775522db-0bee-cd65-e4c1-aab2a0270092.png "スクリーンショット 2015-11-20 18.08.39.png")
価値のあるコメントを残そう！

#　はじめに
あなたは普段ソースコードにコメントを入れてますか？
コメントは正しく書けば、コードをより読みやすくすることができます。
読みやすいコードは、プロジェクトに加入した人が戦力になれるまでの時間を短縮できたり。
引き継ぐ際にスムーズになったり。
後から読んで頭を抱えずに済んだりと、たくさんいいことがあります！
なので今回は「何をコメントするのが良いのか」について記載しました。(コメント自体の書き方　種類などには触れません)
#コメントの目的
私もそうでしたが、コメントの目的は「コードを説明する」ことと思っている人がいると思います。
それも間違いではないのですが、具体的に言うと「書き手の意図を読む人へ伝える」ことです。
#具体的にどんなコメントをしたらいいのか
コードを書いている時の自分の考えを記録する。
読み手の気持ちになって何が必要かを考えて書く
過剰なコメントは避ける
##コードを書いている時の自分の考えを記録する。
コードを書くときは、何かしら考えながら書いていると思います。
書いているときは、頭の中に考えがあるのですぐ理解ができますが、読む人はコードでしか情報が得られません。
後から読む自分の為、引き継ぐ人の為にも考えをコメントとして記録しましょう。
###具体例①
//○○を使うよりxxの方が△△％早かった。

自分で試した結果どうなったかが分かるようになっています。これが無ければ別の人が別のやり方に変えて無駄な時間が発生したかもしれません。
###具体例②
//ソースが汚くなってきたので、そろそろ整理した方がいい
//○○を別クラスにするといい

時間が無いときにかかれることが多いと思います。
汚くなっていること、その改善策が書かれているので改修しやすいです。
この場合、コメントの頭にTODOとつける人もいると思います。
###具体例③
//この方法では極稀に○○が生じるが、パフォーマンスを優先した

何か理由があって、問題を残している場合もあると思います。
そんな時にコメントが無いと、別の人が改善策を探したり、試験したりと時間が無駄になってしまいます。
##読み手の気持ちになって考える
誰でも人のソースを読むことは誰でもあると思います。
読んでいると「なんでこんな処理になっているんだ？」と疑問に思ったことないでしょうか？
そんな疑問を先読みして、コメントをすると読む人の理解速度が上がるでしょう。
###何を意識をすればいいか
Why:なぜこのコードを書いたのか
What:何がしたいか
bad know-how:何かの訳があってこのコードになっているかを説明

読み手からしたらWhyがあると理解がしやすいです。
Whatはコードを読むと分かることもあるのでWhyより重要度は低いでしょう。
bad know-howは先ほどの具体例③がまさにそれですね。これも重要でしょう。

##過剰なコメントは避ける
簡単なコードにコメントをしたり、コメント自体の量がかなり多くなってしまったりすることがあります。
無意識にコメントをガリガリ書かずに、一度読んで正しいか確認しましょう。
###具体例①
//画面にHello Worldと出力
printf("Hello World");

実行するだけですぐ分かると思います。
printfが分からなくても調べれば簡単に解決する問題なので、この場合のコメントは過剰です。
###具体例②
//text文字列を指定した色をつけて出力する
void Output(string text, Color color)

これは関数名と引数だけで大体何がしたいか分かると思います。
名前だけで十分説明されているものに対して、コメントを打ち込むのは過剰です。
このコードにコメントをつけるなら、どこに出力するかや、引数の扱いで注意したほうがいいことなど
名前だけで把握できない新しい情報を与えるのが良いとされます。

まずはHow(どうやってプログラムを動かすか)を書かないことを意識してみましょう。
#おまけ
先ほどTODOというのを使いましたが、これは「後で手をつける」という意味になります。
他にも
FIXME:コードに問題がある
HACK:コードを改善する必要あり
XXX:危険
などがあります。
上のワードを全検索をかけたら問題がある箇所がすぐ分かるので、修正しやすいです。
visual studioではタスク管理というものがあり、TODOと書くとタスク一覧から見れたりします。
#まとめ
コメントは書き手の意図を読む人へ伝えることです。
コードを打っている時の考えを記録し、読み手の立場で読んでみる。
コード上で語っていることは書かない。
これ意識するだけで、読みやすいコードになるでしょう。
しかし、コメントが完璧でもコードが読みにくいと意味がありません。
コメントも大事ですが、分かりにくそうだと思ったらまずはコードの命名や組み方の見直しをしてみましょう。

というわけで次回は読みやすいソースについて書こうと思います。
docker-machineが止まった！

PCを再起動したり、気がついたらdocker-machineが止まってるとき、復活させる方法をいつも忘れてしまうのでメモ。

``` bash
Get http:///var/run/docker.sock/v1.20/containers/json: dial unix /var/run/docker.sock: no such file or directory.
* Are you trying to connect to a TLS-enabled daemon without TLS?
* Is your docker daemon up and running?
```

これが出たらたぶん止まってる。

まずdocker-machineの状態を確認します。

``` bash
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM
default            virtualbox   Stopped
```

やっぱり止まってる。
この例の場合、defaultという名前のマシーンが止まってます。

早速起動させましょう。

``` bash
$ docker-machine start default
Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```

あとは書いてあるように次のコマンドを実行すれば準備完了です。

``` bash
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/kohey/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell:
# eval "$(docker-machine env dev)"
$ eval "$(docker-machine env dev)"
```
Mechanimを使用した時、Spriteの左右反転ができなくて詰んでいる



---

**追記**

5.3から、Sprite Rendererに「反転」オプションが付くようです。

---


検証バージョン
5.5.2f

Spriteを左右反転したい場合、以下の様な方法を取ると思われる。

- `Scale`のXを-1に設定する
- `Rotation`のYを180に設定する

**しかし、Mechanimで`Scale`と`Rotation`を変化させる設定を行うと、
反転設定が消えてしまう。**

**またアニメーションクリップの設定で「Mirror」という項目があるみたいだが、Spriteアニメーションには適用されないみたいだ。**

https://feedback.unity3d.com/suggestions/2d-allow-mirror-flag-in-mecanim-to-be-used-with-sprite-animations

ということで現状は、`Scale`と`Rotation`を変えなくて済むように、画像を用意してアニメーションさせる方法しか思いついていない。

もっと手間がかからない代替案を模索中。
Pythonでハノイの塔を動かしてみた

# 実行環境
* Raspberry pi
* Raspbian 
* Python 2.7


# ソースコード

```python:hanoi.py

   def hanoi(n, via, to, start):
  
           if n > 0:
                   hanoi(n-1, to, via, start)
                   print "%d %d %d" % (n, start, via)
                   hanoi(n-1, via, start, to)
  
  
```
# 最後に
Pythonの書き方を把握しない状態で書いたので、いろいろ変な部分があると思います。
とりあえず自分用のメモとしてプログラムを残します。
配列の中身を取り出しながらmb_convert_encodingすると遅いので、なんとかするー

# 配列の中身を取り出しながらmb_convert_encodingする
よくやりますよね?

```php:sample1
$outs = array('てすと','ほげほげ','ごほごほ');
foreach ($outs as $out) {
 $out_utf8 = mb_convert_encoding($out, "UTF-8", "SJIS");
 hoge-
}
```
とか。しかし、これは遅いんです。
# 関数一つで簡単に文字コードが変換出来ます!
```php:sample2
$outs = array('てすと','ほげほげ','ごほごほ');

// 配列の文字コードを変換
mb_convert_variables('UTF-8' , 'SJIS' , $outs );
```
おしまい。楽ちんです。

参考URL:[PHP/mb_convert_variables](http://php.net/manual/ja/function.mb-convert-variables.php)
CentOS上Node.js v5からOracle-XEに接続

#node-oracledb
node v0.12.7上でnode-oracledb接続をしている環境を、v5にした時の嵌まりポイントのお話です。
一からインストールして動かす話を期待した方ごめんなさい。

nodeからOracleに接続する日本語の記事が少ないので、一応紹介だけしておきます。
サンプルが豊富なので使用面で迷うことは少ないと思います。
https://github.com/oracle/node-oracledb

インストールはこちらに詳しくあります
https://github.com/oracle/node-oracledb/blob/master/INSTALL.md

若干煩雑ですが、きっちりつながります。
個人的には環境変数のOCI_LIB_DIRとOCI_INC_DIRはOracle　Clientのバージョンに
よって若干構成が変わるので、サンプルを鵜呑みにしないことがポイントでした。

#node v0.12 -> v5

nodeのアップデート後 oracledbモジュールをアップデートするのですが、
中から起動されるnode-gypからソースをコンパイルするのに新しいバージョンのGCC/G++が必要
になります。

##1.GCC/G++ v4.8の導入

[こちらの記事](http://www.task-notes.com/entry/20151114/1447492231)で手に入れます

ソースからコンパイルせずにすみました。　記事を書いてくれた方ありがとう！
##2.node-gyp
node-gypで引っかかるので、-gでアップデート
```
sudo npm install node-gyp -g
```
##3.node-oracleのアップデート
```
npm update oracledb
```
エラーがでなければ、アップデート完了です。
SQLAlchemyでTime型を保存する

Time型を使って今の時間を保存するのは以下のコード

```py3
import datetime
from sqlalchemy import (Text, Time)
class Tel(Base):
    __tablename__ = 'tel'
    no = Column(Text)
    updated_at = Column(Time, default=datetime.datetime.now().time())
```

時間の扱い方が、こなれてない気がしてならない・・・

[ここ](http://docs.sqlalchemy.org/en/rel_1_0/core/type_basics.html#generic-types])のページの「A type for 〜」見ると、SQLAlchemyの型とPythonの型のマッピングがわかる。
JavaScript シングル/ダブルクリックイベントを両方取得する

とあるプログラムを書いているときに、ある要素をシングルクリックしたときの処理と、ダブルクリックしたときの処理を別々にしたいと思いました。
それをスマートに実現する方法がなく、自前で実現したのでその方法をメモ。

# onclickとondblclickを両方登録すればいいのでは？
それがそうもいかないのです。
イベントの発火順序がシングルクリック→ダブルクリックとなっているようです。
そのため、両方登録してもシングルクリックの処理しか行われないみたいです。

# ならどうする？
そこで、クリックされた状態を保持するフラグを用意し、クリック後一定時間以内に再度クリックした場合、ダブルクリックと判定します。
ごちゃごちゃ言うよりコードを示すほうが早いと思います。
こんな感じ。

~~~~javascript
// グローバル変数
var clicked = false;	// クリック状態を保持するフラグ
// id="hoge"の要素をシングル/ダブルクリックしたときのイベント
document.getElementById("hoge").onclick = function (evt) {
    // クリックフラグが立っている状態でのクリック
    //     -> ダブルクリック
    if (clicked) {
        alert("double click!!");
        
        clicked = false;
        return;
    }
    
    // シングルクリックを受理、300ms間だけダブルクリック判定を残す
    clicked = true;
    setTimeout(function () {
        // ダブルクリックによりclickedフラグがリセットされていない
        //     -> シングルクリックだった
        if (clicked) {
            alert("single click!");
        }
        
        clicked = false;
    }, 300);
};
~~~~

これで実現できます。

# 動くサンプル

http://jsfiddle.net/1q1wLggj/1/
macで容量チェックコマンドメモ

よく容量不足に悩まされるので、その時用のメモ

全体で5Gバイト以上のフォルダを出力
公式のサポートページにもあった
https://discussionsjapan.apple.com/docs/DOC-1081

~~~
# sudo du -g -x -d 5 / | awk '$1 >= 5{print}'
~~~

大きな容量のフォルダを見つけたら、そこにcdで移動して（省略しますが）
そこで現在のフォルダ以下の集計容量結果を大きい順に出力
参考URL
http://open-groove.net/linux-command/du/#content

~~~
# du -s * | sort -nr
~~~

あまりにも多いものであれば上位10位まで表示

~~~
@ du -s * | sort -nr | head -10
~~~

もうちょっと慣れればよりきれいな出力の仕方ができるのかもしれない・・・。
APNsを利用するときのデリゲートメソッドを整理する

APNsを使ってRemote Notification（サーバー経由のプッシュ通知）を利用する場合、
いくつかデリゲートメソッドを実装する必要があります。

役割を整理しておくと便利です。（特にSilent Notificationを使う場合）

主にiOS 8以上が対象になります。
それ以前はデリゲートメソッドの内容が異なっています。

## プッシュ通知を受信する前に呼び出されるデリゲートメソッド

### application:didRegisterUserNotificationSettings:

以下のようにプッシュ通知の表示タイプをアプリ起動時に登録した場合、
初回起動時だとユーザーに許可を求める画面が表示されます。

```objective-c
//通知の表示タイプを設定
UIUserNotificationType type = UIUserNotificationTypeAlert |
                              UIUserNotificationTypeBadge |
                              UIUserNotificationTypeSound;

UIUserNotificationSettings *setting;

//通知の表示タイプとInteractive Notification用のカテゴリ設定を行う
//ここではカテゴリ設定は省略
setting = [UIUserNotificationSettings settingsForTypes:type
                                            categories:nil];

//アプリに設定を登録し、ユーザーへの許可を求める
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
```

そこで、OKまたは許可しないを選択するとこのデリゲートメソッドが呼び出されます。

2回目以降の起動時には許可画面は表示されず現在の設定が取得できるので、
プッシュ通知を表示しないとアプリが機能しない場合があれば、
ここで設定を確認して利用者にアラートを表示できたりします。
（そんなアプリがあったらちょっと鬱陶しいですが）


### application:didRegisterForRemoteNotificationsWithDeviceToken:

registerForRemoteNotificationsメソッドで、
APNsを使ったRemote Notification用のデバイストークンを要求した場合に、
デバイストークン取得が成功すると呼び出される。

```objective-c
[[UIApplication sharedApplication] registerForRemoteNotifications];
```

大事なことは、プッシュ通知の許可画面とデバイストークンの取得は
メソッドが分かれているということです。（たしかiOS 8 以降）

registerForRemoteNotificationsメソッドさえ呼び出せば、
デバイストークンが手に入るわけなので、例えばSilent Notificationを利用して
プッシュ通知を受信したタイミングでアプリのデータを更新する場合のみでしたら、
利用者にプッシュ通知の許可を求める必要はないのです。

### application:didFailToRegisterForRemoteNotificationsWithError:

デバイストークンの取得に失敗した場合に呼び出されます。

## プッシュ通知受信時

### application:didReceiveLocalNotification:

Local Notificationが発行されたら呼び出されます。

### application:didReceiveRemoteNotification:

Remote Notificationを受信したら呼び出されます。

### application:didReceiveRemoteNotification:fetchCompletionHandler:

Remote Notification受信時に呼び出されるが、
サーバー上から取得できるデータがあることを示す意味もある。
バックグラウンド状態でそのデータを取得できたりもします。

Silent Notificationを実装する場合は、こちらのデリゲートメソッドを用意する必要があります。

## Interactive Notification用のデリゲートメソッド

handleAction〜のメソッドは、Interactive Notificationで利用者が
通知からアクションを選択した場合に呼び出されるメソッドたち。

## 参考URL

[UIApplication Delegate Protocol Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html)
Atom v1.2.0以上 で term2 v0.9.21 がビルドエラーで動かなくなる件

Atomのバージョンあげたらterm2が動かなくなった。
理由はterm2が依存している`pty.js`が少し古いからのようで、
term2の多分バージョン上がったらすぐに問題なくなるんだけど、
待ってる間使えないのは問題あるので対処した。

## まずはterm2のソースへ
term2の設定画面にある`View Code`ボタンを押すとAtomで編集できる。
実際のパッケージの場所は`~/.atom/packages/term2`
![Screen Shot 2015-11-20 at 14.43.30.png](https://qiita-image-store.s3.amazonaws.com/0/3976/502d81af-d13f-df37-b26e-afdc32c33d28.png)

## package.jsonを編集
`dependencies` の `"pty.js": "^0.2.13"` を `"pty.js": "^0.3.0"`に書き換える。
![Screen Shot 2015-11-20 at 14.53.55.png](https://qiita-image-store.s3.amazonaws.com/0/3976/ebd24639-fcf1-0142-6aaa-2ac8fb317d67.png)

## pty.jsをアップデート
ターミナルで

```bash
cd ~/.atom/packages/term2
npm i
```

## Atomのエラー画面からterm2をリビルド
画面消しちゃったからスクショとれなかったけど、
右下の赤いてんとう虫みたいなマークをクリックするとエラーの画面がでて、
そこにリビルドボタンがあった。

## Atomの再起動
再起動したら元気に動いた！

## 最後に
この記事書くために少し調べたら、[Floobits](https://floobits.com/)の人がterm2をフォークしてterm3というのをつくってて、既存のバグをfixしてたり、他のプラグインのためにServices APIを追加してたりするので、それでいいんじゃないかということになった。さようならterm2。
{Rmpfr} Rの果てを見る

# Rの有効桁

[R-Tips様](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/11.html)より、
options()の中で、
　**digits**: 数値を出力する際の表示桁数を設定する（デフォルトは7）．
　**scipen**: 指数表現にするか否かの閾値を設定する（デフォルトは 0）．
だそうです。

```r
> options()$digits
[1] 7
```

ほー、そうかそうか。

```r
> 12345678
[1] 12345678
```

え〜と？8桁の数を書けてるぞ。

```r
# 12桁までは指数表記にならない？
> 123456789012 
[1] 123456789012

# 13桁からは浮動小数点表記。この有効桁はdigitsの値。
> 1234567890123 
[1] 1.234568e+12
```
何故？？

# options()$digits の果て

```r
> options(digits=100)
 以下にエラー options(digits = 100) : 
   'digits' のパラメータが不正です: 0...22 が認められています 
```

[0, 22]だそうですね。
まずは、```options(digits=0)```にしてみる。

```r
> 1234   # 4桁
[1] 1234

> 12345  # 5桁
[1]1.e+04
```
ホッホー。
法則性がよく分からない…。

次に、```options(digits=22)```にしてみる。

```r
> 1234567890123 # 13桁
[1] 1234567890123
```
おお。頑張っている。

```r
> 123456789012345678901234567 # 27桁
[1] 123456789012345678152597504

> 1234567890123456789012345678 # 28桁
[1] 1.234567890123456850245e+27
```
ホッホー。.....んん？？？

```r
> 123456789012345678901234567 # 27桁
[1] 123456789012345678152597504
                      ↑
> 1234567890123456789012345678 # 28桁
[1] 1.234567890123456850245e+27
                     ↑
```

27桁表記の方は、**19桁**目が、上では```9```なのに、下では```1```。
指数表記でも、**17桁**目から違っていますね。

...ヨォわからん。


# options()$scipenの挙動

とりあえず、```options(scipen=20)```ぐらいにしてみる。

```r
> 123456789012345678901234567 # 27桁
[1] 123456789012345678152597504 # 19桁から不正確
                      ↑
> 1234567890123456789012345678 # 28桁
[1] 1234567890123456850245451776 # 指数表記は回避され、17桁から不正確
                    ↑
```

嘆息。

# {Rmpfr}の挙動
**真打ち**の登場です。
[前回の投稿](http://qiita.com/kilometer/items/0b0218fc9332077e3a6d)で紹介した多倍数精度を取り扱うパッケージ。

```r
install.packages("Rmpfr")
library(Rmpfr)
```

さてさてさて。

```r
> mpfr(12345678901234567890123, 100)
1 'mpfr' number of precision  100   bits 
[1] 12345678901234567741440
                     ↑
> mpfr(12345678901234567890123, 100000)
1 'mpfr' number of precision  100000   bits 
[1] 12345678901234567741440
                     ↑
```

**あれ???**


# 結論
結局、誤差がないのは15桁ぐらい？
という事は、double型と同じじゃん。

指数表記を回避したいだけなら、```digits```と```scipen```で、良くね？？？
{Rmpfr}を使っても、計算精度自体は上がらない。
Visual Studio Code v0.10.1でJavaScriptをデバッグ

Mac OS XにVisual Studio Code v.0.10.1をインストールし，JavaScriptをデバッグ試してみました。こんな感じになります。
![Screen Shot 2015-11-20 at 1.05.41 AM.png](https://qiita-image-store.s3.amazonaws.com/0/37663/2450620a-86e5-244a-9e61-355bb27d762e.png)
Visual Studio Codeのインストールを[ここ](https://code.visualstudio.com/Docs/editor/setup#_mac-os-x)に書かれている通りに行います。

Terminalを開いて空ディレクトリを作成し，そのディレクトリをVisual Studio Codeで開きます。

```bash
mkdir test
cd test
code .
```

新規ファイルを作成し，`test.js`として`test`ディレクトリに保存します。

```js
for (var i = 0; i < 10; i++) {
    console.log(i);
}
```

デバッグに移ります。まず左端のView Barにあるデバッグボタン ![Screen Shot 2015-11-20 at 12.39.56 AM.png](https://qiita-image-store.s3.amazonaws.com/0/37663/cf6d60a9-943d-f6af-234b-6de0b4852463.png) を押します。するとデバッグ用のSide Barが現れます。

続いてSide Bar上のギアのボタン ![Screen Shot 2015-11-20 at 12.39.02 AM.png](https://qiita-image-store.s3.amazonaws.com/0/37663/ab407c81-a923-c991-cf37-967d82a54355.png) を押すと，`Select Debug Environment`というポップアップメニューが出るので，`Node.js`を選択します。 

![Screen Shot 2015-11-20 at 1.16.36 AM.png](https://qiita-image-store.s3.amazonaws.com/0/37663/4bdf2688-9271-a8e3-f764-da6526e2fe47.png)

この時点で，エディタウインドウには`launch.json`が表示されてます。そのJSONファイルの`program`のプロパティ値を`app.js`から`test.js`に変更し，保存します。

![Screen Shot 2015-11-20 at 1.11.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/37663/cfe7e2c8-b91c-ecc6-d9c7-2d705f1d55e9.png)

`Ctrl+TAB`で`test.js`に戻ります。そして2行目の`console.log(i)`にブレークポイントをセットします。

最後に，緑の三角ボタン ![Screen Shot 2015-11-20 at 12.41.41 AM.png](https://qiita-image-store.s3.amazonaws.com/0/37663/fe9b07db-9d14-e00d-3c47-23c9c4f7e943.png) を押すとデバッガが起動し，無事に2行目のブレークポイントで実行が止まりました！
fuelphpで重たい処理の進捗をajaxで簡易的にゲットする

重たい処理の進捗を把握したい時がたまにある
進捗をセッションで管理して簡易的にゲットしてみる

## PHP側
```php:foo.php
<?php

use Fuel\Core\Session;

class Controller_Foo extends Controller_Rest
{
    // 重たいアクション
    public function get_hevy()
    {
        // パラメータ初期化
        $progress = 0;			// 進捗
        Session::delete('progress');	// クリアしとく

        // クソ重たい処理(1秒間で10%進む)
        for ($i = 0; $i < 10; $i++) 
        {
            $progress += 10;
            Session::set('progress', $progress );	// 進捗セット
            Session::write();				// スクリプト終了前に書き込み←重要
            sleep(1);
        }

        $this->response(['str' => 'complete!']);
    }

    // 進捗取得アクション
    public function get_progress()
    {
        $this->response(['progress' => Session::get('progress', 0)]);
    }
}
```
## javascript側
```javascript:hoge.js
$(function(){

    // 重い処理を呼び出す
    $.get('foo/hevy',function(data){

        // 結果出力
        console.log(data.str);

    }, "json");

    // 進捗を1秒間隔で呼び出す
    progressInterval=setInterval(function(){

        $.get('foo/progress',function(data){
            // 進捗出力
            console.log(data.progress);// 進捗出力

            // 100になったら終わり
            if(data.progress >= 100) clearInterval(progressInterval);
        }, "json");

    } , 1000);
});
```
MeteorにCordovaプラグインを追加するという知見


MeteorにCordovaプラグインを追加するコマンドについて。
必要なパーツがいくつかある。
 * `meteor add cordova:`
 * `<Cordovaプラグインのパッケージ情報>`
 * `@<gitリポジトリURL>`
 * `/tarball`
 * `/<SHAキー>`
これらを合わせると、MeteorにCordovaプラグインを追加するコマンドになる。

例えば、[あるバージョンのcordova-plugin-whitelist](https://github.com/apache/cordova-plugin-whitelist/commit/9792fc5365a08e58182ff70971744fbf8b5e32b2)をMeteorに追加するときは上記がそれぞれ
 * `meteor add cordova:`
 * `org.apache.cordova.whitelist.WhitelistPlugin`
 * `@https://github.com/apache/cordova-plugin-whitelist`
 * `/tarball`
 * `/9792fc5365a08e58182ff70971744fbf8b5e32b2`

となる。これらを合わせたコマンドが以下。

`meteor add cordova:org.apache.cordova.whitelist.WhitelistPlugin@https://github.com/apache/cordova-plugin-whitelist/tarball/9792fc5365a08e58182ff70971744fbf8b5e32b2`


もっと楽にできる方法ありませんかね・・・？
php で mysql の max_execution_time Optimizer Hint を模倣するサンプル

MySQL 5.7 で導入された Optimizer Hint を使うと 特定のクエリの実行時間に制限を設けることができる。

```
mysql> SELECT /*+ MAX_EXECUTION_TIME(1500) */ SLEEP(10);
+-----------+
| SLEEP(10) |
+-----------+
|         1 |
+-----------+
1 row in set (1.50 sec)
```

MySQL 5.7 より前のバージョンでアプリ側でどうにかできないの？　ってのを試してみたコードがこちら。（エラー制御は省略）

```php
<?php

function connect_db() {
    return new mysqli("127.0.0.1", "user", "pass", "db");
}

$conn->query("SELECT SLEEP(10)", MYSQLI_ASYNC);  // 即時に制御が返る

$links = $errors = $rejects = [$conn];
if (0 < mysqli::poll($links, $errors, $rejects, 1, 500000)) { // 1.5 秒タイムアウトを設定
    // 制限時間内に結果が返る場合
    $result = $conn->reap_async_query();
} else {
    // タイムアウトした場合
    $kill_conn = connect_db();
    $kill_conn->query("KILL QUERY {$conn->thread_id}");
    $kill_conn->close();
}
```

php 5.3.0 以上で、mysqlnd 版の mysqili 拡張が利用できる環境である必要があります。(php 5.4 以降なら大体の環境で使えるんじゃないかな)

注意点としては、kill するためのコネクションを別に用意する必要があるところ。

上記の例ではタイムアウトするたびにつなぎに行ってしまうけど、kill 専用の持続的接続を用意しておけば、無駄なコネクションも抑制できるかな。


# 参考

* https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer-hints-execution-time
* http://php.net/manual/en/mysqli.poll.php
* http://php.net/manual/en/mysqli.query.php
Atom Package「Remote-ftp」のローカルでのあれこれ

利用できるまでは下記を参考にさせていただきました。
http://loumo.jp/wp/archive/20151004000041/


#保存した時に同期させたくない
Remote-ftpはローカルのファイルを保存すると設定してるリモート先に自動でアップロードしてくれます。
ですが自動でアップロードされてしまうと意図していないファイルを更新してしまうかもしれません。

それを回避する方法はパッケージの設定から

Auto Upload On Save → never
![remote-ftp1.png](https://qiita-image-store.s3.amazonaws.com/0/101857/b08478b7-5098-cde4-f8dc-aaee24e1af37.png)


こうすることで自動アップロードを防ぐことができます。

#ローカルファイルのUploadとSync local -> remoteの違い
ローカルのファイルをリモート先に更新するための方法には Upload と Sync local -> remote と二つの方法があります。
![remote-ftp2.png](https://qiita-image-store.s3.amazonaws.com/0/101857/22e98525-ad4a-2e2b-7d60-a720af815809.png)

これらの違いがいまいち分からなかったので簡単に調べてみました。
###Upload
こちらは単純に選択したものをアップロードするようです。
ローカルから反映するときは基本こちらを利用すれば良いようです。

###Sync local -> remote
問題はこちら
どうやらこの Sync local -> remote　は文字通り同期することのようです。
ただしファイル単体で実行しても特に何も起こらず？
ディレクトリ上でのみ利用できるようです。

さて、同期といいましても
結局ローカルのファイルをリモート先に更新するのは変わらないじゃないか！
と思ってしまいますが、実は内部的には選択したディレクトリ内とリモート先とで差分を見ていて、
差があるものだけ更新しているようです。

下のイメージを見て頂ければ想像付きやすいと思います。
####1. 最初の状態
![6.png](https://qiita-image-store.s3.amazonaws.com/0/101857/3cfe5303-3e26-442a-a944-72cb2a522078.png)

![remote-ftp3.png](https://qiita-image-store.s3.amazonaws.com/0/101857/ce00a6ef-6cef-bdad-026f-278cbd01ffb4.png)
タイムスタンプは同じ時間です。


####2. Uploadした時
2.txtを修正してUploadを行いました。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/101857/a02313a1-9d38-7682-689d-d0c6ec5582d3.png)

![remote-ftp4.png](https://qiita-image-store.s3.amazonaws.com/0/101857/e79b52cb-e00b-ae4f-9b3c-84b647d0a5c3.png)

#####結果
1.txt → 更新される
2.txt → 更新される


####3. Sync local -> remoteした時
同じように2.txtを修正してSync local -> remoteを行うと？
![8.png](https://qiita-image-store.s3.amazonaws.com/0/101857/fd01cc4f-6aea-cc5e-d67d-18905d9e8e82.png)

![remote-ftp5.png](https://qiita-image-store.s3.amazonaws.com/0/101857/1517bc93-a115-ac5e-75cc-687552540bac.png)

#####結果
1.txt → **更新されない**
2.txt → 更新される


このように、Sync local -> remoteは差分をとり最低限のファイルを更新を行ってくれるので、大量のファイルを更新する時はとても重宝しますね。

**と、思うじゃないですか？**
実はこれには落とし穴があるんです。

というのもRemote-ftpでどうやって差分をとっているのだろうと思いRemote-ftpのソースを見ていると

```js:Remote-FTP/lib/client.js
L559 ~
// Upload only if not present on remote or size differ
if (!remote || remote.size != local.size) {
   self.connector.put(local.name, function () {
      return n();
   });
} else {

```

おお・・・英語はできないですが言ってることはなんとなく分かります。

恐らく差分のとり方はサイズの差と書いてありますね。（適当）

というわけで、2.txtのサイズを変えないよう文字を1文字変えてSync local -> remote してみましたところ、
見事に**更新されませんでした**。

これは偶然ファイルのサイズが同じでうまく更新できないことも起きそうですね。

###結論
ちょっと時間掛かるとしても、基本的にUploadを使いましょう。
PythonとClojureのよく使う使う処理の対比表

個人的なメモです。

## 文字列処理

### 文字列をスペースで分割する

```clj
(require '[clojure.string :as str])
(str/split "spam egg ham" #" ")
; ["spam" "egg" "ham"]
```

```py
>>> "spam egg ham".split()
['spam', 'egg', 'ham']
```

### Unicodeコードポイントを取得
```clj
(int (.charAt "酒" 0)
; 37202
(format "%x" (int (.charAt "酒" 0)))
; "9152"
```

```py
>>> ord(u"酒")
37202
>>> hex(ord(u"酒"))
'0x9152'
```

## ファイル処理
### テンポラリディレクトリを取得
Clojure

```clj
user=> (System/getProperty "java.io.tmpdir")
"/tmp"
```

Clojureならば[`fs`](https://github.com/Raynes/fs)を使うのがよりClojureらしいと思われる。

```clj
user=> (require '[me.raynes.fs :as fs])
nil
user=> (fs/tmpdir)
"/tmp"
```

Python

```py
>>> import tempfile
>>> tempfile.gettempdir()
'/tmp'
```

## 時刻処理
標準ライブラリだけで頑張るのではなく、Pythonだと[dateutil](https://dateutil.readthedocs.org/), Clojureだと[clj-time](https://github.com/clj-time/clj-time)を使うのが良いのではないだろうか。

### ISO形式の文字列からUnixタイムスタンプを取得する
```clj
(require '[clj-time.coerce :as c])
(require '[clj-time.local :as l])
(/ (c/to-long (l/to-local-date-time "2015-11-24T22:00:00+09:00")) 1000)
; 1448370000
```

```py
>>> import dateutil.parser
>>> import time
>>> time.mktime(dateutil.parser.parse("2015-11-24T22:00:00+09:00").utctimetuple())
1448370000.0
```

### Unixタイムスタンプから時刻オブジェクトを生成

```clj
(require '[clj-time.coerce :as c])
(c/from-long (* 1448370000 1000))
; #object[org.joda.time.DateTime 0x6f5185fe "2015-11-24T13:00:00.000Z"]
```

```py
>>> import datetime
>>> datetime.datetime.utcfromtimestamp(1448370000.0)
datetime.datetime(2015, 11, 24, 13, 0)
```
Mac にインストール済みのCertificateとひもづくProvisioning Profile を調べる

ビルドマシンのCertificate と Provisioning Profile を更新するとき 複数のDeveloper Program がインストールされていると ビルドエラーが起きてもCertificateのせいなのか Provisioning のせいなのか分からなくなることがあります。

そこで、どの名義のCertificate が Mac にインストールされているのか調べる方法と、どのCertificate がどの Provisioning とひもづいているか調べる方法をまとめます。

# インストール済みの Certificate を調べる

インストール済みのCertificate とその名義はKeychain.appで調べることができます。

同アプリをひらいて 証明書を選んで _情報を見る_ を選ぶだけです。見方としては_サブジェクト名_の　_通称_ と_ユーザーID_を見ます。これが名義の名前とTeam Identifier を指しています。

![スクリーンショット 2015-11-20.png](https://qiita-image-store.s3.amazonaws.com/0/98187/c50726d8-8dff-770d-4728-051b3c348fd8.png)

Apple Developer Program の名義は Team Identifier で区別できます。Team Idは同じ法人であっても Standard ProgramとEnterprise で異なります。

なお、security コマンドでもいろいろな情報が取得できます:  

```
$ security find-identity -v -p codesigning
  1) <SHA-1 hash> "iPhone Developer: ほげほげ"
     1 valid identities found
```

```
$ security find-certificate -Z -p
SHA-1 hash: <SHA-1 hash>
-----BEGIN CERTIFICATE-----
<PEM String>
```

# Certificate がどの Provisioning とひもづいているか調べる

Certificate がひもづくProvisioning を知るには mobileprovision ファイルを調べます。

mobileprovisionファイルは _~/Library/MobileDevices/Provisioning Profiles_　にあります。同ファイルを調べるには security コマンドを使います:

```
$ security cms -D -i <UDID>.mobileprovision
..
	<key>AppIDName</key>
..
	<key>ApplicationIdentifierPrefix</key>
	<array>
	<string><Team Identifier></string>
```

出力結果のうち _ApplicationIdentifierPrefix_ がそのProvisioning とひもづく Team Identifier を指しています。

ちなみに、_DeveloperCertificates_ は PEM形式の Certificateです。

```
	<key>DeveloperCertificates</key>
	<array>
	<data><PEM String>
```

# (余談) ipa ファイルを調べて Team Id とCertificate を割り出す

Team Id は ipaファイルをcodesign コマンドで調べるとわかります:

```
$ codesign -vv -d foo.app
..
Identifier=<Bundle identifier>
..
Authority=<Developer Programの名義>
..
TeamIdentifier=<Team Identifier>
```

いっぽう Certificate は ipa ファイルのなかにある embedded.mobileprovisionでわかります: 

- ipaファイルの拡張子をzip にrename してアンアーカイブ
- Payload ディレクトリのなかの app ファイルを選んで _パッケージの内容を表示_ 

このなかに codesign に使った _embedded.mobileprovision_ があります。あとは security コマンドを使うだけです: 

```
$ security cms -D -i embedded.mobileprovision
..
	<key>AppIDName</key>
..
	<key>ApplicationIdentifierPrefix</key>
	<array>
	<string><Team Identifier></string>
```

# 参考資料

- https://www.objc.io/issues/17-security/inside-code-signing/
コマンドラインでSwiftのコード実行してみる

Xcodeが入っている前提です

# Swiftコマンドの在り処
自分の環境(Xcode7.0.1)ではここにありました

```
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

## bash_profileにパスを通す
ユーザのルートディレクトリに.bash_profileがあります
コマンドラインでデフォルトでswiftコマンドを使用可能にするために、起動時にパスを通します

```bash:.bash_profile
export PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH
```

# コマンド
バージョンの確認

```bash:
$ swift -version
> Apple Swift version 2.0 (swiftlang-700.0.59 clang-700.0.72)
> Target: x86_64-apple-darwin14.5.0
```

Hello World
swiftコマンドで対話的にswiftコードを実行できるモードになります

```bash:
$ swift
```

"Hello World"を表示させてみます

```bash:
Welcome to Apple Swift version 2.0 (700.0.59 700.0.72). Type :help for assistance.
  1>  print("Hello World")
Hello World
```
終了する時は:qまたは:quitでモードが終了します

```bash:
  1> :q
```
"Unity"+"leap motion" [練習六つ]: VRGUI Project

<h2>VRGUI Project： 「ボタンをデザインしましょう」</h2>
<h3>Goal: 空間に浮かぶGUIを作る</h3><ul>
<li>Step 1: UnityでLeap Motionを使ってGesture Motion認識ができる。</font></li>
<li><font color=red>Step 2: uGUIでメニューを作って空間に浮かべる</font> </li>
<li>Step 3:メニュー選択。任意のGameObjectからRaycastを飛ばしてメニューを選択できる。選択状態で色を変える。できたら音も。</li>
<li>Step 4:メニューで選択した項目を実行。メニューに任意のアクションを割り当てられるように実行する。</li>
</ul>

<hr/>
メニュのボタンにanimation効果をAdd!

-練習
１。ボタンを作った後で
２。dropdownのエフェクト

<img width="925" alt="Screen Shot 2015-11-20 at 13.20.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/0502ee1d-7941-8001-0340-5c90f87a97b9.png">

<img width="1039" alt="Screen Shot 2015-11-20 at 13.20.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/4ef04753-cd5d-6038-972e-afc38d2d4e59.png">

Youtube: https://youtu.be/Z4xlonQFBfM
<br/>
<hr/>


じゃあ、今はDropdownをleapmotionと作りましょう

code: 

		Vector3 scale = container.localScale;
		scale.y = Mathf.Lerp (scale.y, isOpen? 1:0, Time.deltaTime*5);
		container.localScale = scale;

このコードを使ったら

https://youtu.be/cO5U7FVNe1U
Gitインストール（Windowsの場合）

##インストールするGitの選定
一番使われているようなmsysGitを使用します。
https://git-for-windows.github.io/

##インストール方法
基本的にはDLしたファイルを実行し、画面の指示に従って操作するだけで大丈夫です。
コンポーネント選択や環境変数の設定などができるが、学習レベルや初歩的レベルではNextボタンを押すだけで大丈夫です。
Windowsの場合は一つ気にしてほしいのが、「Configuring the line ending conversions（改行コードの扱い）」です。
選択はDefaultチェックになっている、「Chechout Windows-style, commit Unix-style line ending」のままで大丈夫です。
GitHubで公開されているコードの大半はMacやLinuxで利用されるLF（Line Feed）で改行が行われています。しかし、WindowsはCRLF（Carriage Return + Line Feed）で改行を行うため、対応してないエディタだと正常に表示できません。上記はその問題を解決するための設定で、コミット時はLFにチェックアウト時はCRLFに変換してくれます。

##Gitコマンド実行環境
インストールされている「Git Bash」を使用します。

##初期設定
**名前とメールアドレスを設定**

```
$ git config --global user.name "#名前#"
$ git config --global user.email "#メールアドレス#"
```
**コマンド出力を読みやすくする**

```
$ git config --global color.ui auto
```

上記のコマンドの代わりに「C:\Users\ユーザー名\\.gitconfig」を直接編集することも可能です。
[Swift]グラデーションのUI

グラデーションのUIを作るときの簡単な流れをメモ程度に。
CAGradientLayerを使います。

こういうUIを作るとき
![スクリーンショット 2015-11-19 15.06.21.png](https://nagisa-system.qiita.com/files/e5078d85-cd4c-e254-e182-4adc978b74b9.png)
###グラデーション
>（特に色調・明暗など）段階的変化。階調。


・実装コード

```swift

        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.cornerRadius = self.layer.cornerRadius
        
        let leftColor = UIColor(hex: "6B2133", alpha: 0.3).CGColor
        let centerColor = UIColor(hex: "EF4F78", alpha: 0.5).CGColor
        let rightColor = UIColor(hex: "FE3A3A", alpha: 1).CGColor
        gradient.colors = [leftColor, centerColor, rightColor]
        
// 3分割
        let leftPosition = NSNumber(float: 0.0)
        let centerPosition = NSNumber(float: 0.5)
        let rightPosition = NSNumber(float: 1.0)
        
// startPointとendPointを指定しないと上から下に向かってのレイヤーになる
        gradient.startPoint = CGPointMake(0.0, 0.5)
        gradient.endPoint = CGPointMake(1.0, 0.5)
        gradient.locations = [leftPosition, centerPosition, rightPosition]
        
        self.layer.insertSublayer(gradient, atIndex: 0)
```

今回の流れ
1.カスタムのUIViewを作ってサブレイヤーにCAGradientLayerを追加する
2.UISliderのminとmaxの画像を空にする

```swift
        self.setMinimumTrackImage(UIImage(), forState: .Normal)
        self.setMaximumTrackImage(UIImage(), forState: .Normal)
```

nilをいれるとデフォルトの薄い線が入ってしまうので空画像で

3.1で作ったviewはバックグラウンドとして使用する

終わり
_ColorLiteralConvertible

Swiftのドキュメントを見てたら、[_ColorLiteralConvertible](http://swiftdoc.org/v2.1/protocol/_ColorLiteralConvertible/)とかいうのがあった。

試しにPlaygroundで

```swift
[#Color(colorLiteralRed: 1, blue: 0, green: 0, alpha: 1)#]
```

と打つと↓のようなアイコンに変換された。
<img width="387" alt="20151120130002.png" src="https://qiita-image-store.s3.amazonaws.com/0/38151/fb3a83a0-16c3-bc12-4d70-ea8619ab4ae2.png">

16進とかのColorリテラルを導入する予定がある（あった）んだろうか？
レガシーなプロジェクトに Idiorm を導入する


[Idirom](http://j4mie.github.io/idiormandparis/) は [薄いDBライブラリ](http://qiita.com/naga3/items/87fef230ac86aeec1eea) として使うには便利だが、レガシーなプロジェクトに導入していく過程では、多少カスタマイズして使うことになる. そんなときのこまごま Tips を紹介.

# 事例

## 既存DBの主キー命名ルールに合わせる

Idiorm のデフォルトでは、すべてのテーブルの主キーは `id` という前提で動作するが、以下のようなレガシーあるあるケースだとそのままでは動かない.

* `foo` テーブルの主キーが `foo_id`
* `bar` テーブルの主キーが `bar_2_id`

こういう場合は、Idiorm の `id_column_override` 設定を使う.

```
$id_column_override = [
    'foo' => 'foo_id',
    'bar' => 'bar_2_id',
];

ORM::configure([
    'id_column_overrides' => $id_column_overrides,
]);
```

`$id_column_override` 相当のものを自動出力するようなスクリプトを書いておくとラク.

## 既存処理とトランザクションを共有する

既存処理がトランザクションを使っている場合は、ここにヘタに Idiorm の処理を入れ込むと、既存処理とは異なるDB接続を使ってしまい、トランザクションから外れてしまう.

こういう場合は、既存処理が使っている `PDO` を直接 `ORM` に設定して初期化する. これで、既存処理とおなじ接続を使ってくれるようになる.

```
ORM::set_db($pdo);
```

# 参考

* [Idiorm Documentation](http://idiorm.readthedocs.org/en/latest/index.html)
Rails4.1でActiverecordでor条件とnot条件の複合検索する

rails4.1 なら

こんな感じ

```ruby
or_confition = Portfolio.where.not(name: nil, photo_file_name: nil).where_values.reduce(:or)

Portfolio.where(or_condition)
```

SQL実行結果はこんな感じ

```ruby
Portfolio Load (0.3ms)  SELECT `portfolios`.* FROM `portfolios` WHERE (`portfolios`.`name` IS NOT NULL OR `portfolios`.`photo_file_name` IS NOT NULL)
```

Rails4.2だと[エラーになる](http://qiita.com/joker1007/items/5c851526e73b3bc0273a)ようです。その場合はこのgemも使えそうです。

rails5で追加されるorをrails4.2で使う[where-or Gem](https://github.com/Eric-Guo/where-or)

http://stackoverflow.com/questions/31096009/rails-hash-notation-for-activerecord-or-query
ベンダープレフィックスがあるか確認するやつ

ベンダープレフィックスが必要そうなプロパティで使用。
有りでも無しでもイイからとりあえず先に見つかったやつを返す。
~~どっちもなければ、動作はしないけど無しを返す。`null` とか返すとエラーになっちゃうから。~~
どっちもなければ、元のプロパティを返す。

```js
const getPrefixProperty = (_property) => {
  const decs_    = getComputedStyle(document.head, '');
  const prefixs_ = [ '-webkit-', '-moz-', '-ms-', '-o-' ];

  let property_ = _property;

  if(!decs_[_property]) {
    prefixs_.forEach((_prefix) => {
      const p_ = _prefix + _property;
      if(decs_[p_]) {
        property_ = p_;
        return false;
      }
    });
  }

  return property_;
};

// 実行
getPrefixProperty('transition');
```

## 変更履歴
- CoffeeScript -> ES2016
Rspec で クラスメソッドのスタブを作る方法

allow を使って、どんなクラスのメソッドでも書き換えられる。

## 例) モデルの定義

```rb:models/example.rb
class Example
  def self.class_method
    'This is real class method'
  end
end
```

## スタブの作り方

- allow でクラス名を指定する。
- receive でメソッドを指定する。
- and_returnでメソッド実行時の戻り値を指定する。

```rb:spec/test_spec.rb
require 'spec_helper'

describe do
  before do
    allow(Example).to receive(:class_method).and_return('This is stub class method')
  end

  it do
    p Example.class_method
  end
end

```

## 結果

`"This is stub class method"` が出力される。

## 環境

- rspec-rails 2.14.1



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Dockerイメージ/コンテナの識別子多すぎません？

識別子多すぎません？
====================
イメージにせよコンテナにせよ、識別子の種類がちょっと多すぎる気がしなくもない。

イメージ
----------
### Repository
名前にあたる、のか。スラッシュで区切られている場合は前半がユーザー名や管理者名、後半がイメージ名という扱いになる。レポジトリってなんのレポジトリだよと言うと、Docker Hubの、とか、立ててる場合ではプライベートの、ということになる。実際 `docker push` する際はここでレポジトリが判断される。

### Tag
同一Repositoryでも例えばOSバージョン違いなどがあり、Tagで識別される。例えばdocker.io/centosのタグ7.1であれば、docker.io/centos:7.1と表記される。Tagを指定せず、Repositoryだけでイメージを指定した場合は、デフォルトではlatestが選ばれる。

なお `docker tag` といういかにもタグを変更できそうなコマンドがあるが、実際のところこのコマンドではレポジトリ名も変更できる。

```bash
$ docker tag 7d9495d03763 maryatdocker/docker-whale:latest
# 公式docs https://docs.docker.com/mac/step_six/ から抜粋
```

### ID
ローカルでイメージを識別するためのユニークID。当然ながら一意にイメージを指定できるが、覚えにくいし打ちにくい。

コンテナ
----------
### ID
イメージと同様のユニークID。やはり人間にやさしいものではない。

### Name
こちらもユニークに付けられるものだが、人間が読みやすい文字列になっている。自動でランダムに無意味な文字列が付与されるが、`docker run --name="foobar"`で任意の名前を持たせることも可能。コンテナ操作系のコマンド（start/stop/attach等）にはNameを渡すことができるので、基本的には手動でつけた方がいい。

面白いけど意味のあるような意味のない不思議な名前が付くので、どういう生成してんだろなと調べようとしたら[先駆者がいらっしゃった。](http://deeeet.com/writing/2014/07/15/docker-container-name/)


結論
====================
* イメージは `repository:tag` で一意に指定。
* コンテナはNameを付けてNameで指定。
dockerコマンドについて - サブコマンド

`docker`サブコマンドについて、[公式リファレンス](https://docs.docker.com/engine/reference/commandline/cli/)を参考にまとめてみました。
各サブコマンド詳細については随時更新していこうと思います。

|サブコマンド| 内容                              |
|:--------:|----------------------------------|
| attach   | 実行しているコンテナ内へログインします。|
| build    | Dockerfileからimageを作成します。   |
| commit   | コンテナを新規imageとして保存します。  |
| cp       | コンテナとホスト間でファイル/フォルダをコピーします。|
| create   | 新規コンテナを作成します。            |
| diff     | コンテナのファイルシステム内における変更点をリストします。|
| events   | コンテナやイメージのイベント情報をレポートします。|
| exec     | 稼働中のコンテナに対してコマンドを実行します。|
| export   | コンテナイメージをtarでエクスポートします。|
| hisotry  | コンテナイメージの履歴を表示します。|
| [images](http://qiita.com/kooohei/items/72c2d7eeceefc03683b1)   | ホストにダウンロードしたローカルイメージ一覧を表示します。|
| import   | ルートファイルシステムをアーカイブしたファイルをインポートします。|
| [info](http://qiita.com/kooohei/items/85c3f0b9384ff322a500)     | Dockerの構成情報を表示します。|
| inspect  | コンテナイメージの詳細情報をJSON形式(デフォルト)で表示します。|
| kill     | 稼働中のコンテナに対してSIGKILLを送ります。|
| load     | saveサブコマンドで出力したアーカイブファイルをリポジトリに登録します。|
| login    | Docker Hubなどのレジストリサーバへログインします。|
| logout   | Docker Hubなどのレジストリサーバからログアウトします。|
| logs     | コンテナのログ(標準出力、標準エラー出力)を取得します。|
| [pause](http://qiita.com/kooohei/items/c7d6347bbb2057a31e26)    | コンテナ内のすべてのプロセスをサスペンドします。|
| port     | コンテナにマッピングされているポートをリストします。|
| ps       | ホスト上に存在するコンテナを確認できます。デフォルトだとステータスがUpのコンテナのみを表示します。|
| pull     | Docker Hubなどのレジストリからイメージを取得します。|
| push     | Docker Hubなどのレジストリにイメージを登録します。|
| rename   | コンテナ名を変更します。|
| restart  | コンテナをリスタートします。|
| rm       | コンテナを削除します。|
| rmi      | コンテナイメージを削除します。|
| run      | 新しいコンテナを起動させます。|
| save     | イメージをtar形式で保存します。|
| search   | Docker Hubにあるイメージを探します。|
| [start](http://qiita.com/kooohei/items/f0352f408056861a8f74)    | 停止しているコンテナを起動させます。|
| stats    | コンテナのリソース使用状況を表示します。|
| [stop](http://qiita.com/kooohei/items/f41722894f225cf4cbc1)     | 稼働中のコンテナを停止します。|
| tag      | リポジトリにあるイメージにタグを付けます。|
| top      | コンテナで実行中のプロセスを表示する。|
| [unpause](http://qiita.com/kooohei/items/d6d9106ee1ca147d83fc)  | コンテナ内のすべてのプロセスのサスペンドを解除する。|
| [version](http://qiita.com/kooohei/items/85f8168cc6d2353c82e0)  | Dockerのバージョン情報を表示する。|
| wait     | exitコードを表示し、コンテナが停止するまでブロックする。|
node.jsのバージョンを管理する

```
この記事ではMac OSX(10.10.4)をつかっています。
その他バージョン情報
 node.js(0.12.0)
 nodebrew(0.8.1)
```

##はじめに
node.jsは公式サイトからダウンロードしたインストーラを使ってインストールする方法が一番簡単ですが、node.jsの管理を考えると、node.js自体を管理するツールを介してダウンロードするほうが後々便利、ということを理解したので、管理ツール(nodebrew)を使った管理方法をまとめます。

##管理ツールを使うメリット
nodebrewはユーザのホームディレクトリ直下に.nodebrewというディレクトリを作ってその中でnode.js管理するため、「usr/local」以下にファイルが組み込まれることがありません。「usr/local」にはシステムのファイルが入っているため自分で追加したファイルを分けることで、管理がわかりやすくなります。
公式インストーラを使った場合は、npmを使ってインストールされたツールも同じようにこのディレクトリ内にファイルを組み込むことになります。
###### nodebrwを使った場合の各種ファイルの保存先
```
/Users/USERNAME/.nodebrew/
```
###### 公式インストーラを使った場合の各種ファイルの保存先
```
/Usr/local/
```

## nodebrewのインストール

```
$ curl -L git.io/nodebrew | perl - setup
```
インストールができたらできたらシェルの設定ファイルへの環境変数の追加も忘れずに。
##### 環境変数の確認

```
$ echo $PATH
```
``/Users/USERNAME/.nodebrew/current/bin:``がなければ追加します。

##### ~/.bash_profileに以下を追加

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
##### 再読み込み

```
$ source ~/.bash_profile
```

##node.jsのバージョンを使い分ける

nodebrewを使うとnode.jsの複数のバージョンをインストールして使い分けることが出来ます。
以下のコマンドで利用可能なバージョンを確認することが出来ます。
#### 利用可能なバージョン

```
$ nodebrew ls-remote
```

node.jsのバージョンは安定版と開発版がある
安定版→偶数(v0.**12**.xなど)
開発版→奇数(v0.**11**.xなど)

#### node.jsの特定のバージョンのインストール

```
$ nodebrew install-binary バージョン名(v0.10.40など)
```
#### node.jsの特定のバージョンのアンインストール

```
$ nodebrew uninstall バージョン名(v0.10.40など)
```

#### インストールされたnode.jsをリスト

```
$ nodebrew ls
```

#### バージョンの切り替え

```
$ nodebrew use 使いたいバージョン名(v0.12.0など)
```

間違えてたら教えて下さい
tig から当該コミットがマージされた Pull Request 画面を開く


[GitベースのコードリーディングTips - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2015/11/17/151426) で紹介されていた `open-pull-request` がとても便利なので、tig から呼び出せるようにしてみた、という話.

# 手順

## open-pull-request をインストール

上記の記事に貼ってあるスニペットをシェルスクリプトに切り出して `open-pr` としてパス通した.

## .tigrc を編集

```.tigrc
bind generic P @open-pr %(commit)
```

# つかいかた

tig を起動して、適当な view で `P` を押すと、当該コミットがマージされた Pull Request 画面をオープンできる.

# 参考

* [tigとGitHubを連携させる幾つかのカスタムキーバインド](http://qiita.com/yoshikazusawa/items/a8812e2dc736f7f967bb)
iOSのシミュレータかどうかの判定

以下で判定できた(Xcode 7.0.1)。

```swift
func isSimulator() -> Bool {
    return TARGET_OS_SIMULATOR != 0
}
````

いつからかは正確には知らないが、`UIDevice.currentDevice().model`の仕様が変わったらしく(Simulatorという文字列がなくなった)[こちら](http://qiita.com/makoto_kw/items/ebb34c0150a5c3c829b8)の記事の方法ではうまくいかないので注意が必要。
WindowsServerでの時刻合わせ

windows7、
WindowsServer2008R2など

社内ドメイン下のクライアントPCの時刻が
ズレているという報告が数件連続してあり、調査。
管理を引き継いだもののため、これまで詳細を把握していなかった。

#クライアントPC調査

コマンドプロンプトで以下入力

`w32tm /query /status`

出力はこんな感じになる
時刻同期の状況が出力される。

```
閏インジケーター：0(警告なし)
階層：*******************
精度：*******************
ルート遅延:*******************
ルート分散：*******************
参照ID：*******************
最終正常同期時刻：*******************
ソース：*******************
ポーリング間隔：*******************
```
ソースの部分が、同期先のドメコンと思われるので次はそちらを調査

#ドメコン(windowsserver2008R2)サーバ調査

こちらでもコマンドプロンプトを開いて作業

`w32tm /query /source`

先ほどのソースの部分のみが出力される。
ここで、今回ウチの環境では以下のように表示された

`Free-running System Clock`

これ、要するに外部同期はしてません、
サーバ物理本体のローカルクロックと同期してますということらしい。

元々設定されていなかったのか、なんらかの理由で外れたのかは
イベントログを調べれば分かるだろうが、
今回はとっとと外部のNTPサーバとの同期を構築した。

同じくコマンドラインで

```
#ntp.nict.jpさんと同期するように設定。
w32tm /config /syncfromflags:manual /manualpeerlist:ntp.nict.jp /update

#同期強制実施
w32tm /resync

#同期ソースの確認(ntp.nict.jpと出ればOK)
w32tm /config /source
```
調整後ほっといても伝播するが
クライアントPC側でもresyncを実施してやれば
時刻合わせ完了ということで。

Windowsサーバ系は経験値が足りないので、いい勉強でしたわ。
【AWS】IAM Policyめも

IAMのPolicyに関する設定方法を忘れないようにめもしていきます。

# S3編

参考
>http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_examples.html

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            # AWSマネージメントコンソールでS3を操作するための設定
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "【IP1】",
                        "【IP2】"
                    ]
                }
            }
        },
        {
            # ディレクトリ一覧表示をするための設定
            # Resourceにディレクトリを指定することも可能（arn:aws:s3:::【バケット名】/【ディレクトリ名】/*）
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions"
            ],
            "Resource": "arn:aws:s3:::【バケット名】",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "【IP1】",
                        "【IP2】"
                    ]
                }
            }
        },
        {
            # バケットとディレクトリに対する操作設定
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::【バケット名】",
                "arn:aws:s3:::【バケット名】/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "【IP1】",
                        "【IP2】"
                    ]
                }
            }
        }
    ]
}
```

マネージメントコンソールのバケット一覧を限定（指定したバケットのみ表示）をやりたかったのですが
方法が見つかりませんでした。
モジュールとはなんだ

業務で使用する可能性があるため勉強をしてみんとす。
ざっくりはじめるよ。

学習の元ネタは
http://codezine.jp/article/detail/8207?p=2
で、それを見てわかんない点、とか理解した点とかを記録していくスタイル。

<h1>モジュール</h1>
angularjsで、機能とかをまとめる入れもんのようなもの？

```
var moduleVar = angular.module("ModuleName",[]);
```
angular.moduleでモジュールを作る。

第1引数がモジュール名。第2引数以降は、依存するモジュールとからしいが、今はイミフなのでとりあえず無視する。[]って書いとけばおｋ、程度の理解で進める。

で、戻り値としてmoduleVarがあるけど、このモジュールに後で機能を追加するときに使うらしい。ほーん。

出来上がったモジュールは、モジュール名を使ってHTMLと結びつける。
```
ng-app="ModuleName"
```
てな感じ。

ng-appはいろんなタグに使える？（ブロック要素だけ？インライン要素はだめなの？いける？あとで分ったら買いとこう）
html全体で使えるようにするためには

```
<html ng-app="ModuleName">
ほげほげ
</html>
```
とかやね。
そのタグに、作成したイレモノ内の機能とか使えるようになるそうな。
入れ子になった場合もイケル口なんだろうか？あとで調べてみよう。

とりあえず以上。