2019年05月08日

風邪引いてました

 元号が変わった日に急に熱が出て、連休後半はぼろぼろだった。発熱→熱が下がって激しい咳→咳が弱まってまた発熱→徐々に回復、という経緯で、週明け3日目(月曜から仕事だった)にしてようやく通常に戻ってきた。

 連休中で医者も休みだろうし、まあ風邪だろうから市販薬で直すか、と、妻に頼んでドラッグストアで薬を調達してきてもらった。

 まずは、総合感冒薬の PL 顆粒。「いろんな症状に効く」、つまり「どれも大して効かない」ということでもあるようだけど、医者に行ってもいつも処方されるので、まあ持っておいた方がいいのかな。

20190508-1.png

 私はすぐに喉をやられて、咳で寝られないことが多いので、咳止めも買ってきてもらった。これでした。って、よく見たらこれも総合感冒薬じゃん。

20190508-2.png

 昔から売られている外用薬も買ってきてもらった。「ヴェポラッブ」なんですね。「プ」じゃないんだ。知らんかった。

20190508-3.png

 咳止めはどちらも役に立ってくれた。とにかく、咳の頻度が減って、多少なりとも眠れるようになるのが大きい。PL 顆粒も効いた気がする。

 私が治りかけた頃、今度は妻が調子を崩して2日、子供たちも順番に半日ぐらい寝込んだ。うつしてしまったらしい。申し訳ない。ちなみに、私はたぶん土曜日に所用で名駅に出かけた時にもらってきたんだと思う。

 そういえば、昔実家で常備していたかぜ薬は、「コデジールA錠」だった。調べてみたら、他の総合感冒薬と同様、主成分はアセトアミノフェンで、咳止めでジヒドロリン酸コデイン、あと漢方の成分が少し入っているみたい。記憶にあるのとビンのラベルが違う。モデルチェンジしたかもしれないな。

20190508-4.png

タグ:生活
posted by toshinagata at 23:01| 日記

2019年04月27日

wxLuaApp で OpenGL やってみた

 球体の表面を色分けした図を描いて GIF アニメーションにする、という案件が発生した。こういうやつです。

20190427-1.gif 20190427-2.gif

 OpenGL を使えばできそう、というのはすぐに思いついたのだが、どう実装するかでしばし悩んだ。最近の流行りで言えば WebGL なんだろうけど、少し調べてみてハードルが高そうと感じた。自分の OpenGL の知識が相当古いところで止まっているのが原因かもしれず、本当はそちらをアップデートするのが正攻法なのだが、今回はとにかく早く結果が欲しい。

 そこで、Molby のコードを流用することにした。さすがに C で書くのはどうかと思ったので、最近のマイブームである wxLuaApp で OpenGL に挑戦。実はこれが結構大変でありまして、WebGL を使ったほうが未来につながったかもと 15% ぐらいは思ったりしている。

sinCache = {}
sinCacheSect = 0
idle_count = 0
phase = 0
mode = 0
cflag = false
modefunc = function () return 1 end

function OnIdle(event, canvas)
  local max_count = 32
  if mode < 9 and idle_count < max_count then
    if idle_count == 0 then
      if mode == 0 then
        modefunc = function (x, y, z) return 1 end
      elseif mode == 1 then
        modefunc = function (x, y, z) return x end
      elseif mode == 2 then
        modefunc = function (x, y, z) return -y end
      elseif mode == 3 then
        modefunc = function (x, y, z) return z end
      elseif mode == 4 then
        modefunc = function (x, y, z) return 2 * z * z - x * x - y * y end
      elseif mode == 5 then
        modefunc = function (x, y, z) return 2 * z * x end
      elseif mode == 6 then
        modefunc = function (x, y, z) return -2 * y * z end
      elseif mode == 7 then
        modefunc = function (x, y, z) return x * x - y * y end
      elseif mode == 8 then
        modefunc = function (x, y, z) return -2 * x * y end
      end
    end
    CaptureCanvas(idle_count, max_count, mode, cflag)
    if cflag then
      idle_count = idle_count + 1
      if idle_count == max_count then
        idle_count = 0
        mode = mode + 1
      end
    end
    cflag = not cflag
  end
end

function ColoredVertex(c, r, x, y, z)
  local rgba
  local y2 = modefunc(x, y, z) * math.cos(phase)
  if y2 >= 0 then
    rgba = {(1 - y2) * 0.8, (1 - y2) * 0.8, 1 - (1 - y2) * 0.2, 1}
  else
    rgba = {1 - (1 + y2) * 0.2, (1 + y2) * 0.8, (1 + y2) * 0.8, 1}
  end
  gl.Material(gl.FRONT_AND_BACK, gl.DIFFUSE, rgba);
  gl.Vertex(r * x + c[1], r * y + c[2], r * z + c[3])
end

function DrawSphere(c, r, sect)
  local m = math.floor(sect / 4)
  local n = m * 4
  if sinCacheSect ~= n then
    sinCacheSect = n
    for i = 1, m * 5 + 2 do
      sinCache[i] = math.sin(math.pi * 2 / n * (i - 1))
    end
  end
  local s = sinCache
  for i = 1, n + 1 do
    gl.Begin(gl.QUAD_STRIP)
    for j = 1, n / 2 do
      gl.Normal(s[j] * s[i + m], s[j] * s[i], s[j + m])
      ColoredVertex(c, r, s[j] * s[i + m], s[j] * s[i], s[j + m])
      gl.Normal(s[j] * s[i + 1 + m], s[j] * s[i + 1], s[j + m])
      ColoredVertex(c, r, s[j] * s[i + 1 + m], s[j] * s[i + 1], s[j + m])
    end
    gl.End()
  end
  gl.Begin(gl.TRIANGLE_FAN)
  gl.Normal(0, 0, 1)
  ColoredVertex(c, r, 0, 0, 1)
  for i = n + 1, 1, -1 do
    gl.Normal(s[2] * s[i + m], s[2] * s[i], s[2 + m])
    ColoredVertex(c, r, s[2] * s[i + m], s[2] * s[i], s[2 + m])
  end
  gl.End()
  gl.Begin(gl.TRIANGLE_FAN)
  gl.Normal(0, 0, -1)
  ColoredVertex(c, r, 0, 0, -1)
  for i = 1, n + 1 do
    gl.Normal(s[2] * s[i + m], s[2] * s[i], -s[2 + m])
    ColoredVertex(c, r, s[2] * s[i + m], s[2] * s[i], -s[2 + m])
  end
  gl.End()
end

function DrawModel()
  gl.MatrixMode(gl.MODELVIEW)
  gl.LoadIdentity()
  gl.Translate(0, 0, -1)
  gl.Rotate(130, 1, 0, 0)
  gl.Rotate(-45, 0, 0, 1)
  gl.Material(gl.FRONT_AND_BACK, gl.DIFFUSE, {1, 0, 1, 1});
  gl.Enable(gl.NORMALIZE)
  DrawSphere({0, 0, 0}, 0.85, 48)
end

function CaptureCanvas(n, m, mode, cflag)
  phase = 3.1415926 * 2 * n / m
  canvas:Refresh()
  canvas:Update()
  if not cflag then return end
  canvas.context:SetCurrent(canvas)
  capture = gl.ReadPixels(0, 0, 120, 120, gl.RGBA)
  data = {}
  alpha = {}
  for i = 1, #capture do
    capture[i] = math.floor(capture[i] * 255 + 0.5)
  end
  local j = 0
  for y = 1, 120 do
    for x = 1, 120 do
      local i = ((120 - y) * 120 + x - 1) * 4 + 1
      local j = (y - 1) * 120 + x
      data[j * 3 + 1] = capture[i]
      data[j * 3 + 2] = capture[i + 1]
      data[j * 3 + 3] = capture[i + 2]
      alpha[j + 1] = capture[i + 3]
    end
  end
  image = wx.wxImage(120, 120)
  datastr = string.fromtable(data)
  alphastr = string.fromtable(alpha)
  image:SetData(datastr)
  image:SetAlpha(alphastr)
  image:SaveFile(string.format("sample%d_%02d.png", mode, n))
end

function OnPaint(event, canvas)
  local dc = wx.wxPaintDC(canvas)
  if not canvas.is_initialized then
    canvas.context = wx.wxGLContext(canvas)
    canvas.context:SetCurrent(canvas)
    sz = canvas:GetClientSize()
    gl.Viewport(0, 0, sz.x, sz.y)
    gl.Enable(gl.DEPTH_TEST)
    gl.Enable(gl.LIGHTING)
    gl.LightModel(gl.LIGHT_MODEL_AMBIENT, {0.8, 0.8, 0.8, 1.0})
    gl.Light(gl.LIGHT0, gl.DIFFUSE, {1, 1, 1, 1})
    gl.Enable(gl.LIGHT0)
    gl.Light(gl.LIGHT1, gl.AMBIENT, {0.4, 0.4, 0.4, 1})
    gl.Enable(gl.LIGHT1)
    gl.Enable(gl.BLEND)
    gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
    canvas.is_initialized = true
  end
  canvas.context:SetCurrent(canvas)
  gl.ClearColor(0, 0, 0, 0)
  gl.Clear(bit.bor(gl.COLOR_BUFFER_BIT, gl.DEPTH_BUFFER_BIT))
  DrawModel()
  gl.Flush()
  canvas:SwapBuffers()
  dc:delete()
end

function main()
  --  フレームを作成
  frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, "", wx.wxPoint(50, 50), wx.wxSize(120, 200))
  frame:SetClientSize(120, 120)
  --  GLCanvas を作成
  canvas = wx.wxGLCanvas(frame, wx.wxID_ANY, {}, wx.wxDefaultPosition, wx.wxSize(120, 120), 0, "GLCanvas")
  canvas.is_initialized = false
  --  イベントを接続
  canvas:Connect(wx.wxEVT_PAINT, function (event) OnPaint(event, canvas) end)
  canvas:Connect(wx.wxEVT_IDLE, function (event) OnIdle(event, canvas) end)
  frame:Show(true)
end

main()
posted by toshinagata at 00:55| 日記

2019年04月14日

ウメとナツミカン

 ウメの花が終わった後、実がたくさんついている。

20190414-1.jpg

20190414-2.jpg

 実を収穫することを目指すのかどうか、ちょっと悩ましいところ。このウメは、実ウメとして植えたものではないので、大した実は成らないような気がする。でも、これだけ実がついていると、落ちるに任せるのもちょっともったいない気もするんだよな。一応実を間引いて、根元に肥料はあげておいた。

 一方、ナツミカンの方は、今のところ葉芽ばかり出てきている。芽吹いてくる前に大きく剪定したので、木が葉を伸ばす方に向いてしまったかも。今年成りすぎたので来年は実は少ない年だけど、ゼロはさびしいな。なんとかこれから少しでも花芽が出てきてくれるといいのだけど。

20190414-3.jpg

タグ:園芸
posted by toshinagata at 15:57| 日記

2019年04月13日

ドラゴンズ3年ぶり貯金

 京田・堂上の満塁本塁打でタイガースに大勝、3年ぶりに貯金だって。

 京田と堂上が同時に出てるってどういうこと?と思ったが、遊撃と二塁なんですね。確か開幕戦は堂上が遊撃で京田はベンチだったよな。調べてみると、固定されているのは一塁のビシエドと三塁の高橋周平だけで、二塁・遊撃は京田・堂上・阿部(・三ツ俣)、外野手は平田・大島・アルモンテ・福田、捕手は加藤・大野をそれぞれ併用している。ドラゴンズは今年から与田監督が指揮を執っている。新しい監督は新戦力を試したがる、というけど、この中で新顔と言えそうなのは加藤匠馬ぐらいだから、結局は昨年までのメンバーがイマイチ伸び悩んでいたということなんだろうな。

 堂上直倫、30歳。愛工大名電〜ドラゴンズ1位指名、父も兄もドラゴンズの選手。やりにくくてしょうがなかっただろう。一昨年から京田の控えに回され、このまま沈んでいくのかと思ったら、今年の開幕はその京田を控えに追いやってスタメン出場。今日の試合など、一番遊撃京田、五番(!)二塁堂上、と、すっかり「両雄並び立つ」趣きとなっている。堂上が活躍したら、古参のドラゴンズファンは嬉しいと思うよ。

 京田陽太、24歳。期待の新人として一昨年から半ば「特別扱い」で抜擢され、昨年も(やや成績を落としたとはいえ)堅実に結果を残したが、昨オフに根尾昂がドラフト1位指名されて、突然雲行きが怪しくなった。冷静に考えれば、大卒で2年間結果を残した選手と高卒の新人選手が横一線で競争できるわけもないのだけど、マスコミ(というか主に中日新聞と中日スポーツ)がとにかく煽るので、まあこちらもやりにくかったことだろう。ただ、もともと真面目で熱心な選手なはずなのだけど、オープン戦終盤で与田監督の評価がえらく下がっていた。まさか堂上に追い抜かれることはないだろう、と高をくくっているようなところが見え隠れしていたのかな。

 野球は基本パ・リーグを見ているのだけど、名古屋に住んでいる以上、ドラゴンズは強いに越したことはないのですよ。一応セ・リーグではドラゴンズファンだしな。うまく選手を伸ばして、いい結果を出して欲しい。

タグ:野球
posted by toshinagata at 23:55| 日記

2019年04月12日

攻める「ことでん」こと高松琴平電気鉄道

 ネットでたびたび話題になる「ことでん」こと高松琴平電気鉄道。

 「おー、またことでんがなんかオモロいことやったんかい」と微笑ましくスルーしようとして、ふと気づいた。「ことでん」ってどこを走ってるどういう電車なのか、まるで気にしたことがなかった。それなのに、まるで昔から知ってるみたいに「またことでんが」云々、っておかしくないか?

 ということで、ことでんのウェブサイトにお邪魔してきた。ことでんこと高松琴平電気鉄道は、高松市周辺に3路線を運行する鉄道会社で、明治44(1911)年に開業した東讃電気軌道ほか2社が統合して設立された。2001年には経営不振のため民事再生法の適用を申請したが、翌年に経営陣を刷新して会社再生に取り組み、2011年に開業100周年を迎えたとのこと。

 さっそく、「毎週金曜日は午前0時便」で笑わせてもらいました。ただし、面白がっているだけじゃない。「ことでんフォトギャラリー」には、「ことでん百年目の写真展。」として、ことでんの車両工場で働く人たちの写真が多数紹介されている。外からはなかなか見えない、現場で鉄道事業を支える人たちへの敬意をストレートに表している。

20190412-1.png

 香川県には実は行ったことがなくて、高松にも特段の関心を持っていなかったのだが、ことでんのウェブサイトを見て、なんだか興味が湧いてきた。機会があれば、ぜひことでんに乗ってみたいと思う。

タグ:社会
posted by toshinagata at 23:56| 日記

2019年04月11日

ブラックホールの撮影成功

 しばらくブログから離れていたので、なかなか書きたいことが見つからんな、と思っていたら、いい話が飛び込んできました。

 「ブラックホールの撮影」? どういうこと? と思ったが、すべてを飲み込んでしまう「現象の地平線」よりわずかに外側を通る光は、ブラックホールの周辺から放射されているように見えるんですね。

 NASA とか JAXA もそうだけど、NAOJ(国立天文台)の人たちも、こういう「イメージ動画」を作る実力はものすごく高いものがある。本当は超難解な理論を、短い動画のイメージで、「わかったような気持ち」にさせてくれるから。(その裏には、巨大プロジェクトを動かすために、官僚や政治家に「短い時間で納得してもらう」努力を綿々と続けてきた積み重ねがあるのだと思う。)

 「イベント・ホライズン・テレスコープ」の原理は、いまひとつよくわからなかった。下の図から、世界中の電波望遠鏡からデータを集めて、そこから情報を取り出したことは見て取れる。ノイズに埋もれた極微小な信号を掘り出すために、情報処理の最先端技術も使われているはず。


2018年以降のEHT望遠鏡配置図(Credit: NRAO/AUI/NSF)

 ものすごく波及効果の広い技術もあるだろうから、一般向けだけじゃなくて、「専門外の理系研究者」向けの「少しだけ深い解説」も見てみたい気がするな。

タグ:科学 社会
posted by toshinagata at 23:13| 日記

2019年03月24日

コンポストと土つくり

 以前、土つくりの勉強のために、本を読んだ話を書いた。

 この2冊で得た知識をもとに、この1年はコンポストをこういう風に運用していた。

  • 台所の野菜くずを入れる方針は変化なし。
  • 雑草を抜いたものは、天日で乾かして、茶色くなったあたりで投入。(=野菜よりも付着している菌が多いと思われるので、発酵を促進させる)
  • 山砂、バーミキュライトを適宜加えて、よく切り返す。(=砂は、粒子の大きな土を入れることで隙間を作る。バーミキュライトは、保水力・吸着力の改善。)
  • コンポスト容器にある程度内容物がたまってきたら、熟成用の別容器に入れて、1〜2ヶ月放置。ときどき切り返す。

 熟成後の土はこんな風になった。今までとは全く違う。今までは、有機物が分解されてくると、ガチガチの粘土質にだんだん戻っていっていたが、今はさらさらの土になっている。たぶんバーミキュライトの効果は相当大きい(今までも山砂は入れたことがあったけど、ここまでの変化はなかった)。

20190324-1.jpg

 こちらは熟成途中の土。こちらは、まだ山砂・バーミキュライトの投入が不十分なため、粘土のかたまりがごろごろしている。

20190324-2.jpg

 こちらは元の粘土質の土。真っ白で、ただの粘土にしか見えない。これでも、何度か作物を植えたり、コンポスト堆肥を入れたりはしてるんですよ。でも、元の粘土と同じようなものに戻ってしまう。元の粘土(たぶんカオリナイト)は、栄養成分を吸着する力がとても弱いことがわかる。

20190324-3.jpg

 今回、コンポスト作成中に気づいたことがあった。

  • 雑草くずの効果は絶大。気温の高い時期だと、十分に枯らした雑草をコンポストに加えると、翌日は湯気が立つぐらい発酵していることがある。発酵が順調だと温度が上がって湯気が立つ、という話は聞いていたのだが、実感したのは初めて。
  • バーミキュライトをコンポスト容器に投入しておくと、野菜くずが多少水を含んでいても、あまり水っぽくならない。バーミキュライトが水を吸着してくれるからだと思われる。
  • 何度かコンポスト容器に雨が降り込んだことがあった(うっかりフタを閉め忘れていた)。今までは雨が降りこむとすぐにベチョベチョになって、野菜くず投入をしばらく中止していたのだが、バーミキュライトが入っているとそういう状況にはなりにくい。

 土の質は本当に大事。生ごみコンポストの話はネットでいくらでも見つかるけど、単にごみを減らすだけじゃなくて庭土の改良までやりたいのであれば、少しは土のことを知らないといけない、ということがよくわかった。

 熟成完了した土を使って、キンジソウを植えた。畑で去年植えていた場所の土をはがして、代わりに今回作った土を入れ、植え付けた。土の表面を稲わらで覆って、乾燥を防ぐとともに、葉が土に触れて腐ってくるのを防ぐ。

20190324-4.jpg

 去年はキンジソウの芽がなかなか出てこなかったのだが、今年は早かった。3月前半がむやみに暖かかったのが大きいと思う。あと、秋に茎を切って越冬準備したときに、切り口にカルスメイト(切り口の保護剤)を塗って乾燥を抑えたのもよかったのかもしれない。

20190324-5.jpg

 吉田さんの本によれば、野菜類は良い土で元気に育てば、虫もつきにくいそうだ。まだこれを実感したことがないので、今年の結果を楽しみにしている。

タグ:園芸
posted by toshinagata at 19:45| 日記

2019年03月23日

ナツミカン収穫

 ナツミカン収穫しました。木についていたのを眺めていたときは、まあ30個ぐらいかな、と思っていたのだが、とんでもなかった。

20190323-1.jpg

 今日とった分だけで44個。この他に、いくつか途中で落ちたり先に収穫したりしたのがあったので、全部で50個には達していたと思う。もうちょっと間引いとけばよかったな。こんなにとれたら、来年は少ししかとれないぞ。一昨年は50個越え、去年は15個ぐらい(内容も悪かった)。ほぼ隔年結実になってしまっているので、毎年30個ぐらいに落ち着かせたい。

タグ:園芸
posted by toshinagata at 21:18| 日記

2019年03月21日

「名古屋何もないよ」問題は解決するのか

 ヨッピーさんの記事。桑名市の PR 記事なので、桑名の話題が多いけど、名古屋とその周辺の話題もある。確かに「名古屋から日帰り圏内」には面白いところがいっぱいあります。

 なんで名古屋民は「名古屋は何もないよ」と言いがちなのか、ということだけど、名古屋民は基本的に「外の人に対するサービス精神」がない。よそから来た人に楽しんでもらう、ということに対して、何の喜びも感じてないように見える。だから、「あれがあるよ、これもあるよ、どう、楽しいでしょう?」なんて、口が裂けても言わない。そんなことは、誇り高い名古屋民としての沽券に関わる、と思ってるんじゃないか。人にサービスするためには、自分を一段下に置かないといけないわけだけど、それが感覚的にしっくりこない。

 そう、名古屋民ってプライドが高いんです。周辺の地域に対して、常に上から目線で見ているようなところがある。ただ、そのことをあまり自覚はしてない。名古屋民はよく「自虐的」と言われるけど、それを「プライドの高さの裏返し」と認識している人はあまり多くないように思う。名古屋城だけは自信を持って紹介するけど、その他のものについては「まあ、お前らが楽しいと思うなら行っとけばいいんじゃね?」ぐらいに思っているんじゃないかな。名古屋市外の「楽しい場所」についてはなおさらのこと。

 名古屋に「ヨソモノ」がもっと入って来れば、状況は変わってくるかもしれませんね。名古屋民の妙なプライドに邪魔されずに、名古屋とその周辺の面白いところを、「お客さんに楽しんでいただく」というサービス精神で紹介できるようになるかもしれない。ただ、その段階に至るためには、名古屋民がヨソモノを「同化することなく」受け入れることができるようにならないといけない。これはけっこうハードルが高いと思う。

タグ:社会
posted by toshinagata at 21:56| 日記

2019年03月20日

4月からのラジオ英語講座

 4月からの英語講座。「高校生からはじめる『現代英語』」。

20190320-2.jpg

 なかなか面白そう。今月の題材は、「第一次大戦終結100年記念式典」「白内障のクマの手術成功」「オゾン層がフロン規制強化で回復」「大谷翔平選手の帰国会見」。内容はけっこう骨があるけど、語彙力をつけるには好適だと思う。こんな文章ですからね。

Veterinarians in Japan have conducted a rare surgery − a cataract operation on a bear.
日本の獣医師たちが珍しい手術を行った − クマの白内障の手術だ。

 もう一つは、「基礎英語3」。げー、また RoboCorpus だ。

20190320-1.jpg

 前にも書いたんだけど、基礎英語3なんとかならないのか。RoboCorpus は特にやめてほしい。とにかく話がぜんぜん面白くない。今年度の基礎英語3の話はわりと面白かったんだけどね。メインターゲットの中学生にとって身近な設定でありながらも、ストーリーの中に地方旅館の再生や国際化の話まで込められていて、広がりがあった。

 とはいえ、講座の内容は相変わらずで、ぜんぜん系統的じゃない。文法事項はいちいち補足してやらないといけない。リスニングの勉強だと思って我慢してやってるけど、効率が悪いことこのうえない。

posted by toshinagata at 23:24| 日記
email.png
Powered by さくらのブログ