Wednesday, October 27

在MacOSX Server上编译,安装使用NGNIX

MacOSX自带Apache服务器,如果是MacOSX Server的话,所带的Server Admin图形界面的管理器很好用,可是他的Proxy管理功能比较弱,必须修改直接去修改conf文件,如果有virtual host的需求不好对应。所以经多简单的调查,决定使用ngnix。ngnix的好处网上有很多介绍,下面主要考虑如何安装到macosx上,找到一篇很好的介绍文章Compiling Nginx on OS X Leopard in 5 minutes
按照这篇文章所诉的步骤,可以很简单地编译安装最新版的ngnix
  • 首先编译PCRE 到官方网站上下载最新版的代码,现在是8.10,解压缩以后,通过terminal进入代码的目录编译

$ cd pcre-8.10
$ ./configure --prefix=/usr/local
$ make
$ sudo make install

  • 下载最新的nginx源代码,下载是nginx-0.8.53,解压缩以后,通过terminal计入代码目录,编译安装
$ cd nginx-0.8.53
$ ./configure --prefix=/usr/local --with-http_ssl_module
$ make
$ sudo make install

  • 设置PATH。一般缺省的mac安装里面nginx所在的目录/usr/local/sbin不会被包含在PATH里面的,一般which ngnix也是没有结果的,可以这样先export PATH就可以找到了。如果希望机器一启动PATH就设置好了,可以将下面这行加入~/.profile文件里。
$ export PATH=$PATH:/usr/local/sbin
  • 尝试启动ngnix,使用safari访问一下http://localhost, 看看是否可以看到
Welcome to nginx!

  • 启动和关闭的命令
$ which nginx
/usr/local/sbin/nginx
$ sudo nginx
$ sudo nginx -h
nginx version: nginx/0.8.53
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file

$ sudo nginx -s stop
  • 设置conf文件。nginx的配置文件位于/usr/local/conf/nginx.conf, 用编辑器打开,编辑之。我需要一个静态文件服务,一个redirect和一个proxy pass,那就类似下面的写法
server {
listen 80;
server_name cn.bbshare.com;
access_log logs/cn.bbshare.com.access.log;
index index.html;
root /Users/myname/CNWebserver;
}
server {
listen 80;
server_name ja.bbshare.com;
access_log logs/ja.bbshare.com.access.log;
rewrite ^(.*) http://www.yahoo.com:80$1 permanent;
}
server {
listen 80;
server_name redmine.bbshare.com;
access_log logs/redmine.bbshare.com.access.log;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}

Friday, September 24

windows 2008 backup script

WBADMIN start backup命令居然会覆盖制定的备份目标文件夹,这样每次只有最近的一次备份留了下来,这有什么意义呢? 如果是在备份开始的前一刻系统发生故障,备份下来的也是失败的版本! 为什么ms没有提供apple的time machine呢???
参考各种网站的建议,得到下面的脚本,他可以备份最近一周的脚本,分别放到week1到week7的目录里,适当修改一下可以备份任意期间的系统。
让task schedule每天自动执行backupsystem.bat就OK了。

主脚本:BackupSystem.bat

@echo off
::BackupSystem.bat
::demonstration script using WBADMIN.EXE on a
Windows Server 2008 Server

rem backup share UNC
set backupshare=\\mycompany-dc01\Backup

rem files and folders to include
set include=c:,d:

rem define date time variables for building the folder name
set m=%date:~5,2%
set d=%date:~8,2%
set y=%date:~0,4%
set h=%time:~0,2%
set min=%time:~3,2%
set sec=%time:~6,2%
FOR /F "tokens=*" %%A IN ('CSCRIPT c:\temp\WEEK.VBS //NoLogo') DO SET %%A

rem defining a new folder like \\mycompany-dc01\backup\RESEARCHDC\20091215_132532

set newfolder=%backupshare%\%computername%\Week%Week%

echo Creating %newfolder%

mkdir %newfolder%

rem run the backup
echo Backing up %include% to %newfolder%

wbadmin start backup -backuptarget:%newfolder% -include:%include% -vssFull -quiet

rem Clear variables
set backupshare=
set include=
set m=
set d=
set y=
set h=
set min=
set sec=
set newfolder=



星期取得脚本:WEEK.VBS
Wscript.Echo("Week=" & DatePart("w",Date,vbMonday,vbFirstJan1))

Tuesday, September 21

applicationHost.config 的损坏

IIS7一个很弱智的设计就是将所有的host信息保存在applicationHost.config这样的文件里
这个文件位于%windir%\system32\inetsrv\config\目录下,里面保存了IIS里面的各种app信息。
公司的sharepoint有一个周1,突然不能启动了,调查发现是IIS里面的信息消失了,IIS启动失败,看log就是这个applicationHost.config文件的错误。经过千辛万苦,用了一上午尝试手工重建这个applicationHost.config文件,最终根据以前的备份,修复成功了。这是万幸。这是半年前发生的故障了,当时前一个周末,公司大厦做了停电维修,我们的服务器没有UPS保护,不知什么原因导致这个applicationHost.config发生了错误。按理说作为系统的重要文件,OS有责任保证这种情况下不出问题的。

备份,备份,是唯一的手段。虽然ms的backup也不是那么好用!

Windows 2008 Backup Schedule ERROR: 2147942402

Windows Server 2008的备份功能居然不是缺省安装,需要手工安装上。
自动schedule backup的wizard无法选择备份目的为一个文件夹,只能选择分区,选择分区以后则会问你是否要全部格式化,这真是一个无理的选择。
解决办法是用命令行
wbadmin start backup -backupTarget:\\127.0.0.1\backupfolder -include:e:,d:\mountpoint,\\?\Volume{cc566d14-44a0-11d9-9d93-806e6f6e6963}\

可你要就这样把此命令行加入windows的schedule定时执行程序里,就会收到如下的信息:
タスク スケジューラは、タスク "\system backup" のインスタンス "{24f661d8-534e-4415-8dc6-a784d61ca0fc}" の操作 "WBADMIN START BACKUP" の起動に失敗しました。追加データ: エラー値: 2147942402。
问题发生的缘由不得而知,解决办法是修改你的task
执行的程序写全路径:C:\Windows\System32\wbadmin.exe
参数是start backup -backupTarget:\\127.0.0.1\backupfolder -include:e:,d:\mountpoint,\\?\Volume{cc566d14-44a0-11d9-9d93-806e6f6e6963}\



Thursday, August 12

iPhone4的震动部件需要锻炼

iPhone4的震动功能太弱,就放在手边,震动起来都感觉不到,搜索了一下,遇到同样问题的人很多,有的人遇到根本不振的问题。
解决方案居然是找个软件训练一下,这个软件的名字叫:iBrate,用免费版本就好了,放在那里震几分钟。居然就有修好的。
世界真奇妙,iPhone4的BUG就是多

iphone4的感光BUG

iphone4有重大BUG,问题应该来自感光部件或者相关的程序,同使用的case也有关。

症状1:接打电话时,要么屏幕不自动关闭,脸会接触到屏幕上的按钮,要么屏幕常暗,手动无法按按钮
症状2:环境的光线变化时,屏幕的亮度随之改变需要的时间远远超过3GS的1,2秒,达到10秒以上

iphone4感光部件的调整,导致一些老的case,特别是上部太宽的case无法继续使用。表面的涂装层可能也有问题。

Tuesday, August 10

添付忘れ,outlook 忘记附件

虽然已经很久不用outlook了,找到以前写的代码,怀念以下

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=8&topic=23826

使い方:
1:下記のソースをOutlook2003->ツール->マクロ->Visual Basic 
Editor->ThisOutlookSessionに入れてください。
2:ツール->マクロ->セキュリティー>セキュリティレベルを「中」または「低」に
設定してください。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim strSubject As String
Dim strBody As String


strSubject = Application.ActiveInspector.CurrentItem.Subject '件名
strBody = Application.ActiveInspector.CurrentItem.Body '本文

'件名がありませんか
If Trim(strSubject) = "" Then
If MsgBox("このメッセージには件名がありません。本当に送信しますか?", vbYesNo + vbExclamation) = vbNo Then
Cancel = True
Exit Sub
End If
End If

'添付ファイル忘れてませんか
If InStr(strSubject & strBody, "添付") > 0 And Application.ActiveInspector.CurrentItem.Attachments.Count = 0 Then
If MsgBox("添付ファイル忘れてませんか? 本当に送信しますか?", vbYesNo + vbQuestion) = vbNo Then
Cancel = True
Exit Sub
End If
End If

End Sub

[ メッセージ編集済み 編集者: 重粒子 編集日時 2005-10-13 18:56 ]

Monday, August 2

mac os下安装redmine+mercurial+apache+ldap

如果只是简单地希望安装redmine+apache的话,那么就去下载bitnami::redmine,安装使用是非常的轻松。
如果认证方式想使用ldap,那就需要周折一番了。mac自带的apache就没有支持ldap认证,bitnami也没有。我们只能自己重新编译apache一条路可以走。按照找的这个参考指南
1,首先下载指定版本的mac版的apache代码,我将其放在了/Downloads/下

2,在console下做编译之前的准备工作
./configure --prefix=/Downloads/httpd-2.2.11/usr/local/apache2 --enable-mods-shared=all --enable-ldap --enable-authnz-ldap --enable-ssl --with-included-apr --with-ldap --enable-proxy


3,开始编译
make; make test; make install


4,拷贝得到的apache2版本到bitnami的redmine,取代原来的apache2,记得暂时不要删除原来的版本,因为需要拷贝几个配置文件过来,主要是conf下的httpd.conf和ssl.conf。
然后在使用./ctlscript.sh restart apache的时候,看看是否成功。主要是httpd.conf里面有的module找不到的话,那就注释上。

5,配置httpd.conf到支持ldap
首先增加如下两行到LoadModule的区域,
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so


然后设置目录认证方式,类似


ScriptAliasMatch ^/hg/test(.*) /repository/mercurial/test/hgweb.cgi/$1
ScriptAliasMatch ^/hg/project1(.*) /repository/mercurial/project1/hgweb.cgi/$1

<LocationMatch ^/hg(.*)>
AuthType Basic
AuthName "Welcome to HG Server"
AuthBasicProvider ldap
AuthzLDAPAuthoritative on
#AuthLDAPBindDN uid=testaccount1,cn=users,dc=myserver,dc=sample,dc=com
#AuthLDAPBindPassword [plaintext password for user 'testaccount1']
AuthLDAPURL ldap://127.0.0.1/dc=myserver,dc=sample,dc=com
require valid-user

Order allow,deny
Allow from all
Options ExecCGI

</LocationMatch>

上面的操作使得mercurial代码库出于LDAP认证的保护之下。在redmine里面也可以简单地设置LDAP认证,方便的很

删除所有的.svn目录


// You did a checkout when you really wanted to do an export.
// Now there are tons of .svn folders in your project, and you need them to go away.
// Shell scripting to the rescue.

// Credit: Zed Shaw, at the Mongrel mailing list.

find . -name ".svn" -exec rm -rf {} \;

Tuesday, July 13

水银代码管理

这几天学习了Mercurial这个代码管理工具,一点心得记录下来。
首先是代码管理工具的选择,现在流行的主要是svn,git和Mercurial了。用了svn好几年了,不满还是很多的,不再一一细说,考虑换得话,就上网找资料看看大家的说法,这篇翻译文章《Git 與 Mercurial 的分析》写得不错,没什么好说的,跟着google走,准没错。这几篇文章值得细看《Mercurial - 分布式版本控制系统》《分布式版本控制系统——Mercurial》,《在Google Code上用 Mercurial 取代 Subversion 管理你的项目

我使用的是mac osx snowleopard,在这上面Mercurial的安装比较容易,但是也遇到一些挫折
1)安装,到官方网站下载安装包,安装之。
2) 安装MercurialEclipse, 今后就用Eclipse这个强大的GUI管理代码了,同时还可以兼顾svn和git
3)将我的svn库转换到Mercurial,参见攻略。这时候遇到了问题,见解决办法


有趣的障碍是,很多文章里说需要修改.hgrc这个文件,可是他在哪呢???,找遍硬盘也没有,其实自己建立一个叫.hgrc名字的文本文件就好了,放在/Users/yourname

刷DD-WRT成功,step by step

按照各位大王的暗示,一阵研究,在mac下刷DD-WRT成功
1,首先去  http://www.dd-wrt.com/site/support/router-database
输入自己的无线路由器的型号,我的是 whr-g54s,找到了相应的设备
看一下FLASH大小,我的是 4 MB,据说如果是2M,就要下载micro和mini版本,4M可以下载标准版,
标准版还有多个选择,什么usb,voip和vpn,我选择了 Standard Generic dd-wrt.v24_std_generic.bin,下载

2,恢复无线路由器的出厂状态,按住reset一会,据说30秒,我感觉5秒不到他就回复了

3,联网线,从路由器的lan口(注意不是wan口)到电脑,设置网卡IP,至192.168.11.2,mask255.255.255.0,router:192.168.11.1
,用http连上路由器,确认一下原厂管理界面,留恋一下

4,开两个terminal,一个ping 192.168.11.1按回车(mac的ping不像windows会只ping4,5次,它会一直ping下去), 另一个输入tftp -e 192.168.11.1,先不按回车

5,拔路由器电源,然后再接上,看ping的窗口,一旦发现ping通了,在另一个tftp窗口的窗口,立即按回车,然后粘贴下面的命令put dd-wrt.v24_std_generic.bin
这将下载好的firmware刷入路由器,结束以后会看到类似Sent 3710976 bytes in 13.2 seconds这样的文字


macbook-pro:g$ tftp -e 192.168.11.1
tftp> put dd-wrt.v24_std_generic.bin
Sent 3710976 bytes in 13.2 seconds
tftp>



6, 经过路由器检测灯的一顿闪,似乎成功了,将网卡IP改为192.168.1.2,router:192.168.1.1
http://192.168.1.1/
成功,看到了要求设置用户名和密码的窗口,找个好记的输入,成功
进入admin页面,改变language,改成简体中文,应用之,这一步 safari会出错,用firefox没问题

7,到无线页面,设置ssid,和安全密码,我选的安全模式是wpa personal,接好wan端的网线,打开浏览器(这时候firefox居然上不了网,关闭,重新打开),上网成功

8,测速:我这里下载速度 14.30Mbps (1.787MByte/sec),上传速度19.26Mbps (2.407MByte/sec)
直接用网线的速度是下载 22.11Mbps (2.763MByte/sec),56.63Mbps (7.079MByte/sec)


刷路由器之前最好也测试一下,我忘记了,所以没法比较到底哪里好


接下来怎么玩?听听大家的

[iphone]Code Sign error: Provisioning profile XXXX can't be found

如果你更新了profile,再编译iphone项目,发现下面的错误,那你无论如何clean也不会成功,那真是让人恼火阿







这时候,先copy上面那行出错信息,然后关闭这个项目,打开 finder到你的项目文件xxxx.xcodeproj上面按鼠标右键,选择Show Package Contents菜单,在新打开的finder的,找到project.pbxproj,使用一个文本edit打开它,用查找功能找到所有的有那行编码的位置,删除那一行,至少应该有两个地方







删除以后,保存这个 project.pbxproj 文件,用xcode重新打开你的项目,再编译一下试试

[iPhone]command /usr/bin/codesign failed with exit code 1

如果你在编译iPhone App的时候遇到command /usr/bin/codesign failed with exit code 1

可以确认以下的步骤,打开Keychain Access,找到你的开发者key,Get Info,看一下Access Control这个Tab,选择allow all applications to access this item。再重新编译一下,试一下,看看是否OK了


如何在Tab Bar Controller里面使用ABPersonViewController

如果你想将ABPersonViewController嵌入一个Tab Bar Controller里作为一个Tab,就像下图,该如何作呢?



Step By Step

1:制作xib的时候,不要在相应的tab里加入view controll,如下图:


2,创建自己的NavigationController,继承自UINavigationController,加入ABPersonViewControllerDelegate的protocol


@interface ProfileNavigationController : UINavigationController {


}


3,在自己的NavigationController里面相应 -(void)awakeFromNib,这个方法在xib被调入内存的时候,会被执行,在其中调用 initWithRootViewController,就可以将需要的ViewController显示出来。




-(void)awakeFromNib


-(void)awakeFromNib
{
NSLog(@"bundleLoader waked");
// Fetch the address book
ABAddressBookRef addressBook = ABAddressBookCreate();
// Search for the person named "Appleseed" in the address book
CFArrayRef people = ABAddressBookCopyPeopleWithName(addressBook, CFSTR("Appleseed"));
// Display "Appleseed" information if found in the address book
if ((people != nil) && (CFArrayGetCount(people) > 0))
{
ABRecordRef person = CFArrayGetValueAtIndex(people, 0);
ABPersonViewController personPicker = [[[ProfileViewController alloc] init] autorelease];
personPicker.personViewDelegate = self;
personPicker.displayedPerson = person;
// Allow users to edit the person’s information
personPicker.allowsEditing = YES;

[self initWithRootViewController:personPicker];
}
else
{
// Show an alert if "Appleseed" is not in Contacts
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Could not find Appleseed in the Contacts application"
delegate:nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];
[alert show];
[alert release];
}
CFRelease(addressBook);
CFRelease(people);
}