OmniAICreator/Qiita-1.07M huggingface dataset:
[Heroku] 特定の時間帯にDynoを起動させておくためのワンライナー (Heroku Scheduler用)


Herokuで```1サービス1Dyno```でサービスを公開している場合、一定時間アクセスがないとDynoがidle状態になり、次回アクセス時にDynoの起動時間分の時間がかかります。

それを回避するために[HerokuのDynoが寝ないようにする](http://qiita.com/hanachin_/items/2f88f6079af0b35ed5e3)のように定期的(```Hourly```)にHeroku Schedulerから起こしてあげるという対策をしていることが多いかと思います。

ただ、Herokuで(1サービス1Dynoの)サービスを２個以上公開している場合には、すべてのサービスを常時起動しておくと無料枠(750時間)を超えることになります。

そこで、```常時アクセスがあるわけではなく```て、できれば無料枠(750時間)内に、もしくはできるだけ安価に収めたい場合は、Heroku Schedulerで下記のような感じで```(確実に)起動させておきたい時間帯を指定して```Dynoを起こしてあげるようにするのが良さそうです。

Heroku Schedulerの```FREQUENCY```は```Hourly```で、```TASK```に


```sh
# 9:00 - 21:00 JST (= 0:00 - 12:00 UTC) の間、起動しておきたい場合
$ seq 0 12 | grep -qw $((10#`date -u "+%H"`)) && curl http://xxxx.herokuapp.com > /dev/null 2>&1
```

```sh
# 6:00 - 18:00 JST (= 21:00 - 9:00 UTC) の間、起動しておきたい場合
$ (seq 21 23; seq 0 9) | grep -qw $((10#`date -u "+%H"`)) && curl http://xxxx.herokuapp.com > /dev/null 2>&1
```
mac OSX の PhpStorm で覚えるべき最小限のキーボードショートカット(jis,日本語キーボード)

# mac OSX の PhpStorm で覚えるべき最小限のキーボードショートカット

あまり多くのキーボードショートカットを覚えるのは大変！

なので、**最低限これだけ覚えたら、あとはなんとかなるカモ！？**という個人的なメモ。

とりあえず、

1. コード書いて
2. ターミナルから操作して
3. Git などの VCS にコミット出来る

までを全部キーボードからやる為に覚えておいて損は無い(と思う)キーボードショートカットを選んでみました。

また、"なんでも検索である" `cmd + shift + A` で表示されるメニューのキーボードショートカットは US キーボドで書いてあるので、JIS キーボード配列で書いています。

(Shift 無しで @ 書ける jis キーボードいいよね！)

## 1. プロジェクトビュー と エディター の行き来

(デフォルトのままであれば)画面の左側に表示されているツリー状にファイル一覧が表示されている領域が**プロジェクトビュー**です。

同じく、画面の右側でコードを書く領域が**エディター**です。

※ 名称が間違っていたらごめんなさい。

### **プロジェクトビュー** に移動したい時

```
cmd + 1
```

プロジェクトビュー内で、上下キーや後述するコンテキストメニューを表示して Git 操作なり検索なりを行えます。

### **エディター** に移動したい時

```
esc
```

**プロジェクトビュー** にフォーカスがある状態から **エディター** にフォーカスを移したい時に使います。

PhpStorm はコードを書くのがメインの役目です。書くためのツールです。`esc` を押すとエディターに戻るというのは当然の振る舞いですね。(Terminal など、一部 `esc` が特殊な役割を担っているケース以外は、 `esc` でエディターに戻ります。)

## 2. エディター のタブの左右移動

エディターで複数のタブを開いた時に、左右に移動して編集対象のファイルまで移動する時に使うキーボードショートカットです。

エディターにフォーカスがある状態で有効です。

**右隣のタブへ** 移動する

```
cmd + shift + [
```

※ US キーボード配列の場合は `cmd + shif + ]` です。

**左隣のタブへ** 移動する

```
cmd + shift + @
```

※ US キーボード配列の場合は `cmd + shif + [` です。

### ショーカットのカスタマイズしても良いかも

Chrome などでは、`cmd + option(alt) + 左右キー` でタブ移動が可能ですね。

と、いうわけで、それらに合うようにカスタマイズするのもアリかも知れませんね。

(ちなにみ、同左コマンドはデフォルトでは、開いた(フォーカスを与えた)履歴の行き来をするショートカットです。)

## 3. Terminal の表示と非表示

composer とか test 実行とか、まぁ諸々やっぱり Terminal 使うのが便利なことが多いです。

そんな時にウィンドウを切り替えずとも IDE 内で完結するのが PhpStorm のちょっと嬉しいところ。

そんなわけで、(デフォルトの状態なら)画面下部に存在しているバーの `Terminal` をクリックすると表示されるウィンドウを切り替える方法です。

```
option(alt) + F12
```

## 4. Find in Path (対象のディレクトリ,ファイルの中を文字列検索)を表示

検索。ディレクトリ内やファイルなど、何かと文字列検索する機会があるかと思います。

**プロジェクトビュー** にフォーカスがある場合は、選択対象のディレクトリ/ファイルを対象とし、**エディター** などにフォーカスがある場合は、プロジェクト全体を対象とします。

```
cmd + shift + F
```

多くの場合は、検索対象のディレクトリやファイルがある程度は決まっていると思うため、 `cmd + 1` でプロジェクトビューに移動して、対象を選択した後に `cmd + shift + F` とするような使い道になるのかなと。

## 5. コンテキストメニュー(右クリックで表示されるやつ)を表示する方法(と言うか、操作に関するなんでも検索)

百聞は一見にしかず。という、強力なコマンドです。

```
cmd + shift + A
```

主に、 Git などの VCS にコミットするシーンを想定して例を書きます。

例えば、プロジェクトビューにフォーカスがあり、ディレクトリを選択している状態で、 Git commit したいとします。

あるディレクトリを選択状態として、`cmd + shift + A` を押すと、インクリメンタルサーチのダイアログが出てくるので、 `git` と入力し、最上部に表示されている `Git` を選択します。

これで、選択対象に対する Git での操作が右クリックした時同様に表示されます。

あとは、良しなに選択して操作すればOKです！

`git` でインクリメンタルサーチを行ったように、色々なビューで `cmd + shift + A` を行って、右クリック代わりの動作を行うことが可能です。

また、ビューに関係なく、操作に関しては基本的に何でも検索して、フローティングメニューとして表示してくれるコマンドが `cmd + shift + A` です。

とにかく、 "IDE なら出来るやろ？" という、操作がありそうであれば、 `cmd + shift + A` を呼び出してみるのが大切です。

## 6. エディターの開いているファイルを閉じる

これは、多くのアプリケーションと同じで、 `cmd + w` で閉じます。

IDE 自体が閉じることは無いので、遠慮なく使いましょう。

## 7. その他

PhpStorm かなり便利で、色いろあるのですが、ひとまず、コード書くに於いて、覚えなくても良いけど、知ってると実は少し便利みたいなショートカットも書いてみます。

- `cmd + w` で、フォーカスされているビューを閉じます。
- `fn + 上下左右` でエディターなら終端や先頭、プロジェクトビューなら、PageUp, PageDown 的な動作
- エディターにて `cmd + shift + 左右キー` でキャレット位置からの行頭, 行末まで選択
- エディターにて `cmd + 左右キー` でキャレット位置からの行頭, 行末まで移動
- エディターにて `option(alt) + 上下キー` で、文字列選択 → ブロック選択 → 行選択(任意位置のキャレットから`option+上キー`連続でここまで到達, 下キーの場合は、一段段階前の選択まで戻る動作)

他にも Run, Structual Seachr(cmd + shift + S) とか色々あるんですが、整理できてないので、、、気が向いた時に。

-----

間違いなどあったらツッコミよろしくお願いいたします。。。
Xcodeで選択範囲内のみで置き換えを実行する方法

オプションキーを押すと検索/置き換えバーの「All」の部分が「All in Selection」に変化します。
ちなみに矩形選択状態では駄目で、通常の選択状態でないとうまく働かないようです。

![searchbar.png](https://qiita-image-store.s3.amazonaws.com/0/3603/ee17877b-b7f0-1ad9-5c2c-4ef3d2ea7746.png)

残念ながらショートカットキーで実行する方法は見つけられませんでした。
About stdio.h header in C++


C++におけるstdio.hヘッダについて

I wondered why I can use cstdio API with including **only iostream**.

iostreamをインクルードしただけでcstdioが使用可能になる点について疑問に思ったので調べてみました。

## OSX (BSD)

I browsed c++ headers and found following path:

```clang++-6.0
iostream -> ostream -> ios -> iosfwd -> wchar.h -> stdio.h
```

```llvm-g++-4.2
iostream -> ostream -> ios -> iosfwd -> bits/c++io.h -> cstdio -> stdio.h
```

```g++-mp-4.8
iostream -> ostream -> ios -> iosfwd -> bits/postypes.h -> cwchar -> wchar.h -> stdio.h
```

Also I have found this very interesting path:

```clang++-6.0
queue -> vector -> memory -> iterator -> iosfwd
```

```llvm-g++-4.2
queue -> vector -> bits/stl_algobase.h -> iosfwd
iterator -> ostream
```

```g++-mp-4.8
iterator -> ostream
```

So, including `iostream`, `ios` or `iterator` is enough for stdio...

## Linux (glibc)
Since glibc's stdio.h is guarded, the path is little bit different.

glibcのstdio.hはガードされているので、経路は少し異なります。

```g++
# 3.3
iostream -> ostream -> ios -> iosfwd -> bits/fpos.h -> bits/c++io.h -> cstdio -> stdio.h
# 3.4,4.1,4.2
iostream -> ostream -> ios -> iosfwd -> bits/c++io.h -> cstdio -> stdio.h
# 4.3
iostream -> ostream -> ios -> bits/char_traits.h -> cstdio -> stdio.h
```

The path `iosfwd -> bits/c++io.h` and `bits/char_traits.h -> cstdio` has disappeared from g++ 4.4.
**That's why we need to include cstdio separately.**

 `iosfwd -> bits/c++io.h`および`bits/char_traits.h -> cstdio`の経路はg++ 4.4でなくなりました。
**このためcstdioを別途インクルードしなければならないのです。**

On the other hand,

```clang++_-stdlib=libc++
iostream -> ostream -> ios -> __locale -> string -> cstdio -> stdio.h
```

this path is available (also on OSX). Really funny...
上記経路はLinuxにもOSXにも存在します。

## Digression
以下余談。

### MinGW

```
iostream -> ostream -> ios -> bits/localefwd.h -> bits/c++locale.h -> clocale -> locale.h -> stdio.h
```

wchar.h does not include stdio.h, but locale.h does...

### Android NDK
stdio.h exists in include-fixed and it is not guarded, so the path of g++-mp-4.8 should be available. Confirmed with 4.4.3.

### newlib
So firm, the implementation looks the wisest.
しっかりした作り。一番賢い実装な感じ。
Railsでリスト系の記述をスマートにi18n対応させる。

この間思いついたRailsでのi18n対応の方法をメモメモ。
どこぞにもっと良い方法があるかもしれないが、わりかしスマートで応用効くんじゃなかろうか。

##やりたいこと
- テキストの記述メインのページで、YAML内の日本語テキストを適切な箇所で改行（及びリスト化・段落分け・その他加工等）したい。
- ja.ymlファイルにはHTMLを含みたくない。
- viewファイルからいくつも`t("〜")`を呼び出してviewを汚したくない。

##YAMLについての予備知識

- 通常YAMLで使用する`new:`などの記述はYAMLのハッシュである。
- 配列としても`- array`のようにハイフンで記述できる。
- 勿論配列の中に配列を入れることが可能。

詳しくは下記参照
[プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML プログラマーのための YAML 入門 (初級編))


##YAMLの配列の配列を利用してループ表示するソース
###Viewに対応するYAMLファイルを下記のように記述。

```yaml:config/locales/views/members/registrations/ja.yml
ja: # ja.ymlのファイル
  members:
    registrations:
      new: # app/views/members/registrations/new.hamlに対応するview用YAML
        story:
          -
            - "序章"
            -
              - "ごにょごにょ"
          -
            - "１章"
            -
              - "１．いちばんめ。"
              - "２．にばんめ。"
          -
            - "２章"
            -
              - "おわり"
```

**＊ポイント**

- `story:`で配列の配列を呼び出している。
- 配列の配列の中に本文の配列がある。

上記の記述で次のような配列が出来る。

[ ["序章",["ごにょごにょ"]] , ["１章",["１．いちばんめ。","２．にばんめ"]] , ["２章",["おわり"]] ]

###Viewファイル（HAML）からループで呼び出し

```haml:app/views/members/registrations/new.html.haml"
- t(".story").each do |title, texts|
  %h3=title
  - texts.each do |text|
    %p=text
    %hr
```

**＊ポイント**

- パスに対応したymlで記述しているので`t(".story")`で呼び出せる。
- `t(".story")`は配列が返ってくるのでそのまま`.each`が使える。
- 配列の配列として`texts`を取り出して本文をリストとしてバラしている。

※HTML(ERB)での記述が嫌なのでHAMLを使用していますが同様に出来ます。

##ブラウザ出力HTMLイメージ

```html:HTML
<h3>序章</h3>
<p>ごにょごにょ</p>
<hr>
<h3>１章</h3>
<p>１．いちばんめ。</p>
<p>２．にばんめ。</p>
<hr>
<h3>２章</h3>
<p>おわり</p>
<hr>
```

文章量の多い『規約』だとかの文章で、ずらずら並べるときに有用かと思います。
一部だけ配列じゃなくてハッシュだったりになっているとエラーになりますのでお気をつけて下さい。
ymlファイル自体も読やすくなる気がするので、良ければお試し下さい。
メタファーで理解するSwift -Nil Coalescing Operator-


私は"Nil Coalescing Operator"について説明するときに、マリー・アントワネットのメタファーを使う。

Nil Coalescing Operator は、
`(a ?? b)`と書き、`a != nil ? a! : b` のSyntaxSugarであるとされる。

Sugarと言えば砂糖。砂糖といえばお菓子。

かの有名なセリフは以下のコードで表すことが出来る。

```swift
var bread :Food?
let cake  :Food = Food(name: "brioche")
(bread ?? cake).eat() // パンが無ければお菓子を食べればいいじゃない！
```

#蛇足
ちなみに個人的にはこの糖衣構文はやり過ぎではないかと思う。
ScalaのOption型の`getOrElse(defaultValue)`の方が可読性の面で良い気がする。

Objective-Cは[]が多すぎてひかれる言語、Swiftは記号（!、?）が多すぎてひかれる言語、なんてことにならねば良いのだが。
[iOS] Auto Layout を使いこなす。UITableViewCell と UIScrollView 編

`UITableView` と `UIScrollView` を *Auto Layout* の中で仲良くやるにはどうしたらいいのかまとめました。

ざっと書いて内容の精査もしてないですが、誰かの参考になれば。

あとは、同じようなことを、もっと上手くやる方法を知っている人が入ればコメントいただけると幸いです。

http://hamasyou.com/blog/2014/10/09/ios-autolayout-scrollview-tablecell/

![SS1.png](https://qiita-image-store.s3.amazonaws.com/0/10475/ee9e9b54-47c2-a8d1-05cd-1798dea30401.png)
![SS4.png](https://qiita-image-store.s3.amazonaws.com/0/10475/38647f27-8ae4-6cbf-9922-1d3a044d3050.png)
![SS10.png](https://qiita-image-store.s3.amazonaws.com/0/10475/06ea1ea8-b772-1eec-2f8e-b1cfd34a1a3f.png)
![SS9.png](https://qiita-image-store.s3.amazonaws.com/0/10475/b9d385db-b651-7143-e684-31cbd6177070.png)
英語リスニングのトレーニングに使えるテック業界著名人の英文書き起こし付き音声一覧

|人物|音声(動画)|書き起こし|
|---|---|---|
|Steve Jobs|https://www.youtube.com/watch?v=UF8uR6Z6KLc|http://news.stanford.edu/news/2005/june15/jobs-061505.html|
|Tom Preston-Werner|http://www.infoq.com/interviews/preston-werner-powerset-github-ruby|http://www.infoq.com/interviews/preston-werner-powerset-github-ruby|
|Tom Preston-Werner|http://www.sitepoint.com/podcast-107-social-coding-with-githubs-tom-preston-werner/|http://www.sitepoint.com/podcast-107-social-coding-with-githubs-tom-preston-werner/|
|Chris Wanstrath|http://www.infoq.com/interviews/wanstrath-github|http://www.infoq.com/interviews/wanstrath-github|
|Chris Wanstrath|http://drt.fm/chris-wanstrath/|http://drt.fm/chris-wanstrath/#!/transcript|
|David Heinemeier Hansson|https://www.youtube.com/watch?v=Wp_tTfoCXYg|http://www.ugtastic.com/david-heinemeier-hansson/|
|David Heinemeier Hansson|http://bigthink.com/videos/big-think-interview-with-david-heinemeier-hansson|http://bigthink.com/videos/big-think-interview-with-david-heinemeier-hansson|
|David Heinemeier Hansson|http://news.oreilly.com/2008/08/interview-with-david-heinemeie.html|http://news.oreilly.com/2008/08/interview-with-david-heinemeie.html|
|David Heinemeier Hansson|http://drt.fm/david-heinemeier-hansson/|http://drt.fm/david-heinemeier-hansson/#!/transcript|
|Aaron Patterson|http://www.infoq.com/interviews/patterson-ruby-performance|http://www.infoq.com/interviews/patterson-ruby-performance|
|Aaron Patterson|http://rubyrogues.com/081-rr-rails-4-with-aaron-patterson/|http://rubyrogues.com/081-rr-rails-4-with-aaron-patterson/|
|Mark Zuckerberg|https://www.youtube.com/watch?v=0onciIB-ZJA|http://www.singjupost.com/facebooks-ceo-mark-zuckerberg-f8-2014-keynote-full-transcript/|
|Mark Zuckerberg|http://www.monstersandcritics.com/today-mark-zuckerberg-full-interview-transcript-clips/|http://www.monstersandcritics.com/today-mark-zuckerberg-full-interview-transcript-clips/|
|Jack Dorsey|http://new.livestream.com/techonomy/Detroit2012/videos/3778620|http://techonomy.com/wp-content/uploads/2013/03/Jack-Dorsey.pdf|
|Drew Houston|https://www.youtube.com/watch?v=6inri5ggyK4|http://www.networkworld.com/article/2167075/infrastructure-management/dropbox-ceo-drew-houston-s-2013-mit-commencement-address-transcript.html|
|Drew Houston|http://ismallbusiness.com/drew-houston-finding-way-entrepreneur/|http://ismallbusiness.com/drew-houston-finding-way-entrepreneur/|
Ruby | 日付フォルダ生成用 CLI ツール defoker gem に月次,年次フォルダへの移動機能を追加 (ver 0.0.7) #ruby #defoker

# Ruby | 日付フォルダ生成用 CLI ツール defoker gem に月次,年次フォルダへの移動機能を追加 (ver 0.0.7) #ruby #defoker
## 概要
日付フォルダ生成用 CLI ツール defoker gem に月次,年次フォルダへの移動機能を追加します。

## defoker gem って何？という方は

まずはこちらを御覧ください。  

* [Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した](http://qiita.com/tbpgr/items/64bbb45e08a94a721b98)

## 追加仕様の想定されるユースケース
例えば、 `defoker today` で日時のフォルダを複数作成していたとします。
そして、月が変わったので `defoker previous_month` で先月のフォルダを作って、
defoker today で作成したフォルダを全て `defoker previous_month` で作成した
フォルダに移動したいとします。

こういった場合に、 `defoker mv_month` を利用します。
YYYYMMDD_somename フォーマットのフォルダを、月が一致する月次フォルダに移動します。

### 月をまたぐ前

~~~bash
# at 20141006
$ defoker today -a hige
# at 20141007
$ defoker today -a hige
# at 20141008
$ defoker today -a hige
#
# 各フォルダ内では手動で様々な作業がおこなわれている
#
$ tree
┣ 20141006_hige
┣ 20141007_hoge
┗ 20141008_hage
~~~

### 月をまたいだ後

~~~bash
$ defoker mv_month
$ tree
┗ 201410
   ┣ 06_hige
   ┣ 07_hoge
   ┗ 08_hage
~~~

### 複数月をまたいでいたケースや、日付フォーマット以外のフォルダも存在する場合

* mv_month 実行前

~~~bash
$ tree
┣ 20141006_hige
┣ 20141007_hoge
┣ 20141106_hige
┣ 20141107_hoge
┣ 20141206_hige
┣ 20141207_hoge
┣ 20150106_hige
┣ 20150107_hoge
┗ invalid_folder
~~~

* mv_month 実行後

~~~bash
$ tree
┣ 201410
┃   ┣ 06_hige
┃   ┗ 07_hoge
┣ 201411
┃   ┣ 06_hige
┃   ┗ 07_hoge
┣ 201412
┃   ┣ 06_hige
┃   ┗ 07_hoge
┣ 201501
┃   ┣ 06_hige
┃   ┗ 07_hoge
┗ invalid_folder
~~~

## 追加仕様
* `defoker mv_month` を追加する
* `defoker mv_month` を実行すると YYYYMMDD_somename のフォルダを該当月のフォルダに移動する。月次のフォルダがなければ作成する。
* `defoker mv_year` を追加する
* `defoker mv_year` を実行すると YYYYMM_somename のフォルダを該当年のフォルダに移動する。年次のフォルダがなければ作成する。

## `defoker mv_month` `mv_year` を試してみる
仕様は、「追加仕様の想定されるユースケース」の「複数月をまたいでいたケース」をそのまま利用します

### 試行

~~~bash
# 動作確認用ディレクトリを作成
$ mkdir 20141006_hige
$ mkdir 20141007_hoge
$ mkdir 20141106_hige
$ mkdir 20141107_hoge
$ mkdir 20141206_hige
$ mkdir 20141207_hoge
$ mkdir 20150106_hige
$ mkdir 20150107_hoge
$ mkdir invalid_folder
$ 
$ defoker mv_month
$ tree
┣ 201410
┃   ┣ 06_hige
┃   ┗ 07_hoge
┣ 201411
┃   ┣ 06_hige
┃   ┗ 07_hoge
┣ 201412
┃   ┣ 06_hige
┃   ┗ 07_hoge
┣ 201501
┃   ┣ 06_hige
┃   ┗ 07_hoge
┗ invalid_folder
$
$ defoker mv_year
┣ 2014
┃  ┣ 10
┃  ┃   ┣ 06_hige
┃  ┃   ┗ 07_hoge
┃  ┣ 11
┃  ┃   ┣ 06_hige
┃  ┃   ┗ 07_hoge
┃  ┗ 12
┃  　   ┣ 06_hige
┃  　   ┗ 07_hoge
┣ 2015
┃  ┗ 01
┃       ┣ 06_hige
┃       ┗ 07_hoge
┗ invalid_folder
~~~

## 参照
* [Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した](http://qiita.com/tbpgr/items/64bbb45e08a94a721b98)
* [Defoker GitHub](https://github.com/tbpgr/defoker)
* [Defoker Rubygems](http://rubygems.org/gems/defoker)
clojureでwin32apiを叩く

忌まわしきWin32Apiでグローバルフックをしたくなったのでメモ

# 参考
というかソースコードはもろパクリになるので、以下のページ参照。
http://cx20.main.jp/blog/hello/2013/01/11/hello-win32-api-clojure-world/

project.cljだけを記載。

```clj:project.clj
(defproject global-hook-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.clojars.roti/swt-win32-win32-x86_64 "4.4"]])
```
Auto LayoutでViewを等間隔に並べる記事読んでもわからない人向けの説明


# 前置き

最近Auto Layoutの記事をよく目にする事が多いのですが、Viewを等間隔に並べる記事はすんなりと理解できなかったため、自分がサンプルコードを動かしたりして理解していった内容を書いてみます。

きっかけになった記事：「実践 Auto Layout」
http://blog.jarinosuke.com/entry/auto-layout-best-practice

サンプルが超絶参考になった：「Cocoaの日々 - Autolayoutでビューを等間隔に並べる」
http://cocoadays.blogspot.jp/2014/01/autolayout_7.html

公式リファレンスにもある（英語）
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample.html

Auto Layout ガイド（日本語pdf）
https://developer.apple.com/jp/devcenter/ios/library/documentation/AutolayoutPG.pdf

# Viewを等間隔に並べる？

Viewを等間隔に並べるというのは、例えば画面の幅や高さが変わった際、それに従って複数の位置関係が等間隔になるということです。

しかし、Viewを等間隔に並べるだけであれば実際はAuto Layoutを使わなくても出来ます。幅もしくは高さを測ってそれぞれの数で割ったりすれば等間隔な長さがわかるのでその値を使えば良くて、自分が思いつくもっと楽な方法がすぐにあるせいで学習意欲が高まらないというのがAuto Layoutよくわからん問題の要因かもしれないなと感じました。

根本的にAuto Layout覚えること多すぎというのもあって、もうそれはしょうがない。

# Viewを等間隔に並べるサンプルでAuto Layoutの基礎が分かる

実はViewを等間隔に並べる説明は、実際の要件としてはあまり無いパターンだし先述のように計算すればAuto Layoutを使わなくてもい。ただこれのやり方がわかるとAuto Layoutでやらなければいけない時の基礎が出来るって感じでいいと思います。

# サンプルを開く

「Cocoaの日々 - Autolayoutでビューを等間隔に並べる」でのサンプルコードをGitHubにPushされてるのでこれが分かりやすいです
https://github.com/xcatsan/iOS7-Sample

![スクリーンショット 2014-10-09 0.16.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/16400/8c9e0499-7d7b-88cd-3a98-ddff8c05ed63.jpeg "スクリーンショット 2014-10-09 0.16.22.jpg")

XcodeのStoryboardプレビューで画面回転のプレビューを表示（わざわざシミュレータで実行してると面倒）

![スクリーンショット 2014-10-09 0.21.41.jpg](https://qiita-image-store.s3.amazonaws.com/0/16400/47273b87-8a83-dc26-1c2e-249ad0ea4b92.jpeg "スクリーンショット 2014-10-09 0.21.41.jpg")

## Viewを配置し制約を付ける手順は次の通り

- 等間隔にしたい緑のViewを並べていき縦横幅の制約を付ける
- スペーサーにしたい黄色とオレンジのViewを並べていく（実際このViewは透明にして使う）
- 緑のViewとスペーサーの間隔を決める
 - 一番左のスペーサーViewを選択し"Controlキーを押しながら"一番右の緑のViewを選択するとプルダウンでHorizontal Spacingが選択でき値を決められる
 - 同じように右のHorizontal Spacingを決める
 - これをスペーサーの数繰り返す
- スペーサーViewの幅が同じになるようにする
 - スペーサーView自体を選択し、また"Controlキーを押しながら"他のスペーサーViewを選択するとEqual Widthsで2つのViewの関係性をEqualとして選ぶ。

## 手順としてやらないことは次の通り

- スペーサーViewの横幅制約は付けない（制約を付けないと警告が出るようなイメージがあるが警告は出ない）
	- 他のスペーサーView同士で横幅が同じになるような制約は付ける

## やってもやらなくても大したことではないことは次の通り

- 緑のViewを水平方向に揃える（緑のViewの親に対して水平）


# サンプルから体感できる知識まとめ

このサンプルから得られる知識をまとめると下記のようになります。

- Controlキーを押しながらViewを選択することによって階層が親子関係なViewでの制約ではなく兄弟関係の制約を簡単に付けられる
- スペーサーViewの横幅制約はなくても問題ない（警告は出ない）
- 2つのViewの横幅が同じようにする制約がある
 - スペーサーView1とスペーサーView2を同じ
 - スペーサーView1とスペーサーView3を同じにすることでスペーサーの幅はすべて同じになる

等間隔にするのにAuto Layoutより良い方法があるため理解の妨げになってしょうがなかったのですが、Auto Layoutの便利さと手順がわかったのではないかと思いますがどうでしょうか。
VMware player で共有フォルダ設定の仕方

win7 上にUbuntu(正確にはLubuntu)をVMware player を使って入れました。

win7とUbuntu間でファイルのやりとりとかできると便利なので、共有フォルダの設定を有効にしました。
設定方法はこのブログが分かりやすいです。他にもググればたくさん出てきます。
http://d.hatena.ne.jp/jin_kojima/20130204/1359958785

参考ページ通りに設定したので、/mnt/hgfs/ に指定したフォルダが出現するはずでした。

、、、しかし
出ませんでした。

vmware-install.pl をよく見ながら実行すると以下のようなメッセージが出てました。

> If you wish to have the shared folders feature, you can install the driver by 
running vmware-config-tools.pl again after making sure that gcc, binutils, make
and the kernel sources for your running kernel are installed on your machine. 
These packages are available on your distribution's installation CD.
[ Press Enter key to continue ]

調べてみると、以下のコマンドを実行すれば良いっとのこと。

```sudo apt-get install build-essential```

参考：http://ubuntuforums.org/showthread.php?t=1930898

実際にbuild-essentialをインストールした後にvmware-toolsをインストールし直すと
共有フォルダが使えるようになっていました。

めでたしめでたし。
Elixir Protocols

# Elixir Protocols

## 概要
Elixir の Protocols について。

Protocols は Elixir のポリモーフィズムの手段です。
Protocol の作成は `defprotocol`
Protocol の実装は `defimpl`
で行います。

## お題
Elixir では nil と false だけが falsy です。
真偽の判定において、要素が空かどうかは頻出かつ重要です。

### サンプルコード

~~~elixir
defmodule Person do
  defstruct name: 'unknown', age: 0
end

defprotocol Blank do
  @doc "Returns true if data is considered blank/empty"
  def blank?(data)
end

defimpl Blank, for: Integer do
  def blank?(_), do: false
end

defimpl Blank, for: List do
  def blank?([]), do: true
  def blank?(_),  do: false
end

defimpl Blank, for: Map do
  def blank?(map), do: map_size(map) == 0
end

defimpl Blank, for: Person do
  def blank?(%Person{name: 'unknown', age: 0}), do: true
  def blank?(_), do: false
end

defmodule Hoge do
  require Person

  def hoge do
    default_person = %Person{}
    tanaka = %Person{name: 'tanaka', age: 24}
  
    IO.inspect Blank.blank?(%{})
    IO.inspect Blank.blank?(default_person)
    IO.inspect Blank.blank?(tanaka)
  end
end

IO.inspect Blank.blank?(0)
IO.inspect Blank.blank?(1)
IO.inspect Blank.blank?([])
IO.inspect Blank.blank?([1])
Hoge.hoge
~~~

### 出力

~~~bash
false
false
true
false
true
true
false
~~~

## 組み込み protocols

Enumerable を利用してみます
http://elixir-lang.org/docs/stable/elixir/Enumerable.html

### サンプルコード

~~~
defmodule Person do
  defstruct name: 'unknown', age: 0
end

defmodule People do
  require Person
  defstruct people: [%Person{}]
end

defimpl Enumerable, for: People do
  def count(collection) do
    Enum.count(collection.people)
  end

  def member?(collection, value) do
    Enum.member?(collection.people, value)
  end

  def reduce(collection, acc, fun) do
    Enum.reduce(collection.people, acc, fun)
  end
end

defmodule Hoge do
  require Person
  require People
  require List

  def hoge do
    default_person = %Person{}
    tanaka = %Person{name: 'tanaka', age: 24}
    sato = %Person{name: 'sato', age: 23}
    suzuki = %Person{name: 'suzuki', age: 33}
    people = %People{people:  [default_person, tanaka, sato]}
    
    IO.inspect Enumerable.count(people)
    IO.inspect Enumerable.member?(people, sato)
    IO.inspect Enumerable.member?(people, suzuki)
    IO.inspect Enumerable.reduce(people, 0, fn(x, acc) -> x.age + acc end )
    Enum.each people, &IO.inspect(&1)
  end
end

Hoge.hoge
~~~

### 出力

~~~
3
true
false
47
%Person{age: 0, name: 'unknown'}
%Person{age: 24, name: 'tanaka'}
%Person{age: 23, name: 'sato'}
~~~

## 参照
* http://elixir-lang.org/docs/stable/elixir/Kernel.html#defimpl/3
* http://elixir-lang.org/docs/stable/elixir/Kernel.html#defprotocol/2
* http://elixir-lang.org/docs/stable/elixir/Enum.html
* http://elixir-lang.org/docs/stable/elixir/Enumerable.html
* http://elixir-lang.org/getting_started/16.html
Ruby | Object#send から Object#send を呼んで BasicObject#__send__ を呼んでみる（特に意味はない）

# Ruby | Object#send から Object#send を呼んで BasicObject#\_\_send\_\_ を呼んでみる（特に意味はない）

## 概要
Object#send から Object#send を呼んで BasicObject#\_\_send\_\_ を呼んでみます（特に意味はない）

## サンプルコード
~~~ruby
class Hoge
  def public_hoge(msg)
    return "public_hoge #{msg}" unless block_given?
    yield(msg)
  end

  protected

  def protected_hoge(msg)
    return "protected_hoge #{msg}" unless block_given?
    yield(msg)
  end

  private

  def private_hoge(msg)
    return "private_hoge #{msg}" unless block_given?
    yield(msg)
  end
end

hoge = Hoge.new
puts hoge.send(:send, :__send__, :public_hoge, 'ほげ')
puts hoge.send(:send, :__send__, :protected_hoge, 'ほげ')
puts hoge.send(:send, :__send__, :private_hoge, 'ほげ')
~~~

## 出力

問題なく動作します

~~~
public_hoge ほげ
protected_hoge ほげ
private_hoge ほげ
~~~

## 番外編
Override した send を \_\_send\_\_ から呼んでみます。

### コード

~~~ruby
class Hoge
  def send(msg)
    return "send #{msg}" unless block_given?
    yield(msg)
  end
end

hoge = Hoge.new
puts hoge.method(:send).owner
puts hoge.method(:__send__).owner
puts hoge.__send__(:send, 'ほげ')
puts hoge.__send__(:send, 'ほげ') { |msg|"send #{msg*2}" }
~~~

### 出力
当たり前ですが、正常に動作します

~~~
Hoge
BasicObject
send ほげ
send ほげほげ
~~~

## 参照
http://docs.ruby-lang.org/ja/2.1.0/method/Object/i/send.html
Vagrant でMAC Address を変更したら、sshできなくなる問題対処

## 問題

VirtualBox で MAC Addressを変更したら、LinuxなゲストOSに vagrant ssh ができなくなる問題

## 対策

以下の2つを行う

1. eth0 インターフェイスのMAC Addressを変更する
2. udev が MAC Address <-> IP address の対応表を持っているので、変更 or 削除する

## 解決手順

以下、CentOS 6.xの場合

### 1. eth0 の MAC Address を変更

* 変更したMAC Addressをメモ
* /etc/sysconfig/network-scripts/ifcfg-eth0 (CentOS 6以前の場合)の MAC address を変更
* ifconfig して eth0 が認識されるかを確認する


service network restart すると、以下のエラーになるかも。
なので、udevの対策をする

```
device eth0 does not seem to be present, delaying initialization
 ```

### 2. udev の設定を変更

以下のどちらかをゲストOS上で実行

```
% sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

```
% sudo rm /etc/udev/rules.d/70-persistent-net.rules
```

そして、ホストOS側でvagrantで再起動

```
% vagrant halt
% vagrant up
```

## そもそも、MAC Address <-> IP Address 対応させない方法

```
% sudo sed -i -e 's|/etc/udev/rules.d/70-persistent-net.rules|/dev/null|g' /lib/udev/write_net_rules
```

## ゲストOSに入れない?

vagrant ssh できないから、ゲストOS側の作業できない! と思った方
vagrant でなく、Virtual BoxからゲストOS起動して、コンソールから、root でログインする。(デフォルトパスワードは、vagrant)

## sshの設定を見る

以下の設定の場合、最初のインターフェイスが、NATで設定されている、はず。

```
% vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/shimo/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

## 参考

* [[VirtualBox 4.3] 複製したゲストOS (CentOS) がネットワークに繋がらない: Device eth0 does not seem to be present, delaying initialization が表示された際の対応 - Qiita](http://qiita.com/tsumekoara/items/964182390a08b678d576)
* [Vagrant | saito's memo](http://memo.saitodev.com/home/vagrant/#id2)
journalctlの基本的な動作

Fedoraのデフォルト設定では`systemd-journald`は`/var/log/journal`以下にログ(ジャーナル)を保存する。`journalctl`はその下にあるファイルを読み出すだけである。

実際には`/var/log/journal`の直下には128bitのmachine-idを名前にもつディレクトリがあり、そのディレクトリの中にジャーナルが保存されている。machine-idは`/etc/machine-id`の中に書かれているので、ジャーナルは`/var/log/journal/$(cat /etc/machine-id)/`の下にある。こんな感じ。

```shell-session
$ ls -1 /var/log/journal/$(cat /etc/machine-id)/
system.journal
user-1000.journal
```

このあたりの処理は`journalctl`自体ではなくて[sd_journal_open](http://www.freedesktop.org/software/systemd/man/sd_journal_open.html)というAPIがやってくれている。`journalctl`はそのAPIを呼ぶだけ。

上記例では、2つのファイルが保存されているが、ファイル名から推測できる通り、それぞれシステムログとユーザ毎のログである。デフォルトでは(権限があれば)、`journalctl`では両方のログが混ざったものが表示される。`--system`か`--user`オプションをつければどちらかだけを見ることもできる。(`--user`ならば一般ユーザも自分のログを見ることができる、わけではないらしい。)
mocha で co な非同期テストケースを使う


coは戻り値として`function (done) { ... }`みたいな関数("thunk")を返すので、コールバックを受け取る関数だと非同期になるmochaと組み合わせてこのようにシンプルに書けるようだ。
(作者が同じ [visionmedia 氏](https://github.com/visionmedia/)なので、考慮に入れられているっぽい？)

```javascript
it('should do something', co(function *() {
  ...
  actual = yield doSomething();
  assert.equal(expected, actual);
  ...
}));
```
Postgresでまとめて複数のカラムをupdateをする方法


### postgresのfrom句

* postgresにはfromlistというものがある。
* 下の例のようにaccountsのtableの条件からwhere要素やselect要素の値を変更することができる

```
UPDATE
  employees
SET
  sales_count = sales_count + 1
FROM
  accounts
WHERE
  accounts.name = 'Acme Corporation'
AND
  employees.id = accounts.sales_person;
```

### sqlの中にテンポラリのデータテーブルを作って利用する

```
select * from (SELECT unnest(ARRAY['a','b']) as a, unnest(ARRAY[2,3]) as b) AS t;
```
 a | b 
---+---
 a | 2
 b | 3
(2 rows)

### テンポラリのテーブルを埋め込んで更新するとかどうだろう
* 上の二つを応用したら、updateを同時に行うことがpostgresでできる。

```
UPDATE
  employees
SET
  sales_count = sales_count + 1
FROM
  select * from (SELECT unnest(ARRAY['a','b']) as name, unnest(ARRAY[2,3]) as sales_person) AS accounts;
WHERE
  accounts.name = 'Acme Corporation'
AND
  employees.id = accounts.sales_person;
```

### 参考
* from句の説明 https://www.postgresql.jp/document/8.0/html/sql-update.html
* https://www.postgresql.jp/document/9.1/html/functions-array.html
ログインシェルとインタラクティブモードの話

bashやzshの初期化ファイルについて調べているとよく出てくるのですが、
いまいち意味が分からなかったためまとめてみました。

※覚書レベルなので間違っているかもしれません。

##シェル変数と環境変数

###シェル変数
子プロセスにコピーが渡されない変数（exportしない変数）のこと。
補足：エイリアスも子プロセスにコピーが渡されない

エイリアスは子プロセス(./test.sh)に引き継がれないので以下はエラーとなる。

```bash:hoge.sh
#!/bin/bash

echo `hoge`
```

```bash
$ alias hoge='ls'
$ bash hoge.sh
./test.sh: line 3: hoge: コマンドが見つかりません

```

※"rc"ファイルに`alias hoge="ls"`を定義していても、非インタラクティブシェルなのでエラーとなる。

###環境変数
子プロセスにコピーが渡される変数（exportする変数）のこと。

```bash
$ echo $TEST

$ export TEST=${TEST}hoge
$ echo $TEST
hoge
```

↓ 子プロセスを起動する。

```bash
$ bash
$ echo $TEST
hoge
$ export TEST=${TEST}hoge
$ echo $TEST
hogehoge
```

↓ 子プロセスを停止する。

```bash
$ exit
$ echo $TEST
hoge
$ export TEST=${TEST}hoge
$ echo $TEST
hogehoge
```

##ログインシェル

"/bin/bash"や"/bin/zsh"のオプションに"--login"を指定して起動した場合や、
suコマンドやsshコマンドの第一引数に"-"を指定して起動したシェルのこと（sshコマンドはデフォルトで第一引数に"-"が指定される）

ログインしたときに自動的にログインシェルが起動するが、
恐らく"/etc/passwd"ファイルからログインシェルを取得して"${シェルのパス} --login"みたいなことをしているんだろう（未確認）

また、ログインシェルとして起動しているかを確認したいなら`ps auxf`を実行すればいい（もっといい方法あると思う）
ログインシェルとして起動していれば"-${シェル名}"と表示される。

###初期化ファイル

ログインシェルを起動すると、初期化ファイルとして"profile"ファイルが呼び出される。
実際にはもっといろいろなファイルが呼び出されるが、ディストリビューションやシェルによってまちまちなので省略する。

suコマンドで管理者になるときに一般ユーザの環境変数を引き継いでしまうので、
suコマンドは第一引数に"-"を指定して起動するのが通例（"profile"が呼び出されるため、環境変数が初期化される）

```bash
$ su -
```

##インタラクティブモード

インタラクティブシェルと書かれている記事を見ることが多いが、
ログインシェルと同じ階層に見えるため、
インタラクティブモードと書いたほうが分かりやすい気がする。

interactive：対話式の，双方向の

引数を指定せず起動したモードのこと。ユーザの入力に対して出力をする。ようするにプロンプトのこと。
ログインシェルは自動的にインタラクティブモードになる（ログインしたときにプロンプトが出る）

```bash:インタラクティブモードで起動
$ bash
$ /bin/zsh
```

```bash:非インタラクティブモードで起動
$ bash test.sh
$ ./test.sh
```

###初期化ファイル

インタラクティブモードを起動すると、初期化ファイルとして"rc"ファイルが呼び出される。

##参考URL
http://kanonji.info/blog/2013/06/20/bash%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B7%E3%82%A7%E3%83%AB/
ファイルの存在チェック

#簡易的なファイルの存在チェック

Linux GNU C（glibc）

Linuxのファイル名はディレクトリが持っているためディレクトリの内容を調べる。

diropen() して 帰ってくる ディレクトリ・ストリームを readdir() に投げる。
dirent 構造体のメンバにiノード番号などの情報も入っているが、
メンバ変数 d_name を調べればいけるようだ。

注：ほとんどメモ書き。実用はキビシイ。

> <i>char d_name[256] </i>


```c

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>

enum { SUCCESS };

int main()
{
	DIR *d = opendir("dir_name");
	struct dirent *dp;

	switch(errno) {
		case EACCES :
			fprintf(stderr, "Permission Denied\n");
			return errno;
		case ENOTDIR :
			fprintf(stderr, "Not a Directory\n");
			return errno;
		case SUCCESS:
			break;
	}
	char name[] = "file_name";

	while( (dp = readdir(d)) != NULL) {
		if(*(dp->d_name) == *file_name) {
			printf("file already exist\n");
		}
	}
	return 0;
}

```

追記
errnoに対応するメッセージを出力する関数にperror関数があったので
こっちでエラーメッセージは吐いた方がよかった。

> <stdio.h>
> void perror(const char* s)

引数sがヌルポインタ、空文字列ではない場合、
errornoに対応するメッセージ *s を出力。
ddskk の mode の絶對的な切り換へ

ddskk でひらがな・カタカナ・英字を toggle ではなく絶對的に切り換へられるやうにした．
init.el 等に以下のやうに記せばよい．肝は，
・カタカナ mode, 英字 mode はそれぞれ skk-katakana, skk-latin-mode といふ變數が t になつてゐる状態と定義できる．
・ひらがな mode は單一の變數では定義できず，skk-j-mode が t かつ skk-katakana が nil の状態と定義される．
の2點．
私は dvorak 排列を使つてゐるので，keybind に登用した o, e, u は左手の home position にある．

```elisp:init.el
(defun skk-hiragana-set nil
  (interactive)
  (cond (skk-katakana
	 (skk-toggle-kana nil))
	(t
	 (skk-kakutei))))

(defun skk-katakana-set nil
  (interactive)
  (cond (skk-katakana
	 (lambda))
	(skk-j-mode
	 (skk-toggle-kana nil))
	(skk-latin-mode
	 (dolist (skk-kakutei (skk-toggle-kana nil))))))

(global-unset-key (kbd "C-o"))

(global-set-key (kbd "C-o o") 'skk-hiragana-set)
(global-set-key (kbd "C-o e") 'skk-katakana-set)
(global-set-key (kbd "C-o u") 'skk-latin-mode)
```
Nokogiriで簡単なWebスクレイピング

##Webスクレイピングってなんぞや？
WebのHTMLのデータを抽出することです。
あるサイトのH1のテキストだけを抽出したり、社員紹介の名前だけを抽出したり、画像を抽出したりと様々な用途があります。

##Nokogiriってなんぞや？
Webスクレイピングでよく使われるRubyライブラリです。
イメージとしては、HTMLの構造を解析し、特定の要素をノコギリばりに切り出してくれます。

##1. Nokogiriをインストール
まず、Nokogiriをインストールします。
`gem install nokogiri`

##2. 松岡修造名言まとめサイトから名言を取得
まず、松岡修造名言まとめサイトにアクセスし、名言がそのサイトのHTMLのどの階層に格納されているのかを確認します。
![スクリーンショット 2014-10-08 20.53.30.png](https://qiita-image-store.s3.amazonaws.com/0/39342/94ee1035-db5d-db86-22e7-ae2cc17bd440.png "スクリーンショット 2014-10-08 20.53.30.png")

どうやら名言たちはpreタグに囲まれているみたいです。

そして、`shuzo_meigen.rb`を作成します。（ファイル名は自由です。）

```ruby:shuzo_meigen.rb
require 'open-uri' #URLにアクセスする為のライブラリを読み込みます。
require 'nokogiri' #Nokogiriライブラリを読み込みます。

url = 'http://curazy.com/archives/6493'#切り出すURLを指定します。

charset = nil
html = open(url) do |f|
  charset = f.charset #文字種別を取得します。
  f.read ＃htmlを読み込み変数htmlに渡します。
end

page = Nokogiri::HTML.parse(html, nil, charset)　#htmlを解析し、オブジェクト化

shuzo_meigen = page.search('pre')　#名言は<pre>タグに囲まれているので、<pre>タグを指定します。

p shuzo_meigen.text　#shuzo_meigenで取得したデータをテキストに変換
```

##3.ターミナルで叩いてみる。
`ruby suzo_meigen.rb`を叩いてみましょう。
以下のように取得できましたでしょうか？

```
"じゃんけんの必勝法は、強く握り締めたグーを出すことダメダメダメ!諦めたら!\r\n 周りのこと思えよ、応援してる人たちのこと思ってみろって!\r\n あともうちょっとのところなんだから!気にすんなよ！くよくよすんなよ！大丈夫、どうにかなるって！ドントウォーリー！ビーハッピー！やがて僕のレベルも知らず知らずに上がっていった。なぜなら、僕が戦う相手は、いつも自分より強かったからである一所懸命生きていれば、不思議なことに疲れない100回叩くと壊れる壁があったとする。\r\n (以下省略)・・・・
```

このように取得できていれば成功です。

##まとめ
NokogiriでWebスクレイピングをする為に必要最低限すべきことは以下の通りです。
・スクレイピングするサイトのHTML構造を把握
・Nokogiriをインストール
・rubyスクリプトを作成
・ターミナルで実行

今回はスクレイピングのみですが、これをバッチ処理等で実行することで、ニュースサイトなどの更新頻度の高いサイトの新着ニュースや人気記事などを定期的に取得することが可能になります。

Railsで簡単なバッチ処理をしたい方は、下記リンクを参考にしてみてください。
・[Wheneverを使って簡単にバッチ処理をする。]
(http://qiita.com/seiya1121/items/2afddfd1efdb7cc60d24)
[iOS8]UIModalPresentationCurrentContextで透過できなくなった件&解決法

iOS8にしてからUIModalPresentationCurrentContextで背景を透過できなくなっていました。

## これまで
背景透過ってかっこいいですよね！
たまに無性に使いたくなるときとかあると思います。
そんなとき、以下のような感じで実装しているのではないでしょうか？
これだとiOS8になったときに一切背景を透過させず、真っ暗になってしましました。。

```objc:AnyViewController
// vcというViewControllerを透過して,今のViewを透かして見せたいとき
vc.view.frame = CGRectMake(0.0, 0.0, screen.size.width, screen.size.height);
vc.view.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.7];
    
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];
```

## iOS8で背景を透過するには
iOS8でも背景を透過させるためにはUIModalPresentationOverCurrentContextを使います。
以下のように1行だけ変えれば透過させることができます。

```objc:AnyViewController
// vcというViewControllerを透過して,今のViewを透かして見せたいとき
vc.view.frame = CGRectMake(0.0, 0.0, screen.size.width, screen.size.height);
vc.view.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.7];
 
// ここを変更！   
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:vc animated:NO completion:nil];
```

## 注意
ちなみに、このように変更するとiOS8以前のもので背景が透過できなくなってしまいました。
みんなiOS8にしろやーってのもありですが、ユーザーのためにどちらのOSでも透過できるようにしてあげるのが良いと思います。

OSを調べるには[[UIDevice currentDevice].systemVersion floatValue]を使います。

これを使うと、背景透過のiOS8対応は以下のようになります。

```objc:AnyViewController
// vcというViewControllerを透過して,今のViewを透かして見せたいとき
vc.view.frame = CGRectMake(0.0, 0.0, screen.size.width, screen.size.height);
vc.view.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.7];

// iOS8とそれ以外で分岐
if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
     self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
} else {
     vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
}
[self presentViewController:vc animated:NO completion:nil];
```


iOSのメジャーアップデートは大きな変更はアナウンスされるものの、このような小さな変更は何も言われないので困りますね。他にも何か見つけたらアップしたいと思います。
Swift が気になる Java エンジニア向けのメモ


# はじめに
しばらく Android やっていましたが、最近 Swift 始めました。Java との比較をつらつらと書きますので、参考になれば幸いです。

個人用のメモであり、網羅的に書いているわけではありませんのでご了承ください。誤り等あればご指摘いただけると嬉しいです。

## 用語、キーワード
だいたいこんな感じの対比でしょうか。

|Swift|Java|
|----|----|
|プロパティ|フィールド|
|プロトコル|インタフェース|
|type|static|
|self|this|
|nil|null|

## 型宣言
### Java

```java
final String message1 = "Hello";
String message2 = "Hello";
String message3;
```

### Swift

```swift
let message1 = "Hello"
var message2 = "Hello" // var message2 : String = "Hello" でもOK
var message3 : String // 宣言時に初期化しない場合は型を指定する
```

## for
### Java

```java
int[] numbers = {100, 200, 300};
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
  sum += numbers[i];
}
```

または

```java
int[] numbers = {100, 200, 300};
int sum = 0;
for (int number : numbers) {
  sum += number;
}
```

### Swift

```swift
var numbers = [100, 200, 300]
var sum = 0
for var i = 0; i < numbers.count; i++ {
  sum += numbers[i]
}
```

または

```swift
var numbers = [100, 200, 300]
var sum = 0
for i in 0..<numbers.count {
  sum += numbers[i]
}
```

または

```swift
var numbers = [100, 200, 300]
var sum = 0
for number in numbers {
  sum += number
}
```


## Switch

### Java
Swift は Java でいう break は不要。ただし、何もしない場合は break が必要。

```java
switch (num) {
case 0:
    message = "case 0";
    break;
case 1:
case 2:
case 3:
    message = "case 1 or 2 or 3";
    break;
default:
    break;
}
```

### Swift

```swift
switch num {
case 0:
    message = "case 0"
case 1, 2, 3:
    message = "case 1 or 2 or 3"
default:
    break
}
```

または

```swift
switch num {
case 0:
    message = "case 0"
case 1...3:
    message = "case 1 or 2 or 3"
default:
    break
}
```



## 配列
Java の ArrayList 相当の内容です（可変でない配列は let を指定する）。Java の対比コードは割愛します。

### Swift

```swift
var animals = [String]()
animals += ["犬"] // 要素の追加 ["犬"]
animals += ["猫", "馬"] // 要素の追加 ["犬", "猫", "馬"]
animals.append("牛") // 要素の追加 ["犬", "猫", "馬", "牛"]
animals.removeAtIndex(0) // 指定箇所の要素の削除 ["猫", "馬", "牛"]
animals.insert("犬", atIndex: 0) // 位置を指定して要素を追加 ["犬", "猫", "馬", "牛"]
animals[1...2] = ["馬", "猫"] // 複数の要素を変更 ["犬", "馬", "猫", "牛"]
```


## 連想配列
### Java

```java
HashMap<String,String> fruits = new HashMap<String,String>();
fruits.put("apple", "りんご");
...
String fruit = fruits.get("apple");
```

### Swift

```swift
var fruits: Dictionary<String, String>
fruits["apple"] = "りんご"
...
var fruit = fruits["apple"]
```


## ダウンキャスト
### Java

```java
Object object = "message";
String message = (String) object;
```

### Swift

```swift
var object : Any = "message"
var message = object as String
```

## メソッド
注）swift は var キーワードがない場合 let として扱うため、引数に変更を加える場合は var キーワードをつける

### Java

```java
int countUp(int number) {
    return number + 1;
}
```

### Swift

```swift
func countUp(number : Int) -> Int {
    return number + 1
}
```

## 継承
### Java

```java
class Dog extends Animal {
}
```

### Swift

```swift
class Dog: Animal {
}
```
herokuで日本時間を使用する


まずは現在の時刻を確認。

```bash
#herokuサーバ内に接続してbashを使う
$ heroku run bash
Running `bash` attached to terminal... up, run.9742

#現在時刻を確認
~ $ date
Wed Oct  8 11:38:22 UTC 2014 #UTC!!!
```

上記の例だとUTCだったので日本時間(JST)に直す。

```
$ heroku config:add TZ=Asia/Tokyo
Setting config vars and restarting hoge... done, v26
TZ: Asia/Tokyo
```

もう一度確認すると直っているはずです。

```bash
#herokuサーバ内に接続してbashを使う
$ heroku run bash
Running `bash` attached to terminal... up, run.9742

#現在時刻を確認
~ $ date
Wed Oct  8 20:37:45 JST 2014 #日本時間！！
```
jQuery.ajaxの代わりにSuperAgentを使う


![superagent.png](https://qiita-image-store.s3.amazonaws.com/0/32596/a67902a9-363e-849f-9e0b-75376a8cbd24.png "superagent.png")


#脱jQuery

AngularJSやVue.jsでは、DOMの直接操作は推奨されません。

そうなると、jQueryはAJAXでしか使わなくなります。
であれば、AJAX専用のライブラリにまかせてしまって、jQuery依存を外したくなってきます。

というわけで、AJAXだけをやってくれるライブラリとして、SuperAgentを導入してみましょう。

#SuperAgent

HTTPリクエストに特化したライブラリです。
Node.jsとブラウザ両方で使うことができます。

https://github.com/visionmedia/superagent

作者はExpress, Stylusの開発などで有名なTJです。

#superagentの良さ

![superagent](https://camo.githubusercontent.com/68f7ce7628691f14fe5f0a7b586dd7705771dadf/687474703a2f2f662e636c2e6c792f6974656d732f33643238326e33413068305a304b3277307132612f53637265656e73686f742e706e67)

かわいい。

#ブラウザでの導入方法

まず、下記URLにアクセスし、ファイル名`superagent.js`として名前をつけて保存してください。
https://wzrd.in/standalone/superagent@latest


scriptタグで`superagent.js`をHTMLにロードした後、以下のコードを挿入します。

```js
var request = window.superagent;
```

#Node.jsでの導入方法

普通にrequireすればよいです。

```js
var request = require('superagent');
```


#GET

一番拡張性の高い、メソッドチェーンで書きます。

##素直なGET


```js
request
  .get(url)
  .end(function(err, res){
    console.log(res.text);//レスポンス
    //レスポンスがJSONの場合 
    console.log(res.body);//ここにparse済みのオブジェクトが入る
  });

```


クエリパラメータ付きGET

```js
request
  .get(url)
  .query({user: "Taro"})
  .end(function(err, res){
    console.log(res.body);
  });

```

もし、チェーンするスタイルがお好みでなければ、下記のようにも書けます。

```js
request
  .get(url, function(err, res){
    if (err) throw err;
    console.log(res.text);
  })
```


#POST

##単純なPOST

```js
request
  .post(url)
  .send({name: name, text: text})
  .end(function(err, res){
    console.log(res.body);
  });

```

##x-www-form-urlencoded

```js
request
  .post(url)
  .type('form')
  .send({name: name, text: text})
  .end(function(err, res){
    console.log(res.body);
  });

```

#その他

PUT, DELETEももちろん出来ます。

##PUT
```js
request
  .put(url)
  .end(function(err, res){
    // ...
  });

```

##DELETE
```js
request
  .del(url)
  .end(function(err, res){
    // ...
  });
```

#サンプル

以上のコードの動作チェックは、下記リポジトリで行っております。不具合等ありましたら、プルリクエストをお願い致します。
https://github.com/hashrock-sandbox/superagent-example

#参考資料

http://smalljs.org/ajax/superagent/

#もう一つの選択肢「Fetch API」

SuperAgentは便利ですが、今後のWeb標準化（Extensible Web）の展開を考えると、
whatwgで議論されている「Fetch API」を使うといいかもしれません。

Fetch APIについては下記サイトが詳しいです。

[Fetch API 解説、または Web において "Fetch する" とは何か？ - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/whatwg-fetch)

Fetch APIは策定中ですが、polyfillが提供されているため、
現在でもSuperAgentと同様に利用することが出来ます。

https://github.com/github/fetch

例えば、GETであれば下記のように利用します。

```js
require("whatwg-fetch");
fetch(url)
    .then(function(res){
        return res.text();
    }).then(function(text){
        console.log(text);
    });
```

## 追記：Fetch API利用時の注意点

Fetch APIを使う時には「cookieを自動で送信しない」という点に注意が必要です。詳しくは下記ドキュメントを参照してください。

https://github.com/github/fetch#sending-cookies

## 追記：さらにその他の選択肢

Promiseベースの[axios](https://github.com/mzabriskie/axios)というライブラリが話題になることが増えてきました。詳しくは下記記事を参照してください。

[superagentとaxiosの使い分け - Qiita](http://qiita.com/nekobato/items/0cd3ed1742310f74653c)
続：ブロック図生成ツール blockdiagを導入してみました

# ■はじめに
[前回](http://qiita.com/mitzi2funk/items/0a9e84ee1cf4b241524b "ブロック図生成ツール blockdiagを導入してみました")、CentOS6.5にブロック図生成ツールblockdiagを導入しました。

今回は、webサーバ経由で利用した際のTipsを記載します。

# ■前提
※前提1: webサーバはapache
※前提2: apacheよりphpが使える状態となっていること

# ■概要
・スクリプト上にblockdiagコマンドを定義した場合、「apache」ユーザ/グループで実行されることを考慮

・ブロック図生成先にapacheユーザ or グループの書き込み権限を付与する必要あり

・blockdiagコマンド実行時、apacheユーザで実行されるため明示的にフォントを指定する必要あり

## ■出力先ディレクトリ
デフォルトのdocumentrootより

```bash
# mkdir /var/www/html/data
# chown .apache /var/www/html/data
```

## ■サンプルスクリプト

```bash
# vi /var/www/html/index.php
--------------------
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>BlockDiag Online</h1>
<form action='index.php' method='post'>
<textarea name='text' cols='120' rows='20'>
blockdiag admin {
   // Set M17N text using label property.
   A [label = "起"];
   B [label = "承"];
   C [label = "転"];
   D [label = "結"];

   A -> B -> C -> D;

   // Use M17N text directly (need to quote).
   春 -> 夏 -> 秋 -> 冬;

   // Use M17N text including symbol characters (need to quote).
   "春は 曙" -> "夏 = 夜" -> "秋.夕暮れ" -> "冬 & つとめて";
}
</textarea>
<hr />
<input type='submit' value='変換' />
</form>

<?php
  if (isset($_POST['text'])){
    // パスなどを定義
    $dir = "data/";
    $font = "/usr/share/fonts/ipa-gothic/ipag.ttf";
    $filename = sprintf("svg%04d",mt_rand(0,9999));
    $fd = sprintf("./{$dir}%s.diag",$filename);
    $ff = sprintf("./{$dir}%s.svg" ,$filename);
    $text = $_POST['text'];
    
    // block図を作成
    file_put_contents($fd,$text);
    
    // blockdiagコマンド実行
    $command = sprintf("blockdiag -f {$font} -Tsvg %s",$ft);
    $Err = `$command`;
    printf("command: %s<br />",$command);
    print "<hr />";
    
    if (file_exists($ff)) {
      echo "$ff が存在します<br />";
      printf("ff: %s<br />",$ff);
      print "<img src=\"{$ff}\" />";
    } else {
      echo "<span style='color:#ff0000;'>$ff は存在しません。生成に失敗しているようです<br />";
      echo "成功すると以下のようなSVGファイルが生成されます</span><br />";
      print "<img src=\"/cp_root/nippon.svg\" />";
    }
  }
?>
</body>
</html>
```

### 実行権限付与

```bash
# chmod 755 /var/www/html/index.php
```

## ■ブラウザより実行
http://example.com/index.php

![20141008_blockdiag_sample01.png](https://qiita-image-store.s3.amazonaws.com/0/50310/6fa32f12-1603-a239-2b26-50f6611f015b.png)

***

### ▽変換結果
![20141008_blockdiag_sample02.png](https://qiita-image-store.s3.amazonaws.com/0/50310/e837dcae-1e24-e9cf-85f6-6669ac3bdecc.png)

## ■生成ファイルを確認

```bash
# ls -l /var/www/html/data/svg5038.svg
-rw-r--r-- 1 apache apache 7465 10月  8 20:04 2014 /var/www/html/data/svg5038.svg
```


少しは実際の利用用途に役立つ内容になったかと思います。

以上になります。
アプリからSettingsのアプリに入ること

**アプリの中で、アプリからSettingsのアプリに入ることができるかもしれない。
この機能について、少し捜査しました。**


1.iOS 5.0 - iOS 5.0.1 ができる：

```objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];
```
　http://stackoverflow.com/questions/9092142/ios-uialertview-button-to-go-to-setting-app

2.iOS 6 - iOS 7 ができないです、でも InAppSettingKit というlibがあります：

    http://inappsettingskit.com/
    
    http://www.alexcurylo.com/blog/2011/11/04/settings-urls/

3.iOS 8 ができる、でもSystemのSettingsじゃなくて、アプリのSettingsです：

```objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
```
古いiOSでシュミレーターを動かしたいとき

iOSアプリの開発をしていて、昔は思った通りに動いていたのに今は動かない箇所を発見！
OSのせいかなと思って調べてみようとしたら昔のOSでシュミレーターを動かせない。
どうしたらいいんだーと思ったらすごい簡単にできたのでメモ。
もしかしたら常識かもしれないけど初めて知った。。

## 古いOSのシュミレーターをインストール

Xcode>Preferences>Downloadsにいけば昔のOSのシュミレーターがインストールできる。

![スクリーンショット 2014-10-08 20.21.32.png](https://qiita-image-store.s3.amazonaws.com/0/42932/7fd4e8de-dc7d-bbbe-67e9-ff9fdee61368.png)

## 古いOSで動かす

シュミレーターを選ぶところを選択すると、OSが書かれている！

![スクリーンショット 2014-10-08 20.25.07.png](https://qiita-image-store.s3.amazonaws.com/0/42932/937d1d77-5a0f-679d-e96f-f495de22cfe5.png)
HTML×CSSでアコーディオンを作る

#JavaScript無しでアコーディオンを実装

※Chromeのみでしか動作確認していません。

メニュー部分には、radioボタンを使用し**:checked**と**隣接セレクタ**でアコーディオンの中身を表示非表示しています。
アニメーションを工夫次第で少し使えるようになるかも。

http://codepen.io/jtksk/pen/ryvuo
Git で過去の Commit に一時的に戻り、作業後、また最新のCommitを復活させる

Mercurial だと　`hg update -r チェンジセットID` で済むんだが、Git ではどうすればいいんだろう。

ググったところ、`git checkout コミット名` でいいらしい。

ただ、そのままやると、`git log`で最近のコミットが見えなくなってしまうので、焦る焦る焦る焦る焦る焦る、お前ら焦らないか、俺は焦った。
(いや、一応 bitbucket にバックアップは取っているが、最新Commitについては自信がなかったのだ)

だが、実は一時的な無名ブランチが作られて、そっちへ切り替わっているだけのようだ。

```
$ git branch
* (detached from 5624b10)
  master
```

`git checkout master` したら、この一時ブランチも消えて、元に戻った。

```
$ git branch
* master
```
Vagrantで毎回known_hostsを書き換えなくて済む方法

Vagrantを使っていると、違うboxで立ち上げるたびに `~/.ssh/known_hosts` の書き換えをしないといけないのが面倒なので、`~/.ssh/config` をたとえばこんなふうにする。

```
Host 192.168.33.*
  User vagrant
  IdentityFile /Users/xxxx/.vagrant.d/insecure_private_key
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
```

IPアドレスとホストキーが合ってるかチェックしない、で、接続後のIPとキーの書き込みでは `/dev/null` に捨てちゃう。

調子に乗ってAWSのEIPで同じことやってしまうと、それはちょっとやりすぎかもなので注意。
Mac OSX で Unity のHTTP-Proxy を設定する方法

調べたけど、微妙に正答がなかったので。
Unity4.5.0  OSX10.8.5 で確認。

Charles等でHTTPプロキシを使って、UnityEngine.WWWクラス/WWWFormクラスの送信内容確認したいなーという用途に。

ターミナルを起動して、export コマンドで環境変数を入れる必要があります。

### プロキシ設定方法
`sudo vim /etc/launchd.conf` として、次の内容を記述する。

```shell-session
setenv https_proxy http://127.0.0.1:8888
setenv http_proxy http://127.0.0.1:8888
```

記述後、再起動。再起動しないと反映されない。
　
### プロキシ解除方法
上記の内容を消せばOK。
あと再起動。


### よく見つかる嘘

検索で引っかかるけど動かない。
* **HTTP_PROXY** (大文字)
* **HTTP_proxy** (HTTPだけ大文字)
* `export https_proxy=http://127.0.0.1:8888` （Linuxは良いがOSXだと動かない）
* `~/.MacOSX/enviroment.plist` で設定(山ライオン:OS10.8 以降は動かない）


大文字なやつは古いバージョン用？Windows用？
とりあえず、これらで環境変数を設定しても、OSXではプロキシを認識しなかったり、環境変数が設定できなかったりする。
dittoのMakeFileを変更してみた

## 経緯
Markdownでローカル向けのドキュメント作りたいなーと思っていたら、 Github Pages 向けの [ditto](https://github.com/chutsu/ditto/) が生成してくれるWebPageが気に入った。

けれども現時点で `make` すると、ローカルのHTTPDとかにそのまま置いておける状態のWebPageのファイルは出力してくれない。

もちろん、cloneしたリポジトリごと置いておけばイナフ！だし、調整したいのは生成(コピー）されるファイルのフォルダ階層とかの単純な問題なんだけど、気分的にMakeFileの手直しをやってみた。

## 方法

### MakeFile の書き換え

```mf:MakeFile
Default:
	@echo "targets:"
	@echo "  - version: make a new ditto version"
	@echo "  - run_server: run local http server"

update_latest:
	mkdir -p ver/latest; \
	cp css/* ver/latest/css; \
	cp js/* ver/latestjs; \
	cp -R docs/* ver/docs/; \
	cp *.md ver/latest; \
	cp index.html ver/latest;  \
	sed 's/VER/'latest'/g' ver/latest/index.html; \

version: update_latest
	@read -p "enter new version name: " new_version; \
	mkdir -p ver; \
	mkdir ver/$$new_version; \
	mkdir ver/$$new_version/css; \
	mkdir ver/$$new_version/js; \
	mkdir ver/$$new_version/docs; \
	cp css/* ver/$$new_version/css; \
	cp js/* ver/$$new_version/js; \
	cp -R docs/* ver/$$new_version/docs; \
	cp *.md ver/$$new_version; \
	cp index.html ver/$$new_version; \
	sed 's/VER/'$$new_version'/g' ver/$$new_version/index.html; \
	echo "done :)"

run_server:
	python -m SimpleHTTPServer
```

### 実行

```
$ make version
```

バージョン名を入力しろと言われるので、入力する（例: new_version）。

すると ver/new_version にファイルが生成されるので、これを丸ごとどこかのサーバのhttpdのディレクトリに配置すればよい。