エントリー

カテゴリー「プログラム」の検索結果は以下のとおりです。

確率を指定したランダム

単純なランダム表示は簡単だけど、「特定のメッセージが表示されやすいランダム」のような「確率を指定したランダム」が必要になったのでメモ。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>rand</title>
</head>
<body>
<?php

$configs = array(
  array(
    'probability' => 60,
    'message'     => '60%の確率で表示されます。'
  ),
  array(
    'probability' => 30,
    'message'     => '30%の確率で表示されます。'
  ),
  array(
    'probability' => 10,
    'message'     => '10%の確率で表示されます。'
  )
);

$count = count($configs);
$max   = 0;

for ($i = 0; $i < $count; $i++) {
  $max += $configs[$i]['probability'];
}

$rand   = rand(1, $max);
$from   = 0;
$to     = 0;
$result = '';

for ($i = 0; $i < $count; $i++) {
  $from = $to;
  $to  += $configs[$i]['probability'];

  if ($from < $rand and $rand <= $to) {
    $result = $configs[$i]['message'];
  }
}

echo '<p>' . $result . '</p>';

?>
</body>
</html>

probability の値は、合計100にならなくても動作に問題はありません。あくまでも「値の大きいものが表示されやすい」というだけ。

なお、基本的な考え方は確率変更可能ランダムテキストを参考にしています。(自分が理解しやすいようにコードを書き換えましたが。)こういうのが思いつく人は凄いなぁ…。

PHPで圧縮ファイル作成(zip)

phpMyAdminの libraries/zip.lib.php を使えば、PHPのみでファイルの圧縮ができたのでメモ。

<?php

require_once 'zip.lib.php';

$zipfile = new zipfile();

//圧縮するファイルのパス
$file1 = 'test.txt';
$file2 = 'test/test.jpg';

//ファイルを追加
$zipfile->addFile(file_get_contents($file1), $file1);

//ファイルを追加
$zipfile->addFile(file_get_contents($file2), $file2);

/*
//ZIPファイルを作成する場合
if (file_put_contents('test.zip', $zipfile->file()) === false) {
  exit('error');
}
*/

//ZIPファイルをダウンロードする場合
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="test.zip"');
header('Content-Length: ' . strlen($zipfile->file()));
echo $zipfile->file();

exit;

?>

HTTP_OAuth_Consumerでの認証エラー対策

TwitterでOAuthを行うPHPプログラムを書く場合、HTTP_OAuth_Consumerクラスを使って

$consumer = new HTTP_OAuth_Consumer('CONSUMER_KEY', 'CONSUMER_SECRET');
$consumer->setToken('TOKEN');
$consumer->setTokenSecret('TOKEN_SECRET');

$response = $consumer->sendRequest('http://api.twitter.com/1/statuses/user_timeline.xml?include_rts=true&page=1', array(), 'GET');

$xml = simplexml_load_string($response->getBody());

print_r($xml);

のように処理していたのですが、6月7日から急に「This method requires authentication.」というエラーが返ってくるようになりました。

なかなか原因が解らなかったのですが、sendRequestでデータを送受信する際に

$response = $consumer->sendRequest('http://api.twitter.com/1/statuses/user_timeline.xml', array('include_rts' => true, 'page' => 1), 'GET');

とするとエラーにならなくなりました。引数を ? に続けて渡さずに、別途 array() で渡すように変更しています。

? に続けて引数を渡すのは非推奨な方法で、6月7日に非推奨な方法を廃止したのかなぁ…と思いますが、原因は不明です。「ページ送り機能が削除されて、APIが使い物にならなくなった。」とか思っていたのですが、そうではなくて良かった。ヽ(;▽;)ノ

Twitterでの一部の発言をサイドバーに表示

少し前からTwitterには鍵をかけていますが、freoに関するツイートのみブログのサイドバーに表示するようにしてみた。更新情報とか簡単な返信とかは、ここに書いていこうと思います。

ちなみに仕組みは、

  • Twitter API で発言を取得してデータベースに保存
  • データベースから特定のキーワードを含む発言を表示

となっています。鍵を書けたアカウントでも一部の発言のみを公開できるので、それなりに需要のある仕組みかも。

設置が少しややこしいのが難点だけど。(´・ω・`)

iPhone対応

freoをiPhoneに対応させたので、テストを兼ねてiPhoneから投稿。iPhone経由でインターネットを利用する時間が増えつつあるので、対応できて満足。(。╹ω╹。)

自分で使いつつ、不便な点は調整して行きたいと思います。

追記1

複数の方から「更新履歴に libs/freo/version.php の更新を書き忘れている」と教えていただきました。現在は加筆済みです。m(_ _)m

追記2

一つ前のエントリーにも掲載した、iPhone用に画像サイズを調整するJavaScriptが動作していないというご意見がありました。
再現できていないですが、URLをお知らせいただければ調べてみます。

追記3

追記2の不具合は、配布ファイルに js/jquery.autoresize.js を含めるのを忘れていたからでした…。自分の環境では以前から配置済みだったのでエラーにならず、エラーメッセージを送ってもらうまで気付きませんでした…。

バージョンアップして修正しておきました。

iPhone対応作業中

freoをiPhoneに対応させるために作業中。ある程度できたので、後は実際に使いつつ調整していくとします。

本文の画像がiPhoneのウインドウ幅より大きいとレイアウトが崩れる問題に頭を悩ませていたけど、JavaScriptで

$('img').removeAttr('width').removeAttr('height');
$('img').css('max-width', '300px');

とするようにしてみた。もともとの幅と高さの指定を削除してから、「最大300px」というCSSを追加。これでしばらく様子を見てみるとします。

Twitterでフォローされている人を一覧表示

Twitter API 仕様書
http://watcher.moe-nifty.com/memo/docs/twitterAPI.txt

statuses/followers の項目にフォロワーを取得する方法は書かれていますが、APIの仕様上100件までしか取得できません。ですがAPIから送られてくる next_cursor の値を使えば、続きを取得することができます。

そんな訳で書いてみたのが以下のプログラム。フォロワーをすべて取得しますが、APIを何度も呼び出すのでフォロワーが多いと重くなります。

<?php

function get_followers($screen_name)
{
  $results = array();
  $cursor  = -1;

  while (1) {
    $xml = simplexml_load_string(file_get_contents('http://api.twitter.com/1/statuses/followers/' . $screen_name . '.xml?cursor=' . $cursor));

    foreach ($xml->users->user as $user) {
      $results[] = (string)$user->screen_name;
    }

    $cursor = $xml->next_cursor;

    if ($cursor == 0) {
      break;
    }
  }

  return $results;
}

?>

以下のようにID(正確にはスクリーンネーム)を指定すると、フォロワー一覧を返してくれます。なお、鍵をかけているユーザーの情報は取得できません。

<?php

$followers = get_followers('favoritelabo');

print_r($followers);
exit;

?>

CakePHPのAuthコンポーネント利用時、暗号化を独自に行う方法

自分用にメモ。

Authコンポーネントを利用していれば、ユーザー情報登録時にパスワードを自動的に暗号化してくれます。ですがその影響で、パスワードの英数字チェックや長さチェックができません。(validate実行時は暗号化済みのため。)

回避方法は色々あるようですが、

  • Authコンポーネントによる暗号化をOFFにする
  • データベースへ格納する直前に自分で暗号化する

で対処する方法をメモ。

暗号化を回避する方法自体は、以下で紹介されています。

AuthComponentのパスワード暗号化を無効にする方法

このままだと暗号化せずにデータベースへ格納されるので、UserモデルのbeforeSaveメソッド内でAuthコンポーネントを使って暗号化を行います。具体的には以下のようなコードで暗号化できます。

function beforeSave()
{
  $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);

  return true;
}

モデル内でAuthコンポーネントを使うので、あらかじめ以下のコードでコンポーネントを読み込んでおく必要があります。

App::import('Component', 'Auth');

ひとまずこの方法で進めてみるとします。

CakePHPメモ

CakePHP1.3で躓いたところを、後々忘れないようにまとめたておいた。

最初に公式のブログチュートリアルと同じようなものを作った後、

  • 改ページの導入
  • ログイン機能の導入
  • ログイン状態保持機能の導入
  • ワンタイムトークン(CSRF対策)の導入

を簡単に解説しています。自分で色々調べつつ書いているメモなので、ツッコミ歓迎。

Twitterのbot

AOuth認証とWebAPIの勉強に、Tiiwerのbotを作ってみた。

  • 挨拶bot … いろいろな国の言葉で挨拶をします。
  • トレンドbot … Googleトレンドの急上昇ワードでAmazonを検索し、検索結果からランダムに投稿します。

ひたすら発言をポストするだけのbotは簡単に作れるようになったので、何か思いついたら他にも作るとします。

ページ移動

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed