/ 最近 .rdf 追記 設定 本棚

log[Ruby: 2023-02-07]



20230207() [AtCoder] 精進。ABC008-D金塊ゲーム( diff)以前順番に埋めていっていたときに埋めきれなかった古い ABC の問題今となっては何がわからなかったのかわからないって今日は以前に立てた方針をそのまま実装しただけなのだから提出 #38698822 (AC / 469 Byte / 155 ms)最初四角の枠があって機械を動かすごとに枠が4分割される枠の中にあるどの機械を一番に動かすかのがいいかは総当たりで決める枠を定める4つの値のバリエーションは N+1 個から2個と N+1 個から2個を選ぶ組み合わせの掛け合わせだから高々 N の4乗程度N30 だから N^481枠の中にある機械の数は N 以下だから全体で N^5≦約2400万を見込んでおけば足りる定数倍が軽ければ Ruby でも通る

最終更: 2023-02-08T02:07+0900

[Ruby] Ruby クイズ (複合代入)

a = b = 0 # 初期化
a += b += a += 1 # 本題
p a #=> 1? 2?

右から順番に a1 を足して(a=1)ba を足して(b=1)ab を足して(a=2)と考えると間違える自己代入を読むこの形式の代入は 1 =1 op2 と評価されます。ただしop&&, || の場合には()と書かれている一番右の a += 1 が評価される前に一番左の a +=a = a + と分解されていて古い a の値が評価中の式の値として一時的に記憶されているのだと考えられるa の値は 1 になるちなみに C++ では 2 になった

この前の ABC288-D が解けなかった理由のひとつにはこの罠に気がつかなくて合わせるべき数字がそもそも間違っていたということがあるそれがなくても解けなかったのもたしかだけど


20220202()

最終更: 2022-02-11T22:02+0900

[Ruby] Ruby が謎に止まる(解決済)

先日解いていJOIG 2021/2022 本選競技課題(トケースのダウンロドができ)F 問題へのこの提出に関して>20220129p01.05

Hash#shift を意味がある限り繰り返したあとで Hash#clear を呼ぶようにしている(25 行目)shift は破壊的なメソドだから shift を十分に呼び出した後の Hash は空になっているはずでclear を呼ぶ意味はなさそうに思えるそれでも呼ぶようにしているのはこれがないとテトケースの in/05-01.txt に限ってスクリトの応答がなくなって TLE になると思ったから少なくともローカル Windows 環境では Ruby-2.7Ruby-2.5 で止まるRuby-1.9 は平気他のテトケースでは止まらないけど問題のケースでは必ず止まる止まるタイミングはバラバラだけどいずれも Hash への代入で止まっているようだった

再現スクリトはこんな感じ(これを見つけたから日記に書いている)他所で再現するかはどうでしょうね

Many = 100 # 10 回では少ない。テキトーに大きく。
Some = 100 # ウチでは 30 回目までは到達しない。
# ウチの Ruby-2.5: ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]
# ウチの Ruby-2.7: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x64-mingw32]

Some.times{|some|
	warn "#{some} begin"
	hash = {}
	Many.times{
		some.times{|j|
			k = Random.rand 0..Many
			hash[k] = 1 # maybe hang
		}
		0 while hash.shift
	}
	warn "#{some} end"
}
warn :exit

Ruby-2.5Ruby-2.7 では "N begin" (N20) を表示して止まる2.5 より 2.7 の方が早く止まるという傾向はあるけど具体的な回数にはバラツキがあるそれはまあ乱数を使ってるからだと思うけどッシュのキーを k に代えて j にしたりッフルした順列にしたりすると止まらなくなるので(正常動作)乱数は外せない

こういう IssueBug #17779: 特定の順序でHashkeyを削除した場合に Hash#first が遅くなる - Ruby master - Ruby Issue Tracking Systemを思い出したけど全然関係はなさそう? 全然わからない

AtCoder のコドテトを使わせてもらったら(目的外失礼)こういう結果AtCoderRuby も今のバージョンは 2.7

終了コ9
実行時間10501 ms
メモリ9112 KB

標準エラー出力は 30 begin で途切れている完走しても 10 秒もかかるはずないからハングして実行を打ち切られたのだと思うドテトとジッジサーバーが同じだとしてッジサーバーのスペックはこう>Linux ip-***-***-***-*** 4.15.0-1041-aws #43-Ubuntu SMP Thu Jun 6 13:39:11 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux*

 ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [x64-mingw-ucrt]

Ruby-3.1 「ウチの Rubyに今日加わりました大体ループの 20 から 30 回目で止まるんだけど弾みで 2 回だけ完走したりもした

 (改訂)

パラメータが2つもあると面倒なので

改訂するにあたって予想外に止まらなくなったりした(正常動作)のを通してたぶん直接的な原因もわかった

# ウチではだいたい 20 から 30 回で "empty?: true" を最後にして止まる。
# ウチの Ruby-2.5: ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]
# ウチの Ruby-2.7: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x64-mingw32]
# ウチの Ruby-3.1: ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [x64-mingw-ucrt]

H = {}
100.times{|n|
	while H.size < n
		k = Random.rand 0..1<<30
		H[k] = 1 # たぶんここで止まる。
	end
	warn "size: #{H.size} before shifting."
	H.shift until H.empty?
	raise if H.shift # no exception. だけど Hash が空になった後の shift が後でハングをひき起こす?
	warn "empty?: #{H.empty?}"
}
warn :exit

Hash を空にする方法として 0 while H.shift を選ぶとその後の Hash#[]= でハングするがHash を空にする方法として H.shift until H.empty? を選ぶとハングしなかった条件を揃えていくと、Hash#empty? が作用してハングを回避しているのではなくHash が空になったあとの Hash#shift がハングをひき起こしているようだったちなみに Hash#clear にハングを回避する効果があるらしいのはJOIG の問題への提出で確認済み(とはもう書いた)

 対応していただきました! (Bug #18578)

投稿して次に見たときにはすべてが終わっていた早いぜ

こういう仕組みだったようです。

モ:entries_bound は使用中のビDELETEDになったビンを含むの数(ほぼ対応していてこれをみてテーブルをリビドしていrebuild_table_if_necessary空のハッシュに対する Hash#shift はなぜか entries_bound0 にしているのでリビドすべきタイミングを逃しビンがすべて使用中になった状態で空きビンを探そうとするので無限ループに陥っていfind_table_bin_ind

Bug #18578: Hash#shift を繰り返していると ruby が無応答になる - Ruby master - Ruby Issue Tracking System

* [[Language Test 202001 - AtCoder|https://atcoder.jp/contests/language-test-202001]]

 [[AtCoder 2019/7 Language Update - Google スプレドシ|https://docs.google.com/spreadsheets/d/1PmsqufkF3wjKN6g1L0STS80yP4a6u-VdGiEv5uOHe0M/edit]]


20210422()

最終更: 2021-06-11T11:27+0900

[Ruby] 多重代入の評価順

以前書いた最初に右辺を評価してそれから左辺の評価と代入を左から順番に実行していく感じかな? 右辺の一時記憶が必要? 多重代入は遅くて時々評価順が難しいというのが現在の評価クイズです。a の結果を確認してから予想してカンマを付けたら予想通りの結果になったので驚きはないけどっぱり普通の代入とは違うんだなあ

そしてこの PR が多重代入について>Evaluate multiple assignment left hand side before right hand side by jeremyevans · Pull Request #4390 · ruby/rubyージされている

3.1.0 から変わりそう? 評価順が変わってパフーマスがさらにちっと遅くなる? 新しい評価順っていうのが

  1. 左辺の変数レシーバ(メソド引数も?)を左から
  2. 右辺の値を左から
  3. 左辺の変数代入代入メソドを左から

従来は2が最初にあって1と3がインターリーブされていた……ということが PR の概要欄と NEWS の修正に書いてある

パフーマス劣化の理由は左辺の評価結果を一時的に蓄える必要があるからか?

いやあっさり変えるし変えられるもんなんだなあまあたぶんRubyーザーの 1 % も変化に気がつかないだろうとは思う

 新展開@2021-05-06

  1. https://bugs.ruby-lang.org/issues/4443#change-91847
  2. https://bugs.ruby-lang.org/issues/15928#note-10

非効率だしバグらせやすいし作り込む価値がないと言っている?

自分はもうこの仕様について(穴にはまった実体験から)っているので常に穴を意識して書くし逆に評価順を利用することもあるけどこれまで幸運にも意識せずに来られた大多数のユーザーが将来的潜在的には驚きとともに多重代入の評価順の詳細を理解させられるんだろうなということを考えると「作り込む価値はあるただしうまく実装できる限りにおいてはという評価が妥当かなと思う


20201124()

最終更: 2020-12-08T00:48+0900

[Ruby] 多重代入の難しさの一例(Ruby 2.7Ruby 1.9 で確)

4月多重代入は遅くて時々評価順が難しいと書いたけどさらに難しいケースを考えたクイズです。

a = *0..5 #=> [0,1,2,3,4,5]
b = *0..5 #=> [0,1,2,3,4,5]
a[i=2] #=> 2
b[j=2] #=> 2

a[i+=1] = a[i] # a はどうなる?
b[j+=1],= b[j] # b はどうなる?

a #=> [0,1,2,3,4,5]
b #=> [0,1,2,2,4,5]

a の結果を確認してから予想してカンマを付けたら予想通りの結果になったので驚きはないけどっぱり普通の代入とは違うんだなあとそれが遅くなる理由かなあと思いました

ゴルフーしかこんなコドを書こうとはしない? その通り


20200930()

最終更: 2021-01-19T03:44+0900

[Ruby] 平衡二分探索木

 前置き

最近こういう記事を読んだ(20200912p01)Python】平衡二分木が必要な時に代わりに何とかするテク【競プロ】 - Qiita

その少し前に雰囲気で書こうとしたけどバラスの取り方に対する理解が雑で完成しなかった(20200604p01.04)

Ruby の標準添付ライブラリにある SortedSet は内部構造がハッシュテーブルでありキーの順序付けが利用できないありていに言えばキーの二分探索をしたいができないRBTree ライブラリ (https://rubygems.org/gems/rbtree) が利用可能である場合内部記憶としてハッシュの代わりに RBTree を使用します ということが書いてあるけどRBTree が利用可能だったことがない

 再挑戦した。sset.rb (3.8 KiB)

  • SortedSet と食い違いが見つかるまで無限ループさせてみたけど限られた範囲のキーと限られた時間では止まらなくなった(こういうときはテトの失敗を疑うだから最初に失敗するテトを書いてそれを満足させるように実装を埋める)
  • 性能はまったく期待できないったく

    注意すれば省メモリにはなるかもしれないけど出し入れのたびに配列の全長のおよそ半分を右へ左へ動かしていたのでは他に何も期待できない

    注意を要するのは rotate_l/rotate_r の実装このとき(20200905p01.07)のように不必要に膨大なメモリ要求が実行速度まで低下させかねない

    すばらしき(20200912p01.03) Array#fill メソドにならってArray#rotate も第2引数以降を使って対象範囲を受け付けたらいい

  • 内部構造「社長から始めて決まったやり方で社員を一列に並べていったらある社員とその部下と部下の部下以下末端までを一定の連続する範囲で表せるのではないかと考えたなんのことはないそれって深さ優先探索と同じ順番だったのだけど(20200607p01.02)と書いたときのものと同じ

    その後の検索最小共通祖先 [いかたこのたこつ]というページを見つけてLCA「オイラーツアという用語を仕入れているそんな感じの構造

    っと待てドメイン名は……。20200905p01.03 で参照した AtCoderikatakos さんと同じでは?

  • 苦労の 70 % くらいは sinkpush の2メソドを見出すところにあった気がする実装することではなくシグニチャを発見するまでのところにでもどういう操作が必要かどういう操作であれば十分か実装を始めてデバッグをする過程でしか見つけられないジレンマ

    以前にも似たようなことを書いているメソド名を決めるまでで 9割が終わってる そのときはその後の検索「最小全域木「プリム法「クラスカル法という用語を仕入れてクラスカル法で再実装しているが今回はどうAVL木とか赤黒木とか知らないよ?>平衡二分探索木 - Wikipedia

  • key の順序(SSet#index(key))と内部配列の添字の変換に何か魔法がないものありそうではない
    • 最大値と最小値を蓄えている内部配列における位置は計算で求まることがわかった
    • ト列における順序と内部配列における添字という2つの数字を元にして each メソドが簡略化できそうな気がするしたい

      つまり現在の向き(行きか帰りか)と次の添字がわかるならスタックがいらなくなる開始点(最小値の添字)はもうわかっている

これ二分探索のためにあらかじめ並べ替えたソト済み配列だ(いま気がついた)Array#bsearch_indexArray#insert で済むものをよくも難しく書き直したものだ

メモリブロックの移動を減らすためにギチギチに詰め込まないでルーズに管理しようとしたら固定長の大きさを持っていて最大値と最小値で特徴付けられる疎な配列()の入れ子構造に行き当たってピボトはいらないなそうするとこれ木じゃないなただの(入れ子になった)ト列になっちったなゃあ原点に戻ってあれも(並べ方が素直じゃないだけの)ト列だなと気がついた次第

っていることも忘れてい[単行] K.ールホル, P. サンダース【アルゴリズムとデータ構造―基礎のツールボックス】 シュプリンガー・ャパン株式会社をぱらぱらめくってると(a,b)-木という構造があってこれは木の各ドが最長で長さ b の子ド列を持つらしくてつまりは入れ子になったソト列なんだけど……

入れ子になったソト済み配列もやっぱり木?


20130414()

最終更: 2013-04-15T03:23+0900

[SakuraEditor][Ruby] サクラエBBS[7601]

  • Editor定数の参照で落ちる他の名前なら問題なし
  • $Editorとすることで Editorオブジトが得られる
  • マクロコマドは先頭を小文字にしないと呼べない(TraceOuttraceOut)
  • Editorオブジトに SCRIPTITEM_GLOBALMEMBERSフラグが付いてるとRubyマクロのばあい ITypeLibが必要になる(ITypeInfo->GetContainingTypeLibを実装する必要があ)
  • ITypeInfo->GetFuncDescがマクロコマドの数(271)×3マクロを実行する前に呼ばれる
  • 3回目に取得された ITypeInfoがリリースされない
  • Editorオブジトもリリースが足りない
  • 実行の成否にかかわらず一回につき 100KBぐらいメモリ使用量が増える
  • リソースリークをなくしたければ参照カウトを捨ててマクロ実行の前後ですべてのオブジトの作成・破棄を行うのが確実
  • 12回目のマクロ呼び出しが必ず失敗する例外が発生しているもよう
  • TYPEATTR.cFuncsの数を減らしてマクロコマドの数をごまかすと 11回を超えて成功するようになったりリリースモドにしても回数は変化する
  • 失敗しても繰り返しマクロを実行してるとときどき成功する
  • マクロ実行に失敗するときIActiveScriptParse->ParseScriptText直前の IActiveScript->SetScriptState(SCRIPTSTATE_STARTED)呼び出しから足取りがつかめなくなる
  • SetScriptStateを飛ばして ParseScriptTextを実行するようにすると例外はなく正常にエラーメッセージ("実行に失敗しました")が表示されるなんにせよ失敗
  • スクリトエンジンをマクロ実行ごとにきれいに片付けられていれば○回目から失敗みたいなことは起こらないと思うんだけどなにが継続しているのかあるいはこちらの何が破壊されていってるの

どうせ Rubyマクロはコマドの先頭を小文字にする必要があって他のマクロと同じように書けないのだし使われてないからこれまでに書かれたマクロ資産との互換性を図る必要もないし例外とリークの元になり実行前の負荷も発生させる SCRIPTITEM_GLOBALMEMBERSフラグを落とすのがいいと思うScriptEngine名が "RubyScript." で始まるときとかに限って

SCRIPTITEM_GLOBALMEMBERSフラグを落とすと $Editor.insTextだけのマクロは何十回でも問題なく実行できてるけどそれだけで安心してよいものEditorと書いたときのように(数字で始まるマクロコマドを呼んだときも?)初回で確実に落ちるというだけならいいけど何回も実行してるうちに運が悪ければ落ちるというのがあれば(たち)が悪い


20130213() 見られてるわかってるのに何度でも振り向いてしまう。PERSIは美猫だに■パーシって読んでる(呼んではいない)■目赤外線で目をポイトするとこちらへ焦点を合わせるようなギミックはないものありそうなのは赤外線より磁石かな近づける動かす方向を保ったまま遠ざけるグラスアイの追視は運要素が強すぎるよ■もう一体乳首と爪を同じ色で塗ろうかとものぐさな計画をたてていたがこれが思いがけずエロックな想像だったって爪を見られるとき乳首を見られてるような気持ちになるってことだ<っさん自重■せっかくの球体関節人形(※英語だとball-jointed dollとかいうんだろう雰囲気台無しガンプラみたいだ(子供の頃は混在期で2種類のグレーのポリキップのどちらかが使われていた新しいものにボールジョイ))なんだから膝が見える丈のスカトがいいね■美猫ってびびょうって読むんだろうイメージ喚起能力に乏しいしきれいな音でもないけど美人や美姫も先入観を取り除けば似たようなもの何も考えないとびねこって読みたくなるみびょうの可能性もなくはないかなと思うが予防医学か漢方のイメージが先に立つみねことなると誰かの名前みたいだ228「美猫に振られるルビ「びじん これ常識なw ソース「綿の国星とかw228が大正解w■前からちらちら物色してるんだけどデジカメが欲しくなるなあ三脚も必要だ重視したい機能は GPSトの目を超える分解能と目を見開かされるような解像感(セクション3へつづ)

最終更: 2013-02-22T00:42+0900

[Ruby] どうしていいのか困り果てるバグに当たったのでバージョンアップする

日本語を含むフルパスを File.expand_pathすると文字列そのものは変化しない(ように見える)のにファイルを見失う

C:\>irb19
irb(main):001:0> File.directory? "C:/コピー"
=> true
irb(main):002:0> File.directory? File.expand_path "C:/コピー"
=> false
irb(main):003:0> "C:/コピー" == File.expand_path("C:/コピー")
=> true
irb(main):004:0> RUBY_DESCRIPTION
=> "ruby 1.9.3dev (2011-09-23 revision 33323) [i386-mswin32_100]"
irb(main):005:0> $:
=> ["C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/site_ruby/1.9.1", "C:/Program Fi
les (x86)/ActiveScriptRuby-1.9/lib/ruby/site_ruby/1.9.1/i386-msvcr100", "C:/Program Files
(x86)/ActiveScriptRuby-1.9/lib/ruby/site_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1
.9/lib/ruby/vendor_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/vend
or_ruby/1.9.1/i386-msvcr100", "C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/vendor
_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/1.9.1", "C:/Program Files (x
86)/ActiveScriptRuby-1.9/lib/ruby/1.9.1/i386-mswin32_100"]
irb(main):006:0>

ところで RubyUnicode文字を含む(Shift_JIS()に含まれない文字を含む)パスを扱えるようになっているだろう方法はあるけどやり方を間違えていただけだろう


2009年に書いた自分のスクリトをきちんと動くようにしようと引っ張り出してきたRubyの対象バージョンを 1.8から 1.9.3にして ruby-mp3infoGitHubからダウンロドしてきた最新版に差し替えただけで肝心な部分はほとんど終了それにしても4年前の自分がきっちりトムアップでプログラムを構造化していたことに驚いた最近 PRS-650のために書いたスクリトとは比べられないRubyこうあるべきと書き手が考えるソースコドの流れを比較的自由に表現できる言語であるから言語の制約を気にせず頭の中に理想形を持っておくのが大事クラス構文があるからクラスを作るんでなくこう書きたいという欲求を満たす選択肢としてクラスがある理想の有無が同じ書きたいように書いた結果に雲泥の差が生じる理由忘れてた


このバグだ>Backport #5629: Windows環境で日本語を含むパスに対してFile.expand_path が存在しないパスを返すパターンが存在する - Backport93 - Ruby Issue Tracking System一年前に 1.9.3にバックポトされて解決してる。Ruby-1.9.3-p385にアップデトするにはいいタイミングだったし都合のいい理由付けになった


似たような問題がまだ requireに残ってたみたい >Bug #7881: Windows でパスに日本語を含むスクリトからの require が失敗する - ruby-trunk - Ruby Issue Tracking System

最終更: 2013-03-03T06:08+0900

[Ruby] moumar/ruby-mp3info at 9e08852356ff46716d00fac3b553904c8ea503d3 · GitHubに加えた変更点

  • ID3v1がもともと存在しないファイルに ID3v1を付け加えないようにremovetag1してさえ ID3v1が書き出されて困惑した<<同じ対応を ID3v2にもとったらタグなしの mp3ァイルにタグをセトすることができなくなるv1v2がと気にするのなら tagでなく tag1tag2を使い分けるべきなのかもでも "universal tag"を使いたいのだよねもともと v1v2を両方書き出していたけど v1があると v1を優先してしまう困ったソトがあるために v2だけにしたいという今の自分がおかれた状況でタグを操作する部分から tag1に関連する部分を削除してまわるというのはうまい考えではない使用するソトが変わってやっぱり v1もあった方がいいとなったらどうする?タグ操作は universal tagで共通化したいならuniversal tagを制御するフラグが足りてないように思う
  • tag["tracknum"]を文字列として扱いID3v1に書き出すときにだけ to_iするように文字列で扱った方が(全体でトラックあるのかという)情報のロスがないので
--- ruby-mp3info-master\lib\mp3info.rb~	Wed Feb 13 16:34:42 2013
+++ ruby-mp3info-master\lib\mp3info.rb	Wed Feb 13 20:48:38 2013
@@ -272,7 +272,7 @@
             next unless tag_value
             @tag[key] = tag_value.is_a?(Array) ? tag_value.first : tag_value
 
-            if %w{year tracknum}.include?(key)
+            if %w{year}.include?(key)
               @tag[key] = tag_value.to_i
             end
             # this is a special case with id3v2.2, which uses
@@ -381,7 +381,7 @@
       puts "@tag has changed" if $DEBUG
 
       # @tag1 has precedence over @tag
-      if @tag1 == @tag1_orig
+      if @tag1 == @tag1_orig && ! @tag1.empty?
         @tag.each do |k, v|
           @tag1[k] = v
         end
@@ -418,7 +418,7 @@
             ((@tag1_orig["year"] != 0) ? ("%04d" % @tag1_orig["year"].to_i) : "\0\0\0\0"),
             @tag1_orig["comments"]||"",
             0,
-            @tag1_orig["tracknum"]||0,
+            @tag1_orig["tracknum"].to_i,
             @tag1_orig["genre"]||255
             ].pack("Z30Z30Z30Z4Z28CCC")
           file.write(str)

 利用側でのモンキーパッチング

VistaWindows Explorerでタグを書き換えると encoding_index0(iso-8859-1)になるんだけどこれを信用して変換すると日本語文字が化けるので Windows-31Jにしてみた

require "mp3info"
ID3v2::TEXT_ENCODINGS[0] = "Windows-31J"

20110930()

最終更: 2011-10-01T04:28+0900

[Ruby] Google Code Jam Japan 練習問題

練習問題それも ABは撃墜されました

# small用
def last_output(n, k)
	snappers = [false] * n
	k.times{
		# 電流をたどってひっくり返す。
		0.upto(n-1){|i|
			snappers[i] = ! snappers[i]
			break if snappers[i] # previously OFF (=next snapper's IN was OFF)
		}
	}
	return snappers.all?
end

# large用
def last_output(n, k)
	# k1 = 2**n-1 # k1:最初に n個の snapperがすべて ONになる操作回数.
	# k = p*k1+(p-1) を満たす自然数pが存在するなら電球は ON.
	return (k+1)%(1<<n) == 0
end

caseno = 0
$stdin.readline; # drop # of cases.
$stdin.each_line{|ln|
	n,k = *ln.scan(/\d+/).map(&:to_i)
	break unless k
	caseno += 1
	puts "Case ##{caseno}: #{last_output(n,k)?'ON':'OFF'}"
}

20110519() Logicoolの製品情報ページURLのフラグメ(ッシュの後ろ)onclickドラで小賢しい見た目の操作をしてるけ「戻るに対応していない読み手の感覚として明らかにページ移動をしている(ダ・ッタといったテンプレトを除いてページ全体が書きかわってる)のにURLが変わっておらず履歴にも残っていないからだ枝葉にこだわるなら徹底的にやりな一方ダイソンは……クエリトリングを使いスクリトが有効ならページを動的に書き換え無効化されていても情報を表示できないなんて間抜けはおかさなかった何が主で何が従かがわかってる

最終更: 2011-05-19T13:48+0900

[Ruby] lostlots of? だとしても informationlots?

7. In app code, never use force_encoding to convert BINARY data into a particular encoding. By the time you've reached app code, you have lost the information about which encoding is being used. Instead, find where the String came into Ruby, and fix it to set up the encoding based on the information it knows.

アプリケーションコドの場合バイナリデータを特定のエンコングに変換するために force_encoding を決して使わないことアプリケーションコドをいじっているのであれば 使用されているエンコングに関する情報をたたくさん持っているはずである この場合その文字列がどこからRubyにやってきたかを突き止めわかっている情報に 基づいてエンコングを設定するように修正すること

ときどきの雑記帖 迷走編

いまもって Ruby 1.9のエンコングに関するベトプラクスがわからないのですごくためになるリ7はこう理解した

(文字列のエンコング情報が失われた)末端コドで(その場で必要とされるエンコングに基づいて場当たり的) force_encodingしないことその文字列の来歴をたどって一番根っこ(※ライブラリの修正が必要かも)で正しい情報(※ないのなら慣習に従うかその不完全なプトコルを捨てる)に基づいて force_encodingすること(末端コドで必要に応じて行うのは encodeったり encode!)


20110411()

最終更: 2011-04-16T21:35+0900

[Ruby] HsbtDiary(2011-04-11) rubygemstaintLOAD_PATH$SAFE について

前にこうならんかな?って書いたのをもう一度

require 'hoge'

したときに hoge.rbなり hoge.soなりが tainted$LOAD_PATH要素に基づいて発見されたときは SecurityError見つからなければ taintedな要素はスルという動作を Rubyに期待したい今は tainted$LOAD_PATH要素を無造作に File.expand_pathして SecurityErrorが起こるに任せているんではなかった


 @2011-04-16 Ruby 1.9.2p1361.8.7p330で挙動が違うのが SecurityErrorへの疑問を増す。

1.9.2では(確かめたわけではないけど)汚染されたパスの展開がセキュリエラーにつながってるから汚染されたパスが $LOAD_PATHの末尾にあった場合は $SAFE=1の状況下で require 'cgi'が成功する。require '存在しないファイ'はセキュリエラ汚染されたパスを基に展開を試行したかどうかが分かれ目

1.8.7では $SAFE=1の状況下で汚染された文字列を引数にした File.expand_path1.9.2と違い成功するものの上のような場合でも require 'cgi'に失敗するこれは requireが内部的に File.expand_pathを呼び出し――これは 1.9.2とは違いセキュリエラーを起こさないけれど 1.9.2同様汚染された文字列を返す――その汚染された戻り値を使った require_internal(仮名)1.9.2とは違い $SAFE=1のときにセキュリエラーを起こしてるのだと思う挙動からの推測

一貫性が欲しかったねできれば実用的なもの特定のトリ(汚染された$LOAD_PATH要素)に特定の .rb, .soァイル(requireされたファイル)があるかないか判った(SecurityError or not)ところでどうだというの


20110312() combinationメソドを調べるために Ruby 1.8.7ドキュメトを少し読んだ(常用のリファレスは20051129)choiceから sampleへの名前変更は良かったchoiceは意思を明らかにする行為だと思うからランダム抽出とは相容れないよ(それとも神の選択か)Ruby 1.8.8 以降では Array#sample を使ってください Ruby 1.8.8 は出るんでしょうか?

最終更: 2011-03-15T00:15+0900

[ProjectEuler][Ruby] Problem 71, 72

 Problem 71

HCF(n,d)=1には用語の説明があると思ったんだけどなかったn/dndは最大公約数が 1の既約分数だとすると意味がとおるので HCF=Highest Common Factorだと決めた(っちあげ)

分数とはなんぞやだとか切断だとか小難しく考えてしまったが(実際には考えられるほど知らない)ワンライナーだった3/7より少し小さい100万個の分数を小数になおして一番小さいものを見つける有理数にして比較しないのは時間がかかるから公約数をみつけたりする時間だろう

require 'rational'
p Rational(*(2..1_000_000).inject([0,1]){|answer,d|
	answer[0]/answer[1].to_f < (d*3-1)/7/d.to_f ? [(d*3-1)/7,d] : answer
})

 @2011-03-14 なにこれ!

Project Euler Problem #71 « KeyZero Conversation

分数を初めてならった小学生が必ず間違える分数の足し算(通分せずに分母どうし分子どうしを加算する)にこんな意味があるとか!

 Problem 72

分単位のお時間がかかります。(:一時間はかからないけど…)

何倍も速くなるのInteger#prime_divisionを使う代わりに 100万要素の配列を使ってるトレドオフで使用メモリは数MBから 100MB超になる 小手先のチーンよりアルゴリズムを改良しろってのはもっともだけどかなしいかなできることとできないことがあるのです。

LIMIT = 1_000_000
pfs = Array.new(LIMIT+1){ [] }
count = 0
2.upto(LIMIT){|d| # 0) LIMIT以下のすべての分母 d に対して、
	print d,"\r"
	count += d-1 # 1) とりあえず d-1 通りの分子を計上し、
	d.step(LIMIT, d){|_| pfs[_] << d } if pfs[d].empty?
	# 2) 8分の6など通分可能なものを差し引きする。
	(1..(pfs[d].size)).each{|r|
		cms = pfs[d].combination(r).map{|pf| pf.inject(&:*) }
		count -= (-1)**(r%2+1) * cms.map{|cm| (d-1)/cm }.inject(&:+)
	}
}
p count

Ruby 1.9からバックポトされてきた(のだと思われる見覚えのないメソ) cycle, tap, combination, permutation, productといったメソドが便利だあとは自然数を無限に生成し続ける無限リトのようなものをどれだけ簡単に書けるかだなにかシトカトがあるのだろうこれでは長すぎる

Enumerable::Enumerator.new(lambda{|&block| n=0; loop{ block.call n+=1 } }, :call).each{|x| p x }

それとblock.callの部分を yieldにできないのもわかりにくいProcblocklambdaの微妙な違いによるものなのだろう

Rubyによる他所の Project Eulerの解答をみていてこういう書き方も知ってるけどカウンタが Floatになっちゃうのが不満

1.upto(1/0.0){|n| p n }

あれ? FixnumFloatになるのは stepった

1.step(1/0.0){|n| p n } # 1.0, 2.0, 3.0,...

明示的に Fixnumの増: 1を指定しても nFloat. この違いはなんだろう


cycleの使い道として zipを想定していたが拒否されてしまった

irb> [1,2,3,4,5].zip([0])
=> 1, 0], [2, nil], [3, nil], [4, nil], [5, nil
irb> [1,2,3,4,5].zip([0].cycle)
TypeError: can't convert Enumerable::Enumerator into Array
        from (irb):2:in `zip'
        from (irb):2
        from :0
irb> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]"

20100730()

最終更: 2012-11-01T13:41+0900

[SakuraEditor][SHJS][Ruby] Ruby%リテラルの色分けを修正

説明が面倒なのと誰も知りたくないだろうから適当に備忘のためだけに

  1. まさか %{literal}literal部分で \{\} を使う人間がいるとは思わなかった(違う種類の括弧を使えばいいじゃない開閉の釣り合いがとれてれば同じ種類の括弧でもエスケープ不要だ)
  2. だのに Ruby1.9rake.rbにこんなパターンが……

    %r{[*?\[\{]}
  3. エスケープされた { 2のはの考慮がないから閉じ括弧が足りないとしてファイル末尾まで正規表現として色分けされてしまう
  4. ょちょちょいと .rkw2ァイルにエスケープ文字を追加してサクラエタに対する修正は完了
  5. SHJSlang/sh_ruby.js(自作)への対応も同じですむはずが入力の末尾に達した時点で意図せぬバトラックが発動し閉じ括弧が足りなくても色分けが適当な閉じ括弧で終了してしまう現象に遭遇これは自業自得(20090808p01)なので自分でなんとかせねば間違いが埋没してしまうのはよろしくない
  6. こうした

    %r{余分な開き括弧{。間違いはインタープリタを通す前から目立つように}

2のは Rubyインタープリタに対するエスケープと同時に正規表現パターンとしてのエスケープですよ%r[\[]/\[/ が同じパターンになって%r[[]Rubyのシンタックスエラ/[/ がパターンのコンパイルエラーになるんだから(ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32] / ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32])


20100421()

最終更: 2010-04-22T02:07+0900

[Ruby] まつもと ゆきひろのRuby検定 - ITpro EXPO検定---ITpro EXPO 2008ITpro

ってみたTime.parseの問題がわからなかったのとブロック変数が外のローカル変数を変更してしまうかどうかという問題(Rubyのバージョンは?回答形式が)以外はたぶん問題なし回答を送信すると一分かそれ以上待たされた後「一度しか回答できませんってええええたしかにそう書いてあるのは読んだけど以前回答したことも忘れてるんですよそんなこと言われても

そういう要求をするのもそれを額面通りに実施してしまうのもある意味感心するけど首を傾げてしまう回答は適当に受け付けて後でルタリングしてから利用すればいいじゃないとここ「すでに受験した方は,前回の回答結果を参照できまとも書かれてるのに気付いたログインを要求されたから見られなかったけど回答を(回答者の要求に応じて参照できるようにしながら)抱え続けるのって誰得? Ruby検定の予想問題からのピックアップに過ぎないんですよこの問題って

回答形式が 一つ選べという問題だったのにチックボックスが使われていた他は問題形式によってラジオボタンとチックボックスが適切に使い分けられていたから出題形式を間違えたかフームを間違えたか後でフームだけ変更されたはてさて