utf8なテキストをコマンドプロンプトで表示する

rails勉強会のときに、「windowsにrailsを入れた場合、ログをコマンドプロンプトで見ると日本語が化けるよね」というような話がありました。



railsは素人ですが、そんな話ならお役に立てます(笑)



ng.PNG
ok.PNG


右(下)のようになればよいわけですよね?



手順。

・コマンドプロンプトの左上のアイコンをクリックして、プロパティでフォントを日本語フォントにする

cmdfont.PNG


・chcp 65001 でコードページをutf8にする。



ok.PNG


出来上がり。お役に立てば幸いです。

||=での初期化

あんまり初歩的な話を書くのも恥ずかしいのですが。

なーに、いつかすごいプログラマと呼ばれた頃には、「あのもぎゃさんにもこんな頃があったのね!」って感動される材料になるのさ♪


while true
foo ||= 0; foo += 1; puts foo; break if foo > 99
end



foo ||= 0 ってなに?そんな演算子はないよね?



…そうすると、これがパーサー(仮想マシン?Rubyの中の人^^;)からどう見えるかというと、たぶん、まず||が評価される。



fooは未定義なので、ここでのfooはfalse。orだから、falseだったら次を評価するはずで。

つぎって、”=0″。 orで評価している途中ですが、そこに0を代入。どこに代入???



と思ってリファレンスマニュアルをみていたら、書いてあった。

Rubyリファレンスマニュアル – 演算子式

foo += 12       # foo = foo + 12
a ||= 1         # a が偽か未定義ならば1を代入。初期化時のイディオムの一種。



ああ。なるほど。

つまり、foo ||= 0は

foo = foo || 0

こう評価されて、fooが未定義の場合、評価したらfalseだから、後ろが評価された0をfooに代入する。次にループで回ってきたときはfooが定義されているから、foo=fooとなって、実質何もしない。結果として変数の初期化ができる、と。



おお。ナルホド。勉強になりました。

「明日10時」「来週火曜日」で日付を扱うライブラリHumanDate

本日はITpro Challenge!でライトニングトークをさせていただきました。

pdfファイル
HumanDate.pdf
HumanDate.rbのgemファイル。
HumanDate-0.0.1.gem
あと、プレゼンで紹介した、HumanDateをつかって携帯電話(というか電子メール)からGoogleカレンダーに登録するスクリプトはこちら。
pop3togcal.rb
このスクリプトを
cronで定期的に呼び出すようにすることで、
設定したメールアドレスのメールをチェックしにいって、
該当するメールがあればgoogle calendar apiをつかってGoogleカレンダーに登録するようになっています。
なお、このスクリプトは
zorioの日記 – メールからGoogle Calendarに登録するサンプル
を元にさせていただきました。素敵なコード、どうもありがとうございます。
(追記 2007-09-08 08:28:27)
maeda.na@はてな – ITpro Challenge!のメモとか

古川氏のカレンダライブラリはいいと思う。

いえぇ~っ!そうそうたるメンバーに囲まれてどうしようかと思っていたのですが、このお言葉はうれしいです。
ライトニングトーク中毒になってしまいそうだ(笑)

pukiwikiのファイル名を文字列に変換 by ruby

pukiwikiのファイル名について
attachの中の余分なファイルを消したいと思っているのですが、
CBE2CBA1B7BFBCEDBEEC_A5DEA5B8A5C3A5AFA5A2A5EDA1BCB3CEBBA62E786C73
↑のようなファイル名ばかりなのでどれが不要でどれが必要なのかわからなくて困っています。
こういったよくわからない文字の羅列を普通のファイル名に戻すといったことはできないでしょうか?

ということで、perlのコードが紹介されている。
自分も変換する必要に迫られたので、rubyのコードを書いてみた。

require 'kconv'
Dir.foreach("./euc/") {|inputFileName|
if File.file?("./euc/"+inputFileName)
#出力ファイル名(デコードしておく)
outputFileName = inputFileName.scan(/([0-9A-F]{2})/).map{|a| a[0].hex.chr}.flatten.join("").gsub(/\//,'_')+".txt"
File::open("./euc/"+inputFileName) {|inputFile|
File::open("./sjis/"+outputFileName,'w'){|outputFile|
inputFile.each {|line|
#ついでに、文字コードをsjisに変換
outputFile.print line.kconv(Kconv::SJIS,  Kconv::EUC)
outputFile.print "\n"
}
}
}
end
}

日本語のファイル名がうまく戻せていないのは、linuxマシン上のファイルシステムの問題かこのコードの問題かちょっとわからない。

定数の中身が書き換えられてしまう?

p1rubyで定数の中身が書き換えられてしまう?

>
$ irb
irb(main):001:0> TESTSTR=”apple orange”
=> “apple orange”
irb(main):002:0> teststr=TESTSTR
=> “apple orange”
irb(main):003:0> teststr.gsub!(‘apple’,’banana’)
=> “banana orange”
irb(main):004:0> TESTSTR
=> “banana orange”
<>
$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6]
<>
$ irb
irb(main):001:0> TESTSTR=”apple orange”
=> “apple orange”
irb(main):002:0> TESTSTR.gsub!(‘apple’,’banana’)
=> “banana orange”
<>
irb(main):003:0> TESTSTR=”hogehoge”
(irb):3: warning: already initialized constant TESTSTR
=> “hogehoge”
<<
 つまり、オブジェクトごと置き換えようとしたときはエラーになるけど、オブジェクトの中身は変更可能ということでしょうか。うーん。
#しょうがないのでyahooメールでMLに入って相談することにした。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43777

rails勉強日記2

>
なんとなくはわかるのだけど、この、前に:のついた書き方って何なのでしょう?
わかっていなくても話が前に進むのがちょっと気持ち悪い。
<>
Ruby入門初心者が最初に戸惑うのが、”:”コロンで始まる表記のsymbolかも知れません。

この”:”コロンで始まる表記は「シンボル」と呼ばれるオブジェクトです。正確に言うと「symbolクラスのインスタンスを表現するシンボルリテラル」で、文字列と同じように文字情報を表現しています。違いは、先ほどのStringは自分自身の値を変更可能でしたが、Symbolは値を変更できないという点です。
<<
 なるほど。確かにこれ、いい本ですね。挿絵が読みにくいのを何とかしていただきたかったのですけど。
Rubyリファレンスマニュアル – Symbol
Lost-Season: Rubyのシンボル

rails勉強日記

すっごいいまさらですが、railsの勉強をする必要ができたので、日記をつけることにします。
教科書はこちら。
[rakuten:book:11875045:detail]
実況中継形式だったので、実際にやってみるのが早いか、と思いました。
p1インストール
FreeBSDの環境はあるのですが、まあ手元にあった方が何かと便利だと思いますので、Windowsに入れます。
[[RubyInstaller:http://rubyinstaller.rubyforge.org/wiki/wiki.pl]]からruby186-25.exeをインストール。
RubyGemsを入れようと思ったのだけれど、RubyInstallerでインストールされたみたいだったので、そのまま行きます。

>
C:\WINDOWS\system32>sqlite3.exe
SQLite version 3.4.0
Enter “.help” for instructions
sqlite> exit
…> ;
SQL error: near “exit”: syntax error
sqlite> .exit
C:\WINDOWS\system32>sqlite3.exe -v
sqlite3.exe: unknown option: -v
Use -help for a list of options.
C:\WINDOWS\system32>sqlite3.exe –version
3.4.0
C:\WINDOWS\system32>gem install sqlite3-ruby
Select which gem to install for your platform (i386-mswin32)
1. sqlite3-ruby 1.2.1 (mswin32)
2. sqlite3-ruby 1.2.1 (ruby)
3. sqlite3-ruby 1.2.0 (mswin32)
4. sqlite3-ruby 1.2.0 (ruby)
5. Skip this gem
6. Cancel installation
1
Successfully installed sqlite3-ruby-1.2.1-mswin32
Installing ri documentation for sqlite3-ruby-1.2.1-mswin32…
Installing RDoc documentation for sqlite3-ruby-1.2.1-mswin32…
E:\tmp>gem install rails –include-dependencies –version 1.1.2
Need to update 21 gems from http://gems.rubyforge.org
…………………
complete
Successfully installed rails-1.1.2
Successfully installed activesupport-1.3.1
Successfully installed activerecord-1.14.2
Successfully installed actionpack-1.12.1
Successfully installed actionmailer-1.2.1
Successfully installed actionwebservice-1.1.2
Installing ri documentation for activesupport-1.3.1…
While generating documentation for activesupport-1.3.1
… MESSAGE: Unhandled special: Special: type=17, text=”
… RDOC args: –ri –op D:/ruby/lib/ruby/gems/1.8/doc/activesupport-1.3.1/ri –quiet lib
(continuing with the rest of the installation)
Installing ri documentation for activerecord-1.14.2…
Installing ri documentation for actionpack-1.12.1…
While generating documentation for actionpack-1.12.1
… MESSAGE: Unhandled special: Special: type=17, text=”
… RDOC args: –ri –op D:/ruby/lib/ruby/gems/1.8/doc/actionpack-1.12.1/ri –quiet lib
(continuing with the rest of the installation)
Installing ri documentation for actionmailer-1.2.1…
Installing ri documentation for actionwebservice-1.1.2…
Installing RDoc documentation for activesupport-1.3.1…
Installing RDoc documentation for activerecord-1.14.2…
Installing RDoc documentation for actionpack-1.12.1…
Installing RDoc documentation for actionmailer-1.2.1…
Installing RDoc documentation for actionwebservice-1.1.2…
<>
C:\WINDOWS\system32>cd E:\tmp
C:\WINDOWS\system32>e:
E:\tmp>mkdir schduler
E:\tmp>cd schduler
E:\tmp\schduler>cd ../
E:\tmp>rmdir schduler
E:\tmp>rails scheduler –database=sqlite3
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create script/process
create test/fixtures
create test/functional
create test/integration
create test/mocks/development
create test/mocks/test
create test/unit
create vendor
create vendor/plugins
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create Rakefile
create README
create app/controllers/application.rb
create app/helpers/application_helper.rb
create test/test_helper.rb
create config/database.yml
create config/routes.rb
create public/.htaccess
create config/boot.rb
create config/environment.rb
create config/environments/production.rb
create config/environments/development.rb
create config/environments/test.rb
create script/about
create script/breakpointer
create script/console
create script/destroy
create script/generate
create script/performance/benchmarker
create script/performance/profiler
create script/process/reaper
create script/process/spawner
create script/process/inspector
create script/runner
create script/server
create script/plugin
create public/dispatch.rb
create public/dispatch.cgi
create public/dispatch.fcgi
create public/404.html
create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
E:\tmp>cd scheduler
<>
E:\tmp\scheduler>dir
ドライブ E のボリューム ラベルは ローカル ディスク です
ボリューム シリアル番号は D048-737D です
E:\tmp\scheduler のディレクトリ
2007/07/20 08:44 .
2007/07/20 08:44 ..
2007/07/20 08:44 app
2007/07/20 08:44 components
2007/07/20 08:44 config
2007/07/20 08:44 db
2007/07/20 08:44 doc
2007/07/20 08:44 lib
2007/07/20 08:44 log
2007/07/20 08:44 public
2007/07/20 08:44 307 Rakefile
2007/07/20 08:44 8,001 README
2007/07/20 08:44 script
2007/07/20 08:44 test
2007/07/20 08:44 tmp
2007/07/20 08:44 vendor
2 個のファイル 8,308 バイト
14 個のディレクトリ 24,802,045,952 バイトの空き領域
E:\tmp\scheduler>take -T
‘take’ は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
E:\tmp\scheduler>rake -T
(in E:/tmp/scheduler)
rake db:fixtures:load # Load fixtures into the current environment’s d
tabase. Load specific fixtures using FIXTURES=x,y
rake db:migrate # Migrate the database through scripts in db/mig
ate. Target specific version with VERSION=x
rake db:schema:dump # Create a db/schema.rb file that can be portabl
used against any DB supported by AR
rake db:schema:load # Load a schema.rb file into the database
rake db:sessions:clear # Clear the sessions table
rake db:sessions:create # Creates a sessions table for use with CGI::Ses
ion::ActiveRecordStore
rake db:structure:dump # Dump the database structure to a SQL file
rake db:test:clone # Recreate the test database from the current en
ironment’s database schema
rake db:test:clone_structure # Recreate the test databases from the developme
t structure
rake db:test:prepare # Prepare the test database and load the schema
rake db:test:purge # Empty the test database
rake doc:app # Build the app HTML Files
rake doc:clobber_app # Remove rdoc products
rake doc:clobber_plugins # Remove plugin documentation
rake doc:clobber_rails # Remove rdoc products
rake doc:plugins # Generate documation for all installed plugins
rake doc:rails # Build the rails HTML Files
rake doc:reapp # Force a rebuild of the RDOC files
rake doc:rerails # Force a rebuild of the RDOC files
rake log:clear # Truncates all *.log files in log/ to zero byte
rake rails:freeze:edge # Lock to latest Edge Rails or a specific revisi
n with REVISION=X (ex: REVISION=4021) or a tag with TAG=Y (ex: TAG=rel_1-1-0)
rake rails:freeze:gems # Lock this application to the current gems (by
npacking them into vendor/rails)
rake rails:unfreeze # Unlock this application from freeze of gems or
edge and return to a fluid use of system gems
rake rails:update # Update both configs, scripts and public/javasc
ipts from Rails
rake rails:update:configs # Update config/boot.rb from your current rails
nstall
rake rails:update:javascripts # Update your javascripts from your current rail
install
rake rails:update:scripts # Add new scripts to the application script/ dir
ctory
rake stats # Report code statistics (KLOCs, etc) from the a
plication
rake test # Test all units and functionals
rake test:functionals # Run the functional tests in test/functional
rake test:integration # Run the integration tests in test/integration
rake test:plugins # Run the plugin tests in vendor/plugins/**/test
(or specify with PLUGIN=name)
rake test:recent # Test recent changes
rake test:uncommitted # Test changes since last checkin (only Subversi
n)
rake test:units # Run the unit tests in test/unit
rake tmp:cache:clear # Clears all files and directories in tmp/cache
rake tmp:clear # Clear session, cache, and socket files from tm
/
rake tmp:create # Creates tmp directories for sessions, cache, a
d sockets
rake tmp:pids:clear # Clears all files in tmp/pids
rake tmp:sessions:clear # Clears all files in tmp/sessions
rake tmp:sockets:clear # Clears all files in tmp/sockets
E:\tmp\scheduler>ruby script\generate migration create_schedules
create db/migrate
create db/migrate/001_create_schedules.rb
<>
class CreateSchedules < ActiveRecord::Migration
def self.up
create_table(:schedules) do |table|
table.column(:datatime, :timestamp)
table.column(:title, :string)
table.column(:content, :text)
end
end
def self.down
drop_table(:schedules)
end
end
<>
E:\tmp\scheduler>rake db:migrate –trace
(in E:/tmp/scheduler)
E:0:Warning: require_gem is obsolete. Use gem instead.
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
== CreateSchedules: migrating =================================================
— create_table(:schedules)
-> 0.0600s
== CreateSchedules: migrated (0.0600s) ========================================
** Invoke db:schema:dump (first_time)
** Invoke environment
** Execute db:schema:dump
<<
でもDBはできてしまう。SQLite_Database_Browserで覗いたら、ちゃんとできていました。
一日目、終わり。