ASP.NET MVC折腾系列之(3)——有关在Debian 5上部署LaTaleDB的各种蛋疼的事儿

作为本人第一个ASP.NET MVC的程序,LaTaleDB的1.0版本准备当作业交了去,亦准备上线部署。

然后就是各种蛋疼至死的事情。。

首先,前面文章提到的mono-apache-server是用的mono 1.9版本,即.net 2.0,不含3.5的东西,于是当我把文件上传到服务器上时,访问时直接得到了个500,就说是出错了,如果要看详细信息,在Web.config中设置customErrors的mode为Off。。

然后错误信息是缺少引用。。就把DLL的多余引用去掉,重新编译传了下,再把再缺的DLL从Windows目录里拷出来上传上去。。

然后提示无法启动编译器进程,aspx要在第一次访问时编译的,但是mono没有带vb的编译器。。

然后我火了,上mono官网去看为嘛debian没有2.6版的mono,回答是2.6在debian 6.0中有,第五代的如果想装请添加backport安装源。。

好不容易从backport安装源安装了完整的mono,结果这下更好,直接apache报500,什么网站都打不开,查apache的log,Mono-WebServer2里的异常,Google了一下,有人说到这个bug,说问题在mscorlib.dll中,有时候官方的trunk里有bug。。

然后就把自己电脑上Windows下mono的mscorlib上传了去,结果继续500,这下log写的是执行了native代码引发了保护断言,即即便是mono,在Windows下和linux下的mscorlib是不同的实现。。

这个时候我连把这次装的卸载掉都搞不定了。。回宿舍在自己机子上的debian 6.0上装。。这下是含有.net 3.5的,看上去框架没有什么严重的bug,就把整个/usr/lib/mono打包上传到服务器上了。

这次没提示缺少文件什么的了,不过还是没有编译器。。服务器上debian5也没有vb编译器的包。。再在自己电脑上安装microsoft.visualbasic.dll和vbnc,打开deb文件,看是哪几个文件,手动上传到服务器上。。

以为好了的,结果编译错误。。错误基本出在System.Web.Extension里,弄了半天也没弄好,突然无意中就感觉是不是后来拷进去的缺少的dll是不是和mono框架冲突,就把传上去的那些dll改名掉。

这下OK了,提示的是routing错误,和上次提到的一样,是System.Web.Routing的bug,把这个改回来。。

然后就说mysql找不到数据库LaTaleDB,而数据库已经导入了啊,估计是大小写吧,在web.config中把connectionString中数据库名改为小写。。

这下数据库找到了,但说找不到表,肯定依旧是大小写问题,我可不至于一个一个改吧,网上Google了一下,修改/etc/mysql/my.cnf,在[mysqld]下加入一行:lower_case_table_names=1,重启mysql,这样就不区分大小写了。。

然后终于运行成功,但是wait,物品列表的图片怎么都不透明了。。仔细看了下,是有的透明有的不透明,和源图有关,Google了下,说是mono的一个bug,把微弱的System.Drawing.dll拷上去发现这个dll里是有调用Windows API的,不能用,看来只能将就了。。

整个下来估计花了5个小时。。崩溃。。

上线的站点将在下篇文章中公布,另外1.0版本将以压缩包的形式开源,至于功能的添加,将视心情而定 = =

ASP.NET MVC折腾系列之(2)——遇到的MONO框架的两个BUG

EVA暂时封存,今天晚上开始折腾ASP.NET。

但是没太大兴致做blog,就把原来的GhostCHD找了出来,把DataCore.vb粘过来,试着做一个彩虹岛的Web数据库。

经测,Web和本机一样,程序集中的全局变量(vb.net中写为class的shared成员变量)在dll卸载前是不会回收的(只要有引用就不会回收),而关键是,在一次请求过后,程序是还在的!这和php有着本质的区别!即服务端是保存状态的(DLL在什么情况下可能被卸载还有待研究),这使得有些东西可以保存在内存中不用每次访问数据库或者文件查找。

在WebDev中调试一切正常,但在MONO中出错。

1、SPFReader,几年前写的,结构是SPFFileStream继承自FileStream,并重写其Seek、Position等函数,在其中调用基类FileStream的同名函数并做一些调整。在MONO中不能正常工作,Position出现负数,原因不明,推测可能是MONO框架在哪里把基类和重写的Position弄混了。代码改为SPFFileStream继承自Stream,FileStream作为其成员变量,问题解决。

2、MVC设置好的Routing在MONO下出现一些BUG,如条件写为/{id}.htm,但在MONO中能成功匹配1.htm、1.html、1.htma等,经查,MONO中的库基本为自己重写,而非微软版本,用微软的版本替换之,问题解决(原理上讲,只要是纯托管并且没有DllImport的DLL,都应该可以替换成微软的原版)。

ASP.NET MVC折腾系列之(1)——Linux下跑ASP.NET

近日因作业需要在捣腾php的模板,无意中注意到了ASP.NET MVC框架,直接被秒杀——半年来我一直在致力于的界面代码数据分离原来用MVC模式可以做的很完美,比我设想中的还要完美。。觉得自己大大的被BS了,软件工程看来还是有点用的。

ASP.NET怎么说呢。一年前帮S姐调大作业,就是ASP.NET的,觉得WebForm对HTML的封装过头了,太傻瓜了,完全不像Web开发了,所以一直很抵制它,又因为发誓不碰Java,所以这一年来还是在php中泡着。php是最方便的web语言,但项目一大,就会出现如速度慢等各种问题,最起码我不喜欢它的类,类这个东西我最喜欢.net,其次是ansi c++。在看到asp.net mvc的结构图时,感觉太帅啦!!这次就学它了!可以同时交三门课的作业呢~~

一直搞不定VS9中文版装MVC项目模板的问题,现在迅雷正挂着英文版的ISO,准备通宵。那边开始忙活VPS上服务器的配置。

大家都知道.net是萎软的东西,不过大家也有必要知道.net是部分开源的,并且现在有个叫mono的跨平台开源框架。自然而然,linux也并非不能跑asp.net。下面简单记录下我在VPS上装asp.net的步骤,以便日后查阅。

1,apt-get install libapache2-mod-mono mono-apache-server2

2,修改/etc/apache2/mods-available/mod_mono.conf,将mono-server2-hosts.conf取消注释,将mono-server-hosts.conf注释起来(据说是跑.net 2.0)

3,因为手头没有现成的asp.net程序,就down一个,apt-get install asp.net2-examples

4,重启apache,在http://www.gmsj.org/samples里就能看到了~(这个设置在/etc/mono-server2/mono-server2-hosts.conf中设置

根据mono官网中的介绍,mono会在后台驻留一个.net exe服务器进程用于处理apache传去的asp.net请求。这是用mod-mono做的,其实也可以用fastcgi做(因为我php就是用fcgi做的),回头可以一试。

简析wordpress与discuz、smarty模板技术的根本区别

近日了解了下php的模板技术,准备在接下来的要做的程序中使用。因为是团队合作,需要将代码和界面并行开发,故需运用模板技术。稍稍有些困惑是采用discuz、smarty一类的模板技术好呢还是采用wordpress一类的好呢。今天上课开小差时突然领悟,两者是有根本区别的。

discuz、smarty一类的模板是比较纯正的html文件,中间需要填充的数据一般用{标识符}表示,php中使用正则表达式分析然后输出。

wordpress的模板是也是html,但需要填充的数据直接采用php标签,如在显示文章点击量的地方写上<?php echo wp_views();?>。

看似区别不大,实质上想通了会发现,两个方案刚好是置标脚本语言的两种基本形式的演化。

大家应该能记得,一切的服务器脚本,无论是asp、php、jsp,都有两种基本但对立的写法。

一种是嵌入标签,如

<HEAD>
<TITLE>
<?php echo "This is the title";?>
</TITLE>
<BODY>
<?php echo "This is body";?>
</BODY>

另外一种就是完全页面输出,如

<?php
echo "n";
echo "n";
echo "This is the titlen";
echo "n";
echo "n";
echo "This is bodyn";
echo "";
?>

两种方法各有利弊,嵌入标签方便界面和逻辑分离,方便修改界面,但在程序逻辑方面并不好控制;完全输出很容易控制程序,但界面无法维护。

为了改善这种状况,同时也为了满足用户换主题的需求,模板技术出现了。

wordpress采用嵌入标签,为了弥补程序流程难以控制的问题,其采用了后台先准备好数据,然后include主题模板,模板中通过调用前面提供的接口函数来取得数据显示出来。

discuz、smarty是真正意义上的模板技术,即读取模板文件,然后通过正则表达式替换等处理,最后生成页面统统echo出来。

具体使用哪种方法,呵呵,还是看个人喜好和团队情况咯。

嵌入标签简单易用,开发方便,但要求界面开发人员稍稍懂一点php。

tpl模板技术灵活性高,界面与代码之间耦合度很低,界面人员也不用懂php,应该是很好的设计模式,但程序复杂,模板处理执行速度慢。

以上为个人见解,因为cache童鞋赶脚这个blog会变成音乐blog,特发此技术文给大家换换口味~

修正上传图片的问题,目录权限惹的祸

十天前发了一个Live Writer上传图片的blog,当时凭直觉把wp-content/uploads改成blog.gmsj.org/wp-content/uploads解决问题。

然而有一天在blog里对图片点右键看属性,霍然见到http://lxf.me/blog.gmsj.org/wp-content/uploads的地址!显然是有问题!

今天登ssh去看了下,果然出现/var/www/blog.gmsj.org/blog.gmsj.org这样的目录。

结合boom管理器无法上传文件、修改文件属性等,断定是权限上的问题。

回想网站搬家的时候,我是在ix的在线文件管理里将整站打的zip包,然后这边wget下来unzip的,unzip的执行者是root,自然所有文件的所有者是root,权限是755,导致apache的www-data用户无法修改文件,也无法改属性(越权操作),每次修改什么文件都要手动进ssh改成777。甚至/var/www目录的权限也是755,所以www.gmsj.org根目录下亦不能上传文件。

上Google复习了下linux的文件系统权限相关的知识,用chmod –R 777 /var/www将所有东西改成777。将/var/www/blog.gmsj.org/blog.gmsj.org目录cp到本来的位置并删除,然后准备进phpMyAdmin手动修改每一篇上传图片的blog文章中图片的链接。

然而phpMyAdmin无法启动,提示Wrong permissions on configuration file, should not be world writable!,看来phpMyAdmin不喜欢777这样危险的环境。

于是将phpMyAdmin的目录改回755。进数据库修改了数十处图片链接,搞定。

接下来的疑问。wp上传的附件能不能是相对路径呢。如果我再搬家了怎么办。

回头继续研究。

有关Live Writer自动上传图片

刚刚写的那篇blog是我第一次用live writer插入图片、自动上传。

开始的时候发布说不支持上传图片,就去配ftp,突然觉得我把root密码直接写上去是不是有点太那个(我ftp就开了一个帐号——linux的root。。。)就Google了一下

说是后台有个上传路径的设置,去后台设为默认的wp-content/uploads

结果还是不行。又有人说是Live Writer插件的问题,便把所有插件都禁用了

还是不行。。

最后突然有种直觉,把路径改成blog.gmsj.org/wp-content/uploads——成功!

我只知道服务器上绝对路径是/var/www/blog.gmsj.org/wp-content/uploads,但是我给blog.gmsj.org设置了虚拟主机指向/var/www/blog.gmsj.org啊,按说这里就是根路径啊,为什么非要用apache的www root。

百思不得其解中。

Debian 6.0 Beta2配置手记 2010-12-29

在网上看到testing版本要好看的多,今天就直接在真实机器上给装了
使用移动硬盘+ISO镜像的方法安装,需要下载官网hd-media目录中的initrd引导,光盘中的initrd是不支持从ISO安装的。
还是使用netinst的盘,但是基本系统装完后却找不到软件包。。只能结束安装进命令行系统了。。
然后忍受一个多小时的apt-get install x-window-system-core gnome-core,startx进不了桌面,据说是显卡驱动的问题,但重启后就成功进桌面了。
直接用root进的桌面,习惯root了哈哈
6.0的debian装gnome默认装了主题什么的,壁纸也好看的多,非常非常非常帅,不比ubuntu差~
挂载windows7的系统盘,把中文字体拷出来安装了
然后是firefox。然后折腾几个小时的中文输入法。开始加入lenny的源下载fcitx,但是我系统装的是E文的,配置上问题很大,最后好不容易弄好但是觉得不好,后来在网上看到有人移植了google拼音,就下载编译安装了下,用着还行,不过貌似不支持同步词库,也不支持模糊拼音,这让我打字很恼火。。
(插播一句,因为输入法动locales的时候,如果选上了zh_CN.GBK了,则我的apt会出问题,表现在apt-get update时本来正常的包报告404错误。上网找很久未果,自己思考下为啥出404,想到也许是GET头编码的问题,就去locales改一下,居然解决,也不知道是不是瞎猫撞见死耗子了)
再然后就把原来下载的vmware拷了过来装了,运行时说要linux内核的头文件,google良久才发现内核头文件不是默认的linux-kernel-headers包,而是linux-headers-XXX包,用apt-get install linux-headers-$(uname -r)下载,然后vmware就可以运行了。
Live Writer网上说因为需要.net而在wine中不好模拟,找了一个叫Drivel的软件,写这篇blog,看看效果如何。回头用VMWare装个windows瞅瞅。

VirtualBox安装Debian记录 2010-12-27

昨天拖下载,debian下了个netinst下了个cd1,今天把风扇装好开机,却想自己从最基础的系统开始折腾,于是用netinst安装,并且把网线拔了。。下面实况记录以作以后参考。

一,安装基本系统与网络配置

netinst按步骤安装,选的中文

root帐号登录——控制台里的中文全部是白色方块。。Google说要装zhcon什么还要重新编译内核云云,遂放弃,dpkg-reconfigure locales把区域改成E文。

试图apt-get显示找不到软件包,apt-update无源,在/etc/apt/sources.list添加deb http://http.us.debian.org/debian/ stable main再apt-get显示无法解析域名,ping发现网络不通(此时VBox已插上网线),重启依旧不通。

Google得虚拟机设置为NAT时客户机只要DHCP即可上网,打开/etc/network/interfaces,添加

auto eth0
iface eth0 inet dhcp

重启网络/etc/init.d/networking restart,此时网络可以ping通了。

附,如果是真实机子,如我们宿舍是固定IP,则配置写

auto eth0
iface eth0 inet static
address 192.168.88.5
netmask 255.255.255.0
gateway 192.168.88.1

 

二,软件包源

因为大陆debian的镜像几乎没有,不像VPS在米国,看了篇文章,准备使用apt-spy来探测一个最快的站点。

刚接上网,先apt-get update

apt-get install apt-spy

使用:

下载一份镜像列表 apt-spy update

测试亚洲地区 apt-spy –d stable –a asia –t 5 要加上5秒超时,不然够受的

完成后一份列表将写在/etc/apt/sources.list.d/apt-spy.list,打开看是台湾的镜像,替换掉原来的sources.list(后来看这镜像还不错,软件安装都能满速)

再来次apt-get update

 

三,桌面环境

apt-get install x-window-system-core

然后我就直接startx了,结果神马也没有,可按ctrl+alt+backspace返回console

apt-get install gdm

apt-get install gnome-core

安gnome的时候提示要N百M的空间,但是我只给了2G的硬盘,系统分区只给了1G,这下囧了,不要告诉我前面都白做了

然后呢,进PE用Partition Manager调整分区,结果重启提示文件系统损坏,硬盘被mount成只读模式,网上说用liveCD(相当于修复PE),正巧我下了张ubuntu的安装盘,进gparted分区软件,检查分区(其实就是fsck),未果。于是我废掉了 – – 从头来吧。。

格式化前,将/var/cache/apt/archives中已经下载的软件包备份出去,回头再拷贝回来,这样就不用再下载了。

apt-get install zhcon

apt-get install ttf-arphic-bkai00mp ttf-arphic-bsmi00lp xfonts-intl-chinese xcin

apt-get install apt-file

apt-file update

apt-get install iceweasel(firefox的debian发行版)

到这里桌面中部分字是方块,捣腾很久,在一个地方看到

ttf-arphic-bsmi00lp – 文鼎PL细上海宋 (AR PL Mingti2L Big5) ,包括了 Big5 中一万三千多个繁体字。
ttf-arphic-bkai00mp – 文鼎PL中楷 (AR PL KaitiM Big5) ,包括了 Big5 中一万三千多个繁体字。
ttf-arphic-gbsn00lp – 文鼎PL简报宋 (AR PL SungtiL GB) ,包括了 GB2312 中七千多个简体字。
ttf-arphic-gkai00mp – 文鼎PL简中楷 (AR PL KaitiM GB) ,包括了 GB2312 中七千多个简体字。
ttf-arphic-uming – 文鼎PL上海宋Uni (AR PL ShanHeiSun Uni),包括了 GB2312、Big5及HKSCS中二万多个繁简体字。
ttf-arphic-ukai – 文鼎PL中楷Uni (AR PL ZenKai Uni),包括了 GB2312、Big5及HKSCS中二万多个繁简体字。

看来前面装的字体是big5的,于是再装几个

apt-get install ttf-arphic-bkai00mp ttf-arphic-bsmi00lp ttf-arphic-gbsn00lp ttf-arphic-gkai00mp ttf-arphic-uming ttf-arphic-ukai

重启后OK,虽然很难看,但终于能正常显示了。。

美化什么的,看来还是ubuntu做的好。

先搞这么多,回头在真实机子上装。

顺便把分区软件一下,apt-get install gparted

MTU设置造成VPN无法正常工作

今天要上youtube去找某位高人听写出来的Rayman3一个CG的字幕,结果发现上不了,更悲剧的是发现几乎所有的网站,如Google、youtube、twitter都上不了,但奇怪的是百度和我自己的网站能上。

开始以为是自己电脑上的360耍流氓了,就到室友电脑上上,发现故障依旧。

然后开始疯狂Google。得到什么在Windows配置和VPN配置里把什么加密给关掉,照做,未果。

突然在一条回复上看到有人提到了MTU这个词,遂想起前几天因为某人的WOW需要,好像是在路由器上改了什么MTU。当时我还一直问某飞MTU是啥MTU是啥,他也不告诉我。

于是问Google。MTU为Maximum Transmission Unit。指一个设备一帧报文最大的数据量,单位Byte。

再搜索VPN MTU,得知MTU确实会影响VPN数据的传输,表现正是有些网站可以打开有些网站不行。

参考了几篇文章,尝试了以下做法。

Win7下管理员模式cmd,在VPN连接时执行netsh interface ipv4 show subinterfaces,看到本机网卡MTU为1500,VPN的MTU为1400。

VPS Linux下执行ifconfig,看到ppp0的MTU为1396好像。

感觉貌似要是加上这个头那个头的,就会超过路由器上设置的1410而被拦截,而原来是1496。

于是Win7下执行netsh interface ipv4 set subinterface "MyVPS" mtu=1300 store=persistent。重新连接后依旧不行。

再到Linux下执行ifconfig ppp0 mtu 1300,于是问题解决!

感觉这个MTU是在配置虚拟网络时根据iptable写的MSS决定的。。一会去把那个改一下试试。

话说网络这东西好神奇。。。

解决搬家后Discuz积分兑换问题

搬家后Discuz积分兑换突然出了问题,表现在点击兑换后无响应,用抓包工具查得1多分钟后返回500错误。

这可急坏了,这功能可是俺用来赚钱的。。

经过很久很久,通过在各个php文件中插入file_put_contents("debug.txt","xxxxxxxxxx");跟踪,从memcp.php,到uc_client/client.php,最终查得阻塞在通过HTTP调用ucenter/index.php中网络文件的fget上。

开始以为是不是ucenter出问题了,然而输出到debug然后用nc手动请求ucenter却是一切正常。

到这里就突然想起,我在调用php的fastcgi中设置php的子进程数为2,也就是服务器只能同时处理两个php请求,而进行积分兑换时浏览器请求memcp,memcp通过uc_client请求ucenter,ucenter又会请求被兑换端的api,这样一来就三个了,于是第三个被阻塞,程序陷入deadlock。

更改fastcgi脚本,进程数设为8,问题解决。

之所以不弄那么多进程是因为vps内存实在是太小了,当时用apache的fork模式,那真是F5就能把服务器刷死,现在改成worker模式+fastcgi,却又发现php-cgi又常驻内存了。

依旧有待研究优化。。。