Cocoa

Add Image Zoom In/Out Feature with medium-zoom.js

啊,这篇 post 大概是个笔记~

其实很久之前就想把放大缩小图片的功能加到博客上来的,然而一直以来都在摸鱼,前段时间帮玲做了一个摄影的的博客,于是就正好找找看有没有合适又好用的 JS 项目

在一番搜索和试用 Demo 之后,只有 https://github.com/francoischalifour/medium-zoom 最符合需求,同时使用起来非常便利,几行代码就可以给博客加上图片放大缩小的功能

Continue reading Add Image Zoom In/Out Feature with medium-zoom.js

C/C++ 中非法的 void main() 与 main() 函数返回值的作用

这篇 post 是主要是写给 Association of Robots and Artificial Intelligence 的小伙伴的~主要说说为什么 void main() 是非法的,以及 main() 函数的返回值到底有什么用~

先从 void main() 讲起吧~这里就先引用 C++ 之父,Bjarne Stroustrup,在他的博客中写过的一篇问答:Can I write "void main()"?

Can I write "void main()"?

The definition
                                      void main() { /* ... */ }
is not and never has been C++, nor has it even been C. See the ISO C++ standard 3.6.1[2] or the ISO C standard 5.1.2.2.1. A conforming implementation accepts
                                      int main() { /* ... */ }
and
                                      int main(int argc, char* argv[]) { /* ... */ }
A conforming implementation may provide more versions of main(), but they must all have return type int. The int returned by main() is a way for a program to return a value to "the system" that invokes it. On systems that doesn't provide such a facility the return value is ignored, but that doesn't make "void main()" legal C++ or legal C. Even if your compiler accepts "void main()" avoid it, or risk being considered ignorant by C and C++ programmers.

翻译:这种写法 void main() { /* ... */ },从来都没有在 C/C++ 中存在过,根据 ISO C++ 标准 3.6.1 或者 ISO C 标准 5.1.2.2.1,只有 int main() {/* ... */} 或者是 int main(int argc, char* argv[]) {/* ... */} 才是可接受的。

A conforming implementation may provide more versions of main(), but they must all have return type int. The int returned by main() is a way for a program to return a value to “the system” that invokes it. On systems that doesn’t provide such a facility the return value is ignored, but that doesn’t make “void main()” legal C++ or legal C. Even if your compiler accepts “void main()” avoid it, or risk being considered ignorant by C and C++ programmers. —— Bjarne Stroustrup

翻译:符合规范的写法可能会有一些别的版本,但是他们都必须返回 int。这个main()返回的 int是用来会返回给调用这个程序的“系统”的。在没有提供这样的功能的系统中,这个返回值会被忽略,但是那也绝不使得void main在 C/C++ 中是合法的。即便你的编译器让你编译过了,或者就是仔细考虑过这么写的后果/风险

比如,我们来编译一下如下的 C 代码

void main() {
    
}

那么编译时就会报一个警告

编译器告诉我们 main() 函数应该有的返回类型是 int 而不是 void

此外,void main() 也不在 C89 或者 ANSI C 规范中受支持,要么会报错,要么会产生警告。事实上,没有任何一个 C/C++ 标准支持这种形式的 main() 函数。以下是依次以 C89 标准和 ANSI C 标准编译时会有的输出。

Continue reading C/C++ 中非法的 void main() 与 main() 函数返回值的作用

Python 2.7 + Scripting Bridge 导出 iTunes Library 里音乐的 MetaInfo 与封面到 MongoDB

作为某个 Project 的一部分~(暂时不透露是什么,嘻嘻(⁎⁍̴̛ᴗ⁍̴̛⁎) ) 需要把 iTunes 里面的所有音乐的 MetaInfo 和封面导出到 MongoDB 中

MongoDB 上次已经已经在 Raspberry Pi 4 上编译部署好了~在 Raspberry Pi 4 上安装 64-bit MongoDB Server 服务

然后再配合很久以前玩过的 在 Python 里使用 Scripting Bridge 与 iTunes 交互,就可以达到目标了233333

当然需要注意的是,这里要使用的是 macOS 自带的 Python 2.7,因为 ScriptingBridge 只安装在了自带的 Python 2.7 里

真正代码的话,其实整体来说很简单,需要考虑的点是如何做到不重复写封面,因为——

  1. 目前 Scripting Bridge 与 iTunes 交互时,只能一首音乐一首音乐的依次遍历,不能直接按照专辑遍历
  2. 同一张专辑里,有的音乐可能包含多张封面
  3. 不同的专辑可能被我 assgin 过相同的封面

综合这几点考虑的话,那就只能每次拿到有封面的音乐之后,对它的每一张封面都计算 SHA256 摘要(这里暂且认为 SHA256 的空间足够大,不会产生碰撞),并在放进 global_sha256 前,检查是否已经有相同的 SHA256 存在其中。如果没有的话,才保存图片到磁盘中,并放到那首歌的 MetaInfo 中;如果在 global_sha256 中有的话,那么就再看那首歌的 MetaInfo 中有没有这个 SHA256(因为也许有人不小心添加了两张一样的封面到音乐里)。

在遍历完所有音乐之后,把这些 MetaInfo 写入到 JSON 文件中~(就像下面这样

{
  "album": "Cutie Panther", 
  "name": "夏、終わらないで。", 
  "artist": "BiBi (南條愛乃, Pile, 徳井青空)", 
  "cover": [
    "44f9b56091c7ca5b011cd9cb306eab21d4f854300c96347a0a7f3538cbeb9dcd-1"
  ], 
  "composer": "渡辺和紀", 
  "year": 0, 
  "sha256": [
    "44f9b56091c7ca5b011cd9cb306eab21d4f854300c96347a0a7f3538cbeb9dcd"
  ]
}

最后再导进 MongoDB 数据库就可以啦(当然需要安装一下 pymongo 库)~主要的就分为 2 个 stage ♪(´ε` )

python2.7 -m pip install --user pymongo
python2.7 iTunes.py -s 1
python2.7 iTunes.py --host raspberrypi.local -s 2
Continue reading Python 2.7 + Scripting Bridge 导出 iTunes Library 里音乐的 MetaInfo 与封面到 MongoDB

在 Raspberry Pi 4 上部署 Apache 2 + PHP 7 + MongoDB

在前面几天终于把 64-bit MongoDB Server 折腾编译好之后,现在就可以在 Raspberry Pi 上部署 Apache 2 + PHP 7 + MongoDB 的环境了~

编译和安装可以参考之前两篇post~在 Raspberry Pi 4 上编译 64-bit 的 MongoDB Server在 Raspberry Pi 上安装 64-bit MongoDB Server 服务

那么现在就是接着在上次的 chroot 环境里部署 Apache 2 + PHP 7,以及 PHP 的 MongoDB 接口~

  1. 安装 Apache 2 与设置 Systemd Service 启动 chroot 环境下的 Apache 2
  2. 安装 PHP 7 与编译设置 PHP MongoDB 扩展
Continue reading 在 Raspberry Pi 4 上部署 Apache 2 + PHP 7 + MongoDB

Solution for "dpkg: unknown user / system group in statoverride file"

When I was deploying my Raspberry Pi for my new project, dpkg reported a unrecoverable fatal error while installing dependencies,

dpkg: unrecoverable fatal error, aborting:
 unknown system group 'ssl-cert' in statoverride file; the system group got removed
before the override, which is most probably a packaging bug, to recover you
can remove the override manually with dpkg-statoverride
E: Sub-process /usr/bin/dpkg returned an error code (2)

So I had a look at the file /var/lib/dpkg/statoverride

Since dpkg said that the system group ssl-cert was already removed, and to recover I need to remove these entries with ssl-cert.

Then it was time for sed, let's remove the lines containing ssl-cert

sed -i '/ssl-cert/d' /var/lib/dpkg/statoverride
Continue reading Solution for "dpkg: unknown user / system group in statoverride file"

macOS / Linux 上设置 Python 3 环境 —— MiniConda, pip3

这篇 post 是主要是写给 Association of Robots and Artificial Intelligence 的小伙伴的~如何在 macOS / Linux 上设置 Python 3 环境,包括如何使用 MiniConda 来让多个不同的 Python 3 或者 Python 2 环境共存,如何设置 pip 的镜像源等

  1. 下载 MiniConda 安装包
  2. 安装 MiniConda
  3. 设置 pip 使用清华大学 TUNA 镜像
  4. 设置一个 Python 3.8 的虚拟环境 py38
  5. 在 Python 3.8 虚拟环境中安装软件包
Continue reading macOS / Linux 上设置 Python 3 环境 —— MiniConda, pip3

在 Raspberry Pi 4 上安装 64-bit MongoDB Server 服务

啊,算是这个大坑的最后一篇了吧

前一篇是关于编译的,https://blog.0xbbc.com/2019/11/compile-64bit-mongodb-server-on-raspberry-pi-4/

那么在编译完之后,就是安装这个服务了~由于编译时绝大部分是静态链接的,因此上一篇编译出来之后,MongoDB Server r4.2.1 的体积在 2.2GB 左右,emmmmm,有点大。。总之,因为几乎都是静态链接,所以可以做个清洁安装~

Continue reading 在 Raspberry Pi 4 上安装 64-bit MongoDB Server 服务

在 Raspberry Pi 4 上编译 64-bit 的 MongoDB Server

上次编译了 MongoDB 的 Embedded 版本,不过官方表示那个还只是一个实验中的程序,同时上次编译的还是 32-bit 的 Embedded 版本,因此这次就来编译一个真正可用的 64-bit 的 MongoDB 好了_(:3」∠)_

总的来说倒也没有想象中那么复杂,但是确实有几个可能踩到的的坑

首先我做的就是先让树莓派到 64-bit 环境中,可以参考我的这篇博客,让 Raspberry Pi 4 完全运行在 64-bit 模式下

确认 schroot 到 64-bit 环境中之后,同样的,通过 apt 安装必要的依赖

sudo apt install -y scons libssl-dev libffi-dev libcurl4-openssl-dev wget gcc g++ vim cmake python3 python3-pip

包括稍后会用到的 Python 的依赖

cat << EOF >~/build-requirements.txt
Cheetah3 # src/mongo/base/generate_error_codes.py
psutil
pymongo >= 3.0, != 3.6.0  # See PYTHON-1434, SERVER-34820
PyYAML >= 3.0.0
regex
requests >= 2.0.0
typing >= 3.6.4
EOF

sudo pip3 install -r ~/build-requirements.txt

在国内的话,可以指定使用清华大学 TUNA 镜像源

sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r ~/build-requirements.txt
Continue reading 在 Raspberry Pi 4 上编译 64-bit 的 MongoDB Server

I, self, mind, immortality and death

Dasein is a being that does not simply occur among other beings. Rather it is ontically distinguished by the fact that in its being this being is concerned about its very being. Thus it is constitutive of the being of Dasein to have, in its very being, a relation of being to this being.

前两周到现在,一直在跟玲讨论一个巨大的话题 —— Immortality and death

在翻了不少文献之后发现,要实现 immortality 的话,目前为止最 promising 的方式则是 mind-uploading ,或者也可以叫 mind-cloning.

mind-uploading,简单来说就是把你的意识「mind」 扫描到计算机里,然后利用计算机来模拟原来的大脑的功能。(暂且让我们假设以后某天可以做到这一点,因为 mind-uploading 技术方面的事情不是本文所关心的内容,但是可以参考 Sandberg and Bostrom 在 2008 年发表的一篇论文)

可是,这样真的算达到了 immortality 吗?

Love, Death and Robots

在 Netflix 原创剧集「Love, Death and Robots」Season 1 Episode 15 中,Rookie 认为他的队友都死了,然而最后大家的意识都被 Bob 投影了出来,这个时候 Hawk 才告诉 Rookie,

「Bob always makes a full backup of our brains before each mission.」

也就是说,在那个世界中,一个存在(being,因为不能说是人,也不能简单的说是机器人)的意识是可以被数字化的,被数字化也就意味着有了上传、下载、备份的可能性。同时在这集「Love, Death and Robots」中,编剧也靠 Sui, Hawk, Kali 和 Bob 暗示我们,他认为只要有你的意识的备份存在,你就是一直存在的,即 immortality。

当然,mind 的备份也并非是公开的或者随意的,否则不难想象会有人利用这一点随意作恶等违法的事;同时也包含了 identity 的问题 —— 如果同时出现了两个甚至多个你的话,到底谁才是「你」?

「Love, Death and Robots」的编剧显然也考虑到了这两点,因为 Rookie 一开始是不知道有这项技术的,他是参加了这次作战,且队友不幸“牺牲”才知道的。Bob 在最后告诉迷惑的 Rookie,「You should have read your contract, kid」。也就是说编剧认为,在未来即使对 mind 的复制、备份等是可行的,也不是任何人想做就能做的,很可能是限制在军事行动中,或者只有少数人才有能力做到(包括钞能力hhhhhh)。

其实在剧中编剧也有不少暗示,比如 Sui 在最后面对 Boss 时,头被扯掉了。而通常都认为「大脑」在头上,头与身体分开了,也就无法再控制身体,或者是「死了」。然而后一幕中,眼看 Rookie 无路可逃时,Sui 却站起来了,随之镜头一转,原来 Sui 的「Brain」并不在头上,而是在身体上。其实这里的话,就已经隐约可以感觉到剧中的世界有 mind-uploading 类似的技术了。

Continue reading I, self, mind, immortality and death

すごーい!たーのしー!