2018年7月7日土曜日

水やりはいつも深夜だけど / 窪美澄

水やりはいつも深夜だけど / 窪美澄(2014.11)

 5篇の短編集で、どの作品も家族を主題としたありがちな内容であるが、時々ぐっと心臓を押されるようなリアルさがある。2篇目の「サボテンの咆哮」が個人的に一番好き。



以下、Amazon.comより

内容(「BOOK」データベースより)

セレブママとしてブログを更新しながら、周囲の評価に怯える主婦。仕事が忙しく子育てに参加できず、妻や義理の両親からうとまれる夫。自分の娘の発達障害を疑い、自己嫌悪に陥る主婦。出産を経て変貌した妻に違和感を覚え、若い女に傾いてしまう男。父の再婚により突然やってきた義母に戸惑う、高一女子。同じ幼稚園に子どもを通わせる家々の、もがきながらも前を向いて生きる姿を描いた、魂ゆさぶる5つの物語。

著者略歴 (「BOOK著者紹介情報」より)

窪/美澄
1965年、東京都生まれ。短大中退後、広告制作会社、フリーの編集ライターを経て、2009年、「ミクマリ」で第8回女による女のためのR‐18文学賞大賞を受賞しデビュー。11年、受賞作を収録した『ふがいない僕は空を見た』で第24回山本周五郎賞を受賞、本屋大賞第2位に選ばれた。12年、『晴天の迷いクジラ』で第3回山田風太郎賞受賞(本データはこの書籍が刊行された当時に掲載されていたものです)

2018年7月6日金曜日

仕事ができる人は「負け方」がうまい / 宋文洲

仕事ができる人は「負け方」がうまい / 宋文洲(2009.9)

 著者が人間として出来た方であることが伝わります。「モチベーションは業績次第」など気づきが得られたテーマも多くありました。



以下、amazon.comより

内容紹介

「失業は怖くない」「世論を信じるな」「面白さは『マナー』」「差別が全部悪いとは限らない」――。ソフトブレーン創業者の著者が送る、歯に衣着せぬ人生指南。現代人の仕事に、人生に必読の1冊!

著者について

ソフトブレーン(株)マネージメント・アドバイザー。1963年中国山東省生まれ。85年に北海道大学大学院に国費留学。92年28歳の時にソフトブレーンを創業。2005年6月に同社東証1部上場。06年8月会長を退任し現職。著書は、ベストセラー『やっぱり変だよ日本の営業』ほか多数。

2017年4月23日日曜日

RStan(1): Windows で RStan の環境を構築する

お仕事でもお世話になっているRStan。とあるきっかけがあって自分のPCでも環境を整備しようと思いたちました。ブログを書くのも6~7年ぶり。

基本的に↓の要約です。

  1. Rのインストール (R 3.3.3 for widows)
    • 私の場合は昔入れた古いRがあったので、これをまずアンインストールしました。
    • その後、https://cran.ism.ac.jp/ から 
      • Download R for Windows → base
      • ここで普通は一番上のインストーラへのリンクをクリックしますが、後述するRtoolsのバージョンの関係で、一つ前のバージョンをインストールしました。
        • 下の方の Previous releases から R3.3.3 を選択しダウンロード。
    • インストーラは、すべてデフォルト設定で。

  2. Rをインストールした実感を得る
    • 言うまでもなく本項は省略可能です。
    • R x64 3.3.3 を起動する。コンソール画面が出てくる。
    • http://d.hatena.ne.jp/isseing333/20100515/1273928356
    • ↑こちらのサイトにある「set.seed(1)」から始まる部分をコピーして、コンソール画面に貼り付ける。
    • グラフが出てきて、おおおっとなる。
    • Rを終了する。workspaceの保存はどちらでも。

  3. Rtoolsのインストール (Rtools 3.3)
    • Windows用のRのツールチェイン。MinGWなどが含まれます。導入する意味が分からないまま、言われるままにインストール。(おそらく、StanにC++コンパイラが必要だからではないかと予想)
    • https://cran.ism.ac.jp/ へ戻り、Rtoolsへ。
    • インストールしたRとコンパチでFrozenされているバージョンをダウンロード。
    • インストーラは、ほとんどデフォルト設定ですが、環境変数PATHの更新のところだけチェックを入れます。(デフォルトでチェックが入っていないのが謎)
    • 1GB近くデータをインストールされます。気長に待ちます。
    • (余談ですが、RtoolsはC:\直下にフォルダを作ってインストールします。気持ち悪いと思いつつもターゲットパスは変えませんでしたが、気持ち悪いですね)
    • Rtoolsが適切にインストールされたか確認します。以下はR上での確認ですがコマンドプロンプト等でやっても同じはずです。
      • Rを再起動
      • > Sys.getenv("PATH") →RtoolsがPATHに含まれていればOK
      • > system('g++ -v') →インストールしたgccが呼び出されていればOK(gcc 4.6.3でした)
      • > system('where make') →同上

  4. コンパイラ周りの設定 (任意)
    • 元サイトでは「やらなくて良い」とありますが、原文だと「強く推奨する」とあったのでやっておきました。やっていることは、コンパイラオプションを最適化したり、推奨されるワーニングオプションを設定したり、といったもの。設定ファイルを作成(編集)しているだけです。
    • https://github.com/stan-dev/rstan/wiki/Installing-RStan-on-Windows#configuration にある、dotRから始まる8行と、cat('Sys.から始まる3行と、cat("\nCXXFLAGSから始まる2行とを、それぞれRコンソールにコピペするだけ。

  5. RStudioのインストール (RStudio 1.0.143)
  6. RStanパッケージのインストール (RStan 2.15.1)
    • Rを起動し、コンソールに以下をコピペ。
      • > install.packages('rstan', repos='https://cloud.r-project.org/', dependencies=TRUE)
    • BH, Rcpp, RUnit, ggplot2などもインストールされます。
    • RStanが動作することを確認します。4行目以下は一例。
      • > library(rstan)
      • > rstan_options(auto_write = TRUE)
      • > options(mc.cores = parallel::detectCores())
      • > sf <- stan_demo("pump") →ダウンロードに関する選択は1を。
      • > pairs(sf, pars=c("alpha","beta"))
        • それっぽいグラフが出てきます。

2011年2月25日金曜日

斜蹴、襲来

Haskellを勉強していこうと思います。

--euler #001 / recursion
let fizzbuzz a = (a `mod` 3 == 0) || (a `mod` 5 == 0)
putStrLn(show(sum(filter (fizzbuzz) [1..999])))

referring Problem 1 - Project Euler

自問自答 - スネオヘアー - コード進行

Original Key Db / Capo. 1 / Play in C / Tempo 97

[intro]
C " " " | G " " " | Am7 " " " | F " " " |
C " C/B " | G/A# " Am " |
F " " " | G# " " " | C " " " | F " G " |

[verse]
C " " " | C " " " | Am7 " " " | Am7 " " " |
F " " " | Fm " " " | C " " " | E7 " " " |
F " " " | F " " " | C " " " | Am7 " " " |
F " " " | F " " " | G " " " | G " " " |

[chorus]
C " " " | C " " " | Am7 " " " | E7 " " " |
F " " " | G " " " | C " " " | C " " " |

[bridge]
F " " " | G " " " | C " " " | C " " " |
F " " " | G " " " | C " " " | F " G " |
(1st: go back to [verse])

[chorus2]
C " " " | C " " " | Am7 " " " | E7 " " " |
F " " " | G " " " |
C " " " | C " " " | Am7 " " " | E7 " " " |
F " " " | G " " " | C " " " | C " " " |

[pre-outro]
F " " " | G " " " | C " " " | Am7 " " " |
F " " " | E7 " " " |
Am7 " " " | G " " " | F " " " | E7 " " " |
( Am7 " " " | G " " " | F " " " | G " " " | )
C " C/B " | G/A# " Am " | F " G " |
C " C/B " | G/A# " Am " | F " G " |
C " C/B " | G/A# " Am " | F " G " |
C " C/B " | G/A# " Am " | F " G " |

[outro]
C " " " | G " " " | Am7 " " " | F " " " |
C " " " | G " " " | Am7 " " " | F " " " |
C " " " | G " " " | Am7 " " " | F " " " |
...


referring: 「自問自答」 | スネオヘアー 歌詞/コード検索サービス | 楽器.me


Metronome by BestMetronome.com

2011年2月23日水曜日

なぜ Null は要らない子なのか

という記事があって面白かったので。

一番はやはりNullチェックを一々コードに埋め込むのは冗長だということに尽きる。

例1

Null云々とは少し違うが、例えば Door クラスを作ったとして、以下の2つのプロパティを書いたとする。

class Door
    private bool isShut
    private bool isLocked

ここで、
!isShut && isLocked
という状態は有り得ないので、Doorクラスを扱う際は『常に』気を使う必要がある。
例えば、isShutのsetter内に、falseにセットするときに次のように書いたり。。

if(newval==true){
    this.isShut = true
}
else{
    this.isShut = false
    if(this.isLocked){
        this.isLocked = false
    }
}

例2

あるいは、次のようなPersonクラスに、名前の総文字数を計算するメソッドを用意することを考える:

class Person
    private string FirstName
    private string MiddleName
    private string LastName

当然ながら、string型は Null にもなるし、空文字にもなる。
ので、次のメソッドは不十分で:

let TotalNumCharsInPersonsName(p:Person) =
    p.FirstName.Length + p.MiddleName.Length + p.LastName.Length

こんな風に書かなきゃいけない:

let TotalNumCharsInPersonsName(p:Person) =
    (if p.FirstName=null then 0 else p.FirstName.Length)
    + (if p.MiddleName=null then 0 else p.MiddleName.Length)
    + (if p.LastName=null then 0 else p.LastName.Length)



これだけ見ても、どんだけアホなんだと言いたくなる。
(でもプログラムを長く書いていると、もう慣れてしまってそのアホさに鈍感になってくる。)
じゃあどうやって解決するのか。それは、新しい型をつくることだ。

例1なら、こうする。
type DoorState =
    | Open | ShutAndUnlocked | ShutAndLocked

# then I could define
class Door
    private DoorState state

例2なら、こうする。
(ここにstringはnon-nullであり、Option<T>は(T型の値 or null)である)

class Person
    private string FirstName
    private Option<string> MiddleName
    private string LastName

let TotalNumCharsInPersonsName(p:Person) =
    let middleLen = match p.MiddleName with
                    | None -> 0
                    | Some(s) -> s.Length
    p.FirstName.Length + middleLen + p.LastName.Length

もうここにアホさは残っていない。本質的に必要な処理だけをコーディングしている。

結論

Nullはコードを不要に複雑にする。複雑さは全てのソフトウェアにおいて『敵』であり、我々は常にこれを排除するよう努めなきゃいかん。


元記事

2011年2月15日火曜日

ターミナルに切り替えずにコマンドを実行&結果確認

以前の俺


エディタでコード書いて、alt-tabでターミナルひらいて、↑押して実行して結果を確認して、またエディタに戻って、あぁ、またブラウザ開いてしまった、…エディタに戻って、コード書いて、ターミナルに…ああまたブラウザに以下略

Vim使うようになってから

  • エディタからコマンドを実行可能に
  • でも以前の実行結果が見たい時があって困る
  • 実行結果を大量に吐くコード、一度に全部吐かないコードだとさらに困る

新たな解


Focus on a test in Vim — Codeography
tail コマンドを利用した妙技を発見。すなわち

  1. エディタからコマンド実行するときにファイルにリダイレクト
  2. そのファイルを tail -f で開いとく
  3. エディタの隣にターミナル置いておけば…Wow!!


注意

モニタが小さいとあまり恩恵がない