Thursday, May 28, 2009

Installing MySQL 5.4.0 on Cygwin

First of all, it was an installation from source.

./configure
make
make install

The commands above didn't work.

A try:
./configure
make
......
gcc -DHAVE_CONFIG_H -I. -I../../include -I../../include -I../../include -O3 -MT readline.o -MD -MP -MF .deps/readline.Tpo -c -o readline.o readline.c
In file included from readline.c:54:
readline/readline.h:70:29: sys/ttydefaults.h: No such file or directory

Cygwin provides no file named `sys/ttydefaults.h'. Someone said a copy from a *nix distribution would help.
I didn't try it 'cause MySQL provides an option to skip the bundled readline kindly.

Another try:
./configure --without-readline
make
......
g++ -DUNDEF_THREADS_HACK -DDEFAULT_MYSQL_HOME="\"/usr/local\"" -DDATADIR="\"/usr/local/var\"" -I. -I../include -I../include -I../include -I../regex -O3 -fno-implicit-templates -fno-exceptions -fno-rtti -MT mysql.o -MD -MP -MF .deps/mysql.Tpo -c -o mysql.o mysql.cc
mysql.cc:1030: error: redefinition of `struct _hist_entry'
../include/readline/readline.h:46: error: previous definition of `struct _hist_entry'
mysql.cc:1033: error: ISO C++ forbids declaration of `HIST_ENTRY' with no type
mysql.cc:1033: error: conflicting declaration 'typedef int HIST_ENTRY'

I have little knowledge about compiling, so what I can do is only to guess, change options and have another try.
However, I'm lucky! I found the problem is caused by the option `-O3', well, actually is the inner `-frename-registers'. To set CFLAGS=-O2 or CFLAGS=-fno-rename-registers can help. Also, gcc-4 seems ok. Maybe gcc-3 is the bad, I don't know.

My compiler, which is the latest default compiler on Cygwin.
$ gcc -V
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Yet another try:
./configure --without-readline CFLAGS=-O2
make
make install

Done.

P.S.1. The configure option `--with-plugin-partition' doesn't work. The MySQL guy said the issue is not repeatable with current development sources. So, just using `--with-plugins=partition' instead.

P.S.2. Cygwin is not supported for MySQL.(I didn't know that.)

Wednesday, March 25, 2009

かかくん(iGoogle Gadget)

毎日「価格.com」にアクセスして欲しいものの価格を見るのはあまりにも面倒くさいので、iGoogle Gadgetを作った。
Add to Google
【価格.com 商品IDとは】
例えばPS3
http://kakaku.com/item/20504010180/
赤い部分は価格.com 商品です。

「価格.com」のAPIを使って超簡単で出来るので、もう既に同じ機能のGadgetがいっぱいあります。だから機能的にちょっとだけ強化した。同じもののAmazon.co.jpの商品リンクを付けて、価格を比較することは可能になる。ただ、最初データがないので、Amazon.co.jp のバナーのまま。

周り何人に聞いたんですが、こんなニーズが全然なさそうだ。残念……

Sunday, March 22, 2009

javascript 金额格式化

sum = "1234567890.99";
sum = sum.split("").reverse().join("").replace(/(\d{3})(?=\d)/g, "$1,").split("").reverse().join("");

CAVEATS

  1. 前导0未作处理

  2. 小数不能多过2位

Wednesday, February 04, 2009

做了个 iGoogle 小工具

一直不用 iGoogle 的,某次鲜格格试了一下,还挺好用的。
进而手痒写了个查看外汇牌价的小工具。
Add to Google
顺便牢骚几句:
1、iGoogle Gadget 和 Gadget 不是一回事,看文档的时候很容易搞起来。
2、iGoogle Gadget 还不支持 gadgets.* API,要看基于 _IG_... 命名空间的 "legacy" gadgets API 的文档

Saturday, January 03, 2009

Google App Engine, Google Account and Google Apps Account

前些日子用 Google App Engine(GAE)做了个 iGoogle Widget(在墙外,*.appspot.com 被过滤了,很可惜),碰到不少问题,小结分享一下。

先明确几个概念:
Google Account(GA),大家应该很熟悉,基本上 Google 的服务都用这个做认证。
Google Apps Account(GAA),Google 的域名托管服务,具体就不介绍了,没用过的点了链接自己看吧。

同一个邮件地址(通常是自己申请的域名)可以分别注册为 GA 和 GAA,最搞的就是这里,让我来说明一下使用 GAE 流程。

1、首先,在 appengine.google.com 使用 GA 登录,注册一个 App ID,这个 GA 同时也会以 developer 的身份和 App 绑定。
2、如果,这个 GA 同时又是一个 GAA,那么就很~麻烦了,创建后的 App ID 是属于 GAA 的,因此在 appengine.google.com 里是看不到的,只能去 http://appengine.google.com/a/<YOURDOMAIN.COM>/ 管理。
3、https://www.google.com/a/cpanel/<YOURDOMAIN.COM>/Dashboard 这里有一项 Add more services,里面你能看到 Google App Engine 并且可以输入 App ID。在这里添加 App ID 没有任何意义,不会真的给你创建一个新的 App ID,只是做绑定,而且即使输入不存在的 App ID,也不会报错(GAE 官方论坛管理员语)。

简而言之,3 句话
1) 如果你用了一个邮件地址同时注册了 GA 和 GAA,而且使用 GAE
2) http://appengine.google.com/ 在这里创建你的 App ID
3) http://appengine.google.com/a/<YOURDOMAIN.COM>/ 在这里管理你的 App ID,域名绑定也是这里,不是 Google Apps Dashboard

Tuesday, September 09, 2008

涂鸦(?)

在地址栏中敲入以下命令,页面就会变得可编辑(仅限文字,好像),是个篡改了截屏的好助手。
javascript:document.body.contentEditable='true'; document.designMode='on'; void 0

Wednesday, August 13, 2008

扩展名原来很重要

所谓世事难预料,估计我在 DreamHost 有仇家,今天我的站点突然全线瘫痪,Catalyst 始终报 500 错误。可是,站点程序又完全没有更新过,百思不得其解。Google 了一圈又一圈,抱着死马当活马医的态度,把 pl 改成了看起来更 fastcgi 的 fcgi,哎,就好了。
[razzle ~]$ cp script/myapp_fastcgi.pl script/myapp_fastcgi.fcgi
[razzle ~]$ diff .htaccess.old .htaccess
1c1
< AddHandler fastcgi-script pl
---
> AddHandler fastcgi-script fcgi
12,13c12,13
< RewriteCond %{REQUEST_URI} !^/script/myapp_fastcgi.pl
< RewriteRule ^(.*)$ script/myapp_fastcgi.pl/$1 [PT,L]
---
> RewriteCond %{REQUEST_URI} !^/script/myapp_fastcgi.fcgi
> RewriteRule ^(.*)$ script/myapp_fastcgi.fcgi/$1 [PT,L]

没想出问题所在,如果哪位大侠精通此道,还望不吝赐教。

Monday, May 05, 2008

perl 调用 localtime 的时区问题

测试用例:
{
local $ENV{TZ} = 'UTC+0';
print scalar localtime, "\n";
}
print scalar localtime, "\n";

@CentOS 4.2
Mon Sep 24 01:05:52 2007
Mon Sep 24 01:05:52 2007

@CentOS 4.4
Mon Sep 24 01:05:52 2007
Mon Sep 24 09:05:52 2007

Bug 的详情可以参考
http://rt.perl.org/rt3/Public/Bug/Display.html?id=26136
摘要:
* threaded perl calls localtime_r(3) instead of localtime(3)
* localtime(3) calls tzset(3), but localtime_r(3) does not

一些时间类的模块受此影响,比如 Date::Simple。

CentOS 4.4/ Red Hat Enterprise Linux 4 Update 4 已解决此问题,详情见 perl 的 changelog:
$ rpm -q --changelog perl
* Thu May 11 2006 Jason Vas Dias <jvdias@redhat.com> - 3:5.8.5-30.RHEL4

- fix errata testing issues:
o bug 161305 localtime_r_needs_tzset incorrectly not set on 64-bit arches
o generate perl headers correctly to avoid missing / unresolved headers

* Thu Apr 06 2006 Jason Vas Dias <jvdias@redhat.com> - 3:5.8.5-28.RHEL4

- fix bug 161305: call tzset() before localtime_r

而 perl 的 community patch 应用于 perl 5.8.8 发布之后,此后发布的新版本目前只有 perl 5.10.0。

综上,有以下数种对应解决办法:
1、如果 OS 为 CentOS 4.4 以下,使用 yum 直接升级 perl 即可。
2、其他 OS 可以查找是否有相应的 vendor patch。
3、自行编译安装禁用线程(-Uusethreads)的 perl。
4、自行编译安装 perl 5.10.0。
5、给受影响的模块打补丁,Date::Simple 的补丁这里有。

相关链接:
小心时区陷阱(一)
小心时区陷阱(二)

Sunday, May 04, 2008

Apacheのログに携帯のユーザIDを記録する

iモードIDの登場に伴って、三キャリアのユーザIDはすべてHTTPリクエストヘッダから取れるようになった。Apacheの場合、下記ような設定でユーザIDはログに記録される。
SetEnvIf X-DCMGUID    ^(.+)$ User-ID=$1
SetEnvIf X-UP-SUBNO ^(.+)$ User-ID=$1
SetEnvIf X-JPHONE-UID ^(.+)$ User-ID=$1
CustomLog "logs/access_log" "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{User-ID}e\""

Monday, November 19, 2007

Cygwin 环境下安装 Gtk2

这里的 Gtk2 是指 Perl 的 Gtk2 模块,Cygwin 环境下通过 CPAN 是无法直接安装的,需要修改了 Makefile.PL 之后手动安装。
--- Makefile.PL 2006/11/06 00:35:44 1.1
+++ Makefile.PL 2006/11/06 10:24:38
@@ -331,10 +331,6 @@

# this probably needs to go into ExtUtils::Depends.
sub find_extra_libs {
- # right now we need this terrible hack only for windows.
- # unfortunately, this code doesn't work on cygwin. :-/
- return "" unless $^O eq "MSWin32";
-
# win32 does not allow unresolved symbols in libraries, but
# Gtk2 uses on symbols in the dll created for Glib.
# so, we have to break all this nice abstraction and encapsulation
@@ -346,10 +342,19 @@
my $retstring = "";

use File::Find;
- find (sub {
- $retstring .= " ".$File::Find::name
- if /Glib.lib/i;
- }, @INC);
+
+ if ($^O eq "MSWin32") {
+ find (sub {
+ $retstring .= " ".$File::Find::name
+ if /Glib\.lib/i;
+ }, @INC);
+ } elsif ($^O eq "cygwin") {
+ find (sub {
+ $retstring .= " -L".$File::Find::dir
+ if /libGlib\.dll\.a/i;
+ }, @INC);
+ $retstring .= " -lGlib.dll" if ($retstring ne "");
+ }

return $retstring;
}

这是 Dirk Froemberg 向 Torsten Schoenfeld 提交的 patch,到现在为止还没有被合并进 source。

参考链接:
http://bugzilla.gnome.org