あのねノート

せんせいあのね、パソコンで字が書けるようになったよ

自炊しています

昨日の晩ごはんと今日のお昼ごはんで自炊みたいなことをしたので記録しておきます。

昨日の晩ごはん

冷凍ごはんと期限切れのミックスベジタブルがあったので使おうと思いました。

cookpad.comこのレシピを使いました。

刻み野菜の代わりにミックスベジタブル、バターの代わりにオリーブオイル、牛乳の代わりに豆乳、コンソメの代わりにブイヨン、スライスチーズの代わりにピザ用シュレッドチーズを使いました。分量が適当だったのでブイヨンの味が濃い目でしたがそれがなかなかいい感じでした。

f:id:momo_moemoe:20160924151741j:image

ご飯の量があまり多くなくてもけっこう量が増えるし、野菜を取った気分になれるし何より簡単なのでおすすめです。意外とさっとできます。

これを書いてる途中でコンソメとブイヨンの違いが気になったので調べましたが日本でははっきりした違いがないみたいな記事が出てきたりしてよくわかりませんでした。

 

今日のお昼ごはん

ミックスベジタブルがまだあって、冷凍うどんがあったので何かできないかと思って調べました。

cookpad.comこのレシピをベースにしようと思いましたが、去年買ったとんこつ味の鍋スープが残っていたのでコンソメ代わりに使うことにしました。味が別物になるなあと思いました。

バターがなかったのでオリーブオイル、牛乳の代わりに豆乳を使い、小麦粉はなかったので省略しました。とろみがなくなりましたがとんこつ味が豆乳でクリーミーになってまた別の料理ができた感じがしました。

冷凍うどんをゆでるのに鍋を使うのが大変だと思ったので次のサイトを参考にレンジ解凍しました。

nanapi.com
f:id:momo_moemoe:20160924151749j:image
そういえばインスタントのラーメンに牛乳を入れると濃厚豚骨っぽくなるって何かでやってなかったっけ。そんな味でした。

しばらくミックスベジタブル消費に勤しまないといけない気がするので(ちなみに他に冷凍コーンと冷凍枝豆が期限切れのようです)、何かいいレシピがあれば教えてほしいです。

「変愛小説集 日本作家編」を読みました

もともと海外の不思議な恋愛小説を集めた「変愛小説集」というのがあったのですが、その編訳者である岸本佐知子さんが選んだ日本作家の小説を集めた本です。もとの海外作家編が好きで、日本作家編も読みたくなったので買いました。小説が12作品入っていて、どれも不思議な話です。(恋愛ものじゃないような…?というようなのも混じっています)
全部どきどきして好きなのですが、一番印象に残ったのは村田沙耶香さんの「トリプル」という作品で、若い世代の間で3人での愛が流行し始めている世界が描かれます。2人で付き合うカップルに対し、3人で付き合うことはトリプルと呼ばれていて、大人世代からはトリプルはふしだらとされていますが、彼らはなぜ3人で付き合うのが変なのかわかりません。この小説では3人でのキスやセックスが描かれるのですが、不思議な儀式のような感じがします。最後には性別とか人間同士の境目がなくなっていく感じがしてきて不思議な気持ちになりました。

全体としてきゅんきゅんする恋愛ものではなく、最後に静かで不思議な気持ちになれる本なので、恋愛ものが苦手でも読みやすいのではないかと思います。また海外作家編も読みたくなりました。

変愛小説集 日本作家編

変愛小説集 日本作家編

たぬき暗号メーカーを作ってみる

わけのわからない文章の横にたぬきの絵が描いてあって、文章から「た」という文字を抜けば読めるようになるあれです。

Racketではreadという関数で標準入力を使えます。文字入力はシンボルとして扱われます。(""で囲うと文字列扱いになるみたいです)

> (read)
abc
'abc

こんな感じ。
入力したシンボルをsymbol->stringで文字列に置き換え、string->listで文字のリストにすれば入力をリストとして扱うことができそう。もっといい方法もありそうですが…
というわけで入力を文字のリストにする関数input->clistを作ります。

(define (input->clist)
  (let*
      ((input (read))
       (instring (symbol->string input))
       (clist (string->list instring)))
      clist)
  )

let使う必要ないかもですがこんな感じで文字のリストが返ってきます。

> (input->clist)
abc
'(#\a #\b #\c)

リストの要素の間に適当に「た」を挟めたらうれしいので、最初の文字と付け足したい文字と付け足す個数を受け取ってくっつけたリストを返す関数を作ります。

(define (append-c first c n)
  (define (c-list n) ;文字cをn個並べたリストを作る
    (if (= n 0)
        '()
        (append (list c) (c-list (- n 1))))
    )
  (append (list first) (c-list n)) ;文字firstとc-listをくっつけたリストを返す
  )

appendはリスト同士をつなぐので文字をリストに入れないといけないということを忘れててちょっとつまずいたりしてました。
動作確認するとこんな感じ。

> (append-c #\a #\c 2)
'(#\a #\c #\c)
> (append-c #\a #\c 0)
'(#\a)

あとはこれを再帰的に呼んで、挟む個数を乱数で出せばよさそうです。

(define (tanuki-maker)
  (define (tanuki-fact l) ;リストlを受け取って、1文字ごとに「た」を0~2文字挟む
    (if (null? (cdr l))
        (append-c (car l) #\た (random 3)) 
        (append (append-c (car l) #\た (random 3)) (tanuki-fact (cdr l)))))
  (let
      ((input (input->clist))) ;入力をリストに置き換える
    (list->string (tanuki-fact input)) ;「た」を挟んでできたリストを文字列にして返す
      )
  )

こうなります。

> (tanuki-maker)
ほんじつはせいてんなり
"ほたんじたつたはたたせたたいたてたんたなたたり"

元に戻す関数も作ります。

(define (inputanuki s) ;入力から文字sを取り除いて返す
  (define (remtanuki l)
    (if (null? (cdr l))
        (if (char=? s (car l))
            '()
            (list (car l)))
        (if (char=? s (car l))
            (remtanuki (cdr l))
            (append (list (car l)) (remtanuki (cdr l)))))
    )
  (let
      ((input (input->clist)))
    (list->string (remtanuki input))
    )
  )

こうなります。

> (inputanuki #\a)
abcaabc
"bcbc"

先ほどの"ほたんじたつたはたたせたたいたてたんたなたたり"を入力してみます。

> (inputanuki #\た)
ほたんじたつたはたたせたたいたてたんたなたたり
"ほんじつはせいてんなり"

無事元に戻すことができました。
何を再帰させないといけないかいつもわからなくなって混乱してしまうのがよくないなと思いました。あと、入力の例外(元の入力に「た」が入ってるとまずい)とかを工夫したほうがいい気もします。

東京に行きました

何も書かないのももったいない気がしたので書きます。高校時代の友達と2人で2泊3日で東京旅行に行きました。
写真がわんさか出てきてやたら長いのでここで切ります。メモも兼ねて雑多な記述なのですごい乱文です。

続きを読む

Racketでじゃんけん

あーこの夏結局何もしてないや、とりあえず簡単なのを書こうということでじゃんけんをしようと思いました。
入力された手とコンピュータが乱数で出した手の組み合わせで勝敗を判断して返すだけです。

#lang racket
;;グー=0, チョキ=1, パー=2
;;勝ち負けを判断するプログラム
(define (duel player com) ;入力をplayer, こちらをcomとして勝敗を返す
  (cond
    ((= player 0) ;playerがグーを出した時
     (cond
       ((= com 0)
        0) ;あいこなので増減0
       ((= com 1)
        1) ;playerの勝ちなので1増える
       ((= com 2)
        -1) ;playerの負けなので1減る
       ))
    ((= player 1) ;playerチョキ
     (cond
       ((= com 0)
        -1)
       ((= com 1)
        0)
       ((= com 2)
        1)
       )
     )
    ((= player 2) ;playerグー
     (cond
       ((= com 0)
        1)
       ((= com 1)
        -1)
       ((= com 2)
        0)
      ))
     ))

(define (jancom) ;comの手を乱数で決める
  (random 3))

(define (play) ;入力からplayerの手を判断する
  (let
      ((player (read)))
    (cond
      ((equal? player 'グー)
       0)
      ((equal? player 'チョキ)
       1)
      ((equal? player 'パー)
       2)
      (else "グー、チョキ、パーのいずれかを入力してください")
      )
      ))

(define (hand n) ;出した手を表す数字を文字列に変換する
  (cond
    ((= n 0)
     'グー)
    ((= n 1)
     'チョキ)
    ((= n 2)
     'パー)
    )
  )

(define (result n) ;結果を表す数値を文字列に変換する
  (cond
    ((= n -1)
     '負け)
    ((= n 0)
     'あいこ)
    ((= n 1)
     '勝ち)
    )
  )

(define (janken)
  (begin
    (display "グー、チョキ、パーのいずれかを入力してください\n")
    (let*
        ((com (jancom)) ;comの手の番号
         (player (play)) ;playerの手の番号
         (resultnum (duel player com)) ;結果の番号
         (comhand (hand com)) ;comの手を文字化
         (res (result resultnum))) ;結果を文字化
      (fprintf (current-output-port)
               "comは~aを出したのでじゃんけん結果は~aです。\n"
               comhand res)
      )
    )
  )

せっかく手を数値で定義してるんだから数字の大小で勝敗を出せたんじゃないかと思いました。これだったらわざわざ手を数字にしなくてもシンボルの組み合わせでいいじゃん。
→足した余りで一発判定できるやんか!!!もう!

コンピュータがただただ乱数で手を出してくる感じになっていますが何かしら学習するみたいな感じにしたいと思いました(学科の他コースの人が前に課題で作ったって言ってた)。

さておき実行するとこうなります。

> (janken)
グー、チョキ、パーのいずれかを入力してください
グー
comはパーを出したのでじゃんけん結果は負けです。

母に見せたら目覚ましじゃんけんじゃんと言われました。それな。

百田尚樹「カエルの楽園」を読みました

帰省しているのですが、父の友人が「一度読むべき」と言って父に貸してくれたので一家で読みました。

カエルの楽園

カエルの楽園

あらすじとしては、三戒という教えを信じ続けるナパージュというツチガエルの国が攻撃を受けて崩壊していく様子を、大きなカエルに国を追われて流浪の末にナパージュにたどり着いたアマガエルたちの視点から描くというものです。アマガエルたちは三戒の教えに感銘を受け、三戒がどのように平和を守っているか分かれば故郷に平和を取り戻せるはずと考えてナパージュを巡り、いろいろな生き物たちの話を聞いて考えていきます。
おとぎ話のような感じなのですが、現実に重ね合わせることもできて怖くなりました。選挙権を得て、今後の政治にどう関わるかというのを考えさせられる本でした。
現実とどう対応しているかというのは読んだ人の解釈だと思うし、あくまでフィクションですと書かれているので書くのやめます。著者の方もすごく勇気を出して書いたのではないかと思います。

二重投稿をなんとかする~Racketチュートリアル中級編をやってみた(第6回)

なんとかするって何だよって感じですね。実はCSSを作って読みこめるようにするくだりもあったのですが(HTMLだもんね、やりたいよね)、とりあえず飛ばして先に進むことにします。

中級チュートリアル
Continue: Web Applications in Racket

前回「機能的にはいい感じになった」と言ったのにまだ問題があるみたいです。ちょっと見てみましょう。

コメントを追加します。
f:id:momo_moemoe:20160819084622p:plain

コメントが追加されたのが確認できます。
f:id:momo_moemoe:20160819084652p:plain
ここでリロードすると…

コメントが増えます。
f:id:momo_moemoe:20160819084727p:plain

リロードした回数だけ無限にコメントが増えます…うそやん…

リロードを押すたびにコメントを送るというリクエストが送り続けられるので同じコメントが何度も投稿されてしまうみたいです。

解決するために、別のURLに送ってどうにかするみたいな感じっぽい。
redirect/getという関数を使えばいい感じに何とかなるみたいです。

render-blog-page内で定義されたinsert-post-handlerを変更します。

(define (insert-post-handler request)
    (blog-insert-post! ;新規投稿を追加
     BLOG (parse-post (request-bindings request)))
    (render-blog-page (redirect/get)))

前回までは4行目が(render-blog-page request)になっていたため、投稿を追加する際に同じリクエストを送り続けていたようです。

また、コメントを追加するときにも同じ処理が必要です。render-confirm-add-comment-page内に定義されたyes-handler内のrequestを(redirect/get)に変更します。

  (define (yes-handler request)
    (post-insert-comment! a-post a-comment) ;コメント追加
    (render-post-detail-page a-post (redirect/get))) ;追加後の詳細ページを表示

コメント追加について動作確認すると、
コメントを追加して、
f:id:momo_moemoe:20160819093918p:plain

リロードしてもコメントが増えなくなりました!よかった
f:id:momo_moemoe:20160819093949p:plain

とりあえず形にはなったようです。