OmniAICreator/Qiita-1.07M huggingface dataset:
[FuelPHP] ORMのObserver_Typingがすごい！

ORMのObserver_Typingについて簡単に説明すると、テーブルのカラムを増やさなくとも１つのカラムにシリアライズまたはJSONなどの文字列として保存することで、保存や取得を自動で行ってくれるものです。

例えばこのようなusersテーブルがあるとします。

```mysql
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `profiles` text NOT NULL,
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
```

nameとprofilesというカラムがありますが、このprofilesの中に、ageとnicnameという２つの要素を保存してみたいと思います。

##モデル(Model)
モデルでは、profilesのdata_typeを設定することと、$_observersにOrm\Observer_Typingを設定していきます。

```php
<?php
use Orm\Model;

class Model_User extends Model
{
    protected static $_properties = array(
        'id',
        'name',
        'profiles' => array(
            'data_type' => 'json',
        ),
        'created_at',
        'updated_at',
    );

    protected static $_observers = array(
        'Orm\Observer_Typing' => array(
            'events' => array('before_save', 'after_save', 'after_load')
        ),
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_save'),
            'mysql_timestamp' => false,
        ),
    );

}
```

##ビュー(View)
続いてビューではpostしたものが配列としてなるように書いていきます。

```php
<?php echo Form::open(array("class"=>"form-horizontal")); ?>

    <fieldset>
        <div class="form-group">
            <?php echo Form::label('Name', 'name', array('class'=>'control-label')); ?>
                <?php echo Form::input('name', Input::post('name', isset($user) ? $user->name : ''), array('class' => 'col-md-4 form-control', 'placeholder'=>'Name')); ?>
        </div>

        <div class="form-group">
            <?php echo Form::label('Age', 'age', array('class'=>'control-label')); ?>
                <?php echo Form::input('profiles[age]', Input::post('profiles.age', isset($user->profiles) ? $user->profiles->age : ''), array('class' => 'col-md-4 form-control', 'placeholder'=>'age')); ?>
        </div>

        <div class="form-group">
            <?php echo Form::label('Nicname', 'nicname', array('class'=>'control-label')); ?>
                <?php echo Form::input('profiles[nicname]', Input::post('profiles.nicname', isset($user->profiles) ? $user->profiles->nicname : ''), array('class' => 'col-md-4 form-control', 'placeholder'=>'nicname')); ?>
        </div>

        <div class="form-group">
            <label class='control-label'>&nbsp;</label>
            <?php echo Form::submit('submit', 'Save', array('class' => 'btn btn-primary')); ?>      </div>
    </fieldset>
<?php echo Form::close(); ?>
```


'profiles[age]'のように書くことで、$post['profiles']['age']という形でpostされることになります。
<h2>コントローラー(Controller)</h2>
最後にコントローラーですが、ほとんど意識する必要ありません。保存する前に値をセットするときに配列になった形のままforgeの引数に渡せば、あとは勝手にJSONに直して保存してくれます。

```php
$user = Model_User::forge(Input::post());
```


Typingの使い所としては、テーブルのカラムにならないので、データベース側で利用しないデータ（補足情報など）のみ活用すると良いと思います。
Sketchでのキーボードショートカットの設定方法


##1, システム環境設定 > キーボード > ショートカットを開く
![スクリーンショット 2014-12-08 13.48.14.png](https://qiita-image-store.s3.amazonaws.com/0/7942/57926325-1443-ac19-86c4-9e6f2c9f05df.png "スクリーンショット 2014-12-08 13.48.14.png")

##2, 左のメニューのアプリケーションを選択
![www.png](https://qiita-image-store.s3.amazonaws.com/0/7942/1a158df3-e183-821d-1614-d59159c5fa5e.png "www.png")

##3, 右枠の下の「＋」ボタンを押す
![スクリーンショット-2014-12-08-13.50.41.png](https://qiita-image-store.s3.amazonaws.com/0/7942/a217ebbf-6d22-d071-7c9e-9acfa8a5a4ec.png "スクリーンショット-2014-12-08-13.50.41.png")

##4, アプリケーションにSketchを選択し、メニュータイトルはSketchのメニューの正確な名前を入力し、ショートカットを設定する
![スクリーンショット 2014-12-08 13.55.30.png](https://qiita-image-store.s3.amazonaws.com/0/7942/c907b9bc-a11e-04c7-4b7f-bced4f071c69.png "スクリーンショット 2014-12-08 13.55.30.png")

※メニュータイトルは正確なメニューを入力する。
![めぬ.png](https://qiita-image-store.s3.amazonaws.com/0/7942/4c9f018a-b6dd-8df7-b615-26fda0be3a80.png "めぬ.png")

追加されました。
![スクリーンショット 2014-12-08 13.58.59.png](https://qiita-image-store.s3.amazonaws.com/0/7942/659daf9f-568d-5eb9-f2b6-ee8afde77c73.png "スクリーンショット 2014-12-08 13.58.59.png")

Sketch上でもちゃんと追加されているか確認。
![追加済み.png](https://qiita-image-store.s3.amazonaws.com/0/7942/cbb6fb01-d84f-2b19-33fa-0f41901d46b2.png "追加済み.png")

出来ましたね。
SwiftでUIScrollViewやUITableViewなどでスクロール方向を取得する

UITableViewやUICollectionViewなどはUIScrollViewが親クラスとなっています。UIScrollViewにはスクロールのしたことをキャッチするイベントとしてscrollViewDidScrollがありますが、それらを使って、スクロール方向を検知してみたいと思います。

ポイントとなるコードだけ下記に記述しました。

```swift
var scrollBeginingPoint: CGPoint!

    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        scrollBeginingPoint = scrollView.contentOffset;
    }
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        var currentPoint = scrollView.contentOffset;
        if(scrollBeginingPoint.y < currentPoint.y){
            println("下へスクロール")
        }else{
            println("上へスクロール")
        }
    }
```

スクロールが始まった時に scrollViewWillBeginDraggingイベントが発生するので、その時の位置をscrollBeginingPoint（始点）へ入れておきます。
次に、scrollViewDidScrollで始点から現在地が大きいかどうか比較します。今回は縦方向の動きのためY座標値で判定します。

これらを組み合わせることで、横だったり、斜めだったりも場合によっては取得可能かと思います。

以下にUITableViewを使ったサンプルコードを貼り付けておきます。
storyboardでTableViewを追加し、<span class="s1">var</span><span class="s2"> tableViewに</span>Connect Outletした状態です。

```swift
import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate  {
    
    var scrollBeginingPoint: CGPoint!

    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        scrollBeginingPoint = scrollView.contentOffset;
    }
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        var currentPoint = scrollView.contentOffset;
        if(scrollBeginingPoint.y < currentPoint.y){
            println("下へスクロール")
        }else{
            println("上へスクロール")
        }
    }
    
    
    @IBOutlet weak var tableView: UITableView!
    var items = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        tableView.delegate = self
        tableView.dataSource = self
        
        for i in 1..<100{
            items.append("item \(i)")
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        
        cell.textLabel.text = items[indexPath.row]
        return cell
    }
    
}
```
AndroidStudio（Gradle）でエラーが出たときの対処方法（メモ）随時追加

Android Studioをバージョンアップすると、Gradleもバージョンアップします。
そうすると、AndroidのBuildToolsもバージョンアップする必要が出てくる場合もあります。


GradleやBuildToolsをアップデートすると、時々意味不明なエラー :triumph: が出て対処に困るときが
多々ありましたので、そのメモです。
随時追記出来れば。
また、リクエストがあれば、何なりと。



# **現象：dexDebugタスクにてヌルポで落ちる**
dexDebugタスクで、NullPointerExceptionが発生してデバッグが出来なくなる。

		at com.android.dx.command.dexer.Main$ParallelProcessor.call(Main.java:1600)
		at com.android.dx.command.dexer.Main$ParallelProcessor.call(Main.java:1590)
		at java.util.concurrent.FutureTask.run(FutureTask.java:262)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
		at java.lang.Thread.run(Thread.java:745)
	Caused by: java.lang.NullPointerException
		at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:87)
		at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:75)
		at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:271)
		... 26 more
	...while processing <init> (Ljp/co/hogehoge/HogeActivity;)V
	...while processing jp/co/hogehoge/HogeActivity$1.class

	1 error; aborting

こんな感じでエラーが発生します。
この場合の対処方法を以下に記載します。

# 対処
# 1. ソースのチェック
HogeActivityに

	if( false )

のような、条件が決まってしまっているところがあると思いますので、そこをチェックしてみてください。
もしそういうコードがあるならば、その部分をコメントアウトするなり、条件文を修正してください。

# 2. buildtoolsのバージョン
build.gradleにある、

	buildToolsVersion "20.0.0"

を20.0.0未満にする
20.0.0未満でも、エラーは発生するのですが、これを無視して実行を続けてくれるようです。


# オススメ対処
オススメの対処は**1.**です。
Google APIでBadAuthenticationの対処

Google Analytics APIを使って、あるサーバーからデータを取得しようとしたところBadAuthentication、WebLoginRequiredなどが表示されてアクセス出来ないことがありました。

いろいろ確認しても原因がわからなかったのですが、アカウントページを色々見ていたところ、セキュリティ通知が来ていることに気づきました。
どうやら不正アクセスかもしれないということで、セキュリティロックがかかっていたようです。下記URLにアクセスして、その時間に行ったアクセスを許可することでAPIが利用可能になりました。

<a href="https://security.google.com/settings/security/notifications" target="_blank">https://security.google.com/settings/security/notifications</a>

同じような症状の人がいましたら、参考までに。

※ちなみに海外のコミュニティでは<a href="https://accounts.google.com/DisplayUnlockCaptcha" target="_blank">https://accounts.google.com/DisplayUnlockCaptcha</a>へのアクセスするようにありましたが、上記の事象は解決されませんでした。
[WordPress]Googleアナリティクスからランキングを表示するプラグイン、Simple GA Rankingは本当に素晴らしい

弊社が運用する<a href="http://192abc.com/" target="_blank">こそだてハック</a>ではWordPressを使用していますが、ランキング表示に人気のある「Wordpress Popular Posts」というプラグインを使っていましたが、アクセス毎にPVをカウントするためサーバー負荷が高くなってしまいました。

そこでGoogleアナリティクスからアクセス数を取り出すように出来ないかと思い、いくつかの方法を探しましたが、中でも<a href="https://wordpress.org/plugins/simple-ga-ranking/" target="_blank">Simple GA Ranking</a>というプラグインが素晴らしかったので紹介したいと思います。あまり記事がなかったので、あまり使われてないのかな？
##Simple GA Rankingのほんとうに素晴らしい点
<ul>
	<li>GAから簡単にランキングをとれる（日数、件数が設定可能）</li>
	<li>取得結果に24時間キャッシュがかかる（WPにTransients APIという機能があることを初めて知って感動）</li>
	<li>WordPress側のカテゴリや、GA側のフィルタを使って絞込可能</li>
	<li>apply_filtersで表示結果をカスタマイズ可能</li>
</ul>
ソースコードも見ましたが、開発はAmimotoやめ組テーマを作っているDigitalCubeさんの方のようなので、さすがWordPressを知り尽くした方々によって作られたプラグインだと思いました！！

~~ただ弊社の環境では、いくつかのカテゴリ別のランキングを10件出す必要があったので、プラグイン内のソースをいじりました。~~

**→作者の方からのコメントにより訂正します。ソースをいじらずに調整可能です。**



<h2>調整した点</h2>
ランキングをカテゴリ別に表示させたりしない人には関係ありません。
110行目あたりに、GAからデータを取得するメソッドがあります。
<pre class="lang:default decode:true">$ga-&gt;requestReportData( 
		$options['profile_id'],
		array('hostname', 'pagePath'),
		array('pageviews'), array('-pageviews'),
		$filter_val,
		$options['start_date'],
		$options['end_date'],
		1,
		apply_filters( 'sga_ranking_limit_filter', 30 )
);</pre>
このプラグインではGAから30件のみ取得することになっています。この取得した結果にたいして、必要なものを絞り込んで表示する仕組みになっています。そのため、30件中、仮にAというカテゴリの記事が2件しかなければ、ランキングを10件表示させる設定にしていても2件しか表示されなくなりました。
そのため暫定的に200件ほど読み込んで処理をするように変更しました。APIのアクセスはキャッシュがかかりますので、1回だけ少し負荷がかかりますが、そこまでの差ではありません。

Theme内のfunctions.phpに下記コードで件数を調整します。

```
add_filter( 'sga_ranking_limit_filter', function($limit) { return 200; } );
```

以上で、無事に各カテゴリのランキングも表示されました。200件という件数についてはそれぞれサイトの仕様によって調整してみてください。

以上になります。

そこそこのアクセス数のあるWP管理者さんで、まだWordpress Popular Postsを使っているのであれば、ぜひ利用してみてください。

<a href="https://wordpress.org/plugins/simple-ga-ranking/" target="_blank">Simple GA Ranking</a>
mRDT で mruby をビルドしてみる


 mRDT (mruby Development Tool)は，mruby を用いたアプリケーションを Eclipse で開発するためのプラグイン/フィーチャーのセットです．
独自開発部分は EPL-1.0 で，依存するコンポーネントも OSI approved なライセンスに基づき，無償で利用できます．

 本稿では，mRDT を用いて，mruby の開発を行ってみます．

 mRDT のインストールについては，下記を参照してください．

- [mRDT (8.5) を公式配布の Eclipse (Luna) で使う](http://qiita.com/monamour555/items/55e16071ba03df6a0e4c)


# minirake プロジェクトの作成

mRDT のインストールは完了したものとして，実際に mruby のビルドを行ってみます．

新規プロジェクトの作成ダイアログを出す方法はいくつかありますが，ここではメニューから呼び出してみます．
[File] - [New] - [Project...] と辿ります．

![新規プロジェクト作成ウイザードの呼び出し](https://qiita-image-store.s3.amazonaws.com/0/5414/e2ea3343-f136-bb59-4f82-40e7e7d28a18.png "新規プロジェクト作成ウイザードの呼び出し")

すると，生成するプロジェクトの種類を選ぶツリーリストが現れますので，[Mruby]-[minirake project]を選択し，[Next >]を押します．

![minirake project の選択](https://qiita-image-store.s3.amazonaws.com/0/5414/d0a77c56-a20f-0ef9-88ab-82dbffa26138.png "minirake project の選択")

(将来のバージョンでは，[File] - [New] - [Mruby Project] で選択できるようになるかもしれません．)

## プロジェクト名の入力

ダイアログの画面が遷移し，プロジェクトの名前や場所を指定するよう促されます．

![プロジェクト名の入力](https://qiita-image-store.s3.amazonaws.com/0/5414/860de9b8-2759-c98d-755b-5bed73c97923.png "プロジェクト名の入力")

本稿では，my-first-mruby と名づけました．自由な名付けが可能ですが，多バイト文字や空白は避けたほうが無難でしょう．

その他の項目については，弄る必要はありません．
[Finish]を押して生成を終了することができますが，ここで[Next >]を押してテンプレートを選択することで，環境構築の手間を省くことができます．

## テンプレートの選択

![テンプレートの選択](https://qiita-image-store.s3.amazonaws.com/0/5414/91b6dec8-16f8-ff56-d303-2d08edba883a.png "テンプレートの選択")

テンプレート選択ページでは，典型的な mruby のソースツリーのアーカイブを選択することができます．
ここでは，軽量Rubyフォーラムがリリースした安定版1.0.0を選択するために[mruby forum (core only)]をクリックします．
[Finish]を押すと，ダイアログが閉じます．

# ビルド

mRDT は，プロジェクト内のファイルの更新を自動検知して，minirake を実行します． 
テンプレートの選択を行うと，ファイル群がプロジェクト内にデプロイされますので，minirake が実行されます．

実行の様子は，ステータスバーや，Consoleタブの出力で確認ができます．

![ビルド中を示すステータスバー](https://qiita-image-store.s3.amazonaws.com/0/5414/4cf0df31-b24c-b675-2f06-5af63976e8e7.png "ビルド中を示すステータスバー
")

![コンソールタブ](https://qiita-image-store.s3.amazonaws.com/0/5414/20c76757-ea92-b7dc-409c-234a5a1e583f.png "コンソールタブ")

## ビルド結果の確認

プロジェクトのツリーを開くと，bin/ ディレクトリに，生成された実行可能形式 (mruby / mirb / mrbc) が表示されるはずです．

![スクリーンショット 2014-02-24 11.19.29.png](https://qiita-image-store.s3.amazonaws.com/0/5414/d1fd062b-ff48-f73c-87c2-c7b938f37ce1.png "スクリーンショット 2014-02-24 11.19.29.png")

### プロジェクトのリフレッシュ

ビルドが完了すると，プロジェクトのツリー表示がが更新される…はずですが，なんらかのバグにより，ビルドが完了してもリフレッシュされない場合があります．その場合は，プロジェクトのルートをクリックしたあとで右クリックメニューを開き，[Refresh] を選択してください．

![プロジェクトのリフレッシュ](https://qiita-image-store.s3.amazonaws.com/0/5414/49e29b46-e21b-baae-2fad-ce7a6938eca8.png "プロジェクトのリフレッシュ")

# この先の注意点

ここから先は，ほぼ mruby と Eclipse の知識だけで実開発を進められるはずです．
しかし，mRDT 固有の癖のようなものもあります．
多くのユーザが疑問に思う点について，いくつか挙げておきます．

## CDT との関係

C/C++ での開発を支援するため，多数の機能を CDT から継承/活用しています．しかし，ビルダ周りはCDTが提供するものを一切使っていません．ビルドの内容をカスタマイズしたい場合は，minirake の関連ファイルを修正することで対応してください．

## DLTK/Ruby との関係

Ruby スクリプトでの開発を支援するため，多数の機能を DLTK から継承/活用しています．しかし，mruby 固有の機能との統合は，不十分です．

## 他の Ruby 関連プラグインとの関係

Eclipse での Ruby 開発には，DLTK 以外にもいくつか存在しますが，それらと mRDT を混在させたときの挙動は整理されていません．

# おわりに

mruby はまだアーリーステージにあり，ユーザのスキルも高めです．
そのため，vimやEmacsのような通好みのCUIエディタで編集し minirake を実行，という紹介になりがちです．
mruby を広く使って頂こうとするとき，要求スキルの高さは，いずれ問題になるかもしれません．
mRDT 開発チームはそのように考えています．

mRDT が，ユーザスキルの敷居を少しでも下げ，初学者にも優しい mruby への一助になれば幸いです．
[WordPress] nginxでモバイルとPCでテーマを分ける方法

WordPressでnginxを使う場合にリバースプロキシを使うことで強力な高速化できると思いますが、PCとモバイルでテーマを分けている場合、リバースプロキシで作ったキャッシュをモバイルとPCで分けておかないと表示がぐちゃぐちゃになってしまいます。

そこでnginxにユーザーエージェントによってキャッシュを分けるやり方をお伝えします。（nginxのリバースプロキシのセットアップについては、いくつも参考になるサイトがあるので省きます）
<h2>Nginxの設定</h2>
（下記の設定ファイルは一部抜粋です）

```nginx
server {
    
    //ほかは省略
    
    set $mobile '';
    if ($http_user_agent ~* '(DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDIPOCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftBank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobile-converter|PSP)') {
        set $mobile "@ktai";
    }
    if ($http_user_agent ~* '(iPhone|iPod|incognito|webmate|Android.*Mobile|dream|CUPCAKE|froyo|BlackBerry|webOS|s8000|bada|IEMobile|Googlebot\-Mobile|AdsBot\-Google)') {
        set $mobile "@smartphone";
    }
}
```

$mobileという変数にuseragentに該当するものであれば、@ktaiや@smartphoneと言った文字列を渡します。

```nginx
location / {
    if ($uri ~ \.(gif|jpg|png|ico|js|css)$) {
        access_log off;
    }
    proxy_no_cache     $do_not_cache;
    proxy_cache_bypass $do_not_cache;

    proxy_redirect     off;
    proxy_cache czone;
    proxy_cache_key "$scheme://$host$request_uri$mobile";
    proxy_cache_valid  200 1h;
    proxy_pass http://backend;
}
```

proxy_cache_keyに先ほどの$mobileを付加します。

こうすることで、同一URLでも「ktai」と「smartphone」と「それ以外（主にPC）」の3種類のキャッシュが生み出されることになりました。
<h2>ワードプレスの設定</h2>
今度はNginxで分けたユーザーエージェントと同じ条件でテーマの表示分けをワードプレス側でする必要があります。それには<a href="https://wordpress.org/plugins/useragent-themes-switcher/" target="_blank"><strong>UserAgent Themes Switcher</strong></a>というプラグインを使っていきます。このプラグインにはNginxと同じ正規表現を設定していきます。

<img class="alignnone size-full wp-image-843" src="http://tech.eversense.co.jp/wp/wp-content/uploads/2014/11/a39d91a6d0165ae9ae11ae4a34903d92.png" alt="スクリーンショット 2014-11-28 15.49.33" />

スクリーンショットにあるような形です。実際にはktaiサイトはモバイルとして扱っているので、意味はありませんが、一応分けて設定しているといったところです。

弊社では下記の正規表現でユーザーエージェントを区分しています。
<pre class="lang:default decode:true" title="スマートフォン">iPhone|iPod|incognito|webmate|Android.*Mobile|dream|CUPCAKE|froyo|BlackBerry|webOS|s8000|bada|IEMobile|Googlebot\-Mobile|AdsBot\-Google</pre>
<pre class="lang:default decode:true" title="ktai">DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDIPOCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftBank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobile-converter|PSP</pre>
&nbsp;

ユーザーエージェントについては完全では無いと思いますが、ほとんどの場合は問題ないかなと思います。

以上で、強力なキャッシュを保ちながら、モバイルとPCでテーマを分ける事ができました。
キーワード引数の2.0系と2.1系のデフォルトの振る舞いの違い

キーワード引数を使う時にこんな風に書いてるのを見たことがあったのでそのまま真似して使ってました。

```rb
def foo(arg1: arg1)
  arg1
end
```

ここで`p foo`すると2.1系なら`nil` が返ってくるんですが、2.0系だと

```
NameError: undefined local variable or method `arg1' for main:Object
```
になってしまいます。

なので引数がなかった時に`nil`を返すキーワード引数は

```rb
def foo(arg1: nil)
  arg1
end
```

と書いたほうがよさそうです。

キーワード引数を省略不可にするときは2.1系なら

```rb
def foo(arg1:)
  arg1
end
```
2.0系なら

```rb
def foo(arg1: _)
  arg1
end
```

と使いましょう。
sails.jsでどのController/Modelからも参照できるLogラッパーを作る

# モジュールを作る
`/api/services/`以下にmodule.exportsしたモジュールを置けばどのController/Modelからも参照できます。

*追記*
下記コメントより、lodashが有効になってるためUnderscoreは不要らしいです..まあサンプルとして眺めてください。

例えばフロントエンドで大活躍のUnderscore.js、これをバックエンドでも使いたいことがあります。

underscoreモジュールをインストールして...

```
$ npm install underscore --save 
```

これを普通に使うのはrequireしたら出来るんですが、UnderscoreのようなユーティリティーモジュールをController/Modelごとに個別で読み込むのは面倒。そんなときは`api/services`以下にラップしたモジュールを置きましょう。

``` /api/services/_.js
module.exports = (function(){
  var _ = require('underscore');
  return {
    each: _.each,
    contains: _.contains
  };
})();
```

これでどの場所からでもrequire()せずに`_.each()`で呼び出せます。


# ログモジュール
次はログモジュールを作ります。sails.js(node.js)でのログ出力はフロントと同じで`console.log()`ですが、サーバーサイドということを考えるとこれだと不十分。なのでログモジュールを作り、環境ごとに出力を変更したり、今後の拡張性を考えた作りにしておきましょう。

今私が使っているログモジュールは以下のような感じになっています。業務で[Slack](https://slack.com/)を使っているので、問題が発生した場合、観測したい事象が発生した場合はSlackにログを投げるようにしています。

まずはSlackモジュールをインストールして...

```
$ npm install slack-node --save 
```

以下のコードを`/api/services/`に配置します。Slackモジュールに設定する値は[リファレンス](https://www.npmjs.org/package/slack-node)を元に設定してください。Slack-tokenはSlackの`add service integration`から取得できます。

``` /api/services/Logger.js
module.exports = (function(){

  var slackNode = require('slack-node');
  var slack = new slackNode("slack-token", "team-name");

  var postSlack = function(text, callback) {
    if (!callback) callback = function(){};

    slack.webhook({
      channel: '#general',
      username: 'bot-bot',
      text: text
    }, function(err, response) {
      if (err) {
        callback(err, null);
        return;
      }

      callback(null, response);
    });
  };

  var info = function(msg) {
    if (process.env.NODE_ENV === "production") {
      postSlack(msg);
    }
    else {
      console.log(msg);
    }
  };

  var debug = function(msg) {
    if (process.env.NODE_ENV !== "production") {
      console.log(msg);
    }
  };

  var err = function(msg) {
    if (process.env.NODE_ENV === "production") {
      postSlack(msg);
    }
    else {
      console.log(msg);
    }
  };

  return {
    i: info,
    d: debug,
    e: err
  };
})();
```

これで完了。あとはログを出力したいタイミングで、以下のように呼び出す。`Logger.i()`ならローカル環境ならコンソールに、production環境ならSlackにログを投げてくれる。

```
Logger.i("hoge");
```
Node.jsのアンインストール方法


パッケージでインストールしたNode.jsをHomebrewで管理したいと思ったので、一旦アンインストールする。で、その方法。

## アンインストールするためのコマンド

```コマンド
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

とりあえず、コマンドをバラしてたたいてみると分かりやすいです。
Chromeの検索エンジンの設定を使いこなしていろんなとこから瞬間検索


以下の動画はChromeの検索エンジン設定を使って

- Googleの英語版で検索する (g->スペース->検索クエリ)
- 英辞郎Web版で単語を引く (alc->スペース->検索クエリ)

ことをデモしてます。

![chrome_search.gif](https://cloud.githubusercontent.com/assets/272083/5334845/41e223ce-7edf-11e4-8e06-c1f849a652b8.gif)

他にも

- Wikipediaの記事
- Dictionary.comのシソーラス
- Pythonのドキュメント

などなど
検索っぽいことが提供されているものならなんでも使えます。

## やり方

Chromeの設定を開く

![chrome1.png](https://qiita-image-store.s3.amazonaws.com/0/6664/bc3d5626-03d2-56b6-16b4-804cc99b553d.png "chrome1.png")

検索エンジンの管理を開く

![chrome2.png](https://qiita-image-store.s3.amazonaws.com/0/6664/7a67a2b0-dbd0-3787-4676-78c740e9d13d.png "chrome2.png")

その他の検索エンジンに使いたいものを設定する。
コツはキーワードの部分を打ちやすい数文字にしておくことです。

![chrome3.png](https://qiita-image-store.s3.amazonaws.com/0/6664/040c8e18-ced6-526f-7dd0-96791c6ec0c7.png "chrome3.png")

ここでは以下のように設定してます。

| 検索エンジン名 | キーワード | URL |
|--------|--------|--------|
| google.com | g | https://www.google.com/search?q=%s&hl=en
| 英辞郎 | alc | http://eow.alc.co.jp/search?q=%s

- 検索エンジン名は何を入れても大丈夫。わかりやすいものでOK。
- キーワードは短めのそれ以外の目的では打ち込まないような単語を設定する
- URLは設定したいサイトの検索キーワードの部分を%s(%SでもOK)にして打ち込む
iOS8でwindow.close()が動かないバグについて

※2014年11月のiOS 8.1.1アップデートで修正されています。(よかった…)
しかし、社内にも、アップデートしていない人がいたりしたので、メモを残します。
<br>

iOS 8.0.x, 8.1.0 のSafariでは、`window.close()`が動かないバグがあります。

EC-CUBEを使った案件で、このバグの対応をしました。

いろいろ調べてみたけれど、どうやら`window.close()`の使い方がおかしいのではなく、iOS8のSafariで、動かないようになっているみたいでした。


Appleの人は

>This is a known bug. There isn’t a workaround, sorry.
(あー知ってる。回避策はない。すまん。)

と、言っています。。。

そっか、まじで閉じる方法ないんや…
待つしかないやん。でも、どう見てもおかしい！って感じるよね…

ってことで、なんとか頭ひねりました。

## 解決策(EC-CUBEスマホ)

### 不具合内容

* お届け先編集のページで、登録ボタンを押すと、エラーメッセージは出ず、編集画面が表示される。(画面が閉じない。)
* 親画面を見てみると、編集は正常に完了している。

### 対象ページ

* `/mypage/delivery.php`のページのお届け先編集ボタンを押して開かれる、`/mypage/delivery_addr.php`のページ

### ページの仕様

* `/mypage/delivery_addr.php`のページだけで完結する(完了用などの他ファイルはない)

### ページ遷移方法

①編集画面
　↓
②登録するボタンを押す
　↓
③裏でチェックが走る(エラーあり)
　↓
④エラー表示を追加し編集画面を表示する
　↓
⑤裏でチェックが走る(エラーなし)
　↓
⑥編集画面が表示されるが、裏で生成されたjsにより、画面が閉じる。親画面が更新されている。

* ⑥で生成されるjsに、`window.close()`が記載してあり、通常であれば、ユーザーの体験は、登録ボタンを押すと(エラーがなければ)、画面が閉じる。

### 解決方法

* ⑥でjsが生成されていた場合、編集画面ではなく、「登録が完了しました。画面を閉じてください。」などの文言を表示する。
* つまり、  
`window.close()`が正常に動くデバイスは、ボタンを押したら画面が閉じ、  
`window.close()`が動かないデバイスは、ボタンを押したら、上記の文言が表示され、デバイスを操作して画面を閉じる。

#### 編集ファイル
`/mypage/delivery_addr.tpl`

```smarty
<!--{if $tpl_onload}-->
	登録が完了しました。<br>
	この画面を閉じ、元の画面を更新してください。
<!--{else}-->
	(編集画面のコード)
<!--{/if}-->
```

補足すると、`<!--{$tpl_onload}-->`で生成されるjsは、popup_header.tplのファイルの中に表示されます。
CodeSnifferのインデントをタブ対応にする方法

[PHP_Beautifier]:http://pear.php.net/package/PHP_Beautifier/
[phpCodeBeautifier]:http://www.waterproof.fr/products/phpCodeBeautifier/
[php-cs-fixer]:http://cs.sensiolabs.org
[PHP_CodeSniffer]:http://pear.php.net/package/PHP_CodeSniffer
[PSR]:http://www.php-fig.org/
[FuelPHP]:http://fuelphp.com
[Fuelphpのコーディング標準]:http://fuelphp.com/docs/general/coding_standards.html

関連記事:

 * [コーディング規約自動調整ツールCodeSnifferとphp-cs-fixer]
 * [CodeSnifferのインデントをタブ対応にする方法]

[コーディング規約自動調整ツールCodeSnifferとphp-cs-fixer]:http://qiita.com/dozo/items/ed4baa58a0131945ad6f
[Gitのpre-commitでコーディング標準を自動調整]:http://qiita.com/dozo/items/04cd258876d3939f3e94
[CodeSnifferのインデントをタブ対応にする方法]:http://qiita.com/dozo/items/d581597570dba436dd8c

gsherwood氏の記事より
https://gist.github.com/gsherwood/9d22f634c57f990a7c64

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

コーディング標準を自身で決める環境であれば、
あまり関係ないけれども。
プロジェクトに途中から参画したときは、
すでに存在しているコーディング標準に併せることは珍しくない。

なので、世の中はスペース字下げの方向に向かってるからと言って、
タブ字下げに対応しなくていいのかという話にはならない。
実際私もかかわっているプロジェクトはタブインデント。
[Fuelphpのコーディング標準]に合わせた結果こうなっている。

さて、前回記事([コーディング規約自動調整ツールCodeSnifferとphp-cs-fixer])にて紹介した
[PHP_CodeSniffer]2.xですが、
これには自動でコーディング標準に調整してくれる[php-cs-fixer]みたいな機能が付いた。
基本的にはスペース字下げにするんだが、
これをタブに対応することができるようなので、
ちょっと記事にしてみよう。

------------------- ↑ 余談はここまで ↑ -------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

### [PHP_CodeSniffer]のインストール

コーディング標準をPSR2として、
４スペース１タブにした場合を想定。
念のためcomposerインストールから記述する。

```shell-session
$ mkdir phpcs; cd phpcs;                       # ディレクトリ作成
$ curl http://getcomposer.org/installer | php  # composerのダウンロード
$ ./composer.phar init -n -s dev               # composer.jsonの生成
$ ./composer.phar config bin-dir "bin/"        # binディレクトリ指定
$ ./composer.phar require "squizlabs/php_codesniffer" "2.*" --prefer-dist # インストール
```

### rulesetの追加

ruleset.xmlというファイルを作る

```ruleset.xml
<?xml version="1.0"?>
<ruleset name="MyStandard">
    <description>PSR2 with tabs instead of spaces.</description>
    <arg name="tab-width" value="4"/>
    <rule ref="PSR2">
        <exclude name="Generic.WhiteSpace.DisallowTabIndent"/>
    </rule>
    <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
    <rule ref="Generic.WhiteSpace.ScopeIndent">
        <properties>
            <property name="indent" value="4"/>
            <property name="tabIndent" value="true"/>
        </properties>
    </rule>
</ruleset>
```

### 実行

```shell-session
$ ./bin/phpcs --standard=ruleset.xml sample.php    # チェック
$ ./bin/phpcbf --standard=ruleset.xml sample.php   # 自動調整
```
postgresqlを他ホストからもつなげるようにする

postgresqlはデフォルトでは自ホストからしか繋げないようになっています。そのためVagrantで仮想マシンをつくりその中につくったpostgresqlにクライアントアプリからアクセスするためには設定が必要になります。

##1. postgresq.confファイルの修正
```linux
#postgresql.confを編集
listen_addresses = '*'　←コメントを解除し、''内を * に修正
port 5432　←コメントを解除し、ポート番号を変更する
```
postgresql.confを再起動

```linux
# /etc/rc.d/init.d/postgresql restart
```

##2. ポートを開く
ポート5432を開くためにiptablesを編集。

```linux
#iptablesに追加
-A INPUT -p tcp --dport 5432 -j ACCEPT
```
iptablesを再起動。

```linux
# /etc/rc.d/init.d/iptables restart
```

##3. 接続できるクライアントを設定する
pg_hba.confファイルを編集。
「trust」は無条件でデータベース接続を許可するため、セキュリティを考慮する場合は、「trust」を「password」などにする。

```linux
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
```

pg_hba.confを再起動

```linux
# /etc/rc.d/init.d/postgresql restart
```

参考:
* 基本：http://rina.jpn.ph/~rance/linux/postgresql/connect.html
* 一部：http://nobuneko.com/blog/archives/2010/03/postgresqlpsql_fatal_ident_aut_1.html
MacもWinもスクリーンショットはLightshotが便利

![Lightshot](https://st.prntscr.com/2014/12/04/1109/img/logo-landing.png)

Macユーザーであれば、デフォルトのキャプチャコマンド
`[Cmd+Shift+4]`を使う

Windowsであれば
`Snipping Tool`起動や、Print Screenコマンド

することで、スクリーンショットすることができると思います。

もう少し機能を拡張させ、軽量にキャプチャできるツールが、[Lightshot](https://app.prntscr.com/en/index.html)です。
私はMacユーザーですが、SkitchよりもLightshotのほうがコンパクトで使いやすかったです。

![](https://st.prntscr.com/2014/12/04/1109/img/media-screen-1.jpg)

###いいところ
・メニューバーやショートカットからも呼び出せる
・保存とクリップボードを選べる→ここが好き！
・ちょっとした落書きができる
・google画像検索が出来る

入れておくと捗るかも、というお知らせでした。


[Lightshot](https://app.prntscr.com/en/index.html)
【swift】UITableViewの空行のseparatorを消す

自分用メモ。
↓の記事を参考にしました。
http://qiita.com/wmoai/items/cc989a1a2ac882136148

```lang:swift
var v:UIView = UIView(frame: CGRectZero)
v.backgroundColor = UIColor.clearColor()
tableView.tableFooterView = v
tableView.tableHeaderView = v

```

これだけです。
とうちゃんとチビ（小4男子）とIT

本記事は[「子供」×「ネット」 Advent Calendar 2014](http://www.adventar.org/calendars/450)の8日目の記事です。

### はじめに

#### とうちゃんの仕様
* [@mnagaku](https://twitter.com/mnagaku)
* [researchmap](http://researchmap.jp/mnagaku/)
* [slideshare](http://www.slideshare.net/mnagaku/presentations)
* ゲームとか教育とか映像配信とか国立研究所職員とかで、仕事始めて20年
* コード書く人

#### チビの仕様
* 小4男子
* GGJ2014「宇宙の運命、地球の未来」　[プレイアブル](http://goo.gl/pe9qim)　[作品紹介](http://globalgamejam.org/2014/games/%E5%AE%87%E5%AE%99%E3%81%AE%E9%81%8B%E5%91%BD%E3%80%81%E5%9C%B0%E7%90%83%E3%81%AE%E6%9C%AA%E6%9D%A5)
* ランドセルが異常に軽くて教科書を全部学校に置いてる事がバレて怒られるぐらいに無計画で雑

### 子供とコンピュータの距離感
　自分がコード書くこともあって、チビは小学校に上がったくらいから、ビジュアルプログラミングを中心にちょこちょこ触ってる。[Blockly](https://blockly-games.appspot.com/)、[MOONBlock（前田ブロック）](http://maedablock.jp/)、[Twine](http://twinery.org/)、[アトラスX改（自家製）](http://www.slideshare.net/mnagaku/sqip2014-nagaku)など。
　といっても、チビだけで自由に触れるPC、タブレット、スマホは用意していないし、やるとしても親のいる場所で1時間と決められていて、親が積極的に英才教育しようとか考えているわけではない。チビは、夢中になると、文字通り言葉が耳に入ってこないタイプなので、逆に他の家庭より距離をとらせてるぐらいだと思う。
　最近は、マンガやアニメ、3DS（2ヶ月前にやっと買ってもらった）のゲームなんかについて、ネットで調べたい、調べて欲しいと頻繁にリクエストが来るようになった。こうしたPC、タブレット、スマホを使った調べ物も、休日の1時間の枠内で、親が見ている環境でやらせている。そのへんの話題を探すと、広告だらけのまとめサイトに飛んだりして、親としてはビミョーだったりする。

### とうちゃんの考え
　うちの場合、嫁が厳しめで、自分はもうちょっとうまいこと接点持たせてやりたいなと思ってた。が、3DSが来て分かったのは、チビはまだ自己管理ができない、という事実だった。同じ年でできる子もいるとは思うが、チビには無理だった。約束を守れば1日1時間は遊んでよいというルールなのだが、あまりにも約束破りがヒドくて、遊んだ日より遊ぶのを禁止されてる期間の方が長いくらい。
　約束を守れば毎日遊べるので、頑張って守ろうという方向に考えてくれればよいのだけど、今のところ、都合の悪いことは考えない、忘れたいと思っている様子。そんなことで逃げ切れないことが世の中にはいっぱいあるので、早く考えれるようになって欲しいなと思っている。
　なので、まずは自己管理の下に3DSで毎日遊べる状況にしていくのが目標で、ネットどうこうはその先の話かな。小学生の間に何とかしないと、中高生になってからが厳しいだろうと思ってる。

### 通信回線の向こう側だけが「ネット」じゃないだろう
　「ネット」の捉え方にもよるんだろうけど、自分は基本的に、リアルで知ってる人、知り合った人とやりとりするための道具だと思ってる。「ネット」で知り合う人もいるけど、継続的にやりとりする場合は、殆どの場合、どこかのタイミングで顔を合わせる。なので、人間のネットワークが本質で、それが便利に使える道具として「ネット」を見ている。実際にはそれを超える可能性があるのだと思うけど、そこはまだ価値も位置付けも定まっていないと思うので、オプション扱い。
　うちでは割と頻繁に、とうちゃんとチビでお出かけして、とうちゃんの関連イベントに参加するというのをやる。親の見える範囲内、フィルタリングされた範囲内で、いろんな人に会える機会を作っている。そこで経験したことが、将来、「ネット」で人と知り合って関係を作っていく基礎になればいいと思っている。いきなり「ネット」だから心配な面はタブンあると思う。いろんな人に会って関係を構築した経験が十分にあれば、親ももっと安心して子供を見ていられるんじゃないかな。子供は、普段の行動範囲が固定なので、その中でしか関係構築の訓練ができない。環境が訓練に十分だと思えないなら、親がそれをしてあげるべきだろう。できれば、変化があった方が良い。熱心に、子供向けの教育イベントに連れて行くのも良いが、同じような雰囲気の場所に何回行っても、関係構築の訓練という意味では、稼げる経験値が漸近的に0に近づく。
　20年も働いていれば、スゴい人たちと知り合いにもなれる。イベントのたびに、チビをスゴい人たちに結構会わせてきた。そこで交わした言葉が、いつかチビの役に立つこともあるだろうと思ってる。「ネット」じゃなくても、そーゆー体験の機会を親は作ってあげられる。

### さいごに
　とりとめのない話になったけど、とうちゃんとチビのリアルについて書いてみた。理想とか、こうあるべきとか言っても、子供は1人ずつ違うので、周囲の大人がその子に合う形で考えてあげないとダメなことって多いよね。「ネット」もそうだと思う。まだ10年、とうちゃんとチビの冒険は始まったばかりだ！Fin.（@mnagaku先生の次回作にご期待下さい！）
* * *
### おまけ：GlobalGameJam
　毎年1月に世界中でゲームを作るお祭り「[GlobalGameJam](http://globalgamejam.org/)（略称：GGJ）」が行われています。日本でも各地に会場が設けられていて、プロのゲーム開発者や学生が即席チームで2日でゲームを作っています。私は例年、会場責任者を務めているのですが、GGJ2014では、チビと一緒に会場に遊びに行って、ゲスト参加的にゲームを作ってきました。子供が半日程度でゲームを作るソリューションもいろいろあるので、普段、お子さんがゲームを作ったりしているようなら、会場責任者に問い合わせて、見学やゲスト参加について聞いてみてもいいかも知れません。
突然MacVimアップデートしたらカラースキーマが効かなくなった件


MacVim7.4のアップデート通知が来たので、特に何も意識せずアップデートしたらカラースキーマが消えたので対応方法をシェア。

下記のようにcolorchemaとしては、[molokai]を指定している

```~/.gvimrc
colorscheme molokai
```

最新版インストール後に、MacVimを起動するとカラースキーマがデフォルトに。。。なぜ。。

少し調べるとカラースキーマファイルの保存場所が変わっていたことが原因だったらしいとわかる。

####カラースキーマファイルの保存場所
|-|パス|
|---|---|
|元々|/usr/share/vim/vim73/colors/[ColorschemaName].vim|
|今回から|~/.vim/colors/[ColorschemaName].vim|

なので、変更後のファイルを作成してあげて、上記からコピーしてMacVimを起動し直すと元に戻った。よかった。

```
$ mkdir ~/.vim/colors
$ cp /usr/share/vim/vim73/colors/molokai.vim ~/.vim/colors/molokai.vim
```

ちょっとググるとほとんどのページで~/.vim/colorsに保存するように書いてある。。なぜ、今まで効いてたのかが謎なのかもしれない。。
コマンド一発で DeployGate でアプリ配信 for Corona SDK


皆さんは、Corona SDK で開発したアプリを実機で確認するとき、どうやって実機にアプリ配信していますか？私は、実機とケーブルを繋ぐことが面倒で、いつも、[DeployGate](https://deploygate.com/) を利用しています。iOS / Android アプリ共に、DeployGate を利用することで、手順が共通化され、簡単にアプリ配信が行えるようになります。

今回は、Corona SDK で開発したアプリを、コマンド一発で DeployGate 経由でアプリ配信する方法について紹介します。

## Corona SDK でビルド

いつものやつですね。
iOS アプリをビルドすると `xxxxx.app` というファイルが、Android アプリをビルドすると `xxxxx.apk` というファイルが自動生成されます。

## IPA ファイルを作成 for iOS

iOS アプリの場合は、別途、IPA ファイルを作成する必要があります。
IPA ファイルは、Payload というディレクトリを作成して、そこに `xxxxx.app` ファイルを放り込んで ZIP で固める必要があります。

面倒臭いので、ここまでの作業を自動化しましょう。

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

NAME="/Users/fakestarbaby/Desktop/${PWD##*/}"
if [ $# = 1 ]; then
  NAME=$1
fi

if [ ! -e $NAME.app ]; then
  echo "$NAME.app: No such file or directory"
  exit 1
fi

if [ -d "Payload" ]; then
  rm -fr Payload/*
else
  mkdir Payload
fi

cp -rf $NAME.app Payload
zip -r $NAME.ipa Payload
rm -fr Payload
```

アプリのプロジェクトのルートディレクトリで上記プログラムを実行することで、デスクトップ上に生成済みの `xxxxx.app` ファイルから IPA ファイルを自動生成します。

注) 前提条件として、ビルドしたときのアプリ名称と、アプリのプロジェクト名称が同じ名称になっている必要があるので注意してください。

## DeployGate へアップロード

DeployGate が提供しているコマンドラインツールをインストールすれば、コマンド一発で簡単にアプリをアップロードすることが出来るようになります。

詳しいインストール方法については、以下の公式サイトを参照してください。

- [DeployGate | コマンドライン・ツール](https://deploygate.com/docs/cli)

以下のコマンドを叩くだけで、IPA ファイル / APK ファイルを簡単にアップロードすることが出来るようになります。

```bash:console
dgate push xxxxx.ipa / xxxxx.apk
```

### for iOS

私は、先程の IPA ファイルを自動生成するプログラムに、DeployGate へアップロードするコマンドも合わせて書いていて、IPA ファイルを自動生成したあと、そのまま、DeployGate へアプリをアップロードするようにしています。

プログラム全体は、このような感じになります。

```ipa.sh
#!/bin/bash

NAME="/Users/fakestarbaby/Desktop/${PWD##*/}"
if [ $# = 1 ]; then
  NAME=$1
fi

if [ ! -e $NAME.app ]; then
  echo "$NAME.app: No such file or directory"
  exit 1
fi

if [ -d "Payload" ]; then
  rm -fr Payload/*
else
  mkdir Payload
fi

cp -rf $NAME.app Payload
zip -r $NAME.ipa Payload
rm -fr Payload

dgate push $NAME.ipa
```

これで、Corona SDK でビルドした直後に、このプログラムを実行するだけで、簡単に DeployGate へアプリをアップロードすることが可能になります。

### for Android

Android アプリに関しては、APK ファイルをアップロードするだけですので、同様の前提条件を満たせるのであれば、以下のようなプログラムを実行しても良いでしょう。

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

NAME="/Users/fakestarbaby/Desktop/${PWD##*/}"
if [ $# = 1 ]; then
  NAME=$1
fi

dgate push $NAME.apk
```

## 実機にアプリをインストール

### for iOS

DeployGate には、iOS アプリがありません。そのため、Safari で DeployGate にアクセスして、アップロードしたアプリをインストールしてください。

私は、ホーム画面に追加して、すぐに、アプリをインストール出来るようにしています。

### for Android

Android アプリが用意されています。

- [DeployGate - Google Play の Android アプリ](https://play.google.com/store/apps/details?id=com.deploygate)

## まとめ

DeployGate が登場してから、アプリ配信の敷居がぐっと下がりましたよね。もっと自動化を追求して、Corona SDK アプリをビルドした流れで、そのまま、DeployGate でアップロードされるように自動化出来たら、もう言うこと無しです。
RailsでBASIC認証機能を追加する (heroku向け)

application_controller.rb に以下を入れれば一発

```ruby:application_controller.rb
class ApplicationController

  before_filter :basic_auth_filter

  private

    def basic_auth_filter
      return true if ENV['ENABLE_BASIC_AUTH'].to_i != 1

      authenticate_or_request_with_http_basic do |username, password|
        username == ENV['BASIC_AUTH_ID'] &&
        password == ENV['BASIC_AUTH_PASS']
      end
    end
end
```

で以下で設定
> heroku config:set **** -a [YOUR-HEAOKU-APP]
OS XでFlashMagicを使う場合のCOMポート番号を見つける方法

### 概要
FlachMagic では、実行時にCOMポート番号を設定する必要があります。
しかし、OS XではUSB-Serialアダプターが、仮想装置名で管理していてCOMポート番号が判りません。
そこで、FlashMagicアプリでは、アプリケーション起動時に、/dev/ を調べてシリアルポートとCOM番号のシンボリックリンクをアプリケーション内のフォルダにセットするようにしているようです。
なので、一度 USB-Serialアダプターを接続した後 FlashMagicを起動して設定画面が出てきたら（最初は時間がかかります）このスクリプトを実行すると、COMポート番号に、どの装置が割り当てられているかを表示します。
（ターミナルアプリで以下のコマンドを実行しても同様ですが、いちいちターミナルを開いてコマンドを実行するよりは、一度アプリを作っておけば簡単でしょう。）
（FlashMagicアプリが「アプリケーション」フォルダ内に有る場合）
` ls -l /Applications/FlashMagic.app/Contents/Resources/dosdevices/COM* `

### プログラムのソース
（注：FlashMagicアプリが「アプリケーション」フォルダ内に有ることを前提にしていますので、違う場所に置いてある場合は、パスを適宜修正してお使いください。）

```AppleScript:SerchCOM_port.scpt
-- USB−Sereal アダプタが、どのCOMポートに割り当てられているか調べる

set appPath to "/Applications/FlashMagic.app/Contents/Resources/dosdevices"
set cmd to "ls -l " & appPath & "/COM*"
do shell script cmd
set serealDevice to result as text
set orgDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to return
set aList to text items of serealDevice
set AppleScript's text item delimiters to orgDelim
set COMs to ""
repeat with txt in aList
	set pos to offset of "COM" in txt
	set COMs to COMs & characters pos thru -1 of txt & return
end repeat

display dialog COMs
```
12GBメモリが積んであるマシンでも3GB程度でout of memoryしてしまう


#概要

PHPで書いた重めのプログラム(何万行かわからないレコードをDBから取ってくる)を走らせたところ、10GB使わないうちにout of memoryで落ちてしまった

#前提

* 搭載されているメモリは12GBで基本的に10GB程度はフリー
* out of memory で落ちた時にPHPに割り当てられていたメモリは2.5GB
* php.iniのmemory_limitは-1なので無制限

#調査

無制限なのにout of memoryしてるのでPHP側ではなくOS側で何かしてるんだろうという考えに
そういやOSが32bitだった気がしたので調べてみたら32bitだった
そもそも32bitだったら12GB認識しないのでは？と思ったけどPAEのおかげで32bitより大きい番地でも割り当てられるようになってるらしい
PAEよくわかってなかったので調べた
物理アドレスは拡張されるので最大12GBは利用できるが、OS側が割り当てる仮想アドレス空間は結局32bitなので4GB程度しか利用できず、更にカーネル空間としてOSに1GB割り当てられるので結局メモリが全てフリーでも1プロセスあたりでは3GBが上限になる

#結論

PHPのせいではなくOSが32bitだったせいだった
Macで lpc21isp を簡単に利用するためのアプリケーション

### このアプリは
UARTでISP(In-System Programming)でLPC1114にFlashする際、[lpc21lisp](http://lpc21isp.sourceforge.net/) を使用するたびにコマンドラインで実行するのが面倒なので、AppleScriptでラッピングするものです。
更に、USB-Serialアダプターの仮想装置名を調べてプルダウンリストから選択できるようにしたので、便利だど思います。
lpc21lisp は HEXもBINも書き込めるので、両方扱えるようにしています。
（注：このAppleScriptでは lpc21lisp が Maclpc21isp.appのフォルダー内においてあることを前提にしています。スクリプトエディタでAPPとして保存した後、Maclpc21lisp.appを右クリックし内容を表示した後、lpc21lispをドラッグ&ドロップでコピーしてからご使用ください。）

### Flashに書き込む準備
ISPで書き込みをするには、USB-SerialアダプターのTX,RXをLPC1114FN28のRX(dp15), TX(dp16)と接続します。
また、LPC1114FN28は、リセット時にPIO0_1(dp24)をLOWにしておくことでISPモードに投入することができます。
24番ピンとGNDをつないだ後、リセットを行い、リセットしたあとで外します。

### プログラムのソース
```AppleScript:Maclpc21isp.scpt
-- spesial thanks to Yoshihiro TSUBOI for mac port of lpc21isp
-- see also http://mbed.org/users/ytsuboi/notebook/getting-started-with-mbed-lpc1114-ja/

set cmdPath to POSIX path of (path to me)
set cmdPath to "'" & cmdPath & "lpc21isp' -control "
set cmdSufix to " 115200 1200"
set openMSG to "書き込むファイルを選択してください"
set doCmdMSG to "書き込みを開始します。結果が表示されるまでお待ちください。"

set targetFileName to POSIX path of (choose file of type {"hex", "bin"} with prompt openMSG)
set fileExtention to characters -3 thru -1 of targetFileName as text
if fileExtention = "bin" then set cmdPath to cmdPath & " -bin "
set targetFileName to "'" & targetFileName & "'"
do shell script "ls /dev/tty.*"
set serealDevice to result as text
set orgDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to return
set aList to text items of serealDevice
set AppleScript's text item delimiters to orgDelim
if the number of items of aList > 1 then
	choose from list aList
	set serealDevice to result as text
end if
set serealDevice to "'" & serealDevice & "'"
set cmd to cmdPath & targetFileName & " " & serealDevice & cmdSufix
display dialog cmd & return & return & doCmdMSG
do shell script cmd
display dialog result as string
```
お手軽PHP開発環境構築(Windows)

ApacheやMySQLサーバもまとめてインストールするため、Xamppが含まれているPleiades All in One Eclipseを用いて構築してきます。
(ここではWindows8(64bit)で環境構築した手順を記載します)


##All in One Eclipseのインストール
以下のURLより、Pleiades All in Oneをダウンロードします。（下図参照。例はWindows 64bitの場合です。）

[Pleiades All in One ダウンロード](http://mergedoc.sourceforge.jp/)
![all_in_one_eclipse_install.png](https://qiita-image-store.s3.amazonaws.com/0/61752/fdb63007-15e9-9e31-090f-dbf22a1c4146.png)

Full Editionをダウンロードし、Eclipseの実行ファイルを置きたい場所に解凍しましょう。(私の場合はD\:MyApp\Eclipse\に置いてたりしてます)

これでEclipseのインストールは完了です。
続いて、Apacheの設定を行っていきます。

##Xamppの設定
ApacheやMySQLサーバの設定を行うためXamppの設定を行います。
先ほどインストールしたAll in One Eclipseディレクトリ内の「xampp」フォルダがXampp関連のフォルダになります。

###初期セットアップ
下記実行ファイルを実行します。

`xampp/setup_xampp.bat`

下記のように出力されればOKです。
![xampp_startup.png](https://qiita-image-store.s3.amazonaws.com/0/61752/770ffc0c-16ec-4d82-c414-50cd7350b626.png)

###Apacheポート変更
続いてApacheの起動ポートを変更します。(ポート番号80は別のアプリで使われてたりするので80以外の適当な番号を指定しておきます。ここでは8888に設定します。)

エディタで下記ファイル内の２箇所を修正します。

```xampp/apache/conf/httpd.conf

#Listen 12.34.56.78:80
Listen 8888  (58行目付近)


# If your host doesn't have a registered DNS name, enter its IP address here.
#
ServerName localhost:8888 (214行目付近)

```

xamppコントローラを起動します。
`xampp/xampp-control.exe`

「config」→「Service and PortSettings」を選択すると下図のような設定画面が表示されます。ここでポート番号を先ほどhttpd.confで設定したポート番号に設定して保存します。
![xampp_config.png](https://qiita-image-store.s3.amazonaws.com/0/61752/8a8bbaff-7de4-30a6-2a7b-e30bdea96924.png)


設定したら、念のためxamppコントローラを閉じて再起動します。
`xampp/xampp-control.exe`

Apache(startボタン押下で)下記のように正常起動できればOKです。
![apache_success.png](https://qiita-image-store.s3.amazonaws.com/0/61752/bc07100e-c7bd-2e09-2311-6a0225b30db3.png)

##確認
サンプルのコードを置いて動作確認してみます。
既にApacheの設定でドキュメントルートが 「xampp/htdocs」となっているのでこのフォルダ配下にサンプルコードを置いて確認します。

```xampp/htdocs/hello.php
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php echo '<p>Hello World</p>'; ?> 
 </body>
</html>
```

ブラウザで下記アドレスにアクセスして「Hello World」が表示されれば、正常に設定されたことになります。

```
http://localhost:ポート番号/hello.php
(ここではhttp://localhost:8888/hello.php)
```

![php_test.png](https://qiita-image-store.s3.amazonaws.com/0/61752/9bee58aa-6705-ee9d-716c-ccbef343a838.png)


以上。
RestKit Basics

1. Restkitの基本

**Object Mapping**:
Object mapping is the process of taking a representation of data in one form and transforming it into another.

**Restkit**:
Restkit provides a object mapping engine that transform the remote data format, such as a object in JSON, into the format of local objects.

**Three main components**:
**Network** – RestKit now uses AFNetworking v1.3.3 for the network layer. RestKit maintainers are working on updating to AFNetworking 2.0.
**Object Mapping** – Provides a simple API for turning remote JSON/XML responses into local objects.
**Core Data** – Provides additional support on top of the object mapper for mapping remote resources to persisted local objects. (No Core Data for this tutorial)


**Key classes**
RKObjectMapping: An object mapping defines the mapping between a JSON attribute and your data model’s attribute.

**RKResponseDescriptor**: which describes an object mapping that is applicable to an HTTP response.

**RKObjectRequestOperation**: An object request operation is responsible for managing the life-cycle of an object mapped HTTP request from start to finish. It handles the transmission of the HTTP request, deserialization of the response, and processing of the response through the object mapping engine. Object request operations are configured with an NSURLRequest and one or more RKResponseDescriptor objects specifying ways in which the response may be mapped.

Two good examples to refer to:
1. Object Mapping by Example
https://github.com/RestKit/RestKit/wiki/Object-mapping

2. Introduction to RestKit Tutorial
http://www.raywenderlich.com/58682/introduction-restkit-tutorial


RestKit Related Links
Restkit Wikiの感じ
https://github.com/RestKit/RestKit/
Object- mappingに関する説明
https://github.com/RestKit/RestKit/wiki/Object-mapping
コピペでできちゃうBigQuery実行結果のスプレッドシート書き込み

BigQueryを使い始めたのは最近なので、まだそれほど使いこなせてないです。

そんな私ですが、BigQueryの結果をスプレッドシートに反映させるのが便利なので、ちょっとご紹介したいと思います。

## 注意

下記の内容は[こちらのGoogle公式ドキュメント](https://developers.google.com/apps-script/advanced/bigquery)をちょっと日本語訳してみた程度の内容ですのであしからず。

## はじめに

BigQueryにデータを突っ込むところなどは端折ります。

今から試すコードはBigQueryに予め用意されていて誰でも自由に使える publicdata:samples.shakespeare を使いますので、データセットやテーブル作ったりの知識は不要です。

## やってみる

Google Driveを開いて、新規作成 > Google Apps スクリプトを選択します。

項目がない場合は、新規作成 > その他 > アプリを追加から、Google Apps Scriptを追加して下さい。

新規スクリプトファイルを開けたら、空のファイルから始めて、下記のドキュメントのコードをコピー＆ペーストして下さい。

<https://developers.google.com/apps-script/advanced/bigquery.js>

三角ボタンを押してコードを走らせようとすると、下記のようなダイアログで認証を求められます。

![スクリーンショット 2014-12-08 8.51.41.png](https://qiita-image-store.s3.amazonaws.com/0/17722/94d1cdb1-3f7f-1fdb-0ffb-c06e17149083.png)

続行＆承認しましょう。すると今度は、下記のように怒られると思います。

![スクリーンショット 2014-12-08 8.53.41.png](https://qiita-image-store.s3.amazonaws.com/0/17722/45e2fa50-d5b4-35f1-f003-8a0270ae86a5.png)

ドキュメントに書かれているのですが、`This is an advanced service that must be enabled before use.` BigQueryクラスは使う前に有効にする必要があります。

メニューのリソース > Googleの拡張サービスより、BigQueryをオンにしましょう。

![スクリーンショット 2014-12-08 8.55.40.png](https://qiita-image-store.s3.amazonaws.com/0/17722/719faef7-7c52-765d-718c-194288988168.png)

何やら下にも「これらのサービスはGoogleデベロッパーコンソールでも〜」等と書かれていますね。押してみましょう。

![スクリーンショット 2014-12-08 8.59.28.png](https://qiita-image-store.s3.amazonaws.com/0/17722/aa12e28d-e5cd-4e1d-0933-9c1c1142dd5c.png)

こちらも有効にする必要があるようです。BigQueryを選択して、オフ→オンに変更しましょう。下のようになっていればOKです。

![スクリーンショット 2014-12-08 9.00.44.png](https://qiita-image-store.s3.amazonaws.com/0/17722/dfcaffea-2a4f-32ca-dff7-8c78dc3252b7.png)

さて、そろそろ動きますかね……？ってことで、スクリプトに戻って実行すると、下記のように怒られます。

![スクリーンショット 2014-12-08 9.01.53.png](https://qiita-image-store.s3.amazonaws.com/0/17722/ac04566a-e23d-bb1e-7b49-7fdcf6858a03.png)

`projectId = 'XXXXX';`となってる部分をちゃんとしやがれ、ってことみたいです。さっきのgoogle デベロッパーコンソールを開いてIDを確認しましょう。プロジェクト番号って部分がそれです。左のメニューから、プロジェクトの概要を見ることで確認できます。URLの一部がIDになってるので、それをコピペでもいいですね。

![スクリーンショット 2014-12-08 9.05.22.png](https://qiita-image-store.s3.amazonaws.com/0/17722/0d50be32-dedf-2a73-2f27-f3b2d34fb81f.png)

終わったら今度こそ実行！

　![スクリーンショット 2014-12-08 9.08.31.png](https://qiita-image-store.s3.amazonaws.com/0/17722/06968c22-3f3e-d447-20de-3b6829d90269.png)

このトーストが消えたら実行完了です。<https://drive.google.com> にアクセスすると、BigQuery Results というファイルができていますので、開いてみましょう。

![スクリーンショット 2014-12-08 9.10.35.png](https://qiita-image-store.s3.amazonaws.com/0/17722/f85b0074-806f-dc46-561f-6b061f76ac7e.png)

ワオ！

## おわり

ということで、コピペでお試しできてしまいました。

あとは、特定のシートに反映させたければ [サンプルコード 30,31行目](https://developers.google.com/apps-script/advanced/bigquery.js)辺りでシートを直接指定すれば良いですし、定期的に自動で反映させたければメニューからリソース > 現在のプロジェクトのトリガーから、runQueryを定期実行させるようにすればOKです。私が実際に使ってるコードも、これらをかんたんに設定できるように改変してるだけのものです。

GASやBigQueryに詳しくなくてもサクッと試せますので、ぜひ一度お試しください。
AppleScript で年齢計算、干支、星座を計算

誕生日と基準日をもとに、満年齢、数え年、干支、星座を表示するスクリプトです。
AppleScriptのメニューバーに入れておけば、重宝します。（たまにしか使いませんが）
西暦、和暦（明治、大正、昭和、平成）の両方に対応していますので、どちらの形式で入力してもOKです。

```AppleScript:年齢計算.scpt
-- 誕生日から基準日の満年齢を計算します。
-- 干支と星座も表示します。
-- 入力は西暦でも和暦でも自動判定します。（明治〜平成まで）
--
set CR to ASCII character 13
display dialog "誕生日を入力（yyyy/mm/dd でも可）" default answer "昭和12年3月4日"
set BD to date gengo_check(text returned of result)

set TODAY to (current date) as text
set TD to (items 1 thru (offset of "日" in TODAY) of TODAY) as text
display dialog "基準日を入力" default answer TD
set KD to date gengo_check(text returned of result)

set NENREI to (round ((KD - BD) / (365.25 * 24 * 60 * 60)) rounding down) as text
set KAZOE to ((year of KD) - (year of BD) + 1) as text

set ETO to item (((year of BD) mod 12) + 1) of "申酉戌亥子丑寅卯辰巳午未"
set SEIZA to constellation(BD)

display dialog "満 " & NENREI & " 歳、" & ETO & "年、" & SEIZA & "です。（数え年で " & KAZOE & " 歳）"

on gengo_check(inData)
	set ans to inData
	set GENGO to (items 1 thru 2 of ans) as text
	set DIF to 0
	if GENGO = "明治" then set DIF to 1867
	if GENGO = "大正" then set DIF to 1911
	if GENGO = "昭和" then set DIF to 1925
	if GENGO = "平成" then set DIF to 1988
	if DIF > 0 then
		set POS to offset of "年" in ans
		set NEN to ((items 3 thru (POS - 1) of ans) as text) + DIF
		set ans to ((NEN as text) & items POS thru (offset of "日" in ans) of ans) as text
	end if
	return ans
end gengo_check

on constellation(B_Day)
	set ans to "Error"
	set MM to month of B_Day as integer
	set DD to day of B_Day as integer
	if (MM = 3 and DD ≥ 21) then set ans to "牡羊"
	if (MM = 4 and DD ≤ 19) then set ans to "牡羊"
	if (MM = 4 and DD ≥ 20) then set ans to "牡牛"
	if (MM = 5 and DD ≤ 20) then set ans to "牡牛"
	if (MM = 5 and DD ≥ 21) then set ans to "双子"
	if (MM = 6 and DD ≤ 21) then set ans to "双子"
	if (MM = 6 and DD ≥ 22) then set ans to "蟹"
	if (MM = 7 and DD ≤ 22) then set ans to "蟹"
	if (MM = 7 and DD ≥ 23) then set ans to "獅子"
	if (MM = 8 and DD ≤ 22) then set ans to "獅子"
	if (MM = 8 and DD ≥ 23) then set ans to "乙女"
	if (MM = 9 and DD ≤ 22) then set ans to "乙女"
	if (MM = 9 and DD ≥ 23) then set ans to "天秤"
	if (MM = 10 and DD ≤ 23) then set ans to "天秤"
	if (MM = 10 and DD ≥ 24) then set ans to "蠍"
	if (MM = 11 and DD ≤ 21) then set ans to "蠍"
	if (MM = 11 and DD ≥ 22) then set ans to "射手"
	if (MM = 12 and DD ≤ 21) then set ans to "射手"
	if (MM = 12 and DD ≥ 22) then set ans to "山羊"
	if (MM = 1 and DD ≤ 19) then set ans to "山羊"
	if (MM = 1 and DD ≥ 20) then set ans to "水瓶"
	if (MM = 2 and DD ≤ 18) then set ans to "水瓶"
	if (MM = 2 and DD ≥ 19) then set ans to "魚"
	if (MM = 3 and DD ≤ 20) then set ans to "魚"
	return ans & "座"
end constellation
```
ローカルネットワーク経由でノードを接続する

Elixir Advent Calendar 2014 8日目。

今年はElixirがついにv1.0になったというのもビッグニュースでしたが、
CentOSがバージョン7になり、あれこれ大きく変わったというのも大きな話題を呼びました。
CentOS 7は、これまでのCentOS同様、長い期間に渡って使われることになるはずなので、
今のうちにそのお作法と絡めて、ノウハウを蓄積していきたいところです。

今回は、前回ご紹介したMessage Passingのやり方の応用として、
ネットワーク越しでのプロセス間通信をElixirで行う方法をご紹介します。

# 構成

今回、2台のIntel NUCを使います。

# Firewallを開ける

CentOS 6ではiptablesでしたが、CentOS 7ではfirewalldが動作していて、外部との通信を遮断しています。
ElixirはProduction Ready。
firewalldを止めるよりは、セキュリティのために、必要なポートを開放するようにしましょう。
TCP 4369は、Erlang/OTPでおなじみです。
これとは別に、プロセス間通信を行うためのポートも開放する必要があり、
今回は例として、TCP 26000 から TCP 26099 の100ポートを開放します。

```
# firewall-cmd --zone=public --add-port=4369/tcp --permanent
# firewall-cmd --zone=public --add-port=26000-26099/tcp --permanent
# firewall-cmd --reload
```

# 名前解決

ノード同士を接続する際に、FQDNで名前解決できるようにする必要があります。
DNSサーバを持ち出すのは今回はオーバースペックなので、 /etc/hosts にIPアドレスとFQDNを書いておきます。

```
10.1.0.1 eins.elixiradventcalendar2014.net
10.1.0.7 sieben.elixiradventcalendar2014.net
```

# iexの起動

おなじみの方法でiexをオプション付きで起動します。
まず、--snameは使いません。--nameを使います。
また、erlコマンドにはあるがiexコマンドには無いオプションを使います。
具体的には以下の通りに指定します。

```
% iex --name node1@eins.elixiradventcalendar2014.net --cookie elixir-example --erl "-kernel inet_dist_listen_min 26000 inet_dist_listen_max 26099"
% iex --name node1@sieben.elixiradventcalendar2014.net --cookie elixir-example --erl "-kernel inet_dist_listen_min 26000 inet_dist_listen_max 26099"
```

両方とも起動できました。早速、ノード同士を接続してみましょう。

```
iex(node1@sieben.elixiradventcalendar2014.net)1> Node.connect :"node1@eins.elixiradventcalendar2014.net"
true
```

成功です。
ノードのリストを表示してみましょう。

```
iex(node1@sieben.elixiradventcalendar2014.net)2> Node.list
[:"node1@eins.elixiradventcalendar2014.net"]
```

対抗側からも確認します。

```
iex(node1@eins.elixiradventcalendar2014.net)1> Node.list
[:"node1@sieben.elixiradventcalendar2014.net"]
```

接続できています。
ここから先は、ローカルホストに閉じた場合と同様です。

# まとめ

CentOS 7でElixirを使ったプロセス間通信をローカルネットワーク越しに行う方法をご紹介しました。

明日は @tbpgr さんです。