1月 28 2012

ActiveRecordでJSONを返す

Category: rubykakkunpakkun @ 11:43 AM

いま、PadrinoでWebAPIを作成し始めたんだけどjsonの返し方を初めて色々やったのでメモ。

まずは普通にモデルのJSONを返す

@blog.to_json

モデルから関連している(has_manyとか)モデルも返す

@blog.to_json(:include => [:posts])

と、これでいいんだけどここにlimitとかつけたいよね。全部返してたら大変なことになることは多い。
そこら辺は自分で書き加えるかhas_manyでlimit付けたらいいのかな。


11月 19 2011

MacOSX LionでゼロからCakePHPを動かす

Category: PHPkakkunpakkun @ 5:07 PM

LionだからかSnowLeopardからアップグレードしたからか分からないけど意外とMacOSXでCakePHPを動かすのに苦労するんじゃないかと思う。
Apacheの設定がなにやらうまくいかなくて、動いたと思ったらCSSが当たってなかったり、パーミッションが違ったりの連続だった。
動いたと思ってもWarningだらけだったりもした。

まったくPHPを動かしたことがなかったのでなおさらかもしれない。
そういうわけでMacOSX LionでCakePHPを動かすまでをやってみる。

PHPを動かす

モジュールを有効にする

# vi /private/etc/apache2/httpd.conf
 
LoadModule php_module libexex/apache2/libphp5.so #コメントアウトを外す

また
内のAllowOverrideをAllに変更

# AllowOverride None
AllowOverride All

test.phpを表示させる

/Library/WebServer/Documents/test.phpを作成して、

<?php phpinfo(); ?>

と書きこんで保存。

http://localhost/test.php

を表示させるとPHPの情報が出てくる。
これでPHPは動作している事がわかる。

CakePHPを動かす

やっとCakePHPを動かすことに

CakePHPをデプロイする

DocumentRootに置いてみちゃおう。
CakePHPをダウンロードしてきて解凍、

/Library/WebServer/Documents

に置いて、
置いたディレクトリの名前も/Library/WebServer/Documents/caketestとかに変更しておく。

この時点で

http://localhost/caketest/

にアクセスするとCakePHPの画面はなんとか見れるんじゃないかなと思う。

でもWarningがボコボコ出ててあまりにまともに動いている感じがしない。

date.timezoneをセットする

php.iniを作成して編集する。

# cp /etc/php.ini.default /etc/php.ini
# vi /etc/php/ini
;date.timezone =
date.timezone = Asia/Tokyo

ここではAsia/Tokyoにしているけど当然地域に合わせて変更した方がいいかと。

パーミッションを変更する

app/tmpにchmodをかける。

# chmod -R 767 app/tmp

777にするというブログ記事が多いけど767で動くんじゃないかなー。。

更にWarningを無くす

まだSecurity.saltを変更しろとかそういうWarningが出てるんじゃないかと思う。
なので

Security.saltを変更

app/Config/core.phpのSecurity.saltを変更する。

Security.cipherSeedを変更

app/Config/core.phpのSecurity.cipherSeedを変更する

database設定

$ cp app/Config/database.php
$ vi app/Config/database.php

'datasource' => '/tmp/mysql.sock'

にしたりloginやpassword、databaseを変更したらきれいに黄色や赤の警告やエラーは消えるんじゃないかなと。

あと、tmp内のパーミッションエラーは数回出たりするかもしれないけど、結局同様にchmodをtmpにかけたらWarningは消えた。

あとはDocumentRootが/Library/WebServer/Documents内だと編集するときにsudoする必要があったり面倒だし、/Users/USER_NAME/Sites内のほうがスマートになるのでvhostsをいじったりしたらより良くなるかも。

タグ:


11月 09 2011

UbuntuサーバのapacheのフロントにVarnishを導入

Category: ubuntukakkunpakkun @ 6:38 PM

さくらVPSのUbuntuサーバにVarnishを導入してみた。

こちらを参考に。
Putting Varnish In Front Of Apache On Ubuntu/Debian

インストールはこれだけ

# apt-get install varnish

ただ、

80ポート:varnish -> 8000ポート:apache

というようにしたい。
なので設定。

まずはvarnishを80ポートに変更
/etc/default/varnishを編集

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"

80ポートで待ち受けて、administrationのポートは6082でlocalhostからのみ受け付ける。

あとは8000ポートでapacheに流す。apacheと同じサーバにいるのでIPは127.0.0.1
/etc/varnish/default.vc

backend apache {
        .host = "127.0.0.1";
        .port = "8000";
}

で、apacheの設定を8000ポートで受け付けるように変更。
/etc/apache2/ports.confを編集

NameVirtualHost *:8000
Listen 127.0.0.1:8000

各種VirtualHostの設定も

<VirtualHost *:8000>

というように80から8000に変更。

で、それぞれ再起動

# /etc/init.d/varnish restart
# /etc/init.d/apache2 restart

varnishlogを見ながらサイトにアクセスしたらぞろぞろ出たので大丈夫そう


10月 31 2011

RailsのURLをリテラルに表現するacts_as_literal

Category: Rails,rubykakkunpakkun @ 1:44 PM

既に動いているrailsアプリのURLを簡単にリテラルなURLに変えるプラグインを作ってみました。
acts_as_literal

/model/:id
から
/model/:id-name

つまり例えばUser(:id => 1, :name => “菅野智之”)というモデルがあった場合に
/users/1
というURLを
/users/1-菅野智之
というURLにしてくれるというものです。

ちょっと前までは/users/:idというURLはかっこ良かったんだけど、今はすっかり文字列表現が入ってリテラルな方がかっこ良く感じるようになりましたね。
時代の移り変わりは早いものです。
(しかし、このブログがリテラルじゃねーじゃんという)

使い方はモデルの中で
acts_as_literal
と入れるだけ。

仕組みはrailsがURLを組み立てるときにto_paramを使うんだけど、そこにnameカラムの文字列をエンコードして入れるだけ。
なんでそれで動くかというと、rubyのString#to_iがイカしてて
“1″.to_i ==> 1
“1-菅野智之”.to_i ==> 1
と先頭の数字だけInteger化してくれるという動きだからです。

このgemの良い点は従来のアプリの動きを壊すことなく一行入れるだけでリテラルなURLを使えるというところです。

とりあえず自分が使う分には”#{id}-#{name}”でいいからそうしているけどnameではなく違うカラムを指定できるようにしたらいいなと思ってる。
すぐ出来るだろうけどとりあえずgithubに上げたので一旦これで。
あと、gemcutterとかそういうとこに登録しないと。

ちなみに菅野智之はついこの間ドラフト会議で巨人が外した原監督の甥ですね。
思い通りに行かなかったけどふてくされないで!


10月 25 2011

図書館で借りまくって勉強

Category: kakkunpakkun @ 10:08 PM

端末も必要なく、どこでも見れる上に画面の狭さに悩まされない媒体といえば本。
ネットでも数々のブログやサイト(Codecademyとか)があるけど本はまだまだ捨てがたい。
けど本は高いのが難点。

というわけで最近はとにかく図書館で借りて本当に欲しいものだけ買うようにしてます。
でもだいたい図書館では技術書は1冊しか蔵書されていないので借りれるようになるまで結構時間がかかったりもしちゃう。

だから、
LibronをつかってAmazonで技術書を見て回って予約を入れる。
とにかく図書館で予約を入れる。
ちょっとでもいいなと思ったら入れる。
予約予約予約・・・
順番もジャンルも関係なく予約予約予約!

そして予約した本が借りれるようになったら図書館で借りてその本を読む。
図書館の何がいいって、もちろんタダなのはいいんだけど2週間や3週間といったように時間が限られているのがいいところ。
「借りてる間に読んでおかなきゃ!」という気持ちを使って読むことができる。
とりあえず本を買うと「いつでもいいや」って思ってしまって積ん読になってしまい易いんよね。。
こうやって大量に釣り針を沈めて待つ感じ。

で、借りた本を返してまだ読みたかったらいよいよ本を買う。
もう充分内容を読んだ上で買った本なのですぐ読みたい状態だし、これで積ん読にはならない!

とにかく予約してとにかく読んで気に入ったら買う。
こうやって積ん読にせずに多くの本を読んで勉強することがだいぶ出来るようになった。

ちなみに今はこの本がアツい。

とりあえず基礎中の基礎は本で勉強出来たのでパターンのかっこ良さが分かるようになった気がする。

ところが今日これも借りれてしまった。

ついにScala!
こうやって次々と来るのがうれしい。次々と読まないと!って気分になれる。


10月 20 2011

iOSプログラミング入門のChapter4のパズルの挙動を変更

Category: iOSkakkunpakkun @ 8:10 PM

「iOSプログラミング入門 – Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎」を読んで色々試してます。

で、Chapter4のパズル。これがそのままだと下みたいな感じになっちゃう。
これが元

パズルのピースを動かすよー

げ。どこまでいっちゃうの?

そんなわけでこの挙動をなんとかしよう。

変更するべきはpan:の中のこの部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// aPieceはパンしているタイル
if ((gesture.state == UIGestureRecognizerStateChanged) || (gesture.state == UIGestureRecognizerStateEnded)) {   
                CGPoint translation = [gesture translationInView:aPiece]; 
    //空白位置に応じて動かす方向を限定する
    //左方向に動かす
    if ((direction == kLeft) && (translation.x < 0)) {
        panning = YES;
        aPiece.center  = CGPointMake(aPiece.center.x + translation.x, aPiece.center.y );
    //右方向に動かす
    } else if ((direction == kRight) && (translation.x > 0)) {
        panning = YES;
        aPiece.center  = CGPointMake(aPiece.center.x + translation.x, aPiece.center.y );
                //上方向に動かす       
    } else if ((direction == kUp) && (translation.y < 0)) {
        panning = YES;
        aPiece.center  = CGPointMake(aPiece.center.x, aPiece.center.y + translation.y);
    //下方向に動かす
    } else if ((direction == kDown) && (translation.y > 0)) {
        panning = YES;
        aPiece.center  = CGPointMake(aPiece.center.x, aPiece.center.y + translation.y);
    }
    [gesture setTranslation:CGPointZero inView:aPiece];
}

たとえば下方向で言えば

1
aPiece.center  = CGPointMake(aPiece.center.x, aPiece.center.y + translation.y);

となっていてaPiece.center.y + translation.yにリミットがないのが問題。
行き過ぎないように止めたら良さそう。

ここではkSizeという一つのタイルのサイズが決まっているのでこれを使って移動のリミットを付けよう。
まずはどこでまで動かしていいか分かるように

1
2
3
4
// 動かす前のタイルのy座標
int original_center_y = ((aPiece.location / 4) * kSize) + kSize / 2;
// 動かしているタイルのy座標
int piece_center_y = aPiece.center.y + translation.y;

を用意。

そして問題の部分を以下のように変更。

1
2
3
4
if (abs(original_center_y - piece_center_y) > kSize) {
    piece_center_y = original_center_y + kSize;
}
aPiece.center  = CGPointMake(aPiece.center.x, piece_center_y);

タイルがタイル一つ分を越えて移動させようとしても、一つ分以上動かないようにpiece_center_yをセット。
で、その値を持って移動させる。

以上を上に動かす場合と左右のx座標でも書いて完了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
if ((gesture.state == UIGestureRecognizerStateChanged) || (gesture.state == UIGestureRecognizerStateEnded)) {   
                CGPoint translation = [gesture translationInView:aPiece]; 
    int original_center_x = ((aPiece.location % 4) * kSize) + kSize / 2;
    int original_center_y = ((aPiece.location / 4) * kSize) + kSize / 2;
    int piece_center_x = aPiece.center.x + translation.x;
    int piece_center_y = aPiece.center.y + translation.y;
 
    //空白位置に応じて動かす方向を限定する
    //左方向に動かす
    if ((direction == kLeft) && (translation.x < 0)) {
        panning = YES;
        if (abs(original_center_x - piece_center_x) > kSize) {
            piece_center_x = original_center_x - kSize;
        }
        aPiece.center  = CGPointMake(piece_center_x, aPiece.center.y );
        //右方向に動かす
    } else if ((direction == kRight) && (translation.x > 0)) {
        panning = YES;
        if (abs(original_center_x - piece_center_x) > kSize) {
            piece_center_x = original_center_x + kSize;
        }
        aPiece.center  = CGPointMake(piece_center_x, aPiece.center.y );
        //上方向に動かす       
    } else if ((direction == kUp) && (translation.y < 0)) {
        panning = YES;
        if (abs(original_center_y - piece_center_y) > kSize) {
            piece_center_y = original_center_y - kSize;
        }
        aPiece.center  = CGPointMake(aPiece.center.x, piece_center_y);
        //下方向に動かす
    } else if ((direction == kDown) && (translation.y > 0)) {
        panning = YES;
        if (abs(original_center_y - piece_center_y) > kSize) {
            piece_center_y = original_center_y + kSize;
        }
        aPiece.center  = CGPointMake(aPiece.center.x, piece_center_y);
    }
    [gesture setTranslation:CGPointZero inView:aPiece];
}

これでタイルが行き過ぎないようになった。
もっとスマートに動きをコントロールする方法ありそうな気がしてもやもやする。
まだ動きも完璧とは言えない。

そういえばiOS関連の本って題名長いのが多いすね。
Objective-Cのコード規約が長いから?そんなわけないか
でもこの本とてもいいと思う。サンプルも説明も丁寧。
ちょっと誤植が多い・・かな。


10月 12 2011

「たった2か月」本を読んだ

Category: kp @ 9:21 AM

「C言語すら知らなかった私がたった2か月でiPhoneアプリをリリースするためにやったこと」を「たった2か月」本なんて略し方しないと思うけど長いのでタイトルで略してみた。

内容はiPhoneプログラミングの方法などではなく「どうやってiPhoneプログラミングを覚えるか」や「モチベーションを維持する方法」など少しメタな視点で書かれてました。
やる気を出させるための本という感じ。
見ておくと良いサイト、良い本、果ては英語の勉強方法やアプリを広める方法まで。
もちろんこれだけで開発は出来るようにはならないけど、右も左もわからない状態からならやる気が出るかもしれない。

TheNewBostonなどのチュートリアルサイトは知らなかったのでありがたかった。

でもタイトルからも当然なんだけど既にある程度iPhone、iOSの開発が出来てる人にとっては参考になる情報は少ないのかもしれない。
あと、あっという間に読み終わっちゃうのが物足りなく感じたりも。


9月 29 2011

SimpleRSSReaderをASIHTTPRequestを使うよう変更〜つくって覚えるObjective-C入門より〜

Category: iOS,objective-ckakkunpakkun @ 3:25 PM

つくって覚えるObjective-Cはとりあえず完了したけど、HTTP周りはASIHTTPRequestが有名だしそっちに書き換えてみたい。

SimpleRSSReaderでやってみた。

まずは必要なライブラリの追加から。
How to use ASIHTTPRequest in your projects – All-Seeing Interactive
要は必要なフレームワークとライブラリをリンクする
CFNetwork.framework, SystemConfiguration.framework, MobileCoreServices.framework, CoreGraphics.framework and libz.dylib

そしてASIHTTPRequestをプロジェクト内にコピー。
(グループを作ってその中にドラッグアンドドロップしたけど外部ライブラリの使い方はただ参照するだけでもいいかも)

ソースを変更。
まずはRootViewController.hに

1
#import "ASIHTTPRequest.h"

RootViewController.mのloadData内のrequest作成部分をASIHTTPRequestを使うよう変更

1
 *request = [ASIHTTPRequest requestWithURL:url];

requestからdataを取得する部分を変更

1
2
[request startSynchronous];
NSData *data = [request responseData];

これで動いた。
dataを取得する部分がずっと簡単な書き方になった。


9月 29 2011

つくって覚えるObjective-C入門完了

Category: iOS,objective-ckakkunpakkun @ 12:31 AM

とりあえず作ってみようという方針が貫かれた本でかなり良かったと思う。
よくwebに転がっているとりあえず作ろう系の記事との違いは

  • 画面遷移のやり方教えてくれる
  • twitterでoauthまでやる方法を教えてくれる
  • CoreDataの簡単な使い方を教えてくれる

というところかな。
これらって意外と簡単なサンプルを見つけるのが大変だった(僕は)。

もちろんきちんと深く勉強するにはもっと本を読んだりwebで調べたりしないといけないんだけど、この本を読んでサンプル作ってる内になんとなくどこをいじるとどう変わるかとかObjective-CのみではなくiOSでの開発についても大雑把に理解できる所が素晴らしい。

なにも知らない状態ならまずこの本からやったらいいんじゃないかってくらいの本。


9月 12 2011

とりあえず簡単にブログを始められるサービスとしてのfluxflex

Category: fluxflex,wordpresskakkunpakkun @ 12:58 PM


fluxflexはPaaSと言われるものなんですが、僕はそういう使い方ではなく、とりあえず簡単にブログを始められるサービスとして使ってしまっています。

 

なにしろ
プロジェクトを作成→wordpressをワンクリックインストール→wordpressの管理画面から設定
でLivedoorやはてななどと違いタダで独自ドメイン・自由な広告・自由なプラグイン導入などが出来て最高です。

アクセス数がすごいことになってきたら有料プランに変えたりしないといけないかもしれないけど、とりあえず自由なブログをwordpressで持てるというのがうれしいです。

独自ドメインはfluxflexで独自ドメインを使うにて説明したとおり簡単ですし、PaaSがとことん楽になるとこういう使い方が出来るんだなーという思いです。


次ページへ »