忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2006-06-04(Sunday)

Hash#each

eachに渡したブロックに与えられるキー、値を変更するとどうなるかを試してみた

実験プログラム

#!/usr/bin/ruby

h = {"key"=>"value"}
h.each do |k, v|
   begin
      k.gsub!("key", "k")
   rescue => e
      p e
   end
   v.gsub!("value", "v")
end

p h

結果

#<TypeError: can't modify frozen string>
{"key"=>"v"}

リファレンス先頭の

文字列をキーとして与えると、...

の部分が利いてキーは変更できないが、値を変更すると元のハッシュのアイテムの値に影響する。

Tags: Ruby

2006-06-05(Monday)

Hash オブジェクトの等値性

2つの Hash オブジェクト h1, h2 が (h1==h2)==true となるのはどのような場合かを確認してみた。

実験プログラム

#!/usr/bin/ruby
h1 = Hash.new
h1["a"] = "b"
h2 = Hash.new
h2["a"] = "b"
h3 = h1.dup

def out(h, s)
   puts "#{s} : #{h.object_id}"
   h.each do |k,v|
      puts "key   : #{k.object_id}"
      puts "value : #{v.object_id}"
   end
   puts
end
out(h1, "h1")
out(h2, "h2")
out(h3, "h3")
p h1==h2
p h1==h3

実行結果

h1 : 538235616
key   : 538237066
value : 538235596

h2 : 538235586
key   : 538236886
value : 538235566

h3 : 538235556
key   : 538237066
value : 538235596

true
true

解説

h1 を dup して作ったのが h3。h3は、各要素のキーと値の両方が元の h1 と同じオブジェクトを指している。

h2 はh1 を手動で複製したもの。各要素のキーと値は、等しい内容だが異なるオブジェクトになっている。

これらのいずれも、== による比較では等しいと判定されている。

Tags: Ruby

Hash オブジェクトの等値性 その2

すべての要素のキーと値について、h1のキー==h2のキーかつh1の値==h2の値ならばh1==h2となるようにしているのかなと考えて、object_id が異なると ==がfalseになるようなクラスを作って実験してみた。Rubyのソースを見たほうがいいのかな。

実験プログラム

#!/usr/bin/ruby
class C
   attr_reader :s
   def initialize(s)
      @s = s
   end
end

module Eq
   def ==(o)
      @s==o.s
   end
end

a = C.new("a")
a2 = C.new("a")
b = C.new("b")
b2 = C.new("b")
p a==a2

h1 = Hash.new
h1[a] = "b"
h2 = Hash.new
h2[a2] = "b"

def out(h, s)
   puts "#{s} : #{h.object_id}"
   h.each do |k,v|
      puts "key   : #{k.object_id}"
      puts "value : #{v.object_id}"
   end
   puts
end
out(h1, "h1")
out(h2, "h2")
p h1==h2

h1 = Hash.new
h1[a] = b
h2 = Hash.new
h2[a] = b2
out(h1, "h1")
out(h2, "h2")
p h1==h2

a.extend Eq
b.extend Eq
p h1==h2
Tags: Ruby

結果

false
h1 : 538233836
key   : 538233916
value : 538233826

h2 : 538233816
key   : 538233896
value : 538233806

false
h1 : 538233636
key   : 538233916
value : 538233876

h2 : 538233626
key   : 538233916
value : 538233856

false
true

解説

最初は(h1==h2)==falseとなってしまうが、内容によって==を決定するようにEqモジュールでextentするとh1==h2が成り立っている。

Hash#dup における要素の値

Array#dup は、各要素は同じものを指す。たとえば次のとおり。

実験プログラム

#!/usr/bin/ruby
a1 = [{"a"=>"b"}]
a2 = a1.dup
p a1[0].object_id
p a2[0].object_id
a1[0][1] = 10
p a1[0]
p a2[0]

結果

538236506
538236506
[{"a"=>"b", 1=>10}]
[{"a"=>"b", 1=>10}]

解説

ハッシュを要素に持つ配列 a1 をdup して、その後でハッシュ a1[0] に要素を追加すると、a2[0]も影響を受けている。


で、Hash#dupはどうなのかなと思って実験してみた。

実験プログラム

#!/usr/bin/ruby
h1 = {:a=>[1, 2]}
h2 = h1.dup
p h1[:a].object_id
p h2[:a].object_id
h1[:a] << 3
p h1
p h2

結果

538236536
538236536
{:a=>[1, 2, 3]}
{:a=>[1, 2, 3]}

解説

配列を要素に持つハッシュ h1 を dup して、その後で 配列 h1[:a] に要素を追加すると、h2[:a]も影響を受けている。 またobject_idから、ハッシュに代入されている配列が同じオブジェクトであることがわかる。

Tags: Ruby

2006-06-11(Sunday)

VMwareでEtch(Debian Testing)

WindowsXP上のVMwareにEtchをインストールしたときのメモ。

EtchではX.org 7.0を使っているので、それに対応するための修正が必要だった。参考になったのは"Computer Memo"。

まず、bin/vmware-config-tools.plを修正。何行も書き写すのが面倒だったので以下のようにmajorとminorだけを修正した。

  ($major, $minor, $sub) = split_X_version($xversionAll);

  # If there is an existing driver, replace it by ours.
  if ($major == 6) {
(中略)
                   $gXMouseDriverFile, \%p, 1);
    } elsif ($minor == 8) {
      install_file(db_get_answer('LIBDIR')  . '/configurator/XOrg/6.8.x' .

この部分が6.8を使う場合の処理なので、これを

  # If there is an existing driver, replace it by ours.
  if ($major == 7) {
(中略)
                   $gXMouseDriverFile, \%p, 1);
    } elsif ($minor == 0) {
      install_file(db_get_answer('LIBDIR')  . '/configurator/XOrg/6.8.x' .

として7.0の場合の処理にしてしまった。

次に、出来上がったモジュールを/usr/X11R6/lib/ にインストールするようになっているのだけど、Etchにはこのディレクトリが無い。X.orgのdebパッケージのファイル一覧を見て、/usr/lib/xorg/modulesが該当するディレクトリのようなので、次のようにリンクを張ってみる。

ln -s /usr/lib/xorg/modules /usr/X11R6/lib/

とりあえずコレでうまく動いている。ヤッタネ

Tags: メモ

2006-06-15(Thursday)

LaTeXの記号コマンド一覧

「LaTeXとAMSFONTSの記号コマンドは標準で対応しておいたほうがよろしい」とN先生にアドバイスを貰って、ちょっと調べてみた。

公式のコマンド一覧があればと思っていたら、 奥村先生のWikiサイトTeX入門/複雑な数式 - TeX Wikiに、http://www.ring.gr.jp/pub/text/CTAN/info/symbols.tex というファイルのリンクを発見。これこれ。

Tags: MathML

2006-06-16(Friday)

英語でスピーチ・口頭発表

調べ物をしていてたまたま見つけたページ。

  • 主語に I, We, Youを使う
  • 「アー」とか「エー」とか言わず"I think"とか言う

など、参考になる事が多く書かれていて素敵。

特に、難しい言い回しがWeやYouを主語にすることで旨くまとまると言うのは目から鱗。覚えておこう。

Tags: メモ

2006-06-17(Saturday)

記号コマンド

mathml.rbに使用するコマンド一覧表を作るにあたって、 symbols.pdfのソースsymbols.texからコマンドを抽出して作ろうと思っていたけど、どうも次のような不安がわいてしまう。

  1. \sinコマンドと\limコマンドの違いとか、\sumコマンドと\Sigmaコマンドの違いをどのように見出すか
  2. コマンドの漏れが無いか

(1)は、以下のような数式の話。

\[
\sin_a^b \lim_a^b
\]

これについては、コマンドを抽出した後で\[command_a^b\]とかするtexファイルを自動で生成して、dviファイルを見て判別するという手もあるけど、「目で見て」というのが気に入らない。できれば、原典から自動的に判別したい。

(2)についてはもうどうしようもない。「mathml.rbにはsyjmbols.texに記載されている記号コマンドがすべて組み込まれています」でも良いのかもしれないけど、どうせならやっぱり、「標準のlatexの記号コマンドとamsfontsの記号コマンドをすべて組み込んでいます」の方が格好良い。

というわけで、latexのファイルを調べることに。

/usr/share/texmf/tex/latex$ grep -R '\\sin' * | less

出てきたファイルが、 texmf/tex/latex/base/latex.ltx 。ざっと見てみると、大体こんな感じでコマンドの定義が書いてある。(以下、各スタイルファイルなどの引用は一部中略している箇所あり)

\def\lim{\mathop{\operator@font lim}}
\def\sin{\mathop{\operator@font sin}\nolimits}

\nolimits というのが、\limと\sinの違いのようだ。

\sumとかの記号は、 base/fontmath.ltx に発見。

\DeclareMathSymbol{\intop}{\mathop}{largesymbols}{"52}
    \def\int{\intop\nolimits}
\DeclareMathSymbol{\prod}{\mathop}{largesymbols}{"51}
\DeclareMathSymbol{\sum}{\mathop}{largesymbols}{"50}
\DeclareMtahSymbol{\smallint}{\mathop}{symbols}{"73}

\mathop によって基本的に\sum型の表示になって、\nolimitsを付加すると\int型になるわけか。というか、\intopなんてコマンド初めて知った。symbols.texには載ってないコマンドだ。

あと、\sumに対して\Sigmaとかはどうなのかというと

\DeclareMathSymbol{\sum}{\mathop}{largesymbols}{"50}
\DeclareMathSymbol{\sigma}{\mathord}{letters}{"1B}
\DeclareMathSymbol{\Sigma}{\mathalpha}{operators}{"06}

\mathopでなければ\int型の表示になるようだ。

amssymb.sty ではどうなっているのか。

\DeclareMathSymbol{\upharpoonright} {\mathrel}{AMSa}{"16}
 \global\let\restriction\upharpoonright

こんな感じで、基本は\DeclareMathSymbolコマンドで定義している。別名がある場合は\global\letを使っている。

こんなところかな。とりあえず、この辺のファイルから記号コマンドを抽出するスクリプトを作ってみることにしよか。

Tags: MathML

2006-06-18(Sunday)

つっこみスパム

昨日の夜中に連続して同じ内容のスパムが来た。

来たのは良いけど(いいのか)、そのどれもが以下のようなURLを書いただけのスパム

http://tdfms.com/

試しに見に行ったら、「そんなサーバーありません」とのこと。謎。

ツッコミを良く見ると、書き込んだ人のメールアドレスがそれぞれ異なっている。もしかして、ウィルスメールか何かの仕業で、感染した人の評判を下げる効果を狙っているとか?


2006-06-19(Monday)

ツッコミspam

昨夜、また大量のツッコミspamが到着した。

さすがにイラついてきたので、(今更) tDiary.org - 最近多発しているツッコミspamへの対策 を導入してテスト。

とりあえずうまく動いているみたいだ。


2006-06-20(Tuesday)

LaTeX の スタイルマクロあれこれ

ensuremath 命令

マクロの展開が数式の中で行われることを保証する命令。こんな感じで使う。

\newcommand{\R}{{\ensuremath\mathbb{R}}}

こうしておくと、本文中で\Rと書いて$\mathbb R$を得ることができる。 もちろん、数式の中で$\R$と書いても大丈夫。

@を含む命令

プリアンブルの中だけで有効な命令。名前空間みたいなものかな?

Tags: メモ

2006-06-23(Friday)

棒の手紙

山本弘のSF秘密基地

あんまり面白かったんで、メモ。 大雑把に言うと、不幸の手紙の文中の、「不幸」の2文字がくっついて「棒」になってしまった、という話。進化系統樹を作ったりしている。


2006-06-24(Saturday)

Nikon | ユニバースケール

これまた面白かったので、メモ。


2006-06-26(Monday)

Free Math Font Survey(pdf)

LaTeXの資料を探していて発見した文書。後で読むためにメモメモ。