過去の日記

2015-07-15 [長年日記]

ノラヤ・サイエンスバーに行ってきました [etc]

vol.2だけどvol.3だったノラヤ・サイエンスバーに行ってきました。
数学回でした。

ノラヤ・サイエンス・バー vol.2 数学編「折り紙とコンパスで"計算"してみよう」


プレゼン資料

折り紙とコンパスで計算してみよう@ノラヤ・サイエンス・バー


正五角形を定木とコンパスで書く。
正十七角形が定木とコンパスで書けることを確かめる。
加減乗除と二乗根を定木とコンパスで計算する。
定木とコンパスで書ける正多角形は。
折り紙で三次方程式が解ける。
正七角形を折り紙で折る(折れませんでした)。
というような内容。

辻さんは触れるゼータ関数でおなじみ(?)ですね!
内容もさることながら辻さんの数学語りが熱く、数学を超えて飛び交う色んなお話が楽しい一夜でした。
奇しくもその日にブラタモリで話題になっていた河岸段丘なんてキーワードも入り乱れているカオスっぷり。
いや、しかし正七角形をちゃんと折るのは難しい。


「折り紙で三次方程式が解ける」という話。
折り紙を折ったときの傾きが三次方程式の解になっているということでした。
2点が2つの直線に重なるように折った時、結果の傾きがパラメータ4つの和と差を係数にする3次方程式になることまでは確認。
解までは出してません(待て)。


2015-07-08 [長年日記]

街角の書店 [novel]

「ナックルズ」はよいアイディア。ホラー映画にでもなりそう。
表題作は蓬莱学園あたりに同じネタがあったような? という感じ。面白い。

「遭遇」はすじも雰囲気もよくてぐいぐい読ませる感じなのだけどオチがよく分からない。いつかまた読む。

街角の書店 (18の奇妙な物語) (創元推理文庫)

  • 作者: フレドリック・ブラウン,シャーリイ・ジャクスン
  • 出版社/メーカー: 東京創元社
  • 発売: 2015-05-29
  • ASIN: 4488555047
  • メディア: 文庫
  • amazon.co.jp詳細へ

枚数の少ない話もあって、長さは結構まちまち。いずれも傑作揃いでそこに不安はない。編者の東京創元社のアンソロジーはどれもよい。


2015-07-03 [長年日記]

MalformedInputException [java][Scala]

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 [長年日記]

白熱光 [novel]

何度かの中断を乗り越えてやっと読み終えた。と思ったら新刊がきているんだよ。

白熱光 (新☆ハヤカワ・SF・シリーズ)

  • 作者: グレッグ・イーガン
  • 出版社/メーカー: 早川書房
  • 発売: 2013-12-06
  • ASIN: 4153350125
  • メディア: 単行本
  • amazon.co.jp詳細へ


わけがわからないにもほどがある! とバーナード嬢のように叫び出したい感じ。



2015-06-18 [長年日記]

夜更けのエントロピー [novel]

「ドラキュラの子供たち」「ケリー・ダールを探して」「最後のクラス写真」。

夜更けのエントロピー (奇想コレクション)

  • 作者: ダン・シモンズ
  • 出版社/メーカー: 河出書房新社
  • 発売: 2003-11-23
  • ASIN: 4309621813
  • メディア: 単行本
  • amazon.co.jp詳細へ

ホラーに寄っている方が面白いけど、それでもなお「ケリー・ダールを探して」が良すぎる。
ちょっと曖昧な雰囲気の結末が多い?