Hoes of Tech

Conceptualization of Technology

  • 日本国籍笔记

    Stage0 - 条件

    申请之前最好保证自己条件没问题,否则预约之前还没进门就被拒了。一般的条件都能在法务省的网站上找到, 其中值得一提的是居住条件(国籍法第5条第1項第1号),虽然法律只要求了连续居住5年,但在实际操作上都是要求要有至少3年的工作,大部分法务局都会明确提到这一点。 不过这里的3年工作时间只需要在正式申请的时间点达成即可,考虑到正式申请之前几个月的准备时间,工作2年9个月也并不会被拒绝。

    实际上,除了网上能够看到的一般的条件,实际的审查有详细的内部参考资料(帰化事件処理要領),里面规定了更详细的条件以及审查要点。 这份文件通常不会公开,通过律师提出公开请求也最多只能活得一个关键部分均被涂黑的版本,不过记载的内容依然比网上的公开内容详细了很多,建议在申请之前通读一遍。

    Stage1 - 第一次面谈(预审)

    跟当地的法务局打电话,每个法务局都只管自己附近的地区,你住在北海道给东京法务局打电话人家也不管你,具体要联系哪里可以参考法务省的网站。在电话里说明自己是第一次去,会有人安排面谈时间,并让你带着自己的在留卡和护照去法务局。由于大部分法务局都挺忙,一般能预约的时间都是一个月后。

    预约之后法务局会安排一个帮你准备材料的“相談員”,在正式申请之前都是他负责,需要注意的是这个阶段里负责人可以拒绝接受申请。 第一次到法务局之后会安排一次杂谈时间,听取申请人的家庭状况,工作状况等,之后会确定申请人的性质并给出一份需要的材料列表。

    很多法务局都先要求先办理在中国国内的材料,在这些材料没问题之后才要求办理日本方面的材料。 根据家庭构成需要的材料各有不同,但大部分都可以在户籍地的公证处办理,一些公证处还提供翻译服务 …

    Read more...

  • Ergonomic Keyboard in 2022

    Introduction

    这几天,伴随了我6年的Truly Ergonomic Keyboard终于撑不下去了, 除了从购买当初就一直存在的Double Typing问题,最近还开始出现Ghost Touch——并且偏偏是Del键。不得不承认, 在无所事事的时候毫无征兆的跳出几十个删除确认窗口的恐怖效果比电影和游戏要强多了。 在那之后,不管是对键盘进行全面清洗,还是折腾微动,都没能解决Del键的Ghost Touch,这也让我下定决心换一款新的键盘。

    已经停产的Truly Ergonomic

    可惜的是最初的Truly Ergonomic Keyboard早就已经停产了,而沉寂了数年之后这家公司才推出了后继的Truly Ergonomic CLEAVE键盘。

    新版的Truly Ergonomic键盘

    新的键盘维持了老键盘的设计,依然是近些年人体工程学所追求的垂直键位排列,以及左右手能成自然状态的倾斜布局,有Function键看起来也很诱人。在快要下单的时候,我发现它似乎不是完全可编程的——说明里只表示Shift,ESC等极少数键位可以修改,官方也并没有提供刷固件的工具。然而作为一个Dvorak使用者,这些年我一直在用自己修改过的layout,回到QWERT显然已经不可能了——因此我决定寻找下一个能用的人体工程学键盘。

    Ergonomic Keyboard in 2022

    人体工程学并不是个什么新的话题,我还记得大概在20年前的大众软件上就出现过微软出品的人体工程学键盘, 在当时,中间凸起向两侧扭曲的键盘是一个不折不扣的新东西。其中 …

    Read more...

  • Random Notes on Modern Monetary Theory

    黄金和白银都曾扮演过通用货币的角色,它们比较稀有,便于携带还不易损毁,用来作为衡量价值的中介并不是个很让人意外的事情。在很长一段时间里货币需要跟金银等价才能让人信服——不论是让货币本身含有金银,还是将纸币与金银挂钩。只要有一个足够强大的组织保证能这张纸兑换为真正的金银,那么这个货币的使用者和接收者自然不会产生质疑。

    然而这个前提现在已经不复存在,美国在几十年前已经不再接受美元兑换黄金(Nixon shock),绝大多数国家也都不再实行金本位。很显然脱离了黄金很带来很多好处,比如政府可以尽情的发行货币而不用担心黄金储备不足导致的信用破产,社会发展也不会受制于黄金开采速度(毕竟一个软件公司无法扩张是因为黄金开采不够快看起来并不合理)。然而反过来看,既然现代的货币已经跟稀缺资源没有任何关联,那么人们为什么不认为这些货币是废纸,而依然使用它们?

    Tax-Driven Monetary View

    Modern Monetary Theory(MMT)对这个问题的一个假设(或者推测)是货币的需要来自于政府强制性的征税。

    如果政府强制性的征税,并且缴税只能使用政府发行的货币,那么人们就不得不试图获取政府的货币。当几乎所有人都持有这个货币的时候,货币就具有流通性了。在货币发行当初,为了让所有人都接受这个货币,政府需要设置人头税等普适的税种;但货币流通之后就算只对部分人征税一样可以达到同样的效果。假设政府废除了所有面向个人的税,从个人角度来看获取货币已经没有必要,公司也可以发行自己的“货币”,比如某种电子支付的点数,实际上日本已经有了用民营企业点数代替货币支付薪酬的讨论(デジタル給与払い)。

    資金移動業者が発行するプリペイド(前払い …

    Read more...

  • Things Behind ATH-DSR9bt(2)

    Beyond PCM

    前回のブログでは今のフルデジタル製品の大元、Sonyが提案したパルス符号変調(PCM)ベースのデジタルヘッドホンを紹介した。ただし、最後に問題が残っていた:この方式では、ボイスコイルの巻き数を\(2^{N-1}\)までしないと実現できない。これだと超大型の製品しかできないし、かなりの精度で作らないと音の歪みが発生する。とすると、もっといい方法はないだろうか?

    当然改善し続ける選択肢もあるし、例えばPhillipsはソニーの手法を改善している1が、そもそも音の出し方自体を変えるとどうなるだろうか?

    From PCM to PWM

    前回で紹介したPCM方式では、一定時間毎に、音声信号の強さを量子化して記録する方式だ。逆に考えば、信号の強さを固定にして時間を変化すれば、信号も記録できるではないか?ということで、パルス幅変調(PWM)もしくはパルス密度変調(PDM)はこのような方式だ。

    PDM

    緑の曲線は音声で、青線は量子化したPDM信号となっている。PDMの信号は0、1の2つの状態しかない(もしくは、0、1、ー1の3つでもよい)、元の信号が強ければ、PDMの信号は1にいる時間が長い …

    Read more...

  • Formal Concept Analysis with Rust (3) - Parallization

    上一篇文章实现了一个简单的Formal Concept的Enumerator。不过实际测试结果表明单纯列举的速度并不足以对应足够大的数据。至少对3000个Object就花掉接近8分钟的算法很难让人接受。这次将利用tokio将上一篇里的算法并行化,来看一看改进之后的速度。

    Iterator-style Enumeration

    在动手加入多线程之前,先来把上一次写的代码整理一下。上一篇里用了普通的for obj in cur_obj..r.row.len() { ... }的循环,虽然没有什么问题,但可以写的更加"rust风"一点,比如用上Iterator:

    (cur_obj..r.row.len())
        .filter(|obj| !cur_concept.extent.get(*obj).unwrap_or(false))
        .filter_map(|obj| {
            let mut extent = cur_concept.extent.clone();
            extent.set(obj …
    Read more...

  • Things Behind Apple's CSAM Detection

    TL;DR

    • NeuralHash is a MobileNetv3 whose last layer is replaced by Fully-connected.
    • NeuralHash convert the outputs of MobileNetv3 to hashes by Random Projection.
    • Transfer Protocol used "a two-layer encryption": Images are encrypted with a shared random key \(k_1\). \(k_1\) is splitted into \(t\) parts \(p_1, \dots, p_t\) by Sharmir's …
    Read more...

  • Formal Concept Analysis with Rust (2) - Basic Algorithm

    上一篇文章里, 我们介绍了Formal Concept的基本概念,概括起来就是对于一个文章-单词的集合\(D=\{d_1, d_2, \dots, d_n\}, W=\{w_1, w_2, \dots, w_m\}\),有:

    • 对于任何一个文章的集合\(D_n = \{d_{i_1}, \dots, d_{i_2}\}\), 我们总可以用Closure操作把它变成一个合理的,极大的Formal Concept。即:对于\(D_n\)我们先寻找这些文章的共通单词的集合\(D_n^{\downarrow}\), 再通过这个单词的集合去寻找包含这些单词的文章集合\({D_n^{\downarrow\uparrow}}\),最终得到的文章-单词组合\(\{D_n^{\downarrow\uparrow}, D_n^{\downarrow}\}\)就是一个极大的Formal Concept。这个寻找共通单词,共通文章的操作就是Closure。在本文里,我们会把寻找共同单词的操作写成 …
    Read more...

  • Write a Niconico Video Player, in Rust

    Introduction

    Niconicoのフローは以下のような感じ:

    Overview

    1. ログイン時取得したCookieを使って、https://www.nicovideo.jp/watch/so*をGetする。取得したページにdata-api-dataというJsonデータが埋められている。
    2. 上記のdata-api-dataを整備して、ほしい映像の解像度情報や認証情報をサーバに送る。するとそれに応じて映像のHLSアドレス(i.e. m3u8)やHeartbeatするためのSession情報が戻ってくる。
    3. HLSストリーム自体にセッションKeyの認証などないため、基本ffplayMPVなど使えばこのHLSアドレスから映像取れるが、定期的にHeartbeatしないと、サーバ側でセッションを削除するので途中からエラーが出る。ちなみにyoutube-dlはよく403エラー起きるのもこれのせい。
    4. なので、上記HLS再生中、定期的にサーバにHeartbeatのリクエストの投げる。

    Get data-api-data

    今回は認証の部分に触れないので、(ブラウザで)ニコニコにすでにログインでき、それのCookieを取れている状態を想定している。ちなみに、Cookieを取るにはログインの状態でFirefoxやChromeで適当にページを開くと、デベロッパーツールのネットワークから最初のgetリクエストを見れば、リクエストにヘッダーにCookieがついている …

    Read more...

  • Things Behind ATH-DSR9bt(1)

    Introduction

    2014年、オーディオテクニカからフルデジタルのヘッドホンATH-DN1000USBが発売された。札幌のヨドバシで実機を聞いてから、その解像度をずっと忘れられなかった。ただし、当時としても値段がかなり高く(7万くらい)、私と同じ手を出せなかった人も多いでしょう。その結果、一時期話題になっていたが、あまり売れていなかった。

    2年後、DN1000USBと同じDnote技術を使ったDSR-7/9btが発売された。Bluetooth付き、デザインも更にかっこよく、何より値段は3万~6万、もはや売れる要素しかないと思いきや、普通に売れた程度だった。ハイレゾのような怪しい概念をすんなりと受け入れられるオーディオ市場なのに、なぜフルデジタルは無視されるだろう?レビューや掲示板を見ていると、フルデジタルがよく言われるのは

    • 結局アナログに変換されるでしょう?ならフルデジタルの意味はなんだ?
    • 仕組み上アンプ入りのヘッドホンと何が違うんだ?
    • 所詮無線だし、有線に勝てるわけがない

    最後はともかく、上の2つについて私も似てる疑問があった。Dnoteの説明もオーテクのインタビューも詳細を説明されていないため、今回は色んな特許文献を見ながら、フルデジタルの原理、その特徴について述べていく。

    The origin of Full-digital Audio …

    Read more...

  • Enum, Generic and Templates

    在很久之前,我曾经写过(或者说,翻译过)一篇关于OOC里泛型的博客,在那个时候,我对OOC的泛型设计是持否定态度的——相比起OOC的动态泛型,那时的我认为类似C++的泛型更加好用。类型在编译时是确定的,因此编译器可以进行静态类型检查,同时没有执行时的性能损失,也不需要在使用时cast,不会出现错误……总之,似乎没有理由去选择OOC的设计。 在那之后的2~3年里,我也一直都是这么认为的。

    当然,Rust也是这样的,因此这几年我也一直很满足,直到最近遇到的问题。

    An Example of Deserialization

    让我们先来考虑一个简单的场景,有某个服务用Json传送信息,里面包含了一个服务器列表,服务器有几种类型,每一种有不同的属性,比如:

    {
        "server_list": [
            {
                "name": "server_a",
                "role": "front",
                "scale": 10
            },
            {
                "name": "server_b",
                "role": "worker",
                "is_debug": false,
                "restart_time": "23 …
    Read more...