Hatena::ブログ(Diary)

Sky is the limit

2010-08-26

Apacheで、ファイルの拡張子を隠す方法

その1.拡張子なしでもありでも表示できるようにする方法

.htaccess に以下を記述します。

Options +MultiViews
MultiviewsMatch Handlers

.htaccessからの書き込みを、httpd.confで許可してください。また、httpd.confの該当ディレクトリに書き込んでもたぶん大丈夫だと思います。

Options +MultiViews は、拡張子を省略しても表示できるようにするオプションです。つまり、 (パス)/aaaアクセスすると、 (パス)/aaa.html や (パス)/aaa.cgi のファイルを表示することができます。

もちろん、 (パス)/aaa.htmlや(パス)/aaa.cgiアクセスしても大丈夫です。

MultiviewsMatchでHandlersを指定していますが、これを設定しないと Add Handlerで追加した拡張子(たとえば .cgi)などが省略して表示できません。

参考:
Multiviewsのススメ
MultiViewsMatchでハンドラをMultiViews検索に追加 : おまえのログ


その2.拡張子がないファイルに、関連付け(?)る方法

関連付け、というのかはわかりませんが。

これも、.htaccessまたはhttpd.confで指定します。

<Files ~ "^[A-Za-z0-9]+$">
ForceType application/x-httpd-php  
</Files>

こうかくと、ファイル名がアルファベットか数字のもので、拡張子がないファイルはPHPスクリプトですよ〜、という意味になります。

ちなみに、CGIスクリプトはこう。

<Files ~ "^[A-Za-z0-9]+$">
ForceType cgi-script
</Files>

こちらは、その1とちがい、もともとのファイル名に拡張子がついてないので、

(パス)/aaa.cgiアクセスしても404エラーがでます。



その1は、ファイル名がばれる(=使用言語がばれる)可能性があります。

しかし、どの種類のファイルでも、拡張子を省略できて便利ですね。そして、なにより簡単です。

その2は言語はばれませんが、同一ディレクトリにあるCGIHTML二つとも隠したい、といったことは、できません。CGI用のディレクトリHTML用のディレクトリを二つ用意し、それぞれに.htaccessをおけば問題ないです。*1

どうしても同一ディレクトリにあるCGIHTML二つとも隠したい人は

<Files aaa>
ForceType cgi-script
</Files>
<Files bbb>
ForceType text/html
</Files>

と個別指定したりファイル名を工夫して正規表現で指定したりすればOK。

また、こんな方法で指定することもできるみたいです。
拡張子を無しにした PHP - Institute for bayani

*1:もしくは、httpd.confの<directory>を使う。

2010-08-23

mod_perlを使う際、use lib や require を使えるようにする方法

mod_perlは、Apacheのモジュールの一つで、Perlを高速に実行する機能のこと*1です。これを使えばものすごく早くCGIを実行できます。しかし、いくつか弊害があり、そのひとつが、実行する際のカレントディレクトリが、Perlスクリプトがおかれているディレクトリから、Apacheのインストールされているディレクトリに変わってしまうというものです。

つまり、今まで相対パスで記述していたものを絶対パスで書かなければならなくなりますし、相対パスでかけたとしてもサーバーに上げるとき大変です。

なので、カレントディレクトリを、ApacheのインストールされているディレクトリからPerlスクリプトがおかれているディレクトリに戻しましょう

やり方は簡単です

BEGIN{
if(exists $ENV{MOD_PERL}){
$last = rindex($ENV{SCRIPT_FILENAME}, "/");
$namecut = substr($ENV{SCRIPT_FILENAME}, 0, $last);
chdir($namecut) or die 'ディレクトリ移動失敗';
}
}

終わり。

まず、BEGINで、最初によみこみます。ただし、use lib よりも上に書かないとダメみたいです。

最初のif文で、mod_perlが動いているかどうかを確認します。

$ENV{SCRIPT_FILENAME}は、そのファイルが置かれている絶対パスです。

次のrindex関数は、その絶対パスの中の前から数えて最後のスラッシュまでの長さを返します。これが、絶対パスからファイル名を除いた時のもの、つまりカレントディレクトリになります。

次のsubstr関数で、絶対パスからカレントディレクトリを抜き出します。

最後に、chdir関数でカレントディレクトリを変更すればOKです。

参考。

mod_perl その2 - 日々量産

2010-08-22

PerlでTwitterクライアント製作メモ その1

なんとなく、Twitterクライアントが作りたくなったので作っている。その過程でおきた問題などをメモしておこうと思う。

クライアントの概要

  • Webベース
  • 軽い
  • 基本的な機能をおさえていればOK
  • ケータイから使える
  • 自分用に作るので、ログインとかその辺は実装しない
  • oAuth認証

クライアントと呼べるほど高機能ではないですし、自分で使うこともないと思います。これからもTween&ぽちったー様々になりますw もちろんWebサービス化するつもりもないです。

使用モジュール

use Net::Twitter::Lite; #Twitterへのアクセス
use Encode; #おなじみのエンコード
use CGI; #おなじみのCGI
use Time::Local; #時間変更
use POSIX qw(strftime); #時間変更

Net::Twitter::Liteは、CPANとかPPMとかで入れてください。あとのものはPerlに標準でついてきてるはずです。

アプリケーションの登録&認証

まず、http://dev.twitter.com/ からTwitterアプリケーションとして登録します。

登録したら、http://dev.twitter.com/apps/XXXXXX にConsumer keyとConsumer secret、http://dev.twitter.com/apps/XXXXXX/my_token に、ACCESS_TOKEN と 、ACCESS_TOKEN_SECRET があるのを確認します。(XXXXXX は自動で割り振られるID)


確認したら、Net::Twitter::LiteでoAuth認証のための設定(?)をします。

%CONSUMER_TOKENS = (
    consumer_key    => 'ここにコピペ',
    consumer_secret => 'ここにコピペ',
);
$ACCESS_TOKEN        = 'ここにコピペ';
$ACCESS_TOKEN_SECRET = 'ここにコピペ';

$t = Net::Twitter::Lite->new(%CONSUMER_TOKENS);
$t->access_token($ACCESS_TOKEN);
$t->access_token_secret($ACCESS_TOKEN_SECRET);

先ほどのConsumer key、Consumer secret、ACCESS_TOKEN、ACCESS_TOKEN_SECRETをそれぞれ上の ここにコピペ とかかれたところにコピペしてください。

以上で準備完了です。なお、自分でしか使わないことを想定しているので、Webサービス化する場合は、また違ってきます。

参考:Perl製Twitter BotにOAuth認証で投稿させる/楽

使い方

(例)

$screen_name = 'tohky'; # アカウントのscreen name
$statuses = $t->user_timeline({id  => $screen_name, count => 20});
foreach my $status ( @$statuses ) {
print $status->{user}{profile_image_url}; #アイコンのURL
print "<br>";
print $status->{user}{screen_name}; #アカウントのscreen name
print "<br>";
print $status->{user}{name}; # ニックネーム
print "<br>";
print $status->{source}; #どのクライアントからか
print "<br>";
print $status->{id}; #ステータスID
print "<br>";
print $status->{text}; #本文
print "<br>";
}

こんな感じで表示します。まず、2行目の説明から。これは

$t->APIの名前({引数 => 値 ,引数 => 値})

を意味します。「APIの名前」には、Net::Twitter::Lite のマニュアルページの、「 REST API Methods 」にかかれているものが入ります。

引数に何が入るかは、すべてTwitter API 仕様書 日本語訳 第五十版 (2010年8月12日版)に書かれているので、それを参考にしてください。

次に、

$statuses = $t->user_timeline({id  => $screen_name, count => 20});
foreach my $status ( @$statuses ) {
〜
}

で、$statusesに配列を読み込み、foreachでまわしていきます。

@$statuses になっているのは、$statuses がリファレンスのためです。

また、配列のひとつひとつがリファレンスのハッシュになっていて、キーはすべてXMLのタグになっています。


具体的にかくと

print $status->{XMLの親タグ}{XMLの子タグ}{XMLの孫タグ};

です。XMLのタグも、API使用書に書かれているので、参考にしてください。



補足

お気に入りに追加する、などのAPIを使用することもできます。使用できるものはNet::Twitter::Lite のマニュアルページの、「 REST API Methods 」に書かれています。

たとえば、お気に入りに追加するには、create_favorite(id) を使います。こんな感じ↓

$ID = "21773096471"; #ステータスID
$t->create_favorite({id => $ID })

なお、すでにお気に入りに登録されているつぶやきを、create_favoriteで再度お気に入りに登録しようすると、Internal Server Error(500エラー)になるのでご注意ください。

ここまでのまとめ

#!/usr/bin/perl

print "Content-type: text/html; charset=utf-8\n\n";
use CGI::Carp qw(fatalsToBrowser);

use Net::Twitter::Lite; #Twitterへのアクセス
use Encode; #おなじみのエンコード
use CGI; #おなじみのCGI
use Time::Local; #時間変更
use POSIX qw(strftime); #時間変更

%CONSUMER_TOKENS = (
    consumer_key    => 'ここにコピペ',
    consumer_secret => 'ここにコピペ',
);
$ACCESS_TOKEN        = 'ここにコピペ';
$ACCESS_TOKEN_SECRET = 'ここにコピペ';

$t = Net::Twitter::Lite->new(%CONSUMER_TOKENS);
$t->access_token($ACCESS_TOKEN);
$t->access_token_secret($ACCESS_TOKEN_SECRET);

$screen_name = 'tohky'; # アカウントのscreen name
$statuses = $t->user_timeline({id  => $screen_name, count => 20});
for my $status ( @$statuses ) {
print $status->{user}{profile_image_url}; #アイコンのURL
print "<br>";
print $status->{user}{screen_name}; #アカウントのscreen name
print "<br>";
print $status->{user}{name}; # ニックネーム
print "<br>";
print $status->{source}; #どのクライアントからか
print "<br>";
print $status->{id}; #ステータスID
print "<br>";
print $status->{text}; #本文
print "<br>";
}

間違いなどがあれば、指摘をお願いします。

また、エラー処理も一切していませんのでご注意ください。パフォーマンスもしりません。

このプログラムが原因で起きたいかなる損害に対しても、責任を負えませんので、ご了承ください。(大丈夫だとは思いますが)

2010-08-20

ヨコイのスパゲッティ

f:id:tohky:20100824180819j:image:w440

今晩はヨコイのスパゲッティを食べました。

名古屋には、鉄板の下に卵を引くスパゲッティが有名ですが、あんかけスパゲッティも有名です。ヨコイは、そのあんかけスパゲッティで有名なお店。

スパゲッティハウス ヨコイ 錦店でミラカンを食べたことがあるのですが、あれは癖になりますw

全国のスーパーでレトルトパウチとして売られているので、家で作れます。今日もお店へはいかず、家で食べました。お店よりも若干からいのがちょっとアレですが・・・。

トマトベースのものに飽きてきた人、ちょっとかわったものが食べてみたいなあ、という人は、ぜひ一度ご賞味ください!