OmniAICreator/Qiita-1.07M huggingface dataset:
Chrome40でNPAPIが無効になる件

#はじめに
web系のサービスを提供しているのですが、
先日（2015/1/23の朝）、新verのChrome（ver40）でFlash出ないじゃんかよ、って指摘があって
震えながら調べた結果をシェアします。

＃ここに西野○ナの震え画像をいれたいけど著作権的に

#まとめ
* デフォルトではPPAPIオンになるので、故意でオフにしない限りFlash表示不可になることはない。
* 特異な環境／理由で設定を変えていた場合、Flash表示枠内でなにも出ず、Pluginエラーが出る。   
そこでオンにすると、同ドメイン内でのFlash再生が許可されるので、次からはFlashが表示される。
* 今回の変更で、NPAPIだけオンになっていると、Plugin判定ではenableにしつつブラウザ上では   
Pluginエラーを出すようにして、PPAPI利用を促す意図がある（と思われる）。



#調査
###前提
chrome://plugins　で見てみると、
ChromeにはFlashのプラグインが二つ入っている。

* タイプ：PPAPI（プロセス外）→Google Chromeに付属されているFlashプラグイン
* タイプ：NPAPI　→ネットスケープ社製のプラグイン

###詳細

＃Flashが出ない時は、代替でイメージ画像を出すようにしている
＃なんかonとoffの文字色指定ができなかった。。　みにくくてすんません

| PPAPI | NPAPI | Flash表示 | Plugin判定 | 注意点 |
|:-------------------:|:-------------------:|:-----------------------------|:-------------------|:-------------------|
| on | on | 表示                                   | plugin -enable      |                           |
| on| off | 表示                                   | plugin -enable      |                            |
| off| on | 表示しない<br>※Pluginエラーがでる  | plugin -enable       | 意図的にNPAPIオンにしても<br>内部的に動かない  |
| off| off | 表示しない<br>※代替イメージ表示                 | plugin -disable  |                             |

なお、Chromeを削除して再インストールしたら、どっちもオンになっている。
当然表示はされる。

* 調査コマンド   
http://uupaa.hatenablog.com/entry/2013/09/24/153602   
ここを参考にした。

###考察
* Pluginオンオフ的なうまい判定が出来ない。   
ファイル名を取る感じでやれば細かく判定できそうだが、ファイル名が変わったら手間なのでどうかな。   
安定的な利用はおススメできない気がする。
* NPAPI自体、2015年9月で完全サポート停止になる。   
http://www.itmedia.co.jp/news/articles/1411/25/news064.html   
つまり、このあべこべな状況は、最長でも年内中に収束する見込み。   
（サポート外だけど入れることはできて、いじることもできるよ、だと困るが）

#雑記
表示上は有効になっていても、内部的には使えないって、すごく分かりにくい。
余談ながら、Google Earth のAPIも、提供終わるらしい。
http://japanese.engadget.com/2014/12/15/google-earth-api-2015-12-npapi/

・
・
・
最後に、後輩の子から、
> 煽りを加えたほうが（ストックが）伸びるらしいですよ！

って聞いたので、それっぽい煽り、いれときますね。

**「この、ゴミチョロメが！　FFサイコウ！　IEちゃんはかわいそうだからゆるす！」**
Windows用キーボードをMacで使うときに修飾キー配列を変えない設定

Windows用(PC用)のキーボードをMacで使うときのメモです。

Macキーボードで左側の修飾キーは左からControl(^)キー、Option（⌥）キー、Command(⌘)キーの順番で並んでいます。
Windows用キーボードをMacで使うと、Windows(❖)キーがMacのCommand(⌘)キー、altキーがMacのOption（⌥）キーに対応するため、実質的に左側からControl(^)キー、Command(⌘)、Option（⌥）キーという順番になり、CommandキーとOptionキーの位置の逆転が起こります。

Macの修飾キー配列に慣れていると違和感があるので、__システム環境設定__ > __キーボード__ > __修飾キー__で OptionキーとCommandキーの位置を以下のように逆転させましょう。
 

| デフォルト　　　　 | 設定後         |
|:----------------|-------------: |
| Control(^)キー   |    ^ Control  |
| Option（⌥）キー   | ⌘ Command     |
| Command(⌘)キー   |  ⌥ Option     |
コピペで動くjQuery DataTablesの導入と日本語対応

jQueryを使った高機能で導入な簡単なデータテーブルプラグインの導入手順のメモです。

DataTables Table plug-in for jQuery
http://www.datatables.net/

MITライセンスで利用できます。フォーラムを見たい場合や商用サポートを受けたい場合のは有料プランがあります。

まずjQuery本体とプラグインのcssとjsを読み込みましょう。

```html
 <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/1.10.4/css/jquery.dataTables.min.css" />
  <script src="//cdn.datatables.net/1.10.4/js/jquery.dataTables.min.js"></script>
```

次に日本語でメニューが表示されるようにします。日本語ファイルが準備するのでURLで指定するだけです。

```js
$(document).ready(function(){
 $('#targetTableID').DataTable({
  "language": {
   "url": "//cdn.datatables.net/plug-ins/3cfcc339e89/i18n/Japanese.json"
  },
 });
});
```

以上これだけで導入が完了です。エクステンションも準備されていて、導入も簡単でとても便利です。
formのパラメータをオブジェクトにする

`jQuery.js` と `lodash.js` または `Underscore.js` を使用。
`CoffeeScript` で記述。
`ajax` で `form` のパラメータ送るときとかに使う。

* `textarea` は使わなかったんで、気が向いたら追加。
* `form` を `get` で `submit` したパラメータから取得できたら楽そうだけど、方法が思いつかなかった。
* `lodash.js` 使ってるんだから、もっとスマートに書ける気がする。
* `checkbox` の箇所はパラメータにすると通常は `key[]=1&key[]=0&key[]=1` みたいになると思うけど、オブジェクトにしたかったので `key[0]=1&key[1]=0&key[2]=1` みたいになるようした。とりあえず動いたけど、動かないパターンもあるかも。

```coffeescript
$form = $ 'form'
$formItem = $form.find 'input, select'

params = {}

elms = _.groupBy $formItem, (el) ->
  $ el
    .attr 'name'

_.each elms, (val, key) ->
  switch val[0].tagName
    when 'SELECT'
      params[key] = $(val).val()
    when 'INPUT'
      switch val[0].type
        when 'radio'
          for _val in val
            if $(_val).is ':checked'
              params[key] = $(_val).val()
              break
        when 'checkbox'
          params[key] = []
          _.each val, (_val) ->
            params["#{key}[#{i}]"] =
              if $(_val).is ':checked' then 1 else 0

console.log params
```
iBeaconのアドバタイズメントパケットとCore Bluetoothのメモ

以前書いた記事『[iBeacon と BLE](http://d.hatena.ne.jp/shu223/20141208/1418051009)』に関係して、追加調査したことのメモ。

**「iOSデバイスをiBeaconのビーコン側として使う」場合に、できること、できないこと**を確認したくて、いろいろためしてみました。


##iOSデバイスをビーコンにしたときのアドバタイズの挙動

まず、（iBeacon的には）正規の方法でアドバタイズメントパケットを生成・アドバタイズする。

```
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
                                                                  identifier:kIdentifier];

NSMutableDictionary *peripheralData = [beaconRegion peripheralDataWithMeasuredPower:nil];

[self.peripheralManager startAdvertising:peripheralData];
```

この実装をしたアプリを動かして [Bluetooth Explorer](http://qiita.com/shu223/items/46dabad41cf2eed67d13) でアドバタイズメントパケットの中身を確認してみると、**iOS標準のManufacturer data と、iBeacon フォーマットの Manufacturer data とが一定時間間隔で交代で配信**されている、ということがわかった。

普通の Manufacturer data の配信 n 回に対して iBeacon の Manufacturere data が1回、ぐらい。（Packet Logger で見るとよりハッキリわかる）



##CBAdvertisementDataManufacturerDataKey を直接設定することはできない

[iBeaconのアドバタイズメント・パケットのフォーマット](http://d.hatena.ne.jp/shu223/20141208/1418051009)がわかると、じゃあ `CBAdvertisementDataManufacturerDataKey` に直接していすればいいじゃん、ということで

```objc
NSMutableDictionary *advertisementData = @{CBAdvertisementDataManufacturerDataKey: manufacturerData}.mutableCopy;
```

みたいにやってみたが、**エラーにはならないものの、`CBAdvertisementDataManufacturerDataKey` に渡した値はアドバタイズされなかった**（Bluetooth Explorer で確認）。

iOSの普通の `CBAdvertisementDataManufacturerDataKey` の値だけアドバタイズされる。


関連：http://stackoverflow.com/questions/23771578/changing-cbadvertisementdatamanufacturerdatakey-from-peripheral


##CLBeaconRegionの `peripheralDataWithMeasuredPower:` で生成されるもの

```objc
NSMutableDictionary *peripheralData = [beaconRegion peripheralDataWithMeasuredPower:nil];
```
で生成したものをログ出力してみると、

```
peripheralData:{
    kCBAdvDataAppleBeaconKey = <aab8f982 70304cff a5e902ab b8e6fef9 00000000 c8>;
    kCBAdvDataLocalName = TestBeacon;
}
```

となる。

`CBAdvertisementDataManufacturerDataKey` をログ出力すると "kCBAdvDataManufacturerData" だが、CLBeaconRegion の **`peripheralDataWithMeasuredPower:` で生成した場合、キーが "kCBAdvDataAppleBeaconKey" になる**、ということがわかる。

あと、このとき、iBeaconフォーマットのうち**company codeにあたる「4C00」は値から省略**されている。

`startAdvertising:` に渡す時点では辞書のキーに "kCBAdvDataManufacturerData" ではなく "kCBAdvDataAppleBeaconKey" を使うことで、最終的に iOS が manufacturer data として一定時間ごとに配信してくれる、というものらしい。


##バックグラウンドでの挙動

**perpheralのバックグラウンド実行モードを指定しても、バックグラウンドにまわると iBeacon フォーマットの一定時間ごとの Manufacturer Data の配信が止まる**（普通の Manufacturer Data だけが配信される）。

ためしに Location のバックグラウンド実行モードをセットしてみてもだめだった。

というわけで**iOSデバイスをビーコン側としてバックグラウンドで動かすことはできない**っぽい。

たぶん **"kCBAdvDataAppleBeaconKey" の値はバックグラウンドでは配信しない**よ、という処理をiOSがアドバタイズメントパケットを決める際にやっているっぽい。


##おわりに

そもそも、「iBeaconというBLEのサブセット仕様」の特長は

- 安い
- 省電力（ほとんど何もしない）

なので、**iPhoneとかの高級・ハイスペック端末をビーコンにすること自体が筋がよろしくない**のですが、なんでこんなことを調べてたかというと、Core Bluetooth のバックグラウンドでの挙動にはいろいろと制約があって、たとえば**バックグラウンドにいるセントラルのiOSデバイスから、バックグラウンドにいるペリフェラルのiOSデバイスを検出できない**のです。いろんな制約の兼ね合いで。

で、うまくiBeaconと併用してどうにかならないかなーと調査してみたのですが、結果、前述のとおり、**iOSデバイスをビーコン側としてバックグラウンドで動かすことはできない**という結論に至ったのでした。。
Titanium.Network.HTTPClientでキャッシュを無効にする方法

サーバ側のリソースファイルを更新してもアプリ上でダウンロードしたファイルの
中身が変わっていなかったので、その原因を調べてみた。

```
App.Properties.getString("url", "http://XXXXXXXX.jp/app.json")
```

上記コードで、接続先を取得しているんですが、
`url`のプロパティがないときに第2引数で指定しているURLにアクセスします。

実装中のコードは、`url`のプロパティがないため、
毎回第2引数のURLにアクセスして`app.json`を取得してくる動きになってます。

ただ、実際に動かしてみると、
サーバ側の`app.json`を変更しても、jsonの内容が変わらない現象が発生しました。

サーバへのリクエスト時に、Network.HTTPClientを使ってアクセスしているんですが、
そこのドキュメントを読んでみたところ、cacheを制御するフラグがあり、
フラグの値を変更することで、cacheを無効にできるみたいです。

```
var client = Titanium.Network.createHTTPClient({
     onload : function(e) {
     	// ------- // 
     },
     cache : false,
 });
```

このフラグを追加したところ、無事、更新後のjsonファイルを取得できるようになりました。

ちなみにこのフラグは、iOSのみで動くらしく、Androidでcacheを無効にするには、

```
client.setRequestHeader('Cache-Control','no-cache');
client.setRequestHeader('Cache-Control','no-store');
```

httpクライアントのヘッダ内に、`Cache-Control`の定義が必要だそうです。

以下は参考にさせていただいたサイトです。

参考：
> [Titanium.App.Properties](http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.App.Properties)

> [Titanium.Network.HTTPClient caches responseData. How do I prevent that?](http://stackoverflow.com/questions/15646687/titanium-network-httpclient-caches-responsedata-how-do-i-prevent-that)
backbonejs・Titanium Mobileの降順取得

* Titanium SDK : 3.5.0.GA

## SQLiteにあるデータをupdated_atで降順してfetch

```
var photo = Alloy.Collections.photo;
photo.comparator = function(photo) {
    return -photo.get("updated_at");
};
photo.sort();
photo.fetch();
```

以上メモでした。
Twitter APIを使うために登録の覚書

Androidアプリを作成する為に調べたものなので、Webアプリの場合は、特にCallbackなどは異なると思われる。

登録したいアカウントにログインした状態で
https://dev.twitter.com/
ページ下部の
**TOOLS**
API Status
API Console
Manage Your Apps
Cards Validator

の*Manage Your Apps*を選択。

---------------------------------------

既に登録しているアプリがある場合はリストで表示される。
新規の場合は
You don't currently have any Twitter Apps.
と表示される。

作成に進む場合は
*Create New App*
を選択。

**Application Details**
Name *
アプリ名(必須

Description *
アプリ説明(必須

Website *
アプリのサイト。Webアプリでなければ実在しないアドレスでも可。

Callback URL
OAUTH認証などで認証した後に戻ってくるURL。(省略化
入力する場合はhttps://　の形式。アドレスその物は何でも良い。

Developer Agreement
APIの利用規約。読んだら
Yes, I agree
をチェック。

---------------------------------------
**Permission**
Access
What type of access does your application need?
APIへのアクセス権限を設定。

Read only
Read and Write
Read, Write and Access direct messages
目的のパーミッションに設定。

以上で、登録終了。

個人的にはOAUTH認証を行うがCallbackを空にしていてはまった。
最近はPINコードを使うのが一般的なので必要性が低くなっているからか。
プログラマになること#13 「頭」「体」「心」


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#体
体力が無いと、脳は動きません。従って、筋力はおいといて、持久力が必要。
体力を保つ生活習慣も必要。
おいしいごはんをしっかり食べて、たとえ短くとも良い睡眠をとりましょう。
運動しましょう。歩くのが一番です。
出来れば、自然のなかにいきましょう。

#頭
とにかく五感を鍛えましょう。
良い書物、美しい映像、素晴らしい音楽。
英語力、数学力、読解力は次の話。
プログラム？そんなもんやりゃわかる。
わかるまでやりゃいいんです。
特別なことでは無い。

#心
優しい心を持ちましょう。
言いたくないことも言わねばならん。いつか分かってくれます。
責めてるだけではいかん。根底に優しさをしっかりと持ちましょう。

#「やれ」
学歴ってのは、学べる環境にいたという証明ではあるが、本当にやれるかという証明にはならない。
資格も同じ、ちょいとやれば資格はとれます。仕事になるかってのは別のお話。
どちらもあれば有利なのは事実です。
しかし、コンピュータの仕事は学歴でも資格でもなく、実績です。
学者になる以外、中卒で充分です。ここは断言できる。
但し、「やれ」
rails generate でSyntaxErrorが出てきたときにやったこと[Rails4]



Rails tutorial やってたら、rails generateでSyntaxErrorが出てきたでござるの巻。

***
###.secretってファイルが悪い

.secretというファイルがあって、それが悪さをしているっぽい。
なのでそれを消してやったら無事にできるようになった。

####.secretファイルってなんなの？
アプリケーションのsecretトークンを一時的に保存するファイルっぽい。
セッションのくせに破棄されない理由はわからないけど、cloud9でワークスペースをそのままにした状態で閉じたからかも？
似たような設定ファイルにconfig/secret.ymlがあるけど、この辺の違いはまだわからず。。。

と思ったらものすごくわかりやすく説明してくれているサイトさんを発見しました。
[ここ](http://t4traw.github.io/20141215/study-rails-secrets-yml.html)です。

.secretとsecret.ymlって同じもので、バージョンによってファイル名と処理が変わったっぽいですね。
インストール済みのQt Creatorにパッケージを追加する

Windows版のみで確認。Mac、Linuxについては未確認。

たとえばQt5.4のキットのみをインストールしていたがQt5.3が必要になった時、あるいはMSVCのみで作業していたがAndroidを試したくなった時、インストーラからはキットの追加ができない。

Qtのインストールディレクトリに ```MaintenanceTool.exe``` があるのでそれを使用すればパッケージの追加ができる。
ふぁいる

ファイルが存在しなければ新規作成

```c

#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>

#include <stdio.h>
#include <stdlib.h>

int fd;
int flags;
mode_t mode;
errno = 0;

flags = O_WRONLY | O_CREATE | O_TRUNC  // 書き込み用に新規作成
  | O_CLOEXEC  // クローズ・オン・エクゼックする
  | O_EXCL;    // シンボリックリンクか既に存在する場合こけさせる


mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // 0644

if( (fd = open("hoge", flags, mode)) == -1) {
  perror("open");
  exit(1); // リソースの破棄はシステムまかせ
}

```


ファイルが既に存在していても操作したい。

```c


int file_remove()
{
  int fd;
  errno = 0;

  if( (fd = open("hoge", O_RDONLY | O_CLOEXE)) == -1 ) {
    return 0; // 消してない
  }
  
  // 名前を消す,他のプロセスがファイルを開いていなければファイルも消える.
  if( (unlink("hoge")) == -1) {
    perror("unlink")
    exit(1);
  }
  return 1; // けしたよ！
}

int file_create()
{
  int fd;
  int flags;
  errno = 0;

  flags = O_WRONLY | O_CREATE | O_TRUNC | O_CLOEXEC;
  mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

  file_remove() // 根っ子になる条件で再帰させる

  if( (fd = open("hoge", flags, mode)) == -1 ) {
    perror("open");
    exit(1);
  }
  return fd;
}

```

通常ファイルか判定

```c

int fd;
int regfile;
struct stat info;
errno = 0;

if( (fd = open("hoge", O_RDONLY | O_CLOEXE)) == -1 ) {
  exit(1);
}

if( (stat("hoge", &info)) == -1 ) {
  perror("stat");
  exit(2);
}

return regfile = S_ISREG(info.st_mode) ? 1 : 0;


```

クローズ・オン・エグゼック フラグをあとから追加

```c

int flags;
int fd;

fd = open(...);

flags = fcntl(fd, F_GETTD);
flags |= FD_CLOEXEC;
fcntl(fd, F_SETFD, flags);

```
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」当たり判定制御

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# スプライトの当たり判定について
ゲームなどでキャラクター同士の当たり判定を取ることは多用されます。
当たり判定は、通常はスプライト表示で使っている画像の矩形で判定されます。
![bear03.png](https://qiita-image-store.s3.amazonaws.com/0/53543/00393f66-1b16-83cb-6369-71ab6e1c5900.png)

しかし、これでは絵の大きさがそのままゲームの難易度になってしまい、ゲームバランスの取り方が難しくなってしまいます。
enforceでは生成されたオブジェクトの当たり判定は、指定された画像の大きさ（width, height）で取りますが、メンバー変数の

**collider**

にオブジェクトを設定すると、設定されたオブジェクトのスプライトサイズで当たり判定が取られます。
通常のクマですと、32x32で衝突判定が取られますが8x8の画像を使ったオブジェクトを生成し、それを**collider**に設定すると当たり判定はその8x8のスプライトと取られるので難易度が低くなります（逆に高くなる場合もあります）。
![bear02.png](https://qiita-image-store.s3.amazonaws.com/0/53543/cddc1dcc-69c9-7558-84a0-94f45d8c4974.png)

「**collider**」に設定されたオブジェクトは、自動的に親オブジェクトに追随します。
「**collider**」に設定されたオブジェクトのメンバー変数「**offsetx**」と「**offsety**」は、親オブジェクトからの表示位置差分になります。
オブジェクトの持っている座標値はスプライトの中心なので、親オブジェクトの中心からどれくらい離れた位置に「**collider**」を表示するか指定出来ます。
removeObject()で親オブジェクトを削除すると、「**collider**」のオブジェクトも自動的に削除されます。
「**isIntersect()**」と「**isCollision()**」はこの「**collider**」で当たり判定を行います。

例えば、自機のクラスの「**constructor**」に下記の処理を追記します。

```coffeescript
        collider = addObject
            image: 'collider8x8'
            x: @x
            y: @y
            width: 8
            height: 8
            animlist: [
                [100, [0]]
            ]   
        @collider = collider
```
すると自機の当たり判定は、自機に設定されているスプライトではなく、「**@collider**」に設定されているスプライト「**collider8x8**」で行なわれます。

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
Play Frameworkを初めて使ってみる


https://www.playframework.com/

## Typesafe Activatorをインストールする

Playの開発はTypesafe Activatorを使って行う。Typesafe Activatorはビルドツールのsbtを内蔵している。

```
brew install typesafe-activator
```

ヘルプが出ればインストールOK。

```
activator -help
```


## 最初のプロジェクトを作る

```
activator new my-first-app play-scala
```

### Activatorを立ち上げる

初回は依存するライブラリを取ってくるので時間がかかる。30分くらいかかるので、その間にPlayのドキュメントに目を通しておくといいだろう。

```
activator
```

## アプリを起動してみる

Activatorのコンソールが起動したら、アプリを起動する。

```
run
```


http://localhost:9000/ を開くと起動したアプリにアクセスできる。


## メモ

* PlayではControllerはActionを生成するだけのオブジェクト。

## いいところ

### デバッグがしやすい

#### なぜNot Foundなのか表示される

![Action_not_found.png](https://qiita-image-store.s3.amazonaws.com/0/889/e6c1fc37-e4ac-e884-a77a-5888ac740a3d.png "Action_not_found.png")

#### テンプレートで未定義な変数がコンパイル時に分かる

![Compilation_error.png](https://qiita-image-store.s3.amazonaws.com/0/889/5f69a32b-f16a-bff2-379f-142f3bb9167e.png "Compilation_error.png")

#### テンプレートが型安全

![Compilation_error.png](https://qiita-image-store.s3.amazonaws.com/0/889/470cfea4-fd7d-338e-c509-469b73487d68.png "Compilation_error.png")

### URLだけ先に決めて、未実装のActionをTODOにできる

開発中にURLだけ先に決めて、アクションを後に実装したいときに、明示的に未実装を表現できる。

```
object Application extends Controller {
  def someday = TODO
}
```


![TODO.png](https://qiita-image-store.s3.amazonaws.com/0/889/1c9f5b73-05f5-3ae3-46da-718d478598e5.png "TODO.png")
php入門者がでFizzBuzzをやってみた


今回はphpでFizzBuzzをやってみました。
考え方もjavascriptの時と同じようにひとつずつ分解して作っていきます。
今回は求めた値をhtmlのliタグでくくってみたいと思います。

## 1.入力した文字をブラウザに表示させてみる
結果が正しいかを判断するために、まずはphpで値をブラウザに表示できるようにします。

	<?php
		echo '1';
	?>

これでブラウザ上に「1」と表示されていると思います。

## 2.ブラウザ上に1から100までの数字を表示させてみる
表示させられることが分かったので、次は1から100までの数字をブラウザ上に表示させてみましょう。

	<?php
		for($i = 1; $i <= 100; i++){
			echo $i;
		}
	?>
	
今回もjs時と同じくfor文でループさせてみました。

## 3.数字をliタグで括ってみる
このあたりから全体像を意識し始めました。
通常、echoの後ろにある$iの前後にliタグを加えるとliタグをつけることができます。
しかし、FizzやBuzzなどの文字を表示させるための条件分岐の準備がまだできていません。
なので今回はliタグを別の箇所に用意することにします。

	<?php
		for($i = 1; $i <= 100; i++){
			$result = $i;
			echo '<li>' . $result . '</li>';
		}
	?>

ループで求めた値をresultという変数に入れます。
その上でechoで表示をさせます。
この方法だと条件分岐をしてもシンプルに見えるかなと思いました。

## 4.三項演算子で条件分岐をしていきます。
javascriptのときはif文で書いてから三項演算子に置き換えましたが、今回はいきなり三項演算子で書いてしまいます。

	<?php			
		for($i = 1; $i <= 100; $i++){
			$result = $i%3 === 0 ? ($i%5 === 0 ? 'FizzBuzz' : 'Fizz') : ($i%5 === 0 ? 'Buzz' : $i);
			echo '<li>' . $result . '</li>';
		}
	?>
	
入れ子であまり綺麗なコードではないですがとりあえずこれで完成です。
入れ子状態を解消した書き方もやってみたのですが、こちらでは思ったように動作してくれません。

	<?php			
		$setNum = 1;
		$endNum = 100;
		for($i = $setNum; $i <= $endNum; $i++){
			$result = ($i%3 === 0 ? 'Fizz' : '') . ($i%5 === 0 ? 'Buzz' : '') || $i;
		echo '<li>' . $result . '</li>';
		}
	?>			

		
## まとめ

javascriptもphpもプログラムを書く上での考え方は同じですね。
分解して作る過程で「変数の書き方」や「文字の接続方法」などはそれぞれの言語ルールとして覚える必要はありますが。。。
ただ、最後のコードがなぜ正しく動かないのか不明です。このコードのどこが悪いのかもう少し考えてみたいと思います。


## 【追記】
コメントで最後のコードが動かないのは「||」のせいだということを教えてもらいました。
そこでもう一度jsとphpのリファレンスを見直してみました。
その上でもう少しだけコードが短くならないものかとやってみました。
ベースにしたコードと最終版を並べて書いてみます

＜ベースにしたコード＞

	<?php			
		for($i = 1; $i <= 100; $i++){
		$result = $i%3 === 0 ? ($i%5 === 0 ? 'FizzBuzz' : 'Fizz') : ($i%5 === 0 ? 'Buzz' : $i);
		echo '<li>' . $result . '</li>';
		}
	?>
	
＜最終版のコード＞

	<?php           
		while($i++<100){
			$result = $i%3? ($i%5? $i : 'Buzz'):($i%5? 'Fizz':'FizzBuzz');
			echo '<li>' . $result . '</li>';
		}
	?>
	
ベースにしたコードから「これはなくても良くない？」と思ったものを取り去ったのが最終版のコードです。もうひとつ大きな違いとしては、ループをfor文からwhile文に変えました。こちらの方が文字数が少なくなるというのが変更した理由です。

でコードの中身を少し解説。
コード中の「$i%3」は$iを3で割ったときに余りがあるかを調べるものです。それを三項演算子を書くときに活かしたらコードを書くときの文字数が減るはず。

	$i%3 ? 【余りがあるときの処理】 : 【余りがないときの処理】;

という式が成り立つことに気付きました。
あとは三項演算子を入れ子にして書き上げたのが最終版のコードです。

調べるともっと短く書いてあるコードもたくさん見かけました。
書いてあるのを読むとなんとなくわかった気になれるのですが、自分で書こうとするとできませんでした。今の私は最終版のコードが限界な感じがしています。
なんちゃってvim初心者のvimrc改善

以下のvimrcを丸コピして使っているだけなので、実際にNeoBundleがどう動いているか知らずに使っており、なんちゃってvimerだ。使い方を学ぶ。
http://vim-bootstrap.com/


# tpope/vim-commentary
*gcc* を入力することで、その言語にあったコメントアウトをしてくれる
# tpope/vim-fugitive
gitラッパープラグイン
```
：Gstatus
新しい窓を作ってgit statusを表示
：Gwrite
現在開いているソースをgit add
：Gread
現在開いているソースの直前のコミット時のソースを表示
：Gmove destination/path
現在開いているソースをgit mvする
：Gremove
現在開いているソースをgit rmする
：Gcommit
git commit
：Gblame
現在のソースをgit blame。vimが色づけしてくれる
：Gdiff
現在のソースの変更点をvimdiffで表示
```
http://yuku-tech.hatenablog.com/entry/20110427/1303868482
# ctrlpvim/ctrlp.vim
Ctrl+Pをすることで、多機能セレクタ.
Uniteというプラグインを使おうか悩む。

```vimrc:ctrlp.vim
set wildmode=list:longest,list:full
set wildignore+=*.o,*.obj,.git,*.rbc,*.pyc,__pycache__
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|tox)$'
let g:ctrlp_user_command = "find %s -type f | grep -Ev '"+ g:ctrlp_custom_ignore +"'"
let g:ctrlp_use_caching = 0
cnoremap <C-P> <C-R>=expand("%:p:h") . "/" <CR>
noremap <leader>b :CtrlPBuffer<CR>
let g:ctrlp_map = ',e'
let g:ctrlp_open_new_file = 'r'
```

*,e* で検索出来るようになっていたが、C-pとか使ってないし設定もよくわかってないので、全てコメントアウトしてデフォルト準拠へ。

http://qiita.com/oahiroaki/items/d71337fb9d28303a54a8

# bling/vim-airline
Lineをかっこ良く見やすくしてくれる。
https://github.com/bling/vim-airline

色が気に入らないので、テーマを変更する時。
https://github.com/itchyny/lightline.vim

# scrooloose/nerdtree
使いたかったけど、使い方を知らなかったやつ

```
noremap <F3> :NERDTreeToggle<CR>
```
F3でツリーを開くようにした。
神機能だった。

ファイルを開く際は、*t* で開こう。 *o*はディレクトリを展開。
http://qiita.com/zwirky/items/0209579a635b4f9c95ee


# airblade/vim-gitgutter
変更点を教えてくれる。
※gitを使っている場合に限る

# majutsushi/tagbar
*:TagbarToggle* でClassやMethodの一覧を出力してくれる。

```
nmap <silent> <F8> :TagbarToggle<CR>

```
F8の人が多い。なぜだろ

見るだけなのかなーって色々教えてたら、
pを押すことで、タグへジャンプしてくれた。

https://github.com/majutsushi/tagbar

# vim-scripts/grep.vim
vimgrepあるからいらない気もするけど、初心者にやさしいgrep感があった

ファイル開く際、Tabで開くようにするには、
*C-w > g > F* こうすることで、指定ファイルの指定行数へジャンプ！


疲れたのでまた今度
peco で過去のコミットメッセージを再利用する

[過去のコミットメッセージに倣って書くことで、過去のコミットと似た変更を加えたという意味を伝えることができます。](http://qiita.com/meganemura/items/8a034e2065b299135c87#%E5%90%8C%E3%81%98%E3%82%88%E3%81%86%E3%81%AA%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%AB%E3%81%AF%E5%90%8C%E3%81%98%E3%82%88%E3%81%86%E3%81%AA%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%9B%B8%E3%81%8F)

「過去のコミットメッセージに倣って書く」ため、主に次の手順をとっていました。
 * `git log --oneline` してコミットの意図と似たものをページャで検索
 * 検索結果の中から似たコミットメッセージをコピー
 * `git commit -em'{ペースト}'`

peco を使ったところ、これらの作業がだいぶ楽になりました。
詳細はアニメGIFのとおりです。


# 動作

```bash
$ cat ~/bin/git-comm
$ git status 
$ git comm
$ git show
```

![0uYN24ceRs.gif](https://qiita-image-store.s3.amazonaws.com/0/3295/7ae1b18c-3ae6-9571-65cb-76f917cd808e.gif)

# 中身
```sh:git-comm
#!/bin/sh
candidates=$(git log --format="%s")
message=$(echo "$candidates" | peco)
test "$message" && git commit --verbose --edit --message="$message"
```

また、.gitconfig に次を追加することでも利用できます(可読性に難有り)。

```config
[alias]
        comm = "!f() { \
          local candidates=$(git log --format='%s'); \
          local message=$(echo \"$candidates\" | peco); \
          test \"$message\" && git commit --verbose --edit --message=\"$message\"; \
        };f"

```

# 候補を変更する
`$candidates` を変えて自分が検索しやすいものに変えるといいと思います。

 * 重複を削除・ソート・マージコミット除外 ([.gitconfig のサンプル](https://github.com/meganemura/dotfiles/blob/fea5d0a569abd02d4f12eab42c70fc73f3f80d63/.git_aliases#L39-43))
  * `git log --format='%s' | sort | uniq | grep -v "^Merge"`

`$candidates` をコミット対象のファイルのコミットメッセージに限定する、というのも良さそうです。
rbenv を利用してディレクトリ毎に別バージョンのRubyを利用したい

`rbenv local` というコマンドが存在する。
このコマンド、ディレクトリ毎にRubyの指定をしてくれるものだ。

rvm 時代は、.rvmファイルを利用していたのだが、
`rbenv`コマンド側で.ruby-version ファイルを生成して便利ちょっとした便利機能

```
$ mkdir hoge && cd $_ 
$ rbenv local 2.1.2
$ rbenv version
2.1.2 (set by /home/hoge/rails/hoge/.ruby-version)
$ mkdir fuga && cd $_ 
$ rbenv local 2.1.5
$ rbenv version
2.1.5 (set by /home/hoge/rails/hoge/fuga/.ruby-version)
$ cd ../
$ rbenv version
2.1.2 (set by /home/hoge/rails/hoge/.ruby-version)
```

♡Ruby
FacebookでShareでの投稿時の文言を変更したい

public_actionを利用していたが、以下のように出てきてしまう。
public_action  : ○○さんが××をシェアしました。

## カスタムストーリーを利用する
https://developers.facebook.com/docs/opengraph/creating-custom-stories?locale=ja_JP

Custom Stories : ○○さんが××の商品を、「好き！」と言っています。
とかに変更することが可能。


### やるべきこと

1. Open Graph -> Stories から Action Typesおよび Object Types をヒモ付、Storiesを作成する。  
2. 1.のままでは、日本語化されていない為、「Localize」 タブに 「Translate Open Graph Stories」ボタンが追加される為、翻訳を行う。
3. GraphAPIへのPOSTを以下のようにする。ついでに、JS SDKを利用。
```
FB.api('/me/{{AppID}}:{{ActionTypes}}', 'post', {
        website: 'http://.../.../
    }, function(response){
    ...
})
```

## カスタムストーリーを利用した際、Facebook TimeLine へ表示する方法
カスタムストーリーのみの登録では、アクティビティのみの登録となり Facebook Timelineへは出力されない。
以下の設定が必要となる。

1 param へ fb:explicitly_shared を追加する。  

```
FB.api('/me/{{AppID}}:{{ActionTypes}}', 'post', {
        website: 'http://.../.../',
        "fb:explicitly_shared": true
    }, function(response){
    ...
})
```

2 以下の項目へチェックを入れることで、Facebook TimeLine へも表示される。  

```
✔ Explicitly Shared - This action can specify the user explicitly shared an action.
```

良きFacebook Lifeを！
Twitter gem の Tweetオブジェクトを軽量化する


twitter apiを使ったクライアントが、ユーザアイコンなどの情報を子細に表示できるように、1ツイートにはたくさんの情報が詰まっている。Twitter gem のTweetオブジェクトは、1ツイートあたり6KBになることもある。

大量のツイートを処理することを考えると、データを小さく抑える工夫が欲しい。

## Tweetオブジェクト
Tweetオブジェクトの正体はただのHashである。twitter gemでは、twitter apiから受け取ったjsonは、ほとんどそのままの状態でTweetオブジェクトにされる。

`Twitter::Tweet.new`によって、`:id`のキーを持つHashなら、なんでもTweetオブジェクトにすることができる。

```ruby
t0 = Twitter::Tweet.new({}) 
#=> KeyError: key not found: :id

t1 = Twitter::Tweet.new({ id: 2.718281828459045235360287471352 }) 
#=> #<Twitter::Tweet id=2.718281828459045>
```

Tweetオブジェクトになってしまえば、`Twitter::Tweet#methods`に反応することができる。しかし、上述のTweetオブジェクトはほとんど空っぽである。

特定のkeyが存在しない、あるいはfalse, nilのとき、`Twitter::NullObject`が返却される。

```ruby
t1.text
#=> #<Twitter::NullObject:0x80cd77e4>
```

`retweet?,retweeted?,text?,user?`等のメソッドはそれぞれ、特定のkeyに対応する呼び出しの返値が`Twitter::NullObject`か否かを判定している。

```ruby
t1.text? #=> false

t2 = Twitter::Tweet.new({ id: 314, text: :foo }) 
#=> #<Twitter::Tweet id=314>

t2.text? #=> true
t2.text #=> :foo
```

## 軽量化
Tweetオブジェクト（twitter apiのレスポンス）は多様なニーズに応えるよう様々な情報を含めている。だが、ある用途については、それらの情報のほとんどは無駄なものである。したがって、捨ててしまうのがいい。それでいて、twitter gemの用意してくれた快適なメソッド群を（自分が実際に使いたい範囲において）そのまま使えるほうがいい。

「Tweetオブジェクトを`to_h`したHashから情報を間引いて、再度Tweetオブジェクトに戻す」という方法が考えられる。

この「間引かれたTweetオブジェクト」では、適切に反応できないメソッドが出てくる。そのため、使用目的にあわせて、残す情報を考えなければならない。「140字の投稿内容」の数百バイトの情報さえあれば、それでいい人も居るだろう。

以下は、`text, text?, retweet?, user, user?`等への対応を想定した軽量化の実装である。


```ruby
class Twitter::Tweet
  def downsizing
    h = to_h
    t = {
      id: h[:id],
      text: h[:text],
      user: {
        id: h[:user][:id],
        name: h[:user][:name],
        screen_name: h[:user][:screen_name],
      },
      retweeted_status: begin h[:retweeted_status][:id] rescue nil end
    }
    Twitter::Tweet.new(t)
  end
end
```

元Hashのkey-valueの対応を一部維持していることが、「間引かれたTweetオブジェクト」に対するgemの一部メソッドへの反応を可能にしている。
FuelPHPでTraitを使う方法

## 手順

* 下記のようにapp以下にtraitを書くためのファイルを作る。

```
fuel
 |-app
    |-traits.php
```

とりあえずtraits.phpには下記のようなソースを書いておく

```php:traits.php
<?php
trait SingletonTrait {

	private static $self = null;

	protected function __construct(){}

	private function __clone(){}

	private function __wakeup(){}

	public static function getInstance(){
		if(is_null(self::$self)){
			self::$self = new self;
		}
		return self::$self;
	}
}
```

* 次にFuelPHPにtraitを読み込ませておく

```php:bootstrap.php
...

Autoloader::add_classes(array(
	// Add classes you want to override here
	// Example: 'View' => APPPATH.'classes/view.php',
));

// Register the autoloader
Autoloader::register();

// Load trait
\Fuel::load(APPPATH.DS.'traits.php');

...
```

* 最後に、SingletonTraitを使いたいクラスでuse宣言する

```php
class MyClass{
  use SingletonTrait;
  ...
}
```

# 補足

上記では、`traits.php`というファイルを作りましたが、他にも、appの下に`traits`というフォルダを作って、そのフォルダの中にファイルを作っていく方法もよいと思います。
常駐型プログラムをタスクスケジューラで遅延実行するようにして、たまに発生する面倒から解消されたお話

#### 背景
ある常駐型プログラムをPC起動時(ログイン時)に起動させたい。
しかし、その常駐プログラムは最初にとあるWebサーバにログインが必要である。
スタートアップでの起動時、まだPCがネットワークに接続できていない場合、ログインが失敗しエラーとなる。その場合は手動でログインが必要となる(めんどくさい)

#### 前提

* Windows7マシンである

#### 解決策

タスクスケジューラにて「任意のユーザログイン後、○分後にプログラムを遅延実行する」というタスクを作成した。

結果、PCが起動し、ネットワーク接続も完了した頃にタスクが起動し、ログインエラーが発生することもなくなった。

#### 気になった点

ここからは自己満足の領域。

作成したタスクスケジューラの常駐プログラム起動タスクの状態が「実行中」となったままになっている。
理屈はわかる。指定された常駐プログラムを起動させているわけだから、実行中なのは当然だ。
おそらく、このままでも特に問題は無いと考える。

しかし、私がやりたかったのは、「指定の常駐プログラムを起動させた後、しめやかに終了するタスク」の実行だった。
なので、タスクの状態は、常駐プログラムを起動させた後終了し、次回実行を待つ「準備完了」の状態であるべきだと考えた。

#### やったこと

結論として、以下の様なbatファイルを作成し、前述のタスクで起動するプログラムと置き換えた。

```
start  ”” ”起動したい常駐プログラムのパス”
```

上記のコマンド引数を見て、「なんで第一引数に空白文字列なんかわたしてんの？」という疑問を持つ人は多いと思う。もっともな感想だと思う。

実際は、上記batファイル実行時に一瞬コマンドプロンプトが表示されるのが煩わしいため、
上記batをさらにvbsファイルで非表示で呼び出して実行しているのだがそれは割愛する。

#### つまずいたこと

通常、コマンドプロンプトのstartコマンドは通常第一引数を実行すべきプログラムパスと評価するのだが、
**””(ダブルコーテーション)で囲まれた引数が第一引数として渡された場合、それをstartコマンドで起動するプログラムのタイトルとして評価する**
という仕様がある。少なくともWindows7に搭載されているstartコマンドには。

そのため、「Program Files」など空白の入ったプログラムを実行するため、””で囲ったパスを第一引数として渡してしまった場合、そのパス名がタイトルとなったコマンドプロンプトが立ち上がるという悲しい結果となってしまう。

それを防ぐために、空白の第一引数が必要になる。

#### 学んだこと


* 常駐プログラムはその処理内容によってはスタートアップではなくタスクスケジューラで遅延実行するほうがいいこともある
* startコマンドを使用する際には第一引数に気をつけること
Nested Attributes/Nested Model Formsでファイルアップロード

プラグインを使わずにnested attributesでファイルアップロードを扱う方法のサンプルです。悩むのはinputのnameの指定方法と、Strong Parametersの書き方。

例はItem has many Attachment の構造

```
% bin/rails g scaffold item name
% bin/rails g model attachment filename item_id:integer
```

```app/views/items/_form.html.erb
<%= form_for(@item, :html => {:multipart => true}) do |f| %>
  <!--途中省略-->

  <%= f.file_field "attachment", :multiple => true, name: "item[attachments_attributes][][file]" %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
```

```app/controllers/items_controller.rb
    def item_params
      params.require(:item).permit(:name,
                                   :attachments_attributes => [:file])
    end
```

```app/models/item.rb
class Item < ActiveRecord::Base
  has_many :attachments
  accepts_nested_attributes_for :attachments
end
```

```app/models/attachment.rb
class Attachment < ActiveRecord::Base
  belongs_to :item
  def file=(file)
    self.filename = file.original_filename
    # ここではサンプルとしてファイル名を保存している
  end
end
```
HTML5非対応(input type="file" multiple="multiple"に非対応)のブラウザ相手の場合、フォームとコントローラを少し変更

```app/views/items/_form.html.erb
<%= form_for(@item, :html => {:multipart => true}) do |f| %>
  <!--途中省略-->
  <%= f.fields_for :attachments do |attachment_form| %>
    <div class="field">
      <%= attachment_form.file_field :file %>
    </div>
  <% end %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
```
```app/controllers/items_controller.rb
  def new
    @item = Item.new
    5.times { @item.attachments.build }
  end
  # (途中省略)　

    def item_params
      params.require(:item).permit(:name,
                                   :attachments_attributes => [:file])
    end
```
図解git diff基礎

![gitdiff.png](https://qiita-image-store.s3.amazonaws.com/0/50185/9e5c6aa5-3f75-bea9-6f62-4ecf9335c568.png)


①git diffは作業ディレクトリ(working dir)とインデックス(index)の差異

②git diff [commit]は作業ディレクトリと指定されたコミット間の差異

③git diff --cached [commit]はインデックスと指定されたコミットの差異で、コミット指定しない場合はHEAD

④git diff [commit] [commit]はコミット間の差異


作業ディレクトリ（working dir)と呼ばれるものは一般的にwork treeと呼ばれる様なので追記しておきます。
また、work treeはuntrackedなファイルはdiffでは対象外。

あと、work treeからindexへはgit addで追加される。（git addでindexに追加したからといって、work treeの状態は変わらないため、
git addしたあとはgit diffでの差異は見れなくなるが、git diff commitは差異が出る
SSL接続（HTTPS）をやろうとしてはまっている人はiptablesを確認しよう


SSLの設定で自分が２日間はまったので、次来る人がすぐに気づいてくれるようにメモを残しておきます。

私の開発環境は、GMOのグローバルサインでSSL証明書や秘密鍵を発行し、EC2インスタンスにRailsとWordpressを共存させ、どちらも常時SSL接続を実現しようとしている感じです。

SSLの仕組みは、以下の記事で理解しました。
[3分で理解できる！共通鍵暗号方式と公開鍵暗号方式の仕組み](http://viral-community.com/blog/common-public-key-cryptosystem-1513/)
[SSLとは？仕組みから、共有・独自SSLの違い、証明書についてが分かるまとめ](http://viral-community.com/blog/ssl-summary-1510/)

SSLの設定方法などは、以下の記事を参考にしました。
[PKCS #12 ファイルから秘密鍵,証明書,中間CAを取り出す](http://qiita.com/cs_sonar/items/f2753ffdebb1c67d5302)
＊グローバルサインでは、PKCS#12形式で証明書や秘密鍵がセットになったファイルをダウンロードできます。この方法で解凍して、証明書と秘密鍵を取得します。
[[インストール] Apache 2.x + mod_ssl + OpenSSL（新規・更新）](https://jp.globalsign.com/support/server/03.html)
[Amazon EC2 (Amazon Linux) での SSL 設定](http://blog.genies.jp/2011/08/amazon-ec2-amazon-linux-ssl.html)（重要なのは、EC2のSecurity GroupでHTTPSの443ポートを許可しておく事）
[SSLのパスフレーズ（Pass Phrase Dialog）入力を省略してApacheを起動する](http://www.linux-tech.info/web/entry-42.html)
[Apache + OpenSSL ジオトラスト クイックSSL プレミアム インストール手順 (新規)](https://www.geotrust.co.jp/support/ssl/install/apache_openssl_new.html)
[CloudFrontで独自ドメインSSL設定](http://qiita.com/n0bisuke/items/a2a7d5efdc1311dc479a)

さて、ここからが本題なのですが、私の場合以上の記事にあった手順を完璧に再現しても上手くいきませんでした。SSLの設定をいじってみたり、``ssl.conf``ファイルのNameVirtualHostをいじってみたりしてもダメでした。

そして結果分かった原因は、
# iptablesでSSL通信のための443ポートを許可するのを忘れていたからでした！
もう一度言います。
# iptablesでSSL通信のための443ポートを許可してください！

``/etc/sysconfig/iptables``を編集します。

```/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT # ここの行をいれてなかった！！！
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

これをしたらすべて上手く行きました！iptablesで許可してなかったらそりゃ無理です。

いろいろ検索したのに、どこの記事にもiptablesに関して言及していなかったのでここにメモを残しておきます。
iptablesはオフにすることでも問題は解決しますが、セキュリティ的にオフにしていない人も多いと思うので、そういう人ははまりがちなところだと思います。お気をつけて！
Gitの`hook`で自動デプロイ（heteml編）


herokuみたいに`git push`すると自動的にデプロイされるみたいなのできないかなと思ってやってみた。


# 0. 下準備
コントロールパネルからSSHを有効にしとくのと、公開鍵設定しとく。
参考： [hetemlで公開鍵を使う方法](http://qiita.com/ikedahidenori/items/64c9eb82b5b44f735a4b)

## ざっと仕組み説明

リポジトリは３つ。
A. ローカルリポジトリ（作業用）
B. リモートリポジトリ（管理用）
C. リモートリポジトリ（公開用）

流れは、こんなかんじ。
1. ローカルの作業内容をAに`commit`
2. Aの内容をBへ`push`
3. Bの`hook`でBの内容をCが`pull`


本題。

# 1. リモートリポジトリの設定

hetemlにSSHログインした状態から説明。

```リモート
$ cd ~
$ mkdir repos
$ ls
apps  repos  web
```

ここで、
`repos` ... この中にリポジトリがいろいろ入る
`web` ... 公開ディレクトリ（ドキュメントルート）

reposの名前はなんでもいいんだけど慣例っぽい。


で、早速リポジトリを作成。

```リモート
$ cd repos
$ mkdir hoge.git
$ cd hoge.git
$ git init
```

その次に`hook`を設定するために`post-receive`を編集。

```
$ vi hook/post-receive
```

hetemlなら、

```リモート/post-receive
#!/bin/sh

cd ~/web
git --git-dir=.git pull
```

実行権限をつけとく。

```
$ chmod +x post-receive
```

最後に、公開用のリポジトリを作成。
ドキュメントルートにぶちまける。

```
$ cd ~/web
$ git clone ~/repos/hoge.git
$ mv hoge.git/* ./
$ mv hoge.git/.??* ./
$ rm -r hoge.git
```

サーバーの設定は以上。

# 2. ローカルリポジトリの作成

作業ディレクトリに移動して、`git init`してリモートリポジトリを追加。

```ローカル
$ git init
$ git remote add origin ssh://YOU@sshXXX.heteml.jp:2222/~/repos/hoge.git
```


# おまけ：同時にbitbucketにもpushする

`hook`のスクリプトのとこでいろいろできるので、ついでにgithubやbitbucketに`push`しとくなんてこともできる。

```heteml
$ cd ~/web
$ git remote add bitbucket git@bitbucket.org:YOU/hoge.git 
```

originにするとすでにあるよって怒られるのでbitbucketなどてきとうに。

```post-receive
#!/bin/sh

cd ~/web
git --git-dir=.git pull
git --git-dir=.git push bitbucket master
```

成功するとこんなかんじ。

```ローカル

$ git push origin master
-----------------------------------------------------
--***-------------------------------------------***--
--***---------------***-------------------------***--
--***---------------******----------------------***--
--********-********-******-********-***********-***--
--********-***--***-***----***--***-***********-***--
--***--***-********-***----********-***-***-***-***--
--***--***-***------******-***------***-***-***-***--
--***--***-********-******-********-***-***-***-***--
-----------------------------------------------------


Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 650 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: From /home/sites/heteml/users/Y/O/U/YOU/web/../repos/hoge.git
remote:    e7c36f5..c870f24  master     -> origin/master
remote: Updating e7c36f5..c870f24
remote: Fast-forward
remote:  .DS_Store  | Bin 0 -> 6148 bytes
remote:  .swp       | Bin 0 -> 12288 bytes
remote:  index.html |   2 +-
remote:  3 files changed, 1 insertion(+), 1 deletion(-)
remote:  create mode 100644 .DS_Store
remote:  create mode 100644 .swp
remote: To git@bitbucket.org:YOU/hoge.git
remote:  * [new branch]      master -> master
To ssh://YOU@sshXXX.heteml.jp:2222/~/repos/hoge.git
   e7c36f5..c870f24  master -> master
```
【SublimeText3】Apache+PHP+Xdebugでデバッグ

### 各バージョン
* Apache2.2
* PHP5.3（ThreadSafe版）

### Xdebugを導入する
* phpinfo()を表示させる<br>
  ▶︎[phpinfoの表示のさせかた](http://php5.seesaa.net/category/1633936-1.html)
* Xdebugの導入<br>
　php.iniの設定(xdebug関係コメントアウト削除・xdebug.remote_enable=1)
* Xdebugの導入<br>
　1. phpinfoのページをコピー<br>
　2. [Xdebug導入の道案内](http://xdebug.org/wizard.php)にアクセス、コピーした内容をペーストして分析スタート<br>
　3. 表示された手順のとおりにXdebugを設定する<br>
　4. Apacheを再起動して、phpinfoを再度表示させ、Xdebugの記述があることを確認

### SublimeTextの設定
* XdebugClientをいれる（PackageControlから）
* プロジェクトを作成して、.sublime-projectのファイルを開く
* 以下を追加<br>
　　　　"settings":<br>
　　　　　　{<br>
　　　　　　　　"xdebug": {<br>
　　　　　　　　"url": "http://localhost/***/"<br>
　　　　　　　　}<br>
　　　　　　}<br>

### 実行
* ブレークポイントを設定<br>
（ブレークポイントを置きたい場所で「Ctrl+F8」）
* メニューのTools→Xdebug→StartDebuggingでセッション開始
* ページにアクセス<br>
　　http://localhost/***?XDEBUG_SESSION_START=sublime.xdebug<br>
　にアクセスして、ブレークポイントでブレイクするか確認<br>
　ポイントは?XDEBUG_SESSION_START=sublime.xdebugの部分
* Ctrl+Shift+F5で次のブレークポイントに
* Ctrl+Shift+F6でステップイン
Amazon Linux AMIでPHPを5.3から5.4にアップグレードする方法 with FuelPHP

## 手順（インストール周り）

* バックアップを取っておく

    ```
mv /etc/httpd/conf/httpd.conf{,.bk}
mv etc/php.ini{,.bk}
```

* rootに変更

    ```
su
````

* 既存のphpとhttpdの削除

    ```
yum remove php-* httpd-*
```

* ApachとPHPをインストールする（※Amazon Linuxでは、PHP5.4とApache2.4はセットで使わないといけない）

    ```
yum install httpd24 php54
```

* PHP extensionsをインストール(※必要に応じて、各自必要なエクステンションを導入すること)

    ```
yum install php54-mysql php54-pdo php54-pecl-memcached php54-mbstring php54-pecl-apc
```

    ※導入できるパッケージは下記で確認可能

    ```
yum list | grep php
```

    ※php-develパッケージをインストールしたい場合、`php54-devel`と指定すること。AWS Linuxでは`php-devel`はPHP5.3に紐付けられているようである。




* 動作確認

    ```
 php -v
```

* 自動起動設定

    ```
chkconfig httpd on
```

* 起動

    ```
 service httpd restart
```

## 手順(FuelPHP周り)

* httpd.confの編集

    ```/etc/httpd/conf/httpd.conf
<Directory /var/www/html/fuelphpAPP>
  AllowOverride all
</Directory>
```

    これで、.htaccessファイルでの設定のオーバーライドが可能になる。
    これを行わないと、自分で`httpd.conf`を設定しない限り、URLに`index.php`を含めないとアクセスできなくなってしまう。


* php.iniの設定。下記を行う。
  * http://browscap.org/ にアクセス
  * `lite_php_browscap.ini` をダウンロード (格納先はどこでもよいが、筆者は`/etc/php.d`に格納)
     (※現在、文法エラーが生じてしまうため、次の対応が必要。http://qiita.com/Keech/items/19c278bae85905b3de78)

  * `php.ini`の編集
 
     ```/etc/php.ini
[browscap]
;http://php.net/browscap
;browscap = extra/browscap.ini
browscap = /etc/php.d/lite_php_browscap.ini
```

    上記を行わないと、phpのログに下記のようなエラーが生じる

    ```
/fuel/core/classes/agent.php on line 524
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 83 bytes) in APP/fuel/core/classes/agent.php on line 524
```

## その他

* もとの`httpd.conf`からVirtualHostの設定部分をコピーしてくる際に下記の部分は削除すること
    
	```/etc/php.ini
NameVirtualHost *:80
```

    Apache2.4から、このディレクティブは意味なくなったようです。
    ( http://httpd.apache.org/docs/2.4/upgrading.html )
Qiita内で圏論に言及するエントリのまとめ (2)

[前回](http://qiita.com/sct/items/c7fb5e66ba8fa4d27403)の続きです。[Qiita内の圏論エントリ](http://qiita.com/search?page=１&q=%E5%9C%8F+%E8%AB%96&sort=stock&utf8=%E2%9C%93)を読んでいきます。ストック数が多いものに着目しています。

## [復習 モナド](http://qiita.com/mandel59/items/fdb65ae66fa51b1cfa17)

一部誤りがありますので、参照するときは注意が必要です。

> a -> b の a の方を『ドメイン domain』、 b の方を『余ドメイン codomain』と呼ぼう。
> ドメインと余ドメインを持っていて合成できるものを『射 morphism』、その全体を『圏 category』と呼ぶ。圏論は圏や射についての理論。

圏論の言葉を正しく使っています。

> 関数の圏の対象からコンテナ型の関数の圏の対象への関数 a -> f a は『対象関数 object function』、関数からコンテナ型の関数への写像 (a -> b) → (f a -> f b) は『射関数 mapping function』にあたる。関手はこの2つの関数から成り立っている。

対象関数についての記述が誤っています。 `class Functor f where ...` の `f` が対象関数です。

## [代数的データ型の「代数」 is 何](http://qiita.com/dskszk/items/a4cf720aecc4ae4563f5)

正しいことが書かれているエントリです。

> ならば(NatF(Int), l)と(NatF(String), v)はNatF-代数です.

挙げられている例は適切です。厳密に言えば `instance Functor NatF` が必要だったり `(Int, l)` の組がNatF-代数だったりしますがとるに足らぬことでしょう。

> ((List a), cons)が始代数であることが示せました.

示している内容も話の流れも適切であると感じました。

## [Contravariant なんて要らんかったんや!](http://qiita.com/jun0inoue/items/46f5df4abe19c8ad0b2c)

正しいエントリかと思います。

> Bifunctor も直積圏を定義すれば Functor に収容できるけど、newtype とか型注釈とか乱れ飛んでウザい。

同意します。

## [綱渡りと Category (と，Kleisli)](http://qiita.com/CyLomw/items/ff1e5d1600291c952c5e)

正しい内容が書かれたエントリかと思います。

> Kleisli m が「本当に」 Category のインスタンスであるためには，Category 則を満たす必要があります．

確認している内容も適切です。
tmux で画面を共有する方法（ソケットファイルを使わない方法）

普通にセッション名を指定するだけで共有できます。

```````````````````````
tmux a -t session_name
```````````````````````

セッション名は ls コマンドで確認できます。

`````````````````````
% tmux ls
1: 1 windows (created Sat Jan 24 14:55:38 2015) [80x23] (attached)
sss: 1 windows (created Sat Jan 24 14:51:41 2015) [80x23] (attached)
`````````````````````

一番左に表示している 1 と sss がセッション名です。
セッション名 sss に画面共有する場合は以下になります。

``````````````````
tmux a -t sss
``````````````````
Go by Example: Switch


(この記事は [Go by Example: Switch](https://gobyexample.com/switch) を翻訳したものです。)

switchは枝がたくさんある条件分岐を表現します。

```go
package main

import "fmt"
import "time"

func main() {
	// 基本的な例
	i := 2
	fmt.Print("write ", i, " as ")
	switch i {
	case 1:
		fmt.Println("one")
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	}

	// 一つのcase文に複数の条件をカンマ区切りで記述できる。更にdefaultも使用可能である。
	switch time.Now().Weekday() {
	case time.Saturday, time.Sunday:
		fmt.Println("it's the weekend")
	default:
		fmt.Println("it's a weekday")
	}

	// switchの最初の式がないのはif/elseのもう一つのやり方である。
	// caseに不等式を書けることもここで紹介しておく。
	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("it's before noon")
	default:
		fmt.Println("it's after noon")
	}
}
```

```console
$ go run switch.go 
write 2 as two
it's the weekend
it's before noon
```
Go by Example: Arrays


(この記事は [Go by Example: Arrays](https://gobyexample.com/arrays) を翻訳したものです。)

Goに置いてarrayは番号がついた特定の長さの要素の連続である。


```go
package main

import "fmt"

func main() {

	// 5つのintを持つarrayを作ります。
	// 要素の型と長さはarrayの型のである。
	// 最初からarrayはzero valueである。intsの場合は0
    var a [5]int
    fmt.Println("emp:", a)
    
	// indexに対応する値はarray[index] = valueの文法でセットできる。
	// 値の取得はarray[index]である。
    a[4] = 100
    fmt.Println("set:", a)
    fmt.Println("get:", a[4])
    
    // buildin関数のlenはarrayの長さを返す。
    fmt.Println("len:", len(a))
    
    // この文法をarrayをone lineで初期化するときに使ってください。
    b := [5]int{1, 2, 3, 4, 5}
    fmt.Println("dcl:", b)
    
    // array型は1次元だが、他の型を含めることにより多次元のデータ構造を表現できる。
    var twoD [2][3]int
    for i := 0; i < 2; i++ {
        for j := 0; j < 3; j++ {
            twoD[i][j] = i + j
        }
    }
    fmt.Println("2d: ", twoD)
}


```


```
$ go run arrays.go
emp: [0 0 0 0 0]
set: [0 0 0 0 100]
get: 100
len: 5
dcl: [1 2 3 4 5]
2d:  [[0 1 2] [1 2 3]]
Go by Example: If/Else


(この記事は [Go by Example: If/Else](https://gobyexample.com/if-else) を翻訳したものです。)


Goのif/elseはとても単純です。

```go
package main

import "fmt"

func main() {

	//例です。
    if 7%2 == 0 {
        fmt.Println("7 is even")
    } else {
        fmt.Println("7 is odd")
    }
    
    // elseがなくとも使う事ができます。
    if 8%4 == 0 {
        fmt.Println("8 is divisible by 4")
    }
    
    // 条件式は先に計算され、ここの条件式の変数はどこの分岐でも使う事ができます。
    if num := 9; num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has 1 digit")
    } else {
        fmt.Println(num, "has multiple digits")
    }
}
```



```

$ go run if-else.go 
7 is odd
8 is divisible by 4
9 has 1 digit

```
Go by Example: For


(この記事は [Go by Example: For](https://gobyexample.com/for) を翻訳したものです。)


for はGo唯一のループ構造である。for loopの基本的なものを上げる。


```go
package main

import "fmt"

func main() {

	// 基本的な型である。単一条件
    i := 1
    for i <= 3 {
        fmt.Println(i)
        i = i + 1
    }

	//古典的な 初期化式/条件式/最初期化式
    for j := 7; j <= 9; j++ {
        fmt.Println(j)
    }

	// 条件がないforはbreakされるかreuturnをループ内でしない限り続く。
    for {
        fmt.Println("loop")
        break
    }
}


```

```
	
$ go run for.go
1
2
3
7
8
9
loop
```


----

foreach は？

range を使う。

>A "for" statement with a "range" clause iterates through all entries of an array, slice, string or map, or values received on a channel. For each entry it assigns iteration values to corresponding iteration variables if present and then executes the block.



```go
package main

import "fmt"

func main() {
	l := [5]int{1, 2, 3, 4, 5}

	for e := range l {
		fmt.Println(e)
	}
}

```

```
▶ go run foreach.go
0
1
2
3
4

```
変数や配列とかの縦位置を揃えないほうがいい？

## 概要
`github`でコードリーディングしてるとき、見やすいように配列の要素の縦位置を整形していた`pull request`が取り込まれなかった理由に「へぇー」と思ったのでまとめた。

*※こうすべきっていうことを主張してるわけではありません*

---
とりあえずコード比較

```php:sample1
$value = 1;
$value_123 = 2;

$arr = array('a', 'b', 'c', 'd', 'e');
$arr_123= array('foo', 'bar', 'baz', 'quux');
```

```php:sample2
$value     = 1;
$value_123 = 2;

$arr     = array('a'  , 'b'  , 'c'  , 'd',   'e');
$arr_123 = array('foo', 'bar', 'baz', 'quux');
```

配列とかも要素が揃ってるほうが、対応してるところが見やすいし、
ぱっと見、下のコードのほうがきれいで読みやすそう。

でも、これにも欠点はある

## 縦位置を揃えると問題になること

例えば、名前が長い`value_123456`って変数と`$arr_123456`って配列が新しくできたとすると

```php
$value     = 1;
$value_123 = 2;
$value_123456 = 3

$arr     = array('a'  , 'b'  , 'c'  , 'd',   'e');
$arr_123 = array('foo', 'bar', 'baz', 'quux');
$arr_123456 = array('aaaa', 'bbbb', 'cccc', 'dddd', 'eeee');
```

レイアウトが崩れちゃったからほかの行も修正


```php
$value        = 1;
$value_123    = 2;
$value_123456 = 3

$arr        = array('a'   , 'b'   , 'c'   , 'd',   'e');
$arr_123    = array('foo' , 'bar' , 'baz' , 'quux');
$arr_123456 = array('aaaa', 'bbbb', 'cccc', 'dddd' , 'eeee');
```

位置調整のためだけに、他の行も修正しているし、下記のようなことに困ることもありそう。

* リビジョン管理していて`diff`するときとか、本来の修正とは無関係であるはずの変更点がいっぱいできて邪魔になる。
* 何より無関係の行の修正をしたくない。
* 長い変数を短くより分かりやすいものに置き換えるとかの単純なリファクタリングの心理的ハードルが上がる。
* レイアウトずれたときに、しっかり他の行もそろえてくれる人ばかりではない。そうなったら、このレイアウトもすぐに壊れる。
* Editorでフォント設定に影響される。プロポーショナルフォントを使っている人には見え方が違う。(そんな人いるのか？）

## 参考
[Align all array items #199](https://github.com/thephpleague/oauth2-client/pull/199)
[Vertical alignment](http://en.wikipedia.org/wiki/Programming_style#Vertical_alignment)

あんまり英語わからないんで…超意訳が入ってる場合もあると思います…
CocosStudioを使おう

CocosStudioの説明をしていきます。

##CocosStudioとは
CocosStudioはcocosの公式が提供している無料の画面構成ツールです。
UI配置やアニメーションの作成など色々なことを簡単に行うことができます。
ここで説明するCocosStudioは**Ver2.06**となります。

##主な機能

* スプライトシートの作成
* アニメーション作成
* レイアウト構成
* シーンの作成

###スプライトシートの作成
スプライトシートは、テクスチャーのAtlas化を行う機能です。
私はTexturePackerを購入済みなので特に使うことはありませんが
Atlas化ツールをもっていない方は、こちらの機能を使ってAtlas化を行うことができます。

###アニメーション作成

* 文字が横から入ってくる
* ボタンがフェードインしてくる
* パーティクルエフェクトを作成する
* パラパラアニメーションを作成する

などの個別のアニメーションを作るのに使用します。

###レイアウト構成
各UIの配置に使用します。
作成したスプライトシートを使うこともできます。
上記で作成したアニメーションも配置できますが
あくまで配置のみで動作をさせることはできません。

###シーンの作成
シーンの構成を行います。
上記で作成したレイアウトやアニメーションを配置し
エミュレートして確認することができます。

##使用可能なコンポーネント

* Button(ボタン入力)
* CheckBox(チェックボックス)
* スプライト(画像表示)
* イメージ(スプライトにタッチイベントとScale9Gridを追加したもの)
* BitmapLabel(ビットマップフォントを使用した文字列表示)
* プログレスバー(ローディングなどに使う)
* スライドバー(オプションのサウンド音量設定などに使う)
* Label(TTFファイルなどを使用した文字列表示)
* TextField(ユーザーの文字列入力)
* Particle(パーティクルエフェクト)
* TileMap(ドラクエのマップのようなタイルを敷き詰めてマップを構成)
* Audio(サウンドを鳴らす)
* Node

##使用可能なコンテナ

* Panel
* ScrollView
* Listview
* PageView

##Scale9Gridについて
実は今回この言葉を初めて見たので調べたのですが画像を9分割して、拡大縮小を行う機能ですね。
メッセージウインドウやポップアップなど
可変長文字列を表示するための枠を作るのによく使われると思います。
言葉自体は知りませんでしたが、ゲームでこの機能を作ったことはあります。

##最後に
CocosStudioは一つのプロジェクト内に複数のシーン、レイアウト
アニメーション、スプライトシートを登録することができます。
今後は各コンポーネントやコンテナの使い方と実際のゲームでの使用方法を記事にしていく予定です。
それではまた次回！！！
Qiita内で圏論に言及するエントリのまとめ (1)

[Qiita内の圏論エントリ](http://qiita.com/search?page=1&q=%E5%9C%8F+%E8%AB%96&sort=stock&utf8=%E2%9C%93)を読んでいきます。ストック数が多いものに着目しています。

## [遅延評価とはなにか、そしてモナドの話](http://qiita.com/mandel59/items/8f9111143aea94e7b363)

圏論については正しい内容が書かれたエントリかと思います。

> 今まで、「プログラムは関数だ」と思ってプログラムを書いてきましたよね。違うんです。クライスリ圏の射だって言うんです。

正しい主張です。

> モナドは（普通の意味では）遅延評価ではない。

こちらの主張にも賛同します。

## [「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも？」](http://qiita.com/myuon_myon/items/7e20c4b3af83597547d8)

ほぼ正しいことが書かれたエントリかと思います。

> 上で定義したモナドTはC→Cなる関手であるからCの自己関手の圏における対象である.

正しいです。

> 有限limitをもつ圏Cの対象Xが モノイド対象 とは, モノイド演算μ:X2→Xと単位元e:1→Xが存在して, 以下を満たすことである.

限定的な定義にはなっていますが、正しい表明です。

> C上のモナドは, 圏[C,C]のモノイド対象と同じ概念であることが分かる.

前述の定義が限定的な定義のために理論の飛躍がありますが、誤っているとまでは言えないかと思います。

## [Haskellと随伴](http://qiita.com/myuon_myon/items/d598480e4edd7a780ea7)

正しいことが書かれているエントリかと思います。

> 随伴というのは2つの関手の関係のことです.
F:C→D, G:D→Cがあったとき, 随伴F⊣G とは, 自然同型 hom(F⋅,⋅)≅hom(⋅,G⋅) のことです

正しいセンテンスです。

> Haskellでは最もtypicalな例です. s×−⊣(−)s という形の随伴です.

非常に有名な随伴です。

> (->) sは一般のsに対しては右随伴を持たないことを示してみましょう.

証明も適切です。

## [Monadを巡る困難についてのぼやき](http://qiita.com/lex_naturalis/items/e62d1dca3f528d8378b7)

ほぼ正しいことが書かれているエントリかと思います。

> 要は fmap はHaskellの函数全体が作る圏からその部分圏への函手です、fmapで函数の構造を保存したまま部分圏の函数が得られますよ、というか函手の条件を満たすようなfmapを提供することによってそういう構造保存的な部分圏を提供するんですよ、というだけのことである。ところが、部分圏の射自体がHaskellの圏の射だから、当の函手が自分自身に適用されてm (m a)のようにMonadのマトリョーシカを作ってしまう。Functorはまさにこれである。

モナドは自己関手で定義されるため、部分圏は考えない方が妥当です。が、考え方は正しいです。

> でも、入れ子を外せないと不便なので（リスト操作でしょっちゅうconcatにお世話になっていることを考えればそれは明らかだろう）、fmapに加えて入れ子を外す（というか自分に属する射を自分に属する射に移すというか）joinを提供する構造もお付けしました、というのがMonadなわけでしょ。

定義に触れていないものの、記述に誤っている部分はないと考えます。

[次回](http://qiita.com/sct/items/5d7e50549918b25cacf6)に続く。