はてなキーワード: defとは
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
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)
09. GOOD MORNING BABY - やけのはら (YouTube)
10. 捕食 - asa x CUBEc.u.g.p (YouTube)
"捕食-hoshoku-", 06.11. Jar-BeatRecord
11. イッちゃってイイ? (SUGAR CRACK REMIX) - SD JUNKSTA (YouTube)
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)
15. 音楽ワルキューレ - DOTAMA (YouTube)
Produced by Fragment
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
20. STRAIGHT CASH - YING YANG (YouTube)
"TOTAL ECLIPSE", 10.13. YING YANG PRODUCTION
21. ILLMATIC RACER feat. 来門 - UNDER BROS (YouTube)
Produced by TAKE-C
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
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)
"THE SHELL", 07.29. FILE RECORDS
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()
以下の記事を読んだ私は違和感を覚えた。
今時のソフトウェア技術者というものは未だにこんな判定処理を書いているというのか。やはり遅れているとしか言いようが無い。
闇プログラマー界隈ではその一歩後ろ右斜め奥をいっている。
うるう年の判定とはこうやるのだ。
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年までうるう年の判定ができる。
この程度で一端のソフトウェア技術者を名乗るなど、業界そのものが甘く見られたものだ。
なんか色々レスがついて嬉しいですねw
FizzBuzz問題って一般的に、3の倍数と5の倍数以外の場合は数字を表示しないと駄目だよ
それは知りませんでした。
後、def文の中で再帰してるけど、これ、馬鹿でかい数入れたらメモリ使い切らないか?
Phythonは詳しくないから、嘘言ってるかも知れないけど
他には、何も15で場合分けしなくても、改行しなければ3の倍数と5の倍数とそれ以外で済むから
剰余演算の回数が減る
この辺はいかにも興味が無い領域ですねw
メモリは多分使い切ると思いますが、使い切った場合とかめんどくさくて考えたくないです。
他には、何も15で場合分けしなくても、改行しなければ3の倍数と5の倍数とそれ以外で済むから
剰余演算の回数が減る
これも興味ないですね…。計算回数って、数学(数理モデル)を計算機に乗せたから出てきた問題で、実用上は重要だけど数学としてはどうでもいいなあって思っちゃいます。
JRuby上で動くRubyとJavaのログを同じファイルに保存したいときなど
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
元ネタ 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とかではうまく動かない。あとシグナルとか使った方が良いのかもしれない。
ヒマがあったら他の関数とかも実装してみたいかも。
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)
最初のあなた。
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
できた。
def every_case(arr, *args) if(arr.length>1) arr.each do |elm| #
だいぶ前のことなので結構忘れてるけど。
買ったのはHHKBPro2。OSはWindowsVista
背面のスイッチをいじってキーを変える。
http://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html
左◇ | Fn |
右◇ | Win |
Delete | Backspace |
左◇あたりに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
どこかで見た設定をベースにいじったような気がしますがどこのがベースか忘れた。
自分は左◇キーを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を繋いだ時は上の設定、普通のキーボードを繋いだ時は下の設定に切り替えてやってます。
USBメモリを挿したい時もここ。
重量が結構ある。
今年の情報オリンピック予選のこの問題、
冬の寒いある日,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
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものを gem で取ってくるにはこうすればいいよ
長すぎてelispが消えたから続きがあるよ
@echo off setlocal set WD=%~dp0 cd /d %WD% ruby get_movies.rb ruby get_images.rb ruby create_m3u.rb
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"
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
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
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)}" } } }
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 && !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(&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
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
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
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)」というページも参考になりそう。
以上のような組み合わせで出くわした困ったことと、その解決策をメモしておきます。
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
setup.pyを実行するとcl.exeが見つからないみたいなエラーが表示されました。これは、アレだ。「パス通せ!」ということですね。bashを起動するときのバッチファイル(たぶん"cygwin.bat"とか)で、以下のような行を入れてやれば解決しました。
call "%VS80COMNTOOLS%vsvars32.bat"
d:\python25\include\pyconfig.h(189) : fatal error C1083: include ファイルを開けません。'basetsd.h': No such file or directory
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%
link: extra operand `/INCREMENTAL:NO'
詳しくは `link --help' を実行して下さい.
これは、cygwinのほうのlink.exeが実行されてるのが原因でした。スマートな解決策ではありませんが、cygwinのほうのlink.exeをリネームして解決。パスの設定順序とかでどうにかできるといいんだけど、どうすればいいんかな。
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>
すっごい前の記事だけど。
http://anond.hatelabo.jp/20071110221822:title
ruby だとこんな感じじゃないでしょうか。
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)
なんかデーターが見つからない危険性を感じるというか。ファイルがでかいから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
Pythonではなぜ string.len() でなく len() なのか?
string = MyString("Hello world")
class String def len self.length end end print "Ruby on Rails".len #=> 13
いくつか考えてみた
(問1)高階関数と再帰関数を必ず使って数値を要素とするリストの要素の総和を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。
(問2)二つの引数をとり二つのうち大きいほうを返す関数と高階関数、再帰関数をつかって数値のリストの最大値を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。
というのは簡単すぎるか?簡単すぎるなら
(問3)高階関数と再帰関数を必ず使ってある数値に5を足し、10かけて2で割った数を求める関数を書け。ただし高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。
こっちの方がいいかな。でもトリッキーすぎる気もする。
一応問題を出したので、SchemeとPythonで自分で想定している答えを書いておいた。はてなではSchemeが人気のようなので、あまり知らなかったけど関数言語ではSchemeで書いておいた。Pythonで書くのはSchemeだけだとわかりにくいので、なにかスクリプト言語で書いておこうと思ったから。Rubyの方が人気なので、はじめはRubyで書こうと思ったけど挫折した。だれかRubyで書いてくれないかな・・・。コードオブジェクトってなによ。というか関数はオブジェクトなのに引数にできないの?なんで?(以下疑問と愚痴の嵐なので略)Perlは古株が多くてユーザー数も多そうだけど、・・・その・・・無理です・・・。あの言語仕様はやる気がしない。ぶっちゃけ理解できない。Pythonを知らないひとは多そうだけど、知らなくてもSchemeよりは感じは掴めると思うのでPythonでも書いておくことにした。
http://anond.hatelabo.jp/20071110215936
http://anond.hatelabo.jp/20071110220132
これで大部分のひとがこの問題に興味をもたなくて解答するひとがいなくても、興味を持ったひとは安心だね!
追記:
問3で次のは無しとしておきたい。
(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)
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)
(問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)
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
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))
本講座ではほかの言語は触ったことがあるが、Ruby未経験者を対象にRailsを触るための最小限のrubyの知識を身につけるためのものである。
と、堅苦しく書いたけど仕事で急いでrailsを触れうようになるための最低限の情報だけをまとめてみたよ。
これを読んだだけではRubyでプログラムを書けるようにはならないと思うけど、Railsを使った開発だといきなり何もできないってことはなくなるはずだよ。
肩の力を抜いて読んでほしいな。
いきなり今まで宣言していない名前を使ってもおこらえないよ。
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だったらとりあえず@からから始まる名前にしておけばたいていは問題ないんじゃないのかな。
JavaやC言語では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を返す関数の例だよ。
プログラムをしていて非常によく使うデータの型といえば配列(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