ナベアツを行うプログラム.

激しくどうでもいいんだが,一時期流行った,世界のナベアツという芸人がやっていた,「3の倍数と3が付く数字のときだけアホになる」というネタをプログラムしてみたので載せておく.

<?php 

for ($i = 1; $i <= 100; $i++) {

    $num = $i;
 
    if ($num % 3 === 0) {
    
        // 3の倍数のとき
        print $i." is nabe!!<br />";
    
    } else {
        
        // 3という数字を含んでいるかチェック
        while ($num !== 0) {
            
            $nabe = $num % 10; // 1234 % 10 は 4
            
            if ($nabe === 3) {
                print $i." is nabe!!<br />";
                break;
            }
            
            $num = floor($num / 10); // floor(1234 / 10) は 123
        
        }
    }
}

ActionScript3.0でクリックした点まで物体を動かすサンプル

最近,ActionScriptにハマっています.物体を移動させるライブラリはたくさんあるのですが,やはり細かい動きをさせたいときは,自分でコードを書くのが一番です.ということで,クリックしたところまで物体を動かすサンプルを書いてみました.二つのファイル(main.asとCircle.as)から成っています.この二つのファイルは同じフォルダに配置してコンパイルして下さい.

実行例はこちらです.

ソースはこちら.これはmain.as.

// main.as
package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import Circle;
	
	public class actions extends Sprite
	{
		
		private var _self:Circle;
		
		public function actions()
		{
			this._self = new Circle();
			addChild(this._self);
			
			this.stage.addEventListener(MouseEvent.CLICK, _move);

		}

		private function _move(e:MouseEvent):void
		{
			this._self.moveTo({x:e.stageX, y:e.stageY});
		}
		
	}
}

こっちはCircle.asです.

//Circle.as
package {
	import flash.display.Sprite;
	import flash.events.Event;

	public class Circle extends Sprite
	{
		
		public var from:Object;
		public var to:Object;
		public var speed:Number = 10;
		
		public function Circle():void
		{
			_drawCircle();
		}
		
		// 円を描く
		private function _drawCircle():void
		{
			this.graphics.beginFill(0xFFCC00);
			this.graphics.drawCircle(50, 50, 50);
			this.graphics.endFill();
		}
		
		// 現在地から,指定したところまで移動する
		public function moveTo(to:Object):void{
			this.from = {x:x, y:y}
			this.to = to;
			this.addEventListener(Event.ENTER_FRAME, _moveTo);
		}
		
		private function _moveTo(e:Event):void
		{
			
			// 目的地までの距離を測定する
			var diffX:Number = Math.abs(this.to.x - this.from.x);
			var diffY:Number = Math.abs(this.to.y - this.from.y);
			
			// 移動スピードを設定する
			this.speed = _ease(this.speed, diffX, diffY);
			
			
			// 目的地(付近)に着いたら移動をやめる
			if (diffX < this.speed && diffY < this.speed){
				this.removeEventListener(Event.ENTER_FRAME, _moveTo);
			}
			
			// x座標が目的地(付近)に到達していない場合,fromを更新
			if (diffX > this.speed) {
			
				if (this.from.x < this.to.x) {
					this.from.x += this.speed;
				} else {
					this.from.x -= this.speed;
				}

			}
			
			// y座標が目的地(付近)に到達していない場合,fromを更新
			if (diffY > this.speed) {
			
				if (this.from.y < this.to.y) {
					this.from.y += this.speed;
				} else {
					this.from.y -= this.speed;
				}

			}
			
			// 更新したfromを新たな現在地に設定する
			this.x = this.from.x;
			this.y = this.from.y;

		}
		
		// 移動スピードを調節する(まだ適当)
		public function _ease(speed:Number, diffX:Number, diffY:Number):Number
		{
			return Math.max(diffX, diffY) / 10;
		}
	}
}

小数刻みで動作を繰り返すシェルスクリプト

プログラムに与える引数を変えつつ何回も実行する必要が出てきたので、シェルスクリプトを少し勉強してみました。
C言語のようにfor文を使ったら簡単にできるかなと思っていたら、小数が簡単に扱えなかったりして、苦労しましたが、「seq」を使うことによって解決しました。
下の例は、0.9から0.01刻みで0.99までループする例です。

#!/bin/sh

for f in `seq 0.9 0.01 0.99`
do
     echo $f
done

XとYを含むn-gramの文章を取るプログラム

最近Pythonをよく使ってます。
そこで、ある2つの単語(XとY)を含む、5文字以内の部分文字列を取る必要があったので、プログラムを書いてみました。

#! coding: utf-8

str = 'ggggg bbbb cccc X is large Y hoge aaa xxxx yyyy X is small Y hogehoge aaaa hoge'

windowSize = 5

tokens = str.split(' ')
for i in range(len(tokens)-1):
    XisIncludedFlag = False
    YisIncludedFlag = False
    for j in range(windowSize):
        if tokens[i+j] == 'X' : XisIncludedFlag = True
        if tokens[i+j] == 'Y' : YisIncludedFlag = True
        if i+j == len(tokens)-1 : 
            break
    if XisIncludedFlag and YisIncludedFlag :
        for j in range(windowSize):
            print tokens[i+j]
            if i + j == len(tokens)-1 : break
    print ''

例えば、strとして、
str = 'ggggg bbbb cccc X is large Y hoge aaa xxxx yyyy X is small Y hogehoge aaaa hoge'
という文章を使った時、(print tokens[i+j]によって)出力されるのは、

cccc
X
is
large
Y

X
is
large
Y
hoge

yyyy
X
is
small
Y

X
is
small
Y
hogehoge

です。
ただ、場当たり的に書いたので、すごく遅いプログラムになってると思います。
このプログラムでは、対象文字列がN文字あったとき、今回はwindowSizeが5なので、大体 N * 5ほど実行回数が必要になります。
たぶん探せばもっといいアルゴリズムがたくさんあるはず…。

URLをパラメータに持つURLを、パラメータ値に置き換えるGreasemonkeyスクリプト(ややこしい)

作ったものと経緯

他のページへ飛ぶときに出てくるクッションページを飛ばすスクリプトです。 URL中にhttp://が2回出てくるときに、後から出てきたhttp://以下にURLを置き換えます。例えば、http://hogehoge/?url=http://skygazer.iobb.nethttp://skygazer.iobb.net/に置き換えてくれます。置き換えることで不具合が出るかもしれないので、置き換えるサイトは自分で指定して下さい。

スクリプトの置き場所

http://skygazer.iobb.net/gm/scp.user.js からインストールできます。

はてなダイアリーアドオン

はてなダイアリーで日記を書く時に便利なツールを集めたアドオンを作りたい。
以前作った、はてなテーブルエディターの機能や、リンク収集機能、はてな記法入力支援ツールなどを盛り込もうかなと考えている。今、ちょうど学校のプロジェクトでFirefoxのアドオンを作ろうとしているので、それの副産物としてできればいいなー。

printとechoだと、echoの方が速い

今までは何かを出力するときにはprint文を使ってたんですが、どうやらecho文の方が速いみたいです。ショックだ…。
http://nyx.pu1.net/reference/extra/echo_print.html
http://www.crazy-media.se/echo-vs-print/