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 終わり