All posts by Cocoa

探索网易云音乐——用 Python 写个爬虫吧w

既然想到要写点什么东西的话,那么就来试试网易云音乐吧w

那么第一步,我们要有数据才行,网易也当然不会公开自己的数据库啦,于是我们得用爬虫才行~

Python 语言里可以选择的爬虫还是不少,比如 Scrapy,然后在一开始开开心心的选择了 scrapy,之后发现网易云音乐对于 IP 的访问频率有限制,一旦超过限制,就会触发网易云的保护机制,暂时进入网易云黑名单,此时再访问的话,服务器返回的就都是 HTTP 503 - Service Unavailable。

解决方法说简单也简单,说麻烦也麻烦。简单在于,我的网络是电信的,于是只要重新拨号就能拿到新的公网 IP,写重新拨号的脚本也很简单。而稍有麻烦的地方在于,scrapy 是多线程的,在自己处理网易云返回 503 的时候,要注意重新拨号的脚本只需要执行一次。

如下图所示,假设我们的爬虫是 4 个线程,线程 2 在 t1 时刻访问时,遇到了 HTTP 503 之后,它就会进入我们处理网易云音乐 HTTP 503 的 handler。而对于其他线程来说,如果在 t1 时刻之前就开始访问了的话,那么是没有问题的,比如线程 1;如果是在 t1 时刻之后的话,比如线程 3、4,那么它们也会遇到 HTTP 503,但是这个时候,线程 3、4 就不用再走一次 handler,而是等待然后重试就可以。

HTTP 503 Handler
HTTP 503 Handler

但是也不用这么费劲,既然网易云音乐有频率限制,使用多线程的话,反而会更快的触发网易云的黑名单机制,因此,顺便作为重造轮子,我们来自己写个爬虫吧/

Continue reading 探索网易云音乐——用 Python 写个爬虫吧w

原来夜晚也如此明亮

知らなかだね。夜かこなに明るいなんて。
我都不知道呢。夜晚原来也是如此的光明。

这是战争之后,和小千坐着 Kettenkrad 从人类文明几乎灭绝的末日废墟里到了地面上的尤说的话。

从表面上来看,这是自然而然的,毕竟她们在几乎没有光的建筑里过了好久好久,眼睛早已习惯了黑暗,所以在刚出来的时候会觉得就连夜晚也好明亮。

小千和尤
小千和尤

但是既然我们已经知道这部作品里包含了很多隐晦的关于人性,战争,政治等等的思考,那么这里是在说什么呢?

我的理解是,对于生于和平的人来说,她们司空见惯的每一个黑暗夜晚,可能都是另一些人所盼望的光明。即便我们的「今天」并非是一帆风顺,但也是另一些人渴望而几乎不可达的的「明天」。

当然这么说也绝不是让我们再去重温什么「通讯基本靠吼,交通基本靠走,食物基本米有」的时代,而是希望我们人类能够维持并且继续发展当下的美好,即使它们目前也有很多不完美。

我们利用 $E=mc^2$ 制造了核武器,随后又谨慎的通过国际上的政治会谈等尽努力不让核战争爆发。这就像是我们将脖子放进了上吊的圈环里,然后尽力的不踏翻脚下的凳子一样。如果再一次打起仗来,我们也绝不可能再舒适的坐在电脑前,真正到了那个时候,在北风呼啸,雪落纷纷,只有一碗清汤(而且还是庆祝用)喝的夜晚,我们也会怀念「此刻」,怀念它的美好,怀念它的不美好,也更是会后悔为什么以前没有好好珍惜。

汤。
汤。

在第一话快要结束时,有这么一段对话~

尤莉「没想到竟会落到靠吃雪维生」
尤莉「战争真是讨厌啊」
小千「你有什么资格说」

「お前が言うな」
「お前が言うな」

那么在这一处,也是另有所指的

翻译过来是「你有什么资格说」,其实在日语里,「お前が言うな」,这句话除了表面意思之外,其实还暗示「你」当时就是那个最支持战争的人。

在这里,我们不必探寻在战争的时候尤莉具体是什么样的,傻可猜想作者也只是借着小千和尤说出了这么一件事——战前那些高呼好好好、支持的人,在真正上了战场之后,体会到了什么叫做战争的残忍之后,才来反思战争、为什么要打仗。

少女终末旅行,可能会是以后哪一天人类用战争将自己推向穷途末路时的反思之旅吧。

烟囱城的普佩尔——灵魂与梦想

“我会一直相信下去,即使只有我一个人。”

在一座头顶的天空永远永远是烟雾蒙蒙的城市里,人们从来没有见过真正的天空,也没见过一闪一闪的星星,在这里讨论星星,是会被笑话甚至遭受排挤的。

当我们在现实中,在某些环境下跟别人讨论梦想——“我想尝试另一个行业”、“我想发一篇顶会论文”——的时候,偶尔也会被身边的人不理解、笑话(虽然他们不一定是恶意的嘲笑)。

在绘本里,普佩尔原本是一个被邮递员不小心掉落到垃圾堆里的,咚咚乱跳的心脏,它在吸附了一件件垃圾之后,形成了垃圾人,也就是普佩尔。那么在这样的城市里,「垃圾」是什么呢,或者说在这里人们抛弃的是什么呢,大概是「梦想」吧。

那么按理说一个饱含着梦想的灵魂应该是美好的,为什么这里以一个非常脏、非常臭的形象出现呢?傻喵以为,在这个城市中,梦想是被看作不切实际、不被需要的「肮脏」之物,对于梦想的谈论、行动就更是让人厌恶之事。

于是乎,普佩尔嘴里“噗斯—哈、哈”地吐着瓦斯气体,我们知道瓦斯气体里面是添加了有臭鸡蛋味的硫化氢的,一般闻到之后,都会赶紧避开。这个「瓦斯气体」大概就是比喻现实生活中我们跟别人讨论自己理想时,别人对我们嘴里话语的看法吧。鲁比齐的爸爸也正是因为见到了烟雾之上的星星,而被城里的人们排斥、叫做骗子。

Continue reading 烟囱城的普佩尔——灵魂与梦想

言语韵律中的思想与美

在没有文字的时候,韵律——神话、诗歌——皆是口耳相传,尔后它们又因文字的出现而有了实形的记载,也有了更丰富的表现形式。在言语或文字中透着的那些韵律,都是某种思想的表达。可可认为,思想是一个人的文化、生活背景以及那个人所经历的事情所造就的一种产物。记得在我所学的《古希腊喜剧选读》的课上,讲师是这么解释“文化”的。

“文化”(cultura)首先意味着农作:对土壤及其作物的培育,对土壤的照料,以及按其本性对土壤质量的提升。“文化”衍生性地、且在今天主要地意味着对心灵的培育,按心灵本性对其内在能力的照料和提升。就像土壤需要其培育者那样,心灵需要老师。

那么什么样的人才能够称作是我们“心灵的老师”呢,那些老师要在何处去寻觅呢?一般来说,一个伟大的人会有一个伟大的老师,而老师也会有他自己的老师,但终究我们会找到那么一些人,他们没有老师,他们正是那些伟大的心灵(Great Minds)。

当我们从咿呀学语一步步走到自己文化生命的开端时,哪些伟大的心灵是我们应该去找寻的呢?埃斯库罗斯曾经说过:“对于那些个孩子们应该由老师来教,而成年人则应该由诗人来教”。可见那些诗词言语中所蕴含的韵律,正是我们心灵的老师。

以古希腊的城邦教育为例。不论是严肃的肃剧还是轻快的谐剧,它们都和宗教祭祀相关——每年一度的酒神祭。当时的僭主,庇西斯特拉图(Peisistratus)将酒神祭拜表演引入雅典城邦,创办了戏剧节,而其原因则是——有抱负的统治者必须陶铸人民的性情,而戏剧就充当了民众的德育“教材”:通过戏剧,城邦民众反观自己的言行、审查自己的政治意见、雕琢自己的城邦美德。

不论是讲究平仄的中国诗歌,还是五/七/五/七/七的日本短歌,又或者是古希腊那一本本厚厚的戏剧台本。在这些言语文字韵律之间,人世间的哲思、喜乐哀愁、思念与爱都包括进来了,而这些美好的情感随着韵律,终传递到空间和时间的远方,在听者心中泛起波浪。也许正如——

不要再睡,好妻子,
唱你美妙的歌曲,
哀悼我们伊提斯,
黄颔百啭声无已,
清音穿过忍冬丛,
遥遥直达天帝宫,
使得金发太阳神,
邀神起舞击像筝,
引起众神齐唱和,
唱和你的悼亡歌。

——节选自《鸟》阿里斯托芬

 

「Single Image Haze Removal Using Dark Channel Prior」Python Implementation with OpenCV

Haze Removed via Dark Channel Prior
Haze Removed via Dark Channel Prior

A Brief Review


Single Image Haze Removal Using Dark Channel Prior」是 2009 年 CVPR 最佳论文,何凯明博士在这篇论文中提出了暗通道先验的图像去雾算法。

那么暗通道先验是什么呢?这种方法是基于这样的一个观察:

It is based on a key observation most local patches in haze-free outdoor images contain some pixels which have very low intensities in at least one color channel.

简单来说就是对绝大多数没有雾的图像来说,它们的一些局部区域的像素中,某些像素至少有一个颜色通道的值很低。或者对应于原文的「low intensities」,即光强度很低。

我们需要对图像去雾的原因主要是图像中的雾会给很多算法带来麻烦,比如物体识别,特征提取等,它们都默认输入的图像是清晰的,没有雾的。或者不考虑算法,对于在野外或者无人机上的监视摄像头,遇到有雾的场景也是经常的事,即使是人工监视也是需要去雾的。

顺便一提,利用暗通道先验的算法去雾,还可以得到不错的景深图。

Last, the haze removal can produce depth information and benefit many vision algorithms and advanced image editing. Haze or fog can be a useful depth clue for scene understanding. The bad haze image can be put to good use.

在有雾的图像中,一个广泛使用的成像数学模型如下

\begin{equation}
    \mathbf{I}(\mathbf{x})=\mathbf{J}(\mathbf{x})t(\mathbf{x})+\mathbf{A}(1-t(\mathbf{x}))\tag{1}
\end{equation}

我们可以简单的将$\mathbf{x}$理解为图像中的某一个位置,那么,$\mathbf{I}(\mathbf{x})$则是我们最终观察到的有雾的图像在该点的强度;$\mathbf{J}(\mathbf{x})$是在没有雾的情况下,该点应有的强度;$t(\mathbf{x})$是该点的透射率(the medium transmission describing the portion of the light that is not scat- tered and reaches the camera);最后,$\mathbf{A}$是全局大气光强(global atmospheric light)。

图像去雾的目标就是从一张有雾的图像$\mathbf{I}(\mathbf{x})$中,恢复出没有雾的图像$\mathbf{J}(\mathbf{x})$,透射率$t(\mathbf{x})$以及$\mathbf{A}$,全局大气光强(global atmospheric light)。

其中,我们又把$\mathbf{J}(\mathbf{x})t(\mathbf{x})$的结果叫做「直接衰减,direct attenuation」,这个应该比较好理解,就是原始位置反射的光,经过介质(如雾、空气中的其他颗粒)时发生的衰减。然后我们又把$\mathbf{A}(1-t(\mathbf{x}))$叫做Airlight,也就是(先前经过介质时的)散射光导致的色偏。

airlight-and-direct-attenuation

Continue reading 「Single Image Haze Removal Using Dark Channel Prior」Python Implementation with OpenCV

「Philosopher」与「Sophist」

前言w~

其实这篇文章是因为我会写一写在阅读古希腊谐剧《鸟》的笔记和一些想法,也算是这个系列的开端吧(但是可能会花上很长的时间来完成它)。其实这个分类「读书人的事」,仅仅是捏他某站点的「稚嫩的魔法师」的书籍推荐系列的视频名字。我读到的、听到的这些仅仅是表面,所以这个分类大概也算是半自嘲或者对自己以后的暗示吧,希望也许哪天真的可以做到「读万卷书,行万里路」吧。

正文~


既然要说古希腊的事,那么避不开的一个话题就是「哲学」。「哲学」这个词在古希腊和在今日的意味是不相同的,我们今日说到「哲学」大概会想到的是在哲学院的那些形而上学的东西。或者说如果哪天你跟家里说,

「木头」是可燃的。我们可以捡回一根木头点燃烧掉它,甚至烧掉地球上所有的木头。但是我们却点不燃那个哲学意义上的「木头」。

家里人的第一反应肯定是“原来你是去读哲学系的啊”(褒义的说w)。

但是在古希腊,「哲学」并不是今日认为的形而上的东西,而是自然科学,比如物理呀、数学呀、天文等等,这些被叫做「哲学」。

所以这里就先来说说「Philosopher」与「Sophist」的事/

Continue reading 「Philosopher」与「Sophist」

Monitoring Ivar Changes in Objective-C

As we've mentioned in the last post, Protection against Message Forward in Objective-C, there're at least two tools for tracing the calling sequence of the methods,

However, they just cannot handle it in the scene below,

@interface ProtectedClass : NSObject {
@public
    NSString * _password;
}
@property (nonatomic, getter=password, setter=setPassword:) NSString * password;
@end
/// ...omited...
    ProtectedClass * obj = [[ProtectedClass alloc] init];
    obj->_password = @"喵咕咪~"; // directly access, undectectable in BigBang or ANYMethodLog
    [obj setPassword:@"喵"]; // BigBang or ANYMethodLog dectectable
/// ...omited...

Because it's not necessarily to call getter or setter in Objective-C when access or change an ivar. Since Objective-C is just a superset of C, so the object (or instance) in Objective-C acts pretty much like the struct in C. You can directly access its member if you have the memory address. Let's check out what happens when compiling.

Here is our code, written in Objective-C, and it's probably quite often to be seen in your projects.

Objective-C code
Objective-C code

Continue reading Monitoring Ivar Changes in Objective-C

Protection against Message Forward in Objective-C

A Brief Review


Runtime is one of the powerful features of Objective-C, it provides us the ability to add/replace a method of some class, retrieve/set the implementation of a specified method, and even add a class in runtime.

However, just like the sunlight shines not only on the good guys, but also on the bad ones. There are some tools in iOS Jailbreak community which take the advantage of Objective-C's runtime feature, to be specific, the ability of message forward. Within this feature, they can log the calling sequence of the methods in the application for further exploitation. And it's not that hard to inject such tools into your application, since there are many ways such as DYLD_INSERT_LIBRARIES or modifying the MachO load commands, and they got some sets of tools like iOSOpenDev, and the new replacement of iOSOpenDev, MonkeyDev by @AloneMonkey.

And there're at least 2 tools which can log the calling sequence of the methods,

Hooked via forwardInvocation
Hooked via forwardInvocation

Continue reading Protection against Message Forward in Objective-C