OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails Tutorialではまったところや備忘録【随時追加】

##便利なレポジトリ
* [Rails Tutorialの各章からスタートできる](https://github.com/yasslab/sample_apps)
* [Ruby on Rails チュートリアル で使われている HTML や CSS、画像ファイル等](https://github.com/yasslab/railstutorial.jp)

#1章
##ヘロクのコマンド:rename
```lang:command
$ heroku rename railstutorial
```
##ヘロクへのデプロイ
pgのエラーが出る
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.0.0
remote: -----> Installing dependencies using 1.7.12
remote:        Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote:        Some gems seem to be missing from your vendor/cache directory.
remote:        Could not find pg-0.15.1 in any of the sources
remote:        Bundler Output: Some gems seem to be missing from your vendor/cache directory.
remote:        Could not find pg-0.15.1 in any of the sources
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:
remote:  !     Push rejected, failed to compile Ruby app

vendor/cacheのところで何か悪さしてるから、以下のコマンドを実行。
```lang:command
$ rm -r vendor/cache
```
もう一度、
```lang:command
$ git push heroku master
```
で解決！

#3章
## nokogiriのインストールでエラー
```error
An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot
continue.
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.
```
解決策：
http://qiita.com/suu_g/items/fcf549e16c797a9d7dc0
もしくは単純にXcode Command Line Toolsをインストールしていないだけ。
```
The file "/usr/include/iconv.h" is missing in your build environment,
which means you haven't installed Xcode Command Line Tools properly.
To install Command Line Tools, try running `xcode-select --install` on
terminal and follow the instructions.  If it fails, open Xcode.app,
select from the menu "Xcode" - "Open Developer Tool" - "More Developer
Tools" to open the developer site, download the installer for your OS
version and run it.
```

この時はターミナルで下記を実行。
``` 
$ xcode-select --install
```

##元に戻る方法
* controllerやmodel

```lang:generateとdestroy
$ rails generate controller FooBars baz quux
$ rails destroy  controller FooBars baz quux
```

* マイグレーション

```lang:migrationの戻し方
$ rake db:migrate
$ rake db:rollback
$ rake db:migrate VERSION=0
```
mBaaSまとめてみた

mBaasを使うか検討しているので、各サービスをまとめてみます。（2015年5月15日現在）

#Parse
https://www.parse.com/

- Facebookが買収した
- mBaasといえば、Parseみたいなところがある。
- 無料枠：30requests per second（他省略）
- ストレージ、プッシュ通知、ユーザー管理など多機能揃ってる
- 各言語のSDKが充実している
- アクセスポイントはアメリカなので、日本からはやや遅いらしい

####私の見解
- 小さい規模や、プロトタイプで使うにはよさそう。トラフィックが長期的に多いアプリはコスト高になる。
- 多機能充実している＝良くも悪くも、そこに依存しやすくなるだろう

####参考記事
[サーバーサイド実装を1行もせずにバックエンドと連携するiOSアプリを開発する](http://techblog.yahoo.co.jp/ios/ios-with-baas-parsecom/)
[mBaaSの「今」がわかる！ぶっちゃけ仮想パネルディスカッション！](https://html5experts.jp/shumpei-shiraishi/14370/)
[[MBaaS] Parseで簡単モバイルバックエンド構築 – 【ざっと概要】](http://dev.classmethod.jp/cloud/parse-introduction-1/)

#Firebase
https://www.firebase.com/

- こちらもgoogleが買収済み
- ストレージの同期が強み。例えばチャットアプリとかでメッセージを送ったら、即座に相手にも更新されるみたいな。
- オフラインにも強い。上記の例でオフラインから解除されたら同期されてメッセージが届く
- 無料枠：50 Max Connections（他省略）

####私の見解
- 同期的なアプリを作るにはよさそう、もし自前でやろうとすると大変だろうから。
- 料金も比較的、ゆるやかな気がする。

####参考記事
[準リアルタイムなバックエンド開発を支援するGoogleのFirebase](http://www.infoq.com/jp/news/2015/04/google-firebase)


#Microsoft Azure
http://azure.microsoft.com/ja-jp/services/app-service/mobile/

- 普段からAzureを使っているような場合には最適
- C#やnode.jsでカスタムAPIを作れる
- 無料枠：500kリクエストまで（他省略）
- 各所にデータセンターがあるから、速いみたい

####私の見解
- ごめん、Azure使ったことがない。


#Google Cloud Platform(Cloud Endpoints)
https://cloud.google.com/endpoints/

- App Engine および Compute Engineを使っているなら無料で使える
- PythonかJavaで使える

####私の見解
- Androidの説明やSDKは手厚いけど、iosの対応が微妙そう。Firebaseも買収したのでいつか統合するのかな？

#AWS Mobile Service
http://aws.amazon.com/jp/mobile/

いろいろ細分化されているので、使いたいものを選べます。

#####Amazon DynamoDB
http://aws.amazon.com/jp/dynamodb/
- NoSQLのデータベース

#####Amazon S3
- データストア

#####Amazon Cognito(発音：コグニート)
http://aws.amazon.com/jp/cognito/

- ユーザーのアカウント管理に特化したサービス
- ユーザー認証とユーザーデータを保持できる

#####Amazon SNS
 - プッシュ通知

#####AWS Lambda
 - イベント処理


####私の見解
- おそらく長期的にも必要な分だけ、少額で利用出来るので使ってみたい。
- やはり機能を細分化しているAWSってすごい。

#その他
 - [kinvey](http://www.kinvey.com/)
 - [Nifty Cloud mobile backend](http://mb.cloud.nifty.com/)
 - [Kii Cloud](http://jp-cloud.kii.com/)
 - [Appiaries](http://www.appiaries.com/jp/)
 - [Milkcocoa](https://mlkcca.com/)
 - [GMO mBaaS](http://www.gmo-mbaas.com/)

#他の類似の選択肢
- mbaasのオープンソースを使う（Deployd、BaasBoxなど…詳しいことは知りません）
- MongoDBのREST APIを使う

#最後にmBaaSの選定について考えること
- アプリの特性や、規模、継続性など色々加味して導入を決める必要がある
- 個人規模の開発にはうってつけ
- APIやSDKも様々なので、使うところを良く確認したほうがいい
- カスタマイズ性の高いものがあるが、あまりカスタマイズしていたら自分でAPIのサーバーを作ったほうが良くなってしまうだろう
- やっぱりどのサービスもコストの計算がしづらい。コストのシミュレーションできるツールがほしい。
- mBaaSはまだまだこれから感が強い。ただ今後重要になってくる。

他にこんなのあるよーとか、コメントどうぞ。
IoT/M2M展に行ってきた


http://www.m2m-expo.jp/
1時間ですが、時間ができたので行ってきました。
説明員の方と話して面白かったものをいくつか紹介します。
全体として、ソリューションまで用意できているところは、人が集まっており、説明員も楽しそうに説明しているようでした。
IT/Web系に比べると、半導体・組み込み系のブースの説明員の年齢層は高い印象ですが、経験もあるためか、面白い話が聞けました。

### ルネサス
* 大手半導体メーカ。
* いろいろな製品・ソリューション紹介があるなか、ヘルスケアの説明員と話した。
* ヘルスケアの分野には、[Continua Health Aliance](http://www.continua.jp/)というのがあり標準規格があるそうだ。
* 欧米では浸透しつつあるが、日本ではこれから。
* 日本企業やApple等のヘルスケア製品・ソフトは独自規格。
* 各種センサーを使った開発は、安価・やりやすくなっているとのこと。ブレッドボードの影響。
* 説明員は「まだこれからの分野なので、独自規格でも市場が広がればいい。その後、新規参入者の選択肢として標準規格を選べば、意味がある」とのこと。  

* 別の話だが、今年2月頃、ルネサスの人の話を聞いたことがあり、その人は年間数千の機器(スマホ、家庭電化製品等)を分解して、使われているプロセッサの種類、メーカを確認するのがライフワークだと言っていた。

### [CMエンジニアリング](http://cresson-portal.com/products/cresson_md920.html)

* 農業向けセンサーソリューション
* ビニルハウス内の設置想定で、温度・水分・養分・日照等の値取得が可能(センサーの組み合わせで実現)
* ただし、農家が本当に必要としているので、温度だけ。
	* 温度は暖房等で調整しているが、停電・故障等で暖房が止まった時に検知できる事が重要。（センサーはバッテリ駆動にしている）
	* 水分や養分等は、農家の経験で対応可能だし、温度程シビアな管理は必要ない。
* さいたま市が実験をおこなっており、実験dataを農家に公開している。
	* どこか主導するところがないと、いきなり農家では扱ってくれない。
	* 農協は、今のところ、傍観しているだけ。

### マクニカ

* [koshian](http://www.m-pression.com/ja/solutions/boards/koshian)の紹介
* [konashi](http://konashi.ux-xu.com/)のBLEモジュールとして使われているので、konashiもあわせて紹介。
* koshianは、ファームやBLEがある事から、konashiとほぼ同じ動作が可能。
* しかし、IO等は拡張性をかんがえるとkonashiの方が使いやすい。ただ、1万円と高い
* 個人的には980円のkoshianをいくつか購入し、ピンヘッダをつけて、ブレッドボードで開発している。

以上
smallbasicでクリップボードアクセス

#データ取得
```
WC = Text.GetCharacter(34)
CRLF = Text.GetCharacter(13) + Text.GetCharacter(10)
GraphicsWindow.BackgroundColor = "yellow"
button = Controls.AddButton("caption", 300, 200)
Controls.SetButtonCaption(button, "run")
Controls.ButtonClicked = onclick
code = ""
code = code + "Function setup(a)" + CRLF
code = code + "  Set o = CreateObject(" + WC + "htmlfile" + WC + ")" + CRLF
code = code + "  setup = Trim(o.ParentWindow.ClipboardData.GetData(" + WC + "text" + WC + "))" + CRLF
code = code + "End Function" + CRLF

Sub onclick
  a = Class1.VBSrun(code)
  GraphicsWindow.ShowMessage(a, "clipboard")
EndSub

```
#データセット

```
WC = Text.GetCharacter(34)
CRLF = Text.GetCharacter(13) + Text.GetCharacter(10)
GraphicsWindow.BackgroundColor = "yellow"
button = Controls.AddButton("caption", 300, 200)
Controls.SetButtonCaption(button, "run")
Controls.ButtonClicked = onclick
code = ""
code = code + "Function setup(a)" + CRLF
code = code + "  Set o = CreateObject(" + WC + "htmlfile" + WC + ")" + CRLF
code = code + "  o.parentWindow.clipboardData.setData " + WC + "text" + WC + "," + WC + "クリップボードに入れてみるよ" + WC + CRLF
code = code + "setup = " + WC + "ok" + WC + CRLF
code = code + "End Function" + CRLF

Sub onclick
  a = Class1.VBSrun(code)
  GraphicsWindow.ShowMessage(a, "clipboard")
EndSub

```
第10回全脳アーキテクチャ勉強会


メモ程度ですが、残しておきます。
全体的に、非常に楽しかったです。

# 概要

- https://wba-meetup.doorkeeper.jp/events/23830

# まとめ

- Computational NeuroScienceが目指すような、Cellのコネクティビティを模倣する形での知能の獲得はまだむずかしい
- 一つ上の計算論の部分はDeepLearning使って実現できそう

# 以下、詳細

## 「人工知能の難問と表現学習」（東京大学 准教授 松尾豊氏）
- 以下を目指す
	- 脳の各器官を機械学習として開発
	- それらをアーキテクチャとして統合
- DeepLearningが有効だろう
- よい特徴量とそれによって定義される概念を作ることを人間がやるしかなかったが、DLが解決してくれる、かも
	- 素性設計
	- フレーム問題
	- シンボルグラウンディング問題
- DL最近のトピック
	- 猫を獲得した時は8層
	- いまは19とか22
	- 100層に向けて
	- 画像認識についてはCNNをいかに高速に実装するか
	- 動画に使うRNN, LSTMあたりは進化中
	- DQN,Neural turing machine
- 少子高齢化の日本では人工知能は産業競争力の切り札

## 「全脳アーキテクチャと大脳皮質モデル BESOM の実用化研究の構想」（産業技術総合研究所 人工知能研究センター脳型人工知能研究チーム 一杉裕志氏）
- 各器官の計算論モデルを構築する
- 産総研　人工知能研究センター作ったよ
- 全脳アーキテクチャ勉強会で得た収穫
	- このままアーキテクチャを模倣していって大丈夫そう
		- 海馬とSLAMの類似点／相違点
		- 思考、モデルベース教科学習、周辺化の近似
		- 時系列学習
			- ESN, LSTM
- BESOMとは
	- DeepLearningと同じ構造を持った制限付きベイジアンネット
	- 近似確率伝播アルゴリズム
		- Ichisugi 2007
		- コラム構造、6層構造との一致
		- 大脳皮質はベイジアンネットであるという仮説
	- ベイジアンネットによるDeepLearning
		- スケーラブル
		- feed forwardより高機能
	- 短期記憶で隠れノードを増やす
- 視覚野、言語野の模倣を目指す
- BESOM-lab 3.0
	- ツール群
	- https://staff.aist.go.jp/y-ichisugi/besom/download.html
- 先行研究
	- PATON
		- Ohmori 1999

## 「全脳アーキテクチャを支えるプラットフォーム」（理化学研究所 生命システム研究センター チームリーダー 高橋恒一氏）
- 大脳
	- 2ステップで大多数カラム間が接続
- Deep Q-Network
- 複合学習器の構成方法
	- Composition
		- NeuralTalk
	- Hybrid
		- Deep Q-Network
- モジュール発火の並行性
	- モジュールの入力／出力を非同期にする必要あり
- 分散表象とベクトル表現
	- ニューロン発火頻度の数値ベクトルで表現できる？
	- グラフ構造をどううまく扱えるか
- 人の脳は1PFlopsくらい
	- バンド幅はまだよくわからない

## 経産省の方
- 脳型人工知能すすめよう

## 「汎用人工知能に向けた認知アーキテクチャが解決するべき知識の課題」（国立情報学研究所 情報学プリンシプル研究系 准教授 市瀬龍太郎氏）
- 汎用人工知能（AGI)で認知アーキテクチャ構築を目指す
- 言語モデルの構築にあたり、computational linguisticsが有効

## 「感情モデルと対人サービス」（玉川大学 脳科学研究所 教授 大森隆司氏）
- ロボットの知能のモデリングに際し、観察される行動の裏側の"感情”を推定し、評価することにした
- インタラクション = 心的ダイナミクス
	- 相手の内部状態をどう動かしていくか
	- 相手の意図推定
	- 心的ダイナミクスは、知的状態＋感情状態
- 感情は報酬系と関連がある
	- 強化学習
- 相手の感情を推測しながら行動を選択させ、行動の遷移確率モデルを構築
- 実験を行い、上記遷移確率モデルが相手となった子供の性格モデルと相関があることを検証

## 「若手の会の活動報告」（法政大学 島田大樹氏）
smallbasicでファイル選択ダイアログ

自前のエクステンションでVBScriptを利用しています。
#サンプル
```
GraphicsWindow.BackgroundColor = "yellow"
button = Controls.AddButton("caption", 300, 200)
Controls.SetButtonCaption(button, "file")
Controls.ButtonClicked = onclick
WC = Text.GetCharacter(34)
CRLF = Text.GetCharacter(13) + Text.GetCharacter(10)
code = ""
code = code + "Function setup(a)" + CRLF
code = code + "  With CreateObject(" + WC + "SAFRCFileDlg.FileOpen" + WC + ") " + CRLF
code = code + "    If .OpenFileOpenDlg Then setup = .FileName" + CRLF
code = code + "  End With" + CRLF
code = code + "End Function" + CRLF

Sub onclick
  a = Class1.VBSrun(code)
  GraphicsWindow.ShowMessage(a, "path")
EndSub
```
cocoapodsセットアップからSwiftyJSON動作確認まで


# cocoapods インストール

```
sudo gem update --system
sudo gem install cocoapods
```

一度ターミナルを開き直す

```
pod --version
pod setup
```

参考
http://www.slideshare.net/taichikanako/swift-47934385

# プロジェクトで初期設定

```
cd プロジェクトのディレクトリ
pod init
```
Podfileが作成されている

# SwiftyJSONを使うようにPodfileを修正

https://github.com/SwiftyJSON/SwiftyJSON で書き方を見ながら


```
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'

use_frameworks!
pod "SwiftyJSON", ">= 2.2"

target 'MyHttp' do
end

target 'MyHttpTests' do
end
```

# ライブラリのインストール

```
pod install
```



Xcodeで
Product > Buildで一度ビルドする.
やらないと、この後のimport SwiftyJSONでエラーになる。

# 実装

iPhoneでボタンをタッチするとJSONを読み込むというサンプル

```swift:ViewController.swift
import UIKit
import SwiftyJSON

class ViewController: UIViewController {

    @IBAction func StartButton(sender: AnyObject) {
        var toJSON: JSON =  ["name": "Jack", "age": 25]
        println(toJSON)
        
        var jsonString = "{\"あああ\": 25}"
        var dataFromString = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
        var json = JSON(data: dataFromString!)
        println(json["あああ"])
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

おしまい
oracleデータベースの作成時、選択できる記憶域の種類 11g

* ファイルシステム
* 自動ストレージ管理
* RAWデバイス

ASMはストライピングやミラーリングを実装するOracleが提供する機能。
ASMを使用するディスクにファイルを作成。

RAWデバイスは、よくわからん
ファイルへのアクセスがはやくなるが、扱いが難しいらしい。

説明URLを添付
https://users.miraclelinux.com/technet/document/linux/training/2_2_1.html
Effective C++ (3rd) > 29項 > strong guarantee > コピーと交換(スワップ) > pimplイディオム

引用: Effective C++ 第3版

> 強い保証をするための、一般的なデザイン方法があるのです。...「コピーと交換（スワップ）」と呼ばれるもので、原理は簡単です。

> まず、変更したいオブジェクトのコピーを作ります。それから、そのコピーを変更します。その処理の中で例外が投げられれば、元のオブジェクトは変更を受けないままで処理が終わることになります。
...

> 「コピーと交換」を実現するために、普通は、「オブジェクトのデータを別の実装オブジェクトに入れる」という方法を使います。オブジェクトは、実装オブジェクトへのポインタを保持するようにするのです。これは、しばしば、pimplイディオムとよばれるもので、31項で詳しく説明します。

pimpl(pointer to implementation)は以下の用途で使うというのは本やwebで見てきたが上記の用途にも使えるのか。

- 実装内容をクラス使用者に公開しない
- コンパイル時間の軽減
技術英語 > has stood the test of time > 時間の試練に耐えた / to last for a long time


http://idioms.thefreedictionary.com/stand+the+test+of+time
> Prov. ... to last for a long time

> The singer's work was not popular while she was alive, but it has stood the test of time.

[telegraph](http://www.telegraph.co.uk/technology/picture-galleries/11303109/12-technologies-that-have-stood-the-test-of-time-in-pictures.html)
> Technologies that have stood the test of time: in pictures
oracleソフトウェアインストール時の構成スクリプトの実行

# orainstRoot.sh

インベントリポインタファイル　/etc/oraInst.loc を作成
→インベントリの場所と管理グループが記載

```
[oracle@db04 ~]$ ls /etc/oraInst.loc
/etc/oraInst.loc
[oracle@db04 ~]$ cat /etc/oraInst.loc
inventory_loc=/u01/app/oraInventory
inst_group=oinstall
```

# root.sh

* oratabファイルの作成
* oraenvのコピー
* coraenvのコピー
YouTubeに動画をアップロードしたときや3Dについて

>初めに、WebMのコーデックがVP8なのかVP9なのかがわからないためWebMのコーデックはVPnと表記することにします。また、時間計測で使用した動画は4000x2000のH264(MP4)約65MBでサイドバイサイド(SBS)です。


YouTubeに動画をアップロードしたとき、サーバーでエンコードされるのですが、あまり目には見えないところがあります。この辺ヘルプなど調べても書かれていないため調べて確認できた範囲で解説します。

##プログレスバー
YouTubeにアップロードすると、プログレスバーにはまずアップロードの進捗が表示されます。
![pb.png](https://qiita-image-store.s3.amazonaws.com/0/17554/e1c743ea-9ce2-6e5c-8c85-b0aebacf0207.png)

次は、サーバーでの処理が開始できた場合とできなかった場合の２パターンがあります。
すぐに処理ができた場合は、処理の進捗がプログレスバーに表示されます。

すぐに開始できなかった場合は、左側に"動画/音声品質:"と書かれているところのすぐ下に、"処理に時間がかかっています。しばらくしてから動画をご確認ください。"と表示されます。
![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/17554/6cf8a6ef-6c0a-c61a-06ea-0b884d991ce9.png)

これが表示されると、プログレスバーは"0%処理済み"のままとなり、いくら待ってもプログレスバーが100%にはなりませんので注意してください。すぐに処理が開始される確率は案外低くく、たいていの場合、後者となるでしょう。

##エンコード
エンコード処理はプログレスバーでは細かい部分の進捗が表示されないため、これは実際にYouTubeのページで確認するしかありません。
対応ブラウザーが多いコーデックであるH264(MP4)で、かつ360Pの画質で一番最初にエンコードされます。
次にH264でほかの画質(144P,240P,720P,1080P,1440P,2160Pなど)で画質の低いほうからエンコードされます。私が試したときは他の画質がリストに表示されるまで10分くらいかかりました。そのあとにVPn(WebM)でエンコードされます。
まだVPnでエンコードされていない場合に、H264(MP4)に対応していないブラウザー(ChromeのWebVRビルド版など)で動画ページにアクセスすると、プレイヤーには![player_not_support.png](https://qiita-image-store.s3.amazonaws.com/0/17554/ed379a68-0e43-a4b6-8dd3-3691b3340647.png)
と表示されます。
VPn(WebM)でのエンコードは待ち行列でやっているようで結構遅い場合があります。VPn(WebM)も同じように360Pでエンコードされ、次に他のサイズでエンコードされます。他のサイズがリストに表示されるまで約３０分かかりました。しかし、2160Pはリストに表示されてもエンコード途中だったらしく再生途中で止まってしまいました。1時間ほど待ってリロードして再度再生すると最後まで再生できるようになりました。

##3D動画
Youtubeは、サイドバイサイド(SBS)やトップアンドボトム(TAB)といった3D(立体視)動画に対応しています。
![settings.png](https://qiita-image-store.s3.amazonaws.com/0/17554/28d4c844-1776-7dab-b5b7-0a20517ffedc.png)

サイドバイサイド(SBS)やトップアンドボトム(TAB)の3D動画をアップロードした場合、"この動画は既に3Dである"を選ます。すると、右にドロップダウンが表示されます。
![sbstab.png](https://qiita-image-store.s3.amazonaws.com/0/17554/336ccc89-9343-5990-4b3c-9d5a2b8af809.png)
右のドロップダウンリストから、左目の映像がどの位置にあるかを選択します。そして、「変更を保存」ボタンをクリックします。すると、アナグリフ動画の生成のためか反映されるまで少々時間がかかります。反映されると動画はアナグリフ表示に代わります。(時間計測した動画では反映されるまで約5分かかりました。)

>今でも対応しているかどうかは3Dグラスを持っていないため不明ですが、一昔前でも立体視には対応してました。これはYouTubeのプレイヤーがFlashだったころで、FirefoxでかつNVIDIAの3D Visionに対応してる環境(120fpsモニターなど)でNVIDIAの3Dグラスを持っている場合は、フレームシーケンスによる立体視ができました。

2D動画を3Dへ変換するという機能もあるようで、"3D動画に変換する"というのを選べば、2Dを3Dに変換できるようです。
試してみたのですが、埋め込みプレイヤーではアナグリフ表示になるのですが、YouTubeのページにアクセスするとアナグリフ表示にはなりませんでした。動画が悪いのか、アナグリフ表示を見てみるとどう見ても立体視ができるような代物とはなりませんでした。
1行で画面タッチを可視化できるTouchVisualizerの使い方


![logo2.png](https://qiita-image-store.s3.amazonaws.com/0/24041/f5f5522a-1250-7a40-f623-2f739db6eced.png "logo2.png")

先日、[【第17回】potatotips(iOS/Android開発Tips共有会)](http://connpass.com/event/14143/)に参加して発表した[TouchVisualizer](https://github.com/morizotter/TouchVisualizer)の使い方の紹介をします（発表資料などは[こちら](http://blog.morizotter.com/2015/05/14/touch-visualization-presentation-at-potatotips-wantedly/)にまとめています。）。

## 使い方

TouchVisualizerは画面のタッチを可視化するシンプルなライブラリです。[CocoaPods](https://cocoapods.org/?q=touchvisualizer)や[Carthage](https://github.com/Carthage/Carthage)で簡単にプロジェクトに導入することができます。ファイルを直接プロジェクトにコピーして実行することもできます。

利用を開始したいファイルで `import TouchVisualizer` と書いてインポートして、

```Swift
TouchVisualizer.start()
```

と書くだけで開始できます。`AppDelegate.swift` などに書くと良いと思います。タッチ部分の画像を変更したり、タッチの範囲を表示したいときにはconfigファイルに設定を指定すれば簡単に見た目を変えることができます。例えば、

```Swift
var config = TouchVisualizerConfig()
config.showsTimer = true
config.showsTouchRadius = true
config.showsLog = true
config.image = UIImage(named: "robot")?
TouchVisualizer.start(config)
```

これで、DEMOで紹介するようにタッチ部分をロボットにして、タッチの範囲を表示してタイマーを出すことができます（DEMOではタイマーを出していません）。XCodeにログを出すこともできます。

それ以外に `stop` 以外のメソッドはありません。簡単に使えることを意識しています。[TouchVisualizer](https://github.com/morizotter/TouchVisualizer)をクローンすると、Exampleプロジェクトがあるので、まずはそちらを動かして挙動を確認すると良いと思います。

[morizotter/TouchVisualizer](https://github.com/morizotter/TouchVisualizer)

## DEMO

[![DEMO MOVIE](http://img.youtube.com/vi/7IQ8H9rbJp8/0.jpg)](http://www.youtube.com/watch?v=7IQ8H9rbJp8)

## 簡単に使えるプレゼンテーション用ライブラリ

YOSEMITEとiOS8の登場により、アプリの動画を簡単に撮ることができるようになりました。ただ、動画を撮ってもタッチが表示されないとちょっと寂しい感じになってしまいます。このライブラリは以下の課題を解決しています。

0. 画面タッチを表示するのは一見簡単に思えるけど実際やってみると意外と面倒（だからやらない）。
0. ほとんど使わないけどたまに欲しい。

TouchVisualizerがあれば、1行のコードでこの問題が解決できます。簡単に使えるライブラリがなかったので、作ってみました！

## GithubのTrending repositoriesで1位に！

発表後Githubの Trending repositories Swift todayの世界ランク1位になりました！

![github01.png](https://qiita-image-store.s3.amazonaws.com/0/24041/da88bc7d-bd4c-f9bf-baff-67dbd0097b3a.png "github01.png")

## まだまだ発展途上

まだまだ発展途上すぎるライブラリです。コードには突っ込みどころがたくさんあります。恥ずかしいけど公開してます。

[Fork me!](https://github.com/morizotter/TouchVisualizer)という感じです。よろしくお願いします！
初Macに慣れつつも、標準を忘れないキー配置カスタマイズ



初Macをつかい始めて1週間。
各種それほどのハードルの高さは感じなかったけど、キーボード操作がたどたどしい毎日。
他人のMac環境を触ることもあると思うので、完全に主観だけど、自分×Macの慣らしの余地を残したカスタマイズ


## 環境と前提
* MacBook Pro 13インチ 2015
* USキーボード
* 20年くらいWindows+jisキーボードにどっぷり
* 「全部Karabinerでいいじゃん」と言われそうだけど、複数の方法を用いる。（勉強＋Windowsユーザ的には、複数のアプリで1つのもの触るなんて、、、ざわざわする ＜ Seilのこと）


## 用意するもの
[Karabiner](https://pqrs.org/osx/karabiner/)

## Karabinerでキー配置変更
要請は以下の通り。
* 日/英切り替えはひとつのキーでやりたい
* やっぱDeleteはFowordも結構つかいたい
![Karabiner](https://qiita-image-store.s3.amazonaws.com/0/78083/b8d2c62d-cec6-cc22-98f0-b657bd5ab74e.png)

これで、右commandボタンだけで、command+space 相当の言語切り替えが可能
と、右option+deleteでforward deleteが可能になった。

## OS標準のシステム環境設定でキー配置変更
要請は以下の通り。
* コピペの指が狭いから、commandキーを **増やす** ・・・が、前述の設定とでプラマイゼロ
  
ここは標準機能で。
システム環境設定 ＞ キーボード ＞ 右下の「修飾キー」より、
Capslockを、Commandキーへ変更
![システム環境設定](https://qiita-image-store.s3.amazonaws.com/0/78083/4e319825-7157-4ee9-0635-c0f140b34e3c.png)

どうせcapslockなんて使わないし、これで左小指が活躍できるはず。

## 2週間使って見ての感想と、最適化
私自身はあまりなかったが、結構一般的でした

Shift+
VM環境内で大変
Qを押してしまう


まれに外付けのキーボード(us)を使うことがある

# 訂正と結論
> Capslockを、Commandキーへ変更

以外は不要っぽい
UIBarButtonItem 使用 Custom View 時需要自己處理 User Interaction


在用 UIBarButtonItem 的時候，要用 custom view, 發現加 target 和 action 都沒有用，無法觸發 action 所設定的 `SEL` 物件。

``` objc:使用CustomView
UIBarButtonItem *item = [UIBarButtonItem initWithCustomView:customView];
item.target = self;
item.action = @selector(didSelectItem:);
self.navigationitem.leftbarbuttonitem = item
```

這時候 selector `didSelectItem:` 並不會如期被呼叫到。

# 需自己處理

> The bar button item created by this method does not call the action method of its target in response to user interactions. Instead, the bar button item expects the specified custom view to handle any user interactions and provide an appropriate response.
>
> UIKit Framework Reference > UIBarButtonItem Class Reference > `- initWithCustomView:`

在文件裡面提到，當使用這個 method 來初始化一個 `UIBarButtonItem` 的實例時，他們則期望開發者應該要自己處理使用者的互動，

# 參考資料

- [UIBarButtonItem Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIBarButtonItem_Class/)
MacからRaspberry Piに有線接続する

先日からRaspberry Piを触っています。

以下の書籍でいろいろ勉強しています。
<img src="http://ecx.images-amazon.com/images/I/91bvIBjtk4L.jpg" width="320" alt="これ１冊でできる！ラズベリー・パイ 超入門 改訂第2版">
[Amazon.co.jp： これ１冊でできる！ラズベリー・パイ 超入門 改訂第2版 Raspberry Pi Model B／B+／2対応: 福田 和宏: 本](http://www.amazon.co.jp/dp/4800710901)

今日やったのは、有線LANでのRaspberry Piの直接接続。
家ではルーターを通してRaspberry Piのネットワーク接続およびMacからのSSH接続に成功していましたが、
外でもどこでも使えるようにと思い、有線を試してみました。

これも詳しいことは以下の記事に載っているので、そこを参考に、つまずいたところだけ。
[RaspberryPi - Raspberry Piを家の外に持ち出してMacとLANケーブル直結で使う設定 - Qiita](http://qiita.com/hnw/items/e0d0a19a64d8d079afb5)

Raspberry Pi側では以下のコマンドを実行するだけでOK

```text:RaspberryPi
$ sudo apt-get install avahi-daemon
$ sudo insserv avahi-daemon
$ sudo apt-get install avahi-autoipd
```

※ネットワーク接続必要
※ホスト名、DHCP設定はデフォルトのまま

```text:Mac
$ ssh pi@raspberrypi.local
```

※ユーザー名（この場合はpi）を付けておかないと、Macのユーザー名でログインしようとしてしまう（これはSSHの知識）
※Raspberry Piを起動してから1分ぐらい待たないと接続できない

何かと想像していたより簡単でびっくりしています。
Apache httpd の configure オプション確認方法

# httpd -V ではなかったのかっ！
`httpd -V` は詳細が表示されるだけで configure のオプションそのものは出てません。残念。

# 偉大なるスタッッッッッッッッッッックオーバーフローより
[finding apache build options - Stack Overflow](http://stackoverflow.com/questions/137181/finding-apache-build-options#answer-23370616)

2.2.27, 2.4.1, 2.4.7 のそれぞれのバージョンで確認してみました。
下記のように出力されるようです。

```bash
$ view /path/to/httpd_root/build/config.nice

#! /bin/sh
#
# Created by configure

"./configure" \
"--prefix=/usr/local/apache2" \
"--enable-so" \
"--enable-mods-shared=most" \
"--enable-ssl" \
"--with-mpm=worker" \
"--enable-cgi" \
"$@"
```

# 終わりに
ぅゎすたっくぉぉばぁふろぉっょぃ
Nautilusをrootで開きつつ色を変える方法(Ubuntu 14.04)

# Nautilusから右クリックでRootで開いてさらにそいつが色付きだといいよね！

って話です。
我慢して使ってたNemoはなんかUbuntuにあわなかった。Mint使ってた頃は違和感なかったんだけどね。

## <i class="fa fa-cubes" style="font-size:1em;"></i> やることの流れ

1. 必要なもののインストール
2. コンテキストメニューの追加
3. Root時のウィンドウの色変更

　
###### 0. 番外
最初は Nautilus Script(s) Manager (sが入るとGUI版)を試したんですが全く機能しませんでした。


## 1. 必要なもののインストール <i class="fa fa-spinner fa-pulse"></i>

* Nautilus-Actions Configuration Tool
* gksu
* Nautilus(消してたら)

```lang:Terminal
$ sudo apt-get install nautilus-action
$ sudo apt-get install gksu
$ sudo apt-get install nautilus
```

## 2. コンテキストメニューの追加 <i class="fa fa-plus"></i>

Dashから Nautilus-Action Configuration Toolを起動します。
そしたら左上から `Define a new Action` でコマンドを追加。「OpenAsRoot」とかに名前変えときます。

##### <i class="fa fa-sort-desc" style="font-size:1em;"></i> Actionタブ

　　<i class="fa fa-check-square-o" style="font-size:1em;"></i> Display item in selection context menu
　　<i class="fa fa-check-square-o" style="font-size:1em;"></i> Display item in location context menu
　Context label: `OpenAsRoot`
　　<i class="fa fa-square-o" style="font-size:1em;"></i> Display item in the toolbar


##### <i class="fa fa-sort-desc" style="font-size:1em;"></i> Commandタブ

　Label: `OpenAsRoot`
　Path: `gksu`
　Parameters: `nautilus %d/%w`

とします。

(解説)
Terminalで

```lang:Terminal
gksu nautilus ./
```

ってやってみてください。
%dは選択したファイル・フォルダまでの絶対パス、%wはフォルダを選択していた場合のフォルダ名らしい

##### 追加できたことの確認

```lang:Terminal
nautilus -q
nautilus
```

![ワークスペース1_Shutter_20150514_0003.png](https://qiita-image-store.s3.amazonaws.com/0/58443/fda7d1fe-ac70-5970-2f9d-7d52f53bda51.png)
こんな感じでメニューが出ればOKです


## 3. Root時の画面の色変更 <i class="fa fa-pencil"></i>

デフォルトでは、`sudo Nautilus`した時に警告も表示されなければウィンドウの色も全く変わらないので、パッと見どのウィンドウがRoot権限を取得している状態なのかがわかりません。
これはNemoに比べて大きなデメリットの一つです。（ちなみに他の大きな難点の一つは名前が覚えづらいことですよどう考えても

そこで、Rootで開くNautilusの画面だけ色を変えてあげます。
Ubuntu12.04まで？(Gtk2のころ)はNautilusのカラースキームを単体で変更できたのですが、13.04以降辺りからはUnityデスクトップ全体の配色をスキンという形で定めているようです

以下、how to change background of nautilus in ubuntu 14.04 | Ask Ubuntu を参考にしました
http://askubuntu.com/questions/465908/how-to-change-background-of-nautilus-in-ubuntu-14-04/465968#465968

内容をいい感じにまとめると、
Ubuntuにもともと入っているスキンは
/usr/share/themes/~
にあります。
これをユーザー用ディレクトリにコピーして編集しましょう、ってかんじです。
/home/xxuserxx/.themes 以下に置いたスキンはユーザー設定として優先されるし、元のファイルはいじらないので安全ですね！

さて、これをRootに応用してみます。

```lang:Terminal
$ sudo -i
 -> Rootへ
 
# mkdir ~/.themes
# cp -R /usr/share/themes/Ambiance ~/.themes/
# cd .themes
# gedit ./Ambiance/gtk-3.0/apps/nautilus.css
```

Root権限でGeditが立ち上がるので、ファイルの先頭に次を追加します。

```css:nautilus.css
NautilusWindow * .view {
     background-color: #F0AC9D; 
}

/* 以下はいじらない */
```

`background-color`の値はご自由に設定して下さい。ただ、白っぽいほうがめんどくさくなくていいと思います。ここでは赤系の薄い色を指定しています。
できたら、確認もしましょう。そのままTerminalで打ちましょう。

```lang:Terminal
# nautilus
```

suじゃなくなってたら `sudo nautilus` とかで。

![Screenshot from 2015-05-15 sudo.png](https://qiita-image-store.s3.amazonaws.com/0/58443/b4d07939-f26f-fb61-4a2d-e0f6bb1adf0a.png)
こんな感じになれば成功です！背景が無事変わっていますねー


## 完成 <i class="fa fa-hand-o-up"></i> <i class="fa fa-hand-o-up"></i>

あとは普通にTerminalを開いて、右クリックからRootで開いてみましょう。
Qt + CMake

Windows で開発する際に、よく忘れるのでメモ

# Windows

Visual Studio コマンドプロンプトで作業する必要あり。

#### CMakeLists.txt

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_PREFIX_PATH "C:/Qt/5.4/msvc2010_opengl")

find_package(Qt5 COMPONENTS Widgets Core)

add_executable(test WIN32 src/main.cc)
target_link_libraries(test Qt5::Widgets Qt5::Core)
```

-  CMAKE_PREFIX_PATH じゃなくてもよいような。
-  project 指定した方がよい。（Visual Studioのソリューション名になるなど利点あり）

##### ビルド方法

```shell-session:msbuild派
> mkdir build
> cd build
> cmake ..
> msbuild ALL_BUILD.vxcproj
```

```shell-session:nmake派
> mkdir build
> cd build
> cmake .. -G"NMake Makefiles"
> nmake
```

このままでビルドはできるけど、windeploy するには qtenv2.bat を実行する必要があり。
（ただ、qtenv2.batを実行するとディレクトリ変わってストレス）

以上でした。
【Swift】ハマりがちな循環参照について


iOSアプリを作ってると気づかないうちにやってしまっている循環参照。
メモリリークの原因は大概コレが原因となっていると思います。

###1.循環参照とは？
循環参照とは「クラスAとクラスBのインスタンスがそれぞれ存在した時、クラスAのインスタンスをクラスBのプロパティに格納し、クラスBのインスタンスをクラスAのプロパティに格納する」といった状態になった時に、お互いにインスタンスを参照しあうため、どちらも解放されずにそのまま残り続けてしまう、という現象です。

###2.強参照と弱参照
クラスのインスタンスは何も指定しなければ通常「強参照」と呼ばれる形で代入されます。
強参照とは、端的に言えば親子関係です。
親が解放されると子も自動的に解放されます。
ここで上記のようにお互いが親としてインスタンスを保持すると循環参照が起きるわけです。

そこで、この循環参照が起こることを防ぐために弱参照を使います。
Swiftにはweakとunownedといった修飾子がこの為に用意されています。
強参照が親子関係だったのに対して、弱参照はインスタンスの使用権を得るだけです。
つまり、親が解放されてしまうと弱参照で代入されたインスタンスも使用してようがしてまいが解放され、参照することができなくなります。

###3.クロージャで発生する循環参照
selfが保持しているクロージャの内部でselfを参照すると循環参照が起きます。
例えば、下記の場合循環参照が発生します。

**（15/6/21）例で誤りがありましたので修正しました**

```swift 
class Sample{
    var count : Int = 0
    var inc: (() -> Int)! = nil
    init() {
		inc = incrementCount()
	}
    func incrementCount()->()->Int{
        return{
            ++(self.count)
        }
    }
    deinit {
		println("deinit")
	}
}
var sample:Sample? = Sample()
sample = nil
//deinitがよばれない＝インスタンスが解放されていない
```

これを防ぐ為に、先ほど紹介したweakやunownedを使用します。

```swift
class Sample{
    var count : Int = 0
    var inc: (() -> Int)! = nil
    init() {
		inc = incrementCount()
	}
    func incrementCount()->()->Int {
        return {
            [unowned self] in
            ++(self.count)
        }
    }
	deinit {
		println("deinit")
	}
}
var sample:Sample? = Sample()
sample = nil
deinit //deinitがよばれた！

```
###4.weakとunownedの違い
weakを用いると、インスタンスが解放された時nilが入ります。
よって、nilが代入される可能性があるのでweakを使うときはOptionalでないといけません。
一方、unownedで宣言された変数にはnilにはなりません。
よって、既に親によってインスタンスが解放されていた場合、unownedを参照すると落ちます。

結論を言うと、基本的にはweakを使っておけば問題になることはないと思います。
ただ、インスタンスが必ず存在すると保証できる時にweakを使うとアンラップが必要な分、記述が冗長になります。

```swift
class Sample{
    var count : Int = 0
    var inc: (() -> Int)! = nil
    init() {
		inc = incrementCount()
	}
    func incrementCount()->()->Int{
        return{
            [weak self] () ->Int in
            if let weakSelf = self{
                return ++(weakSelf.count)
            }
            return 0
        }
    }
}
```

クロージャ内でselfを参照する場合は、selfが先に解放されてしまうということはあまりないのでunownedでも大概問題にはならないと思います。
逆に、こういうケース以外でunownedを使う時は慎重にならないといけません。

更に、selfが先に解放されてしまう、というケースも存在します。
例えば、非同期処理においてコールバック関数が呼ばれた時には、既にselfが解放されてしまっている場合などが考えられます。
Unity ToggleGroup 現在選択されているToggleの取得

Unity4.6です。(5系統でも同じかも知れませんが確認していません)

2015/05/15現在、リファレンスには
http://docs.unity3d.com/ScriptReference/UI.ToggleGroup.html

RegisterToggle		トグルの登録
UnregisterToggle	トグルの登録解除
関数しか記載がないのだが、まさかそれだけじゃないはず、、と思って
アセンブリを参照すると便利っぽい関数がいろいろあるのでリファレンスに記載がないものをメモ的に記述しておく。

public IEnumerable<Toggle> ActiveToggles()
public bool AnyTogglesOn()
public void NotifyToggleOn(Toggle toggle)
public void SetAllTogglesOff()


現在選択されているトグルを取得するには

```csharp
using System.Linq;
using UnityEngine;
using UnityEngine.UI;

ToggleGroup	mToggleGroup;

Toggle tgl = mToggleGroup.ActiveToggles().FirstOrDefault();
```
Allow Switch Off の場合はnullが返ってくることあり。



なんでリファレンスに記載がないかはわからない。
そのうち使えなくなる？　忘れてるだけ？　忘れてるんだとしたら頼みますよUnityさん・・・
PHP7調査(32)error_clear_last関数の新設

PHP 5.2.0で実装された`error_get_last()`という関数があります。これは直前に発生したエラーの情報を返すもので、エラーの情報をPHPの配列の形で取り出すことができます。

```php
<?php
@$a = $b;
var_dump(error_get_last());
```

このPHPスクリプトを実行すると、次のように直前のエラーに関する情報が得られます。

```
array(4) {
  ["type"]=>
  int(8)
  ["message"]=>
  string(21) "Undefined variable: b"
  ["file"]=>
  string(12) "/tmp/foo.php"
  ["line"]=>
  int(2)
}
```

エラーを「@」で抑制していてもエラー情報が取り出せるのは少し面白いですね。

しかし、この関数を繰り返し使うことを考えると、この内容をリセットできた方が便利です。これを実現するのが、PHP7で実装された`error_clear_last()`です。


```php
<?php
@$a = $b;
var_dump(error_get_last()['message']); // string(21) "Undefined variable: b"
var_dump(error_get_last()['message']); // string(21) "Undefined variable: b"
error_clear_last();
var_dump(error_get_last()); // NULL
```

そもそも`error_get_last()`なんて関数はじめて知った、というのが正直な感想ですけどね…。

# 参照

* [Implemented FR #45235 implement error_clear_last() function #1135](https://github.com/php/php-src/pull/1135)
* [Request #45235 A way to clear or reset the results for error_get_last()](https://bugs.php.net/bug.php?id=45235)
* [PHP: error_get_last - Manual](http://php.net/manual/ja/function.error-get-last.php)
【C#】ラムダ式おぼえがき

ラムダ式で文字数が5文字以下のnamesが何件あるか調べる

```csharp:Sample
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {

        static void Main(string[] args)
        {
            List<String> names = new List<string>
            {
                "shimakaze",
                "amatsukaze",
                "kongo",
                "kuma",
                "tama",
            };

            // ラムダ式
            Func<string, bool> predicate = str => str.Length < 5;

            int count = CountList(names, predicate);
            Console.WriteLine(count);

        }

        private static int CountList(List<string> names, Func<string, bool> predicate)
        {
            int count = 0;
            foreach (string str in names)
            {
                if (predicate(str))
                {
                    count++;
                }
            }
            return count;
        }
    }
}
```
【AWS】Kinesisまとめ



# Kinesisとは？
一言で言うと、沢山の場所から送られてくる大量のデータを受け付ける窓口。
有名なのが「あきんどスシロー」の事例。
そう、IT化されまくっていて、うまいすしを、腹一杯。うまいすしで、心も一杯になるあの寿司屋です。
あきんどスシローでは寿司の皿をタグで管理していて、全店舗の寿司情報をKinesisにぶち込んでいます。

簡単に聞こえますが、これは、そうとう膨大なデータ量になります。
この膨大なデータの受付窓口を作ろうと思うと、大規模なインフラ環境が必要になります。数十台とか。機器コスト、さらに運用コストが半端ない。
でも、このKinesisを使うと、とても簡単にとてもリーズナブルな値段で利用できるという話です。
何十万ものソースから、１時間あたり何テラバイトにもなる膨大なデータを貯められます。

データは複数AZに格納されるので信頼性・耐久性が高いです。
ただし、一時的なデータ置き場として24時間後にはKinesis上からデータが消えます。
なので、データを受けた後は、整形等のETL処理に加え、S3・Redsift・dynamoDBにデータを永続化する必要があります。

# Kinesisの構成
* Stream：データ受付窓口
* Shard：受付することができるキャパシティ。shardを増やすと、受け付けることができる量を増やせる。
* Data Record：入力するデータ。複数AZに格納され、24時間後には消える
* 複数Shardがある状態でデータ入力する場合は、パーティションキーを元にしたMD5を元に分散される（うまく分散するようにパーティションキーを指定する必要あり）
* シーケンス番号：Data Recordに付加されるStream内でユニークな番号
* KinesisデータはKinesisコネクタを利用して、S3、DynamoDB、RedShiftに永続化できる
* EMRコネクタを利用して、Hive、Pigといった連携ができる

# コスト
かなり安い。
10Shardで、１億putで、約月額$110→１万円ちょい
検証で1Shardで５時間使った場合、20円しない→気軽に検証できる！！

* Shard単位で料金がかかるため、負荷が低い時間帯はshardをマージすると料金を安くすることができる。負荷が高くなる時間帯は逆にShardを分割する
pixivのAPIにアクセスする

# はじめに
2015年5月12日くらいにpixivのAPIが変わったようです。旧来のやり方だとログインすることができなくなっているため、ちゃんとした方法でログインする必要があるようです。

ところが、pixivは公式APIを公開していません。新しい方法をWEBで検索しても、まだ整理して掲載されているページも見当たらず。とりあえず、自分用のメモとして記録していこうと思います。




# PHPのコード
## ログインしてトークンを取得する。

```php:login.php
require_once 'HTTP/Request2.php';

$request = new HTTP_request2();

//SSLの検証を無視
$request->setConfig( array(
	'ssl_verify_host'	 => false,
	'ssl_verify_peer'	 => false,
) );

//リクエストのヘッダ設定
$request->setHeader( array(
	'Referer'	 => 'http://www.pixiv.net/',
	//'User-Agent'	 => ’’　//必要かも？,
	'Connection' => 'close'
) );

//メソッドはPOSTで
$request->setMethod( HTTP_Request2::METHOD_POST );

//各種パラメータ
$request->addPostParameter( 'username', PIXIV_ID );
$request->addPostParameter( 'password', PIXIV_PW );
$request->addPostParameter( 'grant_type', 'password' );
$request->addPostParameter( 'client_id', "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ); //iOS Client ID
$request->addPostParameter( 'client_secret', "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ); //iOS Client Secret

try {
	$response = $request->setUrl( 'https://oauth.secure.pixiv.net/auth/token' )->send();

	$cookies = json_encode( $response->getCookies() );
	file_put_contents( './cookies.txt', $cookies );
	
	file_put_contents( './body.txt', $response->getBody() );
	
} catch ( HTTP_Request2_Exception $e ) {
	var_dump( $e );
}
exit;
?>
```

### 取得したクッキーをprint_r
valueに表示されたセッション情報を使う。有効期間は3600秒。

```php:cookies.txt
Array
(
    [0] => Array
        (
            [expires] => Fri, 01-May-2015 00:00:00 GMT
            [domain] => .pixiv.net
            [path] => /
            [secure] => 1
            [name] => PHPSESSID
            [value] => 99999999_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            [max-age] => 3600
        )

)
```

### 取得した本文(Body)
* jsonで帰ってくる。
* 帰ってきた access_token を使う。

## イラスト情報の取得方法

* https://public-api.secure.pixiv.net/v1/works/xxxxxx.json 。xxxxxxはイラスト番号。
* ログイン時のセッションデータとaccess_tokenが必要
* 閲覧数やポイント数は取得できなくなっている様子。（パラメータが必要なのかもしれない）


## その他
* https://public-api.secure.pixiv.net/v1/users/xxxxxx.json 。ユーザー情報。
* https://public-api.secure.pixiv.net/v1/me/feeds.json 。自分自身の新着情報



# 参考サイト
* [Pixiv Public-API (OAuth)分析 - pixivpy新版本放出](http://blog.imaou.com/opensource/2014/10/09/pixiv_api_for_ios_update.html)
* https://github.com/upbit/pixivpy/blob/master/pixivpy2/papi.py
C#のラムダ式で見ておぼえるカリー化

※あってるかどうかといわれるとじしんない

# カリー化とか部分適用とかの謎用語
初めてこの単語を見かけたときの「？？？？？」具合がひどかったので自分にわかりやすくまとめてみる。
ネットで調べてみても、結局よくわからないことを書いてるところがあったり、正確だけどとても回りくどい書き方してるところがあったりしてちょっとわかりづらかった。

### 普通のラムダ式

```csharp
Func<int, int, int, int> func; // 3つのintを引数にとってintを返す

func = (x, y, z) => x + y + z;

func(10, 20, 30); //-> 60
```

### 普通のラムダ式をカリー化したもの
```csharp
func2 = x => y => z => x + y + z; // この形に変換することをカリー化と呼ぶ

func2(10)(20)(30); // -> 60
```

### かっこを付けてみるとわかりやすいかも
```csharp
func2 = x => (y => (z => x + y + z)) // intを返す関数、を返す関数、を返す関数

// func2の定義はこんな
Func<int, Func<int, Func<int, int>>> func2; // 書きづらすぎて死ぬ
```

### カリー化した関数をつかう
```csharp
f1 = func2(10); // f1 の中身は (y => z => 10 + y + z)

f2 = f1(20); // f2 の中身は (z => 10 + 20 + z)

f2(30); // -> 60
```
一段階ずつ引数を固定した関数を作ることができる。
__これは部分適用ではない。__

### 部分適用というのは
```csharp
func = (x, y, z) => x + y + z;

partial1 = func.ApplyPartially(10) // ApplyPartiallyなんていうメソッドはないけどなんとなくイメージしてくだち

// partial1 の中身は (y, z) => 10 + y + z;

partial1(20, 30) // -> 60   
```

# これだけ
こうやってまとめてみたら何が難しくてこれがわからなかったのかわからない……？？？？
1引数の関数がどうのこうのとか難しいこと言う前にコードで示したほうが早かったやつだ！

この記事はあくまでカリー化の概念をつかむためのものであり、__C#でこれをやるメリットは全くないし意味もない！__関数を組み立て、合成できる関数第一なプログラミング言語でやって初めて活きる概念ですね。

ちなみに、C#で普通のラムダ式をカリー化する汎用メソッドとか作ってみようかと思ったけど、引数の数に対してジェネリックなことができないC#でやるのは無茶だった。引数の数毎にコピペで定義すればいけるけど……。あと上で適当にでっち上げたApplyPartiallyも同じように汎用性持たせられなかったのでダメでした。

```csharp
// 「引数が3つのFunc」に対してカリー化と部分適用をする拡張メソッドは一応こんな感じで実現できます
public static class Extension
{
    public static Func<T1, Func<T2, Func<T3, TResult>>> Currying<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> func) => x => y => z => func(x, y, z);

    public static Func<T2, T3, TResult> ApplyPartially<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> func, T1 value) => (x, y) => func(value, x, y);
}
```
Google Analyticsでアカウント追加をする方法



## まずは、サクッと方法説明

1. 上部タブの「アナリティクス設定」
2. 一番左カラムの「アカウント」の下のプルダウンを開く
3. 開いたプルダウンの一番下の「新しいアカウントを作成」をクリック


## 感想

* 本当にわかりづらい
* あちこちクリックしたりしても見つけられない
* ググってもなかなか出てこない

のでメモ的に書いてみた。


## 検索用語

* グーグルアナリティクス
RailsのDeviseで最低限付与したいセキュリティ設定


Railsで会員機能を実装するのによく使うgemのDeviseですが、
個人的にサービス作るなら最低限これくらいの設定はしておいて欲しいなぁと思う。
簡単に設定できて手軽にセキュリティレベル上げれるので、
可用性が下がらない範囲で調整して導入して欲しいです。

##ロック条件の有効化（時間でのみ解除の場合）
deviseのマイグレーションファイルのコメント部分を調整します。
コメントに使用方法なども書いているので、
要件に合わせて使い分けるのが良いでしょう。
今回は時間でのみ解除するので下記のようにしておきます。
※メールで解除用のトークン送ったりする場合トークン部分もいります。

```ruby:db/migrate/20150416180122_devise_create_users.rb
      ## Lockable
      t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      t.datetime :locked_at

    # add_index :users, :unlock_token,         unique: true
```

User（該当モデル）に `devise` の `:lockable` を追加します。

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :lockable
end
```

##ロック条件の詳細設定

Deviseの設定ファイルにロック内容を設定します。
設定方法の詳細（パターン）はコメントアウトされてるので読んだら大体分かります。

```ruby:config/initializers/devise.rb
config.lock_strategy = :failed_attempts # 一定回数ログインミスでロック
config.unlock_strategy = :time          # ロック解除条件は時間経過のみ
config.maximum_attempts = 10            # 10回連続ミスでロック
config.unlock_in = 1.hour               # 1時間ロック継続
config.last_attempt_warning = false    # あと1回ミスしてロックされる時に警告を出さない
```

***
ね、簡単でしょ？
Macで簡単に画面上の色を取得する

画面上の色がほしい時があって、要するにやりたいことはPhotoshopとかのスポイトなのだけど、それがMacにプリインストールされたアプリケーションでできることを知ったのでメモ。

# Digital Color Meter

![digital-color-meter.png](https://qiita-image-store.s3.amazonaws.com/0/5538/f82dd0fd-61d8-1d59-421c-8ac53fb571e3.png)

`/Applications/Utilities/Digital Color Meter.app`がそれ。SpotlightやらAlfredなら`digital`とか入力すれば多分すぐに出てくる。10.9と10.10ではインストールされていたのを確認したけど、それ以外のバージョンのOS Xはわからない。

## 16進数表示にする

CSSを書くときによく使うので、メニューの

- 表示
- 値を表示
- 16 進

にチェックを入れる。

## その他

`⌘ + 1, 2, 4, 8`で拡大率の変更、`⌘ + L`で位置をロックしたりできる。

---

今までわざわざスクリーンショットを撮ってPhotoshopで開いたりしていたのだけど、それが必要なくなる。

簡単便利₍₍ (ง ˘ω˘ )ว ⁾⁾
Selenium WebDriver　"Unable to connect to host" エラー

# 環境
+ PC (OS:Windows7)
+ Firefox (ver 37.0.2)
+ Java (1.7)
+ Selenium WebDriver (2.42.2)

# エラー

+ WebDriverからFirefoxを起動する際、下記エラーが発生。

    ```
org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
    ```

# 対応

+ 下記の参考ページによると、WebDriverのバージョンがFirefoxのバージョンに対応していない場合に上記のエラーが出るとのこと。

+ 暫定回避としてFirefoxのバージョンダウン(ver 37 → 30)を実施。

+ Firefox ver 37をアンイストールし、下記ページから "Firefox Setup 30.0.exe" を落としてきてインストール。("Firefox Setup Stub 30.0.exe" の方は動きませんでした)
    <a href="https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/30.0/win32/ja/">Firefox ver 30 インストーラー</a>

# 注意
+ Firefoxはデフォルトで自動verupするので下記のように設定を変えておきます。

```
    メニューから[ツール]-[オプション]-[詳細]-[更新]-[Firefoxの更新]と辿って、
    "更新の確認は行うが、インストールするかどうかを選択する"　を選択。
```

+ 本来は自動verupが望ましいのですが、Firefoxが最新になったときに必ずしもWebDriverの対応バージョンがあるとは限らないので、日々の自動テストを安定して行うには上記の設定が良いと思われます。

# 参考にしたページ
+ http://stackoverflow.com/questions/16352775/org-openqa-selenium-firefox-notconnectedexception-unable-to-connect-to-host-127
MSXMLを使ったExcel VBAがWindows 8.1で動かない時の対処方法

MSXMLを使ったExcel VBAをWindows 8.1で動かしたときに、MSXML2.DOMDocument型の変数の定義のところで「コンパイルエラー: ユーザー定義型は定義されていません」というエラーが出て動かない場合があります。

このエラーは参照設定に「Microsoft XML. v6.0」を追加しているときに起こります。

どうやら互換用のDOMDocumentクラスなどがWindows 8.1のMSXMLから削除されてしまい、v6.0用のDOMDocument60しか残っていないからのようです。

Windows 7のMicrosoft XML. v6.0
![windows7.png](https://qiita-image-store.s3.amazonaws.com/0/42710/3a344413-7d5c-b502-c905-0f4804c89462.png)

Windows 8.1のMicrosoft XML. v6.0
![windows81.png](https://qiita-image-store.s3.amazonaws.com/0/42710/e445b1d1-3cfb-1c96-5a26-b108363c4507.png)

したがって、DOMDocumentをDOMDocument60に書き直すことで動作するようになります。

```vbnet:修正前
Dim doc As MSXML2.DOMDocument
```
```vbnet:修正後
Dim doc As MSXML2.DOMDocument60
```

ちなみに「Microsoft XML. v3.0」の場合には起こりません。
JSでRailsのヘルパーメソッドを限定的に利用するためのgem

Railsではassets:precompileをした時にファイルのハッシュ値をファイル名の末尾に追加してキャッシュ管理を楽にする機能があります。
JSの内部でそれを検知することは基本的にできないため、`.coffee.erb`などという形にしてRailsのヘルパーをerbの形で埋め込んだりします。
しかし、これが氾濫するとlintが使えないしエディタによってはシンタックスハイライトも死ぬし、もしSprocketsを将来的に外したくなった時に非常に邪魔になります。
なので、必要になるにしても局所化したい。できれば余り目に付かない所に押し込めたい。

というわけで、限定的にRailsのヘルパーメソッドっぽいものをJS上に定義するgemを作りました。
名前が思い付かなかったので、単純に [rails_js_helper](https://github.com/joker1007/rails_js_helper "joker1007/rails_js_helper") というgemです。

## 使い方
コンフィグファイルの生成

```sh
$ bundle exec rails g rails_js_helper:config

# And edit config/rails_js_helper.yml
```

コンフィグには利用する画像やcss等のパスを指定する。
この時指定する値は`image_path`等に渡す引数と同じ。
その他共有しておきたい設定値を記述する。

```erb:config/rails_js_helper.yml
images:
  - loading.png
assets:
  - loading.css
configs:
  google_api_key: <%= Rails.application.config.x.google_api_key %>
```

JS内でこんな感じで呼べるようになる。

```coffee
#= require rails_helper

RailsHelper.imagePath("loading.png") # => "/assets/loading.png"
RailsHelper.imageTag("loading.png", width: 120) # => <img src="loading.png" width="120">
RailsHelper.assetPath("users.css") # => /assets/users.css
RailsHelper.pathFor("users", format: "json", foo: "bar") # => "/users.json?foo=bar"
RailsHelper.pathFor("new_users") # => "/users/new"
RailsHelper.routeNames() # show all route names on javascript
RailsHelper.config.google_api_key # => value of `Rails.application.config.x.google_api_key`
```

プリコンパイルされるとちゃんとハッシュ付の値に置き換わる。

名前付きルートのヘルパーは自動的にRailsのルーティング定義から引っ張ってきてヘルパーを定義する。
しかし引数が必要になるセグメント付きのルートはちょっとやそっとじゃ関数化できなさそうだったので対応していない。
なので、例えば`/users/:id`といったルートを生成するヘルパーは定義されないようになっている。
まあ、画像ファイル類はまだしも、名前付きルートのヘルパーをJSで利用するのはあんま良くないと思います。

そして、こういうgemが必要になるのがそもそも大分辛いのだが……。
Windowsのシェル環境としてNYAGOSを使ってみた。

Windows環境での、CMDより強力でUnixライクなコマンドラインツールを模索していたのですが、[こちら](http://qiita.com/kikuchy/items/c47624843e1f5431ee69)の記事でオススメされていたので、導入してみました。

実際に使ってみて嬉しかった点を挙げてみます。

###インストーラを使わずに配置できる
何処に配置しても良いし後で簡単に移動出来るのは助かりますよね。
これはgolangのメリットなのでしょうか。
[こちら](http://qiita.com/suin/items/22662f43b6a6e8728798)で以下のように書かれていますね。

>ビルドすると一つの実行形式バイナリファイルになる! このポータビリティは気持ちいい


###導入済みのGit for Windowsがシームレスに使えた
Git for Windowがインストールされていれば、特別な設定をせずにすぐにgitコマンドが使えました。

###既存の.batスクリプトとUnixコマンドを利用出来る
大きな目的のひとつなので当然ですが、やはり助かります。

###動作が軽快！
msysGitではファイルパスのタブ補完が少し遅かったのですが、NYAGOSではネイティブなシェルに近い速度でタブ補完出来ていると思います。

###ルートがドライブ毎にある
msysGitではドライブレターのさらに上にルートディレクトリがありましたが、NYAGOSはドライブ直下がドライブ毎のルートのようになっているので、CMDから移行しても何の違和感も無いです。

私の言葉で説明出来るのはこのあたりになります。
CMDとUnixシェルが丁度使いやすく融合しているように感じました。
Lua拡張などが出来るらしいのですが、そのあたりはわからないので挑戦していません。笑

お忙しく、試す時間も惜しい方などの参考になれば幸いです。
padding-bottomを使って背景画像の分だけ要素の高さを設定する

```scss
$imagePath:"hoge.png";
.box{
  width: 100%;
  height: 0px;
  $boxWidth:ceil(image-width($imagePath) / 2);
  $boxHeight:ceil(image-height($imagePath) / 2);
  $ratio:$boxHeight / $boxWidth;
  padding-bottom: 100% * $ratio;
  
  background-image: $imagePath;
  background-repeat: no-repeat;
  background-size: cover;
}
```
compassで画像の高さを取得して、縦横比を算出します。heightを0pxにして、padding-bottomで高さを持たせるところがポイントです。
Goでニコニコ生放送のRSSから開場日時や放送開始日時を抽出してみる(型をstringではなくtime.Timeにする版)

以前書いた「[Goでニコニコ生放送のRSSから開場日時や放送開始日時を抽出してみる](http://qiita.com/ryu22e/items/54082ab4aec7c5c2f4e5)」の改良版です。
`xml.Unmarshal`関数に渡す構造体のフィールドの型は通常は`string`しか指定できませんが、こう書けば別の型も使えます。

```go:parsenicoliverss.go
package main

import (
	"encoding/xml"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

// (1)まずtime.Timeを含む構造体を作って
type CustomTime struct {
	time.Time
}

// (2)UnmarshalXMLメソッドを実装する(xml.Unmarshalerインターフェースに定義されているメソッド)
func (c *CustomTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
	var v string
	d.DecodeElement(&v, &start)
	parse, err := time.Parse("2006-01-02 15:04:05 MST", fmt.Sprintf("%s JST", v))
	if err != nil {
		return err
	}
	*c = CustomTime{parse}
	return nil
}

type Item struct {
	XMLName     xml.Name `xml:"item"`
	Title       string   `xml:"title"`
	Description string   `xml:"description"`
	// (3)日時を表すフィールドは上記のCustomTimeを使う
	OpenTime  CustomTime `xml:"http://live.nicovideo.jp/ open_time"`
	StartTime CustomTime `xml:"http://live.nicovideo.jp/ start_time"`
}

type Channel struct {
	XMLName xml.Name `xml:"channel"`
	Title   string   `xml:"title"`
	Items   []Item   `xml:"item"`
}

type Rss struct {
	XMLName xml.Name `xml:"rss"`
	Channel Channel  `xml:"channel"`
}

func main() {
	res, err := http.Get("http://live.nicovideo.jp/rss")
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}

	r := Rss{}
	if err := xml.Unmarshal(body, &r); err != nil {
		panic(err)
	}
	fmt.Printf("RSSタイトル: %s\n", r.Channel.Title)
	fmt.Println("----------")
	for _, v := range r.Channel.Items {
		fmt.Printf("番組タイトル: %s\n", v.Title)
		fmt.Printf("番組説明文: %s\n", v.Description)
		fmt.Printf("開場日時: %s\n", v.OpenTime)
		fmt.Printf("放送開始日時: %s\n", v.StartTime)
		fmt.Println("----------")
	}
}
```

参考: [xml parsing - Golang XML Unmarshal and time.Time fields - Stack Overflow](http://stackoverflow.com/questions/17301149/golang-xml-unmarshal-and-time-time-fields)
atom editor上でwebページが見たい　あわよくばブックマークとかもしたい

テキストエディタの画面を縦に二分割して、半分でコーディングしながらもう半分でブラウザ上の確認なんかができたらいいのにな。
そんな横着者の願いはatom editorで叶うのである。

#準備

- 「web-browser」というパッケージを入れる  
https://atom.io/packages/web-browser
- 「command-toolbar」というパッケージを入れる  
https://atom.io/packages/command-toolbar

##パッケージの入れ方
- 「ctrl」「@」「,」を同時に押下すると設定画面が出てくる

- 左側のメニューの一番下に「Install」という項目があるからそこをクリック
  ※検索窓があるからそこに該当するパッケージ名を入力※右側は必ず「package」を選択しておくこと。

- 検索結果に欲しいパッケージが出てきたら右側の青い「install」というボタンを押す。

# 早速webページを見てみる

- ctrl + alt + b で上部に何か文字を入力する画面が出てくる
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/57635/f1a39990-3b5c-f8b7-a3d7-ea5fc367b5b8.png)

- webページのURLを入力
- 新しいタブが出てきて、入力したURLのページが表示される
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/57635/7d7d4919-289e-7d0d-8491-8e0e47186f3a.png)

# ブックマークするには
ここでcommand-toolbarの登場である。


- ブックマークしたいページのタブを選択
- ctrlを押した状態で画面上部の三本線のアイコンを押す
- 三本線のアイコンの隣に、URLの名前のボタンが出現←これがブックマーク
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/57635/ead2e6f1-767c-e3f8-27b9-f5caa9968038.png)


# ブックマークの名前を変えたい時は
- crtlを押した状態でブックマークのボタンを押すと名前が変更できる。
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/57635/51003b8e-f1f5-982d-3621-54e86cfefcb5.png)
抽象化の能力と限界

少し前に、[今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」](http://blog.sumyapp.com/2013/07/no-recommend-rails/)なんていう、ちょっと過激なタイトルのブログをたまたま見かけましたが、思うところがあったので書き綴ってみます。
#コンピューターの歴史は抽象化の歴史
「70年以上前からコンピューターで（理論上）可能な情報処理の内容は変わっていない」というと、おそらく多くの人は驚くかもしれません。しかし、現在も「コンピューターで処理可能な範囲」と同義となっている[チューリング完全性](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E5%AE%8C%E5%85%A8)という概念が登場したのは、電子計算機が出現するより前の、実に**1930年台**の話です。その後登場した電子計算機は、時を経て劇的な高性能化、小型化、低価格化、入出力の多様化などを遂げるわけではありますが、処理可能なものについてはチューリング完全の範囲を超えるものではありません。

コンピューターの圧倒的な性能向上で、書かれるプログラムの規模がどんどん膨張していき、そして性能に余裕ができたこともあって、プログラムを書く方でも抽象化が進行していきました。初期には機械語で直接プログラムを書いていたのが、それを単語に置き換えたアセンブラとなり、さらには数式をそのままかけるようなプログラム言語が成立して、関数・オブジェクトとより大きな単位で扱えるようになっていく、そんな歴史がプログラミング言語の進化の歴史でした。

# 抽象化の能力
抽象化することによるメリットは、

* 詳細を考えずに実装が可能となる
* コードの再利用が容易となる

ということがあります。OSの上で動く（一般的な）プログラムは、OSに組み込まれたデバイスドライバなどが細かい差異を吸収してくれるので、自分でキーボードやマウスやディスプレイの制御をせずに済み、実装が簡易化されると共に、他の環境でも動くようになります。Javaやスクリプト言語のように、抽象度の高い形態のままでプログラムを頒布すれば、命令セットの異なる環境ですらそのまま動かせることもあります。
# 抽象化の限界
もちろん、抽象化にも限界がありますが、大きなポイントとして2つがあります。

* 抽象化レイヤがカバーできる機能範囲の限界
* 抽象化しきれない部分の存在

## 抽象化レイヤーの限界
森羅万象、あらゆる状況に対応できるシステムなんてものは存在しないわけで、どんな抽象化レイヤーについても、その上では扱いきれない部分が出てきます。こういう場合、OSであればデバイスドライバ、言語処理系であればより抽象化の低い言語で拡張できるような仕組みになっていることが多いですが、適切な拡張がない場合は、「抽象化度合いを下げた世界に入って、自分で何とかする」ほかなくなってしまいます。

また、抽象化レイヤー自体もプログラムですので、バグがあるようなこともあります。そういう場合も、バグを回避する、レイヤー側に手を入れるというように、抽象化しきれない部分となってしまいます。

## チューリングモデルの限界
上では明言していませんでしたが、チューリング完全というのは資源（メモリ、実行時間…）の消費については**なんら考慮していません**。そういうわけで、完全性が保証される機能面と違って、実行速度やメモリ消費といった資源を適切に配分しようと思えば、下のレイヤに関する知識が往々にして必要となります。例えば、純粋に理論的に考えると、データベースにインデックスがどう付いていようと検索は可能なわけですが、大きなテーブルで実用的な性能を得るには適切なインデックスの構築が欠かせません。

# 言語内レイヤーについて
冒頭で出てきたRuby on RailsやCakePHP、そしてjQueryなどのように、あるプログラミング言語で書かれたフレームワークというものもあります。これらはよく使う処理について典型的な処理を実装してくれるなど、もちろん使いやすいものではあります。ただ、

* 純粋にフレームワークだけでできないことも多い
* 性能面を考えるには、フレームワークの中身まで知っておかないと身動きが取りづらい
* その言語で書かれているので、中身を読むこともできる

ということで、使っていくうちに中身を調べて、徐々に理解した上で使っていくのが、理想的な態度かもしれません。
Ninety-Nine Scala Problems奮闘記1

# P1: Find the last element of a list.
## Unit???
どうにかIntelliJを設定，プロジェクトを作成して，mainメソッドを作ったら出てきた．
なんだこれ，と思ったら戻り値を返さないよ，って意味なんですね…．
## class? object?
入門ページをいくつか見ていると，(Javaでお馴染みの)classを定義しているページと，classの代わりに「object」を定義しているページがある…．ので調べたら

- classはnewキーワードでインスタンス化できる。変数、定数、メソッドを持つ。
- objectはシングルトンオブジェクト。Javaでいうstaticで、インスタンス化できないこと以外はclassと同様に使用できる。

とのことでした．

## 再帰プログラミング

ぜんぜんわかりませんでした．再帰っていうより，Scalaのパターンマッチングがわかってないのかなぁ…．

参考
[S-99: Ninety-Nine Scala Problems](http://aperiodic.net/phil/scala/s-99/)
[基本的なパターンマッチとScalaで重要な“関数” ](http://www.atmarkit.co.jp/ait/articles/1204/05/news126.html)
【作業効率化】CSSのクラスがどのファイルで使われているかgrepコマンドで検索する

CSSのクラスがどのファイルで使用されているか、クラスを修正する影響範囲などを調べたいときにgrepコマンドで検索しています。

# 使い方
`-R`オプションを付けることで、ディレクトリにあるファイルを全て検索されます。

```bash:grepコマンドでクラスを探そう
grep "検索したいクラス名" -R "検索したいファイルがあるディレクトリ"
```

例としてheadlineクラスがどのビューファイルで使用されているか検索してみます。

```bash:grepコマンドでheadlineクラスを探す
grep "headline" -R /var/www/pugiemonn/app/views/
```
viewsディレクトリに置いてある、headlineという文字列が存在するファイルが表示されました。

検索が早くなると作業が早くなったり、HTMLやCSSの影響範囲がわかって便利です(☝ ՞ਊ ՞)

# おまけ
検索と合わせて <a href="http://qiita.com/pugiemonn/items/20bfc77ffe672323bb04" >perlのコマンドでファイル内の文字列を一括置換しました。 - Qiita</a> のような一括置換をすると非常に効果的です。