nanapiでオセロのコツ書きました



地味な特技だと思っていたので、とりあえず書いてみよう的なノリだったんですが、
予想外に見てもらえてたのでブログにも残しておきます。

実際のコツについては、nanapiをご覧ください。

今回はせっかくなので雑談でも。

なぜオセロにハマったのか。


初めてインターネットをしたのが高校時代。
田舎にしては早いほうだったと思います。
回りにやってる人は誰もいませんでした。
インターネットにあったものといえば、チャット、BBS、そしてヤフーゲーム。

ルールも簡単だし、ネットで誰かと対戦できるのが楽しそうでオセロをやるようになりました。
ぼくは自分が好きなことに対しては負けず嫌いな性格をしてるので、案の定なぜ負けるのかが気になりだします。
そしてちょうどこのタイミングで田舎にもテレホがやってきました。
ここから夜な夜なオセロの研究が始まったのがきっかけです。


リアル進出


大学受験のためしばらくオセロから離れていた時期がありましたが、大学が落ち着いてふと思い出したのをきっかけに再熱。
ある日、対戦後に「どちらにお住まいですか?」と聞かれて答えたところ、「定例会あるから来てみない?」と誘われたのをきっかけに実際のオセロ界へ進出していきました。


全国大会


運よくその年の予選ブロックを勝ち抜き、全国大会出場となったわけなんですが、
幸か不幸かこの年はネットとリアルのオセロ界の融合が始まった年のような気がします。
ヤフーゲームでの有名人が次々とリアルの大会に出場し上位に食い込んでいきました。
ネット上での強さのインフレはすさまじい勢いでした。
それほど現行のオセロ界とネット界での強さにおいて、格差があった時代だと思います。


2段獲得


おそらく前例のないことだと思うんですが、賞金がでる大会が開催されました。
この大会の予選、ぼくのオセロ史上最高段位との対戦がありました。
当時七段の相手に、中盤でほぼ詰まされ後はされるがまま。。
負けがその一戦のみだったためベスト4に入り2段に昇格。


以上の出来事が2001年までのことです。
それ以降オセロ界から離れたため、実に8年近くのブランクがあります。
正直今は1級相手でも勝てるかわかりませんw

このnanapiのレシピを書くにあたり、久しぶりにオセロ界隈のニュースやサイトを見てたら懐かしくなっちゃってこのエントリー書いた次第です。

nanapiに書いてない注意点


今回書いたコツは、あくまでも初心者相手にしたときのコツです。
正直なところ上級者相手ですと、このくらいのコツを覚えたくらいの相手がいちばんやりやすくなるので、
ヤフーゲームやハンゲームでぜんぜん勝てないじゃん!と言われても責任とれませんw



圧力鍋で豚の角煮つくった

Wonder chef(ワンダーシェフ)ネオ・ロタ(NEOロタ)片手圧力鍋 3.0L 602282


先日この圧力鍋買ったので、さっそく豚の角煮にチャレンジ。
圧力鍋を使わないと煮る時間だけで2時間近くかかるのに、おかげさまで煮る時間が40分くらいに短縮。

初めての角煮に割りにはうまくいったかも。
次作るとしたらもうちょっと味が濃くてもいいかもしれない。

豚の角煮

「ツイッター 140文字が世界を変える」読んだ

ツイッター 140文字が世界を変える

人気あるみたいだから読んでみた。
通勤途中にちょっとずつ読んでやっと読み終わった・・・。
しっかり読めば1時間もかからないと思うけど。


ついったーのこれまでの概要はよく分かる本だった。
ただ一言でいうと

「おれくらい有名だとTwitterってこんなに楽しいんだぜ!!」
に尽きるような気がする。


ある程度有名で、常時ネットでつぶやける環境じゃないと楽しくない、っていってるように感じる。
いまだにぼくもTwitterの面白さが分からない。

jQueryとjsonpでbitlyAPIを使う

なんかそのうち使いそうなのでコピペ用メモ。
jQueryを使ってjsonpでデータ取得。
とりあえずライブラリにして使うところで読み込むかんじに。

bitlyApi.js

BitlyClient = function() {
  this._initialize();
}
$.extend(BitlyClient.prototype, {
  _initialize: function(login, apikey, version) {
    this.login = login || "LOGIN";
    this.apikey = apikey || "APIKEY";
    this.version = version || "2.0.1";
  },
  shorten: function(longUrl, target) {
    var result;
    $.ajax({
      type: "GET",
      url: "http://api.bit.ly/shorten",
      data: {
        "login": this.login,
        "apiKey": this.apikey,
        "version": this.version,
        "longUrl": longUrl
      },
      dataType: "jsonp",
      success: function(data) {
        for (var r in data.results) {
          result = data.results[r];
          break;
        };
        target.text(result.shortUrl);
      }
    });
  },
  expand: function(shortUrl, target) {
    var result;
    $.ajax({
      type: "GET",
      url: "http://api.bit.ly/expand",
      data: {
        "login": this.login,
        "apiKey": this.apikey,
        "version": this.version,
        "shortUrl": shortUrl
      },
      dataType: "jsonp",
      success: function(data) {
        for (var r in data.results) {
          result = data.results[r];
          break;
        };
        target.text(result.longUrl);
      }
    });
  }
});
var Bitly = new BitlyClient();


URLとターゲット渡して出力するライブラリなので使う用途に合わせて。
とりあえずURL入力して出力する例。

html

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"></script>
<script src="bitlyApi.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
  $('input[id^=bitly]').click(function() {
    eval("Bitly."+$(this).val()+"($('input#url').val(), $('div#bitly-result'))");
  });
});
</script>
</head>
<body>
<input type="text" id="url" /><input type="button" value="shorten" id="bitly-shorten" /><input type="button" value="expand" id="bitly-expand" />
<div id="bitly-result"></div>

豚だいこん

豚だいこん

ひさびさに夜ご飯に煮物つくりました。
豚とだいこんとネギ煮込んだだけ。

調味料てきとにしたけど意外と満足の出来。

javascriptを<head>タグ内に呼び出す 【CakePHP】

各ページによって読み込むjsを変えたいときに。
簡単なことだけど、ふと忘れそうなので。

/path/to/app/webroot/js/foo.jsを読み込みたい場合。

・controller

コントローラではヘルパーの呼び出し。
<?php
class HogeController extends AppController {
  var $name = 'Hoge';
  var $helpers = array('Javascript');

  public function index() {
  }


・view

ビューではaddScriptで<head>タグ内に記述される。
($scripts_for_layoutの部分)
<?php $this->addScript($javascript->link('foo')); ?>

その場所に出力したい場合はそのまま
<?php echo $javascript->link('foo'); ?>

・layout

レイアウトはとりあえずこんなかんじで$scripts_for_layoutを書く。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<?php echo $scripts_for_layout; ?>
</head>
<body>

「欲望なう」つくりました by TwitterAPI

どうTwitterを楽しむべきか、
なにが楽しいのかいまいちよくわからんので
自分で興味が持てるようにAPI使ってサイト作りました。
あとCakePHPの練習も兼ねて。

いちおうECサイト担当っぽく「欲しい」をキーワードに集めてみました。

とりあえずぶっぱなしぎみで作ったので中身ごり押しな感じです。


欲望なう

欲望なう

キャッシュだったり、もうちょっとリアルタイム性だしたりと改善点は多々あると思うのでぼちぼち作ります。

アメブロのAtomAPIが倒せない

前回のlivedoorBlogにAtomAPIで投稿に引き続きアメブロもやっちゃうぜーと思ったらハマった。
同じAtomAPIだしコード同じで行けるだろうと思ったら違うらしい。

いろいろ調べてみるとWSSE認証が独自ぽい。
でもいくら調べても同じように困ってる人はいても、解決してる人が見つからない。。

これまで調べてlivedoorBlogと違うと思われる部分がpass_digestの作成部分。

livedoorBlog
$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$password)));

アメブロ
$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.strtoupper(md5($password)))));

パスワードをmd5したあとに大文字化するらしいとの情報。
デマかホントかわかりません。。

返ってくるレスポンスは
CurlResponse Object
(
    [body] => 
X-WSSE authentication required
    [headers] => Array
        (
            [Http-Version] => 1.1
            [Status-Code] => 401
            [Status] => 401 Unauthorized
            [Set-Cookie] => BIGipServerPool_comment=3395622060.20480.0000; expires=Sat, 17-Oct-2009 01:32:13 GMT; path=/
            [Date] => Fri, 16 Oct 2009 02:18:33 GMT
            [Server] => Apache
            [Content-Length] => 83
            [Content-Type] => application/x.atom+xml
        )

)

だめだー、なんか違うとこで間違ってるのか・・・。
今回使用したコードは以下。

続きを読む »

CakePHPでバッチ処理メモ

app/vendors/shells/以下にファイルを作成。

/path/to/app/vendors/shells/foo.php
<?php
class FooShell extends Shell {

  var $uses = array('Hoge');

  function bar(){
    $this->args[0]; /* コマンドラインからの引数 */
    /* 処理 */
  }
}
?>


cronで使用するケースが多いと思うので、下記のように-appにappディレクトリのパスを設定。
/path/to/cake/console/cake foo bar -app /path/to/app/

AtomAPIでlivedoorBlogに投稿する【PHP】

前回の記事に引き続きAtomAPI用。
PHPとcURL使用。

<?php
require_once 'cURL.php';

$atomapi_url = "http://cms.blog.livedoor.com/atom/";
$livedoor_id = "your livedoor id"; /* livedoorID */
$password = "your password"; /* パスワード */
$category = "1"; /* カテゴリ */
$title = "sample"; /* 記事タイトル */
$text = "content"; /* 記事本文 */

$created = date('Y-m-d\TH:i:s\Z');
$nonce = pack('H*', sha1(md5(time())));
$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$password)));
$wsse =
  'UsernameToken Username="'.$livedoor_id.'", '.
  'PasswordDigest="'.$pass_digest.'", '.
  'Nonce="'.base64_encode($nonce).'", '.
  'Created="'.$created.'"';

$text64= base64_encode($text);

$rawdata =
  '<?xml version="1.0"?>'.
  '<entry xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">'.
  '<title type="text/html" mode="escaped">'.$title.'</title>'.
  '<dc:subject type="text/html" mode="escaped">'.$category.'</dc:subject>'.
  '<content type="application/xhtml+xml" mode="base64">'.$text64.'</content>'.
  '</entry>';

$headers = array(
              "X-WSSE" => $wsse,
              "Content-Type" => "application/x.atom+xml",
              "Cache-Control" => "no-cache",
              );

$curl = new Curl();
$curl->headers = $headers;
$curl->options = array("POSTFIELDS" => $rawdata);
$res = $curl->post($atomapi_url);
?>
livedoor プロフィール
最近購入した本
Recent TrackBacks
  • livedoor Readerに登録
  • RSS
  • livedoor Blog(ブログ)

トップに戻る