标准库函数mktime与夏令时

1.现象描述

将本地系统时区设置为“(UTC)都柏林,爱丁堡,里斯本,伦敦”,并开启自动夏令时,将系统时间设置为处于当地的夏令时时间段内。代码中每次对时间进行转换,结果都会偏移一个小时。

2.现象分析

定位代码到C标准库time.h的函数mktime,struct tm结构的年月日的表示时间通过mktime转换为时间戳之后会偏移一个小时。原因是夏令时标志位tm_isdst没有设置,默认为0,表示不是夏令时。系统在调用mktime时会判断当前时区是否启用夏令时,如果启用夏令时,而传入的时间事实上处于夏令时,但是夏令时标志为0,系统就会加一个小时做默认的转换,并将夏令时标志置为1。

3.解决问题

阅读更多

Win7下Jekyll折腾笔记

安装RubyInstaller和DevKit

进入DevKit安装目录运行如下命令

1
2
ruby dk.rb init
ruby dk.rb install

安装结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
E:\Programs\DevKit>ruby dk.rb init
[INFO] found RubyInstaller v1.9.3 at E:/Programs/Ruby193
Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.
E:\Programs\DevKit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'E:/Programs/Ruby193'
[INFO] Installing 'E:/Programs/Ruby193/lib/ruby/site_ruby/devkit.rb'
E:\Programs\DevKit>ruby dk.rb review
Based upon the settings in the 'config.yml' file generated
from running 'ruby dk.rb init' and any of your customizations,
DevKit functionality will be injected into the following Rubies
when you run 'ruby dk.rb install'.
E:/Programs/Ruby193

阅读更多

字符串匹配的Boyer-Moore算法

阮一峰大神贴的感觉很不错的字符串算法,转载过来以备以后查看。

原作者:阮一峰

正文如下:

上一篇文章,我介绍了KMP算法。但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的”查找”功能(Ctrl+F),大多采用Boyer-Moore算法。

Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。

阅读更多

Win7脚本快速修改IP

由于寝室使用闪讯共享上网,时常需要手动修改IP,为了方便快速修改IP,查找资料写了如下的脚本。在Win7环境下将下面代码保存为ip.bat双击运行即可。

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
@echo off
cls
rem //设置变量,可以根据你的需要更改
set Nic1="本地连接"
set Nic2="无线网络连接"
rem //以下依次为IP地址、子网掩码、网关、首选DNS、备用DNS
set Addr=192.168.137.83
set Mask=255.255.255.0
set Gway=192.168.137.1
set Dns1=8.8.8.8
set Dns2=8.8.4.4
rem //以下为第二、三、四个ip和子网掩码、
set Addr2=192.168.137.133
set Addr3=192.168.137.183
set Addr4=192.168.137.233
set Mask2=255.255.255.0
set Mask3=255.255.255.0
set Mask4=255.255.255.0
echo IP地址快速修改工具
echo ┌────────────────────────┐
echo1 设置%Nic1%为【静态IP】作为【主机】 │
echo ├────────────────────────┤
echo2 设置%Nic1%为【静态IP】作为【客户机】 │
echo ├────────────────────────┤
echo3 设置%Nic1%为【动态IP】 │
echo ├────────────────────────┤
echo4 设置%Nic2%为【静态IP】作为【主机】 │
echo ├────────────────────────┤
echo5 设置%Nic2%为【静态IP】作为【客户机】 │
echo ├────────────────────────┤
echo6 设置%Nic2%为【动态IP】 │
echo ├────────────────────────┤
echo7 退出 │
echo └────────────────────────┘
echo ---请选择项目后回车
set /p answer=
if %answer%==1 goto 1
if %answer%==2 goto 2
if %answer%==3 goto 3
if %answer%==4 goto 4
if %answer%==5 goto 5
if %answer%==6 goto 6
if %answer%==7 goto 7
:1
set Nic=%Nic1%
goto StaticHost
:2
set Nic=%Nic1%
goto StaticClient
:3
set Nic=%Nic1%
goto Dynamic
:4
set Nic=%Nic2%
goto StaticHost
:5
set Nic=%Nic2%
goto StaticClient
:6
set Nic=%Nic2%
goto Dynamic
:7
goto end
:StaticHost
echo 正在设置%Nic%为静态IP主机,请稍等...
echo. I P 地址 = %Gway%
echo. 网关地址 = %Gway%
echo. 子网掩码 = %Mask%
netsh interface ipv4 set address name=%Nic% source=static addr=%Gway% mask=%Mask% gateway=%Gway% gwmetric=0 >nul
echo. 首选 DNS = %Dns1%
netsh interface ipv4 set dns name=%Nic% source=static addr=%Dns1% register=PRIMARY >nul
echo. 备用 DNS = %Dns2%
netsh interface ipv4 add dns name=%Nic% addr=%Dns2% index=2 >nul
echo ----
echo 设置全部完成!
ipconfig /all
pause
goto end
:StaticClient
echo 正在设置%Nic%为静态IP客户机,请稍等...
rem //可以根据你的需要更改
echo. I P 地址 = %addr%
echo. 网关地址 = %Gway%
echo. 子网掩码 = %Mask%
netsh interface ipv4 set address name=%Nic% source=static addr=%addr% mask=%Mask% gateway=%Gway% gwmetric=0 >nul
echo. 首选 DNS = %Dns1%
netsh interface ipv4 set dns name=%Nic% source=static addr=%Dns1% register=PRIMARY >nul
echo. 备用 DNS = %Dns2%
netsh interface ipv4 add dns name=%Nic% addr=%Dns2% index=2 >nul
echo ----
rem //下面是设置第二、三、四个ip
echo. 第二个IP地址 = %Addr2%
echo. 第三个IP地址 = %Addr3%
echo. 第四个IP地址 = %Addr4%
echo. 第二个子网掩码 = %Mask2%
echo. 第三个子网掩码 = %Mask3%
echo. 第四个子网掩码 = %Mask4%
netsh interface ipv4 add address %Nic% %Addr2% %Mask2%
netsh interface ipv4 add address %Nic% %Addr3% %Mask3%
netsh interface ipv4 add address %Nic% %Addr4% %Mask4%
echo ----
echo 设置全部完成!
ipconfig /all
pause
goto end
:Dynamic
echo 正在设置%Nic%为动态IP,请稍等...
echo. IP 地址正在从DHCP自动获取...
netsh interface ip set address %Nic% dhcp
echo. DNS地址正在从DHCP自动获取...
netsh interface ip set dns %Nic% dhcp
echo ----
echo 设置全部完成!
pause
goto end

阅读更多

Vim的Tab使用技巧

1. 设定 tab 的位置

1
:set tabstop=4

2. 输入 tab 时自动将其转化为空格

1
:set expandtab

如果此时需要输入真正的 tab,则输入 Ctrl+V, tab,在 Windows 下是 Ctrl+Q, tab

3. 将已存在的 tab 都转化为空格

1
:retab

阅读更多

用Github和Octopress搭建博客

最先玩过网易博客,但是网易博客广告太多(虽然相比同类型的第三方托管博客广告要少很多,这也是最初选择它的原因),同时定制性太差,代码高亮也在部分主题下面也显示得不是太好。后来分别在新浪SAE百度BAE上搭建过WordPress的博客,WordPress有丰富的主题插件资源,但正是由于它功能太过完善,显得它有点庞大,加载速度让我难以接受。

后来得知Github提供有GitHub Pages功能,可以搭建静态博客,然后尝试了一下确实满足了博主们的最大自由性,因为博客的所有源码都是由你管理可以随意修改的。当然,最重要的是Github免费与稳定性并存,有钱购买域名和空间的自然是选择商业的服务器空间更合适,但相对个人作为交流性的博客,GitHub Pages已经足够了。

阅读更多

Ubuntu下SublimeText2的G++和Python配置

如果原本系统已经安装了g++和python2.7,并且配置好了环境变量,那么sublime本身默认的配置文件已经能够满足要求了。但是对于我这个用惯了codeblock的人来说,运行时不能在终端输入是无法忍受的。那么我就希望将sublime配置成codeblock那样跳出终端窗口来显示输出,并且能够输入。不多说,先贴出配置文件。

g++配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"variants":
[
{
"name": "Run",
"cmd":["x-terminal-emulator", "-x", "bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}' ;read -n1 -p 'press any key to continue.'"]
}
]
}

阅读更多

Linux下用Dnw烧写bin镜像(Ubuntu for TQ2440)

我们要用到的工具是C-kermit 和 dnw2。其中C-kermit是串口连接程序。而dnw2是用来向开发板下载程序的。
首先我们安装kermit,我们可以使用#sudo apt-get install ckermit来安装kermit。

下载完成之后还要对其进行配置。

1
#sudo vim /etc/kermit/kermrc

Alt text

阅读更多

基于TQ2440上Linux-2.6.32.59的LCD驱动移植

1.简化LCD时钟计算方法:

修改drivers/video/s3c2440fb.c文件365行左右的函数static void s3c2410fb_activate_var(struct fb_info *info)如下:

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
static void s3c2410fb_activate_var(struct fb_info *info)
{
struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
int type = fbi->regs.lcdcon1 & S3C2410_LCDCON1_TFT;
struct fb_var_screeninfo *var = &info->var;
//修改以下两行
struct s3c2410fb_mach_info *mach_info=fbi->dev->platform_data;
struct s3c2410fb_display *default_display=mach_info->displays+mach_info->default_display;
int clkdiv;
clkdiv = DIV_ROUND_UP(s3c2410fb_calc_pixclk(fbi, var->pixclock), 2);
dprintk("%s: var->xres = %d\n", __func__, var->xres);
dprintk("%s: var->yres = %d\n", __func__, var->yres);
dprintk("%s: var->bpp = %d\n", __func__, var->bits_per_pixel);
if (type == S3C2410_LCDCON1_TFT) {
s3c2410fb_calculate_tft_lcd_regs(info, &fbi->regs);
--clkdiv;
if (clkdiv < 0)
clkdiv = 0;
} else {
s3c2410fb_calculate_stn_lcd_regs(info, &fbi->regs);
if (clkdiv < 2)
clkdiv = 2;
}
//此处修改如下
//fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(clkdiv);
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(default_display->setclkval);
dprintk("new register set:\n");
dprintk("lcdcon[1] = 0x%08lx\n", fbi->regs.lcdcon1);
dprintk("lcdcon[2] = 0x%08lx\n", fbi->regs.lcdcon2);
dprintk("lcdcon[3] = 0x%08lx\n", fbi->regs.lcdcon3);
dprintk("lcdcon[4] = 0x%08lx\n", fbi->regs.lcdcon4);
dprintk("lcdcon[5] = 0x%08lx\n", fbi->regs.lcdcon5);
writel(fbi->regs.lcdcon1 & ~S3C2410_LCDCON1_ENVID,
regs + S3C2410_LCDCON1);
writel(fbi->regs.lcdcon2, regs + S3C2410_LCDCON2);
writel(fbi->regs.lcdcon3, regs + S3C2410_LCDCON3);
writel(fbi->regs.lcdcon4, regs + S3C2410_LCDCON4);
writel(fbi->regs.lcdcon5, regs + S3C2410_LCDCON5);
s3c2410fb_set_lcdaddr(info);
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_ENVID,
writel(fbi->regs.lcdcon1, regs + S3C2410_LCDCON1);
}

阅读更多

完善TQ2440上Linux-2.6.32.59的串口驱动

修改内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件的100行,将其改为:

1
.ulcon =0x03,

修改drivers/serial/samsung.c文件的53行添加如下内容:

1
#include <mach/regs-gpio.h>

然后在397行左右,函数static int s3c24xx_serial_startup(struct uart_port *port)之前添加

阅读更多