FC2ブログ

lroundでまるめる

C99で浮動小数点数関連の関数が増えているので"まるめ"に関連して。

最も使用するのはlroundあたり。
小数第一位を四捨五入してlongを返す関数だ。
実装はFPU依存になる。
FreeBSD(i386-32) gcc 4.2.1 で単純に -mno-fp-ret-in-387 オプションをつけると、lroundはゼロを返してくる。

それでもソースが無いかと探すと、/usr/src/lib/msun/src/s_lround.c が見つかる。
lround.cでは(範囲チェックを経て)roundを呼び出しているだけなので、s_round.cを見る。
infiniteチェック後、引数の正負を判定して分岐しているが、正の場合はこんな感じ。
dourble round(double x) {
double t;
...
if (x >= 0.0) {
t = floor(x);
if (t - x <= -0.5) t += 1.0;
return t;
}
...

FPUを使う場合はこのコードが動いているわけではないのだろうけど、随分簡単なもんで。

wwwでlroundを検索すると、マクロを使っているものも見受けられる。
#define lround(x) (long)((x) >= 0.0 ? (x) + 0.5 : (x) - 0.5)

これはちょっとなー、と思うので確かめてみる。
与える数値は、(43. / 20. * 10.)
43./20.は、十進演算では 2.15となるが、二進表現では 2.149999..となる。これを10倍して小数第一位を四捨五入。
期待する答えは22
上のマクロをm_lroundとして、
m_lround(43. / 20. * 10.) とすると期待どおり22が帰ってくる。OK。

double d = 43. / 20. * 10.;
m_lround(d) としても期待どおり22が帰ってくる。OK。

double d = 43. / 20.;
m_lround(d * 10.) とすると期待どおり...21が帰ってくる。NG

FreeBSDで見たlroundのソースと同じ関数をLROUNDとして作成して呼ぶと、上の3パタンいずれも22が帰ってくる。
当然、本来のlroundも同じく全て22を返す。

うーん、演算結果は全てdoubleだから、仕様どおりの値渡しならば違いが出ないように思うんだけれど、
単純に、(long)(43. / 20. * 10. + 0.5)は22になるが、
double d = 43. / 20.;
(long)(d * 10. + 0.5) は21になる。
ちなみにfloor(d * 10. + 0.5) は22を返してくれる。
これが浮動小数点数演算の妙やね(^^;

こんな単純なものでも、単純なマクロや関数なら期待しない動きをしてくれちゃうし、
round系関数も頼りになるやつ、ってことになるんだが、
累積やら統計になってきて近似値の誤差が広がってくるとさすがのround系も対応できるはずもなく。
そのためのまるめの手法や、誤差修正の手法があれこれあるわけなんだが...

君んとこは大丈夫か?金計算してないか?w
スポンサーサイト

最後のlibrahack

もう書くことも無くなってきたのでこれで最後にしよ。

ツッコミ所の多さにも関わらず、Twitter上の展開も霧散傾向が見えてきて、そろそろ終焉の気配。
MDIS製システム旧版&新版のダメダメさをつつく事しかできなくなってきている。
一部有志の方々は、問題を絞り込んで各地の図書館へアプローチされているが、どれも反応は芳しくない。というよりウザがる人が増えてきて、そのうち勇者の心も折れるだろう。
とりあえず一貫した切り口である高木浩光氏の動向を見ている事にする。

この(捉えきれない程のたくさんの)問題について、当事者~MDIS、図書館、librahack氏~は、もう余計な事は言わないだろうし、このまま時が過ぎるのが彼らにとって一番良いのかもしれない。

だけれども、「クローラで逮捕された」事実は残り、当事者はそれを肯定する発言しかしていない。
業務を妨害した真犯人はシステム自身である事が明白になっているにも関わらず。
逮捕された人間が地元の一利用者であったにも関わらず。
プログラマに限らず、誰もが当たりを引く可能性があったにも関わらず。

年月を経たものに対してバグだ瑕疵だの言われる事の不条理感は人一倍理解できるし、そこを突いても仕方がないことなのだが、
「大量アクセスによりサーバ負荷が増大した」という報告をMDISが図書館側へしたという話がもし本当であったのならば、そのミスリードによって一利用者が不当に社会的制裁を受けてしまった事をMDISは詫びる必要がある。
バグだの瑕疵だの、こそこそTwitterを追いかけて隠滅するだのしても良い。どうでもいい。
ミスリードによって一利用者が不当に社会的制裁を受けてしまった事をMDISは詫びる必要がある。
とりあえず2回言って気が済んだのでもういいや。

門外漢なので技術的な部分を気にして見ていたんだけれども、なんだか作ってる方も門外漢だったようであまり勉強になることもなく。

robots.txt

どうにも腑に落ちないままなので、とりあえず中野区立図書館のrobots.txtをチェックしてみる。

robots.txt syntax checker
Robots.txt Syntax Checking

Results for http://www3.city.tokyo-nakano.lg.jp/robots.txt
Warning at line number 2:

Disallow:
Paths should be absolute. A number of robots require that the path in a Disallow directive
should be absolute.
For example with the URL http://example.org/blah the Disallow line
should read Disallow: /blah

Warning at line number 3:

Crawl-delay: 1
Unrecognised field. The field Crawl-delay could not be recognised.
Whilst the robots.txt standard allows for expansion by the use of undefined fields,
it is likely that this line is a mistake in your file

No errors found!

どんだけ権威があるチェッカなのか知らないが、一応気になる部分をwarningとしてくれている。部分ちうか全部なんだが。

うーん、Disallow: のパス省略が本当に全有効の意味を持つのか、無視されるのか確かめるにはどうすりゃいいんだろう・・・

中野区立図書館のrobots.txt

無意味な巨大robots.txt、しかも置き場所が変、という状態だった中野区立図書館だが、robots.txtを変更したようだ。

今回はちゃんとルートに置かれている。
robots.txt
が、なんか内容が怪しい。
User-agent: *
Disallow:
Crawl-delay: 1

まず、Disallowに続くパスが省略。
んー、この場合どう解釈されるんだろう。
www.robotstxt.orgから辿った、A Method for Web Robots Controlを見てみる。
...

ruleline = (disallowline | allowline | extension)
disallowline = "Disallow" ":" *space path [comment] CRLF
...

path = fsegment *( "/" segment )
fsegment = 1*pchar
segment = *pchar
...
pchar = uchar | ":" | "@" | "&" | "="
uchar = unreserved | escape
unreserved = alpha | digit | safe | extra
escape = "%" hex hex
hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
"a" | "b" | "c" | "d" | "e" | "f"
alpha = lowalpha | hialpha
...
lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
"j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
"s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
hialpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
"J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
"S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
"8" | "9"

safe = "$" | "-" | "_" | "." | "+"
extra = "!" | "*" | "'" | "(" | ")" | ","
とあるので、赤字のとおりだとすると、最低でも1文字必要なんじゃなかろうか。
中野区立図書館のrobots.txtにはこのpathが省略されているので、rulelineの条件を満足せず、無効な行として無視されちゃうのかな。
となると次の行、
Crawl-delay: 1

連続したアクセスの場合は少なくとも指定の間隔をあけてクロールを行う、という指示なんだけれども、大方は指示どおりの秒数の間隔をあけるようだがGooglebotは無視してくれる。

でまぁ期待どおり1秒あけてくれるものとしたとして、連続した場合、1リモホあたり600回/10分という計算。
Yahoo, Bing, GoogleとUser-agentが3つ来たとして、最高で1800回/10分、という感じ。
まぁこれ以上にDBセッションの制限値を設定した、ということなんだろうか。

んー、現状となんか変わるんか疑問・・・

2010/09/16---
pcharの中に'/'(スラッシュ)が含まれない。これでは代表的な
Disallow: /
が通らない。
disallowline = "Disallow" ":" *space path [comment] CRLF
allowline = "Allow" ":" *space rpath [comment] CRLF
...
rpath = "/" path
...
となっていて、Allowの方はrpathとなっている。
なんかDisallowの方がrpathの誤記なんじゃなかろうか。
そのすぐ下の例に
User-agent: webcrawler
User-agent: excite
Disallow:
の例があって、全許可となっているので、省略=無効ではなくて、省略=全許可という実装が正解なのかもしれない。

The Very Best Of The Doobie Brothers

最近年落ちのベスト版ばかり聞いてるような気がする。
ま、王道だしねw >ドゥービーブラザーズ
TheVeryBestOfTheDoobieBrothers

Android開発環境

Ubuntu10.04でAndroidをいぢってみようかと。

Android SDKをダウンロードして展開。
Eclipseは前から使っているので、ADTプラグインをインストール。

とりあえずのプロジェクトを作って、Run as Android Application。
android-test
なんかかっちょえぇのが出てきたぞぉぉ

っと期待もするんだが、なんといっても激重!
結局ここから何もせず・・・

うーん、これはもしかして新しいマシンが必要ってことか??稟議通るのか??(^^;

librahack MDIS視点

こんなに続くならカテゴリちゃんとすれば良かった。

さぁ待ちに待った三菱電機インフォメーションシステムズ(MDIS)のコメントがやって参りました。

弊社「図書館システム」について

短い文章なのだが、一部を。
弊社が納入しております図書館システムの一部で、大量アクセスによりつながらない、またはつながりにくい状態が発生し、ご導入いただいた各図書館様ならびに一般利用者の方にご心配をおかけいたしました。

これなら出さない方がまだましだったような気がするコメントなんだがなぁ。

Twitter界隈の電凸部隊の報告によると、この「大量アクセス」という表現についてMDISは、「定量的に表現したものではない」旨の回答している。


  • 大量アクセスの意味するところ

    MDISおよび図書館側は、単位時間あたりのアクセス数が多いこと、を大量アクセスと表現しているようである。
    大量アクセスという表現には通常は「同時」という言葉がついてはじめて攻撃と結びつくものなのだが、今回はそれがない。
    ただの連続したアクセスであれば、それはアクセス数の多さであり、運営に有利なポイントとなるはずだった。そんなものでサーバの負荷が上がり他回線が接続できない状態にはなかなかなるものではない。実際今回の件でもサーバ負荷というキーワードは出現していない。

  • 大量アクセスが原因なのか
    DBセッションの再利用をセッションID(Cookie)に頼っていたため、クローラでなくてもCookieを食わないクライアントが連続してアクセスすれば容易に事象は再現される。
    MDISはこの接続の残骸の上限を各図書館個別に設定していたようだが、100や1000のオーダでは"発生しない"レベルではない。つまり、Cookie拒否で連続したアクセスをした場合は、誰でも発生する障害であったと言える。

  • 不具合は直さなければならないのか
    パッケージで売り切りという事で、保守契約の内容如何であるので一概になんとも言えない。
    識者の多くは不具合の存在自体を問題にしてはいないし、保守義務を指摘している者など居ない。

  • 連続アクセスするやつぁいかれてる
    図書館が"一般利用者ではない" == "普通でない"と主張しているアクセスが、合法でありかつ至極普通のクローラであったにも関わらず一方的に(被害届~逮捕)処理した上に、サーバ側の不具合も隠したまま放置されている現状に批判が集まっている。
    同様の症状は、Windows7からIEでアクセスした場合だろうがなんだろうが、Cookieなしなら理論的に発生しうる。
    開発側であるMDISが一文で"一般利用者"という言葉を使っても違和感が無いが、図書館の発表と並べると意味が出てくる巧妙な言い回しであり、倫理的な問題を匂わせる。
    単に企業イメージを低下させるだけの言い回しをなぜしなければならないのか理解できない。

MDISが叩かれているのは、不具合が存在したことについてではなく、我関せずで横柄な対応である事に、いつになったら気がつくのだろう。
この程度の信用失墜なんて大勢に影響なし、ってことなんだろなぁ・・・

librahackを例えてみる

某所では、
鍵をかけ忘れた家に入った奴が悪いのは当たり前だろう
というコメントまで現われてきてるので。

件の人(逮捕された人)が作ったプログラムは、
  • シーケンシャル(同時に接続せずに応答が返ってきてから次のリクエストを送信)
  • 応答が返ってきてから1秒あけて次のリクエスト送信

という事をふまえて、日常に近い状態に例えてみるとすると、
「コンビニで買い物」ってのがいいんじゃないかと思うんだ。

シーケンシャルという事なので、買い物役は一人
プログラム的に1秒って事は10分くらいにしておくかな。
つまり、
10分おきにコンビニに出かけて1品買う
くらいがいいだろう。

コンビニの店員は10分おきにこの客の相手をしてレジを打つ事になる。
だからなんだよ、って話なんだが、
この客が偽計業務妨害であるとして逮捕された。
客にしてみれば、「なんで??」でしょー。

この岡崎市立中央図書館というコンビニは、
レジで一人接客する毎に30分の休憩をとる
システムだったのです。
つまり、
この客が頻繁に買い物にくることにより、レジの人間(DBのセッション)が消費されるので、他のお客様が買い物できない

だから、業務妨害なのですよ、と。
しかも店長は、
そんなに頻繁に買い物にこられるなんて想定外。他のお客様の迷惑になるので良く考えて買い物してください。

とのたまった。
後から調べてみると、ポイントカード(cookie)を持っている客は、前回と同じレジ係が対応する決まりになっていたらしいが、逮捕された客は持っていなかった。
(ポイントカードのシステムを店長が把握していたかはその後の言動から甚だ怪しい。)
レジ係の休憩について店長は、派遣元から問題があるとは報告されていないと言い切った。

派遣元(MDIS)はといえば、
レジを広げてレジ係の人数も増やしましょう
と提案する始末。
それ以前にこの問題を把握していて、客があまりこないようにタウンページへの掲載をこっそりやめたりしていたのにも関わらず。


業務を妨害しようと攻撃するなら1000人くらい一度に行くでしょー。
「いつもありがとうございます」って言われるところを逮捕っすからねー。


と、なんとなくウマい事言ったつもりだったのに、書いてみるとあんまりいい例えでもないかもしれない。
つか、例えなくても異常だぜ>MDIS&図書館
というより、早く直してやれよ、未だにあちこち動いてるんだから、一度止めてさ。

ageism

/.Jを見ていると、
若手が重宝される IT 業界での長期キャリアプランを考える
なんていう記事が。

技術屋なんてぇのは「上に上るか外に出るか (up or out)」なのだよ
というような記事なんだが、まー、まさに仰るとおりでございます。

記憶力も体力も根性も減退気味のおっさんには、ちと厳しすぎるお言葉ですよ。

あれこれ思うところもあるしなー、と、この記事を詳しく読んでみようと思ったら、
すぐ下に、
NERV 本部型ケーキ、ロンギヌスの槍型フォーク付き
なんちう見出しがちらっと見えまして、結局「若手が~」の記事の"続きを読む"を押さずに、ロンギヌスの槍を読みふけってしまったわたしゃぁ、
もう少しこの業界で生きていけるんじゃなかろうかと思った夏の暑い夜・・・

librahack 岡崎市立中央図書館の見解

よしゃぁいいのに、なんて香ばしい事を言ってくれちゃうんだろう。
岡崎市立中央図書館のホームページへの大量アクセスによる障害について

ちょっとアレ過ぎるんで全文引用。
岡崎市立中央図書館のホームページへの大量アクセスによる障害について

 平成22年3月から4月にかけて、新着図書データベースへの大量アクセスがあり、中央図書館のホームページ(蔵書の詳細情報)につながらない、又はつながりにくい事態が、何度も発生していました。市民の方からその旨のお問い合わせをいただくことも何度かありました。
図書館が導入しているコンピュータシステムのソフトウエアを開発した会社に連絡し、調査したところ、本を検索したり予約したりする一般利用とは異なり、短時間に大量のアクセスが行われていることがわかりました。これによって、それまでは問題なく閲覧できていた図書館のホームページが閲覧できない現象がたびたび発生していたということですが、誰が何のために行っているのか不明なため、図書館も対応に苦慮していました。
しかし、このような状態を放置しておくことは、より多くの方にご迷惑をかけることになるので、警察に、このような事例が他にも存在するのか、犯罪性はあるのか、また相談窓口はないか、といったことについて相談し、最終的には被害届を提出しました。
その後の捜査により、大量アクセスを行った人物が逮捕され、報道によりますと、起訴猶予処分となっているとのことです。
このコンピュータシステムは平成17年に導入しましたが、その時点で自動プログラムを用いて短時間に大量の図書データ情報を入手できるような事態は、想定していませんでした。今回の事例により、そのような情報入手の方法があることを認識し、本年7月、大量アクセスに対応できるよう、コンピュータシステムの改善を行ったところです。
ホームページは誰にでも開かれています。もちろん事前の申請の必要もありませんが、利用者の方におかれましては、情報収集のために使われる手段が、他の利用者に迷惑をかけていないかどうかについて、ご配慮をお願いいたします。
 なお、平成23年1月初旬には、サーバーの入替を主とするシステムの更新を行います。これにより、図書館業務の機能強化を行うとともに、今回のような、大量アクセスへの対応はもちろんのこと、市民の皆さんの使い易さの向上を図ってまいります。

平成22年9月1日

岡崎市立中央図書館


もういい加減飽きてくるくらい叩かれているシステムなのに、まだこういうことを吹き込むのか。
当初は、サイバー攻撃と言って憚らなかったのが、大量アクセスに若干のトーンダウン。
技術屋的には大量ではないし、逮捕された方も一般利用者であったのに、この書きようはいったい。
本来なら「おかげで障害が解消されました」くらいの感謝の一報があってもいいような状況で、被害届だしてみちゃったり、逮捕されちゃったら、「新聞によりますと起訴猶予処分」みたいな、なんだかなー。

で、「配慮してください」、って、一般にはこれを逆ギレって言うんだよ?

ちうかさー、技術屋さん、こういう事を素人さんに言わせちゃいけないよ・・・

librahack そして中野へ

Twitterの凄さはそのスピードやね

岡崎市立中央図書館の悲劇(笑)から、
今は中野区立図書館が今は熱い。

Twitter上での高木氏と森区議とのやりとりのまとめ

高木氏曰く、中野区が最も放置されているという状況で、
MDISは全く意味の無いサーバ増強を提案したそうだ。

しかもこの話の笑いどころは、
robots.txtの置き場所を間違っている
というところ。
おかげでクローラごときで接続エラーとなる状況が発生したりする。

MDISの同ソフトを使用している全国の図書館へメールを送る有志も現れた。

逮捕から半年近く。原因が判明してからももう一月近く経とうとしているのに、各方面は腰が重いのか新聞読んでないのか、頭下げる気配も見られず。

ちなみに岡崎市立中央図書館の導入したパッケージは、一説には3千万とか。
パッケージで3千万。データ移行や保守やらハードやら含めると決して高いとは言えないが、パッケージだし、全国数十展開だし、結構な売上だものねぇ。
しかも今は後継システムへの移行を絶賛推進中なのだろうし。

この倫理感のないMDIS、さてコメントはいつになるんだろうか。
どうなったとしても、辛いのは中の人達、特に末端なのだよね・・・
プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク