枚举物理网卡

  其实目的是获取靠谱的 MAC 地址,但这个任务真蛋疼!不信您看看搜索出来的乐射……

  神马 GetAdaptersInfo、GetIfEntry、GetAdaptersAddresses、NetWkstaTransportEnum,还有读取注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards。这些都会枚举到虚拟网卡,给您举个例子“VirtualBox Host-Only Ethernet Adapter”,读取神马 NetCfgInstanceId、MediaSubType,都不靠谱,没有平台移植性!

  用 Setup API 枚举 Interface,匹配 PCI 和 USB 类型是比较靠谱的。

  蛋似,虚拟机的网卡也是虚拟的,为了方便在虚拟机测试,您要注意放开一些特例……很抱歉,领导说代码要保密,自己搜吧,关键字:SetupDiGetDeviceInterfaceDetail、OID_802_3_PERMANENT_ADDRESS。

  给个蛋碎的例子:\\.\pci#ven_10ec&dev_8168&subsys_050e1028&rev_06#4&224db6dd&0&00e5#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{4cc0ea76-88b7-40e1-8b4b-6339f8dd49bf} 可以简称为 \\.\{4cc0ea76-88b7-40e1-8b4b-6339f8dd49bf} 或者 \\.\Global\{4cc0ea76-88b7-40e1-8b4b-6339f8dd49bf}

XP 下 Edit 控件透明字体时的 Bug

前提

XP 系统,程序使用了 Manifest 指定使用 Microsoft.Windows.Common-Controls
现象:Edit 控件处理 WM_CTLCOLOREDIT 改变颜色,问题出在 SetBkMode 设置透明后,控件删除字符时无法立刻刷新,即会残留。

解決

方法 1

自残,别用 Microsoft.Windows.Common-Controls,删除类似下列的代码:

1
2
3
4
5
6
7
8
9
#if defined _M_IX86
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

方法 2

放弃“透明”,采用“伪透明”——如果您的背景是纯色,用 SetBkColor 就行。

方法 3(推荐)

检测到 XP 时,WM_CTLCOLOREDIT 返回画刷前,自己用 FillRect/Rectangle 涂一下……或者发一个 WM_ERASEBKGND,当然这个做法的前提是 WM_ERASEBKGND 的处理就是自己涂一下,如果就一句 return TRUE 那是等于啥也没干。

参考

同样悲剧的一个描述:http://zhidao.baidu.com/question/9749770.html

用树莓派 + USB 无线网卡做了一个蛋疼的 AP Client

需求

两个困境:

  • 有个只有 RJ45 接口的旧设备要上网,它的位置离路由器很远,家里的网线不够长……

  • UMU 买了一个支持 AP Client 的无线路由器(TP-Link TL-WR800N)每次把这个 AP Client 断电时,提供网络的主路由器都会被这个 AP Client 搞死掉,原因未知……

还没有树莓派的时候,UMU 用笔记本上的 Windows 的 ICS 功能给它提供网络,当然这方法很不好,于是有了现在的方案。

解决

仔细查看了树莓派支持的 USB WiFi Adapters 列表,挑选了 TP-LINK TL-WN823N(RT8192CU 芯片),这个在 Raspbian 上是 Work out-of-box。Mercury 150Mbps MW150U(Realtek RTL8188CU 芯片)也可以。

硬件准备好后,第一步,配置 Wifi,连上主路由器,假定,此步将 wlan0 的 IP 配置为 192.168.1.2,/etc/network/interfaces 的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.24.51
netmask 255.255.255.0

auto wlan0
iface wlan0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

192.168.24.51 这个 IP 可以改为别的,UMU 习惯用这个当网关地址。/etc/wpa_supplicant/wpa_supplicant.conf 的内容这里就忽略了,参考 http://elinux.org/RPi_Peripherals#Wireless:_TP-Link_TL-WN722N_USB_wireless_adapter_.28Debian_6.29。设置完,ifdown wlan0ifup wlan0,看看 USB 无线网卡的指示灯应该闪起来了……

第二步,配置 RJ45 网口的 NAT。首先,修改 /etc/sysctl.conf,增加以下两行:

1
2
net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_source_route = 1

运行 echo 1 > /proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -s 192.168.24.0/24 -o wlan0 -j SNAT --to 192.168.1.2,并将这条命令写到 /etc/rc.local 中的 exit 前。

最后,reboot 一下试试。可以用网线把 PC 和树莓派连起来,PC 的网卡设为 24 段地址,网关 192.168.24.51,试一下 PC 通过树莓派的网口上网吧!

图像格式转换之 Jpeg2Jxr

为什么转?因为 JXR 格式在同等质量的情况下,存储空间比 JPEG 节约了 45-50%。

之前在《从 Windows 8 新功能推理某产品的八哥》提到过现在手机上的省流量 App,其原理就是压缩图片,但为了提高效果,这个压缩基本都是有损的,流量减少了,但是图片质量下降了,有的下降可以忍受,有的则令人发指!比如,长微博,文字转图片,这种图片线条分明,相邻像素值对比可能很大(黑白分明),这类图片采用高压缩比的 JPEG 压缩后,图片质量往往很差。

再举个例子:QR 码图片,您可以做一下试验,为了说明 JPEG 不适合存储线条型图片,哥采用一张蛋疼的 1290*1290 像素的 QR 码图片,保存为 JPEG 大小是 4.76MB,但保存为 PNG 格式时只有 52.4KB,请注意单位,前者是后者大小的将近 100 倍!!

大家可能比较少关注 WP,也许您没听过 DataSense,简单地说,它就是微软做的节省流量的 App。号称可以节约 45% 的流量,这么大的压缩率,除了优化 HTML 相关的文本之外,对图片的压缩肯定是必须的!推测 DataSense 可能使用了 JPEG XR 格式来转化其他格式的图片。

JPEG XR 虽然已经成为一种标准,但目前依然只有微软支持,所以,如果您想把这个技术应用到 iOS、Android 的节省流量 App 中,那很抱歉,此路暂时还不通。

根据实测,IE9@PC、IE10@PC、IE10@WP8 都是支持 JXR 格式的。下面是用 C++/CLI 写的很简单的一个格式转化程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using namespace System;
using namespace System::IO;
using namespace System::Windows::Media;
using namespace System::Windows::Media::Imaging;

bool ConvertToJxr(System::String^ source_name)
{

//try {
Stream^ stream = gcnew FileStream(source_name, FileMode::Open, FileAccess::Read, FileShare::Read);
BitmapDecoder^ jpeg_decoder = BitmapDecoder::Create(stream, BitmapCreateOptions::PreservePixelFormat, BitmapCacheOption::None);
//JpegBitmapDecoder^ jpeg_decoder = gcnew JpegBitmapDecoder(gcnew Uri(source_name, UriKind::RelativeOrAbsolute), BitmapCreateOptions::PreservePixelFormat, BitmapCacheOption::None);
//Console::WriteLine(L"Author: `{0}'", jpeg_decoder->Metadata->Title);
FileStream^ jxr_file_stream = gcnew FileStream(source_name + L".jxr", FileMode::Create);
WmpBitmapEncoder^ jxr_encoder = gcnew WmpBitmapEncoder;
//BitmapMetadata^ metadata = gcnew BitmapMetadata(L"wmphoto");

for each (BitmapFrame ^ frame in jpeg_decoder->Frames) {
jxr_encoder->Frames->Add(BitmapFrame::Create(frame, jpeg_decoder->Thumbnail, (BitmapMetadata^)frame->Metadata, jpeg_decoder->ColorContexts));
}
//jxr_encoder->Metadata = metadata;
jxr_encoder->Save(jxr_file_stream);
//} catch (...) {
// return false;
//}
return true;
}

int main(array<System::String ^> ^args)
{

for each (auto arg in args) {
if (File::Exists(arg)) {
if (ConvertToJxr(arg)) {
Console::WriteLine(L"Converted: `{0}'", arg);
}
} else {
Console::WriteLine(L"NOT Exists: `{0}'", arg);
}
}
return 0;
}

文末是一些搜索到的关于 JPEG XR 的资料,可供参考:

http://jpeg.org/newsrel26.html

JPEG XR (ISO/IEC 29199-2) is now an International Standard and also an ITU-T Recommendation (T.832).

JPEG XR(旧称 HD Photo 及 Windows Media Photo)是一种连续色调静止图像压缩算法和文件格式,由Microsoft开发,属于Windows Media家族的一部分。它支持有损数据压缩以及无损数据压缩,并且是微软的XPS文档的首选图像格式。目前支持的软件包括.NET Framework(3.0 or newer),Windows Vista/Windows 7、Internet Explorer 9,Flashplayer 11等。

JPEG XR(微软HD Photo格式)2009 年,成为 ITU-T 推荐的国际标准(ISO/IEC 29199-2)。JPEG XR 的标准化确保数码相机、打印机、显示器和软件公司能够在开发其新产品的时候兼容互通。其核心技术由微软核心媒体开发团队开发完成,针对当前和将来的数字图像发展需求以提供了许多新的优势和特点。

在 Vista 操作系统中已经支持了这种新的文件格式,JPEG XR 相比其它技术更有优势,其中包括更好的压缩技术,以一半的文件大小保存与 JPEG 相同质量的图像,或以相同大小的文件保存质量相当于 JPEG 两倍的图像。JPEG 组织还对微软开放与 JPEG XR 相关的专利的决策表示了赞扬,称微软免许可费政策将有助于JPEG推动 JPEG XR 普及,有助于确保它能够被更多的用户所采用。JPEG 组织还鼓励其它公司向微软学习。

从 Windows 8 新功能推理马头流量的八哥

  Windows 8 确实是个不错的系统,DP、CP、RC、RTM,UMU 一路追过来。

  在开始讲故事之前,要先介绍一下马头流量,http://www.matocloud.com/,同类产品:上网快鸟、飞速流量、瓦力流量、彩虹流量……当然,这些都是设设 APN 而已,马头的 Android 版本有更高深的技术。想了解更多,请研究一下 EnoVPN、VPN Service。

  再来是流量压缩原理简介:主要是压缩图片。APN 就是一个 HTTP 代理,只不过这个代理有点不标准,会将原图压缩后交给用户,用户下载的是一张小图,自然就省流量。但这是有副作用的,有的图片必须是有损压缩才会变小,所以必然会降低图片质量。知道这个原理后,可能会有人会纠结了……至于您用不用,就看您在图片质量和流量之间的取舍了。

  故事开始了!UMU 用 HTC Titan 拍过不少图片,当然其中不少是横屏拍的。这个手机有重力感应功能,拍的照片会带 Orientation 信息,这是 Exif 的一个字段,专业知识请另行搜索“Exif Orientation”。简单讲,无论您拍照时手机是横是竖,在手机看时,照片都会自动旋转,使景物是正立的。如果您没注意过,可以先在就做这个实验,把 iPhone 倒立拍照,正立过来看,景也会跟着自动转……

  当 UMU 把图片同步到电脑上时,情况就不同了。Windows 7 自带的画图、图片查看器都不支持对 Orientation 自动校正,IE9、IE10、Chrome 22.0.1229.94 m、Paint.NET 也都不支持。所以,UMU 经常看到横屏拍的照片,在 Windows 7 上是歪 90 度显示的。

  到 Windows 8 上,自带的画图、图片查看器都支持 Orientation 校正了!有一天,UMU 在看以前拍的图片时,突然发现,所有的图片都正立了……

  蛋似,前面有提到 IE10 是不支持的,所以……UMU 特地上传了一张横拍的图片到腾讯微博上,果然这图就是歪 90 度的,缩略图和原图都是。然后再用 iPhone 看,缩略图是歪 90 度,这说明腾讯微博的缩略图也没考虑 Orientation 信息,点击查看原图,终于正立了,因为 iPhone 基本到处都支持 Orientation 自动旋转校正。

  把这个发现,和马头流量结合起来思考——APN 服务器上的图片压缩程序会不会也没考虑 Orientation 信息?UMU 猜想是很有可能的,腾讯就没考虑到……然后开始测试!用 WiFi 看原图,是正立的,因为 WiFi 下,马头流量不会压缩图片;改用 3G,马头流量开始起作用,再去看原图,发生了两件事,大家应该猜到了——图片质量下降、图片歪了 90 度!八哥!这就是八哥啊!

天翼宽带智能提速

2011-12-13 17:03 发布于百度空间,最近百度删除了 UMU 高中时代珍贵的记录,所以 UMU 正在去百度化。

功能介绍

福建省的中国电信天翼宽带(家庭 ADSL 网络)用户每月可免费使用 5 小时智能提速,这是一个很给力的东西,一般 ADSL 下行速率是 4Mbps,最高可以提到 20Mbps,看高清电影、下载各种小电影毫无鸭梨。详见:http://ts.oooxm.com/

蛋似!作为一名穷人,怎么合理地利用这 5 小时免费提速时间,成为一个有点鸭梨的问题。UMU 的这个小工具就是为了解决这个问题而“蛋生”。

简单地说就是程序帮您监控网络使用情况,流量跑高就提速,流量低下来就自动停止提速。另外,官方的提速方式是通过网页的形式,UMU 的程序可以在程序界面上直接提速和停止提速。

下载

v1.1

http://pan.baidu.com/share/link?shareid=90607&uk=3607387813/

技术原理

  1. 流量,API:GetIfEntry、GetIfEntry2

  2. SOAP 协议,UMU 用的是 ATL SOAP @ ATL Server,您也可以试试更大型的 gSOAP。

  3. 原理就是把本来就有的带宽还给我们,原来的 4M 其实是故意限制的……提速的手段除了电信官方分方法之外,还有 OpenWRT 上的“多拨”方案,同时拨号N次,可能拨通,一个4M,如果拨上15个就有60M了……


2013-05-09,这个软件已经有 ARM 版本,详见:《开发 Windows RT 桌面应用(来自 Surface RT)

mif2png(QQGame 专用 mif 格式转 png 格式)

2011-11-26 00:27 发布于百度空间,由于百度空间停运,搬到此处。

大学时代的作品《UMU 游戏之争上游》的副产品,mif2bmp 改进版,用 GdiPlus 来产生 png 格式图片。

mif2png.exe 下载:http://download.csdn.net/detail/umu/3843545

以前 UMU 有写过文章分析 mif 格式,不过很早了,懒得找,直接上代码吧,先看头部结构体:

1
2
3
4
5
6
7
8
9
10
#pragma pack(1)
struct MifHeader
{
DWORD version;
DWORD width;
DWORD height;
DWORD type;
DWORD frame_count;
};
#pragma pack()

以下代码是 C# 写的 Paint.NET 文件类型插件 MifFileType.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using System.Collections.Generic;
using System.Text;
using PaintDotNet;
using PaintDotNet.Data;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace MifFileType
{
public class MifFileType : FileType
{
public MifFileType()
: base("MIF Files", FileTypeFlags.SupportsLoading | FileTypeFlags.SupportsLayers, new String[] { ".mif" })
{

}

protected override Document OnLoad(Stream input)
{

if (input.Length < 20)
{
MessageBox.Show("Invalid MIF File", "UMU Corporation - MifFileTypePlugIn", MessageBoxButtons.OK, MessageBoxIcon.Error);

Bitmap b = new Bitmap(800, 600);
return Document.FromImage(b);
}

try
{
BinaryReader br = new BinaryReader(input);

int MifVersion = br.ReadInt32();
int FrameWidth = br.ReadInt32();
int FrameHeight = br.ReadInt32();
int MifType = br.ReadInt32();
int FrameCount = br.ReadInt32();

int ImageWidth = FrameWidth;
int ImageHeight = FrameHeight * FrameCount;

bool Valid = true;
long Prefix;

if (MifType == 3)
{
Prefix = 20;
}
else if (MifType == 7)
{

Prefix = 20 + 4 * FrameCount;
}
else
{
MessageBox.Show("Invalid MIF File", "UMU Corporation - MifFileTypePlugIn", MessageBoxButtons.OK, MessageBoxIcon.Error);

Bitmap b = new Bitmap(800, 600);
return Document.FromImage(b);
}

if (MifVersion == 0)
{
if (Prefix + ImageWidth * ImageHeight * 3 != input.Length)
{
Valid = false;
}
}
else if (MifVersion == 1)
{

if (Prefix + ImageWidth * ImageHeight * 3 > input.Length)
{
Valid = false;
}
}

if (!Valid)
{
MessageBox.Show("Invalid MIF File", "UMU Corporation - MifFileTypePlugIn", MessageBoxButtons.OK, MessageBoxIcon.Error);

Bitmap b = new Bitmap(800, 600);
return Document.FromImage(b);
}

Bitmap bmp = new Bitmap(ImageWidth, ImageHeight);

for (int CurrentFrame = 0; CurrentFrame < FrameCount; ++CurrentFrame)
{
if (MifType == 7)
{
input.Seek(4, SeekOrigin.Current);
}

UInt16[] rgb16 = new UInt16[FrameWidth * FrameHeight];

for (int i = 0; i < FrameHeight * FrameWidth; ++i)
{
rgb16[i] = br.ReadUInt16();
}

Byte[] a8 = new Byte[FrameWidth * FrameHeight];

for (int i = 0; i < FrameHeight * FrameWidth; ++i)
{
a8[i] = br.ReadByte();
}

for (int y = 0; y < FrameHeight; ++y)
{
for (int x = 0; x < FrameWidth; ++x)
{
int a = a8[x + y * FrameWidth];
int r = (rgb16[x + y * FrameWidth] & 0xF800) >> 8;
int g = (rgb16[x + y * FrameWidth] & 0x07E0) >> 3;
int b = (rgb16[x + y * FrameWidth] & 0x001F) << 3;

if (a == 32)
{
a = 255;
}
else if (a > 0)
{

a <<= 3;
}

bmp.SetPixel(x, FrameHeight * CurrentFrame + y, Color.FromArgb(a, r, g, b));
}
}
}

br.Close();
return Document.FromImage(bmp);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "UMU Corporation - MifFileTypePlugIn", MessageBoxButtons.OK, MessageBoxIcon.Warning);

Bitmap bmp = new Bitmap(800, 600);
//Document doc = Document.FromImage(bmp);
//doc.Tag = "UMU Corporation - MifFileTypePlugIn";
//return doc;
return Document.FromImage(bmp);
}
}
}

public class MifFileTypeFactory : IFileTypeFactory
{
public FileType[] GetFileTypeInstances()
{
return new FileType[] { new MifFileType() };
}
}
}