Home > プログラム Archive

プログラム Archive

RFRを更新

久々に更新しておきました。
あんまり需要なさそうだけど、一人でも使ってくれる人がいる限り!(ただし自分を含む)
http://red-treasure.com/main/rfr.htm
内容
・プレビューの日付がずれるバグ修正
・画面からはみ出している状態で自動スクロールするとフォントが崩れるバグ修正
・位置がおかしくなることに若干の対策

以上

三目認証(○×認証)リリース

全く要望はありませんでしたが、更新ネタがないので三目認証を公開しておきます。
PHPの認証ライブラリ(?)です。
三目並べ(○×)に勝つことで認証に成功する認証システムです。(○の勝ちパターンすべてを選択する)

sanmoku.zip
配布ページ
以下、注意事項。

本認証スクリプトはなんちゃって認証です。
たいして認証パターンもありませんし、リプレイアタックも回避できないダメな子です。
(ただし、日をまたいでのリプレイアタックはできないように軽く工夫しています。)
ちょっとまじめに対策をとられたら簡単に自動処理されちゃう可能性があります。
なので本気の認証などには決して使わないでください。
「まじめなCAPTCHAはめんどくさいけど気休め程度の認証をつけたい、あと遊び心があればいいなあ。」
っていう人だけ使ってください。

サンプル

以上

○×認証(三目認証)

RFR(更新してないRSSリーダー)のサポート掲示板が大変なことになっていた。

スパムの嵐である。1日2000もカウンタ回っとる。このブログの5倍以上じゃないか。
「これはなんとかせねば・・・!」ということで、○×認証(三目認証)を作った。
○×認証付きサポート掲示板(の投稿ページ)
○×に勝たないと投稿できません。
いったんログは全部消したので、果たして効果があるのか様子見。
実際は何パターンもないし、暗号化はしているもののキーも全部HTMLにはき出しているので(サーバに何も残さないため)、本気でやれば簡単に破れる認証ですが、個人サイトの掲示板程度ならこんなもんでいいんじゃないかと。ただし、リプレイアタックは天敵です。ちょっとした改良はそのうち加えるつもり。
万が一要望があればソースも公開します。
以上

簡単なことが実はできてない

例えばnCrをどうやって計算するか。私は素直なので以下のようにやってしまいます。


int nPr(int n, int r)
{
    int retval = 1;
    if (n < r) return 0;
    for (int i = n; i > (n-r); i--) {
        retval *= i;
    }
    return retval;
}

int nCr(int n, int r)
{
    return nPr(n, r)/nPr(r, r);
}

数学的には上のような感じでいいはず(nとかrの不正値について無視すれば)。でもこれだとオーバーフローするらしいのです。速攻で。まあ、そりゃそうかも。階乗だし。例えばrを10にしたら分母のnPr(r,r)がもうオーバーフローします。なのでnCr(10,10)なんて簡単に1になることが分かるのに、計算できないわけです。まあ、この例ならnCr(10,10)=nCr(10,0)=1って計算しろよ、なんですが、まあすぐオーバーフローすると。で、どうしたらいいかというと漸化式で計算すればいいらしいです。


int nCr(int n, int r)
{
    int retval = 1;
	for (int i = 1; i < r; i++) {
		retval = retval * (n-i+1)/i;
	}
	return retval;
}

プログラムって微妙に数学と違うところが難しい。

以上

前方一致

検索用の文字列比較関数をリファクタリングしてたんです。
最初こんなんでした。


int compare(char *a, char *b) {
   int length_a;
   int length_b;
   int min_length;
   int i;
   int result = 0;
   
   length_a = strlen(a);
   length_b = strlen(b);
   min_length = min(length_a, length_b);
   
   for (i = 0; i < min_length; i++) {
      if (a[i] > b[i]) {
         result = 1;
         break;
      } else if (a[i] < b[i]) {
         result = -1;
         break;
      }
   }
   
   if (result == 0) {
      if (length_a > length_b) {
         result = 1;
      }
   }
   return result;
}

なんか変なことやってるなーと思い、「要は文字列比較だろ?」っていうわけで以下のように『リファクタリング』しました。


int compare(char *a, char *b) {
   int result = 0;
   
   for (i = 0; ; i++) {
      if (a[i] == '\0') {
         if (b[i] == '\0') {
            break;
         } else {
            result = -1;
	        break;
	     }
      } else if ( b[i] == '\0') {
         result = 1;
         break;
      } else if (a[i] > b[i]) {
         result = 1;
         break;
      } else if (a[i] < b[i]) {
         result = -1;
         break;
      }
   }
   
   return result;
}

うむ、合っているはずだ!というか、こんな比較関数を作るくらいならstrcmp使えって話なんだけど、そのときは気づかず。勝利を確信し動かしてみたらちゃんと動かねえ。CppUnitがFalseを出しまくりやがります。テストコードを見ると、なんとこの関数のテストコードがない。「いっけね、忘れてた」ってわけで早速テストコードを作成しテストしてみると、どうやらこの関数は正しく動いとる。むしろ元のコードは新しく作ったテストコードを通過しない。「このプログラムはバグの上に成り立っているのかぁ!?」と、ふとコメントを見ると
『前方一致に対応するためaの長さまでで比較する』
と書いてある。なにぃ!そうだったのか!つまり、a=”abc”, b=”abcde”の場合、0を返さないといけない。・・・ああ、だから最初あんな変なコードになっていたのか。というわけで最終的に下記のようになりました。


int compare(char *a, char *b) {
   int result = 0;
   
   for (i = 0; ; i++) {
      if (a[i] == '\0') {
         break;
      } else if ( b[i] == '\0') {
         result = 1;
         break;
      } else if (a[i] > b[i]) {
         result = 1;
         break;
      } else if (a[i] < b[i]) {
         result = -1;
         break;
      }
   }
   
   return result;
}

ちゃんと動いた。すごく微妙に早くもなった。CppUnitが役に立ったな。

以上

ゲームのネタ2

前回で言っていた機会がやってきた。(ブログのネタがないだけ。)
2.「戦国武将の野望(仮称)」(予約式戦略ゲーム)
2.1.概要
 コマンド予約式の戦略ゲーム。携帯アプリ。
 敵の戦略を読み、コマンドを予約登録することにより、現実時間とともに進行する歴●シミュレーションゲーム。プレイヤーは戦国武将のひとりとなり、全国統一を目指す。
2.2.ゲームシステム
 ゲームの進行は現実時間の流れと連動しており、いくらゲームを起動しててもゲームは進行しない。
 複数のコマンドを予約しておき、現実時間とともにコマンドが順に実行されていく。といってもアプリを常駐させておくわけではなく、実装上は起動時に前回終了時からの経過時間を計算してコマンドを然るべきところまで実行すればよい。実行結果はアニメーションにするか、簡単にはイベントを年表的に流す。
 コマンド1つを実行するには武将が1人必要。同じ武将を連続で使用できないとかそういう制限は設けておく。
2.3.このゲームの面白い点
 コマンドの実行結果や他国の行動を予測してその次のコマンドを予約しておくところが(たぶん)面白い。ずっとゲームに張り付いている必要はなく、携帯でちょっとした時間にコマンドを予約しておけばいいから(たぶん)気軽にできる。
2.4.開発状況
 0%

以上

アプリ(?)いくつか

PIYO関連で2つ、百式・企画塾で1つ、適当なWebアプリを作ったのでおいておく。

三国PIYO列伝!
PIYOの広場に送られたメッセージを拾って勝手に三国志大戦やってるアプリ。APIコンテストが期間延長になったのでくやしいからここで披露。

ちょいp!(IE専用)
PIYOの広場に送られたメッセージを拾って勝手に小説にしてしまうアプリ。APIコ(ry。

夢・出会えたら
合コン用ゆえに携帯用。二人の名前を入れると二人の間に生まれる夢を教えてくれるアプリ。ラッキードリンクも教えてくれる。百式・企画塾用に作成したが、百式の中の人に気づいてもらえなかったっぽいのでくやしいからここで(ry。
↓夢・出会えたら(携帯用QRコード)
qrcode.png

全部PHP。

以上

縦ガッキー

ちょっと縦書きのページ作ってみようと思って


tategaki {
      writing-mode:tb-rl;
      direction:ltr;
}

ってやったわけですが、Firefoxじゃ縦書きにならないやないか!

tableでやるしかないのか。Javascriptでなんか簡単なのないのか。
真相究明(Firefoxで対応)をねがう。

以上

RFR中間報告

RFRをバージョン1.0としてリリースしました。
RFR – RedTreasure FeedReader –

キーワード:RSSReader,RSSリーダー,Feedリーダー,フィードリーダー

以上

RFR

RFR(Red Treasure Feed Reader)を公開してみました。
いわゆるひとつの「yet another rss reader」です。
DesktopSidebarを消しちゃったので似たようなRSSリーダーを探していたんですが、それらしいものが見当たらず、仕方がないので自作してみました。
まあ、C#の勉強がてらです。言語習得を含めて2週間の割にはそこそこできたと自画自賛しています。

まだかなりバギーな感じですが、勇敢な方は使ってみてください。よろしくお願いいたします。
RFR.zip

以上

Home > プログラム Archive

Search
Feeds
Meta
 合計:018989
 今日:0128 昨日:0157

Return to page top