树莓派初体验

很早就关注了树莓派,但是一直都没有去折腾。前些时间休假,终于还是搞了个派回来玩。

先来关注一下树莓派上可以跑的系统(各linux发行版),如何安装?可以参考这个网站。我在网上搜了下各发行版的介绍,大致如下:

Debian squeeze

建议初学者使用Debian squeeze境像,它是现时比较稳定的Linux境像,而且需求较小系统设置,但系统的开机时间较长(在显示登录画面前,需要等待计时器错误的倒数结束),它的系统设置中分别建立了root和普通用户的账号。硬件支援方面,Raspberry Pi上所有的硬件正常运作,以太网的检测是由DHCP实现的。

桌面环境方面使用LXDE,内置了基本的桌面应用程序和在线Python手册,运行速度十足快,但浏览网页就有点慢。除了内置的应用程序,可以使用”apt-get” 命令安装Debian库的预编译软件包。

最近Raspberry Pi官方网站发布了最新的Debian境像- Raspbian “wheezy”,若要下载的用户请到这个网站

Arch Linux ARM

这是至今为止于Raspberry Pi上运行速度最快的Linux发行版,如果你已经熟悉Linux操作系统和命令行,它绝对是你的选择。由开机到登录提示画面只需要10秒,但是在第一次启动Arch Linux ARM时要对系统进行设置,Arch Linux ARM的安装过程中可以定制个别的要求。如果要运行桌面环境,你需要更新软件包管理器,然后下载LXDE等桌面环境。 LXDE于Arch Linux ARM 系统中的反应十分快。 Arch Linux ARM为这种低成本设备带来优秀的运行表现,而代价就是在设置系统时需要阅读Arch Linux ARM的在线文档,而Pacman是Arch Linux ARM的软体包管理器,可以下载不少预编译包。

(more…)

Read More

CentOS下安装Git服务端遇到的问题

前一篇文章是别人安装的日志,我在centos下按照别人的步骤进行安装,然后根据我自己的环境做了些补充。如:一般用户的机器上都不会只用到自己服务器上的Git,还会有Github、Oschina等一些开源的Git,所以要配置.ssh/config这个文件,指向不同的密钥文件;然后自己搭建的服务器如果端口不是22,那还要在这个文件里配置Port。

根据网络大多数的教程,会用以下命令去服务上获取gitosis-admin:

git clone git@VPS的IP/Domain:/home/git/repositories/gitosis-admin.git

但是我在git-scm上看到的却是这样:

git clone git@gitserver:gitosis-admin.git

这两种方式我都试过,按照默认安装下来的,第一种命令在输入服务器git用户的密码后会成功将gitosis-admin.git获取下来,第二种方式在输入用户密码后会出现以下错误:

20140711124037

fatal: ‘gitosis-admin’dose not appear to be a git repository

fatal: Could not read from remote repository.

一直搞不清楚,为什么在开启publikey的情况下会让输入git用户的用户密码?为什么git-scm上的这种获取方式在输入git的用户密码后会提示以上的错误。

后来在日志里发现了问题:

20140711124554

Authentication refused: bad ownership or modes for directory /home/git/.ssh

由于centos对权限的敏感,导致了这个问题。其实有时候centos真的坑很多,明明是按照别人的教程,但是却运行不起来,not working,其实就是centos的权限很敏感。

按照下面的命令,就会解决所有的问题。

chmod g-w /home/your_user
chmod 700 /home/your_user/.ssh
chmod 600 /home/your_user/.ssh/authorized_keys

Read More

CentOS上搭建Git服务器

记录一下自己的安装过程,方便以后再次安装。

Git是一个分布式版本控制软件,原来是linux内核开发者Linus Torvalds为了更好地管理linux内核开发而创立的。发展至今,Git已经成为了一个相当好用的版本管理工具。相比于SVN,如果想要保存一些微小的修改也必须得提交服务器保存才可以,这样使服务器的版本号过多,而Git解决了这个问题,一些小的修改只在本地提交即可,只需最后修改完成后再提交服务器。正是由于这样的便捷性,现在越来越多的社区项目都开始使用Git来取代SVN之类较为传统的版本管理工具进行开发。 。

使用CentOS搭建Git服务器是一件比较轻松的事儿,本次折腾主要涉及git, gitosis, gitweb的安装配置。其中,gitosis和gitweb是两种比较常用的方式,gitosis是以SSH方式访问和管理git, gitweb是通过http的方式访问和管理。利用这些工具即可满足Git服务器的基本功能。此外比较好的一点是,Git的管理工具几乎不会给服务器带来较大的性能压力。下面正式开始我们的Git安装配置记录。

一、安装Git

yum install git

然后进行配置:

useradd --home /home/git git
passwd git

创建完用户后就可以切换到git用户下进行后面的设置,如用户名和邮箱:

su git
git config --global user.name "somebody"
git config --global user.email "somebody@example.com"

设置默认将会保存在~/.gitconfig文件中。

此时,Git的功能就已经可以使用了。为了方便后面的操作,可以先来创建一个空版本库。

mkdir ~/repo

然后建立项目目录

mkdir ~/repo/huhamhire-hosts

切换到项目目录,并进行初始化

cd ~/repo/huhamhire-hosts
git init -bare

至此,一个初始的空项目版本库就配置完成了,后面安装了gitosis之后便可向库中推送我们的代码库内容。

二、安装gitosis

在安装之前,可以看一下gitosis的实现原理:

http://geeklu.com/2012/10/gitosis/

先切换回root权限。

su root

并先安装python-setuptool

yum install python-setuptools

然后开始安装gitosis,值得注意的是gitosis的安装程序本身就是由git管理的,需要使用git来获取。这里在/tmp目录下进行相关的安装操作:

cd /tmp
git clone https://github.com/res0nat0r/gitosis.git

接下来进入下载的gitosis版本库进行安装:

cd gitosis
python setup.py install

安装完成后,便进入对gitosis的设置阶段。由于gitosis需要通过SSH进行管理,所以需要创建SSH密钥对,并将公钥放在服务器端,私钥放在客户端。一般的流程是客户端创建完密钥后,将公钥传到服务器上生效。不过,偷懒的话直接在服务器上操作问题也不大。

切换到git用户并建立文件夹.ssh:

su git
mkdir /home/git/.ssh

一定记得,在客户机上生成公钥,上传到服务器,或者在服务器上生成,下载到客户机。

进入~/.ssh目录并使用ssh-keygen生成公钥:

cd /home/git/.ssh
ssh-keygen -t rsa

注意不能忘记私钥的密码。默认会生成~/.ssh/id_rsa.pub公钥文件。

有了密钥以后便可初始化gitosis,使gitosis获得对Git的管理权限:

gitosis-init < /home/git/.ssh/id_rsa.pub

初始化之后,会在/home/git/repositories创建gitosis-admin.git项目,可以通过维护这个项目来对gitosis进行配置。

除此以外,还需要对gitosis-admin.git/hooks/post-update目录赋上特殊权限:

chmod u+x /home/git/repositories/gitosis-admin.git/hooks/post-update

至此,服务器端的gitosys配置就完成了。

三、设置并使用gitosys

在服务器端完成了gitosys的配置之后,便可在客户端进行接下来的设置,以便使用Git服务器。

较为正规的做法是在客户端通过gitosis-admin版本库做管理设置,之后提交到服务器使项目权限生效,当然也可以使用操作系统的ssh登录方式进行验证,不过这里仅介绍前面一种方法。

在进行以下操作时,需要确认一下,你的公钥是不是已经放在客户机~/.ssh/目录下。如果你也在用github的话,那么你需要设置一下多公钥共存的东西。.ssh/config,在这个文件中写入:

Host github.com
	HostName github.com
	User git
	IdentityFile C:/Users/abc/.ssh/id_rsa
Host git.oschina.net
	HostName git.oschina.net
	User git
	IdentityFile C:/Users/abc/.ssh/id_rsa_a
Host abc.ueder.info
	HostName abc.ueder.info
	User git
	Port 1000
	IdentityFile C:/Users/abc/.ssh/id_rsa_new

如我就使用了好几个git服务,每个都有自己的公钥,需要配置文件来区分开来,并且我自己的服务器ssh端口已经不是默认端口,需要在配置文件中声明,否则在每次clone的时候要声明端口。

在客户机上下载gitosis-admin版本库,这里以linux客户机为例:

git clone git@VPS的IP/Domain:/home/git/repositories/gitosis-admin.git

获取完成后对gitosis-admin/gitosis.conf文件进行设置,以上面新建的项目为例,新增:

[group huhamhire-hosts]
writable = huhamhire-hosts
members = hamhire@myhost

随后要将客户端的公钥放到keydir目录下,并随后提交设置到服务器:

cp ~/.ssh/id_rsa.pub ~/gitosis-admin/keydir/hamhire@myhost.pub

cd ~/gitosis-admin
git add ./
git commit -a -m "add new repo"
git push

由于之前已经在/home/git/repo/目录下设置了huhamhire-hosts的版本库位置,所以可以直接进行推送操作。

在本例中可以通过hamhire@myhost:/home/git/repo/huhamhire-hosts的路径来提交项目。

至此,gitosys的配置全部完成。

四、安装gitweb

在配置完成了git服务器以后,如果需要方便在线查看,使用gitweb来提供一个简单网页版的版本显示界面是一个不错的选择。

在centos 下安装gitweb如下:

yum install fcgi-devel

cd /usr/local/src/
git clone git://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i
./configure
make
make install

至此,fcgiwrap已经安装到 /usr/local/sbin/fcgiwrap

然后再安装spawn-fcgi

yum install spawn-fcgi

安装好后:

vim /etc/sysconfig/spawn-fcgi

修改文件为:

# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

然后设置开机运行:

chkconfig --levels 2345 spawn-fcgi on
/etc/init.d/spawn-fcgi start

这里已经完成了fcgi的安装运行。如果你用的nginx,还需要对nginx.conf进行配置,才能将.cgi的请求转发给fcgiwrap.socket

location /cgi-bin/ {
 # Disable gzip (it makes scripts feel slower since they have to complete
 # before getting gzipped)
 gzip off;
 # Set the root to /usr/lib (inside this location this means that we are
 # giving access to the files under /usr/lib/cgi-bin)
 root /var/www/www.example.com;
 # Fastcgi socket
 fastcgi_pass unix:/var/run/fcgiwrap.socket;
 # Fastcgi parameters, include the standard ones
 include /etc/nginx/fastcgi_params;
 # Adjust non standard parameters (SCRIPT_FILENAME)
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 }

最后重启nginx就可以了。

 

五、Gitweb的界面美化与中文化

个人觉得Gitweb默认的用户界面是在是有点简陋地惨不忍睹,实在觉得不舒服的话,完全可以使用样式表进行适当的装饰。建议可以参考Github上的” gitweb-theme”项目进行美化:http://kogakure.github.com/gitweb-theme/

 

参考:

1、http://black-pixel.net/serving-cgi-scripts-with-nginx-on-centos-6.html

2、https://blog.huhamhire.com/viewpost-231.html

Read More

前端自动化开发工具

为什么要用自动化开发工具

在前端的开发中上线前可能会做的事情:

文件目录调整

HTML注释、换行等操作

CSS压缩合并

JS、CSS语法检测

JS代码压缩

图片压缩

上面列举了一些常用的操作,这些操作是重复而枯燥的,如果是人工来一项一项做,会浪费大量时间。所以需要有一个高效的工具来帮我们做这些事情,Grunt应运而生。

Grunt是什么

Grunt是一个基于任务的Javascript工程命令行构建工具

如何使用Grunt
  • 安装nodejs
  • 安装gruntjs
  • 假如之前安装过的话,先卸载 npm uninstall –g –grunt
  • 安装grunt命令行工具, 命令:npm install-g grunt-cli
  • 在工程目录下安装Grunt Module(如何安装看第三步)
  • 安装Grunt Module

(more…)

Read More

windows phone 8 gdr3之撸妹520

Windows Phone 8的第三次系统更新,即GDR3,将在未来几个月向现有手机推送。微软近日详细介绍了Windows Phone 8 GDR3的内容:支持更大、分辨率更高的屏幕;支持高通四核处理器;新增驾驶模式;新的辅助功能;改进的互联网共享功能……还有几百项内部性能调整和改进。此外,微软还将于明天启动“Windows Phone开发者预览计划”。

  WP8 GDR3支持5英寸和6英寸1080p高清触摸屏设备,支持高通MSM8974四核处理器,全新的“驾驶模式”功能让你在驾车中更专注,借助蓝牙设备,驾驶模式可以限制锁屏上的通知数量,包括短信、电话和快速状态提示,也可以自动回复致电者或发信人,告知他们,你之后将回复他们。

  WP8 GDR3带来了一系列辅助功能,例如屏幕阅读器,便于盲人和视障用户管理电话和联系人、发送短信和电子邮件、收听各种通知。

  WP8 GDR3改进了互联网共享功能,你可以更方便地将手机用作Windows 8.1设备的数据热点,只需通过蓝牙将手机和Windows 8.1 PC或平板机进行匹配,就能实现联网。

  WP8 GDR3还带来了一些呼声很高的特性,包括:更多铃声,为联系人定制短信提示音;旋转锁定选项(锁定横屏或竖屏);新的存储设置;可以使用应用开关快速关闭应用。

阿珂同学给我说有新的更新了,如上面所说,感觉很有吸引力哈,特别是可以关闭旋转。这正是我所需要的。我第一时间在网上搜了教程如何安装这个开发预览版,我在这里就不说如何安装了。安装了二三天,无数次,都没有成功,最后都是这种情况:

“更新已下载,但不能打开”错误代码80188306

如:http://answers.microsoft.com/zh-hans/winphone/forum/wp8-wpupdate/lumia-520/9f87b404-53e8-4e90-bc11-0c40bd5bd532

而阿珂当天回家就更新了。囧啊,我。

搜了下,基本上说是要解锁,比如解锁手机,解锁账户,等等等。

后来发现了Amber这个东西,其实就是固件啦。要装特定的系统需要特定的固件。我又查了下nokia,大陆已经支持更新了,但是手机更新里没有。

nokia-520avi

没关系,既然nokia已经出了,就用NokiaSoftwareUpdaterForRetail来更新就行了。更新了Amber后,按之前的步骤,顺利的装上了GDR3了。

想捣鼓固件的,见1。

1、http://simnovo.net/nokia-lumia-520-amber/

Read More

[转]普通程序员的出路在哪里?

我时刻在思考这个问题。可能我不是最最优秀的,但是我有颗上进的心。找来这篇文章给自己打打气。


就现在经济大环境而言,很不乐观,程序员的日子也很不好过,无论是还在找工作的、还是已经入职多年、哪怕做到项目经理技术经理的,压力都异常巨大,似乎处处充满危机。但是,仔细分析一下,出路还是有的,甚至解决温饱、过上有房有车没贷款的生活也是很可能的。首先,在如今这个浮躁的社会,大多数人的心态也是浮躁的,只要你能潜下心来,深入研究某个技术,有了一技之长,温饱问题肯定就可以先解决了。

1.一技之长

新技术层出不穷,而内核的精髓的东西却变化不大,就像.NET,从VS2003到VS2012,已经有10个年头,VS的版本不断更新,而.NET内核的最新版本也才4.0,所以,作为程序员,我们要多掌握内核的东西,精髓的东西。

我们的学习积累毛病在于:贪多、贪全、而不够深入。对于很多技术,我们都很有兴趣,对于刚兴起的技术,也紧紧跟随。但是,几乎都是蜻蜓点水、一知半解。回头想想,我们似乎什么都会一点,什么类型的项目都可以做,B/S的、C/S的、数据库的、分布式的,等等,但是,却不敢说,在某某方面,我的水平已经超越了圈中同类型的80%的人。只是我能做的,大家都会做,而且,我也没有把握比别人做得更好。

必须要让自己有价值,而自己的价值在于不可替代性或是难以替代性。如果,随便找个程序员就能把你replace掉,你的价值就很低廉了。如果在你负责的某个方面,只有20%的人超越你,那你的价值、你的重要性就凸显出来了,你与雇主的关系就从被动转向了主动,你就有了谈判的筹码。

在专业化高度分工的今天,一技之长并不是说需要你掌握某个很大的方面,而只需要你能掌握其中的某一个小的领域,并不断地深入下去。就这个小的领域来说,你花个3、5年的时间挤进前20%是非常可能的。比如,有人专门研究SqlServer数据库优化、有人专攻TCP通信、有人深入研究IIS、有人深入钻研WCF,等等。

(more…)

Read More

[转]为什么很多程序员都选择跳槽?

共勉


今天看到一个帖子:“程序员内部晋升越来越困难,但是外部来的大P越来越多,所以很多人都选择跳槽”,之后我从三个方面简要的进行了回答:“外面来的总是有包装的,内部的都是肉身PK,此一输;外面来的总是小股人马,内部的一批批的,升谁都伤感情,此二输;外面来的通常都是大佬推荐的,没有特别重大机会,人不会来,内部的就不解释了,成果都被大佬吸收,难有机会,此三输”。之后讨论不断,我也余兴未了,继续写来。

这个世界上有一类人特别苦逼,苦逼到什么程度呢?他们省吃俭用攒钱买房,结果房价越来越贵;公司外部竞争激烈,他们工作异常繁忙,披星戴月,日复一日;技术更新行业罕见,他们要随时调整心情,随时学习知识;他们长期和机器为伍,大多比较呆傻,比较单纯;还有很多不一一例举,这一类人就是程序员。

而就是这么一类程序员过着这么苦逼的生活,在公司内部却难以获得公平的晋升机会,外来的和尚总是在不断打破平衡,甚至是刚毕业的新和尚拿得都比老和尚多,这是全行业都罕见的奇观,IT人有幸经历了。

某创业公司,某个程序员要离职,老板甚至不问问他直接领导的意见,就同意了,没有挽留,之后大骂不忠诚,这个人拿3k,拿了2年,他走了以后,老板用5k雇了个新面孔,但就是不愿意给这个老人晋升,不愿意给加到哪怕是4k。

(more…)

Read More

如何开始一个模块化可扩展的Web App

转在前:自己做过那么多的项目,平时积累的东西也挺多的,比如条件注释区分ie浏览器、比如avoiding the FOUC、比如依赖加、再比如js模版引擎。。。但是还是没有这篇文章写得全。下面开始正文:


虽然从没有认为自己是一个前端开发者,但不知不觉中也积累下了一些前端开发的经验。正巧之前碰到一道面试题,于是就顺便梳理了一下自己关于Web App的一些思路并整理为本文。

对于很多简单的网站或Web应用来说,引入jQuery以及一些插件,在当前页面内写入简单逻辑已经可以满足大部分需要。但是如果一旦多人开发,应用的复杂程度上升,就会有很多问题开始暴露出来:

  • 数据源一般都与页面分离,那么App启动一般都需要等待数据源读入。
  • UI交互复杂时,需要将逻辑通过面向对象抽象后才能更好的复用。
  • 功能间一般都存在依赖关系,需要引入支持依赖关系的模块加载器。

那么如何解决这些问题,就以一个简单的订餐App为例,从零开始一个模块化可扩展Web App

这个简单的App基于HTML5 Boilerplate、requireJS、jQuery Mobile、Underscore.js,后端逻辑用jStorage模拟实现。完成后的成品在此。所有代码可以在github查看。下文将逐一介绍实现的思路与方法。

(more…)

Read More

关于一些面试题

最近在家吃“软饭”,闲来无事写写博客吧。裸辞回到女朋友身边,现在还没找到工作(面试了些公司,发觉在这个二线城市跟我之前的三线城市都差不多,有些offer,但是感觉都很一般)。我在前公司前后都能端,尤其前端得很好,成为各个项目组疑难杂症的“救星”。(css/html/javascript相关问题)

最近在找工作,弄些题来玩玩吧。可能是做项目太久了,什么都以目标为准,对于基础知识都是用到的时候去查一下。所以一遇到基础的东西,直接傻眼。面试题仿佛让我回到以前的学生时代。

1、(js)给如下所有li元素绑定click事件,在鼠标点击的时候alert该li内容、及xy坐标等信息。且在鼠标离开外部ul元素范围时弹出alert提示。要求:注意浏览器兼容性,不要使用现成的框架库。

<ul id="ulitem">
    <li id="li1">内容1</li>
    。。。重复1000+个li对象...
    <li id="li9999">内容9999</li>
</ul>

解:对于这个题目,考察内容为:事件委托。这么多的li,循环li绑定事件,不知道浏览器会有多卡。直接将事件绑定在ul上,事件冒泡上来就做处理。考虑到兼容性的话,标准浏览器和ie的区别以及dom 2级和1级的区别。事件绑定后,有event的兼容,event.target、event.srcElement;获取内容的话,有兼容性innerText和textContent的区别,关于mouseout兼容的问题,直接看代码。

(more…)

Read More