2012/01/30

【PHP】月の最終日を取得する

今日のメモです。

指定した年月の最終日を取得します。

<?
$year  = '2012';
$month = '01';

$last_day = date('t', mktime(0, 0, 0, $month, 1, $year));
終わり

2012/01/29

【PHP】strcmpで比較するときの注意

以前値の比較に「strcmp関数」を使用していたところ
「strcmp関数」で比較はしないほうがいいと言われたのでなんでなのか
を調べた際のメモです。

まず、strcmp関数では値を比較する際にstring型にキャストします。
strと付いているので当然かと思います。

なので、string型へキャストした際に何がどのような値になるのか注意する
必要があるということです。

なので今度から比較の際は「===」を使用していきたいと思います。


終わり

参考:
http://d.hatena.ne.jp/hnw/20090123

2012/01/25

【開発環境構築】既存のプロジェクトのリポジトリを作成する

既存のプロジェクトでリポジトリを作成する方法です。

まず、既存のプロジェクトを右クリックし
[チーム] -> [プロジェクトの共有] を開きます。

下記の3つの中から使用するバージョン管理システムを選択します。
・CVS
・Git
・SVN

選択が完了したら既存のリポジトリを使うかどうか聞かれますので、
必要なものを選択して完了です。

終わり

【開発環境構築】Android Virtual Device(AVD)を作成する

ということで、昨日のEclipse でのAndroidアプリ開発環境構築もいよいよ大詰めです。

Androidアプリの開発ではデバッグでエミュレータを使います。
まあ仮想のAndroid OSを使うってことですね。

これで今回使用するのが、Android Virtual Device(AVD)になります。

こちらの作成メモを残しておきます。

まず、Eclipseの [ウィンドウ] -> [AVD Manager]を開きます。
すると下記画像のウィンドウが開きますので、 「新規」 ボタンを押下します。
すると下の画像のようなウィンドウが開きますので、順番に入力していきます。 今回の設定は下記になります。 ・名前 and2.1 ・OS  Android 2.1 ・SD  1024Mb
作成が完了するとウィンドウが閉じて元のウィンドウに戻ってきます。 きちんと追加されているかどうか確認したら、作成したAVDを選択し、 「開始」 ボタンを押下します。 すると起動オプションの設定画面が表示されます。
特にオプションは付けないので、そのまま 「起動」 ボタンを押下します。
しばらく読み込みがありますが、下記ウィンドウが表示されれば 起動テストは完了です。
以上で設定は終わりです。 後は開発するだけですね。 終わり 関連記事: 【開発環境構築】Eclipse 3.7 にADTプラグインをインストールする【Android】

【Windows】Windows7でコマンドプロンプトから使用するDNSサーバを変更する

ということでWindows7のコマンドプロンプトから使用する
DNSサーバの変更を行いました。

自社のDNSだと申請したドメインでブラウザから確認できなかったので
GoogleのDNSを使おうということでその際のメモです。

下記コマンドで変更可能です。
C:\>netsh interface ip set dns "ローカル エリア接続" static 8.8.8.8 primary C:\>netsh interface ip add dns "ローカル エリア接続" 8.8.4.4
※ローカル エリア接続のところには使用している接続を指定します。 GoogleのDNSは「8.8.8.8」と「8.8.4.4」になりますので 「8.8.8.8」を優先DNSに「8.8.4.4」を代替DNSに設定しました。 設定の確認は下記コマンドで行えます。
C:\>ipconfig /all … DNS サーバー. . . . . . . . . . . : 8.8.8.8 8.8.4.4
これで完了です。 終わり

【開発環境構築】Eclipse 3.7 にADTプラグインをインストールする【Android】

android SDKなどのインストールは前回記事などを参照して下さい。

Eclipseの [ヘルプ] -> [新規ソフトウェアインストール]を開きます。
赤い四角で囲まれている入力フォームに下記URLを入力し、 「追加」ボタンを
押下します。
https://dl-ssl.google.com/android/eclipse/
出てきた一覧のチェックボックスをすべてオンにします。 チェックボックスをオンにしたら、 「次へ」 を押下します。
インストールされる項目を確認したら 「次へ」
「使用条件の条項に同意します。」 にチェックを入れ 「完了」 を押下します。
警告がでますので、 「OK」 を押下します。
インストール完了後、Eclipseが再起動を要求してきますので、再起動します。
Eclipseが起動したら、[ウィンドウ] -> [設定]よりAndroidを選択し、 下の画像のようにSDKの場所に先ほどインストールしたSDKのフルパスを指定します。
以上で、設定は完了です。 終わり 関連記事: 【開発環境構築】JDKのインストール 【開発環境構築】Android SDKをインストール Part.1【Android】 【開発環境構築】Android SDKのインストール Part.2【Android】

【開発環境構築】Android SDKのインストール Part.2【Android】

この記事はAndroid SDKのパッケージインストールの記事になります。
Android SDKのインストールについては、前記事を
参照して下さい。

前記事の 「Finish」 押下後下記ウィンドウが
開きます。
必要なパッケージを選択肢、 「Install n Packages...」 ボタンを押下します。
※ 基本的に全パッケージの選択を推奨しますが、開発対象のOSを絞ってもいいかと
※ 思います。1.xとか今使ってる人がいるかわかりませんし…
「Accept All」にチェックを入れ 「Install」 を押下します。
インストールが始まりますので、しばらく待ちます。 結構かかりました。
終わり 関連記事: 【開発環境構築】JDKのインストール 【開発環境構築】Android SDKをインストール Part.1【Android】 【開発環境構築】Eclipse 3.7 にADTプラグインをインストールする【Android】

【開発環境構築】Android SDKをインストール Part.1【Android】

ということで、Androidアプリ開発のためにAndroid SDKをインストールします。

まずは、こちらのサイトにアクセスします。

インストーラ版とZip版がありますが今回はインストーラ版でやりたいと思います。
特に理由はないです。

まず、赤で囲まれている 「installer_r16-windows.exe」を押下します。
ダウンロードが始まります。

ダウンロードが完了したら、ファイルを実行します。 下記の画面が表示されますので 「Next」 を押下します。
次も 「Next」 を押下します。
インストールする場所の選択です。 今回はデフォルトのままで行きます。 選択が完了したら 「Next」 を押下し、次に進みます。
スタートメニューに登録するかどうかの選択です。 選択が完了したら 「Install」 を押下し、インストールを開始します。
インストール中画面
インストールが完了したら、 「Next」 を押下します。
完了画面です。 「Finish」 を押下し次にAndroid SDKにて使用するAndroid OSなどのパッケージをインストールします。
続き 終わり 関連記事: 【開発環境構築】JDKのインストール 【開発環境構築】Android SDKのインストール Part.2【Android】 【開発環境構築】Eclipse 3.7 にADTプラグインをインストールする【Android】

2012/01/24

【開発環境構築】JDKのインストール

今回のインストールした環境は下記になります。
OS:Windows 7 Pro 64bit
今回インストールするJDKはEclipseでAndroidアプリ開発用の環境構築に使用します。 まず、ORACLEのこちらのページにアクセスします。 下記の赤で囲まれたDownloadボタンを押下します。
次の画面に遷移しますので、赤で囲まれている「Accept License Agreement」の チェックボックスにチェックを入れます。(ライセンスに同意する) チェックボックスにチェックを入れたら、下の方にある赤で囲まれた「jdk-7u2-windows-x64.exe」 を押下します。 ファイルのダウンロードが始まります。
ファイルのダウンロードが終わったらダウンロードしたファイルを実行します。 下記の画像のような画面が表示されますので、 「次へ」 を押下します。
次にインストールするものを選択します。 特に変更はないと思いますので、そのまま 「次へ」 を押下します。
インストールが始まりますので少し待ちます。
しばらくすると下記のウィンドウが開きます。 インストール先の指定ですが、特に変更がなければこのまま 「次へ」 を押下します。
インストールが始まりますので少し待ちます。
インストールが完了すれば下記の画面が表示されます。
「継続」というボタンがありますが、これを押下すると「JavaFX」のインストールが 始まりました。 今回は必要無いので「キャンセル」ボタンを押下し終了しました。 終わり。

2012/01/22

【プログラミング】PHPプログラマについて思うこと【PHP】

PHPプログラマについて思うことがあったので書いてみようと思います。

まず、PHPは型宣言がなくすごく曖昧です。
厳密にチェックしようと思えばできるのですがそれでも言語として貧弱な所が
あります。

例えば下記のような関数があったとします。
function example($bool)
{
    if ($bool)
    {
        echo "A";
    }
    else
    {
        echo "B";
    }
}
引数に0とかnullとか以外をセットするとこの場合 「A」 が表示されます。 ですが、関数がこういう書き方をされていると
function example($bool)
{
    if ($bool === true)
    {
        echo "A";
    }
    else
    {
        echo "B";
    }
}
引数の値が 「true」 でなければ 「A」 は表示されません。 この関数の例えを踏まえてこんな会話を聞いたことがあります。 A「ここの関数はtrueを指定しないとダメじゃないの?」 B「1入れても動くんで大丈夫ですよ」 これを聞いていて僕は「何が?」と思ってしまいました。 もしPHPに使用変更があって型が厳密になったらどうするの?とか その関数を作成した担当が値を型までチェックするように変更したら?とか思います。 こういう意識を持っていない人がPHPプログラマには僕を含めて多いと思います。 型が曖昧でとっつきやすいところがPHPの特徴でありいろいろ楽できるところなんですが、 個人的にはあまり好きではないです。 自分でもPHPのそういうところに助けられたりしたことがあるのですが、 できるだけ厳密に型については扱うように心がけようと思いました。 以上なんとなく思ったことでした。 終わり

【PHP】Twitter APIを使ってつぶやきを投稿するサンプル【Twitter】

ということでPHPでTwitterAPIをつかってつぶやきを投稿するサンプルを作りました。

※Twitter APIを使うにはOAuth認証を使いますのでこちらより必要なモノを取得してください。

必要なもの
・Consumer key ・Consumer secret 前回の記事を参考にしてください。 今回はサイトURLを   http://example.com/index.php コールバックURLを   http://example.com/callback.php という感じに設定しました。 通常コールバックURLにてアクセストークンの保存処理などを行うのですが、今回は サンプルということでそのままつぶやきを投稿しています。 下記ソースです。 index.php
<?php
session_start();
require_once 'common.php';

$consumer_key    = '取得したコンシューマキー';
$consumer_secret = '取得したコンシューマシークレット';
$request_url     = 'https://api.twitter.com/oauth/request_token';
$auth_url        = 'https://api.twitter.com/oauth/authorize';

// シグネチャ作成用パラメータ
$signature_params = array(
    'oauth_consumer_key'     => $consumer_key,
    'oauth_nonce'            => md5(microtime() . mt_rand()),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp'        => time(),
    'oauth_version'          => '1.0',
);
// シグネチャの作成
$signature = getOAuthSignature($request_url, $signature_params, $consumer_secret);
$signature_params['oauth_signature'] = $signature;

// トークン取得用リクエスト文字列作成
$query = getRequestQuery($signature_params);

// リクエストトークン取得
$request_token = getRequestToken($request_url, $query);

// Twitterのアプリケーション認証画面へリダイレクト
header('Location: ' . $auth_url . '?oauth_token=' . $request_token);
exit;

/**
 * リクエストトークンの取得
 * @param  string $request_url   リクエストURL
 * @param  string $query         リクエストパラメータのクエリストリング
 * @return string $request_token リクエストトークン
 */
function getRequestToken($request_url, $query)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $request_url . '?' . $query);

    $res = curl_exec($ch);
    curl_close($ch);

    parse_str($res, $result);
    $request_token = $result['oauth_token'];

    return $request_token;
}
callback.php
<?php
session_start();
require_once 'common.php';

$consumer_key    = '取得したコンシューマキー';
$consumer_secret = '取得したコンシューマシークレット';
$access_url      = 'https://api.twitter.com/oauth/access_token';
$update_api      = 'https://api.twitter.com/1/statuses/update.json';

// アクセストークン取得用パラメータ
$params = array(
    'oauth_consumer_key'     => $consumer_key,
    'oauth_nonce'            => md5(microtime() . mt_rand()),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp'        => time(),
    'oauth_token'            => $_GET['oauth_token'],
    'oauth_verifier'         => $_GET['oauth_verifier'],
    'oauth_version'          => '1.0',
);

$signature = getOAuthSignature($access_url, $params, $consumer_secret, 'POST', $_GET['oauth_token_secret']);
$params['oauth_signature'] = $signature;

// トークン取得用リクエスト文字列作成
$query = getRequestQuery($params);

// アクセストークンとシークレットの取得
$access_token = getAccessToken($access_url, $query);

// ツイート投稿パラメータ
unset($params['oauth_signature'], $params['oauth_verifier']);
$params['status'] = 'test投稿';
$params['oauth_token'] = $access_token['oauth_token'];

uksort($params, 'strnatcmp');
$signature = getOAuthSignature($update_api, $params, $consumer_secret, 'POST', $access_token['oauth_token_secret']);
$params['oauth_signature'] = $signature;

// パラメータ名でソート
uksort($params, 'strnatcmp');
$request_param = getRequestQuery($params);

echo '<pre>';
print_r(update($update_api, $request_param));
echo '</pre>';

/**
 * つぶやきの投稿
 * @param  string $update_api    update apiのURL
 * @param  string $request_param リクエストパラメータ
 * @return string $res           TwitterAPIよりのレスポンス
 */
function update($update_api, $request_param)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $update_api);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request_param);
    curl_setopt($ch, CURLOPT_HEADER, false);

    $res = curl_exec($ch);
    curl_exec($ch);

    return $res;
}

/**
 * アクセストークンの取得
 * @param  string      $access_url アクセストークン取得用URL
 * @param  assoc_array $query      アクセストークン取得用クエリ
 * @return assoc_array $result     アクセストークン と アクセストークンシークレット
 */
function getAccessToken($access_url, $query)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $access_url . '?' . $query);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $res = curl_exec($ch);
    parse_str($res, $result);
    $access_token = $result['oauth_token'];

    return $result;
}
common.php
<?php
/**
 * シグネチャ文字列の作成
 * @param  string      $request_url     リクエストURL
 * @param  assoc_array $params          シグネチャ作成用パラメータ
 * @param  string      $consumer_secret コンシューマシークレット
 * @param  string      $method          リクエストメソッド
 * @param  string      $oauth_token     OAuth token
 * @return string      $signature       シグネチャ
 */
function getOAuthSignature($request_url, $params, $consumer_secret, $method = 'GET', $oauth_token_secret = '')
{
    $signature = '';

    $params = array_map('urlEncodeRfc', $params);
    uksort($params, 'strnatcmp');

    $param = array();
    foreach ($params as $key => $val)
    {
        $param[] = $key . '=' . $val;
    }
    $query = implode('&', $param);

    $base_array = array(
        $method,
        $request_url,
        $query,
    );
    $base_array = array_map('urlEncodeRfc', $base_array);
    $base_string = implode('&', $base_array);

    $key = array(
        $consumer_secret,
        $oauth_token_secret,
    );
    $key = array_map('urlEncodeRfc', $key);
    $key = implode('&', $key);

    // ベース文字列をシグネチャに
    $signature = base64_encode(hash_hmac('sha1', $base_string, $key, true));

    return $signature;
}

/**
 * URLエンコードをしたリクエスト用クエリストリングを作成
 * @param  assoc_array $params 作成する連想配列
 * @return string      $query  クエリストリング
 */
function getRequestQuery($params)
{
    $params = array_map('urlEncodeRfc', $params);
    $query_param = array();
    foreach ($params as $key => $val)
    {
        $query_param[] = $key . '=' . $val;
    }
    $query = implode('&', $query_param);

    return $query;
}

/**
 * URLエンコード
 * @param  string $str     エンコードする文字列
 * @return string $enc_str エンコード済み文字列
 */
function urlEncodeRfc($str)
{
    $enc_str = str_replace('%7E', '~', rawurlencode($str));

    return $enc_str;
}
流れは、index.phpでまず、リクエストトークンを取得します。 その後リクエストトークンをクエリパラメータとしてTwitterの アプリケーション認証画面にリダイレクトします。 ユーザが認証を押下した場合 コールバックURL「callback.php」 に リダイレクトされます。 リダイレクトされてきた際にGETパラメータにて 「oauth_token」 「oauth_token_secret」 の値が付加されていますので、その値を使いアクセストークンを取得します。 つぶやきを投稿する際はつぶやき投稿用パラメータを含めたシグネチャを作成し、 取得したアクセストークンを使ってリクエストを送信します。 おおまかな流れは以上になります。 終わり 関連記事: 【Twitter】TwitterのAPIを使う準備

2012/01/21

【Twitter】TwitterのAPIを使う準備

ということでTwitterAPIを使う準備をしました。

まず、こちらへアクセスすると下記の画面へ遷移します。
赤い四角で囲まれている 「Create an app」 を押下します。

すると下記画面が表示されログイン要求をされますので、いつものログインIDとPWを入力し ログインします。
ログイン後に下記の画面が表示されますので、そこに必要な項目を入力します。 下記が入力項目とその画面になります。 ・Name アプリケーション名 ・Description アプリケーションの説明文 ・WebSite アプリケーションのTOP ・Callback URL 認証時のコールバック用URL 入力が完了したら一番下の 「Create your Twitter application」 を押下します。
するとこちらの画面に遷移しますので、 Consumer key Consumer secret をアプリケーションで使用しますので保存します。 以上でTwitterAPIを使ったアプリケーションの作成準備は完了です。 次はつぶやきの投稿サンプルを作成したいと思います。 終わり 【追記】 Twitter APIでつぶやきを投稿する際は書き込み権限が必要になりますので下記の画面にて 「Read & Write」にチェックを入れる必要があります。
関連記事: 【PHP】Twitter APIを使ってつぶやきを投稿するサンプル【Twitter】

2012/01/19

【雑記】懐かしい駄菓子があったので

懐かしい駄菓子があったのでつい買っちゃいました。

小学生ぐらいの時は放課後よく駄菓子屋に行ったなぁ いろいろ混ぜて食べたりしてあの頃は本当に行儀が悪かったなと 思います。 さすがに最近は落ち着いて来ましたがこういうの見ると懐かしいですね。 終わり

2012/01/16

【PHP】https(SSL)環境に対してcURLの実行

https環境に対して cURL を実行した際のメモ

cURLを使う際 httpsで通信することがあると思います。
その際証明書エラーのようなものが出ます。

この警告はfopenなどのときにも出力されます。

cURLでは下記のオプションに 「false」 をセットすることによってSSL証明書の検証を
行わないようになります。

CURLOPT_SSL_VERIFYPEER
下記がサンプルソースです。
<?php
// リクエストURL
$url = "https://www.example.com/";
// リクエストパラメータ
$param = array(
    'test'  => 'Apple',
    'test2' => 'Lemon',
);
// 初期化
$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  // SSL証明書を検証しない
curl_setopt($ch, CURLOPT_POST, true);             // POSTメッソッドを使用
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);     // リクエストパラメータを指定

// リクエストを実行
$res = curl_exec($ch);
curl_close($ch);

echo "<pre>";
var_dump($res);
echo "</pre>";
終わり

2012/01/14

【Firefox】UserAgentを切り替えるアドオン UserAgentSwitcherをインストールする

今回はスマートフォンようWebサイトを作成した際に使用したFirefoxのアドオン
「UserAgentSwitcher」のことについてメモしておきます。

まず、「UserAgentSwitcher」とはUserAgentを切り替えられるアドオンです。
UserAgentの説明は割愛します。

インストールはこちらから行います。

インストールが完了したら再起動します。

再起動後
[ツール] -> [アドオン] -> [拡張機能]より「UserAgentSwitcher」の設定を
選択します。

「UserAgentSwitcher」は初期状態では3つほどしかUserAgentの情報が入っていないので
自分で設定を追加する必要があります。

UserAgentの追加がめんどうなのでこちらのブログでインポート用のXMLが公開されていますので
こちらからダウンロードします。

我流天性 がらくた屋

ダウンロードしたらまた、
[ツール] -> [アドオン] -> [拡張機能]より「UserAgentSwitcher」の設定を
選択し、Importボタンをクリックします。

これに先ほどダウンロードしたXMLを選択すれば、大量にUserAgentが追加されます。

終わり

2012/01/11

【PHP】PHPのexec関数

ということで今回はexecコマンドについてのメモです。

まず、同期をとっての実行方法です。
exec('コマンド');
コマンドにはシステムコマンド(ls)とかファイルパスだったりを指定できます。 第二引数に変数を指定することにより、コマンドの結果を取得できます。 この際取得できる結果は1行ごとに配列になります。 例えば結果が
dr-xr-xr-x    2 root  wheel      512 Jan  1  2009 proc
drwxr-xr-x    2 root  wheel     2560 Sep 24  2010 rescue
drwxr-x---    5 root  wheel      512 Aug  2  2010 root
だとすると
array(
    0 => 'dr-xr-xr-x    2 root  wheel      512 Jan  1  2009 proc',
    1 => 'drwxr-xr-x    2 root  wheel     2560 Sep 24  2010 rescue',
    2 => 'drwxr-x---    5 root  wheel      512 Aug  2  2010 root',
);
このように結果が返却されます。 次に、非同期で実行する場合
exec('コマンド > dev/null &');
上記の様に記述することで非同期でコマンドを実行することができます。 コマンドの結果をdev/nullにリダイレクトしています。 また dev/null とは、Unixシステム上での スペシャルファイルで、常に空であるファイルです。 最後に &をつけバックグラウンドで実行するようにします。 これでバックグラウンドでPHPを実行したりシェルスクリプトを実行したりできます。 また、コマンドを使用する際は「escapeshellcmd関数」でエスケープします。 終わり 【追記】:2012-03-06 exec関数使用時にescapeshellcmd関数を使うだけでは どうも不十分なようです。 escapeshellcmd関数では、シングルクォート・ダブルクォートともに対になっていないと エスケープされないため意図しない動作が起こる可能性があります。 ですので、引数などはescapeshellarg関数を使用して引数ごとに エスケープを行った方がパラメータの意図しない追加などを防ぐのに有効です。 こちらのブログの記事で詳しく説明されています。 参考: PHPのescapeshellcmdの危険性 - 徳丸浩の日記

2012/01/07