2011年 6月 の投稿一覧

DotCloud で PHP を動かしてみた

DotCloudとは

クラウドサービスの中でPaaSに分類されるもので、GoogleのApp Engineのように開発プラットホームを提供するサービスです。

2011.6.20現在、DotCloudはベータ版で公開されててinviteコードを貰えば無料で利用する事ができます。
inviteコードはメールアドレスを登録すると3,4日で届きます。

ちなみに、Webサーバーはnginx(エンジンエックス)というものを使っているそうです。

DotCloud

DotCloudを使ってみる

inviteコードが届いたので早速phpinfo()を表示させてみたいと思います。(Mac環境にて)
届いたメール内に登録用のURLが記載されているのでそこから、アカウントを作成します。

作成するとCheatsheetが表示されるのでそれを参考に設定します。

dotcloudコマンドのインストール

Pythonのeasy_installを使ってインストールします。

$ sudo easy_install dotcloud

これでdotcloudコマンドが使用できるようになります。

Applicationを作成する

$ dotcloud create suusuke

api keyの入力が求められるのでDotCloudの設定ページからapi keyをコピペします。

ここで決めた名前がURLの一部になります。
suusukeの部分がアプリケーション名になります。

サービス名を決めてデプロイする(PHP)

$ dotcloud deploy -t php suusuke.www

PHPで作成するのでタイプをphpにして、サービス名はwwwにしました。

phpinfoを出力するファイルを作成しpush

$ vi phpinfo.php
<?php phpinfo(); ?>

$ dotcloud push suusuke.www .

URLはhttp://..dotcloud.com/となるので、http://www.suusuke.dotcloud.com/phpinfo.phpにアクセスするとphpinfoが表示されます。

その他のコマンド等

sshで接続するときは

$ dotcloud ssh suusuke.www

で接続できます。

また、gitの環境がある場合はそのまま、DotCloudにpushできるようです。

DotCloud Document


追記
仙台駅から3Km圏内のツイートを表示するの作ってみた。作ってみたってほどでもないのですが…
http://www.suusuke.dotcloud.com/

TwitterとかInstagramもそうだけど、認証を必要としないAPI使うのは本当簡単だなと思う。
OAuthとか認証使うとちょっと大変になってくる。

LimonadeでURLに/?/を付けないでもアクセスできるようにする

InstagramのOAuth認証を試していたらコールバックURLに/?/が入っていると、設定したコールバックURLと異なるURLにリクエストが飛んできてました。

Limonadeではデフォルトで/?/callback/のようなURLになるので、ドキュメントに変更方法書いてあるはずと思ってみてみたら、READMEに書いてましたw

アプリケーションのルートディレクトリに次のような.htaccessを置くだけです。

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  Options +Indexes
  RewriteEngine on

  # if your app is in a subfolder
  # RewriteBase /my_app/ 

  RewriteCond %{SCRIPT_FILENAME} !-f
  RewriteCond %{SCRIPT_FILENAME} !-d

  RewriteRule ^(.*)$   index.php?uri=/$1    [NC,L,QSA]
</IfModule>

アプリケーションルートがドキュメントルート以外(例えば/my_app/)の場合は、RewriteBase /my_app/のコメントを解除するとhttp://www.example.com/my_app/からhttp://www.example.com/でアクセスできるようになる。

参考URL:README

CakePHPでページの違う画面の内部リンクを有効にしたい場合

二通りやり方があって、一つは.htaccessでURLの#以降もCakePHPに制御させない方法と、javascriptで対応する方法。

今回はjavascript(jQuery)で対応してみました。

javascriptで実現する方法

遷移先のVIEWに下記を記述するだけです。

<script type="text/javascript">
$(document).ready(function () {
    if (location.hash) {
        y = $("*[name="+location.hash.slice(1)+"]").offset().top;
        scrollTo(0,y);
    }
})
</script>

location.hashで#xxパラメーターを取得して、それを使ってname属性でフィルターしたオブジェクトのoffsetを取得します。
あとは、そこまでスクロースする処理を行えば疑似的に内部リンクが有効になります。

.htaccessで実現する方法

.htaccessに下記を記述すると実現できるようです。(未検証)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)(#*.*)$ index.php?url=$1$2 [QSA,L]
</IfModule>

SSHのアクセス元IPを制限する方法

TCP Wrapperを利用してSSHにログインできるIPを制限します。

設定ファイルは

/etc/hosts.deny (拒否するIP/ホストを設定)
/etc/hosts.allow (許可するIP/ホストを設定)

の二つです。

この設定ファイルで制御できるプロセスは次の二つです。

  • xinetd で制御されているプロセス
  • configure時に TCP Wrapper を使うと指定されたプロセス(←SSHはこっち)

SSHはxinetdで制御されてないけども、自分でhosts.{deny,allow}を読み込むみたいです。

設定は全ての接続を拒否して、指定したIPを許可するという流れが一般的です。

全てのアクセスを拒否

/etc/hosts.denyに下記を追記します。

sshd : all

指定したIPからのアクセスを許可

/etc/hosts.allowに下記を追記します。

sshd : 100.100.100.100
sshd : 192.168.1.1

TCP Wrapperで制御した場合はアプリケーションレベルでのアクセス制御になるので、IPレベルで制御したい場合はiptablesを設定する必要が有ります。

※本当はTCP Wrapperとiptables両方設定した方が良いのでしょうね。

CakePHP で RSS 取得して表示する

CakePHPでRSS取得する方法。

すげー簡単です^^

例としてlivedoor newsのトピックスを取ってきたい場合

コントローラーで

    function index () {
        uses('Xml');
        $xml = new Xml('http://news.livedoor.com/topics/rss.xml');
        $rss = Set::reverse($xml);

        return $rss['Rss']['Channel']['Item'];
    }

と書くだけ。$rssには取得したxmlが配列形式で格納されます。

requestActionから利用するときは

        if (empty($this->params['requested'])) {
            $this->cakeError('error404');
        }

と書いといて、requestActionからのみアクセスできるようにしておきます。

ビューからは

        <?php $index = $this->requestAction('/rsses/index/'); ?>
        <?php if ($index) : ?>
          <ul>
          <?php foreach($index as $item) : ?>
            <li><a href="<?php echo $item['link']; ?>" target="_blank"><?php echo $item['title']?></a></li>
          <?php endforeach; ?>
          </ul>
        <?php endif; ?>

このような感じで取ってきたRSSを表示すれば、簡単にサイトにlivedoor newsが表示できます。

WordPress 複数のカテゴリーを表示する

複数のカテゴリー、例えば特定のジャンルとエリアとかで検索したいと言った場合があると思います。
カテゴリーを親子関係にしておけば結構簡単に検索は出来るのですが、そうしたくない場合もあると思います。(わがままw)

query_postsのパラメーターに

<?php query_posts('cat=2,3'); ?>

とやればいいと思ったのですが、これだとカテゴリーIDが2または3のものと言うことになります。つまりOR検索。

AND検索したい場合は

<?php query_posts(array('category__and'=>array(2,3))); ?>

このように書けば、カテゴリーIDが2かつ3のものが検索できます。

query_postsのパラメーターは配列で渡すやり方と、文字列で渡すやり方があるのですがcategory__andは配列だけのようです。
なので、category__and使う場合は他のorderとかもキー&バリューで渡す形になります。

参考サイト:WordPressの基本操作と使い方