1月17日

1995年の1月17日、僕はまだ学生で、卒論のドラフトを書かなければいけないけどもそのベースになるプログラムがちゃんと作れて居ない状態で、X Window Systemが動いているワークステーションの上のEmacsを使って徹夜でC++のコードを書いていた。地震があってそれまでに経験したことのない大きな揺れは起きたが、幸い震源から離れておりあまり大事にはならなかった。その日の昼に途中まで書き上げた卒論を先輩にチェックして貰う予定だったので、それが全然できていないことで焦っていて地震のことなど割とどうでもよかった。だが、肝心のその先輩の実家が尼崎にあって、しかもたまたま先輩は実家に帰っていて、実家が地震で被害を被ったとかで数日は学校に来ないとの連絡が朝の7時か8時に入り、締切が伸びたことに安堵した僕は当時住んでいた部屋に戻って寝たのだけど、13時くらいに起きてニュースを見たとき初めて神戸の惨状を知ってびっくりしたのだった。

 

 

それから25年経って、まだ僕はX Window Systemが動いているマシン上のEmacsC++のコードを見たりデバッグしたりしているのである。なんという進歩のなさ。この世界は日進月歩で数年前の技術は役に立たなくなるのではなかったのか。そして35歳で定年になってしまいそのあとは何もコードなんて書けなくなって無能おじさんになってのんびり暮らせるはずではなかったのか。責任者出てこい。そしてどうしてコードのコメントを書くための日本語入力をするためにC-x C-jのキーシーケンスを打ちシフトキーを駆使して▽の記号が出る入力方式をいまだに使い続けているのかもわからん。僕ら以外のホワイトカラーの日本人たちもオフィス作業で相当な時間を費やしているはずの日本語をコンピュータに入力するという作業について、いったいこの10年間でなにか進歩したのだろうか。

 

 

こんな状態だから「AIで職が失われる」とか言われてもいまいちピンと来ないのだ。どうせAIが進化した25年後も似たような仕事をやっているんじゃないかと思ってしまうのだ。

mi band4買いました

あけましておめでとうございます。

 

年末にXiaomiが日本参入ということでAndroid One端末のMi A2/A3が発売されてほしかったんだけど、実際に日本で発売になったのはMi Note 10だった。Mi Note 10は画素数の割にカメラの画質はあまり良くないように思えて個人的には魅力薄なのであった。それよりMi Band 4(スマートバンド4)が正式に日本で発売されたのでAmazonで気軽に買えることとなり購入した。

  • 評判では電池の持ちがいいとのことだったが、実際1月3日の晩から使っていることになるのだが初日に充電して以来5日間使ってまだ電池残量が86%となっていて確かに2週間に1回くらいの充電で全然問題なさそう
  • しかし実際のところ時計と万歩計にしか使っておらずつまりこれでは2013年にあったfitbit oneとあまり変わらないのだった。fitbit zipは使っていたが腕時計として使えない形だったのが残念だった。
  • 腕時計としてはどうかというと秒針がないのは残念である。樹脂のバンドだし本体がぶ厚いのでRuputerを使っているような気分になる。

Ruputerではrmoonを使っていてカレンダーが見れていたのだがこいつはカレンダーが表示されなくて不便である。今月のカレンダーが表示されてほしかったので下記のようなカレンダの壁紙を作って設定してみたらいい感じであった。

2020年1月

設定した画像

 ディスプレイの解像度は120x240とのことなので、このサイズで画像を作ってやればちゃんとピクセルパーフェクトに設定できるようだ。今気づいたけど上の画像は1月13日が赤色じゃなくてリアル感がない。

 

<2020-01-10 追記>

2020年/2021年の日本の祝日を赤色にした画像を生成するHTMLページを作ってGitHub Pagesに公開しておいた。これでスマホでかんたんにダウンロードできて毎月壁紙を更新できるぞ(ただWebFontもGitHubもどっちもよくわからんのでいろいろミスってるかもしれん)

   ↓ 

Calendar

 

ネットで調べていると壁紙だけでなくもうちょっと好き勝手に文字盤を作ることもできるようだ。面倒なのでしばらくはやらないと思う。下記のリンク先にやり方が載っているっぽい。

How to make your miband4 custom resource pack | Xiaomi Mi Band 4 | GeekDoing

あまりモノを買わなかった年だった

今年も残すところあと2日しかないです。そして今年は物をあまり買わなかったような気がします。特に今年はスマホを一台も買わなかった。そんな年があっていいのか? そんな中買ったものと言えば下記のようなものでした。

 

GPD microPC

キーボード付きの小さいPCというのはいつまで経っても憧れでありまして、スマホでは生産性が割と低いのでダメで、タブレットはキーボードを繋ぐと重くなってしまう上に機動力が低下してしまう(キーボードと本体が分裂するので持ち歩きながら使いづらい)のでやっぱりキーボードと本体が強固に連結されたマシンが便利なわけです。つまりUMPC

そしてGPD Pocketを使っていて思ったのはどうしてもう少しキーピッチを縮めてキーを増やしてくれなかったのかということで、せめてCTRL-ASDFG-HJKL;-ENTERまでの12個のキーが一列に入っていないと辛いということだった。キーピッチは13.5mmくらいまで縮んでもいいから、と思ってたのにPocket 2 とかP2 Maxでキーを減らす方向に進化してしまいがっかりしてたところに、このmicroPCは上記の条件をちゃんと満たしている上、全体としてキーの数が増えて使いやすくなっていた。キーピッチは11mmということなのでタッチタイピングするにはつらいけどキーの数が少ないPocketよりは断然マシなのであった。microPCのキーの難点はキー押下に力が必要なので指が痛くなってしまうことと、キー押下したときの音がうるさいことだ。これさえなければ最高のマシンなのに。軽いキーに変更できる部品とかでないかなあと使うたびに思っているのだけど、まあ無理ですな。

 

Celeron N4100がとてもいい感じだということ、SSDを交換できるのはやはり精神的な安心感があってすばらしいこと、Ubuntu 19.10がモバイルでも全然ちゃんと使えることがわかって、それはとても良かった。

 

Cocoparの9インチディスプレイ

https://www.amazon.co.jp/gp/product/B07JHJRHH8

これ。

2016年に購入した10.1インチのディスプレイを職場に持って行って使ってたら必須アイテムとなってしまい家で使えなくなってしまったのと、薄くてUSBで給電できてしかも軽いというメリットにひかれて購入してしまったのだが、まあ普通に使えますな。こういう小さいディスプレイは、2016年の時点では割とニッチな感じの商品だったのだけどもう最近ではバリエーションが大量に増えててどれを選んでいいかわからないという感じで、2011年ごろ、パネル部品としてはいっぱい出てるはずなのに小さくて高解像度なPCディスプレイが製品として存在しないのはなんでなんだ!! みたいに思ってた頃と比べれば夢のような状況です。普通に出張とかに持っていけそう。メガドライブミニとの相性もいいはず。

 

メガドライブミニ

発売されるまで買うつもりはあまりなかったんだけど発売日にTwitterとかを見てるとやっぱりゲームのかんづめを見てみたくなって買ってしまいました。でも全然全部のタイトル遊んでないです。そもそも起動してすらないタイトルがまだいっぱいある。ダライアステトリスとゲームのかんづめとタントアールをやって、ロードモナークを少しだけ進めたくらいか。タントアールを小学生の子供も楽しく遊んでいたのでこれが入っていてよかったと思った。

 

Raspberry Pi 3B+

正月に急に思い立ってヨドバシで買ったやつだった。使ったり使わなかったりしたけどあってよかったと思ったことが何度かあったので、これは買って正解だった。ただ、Blenderがちゃんと動かない(オブジェクトとかをクリックで選択できないので最初からつまづいて使えていない)のはなぜなのかいまだにわからない。

Scratch少しわかってきたけどいろいろつらい

Scratchで子供が遊んでいるのに感化されて週末少しづつ何かを作るのをやっていてだんだんわかってきた。ちゃんとした仕様がどこに書かれているのかよくわかっていない(調べてないのが悪いという気もする)けどわかったことは下記のようなことであった。

 

  • 変数はグローバル変数と、スプライトのインスタンス変数しかない
    スプライトから他のスプライトのインスタンス変数にはアクセスできない(スプライトへの参照を持つことができない)のでわりとつらい。その結果としてグローバル変数を使いまくることになるのだけどそれはそれで。グローバル変数のように見えているものは内部ではステージのインスタンス変数になっているようなのだがステージの変数だけが他から丸見えというのも不思議といえば不思議だ。
    ちなみにステージとスプライトをあわせて「ターゲット」というらしい。まあ普通の言語で言うオブジェクトである。
  • スプライトのインスタンス(クローン)を作るときに引数を渡すことができない
    これも割と辛くて、だって普通のオブジェクト指向的なやつで何かをつくるときって
    tama = new Tama(x, y)
    ってやったあと
    tama.hoge()
    みたいにアクセスできるわけじゃないですか。Scratchはそれがなくて
    clone()  // 自分のインスタンス変数が複製されて受け継がれる
    もしくは
    Tama.clone() // プロトタイプのスプライトのインスタンス変数が使われる
    しかないような感じ(表記は違うけどさ)。どっちもcloneしたスプライトの参照を取得できないから後からは実質なにもできず、cloneする前に自分自身の変数を変更して前者(自分自身のクローン)を使うか、グローバル変数に相手に受け取って欲しい情報を詰め込んで後者を使うしかない。でも後者を書いていいのは実行順序に関して完璧に理解していることが必要になるので、普通はやってはいけない。
  • オブジェクト間のメッセージのやりとりとして、「メッセージを送る」という命令(ブロック)があるのだけど、上記のように各インスタンスの参照を使うことができないので、この「メッセージを送る」命令はブロードキャストしかできない。しかもメッセージに引数をつけて送ることができない。グローバル変数と「メッセージを送って待つ」というやつを使えばこの問題を回避できるのかもしれないが、なんだか挙動を把握するまでにまたいろんな試行錯誤が必要そうに感じるので使ったことがない。
  • 比較演算子が少ないせいでサボって変な書き方になりがち。具体的にはC系の言語などでの「>=」「!=」に相当するものがなく、もともと「x >= 1」とか「x != 0」と書きたいところ「(x > 1)または(x = 1)」とか「(x = 0)でない」のような表記にしないといけなくて操作が面倒なのでサボって「x > 2」「x = 1」と書いてしまいがちで、イヤな気分になる。
  • ループ変数がないのもつらい。「10回繰り返す」はあるのだがカウンタは隠されているので、「x を 0 にする」→「10回繰り返す」→(そのループの中で)「x を 1ずつ変える」のようにして自分でループ変数を作ってやらなければいけない。
  • サブルーチンとしてブロック定義というものが使えるのだけど、ローカル変数とか関数の戻り値がないのとかもあって本当にサブルーチンとしてしか使えないように感じた。あ、引数だけはそのブロック定義内スコープになっているので、それを利用すれば…引数は変更できないので、ローカル変数的なものが発生するたびに次のブロック定義に処理を引き渡せば実現可能…でもそれはさすがに直感的じゃなさすぎるだろう。

というような感じで非常に制限が奇妙で、ある意味パズル的な頭の使い方が必要で面白いといえば面白いのだが、それは本当に頭を使うべきところなのかというところが割と微妙。

これはもう自分の勝手な言語で作ってScratchに変換してやったらいいんじゃねーか? とか思ったりもしたのだけど(Scratchのファイルフォーマットは Scratch File Format - Scratch Wiki に解説されている)、「そんなふうにして作ったものをアップロードしちゃダメだよ」とちゃんと利用規約に書かれていた。

You may only submit user-generated projects that were created with (1) the Scratch website editor or (2) an unmodified copy of the Scratch editor

Scratch - Scratch Terms of Use

 

Scratch内で絵がかけたり音が編集できたり(絵も音もエディタはとてもよくできていると思う)、あと画像の色を変えたり効果をつけたりするのは(機能があるものに関しては)非常にかんたんにできて楽しい。絵と音とコードがまとまってsb3という1ファイルに収まるのも素敵である(実体はzipファイルであるがパッケージ形式が決まっていることが良い)。

「Scratch全然わからない」問題

子供がたまにScratchをやっている。日本では日本語でプログラミングを勉強できてそこそこメジャーな環境がほぼScratchしかないのでどうしても小学生のプログラミング学習はScratchになりがちだが僕はScratchがどう役に立つのかよくわからず子供に積極的に勧める気にはなれないのである。

 

 

それはそうとしてScratchを触ってみるといろいろわからないことが多いことに気づく。たとえば下記のようなプログラムを作ったときの実行順序はどうなるのだろうか。

f:id:naoya2k:20191006000441p:plain

どういう順序で実行されるのか

試してみたところ、結果は下記のようになった。

f:id:naoya2k:20191006000940p:plain

結果

まず左側のコードが実行され、ループの1回目が実行された時点で(XLに1が追加された後)、右側のコードが実行が開始される。右側のループの1回目が実行されたタイミングで(XLに101が追加された後)、左側の2回目のループに戻り、次に右側の2回目のループを実行する。その後同様にループを交互に実行する感じで実行が進む。つまりこのイベントハンドラのルーチンはそれぞれがコルーチンあるいはスレッドとなっていて。ループがあると1回ごとにYieldが発生して次のスレッドに制御が移る。

猫を動かすサンプルコードで「10歩動かす」を「20回繰り返す」で囲んで動かしたときにずるずる画面上で動くことが確認できるので、「繰り返す」ループの1ループ分が一回の画面更新の間に行われる処理となっているものと思われる。

 

しかしこれは環境によって変わることがないのだろうか。猫を繰り返し動かすようなサンプルではなく上の例のような、UIに対する副作用の無いコードがループでYieldされるのはむしろ不自然なのではないだろうか。

ちなみにYieldされたくない場合は、Scratchにおけるサブルーチンであるところの「ブロック定義」の中にループを置き、そのブロック定義の編集画面で「画面を再描画せずに実行する」のチェックを入れれば1ループ毎にYieldされることはなくなる。

 

また、たまたま今回は左側のコードが先に実行されたが、これはおそらく左側のコードブロックを先に書いたからである(これをドラッグして画面上での左右の位置を入れ替えても動きは変わらなかった)。どちらが先に実行されるかどうかが見た目でわからない。これをちゃんとするためには「メッセージを送る」という機構がScratchには用意されていてそれを使うと良い。

f:id:naoya2k:20191006093055p:plain

メッセージを使った例

しかしスレッド内のループの実行順序についてはいまの挙動通りに動いてくれると考えてはいけないような気がしているが、その実行順序をこのメッセージでなんとかするのは困難だと思う。ここまで書いてきたような部分は今回調べてなんとなくわかった感じもするが、それ以外にも挙動がよくわからないことが複数あって、全然わからないという印象につながっている。

 

Googleでいろいろ調べていたら、複数スクリプトの同期について教えることに関するPaperを発見した。

8216-28003-1-PB.pdf

これによれば、小学校5年生にConcurrent programmingでのSynchronization issues (race conditions)を教えることにチャレンジしており、それなりの率の生徒がその目標に達成しているとのことなのですごいと思った。

最近のiPhone

iOS 13

iPhone SEを初日にアップデートしたらスクフェスがちゃんとできなくなって困った。でも1週間そこらであっさり修正されたのでよかった。

 

iOS12まではテキストフィールドをタップしたときに指の上にルーペが表示されてカーソル位置を細かく調整できたと思うのだが、iOS13ではそれがなくなってしまいテキストフィールドをドラッグ操作してカーソルを動かす操作は事実上使えないものとなってしまったような気がする。これはどういう理由のもとに行われた変更なのかよくわからない。スペースキーを長押しすることでカーソルが移動できるというのが周知されたということなのかもしれないが、日本語キーボードは「空白」ボタンの位置が右端なのでつらい。

 

それ以外はとてもいい。ボリュームボタンでのボリューム調整時に大きく表示されなくなったところとか。

 

iPhone11/Pro

もともと特に期待はしてなかったけどカメラがパワーアップしてて欲しい度が高まらなくもない。しかしこのカメラのために10万払って重たく大きい端末を持ちあるくのかというとそれはないだろうという気がものすごくする。実物を見てきたこととは関係ないけどiPhone11やproのカメラで撮った画像に対する感想に「もはやスマホで十分」といったコメントが書かれているのを見るとモヤる。iPhoneは6sの頃にはもう既にそのへんのコンデジよりも綺麗な画像を出力していたし、そもそもそのへんのエントリー一眼カメラよりも価格が高いのでいい絵が出て当然なのだ。特にカメラ系のサイトではスマホのレンズは安物を使っているんだろうというような意見も見られるが、そんなことがあるわけがない。年間1億台売れるスマホのカメラと、50万台しか売れないコンデジのレンズとで、どちらに開発費や製造設備費用をかけることができるかなんて考えればわかるはずなのに。

 

iPhone SE2の話 

 

iPhoneの廉価版はiPhone8の筐体がベースになるらしく、しかもカメラが11よりもスペックダウンするらしい。これは個人的には割と残念で、なぜかというと僕のいまのiPhone SEに対する最大の不満はカメラが古くさくなりつつあることだからだ。そして多分Touch IDはなくなって、その分電池が大きくなる。とするとXs→11proのことを考えると重量がiPhone8よりも増えるというのも悲しい感じだ。しかし噂に流れてきているA13チップ搭載でRAM3GBというのは割と正しいスペックだし、それで今のiPhone8と同じ価格なら相当に魅力的なはずだから、5sサイズじゃないと意味がないとかは絶対に言えない。

 

総じて最近のAppleは(最近になっても)個別の商品を見ると正しいことをやっているように思える。MacBookのキーボードとタッチバー以外は。

GPD microPCにLinux(Ubuntu Mate)をインストールした

GPD microPCは分解できて簡単にSSDを交換できるとのことだったので、256GBのSSDを購入してUbuntuをインストールしてみた。

 

 

なお、使ったSSDAmazonで売ってる「Zheino M.2 NGFF 2242 256GB SSD SATA3.0」というやつで、いまだと3899円の値段がついている。めちゃくちゃ安いじゃないか。いつも職場で顔を合わしているやつらとかとの飲み会に参加するよりはこれを買ってUbuntuとか入れたり消したりするほうが断然将来の役に立つのでは? あるいは10連ガチャを4回まわすような値段だろ? そりゃ買うよな? みたいな気分になってくる。

 

 

最初はWindowsのまま240GBなり256GBなりの大容量なSSDにして使おうと思っていたので、もともと入っていた128GBのSSDパーティションごとコピーするツールでコピーして動かそうとしたんだけどうまくできなかった。Windowsを再インストールすれば使えることがわかった。そしてWindowsに飽きてきたのでUbuntuを入れることにした。

 

 

最初はUbuntu 19.04を入れてカーネルを追加でインストールする下記のやりかたを試そうとしていた。

第576回 GPD MicroPCにUbuntuをインストールする:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

でもインストールはできたのだけどどうもうまく動かなかった。素のUbuntu 19.04では使えていたWifiカーネルをインストールすると使えなくなったりして謎な感じだった。

 

なので諦めて正式に対応が表明されているUbuntu Mate 19.10 Alphaをインストールして使うことにした。

Ubuntu MATE for UMPCs | Ubuntu MATE

こっちは何も考えずにインストールできたし、ボリュームキーやディスプレイ輝度の制御キーも使えるし、ヒンジ開閉もちゃんと検出できており、実際に実用にできるような感じだ(しかしAlpha版だからいろいろ不安定な部分がありそう)。個人的にはMateのユーザインタフェースよりも素のUbuntuのほうが好きなので、Ubuntuの19.10が出たらもういっかいMateじゃないほうのインストールを試してみようと思う。

 

 

ところで分解動画は下記のYoutubeにあるのだけど、SSDの換装に必要な分解は最初の1分30秒までの裏蓋をあけるところまでである。

www.youtube.com

しかしこの裏蓋をあける作業がやたらキツい。この動画では簡単に開けているように見えるのだけど、僕が非力なせいか毎回10分くらいかかっている。噛み合っている筐体の爪部分を削れば簡単に開くようになるとは思うのだけど、そうすると組上げたときの剛性が弱くなってしまうだろうから(筐体を削るような対応は)あまりやりたくない。みんなは苦労していないのだろうか?