IMFとしてはFcitxがおそらく最も出来が良い、一方でIMとしてSKKはfcitx-skkが最悪
IMFとしてはFcitxがおそらく最も出来が良い、一方でIMとしてSKKはfcitx-skkが最悪
このアカウントは、notestockで公開設定になっていません。
Resolve `$FCITX_CONFIG_DIR` for read-only dictionary paths (!7) · Merge Requests · fcitx / fcitx-skk · GitLab
https://gitlab.com/fcitx/fcitx-skk/merge_requests/7/diffs?commit_id=b98ccbbf4e80631d59339debe503572916f5e71c
Let lonely modifiers pass through if no command assigned by lo48576 · Pull Request #64 · ueno/libskk
https://github.com/ueno/libskk/pull/64
fcitx-skk と libskk のおすすめパッチです
とりあえず fcitx-skk の問題点で最も深刻だと思われるものは「送り仮名のある単語が登録できない」ですね
https://github.com/ueno/libskk/blob/a910ccdf4829e0686e78aade6ee249ec265884c4/libskk/util.vala#L73
「う゛」と「ゔ」の問題はこの行ですね
まあ UTF-8 環境だからこそ「ゔ 」できるけど、そうでない状況とか……いや、あるのか……?
SKK-JISYOのデファクトスタンダードは「う゛」っぽいので辞書はこっちで生成するべきなのかなあ
libskkのjson設定、「vu に対してコンポジションは ゔ を出力する」という設定はできるんだけど「カナ変換で ゔ → ヴ をやる」はできないんだよな、そこがつらい(先のテーブルがハードコードなのが原因ぽいけどこれを可変にするのも骨が折れそうな作業である)
Rust でゲームっぽい何かを作るときに使えるやろみたいな雑な目論見がある (なおどちらも実装はしていない)
Are we async yet?
https://areweasyncyet.rs/
async / await が 2019-11-07 リリース予定の Rust 1.39 で安定化されるので楽しみよね
このアカウントは、notestockで公開設定になっていません。
クロージャ (関数オブジェクト) がわかるか否かで説明のしかたが変わる > async / await
まず原則として、プログラムは処理 (細かい単位では機械語命令列と考えてもよい) を順番に実行する形になっていて、各処理は必ずしも一瞬で終わるとは限らない。
たとえば、 HDD 上の特定ファイルにアクセスしようとしたり、ネットワークデバイスがパケットを受信するのを待とうとすると、めちゃくちゃ時間がかかる。
で、「HDD のシークやネットワーク越しのパケットを待ってる間に他のことできるやん」となるわけですね
さて、逐次処理を順次実行していくスタイルを「同期実行」 (synchronous execution) と呼びます。
前の処理の終了と次の処理の開始が同期しているわけですね。
反対に、 async というのは asynchronous (非同期) execution のことで、「以前に実行開始された処理が終了する前に、次の処理が開始されるかもしれない」という処理実行スタイルのことです。
概念的には。
たとえばネットワークアクセスだと、データの送受信関数を読んでも、実際に送受信が完了するまでにだいぶ時間がかかる。
そこで、「とりあえず実行は開始しておくけど、完了を待たずに次の処理を始める」という方式でコードを実行したくなるわけで、そこで使われるのが async (非同期) 処理です。
この例だと、「ネットワークでのデータ送受信関数を非同期実行する」という解決策をとると、「ネットワークでの送受信完了を待たずに次の処理を実行できる」ということになります。
とはいえ実行して完全に放置とはいかないもので、ディスク読み書きにせよデータ送受信にせよ、**いつか**結果を確認したくなるわけですね。
同期実行だと前の処理が完了して結果を得るまでは次の処理ができなかったけど、対照的に、非同期実行した処理の結果は実行開始直後には得られないので、本当に必要になってから「さっき実行したやつの結果を教えてくれ〜」というリクエスト (あるいは結果置き場の確認) をしなければならない。
このリクエスト(または確認) が await です。
たとえばメモリ上のデータを3つのリモートマシンに送信したいということを考えるとき、通常 (同期実行) だと以下のような感じになる。
send_data(host0, data);
send_data(host1, data);
send_data(host2, data);
ここで、たとえば host0 への回線がめちゃくちゃ細くてネットワークカードの性能や自分側の回線の帯域が余っている状況などを考えると、 host0 にチマチマデータを送っている間に host1 と host2 に同時にデータを送信できないのは勿体ないわけですね。
そこで非同期処理を使うと、以下のような感じになる。
let result0 = send_data_async(host0, data);
let result1 = send_data_async(host1, data);
let result2 = send_data_async(host2, data);
// 先の例やここでは結果を無視しているが、普通はエラーチェックするよ
await result0;
await result1;
await result2;
こうすると、以下のような感じに実行が開始されます:
* host0 に data を送信処理を開始する
* host0 への送信完了を待たず、すぐに host1 への送信処理を開始する
* host1 への送信完了を待たず、すぐに host2 への送信処理を開始する
* (この時点で、3つの送信処理は交互だったり同時だったり、とにかくマルチタスク的に実行されていると考えてよい)
* host0 への送信完了を待つ
+ (待っている間も host1 と host2 への送信処理は続行されている)
* host1 への送信完了を待つ
+ (待っている間も host2 への送信処理は続行されている)
* host2 への送信完了を待つ
まあ要するに、非同期実行された処理はマルチタスク的になるんですね。
実際にこれがマルチスレッド実行されるのか、シングルコアでのマルチタスクのように時分割で実行されるのか、あるいはその複合なのかなどは、非同期実行環境 (executor) によって制御されるもので、環境によってはユーザが指定できるかもしれない。
また、時分割が強制的 (プリエンプティブ) なのか、ゆずりあい方式 (ノンプリエンプティブ) なのかも環境とか実装次第。
その辺りは非同期の本質ではないのでバリエーションがある。
ちょっと難しい話になるけど。
並列 (parallel) と並行 (concurrent) という概念があるけど、非同期実行は concurrent の方ですね。
マルチスレッドは一般に parallel の方 (特にマルチコア CPU の場合は)。
ちょっと説明が難しいんだけど、並列は「複数の処理が物理的に同時に進行する」もので、並行は「複数の処理が論理的に同時に実行される」とでも言えばいいのかな……「複数の処理の前後関係などが規定されないが、とにかく他の処理の完了を待たずに複数の処理の実行が少しずつ進む」ものです。
parallel な処理は concurrent でもあるけど、 concurrent な処理が必ずしも parallel ではない。
大昔のシングルコア時代はマルチスレッドしても所詮は concurrent だったので「本当に物理的に同時に実行されている CPU 命令はひとつ」だったんだけど、マルチコア時代になってからは「物理的に複数の CPU 命令が同時に実行される」状況が普通になってきたので、昔は気付かれなかった並列バグが発覚したり……みたいなのはまあ余談
本題に戻るけど、じゃあ非同期処理はマルチスレッドでも実装できるけど概念的に何が違うのかという話。
大きな違いは、非同期処理は必ずしもスレッドやプロセスが別である必要がないところ。
スレッドというのは OS が管理していて「メモリ上のリソースは共有しているが、プログラム実行経路 (コールスタック含む) は独立している」というもので、まあまあコストが高い。
100スレッド起動すると、100個分の小さなプロセスみたいなものを OS が管理してやる必要があるわけですね。
一方、非同期処理はそういった OS レベルとは関係ない概念なので、「同じスレッドで時分割で処理を切り替えながら実行する」とか「入出力は専用の別スレッドAに任せて、入出力以外の処理は計算用スレッドBで時分割する」とか、まあいろいろな構成がありえます。
これがありがたくなるのが、たとえば有名な C10K 問題などの状況。
C10K とは 10000 台のクライアント (つまり client 10k) のことで、 web サーバなどが 10000 台のクライアントからのリクエストを同時に捌く必要があるときどうしよう……みたいな話です。
C10K問題 - Wikipedia
https://ja.wikipedia.org/wiki/C10K%E5%95%8F%E9%A1%8C
たとえば 10 台のクライアントからのリクエストを **同時に** 捌きたいとき、素朴に考えると「クライアントごとに fork で子プロセスを生やしてやって処理して、レスポンスを返し終えたら子を終了させる」とか「クライアントごとにスレッドを生やして、レスポンスを返し終えたらスレッドを終了させる」とかになりますね。
これが 10 台とかだと問題にならないわけですが、 10k 規模になってくると、「10000プロセス同時に実行する」とか「10000スレッド同時に実行する」みたいな大変なことになるわけですね。
要するに OS 側のリソースを食いすぎる。
たとえばプロセス番号とかスレッド数の限界とかが先に来てしまうわけです。
さてここで考えてみてほしいんだけど、概念上どんなに「同時にレスポンスを送信」していても、ネットワークデバイスから実際に送れるデータ量には限界がある。
つまり、 10k クライアントを同時に捌くとはいっても、本当に「物理的にほぼ同時に」実行している送信処理はごく少数なわけですね。
しかしクライアントごとにスレッドを起動しまくってしまうと、大多数のスレッドは「ネットワークデバイスが詰まっているので何もせず待っている」状態になってしまって、完全に無駄です。浪費です。
じゃあプロセスやスレッドを 10k も生やさずに 10k クライアントを捌きたいとなったとき、スレッドやプロセスを無限に生やさない非同期実行機構が役に立ちます。
たとえば以下のようにすると、シングルスレッドや少数スレッドであっても、待ちスレッドを無限に生やさずネットワークデバイスをフル稼動させられます:
* ネットワークデバイスに余裕があれば、どれかの非同期関数の送信処理を進行する。
* ネットワークデバイスに余裕がなければ、
+ どれかの非同期関数のデータ送信以外の処理をするか、
+ やることがなければネットワークデバイスが空くのをただ待つ。
まあ端的に言えば「クライアントごとに専属の実行リソースを割り当てる」のではなく、「少数の実行リソースに多数の処理を片手間でやらせる」という解決策ですね。
余談ですが、「デバイスに余裕があればどれかの送信処理を実行」みたいな「空いてる I/O をどれかひとつ選んで処理をする」みたいなのを I/O 多重化 (I/O multiplexing) といいます。
非同期実行で複数の I/O を処理したい場合に重要な概念。
まあ多重化 (multiplexing) は必ずしもノンブロッキングであるとは限らないっぽいので、そのあたりはちょっとまあ複雑ですね (自分の使う言語とかで調べた方がよさそう)。
もしかしたら私も誤解してるやもしれぬ
雑にまとめると、こんな感じですかね。
* 非同期実行すると、処理全体の完了を待たないため、 (表面上は) ほぼノンブロッキングに見える。
* 非同期実行した処理の結果はその場では得られず、「将来的に結果と交換できるチケット」みたいなのが貰える。
* 結果が必要になってからチケットを交換する。交換しようとしたとき実行が完了していなければ、完了を待たされる (ブロッキング)。
* 非同期実行はスレッドなどを使って実現できるし、スレッドを使わない実現方法もある。並行実行ではあるが、並列実行かどうかは環境次第。
* 非同期実行は c10k 問題などの解決に有用で、他にも「複数処理を前後関係なく進めたいが、 I/O などのの待ち時間が勿体ない」といった状況全般で有用。
ちなみに「将来的に結果と交換できるチケット」を Promise とか Future とか呼んだりします。
このアカウントは、notestockで公開設定になっていません。
これは非同期エンジン (executor) によりけりですね。 Rust とかだとスレッドより遥かに安くできるけど、 go とかだと goroutine はグリーンスレッドだとか。(詳しく知らんけど)
グリーンスレッド - Wikipedia
https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89
グリーンスレッド (軽量スレッド) というのは、「OS ではなくランタイム (ライブラリ) が独自に管理する実行単位」のことで、概念的にはスレッドなんだけど、 OS から見るとスレッドではない。
このアカウントは、notestockで公開設定になっていません。
たとえば JS って (Web Worker などを使わなければ) シングルスレッドなんですが、 Web Worker の導入以前から「非同期処理」 (Promise) は存在していたわけです
じゃあこの「非同期」が一体何なのかというと、 JS から見ると「ブラウザに『通信してくれ〜』とリクエストを送ると結果と交換できるチケットが貰えて、ブラウザが通信を完了するとチケットが結果と交換できる」という仕掛けなので、実のところ JS 環境の外側に処理を委託しているんですね
じゃあ JS の外側で通信をする主体が JS エンジンのスレッドの「空いた時間」でやっているのか、それとも共通の通信専用スレッドでやっているのか、それとも各通信ごとにスレッドを生やしてやっているのか、その辺りは実装の細部なので非同期実行を使う JS 側に対しては隠蔽できます。つまり本質ではない
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
その辺りは若干多義性があるけど、 async / await 的な意味での「非同期」と言うとき、一般には「今じゃないけど後で結果が欲しい、結果が欲しいと私が言うまでは自由にスケジューリングしていいよ」というモデルのことを指しているので、 setTimeout は async / await 的ではない
このアカウントは、notestockで公開設定になっていません。
XHR もコールバックが割り込み的に実行されるけど、「通信の**結果を後で処理する**」という目的で使われているので async / await に近い意味での「非同期」にカテゴライズされそう
「実行はすぐに開始、完了を待たず他のことをする、結果は後で使う」の3つが揃うとだいたい async / await とか Promise 的な意味での「非同期実行」であると考えてまず問題なさそう
https://mastodon.cardina1.red/@lo48576/102808987974426750
実際、結果変数 (promise 相当) への参照をコールバック関数から弄ってやれば、 promise 的な仕掛けは実現できそう (JS で本当にできるかは知らんが、一般に概念的にはできるはず)
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
「陰キャオタク同士で会話するんだけど、会話が途切れた合間に Twitter を見る」とかは非同期ですね
「会話しながら同時に Twitter する」 (マルチスレッド相当) でも非同期ではあるし、「会話する人と Twitter 担当を別人にする」 (マルチプロセス / fork 相当) でも確かに非同期ではあるんだけど、「同じ人が合間で別のことをする (ただし同時ではない)」もまた非同期
で、一番最後の非同期については「非同期」としか言いようがないというか、「マルチスレッド」でも「マルチプロセス」でもない「(広義) 同時実行」なので、非同期という言葉は意味が広いけど、文脈によっては指しているものがもっと狭い場合はある
(まあプリエンプティブマルチタスクとかノンプリエンプティブマルチタスクとか表現することはできるけど……それもマルチプロセスやマルチスレッドとの混同がありえるので厄介)
このアカウントは、notestockで公開設定になっていません。
一度メンタルモデルができてしまえば、あとは例え話を聞いてもセヤナできるので、最初の一歩がな
進捗、生存のための時間 (睡眠、食事、 etc) をナチュラルに食い潰していくので本当に危険
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
初学者に教えるかはさておき、「セマンティクス」という概念がもっと明示的であるべきだとは常々思っています
たとえば 0 + "12" が 12 になろうが "012" になろうが "12" になろうが "0" になろうが 1 になろうが、そこに一貫した理屈を与えることはできる。
問題の本質は「人々が直感で想像する結果が共通であるか」ではなく、「特定のコードについて特定の挙動が自動的に導けるか」であって、それこそがプログラミング言語がセマンティクスを必要とする理由なので
だから「○○なコードは『意味がないから』禁止されている」というのはナンセンスというか因果が逆で、「特定のプログラミング言語において○○なコードは『意味が割り当てられなかった』」という説明になるべきなのよね、本来は。
人間が言語を設計するときに「意味を割り当てなかった」理由として、不自然だからとかややこしいからとか、そういう人間サイドの思惑がある。
このアカウントは、notestockで公開設定になっていません。
計算機科学の少なからぬ部分 (特にプログラミングそのもの) は自然科学ではなく人工科学なので、「ただあるものを観察し理解する」姿勢だけではなく「そのように定義された理由や都合を推察し理解する」というフェーズは結構大事だと思う (知らんけど)
@tacumi マトモなプロダクトだと「それがいいと思った」の背景に苦悩の経験とか人々の共通認識とか理論的・機械的限界みたいなものがちゃんと存在するので、そのデザインの根拠 (rationale) が説明できるデザインは「良いデザイン」であるとは思います。
(もちろん残念なことに全てのデザインが良いデザインではないけど……)
@tacumi マトモなプロダクトだと「それがいいと思った」の背景に苦悩の経験とか人々の共通認識とか理論的・機械的限界みたいなものがちゃんと存在するので、そのデザインの根拠 (rationale) が説明できるデザインは「良いデザイン」であるとは思います。
(もちろん残念なことに全てのデザインが良いデザインではないけど……)
ちゃんとね、仕様の裏に理由がある場合があってね、そこをちゃんと知るのも情報工学徒としての学びよ
まだ最後までちゃんと読んでないけど、もしかしてここで動的型付き言語勢が言っている「静的型」って C 言語のプリミティブ型レベルの話しかしてなかったりする?
そういう範囲ですらなく型とは何ぞやレベルの話だと思う><;
TaPL日本語版が出る前はこういう議論わりと頻繫にあったのに、出たらぱったりなくなったのおもしろい><
静的型が「サイズ上限のある整数」とか「整数と文字列を混同できない」程度の認識でやっているの、完全に「静的型付き言語は C しか知りません」と言っているようなものでしょ
型の話、鉞で炎上するならまあ自業自得なんだけど、トンチンカンなオレオレ型理論 (型理論ではない) を振り翳してやってくる人々をいなす光景があまりに不毛すぎて、不特定多数に向けて喋りたくないトピックの上位
「さんすうができるからといって自分が数学を知っていると思ってんのか」みたいなやつですね
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
puts("hoge!!!"+1);
___
___/ ヽ
/ / /⌒ヽ|
/ (゚)/ / /
/ ト、/。⌒ヽ。
彳 \\゚。∴。o
`/ \\。゚。o
/ /⌒\U∴)
| ゙U|
| ||
U
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
京橋のツイッタージャパン本社のビルも公式ツイッターアカウントがあるのを昨日みたけど、ビルができた日を誕生日にして凍ってほしすぎるなとおもってしまった
でも誕生日設定していないときのメッセージが「このアカウントがたとえネコのものでも誕生日を設定してください」みたいな文言なのはどうなんだと思っている
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
誤字報告が無効化されている作品でそういう漢字の間違いを発見してしてしまうと得も言われぬ悲しさを覚える
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
まあ実際いろんなところに分岐したりくっついたりしてるんだろうし、そう簡単には抜けないのかもしれないな (知らんが)
このアカウントは、notestockで公開設定になっていません。
仮面ライダーシンかな…(見たことないけど知ってる)
脊髄ぶっこ抜き (せきずいぶっこぬき)とは【ピクシブ百科事典】
https://dic.pixiv.net/a/%E8%84%8A%E9%AB%84%E3%81%B6%E3%81%A3%E3%81%93%E6%8A%9C%E3%81%8D
そういえばておくら久しくログインしてない…… (というかマイクラそのもの最近起動してない)
マイクラとかのマルチ、つよい人たちがいつのまにか鉱石とかのリソース無限に入手していて共用にしていたり、気付いたらインフラが整っていたりして、クソザコ勢の私は完全にフリーライドしている気分になってくるので厄介
このアカウントは、notestockで公開設定になっていません。