Category: Uncategorized

  • automakeについての動画

    automakeについての動画

    20年前の自分へ automakeのテストについての動画をアップしました。初めての動動画作成です。考えていたよりも難しかったです。特に以下の2に難しさを感じました。 相手がいないで一人で話すこと つっかえないで話すこと 最初の部分に議題、最後の部分に要約をいれたいと思っていました。この部分にそれぞれ10テイクくらいかかりました。 1日くらいで終わるかなーとか思っていたのですが、約17分の動画と取るのに、3日もかかってしまいました。 話題はかなり特異なものなので、たくさんの見てもらえるとは思っていません。 この手の話は、若いソフトウェア開発者に話していたものです。約20年前の自分に話しています。若いころ、ソフトウェア開発の本を読みました。当時、こんなことが完璧に理解できる人がいるのかなぁーと思ったのでした。そんな人に出会ってみたいと思っていました。そんな自分に向けて、わかるようになったと伝えたい。 Openshot、OBS Studio、マイク、LED照明 この動画をとるにあたり、2つのソフトを使用しています。 Openshort OBS Studio Openshortは、複数のトラックを編集して、一つの動画ファイルにまとめるものです。Openshotの開発の皆さんありがとうございます。 OBS Studioは、コンピュータデスクトップの動画とかWebカメラとかを同時実行して、一つのトラックを作成します。OBS studioの開発の皆さんありがとうございます。 私のPCのWebカメラは、iPhoneより顔が暗く映ります。音声もノイズがのって聞こえにくいです。作業効率を考えるとPCで録画したいと思いました。そこで、LED照明とマイクを購入しました。これで、映像、音声を改善しました。 asciinema 自分の作業を記録する方法について調べました。mp4のような動画ファイルで録画すると、大きな記憶デバイスが必要です。私のたいていの作業は、テキスト文字列にです。効果的に、作業を記録する方法が必要でした。asciinemaを見つけました。ソフトで作業を記録することにしました。asciinema開発の皆さんありがとうございます。 私の作業 以下はYoutubeで使用した作業コンテンツです。 こちらが、Youtubeのリンクになります。

  • Talking about automake

    Talking about automake

    Talking to myself 20years ago I talked about automake test-harness on youtube. It is first time to take a movie. It was more difficult than I thought. Difficult parts are followings. speaking about something to nobody. speaking smoothly. I would like to put agenda at first part and summary at last part. I want these […]

  • wp.api.Element は2度呼ばれる場合がある

    wp.api.Element は2度呼ばれる場合がある

    wp.api.Element は一つのwp.api.Controlで2回呼ばれることがあります。 php側は、ここで、WP_Customizer_Controlの設定jsonを生成します。 その時、WP_Customizer_Controlのto_jsonが呼ばれます。 to_jsonでは、デフォルトのテンプレートをここで、生成します。このテンプレートは、WP_Customizer_Control に設定してtypeを持ったinput html タグが含まれています。このinput html tagが最初のwp.api.Elementを呼びだします。WP_Customizer_Controlを継承したクラスで、content_templateをオーバーライドしいる場合は、ここで生成されたテンプレートを見つけて、html化し、最初のwp.api.Elementを置き換えます。 wp.api.Controlがwp.api.Elementを呼び出しているのはこの行です。wp.api.Control.linkElementsにあります。 wp.api.Control.linkElementsが最初に呼ばれるのはこの行です。 2回目に呼ばれるのはこの行です。

  • wp.api.Element may be called twice.

    wp.api.Element may be called twice.

    api.Element initialize might be called 2 times in api.Control initialize method. On php side generate setting json in administrator page at this location. Your extended a class from WP_Customizer_Control is called to_json method on it. In to_json method, WP_Customizer_Control generate default control template string here. This template string contains input html tag with your specified […]

  • Bloom効果

    Bloom効果

    マインスイーパーのボタンを点滅させたい。これは、マインスイーパーの開発を進めるのに必要と考えていました。どうやって点滅させるのか?処理の方法が判りません。コンピュータディスプレイ上でボタンを発光させる方法を探しました。その手法はBloomというそうです。 後処理のためのダブルバッファ Bloom処理の記事をいくつか読みました。一つのイメージを生成するのにいくつかのレンダリングバッファを持たなければならないようです。 通常の要素(ボタンとボード)をレンダリング 発光する要素をレンダリング 上記を合成して、一つのゲームシーンを表示 手始めにバックバッファにシーンをレンダリングして、フロントバッファにそれをコピーすることをしてみました。この変更による不具合が出ないように注意しながらの作業です。マインスイーパーはこの変更した処理に2ヶ月前にこっそりと変えています。 Bloom効果とガウス曲線 bloom効果はローパスフィルターでのレンダリングです。発光させたい要素をまっさらなレンダリングバッファにレンダリングします。全てのが画素は、近傍の画素と混ぜることでぼかされます。一つの画素は近傍の距離に応じて重みづけされた色によって影響されます。どのような重みを選ぶのがよいか?多くの記事では、ガウス曲線を選んでいまます。ガウス曲線は、正規分布と呼ばれています。 私もガウス曲線が重みを選ぶのに合理的であると思いました。 Bloom処理をボタンに適用する Bloom処理されたオブジェクトを合成して最終的なシーンをレンダリングしてみました。その結果は満足できるものではありませんでした。ボタンが発光しているように見えないのです。何度もいくつかのパラメータを調整してみました。でもうまくいかないのです。Blur(ぼかし)の処理について1日ほど考えました。発光するボタンをわずかに大きくレンダリングすることを思いつきました。この方法がしっくりきました。 以前よりも暗いレンダリング 満足いくBloom処理ができましたが、Bloom処理にとっては現行のマインスイーパーの光の設定は少々明るいようでした。ボタンの点滅が判りにくいのです。妻に見せたところ、”少し色を変えたんでしょ?”と言われました。うーん、がっかりです。以前のゲームの設定より、光と色を暗くしました。 初期のゲーム設定の変更 初期のゲーム設定を変更しました。ゲームオーバにならない一つ目のボタンを点滅させたいと思っていました。ゲームの最初の処理が変更になりました。 いきなりゲームオーバーとならないボタンを選んで開くことができる。新しいゲームロジックです。 最初に開くボタンでは、ゲームオーバーにならない。どのボタンを開いてもゲームオーバーになりません。NGになるボタンは最初のボタンが開かれた後に決定される。以前のゲームロジックです。 Bloom処理のゲームをリリースする前に 新しいバージョンをリリースする前にマインスイーパーのサイトの処理を確認してみました。英語から日本語に変換できない場合があることに気づきました。これを修正するため、更なるタスクをこなす必要がありました。 翻訳処理の動作が期待したとおりにする 翻訳処理のための拡張ツールをつくる Bloom処理のあるマインスイーパーをリリース Bloom処理が有効になった マインスイーパーです。

  • Bloom effect

    Bloom effect

    I wanted to have blinking buttons on mine sweeper app. It is a necessary function to make the app go far. How do I make a button blinking? I had no idea to implement it. I search the way to button becoming luminous on computer display. I learned the way is named bloom. Double buffering […]

  • gnu gettext と locale ja.

    gnu gettext と locale ja.

    Gnu gettextをつかって時々うまく翻訳文字列が得られないことがありました。まず、gettextをinfoで読みました。php でgettextを使っていたので、phpのドキュメントにも目を通しました。余談ですが、php上のgettextは、c言語のapiのgettext libraryのwrapperになっています。なぜgettextが動作期待したとおりに処理されないのか、理解できていません。 gettextを調べるためのプログラム gettext libraryを調べるためのプログラムのディレクトリ構成です。 このソフトウェアはここから入手できます。 このプログラムはコンソールにメッセージを出すだけのプログラムです。 “-l ja_JP -c UTF-8“というコマンド引数(オプション)を指定して実行すると、日本語変換されたメッセージがコンソールに出力されます。次のようなオプションでは、翻訳されたメッセージを得ることができません。 -l ja -l ja -c UTF-8 -l ja_JP 以下がgettextに関する呼び出しシーケンスです。 setlocaleが成功しない 上に書いたコマンド引数のいくつかでは、setlocaleが失敗します。 上にあるとおり、ロケールjaは存在しますが、setlocaleは失敗します。 文字化けする 以下のようなオプションでは、文字化けします。 用意したmessage.moのファイルはUTF-8です。そして、環境変数のLC_CTYPEは、en.UTF-8になっています。man 7 によると、LC_CTYPEが表示する文字列のために使用されると記載があります。 setlocaleが失敗する理由 ロケールに関するmanページを読みました。setlocaleを呼ぶ前にlocaleを用意しておく必要があることを知りました。私のlinux環境では、以下のlocaleが用意されていました。 ‘ja’が上のリストにありません。これが、setlocaleが成功しない理由でした。 setlocale(“ja”)を成功させるために setlocale(“ja”)を成功させるには、”ja” のロケールを用意しなければなりません。これは、”localedef”を実行することで、達成できます。ロケールはディレクトリ構造で、その配下のファイルは、ロケール関連の関数のバイナリデータになってます。デフォルトでは、ロケールデータはsystemディレクトリにあります。新しいカスタムロケールを作る場合などには、簡単な方法とはなっていないと感じました。そこで、新しい”ja”をログインユーザのディレクトリに用意して、環境変数’LOCPATH’を設定して、’ja’ロケールが得られるようにしました。 “ja”を私のlinux環境で用意するために、以下のコマンドを使いました。 以下はsetlocaleを成功させるための処理の一例です。 gettextから文字化けしない文字列を取得する gettextから文字化けしない文字列を取得するためには、setlocale(LC_CTYPE, <locale.codeset>)または、 bind_textdomain_codeset(domain, <codeset>)を呼ぶ必要があります。 setlocale(LC_CTYPE, <locale.codeset>) を呼ぶ gettextのソースコードを読みました。戻りの文字列は、iconvによって変換されることが判りました。iconvは変換先のcodesetにメッセージdomainにと紐ついたものを使用します。もし紐ついたものがない場合は、nl_langinfo(CODESET)の戻り値を使用します。nl_langinfo(CODESET)は、setlocale(LC_TYPE, <locale.codeset>)によって設定されます。man 3 setlocaleによると、linux programの初期のlocaleは”C”です。環境変数は、異なる設定になっているかもしれません。locale関連の環境変数は、プログラムの初期の状態では影響しないのです。 こちらで確認した、locale関連の環境変数です。 locale “C”では、 nl_langinfo(CODESET) […]

  • gnu gettext and correct locale.

    gnu gettext and correct locale.

    I could not get translated string with Gnu gettext sometimes. I read gettext info document. Actually I used gnu gettext library on php language. I checked php document also. By the way, gettext on php is a wrapper function for c api gnu gettext library. I did not understand why gettext did not work well. […]

  • Cargo xtask

    Cargo xtask

    マインスイーパーのマトリックス処理を書き直しました。2020年5月以前のマインスイーパーはjavascriptのみで書かれたマトリックス演算をおこなっていました。2020年5月にweb-assemblyを使用した、マトリックス演算に変更しました。それぞれの式の評価において、javascriptのような型チェック処理を省いていいるので、処理速度の向上が期待できます。 web-assemblyのための言語 Rustをweb-assembly生成のための言語に選びました。当時Rustがソフトウェア開発者の間で人気になっていることを知って、興味を持っていました。個人的な感想では、モダンなc++といった印象です。RustはCargoという標準パッケージマネージャを持っています。アプリやライブラリを作成する時に、必要とするライブラリの依存関係を管理してくれます。node.jsのnpm、phpのcomposer、pythonのpipのような感じです。処理型のためのライブラリをマニュアルで用意する必要はないです。 wasm-bindgenのカスタマイズ web-assemblyを生成する場合、wasm-packを使うのが一般的でしょう。私もwasm-packを使って、web-assemblyとjavascriptのインターフェイスを得ることができました。kotlinのアプリでweb-assemblyを使う予定です。kotlinは静的型志向言語です。type declarationファイルがあった方が、kotlinの特性を生かすことができます。Rustもまた型志向言語です。wasm-packがtype declarationファイルを生成するのは、容易なことです。しかし、生成されたtype declarationは、私の要求にあっていませんでした。type declaration ファイルは、遅延コンパイルの表記となっていない買ったのです。私は、web-assemblyファイルをfetchして、コンパイルした後に遅延した形で使用したかったのです。私はwasm-packをカスタマイズして私の要求にあったtype declarationを生成する必要がありました。wasm-packのソースを調べて、wasm-bindgenがtype declarationを生成していることを理解しました。wasm-packはラッパーになっていたのでした。Wasm-bindgenをカスタマイズしました。当初wasm-packを使ってカスタマイズしたwasm-bindgenを使うことを考えましたが、wasm-bindgenをダウンロードするurlがハードコーディングされていたので、カスタマイズしたwasm-bindgenを使うことはできませんでした。すでに、wasm-bindgenについて十分理解できていたので、wasm-packを使う必要もなくなっていました。 ライブラリビルド後に wasm-bindgenを実行する wasm32-unkonwn-unknownのライブラリをビルドした後に、wasm-bindgenを実行する必要があります。Wasm-bindgenはweb-assemblyとtype declarationを生成するために、いつくかの情報をライブラリから得ているようでした。ライブラリビルドが終わった後に追加のコマンドを実行するCargoの標準的な方法を見つけようとしました。Carogが提供していたのは、ライブラリをビルドする前に実行する方法だけでした。ライブラリビルドの後に、コマンドを実行するいくつかのツールをみつけることができました。”cargo-make”が私の要求を実現してくれそうでした。しかし、新しい用法を覚えなければなりませんでした。その時は、よいですが、6ヶ月後もすれば、すっかり忘れてしまうだろうと思いました。 ビルド完了後のカスタムコマンドをRust言語自体で実行したいと思いました。こちらのではCargoのビルドコマンド終了後のカスタムコマンドについてディスカッションされてました。Cargoがビルドコマンド実行後に自動的に追加のコマンドを実行するような機構を持つのには時間がかかりそうです。このディスカッション中に”xtask“というアイディアを見つけました。xtaskは、cargo-makeのようなツールではありません。それは、つかのタスクをcargoに行わせる方法です。 実際xtaskはCargoから見ると、workspaceの一つです。私にとっては、良いアイディアに思えました。カスタムタスクを作るのにRust言語を使用することができました。 web-assemblyのリリースと使用 プロジェクトはgithub.com上にpushしました。web-assemblyはnpm package directoryに公開しました。マインスイーパー で現在使用されています。

  • Cargo xtask

    Cargo xtask

    I rewrote the matrix operation for mine sweeper app. Before 2020 May, The app used pure javascript library for matrix operation. On May 2020, I changed the matrix operation with web assembly. The web assembly would run matrix operation faster than javascript, for not checking data type in every operation. The language for wasm I […]