Page List

Search on the blog

ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2014年2月2日日曜日

PHPでメールを送る


 これまでPHPでメール送信するときは、Gmailを使用していました。少し前に自前のSMTPサーバーを導入したので、そこからメールを送る実験をしてみました。

 CLI版のPHPで実験しました。
以下のファイルを作成します。ファイル名はsendmail.phpとします。
<?php
$to = "recipient@test.com";
$message = "Hello, world";
$subject = "PHP Mail Test";
$headers = "From: sender@hoge.com";

$message = wordwrap($message, 70, "\r\n");
mail($to, $subject, $message, $headers);
?>
recipient@test.comにはメール受信者のアドレス、sender@hoge.comにはメール送信者のアドレスを自分の環境にあわせて入力してください。

コマンドラインから上記のスクリプトを実行します。
php sendmail.php

これだけでメール送信できました。簡単ですねー。

2012年7月13日金曜日

phpでOAuthしてみた

作ったもの
twitterで"ぽいぽい"しましょう。リンクをクリックすると、"ぽいぽい"できます。
http://goodpreparations.co.cc/test/twitter/sample1/auth.php

前準備
PEARライブラリのインストール
$ pear install Net_URL2-0.3.0
$ pear install HTTP_Request2-0.5.1
$ pear install HTTP_OAuth-0.1.6
php.iniの編集
CLI版はインクルードパスの設定していたけど、CGI版の方はやってなかったので追記。
(php.ini)
include_path = ".:PEARライブラリのパス"
そのあとサーバー再起動。
sudo apache2ctl stop
sudo apache2ctl start

ソースコード
<?php
require_once("HTTP/OAuth/Consumer.php");

// start a session
session_start();

// create a consumer object
$ini_array = parse_ini_file("/home/kenji/config/twitterapp.ini", true);
$consumer_key = $ini_array['test1']['key'];
$consumer_secret = $ini_array['test1']['secret'];
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);

if ($_GET['oauth_verifier'] == "") {
    // get a request token
    $callback = 'http://goodpreparations.co.cc/test/twitter/sample1/auth.php';
    $consumer->getRequestToken('http://twitter.com/oauth/request_token', $callback);
    $_SESSION['request_token'] = $consumer->getToken();
    $_SESSION['request_secret'] = $consumer->getTokenSecret();
    
    // make an authorization page URL
    // $auth_url = $consumer->getAuthorizeUrl('http://twitter.com/oauth/authorize');
    $auth_url = $consumer->getAuthorizeUrl('http://twitter.com/oauth/authenticate');
    print "<a href=\"$auth_url\">Poi Poi on Twitter!</a>";
}
else {
    // get an access token
    $verifier = $_GET['oauth_verifier'];
    $consumer->setToken($_SESSION['request_token']);
    $consumer->setTokenSecret($_SESSION['request_secret']);
    $consumer->getAccessToken('http://twitter.com/oauth/access_token', $verifier);
    
    // tweet some mysterious message
    $status = 'ぽいぽいぽいぽぽいぽいぽぴーーー!! ' . date('jS F Y h:i:s A');;
    $response = $consumer->sendRequest("http://twitter.com/statuses/update.xml", array('status' => $status), "POST");
    print "See your <a href='https://twitter.com/' target='twitter'>twitter</a> page!<br />";
}
?>
ソースコード解説
  1. 2行目でOAuthを使うためのPEARのライブラリをインポート。
  2. 7-11行目で、 consumer keyとconsumer secretを指定してHTTP_OAuth_Consumer型のインスタンスを生成。consumer keyとconsumer secretはセキュリティを考慮して設定ファイルで指定。
  3. 13-24行目はverifierが空のとき、つまりユーザー認証がまだ行われていないときの処理。(ここの分岐もっとかっこよく書けないだろうか・・・)
  4. 15-18行目でrequest token、request secretを生成。getRequestToken()でproviderにHTTPリクエストを投げてこれらの値を取得している。
  5. 22行目でユーザーに踏ませるURLを生成する。GETパラメータでrequest tokenを指定。
  6. 25-36行目は、providerから戻ってきたときの処理。
  7. 30行目でaccess token、access secretを取得している($consumerのtoken、tokenSecretフィールドに格納される)。getAccessToken()の中を見れば分かるが、access token、access secretの取得にはconsumer key、consumer secret、request token、request secret、verifierが必要。
OAuthの概念図と照らし合わせてみると、なるほどーという感じ。仕組みはだいたい分かったけど、それぞれのトークンがprovider内部でどのように生成されるのかが分かっていないので時間があるとき調べてみよう。


参考ページ
PHPでTwitter APIのOAuthを使う方法まとめ - とても分かりやすかったです。

2012年7月11日水曜日

サーバー奮闘記(23) PEAR HTTP_Request

このパッケージ使うと、httpリクエストが簡単に投げられるらしい。非常に便利ですねー。やったことを書き残しておきます。

設定
PEARがなかったのでパッケージマネージャを再インストール。
$ wget http://pear.php.net/go-pear.phar
$ php go-pear.phar
include pathを設定する。php.iniの該当部分を以下のように変更。
include_path = ".:/xxxxxx"
xxxxxxは、PEARのphpソースが格納されているディレクトリ。以下のコマンドで表示される場所を設定。
$ pear config-get php_dir
パッケージのインストール
$ pear install HTTP_Request


遊んでみる
Manualページにあるサンプルで一通り遊んでみようと思います。

2012年6月9日土曜日

サーバー奮闘記(21) CakePHPの設定

しばらく仕事では開発をしていなくて、要件定義とかオフショアメンバーの成果物・タスク管理とかミーティングとかミーティングとかミーティングとかを専門にやっていたのだが、最近フレームワークについてがっつりと勉強できそうなプロジェクトメンバーに採用された。

せっかくなので、家でもフレームワーク使ってなにかwebサービス作ってみようかなと思ってCakePHPを導入した。なんかしょっぱなからつまってしまった。『SampleControllerを作ろう!』のサンプルコードが動かない。

Apacheの設定上書き機能がOFFになっていたことが原因だったらしい。CookbookのAdvanced Installationのページを参考にして、以下を実施したら解決した。

1. /etc/apache2/sites-available/defaultの「AllowOverride」の部分をNoneからAllにする。
2. Apacheを再起動する

動いたのはいいけど、そもそもこれって何なのかよく理解できていないので、『Apache の基本的な設定』を参考にちょっと調べてみた。

まず、「.htaccess」ファイルについて。このファイルはこれが置かれたディレクトリとそのサブディレクトリについてのアクセス設定を行うファイル。
次に/etc/apache2/sites-available/defaultのAllowOverrideの項目について。この項目は、defaultファイルで設定した一般的な設定を、ドキュメントルート配下のサブディレクトリで上書きできるかどうかを設定するもの。この項目をNoneとしていれば、上書きを許可しないので、「.htaccess」でアプリケーション固有のアクセス設定を書いたとしても無視される。この設定をAllとすれば、各アプリケーションの「.htaccess」で定義した設定が、defaultの設定を上書きアクティブになる。

2012年3月18日日曜日

英単語を覚えるwebアプリ

 英単語を覚えるためのwebアプリを作りました。とりあえず今のところは自分専用ですが、使ってみたいという人がいたら複数人で使えるような形にしようかなと思います。

出来たもの
※動作確認環境 Google Chrome (ver 17.0.963.79)

英単語を覚えることについて
 英語初級レベル(TOEIC700未満くらい)だと英単語を覚えるという作業は不要だと思います。英単語を覚える暇があったら、たくさん文章を読んだ方がいいと思います。文章を読んで前後の文脈から知らない単語の意味を推測する力を付けるのです。また、このレベルだと知らない単語といっても頻出単語が多いと思います。知らない単語に出会う、意味を推測する、それがあってるか確かめる、これを繰り返していれば自然と語彙は増えていきます。
 中級レベル(TOEIC900超えたくらい)になると、語彙が大切になってくると思います。まず知らない単語に出会ったとして次にその単語に出会う頻度が確実に低くなります。なので、初級レベルで行うような方法では知ってる単語数を効率的に増やすことは難しいです。そもそもそんな滅多に出会わないような単語覚えなくてもいいんじゃない?という考え方もありますが、上級レベルに達したい場合は難しい単語も積極的に覚えていきたいわけです。
 また、TOEICで基本的なリーディング、リスニングができるようになると、次はスピーキング、ライティング力を鍛えるようになります。特にスピーキングは語彙が重要です。例えば、「中指を突き指した。」「頭にたんこぶができた。」「足がつった。」など日常よく使いそうな言葉でもなかなか表現がぱっとでて来ません。もちろん、「中指が痛い」とか「頭をぶつけて痛い」とか伝わるレベルの表現ならできますが、より詳細に伝えたい場合は豊富な語彙が必要になります。

工夫した点
 英才教育を受ける園児が紙に書いた何かを高速で見せられているのをテレビでみました。最初はスピードが遅くて、徐々に速くしていくというものです。単純にこれをjavascriptで実装しました。
 また、新しいことを覚える場合には
  1. 新しいことを覚える
  2. 次の日に覚えたことを確認する
  3. 1週間後にもう一度確認する
  4. 1カ月後に確認する(忘れていたものがあったら、重点的に見る)
  5. 半年後に確認する (忘れていたものがあったら、重点的に見る)
ということをするとよいと脳科学的に推奨されていました。(期間はうろ覚えです。。)これを参考に、
  1. 直近で登録された100単語のみをランダムで出す
  2. 覚えていなかったものから100単語をランダムに出す
  3. すべての単語から100単語をランダムに出す
をできるようにしました。今のところ、効率的に覚えられていると思います。(まだ、100単語しか登録してないですが。。)

技術的な話
 今回jsonを利用した非同期通信に初めてチャレンジしました。1つ目は、非同期通信によるデータベース更新です。
  1. チェックボックスの変化をjavascriptのイベントハンドラでキャッチする。
  2. 更新したいデータをGETパラメータに入れてjQuery.get()でCGI(php)にアクセスする。
  3. CGI側で、GETで受け取ったパラメータに応じてDBを更新。更新結果をjson形式で出力する。
  4. 3.の出力内容に応じてコールバック処理を実行する。
 2つ目は、テキストエリア内に表示する単語リストの更新です。
  1. ラジオボタンの変化をjavascriptのイベントハンドラでキャッチする。
  2. 選択されたボタンタイプをGETパラメータに入れてjQuery.get()でCGI(php)にアクセスする。
  3. CGI側で、GETで受け取ったパラメータに応じてSQLを発行し結果をjson形式で出力する。
  4. 3.の内容をコールバック関数内でローカルな変数(DOMで読みとるデータ)にコピーする。


 簡単なことですが、感動しました。「これが、ajaxか!!」と。だいぶ時代遅れですいません。あとは、今回からgitを使ってきちんとソースコードを管理するようにしました。エクセル方眼系エンジニアな私ですが、web系エンジニアさん達との技術の差をちょっとでも埋められるように地道にがんばります。

2011年10月3日月曜日

サーバー奮闘記(15) php CLI版インストール

phpをコマンドラインから使おうと思ったけど、使えなかった。
CLI(Command Line Interface)版のphpがインストールされていなかったことが原因だった。
ということで、CLI版のphpをインストールした。

$ sudo apt-get install php5-cli

これで行けるはず。以下のコマンドでバージョンが表示されればOKです。

$ which php

CLI版のphpは何かと重宝しそうです。perlでもいいんですけど、個人的にperlは象形文字みたいで気持ち悪くてあまり好きじゃないんです。あと今回やりたかったテーマは、MySQLからデータを引っ張ってきてバッチ処理をするだったので、すでにCGIではMySQLの設定が出来てるphpでやりたかったのです。

とりあえず、データはCGIでやるような感じで引っ張ってこれました。

#! /usr/bin/php -q

<?php

// connect to MySQL Server
$link = mysqli_connect("host", "usr", "passwd", "db");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

// send a query
$query =
"SELECT
dic.word,
sample.sentence
FROM
SampleSentences sample right outer join MyDictionary dic
ON
sample.word_id = dic.id";

$result = mysqli_query($link, $query);
if (!$result) {
print("An error occurred while processing SQL queries.<br>\n");
exit();
}

// show word lists
$word = "";
while ($row = mysqli_fetch_array($result))
print $row['word'] . " " . $row['sentence'] . "\n";
?>

CLI版のphpの説明はここが詳しそうですかね。

2011年5月13日金曜日

サーバー奮闘記(10)

今日はphp、MySQLを入れた。
あと、apacheの設定をちょっといじった。
  1. php、MySQLのインストール
  2. php-modeのインストール
  3. index of の非表示

1. php、MySQLのインストール
以下でインストール
 sudo apt-get install apache2 php5 php5-gd mysql-server php5-mysql

apacheでphpの使用を有効にする。
 sudo a2enmod php5
 sudo /etc/init.d/apache2 restart

再起動で警告が出る。
sudo: unable to resolve host hogehogehoge
* Restarting web server apache2 apache2: apr_sockaddr_info_get() failed for hogehogehoge
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
... waiting apache2: apr_sockaddr_info_get() failed for hogehogehoge
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
(注:hogehogehogeはマシン名)

hostsの設定だな。
 sudo vi /etc/hosts
で以下のように変更。
 127.0.0.1 localhost.localdomain hogehogehoge
再び再起動。OK。


2.php-modeのインストール
apt-getでインストールできない。バイトコンパイルをしてみた。
  wget http://sourceforge.net/projects/php-mode/files/php-mode/1.5.0/php-mode-1.5.0.zip
 unzip php-mode-1.5.0.zip
 sudo mv php-mode-1.5.0.zip /usr/share/emacs/site-lisp
emacsを開いて
 M-x byte-compile-file
でelispファイルをコンパイル。

~/.emacsに追記
(load-library "php-mode")
(require 'php-mode)

動かない。。haskel-modeのディレクトリ構成をまねて
ソースファイルは
 /usr/share/emacs/site-lisp
コンパイル後のファイルは
 /usr/share/emacs/22.2/site-lisp
においてみる。出来た!色が付いた。わーい


3. index of の非表示
webページアクセスの際に、ファイル名を指定しないとそのディレクトリの内容が表示されてしまう。
これはちょっとかっこ悪い+セキュリティ的にも問題あり。なので、設定を変えてみる。

ネットで探していろいろ試すが、うまくいかない。。そもそもUbuntuにはhttpd.conf無いし。
OSによってapacheのディレクトリ構成が違うようです。Debian系はここにいろいろ良い情報が載ってました。
http://www.linux.net-japan.info/install08.html

sites-availableディレクトリに設定があるのか。
 sudo vi /etc/apache2\sites-available/default
でRoot DirectoryのOptionsの"Indexes"という部分(↓の太字部分)を消せばOK。

  Options Indexes FollowSymlinks MultiViews
  AllowOverride None
  Order allow,deny
  allow from all

で再起動。起動、再起動系はapache2ctlよりinit.dの方がいいみたい。
 sudo /etc/init.d/apache2 stop
 sudo /etc/init.d/apache2 start
出来た。ディレクトリの中身見れない。index.htmlを作成すると、ディレクトリ指定の場合は、index.htmlに飛ぶらしいので、作った。


phpを試してみた。次世代のfizzbuzzをやってみた。




サーバー奮闘記一覧はこちらから。ここに書いていることを順にやれば、いろいろできるようになるかも!?

(参考サイト)
http://blog.kcg.ne.jp/blog/sato_si/5488
http://ubuntuforums.org/showthread.php?t=723361