Linux 下的无线 AP 配置

介绍在 Linux 下通过无线网卡配置无线的经验。

我使用的网卡是 TL-WN841N,这样的大牌子可以很好的得到内核的驱动支持。
TP-LINK 官方是有在维护他的产品针对 Linux 驱动的。

本文工作发行版使用ArchLinux,不保证其他发行可用,
但除了包管理器的差别外,大部分配置通常是可以通用的。

1) 启用驱动

使用如下命令启用驱动,需要重启:

sudo modprobe ath9k

当然也可以不用重启,但是我这里推荐你所有配置完成以后,还是重启一下比较好。

2) 配置网卡设备名

/etc/udev/rules.d/10.network.rules

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ff:ff:ff:ff:ff:ff", NAME="wlan1"

注意将上述配置中的 ff:ff:ff:ff:ff:ff 替换为你的无线网卡 MAC 地址。

这样配置是由于 systemd 的新命名机制,导致网卡命名不像以前 eth*,而是一串不容易记忆的名称。
这里我们统一配置为 wlan1,方便后面使用。

3) 配置 dhcpd 服务器

因为无线 AP 需要提供 DHCP 服务,供无线设备使用,因此这里需要安装 DHCP。

首先安装 dhcpd 软件包:

sudo pacman -S dhcp

然后我们做一个简单的子网配置:
/etc/dhcpd.conf

1
2
3
4
5
6
7
subnet 192.168.100.0 netmask 255.255.255.0 {
  range 192.168.100.100 192.168.100.199;
  option routers 192.168.100.1;
  option domain-name-servers 8.8.8.8;
  option ip-forwarding off;
  option broadcast-address 192.168.100.255;
}

4) 配置 wireless-ap 服务

这是一个自定义 systemd 服务,用于配置无线网卡并绑定到 dhcp。
最后为其配置 iptables 转发规则。

配置文件如下:
/etc/systemd/system/wireless-ap.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Powered by Zealic, Visit : https://github.com/zealic
[Unit]
Description=Wireless AP
Wants=network.target
Before=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/wireless-ap
ExecStart=/sbin/ip link set dev ${interface} up
ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev ${interface}
ExecStart=/sbin/dhcpd -q ${interface}
ExecStart=/sbin/iptables -t nat -A POSTROUTING -o ${target_interface} -j MASQUERADE

ExecStop=/sbin/ip addr flush dev ${interface}
ExecStop=/sbin/ip link set dev ${interface} down

[Install]
WantedBy=multi-user.target

针对服务的环境配置:
/etc/conf.d/wireless-ap

1
2
3
4
5
interface=wlan1
target_interface=net1
address=192.168.100.1
netmask=24
broadcast=192.168.100.255

记住,target_interface 指的是你可以接入互联网的网卡,你的这个网卡名可能是 eth0 之类的。

完成服务配置以后,我们需要启用服务。

sudo systemctl enable wireless-ap

5) 安装配置 hostapd

hostapd 就是可以让无线网卡工作在 master 模式下的工具了。

首先安装软件包:

sudo pacman -S hostapd

配置 hostapd
/etc/hostapd/hostapd.conf

1
2
3
4
5
6
7
8
9
10
11
12
ssid=YOUR-AP-SSID
driver=nl80211
hw_mode=g
channel=11
interface=wlan1
auth_algs=1
wpa=1
wpa_passphrase=YOUR-AP-PASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
rsn_pairwise=CCMP
ht_capab=[HT40-][SHORT-GI-40][DSSS_CKCK-40]

别忘了把 YOUR-AP-SSIDYOUR-AP-PASSWORD 换成你自己的 SSID 和密码。

启用 hostapd 服务:

sudo systemctl enable hostapd

6) 重启系统

到这里我们已经配置完成无线网卡的 AP,重启系统即可开始使用。

sudo reboot

当然如果你是高级 Linux 用户,完全知道自己在做什么,也可以自己控制卸载网卡并启动服务。

7) 问题

我配置完成可以正常的使用,但是发现使用一段时间后无线 AP 就消失了,整个系统也有些问题,内核经常性的挂起。

关键性报错如下:

长时间工作后 tty 不停的刷如下日志:

kernel: DMA: Out of SW-IOMMU space for 16 bytes at device 0000:00:1d.0

在 tty 中运行任何命令都可能会导致长时间挂起,超时后输出如下错误:

INFO: task blocked for more than 120 seconds.

这句忘了怎么来的了:

ath: Unable to remove station entry for: ff:ff:ff:ff:ff:ff

发生这个问题的原因是由于 Intel 的 64 位支持不太好的原因,
只需要在内核启动参数加上 intel_iommu=off 选项即可。

更新:2013-08-08

确认以上问题不仅仅是内核选项的问题,而是由于我的配置项不完整导致的,
只需要在 hostapd 配置中加入 ht_capab=[HT40-][SHORT-GI-40][DSSS_CKCK-40] 以正确的设定其工作模式就没有问题了。

我已经在上面的配置中加入了此配置选项。

实验下来 AP 运行良好,没有出现导致内核挂起的问题。

参考

Zealic @ 2013-07-06

View Comments |
Categories: tech.posix
Tags:

实战 Gollum

前言

之前就说过想尝试 Gollum,GTD 精神引导我立刻就做。
以下就是我尝试的过程。

安装 Gollum

本来想安装到 Windows 之上的,但是尝试之后,虽然 Gollum 可以安装到 Windows 之上(需要 MinGW 环境)。
但是由于其依赖的 Grit 无法在 Windows 之上工作,参考这里
我也尝试了进行补丁,但是无果~

没办法,只好在 *nix 上尝试 Gollum。
个人习惯使用 Debian,运行以下 shell 代码即可。

1
2
3
4
5
6
7
apt-get install ruby1.9.1-full
# Gollum 依赖的 nokogiri 需要这些才能编译
apt-get install libxml2-dev libxslt-dev
# 最新版本的 redcarpet 无法工作在 gollum 之上,参考本文结尾的:
#   Stackoverflow : Gollum Wiki - undefined method 'new' for Redcarpet:Module
gem install redcarpet --version=1.17.2
gem install gollum

如此即安装完成,这里我新建一个示例仓库来维护:

1
2
3
git init mywiki
cd mywiki
gollum

然后访问 http://localhost:4567 即可访问 gollum 托管的 Wiki。

结语

按照我的设想,Gollum 是用来作为项目开发的文档工具来使用的,并不仅仅作为个人知识管理工具来使用。
至于实际效果么,就得看以后啦~

参考

Zealic @ 2012-04-17

View Comments |
Categories: tech
Tags: Git, Wiki

整理一下最近的思路

关于博客

自从年后了解到 Jekyll 以后,就琢磨着把博客完全迁移到这个平台上面。
上月中旬已经迁移完成,顺便实现了大体的模板框架,利用一些前端 JS 及 HTML5 来改善浏览体验。
此后断断续续的对内容做整理及改进,统一了格式等等,还把一些写心情的文章移走,此博以后就专门发布技术文章及相关内容了。

用上了 Jekyll 的感觉真好,其实之前还看过 Octopress,但是其是按照 Github 的要求来做的,不支持 Jekyll 的插件,而我有很多想要自己做的功能,入博客分页,标签功能等等。
因此就直接在 Jekyll 建博客,写了一些自定义插件,如分页标签什么的,毕竟以前学过一些 Ruby,弄些这个还是小 CASE。

目前还剩下我在博客园的一部分文章没有移过来,弄完就应该了事了。

Amazon Cloud

云计算已经是时代趋势,我也开始在最近跑起了 Amazon EC2,不得不说国外月亮真的很圆,最起码网络如此,在 EC2 上的做 Debian APT 更新时,下载网速峰值能达到 4MB!
因此打算将 Linode 上的 VPS 停掉,以后就用 EC2 了。关于云计算,还需要学很多~

前段时间也试着在 EC2 上面搭建 PPTP、L2TP VPN,由于 EC2 网关只支持 TCP、UDP及ICMP协议,因此工作在第二层的 L2TP 无法工作,而 PPTP 所用的 GRE 协议也在 EC2 上时好时坏,虽然搭起,却是不太稳定,因此又干脆的搭个 OpenVPN 好了,然后自己对 OpenVPNPortable 做了一些改造,并升级到最新的 OpenVPN 2.2.2,绿色版滴哟,现在用起来灰常舒服~

兴趣

现在对 Windows Phone 非常感兴趣,当前用的手机也是这个,已经注册了 Apphub 帐号,打算将自己脑海中的一些应用实现。

然后对于 Qt5 的也非常感兴趣,想要进一步学习,如果 Qt5 有 Python Binding 的话再好不过了, QML 真的是太美了~

文档、WIKI、PKM !?

一直以来想要一个 WIKI 来维护自己的个人知识,先后试过以下软件:

但是上述软件一直都不尽如意,期间也有利用 VCS 来做知识管理的想法,也用 SVN 实施过,但是也放弃了。因此到现在知识想法什么的一直都很散乱。
后来接触到了 Git,了解到了 ikiwikigit-wikiolelo 之后,就觉得这是我一直想要的,简单、方便、直观、自主控制的版本管理;太完美了~
但是却一直没有实施这个想法,现在打算在最近用 Gollum 部署起来,并慢慢把以前散乱在 WinOrganizer、Google Notebook、OneNote 和 Dropbox 中的数据迁移进去~

Git

现在使用 Git 渐入佳境,认为这个最完美的版本控制工具了,哪怕在公司用 SVN 都不爽,要用 git-svn 协同工作才舒服。
自己的各种练手作品和项目也用 Git 管理起来,以及一些环境脚本,常用软件等等。
现在完全不怕数据丢失什么的了,哪怕个人电脑完全毁坏,也就是损失一些无关紧要的数据,关键数据我都用 Git 管理器来,比如常用软件。用 Git 管理并放到 bitbucket,我个人又有绿色软件强迫症,因此仓库中的软件都是精心制作,转为绿色才放进去的,以下就是一些大部头:

  • Cygwin
  • MinGW32
  • VB6、VC6、VC71、VC80、VC90、VC100 的编译环境
  • Python
  • Java
  • Ruby
  • Perl
  • Git

这些在到新环境的时候,都不用到处下载安装,只要 pull 下来仓库,运行其中的部署脚本而已。家里和公司中可以随时同步成相同的工作环境。

结语

这篇文章完全使用 Notepad2-mod 写的,纯文本写文章的感觉真好,脱离了 Live Writer,整个世界都清新了起来!

此博近乎两年未更新,很多学到的东西都没记录下来,以后要勤于写博,总结经验,以前常听好记性不如烂笔头,这个确实是真的~

Zealic @ 2012-04-17

View Comments |
Categories: @default
Tags: 云计算, VPN, Git

Windows 下使用 Nginx+Mono 部署 ASP.Net

自 Mono 1.9 以来,ASP.Net 也能通过 Mono 的 fastcgi-mono-server2 在 FastCGI 下运行了,更为可贵的是,Mono 兼容 Windows ;我们可以在 Windows 下利用 lighttpd、nginx 或 Apache 等服务器上部署 ASP.Net。

我将 Mono for Windows 的 FastCGI-Mono-Server 提取出来,你可以 猛击这里 下载。

而 Nginx 目前也支持 Windows,是部署 Web 服务器的一个非常不错的选择,你可以在 Nginx 的官方网站找到下载。

下面是我对 Nginx nginx.conf 的配置,第 25 行属于关键内容。

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
worker_processes  1;
error_log  logs/error-debug.log info;

events {
  worker_connections  1024;
}

http {
  include         mime.types;
  default_type    text/plain;
  sendfile        on;

  keepalive_timeout 65;
  index  index.html index.htm;

  server {
    listen       80;
    server_name yourdomain.com;
    index index.aspx default.aspx;

    location / {
      root   D:/www/yourwebapp;

      fastcgi_pass   127.0.0.1:8000;
      fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
      include       fastcgi_params;
    }
  }
}

然后将上面的 FastCGI-Mono-Server 提取出来,所有文件全部注册到 GAC(否则 Web 应用会找不到他们,当然你也可以直接放到 webapp/bin),然后解压到某个文件夹,这里假设为 D:/FastCGI-Mono-Server。

之后我们就可以按下列命令运行 FastCGI:

1
fastcgi-mono-server2 /socket=tcp:127.0.0.1:8000 /root="D:/www/yourwebapp" /applications=yourdomain.com:/:. /multiplex=True

最后执行运行 Nginx 服务器,我们的 ASP.Net 程序就能脱离 IIS 这个臃肿的家伙运行啦!!!

Zealic @ 2010-04-01

View Comments |
Categories: tech.dotnet
Tags:

一种版本化的数据库脚本管理机制

现今开发的软件当中,多数系统的数据都是基于数据库存储的,但是由于软件变化的复杂性,相对于维护代码,数据库架构的版本并不是那么好维护。

这里本人针对实际情况,理想化出一种可以清晰理解的数据库架构脚本的版本控制机制。

请先看目录树:

Example.DataSchema
├─V1.0
│  ├─Common
│  │      001.Create.Table.Product.sql
│  │      002.Create.Table.User.sql
│  │      003.Create.Table.Feedback.sql
│  │      004.Create.Table.Role.sql
│  │      005.Create.Function.FN_GetlProductCode.sql
│  │      006.Create.Function.USP_CleanFeedback.sql
│  │
│  ├─Enterprise
│  │      001.Create.Table.Highland.sql
│  │
│  └─Professional  
│          001.Create.Table.Lowend.sql
│
├─V1.1
│  ├─Common
│  │      001.Alter.Table.User.sql
│  │      002.Alter.Function.FN_GetlProductCode.sql
│  │      003.Drop.Function.USP_CleanFeedback.sql
│  │
│  ├─Enterprise  
│  │      001.Alter.Table.Highland.sql
│  │  
│  └─Professional
│          001.Alter.Table.Lowend.sql
│
└─V2.0
    ├─Common
    │      001.Alter.Table.Product.sql
    │      002.Alter.Table.User.sql
    │      003.Create.Function.USP_CheckProduct.sql
    │
    ├─Enterprise
    │      001.Create.Table.Overland.sql
    │
    └─Professional
            001.Alter.Table.Lowland.sql
            002.Create.Table.Notebook.sql

相信上面的目录结构还算明了,我们可以根据软件的版本追溯数据库,而不是通过版本控制工具来追溯原始数据库,而数字序号的前缀,更指明了脚本执行顺序,再也不用因为在建立数据库时受到依赖/外键关系的原因而运行脚本失败了。整个层次非常清晰,头脑通透的 Coder 相信可以一看便明了。

版本目录下有三个文件夹:Common, Professional, Enterprise,分别代表一个产品的三个定制化版本,因为软件中可能有这样的需求,软件基本结构不变,但是使用提供者模式提供了多个定制化版本,每个提供者的数据库结构基本相同,但是又有极少的差异。通过上面的这种管理机制,可以避免在源代码控制系统中开分支来维护,从某种程度上来说,提高了一定的可维护性。

这种管理机制类似于 ROR,不过 ROR 更 OO 一些,还能够隔离特定数据;通过这种机制,我们可以结合 RikMigrationsMigrator.NET 进行自动化的数据库升级(需要编码)。

Zealic @ 2009-07-29

View Comments |
Categories: tech.database
Tags:

数据迁移记

昨天买了块 WD 1TB(黑) 硬盘,之后将原硬盘数据导入,现将所得经验记录在此。

环境如下:
三块硬盘,分别为希捷80G,希捷 160G(SATA),WD 1TB(SATA)
工具:Win7PE(内置 Ghost, DiskGenius, FastCopy 等工具)

开始挂上 WD 硬盘打算分区时,电脑死机,经排查发现是电脑的电源不够强力,只能挂两块硬盘(以后要买强力电源啊);之后在 U 盘中装上 Win7PE,引导进入系统,格式化,分区,拷数据,摘录以下注意事项:

  • 使用 drvload 装载驱动,我的主板启动的 Win7PE 无法识别 SATA 硬盘,必须安装驱动, Win7 自带的 drvload 命令可以装载驱动,
    因此我将我主板 SATA 驱动提取出来,使用该命令加载,识别成功。
  • 不要使用 DiskGenius 进行数据迁移,我使用 DiskGenius 的分区拷贝功能迁移数据时,因为修改了目标硬盘的一个分区,导致蓝屏,因此建议不要使用硬盘操作来进行数据迁移。
  • 使用 FastCopy 进行数据迁移,该软件能够发挥硬盘的最佳效能。
  • 分区不要太多,整个系统可见分区以六个以下为佳。(单硬盘)
  • 设一个极小的引导分区,为方便以后引导和维护系统。
  • 迁移数据时,尽量不要太快删除原有数据,待新数据稳定运行一段时间后再考虑删除,以避免硬盘故障。
  • 使用足够强劲的电源,避免因挂载过多的硬盘导致供电不足而蓝屏死机。
  • 信春哥,得永生。

我的硬盘分区如下:

  • [WOST_AOE] C: // 系统分区
  • [WOST_BAR] D: // 工作分区,如程序代码,程序产生的数据,下载,交换文件 (频繁修改)
  • [WOST_JET] E: // 程序、游戏、电影、音乐 、资料(极少修改)
  • [WOST_ZIP] F: // 程序、压缩包、光盘镜像等内容的备份(不会修改)

估计不久(大概5年内),基于 DOS 的 16 位引导系统维护方式将会消失;而那时,WinXP 也将会死去,Win7 将会成为下一个统治者。

而 Chrome OS,很遗憾,虽然有很多的 Geeker 和狂热者在使用它,但依然无法撼动 Windows 的地位。

Zealic @ 2009-07-28

View Comments |
Categories: @default
Tags:

MSBuild 简解

从最原始的编译器,逐渐到 Shell 命令组合、Make工具,到现在的针对性 Build 工具,Rake、Ant、MSBuild,甚至于 PowerShell 这样的工具;都为我们软件开发以及系统管理做出了贡献,我甚至不能想象几十年前使用编译器生成程序的复杂步骤(其实就是把 makefile 拆开,相当恐怖)。

探讨 Make、Ant 以及 MSBuild 无太多意义,甚至从纯技术和扩展性上来说,我认为 MSBuild 弱于 NAnt,但是软件并不是这么简单,之所以深研 MSBuild,M$ 作为后盾让人信任的无奈。

本文主要讲述 MSBuild 的基本概念,以及如何使用它辅助开发。

首先我们来看一个最简单的 Build:

1
2
3
4
5
6
7
8
9
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Welcome>Hello MSBuild!</Welcome>
  <PropertyGroup>

  <Target Name="Build">
    <Message Text="$(Hello)" />
  </Target>
</Project>

假设我们把这个文件保存到 D:\build.proj,然后在命令行切换工作目录到 D:,运行 msbuild.exe (msbuild 默认直接运行当前目录下的 *.sln 或 .proj 文件),则命令行将会显示详细的 build 信息,当然也包括我们的消息 'Hello MSBuild!' 。

概念

Project

Project 代表一个 Build,有属性 ToolsVersion、DefaultTargets、 InitialTargets,分别为 依赖的 MSBuild 版本、默认 Build 目标,初始化目标。

Property

Property 是 MSBuild 中的基本单元,可以理解为变量,我们可以在大多数地方使用它作为 Task 的参数以完成我们预期的目标。
下面的语句示范如何声明 Property:

1
2
3
4
<PropertyGroup>
  <Name Condition="$(Name) == ''">Kate</Name>
  <WorkPath>D:\Workspace</WorkPath>
</PropertyGroup>

这里定义了两个 Property,我们可以使用 $(Name) 和 $(WorkPath) 来引用它们,就和前面的范例一样。
Property 可以使用 MSBuild 的 /p 参数定义,这里就使用 Condition 属性判断是否存在外部 Name,如果不存在则使用自定义的 "Kate"。

Target

Target 是 Build 的基本单元,也对应 MSBuild 的 /t 参数,可用参数有 DependOnTargets,代表依赖的目标。

Task

Task 即任务,Build 的过程就是若干 Task 的执行。上面的 就是 MSBuild 内置的一个 Task,Text 则是参数。
Task 可以使用 Condition 属性。
通常情况下,MSBuild 自带的 Task 并不够用,有以下 MSBuild 扩展,可以几乎不需要自己写扩展:

Item

我们可以简单的把 Item 理解为 .Net 中的 Dictionary> 类型,内层的字典被称作元数据表。

1
2
3
4
5
6
7
8
9
10
<ItemGroup>
  <Table Include="A;B;C;D" />
  <Game Include="StarCraft" />
  <Game Include="WarCraft" />
  <Game Include="CoderCraft" />
  <Program Include="MyApp">
    <Developer>Zealic</Developer>
    <Timestamp>2009-01-01T11:22:33</Timestamp>
  </Program>
</ItemGroup>

为方便理解,我们可以用 C# 来表述上述内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var Table = new Dictionary<string,Dictionary<string,string>> {
  {"A", new Dictionary<string,string>()},
  {"B", new Dictionary<string,string>()},
  {"C", new Dictionary<string,string>()},
  {"D", new Dictionary<string,string>()}
};
var Game = new Dictionary<string,Dictionary<string,string>> {
  {"StarCraft", new Dictionary<string,string>() },
  {"WarCraft", new Dictionary<string,string>() },
  {"CoderCraft", new Dictionary<string,string>() }
};
var Program = new Dictionary<string,Dictionary<string,string>> {
  { "MyApp", new Dictionary<string,string> { 
      {"Developer", "Zealic"},
      {"Timestamp", "2009-01-01T11:22:33"}
    }
  }
};

和使用 Property 不同,Item 有如下用法:

  • @(Table)
    直接传递 Item 或展开为 A;B;C;D (视 Task 参数类型而定)。
  • @(Table, '+')
    以指定的分隔符展开 Item,结果为 A+B+C+D
  • @(Table -> '%(Identity).dll')
    转换 Item 为 A.dll;B.dll;C.dll;D.dll
  • %(Program.Developer)
    引用 Program Item 的元数据 "Developer";此外,以这种方式使用 Item 都会导致循环所有 Item 成员。比如 <Message Text="%(Game.Identity)"/>,会导致三次 Task 调用,分别输出 StarCraft, WarCraft 以及 CoderCraft;Identity 代表 Item 的名称,有关 Item 的更多预定义元数据,请参考 MSDN

Item 可以使用 Condition 属性。

结语

可能有人会问,既然 MSBuild 和批处理能做的事都差不多,为什么不直接使用批处理呢?

有以下几点原因:

  • 与 .Net Framework 紧密集成。
  • 易于扩展:你可以使用任何 CLR 上的语言编写 MSBuild Task 进行扩展。
  • 高效率:多个解决方案/项目可以在一个解决方案中编译,甚至支持多核下的并行编译。
  • 利于诊断:MSBuild 可扩展的日志系统使得 build 过程几乎和白盒没有区别,你可以看到 build 的每一步细节。这也是 VS2003 转到 VS2005 之间最大的转变 - IDE 对编译过程的感知从黑盒转变到白盒。

此外,利用众多第三方 Task,MSBuild 可以完成诸如持续集成、管理服务器、自动化部署等任务,解放我们的时间,让我们可以有更多的时间 Coding 或偷懒 -_-。

了解到这些内容以后,聪明的读者,你是否已经打开一个正在开发的项目的 *.csproj 文件,用文本编辑器看看 MSBuild 究竟有什么魔法呢?

PS:文章写的比较简单,不够全面,有问题请给我妹儿 Zealic ,我将详细为你解答。或访问我的 Twitter,里面有不少小技巧。

Zealic @ 2009-3-28

View Comments |
Categories: tech.dotnet
Tags:

发散性碎片(2008-12-29)

MSBuildExtensionPack

MSBuild 一直都是 .Net 下 Build 工具的不二选择,可怜开源社区的 NAnt 几乎已经被彻底遗忘。而 MSBuild 则在蓬勃的发展。

如果老兄你对持续集成 Very 的有兴趣的话,那么如果你不会 MSBuild 的话,我只能拍着你的肩膀说一声:老兄,你真的太老了;让来我们看看 MSBuild 的未来。

Visual Studio 中的众多项目都是基于 MSBuild 的构建,包括 CodeAnalysis,OfficeTools,ReportingServices,WebApplications 以及 Workflow 等等,有兴趣的同学完全可以翻开 C:Program FilesMSBuild 目录研读一番。

有一个例外,Visual C++ 项目在 VS2003、VS2005、VS2008 是基于自己的构建方式,但是这一情况在 VS2010 中将彻底改变为基于 MSBuild 的构建方式,同时 Visual C++ 项目的智能感知数据库也会基于 SQLCE,而非以前的 .ncb (这是什么格式,Structured storage ??)。

最后,Novell 的 Mono 项目也有一个 MSBuild 的克隆 - xbuild,好吧,我承认它是一个半成品。就目前来说,Mono 真的只是玩具,完全承担不起平台的重任 - 它实在太不稳定了~~

扯远了,我们来说正题,今日在网上闲逛,发现了一个新的关于 MSBuild 的扩展项目,之前我们有这样的扩展项目可以用:

如果你的团队很大的话,SDC 是不错的选择,因为它的 TFS 集成度很好,而 Community Tasks 则提供了一大堆功能给你用,无论是模板还是 XML 操作,或生成 AssemblyInfo.cs ,都是手到擒来。

而现在呢,我们有一个新的扩展 MSBuildExtensionPack,它更加强大(感觉像在看龙珠漫画似的,没有最强,只有更强),在这里我就厚脸皮的直接摘抄介绍过来哈:

The MSBuild Extension Pack 3.5.1.0 release provides a collection of over 230 MSBuild tasks.
A high level summary of what the tasks currently cover includes the following:

  • System Items: Certificates, COM+, Console, Date and Time, Drives, Environment Variables, Event Logs, Files and Folders, GAC, Network, Performance Counters, Registry, Services, Sound
  • Code: Assemblies, CAB Files, Code Signing, File Detokenisation, GUID’s, Mathematics, Strings, Threads, Xml, Zip Files
  • Applications: BizTalk 2006, Email, IIS6, IIS7, MSBuild, SourceSafe, SQL Server 2005, SQL Server 2008, StyleCop, Team Foundation Server, Visual Basic 6, WMI

这样众多的 Task 如果配合 Windows PowerShell 以及 CC.Net,只要你的团队或者 PM 不是烂的过分,在这些工具的帮助下,效率肯定直线上升,您的项目奖金也唾手可得啦。:)

MessageBox

通常看到 MessageBox 弹出时,如果需要其中的信息,一般用手打或者用 Spy++  取其中的文字。结果现在才发现,MessageBox 支持 Ctrl+C,即复制功能,直接复制文本到剪切板。

是我孤陋寡闻,还是地球人都不知道?

Subversion 的 log.c 错误

使用 svnserve 作为 Subversion service 时,查看日志时可能会出现 ..libsvn_reposlog.c 这样的错误,这时只要在你的 authz 配置中加上 * = r 即可。

参考 :http://www.nabble.com/Show-Log-Error-td19145692.html

Zealic @ 2008-12-29

View Comments |
Categories: tech
Tags:

Google Toolbar 5

Google Toolbar 5 已经发布正式版,并且自动更新到我的计算机上,兼容性和 TheWorld 没有问题,以下是新功能:

  • 在线保存配置,现在可以把你的 Toolbar 的配置保存在 Google 上,这样在异地使用 Toolbar 时,将有一致的体验,再也不用在其他地方使用电脑时重新配置 Toolbar 了。
  • 新的选项 UI,比以前漂亮多了。
  • 自动填表,很多浏览器都有的功能,当然 - IE 没有。
  • Google Notebook 功能集成,功能和 Firefox 的 Google Notebook 插件完全相同。

总的来说,感觉不错,唯一的缺点就是似乎比老版本速度慢了那么一点。

另外 Firefox 的 Google Toolbar 5 依旧在 Beta 中。

Zealic @ 2008-12-28

View Comments |
Categories: @default
Tags:

简析 Google Gadget 的数据丢失原因

崇尚 GTD 的人不少,诸如 TodoList 和便签之类的工具也有很多人使用,但我听说很多人使用 Google 提供的 TodoList Gadget 以及 Sticky Note Gadget 时,丢失过数据,之后就再也不使用了,出于某种目的,我研究了下其中的原因。

试用过  iGoogle 的人都应该知道 iGoogle 可以在线保存配置。这样在其他地点使用 iGoogle 时,还能保持 Gadgets 不变,同时 iGoogle 也提供导出配置为 xml 的功能,我通过查看其 XML 的格式,发现诸如 TodoList Gadget 以及 Sticky Note Gadget 这样的 Gadget 皆是将数据保存在 iGoogle 的配置中的 --- API 允许这么做。

因此,得出的结论是:使用 iGoogle TodoList Gadget 以及 Sticky Note Gadget 时,必须小心留意你的配置文件,无论是删除 Gadget 还是还原、清空备份文件,都会导致你的 Gadget 数据丢失。

其实,要用 TodoList 的话,Remember The Milk 是不错的选择。

Zealic @ 2008-12-24

View Comments |
Categories: tech
Tags: