コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2008年6月7日 >>> 2008年5月11日
link もっと後

2008年6月7日

飲み会

同期の人と飲み会しました。一応合コンという触れ込みだったのですが、知り合いは合コンとは言わんよなあ…。

四条駅近くのレストランIRO(京都府京都市下京区)というところです。

混んでいたらしく料理が全然出てこなかったり、かと思えばすげー早く出てきたりして店員さんがパニクってた模様です。

京都の飲食店でバイトなんて絶対やりたくないな…と思った。

編集者:すずき(2008/06/13 00:50)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年6月6日

奇跡の一週間

ここ一週間、目覚ましより早く目が覚め、一切寝坊もせず、電車にも余裕で間に合う、そんな朝が続いています。

こんなことは去年一回もありませんでした。一体どうなってるんだろう。まさかどこか体を悪くしたのではなかろうか…?

編集者:すずき(2008/06/13 00:54)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年6月3日

推奨

友人と話していたら、水曜日は定時退社推奨日だよね、って話になった。そういえばそんな日だったかな。誰も実践していない気がするんだけどな…。

編集者:すずき(2008/06/13 00:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年6月2日

Mercurial Mini HOWTO

分散リポジトリ型のバージョン管理システムMercurialの簡単な説明と操作法を書きます。

そもそもバージョン管理システムって何さ?という話はしません。全て説明するのはここでは無理です。世の中には良い書籍がいっぱいありますんでそれを読んでね。

はじめに - Subversion以降のリビジョン番号について

CVSとSubversionの差は色々あるけれど、リビジョンの考え方が激変しました。これは大事だと思うから説明します。

CVSではリポジトリに対する変更をファイル単位でコミットし、リビジョン番号もファイルごとに振ります。

一方Subversionはリポジトリ全体に対してリビジョン番号を振ります。ファイル一つ変更するだけでリポジトリ全体のリビジョン番号が上がるのです。


Subversion等のリビジョン番号

図中の丸印が「ある時点のリポジトリ」を表しています。リビジョンを何かに例えるなら写真の番号でしょうか。コミットは「リポジトリ全体を写真に撮って、番号(=リビジョン)を付けること」に相当します。

リポジトリには今までの全写真と番号が保管されていまして、好きな番号で写真を引っ張り出せます。二つの写真の間違い探し(diff)もできて、被写体(リポジトリ)がどれだけ変わったか(ファイルの追加、変更などの変化)が簡単に追跡できます。

便利な例を一つ。一週間前から今までの全変更点を追跡したくなったとします。

CVSですとリビジョン番号はファイル毎に付くので、一週間でファイルAはリビジョン100進んで、ファイルBはリビジョン1も進んでないなんてことが起こります。一週間前の状態に戻そうとすると、ファイル毎にどのリビジョンを見るべきかチマチマ調べなければなりません。

Subversionならば一週間前のリビジョン番号を調べ、そのリビジョンにリポジトリを巻き戻すだけ(update -r revision_number)です。すると全ファイルが当時の状態に戻ります。タイムマシンのようですね。

Mercurialもリポジトリ全体にリビジョン番号を振る方法を採ります。他のSCMもたぶんそうでしょう。

集中型リポジトリとの違い

区別のためにMercurialの管理方法を分散リポジトリ形式、Subversionの管理方法を集中リポジトリ形式と呼びます。正式名称は知らないです。

集中リポジトリ形式ではリポジトリは一つだけです。利用者はリポジトリの一部をコピー(checkout)していじって、変更を反映(commit)したり、他者が行った変更を取り入れ(update)て使います。

Subversionはさらにローカルにリポジトリのキャッシュを持っていて、diffやstatusコマンド実行の際、リポジトリとの通信が不要です。この機能はリポジトリにアクセスできない状態(オフライン)でも使えるのでとても便利です。


Subversionのリポジトリ

Mercurialは分散リポジトリ形式の名の通り、リポジトリがいくつもあります。大きく3つの領域に分類できます。

他人のリポジトリ
他の人が変更しコミットしているリポジトリです。他人の〜と言っても誰が作ったかではなくて、ローカルリポジトリ以外のリポジトリは全て他人です。
どこにあっても良いので、オフラインではアクセスできないかも知れません。
ローカルリポジトリ
自分がコミットする対象としているリポジトリです。HDDなどに置きます。オフラインでもアクセスできます。
作業コピー
実際に作業してファイルを変更する場所です。変更後はローカルリポジトリにコミットします。

以下の図でイメージを掴んでいただけるかと思います。


Mercurialのリポジトリ

実はmercurialの場合、ローカルリポジトリと作業コピーが同一の場所にあります。実用上は便利なんですが。説明する側から見るとやりづらいっすね。

オフラインでリポジトリにcommitできること、これこそが分散リポジトリ型の最大の利点です。
絵から分かる通りupdateもできます。オフライン状態でローカルリポジトリを変更できるのは自分だけだから意味無い?なんてこと言うんですか…。updateの節で詳しく説明しますが、バージョン管理のうまみはupdateで巻き戻せる点に有ります。

commit

作業コピーに対する変更点をローカルのリポジトリに反映させます。

push

pushできるのはリポジトリ同士なのでcommitしてからpushして下さい。そうでないと何も反映されません。

誰かが先にpushしていると、

$ hg push
pushing to /home/user/test-a
searching for changes
abort: push creates new remote heads!
(did you forget to merge? use push -f to force)

と警告されます。headとは最新状態のことです。ある地点を基点にブランチで枝分かれしていき、枝の末端が最新版となります。末端なのにheadというのも何だか変(※)ですけど、そういう用語なので仕方ないですね。

謎のキーワードheadがわかれば警告文の意味がわかります。このままpushすると最新の状態(head)が2つできるじゃない!何とかしなさいよ!!と言っているわけです。

図示すると以下のような感じです。


Mergeが必要な場合

この状態を解消するためには「誰かの変更」を取り入れる作業(pullしてmerge)が必要です。詳しくはpull, mergeの節を見て下さい。merge後はcommitしないと作業が進められなくなりますよっと。

警告文曰く、ブランチを作りたいならpush -fで作れるそうです。

(※)個人的にはleafの方がわかりやすいと思いますが、歴史的な経緯でしょうか?

pull

別のリポジトリにある変更点をローカルリポジトリに反映させます。さらに作業コピーに変更を反映させたければupdateをする必要があります。updateについては次節をご覧下さい。

update

作業コピーにローカルリポジトリの内容を反映させます。

他のリポジトリからpullした後は、通常はupdateをします。もし誰かが既に更新していた場合は「衝突」状態になります。その時は次節で説明するmergeを行って解決します。

別の使い方は「巻き戻し」です。○○という変更を入れる前に戻したい、1日前に戻したい、なんてことが簡単にできます。

merge(またはupdate -m)

他のリポジトリからpullした変更点をupdateしようとすると

abort: crosses branches (use 'hg merge' or 'hg update -C')

と、怒られることがあります。あなたがpullしたリポジトリに、誰かが先にpushしたことを表しています。

(ブランチの絵を入れます)

解消するためにmergeを行います。マージ用のプログラムが無い状態では、衝突したファイル名に .origが付加されてバックアップされます。

$ hg status
M a.txt
$ ls -1
a.txt
a.txt.orig
元のファイルa.txt
$ cat a.txt
a
b
c
ユーザA(自分)がコミットしたa.txt
$ cat a.txt
a
user a
c
ユーザB(他の人)がコミットしたa.txt
$ cat a.txt
a
user b
c

同じ行を変更しているので機械的にマージが出来ません。するとマージプログラムは以下のようにlocal(自分の変更部分)と、other(他の人の変更部分)を示して、どちらか選んでよ、もしくは良い感じに修正してよ。

衝突したファイルはどうなるかというと、

マージ失敗後のa.txt
$ cat a.txt
a
<<<<<<< local
user a
=======
user b
>>>>>>> other
c

修正後にcommitをお忘れ無く。

rollback(またはundo)

親リポジトリからpullした、あるいはcommitしたは良いけど、やっぱりやめたいときはrollback(またはundo) ができます。

ローカルのリポジトリを巻き戻します。最後にpull, またはcommitした部分まで戻りますが、二回以上は戻りません。

メモ置き場

後で調べて書きたいこと。

  • ブランチの消し方?
  • リポジトリを省略したときに操作の対象になるリポジトリの調べ方?
  • 誰でも書きつぶせるのは危ない、アクセスコントロール、パーミッションなど?

とーどー(TODO)

  • ビルド、make PREFIX=, PYTHON= あとはPYTHONPATHの設定あたり?
  • statusとlog(tipまたはhistory)の説明も
  • cloneとinitの説明も
  • リポジトリ作成、clone -> コミット、プル、プッシュ、マージの一通りの流れ、実例交えて

使った感想

オフラインコミットは便利d(・∀・)イイ!

昔はそう思ってました、今はリポジトリが散らばりすぎて何だかわからなくなった俺ガイル…なんてことにならないように、ある程度の規模を扱う予定ならば運用ルールを敷きましょう。

本格的に使ってないので予想の域を出ませんが、リポジトリが大量にできるうえに全リポジトリが平等なので、集中リポジトリ型よりめちゃくちゃになりやすい気がします。

編集者:すずき(2008/07/02 00:25)

コメント一覧

  • IKeJIさん(2008/06/03 06:50)
    この勢いでgitやsvkもぜひ(w

    >(※)個人的には leaf の方がわかりやすいと思いますが、歴史的な経緯でしょうか?
    ブランチをleafと呼ぶと、そのブランチは更新できないような気がしてしまいます。
  • hdkさん(2008/06/03 07:24)
    タイトルに typo がw

    いやあ便利ですよ。コレ使ってると Subversion のマージがクソに思えてきます。
  • すずきさん(2008/06/03 09:44)
    >IKeJI さん
    git は書きたい。svk は書くかどうかわからんす。
    確かに leaf だと更新できなさそうに見えますね。でも head はおかしい、代わりの呼び名が欲しいね…。

    >hdk氏
    少しずつ便利さのかけらを感じています。もう SVN には戻れない。
    マージプログラムって何使ってます?

    >タイトル
    うわ、まーきゅてぃあるってwww
    俺m9(^Д^)ぷぎゃー
open/close この記事にコメントする



2008年6月1日

野菜だらけ

Sena氏と買い出しに行って、野菜生活100を補充しました。元々あったやつと合わせて、40本くらいになった模様。意外と消費期限は長い(3ヶ月くらい)ので問題なし。

どかーんと冷蔵庫の上に積んでおいたら、同室の隣人が「なんか増えてません…?」って呆れてたけど、気のせい気のせいw

晩はびっくりドンキーで食ったんですが、40周年記念メニューを一押ししていました。まあいつもとおなじハンバーグですけど…。

イチゴミルクとマンゴージュースはおいしかったなあ。どちらも果肉成分がたっぷり入ってるのは良いんだけど、ストローで飲むと詰まって出てきませんよー!二人ともスムーズに飲めなさすぎて、途中からなんだか笑えてきたよ。

編集者:すずき(2008/06/12 23:48)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月31日

さらに延滞

先日、同室の隣人からDVD返しておいてくださいな、と頼まれました。延滞してるから後で払います、よろしく〜と、彼は再び岡山へ旅立って行きました。いつも大変そうだなあ…。

で、そのDVDは本来昨日返すべきだったのですが、中の映画(ボーン・アルティメイタム)が気になって見てたら閉店時間を過ぎてしまった。余計に延滞してしまったぞ。

今日返したら4日延滞と言われ1,200円も取られた。延滞料金って高いのな…。

編集者:すずき(2008/06/12 23:34)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月30日

金曜は寿司の日

同期のSenaさんと寿司を食いに行きました。というか今更書かなくても毎週行ってますけど…。Senaさんは、寿司ばっか食ってる私に、飽きずによく付き合ってくれてありがたいです。

富田駅の近くにある権太呂寿司です。回らない寿司屋だけど2貫で126円(税込)と、値段は回転寿司並のリーズナブルさが良いのです。

最近はビントロばかり食ってます。あっさりなのかこってりなのか良くわからないこの感じが、何とも言えないぜ。

編集者:すずき(2008/06/12 23:25)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月25日

北野天満宮

大下さんと北野天満宮(京都府京都市上京区)の骨董市に行きました。骨董市といっても特別なことは何もなくて、出店とフリーマーケットが混ざったお祭りみたいなもんです。

北野天満宮に来たのは初めてだったので、ついでに写真を撮りながら歩きました。


北野天満宮、楼門

境内にも人が一杯。建物の中でご祈祷をやっていました。祈祷料は数千円と書いてありました。「面白そうだからやろう」と大下さんを誘ったのですが、高いから嫌って言われた…あっそ…。一人でやってもなんか虚しそうだよなあ。


北野天満宮、中門(三光門)

店を一通り見たら疲れてしまった。社会人になろうとも体力のなさは変わらないのである。

おやつでも食べようかってことで中村軒(京都府京都市西京区)に行きました。桂離宮の近くにあります。かき氷が有名なお店なのだとか。


中村軒のかき氷(奥)、おうす(抹茶のこと、左)、白きんつば(手前)

大下さんが何度もここのかき氷はおいしいんです!と言ってましたが、正直かき氷なんてどれも大差ないと思ってました。しかし食べてみると違うもんですね。

いわゆるかき氷シロップではなくて、生の苺をすりつぶして作ったソースがかかっているのです。うまうま。

編集者:すずき(2008/06/13 00:42)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月24日

絶景かな?かな?

同期の皆さんとともに天橋立(京都府宮津市)に行ってきました。丹後の天橋立(京都府)、安芸の宮島(広島県)、陸奥の松島(宮城県)が日本三景と言われています。


日本三景碑

天橋立は海流によって砂が運ばれ堆積した地形です。くちばしのような形状が多いことから、砂嘴(さし、砂のくちばし)と呼ぶそうですが、天橋立のように成長して対岸にくっついた場合は砂州(さす)と呼ぶそうです。

地理の話はそのくらいにして、まずは南側から対岸へ向けて、松林を北上しました。晴れていればとても素敵な散歩道だったでしょう。今日は雨のせいで何も見えません。


霞む対岸、怪しい雲行き、不安な僕ら

松林は軽く4kmほど続きます。景色がずっと同じで写真の撮りがいがありません。困ったもんです。

観光協会も気づいているのか、松林の退屈さをなんとかしようと道ばたにアームストロング砲を置いたり、変わった形の松に名前を付け(夫婦松など)たり、地元の伝承を事細かに語る看板を立てたりと、頑張ってます。


斜めってる松

が、その努力も虚しく2kmほど行った地点でマンネリ感に満ちてきます。あとは 小1時間ずっと同じ景色、雨も相まって正直きついです。

傘を差していたのに傘から雨がしみ出していて肩から腕までびしょぬれ。さらにイラつくことに傘は新品、しかも300円よ?土産屋で買ったのが良くなかったな。素直に友達の折りたたみ傘を借りれば良かったと何度も後悔した。


橋立明神、海神を祭っているらしい

途中にあった神社が妙に金持ちです。建物はピカピカですし、手水舎にセンサーがついていて近づくと自動で出る、などという成金な仕掛けがありました。仕掛けが面白かったので動画で撮りましたが、私のキモい話声が際限なく入ってたので公開はやめときます。


籠神社(このじんじゃ)

山の上からなら見えるだろうと一縷の希望にすがり、ロープウェーに乗り、展望台へ。…うむ、空も海も橋もへったくれもない。なにも見えん。

近くに居たおばちゃん達と「一瞬でも良いから晴れないかねえ…。」なんて話しつつ、霧が晴れるのを待ちましたが晴れる気配なし。悲しいけど風邪を引く前に撤退。


展望台にある股のぞきポイント


展望台より天橋立を望む?

一番マシな写真がこれです。肉眼でもこんなもんでした。残念。チャンスがあればもう一回行くべきだな。

編集者:すずき(2008/06/12 00:10)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月23日

給料日、定時退社

社会人2年生になって、基本給がレベルアップしました。しかし前年度より手取りが下がります(来月から住民税を取られる)。

今年の住民税の所得割額は「昨年の総所得」から決まります。つまり今年の所得に対してかかる住民税は、来年納めるわけです。実に1年も時間差をつけて攻撃(納税)されます。

サラリーマンはあまり問題ないかもしれませんが、仕事を変えるなど所得が大きく変化するとき、臨時で大きな収入があった年などは、住民税のことを覚えておかないと、翌年の時間差攻撃でひどい目にあうかも…。

なぜ出てはいけない

阪急のドア横には「非常時に引くとドアが開きます」と注意書きされた箱があります。緊急時、すぐさま車両の外に避難しなければならない時に使います。

で、少し気になったのは「地下鉄内では使わないでください」という注意書きです。注意書きには残念ながら詳細な理由は書いていません。地下鉄のトンネルに出ると何か問題が起きるのだろうか?

地下鉄で感電する

私が思い当たる理由は給電方式の差です。地下鉄は地上の電車のように上から給電するタイプ(架線給電方式)と、レール近くの電線から給電するタイプ(第三軌条給電方式)があります。第三軌条給電の場合、トンネルへ下手に降りて電線(600V〜 くらい)に触れようものなら感電死します。

阪急は架線給電だから阪急が乗り入れる地下鉄も架線給電でないと走れません。架線給電なら、トンネル内に出ても危険はないはずです。しかし大阪市営地下鉄は第三軌条給電が多いらしく、阪急の時と同じノリで地下鉄から降りられると危ないので、全面禁止にしたのでしょう。

お陰で乗客は降りて良いトンネルにも降りられません。阪急もその辺は理解していると思いますが、乗客への説明&周知徹底する面倒くささには勝てないのでしょう。

編集者:すずき(2008/05/26 00:44)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月22日

そしてカツラになる

知り合いに小泉という名字の人が居ます。最近は毎日と言って良いほど、彼の名を思い出します。

といっても意味深なことはなくて、通勤中に電車の窓から「こいずみがわ」と平仮名で書いた看板が見えるというだけです。位置は島本〜長岡京の間、JR京都線の北側(京都方面を向いて左手)にあります。川の脇にある緑色の看板です。

JR京都線はさほど混まないので、気づけば毎日同じような位置に立ち、毎日同じような景色を見るようになっていた、ってなわけです。明日もまた同じように「こいずみがわ」を見るでしょう。

小泉川の写真でも撮って、その小泉君に見せたら面白いかなあ?と思ってたら、なんと既にこのページで上流〜中流〜下流(桂川と合流)まで、写真付きで詳しく紹介されていました。

うむむ…。世の中は広いんだぜ…。

編集者:すずき(2008/05/25 23:24)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月20日

大嘘ついてた

唐突に気づいたのですが、クラーク像は「札幌じゃなくて北広島にある。」って、色んな人に吹聴した気がする。壮絶な嘘です。クラーク像はどちらも(※1)ちゃんと札幌市にあります。嘘を教えてしまった方々には深くお詫び致します。

無知も良いところでした。今度実家に帰ったとき、ちゃんと見てきた方が良いですかねえ…。

(※1)胸像と全身像があります。胸像は北海道大学(札幌キャンパス、札幌市北区北8条〜24条)に、全身像は羊ヶ丘展望台(北海道札幌市豊平区羊ヶ丘1番地)に建っています。

北広島市とクラーク博士

北広島市と勘違いしていた理由も調べました。クラーク博士がアメリカに帰るとき「Boys be ambitious…」と言って去った有名なエピソード、この舞台が現在の北広島市にあるのです。像とBoys be ambitiousの話とがごっちゃになったようです。

ついでに例のフレーズは「Boys, be ambitious like this old man.」(小供等よ、此老人の如く大望にあれ。)と続く(※2)ことも知りました。

クラーク博士ってばまるで映画の主人公のようですが、歴史が美化されるのはお約束ですから怒っても仕方ないのさ。

(※2)英文および訳文は北海道大学付属図書館W.S.クラーク博士関係文献目録の一部である、こちらのページから引用しました。

編集者:すずき(2008/05/26 00:46)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月19日

窃盗は犯罪です

グリーンピースがまた犯罪行為してます。目立とうとしすぎて犯罪団体になっています。さすがに拉致、放火、殺人はやらないと信じたいですけど…。とにかく捕鯨船乗組員の安全を祈るばかりです。

そういえばグリーンピース・ジャパンのページを見ると、
Q. 鹿やカンガルーのように鯨も間引くという考えはないのか。
A. 鹿やカンガルーは「捕食される側」の動物だから、間引かれるべき。鯨は「捕食する側」だから間引くのはおかしい。
という問答があります。つまり鹿やカンガルーは多すぎだから逝って良しってことでFAらしい。これが環境保護か。

捕鯨相手はおいしい

窃盗までして捕鯨を責める暇と金と時間があるなら、
環境を蘇らせる技術の研究所を世界各地の大学に作って、全面バックアップしました!!
とか、
ど田舎の土地を日本の国土面積の数倍規模でがっつり買い取って、全部環境保護区にしました!!
こんなことをやって欲しいです。一面にこんな見出しが躍ってたら痺れます。

グリーンピースには世界各地の企業、財団からの大量の寄付(うちは環境に配慮してますよ、という姿勢のため)で潤ってるはずなので、資金はあると思います。が、残念ながら、どんなに資金があってもやらないでしょう。グリーンピースがスポンサーを取り続けるには、とにかく目立つしかありませんから、結局は環境なんか二の次で「目立つ(つまり儲かる)こと」を選ぶのです。

また、スポンサー企業を敵に回すような活動はできません。グリーンピース以外にも環境団体はいくらでもありますから、そちらに流れられたら一巻の終わりです。
例えば石油を消費するとCO2が増えて環境に悪いです。しかし石油製品の不買運動なんて運動はさっぱり見かけません。だってそんなことしたら金づ…じゃなかった、石油関連企業からそっぽ向かれますから。

その点、捕鯨反対なら心配ありません。鯨を食べる国は圧倒的に少なく反感を買いませんし、大きな生き物を殺す抵抗感にも訴えられます。さらに日本船が相手なら超ラッキー!機関砲かロケットランチャーぶちこまれるまで反撃しない国ですからね。

カモがネギ背負って鍋担いでガスコンロとボンベにマッチまで持ってるんですから、おいしくいただかない理由はありません。というわけで捕鯨反対はやめられない止まらないのです。

編集者:すずき(2008/05/20 01:59)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月18日

過去を改竄

ご指摘のあった 5月7日の日記を大幅改訂しました。hdk氏、ありがとう。

詳しくない分野に踏み込んだので間違ってるかも知れませんが、そんときゃそんときだ。うん。

編集者:すずき(2008/05/18 11:26)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月16日

使い切るぞ

今週一週間で、月の残業時間の半分を使ってしまった。またか、またなのか!

付け方を控えめにしてるつもりなのにねえ…。

編集者:すずき(2008/05/18 11:24)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月15日

正方形だって?

所属していた研究室のSkepeチャットで、変なキーボードの話をしていました。聞けばほぼ正方形のスペースキーを搭載した変なキーボードがあると言うではないですか。写真も見せてもらいましたが、本当に正方形です。変なの!

確かに正方形だ

…やややや、まてよ?このキーボードどこかで見たことないか?と思い、会社のメインキーボード(DELL SK-8135日本語配列)を見たら、スペースキーが正方形じゃないですか…。そりゃ見たことあるわけだよ、既に使ってたんだもん。

見た目はかなり変テコですが、使い心地は普通です。スペースキーが小さい分、微妙にデカい無変換キー(普通はAltより細い)を誤打するくらいで、すぐに慣れてしまいます。

このキーボードのおかげなのか、家のキーボードでスペースキーを叩くときもキー一つ分(幅としてはSK-8135の無変換キー分くらい)を無意識に避けて押しています。

今回の日記を書いているときに初めて気づいたので、いつからこうなってたのかはわかりませんけども。

実際

ぜひ皆様にどんなキーボードか見ていただきたくて、型番でGoogle検索したらこんな写真をブログに貼っている人がいました。

うは、まさにこれだ。スペースキーが正方形なのさ。

編集者:すずき(2008/05/18 11:23)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月13日

Linuxのstruct pageって何

目次: Linux

以前からLinuxのページディスクリプタ(要はstruct page)って何なの?という疑問が晴れないまま居ました。特に実際のページフレームとの対応をどうやって取っているのかが全くわからん。どこかに対応が書いてあるにしては、それらしい場所がない…。

分からんながらも、機会を見つけては調べたり考えたりしていたら、なんとなーく分かった気がする。

分かった気がすることを書き散らしますが、間違っててもご勘弁下さい。自信ないです。

メモリゾーン

前提知識として簡単に説明します。Linuxではメモリ領域をゾーンという固まりで管理しています。ゾーンはページフレーム(普通は4KBのメモリ領域)をいくつかまとめた固まりです。ページフレームがずらーっと並んでいるようなイメージ。

厳密にはもっと書くべきことがあるのでしょうが、今回はこのくらいの理解で進めるはず。たぶん。

ページディスクリプタとページフレーム

では本題に入ります。
まず私の疑問点は「ページディスクリプタ(以下、struct page)のポインタをもらったとき、どうやって対応するページフレームを得るのか?」です。

ここでstruct pageのメンバに直接書いてあれば話は早いのですが、struct pageにページフレーム番号を示す情報などはありません。残念。

実はstruct pageは中身も大事ですが、ポインタ値が非常に重要な意味を持ちます。というのも実メモリのページフレームとの対応を取るために、ポインタの計算を行うからです。計算についてはまた説明します。

ページフレームを求めるためには、
ページディスクリプタ -> ゾーン -> ページフレーム
の順に求めます。まどろこしいですが、直接求められないのです。

ページディスクリプタ -> ゾーン

ページディスクリプタが対応するページフレーム、こいつが属するゾーンを求めます。自分でも何言ってるのかわかんないけど、まあいいや。

まずstruct pageにpage_flags_t flagsというメンバを見ます。こいつはその名の通りページの属性や状態を示すフラグを格納する変数なのですが、上位3ビット(または8ビット)だけは意味が違っていて(※1)、このページが所属するゾーンを表す数値が入っています。

なのでflags >> NODEZONE_SHIFTによってページが何番目のゾーンに所属しているのかがわかります。例えば1だとしたら、ゾーンの配列zone_table[1](グローバル変数)を見ればゾーンの情報が見られます(※2)。

(※1)不思議な設計に見えますが、むやみにメンバを増やすとstruct pageだけで相当量のメモリを圧迫(struct pageはページフレームの数だけ存在する)してしまいます。

(※2)最近のLinuxではゾーンの一覧(zone_table)はグローバル配列ではありません。struct pglist_dataという構造体(ゾーンが必要ならnode_dataというグローバル配列(アーキテクチャ依存)、ゾーンが不要ならcontig_page_dataという変数)経由でゾーンを見るようになっています。ゾーンが要らないというアーキテクチャを考慮したのでしょう。

ページディスクリプタ&ゾーン -> ページフレーム

長くなってきましたが、本題のページフレームの求め方に行きます。先ほど苦労して求めたゾーンにはzone_mem_mapというメンバが居て、ゾーンに属するstruct pageの一覧を持っています(※3)。


ゾーンのzone_mem_mapのイメージ

上の絵で注目して欲しいのはzone_mem_mapと、ページディスクリプタのポインタ(pとします)がわかれば、zone_mem_mapの何番目にpが存在しているかわかるということです。上の絵では5番目に位置しています。

薄い水色の四角内で具体的な数値(数値は適当ですが)を当てはめてpのアドレスからzone_mem_mapのアドレスを引くことで、pがzone_mem_mapの何番目にいるか求められる様子を示しています。


ページフレームを求める

これでstruct pageがゾーンの先頭から何番目のページなのかがわかりました。あとはページフレームを求めるだけです。ゾーンの構造体のメンバzone_start_pfnがゾーンの開始ページフレーム番号を表しているので、そこへ先ほどの数字(5)を足します。

これにてstruct pageと対応するページフレームが求められました。

もし物理アドレスに興味があるのならば、ページフレームの番号にページフレームのサイズ(普通は4KBのはず)を掛けてあげればよいです。
高位メモリや非連続なメモリモデルを持つアーキテクチャだと、単純に掛けるだけではダメかもしれません。

(※3)最近のLinuxにはありません。恐らくzone_pgdat->node_mem_mapが等価だと思われます。たぶん…。

編集者:すずき(2023/04/29 21:56)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月12日

念のため

有給をとって休みました。お休みを病欠で消費するとすごくもったいない気がするのです…。

上の一文をどこかで見た気がすると思ったら、去年の6月11日(2007年6月11日の日記参照)にも風邪で有給を取って休んでいて、同じようなこと書いていました。ああ、進化してない。

昔からこの時期(4月末〜5月末)はほぼ確実に風邪を引いている。時期に何か秘密があるのかなあ?季節の変わり目にしては遅いような気がするんだけど。

編集者:すずき(2008/05/13 01:19)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2008年5月11日

風邪

熱は下がったけど、喉がヤバいことに変わりなし。起きている間に良化 -> 寝ている間に悪化を繰り返しているみたい。部屋の空気が乾燥しているとかかなあ?

昨日はご飯食べるの忘れてたので、今日はきちんと食べました。

編集者:すずき(2008/05/13 01:07)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2008年6月7日 >>> 2008年5月11日
link もっと後

管理用メニュー

link 記事を新規作成

<2008>
<<<06>>>
1234567
891011121314
15161718192021
22232425262728
2930-----

最近のコメント5件

  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」
  • link 24年5月17日
    すずきさん (05/20 13:16)
    「そうですねえ、普通はStandardなの...」

最近の記事3件

  • link 24年6月27日
    すずき (06/29 22:29)
    「[何もない組み込み環境でDOOMを動かす - その4 - 自作OSの組み込み環境へ移植] 目次: RISC-VDOOMのクロー...」
  • link 21年6月18日
    すずき (06/29 22:28)
    「[RISC-V - まとめリンク] 目次: RISC-VSiFive社ボードの話、CoreMarkの話のまとめ。RISC-V ...」
  • link 24年6月24日
    すずき (06/29 22:24)
    「[何もない組み込み環境でDOOMを動かす - その1 - 準備編] 目次: RISC-VDOOMというFPS(First Pe...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 06/29 22:29