2009-11-29

磁盘完整映像的mount

磁盘完整映像的mount


在linux下我们常常用dd来对硬盘进行完整备份.本文告诉你如何把这个完整备份文件,mount到系统中加以利用.
dd做出来的备份,虽然没有压缩,体积巨大, 但是,我们可以把它的分区mount到系统中处理它的数据.

要mount磁盘映像,就要用到mount的-o office参数来指定分区的开始位置. offset的参数的单位是字节.
我们只要找到分区的开始位置字节数, 就能顺利的mount这个磁盘映像的分区.

可以使用fdisk来看每个分区的起始逻辑扇区号,扇区号乘以512就是我们所要的偏移值,
由下面的例子,我们可以看出有2个主分区,第2个是有效的,偏移分别是
hda1=2048*512=1048576,hda2=13672448*512=7000293376
因此mount命令分别是:
mount -o loop,offset=1048576 hda.img /mnt/hda1
mount -o loop,offset=7000293376 hda.img /mnt/hda2 

#fdisk -l -u -C 1  hda.img

Disk hda: 0 MB, 0 bytes
255 heads, 63 sectors/track, 1 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes

Device Boot      Start         End      Blocks   Id  System
  hda1            2048    13672447     6835200   27  Unknown
Partition 1 does not end on cylinder boundary.
  hda2   *    13672448   117208191    51767872    7  HPFS/NTFS
Partition 2 has different physical/logical endings:
     phys=(1023, 254, 63) logical=(7295, 222, 31)


原文:http://www.anheng.com/news/29/1137.html



Read More...

2009-07-25

生日

又是一个生日了,今天去了灵隐寺爬山。
在山脚下碰到一个奸商花了我十块钱买了把香,没走几步又碰到一个奸商花了我一百换了一把香。
其实我是不想买的,不过只是他说的一句话让我买了。他说:“今天是佛的生日……”其它还说了什么我就不知道了,也没兴趣听。我只是想,既然佛和我是一天生日,那就给他施舍点好了,于是就花费了那一百。
其实,根本用不着,到山顶就丢掉了。

//EOF Read More...

2009-07-15

Nokia E71

又换了手机,这次是Nokia 的E71。
总体来说还不错,商务机,可以使用WLAN上网很好很强大。
不过细节上来说还是比不上以前的小西贴心咯,西门子的
细节上做得很人性化。
还是智能手机用起来舒服啊。花费了我2000多大洋还是比较值的。
装一个Opera Mini,装一个搜狗输入法,上网一条腿啊!我现在就是在用手机发的这篇博客。

//EOF Read More...

2009-04-11

动态创建 style 节点

在 IE 中 DOM 方式创建页面内 style 节点有点问题~ (创建出来的东西是不能修改内容的)
可用 document.createStyleSheet() 来解决:

// create style node
var _styleNode = _(u.STYLE_ID);
if (!_styleNode) {
 if (/*@cc_on!@*/0) { // is IE
  var ss = document.createStyleSheet();
  ss.cssText = _defaultStyleText;
  _styleNode = ss.owningElement; // the style node just created
  _styleNode.id = u.STYLE_ID;
 } else { // other browsers
  _styleNode = document.createElement("style");
  _styleNode.id = u.STYLE_ID;
  _styleNode.type = "text/css";
  _styleNode.innerHTML = _defaultStyleText;
  var head = document.getElementsByTagName("head")[0] || document.body;
  head.appendChild(_styleNode);
 }
}

另外,对于 link 引入 css 可用:
document.createStyleSheet("style.css");
对应:
var style = document.createElement("link");
style.href = "style.css";
style.rel = "stylesheet";
style.type = "text/css";
document.getElementsByTagName('head')[0].appendChild(style);

//EOF Read More...

2009-04-07

告别小西

清明的一个意外让我告别陪伴我四年的小西…… 伤感啊~

虽然之前也摔过很多次一点事也没有,但这次竟然摔坏了 55555……(这次也没多高的说,以前从上铺掉下去也没事的),这次摔后当时感觉没啥事,是在之后才表现出来的,估计是内伤吧~ 可怜我的小西啊!还苦苦支撑了那么久,一次关机后就再也开不了了。

要是平时我是不会这么快去买手机的(至少也要悼念我的小西一周嘛),但这段时间不能没有手机啊~

昨天就去买了个山寨的,结果没用一天我就后悔了,不能个性化刷机不说(我过多依恋小西了),竟然不支持Java(小西的很多功能都是靠Java来扩展的,Opera也用不了了),亮度调低后在阳光下根本看不见(小西背光0%在阳光下都可以看得一清二楚),…… 早知道就买之前看上的哪款 OPPO A100 了 虽然贵了好几百。

还有没有其他不爽的地方就不知道了,这些都够我不爽的了。

我估计这个我一定不会用上半年,之所以还要用半年是因为我还花了几百块钱哪,不用上半年怎么值呢 ~~!

还是老版的 SIEMENS 好,结实耐用(已经用了四年了又被摔过多次,要不是这次摔成内伤的话估计还可以继续用上两年),还可以自定个性化刷机!
被收购后的西门子怎么样就不知道了~

怀恋一下 西客站 之后可能不会有机会再去访问了~

//EOF Read More...

2009-04-04

挂青归来

在山上淋了两天雨 竟然没感冒 :D
我身体还不错嘛
//EOF Read More...

2009-03-31

Win32++: 在 Dialog 中使用 ListView

资源文件中有:

IDD_MAIN DIALOG 0, 0, 186, 95
...
{
  ...
  CONTROL         "", IDC_LSTMAIN, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 7, 7, 118, 81, WS_EX_LEFTSCROLLBAR
}
另有 Dialog :
class CMainDialog : public CDialog
{
...
private:
    CListView   m_lsvMain;
};
则,在:
BOOL CMainDialog::OnInitDialog()
{
    // 加上下面这行:
    m_lsvMain.AttachDlgItem(IDC_LSTMAIN, this);
    // 用 AttachDlgItem(UINT nID, CWnd* pParent) 将Dialog的控件附加到CListView对象。
    ...

    // 添加列
    m_lsvMain.InsertColumn(0, _T("Column 0"), LVCFMT_LEFT, 60);
    //m_lsvMain.InsertColumn(1, _T("Column 1"), LVCFMT_LEFT, 60);

    // 添加项
    m_lsvMain.InsertItem(0, _T("Item 0"));
    m_lsvMain.InsertItem(1, _T("Item 1"));
    m_lsvMain.InsertItem(2, _T("Item 2"));
    m_lsvMain.InsertItem(3, _T("Item 3"));

}

注:
另外 641 中的 InsertColumn(int iCol, LPCTSTR pszColumnHeading, int iFormat, int iWidth, int iSubItem)InsertItem(int iItem, LPCTSTR pszText) 是有 BUG 的。
将 listview.h 更新到 SVN 里面最新的 749 后正常。

//EOF Read More...

2009-03-29

Win32++ CodeBlocks templates & wizard

Win32++ is a C++ library used to build windows GUI applications.
http://sourceforge.net/projects/win32-framework/
Win32 平台上的一个轻量级的 C++ GUI开发库,可以用在 GCC 编译器中。
document:
http://users.bigpond.net.au/programming/documentation.htm

自己花了点时间做了个简陋的 CodeBlocks 的新建 Win32++ 工程的模板向导。

下载:
http://dl.getdropbox.com/u/163800/libs/cxx/Win32%2B%2B/codeblocks_templ.zip

安装步骤:
1. 解包后将 wizard 下的 win32xx 目录放到 [CodeBlocks]\share\CodeBlocks\templates\wizard\ 去。
(其中 [CodeBlocks] 表示 CodeBlocks 的安装目录)
当然也可以放到用户目录中——具体参照 CodeBlocks 的 Wiki。

2. 在 [CodeBlocks]\share\CodeBlocks\templates\wizard\ 中找到 config.script 文件,用文本编辑器打开,在 function RegisterWizards() { ... } 里面加一行:

RegisterWizard(wizProject, _T("win32xx"), _T("Win32++ Application"), _T("GUI"));

3. 这样新建工程的 GUI 分类里面就有 "Win32++ GUI Application" 的选项了,按向导一步步走就可以了。
(当然,前提是你要将 Win32++ 的库引入哦!——在“编译器选项”->"Search directories"->"Compiler"里面加入)

//EOF Read More...

2009-03-28

SGU

说:"The only mission is survive!"
貌似 SGU 和 Revolution 都是 黑暗风格……
莫非是受到 BSG 的影响么?
//EOF Read More...

访问Windowz的共享

samba,当然是samba了。(好像我还没听说过不基于samba的访问方式。。。)
1.查看共享资源列表:(我这里好像匿名的不成啊!?)
$ smbtree -U username
这里username是对方的“共享用户”。默认(不使用"-U")是使用本机当前登录用户名,但注意密码还是要输入对方机器上该用户名的密码。
2.访问对方共享资源:
$ smbclient -U username //host/dir
这里username同上,"//host/dir"是用smbtree查看到的对方共享资源(光只"//host/"是不成的)。
这个smbclient是个像ftp一样的东西,如果你以前用过控制台下的ftp这个应该很容易上手 :)
(BTW:有人说可以# mount -t smbfs ...的,但我的不行啊,也没有smbmount -_-,其实我个人觉得smbclient也不错,至少我对它不算陌生)
===========================================
# mount -t smbfs ...需要在编译内核的时候加入CONFIG_SMB_FS支持 ---- 07-01-24
# mount -t cifs ... CONFIG_CIFS
//EOF Read More...

2009-03-23

格格来了

小侄女,几个月大,很漂亮,比她母亲漂亮。
今天早上教她吃面条,很可爱 :D

//EOF Read More...

BSG final

final 了,果然神叨叨的了~~。
六号说,让一个复杂系统反复运行很长时间,最终令人惊讶的事情可能会发生。
//EOF Read More...

2009-03-17

instance initializer

虽然用Java一段时间了,不过还是第一次听到 instance initializer (实例初始化块)
以前知道有一个 static initializer (静态初始化块)会在类加载的时候执行。
instance initializer 则是在构造函数执行过程中的某一时刻执行。见代码:


// LoadOrder.java

public class LoadOrder {
private Property _property = new Property();

{ // instance initializer
System.out.println("{ Load Block 1 }");
}

static { // static initializer
System.out.println("{ static 1 }");
}

public LoadOrder() {
System.out.println("LoadOrder()");
_property = new Property(this);
}

{
System.out.println("{ Load Block 2 }");
}

static {
System.out.println("{ static 2 }");
}

public static void main(String[] args) {
System.out.println("==== main() 1 ====");
new LoadOrder();
System.out.println("==== main() 2 ====");
new LoadOrder();
Property referee = new Property();
}
}

class Property {
public Property() {
System.out.println("Property()");
}
public Property(Object owner) {
System.out.println("Property(Object)");
}
}
// EOF

运行结果如下:

{ static 1 }
{ static 2 }
==== main() 1 ====
Property()
{ Load Block 1 }
{ Load Block 2 }
LoadOrder()
Property(Object)
==== main() 2 ====
Property()
{ Load Block 1 }
{ Load Block 2 }
LoadOrder()
Property(Object)
Property()

//EOF Read More...

2009-02-20

junit 4 使用

NOTE:
junit 4 中
1. 测试类不需要继承 TestCase,直接在方法前用 @Test 即可。
2. @BeforeClass, @AfterClass 方法需要是 public static 的。

//EOF Read More...

2009-02-07

网易的源

想不到163上也出现了一个源镜像,据说就是以前cn99的那个。
http://mirrors.163.com/

用了一下,速度很快,但不是最新的。

//EOF Read More...

2009-01-31

svn portable

Apache 集成 Subversion 的Win32便携式版本。
用做个人的版本管理之用。

集成环境为:
Apache 2.2.9
PHP 5.2.6
Subversion 1.5.5

默认解压到 D:/ 下运行里面的 install.bat 就能用了。
若解压到其它地方修改 D:\svn\svn-win32-1.5.5\conf\httpd.conf 中的 ServerRoot 到正确的位置。
默认项目数据保存在 D:\svn\svn-win32-1.5.5\svn_data 中。
(注:会注册服务 Apache2.2 ,若以前安装有 Apache2.2 就会安装失败。)
运行 start.bat 启动
(注:启动HTTP服务会用 80 端口,若被占用 则启动失败,在 D:\svn\svn-win32-1.5.5\conf\httpd.conf 中修改。)
运行 uninstall.bat 卸载。


访问 http://localhost/ 可以进行简单的管理:
创建、删除 项目
创建、删除 帐号、修改帐号密码

修改帐号访问权限现在还是需要自己修改文件
D:\svn\svn-win32-1.5.5\conf\svn\authz

文件下载:svn_portable.zip

// EOF Read More...

2009-01-21

在程序中处理设备的热插拔通知

注册 WM_DEVICECHANGE 事件,但还不够。
仅注册该事件则仅仅只会收到 DBT_DEVNODES_CHANGED 通知(包括光驱的弹出、收入,网络的通断等都会触发该事件)。
所以还需要用 RegisterDeviceNotification() 注册相应的设备通知。

HDEVNOTIFY RegisterDeviceNotification(
  IN HANDLE hRecipient,  // 注册 WM_DEVICECHANGE 事件的窗口或Service句柄
  IN LPVOID NotificationFilter, // DEV_BROADCAST_DEVICEINTERFACE 结构
  IN DWORD Flags
);

BOOL UnregisterDeviceNotification(
  IN HDEVNOTIFY Handle  // RegisterDeviceNotification() 返回的那个Handle
);
在 DEV_BROADCAST_DEVICEINTERFACE 结构里有个 dbcc_classguid 为需要监听的设备 GUID。
MSDN 上说 RegisterDeviceNotification() 的 Flags 加上 DEVICE_NOTIFY_ALL_INTERFACE_CLASSES 后可以不要GUID 但我这里似乎 不能不要GUID~~ RegisterDeviceNotification() 时失败说 “Bad Data!”~ 不知道是怎么回事,也许没用对吧。

参考:
http://www.microsoft.com/whdc/Driver/tips/PnPUmNotif.mspx
http://msdn.microsoft.com/en-us/library/aa363211(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa363431(VS.85).aspx


另外,在 Linux 上的热插拔通知 可用 udev, HAL, D-BUS。

//EOF Read More...

使用 RegEnumValue 要注意的地方

LONG RegEnumValue(
  HKEY hKey,              // handle to key to query
  DWORD dwIndex,          // index of value to query
  LPTSTR lpValueName,     // address of buffer for value string
  LPDWORD lpcbValueName,  // address for size of value buffer
  LPDWORD lpReserved,     // reserved
  LPDWORD lpType,         // address of buffer for type code
  LPBYTE lpData,          // address of buffer for value data
  LPDWORD lpcbData        // address for size of data buffer
);

返回值 ERROR_NO_MORE_ITEMS,表示都枚舉完了。
dwIndex 為索引,如果是枚舉并刪除的話,就一直為0就行了。
lpcbValueName 這個是ValueNameBuffer 的大小,這個地方要注意!!每次調用前設置成buffer大小,調用后都會設置成返回的ValueName實際的長度,所以這里需要在每次調用前都設置一下,@@ 暈死~,沒注意看MSDN。
lpcbData 同上。

//EOF Read More...

2009-01-12

google又换favicon了

今天发现google的favicon又换了,这次是几个鲜明的色块,不太喜欢这样的 -_-
//EOF Read More...

2009-01-11

修改文件/資料夾的用戶訪問權限

用WinAPI:

BOOL SetFileSecurity(
  LPCTSTR lpFileName,  // address of string for filename
  SECURITY_INFORMATION SecurityInformation,
                       // type of information to set
  PSECURITY_DESCRIPTOR pSecurityDescriptor 
                       // address of security descriptor
);
如:
::SetFileSecurity(szFileName, DACL_SECURITY_INFORMATION, psd);
其中 psd 的取得見上一篇:http://dave3068.blogspot.com/2009/01/securityattributeslpsecuritydescriptor.html

另外,對上一篇的補充:
SECURITY_ATTRIBUTES 中 lpSecurityDescriptor 的使用還可以使用 API :
SetSecurityDescriptorDacl
SetSecurityDescriptorControl
等。
不過感覺一般情況下還是這個 ConvertStringSecurityDescriptorToSecurityDescriptor 方便些 :)。
要如何使用就要看具體的場合了。

//EOF Read More...

2009-01-10

SECURITY_ATTRIBUTES.lpSecurityDescriptor 的使用

在 WinAPI:CreateFile 等函數中有個 SECURITY_ATTRIBUTES 可以用來控制文件的用戶訪問權限,但一直不知道SECURITY_ATTRIBUTES結構中的lpSecurityDescriptor如何設置,今天查了一下MSDN發現可以用函數:

BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptor(
  __in   LPCTSTR StringSecurityDescriptor,
  __in   DWORD StringSDRevision,
  __out  PSECURITY_DESCRIPTOR *SecurityDescriptor,
  __out  PULONG SecurityDescriptorSize
);
來設置pSa->lpSecurityDescriptor。
要使用該函數需要引入Sddl.h 頭文件,但 VC6 里面沒有這個頭文件。
還有個方法是自己 LoadLibrary => GetProcAddress 來取得:
ConvertStringSecurityDescriptorToSecurityDescriptor 在 Windows 2000 Professional 以上的 Advapi32.dll 中。
可以用以下代碼得到:
typedef BOOL (WINAPI *FN__CSSDTSD__) (
  IN LPCTSTR,
  IN DWORD,
  OUT PSECURITY_DESCRIPTOR *,
  OUT PULONG);

FN__CSSDTSD__ ConvertStringSecurityDescriptorToSecurityDescriptor = NULL;

//   SDDL   Version   information
#define SDDL_REVISION_1  1
#define SDDL_REVISION  SDDL_REVISION_1


void _initLIBS()
{
 HMODULE hAdvapi32 = ::LoadLibrary("Advapi32");
 if (hAdvapi32)
 {
  ConvertStringSecurityDescriptorToSecurityDescriptor =
   (FN__CSSDTSD__)::GetProcAddress(
    hAdvapi32,
    "ConvertStringSecurityDescriptorToSecurityDescriptorA");
 }
}

參考:
http://msdn.microsoft.com/en-us/library/ms717798.aspx
http://msdn.microsoft.com/en-us/library/aa379570%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa376401%28VS.85%29.aspx

//EOF Read More...