米米的博客

做了一点微小的工作

APK,即 Android 应用程序包(Android application package),是 Android 操作系统中用于分发和安装移动应用及中间件的文件格式。一个 Android 应用程序的代码想要在 Android 设备上运行,必须先进行编译,然后打包成为一个被 Android 系统所能识别的文件,其格式便是 APK。一个 APK 文件内包含被编译的代码文件(.dex 文件,即 Dalvik executables),文件资源(resources), assets,证书(certificates),和清单文件(manifest file)。

APK 文件基于 ZIP 格式进行压缩,它与 JAR 文件的构造方式相似。因而,直接解压 APK 文件可以得到一部分内容,如 classes.dex 等。如果要进行更详尽的分析,就需要用到反编译的工具了。

准备工作

下载 apk 反编译组件

需要下载的程序包括:

一些论坛里会把它们称为「APK 反编译三件套」。

前两个程序可以通过 Homebrew 进行安装:

1
brew install apktool dex2jar

Homebrew 同时也会将 openjdk 作为依赖包装好。

JD-GUI 需要点击上面的官网链接下载,选择 jar 格式的即可。

阅读全文 »

A point walks into A bar. says, "We're closed."
is walking down the street when it sees running towards him. "Help!", shouts, There's a differential operator coming my way, and if it catches me, I'll be reduced to nothing! confidently says "Stand beside me, ! Together, we'll be safe from any differential operators we come across!" Suddenly, the differential operator appears and asks "Who are you?" They respond "We are . Who are you?" It smiles and says "".

阅读全文 »

MySQL 的安装

在 MySQL 官网的下载页上,提供了各种系统和环境的安装方法。你可以选择通过包管理工具的软件源安装,也可以通过源码编译安装。不过编译是非常吃内存的(实测至少需要 4GiB 内存),并且还很耗时(毕竟是 C++ 写的),因此不推荐。具体来说,你可以:

使用包管理工具

yum 为例,首先增加并启用 MySQL 软件源,在 Download MySQL Yum Repository 页面找到适合你的版本,然后下载并启用之:

1
2
3
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm #换成适合你的版本
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
yum-config-manager --enable mysql80-community

这样,就可以直接通过 yum 安装 MySQL 服务器了。

1
yum install mysql-community-server

安装完成后,会在 /usr/sbin//usr/bin/ 目录下出现 MySQL 的可执行文件,而 mysqld.service 会自动加载好。MySQL 的配置文件则是 /etc/my.cnf

如果你在使用 macOS,并配置好了 Homebrew:

1
brew install mysql

其它系统也可以使用相应的包管理工具安装。

使用源码编译安装

再次提醒:源码编译安装方式非常麻烦,如果可以的话请使用包管理工具安装。

1
2
3
4
5
wget https://cdn.mysql.com//archives/mysql-8.0/mysql-boost-8.0.13.tar.gz
tar -xzf mysql-boost-8.0.13.tar.gz
cd mysql-boost-8.0.13
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DDOWNLOAD_BOOST=1 -DWITH_BOOST=boost -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLE_DTRACE=0 -DENABLED_LOCAL_INFILE=1 -DDEFAULT_CHARSET=utf8mb4 -DEXTRA_CHARSETS=all
make && make install

这里的 -DCMAKE_INSTALL_PREFIX-DMYSQL_DATADIR 参数指定了 MySQL 的安装目录和数据文件存储目录。

阅读全文 »

Revolver Maps 是一个交互式的网站访客地图。每一个浏览者的位置都会实时在由 Canvas 渲染的地球上标记出来。在它的官方网站上,你可以轻松地选择地图样式,并生成用于插入 HTML 页面的 script 标签。

其中,RevolverMaps Standard GL 样式是响应式的,会自适应父元素大小,非常适合作为访客地图使用。点击「Get this Widget!」按钮,在新的页面中调整参数,可以自定义颜色、缩放、旋转等等。完成后,将生成的 script 标签复制下来,并放在你想要生成地图的地方即可。例如:

1
<script src="//ra.revolvermaps.com/0/0/8.js?i=0pdvpgzth5r&amp;m=7&amp;c=ff0000&amp;cr1=ffffff&amp;f=arial&amp;l=33&amp;v0=20&amp;z=11" async="async"></script>

这时,效果看上去会是这样:

Revolver Maps显示效果

类似地,你也可以把它放到 WordPress 博客的侧边小工具栏中,像下图这样:

WordPress集成Revolver Maps

访问站点时,访客地图就会自动显示了。

在学院的新年晚会上,主办方使用了一个基于微信小程序的弹幕系统,让全场观众通过大屏幕发送弹幕互动。比较坑的是,该弹幕系统存在「高级弹幕」选项,以此向用户收费。考虑到这一系统的逻辑实际上并不复杂,笔者决定自己实现一个。它被命名为「米米弹幕系统」(Mimi Danmaku),其初代版本基于 Ajax 轮询实现。这是客户端的样子:

米米弹幕客户端

客户端基于 Electron 实现,这一过程也踩了不少坑。例如,为了在播放 PPT 时,还保持弹幕可见,就必须要让弹幕的窗口全屏且置顶,而且要忽略鼠标事件;在电脑连接了外部投影屏幕时,又需要在投影屏幕上打开全屏窗口等等。这些惨痛的 debug 历史都在客户端的 GitHub 仓库中得以体现,此处不再赘述。
当然,由于笔者是第一次接触实时通讯,程序上还存在不少缺陷。在进行调研后,笔者决定使用 WebSocket 代替原先效率极低的轮询,并重构一部分逻辑。经过数天的调试,现在全新的米米弹幕系统已经可以正常使用了。这个重制后的版本,成功实现了消息即时收发、自定义弹幕颜色、大小等功能。下一步笔者将把弹幕系统整合到直播中。附上链接:
mimi-chat
mimi-danmaku
同时还开放了一个随机生成用户名(来自魔兽世界)的 API:
随机用户名


本文更新于 2018 年 5 月 18 日:
galaxymimi.com 和 zsq.im 即日起全站支持 https 访问,ws 连接也升级为了 wss。

本文更新于 2019 年 3 月 27 日:
笔者决定使用 Heroku 部署弹幕服务,又重写了不少代码。可以在此处查看:
米米弹幕

0%