Step to UEFI Shell (3) —-获得命令行参数的方法

这里介绍如何获得Shell下的命令行参数。关键代码很简单,如下:

EFI_STATUS
EFIAPI
ShellAppMain (
	IN	UINTN 	Argc,
	IN 	CHAR16	**Argv
)
{
UINTN 	i;

	Print (L"Total %d args\n",Argc);
	for (i=0;i<Argc;i++)
 	{
	  Print (L"Arg[%d]= %s \n",i,*(Argv+i));
	}
	return EFI_SUCCESS;
}

 

uefistep3

完整的代码 HelloWorld2

获得当前硬盘上全部盘符

这一系列文章是根据cutebunny 的BLOG “windows的磁盘操作” 写成的,主要是部分修改原作中的代码,使之兼容Unicode和Windows 7 64bit. 原文可以在下面的网址找到

http://cutebunny.blog.51cto.com 。 本文是参考 “windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号”写成。

程序实现了获得当前硬盘上全部盘符的功能(分区可能没有分配盘符,比如:win7一般都会隐藏起来最前面的分区)。

// emuPart.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

/******************************************************************************
* Function: get disk's physical number from its drive letter
*           e.g. C-->0 (C: is on disk0)
* input: letter, drive letter
* output: N/A
* return: Succeed, disk number
*         Fail, -1
******************************************************************************/
DWORD GetPhysicalDriveFromPartitionLetter(TCHAR letter)
{
    HANDLE hDevice;               // handle to the drive to be examined
    BOOL result;                 // results flag
    DWORD readed;                   // discard results
    STORAGE_DEVICE_NUMBER number;   //use this to get disk numbers
 
    TCHAR path[MAX_PATH];
    wsprintf(path, L"\\\\.\\%c:", letter);
    hDevice = CreateFile(path, // drive to open
                         GENERIC_READ | GENERIC_WRITE,    // access to the drive
                         FILE_SHARE_READ | FILE_SHARE_WRITE,    //share mode
                         NULL,             // default security attributes
                         OPEN_EXISTING,    // disposition
                         0,                // file attributes
                         NULL);            // do not copy file attribute
    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
        fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());
        return DWORD(-1);
    }
 
    result = DeviceIoControl(
                hDevice,                // handle to device
                IOCTL_STORAGE_GET_DEVICE_NUMBER, // dwIoControlCode
                NULL,                            // lpInBuffer
                0,                               // nInBufferSize
                &number,           // output buffer
                sizeof(number),         // size of output buffer
                &readed,       // number of bytes returned
                NULL      // OVERLAPPED structure
            );
    if (!result) // fail
    {
        fprintf(stderr, "IOCTL_STORAGE_GET_DEVICE_NUMBER Error: %ld\n", GetLastError());
        (void)CloseHandle(hDevice);
        return (DWORD)-1;
    }
    printf("%d %d %d\n\n", number.DeviceType, number.DeviceNumber, number.PartitionNumber);
 
    (void)CloseHandle(hDevice);
    return number.DeviceNumber;
}

/******************************************************************************
* Function: get disk's drive letters from physical number
*           e.g. 0-->{C, D, E} (disk0 has 3 drives, C:, D: and E:)
* input: phyDriveNumber, disk's physical number
* output: letters, letters array
* return: Succeed, the amount of letters
*         Fail, -1
******************************************************************************/
DWORD GetPartitionLetterFromPhysicalDrive(DWORD phyDriveNumber, TCHAR **letters)
{
    DWORD mask;
    DWORD driveType;
    DWORD bmLetters;
    DWORD diskNumber;
    TCHAR path[MAX_PATH]; 
    TCHAR letter;
    DWORD letterNum;
    WORD i;
    TCHAR *p;
 
    bmLetters = GetLogicalDrives();
    if (0 == bmLetters)
    {
        return (DWORD)-1;
    }
 
    letterNum = 0;
    for (i = 0; i < sizeof(DWORD) * 8; i++)
    {
        mask = 0x1u << i;
        if ((mask & bmLetters) == 0)        //get one letter
        {
            continue;
        }
        letter = (TCHAR)(0x41 + i);    //ASCII change
        wsprintf(path, L"%c:\\", letter);
        driveType = GetDriveType(path);
        if (driveType != DRIVE_FIXED)
        {
            bmLetters &= ~mask;     //clear this bit
            continue;
        }
        diskNumber = GetPhysicalDriveFromPartitionLetter(letter);
        if (diskNumber != phyDriveNumber)
        {
            bmLetters &= ~mask;     //clear this bit
            continue;
        }
        letterNum++;
    }
 
    //build the result
    *letters = (TCHAR *)malloc(letterNum);
    if (NULL == *letters)
    {
        return (DWORD)-1;
    }
    p = *letters;
    for (i = 0; i < sizeof(DWORD) * 8; i++)
    {
        mask = 0x1u << i;
        if ((mask & bmLetters) == 0)
        {
            continue;
        }
        letter = (TCHAR)(0x41 + i);    //ASCII change
        *p = letter;
		printf("%c",letter);
        p++;
    }
   
    return letterNum;
}

int _tmain(int argc, _TCHAR* argv[])
{
	TCHAR	*List;

	GetPartitionLetterFromPhysicalDrive(0,&List);

	getchar();
	return 0;
}

 

运行结果如下 (注意,运行时需要管理员的权限)
emupart

最后一行给出了PhysicalDrive0 上的三个盘符

参考:
1.cutebunny 的BLOG “windows的磁盘操作” 可以在这里下载 WindowsDisk

使用 Arduino 打造一个硬件的Watchdog

我的台式机使用梅捷 SY-D2700-U3M 的主板,固化了Intel D2700 Atom CPU。具有零噪音(无风扇),节能环保,扩展丰富等等特点。唯一的问题是:经常硬盘丢失。具体是在使用中忽然BSOD,然后自动重启之后在Setup中无法找到硬盘,重启无效,必须关机一次再开机。从我的经验来看这绝非BIOS问题,并且实验确定不是硬盘问题。有人看守的情况下遇到这样的最多只是郁闷一些,但是作为下载机的时候,上述的问题就变得令人难以忍受。于是,考虑做一个硬件的 WatchDog,当出现问题的时候自动完成关闭开关,再次重启的动作。

BOM 如下:

1. Arduino UNO
2. WCH341 USB转串口
3. 面包板
4. 杜邦线+大头针
5. 继电器

说说上面这些东西,最重要的是继电器,就是下面这个东西。

1

这是两路的继电器,可以控制2组电路。性能指标是“交流电压最大250V,交流电流最大10A,直流电压最大30V,直流电流最大10A”。有4个输入针脚,分别是VCC GND,1IN 和2IN可以直连Arduino IO口。上电之后,1IN和2IN可以直接接入到VCC和GND上,应该能听到继电器“啪”的吸合的声音,此时测量受控端的电阻可以得知当前是断开还是链接。

2

再说一下喂狗的WCH341。 一般来说,Arduino的USB口可以用来取电和串口通讯。实际使用中我关闭台式机后,USB口供电也会随之切断,因此Arduino必须使用外部供电。既然使用了外部供电,串口也只能使用外部输入。刚开始选择的是FDTI 的USB转串口,一直无法正常通讯,最后测量发现它转出来的电压在 6.2v左右(TX/RX)远超过了.预期的5V。WCH341是之前玩单片机的剩下的,测量之后发现它的输出电压能够满足要求,于是就选用之。还有需要注意的是,完整的串口通讯实际上需要3跟线:TX RX和GND.

引出PowerButton的2个Pin.

3

继电器直接控制PowerButton Pin。

4

绿线接到继电器上进行控制

5

Arduino代码:

#include //引用库
/*
Simple LED sketch
*/

int led = 13; // Pin 13 当连接(相当于按下PowerButton)时点亮,断开时关闭
int cnt = 10; // Pin 10 控制继电器,高时断开,低时连接

unsigned long int elsp=0; //计算时间

void setup()
{
pinMode(led, OUTPUT); // Set pin 13 as digital out
pinMode(cnt, OUTPUT); // Set pin 10 as digital out
digitalWrite(led, LOW); // off
digitalWrite(cnt,HIGH); //Cut OFF

// Start up serial connection
Serial.begin(9600); //baud rate
Serial.flush();
elsp=millis();

wdt_enable(WDTO_8S); //这是Arduino的看门狗可以更换其他时间值
//注意,这里是8s,后面的延时不可以直接超过8s
}

void loop()
{

// Read any serial input
while (Serial.available() > 0)
{
if ((char) Serial.read() == ‘P’) {elsp=millis(); }
//当收到”P”时,重置计时器。换句话,我们用字符 “P” 来喂狗
}

if (abs(millis()-elsp)>300*1000UL) //300s = minutes
{
digitalWrite(led, HIGH); // on
//关机动作
digitalWrite(cnt,LOW); //继电器短路,相当于按下PowerButton
wdt_reset(); //重置Arduino内部看门狗
delay(6000); //这里相当于长按PowerButton 6s
wdt_reset(); //重置Arduino内部看门狗
digitalWrite(cnt,HIGH); //继电器断路,相当于松开PowerButton
//松开PowerButton 5s
delay(5000);
wdt_reset(); //重置Arduino内部看门狗
//开机上电
digitalWrite(cnt,LOW); //继电器短路,相当于按下PowerButton
delay(500); //按下500ms
digitalWrite(cnt,HIGH); //继电器断路,相当于松开PowerButton
elsp=millis();

digitalWrite(led, LOW); // off
wdt_reset(); //重置Arduino内部看门狗
}
delay(1000);
Serial.println(millis()-elsp);
wdt_reset(); //重置Arduino内部看门狗如果loop时间超过时限,系统会重启
}

6

除了Arduino的Firmware,PC端喂狗也需要一个程序。选择Delphi编写程序,实现两个功能:1.扫描COM Port找到进行通讯的端口 2.每隔一段时间就进行一次喂狗

(此处Delphi代码,Console模式)
HWDog

7

参考:

1. http://biosren.com/thread-6794-1-1.html 《改动代码提取器》

用 Arduino 打造一个自动锁屏装置

上大学的时候,当团支书,负责同学交入Party申请书之类的事情。想入Party有一关是“群众评议”,就是看看是否有反对的意见。当时我和班级上的同学说“一个好人,进入Party是追求进步,是好事;一个坏人,进入Party会让群众队伍更纯洁,因此也是好事。大家都不要反对哈”。所以我们班级在这一关从来没有过什么问题。后来有一次,我去帮同学交入Party申请书,顺便讨价还价一下(我记得有规定是交了之后必须间隔一段才能进入正式的城西,为此我会和辅导员商量这个申请书的时间多多提前一些)。辅导员不在,我就稍等了一下。期间无聊,顺便翻翻其他班级的评议,结果让我大吃一惊,真有班级同学特别反对某个人的,罗列了很多条意见。正在我看在兴头上,辅导员看到急忙过来将东西收了起来,半开玩笑的批评另外帮忙的女同学,说这样的东西怎么能让这种人看到………所以信息安全非常重要。

当你起身去上厕所或者喝水的时候,是否可曾担心屏幕上的信息被人有意或者无意的看到?或者你外出办事,是否担心有人悄悄操作你的电脑?解决这个问题最简单的办法就是给Windows设置一个密码,然后在离开的时候按下 WinKey+L 。

下面就来使用Arduino制作一个自动完成这个“人走屏锁”的装置。

简单的说,工作分为两步:第一步,制作Arduino模拟USB键盘;第二步,让这个模拟键盘发出WinKey+L的键码。

使用的BOM如下:
A.USB公头(有供电和通讯能力的USB头皆可) x1
B.120欧电阻(原文建议68欧,但是我刚好没有所以并联2个来实现60欧) x4
C. 2.2K欧电阻 x1
D.3.6伏稳压管 x2
E.红外线传感器 x1 (用来实现人体感应)

先说第一步,根据 《Arduino学习笔记A11 – Arduino模拟电脑键盘(基于AVR-USB的USB-HID设备)》参考[1]。使用到BOM中提到的A-D,具体电路如下

aa0

按照上图设计,首先用面包板进行搭建:

aa1

测试能够正常实现一个USB Keyboard的功能,具体调试可以参照《Arduino USB keyboard debug经验》。确定上述能够正常工作之后,进行简单的焊接,用大头针将Pin脚引出。

aa2

再使用纸壳做了一个盒子,将Arduino装了进去。
aa3

aa4

下一步的目标就是加入一个能够判断人体是否存在的功能了。最先想到的是人体感应模块。通常都是长得下面这个样子。

aa5

我也入手了一块,但是测试中感觉很奇怪,手放在它前面一段时间之后就没有输出了。后来再仔细阅读资料发现,这个东西应该叫做“人体运动感应模块”。是根据判断当前的红外线变化来判断是否有人体进入。如果想做到“人体感应”,还要加入更复杂的设计。
万幸,手边还有一块红外距离模块,这是用来判断一定距离内是否有遮挡的元件。探测距离可以在0-100cm以内调节。当有阻挡的时候输出低电平,反之输出高。

aa6

使用时,探头的VCC和GND同样取自USB供给。输出OUT连接到Arduino的D8。

aa7

程序如下:

#include "UsbKeyboard.h"
int KEYPIN = 8;                //使用D8作为检测输入,直接使用D1的话
//灌入电流过大,会导致死机。最好是加入限流电阻
//手边没有,就这样暂时这样了
unsigned long ElspTimer=0; 
void setup()
{
  TIMSK0 &= !(1 << TOIE0);     //这里的中断给USB使用了,所以Delay(), Millis()
//micros() delay() delayMicroseconds()统统不好用了
//取而代之的是用串口输出做的粗糙的延时
  pinMode(KEYPIN, INPUT);
  Serial.begin(9600);
}
void loop()
{
  UsbKeyboard.update();
  if(digitalRead(KEYPIN) == LOW)
  {
    ElspTimer=0;
  }
 ElspTimer++;
 Serial.println(ElspTimer);		//这里主要是为了延时使用
  if (ElspTimer>6000L)         //循环6000次,在Uno上是40s左右
    {
      UsbKeyboard.sendKeyStroke(KEY_L,MOD_GUI_LEFT); //发出WinKey+L 来锁定
      ElspTimer=0;
    }
}

 

这样,当人离开的时候,红外探头就无法检查到障碍物,会输出一个高电平。经过40s左右的延时,如果始终为高,就会模拟按下WinKey+L来锁定电脑。从而实现了人走屏锁的功能。
为了美观,最好再做个盒子之类的,我这里只是找了一个啤酒杯,露出探头和USB线。大功告成。

aa8

总结:Arduino通过IO来模拟一个低速设备能够完成一些有趣的功能,还有更多种的“玩法”等待我们去探索。

参考:
1. http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1137
2. http://www.lab-z.com/arduino-usb-keyboard-debug%E7%BB%8F%E9%AA%8C/

Arduino 使用I2C的1602 LCD

很多时候我们需要显示简单的字符,1602LCD就是很好的选择。通常Arduino 使用1602 LCD需要连接很多线路,需要占用很多个IO口,而是用I2C版本的1602即可省去这样的繁杂。I2C版本只需要VCC(3.3和5都可以,亮度上有些差别),GND,还有SDA(连接A4)和 SCL(连接A5)。

下面就是一个使用I2C在1602上显示的例子:

20131206613

对应的程序和库在这里

Hw

在使用的时候,你可以遇到如下问题:

1.编译不通过。请检查编译器的版本,建议使用 1.0 以上的,因为这是未来的方向。如果还有问题,请检测引用库的方式。如果你将 LiquidCrystal_I2C 放在了Library下面,可以用 #include 这样的方式来引用,或者像我代码中,直接将LiquidCrystal_I2C.cpp 和 LiquidCrystal_I2C.h 放在源文件同样的目录下,你就可以使用 #include “LiquidCrystal_I2C.h”。此外,如果出现编译错误提示在 LiquidCrystal_I2C lcd(0x27,16,2); 这行,就是没有正确引用到LiquidCrystal_I2C.h这个头文件导致的。你可以按照上述检查一下,然后重启编译器试试。

2.烧写之后无显示,首先请检查地址是否正确(地址不正确的情况下最上面可能有方块,下面看起来是空白行),最直接的方法是询问卖家,此外还可以像我之前的一篇文章提到的烧入一个软件来判定地址。其次要检查背后的电位器是否正常,避免实际上已经有数值了只是对比度不正确你看不到而已。如果仍然不行,就需要重新寻找库。这个差别有可能是如下硬件顺序导致的。

1602

可以看到 P0- P3分别对应 RS/RW/CS/P ,另外,P4-P7对应DB4-7。还有一种计是颠倒过来 P0-P3对应DB4-7的。如果存在差别,库文件初始化方式传输Command方式都需要修改的。剩下的就是检查Pin是否有电平输出,如果没有那就是I2C模块坏掉了。

当然,如果你在上面花费了超过8个小时仍然无法解决,我的建议是赶快更换一篇,这个东西不需要研究那么久,你的1602有可能压根就是坏掉的(非常不幸的是我就是因为这个问题花费了无数个夜晚…..)

我最后购买到OK的1602是在 http://arduinochina.taobao.com/?spm=a1z10.1.w1002-2071319798.3.RT0Fkv (Arduino CHINA)

Arduino 扫描I2C设备的程序

Arduino IO端口有限,使用I2C来进行扩展是一个很好的选择(A4-SDA, A5-SCL)。可以通过下面的程序来完成对I2C,以便确定设备地址。

程序来自 http://www.geek-workshop.com/thread-287-1-1.html ,修正了其中的编译Bug和程序输出结果上的bug,实测工作正常。

Capture

//Below program comes from http://www.geek-workshop.com/thread-287-1-1.html
//According to that page I have fiexed some bugs :
// 1. " rc = twi_writeTo(addr, &data, 0, 1);"
// 2. addr = addr<<1;  This line should be removed
// I have tested below code with my I2C LCD.

#include "Wire.h"
extern "C" {
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}

byte start_address = 1;
byte end_address = 127;

// Scan the I2C bus between addresses from_addr and to_addr.
// On each address, call the callback function with the address and result.
// If result==0, address was found, otherwise, address wasn't found
// (can use result to potentially get other status on the I2C bus, see twi.c)
// Assumes Wire.begin() has already been called
void scanI2CBus(byte from_addr, byte to_addr, 
                void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0; // not used, just an address to feed to twi_writeTo()
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr,&data,0,1,1);
    if(rc==0) callback( addr, rc );
  }
}

// Called when address is found in scanI2CBus()
// Feel free to change this as needed
// (like adding I2C comm code to figure out what kind of I2C device is there)
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  //ZT Debug addr = addr<<1;
  Serial.print("\t HEX: 0x");
  Serial.print(addr,HEX);
  Serial.println( (result==0) ? "\t found!":"   ");
//  Serial.print( (addr%4) ? "\t":"\n");
}

// standard Arduino setup()
void setup()
{
    pinMode(13,OUTPUT);
    Wire.begin();

    Serial.begin(9600);
    Serial.println("--- I2C Bus Scanner Test ---");
    Serial.print("starting scanning of I2C bus from ");
    Serial.print(start_address,DEC);
    Serial.print(" to ");
    Serial.print(end_address,DEC);
    Serial.println("...");
    Serial.println();

    // start the scan, will call "scanFunc()" on result from each address
    scanI2CBus( start_address, end_address, scanFunc );

    Serial.print("\n");
    Serial.println("--- I2C Bus Scanner Complete ---");

    digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); delay(500);
    digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); delay(500);
    digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); delay(500);
}

void loop() 
{
}

 

区分本地磁盘与移动硬盘

这一系列文章是根据cutebunny 的BLOG “windows的磁盘操作” 写成的,主要是部分修改原作中的代码,使之兼容Unicode和Windows 7 64bit. 原文可以在下面的网址找到

http://cutebunny.blog.51cto.com 。 本文是参考 “windows的磁盘操作之九——区分本地磁盘与移动硬盘”写成。

程序实现了区分当前存储设备是硬盘还是移动硬盘的功能。

// gettype.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

/******************************************************************************
* Function: get the bus type of an disk
* input: drive name (c:)
* output: bus type
* return: Succeed, 0
*         Fail, -1
******************************************************************************/
DWORD GetDriveTypeByBus(const TCHAR *drive, WORD *type)
{
    HANDLE hDevice;               // handle to the drive to be examined
    BOOL result;                 // results flag
    DWORD readed;                   // discard results
 
    STORAGE_DESCRIPTOR_HEADER *pDevDescHeader;
    STORAGE_DEVICE_DESCRIPTOR *pDevDesc;
    DWORD devDescLength;
    STORAGE_PROPERTY_QUERY query;
 
    hDevice = CreateFile(
                    drive, // drive to open
                    GENERIC_READ | GENERIC_WRITE,     // access to the drive
                    FILE_SHARE_READ | FILE_SHARE_WRITE, //share mode
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL            // do not copy file attribute
                    );
    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
        fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());
        return DWORD(-1);
    }
 
    query.PropertyId = StorageDeviceProperty;
    query.QueryType = PropertyStandardQuery;
 
    pDevDescHeader = (STORAGE_DESCRIPTOR_HEADER *)malloc(sizeof(STORAGE_DESCRIPTOR_HEADER));
    if (NULL == pDevDescHeader)
    {
        return (DWORD)-1;
    }
   
    result = DeviceIoControl(
                    hDevice,     // device to be queried
                    IOCTL_STORAGE_QUERY_PROPERTY,     // operation to perform
                    &query,
                    sizeof query,               // no input buffer
                    pDevDescHeader,
                    sizeof(STORAGE_DESCRIPTOR_HEADER),     // output buffer
                    &readed,                 // # bytes returned
                    NULL);      // synchronous I/O
    if (!result)        //fail
    {
        fprintf(stderr, "IOCTL_STORAGE_QUERY_PROPERTY Error: %ld\n", GetLastError());
        free(pDevDescHeader);
        (void)CloseHandle(hDevice);
        return DWORD(-1);
    }
 
    devDescLength = pDevDescHeader->Size;
    pDevDesc = (STORAGE_DEVICE_DESCRIPTOR *)malloc(devDescLength);
    if (NULL == pDevDesc)
    {
        free(pDevDescHeader);
        return (DWORD)-1;
    }
 
    result = DeviceIoControl(
                    hDevice,     // device to be queried
                    IOCTL_STORAGE_QUERY_PROPERTY,     // operation to perform
                    &query,
                    sizeof query,               // no input buffer
                    pDevDesc,
                    devDescLength,     // output buffer
                    &readed,                 // # bytes returned
                    NULL);      // synchronous I/O
    if (!result)        //fail
    {
        fprintf(stderr, "IOCTL_STORAGE_QUERY_PROPERTY Error: %ld\n", GetLastError());
        free(pDevDescHeader);
        free(pDevDesc);
        (void)CloseHandle(hDevice);
        return DWORD(-1);
    }
 
    //printf("%d\n", pDevDesc->BusType);
    *type = (WORD)pDevDesc->BusType;
    free(pDevDescHeader);
    free(pDevDesc);
 
    (void)CloseHandle(hDevice);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	WORD	t;
    TCHAR   *Driver;

	Driver=L"\\\\.\\c:";

	GetDriveTypeByBus(Driver,&t);

	fprintf(stdout, "%x\n",t);

	Driver=L"\\\\.\\d:";

	GetDriveTypeByBus(Driver,&t);

	fprintf(stdout, "%x\n",t);

	getchar();
	return 0;
}

 

运行结果如下 (注意,运行时需要管理员的权限)

hdorrhd

表示一个是 BusTypeAta 另一个是 BusTypeUsb,前者是固定在机器中的硬盘,后者是U盘。

源代码以及可执行程序

gettype

参考:
1.cutebunny 的BLOG “windows的磁盘操作” 可以在这里下载 WindowsDisk

哲理小故事:Attitude很重要吗?

有一个经典的小故事,用一种方法来证明“attitude很重要”:

如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于百分之 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
那么Hard work (努力工作)

H+A+R+D+W+O+R+K 8+1+18+4+23+15+18+11 = 98%

Knowledge(知识)

K+N+O+W+L+E+D+G+E 11+14+15+23+12+5+4+7+5 = 96%

Love(爱情)

L+O+V+E12+15+22+5 = 54%

Luck(好运)

L+U+C+K12+21+3+11 = 47%

(这些我们通常认为重要的东西往往并不是最重要的)

什么能使得生活变得圆满?

是Money(金钱)吗? …

不! M+O+N+E+Y = 13+15+14+5+25 = 72%

是Leaadership(领导能力)吗? …

不! L+E+A+D+E+R+S+H+I+P = 12+5+1+4+5+18+19+9+16 = 89%

那么,什么能使生活变成100%的圆满呢?

每个问题都有其解决之道,只要你把目光放得远一点!

ATTITUDE(心态)

A+T+T+I+T+U+D+E 1+20+20+9+20+21+4+5 = 100%

我们对待工作、生活的态度能够使我们的生活达到100%的圆满。”

我的问题是:除了态度,是否有其他“能够使我们的生活达到100%的圆满”的?

经过查找,至少还有下面的单词:

accumulate|v.积聚,堆积
acknowledge|vt.承认,答谢,报偿
adulthood|n.成人期
affectation|n.假装,虚饰,做作
alienation|n.疏远,转让
analysis|n.分析,分解
anterior|adj.前面的,在前的
apoplectic|n.患中风者adj.中风的,易患中风的
appertain|v.属于
apropos|adj.adv.适当地,恰好的
attitude|n.姿势,态度,看法,意见
avocation|n.(个人)副业,业余爱好
awfully|adv.非常,很,十分
benediction|n.祝福
blissful|adj.有福的
botanist|n.植物学家
bouillon|n.肉汤,牛肉汤
boundary|n.边界,分界线
boycott|n.vt.联合抵制,联合排斥某国货物或与某国绝交
bronchus|n.[医]支气管
cacophony|n.刺耳的音调,不协和音,杂音
candidature|n.候选人的地位,候选人资格
carpenter|n.木匠
chimpanzee|n.[动]非洲的小人猿,黑猩猩
clockwise|adj.顺时针方向的adv.顺时针方向地
companion|n.同伴,共事者
comport|v.相称
congenital|n.adj.天生的,先天的,天赋的
congress|n.(代表)大会,[C~](美国等国的)国会,议会
connivance|n.假装不见,纵容,默许
contented|adj.满足的,心安的
corridor|n.走廊
crudity|n.生,生硬,不熟
culture|n.文化,文明
debarkation|n.下车,下船,登陆
declarative|adj.宣言的,公布的
declension|n.[文法]词尾变化,格变化,倾斜,衰退
decorous|adj.有礼貌的
deliquesce|vi.溶解,解除,液化
delivery|n.递送,交付,分娩,交货,引渡n.[律]财产等的正式移交发送,传输
demobilize|v.复员
denominate|vt.命名adj.有说明性名称的
depletion|n.损耗
dinginess|n.暗淡,肮脏
discernible|adj.可辨别的
discipline|n.纪律,学科v.训练
discommode|vt.使不方便,使为难,使不自由
discredited|adj.不足信的,不名誉的
distrait|adj.心不在焉的
dogmatize|v.武断地提出
drizzle|n.细雨v.下毛毛雨
dumbfound|v.使人哑然失声,使发楞
ebullient|adj.冒泡的,沸腾的,热情的,热情洋溢的
elsewhere|adv.在别处
emasculate|vt.阉割,使柔弱,删削,使无力adj.阉割了的,柔弱的
embodiment|n.体现,具体化,化身
emendation|n.修订,校正,修正
empathetic|adj.(empathic)移情作用的,感情移入的
espouse|vt.嫁娶,支持,赞成
eulogize|vt.称赞,颂扬
eventual|adj.<古>可能的,最后的,结局的,万一的,终于的
excellent|adj.卓越的,极好的
excoriate|v.批判
fatalistic|adj.宿命论的
fatherhood|n.父亲的身份,父性,父权
fluorine|[化]氟(9号元素,符号F)
fountain|n.泉水,喷泉,源泉
groggily|adv.酒醉地,东倒西歪地
grumpy|adj.脾气坏的,性情乖戾的,脾气暴躁的
gullibly|
healthily|adv.健康地
hirsute|adj.多毛的,有粗毛的
hobbyist|n.沉溺于某种癖好者,嗜某爱好成癖的人
holograph|n.亲笔文件,[律]亲笔信,[物]全息图
honeycomb|n.蜂房,蜂巢,蜂脾
hospital|n.医院
imbroglio|n.杂乱的一团,纠葛,纷扰,误解
immature|adj.不成熟的,未完全发展的
inadequacy|n.不充分
inapplicable|adj.不适用的
inefficient|adj.效率低的,效率差的,(指人)不能胜任的,无能的
inflation|n.胀大,夸张,通货膨胀,(物价)暴涨
innovate|vi.改革,创新
inoculate|vt.接种,嫁接
insecticide|n.杀虫剂
intellect|n.智力
interfere|vi.干涉,干预,妨碍,打扰
irritate|vt.激怒,使急躁v.刺激
judiciary|adj.司法的,法院的n.司法部,司法官,审判员
leaderless|adj.无领袖的
liberalism|n.自由主义
liberator|n.解放者,释放者
lightning|n.闪电(“闪电”)英国第一种超音速喷气式战斗机,英60年代的主力机种。
likelihood|n.可能,可能性
limpidly|adv.清澈地,透明地
litotes|n.间接肯定法,反语法
lubricant|n.滑润剂
macrocosm|n.宏观世界
magnetize|vt.使磁化,吸引vi.受磁
martinet|n.规律严肃的人,严格的人
masochism|n.[心]性受虐狂,受虐色情狂,受虐狂
maximize|vt.取…最大值,最佳化
mercantile|adj.商人的,商业的,经商的,重商主义的,以金钱为目的的
mercurial|adj.墨丘利神的,水星的,雄辩机智的,活泼善变的,水银的n.水银剂,汞剂
merrily|adv.愉快地,高兴地
misdirect|vt.误导,写错地址
molecular|adj.[化]分子的,由分子组成的
nastily|adv.污秽地,不洁地
nestling|n.未离巢的雏鸟,婴儿
nihilist|n.虚无主义者
nostalgic|adj.乡愁的,怀旧的
operetta|n.小歌剧
ornament|n.装饰物,教堂用品vt.装饰,修饰
outset|n.开端,开始
palpitate|v.跳动
pasture|n.牧地,草原,牧场v.放牧,牧(牛、羊)等,吃草
personage|n.要人,名流,个人
personal|adj.私人的,个人的,亲自的,容貌的,身体的,人身的,针对个人的adj.[语法]人称的
perturb|v.感到不安
plastered|adj.醉醺醺的
plebiscite|n.平民制定法,公民投票
plummet|n.铅锤,重荷vi.垂直落下
plumule|n.幼芽,棉毛
postdate|vt.填迟…的日期n.事后日期
preordain|vt.预定,预先注定命运
prevent|v.防止,预防
primary|adj.第一位的,主要的,初步的,初级的,原来的,根源的
printer|n.印刷工,打印机
producer|n.生产者,制作者,演出人,(电影)制片人
profuse|adj.极其丰富的
progeny|n.后裔
promisee|n.[律]受约人,承诺人
pumpkin|n.南瓜
pursue|vt.追赶,追踪,追击,继续,从事
quadrangle|n.四角形,四边形,方院,方庭(尤指牛津大学等学院中者)
quarry|n.采石场,(知识、消息等的)来源vt.挖出,苦心找出vi.费力地找
quarter|n.四分之一,方向,地区,方面,季,季度,一刻钟num.四分之一,刻
radiocarbon|n.放射性碳,碳的放射性同位元素
raillery|n.开玩笑,逗趣
receptor|n.接受器,感受器,受体
reciprocal|adj.互惠的,相应的,倒数的,彼此相反的n.倒数,互相起作用的事物
refinery|n.精炼厂
renovate|vt.革新,刷新,修复
repress|vt.<美>再压,补充加压vi.压制
reprint|v.再版
reprobate|v.非难
reputable|adj.著名的
reshuffle|n.改组v.改组
restore|vt.恢复,使回复,归还,交还,修复,重建
retiring|adj.退休的
reversal|n.颠倒,反转,反向,逆转,撤销
saintly|adj.圣洁的
salacious|adj.猥亵的,好色的
savory|adj.风味极佳的,可口的,味美的n.使人开胃的菜肴
scuttle|n.天窗,舱室小孔,煤桶,急速逃走vi.急促地跑,急忙撤退vt.凿沉,毁坏,毁坏
selective|adj.选择的,选择性的
session|n.会议,开庭
shattered|粉碎
shibboleth|n.口令
simulate|vt.模拟,模仿,假装,冒充
smitten|v.smite的过去分词
snobbery|n.势利
socialism|n.社会主义,社会主义运动
spirited|adj.英勇的
splashy|adj.易溅的,泼溅的,有色斑的
squint|v.斜视
status|n.身份,地位,情形,状况
stress|n.重压,逼迫,压力,重点,着重,强调,重音vt.着重,强调,重读
subsume|v.包容,包含
surcharge|n.超载,追加罚款,额外费vt.使装载过多,追加罚款
surely|adv.的确地,安全地
swollen|adj.肿胀的
syndicate|n.企业联合,[经]辛迪加,财团v.联合成辛迪加
synergic|adj.协作的,合作的
telephone|n.电话,电话机v.打电话
telescope|n.望远镜v.压缩
temperance|n.节欲,戒酒,禁酒,(气候等的)温和
temporal|adj.时间的,当时的,暂时的,现世的,世俗的,[解]颞的n.世间万物,教会财产
therefore|adv.因此,所以
thickening|n.使变厚,增厚过程
thirty|num.三十
thorny|adj.多刺的,痛苦的
towards|prep.向,朝,对面,接近,对,有助于
traction|n.牵引
truism|n.真实性
turkey|n.火鸡,无用的东西
undergird|v.加强,巩固…的底部
underlay|vt.铺在…下面,垫起vi.向下延伸n.衬垫物
unfasten|vt.解开,放松
unkempt|adj.蓬乱的,粗野的,不整洁的
useless|adj.无用的,无效的,无益的,无价值的
utensil|n.器具
variety|n.变化,多样性,种种,品种,种类
verbalize|v.描述
vouchsafe|vt.赐予,允许
whenever|conj.无论何时,随时n.只要
whiskey|n.威士忌酒adj.威士忌酒的
wholesale|n.批发,趸售adj.批发的,[喻]大规模的
writing|n.笔迹,作品,著述

我只想说明,态度真的很重要,许许多多年前我就发现了这一点,以至于我的师父曾经夸奖过我“有错误马上就承认,但是改不改就是另外的事情”。

但是用上面字母累加的方式来证明这一点是非常愚蠢的做法,弱智到20年前国产《知音》杂志的水平。

wordscore

可执行文件+源程序+字典文件

ScoreWords

Ubuntu 遇到能看到但是无法执行的可执行程序的解决办法

64位 Ubuntu 下,可能出现出现一个能看到但是无法执行的可执行文件。尝试执行时,会出现 “bash: ./name: No such file or directory”的错误提示。

产生这个问题的一个原因可能是:你的可执行程序是 32位的,而系统是64位的,所以无法正常执行(当然在这步之前还请确定权限正确)。

最后解决方法是:用下面命令安装一个兼容库

sudo apt-get install ia32-libs

之后再尝试执行之前的程序