Hatena::Groupgeneration1991

grafi-note @ g91

2011-12-17

斎藤正彦著の線形代数入門のあとがきについて

22:32

連立一次方程式について,私はクラメルの解法しか知らかなった.ところが,知り合いの工学者(計算機学者)から,行列式をたくさん計算するクラメルの解法は数値計算には向かない,むしろガウスの消去法を整理した《掃き出し法》の方がよい,と教わった.

そこで私は、行列の階数を基本変形によって矛盾なく定義できることを証明し,これによって一次方程式系の理論と解法(掃き出し法)の両方を同時に提示することができた.

この後,このやりかたに基礎をおく線形代数の教科書がふえてきたのはまことに喜ばしい.

なんか凄い。

すっきりとした構造で、かつ初学者にも理解できるような議論となっているように感じられて、良い教科書だと思います。もっと直感的な導入や多彩な例などが欲しい人には、長谷川浩司著の教科書も定評があって良さそうに思える。

自虐で締めるのはあまりクールじゃないしいい加減やめたいと思いつつ、線形代数可・線形代数演習不可の人間が何を偉そうなことを書くのだと。思わずには、いられない。そうして、書いてしまった。

quolcquolc2011/12/21 00:54僕は川久保勝夫先生の教科書が親切な構成で好きでした

2011-08-22

91-conf行きました

17:32

始めに、株式会社ドワンゴさん、会場提供ありがとうございました。

追記:女性参加者二人でした。自称美少女中学生はおいといて

近い年代の、様々な関心を持つ人々と接することが出来て、良い刺激になりました。今回女性参加者が三人もいたことは良い傾向だと思いますし(非コミュであまり喋れてなくてスミマセン)、今後、ますます多分野に渡る、肩肘張らない交流が出来れば良いと思います。

僕の発表のスライドは、http://grafi.jp/resources/2011-91conf-1/gentoo-g91.htmlで公開しています。HTMLなので明確な解像度は有りませんが、1024x768でスクロール無しで収まることを意識して作りました。

全体の発表を通じての感想と、個人的反省点。ひどいLTしたし普段考えてることも別の方向にひどいのに、ブログだけ全うそうなこと書いててなんかアレだなあ。

感想

様々な切り口の発表が有り、楽しかったですが、やはりコンピュータによる計算を軸とした発表が多く、プログラマーによる発表が多くを占めるのだなあとは感じました。

空気を発散させないためには話題にある種の共通性は必要なのでしょうが、計算機を中心に据えた話をする必然性は無くて、そういう点ではid:chihirovvさんの発表なんかが良かったのかなと思います。ちひろさんの本気凄い。後は、「お金の稼ぎ方」なんかになるのかな。

個別に面白かった話は色々あるけど、やはりid:quolcさんのが面白かった。ああいうポインタを列挙しつつ上手く話を収斂させる構成も勉強になります。

反省点

読みにくかった

twitterで読みにくいとの反応が有ったので。文字サイズが問題だったのか、端まで配置し過ぎて切れているのが問題だったのか、テキスト量が時間に比して多かったのが問題なのか、そのどれもなのか、などなど、コメント欄などで書いて頂ければ幸いです。

専門用語などを使いすぎた

プレゼンの対象層を読み違えたのが問題だったと思います。個人的にガチガチにプログラミングっぽい話をするつもりでは無かったのですが、説明のためにそういう言葉を多用したせいでそういう風に映ってしまいました。

対象層を全く考えていなかったわけでは無く、サーバー系よりデスクトップ系、そしてRubyの話は欠かせないよな、と、若めの層を対象とした話で有ることは意識していて、だからこそ個人的に作るのは比較的楽でした。

ただ、別にいわゆるエンジニア系じゃ無い人だっていましたし、プログラミング出来るからといってLinuxを使ったことが無い人だって多いので。

ディストリビューション、を何の説明もなしに重要な部分で使ってたのは致命的でした。

早口だった

もともと早口で、ゆっくり喋ろうと意識しないといけないのだけど、今回時間が厳しくてどんどん早口になってしまいました。

もう少し内容を絞るべきだったのでしょうが、話し方次第でもう少しマシになるのかもしれないと思うと残念です。

長すぎた

一応、俯瞰的な話をちょっとして、Portageに踏み込んで、そこから最近のアレコレをざっと紹介する構成でしたが、長かったですね。LTだということは意識して細かい部分は削るようにはしたんですが、もっと内容をガサッと削るべきでした。尺を考えると、後半で発散的にあれこれ紹介する書き方は良くなかったです。

謝辞

このような会を企画してくださったid:rosylillyさん、そして運営の皆さん、ありがとうございます。

参加者、そして発表者の皆さん、ありがとうございます。

最後に、会場を提供してくださった株式会社ドワンゴさん、ありがとうございました。(大事なことなので二回言いました)

2011-03-16

rubyは変態とは無縁の清きプログラミング言語です

09:16

大学受験生は入試が終わってからが新年なので今更Rubyで祝ってみる - grafi-note @ g91 - キューイチ世代のいい加減な解説みたいなもの。

happynewyear.rb

b=      []    ;z=%q(    eval(%w{    s="\x20"    ;r      ,*    a=2..0    x7db;r.map  {|  n|  a[  n]      ||  b<<n|r.map    {|i|r=    ==n*i&&a  
[n      *i  ]=      1}  ;k      ,*  c=      n;  k<      0x  7c      6|  |b          .e  ac  h{  |m      |l  oo          p{      n%  m<      1?
(c<<m;n/=m  ):break}}&  &S      TD  ER      R<    <k<<(c    [1      ]?  s+"="+s+    c*  "x  ":    ".rebm    unqemirp    qaqsiq".tr  ("q",s).  
re      ve  rs      e)  +"\n"};(    @z="b=xx        x[      ]x      x;  z=          %q  (Z  );      ev      al          xz      ;x  xx    $>  
x<      <x  xx      @z  \n          ".              gs      ub      ("  x",s*2))["    Z"  ]=        z}      *''));eval  z;      $>  <<      @z

ある程度読めるよう整形すればこんな感じです。こう整形してしまうとQuineにはなりませんが、大体動作はします。

happynewyear.rb

b = [];
z = %q(
  eval(
    %w{
      s = "\x20";
      r,*a = 2..0x7db;
      r.map {|n|
        a[n] || b<<n | r.map{|i|r === n*i && a[n*i]=1};
        k,*c = n;
        k < 0x7c6 ||
          b.each{|m| loop{ n%m < 1 ? (c<<m; n/=m) : break } } &&
          STDERR << k <<
            ( c[1] ? s + "=" + s + c*"x" : ".rebmunqemirpqaqsiq".tr("q",s).reverse) + "\n"
      };
      (@z = "b=xxx[]xx;z=%q(Z);evalxz;xxx$>x<<xxx@z\n".gsub("x", s*2))["Z"] = z
    }*''
  )
);
eval z;
$> << @z

%wを用いたリテラルを使えば任意個のスペースを要素の境界とする任意の文字列の配列が作れるため、それをjoinしてやれば任意のスペースを含まない文字列を作ることが出来ます。なので、スペースを含まないコードを書いて%wの中にいれて適当にスペース入れて整形して、join,evalで実行してやればコード整形が可能です。また、配列に対する*演算子はjoinと同じ働きをします。

Quineはevalに頼りまくりです。変数@zに格納して強引に置換して組み立ててます。

特に読みにくそうなところは

  1. \xの後に文字コードを書くことで文字コードに対応する文字を文字列に入れることが可能。"\x20"はスペースに対応。
  2. 多重代入の際、左辺側の変数に*がついていると、その変数には余った要素の配列が代入される。余らなかった場合は空の配列になる。変数aとcをこの方法で空配列に初期化している。

あたりかな?あとは、ぱっと見で何のコードが分かりにくくするために姑息なことしてたり、姑息なショートコーディングっぽいことしてたりします。もっと上級者ならさらに技巧を凝らすのだろうけどこのへんでいっぱいいっぱいでした。

2011-02-27

大学受験生は入試が終わってからが新年なので今更Rubyで祝ってみる

20:01

国公立大学二次試験前期が終わりました。というわけで受験一段落したので、僕にとってこれからが新年です。似たような境遇の人も多いかと思います。合否はこれからですが、取り敢えず盛大に祝いましょう。受験生もそうでない人も、若者らしくRubyでぱーと華々しくやっちゃいましょう。

happynewyear.rb

b=      []    ;z=%q(    eval(%w{    s="\x20"    ;r      ,*    a=2..0    x7db;r.map  {|  n|  a[  n]      ||  b<<n|r.map    {|i|r=    ==n*i&&a  
[n      *i  ]=      1}  ;k      ,*  c=      n;  k<      0x  7c      6|  |b          .e  ac  h{  |m      |l  oo          p{      n%  m<      1?
(c<<m;n/=m  ):break}}&  &S      TD  ER      R<    <k<<(c    [1      ]?  s+"="+s+    c*  "x  ":    ".rebm    unqemirp    qaqsiq".tr  ("q",s).  
re      ve  rs      e)  +"\n"};(    @z="b=xx        x[      ]x      x;  z=          %q  (Z  );      ev      al          xz      ;x  xx    $>  
x<      <x  xx      @z  \n          ".              gs      ub      ("  x",s*2))["    Z"  ]=        z}      *''));eval  z;      $>  <<      @z

ruby1.8.7,ruby1.9.2,ironruby1.1.1で動くことを確認してます。ライセンスはNYSLで。

$ ruby happynewyear.rb > happynewyear2.rb
1990 = 2x5x199
1991 = 11x181
1992 = 2x2x2x3x83
1993 is a prime number.
1994 = 2x997
1995 = 3x5x7x19
1996 = 2x2x499
1997 is a prime number.
1998 = 2x3x3x3x37
1999 is a prime number.
2000 = 2x2x2x2x5x5x5
2001 = 3x23x29
2002 = 2x7x11x13
2003 is a prime number.
2004 = 2x2x3x167
2005 = 5x401
2006 = 2x17x59
2007 = 3x3x223
2008 = 2x2x2x251
2009 = 7x7x41
2010 = 2x3x5x67
2011 is a prime number.
$ cat happynewyear2.rb
b=      []    ;z=%q(    eval(%w{    s="\x20"    ;r      ,*    a=2..0    x7db;r.map  {|  n|  a[  n]      ||  b<<n|r.map    {|i|r=    ==n*i&&a  
[n      *i  ]=      1}  ;k      ,*  c=      n;  k<      0x  7c      6|  |b          .e  ac  h{  |m      |l  oo          p{      n%  m<      1?
(c<<m;n/=m  ):break}}&  &S      TD  ER      R<    <k<<(c    [1      ]?  s+"="+s+    c*  "x  ":    ".rebm    unqemirp    qaqsiq".tr  ("q",s).  
re      ve  rs      e)  +"\n"};(    @z="b=xx        x[      ]x      x;  z=          %q  (Z  );      ev      al          xz      ;x  xx    $>  
x<      <x  xx      @z  \n          ".              gs      ub      ("  x",s*2))["    Z"  ]=        z}      *''));eval  z;      $>  <<      @z
$ crc32 happynewyear.rb
7cf2be7d
$ crc32 happynewyear2.rb
7cf2be7d

とまあ、他の方の年賀状に触発されてネタ作ったりしてました。標準エラー出力で素因数分解して、標準出力でQuine(自分自身を出力)。なお、crc32の出力は改行コードがLFとみなしたものであり、環境によって変わり得ます。

変態の方々と比べるとRubyのみのQuineは変態度が劣りますが、これでもショートコーディング頑張ったんですよ?解説はまた後日。

kabiykabiy2011/02/28 09:41ここは是非とも、<<EOFなどを活用して全て標準出力に

grafigrafi2011/02/28 15:35記事全体を<<EOFなど使ってQuineにするってことか?その発想は無かった…。