「def」を含む日記 RSS

はてなキーワード: defとは

2011-04-23

2010年日本ヒップホップ音楽

2010年の日本のヒップホップ音楽 【作業用BGM】 ‐ ニコニコ動画(原宿) の曲目。

01. LOST IDENTITY - 道(TAO) (YouTube)

"Lost Identity", 08.15. ILL EAST RECORDS

02. 都市伝説 - 韻踏合組合 (YouTube)

"都市伝説", 10.10. IFK RECORDS

03. 極悪JAZZ feat. 鬼 - キリコ (YouTube)

Produced by DJ OLDFASHION

"DIS IS IT", 09.22. 術ノ穴

04. Black File 200回記念フリースタイル (Vimeo)

"Black File", 06.24. スペースシャワーTV

05. 夕方 - S.L.A.C.K. (YouTube)

"Swes Swes Cheap", 08.04. Dog Ear Records

06. 思考品M.T.B.D. feat B.D. - DJ Mitsu the Beats (YouTube)

"UNIVERSAL FORCE", 08.04. PLANET GROOVE

07. CAMP'S RULE - RAMB CAMP (YouTube)

Produced by DJ GQ

"RAMB CAMP", 05.14. FILE RECORDS

08. MECCHA MECHA - コッペパン (YouTube)

exclusive, 10.09. MySpace

09. GOOD MORNING BABY - やけのはら (YouTube)

"THIS NIGHT IS STILL YOUNG" 08.04. felicity

10. 捕食 - asa x CUBEc.u.g.p (YouTube)

"捕食-hoshoku-", 06.11. Jar-BeatRecord

11. イッちゃってイイ? (SUGAR CRACK REMIX) - SD JUNKSTA (YouTube)

"Remix EP", 03.10. 諭吉レコード

12. TORA TORA TORA - TETRAD THE GANG OF FOUR (YouTube)

"SPY GAME", 11.12. FILE RECORDS

13. SUNDAYfeat. WAX - PONY (YouTube)

Produced by KURABEATS

"Verseday", 05.05. 桃源響RECORDS

14. Get Da Passports - Black Mont Blanc (YouTube)

"Sullen Faces", 12.22. 33Records

15. 音楽ワルキューレ - DOTAMA (YouTube)

Produced by Fragment

"音楽ワルキューレ", 04.07. 術ノ穴

16. いつもそう - WAX from SD JUNKSTA (YouTube)

Produced by KYN

"神成り", 07.21. 諭吉レコード

17. MADE IN JAPAN feat. X-MAN - L-VOKAL (YouTube)

Produced by 1689

"Lovin'", 03.03. MATENRO RECORDS

18. Homeward Journey - Uyama Hiroto (YouTube)

"Homeward Journey", hydeout productions

19. G.H.E.T.T.O - SHINGO☆西成 (YouTube)

Produced by TRAMP

"I・N・G", 11.10. 昭和レコード

20. STRAIGHT CASH - YING YANG (YouTube)

"TOTAL ECLIPSE", 10.13. YING YANG PRODUCTION

21. ILLMATIC RACER feat. 来門 - UNDER BROS (YouTube)

Produced by TAKE-C

"UNDER BROS", 05.12. BASE CAMP

22. トーキョー難民 - あるぱちかぶと (YouTube)

"◎≠", 02.03. Slye Records 在音

23. 森羅万象 - AXIS (YouTube)

"UNPOPULAR -在日外国人奇声集-", 04.21. Libra Records

24. iPhone for GAGLE - GAGLE (YouTube)

Produced by DJ Mitsu The Beats

exclusive, 07.02. (twitter)

25a. 24 BARS TO KILL feat. ANARCHY, RINO LATINA II, 漢, MACCHO - Ski Beatz (YouTube)

"24 HOUR KARATE SCHOOL JAPAN", 10.20. R-RATED RECORDS

25b. 24 Bars To Kill "IFK REMIX" feat. Hidaddy, Erone, Satussy, 遊戯 - Ski Beatz (YouTube)

exclusive, 11.05.

25c. 24 Bars To Kill "MYC REMIX" feat. RYUZO, DABO, SUIKEN, 般若 - Ski Beatz (YouTube)

exclusive, 11.06.

26. 東京哀歌-トウキョウエレジイ- - 空也MC (Youtube)

Produced by fanfan

"東京哀歌‐トウキョウエレジイ‐", 05.05. 術ノ穴

27. 禁断の惑星 feat. 志人 - TABOO1 (YouTube)

Produced by DJ KENSEI

"LIFE STYLE MASTA", 10.20. Libra Records

28. Break Boy in the Dream feat. 七尾旅人 - 環ROY (YouTube)

"BREAK BOY", 03.17. POPGROUP RECORDINGS

29. DREM SKY - RAU DEF (YouTube)

Produced by PUNPEE

"ESCALATE", 09.10. FILE RECORDS

30. MOTHER feat. MMM, CHIYORI - おみゆきChannel (YouTube)

"おみゆきさん", 03.10. Mary Joy Recordings

31. MISSION POSSIBLE - OLIVE OIL×ILL-BOSSTINO×B.I.G.JOE (YouTube)

"MISSION POSSIBLE", 07.21. OILWORKS THA BLUE HERB RECORDINGS TRIUMPH RECORDS

32. WAKE UP feat. MARIA - QN from SIMI LAB (Amebreak)

Produced by Earth No Mad

"THE SHELL", 07.29. FILE RECORDS

2010-11-08

Re: Rubyのすゝめ #01 – ベンチマークテストプロセス管理

http://labs.gree.jp/blog/2010/11/1953/

#!/usr/bin/ruby
 
def fork_exec(*args)
    fork() {
        Kernel.exec(*args)
    }
end
 
fork_exec("/usr/bin/ruby", "-e", 'sleep 3; puts "3"')
fork_exec("/usr/bin/ruby", "-e", 'sleep 1; puts "1"')
fork_exec("/usr/bin/ruby", "-e", 'sleep 2; puts "2"')
Process.waitall()

2010-09-25

[]闇プログラマーによる、うるう年の判定処理

以下の記事を読んだ私は違和感を覚えた。

私がソフトウェア技術者をやめた理由

今時のソフトウェア技術者というものは未だにこんな判定処理を書いているというのか。やはり遅れているとしか言いようが無い。

闇プログラマー界隈ではその一歩後ろ右斜め奥をいっている。

うるう年の判定とはこうやるのだ。


def leap_year?(y)
  /^(?:[13579](?:[13579](?:[13579][26]|[26][048]?|[48][048]|0[48])|[48](?:[13579][26]|[48][048]?|[26][048]|0[48]?)|0(?:[13579][26]|[48][048]?|[26][048]|0[48])|[26](?:[048][048]?|[13579][26]|[26][048])?)|[26](?:[13579](?:[13579][26]|[26][048]?|[48][048]|0[48])|[26](?:[13579][26]|[48][048]?|[26][048]|0[48]?)|[48](?:[048][048]?|[13579][26]|[26][048])?|0(?:[13579][26]|[026][048]|[48][048]?)?)|[48](?:[13579](?:[13579][26]|[26][048]?|[48][048]|0[48])|[26](?:[13579][26]|[48][048]?|[26][048]|0[48]?)|[048](?:[048][048]?|[13579][26]|[26][048])?)?)$/ =~ y
end

9999年までうるう年の判定ができる。

計算式でうるう年の判定がするなど笑止千万

この程度で一端のソフトウェア技術者を名乗るなど、業界そのものが甘く見られたものだ。

まだまだ我々闇プログラマー集団が縁の下で支えてやらないとダメなのだと実感した。

グッドラックアディオスアミーゴ


※これはbot処理です

2010-08-15

http://anond.hatelabo.jp/20100815182830

なんか色々レスがついて嬉しいですねw

FizzBuzz問題って一般的に、3の倍数と5の倍数以外の場合数字を表示しないと駄目だよ

それは知りませんでした。

後、def文の中で再帰してるけど、これ、馬鹿でかい数入れたらメモリ使い切らないか?

Phythonは詳しくないから、嘘言ってるかも知れないけど

他には、何も15で場合分けしなくても、改行しなければ3の倍数と5の倍数とそれ以外で済むから

剰余演算の回数が減る

この辺はいかにも興味が無い領域ですねw

メモリは多分使い切ると思いますが、使い切った場合とかめんどくさくて考えたくないです。

他には、何も15で場合分けしなくても、改行しなければ3の倍数と5の倍数とそれ以外で済むから

剰余演算の回数が減る

これも興味ないですね…。計算回数って、数学数理モデル)を計算機に乗せたから出てきた問題で、実用上は重要だけど数学としてはどうでもいいなあって思っちゃいます。

http://anond.hatelabo.jp/20100815180817

どうでも良いと言えば、どうでも良いんだけど

FizzBuzz問題って一般的に、3の倍数と5の倍数以外の場合数字を表示しないと駄目だよ

後、def文の中で再帰してるけど、これ、馬鹿でかい数入れたらメモリ使い切らないか?

Phythonは詳しくないから、嘘言ってるかも知れないけど

他には、何も15で場合分けしなくても、改行しなければ3の倍数と5の倍数とそれ以外で済むから

剰余演算の回数が減る

数式書くの好きなら計算量減らすのは重要なんでない?

2010-08-13

Pythonfizzbuzz

def fizzbuzz(n):
	def fb_iter(m):
		if(m>n):
			return
		else:
			if(m%15==0):
				print("FizzBuzz")
			elif(m%3==0):
				print("Fizz")
			elif(m%5==0):
				print("Buzz")
			fb_iter(m+1)
	fb_iter(1)

プログラミングセンスとかマジ無いわー

ていうか増田っていつになったらコード記法対応するんだろう?

永遠に無理か。

ハイライト無しならいけるのか

2010-04-26

RubyJavaログ出力を統合する方法

JRuby上で動くRubyJavaログを同じファイルに保存したいときなど

JRuby界隈で何かいい方法ないかな~と探していたけど見つからないので

RubyのLoggerのインターフェースcommons-loggingを使用して実装してみた

使用バージョンは以下

require 'logger'

class CommonsLoggingLogger
  def initialize(name="ruby")
    @progname = nil
    @logger = org.apache.commons.logging.LogFactory.getLog(name)
  end
  def add(severity, message=nil, progname=@progname, &block)
    if message.nil? and block_given?
      message = yield
    end
    
    case severity
    when Logger::DEBUG
      debug(progname){message}
    when Logger::INFO
      info(progname){message}
    when Logger::WARN
      warn(progname){message}
    when Logger::ERROR
      error(progname){message}
    else
      fatal(progname){message}
    end
  end
  def debug(arg0=nil, &block)
    @logger.debug make_log(arg0, &block)
  end
  def info(arg0=nil, &block)
    @logger.info make_log(arg0, &block)
  end
  def warn(arg0=nil, &block)
    @logger.warn make_log(arg0, &block)
  end
  def error(arg0=nil, &block)
    @logger.error make_log(arg0, &block)
  end
  def fatal(arg0=nil, &block)
    @logger.fatal make_log(arg0, &block)
  end
  def debug?
    @logger.isDebugEnabled
  end
  def info?
    @logger.isInfoEnabled
  end
  def warn?
    @logger.isWarnEnabled
  end
  def error?
    @logger.isErrorEnabled
  end
  def fatal?
    @logger.isFatalEnabled
  end
  def level
    if debug?
      Logger::DEBUG
    elsif info?
      Logger::INFO
    elsif warn?
      Logger::WARN
    elsif error?
      Logger::ERROR
    else
      Logger::FATAL
    end
  end
  def level=(lv)
    #do nothing
  end
  def sev_threshold
    level
  end
  def sev_threshold=(lv)
    #do nothing
  end
  def datetime_format
    nil
  end
  def datetime_format=(fm)
    #do nothing
  end
  
  attr_accessor :progname
  
  private
  def make_log(message_or_progname, &block)
    if block_given?
      progname = message_or_progname || @progname
      message = yield
    else
      progname = @progname
      message = message_or_progname
    end
    
    progname_message(progname, message)
  end
  def progname_message(progname, message)
    progname.nil? ? message : "#{progname}: #{message}"
  end  
end

試しにRedmineに設定して動かしてみたところ大丈夫そうだった

2009-12-10

PHPのあの関数Perlでやるには?

元ネタ http://phpspot.org/blog/archives/2009/12/phpjavascriptph_1.html

面白そうだと思ったので僕もやってみた。モジュールPerl5.8系の標準モジュールのみ利用可という制限。

全部はキツイので関数処理関係の関数(http://php.benscom.com/manual/ja/ref.funchand.php)だけ実装してみた。

use strict;
use warnings;

=head2 call_user_func

 $ret = call_user_func($function,@param);
 $ret = call_user_func([$class,$method],@param);

example1

 sub plus { $_[0] + $_[1] }
 print call_user_func('plus',10,20); # 30

example2

 package Foo;
 sub plus { $_[1] + $_[2] }
 package main;
 print call_user_func(['Foo','plus'],10,20); # 30

=cut

sub call_user_func {
    my $proto = shift;
    if ( ref $proto eq 'ARRAY' ) {
        return $$proto[0]->${\$$proto[1]}(@_);
    }
    else {
        require Pod::Functions;
        if ( $Pod::Functions::Flavor{$proto} ) {
            return eval qq{$proto(\@_)};
        }
        else {
            no strict 'refs';
            return $proto->(@_);
        }
    }
}

=head2 call_user_func_array

 $ret = call_user_func_array($function,\@param);
 $ret = call_user_func_array([$class,$method],\@param);

example

 sub plus { $_[0] + $_[1] }
 print call_user_func_array('plus',[10,20]); # 30

=cut

sub call_user_func_array {
    return call_user_func(shift,@{+shift});
}

=head2 create_function

 $code = create_function($args_str,$code_str);

example

 $code = create_function('$c,$d=1','print $c+$d');
 $code->(10); # 11

=cut

sub create_function {
    my $args = shift;
    my $code = shift;
    my $default = 0;
    my @args = split /,/,$args;
    my $code_str = 'sub {';
    for my $arg (@args) {
        if ( $arg =~ /^\s*(\$[a-zA-Z][\w]*)\s*(?:=\s*(.+))?\s*$/ ) {
            my $val = $1;
            my $def = $2;
            if ( defined $def ) {
                $default = 1;
                $code_str .= qq{my $val = \@_ ? shift : $def;\n};
            }
            else {
                die 'parse error' if $default;
                $code_str .= qq{my $val = shift;\n};
            }
        }
    }
    $code_str .= $code . '}';
    my $sub = eval $code_str;
    die $@ if $@;
    return $sub;
}

=head2 forward_static_call

 $ret = forward_static_call($function,@param);
 $ret = forward_static_call([$class,$method],@param);

=cut

sub forward_static_call {
    call_user_func(@_);
}

=head2 forward_static_call_array

 $ret = forward_static_call_array($function,\@param);
 $ret = forward_static_call_array([$class,$method],\@param);

=cut

sub forward_static_call_array {
    call_user_func_array(@_);
}

=head2 func_get_arg

 $arg = func_get_arg($no)

example

 sub foo { print func_get_arg(1) }
 foo(100,200); # 200

=cut

sub func_get_arg {
    my $n = shift;
    package DB;
    @DB::args = ();
    () = caller(1);
    return defined $DB::args[$n] ? $DB::args[$n] : undef;
}

=head2 func_get_args

 @args = func_get_args()

example

 sub foo { print join ':', func_get_args() }
 foo(11,22,33); # 11:22:33

=cut

sub func_get_args {
    my $n = shift;
    package DB;
    @DB::args = ();
    () = caller(1);
    return @DB::args;
}

=head2 func_num_args

 $arg_count = func_num_args()

example

 sub foo { print func_num_args() }
 foo(11,22,33); # 3

=cut

sub func_num_args {
    my $n = shift;
    package DB;
    @DB::args = ();
    () = caller(1);
    return scalar @DB::args;
}

=head2 function_exists

 $bool = function_exists($func)

example

 sub foo {}
 print function_exists('foo');  # 1
 print function_exists('bar');  # 0
 print function_exists('rand'); # 1

=cut

sub function_exists {
    my $func = shift;
    return 1 if exists &$func;
    require Pod::Functions;
    return $Pod::Functions::Flavor{$func} ? 1 : 0;
}

=head2 get_defined_functions

 $funcs = get_defined_functions()

=cut

sub get_defined_functions {
    require Pod::Functions;
    return {
        internal => [ keys %Pod::Functions::Flavor ],
        user     => [ grep { exists &$_ } keys %:: ],
    };
}

=head2 register_shutdown_function

 register_shutdown_function($func,@param);
 register_shutdown_function([$class,$method],@param);

=cut

{
    my $REGISTER_SHUTDOWN_FUNCTION = [];
    sub register_shutdown_function {
        my $proto = shift;
        push @$REGISTER_SHUTDOWN_FUNCTION, [
            do {
                if ( ref $proto eq 'ARRAY' ) {
                    $$proto[0]->can($$proto[1]);
                }
                else {
                    require Pod::Functions;
                    if ( $Pod::Functions::Flavor{$proto} ) {
                        sub { eval qq{$proto(\@_)} };
                    }
                    else {
                        no strict 'refs';
                        \&$proto;
                    }
                }
            },
            [@_]
        ]
    }
    END {
        $_->[0]->(@{$_->[1]}) for @$REGISTER_SHUTDOWN_FUNCTION;
    }
}

思ったよりも難しかった。標準関数一覧を取る手段がなかったので標準モジュールを利用して標準関数の一覧を取得した。

あと文字列から標準関数を呼び出すスマートな手段が思いつかなかったのでeval便りに。

create_functionはかなりゴリ押し。myを勝手に付けたりデフォルト引数にも対応してたり細かい芸が光る(自分で言うな)

forward_static_callはぶっちゃけPerl的にcall_user_funcと殆ど処理が変わらないのでそのまま利用。

func_get_arg系は結構クリティカルだなー。@DB::argsをリアルに使ったの初めてだよ。

register_shutdown_functionはちょっとねー。ENDブロックを利用してるわけなんだけど当然mod_perlとかではうまく動かない。あとシグナルとか使った方が良いのかもしれない。

ヒマがあったら他の関数とかも実装してみたいかも。

プログラ増田のあなぐら

2009-06-03

Python わかんね。Singleton わかんね。 __new__ わかんね。id わかんね。

class Singleton( object ):
  _instances = dict()

  def __new__(cls, *args, **kwargs):
    if cls not in cls._instances:
      cls._instances[cls] = object.__new__(cls, *args, **kwargs)
    return cls._instances[cls]

class A( Singleton ):
  def __init__( self, x ):
    self.x = x

a = A(1)
print id(a)
print id(a.x)

b = A(2)
print id(b)
print id(b.x)

id(a) == id(b) なのに id(a.x) != id(b.x) なのかわかんね。

2009-04-24

http://anond.hatelabo.jp/20090423032006

最初のあなた。

foreach 男 in 気になる男
  女.告白(男);
  new 返事待ちスレッド().start();
  join();
  continue if 返事.ごめん();
  二人 = new カップル(女,男);
  while !二人.別れた()
    二人.ごにょごにょ();
  end
  # 二人.dispose(); #コメントアウト
  while !女.気が済んだ()
    女.アプローチ(男)
  end
end

今のあなた。

new 女スレッド().start();
foreach 男 in 気になる男
  女.告白(男);
end

女スレッド extends スレッド
  def run
    while true
      返事 = 返事キュー.get();
      continue if 返事 == null;
      continue if 返事.ごめん();
      二人 = new カップル(女,男);
      while !二人.別れた()
        二人.ごにょごにょ();
      end
      二人.dispose();
    end
  end
end

ふつう

foreach 男 in 気になる男
  女.告白(男);
  返事待ちスレッド.start();
  join();
  continue if 返事.ごめん();
  二人 = new カップル(女,男);
  while !二人.別れた()
    二人.ごにょごにょ();
  end
  二人.dispose();
end

2009-03-24

http://anond.hatelabo.jp/20090323132410

できた。

def every_case(arr, *args)
  if(arr.length>1)
    arr.each do |elm| #


  

2009-01-20

窓使いの憂鬱HHKB

だいぶ前のことなので結構忘れてるけど。

買ったのはHHKBPro2。OSはWindowsVista

買ってまずしたこと

背面のスイッチをいじってキーを変える。

http://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html

左◇Fn
右◇Win
DeleteBackspace

左◇あたりにFnを割り振らないと右小指でしかFnを押せなくて面倒。

DeleteよりBackspaceの方が使用頻度が高いので変更。(Fn+DeleteでDeleteを押したことになります)

パソコン側の設定

ノートPC(日本語Windows)で英語配列HHKBを使う時はUSJPを入れるのが限りなく正解に近い。

http://www.trinityworks.co.jp/software/USJPPro/index.php

デスクトップPCではドライバ英語キーボードに設定すればいい。

ノートPCでUSJPを入れていて、USJPにはおまけ機能でいくらかのキーの組み合わせを設定できるので

デスクトップPCでも同じにするためにとりあえず窓使いの憂鬱を入れた。

Vista対応版

http://slashdot.jp/~kazu2/journal/411746

設定はこんな感じにした。

include "104.mayu"

key C-D = Delete
key C-H = BackSpace
key C-M = Enter
key C-Space = $ToggleIME

逆に普通日本語配列キーボードを似非HHKBにする設定。

どこかで見た設定をベースにいじったような気がしますがどこのがベースか忘れた。

自分は左◇キーをFnキーに設定して使っているので無変換キーをFnキーにするとちょうどよくなる。

include "104.mayu"

mod control += CapsLock
def subst *CapsLock = *LControl
key S-Pause = CapsLock

def key 無変換 = 0x7b
mod mod0 = 無変換
key *S-M0-K = *S-Home
key *S-M0-Comma = *S-End
key *S-M0-Apostrophe = Right 
key *S-M0-Semicolon = Left
key *S-M0-LeftSquareBracket = Up
key *S-M0-Solidus = Down
key *S-M0-L = *S-PageUp
key *S-M0-FullStop = *S-PageDown
key M0-R = F5
key C-D = Delete
key C-H = BackSpace
key C-M = Enter
key *S-M0-_1 = F1
key *S-M0-_2 = F2
key *S-M0-_3 = F3
key *S-M0-_4 = F4
key *S-M0-_5 = F5
key *S-M0-_6 = F6
key *S-M0-_7 = F7
key *S-M0-_8 = F8
key *S-M0-_9 = F9
key *S-M0-_0 = F10
key *S-M0-HyphenMinus = F11
key *S-M0-EqualsSign = F12

def key JisBackslash = 0x7d
key JisBackslash = Backslash
key S-JisBackslash = $VERTICAL_LINE

key C-Space = $ToggleIME

HHKBを繋いだ時は上の設定、普通キーボードを繋いだ時は下の設定に切り替えてやってます。

どうでもいいこと

2つあるUSBポートが結構便利。

無線マウスレシーバをここに挿してます。

USBメモリを挿したい時もここ。

重量が結構ある。

レッツノート(1.5kg)とこれを一緒に持ち歩くととても重いのと体積が増えるので最近は置きっぱなしなことが多い。

2008-12-23

今年の情報オリンピック予選のこの問題、

冬の寒いある日,JOI太郎君は広場にはった薄氷を割って遊ぶことにした.広場は長方形で,東西方向に m 個,南北方向に n 個,つまり, m × n の区画に区切られている.また,薄氷が有る区画と無い区画がある. JOI太郎君は,次のルールにしたがって,薄氷を割りながら区画を移動することにした.

薄氷があるどの区画からも薄氷を割り始めることができる.

東西南北のいずれかの方向に隣接し, まだ割られていない薄氷のある区画に移動できる.

移動した先の区画の薄氷をかならず割る.

JOI太郎君が薄氷を割りながら移動できる区画数の最大値を求めるプログラムを作成せよ.ただし, 1 ≦ m ≦ 90,1 ≦ n ≦ 90 である.与えられる入力データでは,移動方法は20万通りを超えない.

入力

入力はn+2行ある. 1 行目には整数 m が書かれている. 2 行目には整数 n が書かれている. 3 行目から n+2 行目までの各行には、0 もしくは 1 が, 空白で区切られて m 個書かれており,各区画に薄氷があるか否かを表している.北から i 番目,西からj番目の区画を (i,j) と記述することにすると (1 ≦ i ≦ n, 1 ≦ j ≦ m),第 i+2 行目の j 番目の値は,区画 (i,j) に薄氷存在する場合は 1 となり,区画 (i,j) に薄氷存在しない場合は 0 となる.

のいい最適化の方法が思いつかない。

一応プログラムは書けたけど90*90の時にまともに動く気がしない。

単なる深さ優先検索。

array = [
  [1, 1, 1, 0, 1],
  [1, 1, 0, 0, 0],
  [1, 0, 0, 0, 1]
]
result = []
def get(x, y):
  if (0 <= x < len(array)) and (0 <= y < len(array[0])):
    return array[x][y]
  else:
    return -1
def func(x, y, route):
  route = route[:]
  # print x, y, get(x, y)
  if get(x, y) == 0:
    result.append(route)
    return
  if (x, y) in route:
    return
  route.append((x, y))
  if get(x - 1, y ) >= 0: func(x - 1, y , route)
  if get(x , y + 1) >= 0: func(x , y + 1, route)
  if get(x + 1, y ) >= 0: func(x + 1, y , route)
  if get(x , y - 1) >= 0: func(x , y - 1, route)
func(0, 0, [])
for i in result:
  print i

2008-11-01

書き方テスト

#!/usr/bin/perl -w
use strict;
print <<END;
<html><body>
  <h1>Hello! World.</h1>
</body></html>
END
 class Foo
   def bar'baz' # return baz
   end
 end

2008-10-18

real street angels から mechanize を使って動画を取ってきてEmacsで見てみるよ

せっかく書いたから匿名でのせてみるよ

使い方は

  • 動画を取ってきたいよ
    • config.yamlユーザとかを設定するよ
    • ids.txt に取ってきたいIDを書くよ
    • sangels.bat を実行するよ
  • Emacs動画を見たいよ
    • sangels.el を load するよ
    • M-x sangels だよ

必要なものを gem で取ってくるにはこうすればいいよ

  • gem install -r log4r
  • gem install -r -v 0.6 hpricot
  • gem install -r mechanize

長すぎてelispが消えたから続きがあるよ

sangels.bat - 起動用バッチファイル

@echo off
setlocal
set WD=%~dp0
cd /d %WD%

ruby get_movies.rb
ruby get_images.rb
ruby create_m3u.rb

ruby

config.yaml - 設定ファイル
user: ユーザID
password: パスワード
ids_file: ids.txt
done_file: ids_done.txt
movies_dir: movies

log4r_config:
  pre_config:
    global: INFO
  loggers:
    - name: app
      type: Log4r::Logger
      level: INFO
      outputters:
        - STDOUT
        - FILE
  outputters:
    - name: STDOUT
      type: Log4r::StdoutOutputter
      formatter:
        type: Log4r::PatternFormatter
        pattern: "%d [%l] %C - %M"
        date_pattern: "%H:%M:%S"
    - name: FILE
      type: Log4r::FileOutputter 
      filename: "#{LOGDIR}/sangels.log"
      formatter:
        type: Log4r::PatternFormatter
        pattern: "%d [%l] %C - %M"
        date_pattern: "%Y-%m-%d %H:%M:%S"
get_movies.rb
require 'fileutils'
require 'logger'
require 'mechanize'

BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"
require "#{BASEDIR}/sangels"

$config = load_config(BASEDIR)
prepare_logger(BASEDIR)
$log = new_logger("get_movies")
WWW::Mechanize.log = new_logger("mechanize")
WGet.log = $log

class IDFile
  def initialize(file)
    @file = file
    unless File.exist?(@file)
      Fileutils.touch(@file)
    end
  end

  def ids(contains_comment = nil)
    File.open(@file) {|io|
      io.to_a.map {|x|
        x.chomp
      }.select {|x|
        if x.empty?
          nil
        elsif contains_comment
          true
        else
          not /^\s*\#/ =~ x
        end
      }
    }
  end

  def add(id)
    ids = ids(true)
    unless ids.any? {|x| x == id}
      write(ids + [id])
    end
  end

  def delete(id)
    ids = ids(true)
    if ids.any? {|x| x == id}
      write(ids - [id])
    end
  end

  def write(ids)
    File.open(@file, "w") {|io|
      ids.each {|x| io.puts x}
    }
  end
end


$log.info("BEGIN #{$0} ================")
exit_code = 0
begin
  ids_file = IDFile.new($config.ids_file)
  done_file = IDFile.new($config.done_file)
  movies_dir = $config.movies_dir
  wget = WGet.new

  sangels = SAngels.new
  sangels.login($config.user, $config.password)
  ids_file.ids.each {|id|
    begin
      movies = sangels.movies(id)
    rescue SAngels::Movies::InvalidMoviesError
      $log.warn("invalid movie id: #{id}")
      next
    end
    dir = File.expand_path(id, movies_dir)
    movies.each {|link|
      wget.retrieve(link.href, dir)
    }
    expected = movies.movie_links.map{|x| File.basename(x.href)}
    actual = Dir.glob("#{dir}/*").map {|x| File.basename(x)}
    if (expected - actual).empty?
      done_file.add(id)
      ids_file.delete(id)
    end
  }
rescue => e
  $log.error(e)
  exit_code = 1
end

$log.info("END #{$0} (#{exit_code}) ================")
exit exit_code
get_images.rb
require 'fileutils'
require 'logger'
require 'mechanize'
require 'ostruct'

BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"
require "#{BASEDIR}/sangels"

$config = load_config(BASEDIR)
prepare_logger(BASEDIR)
$log = new_logger("get_images")
WWW::Mechanize.log = new_logger("mechanize")
WGet.log = $log

$log.info("BEGIN #{$0} ================")
exit_code = 0
begin
  movies_dir = $config.movies_dir
  sangels = SAngels.new
  sangels.login($config.user, $config.password)
  thumbnails = sangels.thumbnails

  Dir.glob("#{movies_dir}/*").each {|dir|
    next unless File.directory? dir
    id = File.basename(dir)

    url = thumbnails.url(id)
    unless url
      $log.warn("#{id} is not found")
      next
    end
    path = File.expand_path("00_thumbnail#{File.extname(url)}", dir)
    next if File.exist? path

    $log.info("retrieving #{url}")
    thumbnail = thumbnails.get_file(id)
    File.open(path, "wb") {|io| io.write(thumbnail)}
  }
rescue => e
  $log.error(e)
  exit_code = 1
end

$log.info("END #{$0} (#{exit_code}) ================")
exit exit_code
create_m3u.rb
BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"

$config = load_config(BASEDIR)
movies_dir = $config.movies_dir
Dir.glob("#{movies_dir}/*") {|dir|
  next unless File.directory? dir
  name = File.basename(dir)
  files = Dir.glob("#{dir}/*.wmv").sort

  File.open("#{movies_dir}/#{name}.m3u", "w") {|io|
    files.each {|file|
      io.puts "#{name}/#{File.basename(file)}"
    }
  }

  File.open("#{dir}/00_movies.m3u", "w") {|io|
    files.each {|file|
      io.puts "#{File.basename(file)}"
    }
  }
}
sangels.rb
require 'mechanize'
require 'hpricot'

BASEDIR = File.dirname($0)
require "#{BASEDIR}/util"

class SAngels
  HOST = "real2.s-angels.com"
  LOGIN_URL = "http://#{HOST}/member/"
  INFO_URL = "http://#{HOST}/teigaku/item.php"
  THUMBNAILS_URL = "http://#{HOST}/teigaku/"
  THUMBNAIL_URL = "http://#{HOST}/images/default/thumb/"

  def initialize()
    @agent = WWW::Mechanize.new
  end

  def login(user, password)
    login_form = @agent.get(LOGIN_URL).forms.find {|form|
      form.fields.any? {|field| field.name == "frmLoginid"}
    }
    login_form.frmLoginid = user
    login_form.frmPw = password
    @agent.submit(login_form)
  end

  def movies(id, no_validate = nil)
    Movies.new(@agent, id, !no_validate)
  end

  def thumbnails
    Thumbnails.new(@agent)
  end

  class Thumbnails
    def initialize(agent)
      @agent = agent
      doc = Hpricot(@agent.get_file(THUMBNAILS_URL))
      elems = doc.search("div[@class=realthum]/a")
      @links = Hash(
        elems.map {|elem|
          href = elem["href"]
          id = $1 if /ID=(.+)/ =~ href
          url = elem.search("img")[0]["src"]
          [id, url]
        })
    end

    def get_file(id)
      @agent.get_file(url(id))
    end

    def url(id)
      @links[id]
    end

    def exist?(id)
      url(id)
    end
  end

  class Movies
    class InvalidMoviesError < StandardError
    end

    def initialize(agent, id, no_validate)
      @agent = agent
      @id = id
      if !no_validate &amp;&amp; !valid?
        raise InvalidMoviesError
      end
    end

    def info_page_url
      "#{INFO_URL}?ID=#{@id}"
    end

    def info_page
      @agent.get(info_page_url)
    end

    def movies_page
      @agent.click(info_page.links.find {|link| /P=10/ =~ link.href})
    end

    def movie_links
      movies_page.links.select {|link|
        /wmv$/ =~ link.href
      }.sort {|a, b|
        File.basename(a.href) <=> File.basename(b.href)
      }
    end

    def valid?
      info_page.uri.to_s == info_page_url
    end

    def each(&amp;block)
      orig_links = movie_links
      orig_links.each {|orig_link|
        link = movie_links.find {|l| File.basename(l.href) == File.basename(orig_link.href)}
        block.call(link)
      }
    end
  end
end
util.rb
require 'log4r'
require 'log4r/yamlconfigurator'
require 'singleton'
require 'fileutils'
require 'ostruct'

def Hash(a)
  Hash[*a.flatten]
end

def load_config(basedir)
  OpenStruct.new(File.open("#{basedir}/config.yaml") {|io| YAML.load(io)})
end

def new_logger(name)
  Log4r::Logger.new("app::#{name}")
end

def prepare_logger(basedir, logdir = nil)
  logdir ||= basedir
  Log4r::YamlConfigurator["LOGDIR"] = logdir
  Log4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml")
end

class NullObject
  include Singleton
  def method_missing(message, *arg)
    NullObject.singleton
  end
end

class WGet
  class << self
    attr_accessor :log
    def initialize
      super
      @log = NullObject.singleton
    end
  end
  
  def log
    self.class.log
  end

  def retrieve(url, dir)
    FileUtils.mkdir_p(dir)
    file = File.expand_path(File.basename(url), dir)
    if File.exist?(file)
      log.info("already retrieved #{url}")
      return true
    end

    tmp = "#{file}.part"
    log.info("retrieving #{url}")
    ret = system("wget", "-c", "-O", tmp, url)
    if ret
      log.info("retrieving succeeded #{url}")
      File.rename(tmp, file)
    else
      if $? == 0x020000 # Ctrl-C
        exit($?)
      else
        log.error("retrieving failure #{url} (#{$?})")
      end
    end
    return ret
  end
end

2008-08-06

pythonダメな1つの理由

1. if/while/for/class 文に : (コロン)が必要

例)

while i<5:
    i=i+1
    print i

python はインデント、改行に意味を持たせることをウリとして開発されたわけで、

ここにはインデントがあり、それに意味を持たせられるのだから、: コロンなど必要なはずがない。

Why are colons required for the if/while/def/class statements?

http://www.python.org/doc/faq/general/#why-are-colons-required-for-the-if-while-def-class-statements

(意訳)ボブ「比べてみろよ?こっち

if a==b
    print a

と、こっち

if a==b:
    print a

どっちが読みやすい、スザンヌ?」

スザンヌ「まぁ、2番目のほうが読みやすいわ。」

んなぁことあるかーい!!変わらんわい!!

(追記)ボブ「あとは、英語の文法に似せたってのもあるんだ。」

: (コロン)の後に説明書くにしても10行は書かんだろがーー!!それに、似せたんなら、

if a==b,
    print a

のほうが英語っぽいだろがー!! ってか printprint a. (ピリオド) って書けやそれなら!

中途半端中途半端

2008-03-22

[]Python 2.6だと、オブジェクト辞書のキーに使えない場合がある

Python2.5のときは、新スタイルクラスインスタンス辞書のキーとして必ず使用できたけど、Python 2.6ではそういうわけじゃなくなってるぽい。という話。

class TestClass(object):
    def __init__(self, i_name):
        self._name = i_name

    def __eq__(self, i_other):
        if not isinstance(i_other, TestClass):
            return False
        return self._name == i_other._name

print 'object.__hash__ = ' + str(object.__hash__)
print 'TestClass.__hash__ = ' +str(TestClass.__hash__)

上記のようなコードを実行したら、Python 2.5とPython 2.6で結果が違いました。

Python 2.5の場合の結果。

object.__hash__ = <slot wrapper '__hash__' of 'object' objects>
TestClass.__hash__ = <slot wrapper '__hash__' of 'object' objects>

Python 2.6の場合の結果。

object.__hash__ = <slot wrapper '__hash__' of 'object' objects>
TestClass.__hash__ = None

Python 2.6だと、objectクラス継承すると、__hash__がNoneになっちゃってる。このままだと辞書のキーとして使えないね。object継承したクラスで__hash__を実装すれば、大丈夫みたい。

ハッシュ値の計算方法 (2)」というページも参考になりそう。

2008-03-15

[][]PythonからSWIG経由でVisual Studio 2005を使って困ったこと

以上のような組み合わせで出くわした困ったことと、その解決策をメモしておきます。

setup.py を実行するとエラーが表示された!

Python was built with Visual Studio 2003;

extensions must be built with a compiler than can generate compatible binaries.

Visual Studio 2003 was not found on this system. If you have Cygwin installed,

you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

setup.pyに.iファイルとか.cppファイルを記述して実行すると、こんな感じのエラーメッセージが表示されました。うーん、困った!

http://labs.cybozu.co.jp/blog/mitsunari/2007/08/vc2005boostpython.html

上記のページを参考にして、"%Pythonインストールしたフォルダ%/Lib/distutils/msvcompiler.py"を以下のように修正してみたら解決できました。ありがとうありがとう

--- msvccompiler.py    2007-04-04 17:17:12.000000000 +0900
+++ 
@@ -126,7 +126,7 @@
         self.set_macro("FrameworkDir", net, "installroot")
         try:
             if version > 7.0:
-                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")
+                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0")
             else:
                 self.set_macro("FrameworkSDKDir", net, "sdkinstallroot")
         except KeyError, exc: #
@@ -252,7 +252,10 @@

     def initialize(self):
         self.__paths = []
-        if os.environ.has_key("DISTUTILS_USE_SDK") and os.environ.has_key("MSSdk") and self.find_exe("cl.exe"):
+        if self.__version >= 7.1 or (
+            os.environ.has_key("DISTUTILS_USE_SDK") and
+            os.environ.has_key("MSSdk") and
+            self.find_exe("cl.exe")):
             # Assume that the SDK set up everything alright; don't try to be
             # smarter
             self.cc = "cl.exe"
@@ -288,10 +291,16 @@

         self.preprocess_options = None
         if self.__arch == "Intel":
-            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' ,
-                                     '/DNDEBUG']
-            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX',
-                                          '/Z7', '/D_DEBUG']
+            if self.__version >= 7.1:
+                self.compile_options = [
+                    '/nologo', '/Ox', '/MD',  '/W3', '/EHsc', '/DNDEBUG']
+                self.compile_options_debug = [
+                    '/nologo', '/Od', '/MDd', '/W3', '/EHsc', '/Z7', '/D_DEBUG']
+            else:
+                self.compile_options = [
+                    '/nologo', '/Ox', '/MD',  '/W3', '/GX',  '/DNDEBUG']
+                self.compile_options_debug = [
+                    '/nologo', '/Od', '/MDd', '/W3', '/GX', '/Z7', '/D_DEBUG']
         else:
             # Win64

cl.exeが見つからないと言われた!

setup.pyを実行するとcl.exeが見つからないみたいなエラーが表示されました。これは、アレだ。「パス通せ!」ということですね。bashを起動するときのバッチファイル(たぶん"cygwin.bat"とか)で、以下のような行を入れてやれば解決しました。

call "%VS80COMNTOOLS%vsvars32.bat"

setup.pyを実行したときに"basetsd.h"が開けないと言われた!

d:\python25\include\pyconfig.h(189) : fatal error C1083: include ファイルを開けません。'basetsd.h': No such file or directory

error: command 'cl.exe' failed with exit status 2

setup.pyを実行すると、上のようなエラーが表示されました。

http://d.hatena.ne.jp/ousttrue/20070531/1180556273

上記のサイトを見るとインクルードパスが通っていない場所に"basetsd.h"があるのが原因なので、"cygwin.bat"にインクルードパスの設定をしておきました。

call "%VS80COMNTOOLS%vsvars32.bat"
set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include;%INCLUDE%

setup.pyを実行したときのリンク時にエラーが発生した!

link: extra operand `/INCREMENTAL:NO'

詳しくは `link --help' を実行して下さい.

error: command 'link.exe' failed with exit status 1

これは、cygwinのほうのlink.exeが実行されてるのが原因でした。スマートな解決策ではありませんが、cygwinのほうのlink.exeをリネームして解決。パスの設定順序とかでどうにかできるといいんだけど、どうすればいいんかな。

MSVCR80.dllが見つからないと言われた!

MSVCR80.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションインストールし直すとこの問題は解決される場合があります。

SWIGが生成した.pyファイルをimportしたら、こんな感じのエラーダイアログが表示されたよ。うーん、困った!

http://d.hatena.ne.jp/moriyoshi/20070525

上記のページを参考にして、"%Pythonインストールしたフォルダ%/python.exe.manifest"として以下のようなファイルを新しく作ったら、解決できました。ありがとうありがとう

あとこれ、bashから実行したらエラーダイアログが表示されず、importするモジュールが見つからないみたいなエラーメッセージが出力されるだけだったよ。

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

2008-02-09

なんとなく目についたから

すっごい前の記事だけど。

http://anond.hatelabo.jp/20071110221822:title

はじめはRubyで書こうと思ったけど挫折した。だれかRubyで書いてくれないかな・・・。

ruby だとこんな感じじゃないでしょうか。

# 問3だけ。pythonコードコピペ

関数オブジェクトなのに引数にできないの?なんで?

ruby には関数はないです(多分)。全部メソッド。で、関数に見えるのはトップレベルにある Kernel オブジェクトのメソッド。メソッドを変数にして実行したいなら、method オブジェクトを作るか、send メソッドを使ってメッセージパッシングすればいい。でも普通 proc を使うと思う。

def foldr(callee, lst, obj)
    if lst.empty?
        obj
    else
        callee.call(lst[0], foldr(callee, lst[1..-1], obj))
    end
end

def apply(callee, obj)
    callee.call(obj)
end

def plus5(num)
    num + 5
end

def times10(num)
    num * 10
end

def divide2(num)
    num / 2
end

foldr(method(:apply), [:plus5, :times10, :divide2].map{|m| method(m)}.reverse, 10)
foldr(method(:apply), ([:plus5, :times10].map{|m| method(m)} + [lambda {|num| num / 2}]).reverse, 10)

2007-12-10

プローチが腐ってるのかもしれないなあ

なんかデーターが見つからない危険性を感じるというか。ファイルがでかいからreadlinesとか使いたくないんだけれども無理かな。

class Id_sorted_data
  def initialize path, avarage_bytes_by_one_data, search_margin
    @f = File.open(path);
    @v = avarage_bytes_by_one_data;
    @cash = {};
    @margin = search_margin;
    return self
  end
  def read number
    if @cash.member?(number)
      return @cash[number];
    end
    @f.seek([(number - @margin) * @v, 0].max);
    for i in 1..20
      @f.readline;
      temp = @f.readline;
      @cash[temp.to_i] = temp;
      if temp.to_i == number
        return @cash[number];
      elsif (number - @margin .. number).include?(temp.to_i)
        return near(number);
      end
      @f.seek((number - temp.to_i - @margin) * (@v * (20 - i) / 20), IO::SEEK_CUR);
    end
  end
  def near number
    for i in 1..@margin
      temp = @f.readline;
      @cash[temp.to_i] = temp;
      if temp.to_i == number
        return @cash[number];
      end
    end
  end
end

2007-11-10

関数プログラミングにおけるFizzBuzz問題

いくつか考えてみた

(問1)高階関数再帰関数を必ず使って数値を要素とするリストの要素の総和を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。

(問2)二つの引数をとり二つのうち大きいほうを返す関数高階関数再帰関数をつかって数値のリストの最大値を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。

というのは簡単すぎるか?簡単すぎるなら

(問3)高階関数再帰関数を必ず使ってある数値に5を足し、10かけて2で割った数を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。

こっちの方がいいかな。でもトリッキーすぎる気もする。

一応問題を出したので、SchemePythonで自分で想定している答えを書いておいた。はてなではSchemeが人気のようなので、あまり知らなかったけど関数言語ではSchemeで書いておいた。Pythonで書くのはSchemeだけだとわかりにくいので、なにかスクリプト言語で書いておこうと思ったから。Rubyの方が人気なので、はじめはRubyで書こうと思ったけど挫折した。だれかRubyで書いてくれないかな・・・。コードオブジェクトってなによ。というか関数オブジェクトなのに引数にできないの?なんで?(以下疑問と愚痴の嵐なので略)Perlは古株が多くてユーザー数も多そうだけど、・・・その・・・無理です・・・。あの言語仕様はやる気がしない。ぶっちゃけ理解できない。Pythonを知らないひとは多そうだけど、知らなくてもSchemeよりは感じは掴めると思うのでPythonでも書いておくことにした。

Scheme

http://anond.hatelabo.jp/20071110215936

Python

http://anond.hatelabo.jp/20071110220132

これで大部分のひとがこの問題に興味をもたなくて解答するひとがいなくても、興味を持ったひとは安心だね!

追記:

問3で次のは無しとしておきたい。

Scheme

(define continuous-apply
    (lambda (lst obj)
        (cond
            ((null? lst)
                obj)
            (else
                (continuous-apply (cdr lst) ((car lst) obj))))))

(define plus5
    (lambda (num)
        (+ num 5)))

(define times10
    (lambda (num)
        (* num 10)))

(define divide2
    (lambda (num)
        (/ num 2)))

(define plus5-times10-divide2
    (lambda (num)
        (continuous-apply (list plus5 times10 divide2) num)))

(plus5-times10-divide2 2)

Python

def continuousApply(lst, obj):
    if lst:
        return continuousApply(lst[1:], lst[0](obj))
    else:
        return obj

def plus5(num):
    return num + 5

def times10(num):
    return num * 10

def divide2(num):
    return num / 2

def plus5_times10_divide2(num):
    return continuousApply([plus5, times10, divide2], 2)

plus5_times10_divide2(2)

pythonによる解答

Rubyと違って空のリスト配列?)は偽。

(問1)


def foldl(func, obj, lst):
    if lst:
        return foldl(func, func(obj, lst[0]), lst[1:])
    else:
        return obj

def plus(num1, num2):
    return num1 + num2

def mySum(lst):
    return foldl(plus, lst[0], lst[1:])

・例

mySum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])


(問2)

def foldl(func, obj, lst):
    if lst:
        return foldl(func, func(obj, lst[0]), lst[1:])
    else:
        return obj

def large(num1, num2):
    if num1 >= num2:
        return num1
    else:
        return num2

def myMax(lst):
    return foldl(large, lst[0], lst[1:])

・例

myMax([34, 55, 77, 1, 2, 3, 4, 100, 98])

(問3)

def foldr(func, lst, obj):
    if lst:
        return func(lst[0], foldr(func, lst[1:], obj))
    else:
        return obj

def myApply(func, obj):
    return func(obj)

def plus5(num):
    return num + 5

def times10(num):
    return num * 10

def divide2(num):
    return num / 2

def plus5_times10_divide2(num):
    funcList = [plus5, times10, divide2]
    funcList.reverse()
    return foldr(myApply, funcList, num)

・例

plus5_times10_divide2(5)


(参考)

def makeProceduce(lst):
    lst.reverse()
    return lambda num: foldr(myApply, lst, num)

・例

divide2_plus5_times10 = makeProceduce([divide2, plus5, times10])
divide2_plus5_times10(4)

2007-11-09

Pythonではなぜ string.len() でなく len() なのか?

http://anond.hatelabo.jp/20071021143442

その理由は知らないが、なければ作ればいいじゃないか。

class MyString(str):
    def length(self):
        return len(self)

というクラスを作って

string = MyString("Hello world")
print string.count("o"), string.length()

Rubyライクにやれば

2 11

とでるよ。え、リストもlist.length()が使いたいって?それも簡単。

class MyList(list):
    def length(self):
        return len(self)

l = MyList([1, 2, 3, 4, 5, 6])
l.length()

6

きちんと他のメソッドも使えるよ。

l[1:]

[2, 3, 4, 5, 6]

l.reverse()
l

[6, 5, 4, 3, 2, 1]

ね。簡単でしょ。

Pythonは仕組みが統一されているものが多いので、いじりやすいのですよ。上の例のやつは組み込みクラスオブジェクトユーザー定義のクラスオブジェクトがおおむね統一されているからこそ簡単にできる。他にも関数なんかもほかのオブジェクトと同じオブジェクトなので、高階関数なんてもの簡単に作ることができて関数プログラミングぽくできる。例えば今はなきapply関数なんかは

def myApply(func, *args):
    return func.__call__(*args)

と定義できる。実際に

def sumUpThree(num1, num2, num3):
    return num1 + num2 + num3

でためしてみる。

myApply(sumUpThree, 1, 2, 3)

結果はちゃんと

6

とでる。将来廃止されそうなmap関数も簡単に定義できる。他にも複数の引数をもつ関数の部分適用のようなことを行う関数も次のように簡単に定義できる。

def partial(func, *oldArgs):
    def wrapper(*newArgs):
        return func.__call__(*(oldArgs + newArgs))
    return wrapper

sumUpThree関数テストすると

sum_1 = partial(sumUpThree, 1)
sum_1(2, 3)

6

sum_1_5 = partial(sum_1, 5)
sum_1_5(9)

15

sum_10_20 = partial(sumUpThree, 10, 20)
sum_10_20(30)

60

こういう風に高階関数が簡単にできるのは関数オブジェクト関数の実行とはメソッドの呼び出しにすぎないからだ。以上のように組み込みオブジェクトユーザー定義オブジェクトの差があまりないことや関数オブジェクトであることに見られるようにPythonは仕組みが統一されていてシンプルだ。そのためひとつのことがわかれば他のこともわかることが多いし、簡単にいじることもできる。

だからなければpythonをいじればいいと思うよ。

最後にラムダ式信者のためにpartialをラムダ式を使って書いておく。

def partial(func, *oldArgs):
    return lambda *newArgs:func.__call__(*(oldArgs + newArgs))

Pythonラムダ式がだめだといわれているが、こんな風にかけたとして何がうれしいというのだ。

2007-10-14

速学Ruby railsを使うための最小限の知識

前置き

本講座ではほかの言語は触ったことがあるが、Ruby未経験者を対象にRailsを触るための最小限のrubyの知識を身につけるためのものである。

と、堅苦しく書いたけど仕事で急いでrailsを触れうようになるための最低限の情報だけをまとめてみたよ。

これを読んだだけではRubyプログラムを書けるようにはならないと思うけど、Railsを使った開発だといきなり何もできないってことはなくなるはずだよ。

肩の力を抜いて読んでほしいな。

基本のお話

変数宣言

Rubyでは特別に変数の宣言は必要ないんだ。

いきなり今まで宣言していない名前を使ってもおこらえないよ。

answer_to_life_the_universe_and_everything = 42 
# answer_to_life_the_universe_and_everything ????~A~S??~S????~H~]??~A????~Y??| ??~A~Y??~K??~B

なんて書いても問題ないんだ。

静的言語をやってきた人には型の宣言がないことに違和感を感じる人もいるかもしれないけど、Rubyでは型はあんまり気にしないんだ。

int x = HogeHoge.new

みたいな書き方では

変数xを用意してそこにHogeHoge.newを代入する。といった説明を受けたと思う。

でもRubyではちょっと違う考え方をするんだ。

x = Foo.new

だとFoo.new変数を用意して、それを名前に"束縛"するって説明することが多いよ。

ベルが貼られた箱を用意してそこに何かを入れるか、何かが入った箱を用意してそれにラベルを張るかの違いだね。後者のほうがちょっとだけ柔軟なんだ。

そして、柔らかいほうがRuby流って気がするよ。

でもそんなRubyでもちょっとだけ名前に関するルールがある。

大文字からはじまる名前はクラス

小文字からはじまる名前が局所変数

@からはじまるのがインスタンス変数

@@からはじまるのがクラス変数

ってルールだよ。

Railsだったらとりあえず@からから始まる名前にしておけばたいていは問題ないんじゃないのかな。

分岐分岐

JavaC言語ではif文なんかをよく使うよね。Rubyでもほとんど一緒だよ。

 if something_condition
  do_some_thing
elsif other_condition
  do_another_thing
else
  do_something_if_you_wont
end

もちろんelsifやelseが必要なければ省略することができるよ。

ほかにもRubyには便利な分岐の書き方があるよ。

so_some_thing if some_condition

みたいに後置でも書けるんだ。

どっちでも好きなほうを使えばいいと思うよ

関数宣言

関数宣言のとてもシンプルなんだ。

def func_name ( some_val_names )
  do_some_thing
end

といった感じでdef..endでくくるだけで簡単に関数を宣言できるよ

そして関数戻り値は最後に評価した値が自動的に戻り値になるんだ。

def baz 
  10
end

これは常に10を返す関数の例だよ。

Hash,Array

プログラムをしていて非常によく使うデータの型といえば配列(Array)や連想配列(Hash)だよね。

Rubyではそれらを簡潔に使うために専用の文法を用意している。

それが[]と{}だ。

arr = [1,2,3,"A","B","CDE"]         #??~M很~W宣訾@
has = {1 => "A",2 => "B", 3 => "C"} #??~O??~C????~CťΣ訾@
puts arr[3]
puts has[2]
A
B

とすれば簡単に配列ハッシュが宣言できるよ。

アクセス方法もほかの言語と大きく変わらないのが分かるよね。

ログイン ユーザー登録
ようこそ ゲスト さん