/ 最近 .rdf 追記 設定 本棚

脳log[2019-01-17~]



2019年01月17日 (木) 本の虫: Possibility of writing English C++ textbooks」■印象だけど、タイトルの「English C++ textnooks」から筆者の意図とはおそらく異なる意味を読み取ってしまった。本来の意図は「write ... in English」ではないかと思った。■「3 [限定] 英語の an ~ text|英語の本文.(ジーニアス英和辞典)」「2 relating to the language used in Britain, the US, Australia and some other countries: English grammar(ロングマン現代英英辞典)」という意味があるのは知ってる。でもスッと入ってこなかった。それぞれの辞典で最後となる3番目や2番目に挙げられた意味だということもあるし、イングランド方言の C++ について書かれたテキストである可能性が否定できないあたりが迂遠な表現だなと。■このブログの筆者が自分より英語力があるのは普段の記事を読んでいて間違いのないところではある。


2019年01月16日 (水) 小学校の国語の時間に、理由を聞かれているときの答えは「~から」のような形になるということを仕込まれたと思う。大人だからってそれができるとは期待できないかもしれないとは『[単行本] 新井 紀子【AI vs. 教科書が読めない子どもたち】 東洋経済新報社』が警告している。そのレベルで話が通じないと自分が自殺する精神科医になった気分になる。正常と異常は裏表であって一対一で向き合うと取り込まれて頭が狂ってしまうのではないか。ひょっとしたら正常になってしまったのかもしれない。結果をなんと表現してもそれまでの自分は死んでいる。


2019年01月15日 (火)

最終更新: 2019-01-15T14:13+0900

[ProjectEuler] Problem 29

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

普通に手続き的に書けば一瞬で答えが出る問題だったのに、前回も今回も(同じ)プログラムのバグのために答えが出なくて、でも素因数分解して漏れなく重複なく数えることもできなくて困っていた。バグが取れたので答えを出すのはコンピュータに任せる。

#!rubyw
# coding: utf-8

h = {}
(2..100).each{|b|
	(2..100).inject(b){|_,|
		_ *= b
		h[_] = _
	}
}
p h.size

最終更新: 2019-01-16T18:40+0900

[ProjectEuler] Problem 32

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

(そういえば以前も何度となく同じことを書いていたなと思い出しながら)泥臭く手を動かしただけ。

#!rubyw
# coding: utf-8

Digits = *1..9
found = {}
(1..2).each{|_|
	Digits.combination(_){|l_cmb|
		l_cmb.permutation{|l| l = l.join('').to_i
			Digits.combination(5-_){|r_cmb|
				r_cmb.permutation{|r| r = r.join('').to_i
					p = l * r
					found[p] = "#{l} * #{r} = #{p}" if /^(?:([1-9])(?!.*\1)){9}$/ =~ "#{l}#{r}#{p}"
				}
			}
		}
	}
}
p found.keys.inject(&:+)

最終更新: 2019-01-15T16:36+0900

[ProjectEuler] Problem 33

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

ただ手を動かしただけ。

#!rubyw
# coding: utf-8
require 'mathn'

found = []
(1..9).each{|numer|
(1..9).each{|denom|
	frac = numer / denom
	(numer+1..9).each{|cancel/|
		found.push("#{numer}#{cancel/}/#{cancel/}#{denom}") if frac == (numer*10 + cancel/) / (cancel/*10 + denom)
	(1..denom-1).each{|cancel\|
		found.push("#{cancel\}#{numer}/#{denom}#{cancel\}") if frac == (cancel\*10 + numer) / (denom*10 + cancel\)
	}}
}}
p found
p found.map(&:to_r).inject(&:*).denominator

最終更新: 2019-01-15T17:32+0900

[ProjectEuler] Problem 35

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

以前は require 'prime' を避けてた気がするけど、今回は使ってる。そうすると、ただコードに落とすだけ。

#!rubyw
# coding: utf-8
require 'prime'
require 'set'

primes = Prime.each(1_000_000).to_set
primes = primes.select{|p|
	s = "#{p}#{p}"
	l = s.length/2
	(1..l-1).all?{|i|
		primes.include? s[i, l].to_i(10)
	}
}
p primes
p primes.size

最終更新: 2019-01-15T21:09+0900

[ProjectEuler] Problem 36

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

例によって手を動かしただけ。

#!rubyw
# coding: utf-8

PalindromeGen = lambda{|digits|
	return Enumerator.new{|y|
		_next = lambda{|a|
			return digits.map{|_|
				a.map{|p10|
					"#{_}#{p10}#{_}"
				}
			}.flatten
		}
		odd  = *digits
		even = digits.zip(digits).map{|_| _.join('') }
		yielder = lambda{|p| y << p}
		loop {
			odd = _next[odd.each(&yielder)]
			even = _next[even.each(&yielder)]
		}
	}
}
p10gen = PalindromeNGen["0".."9"]
p2gen  = PalindromeNGen["0".."1"]
found = {}
loop {
	p10 = p10gen.next.to_i(10)
	break if 1_000_000 < p10
	p2gen.next    while p2gen.peek.to_i(2) <  p10
	found[p10] = p10 if p2gen.peek.to_i(2) == p10
}
p found.keys.map{|_| [_.to_s(10), _.to_s(2)] }
p found.keys.inject(&:+)

最終更新: 2019-01-15T23:54+0900

[ProjectEuler] Problem 37

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

手を動かしただけ。

#!rubyw
# coding: utf-8
require 'prime'
require 'set'

primes = Set.new
found = {}
Prime.each{|p| p = p.to_s(10)
	primes << p
	next if p.length == 1
	next unless (1..(p.length-1)).all?{|w| primes.include? p[0,w] }
	next unless (1..(p.length-1)).all?{|i| primes.include? p[i,p.length-i] }
	p found[p] = p
	break if found.size == 11
}
p found.keys.map(&:to_i).inject(&:+)

最終更新: 2019-01-16T18:01+0900

[ProjectEuler] Problem 38

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

手を動かしただけ。

#!rubyw
# coding: utf-8

found = {}
i = 1
9.downto(2){|n|
	loop {
		s = (1..n).map{|_| _*i }.join('')
		break if 9 < s.length
		i += 1
		next if s.length < 9
		next if s.index "0"
		found[s.to_i] = [i-1, 1..n] unless /(.).*\1/ =~ s
	}
}
p found
p found.keys.sort.reverse

最終更新: 2019-01-16T00:54+0900

[ProjectEuler] Problem 41

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。

素数って実はありふれてるので9桁までの素数を列挙するだけで許容時間(1分間)をオーバーしてしまう。9桁の順列(362880通り)を列挙して素数判定する方が早い。

#!rubyw
# coding: utf-8
require 'prime'

found = ("1".."9").map{|n|
	("1"..n).to_a.permutation.map{|_| _.join('').to_i }.select(&:prime?)
}.flatten
p found.sort.reverse

最終更新: 2019-01-16T03:47+0900

[ProjectEuler] Problem 54

面倒くさくて飛ばした問題にチャレンジ。

poker.txt の内容は本当にランダムなのか3番目までの高い役が1個も入ってなくて、コーディングの苦労が報われない。

#!rubyw
# coding: utf-8

Order = "23456789TJQKA"
flush = lambda{|cards|
#	p ["flush", cards] if (cards.match(/^ .(.)(?: .\1){4}/)||[])[1]
	(cards.match(/^ .(.)(?: .\1){4}/)||[])[1]
}
straight = lambda{|cards|
#	p ["straignt", cards] if cards.scan(/ (.)/).map{|_,| Order.index _ }.sort.tap{|_| break _ == (_[0].._[0]+4).to_a ? Order[0] : nil }
	cards.scan(/ (.)/).map{|_,| Order.index _ }.sort.tap{|_| break _ == (_[0].._[0]+4).to_a ? Order[0] : nil }
}
four = lambda{|cards|
	p ["four", cards] if cards.scan(/ (.)/).sort.join('').scan(/(.)\1{3}/).map{|_,| _ }[0]
	cards.scan(/ (.)/).sort.join('').scan(/(.)\1{3}/).map{|_,| _ }[0]
}
three = lambda{|cards|
#	p ["three", cards] if cards.scan(/ (.)/).sort.join('').scan(/(.)\1{2}/).map{|_,| _ }[0]
	cards.scan(/ (.)/).sort.join('').scan(/(.)\1{2}/).map{|_,| _ }[0]
}
pairs = lambda{|cards|
#	p ["pairs", cards] unless cards.scan(/ (.)/).sort_by{|_,| - Order.index(_) }.join('').scan(/(.)\1/).map{|_,| _ }.empty?
	cards.scan(/ (.)/).sort_by{|_,| - Order.index(_) }.join('').scan(/(.)\1/).map{|_,| _ }
}
highcards = lambda{|cards|
#	p ["highcards", cards]
	cards.scan(/ (.)/).sort.join('').gsub(/(.)\1+/, '').split(//).sort_by{|_| - Order.index(_) }
}
fullhouse = lambda{|cards|
#	p ["fullhouse", cards] if pairs[cards].length == 2 and three[cards]
	pairs[cards].length == 2 and three[cards]
}
straightflush = lambda{|cards|
	suit = flush[cards]
	first = straight[cards]
	p ["straightflush", cards] if suit and first
	suit and first
}
royalflush = lambda{|cards|
	first = straightflush[cards]
	p ["royalflush", cards] if first and first == 'T'
	first and first == 'T'
}

compare = lambda{|h|
	h.map{|_| Array(_).map{|_| _ ? Order.index(_)||-1 : -2 } }.tap{|h| break h.first.length != h.last.length ? h.first.length <=> h.last.length : h.first <=> h.last }
}

contest = lambda{|c|
	[royalflush, straightflush, four, fullhouse,
	 flush, straight, three, pairs, highcards
	].each{|ranktest|
		h = c.map(&ranktest)
		return compare[h] if h.any?{|_| _ and not _.empty? }
	}
	raise "no contest"
}

p DATA.lines.map{|ln|
	p1 = " " + ln[0, 15]
	p2 = ln[14, 15] + " "
	contest[[p1, p2]]
}.count(1)

__END__
content of poker.txt here.

2019年01月14日 (月)

最終更新: 2019-01-14T23:35+0900

[ProjectEuler] Problem 27

解けなくて飛ばした問題の中で一番最初の問題に再チャレンジ。a の定義、b の定義、b が限界を定める、というところから、あとは計算。15 秒くらいかかってもいいでしょう。

#!rubyw
# coding: utf-8
require 'prime'

a = *-1000..0
b = Prime.each(1000).reject {|_| _ < 80 }
remains = a.product b
(0..1000).each {|n|
	remains.reject! {|a, b|
		n     ==  b or
		n + a == -b or
		(n * (n + a) + b) <= 0 or
		not (n * (n + a) + b).prime?
	}
	puts "remains #{remains.size}"
	puts "a = %d; b = %d; n = %d" % [*remains[0], n] if remains.size == 1
	break if remains.size <= 1
}

2019年01月09日 (水) CodeFactor より CODE CLIMATE より前に MinGW ビルドのログを読んで g++ の警告を潰すべきだと思った。思った。■まあ、自分も他人に修正してもらっていたわけだけど。


2019年01月06日 (日) 他人を指導する、教え導くというとき、それは相手を侮っているということにならないのだろうか。自分が相手より多くの知識を持っている、優れた知見を得ているという前提があって初めてそれが可能になるのではないか。だったらそういう態度で接するとき、その前提を認めているのではないか。それは侮りではないか。■自分で自分の答えにたどり着くのを助ける、という言い方をして何か変わるだろうか。


2019年01月05日 (土) ドキュメントについて。目の前に動いている機械があるときに、その構造を読み取らずに説明書を読み始める法はないと思うんだよね。その機械を修理・改造しようとしている人間であればなおさら、構造から直に学んで説明書の誤りを指摘できるぐらいでないと役に立たない。というわけでドキュメントは、「お客さんに向けた取扱説明書」か「基本がわかっている人間に向けた内部を理解する時間を節約するための勘所」のどちらかになると思ってる。「わかっているべき基本」というのは道具の知識、対象一般の知識のこと。そういう固有でない部分を解説するのも読まされるのも双方の時間の無駄だと思ってる。あとは DTD みたいな、そのままコードの入力にすればいいじゃんというようなドキュメント。読むには重いし、コードでないから信頼できないし、コードと二重に維持するのがつらい。ドキュメントをコメントに置き換えたら、コードをそのまま日本語に翻訳したようなコメント(ドキュメント)が良くないというのも耳タコに繰り返されてきたことだ。『リーダブルコード』とかまだ読んでないけど、たぶん書いてあるのではないか。『プログラミング作法』か『Code Craft』でもいいだろう。■「tools/recipeProcessor.bat」に使用法のコメントがないのは、単に使い方を知りたがるほど興味を持った人間がいなかったからだ。引数の意味と実行結果とレシピファイルのフォーマットの解説くらいは必要だと思ってる。バッチファイルにコメントが少なくなるのは、行を分けないと書けないというのが多少影響してる。


2019年01月01日 (火) ジャッジのいない議論がどうなるか。仮にいたとしてもそれが信頼の置けないジャッジだったらどうなるか。相手を徹底的にやり込めるしかできなくなる。もうこれくらいでいいだろうと手を緩めたり、結果は火を見るより明らかだと安心したりできなくなる。だから右か左かというような、本質的に正誤優劣のない対立点を作る行為がすでに失敗だと思う。なんでふっかけてくるんだろうね。


2018年12月30日 (日) [C++]「【完全保存版】C++入門書籍おすすめ6選 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト」■参考にならない自分語り。基本的な文法については JavaScript をかじった後で 2000 年頃の Web で一通りなぞった。STL 黎明期で STL のまとまった信頼できる情報が Web に欠けていたので発売を待望して『Effective STL』を買った。その次は『C++ Coding Standards』。どこかの段階で『D&E』も読んでおくべきだと考える。リンク先で挙げられている本は1冊も開かなかった。マーケティング上の理由で「入門~」の皮を被っただけの本はその限りではないが、入門書なんていらんかったんや。Windows SDK とか開発ツールに付随するドキュメントを読んだ方が、半端な著者によるフィルタを通すよりよっぽど網羅された正確な情報が手に入ると思う。■ちなみに C++ はシープラスプラスと読んでいる。なんでリンクした先はわざわざそれと違うルビを振ったのだろう。内輪のなれ合いか?(穿ちすぎ)


2018年12月29日 (土) 人の嫌なところをあえて見に行って嫌な思いをすることはない。知らぬが仏。嘘で取り繕っていたと知ってもまだ大丈夫。取り繕おうとする意思はまだ評価できる。

最終更新: 2019-06-07T18:47+0900

[BOOX Max2] BOOX Max2

Sony の DPT-S1 や DPT-RP1 がフィットしないので(20181220)、よく知らないメーカーながら継続的に E-Ink 端末を展開している(らしい) Onyx の BOOX の大きいサイズをカッとなって買った(考えると買えない)。届いたのはクリスマス翌日。

BOOX Max2 BOOX Max2

SKTSELECT
¥ 86,184

  • 2018年7月のファームウェアが入っていたがクラウドから2018年11月のアップデートをダウンロードして適用したらホーム画面がデザインリニューアルで消えてしまった。それ以外はローカライズ漏れがなくなっていたり全体的に完成度が高まっていて良し。
  • PDF で見開き表示ができるが、閉じ方向を入れ替えたり、左右に表示するページの偶奇を入れ替えたりする操作はできなさそう。

    自炊して雑に PDF 化したファイルを読むときには必要で、単ページ表示なら問題にならない部分。

    Adobe Reader の見開き表示とは違って、1ページ目を表紙として単独で表示することがなく、2ページ目と合わせて見開きになる。皮肉にも丁寧に PDF 化していると必ずページの左右偶奇が入れ替わる仕様。

  • フォルダに入れただけのJPEG 画像を開いてページ送りすると次の画像が表示できるが、読書ツールバーに表示されるファイル名は最初に開いたファイル名のままになる。見開き表示ができないし、最後に開いていたページを記憶することもできないので PDF ファイルより扱いは劣る。
  • JPEG 画像を ZIP で固めただけのファイルは1枚目の画像しか表示できなかった。それなら JPEG 画像を PDF に固める方がいい。問題は PDF 化手順のコマンドラインツール化だが。
  • スタンバイ画面に PNG 画像が3枚だけ、シャットダウン画面に PNG 画像が1枚だけ割り当てられる。

    サイズ的に JPEG にしたい。もっといっぱいの画像をローテーションしたい。

  • 充電に関して不安があったが普通に USB(2.0) 接続してファイルを転送しているあいだに充電が完了していた。

    マザーボード(990FXA-GD80)が iPad のために一部の USB 端子を 1.5 A で充電するモードに切り替えられるらしく、それを使うつもり。

  • プリインストールの転送アプリを起動すると Max2 が Web サーバーとして振る舞うのでアップロードフォームからファイルをアップロードできる。ストレージ>WifiTransfer に保存される。
  • 大きさは正義。Sony Reader (PRS-650) との比較なのでページ切り替えも E-Ink なりにキビキビしていて進化を感じさせる。
  • 電源ボタンは絶対に鞄の中で誤動作する。持ち歩かないけども。

    立てかけることもできないね。

  • 画面が大きすぎて(目が悪すぎて)、端の方に焦点が合わない。
  • 本の情報フィールド(著者名とか)2か所で、%s というフォーマット文字列がそのまま表示されてる。
  • 最後のページまで読んでも 98 % とか 99 % とかの中途半端な進捗率にしかならない。そこは切り上げて 100 % にしようよ。
  • コネクタの位置を探してしまうのでホームボタン風にシールを貼った。
  • ピンチ操作によるズームは弊害がある。大画面ゆえに拡大したい場面はないのだけど、タップやスワイプがピンチに化けることがある。その後は1回のページ送りで次のページへ移動できなくなり面倒でしかない。ピンチ操作というオプションを無効化したい。

 改善要望まとめ (2018年12月のファームウェアに対して)

  • [Neo Reader] PDF 見開き表示で右閉じ・左閉じを反映してほしい。
  • [Neo Reader] PDF 見開き表示で半ページ送り操作をしたい。

    1ページ目と2ページ目を見開きで表示しているときに、2ページ目と3ページ目を見開きで表示させるのが半ページ送り(仮称)。ページ送りとは別の例外的な操作としてこれを行いたいときがある。

  • [Neo Reader] PDF 見開き表示のときでも Adobe Reader と同じように、1ページ目を表紙扱いとして単ページで表示してほしい。
  • [Neo Reader] Max 2 は大画面でありタップやスワイプが化けて面倒なだけなので、ピンチ操作(によるズーム)を無効化したい。
  • メニューボタンで出したメニューをメニューボタンで隠したい。

    戻るボタンに指を移動させるのは面倒だし、マニュアルによると以前は同じボタンで出し入れできていたはず。

  • ライブラリ画面で PDF ファイルを長押ししたときに表示される「著者」と「フォーマット」の情報がフォーマット文字列(%s)になっているバグの修正。

2018年12月28日 (金) 俺がヘイトを吐き散らす根本は何か。Mind your business. ってことだと思う。他人に干渉するな、自分のことだけやってろってこと。■Twitter で見かける「拡散希望」ってやつが自分には全く理解できない。で、それで、何が目的なの、何か得するの、と不思議でならない。あまりに理解から遠くてヘイトの対象にもならないのだけど、すごく嫌なものだという感覚だけがある。近寄りたくない。数が力だと認めたくないんだな。そんな現実はない! 直視しなければ存在しないというその態度!


2018年12月27日 (木) 赤信号みんなで渡れば怖くないって言うけど、みんなで渡っても赤信号は赤信号で許されることではない。それに「みんな」をよく観察すると、最初に渡った人間とそれに付いていっただけの人間の違いに気がつくだろう。先頭に立つ人間は自分が何をしているのか承知して、自らの意思で危険を冒している。付いていっただけの人間は自らの行為すら知らず、咎められ、はねられる運命。他人の考え、他人の作ったルール、他人の行動にただ付き従うだけの脳なしの人間を、人間の格好をした機械と同じだからこそ、軽蔑する。前にも書いたな>20160229■CodeFactor が指摘するから、ではない。自分の口で、なぜ、そうすべきであるのか、説明できなければいけない。説明されたって他人の仕事に横から後からちょっかいを出すようなスクリプトによる横断的な置換処理など認めたくはない。連続する空行が NG なんてのはただ指摘しやすいだけ、対処しやすいだけであって、意味のある仕事ではない。機械が生成したようなソースが読みたいならディスコンパイラでも作る方がよっぽど筋がいい。テキストで書かれたソースコードが一次ソースであるあいだは、それは人間の仕事であり、関わった人間が背後にいるからこそ、雑なスクリプトにちょっかいを出されたくない。最低でも「自分」を主語にしてぶつかってこい。それで初めて対等に張り合えるというだけだけども、それすらできてないってことだ。ツールを使って自分で自分を縛るのは結構。でも自分だけにしとけ。■前例を持ち出してきて過去にもそう書いてあるから同じように書く、というのは理由でも根拠でもないと書いた。赤信号とはこれのこと。真似しただけの人間より最初に書いた人間の方がよっぽどモノを考えてる。少なくともその期待が持てるが逆はない。理由や根拠にしたいなら直接問い質すか考察するかまでして、なぜそうするのか考えなければいけない。CodeFactor だって他人が考えたルールだ。それに自身の有用性を示すため、幅広いニーズを拾うために、とりあえず多くのチェックポイントを検知できるように作るだろう。展示目的でひたすら詰め込んで実用性のない十徳ナイフをありがたがるようにただ従うのは馬鹿だ。■面倒くさくて相手にしたくないみたいなのでここに書いてる。俺も反応があると面倒くさい。他人が面倒くさい。


2018年12月21日 (金) マーティ・マクフライは「Chicken(腰抜け)」というわかりやすいキーワードに対して反応していたけど自分の場合はなんだろう。「もっと俺に注目しろ(無視すんな)」っていう反応なんだろうか。メンヘラだな。