2018年12月02日

ジェリコの戦い

 ヒメが聞いている「ラジオ英会話」で、ある登場人物が Jericho の町を訪問した、これは世界最古の町と言われている、という会話が出てきた。えっ、Jericho ってあの、旧約聖書に出てくるジェリコですか? 今でもあるって本当かよ、と調べてみると、Wikipedia に出てました。

死海の北西部にある町。古代オリエントの中でも古い町で、紀元前8000年紀には周囲を壁で囲った集落が出現した。世界最古の町と評されることもある。世界で最も標高の低い町でもある。(Wikipedia 「エリコ」より)

 ヒメに「旧約聖書に出てくるジェリコの話、知ってるか?」と聞いたら、「知らん、どんな話?」と返されて、はたと詰まってしまった。「ジェリコの町は壁に囲まれててな、…(詰まる)…その壁が崩れるねん。」と、まるで「# 聖書の話を雑に紹介する」みたいな説明になってしまった。正しくは、ヨシュア記ですね。ジェリコの町を攻略した時に、ヨシュアが神の命によって、祭司たちに角笛を吹かせ、民に叫ばせたところ、それに応じて壁が崩れた、という話。これでもまだ雑だけど。

 この話にちなんだ「ジェリコの戦い」という黒人霊歌は有名です。楽譜と歌詞を探してみたけど、いろんなバージョンがあってよくわからない。歌詞つきの YouTube をいくつか聴いて、自分で採譜してみた。

20181202-1.png

 古い吹奏楽関係者は、モートン・グールドの「狂詩曲『ジェリコ』」をご存知でしょう。この曲には、上の黒人霊歌が重要なモチーフとして使われています。私もかつて吹奏楽で演奏しました。フルスコアが読みづらくて難儀した記憶があります。

 この曲の「壁が崩れた」あとの静かな場面で、サックスのメロディの伴奏が「アルトクラリネット2本+バスクラリネット2本+バリトン2本」だけになる部分がある。うちのバンドにはアルトクラリネットがなかったので、音が抜けたままだったのです。仕方がないので、3番クラの隣の子と2人でこっそり(?)アルトクラのパートを吹いてました。

20181202-2.png

 バリトンパートも合わせれば、抜けているのは最初の2小説の Gis 音だけなんだけど、空虚5度だから目立つじゃないですか。でも、誰も指摘しなかったんだよね。私たちが吹いているのを指揮者が気がついてたかどうかは知りません。たぶん知らなかったんじゃないかな。

タグ:音楽 社会
posted by toshinagata at 01:10| 日記

2018年11月27日

wxLuaApp でデスクトップアプリを作ってみた

 GitHub - wxLuaApp の件。デスクトップアプリを作ってみた。けっこう調子良くサクサク書ける。

 高速フーリエ変換が必要だったので、Lua のライブラリを探した。実は、ベンチマークプログラムの SciMark for Lua の FFT が十分実用的だった。LuaJIT のウェブサイトの "Performance" ページでベンチマークに使われているもの。たったこれだけ。16384 点のフーリエ変換がほぼノータイムで完了する。

function fft_bitreverse(v, n)
  local j = 0
  for i=0,2*n-4,2 do
    if i < j then
      v[i+1], v[i+2], v[j+1], v[j+2] = v[j+1], v[j+2], v[i+1], v[i+2]
    end
    local k = n
    while k <= j do j = j - k; k = k / 2 end
    j = j + k
  end
end

function fft_transform(v, n, dir)
  if n <= 1 then return end
  fft_bitreverse(v, n)
  local dual = 1
  repeat
    local dual2 = 2*dual
    for i=1,2*n-1,2*dual2 do
      local j = i+dual2
      local ir, ii = v[i], v[i+1]
      local jr, ji = v[j], v[j+1]
      v[j], v[j+1] = ir - jr, ii - ji
      v[i], v[i+1] = ir + jr, ii + ji
    end
    local theta = dir * math.pi / dual
    local s, s2 = math.sin(theta), 2.0 * math.sin(theta * 0.5)^2
    local wr, wi = 1.0, 0.0
    for a=3,dual2-1,2 do
      wr, wi = wr - s*wi - s2*wr, wi + s*wr - s2*wi
      for i=a,a+2*(n-dual2),2*dual2 do
        local j = i+dual2
        local jr, ji = v[j], v[j+1]
        local dr, di = wr*jr - wi*ji, wr*ji + wi*jr
        local ir, ii = v[i], v[i+1]
        v[j], v[j+1] = ir - dr, ii - di
        v[i], v[i+1] = ir + dr, ii + di
      end
    end
    dual = dual2
  until dual >= n
end

 その後のグラフ表示も上の動画の通りで、何の問題もない。ああもちろん、16384 点のグラフを全部真面目に描画したら重くて大変なので、画面解像度に合わせて間引きはしています。LuaJIT 楽しい。

 メモリは結構食っているようです。上の状態で、25 MB ぐらい占有している。double 型 16384×2 点を Lua の数値型で保持しているわけだから、オーバーヘッドはまあ大きいだろうな。ffi.new(double[]) みたいにすれば少し節約できるかもしれないけど、そこまでしなくてもいいかなと思う。二次元データを使うようになったら考えたほうがいいかも。

posted by toshinagata at 23:25| 日記

2018年11月24日

ナツミカン色づき始める

 今年もナツミカンが色づき始めた。30個ぐらい実ってるかな。

20181124-2.jpg

 最近雨がほとんど降ってないので、実の表面が汚れていて、カビみたいなのがつき始めているものもある。このまま放置するとたぶん腐ってしまうので、水をかけて洗ってみた。太陽の光が水滴に反射してきれいだったので、写真を撮ってみたんだけど、腕前の関係で大してきれいには見えておりません(苦笑)

20181124-1.jpg

 今年の春に収穫した実は、味は悪くなかったのだが、果汁が少なくてスカスカだった。今年の夏はなるべく潤沢に水をやったつもりだけど、出来はどうだろうか。

タグ:園芸
posted by toshinagata at 13:47| 日記

2018年11月17日

映画「ボヘミアン・ラプソディ」

 見てきました。素晴らしかった…(以下、ネタバレがあります)

 最初にクイーンが結成されるシーンからして鳥肌ものだった。フレディがブライアンとロジャーの前でアカペラで歌い出し、それに2人がコーラスをかぶせる。あの歌声はフレディ本人? それはわからないけど、インパクト十分の登場。

 「ボヘミアン・ラプソディ」が生まれる経緯は特に念入りに描かれる。その前のいくつかのシーンで、まるで予告するように、「バラード」部分のピアノのフレーズが断片的に流れる。

20181117-1.png

 そして、「テープがすり切れるまで重ねた」と伝えられる「オペラ」部分の録音。どんどんエスカレートするフレディのリクエストに、劇場では思わず笑い声が漏れていた。何かを作り出すって、こういう風に、端から見ると滑稽に見えたりするものなんだよね。映画では「オペラ」部分のフルコーラスは流れないけど、公式 Twitter がこんな動画を流しているので紹介。歌詞がきっちり追えるので面白さが増します。

 セクシュアリティに関わるいくつもの辛いエピソードを経て、ラスト21分の「ライブ・エイド」のシーンに至る。もう言葉が出ない。ストーリーのドラマチックな盛り上がりは史実とは違うらしいけど、そんなことはどうでもいい、と思わせる。最高の音楽と、最高の演出。クイーンの音楽をもっともっと聴きたくなる、そんな体験でした。

タグ:映画 音楽
posted by toshinagata at 09:54| 日記

2018年11月15日

ホークス甲斐拓也すげー

 さんざん話題になってて今さらだけど、ホークスの甲斐拓也捕手、すごいですね。

 あの二塁からの悪送球で、捕手がカバーしてるもんですかね? いや、それが野球のセオリーだというのは知ってますよ。でも、プロ野球の試合を見ていて、ああいう悪送球を捕手がカバーして二塁で走者をアウトにするシーンをあまり見た記憶がない。走者から見たら「ええっ、なんで?」と思うんじゃないか。甲斐捕手が勤勉にプレイしていることがよくわかる。

 それと、とにかくボールを捕ってから投げるまでがとてつもなく速い。盗塁を刺すときもそうだけど、バントやキャッチャーゴロの処理も速い。そして送球のコントロールがいい。見ていて爽快感がある。捕手として守備だけで客を呼べる選手はなかなかいないだろう。

 この選手が「育成ドラフト6位」ですからね。ホークスのスカウトの目利きぶりは大したものだ。同期の千賀投手とともに、究極の「下剋上」でしょう。今年の日本シリーズで甲斐捕手がMVPをとったとき、王貞治さんが「他の選手の励みになる」とコメントされていた。これは本当に王さんらしい、下積みで頑張っている人への優しさにあふれた言葉だと思う。

posted by toshinagata at 00:52| 日記

2018年11月12日

NHK ドラマ「フェイクニュース」見た

 話題の「フェイクニュース」、録画してあったのをやっと見ました。

 前編は圧倒的なリアリティと迫力だったんだけど、後編はちょっと盛り上がりを狙いすぎなような気がした。わかりやすい「悪者」を仕立てあげるストーリーにしたくなかったのかな。最後の「一ヶ月後(だったかな?)」のシーン、みんな平穏な生活に戻っているようでいて、「あの騒ぎはいったい何だったんだろう」というのがもやっと残っているあたりが、これまた妙にリアリティがあるようにも思う。

 「フェイクニュース」。知識としては知っていたけど、こういうドラマに仕立ててくれると、ものの見方の引き出しが一つ新しくできたように感じますね(気のせいかも知れないけど)。いいものを見せてくれた脚本家・制作陣・俳優のみなさんに感謝。

タグ:テレビ 社会
posted by toshinagata at 21:53| 日記

2018年11月11日

開かずの踏切:JR西日本・滝の谷踏切

 西の新横綱が誕生したそうです(笑)1時間に55分遮断ってすごいな。

 しかし、ちょっと変な気がする。「南宮原踏切」が開かないのはわかるんですよ。JR 東海道線と貨物線を横切っているから、線路がたくさんある。そりゃあ、この線路に列車が次々とやってきたら、なかなか開かんだろう。貨物列車って長いやつあるしね。

 これに対して、「新横綱」の「滝の谷踏切」。 川西池田駅って帰省の時によく利用するんだけど、その近くの「開かずの踏切」ってどれかと思ったら、これですよ。普通の複線を横切っているだけ。なんでこれがそんなに「開かずの踏切」になっちゃうの?

 よく見ると、この踏切は車も通り抜けられないような狭い踏切のようです。ネットで探しても情報が見つからない。「横綱」に昇格したことから、鉄分高い人たちが紹介ページなど作ってくれるのではないかと期待。(いやそれほど期待はしてない。わりとどうでもいい。むしろそのすぐ横にある「東洋食品工業短期大学」というのが気になる。川西市にそんな大学あったんかいな、と調べてみると、食品包装の専門知識を教えているようです。)

posted by toshinagata at 01:12| 日記

2018年11月04日

wxLuaApp 開発中:完成度はイマイチだが一応使える

 GitHub - wxLuaApp の件。実用アプリが開発できるかどうか、試してみた。こんな感じです。見る人が見れば、何を作ってるかわかると思う。

20181104-1.png

 本気でアプリを作り始めると、wxLua の未完成なところがいろいろ見えてきた。公式の開発チームは開店休業状態で、ゲリラ的に開発されている状態だからなあ。

  • wxWidgets 3.0.x で一応ビルドできるのだが、これだと 3.0 以降の機能が使えないことがある。コンパイルの条件が wxCHECK_VERSION(3,1,1) で書かれているため。いったん一括変換で wxCHECK_VERSION(3,0,0) に変えたあと、3.0 でコンパイルエラーを起こすところを手動で修正した。
  • wxPointx, y をフィールドのようにアクセスできるのだが、wxSizewxRect は関数を使わないとメンバにアクセスできない。
    pt = wx.wxPoint(2, 3); print(pt.x) -- "2"
    sz = wx.wxSize(2, 3); print(sz.width) -- エラー
    rc = wx.wxRect(2, 3, 10, 20); print(rc.x) -- エラー
    print(sx:GetWidth(), rc:GetX()) -- どちらも OK
    
    これらのクラスは wxcore_gdi.cpp で定義されている。上記の不統一は、別に本質的な理由があるわけではなくて、単に実装されていないだけだった。
  • wx.wxPoint じゃなくて wx.Point でよかったんじゃないの?と思うのだが、これは今さら変えられないかな。
  • wx.wxBLACK_PEN はあるけど wx.wxBLUE_PEN はないとか、他にも不統一はいろいろありそう。
  • wx.wx**** クラスのオブジェクトにフィールドを追加する(インスタンス変数みたいなもの)ことはできるけど、nil が入れられない。
    sz = wx.wxSize(2, 3)
    sz.field = 1; print(sz.field) -- "1"
    sz.field = nil; print(sz.field) -- "Unable to call an unknown method 'field' on a 'wxSize' type.
    
    これは Lua のメタテーブルの仕様なのかな。false か何かで代用するしかないか。

 いろいろ不十分ではあるけど、悪くないですよ。Mac ではアプリ本体が 25 MB ぐらいで、あとはスクリプトとアイコンの画像ファイルだけ。LuaJIT なので、いざとなったら C のライブラリ関数を呼べる。上で試作中のアプリでも、バイナリファイルを読むために memmove() などを使ったりしている。

posted by toshinagata at 10:37| 日記

2018年10月28日

wxLuaApp 開発中:Love2D っぽく使えるようになった

 GitHub - wxLuaApp をぼちぼちと開発中。いろいろと忙しくてなかなか進まんけど、こんな感じになってます。

20181028-1.png

 コードの方は、wxmain.lua, Document.lua, Controller.lua の3ファイルを1つのフォルダに入れて、このフォルダを wxLuaApp のアプリケーションに Drag&Drop する。Love2D と同じようなスタイル。

-- wxmain.lua
require "Document"

function LuaApp.OpenDocument(file)
  local doc = Document.new(file)
end

function LuaApp.NewDocument()
  LuaApp.OpenDocument(nil)
end
-- Document.lua
require "Controller"

--  Class definition
Document = {}
Document.untitled_count = 0

function Document.new(filename)
  local doc = {}
  setmetatable(doc, { __index = Document } )
  local bname
  if filename == nil then
    bname = string.format("Untitled %d", Document.untitled_count)
    Document.untitled_count = Document.untitled_count + 1
  else
    bname = filename
  end
  doc.controller = Controller.new(doc, bname)
  return doc
end
-- Controller.lua
--  Class definition
Controller = {}

function Controller.new(doc, bname)
  local cont = {}
  setmetatable(cont, { __index = Controller } )
  cont.document = doc
  --  Create frame
  local frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxSize(640, 400))
  frame.controller = cont
  frame:SetTitle(bname)
  cont.frame = frame
  cont.scrollwin = wx.wxScrolledWindow(frame, wx.wxID_ANY)
  cont.scrollwin:SetScrollbars(1, 1, 640, 400)
  cont.panel = wx.wxPanel(cont.scrollwin, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxSize(640, 400))
  cont.panel:Connect(wx.wxEVT_PAINT, function (event) cont:OnPaint(event) end)
  frame:Show(true)
  return cont
end

function Controller.OnPaint(self, event)
  local dc = wx.wxPaintDC(self.panel)
  dc:DrawLine(0, 0, 640, 400)
  dc:delete()
end

 実際にコーディングしてみると、ピリオドとコロンの間違いでしょっちゅう引っかかる。これは Python や Ruby にはないストレス。要は「なんちゃってオブジェクト指向」の悲しさだな。「Lua の良さ」を引き出すには、「処理速度」と「組み込み向け」の特徴を生かさないといけない。つまり、重い処理を Lua で書いて、「C++ 使わなくてもここまでできるでしょ?」と見せつけるのと、単体のアプリをそこそこのサイズ(実行形式で 200 MB とかじゃなくて)で作ってみせること。

posted by toshinagata at 12:28| 日記

2018年10月14日

Mac のプレビューでブックレット印刷する (AirPrint)

 「LÖVE (Love2D) プログラミング」は、ブラウザから印刷できるようになっている。A4 1枚に2ページのレイアウトで、ブックレット印刷(中綴じ印刷)をすると、参照に便利です。Mac の「プレビュー」を使うやり方をメモしておく。なお、"AirPrint" 対応のプリンタが接続されていることが必要。

1. まず、ブラウザから普通にプリントダイアログを開く。

20181013-1.png

2. 「背景をプリント」にチェックを入れる(このチェックボックスが出ていない場合は、「詳細を表示」ボタンを押す)。左下の「PDF」メニューから「プレビューで PDF を開く」を選ぶ。

20181013-2.png

3. プレビューで PDF が開く。左側のサイドバーをサムネール表示にしておく(左上のボタンを押して、出てくるメニューから「サムネール」を選ぶ)。

20181013-3.png

4. このままプリントしてもいいのだけど、ブックレット印刷をすると、4ページの倍数に満たないときに空白ページができてしまうので、2つ以上の章を別々に印刷すると無駄が多い。そこで、いくつかの章をまとめて印刷する。上の 1.〜3. の操作を、連続した章に対して行って、プレビューで表示する。下の図では、8, 9, 10 章がプレビューで表示されている。

20181013-4.png

5. ここからは、PDF を連結する作業になる。まず、最初に開いた PDF のウィンドウを前面に出す。サイドバーで、最後のページを選ぶ。この PDF は4ページなので、4ページ目を選ぶ。

20181013-5.png

6. 次に、二番目に開いた PDF のウィンドウを前面に出す。サイドバーで、最初のページを選んだあと、「編集/すべてを選択」で、全部のページを選択する。

20181013-6.png

7. (ここが難しい)選択したページを、一番目の PDF の最後のページの直後にドラッグする。

20181013-7.png

8. 一番目の PDF の最後に、二番目の PDF の全ページが結合される。

20181013-8.png

9. 同じようにして第10章の PDF も結合する。全部で17ページの PDF になった。

20181013-9.png

10. 「ファイル/プリント」を選ぶ。プリンタとして "AirPrint" 系のものを選んでおく。

20181013-10.png

11. 「プレビュー」ポップアップメニューから、「レイアウト」を選ぶ。

20181013-11.png

12. 「両面」ポップアップメニューから「ブックレット」を選ぶ。これはたぶんプリンタドライバ依存の機能なので、同じプリンタを使っていても "AirPrint" ドライバでなければ出てこない場合がある(今回はここでハマった)。

20181013-12.png

13. 「ブックレット」を選ぶと、プレビューが変化するのだが、このままプリントすると「普通の両面印刷」になってしまいそうである。でも、実際にはちゃんと「重ねて二つ折りにする」とブックレットになるように印刷される。紛らわしい。(これは 10.11 付属のプレビューの場合なので、今は修正されているかも。)

20181013-13.png

 すごく面倒臭そうだけど、上の手順のうち半分ぐらいは「PDF を結合する」手順。単にブックレット印刷をするだけなら、「レイアウト」で「ブックレット」を選ぶだけで簡単にできる。標準機能だけでできるのは便利です。

タグ:Mac
posted by toshinagata at 00:18| 日記
email.png
Powered by さくらのブログ