2015-07-15 [長年日記]
■ノラヤ・サイエンスバーに行ってきました
vol.2だけどvol.3だったノラヤ・サイエンスバーに行ってきました。
数学回でした。
プレゼン資料
正五角形を定木とコンパスで書く。
正十七角形が定木とコンパスで書けることを確かめる。
加減乗除と二乗根を定木とコンパスで計算する。
定木とコンパスで書ける正多角形は。
折り紙で三次方程式が解ける。
正七角形を折り紙で折る(折れませんでした)。
というような内容。
辻さんは触れるゼータ関数でおなじみ(?)ですね!
内容もさることながら辻さんの数学語りが熱く、数学を超えて飛び交う色んなお話が楽しい一夜でした。
奇しくもその日にブラタモリで話題になっていた河岸段丘なんてキーワードも入り乱れているカオスっぷり。
いや、しかし正七角形をちゃんと折るのは難しい。
「折り紙で三次方程式が解ける」という話。
折り紙を折ったときの傾きが三次方程式の解になっているということでした。
2点が2つの直線に重なるように折った時、結果の傾きがパラメータ4つの和と差を係数にする3次方程式になることまでは確認。
解までは出してません(待て)。
2015-07-08 [長年日記]
■街角の書店
「ナックルズ」はよいアイディア。ホラー映画にでもなりそう。
表題作は蓬莱学園あたりに同じネタがあったような? という感じ。面白い。
「遭遇」はすじも雰囲気もよくてぐいぐい読ませる感じなのだけどオチがよく分からない。いつかまた読む。
枚数の少ない話もあって、長さは結構まちまち。いずれも傑作揃いでそこに不安はない。編者の東京創元社のアンソロジーはどれもよい。
2015-07-03 [長年日記]
■MalformedInputException
UTF-8として不正なファイルを作ります。
cat相当のJavaプログラムを作ります。
import java.io.*; public class cat { public static void main(String[] args) { try { BufferedReader r = new BufferedReader( new InputStreamReader( System.in ) ); String line; while ((line = r.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
class名が小文字だけど気にしない。
javac cat.java cat malformed.txt | java cat あ�お
と、不完全なシークェンスが出力されて終わります。
cat相当のscalaプログラムを作ります。
import scala.io.Source try { Source.stdin.getLines.foreach{x=> println(x) } } catch { case e : java.nio.charset.MalformedInputException => { e.printStackTrace } }
cat malformed.txt | scala cat.scala java.nio.charset.MalformedInputException: Input length = 2 at java.nio.charset.CoderResult.throwException(CoderResult.java:281) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.readLine(BufferedReader.java:324) at java.io.BufferedReader.readLine(BufferedReader.java:389) at scala.io.BufferedSource$BufferedLineIterator.hasNext(BufferedSource.scala:72) at scala.collection.Iterator$class.foreach(Iterator.scala:743) at scala.collection.AbstractIterator.foreach(Iterator.scala:1195) at Main$$anon$1.<init>(cat.scala:3) at Main$.main(cat.scala:1) : :
つらい。
なにがつらいかというと、エラーが発生した時の出力結果=正常にprintlnできた最後の行が実行するたびに変わってしまうこと。
つまり、エラーが発生したと思われる行を確認しても何も問題がないように見えるということです。
なんでだろうかと色々と調べて考えて、処理系のバグでも踏んだのだろうかとまで思いました。
違いました。
BufferedReaderが先読みをしているとき、その先読みをしている箇所でエラーが発生しているのです。
なので実際に正しくないバイトシークェンスは、正常にprintlnできた行よりももっともっと後ろの方に存在したのでした。
面倒だなぁ。
(というメモ。何か判明したか追記する)
一応追記
エラーがあるバイトシークェンスに対しての振る舞いの規定については
java.nio.charset.CodingErrorAction というクラスで定数が定義されている。この設定がJavaとScalaで規定値が違うらしい。
javaなら、
import java.io.*; import java.nio.charset.*; public class cat { public static void main(String[] args) { try { CharsetDecoder d = Charset.forName("UTF-8").newDecoder(); d.onMalformedInput(CodingErrorAction.REPORT); d.onUnmappableCharacter(CodingErrorAction.REPORT); BufferedReader r = new BufferedReader( new InputStreamReader( System.in, d ) ); String line; while ((line = r.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
として、InputStreamReaderの第2引数を指定するとScalaの様に例外を生成する。
scalaなら、scala.io.Codecを使って、
import java.nio.charset.CodingErrorAction import scala.io.{Codec, Source} implicit val codec = Codec("UTF-8") codec.onMalformedInput(CodingErrorAction.REPLACE) codec.onUnmappableCharacter(CodingErrorAction.REPLACE) try { Source.fromInputStream(System.in).getLines.foreach(println) } catch { case e : java.nio.charset.MalformedInputException => { e.printStackTrace } }
として、Codecの振る舞いをすげ替えてやるとJavaのような挙動になる。
Source.fromInputStream(System.in)(codec).getLines.foreach(println)
として明に指定してもよい。
CodingErrorAction.IGNORE を指定すると不正なバイトシークェンスは全部捨てる。
ついで
置換先の文字を変更する。
import java.nio.charset.{CharsetDecoder, Charset, CodingErrorAction} import scala.io.{Codec, Source} val d = Charset.forName("UTF-8").newDecoder() d.replaceWith("〓") d.onMalformedInput(CodingErrorAction.REPLACE) d.onUnmappableCharacter(CodingErrorAction.REPLACE) implicit val codec = Codec(d)
2015-06-29 [長年日記]
2015-06-18 [長年日記]
■夜更けのエントロピー
「ドラキュラの子供たち」「ケリー・ダールを探して」「最後のクラス写真」。
ホラーに寄っている方が面白いけど、それでもなお「ケリー・ダールを探して」が良すぎる。
ちょっと曖昧な雰囲気の結末が多い?