2011/12/30

【PHP】FacebookのGraphAPIを使ってウォールを投稿するサンプル【Facebook】

ということでPHPでFacebookのGraphAPIを使ってウォールを投稿するサンプルを作りました。

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

必要なもの
・App ID ・App Secret 前回の記事を参考にしてください。 サービスのURLを   http://example.com/index.php という感じに設定しました。 またmixiGraphAPIだとリダイレクト先のURLも指定するのですが、FacebookのOAuth認証では リダイレクトURLをパラメータに含める方式なのでプログラム側で指定します。 リダイレクトURLはプログラム側で   http://example.com/callback.php のような感じに設定しました。 通常リダイレクトURLにてアクセストークンの保存処理などを行うのですが、今回は サンプルということでそのままウォールに投稿もしています。 下記ソースです。 index.php
<?php
// リクエストパラメータ
$param = array(
    'client_id'     => 'App ID',
    'redirect_uri'  => 'リダイレクトURL',
    'scope'         => 'status_update,offline_access',
    'response_type' => 'code',
    'display'       => 'page',
);

// 認証画面へリダイレクト
header('Location: https://www.facebook.com/dialog/oauth?' . http_build_query($param));
callback.php
<?php
if ($_GET['code'] != '')
{
    // アクセストークンの取得
    $access_token = getAccessToken($_GET['code']);
}

if ($access_token != '')
{
    // ウォールへ投稿
    $text = 'test message';
    $res = postUpdate($access_token, $text);
}

/**
 * アクセストークンの取得
 * @param  string $code         Facebookからのレスポンス
 * @return string $access_token アクセストークン
 */
function getAccessToken($code)
{
    // アクセストークン取得用URL
    $auth_url = 'https://graph.facebook.com/oauth/access_token';
    // リクエストパラメータ
    $param = array(
        'client_id'     => 'App ID',
        'client_secret' => 'App Secret',
        'code'          => $code,
        'redirect_uri'  => 'リダイレクトURL',
    );
    $auth_url .= '?' . http_build_query($param);

    // cURLでアクセストークンを取得
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $auth_url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);

    $res = curl_exec($ch);
    curl_close($ch);
    parse_str($res, $res_array);

    return $res_array['access_token'];
}

/**
 * Facebookのウォールへ投稿します。
 * @param  string      $access_token アクセストークン
 * @param  string      $text         投稿内容
 * @return assoc_array $res          Facebookからのレスポンス
 */
function postUpdate($access_token, $text)
{
    // ウォール投稿API URL
    $post_url = 'https://graph.facebook.com/me/feed';

    $ch = curl_init();
    $param = array(
        'access_token' => $access_token,
        'message'      => $text,
    );

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_URL, $post_url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);

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

    return $res;
}
流れは大体mixiGraphAPIと一緒でした。 ですのでそちらの方も参考にしていただければと思います。 終わり 関連記事: 【Facebook】FacebookのGraphAPIを使う準備

【Facebook】FacebookのGraphAPIを使う準備

ということで勉強がてらmixiの次はFacebookのGraphAPIを触ってみたいと思います。

まず、こちらにアクセスします。
ログイン要求画面が表示されるかもしれないですが、いつもどおりFacebookにログインする際に
使用しているパスワードでログインします。

下記の画面が表示されるかと思いますので、赤い四角で囲まれた
「新しいアプリケーションを作成」を押下します。
すると次のようなダイアログが出てきますので、必要な項目を入力します。 アプリケーション名と名前空間の登録になります。 今回はWebサイトアプリケーションの作成なので名前空間は使用していませんが入力する 必要があります。
次にセキュリティチェックのダイアログが出てきます。
僕は初めてのアプリケーション作成だったので次のダイアログが表示されました。 電話番号の登録が必要なようです。 赤で囲まれているアンカーをクリックし登録します。
すると下記のダイアログが表示されますので、国を選択し、 携帯のメールアドレスを入力します。
登録すると下記の画面にダイアログが遷移します。 ここでは登録したメールアドレスに来たメールにコードが書かれていますので そのコードを入力し認証を完了させます。
完了すると携帯電話登録のダイアログに戻りますのでダイアログを閉じます。
ダイアログを閉じるとまたセキュリティチェックがあるので書いてある文字を入力します。
上記が完了したらこちらのURLにアクセスし、先ほどのアプリケーションが 登録されているか確認しましょう。 下記のような画面が表示されますので赤で囲まれている「アプリを編集」を押下します。
下記画面が表示されますので必要な項目を入力していきます。 入力が完了したら「変更を保存」ボタンを押下し、赤で囲まれているリンクを押下します。
こちらの画面でも必要な項目を入力します。 入力が完了したら「変更を保存」ボタンを押下します。
これでアプリケーションの登録は完了です。 App ID と App Secret はアプリケーションを作成する際に使用します。 終わり 関連記事: 【PHP】FacebookのGraphAPIを使ってウォールを投稿するサンプル【Facebook】

2011/12/28

【プログラミング】OAuth認証のお話

今日はOAuth認証のことについていろいろ調べてみたのでそのことについて書いていきたいと
思います。

OAuthとは
OAuthとは 「認可情報の委譲」 を行うプロトコルです。 オースと読むらしいです。 要点としては
あらかじめ信頼関係があるサービス間でユーザの同意のもとセキュアにユーザの権限を 受け渡しする
というものです。
Oauth認証の相関図
OAuth認証の相関関係
OAuth認証は下記3つの相関関係でできています。 ・OAuthを提供するサービスプロバイダ(Twitterなど) ・OAuthを使ってサービスを作るコンシューマ ・サービスを使用するユーザ サービスプロバイダはOAuth認証と認証によって使用できるようにサービスを提供します。 コンシューマはユーザがOAuth認証を使って使用するサービスを提供します。 ユーザはコンシューマのサービスのアクセスを許可したり、許可を解除したりします。
OAuthの流れ
1.コンシューマがサービスプロバイダからOAuthの利用申請をする。   Consumer Key や Consumer Secret をサービスプロバイダから取得する。 2.ユーザがコンシューマのサービスにサービスプロバイダから   使用する権限を取得するよう要求する。 3.コンシューマがバックグラウンドでリクエストトークンを取得する。   ※先に4のフローに移行するサービスもあるようです。 4.コンシューマはサービスプロバイダに未認可のリクエストトークンを   パラメータに載せてリダイレクトさせる。 5.ユーザがサービスプロバイダにてアクセス権の委譲を許可する。   この際未認可のリクエストトークンをサービスプロバイダが許可済みにする。 6.サービスプロバイダがユーザをコンシューマへとリダイレクトさせる。 7.コンシューマが認可済みのリクエストトークンを使いバックグラウンドで   アクセストークンを取得する。 8.コンシューマがアクセストークンを使いOAuthにより提供されている   サービス情報にアクセスする。 終わり

2011/12/26

【PHP】mixiGraphAPIのOAuth認証用ライブラリを作成しました。【mixi】

ということで前回の記事で最後の方に言っていたmixiGraphAPIのOAuth認証用
ライブラリを作りました。

使い方等はreadme.txtなどに書いてありますが、至らない所が結構あると思うので
何かあればコメント欄にコメントをお願いします。

ダウンロードはこちらから

終わり


関連記事:
【mixi】mixiGraph APIを使うための準備
【PHP】phpでmixiGraphAPIを使ってmixiにつぶやきを投稿するサンプル【mixi】

2011/12/25

【雑記】久々のハンドリング

久々にハンドリングしました。
ベビーの時よりはかなり大人しくなりハンドリングもしやすく?なりました。
かなり前に記事にあげた写真よりだいぶ白くなったような気がします。
体長も60cm程になりました

終わり

2011/12/23

【PHP】phpでmixiGraphAPIを使ってmixiにつぶやきを投稿するサンプル【mixi】

phpでmixiGraphAPIを使ってつぶやきを投稿するサンプルを作ってみました。

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

必要なもの
・Consumer Key ・Consumer Secret 前回の記事を参考にしてください。 前回の記事でサービスURLとリダレクトURLをそれぞれ下記のように設定しました。 ・サービスURL http://example.com/index.php ・リダイレクトURL http://example.com/callback.php こちらの話からしていきたいと思います。 まず、サービスURLとは自分で作成したサービスへの動線になります。 今回はサービスURLにアクセスした際に自動でmixiに認証しに行くように実装します。 次にリダイレクトURLですが、こちらはmixiの認証からのレスポンスを受け取るURLになります。 リダイレクトURLの方にアクセスユーザのOAuth認証用のパラメータを保存したりする処理を 実装しておけば大丈夫だと思います。 今回はサンプルということでリダイレクトURLの方でつぶやく機能もそのまま実装しました。 index.php
<?php
// 認証用パラメータ
$param = array(
    'client_id'     => '取得したConsumer Key',
    'response_type' => 'code',
    'scope'         => 'w_voice',
    'display'       => 'pc',
    'state'         => null,
);
// 認証先URL
$auth_url = 'https://mixi.jp/connect_authorize.pl';
// 認証用パラメータをクエリストリングに
$request_param = http_build_query($param, null, '&');

// リクエストURLを作成
$request_url = $auth_url . '?' . $request_param;

// 認証
header('Location: ' . $request_url);
exit;
callback.php
<?php
session_start();

$access_token = null;

// Authレスポンスの取得
$code = $_GET['code'];

if ($code != '')
{
    // アクセストークンの取得
    $access_token = getAccessToken($code);
}

// つぶやきを投稿する
if (!is_null($access_token))
{
    // 投稿内容
    $text = 'つぶやきテスト';
    $res = postVoice($text, $access_token);

    // 結果をdump
    echo "<pre>";
    var_dump($res);
    echo "</pre>";
}



/**
 * アクセストークンの取得
 * @param  string $code         Authレスポンス
 * @return string $access_token アクセストークン
 */
function getAccessToken($code)
{
    // アクセストークン取得用パラメータ
    $param = array(
        'grant_type'    => 'authorization_code',
        'client_id'     => '取得したConsumer Key',
        'client_secret' => '取得したConsumer Secret',
        'code'          => $code,
        'redirect_uri'  => 'http://example.com/callback.php',
    );

    // cURLでアクセストークンを取得する
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_URL, 'https://secure.mixi-platform.com/2/token');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));

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

    // 返却値がjson形式なのでデコードする
    $res = json_decode($res, true);

    $access_token = $res['access_token'];

    return $access_token;
}

/**
 * つぶやきを投稿する
 * @param  string      $text         つぶやく内容
 * @param  string      $access_token アクセストークン
 * @return assoc_array $res          APIからのレスポンス
 */
function postVoice($text, $access_token)
{
    // つぶやき投稿用URL
    $voice_url = 'http://api.mixi-platform.com/2/voice/statuses';

    // つぶやき投稿用パラメータ
    $param  = array(
        'status' => $text,
    );

    // cURLでつぶやきを投稿
    $ch = curl_init();

    // リクエストヘッダを作成
    $header = array(
        'Authorization: OAuth ' . $access_token
    );

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_URL, $voice_url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param, null, '&'));
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

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

    // 返却値がjson形式なのでデコードする
    $res = json_decode($res, true);

    return $res;
}
index.php(サービスURL側) 解説
まず、認証用パラメータですが、上記の5つをGETパラメータとして渡す必要があります。 ※stateパラメータは必須ではない。 注意が必要なのはscopeパラメータで、そのサービスを利用する上でそのユーザのデータに アクセスする必要がある項目になります。 今回はつぶやきの投稿を行うので「w_voice」を指定しています。 ※複数指定する場合はスペース区切りで指定する。
callback.php(リダイレクトURL側) 解説
index.phpが認証された場合にリダイレクトされてくるURLです。 こちらで認証用文字列を受け取ります。 mixiからリダイレクトURLに下記のようにGETパラメータを付加された状態でリダイレクトされてきます。
http://example.com/callback.php?code=認証用文字列
※GETパラメータ「code」はアクセストークンを取得する際に必要になります。 このGETパラメータを使いアクセストークンを取得します。 その次に取得したアクセストークンを使いつぶやき用のURLにcURLを使いPOSTメソッドでつぶやき本文を パラメータとして送信します。 ※ mixiGraphAPIからの返却値はすべてjson文字列になります。 ※ ですので、php側でこねくりまわしたりする際にはパースして配列に戻してやる 必要があります。 解説は以上になります。 不明な点がありましたらコメントにてどうぞ 今mixiGraphAPIのライブラリを作成しているのでそのうち公開できたらなーとか思ってます。 終わり 関連記事: 【mixi】mixiGraph APIを使うための準備 【PHP】mixiGraphAPIのOAuth認証用ライブラリを作成しました。【mixi】

【mixi】mixiGraph APIを使うための準備

今回はmixiGraphAPIを使うための準備メモになります。

まず、mixiGraphAPIを使用する方法は2つあります。

1.法人パートナー登録する
2.個人パートナー登録する

今回は会社とかは全く関係ないので2.の個人パートナー登録で行いました。
※個人パートナー登録するにはクレジットカードの登録が必要です。
個人パートナー登録はこちらを確認して行なってください。

次にmixiGraphAPIはOAuth認証を使います。
なので
Consumer key
と
Consumer Secret
が必要なのでその2つを取得します。

こちらにアクセスします。
ログインを要求されますのでいつものmixiにログインするパスワードを入力します。 ログイン後は下記の画面には切り替わりますので赤で囲まれているものをクリックします。
赤で囲まれている「新規サービス追加」をクリックします。
サービスを登録する画面が表示されますので、必須項目を下記画像のように入力します。 入力が完了したら、利用規約の「同意する」にチェックを入れて「確認」ボタンを押下します。
※ サービスURLとは作成するサービスのTOPページになります。 ※ リダイレクトURLはmixiでの認証を行った際にリダイレクトされるページになります。 確認画面にて入力項目があっているかを確認します。 確認できましたら「登録」ボタンを押下します。
下記の画面が表示されれば登録は完了です。 登録画面で登録したメールアドレスにメールが送信されます。 次にそのメールに書いてあるURLにアクセスします。
送られてきたメールのURLにアクセスすると再度ログイン要求されますのでログインします。 最初にログインした時のようにいつもmixiにログインするパスワードでログインします。
ログイン後に「管理サービス一覧」というリンクをクリックします。 こちらで登録したサービスの一覧を閲覧できます。
下記画像のように管理しているサービス一覧が表示されますので、今回登録したサービスを クリックします。
下記のサービス情報画面にてConsumer keyとConsumer Secretが取得できますので、こちらを プログラムに使用します。
これにてmixiGraphAPIを使うための準備は完了です。 次は簡単なつぶやきを投稿するものを作ってみます。 終わり 関連記事: 【PHP】phpでmixiGraphAPIを使ってmixiにつぶやきを投稿するサンプル【mixi】 【PHP】mixiGraphAPIのOAuth認証用ライブラリを作成しました。【mixi】

2011/12/20

【プログラミング】if else の条件分岐についてのお話

最近会社で話題にのぼるif elseの条件分岐についてちょっと書いてみようと思います。

うちの会社ではこれといったコーディング規約などはなくみんながみんなバラバラに書いて
います。
最近になってそのことが議題に上がるようになりました。

みんなスタイルがバラバラなのでコードの可読性が低かったりしますので
そういうことをなくそうという事です。

今回は議題にif else の条件分岐について上がったのでメモしておきます。
if文でエラーかどうかのチェックを行い条件を分ける場合なのですが、

例1)
if (条件)
{
    // 成功時の処理
    // 成功時の処理
    // 成功時の処理
    // 成功時の処理
    // 成功時の処理
}
else
{
    // エラー処理
}
例2)
if (条件)
{
    // エラー処理
}

// 成功時の処理
// 成功時の処理
// 成功時の処理
// 成功時の処理
// 成功時の処理
大体上記の2通りに別れるのですが、可読性はどう見ても 例2) の方です。 そもそも余計なelseがいらないです。 それに比べて 例1 の場合はエラー処理が下により過ぎていて下まで読みに行くのが 少し面倒です。 そういった点を踏まえ今回より 例2) を採用するようになりました。

2011/12/18

【雑記】脱皮不全

うちのペットの話です。
結構前にコーンスネークを飼っているという記事を載せましたが
そのヘビのケージを掃除しているとなんと脱皮不全をしていました・・・

しかももう既に皮はかなり乾いており爪で引っ掛けても全然脱げない・・・
ということで急遽昔使っていた小さめのケージにぬるま湯(かなりぬるめ)を用意しそこに
泳がせて皮をふやかせることにしました。

ぬるま湯が嫌なのかクネクネしながら暴れていましたが無事皮がふやけて脱げるぐらいに
なりました。

さいごは指でつまんで軽く引っ張ると無事に脱皮できました。


次にこのようなことを起こさないためになぜ脱皮不全が起きたのか考えてみました。
一つの理由として湿度があげられます。
脱皮の際には湿度が60~80%が最適?らしいのですが、湿度計を確認すると60%を前後する
ぐらいになってました。
これが一番の原因です。

次になぜこの用な乾燥した状態になったのかを考えました。
気候的な問題もあると思います。冬的な意味で
ですがおそらくは暖房をつけたのが原因でしょう。

暖房をつけたことにより湿度が下がり脱皮の途中で皮が完全に乾いてしまったのだと思います。

次からはこれに気をつけて脱皮の兆候が見られたら暖房を控え、ケージに霧吹きか何かで湿気を
与えるようにして今回のような脱皮不全を回避できるようにしたいと思います。


終わり

2011/12/16

【システム開発】パンくずリストについて

パンくずリストについてのメモです。
まず、パンくずリストというのはWebサイト上で現在ユーザがどの階層にいるかわかるように
なるというものです。

下記のようなやつですね。

ホーム > 都道府県 > 市区町村
このパンくずリストですが、別名「トピックパス」または「フットパス」というそうです。 日本ではパンくずリストという名前で定着していますね。 ちなみにパンくずリストというのは童話「ヘンゼルとグレーテル」が帰り道がわかるように パンをちぎって来た道に道しるべとして落としていったというお話に由来するそうです。 終わり

【PHP】PHPで閉じタグを書かないお話

学校では必ずphpの閉じタグ 「?>」 を書いていましたが、
いざ就職して現場に出ると綴じタグを書いていないコードに遭遇しました。

それでなんで・・・?と思ったのでその時に調べたメモです。

phpでは閉じタグを書かないことで閉じタグ以降に記述されているスペースや改行などを
出力しないように出来ます。

どういうことかというと

下記の様なコードが合ったとします。
下記のコードは実行されると文字列で「test」と出力されます。
<?php
?>


test

このような感じでSmartyなどのテンプレートエンジンを使うと 「test」と出力された後にテンプレートが表示されます。 つまりゴミが出てしまうわけですね。 上記コードのように「test」という文字列でなくても改行だけやスペースのみの場合でも ゴミとしてテンプレートと一緒に出力されてしまいます。 ゴミを出力させないために閉じタグ 「?>」 を書かないようにするという事でした。 これから習慣付けていこうと思います。 終わり

2011/12/13

【Flex】FlvPlayer作成 part3【シークバー最終】

前回よりかなり間が開いてしまいましたが
シークバーの挙動が完成しました(ホントはもっと前に完成していました…)

前回のFlvPlayerではシークした際にブルブルと変な挙動で動いていましたのでそれを
修正した形になります。
基本的に前回よりばっさりと変わっている所があります。
特にMain.mxmlの方は中身自体ほとんど変わっています。

以下ソースです。

Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
  layout="absolute" creationComplete="init()"
  width="320" height="280">

  <mx:Script source="script.as" />
  
  <mx:VideoDisplay
    x="0" y="0"
 width="320" height="240"
 id="player" autoPlay="false"/>
  <mx:Button id="chMode" x="0" y="240" label="再生" enabled="true" width="60" />
  <mx:HSlider 
    x="60" y="240" 
 id="time" value="0"
 width="260" height="15"
 minimum="0" maximum="{player.totalTime}"
 liveDragging="false"
 showTrackHighlight="true"
 allowTrackClick="true"
 />
</mx:Application>
script.as
import mx.controls.*;
import mx.events.VideoEvent;
import mx.events.SliderEvent;
import flash.events.MouseEvent;

// 再生ボタンのフラグ
private var buttonFlg:Boolean;

// 初期化
public function init():void
{
    // 再生する動画の指定
 this.player.source = "sample.flv";
 // 動画の読み込み
 this.player.load();
 // playheadUpdateの発生間隔
 this.player.playheadUpdateInterval = 1;
 // 動画の再生時間とシークバーを同期するイベント
 this.player.addEventListener(VideoEvent.PLAYHEAD_UPDATE, updateSeekbar);
 this.player.addEventListener(VideoEvent.STATE_CHANGE, changeStatus);
 // シークバーによって再生時間を変更するイベント
 this.time.addEventListener(MouseEvent.CLICK, removePlayUpdateEvent);
 this.time.addEventListener(SliderEvent.THUMB_DRAG, pauseVideo);
 this.time.addEventListener(SliderEvent.THUMB_RELEASE, addPlayUpdateEvent);
 this.time.addEventListener(SliderEvent.CHANGE, changePlayheadTime);
    // 再生ボタンのイベント
 this.chMode.addEventListener(MouseEvent.CLICK, changeButtonEvent);
 buttonFlg = true;
}

// 動画の再生時間とシークバーを同期するイベント
public function updateSeekbar(e:VideoEvent):void
{
 this.time.value = this.player.playheadTime;
}

// シークバーによる再生時間の変更イベント
public function changePlayheadTime(e:SliderEvent):void
{
 this.player.playheadTime = this.time.value;
}

// プレイヤーの状態が変化したときに再生ボタンを有効化するイベント
public function changeStatus(e:VideoEvent):void
{
 // プレイヤーが応答可能な場合にボタンを有効化
 if (this.player.stateResponsive == true)
 {
  this.chMode.enabled = true;
 }
}

// シークが開始されたときに動画とシークバーの同期を解除するイベント
public function removePlayUpdateEvent(e:MouseEvent):void
{
 this.player.removeEventListener(VideoEvent.PLAYHEAD_UPDATE, updateSeekbar);
}

// シーク中のイベント 動画が再生中の場合一時停止に変更する
public function pauseVideo(e:SliderEvent):void
{
 if (this.player.playing == true)
 {
  this.player.addEventListener(VideoEvent.PLAYHEAD_UPDATE, updateSeekbar);
  this.player.pause();
 }
 this.time.value = e.value;
}

// シーク終了時に動画とシークバーの同期イベントを新しく付加するイベント
public function addPlayUpdateEvent(e:SliderEvent):void
{
 this.player.addEventListener(VideoEvent.PLAYHEAD_UPDATE, updateSeekbar);
 this.player.playheadTime = e.value;
}

// 再生と一時停止を切り替えるイベント
public function changeButtonEvent(e:MouseEvent):void
{
 if (buttonFlg == true)
 {
  this.player.play();
  buttonFlg = false;
  this.chMode.label = "一時停止";
 }
 else
 {
  this.player.pause();
  buttonFlg = true;
  this.chMode.label = "再生";
 }
}
script.asが非情に見づらくて申し訳ないですが、仕方ないです。 これでシークバー関連は終わりです。 次こそはプログレスバーに入りたいと思います。 終わり

【MySQL】サブクエリを使った時のメモ

久しぶりの更新です。

今回はMySQLのお話です。
会社で最近SQLを書くことがありまして、その際のメモです。

MySQLにはサブクエリという機能がありSQLステートメント中に別のSQLステートメントを
指定することができます。
つまり入れ子になったSQLステートメントのリソースをSQLステートメントに使用できる
ということです。

例えばFROM句やWEHRE句などですね

それを使って今回SQLを書きました。

まずサブクエリの書き方として「()」で加工必要があります。
(SELECT 
  *
FROM 
  `dual`
)
こんな感じですね。 実際にWHERE句に指定するとこうなります。
SELECT 
  * 
FROM 
  `user`
WHERE 
  `user_id` IN
  (
    (
      SELECT 
        `user_id`
      FROM   
        `dual`
    )
  )
WHERE句に指定する場合には上記のようなSQLでいいのですが、 FROM句に指定する場合にはもう一手間必要になります。 FROM句に指定する場合はこうなります。
SELECT 
  * 
FROM 
  (
    SELECT 
      `user_id`
    FROM   
      `dual`
    ORDER BY
      `user_id` DESC
  ) AS `dual`
このようにASでエイリアスをつけてやる必要があります。 メリットとしては普段出力することしかできないMAXのみの取得や GROUP BYでグループ集計する前にORDER BYで並べ替えを先に行うことができる等が あげられるかと思います。 ただ、デメリットとしてパフォーマンスが落ちてしまいます。 終わり

2011/12/08

【雑記】typoする

最近Twitterで

typoする
という単語をよく見るのですが、どうやらこれは 「一文字程度のタイプミスをする」という意味で使われているらしいです。 知らなかった 終わり

2011/12/07

【MySQL】SQL_CALC_FOUND_ROWSを使って取得件数を取得する

ということでMySQLネタ2つ目です。

今回仕事でページャを作ることになったのですが、その際のメモです。

SQLでLIMITを取得してページごとに取得する位置を変えられるのはいいのですが、
LIMIT句をつけているといちいちLIMIT句なしで全件カウントしないといけません。

全部実装し終わってから教えてもらったのですが、

「SQL_CALC_FOUND_ROWS」というのがあるそうです。

これは、LIMIT句が付いているクエリでも結果の取得件数を取得できるらしいです。

SELECT 
 SQL_CALC_FOUND_ROWS
 *
FROM 
 `emp`
LIMIT 0, 20;
こういう風にセットします。 セットした後
SELECT 
FOUND_ROWS();
これで取得できます。 SELECTを二回走らせるのに代わりはないですが。 記述が楽なので次から使っていこうと思います。 終わり

【MySQL】さくらサーバのMySQLにコンソールでログインする【さくらサーバ】

別に会社とか仕事で関係無かったのですが、自分で借りている 「さくらサーバ」 に
ちょっと用事があったのでその際のメモです。

ご存知の通り、「さくらのレンタルサーバ」ではMySQLを使えるわけですが、
「同じサーバ内にMySQL」はありません。
ですので

mysql -u ユーザ名 -p
とやってもパスワード入力画面は出てきますが、エラーが表示されてしまいます。 そこで、「-h」オプションをつけてやります。 MySQLコマンドでは「-h」をつけることによって外部のサーバに接続することができます。
mysql -u ユーザ名 -h ホスト名 -p
これで接続できました。 ホスト名はプログラムでいつも接続している ホスト名(mysql***.db.sakura.ne.jpこんな感じのやつ)でOKです。 終わり

2011/12/04

【雑記】Google翻訳の変な変換

この間見つけたGoogle翻訳での誤変換?おかしな変換?のSSを撮ったのを忘れていたので
アップロードしておきます。

twee で変換
「灰汁抜けのしたピーッ!」ってなんでしょうか?
twee twee で変換
「取り澄ましたピーッ!」ってなんでしょうか? 終わり

【雑記】劇場版けいおん!!を見てきました

誘われたので行って来ました。

特に戦利品とかはないですが・・・

見に行った場所は新宿ピカデリーです。
上映時間21:55からのやつを観たのですが、
上映初日とあり人がかなり多かったように感じました。

内容はアニメけいおんをご覧になっている方なら中盤でラストが予想できる内容でしたが
そういう作品ではないので特に問題はありませんでした。

ネタバレになるのであまり書けないのですが

アニメのラストとの絡みなどそのへんがよくできていたと感じました。
映像も飛行機のところとかお金かかってるなぁとかそんな感じです。
映画用の新OPと新EDがありますが個人的にはどちらも良かったなと思います。

また豆知識ですが、けいおんのEDは放課後ティータイムがプロになったらという想定で
作成されているらしく映像がPV風になっています。
※OPのアーティストは桜が桜高軽音部ですが、EDはアーティスト名が
※放課後ティータイムという感じです。

総評としてはよく詰め込んだなという感想です。
上映終了後コアなファンの方で泣いている方がチラホラいました。
他にも映画鑑賞しにきた方の年齢層にかなり差があったように思いました。
けいおん人気すごいですね

文才があまりないのでわかりづらいかと思いますがこれにて終了ということで


おわり

2011/12/02

【PHP】PHP+MySQLでトランザクション【MySQL】

PHP+MySQLでトランザクションをするお話です。

基本的にPHPでシステム開発を行うときは何かしらのフレームワークを使うことが多いですが、
今回はPHPのベタ書きでMySQLのトランザクション処理の仕組みについて書いてみたいと
思います。

まずトランザクション処理とは
複数テーブルの更新や挿入など別々のテーブルがお互いを参照するようなデータを
操作するときに使います。

例えば、テーブルAとテーブルBがあるとします。
テーブルBではテーブルAのPKをFKとして参照しているといった場合にどちらか一方が
こけてしまった場合データの整合性がとれなくなるためシステムを破壊しかねないです。

ですのでこのような更新をDBで行う場合はトランザクション処理は必須となります。

今回はざっくり書いてみます。
<?php

// 接続文字列
$server = 'サーバ名';
$db     = 'DB名';
$user   = 'ユーザ名';
$pass   = 'パスワード';

// MySQL接続
$con = @mysql_connect($server, $user, $pass);
if (!$con)
{
    exit('DBに接続できませんでした。');
}

// DB選択
mysql_select_db($db, $con);

try
{
    // 自動コミットをオフ
    $query = 'set autocommit = 0';
    mysql_query($query, $con);

    // トランザクションスタート
    $query = 'begin';
    mysql_query($query, $con);

    // DBにデータをINSERT
    $query  = "insert info `emp` (`id`, `name`)values('0001', 'user')";
    $result = mysql_query($query, $con);

    // クエリが成功したかどうかのチェック
    if ($result === true)
    {
        // 正常終了なのでコミット
        $query = 'commit';
        mysql_query($query, $con);
        echo 'コミットしました。';
    }
    else
    {
        // 更新失敗なのでロールバック
        $query = 'rollback';
        mysql_query($query, $con);
        echo 'ロールバックしました。';
    }

}
catch (Exception $e)
{
    // 例外が発生したのでロールバック
    $query = 'rollback';
    mysql_query($query, $con);
    echo 'ロールバックしました。';
}

// 接続をクローズ
mysql_close($con);
このような流れになるかと思います。 また、MySQLには罠がありまして、デフォルトで自動でコミットされるようになっております。 それをtryの直後に「set autocommit = 0」でオフにしています。 autocommitが1の場合はトランザクション処理中であろうともクエリが成功した場合 その場でコミットされてしまいます。 終わり

【Linux】viエディターで開いているファイルの中を検索する

ということで今回はじめてviエディターで検索できることを知ったのでメモです。

/検索文字列
これで検索にヒットした行までジャンプしてくれます。 便利ですね、今まで行番号とか目視で追いかけてましたorz 終わり

2011/11/28

【雑記】久しぶりに漫画を買いました

1年ほど漫画を買っていなかったのでなにかないかなと思い久しぶりに本屋に行って来ました。

基本的に前評判を見たりして買ったりするのですが今回はなしで言ってみました。

買ったものは「放課後のカリスマ」
偉人のクローンだけが通う学校に唯一の非クローンとして通う主人公の話です。

内容の方はまだ読んでいないので、明日仕事終わって帰ってきてから読んでみようと思います。 終わり

2011/11/26

【PHP】Noticeエラーのみを非表示にする

ということでエラーの表示非表示についてです。

phpでの開発でよくNoticeエラーと出会うと思います。
これは未定義の変数を参照している場合などに表示されます。

リリース時にはどうせphpのエラーを画面に出力しないように設定しますが、
開発時には画面に表示しています。

なのでNoticeも一緒に表示されていますがバリデータエラー時にフォーム値を
再セットするような処理を入れているとNoticeエラーが出まくります。

これはかなりうざいので、Noticeエラーだけを表示しないようにできないものか
と調べてみるとありました。


1行でできますので今後は使っていきたいなと思います。
error_reporting(E_ALL ^ E_NOTICE);
これをphpの上の方で実行するようにすればOKです。 終わり

2011/11/23

【jQuery】jQueryでセレクトボックスのテキストを取得するメモ【JavaScript】

jQueryを使ってセレクトボックスの現在選択されている value値 ではなくテキストを取得する
方法のメモです。

<option>text</option>
上のtextの位置にある値ですね。 やり方はすごく簡単で
jQuery('#target option:selected').text();
または
jQuery('#target').children(':selected').text();
で取得できます。 おわり

【システム開発】PHP5でシングルトンパターンの実装する話【PHP】

今回はデザインパターンの勉強をしようということでまずは
「シングルトンパターン」というものです。

前からちょくちょく調べていたので今回はその先駆けということで

シングルトンパターンとは?
シングルトンパターンパターンとはデザインパターンの一つで GoFによって考案されたデザインパターンです。 内容はと言うとクラスのインスタンスをひとつしか生成しないことを保証するということです。
実装するメリットは?
例えばDBのハンドルを使いまわしたりだとか、僕の会社だと決済モジュールは シングルトンパターンで実装されています。 複数インスタンスを生成するべきではないクラスや何度も使いまわすものを このパターンで実装することによりリソースの削減ができます。 すべてのクラスに実装する必要はありませんが、使いまわすことが多いものだと 実装したほうがいい場合が多いです。
どういう風に実装するのか
下記の項目が基本的なシングルトンパターンを実装するのに必要な項目になります。 1.インスタンスを保持する「private」のクラス変数が定義されている 2.コンストラクタが「private」である。 3.インスタンスを返すメソッドがクラスメソッドとして定義されている。
実装方法についての解説
まず、1ですがシングルトンパターンではクラスの内部にインスタンスを保持します。 保持したインスタンスを使いクラス内関数にアクセスします。 次に、2ですがこれは「new」によってインスタンスを生成できないようにする為です。 シングルトンパターンはインスタンスをひとつに保証するものなのでprivateで宣言します。 最後に3ですが、コンストラクタをprivateで実装するため、クラスインスタンスを 生成する関数が必要になります。 3がこれに当たります。
実装例
下記がシングルトンパターンの実装例になります。 Singleton.php
<?php

class Singleton
{
    private static $instance = null;

    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (is_null(self::$instance))
        {
            self::$instance = new self;
        }

        return self::$instance;
    }

    public function test()
    {
        echo "Singleton";
    }

}

?>
呼び出し方法は以下のものが使えます。
$single = Singleton::getInstance();
$single->test();
Singleton::getInstance()->test();
終わり

2011/11/20

【PHP】Smartyでscript、styleタグを使う場合の注意【Smarty】

ちょっと引っかかったのでメモ
PHPでシステムを作成する際はテンプレートエンジンとして「Smarty」というものを使います。

SmartyとはPHP用に開発されたテンプレートエンジンでロジックとビューを
切り分けるのに重宝します。
ほとんどのPHPのシステム開発で使用されているかと思いますが、Smartyテンプレートには
実は落とし穴のようなものがあります。

殆ど無いかと思いますが、テンプレート内で「{}」を使う場合です。
Smartyでは「{}」を置換タグとして扱います。

上記の理由でテンプレートに直接JavaScriptやCSSを書くとエラーとなります。
ただ、外部ファイルとして読みこめば全て丸く収まるのですが、テンプレート側に
書けないということはありません。

テンプレートに書く場合は「{literal}{/literal}」で囲う必要があります。
下記のように記述します。

<script type="text/javascript">
{literal}

  function test() {
    Alert('test');
  }
{/literal}
</script>
終わり

【雑記】まどマギカフェに行って来ました

今春放送の「魔法少女まどか☆マギカ」のカフェがあるということで行って来ました。

メニュー
今回は「巴マミのソウルジェムドリンク」と「キュゥべえカレー」を注文しました。 注文した際に店員さんが「マミさん一つ」と言っていたのでちょっと感動しました。
巴マミのソウルジェムドリンク
キュゥべえカレー
「巴マミのソウルジェムドリンク」はホワイトウォーター+オレンジの何かだと思います。 「キュゥべえカレー」の味は普通のカレーでした。
マミさんのマスケット銃
ほむほむの銃と手榴弾
お菓子の魔女 見切れてますが…
お菓子の魔女の足元の台座
これはひどいですね、すごく笑いましたが
ついでに噛まれておきました
最後にトイレに行った時に振り返るとあったので
トイレが見られてる気がしてかなり気まずかったです また機会があれば行ってみたいですね 終わり

2011/11/18

2011/11/17

【PHP】Using $this when not in object context の原因

ということで今日はタイトルのエラー内容についてメモっておきます。

PHP Fatal error: Using $this when not in object context example.php on line 12
PHP5からオブジェクトの扱いが厳密になったのでクラス定義内からメソッドを呼び出す際に 「$this」を使用するとFatal Errorになってしまいます。 これが原因です。 以下解決方法です。 1). メソッドを「static」で宣言している場合は「static」をはずす。 2). スコープで呼び出すのではなく、インスタンスを生成してメソッドを呼び出す。 大体上記の解決方法を確認すれば、解決できるかと思います。 終わり

2011/11/15

【PHP】cURLを使う

ということで今回はphpの関数である「cURL関数」を使った
サンプルをメモっておきます。

まず、「cURL」とはClient URL Libraryのことです。
多くのプロトコルで異なるサーバと通信できるライブラリとのことです。
便利ですね。

<?php

// cURL初期化
$ch = curl_init();

// 対象URL
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
// 戻り値を文字列で取得
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 結果を取得
$res = curl_exec($ch);

// 結果を出力
var_dump($res);

// cURL終了
curl_close($ch);
2つ目の「curl_setopt」で「CURLOPT_RETURNTRANSFER」をtrueに設定しました。 これを設定することにより、結果を文字列で取得することができます。 終わり

2011/11/09

【Flex】FlvPlayer作成 part2.5【補足】

ということで今回は前回に作ったFlvPlayerのちょこっと修正と補足をしたいと思います。

さて、前回は動画の再生時間とシークバーの実装について書きましたが
今回仕様上の不具合が発見されたのでその修正を行いたいと思います。

不具合の内容としては、シークバーのスライダーをドラッグした状態で
スライド動作を行うと動画の再生がおかしくなります。

この現象は、前回の記事の「Main.mxml」の箇所で、
スライダーのコンポーネントの「liveDragging」に「true」を指定していたため
起こっていました。

なぜ起こるのかというと、「liveDragging」に「true」を指定することにより、
ドラッグ中はchangeイベントが常に発行される状態になっているので、
シークする関数がその間ずっと呼ばれていたためになります。

ですので、実際はしばらくすると動画は正常に再生されるようになるのですが、それはさすがに
放置しておけないので「liveDragging」を指定なしに変更しました。

これでドラッグ中のスライド動作で上記の不具合は起こらないようになりました。


終わり

2011/11/08

【Flex】FlvPlayer作成 part2

FlvPlayer作成Part2ということで今回はシークバーをつけてみようと思います。

今回は前回と同様コンポーネントを配置し別にイベントを作成しました。

以下、ソースです。

起動時にinit()を使ってシークバーにイベントを付加します。
シークバーは動画の再生時間と同期させ、シークバーが変更されたら
動画の再生時間を変更する処理を行います。

script.as
// 必要なものをインポート
import mx.events.VideoEvent;
import mx.events.SliderEvent;

// 初期化
public function init():void
{ 
  // シークバーにイベントを追加
  this.time.addEventListener(SliderEvent.CHANGE, changePlayHeadTime);
}

// シークバーによる再生時間の変更イベント
public function changePlayHeadTime(event:SliderEvent):void
{
  this.player.playheadTime = event.value;
}
main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
 layout="absolute" width="400" 
 height="400" creationComplete="init()">

    <mx:Script source="script.as" />
 
    <mx:Panel id="panel" x="10" y="10" width="380" height="380" layout="absolute" >
  <mx:VideoDisplay 
   x="20" y="10" 
   source="sample.flv"
   width="320" height="240" 
   id="player" autoPlay="false" 
   autoRewind="false"/>
  <mx:HSlider 
   id="time" 
   x="20" y="250" 
   width="320" height="15" 
   minimum="0"
   maximum="{player.totalTime}"
   value="{player.playheadTime}"
   liveDragging="true"
   showTrackHighlight="true"
   allowTrackClick="true"/>
  <mx:Button id="play" x="158" y="276" label="再生" click="player.play()" />
  <mx:Button id="pause" x="214" y="276" label="一時停止" click="player.pause()" />
  <mx:Button id="stop" x="292" y="276" label="停止" click="player.stop()" />
 </mx:Panel>
 
</mx:Application>
んー、シークはされてるんだけどなんか動きが変だな 他の動画サイトと動きが違う・・・ このへんどうにかしたいなぁ とりあえず、それは次回ということで 終わり

2011/11/07

【MySQL】コマンドラインからUPDATE、INSERTするときの注意

今日会社でDB作成中にハマったのでメモ

普段はPhpMyAdminからデータを入れたりするのですが、
今回の案件が膨大なデータ量だったのでコマンドラインから
SQL文を実行する事になったときにハマりました。


はい、文字コードです。

INSERTをする際に文字コードを指定しないといけなかったみたいで
すべて文字化けしたままDBに挿入されていました…

その際の解決方法をメモしておきます。

下記を指定するだけでした。
SET NAMES 'utf8';
これは、今回のやり取りでどの文字コードを使うという指定をするものです。 ですので、これを指定したあとにSQL文を実行すると指定した文字コードでデータが 挿入されます。 これで無事データの挿入が出来ました。 次から気をつけよう。 【追記】 SET NAMESにはSQLインジェクションの脆弱性があるようで コマンドライン上から使用するのは大丈夫なようですが、アプリケーションから 利用する場合は注意が必要ということらしいです。 終わり

2011/11/05

【Flex】FlvPlayer作成 part1

FlexでFlvPlayerを作ることになりました。

要件としてはニコニコ動画の動画プレイヤー的なものを作る予定です。

今回はFlvPlayerの基板として下記の要件のものを作りました。

・再生
・停止
・一時停止

今回はこの要件を満たすものを作りました。

Flexはコンポーネントが多数ありますので、この位のものなら
ASを組む必要はないです。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="400" >

  <mx:Panel id="panel" x="10" y="10" width="380" height="380" layout="absolute" >
    <mx:VideoDisplay x="20" y="10" width="320" height="240" id="player" autoPlay="false" autoRewind="false" source="sample.flv"/>
    <mx:Button id="play" x="158" y="276" label="再生" click="player.play()" />
    <mx:Button id="pause" x="214" y="276" label="一時停止" click="player.pause()" />
    <mx:Button id="stop" x="292" y="276" label="停止" click="player.stop()" />
  </mx:Panel>

</mx:Application>
上記で再生するだけなら出来ます。 次回からシークバーを動画に同期させるようにしたいと思います。 終わり

【MySQL】MySQLは大文字と小文字を区別しない

という訳でMySQLは大文字と小文字を区別しません。
今回システムを作っていて初めて気づきました。

その件について解決方法と言うか対策を調べたのでメモしておきます。

まず、今のところ大文字と小文字を区別しないのは下記の2つです。

・char
・varchar

それ以外にあるかどうかはまだ確認していません。

その解決方法ですが、大文字と小文字を区別したいカラムに「BINARY属性」を指定します。

これによって大文字小文字を区別できるようになります。


終わり

2011/11/02

【Flex】FlashDevelopでプラグイン導入

ということで近々FlexというかFlashの環境が必要になってきたのでFlashDevelopを
導入しました。

Flexのデザインビューを使おうと思ったんですがデフォルトでは使えないようです。
検索するとプラグインが必要みたいなのでその際の覚書を書いてみます。

まず下記URLのダウンロードよりFlex Design Viewerをダウンロードします。
http://www.flashdevelop.org/wikidocs/index.php?title=3rd_Party_Plugins


解凍すると

・Data
・Plugins

というディレクトリが出てきますので、Pluginsの中にある「FlexDesignView.dll」という
ファイルを
「C:\Program Files (x86)\FlashDevelop\Plugins」
に移動します。
※こちらのディレクトリパスは当方の環境ですのでPCごとに変わると思います。

プラグインが配置できたら次は「Data」を配置します。
配置する場所は、環境によると思いますが僕の場合は

「C:\Users\ユーザ名\AppData\Local\FlashDevelop\Data」

にDataの中身をコピーします。

これでFlexDesignViewerが使えるようになったかと思います。


終わり

【Linux】Crontabについてまとめ

今回Crontabを設定することになったのでメモしておきます。

まず、Crontabの実行とオプションですが下記になります。
crontab [ -u ユーザ名 ] { -l | -r | -e }
crontabにジョブをセットする際には下記のように指定します。
crontab -e
このコマンドを実行するとデフォルトで設定されている?エディターでcrontabの 設定ファイルを開きます。 引数は全部で6つあります。 形式は下記のようなものです。
* * * * * 実行するファイル
前から順番に
分 時 日 月 曜日 実行ファイル
の順になります。 さて、ここまでまとめて試験に入ろうということで試験を行いました。 いざ1分後に設定してテスト!! あれ?動かない 5分後にセットして再テスト!! 動いた、あれ? ちょっと不思議だったので調べてみると答えがありました。 crontabは設定の1分後にcrontabの設定ファイルを読みなおし、その1分後から ジョブを実行するらしいです。 ですので、ジョブを設定してテストする際は2分以上先の時間をセットする必要があるそうです。 次から気をつけましょう。 終わり

2011/10/30

【Linux】テスト時にログ監視してリアルタイムにログファイルを見る方法

ということで試験中にログファイルをいちいち確認するのではなく、
監視をしてリアルタイムにどういう値が着ているのかなどを確認できる方法です。


使うコマンドは 「tail」 というコマンドです。
このコマンドは指定されたファイルの末尾から指定した行数を表示するコマンドです。

このコマンドにはオプションで「f」というオプションがあり
このオプションを指定することによりファイルが更新されるたびに新たに追加されたものを
表示します。

つまりこのコマンドを実行中はログが追加されるとそれをリアルタイムに表示してくれる
ということです。

tail -f ファイル名
このように指定します。 また、このコマンドを終了する際には「Ctrl + C」を使用します。 終わり

2011/10/29

【雑記】iPhone4Sがやっとっ届きました

オンライン予約していたiPhone4Sが今朝届きました。

眠かったので少し寝てから開封しました。

箱
オープン
いつものセット
起動!!
それで、USIMの認証をかけてから1時間ほど経過しているのですが、未だに圏外…orz
まあ、気長に待ちましょう 【追記】 どうやら僕のアクティベーションの仕方が悪かったようです。 softbankからの説明では、USIMを挿入後に機種変更処理を行うと書いてありましたが、 僕はUSIMを挿入する前に機種変更処理を行なっていたのでなかなかUSIMが有効にならなかった ようです。 この操作をしてしまった場合、僕の方ではUSIMを挿入しなおしキャリアを手動でsoftbankに 合わせることですぐに有効化されました。 おそらくUSIMの挿入しなおしはしなくても大丈夫だと思いますがこれで解決できました。 終わり

2011/10/28

【PHP】よく使う関数まとめ

ということで今回はよく使う自作関数をまとめておくことにしました。
そのうちライブラリかなんかにしようかなとか

p
function p($val)
{
    echo "<pre>";
    print_r($val);
    echo "</pre>";
}
使い所はデバッグ時の値チェックですね、配列でも通常の変数でも 値を渡すだけで整形して出力してくれます。 getQueryString
function getQueryString($param)
{
    $query = '?':
    foreach ($param as $key => $val)
    {
        $params[] = $key . '=' . $val;
    }
    $query = $query . implode('&', $params);

    return $query;
}
渡された連想配列よりクエリストリングを作成します。 ページ内にリンクを埋め込むときによく使ったりします。 今回は以上です。 また随時追加していきたいと思います。

2011/10/26

【雑記】実はこんなペット飼ってます

実はペットを飼っていまして・・・

それがこいつです。
コーンスネークのスノーという品種です。 今はピンク色ですが、オトナになると真っ白になります。 このことからスノーという品種名がついています。 実は飼い始めてそろそろ3ヶ月がたとうとしています。 写真では水浴びしています。 最近よく水浴びするようになりました。 舌をチロチロだしたりするのがとてもかわいいです。 最近ハンドリングを始めまして、手にもだんだん慣れてきてくれています。 そのうち手の上で餌を食べたりしてるところを撮ってみたいですね。 終わり

2011/10/25

【プログラミング】WHERE 1 = 1 って?

タイトル通りです。
学校を出てからというものたまにSQLを組み立てている箇所に遭遇します。

そこで、「WHERE 1 = 1」という記述に度々出会います。

大抵が複数条件のSQL文を構築している箇所なのですが、なぜ「WHERE 1 = 1」という
記述があるのか、前々から不思議でした。

ですので、少し時間があったので調べて見ました。

まず、「WHERE 1 = 1」はすべての条件が 「true」 
になります。

何があっても通るよってことですね。

次にループでクエリを追加するブロックがあります。
そこでは、下記のようにWHERE句に条件が追加されています。

こんな感じのやつですね。
<?php

$param = array(
    'id'   => 1,
    'name' => 'test',
);
$sql = sql($param);

function sql($param)
{
    $sql  = 'SELECT';
    $sql .= '  *';
    $sql .= 'FROM';
    $sql .= '  EMP';
    $sql .= 'WHERE';
    $sql .= ' 1 = 1';

    foreach ($param as $key => $val)
    {
        $sql .= 'AND';
        $sql ,= $key . " = '" . $val . "'":
    }

    return $sql;
}
するとこのようなSQLが出来上がると思います。
SELECT 
  *
FROM 
  EMP
WHERE 
  1    = 1 
AND 
  id   = '1'
AND 
  name = 'test'
これだとただ単にSQL文が出来上がるだけなのですが、 この記述方法のいいところは別にあります。 それは、WHERE句が複数か、ひとつしか無い場合です。 この場合、通常ならWHERE句のパラメータのある無しを判定し、一つめのWHERE句と 一つめ以降のWHERE句で処理をわけなければなりません。 ですが、上の関数のように「WHERE 1 = 1」の記述をしておくだけで そういったパラメータの確認などのブロックが必要なくなるのです。 なんて便利 そもそも生のクエリを投げること自体少ないですが、このような記述方法がわかっていれば 複数の条件があったりなかったりする場合に重宝しそうですね。 終わり

2011/10/24

【雑記】FFTA2が届いた

今回は息抜きがてらITとは関係ないことを

FFTA2が届きました。
今更かよって感じですが、最近FFTAの続編が出たらしいってことを知ったので
今回購入して見ました。

前回から多少システムが変わっているらしく楽しみです。

写真とってみたんですが、iPhoneだからなのか、部屋の明かりが悪いのかわかりませんが
ちょっとわかりづらくなってしまいました。

2011/10/23

【開発環境】TortoiseSVNのインストール

今回はTortoiseSVNのインストールについてです。

環境は、下記になります。
Windows 7 Pro SP1 64bit

下記のリンクよりダウンロードします。
http://tortoisesvn.net/downloads.html

ダウンロードが完了したら、ファイルを実行します。

下記画像のような画面が表示されるので、Nextをクリックします。
次に同意の確認画面が表示されるので、赤で囲まれているところを選択し、Nextを クリックします。
インストールするコンポーネントが表示されるので下記画像のようにすべて選択します。 選択したら、Nextをクリックします。
Installをクリックします。
インストールが始まります。
下記の画面が表示されればインストールは完了です。
終わり

【システム開発】決済システムについて

今回はシステム開発の決済システムについてです。

僕はPHPを中心にシステム開発に携わっているのですが、
最近決済システムに携わることがあったのでそれについてのメモです。

大まかには以下の流れです。

1.ログファイルを作成
2.パラメータのチェック
3.トランザクションを開く
4.決済内容をDBに書きこむ
5.トランザクションを閉じる(成功:コミット、失敗:ロールバック)
6.結果をログに書き込む

この流れで作成しています。

1.ログファイルを作成
では決済を受けた旨をログに書き込みます。
受け付けたパラメータを保存します。

2.パラメータのチェック
不正なパラメータがないかどうかのチェックを行います。
商品が正常なものかどうかなどのチェックです。

3.トランザクションを開く
DBをトランザクションでロックします。
これをしておかないとデータの書き換えなどで不具合が起こったりします。

4.決済内容をDBに書き込む
決済の内容をDBに書き込みます。
ここでコケるかどうかで5.の処理が変わります。

5.トランザクションを閉じる
4.で異常が起きなければコミットを異常が起きていればロールバックを行います。

6.結果をログに書き込む
決済結果をログに書き込みます。
必要があれば管理者にメールを送信したりします。


以上がトランザクションの流れになります。


終わり

【Flex】Eclipse 3.7でAS3開発環境を構築する【Eclipse + Flex + AXDT】

今回はEclipse 3.7でAS3を開発できる環境を構築しました。
その際の覚え書きです。

環境は以下で構築しました。
Windows 7 Pro SP1 64bit
eclipse 3.7
AdobeFlexSDK 3.6

下記が大まかな手順になります。

1.Eclipseのインストール
2.AdobeFlexSDKのインストール
3.AXDTのインストール

以上です。
では詳細な構築手順です。
1.のEclipseのインストールはすでにされているものとして始めます。

AdobeFlexSDKのインストール
ここよりダウンロードして下さい。
必要なバージョンを選択し、次画面で
「I have read the License Agreement(s), and by downloading the software, 
I agree to the terms of the agreement.」
にチェックを入れ「Download Zip」のリンクよりダウンロードして下さい。
ダウンロードが完了したら解凍し、Cドライブの直下に配置します。
ディレクトリ名は「flex_sdk_3」に変更しました。

配置が完了したら環境変数にPATHを登録します。
Cドライブの直下に配置したので、「C:\flex_sdk_3\bin」を追加しました。
これにてAdobeFlexSDKのインストールは完了です。

AXDTのインストール
Eclipseを起動し、ヘルプより新規ソフトウェアのインストールを選択します。
下記の画像のようにURLを入力します。
「http://download.eclipse.org/technology/imp/updates」
追加が完了したらソフトウェアをインストールします。 下記画像のように選択し、次へをクリックします。
インストールするソフトウェアの一覧が出るので、次へをクリックします。
下記画像のように同意するにチェックを入れ次へをクリックします。
ソフトウェアのインストールが完了したら、Eclipseを一旦再起動します。 ソフトウェアのインストール中にセキュリティ警告がでるので、OKを押しましょう。 Eclipseが再起動したら、次にヘルプより新規ソフトウェアのインストールを選択します。 下記の画像のようにURLを入力します。 「http://update.axdt.org/」
追加が完了したらソフトウェアをインストールします。 下記画像のように選択し、次へをクリックします。
インストールするソフトウェアの一覧が出るので、次へをクリックします。
下記画像のように同意するにチェックを入れ次へをクリックします。
ソフトウェアのインストールが完了したら、Eclipseを一旦再起動します。 今回もソフトウェアのインストール中にセキュリティ警告がでるので、OKを押しましょう。 再起動したら、Eclipseのウィンドウより設定を開きます。 するとAXDTという項目があるのでそこに先ほどダウンロードしたAdobeFlexSDKのパスを 入力します。
これにて環境の構築は完了です。 Flexのプロジェクトを作成する場合は、 Eclipseより [ファイル] -> [新規] -> [プロジェクト] -> [AXDT] -> [AXDT Project]より作成できます。 【追記】 Eclipseのプロジェクトツリーの作成したmxmlファイルを右クリックし [アプリケーションより開く] -> [FlexDesignViewer]を選択することで、 mxml上でコンポーネントをドラッグ・アンド・ドロップで配置することができます。 終わり