@ledsun blog

無味の味は佳境に入らざればすなわち知れず

MacとWindowsのIME

元々がMacユーザーで、最近、Windowsも使っています。 物理的に異なるマシンとキーボードを使っています。

MacWindowsを切り替えて使う時に困っているのが、全角/半角入力を切り替えるキーの違いです。

  • MacではCmd + SpaceでIMEのON/OFFを切り替えています
  • WindowsではIMEを常にONにして、CapsキーのON/OFFで切り替えています

IMEにはATOKを使っています。

当初、Macでも後者にして操作を統一しようと思いました。 実際に使ってみると、MacIMEをONにしてCapsキーで半角入力すると、キー入力がOSに伝わるのが遅すぎます。 特に、shell*1ではIMEを確定するまで、補完が効きません。確定するまで補完されないのでは、補完の意味がありません。

Google Chromeのアドレスバーでは、補完が効くので、IME入力中の文字列を見るかどうかはアプリケーションに依存するようです。 この辺を考える面倒臭さと、今までの手癖でMacで半角入力するときには、Cmd + SpaceでIMEをOFFにしています。

これで困る点がいくつかあります

  • CapsをCtrlキーとして使えない
  • MacからWindowsに切り替えた時に、手癖でCmdキーを押すつもりでWindowsキーを押してフォーカスが奪われる*2
  • WindowsからMacに切り替えた時に、手癖でCapsキーを押して、入力が遅れてイライラする

Windows使ってみると、IME周りはMacよりWindowsの方が快適にできているのがわかりました。 MacではCmd + SpaceのCmdキーをUPするまでIMEが切り替わらなくて、期待する動作より少し遅いとか、たまにON/OFFが切り替わらなくなるとか、微妙に不便な点があったことに気がつきました。

*1:Iterm2 + fish-shell

*2:WindowsWindowsキーを押すとWindowsボタンをフォーカスします

シャノンの情報理論入門 価値ある情報を高速に、正確に送る (ブルーバックス)

シャノン先生はすごすぎるのです。

  • 1916年 アメリカのミシガンで生まれる
  • 1932年にミシガン大学で電気工学と数学を専攻 (16歳では?)
  • 1937年に、20世紀最高の修士論文「A Symbolic Analysys of Relay and Switching Circuits」(21歳では?)
  • 1940年にMITで博士号を取得(24歳では?)
  • 1941年にベル研に入る。
  • 1948年に「A Mathematical Theory of Communication」(32歳では?)

シャノン先生飛ばしすぎです*1

関連する登場人物

アラン・チューリング(1912〜1954)

アラン・チューリング - Wikipedia

チューリングアメリカに居ればなあと感じさせられます。

ジョン・フォン・ノイマン(1903〜1957)

ジョン・フォン・ノイマン - Wikipedia

ノイマン先生は範囲広すぎだし、応用分野強すぎ

ハワード・エイケン(1900~1973)

ハワード・エイケン - Wikipedia

  • Automatic Sequence Controlled Calculator(ASCC)を考案
  • 1944 年 Harvard Mark I (アメリカ初の電気機械式計算機)
  • 1947 年 Harvard Mark II
  • 1949 年 Harvard Mark III
  • 1952 年 Harvard Mark IV

ノーバート・ウイーナー(1894〜1964)

ノーバート・ウィーナー - Wikipedia

*1:この表現は意図したものです。何かに気がついた人は無視してください

登場人物で読書メモを書いてみる

アンリミテッド本紹介。眠れなくなるほど面白い 図解シリーズ - 勝間和代が徹底的にマニアックな話をアップするブログを、読んで、ブルーバックスみたいな入門書を乱読する使い方もあるのかあ・・・と思って真似をして読んでみました。

プログラマーのための技術者列伝 - @ledsun blogで、意外と過去の偉人の名前を知らないことに気がついたので、本を読みながら、ある分野の第一人者リストを作ったら面白いかも?と思いました。やってみます。

AIの技術者列伝

1956年のダートマス会議で、「AI」という言葉を生み出した人たち

ジョン・マッカーシー

ジョン・マッカーシー - Wikipedia

マービン・ミンスキー

マービン・ミンスキー - Wikipedia

クロード・シャノン

クロード・シャノン - Wikipedia

すごすぎて意味わからん・・・

ナサニエルロチェスター

ナサニエル・ロチェスター - Wikipedia

ペトロシネッラ

ラプンツェルの最も古いご先祖様らしいです。

katarinomori13.com

↑に和訳がありました。

前半のストーリーは、「ラプンツェル」と同じですが、後半は呪的逃走のモティーフですね。三枚のお札と同じです。

読んでみると、なるほど「三枚のお札」でした。 驚きました。

参考

三枚のお札 - Wikipedia

ペルシネット

ラプンツェルのご先祖様です。 グリム童話になる前の、ドイツ民話になる前の、フランス民話のようです。

和訳が以下にあります。 https://core.ac.uk/download/pdf/230991095.pdf

これはラプンツェルに関する卒業研究のための資料の一部だそうです

f:id:ledsun:20210711101516p:plain
先行作品との比較からみた『ラプンツェル』 - イタリア民話とフランス民話とグリム童話 -

論文自体も読んでみたいです。 探したけれど見つかりません。

プログラマーのための技術者列伝

techbookfest.org

今日から始まった技術書典11で、販売されている技術同人誌です。 販売といっても価格は0円です。

プログラミングに関係のある過去の偉人技術者の伝記集です。 星新一の「明治の人物誌」のノリです。

僕は、紹介されている人は7割以上知らなかったです。 例えば次の人たちです。

  • ハーマン・ホレリス
  • ヴァネヴァー・ブッシュ
  • ジョン・モークリー

読んでみると、パンチカードだったり、パソコンのアイデアだったり、ENIACだったりわかりやすい業績の人たちでした。

一人あたり3ページ。 物足りないかと思いましたが、これくらいの長さだとサクサク読めて良いですね。

引数13万個の関数呼び出し

Rubyバッチ処理File.deleteでたくさんのファイルを消していたらSystemStackError: stack level too deepという見慣れないエラーが起きました。 再帰などしていないのに、スタックを使い切るのはなぜでしょう?

File.delete(*to_delete)

こんな感じで呼び出していたので、配列展開になにかあるのかな?と思って試してみました。

irb(main):041:0> p(*(1..130795).to_a)
(irb):41:in `p': stack level too deep (SystemStackError)
  from (irb):41:in `<main>'
   ... 8 levels...
  from /Users/shigerunakajima/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
    from /Users/shigerunakajima/.rbenv/versions/3.0.1/bin/irb:23:in `load'
  from /Users/shigerunakajima/.rbenv/versions/3.0.1/bin/irb:23:in `<main>'

ところが、次のような関数呼び出しでない配列展開は

 [*(1..130795).to_a]

時間は掛かりますが、正常に動きます。

原因はよくわからないのですが、簡易な再現手順がわかったので、ruby-jpで聞いてみました。

結論としては、引数の数が多すぎるそうです。 id:ku-ma-me さんに教えてもらいました。

p(*(1..130795).to_a)の字面的に、引数が13万個あるように見えないのと、引数はスタックに積むものなので、言われてなるほどでした。

その他の面白情報

irbを使わないと限界数が232増えます。

~ ruby -e 'p(*(1..131027).to_a)'
-e:1:in `p': stack level too deep (SystemStackError)
  from -e:1:in `<main>'

id:Pockeさん情報です。

実際に13万個引数がある関数を定義して呼び出すと、SystemStackErrorが起きます。

irb(main):001:0> eval "def hoge(arg0,#{(1..130794).map { |i| "arg#{i} = nil" }.j
oin(",") }); puts arg0; end"
=> :hoge
irb(main):002:0> hoge 0
(eval):1:in `hoge': stack level too deep (SystemStackError)
  from (irb):2:in `<main>'
   ... 8 levels...
  from /Users/shigerunakajima/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
    from /Users/shigerunakajima/.rbenv/versions/3.0.1/bin/irb:23:in `load'
  from /Users/shigerunakajima/.rbenv/versions/3.0.1/bin/irb:23:in `<main>'

id:wakaba260yenさん情報です。 実行時間が長いので注意です。

JavaScriptでも同様に大量の引数をつけるとスタックオーバーフローが起きます。

> Math.min(...new Array(120615).fill(0))
Uncaught RangeError: Maximum call stack size exceeded
    at Math.min (<anonymous>)

id:tompngさん情報です。

3年奇面組

「ニンジャと司教の再出発! 3 聖女の受難」を読んでいまして、どうもこのメタなギャグの感覚に覚えがある、と記憶をたどりました。そして思いついたのが「3年鬼面組」でした。読み直すと思った以上にメタ感が似ていました。しょうもないボケに対する辛辣なツッコミも共通している気がします。

今読むと、記憶の中より絵が上手くて驚きました。中学生がお酒飲んでいる場面があったりして、時代を感じさせます。

鬼面組に限らず、この頃のギャグ漫画は、漫画の登場人物が自分の世界が漫画であることを意識していたり、漫画に作者が出てきたり、メタな作品が多かった記憶があります。

CCPMとアジャイル談義 その2

agileradio.github.io

システム開発を発注する側の大和ハウスグループCCPMを導入しているそうで、発注側からみたプロジェクトマネージメントの工夫の話が出てきます。興味深いです。

曰く

  • 平均的な人材が作業したときの見積もりを求める
  • 提示された見積もりの半分を最善見積もりとして、その半分のバッファを乗せる(結果的に、見積もりの75%の期間を納期として求める)
  • 納期より早く納めても満額支払う
  • 納期が伸びた場合は、伸びた期間分追加で支払う

要するに、一括請負なんだけど、伸びた場合の費用は発注側で持つという特約付きなのでしょか?。人参も用意するし発注側としてリスクも負うので、短納期化に積極的な業者に発注するということのようです*1

*1:雑に書いたけど、言葉で書いたら合理的にしか見えないけど、雑に発注して見積もりが大きく外れたら無限に費用を払う必要があるし、本当にそんなリスク負えるの?どういうこと???っていつものアレです

アジャイルCCPM

アジャイルの人たちがクリティカルチェーンプロジェクトマネージメントについて議論しているところはスルーしてきたので、どういう流れだったのか知らないです。 適当にぐぐって雰囲気をつかんでみようと思いました。

ameblo.jp

CCPMは、「フルキット」といって、開発開始前にタスクを挙げ切る必要があるのですが、これに対して私も以前から違和感がありました。

それを解消するアプローチで、フルキットがなくとも、CCPMをはじめられる手段として良かったです。

blog.shibayu36.org

  • マザータスクの依存関係や、リソースの状況を考慮して、クリティカルチェーンを作る
  • マザータスクにまとめたタスクのストーリーポイントを合計し、ストーリーポイントとベロシティから、期間を計算し、バッファをいれる

booklog.jp

これはアジャイルではないし、CCPMの意義も(たぶん)損なっている。自律的なチームが不安で監視したいという理屈も考えられなくもないが、それではアジャイルが目指す自律的な改善に逆効果としか思えない。

korosukesize.hatenadiary.jp

フィーチャーを出し切り、ベロシティを算出することが困難なレベルのプロジェクトを経験したことがあるが、出さないことにはスケジュールは読めない。 フィーチャー単位でのベロシティ見積もりはブレが起こりやすいだろう。

buffermanager.blogspot.com

私の認識は、アジャイル開発が解こうとしている問題は、「ソフトウェアの機能のうち半分以上は一度も使われていない」というつくりすぎのムダ。これをシステマチックに解決していく方法論と理解しています。使われない機能をCCPMで早くつくってもムダです。そこにメスをいれているのが共感するところ。

cortanaがしゃべったー

仕事で.Net開発環境が必要になりました。 Windowsパソコンを入手してセットアップしてみました。

PRESTIGE15-A11SB-428JPです。

  • OS : Windows 10 Home
  • CPU : インテル Core i7-1185G7(3.0GHz / Turbo 4.8GHz / 4コア8スレッド)
  • グラフィックス : NVIDIA GeForce MX450
  • メモリ : 32GB(16GB ×2)DDR4
  • ストレージ : SSD512GB(M.2 NVMe)/HDD-
  • ディスプレイ : 15.6インチ、フルHD(1,920×1,080)、ノングレア、sRGB相当

開発環境をMacに変えたのが2014年4月。 7年ぶりのWindowsパソコンセットアップです。

セットアップの最初の方からcortanaがしゃべり出しました。 「はい」とか「次へ」とかの簡単な指示なら音声入力もできます。 メインのパソコンで作業をしながら、口だけでセットアップ作業が進められ便利です。

さすがにWifiパスワードに音声入力できません。 できても、口に出したくないです。 使用許諾契約の同意とかも音声入力ではできませんでした。まあ、そらそうだろうという感じはします。

途中で突然英語をしゃべりだしたり完成度が高いとは言えないのですが、セットアップ作業が進化していて驚きました。あとは顔認証できたり、Windows Updateがそこそこの時間で終わったり、なかなか良い体験でした。

RubyのdelegateみたいなことをJavaScriptでやる

Rubydelegate

Rubyにはdelegateというメソッドがあります。

docs.ruby-lang.org

あるクラスのメソッドを、依存するインスタンスに委譲するメソッドです。 次のように使います。

delegate [:first, :last] => :@arr

ぱっと見不思議ですが、ハッシュ { [:first, :last] => :@arr } が引数の関数呼び出しです。 firstメソッドとlastメソッドを@arrインスタンスに委譲しています。

JavaScriptの実装

似たようなことをJavaScriptでやりたいなと思いました。

次のように実装しました。

function forwardMethods(self, getTargetFunction, methods) {
  for (const method of methods) {
    self[method] = (...args) => {
      const target = getTargetFunction()
      console.assert(target[method], `No ${method} method to forward`, target)

      return target[method].apply(target, args)
    }
  }
}

使い方は次の通りです。

forwardMethods(this, () => this._clipBoard, [
  'copyEntities',
  'cutEntities',
  'pasteEntities'
])

第一引数がthisなのは、クラスのコンストラクタ関数の中で使う想定だからです。 オブジェクトを指定すれば良いので、コンストラクタの外でも使えます。

第二引数がコールバック関数なのは、委譲先を動的に解決したかったからです。

関数名にはdelegateではなくforwardを使いました。 JavaScript界には、次のようにたくさんのdelegateがいて紛らわしいからです。

参考

Mixins, Forwarding, and Delegation in JavaScript

このブログを眺めながら、APIとか実装を考えました。

delega - npm

実装後に、npmなら似たようなパッケージがあるだろうと、探したnpmパッケージです。 APIが完全に一致していました。 まあまあ、汎用的なAPI設計ができていたようです。