Hoes of Tech

Conceptualization of Technology

  • 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...

  • Back to Mac

    在过去的一段时间里,我一直在用ZTE的安卓手机Axon 7,我并不讨厌Android,也没有感觉到网上所说的卡顿或者内存不足等问题,不过系统更新太慢&弹窗还是让人觉得用起来并不舒服。实际上,日本版的Axon7直到去年的7月才更新了Android7.1.1,并且似乎并没有后续更新的计划,我并不期待新版本的功能,但缺乏Security Patch还是让人颇有些不安的。于是,趁着iPhone发布新版本,我换了iPhone8。

    实际上,在iPhone之前,我已经买了iPad,因为它给了我很大的惊喜。在ヨドバシカメラ的店头随手试了一下iPad Pro + Apple Pencil之后,流畅的书写感觉给我留下了很深的印象,以至于我当时就买了下来。后来半年的时间里iPad也没有让我失望,配合GoodNotes4,不论是读论文还是会议笔记,iPad都没有出现任何问题。由于在iPad上书写几乎对环境没有要求(不需要光源,不需要桌子或垫板),在睡觉之前甚至可以趴在床上写日记。毫无疑问这是我这些年里买的最不会后悔的产品了。

    在换了iPhone之后,我把很久之前买的Mac mini mid2012翻了出来,自从把环境全部转移到了ArchLinux+i3之后Mac mini就一直没有开过机。跟Linux比起来macOS的优势并不明显,尤其是低配版的Mac mini并没有SSD …

    Read more...

  • Writing A Threadpool in Rust

    多线程一直是我相当不相碰的东西,总觉得看起来很棒,用起来却一点都不放心——尤其是过去用Delphi体验了多线程之后。实际上到了多线程里根本就没法定位那里出了错误,因此大部分时间压根不是在“调试”,而是告诉用户怎么用才能避免这个错误。在给OOC写MultiTheard Generating的时候我也紧紧用了最简单的ThreadPool,并且因为互斥锁多线程还没有单线程快。总之,这么多年我一直有意的躲避多线程的问题。

    而Rust一直在宣传它在多线程上的优势——所有权如何的好,在Servo里面他们如何用Rust写了个漂亮的Parallel Parser。加上最近一年一直再用Rust写游戏的服务器,于是我决定回头看看Rust下的多线程体验到底如何。

    ThreadPool

    相比简单的用多线程算个加法,或者写个The Computer Language Benchmarks Game的测试程序来说,ThreadPool可能更适合练手。在这里,我会实现下面这个结构的ThreadPool:

    ThreadPool

    简单来说,主线程通过Channel向ThreadPool发送Job,然后Threadpool里的每一个子线程在空闲时都会尝从Channel里获取Job,然后执行它。执行完毕之后,Job的返回结果会通过另一个Channel传送给主线程。实际上,在C或Delphi里,实现这么一个东西似乎并不是很困难,然而,Rust因为独特的所有权制度,代码比思路要复杂一些,下面,让我们来看看怎么实现这个ThreadPool。

    Jobs for the Job

    首先 …

    Read more...

  • Formal Concept Analysis with Rust (1) - Introduction

    Introduction

    不知不觉,从开始使用Rust到现在已经有接近一年了,Rust也渐渐成为了目前用起来感觉最舒服的语言。虽然Rust号称因为有确定性析构,所以不会在内存释放上有效率损失,不过在实际使用中,总是能够感觉到再有大量小内存分配和释放的时候运行效率和内存效率都比C要稍微低一些。这次,让我们用Rust通过实现一套形式概念分析的算法,来看看Rust在全列举程序上的表现到底如何。

    Formal Concept Lattice

    这次我们将把重心放在实现上,对与Formal Concept的我们只介绍在程序中需要使用的特征,如果打算了解更详细的理论内容,可以参考Lattice Theory的综述性论文,比如:

    Wille, Rudolf.

    "Restructuring lattice theory: an approach based on hierarchies of concepts."

    Ordered sets. Springer Netherlands, 1982. 445-470.

    简单来说,对于一组文章\(D={d_1, d_2, \dots, d_n}\),和一些事先提取出来的文字\(W …

    Read more...