Category: 计算机与 Internet


原帖

这个挺搞笑的,TCP三次握手也不顶用

Advertisements

万恶的 xxx

于是连 python 也成了关键词
哪天你把 c, java, php, 或者干脆 linux windows 都封了算了。。。
 
好像几天没连上
不知是不是被 GFW 了,这一段貌似封的挺紧
过了十一再看看
 
果然是被墙了.>>最近 fg U tor puff 全部失效 … TMd gcd
以前都是用播放器直接转音乐格式,没怎么研究过参数,当时大致比较过 128kbps 以下 ogg 的音质体积比最优。
大于 128kbps 时几乎听不出差别,没法继续……
 
今天试着把 WMA 的参数调成 -a_mode 3 (bitrate-based 2-pass) 和 -a_mode 4 (peak bitrate-based 2-pass),即传说中的 2 遍扫描,使得编码器可以完整掌握一首曲子的全部信息后再编码,应该算是最优模式了吧。再拿来与 Ogg 比试下,结果大失所望…48kbps 下文件体积比 ogg 大了约 10% ,然而音质却依然比不上 ogg 。不过 ogg 的编码时间倒是比 WMA 的两遍扫描都要久 = =
 

基础最重要

果然什么都得从基础一步一步来…
以前看 MFC 总觉得吃不透,很多东东知道怎么用但总是心里没底
翻了下 SDK 编程,一下解开了心中好多疑惑的地方
果然这一步还是绕不开的啊
 
这个播放器模块默认只能添加一个音频文件的地址,反复总是这一首播来播去再好听的曲子也不免生厌(除非像东方连奏或にこにこ组曲那样的超长篇)…下面我们就试着给它添加多首音乐
 
1.寻找音乐存储空间
如果你的音乐本来就是网上的,那就可以直接跳过这一步和下一步了
网上的免费存储空间我也找过很多,适合存放在线音乐文件的需要满足几条:(1)速度稳定,不要忽快忽慢(2)允许文件直接外链(3)文件地址固定(4)允许的下载流量不能太小(5)空间尽可能大一些的
于是我找到了这里 Fileden 。虽然速度不是很快30KB/s,但是相当稳定(我在电信网通都试过);允许文件外链;文件地址也不改变;每月5GB流量对一般的个人blog绰绰有余;总共1GB存储空间也是很难得了。总之这里我相当满意
 
2.准备音乐文件
为了保证播放的流畅,这里添加的音乐不宜用那些高音质高比特率的,这需要在文件比特率和音质之间找一个平衡。低比特率情况下ogg编码是相当不错的选择,在60-160kbps范围内表现相当优秀;如果不太熟悉的话用wma也可以,虽然比ogg稍差一些但毕竟是M$自家东西,和这个WMP模块协调上应该是最好的吧;然后完全不推荐mp3…低比特率下表现实在太糟糕。
当然如果原本音乐文件质量就不高的话我劝你就不用转了,只会越变越差。关于文件名,尽量用全英文。大部分音乐中都自带IDv3信息的不用担心播放时认不出来
 
3.制作播放列表
现在假设音乐文件你已经正确上传并得到了他们的实际地址。随便打开电脑上一个音乐播放器,把刚才那些音乐地址都添加到一个播放列表中,按你想要的顺序排好,确认都能正确播放。然后选择保存播放列表(格式上选择m3u,这是播放列表的通用格式),你将得到一个类似playlist_01.m3u的文件。这里我们要做点小手脚:把那个文件扩展名的"m3u"改成"wma"。于是就成了 playlist_01.wma ,虽然你知道它并不是一个wma的音乐文件。这么做的目的是为了骗过这个WMP模块,它似乎是不允许非音频文件的,如果用m3u的话它不接受。
然后照例把它也传到网络空间中
 
4.最后一步
以上我们还没有动过blog上的任何东西。下面你只要把那个 http://xxx.xxxx.xxx/xx/playlist_01.wma 当成一个网络音乐文件传给WMP即可。不用担心,它在播放时能够认清那实际上是个播放列表
決めた!
前几天搞好了 wxPython
今天在 VC++ 2008 Express 上配好了 wxWidgets
MS还算厚道,VC2008 Express 里也集成了 Platform SDK ,不像2005一样还要另下
 
受不了MFC…
以后主要活动平台就这么定了
简易程序拿 wxPython (Python果然很强悍) 搞定,貌似还有 py2exe 的工具,可方便了
要效率的话就改成 C++/wxWidgets (VC9 Express上)
 
全套组合(C++ Python wxWidgets)免费、跨平台、也不存在什么版权问题,呵呵

C++ ===>> ASM

#include<stdio.h>
void main(){
    int i, b[12];
    for ( i = 0; i <= 12; i++ )
        b[i] = 0;
}
 
这个程序短小精悍,区区5行即可说明问题。虽然表面上看来是数组下标越界错误,实际运行起来则是死循环而不会报错。虽然老早就纸上谈兵的知道原因,不过从没实际运行观察过。在网上小搜一下发现VC可以由C/C++代码编译时生成汇编代码,也可在调试时即时显示反汇编,今天就小试了一把。
开始是在Debug模式下试验的,此模式下编译器会自己在 i 和 b[12] 之间插入 2 Byte 的无用空间,貌似就是用来检测这种错误的,运行将要结束时被 VC 发现 b 变量存在问题报错。果然很强啊。
后来转到 Release 模式,编译生成代码如下:

_TEXT   SEGMENT
_b$ = -52                                               ; size = 48
_i$ = -4                                                ; size = 4
_main   PROC
; 1012 : {
        push    ebp
        mov     ebp, esp
        sub     esp, 52                                 ; 00000034H
; 1013 :     int i, b[12];
; 1014 :     for ( i = 0; i <= 12; i++ )
        mov     DWORD PTR _i$[ebp], 0
        jmp     SHORT $LN3@main
$LN2@main:
        mov     eax, DWORD PTR _i$[ebp]
        add     eax, 1
        mov     DWORD PTR _i$[ebp], eax
$LN3@main:
        cmp     DWORD PTR _i$[ebp], 12                  ; 0000000cH
        jg      SHORT $LN4@main
; 1015 :     {
; 1016 :         b[i] = 0;
        mov     ecx, DWORD PTR _i$[ebp]
        mov     DWORD PTR _b$[ebp+ecx*4], 0
; 1017 :     }
        jmp     SHORT $LN2@main
$LN4@main:
; 1018 : }
        xor     eax, eax
        mov     esp, ebp
        pop     ebp
        ret     0
_main   ENDP
_TEXT   ENDS
END

可以看到 b 的偏移是 -52 , i 的偏移是 -4 ,而 b[12] 即 -52+4*12=-4 刚好就是 i 的地址。运行一下果然不再报错直接死循环了
下面是调试时的反汇编:

void main()
{
00401800  push        ebp 
00401801  mov         ebp,esp
00401803  sub         esp,34h
    int i, b[12];
    for ( i = 0; i <= 12; i++ )
00401806  mov         dword ptr [i],0
0040180D  jmp         main+18h (401818h)
0040180F  mov         eax,dword ptr [i]
00401812  add         eax,1
00401815  mov         dword ptr [i],eax
00401818  cmp         dword ptr [i],0Ch
0040181C  jg          main+2Bh (40182Bh)
    {
        b[i] = 0;
0040181E  mov         ecx,dword ptr [i]
00401821  mov         dword ptr b[ecx*4],0
    }
00401829  jmp         main+0Fh (40180Fh)
}
0040182B  xor         eax,eax
0040182D  mov         esp,ebp
0040182F  pop         ebp 
00401830  ret     

i 的地址是 0x0012ff78,b 是 0x0012ff48,相差 30H = 48 Byte =12 个 int 的空间。把这一段地址的内存显示出来单步跟踪运行即可看到 i 是如何被修改的,一目了然啊……

编译原理这么看起来直观多了,有空再找几个例子玩玩。

got home

没想到这几天家里网络比学校还差,每天平均只有1小时能连上MSN…..
 
每天上一下 cnBeta.com 果然会有收获,特别从用户评论中经常会学到不少东东,呵呵。本人虽不是刻盘大户,但至少也有300GB的收藏,其中一部分内容刻在CD盘上,因此看起来光盘数就不少了。一直以来都在用 WhereIsIt? 来管理光盘,但它有一个中文乱码的BUG没解决,还总得找破解,今天在评论中看到了CDBox,整来一试果然好使,除了扫盘时稍微慢些其他没发现什么毛病,记录信息也比较详细,还是免费软件。好了,所有光盘重新扫描,大工程开始。。。
 
Death Note 被禁了好烦,找个完整的 rmvb 版都花了不少时间。准备刻盘收藏咯

CM也蛮好骗的嘛…

由于需要上传某巨物作分享,急需CM新帐号3个
却发现竟然所有的邮箱都已被注册过了…临时再找新邮箱吗?可够麻烦的…
 
乱编个地址么?……突然想到了万能的 Gmail ,呵呵。要说这 Gmail 的标签分拣功能相当好用,这次又可以好好利用一下了。偶的邮箱是 dantvt@gmail.com,在中间插入分类标签 reginfo后,地址变为dantvt+reginfo@gmail.com,试验一下,CM果然认为是不同的地址了,马上注册成功,呵呵。然后又试了一下,即使是不存在的标签名称,Gmail 也能准确收到,只是不再分类了而已。
 
哈哈,这下再碰上需要注册电子邮箱的地方再也不怕了,10000个地址也能变出来。