入职之后的一些软件配置

连接Baidu无线后准入程序安装

下载了相应程序发现缺少库文件无法运行,联系IT支持之后让技术人员ssh过来解决了问题,步骤如下

  1. ldd bnac 显示缺少对应的动态库libcrypto.so.6
  2. 使用find命令找到本机中不同版本的libcrypto.so动态库的位置,并做软链接即可。例子:ln -s /usr/lib64/libcrypto.so.10 /lib64/libcrypto.so.6
  3. 再次运行bnac ./bnac -u username -p passwd

UPDATE

重装系统后发现提示libcrypto.so.4缺失,而ldd无效了,不知道是不是开发人员更换准入程序的缘故,建的软链换成libcrypto.so.6就OK了

外网上内网

上公司内网需要VPN,一般是装Cisco的VPN客户端。Linux系统下碰到一些问题,安装客户端之后无法打开,得到回复的邮件是查看这个页面,下载运行后发现报错error while loading shared libraries: libpangox-1.0.so.0:,网上找了个解决方案,在Fedora19下需要安装pangox-compat程序

[2013-07-15]

Learn Smarty

简介

Smarty的所有语法都用{}包裹,{* *}注释内容。

变量

  • $符号是变量的开始,类似php的语法规则,但是用{$foo.bar}来代替{$foo['bar']}{$foo.$bar}来代替{$foo[$bar]}。注意PHP中的hash是数组型的array('key' => 'value')
  • {#foo#}{$smarty.config.foo}一样,读取配置文件中的foo变量值
  • 系统变量比如_SERVER _GET _SESSION可以通过$smarty.server类似的方式读取
  • 双引号内的\$var会被识别

变量过滤器

过滤器可以通过在变量后加|实现,如果过滤函数可接受参数,则在函数用加:param实现。所有php函数都可以作为过滤器。比如| upper,| truncate:40,| date_format:"%Y/%m/%d"

函数

每一个smarty语句不是输出变量值就是输出函数调用的结果,函数调用的语法为{函数名 参数1=值1 参数2=值2 ...},常见的有include函数带file变量,insert函数带file,title变量等。

  • default 设定默认值,当变量的值为null或者空字符串时,显示default值(默认空白变量会报错)。可以设定多个default filter来实现多个默认值,如{$jsonError|default:$tplData.error|default:0},当前两者都为空时显示默认值0.
  • escape 转意变量,默认会转义成html的转义字符,可以指定htmlall, url, javascript, mail等

内置函数

  • capture: {capture name="foo"}xxx{/capture}将该标签内的内容存放到指定的变量名foo中,可以通过{$foo}或者{$smarty.capture.foo}访问该变量,进而判断是否需要输出,避免直接输出到HTML文件中
  • config_load: 后接配置文件名,载入配置文件中的变量值,可通过{#foo#}读取
  • foreach: {foreach from=$var key=bar item=foo}循环数组$var,将其键和值分别作为bar、foo迭代。
  • assign: {assign var="foo" value="bar"}设定名为foo的变量的值为bar

使用小记

  • 变量过滤器|必须紧跟变量之后,中间不能有空格,不然会报错
[2013-07-11]

Fedora 19 重装笔记 [update Fedora 20]

UPDATE

一年之后的今天2014/7/25,又有机会重装Fedora20,U盘启动的安装上碰到了不少问题:

  1. 首先是官方的 liveuse-creator 已经无效了,做出来的启动盘没任何反映
  2. 使用 UltralISO 制作U盘(文件->打开->启动->写入磁盘映像即可) Fedora 20 详细安装过程(图文详解)包括U盘制造过程
  3. 修改U盘下isolinux/syslinux 文件中的root=live:CDLABEL=Fedora-Live-Desktop-x86_64-20-1 为U盘的名字,例如FEDORA-20-2,不然在安装的过程中,会找不到启动盘
  4. 记得进入Windous删除一个分区用来安装Linux, 磁盘管理 Win8如何创建、删除或格式化硬盘分区

无法输入中文

  1. Fedora18之后需要在控制面板里面去设置输入法。以前的im-chooser不能正常使用了。否则会出现:“GDBus.Error...”
  2. 设置里面点“区域&语言/Region&Language”
  3. 在“输入源/Input Sources“中点添加按钮,添加你想要输入法,应该就能输入中文了。

ssh 代理

ssh -qTfnN -D 7070 wy@hellofe.com 在7070端口,参数详细解释:

  • f: 在开始执行前进行后台运行,便于输入密码等
  • n: 重定向stdin到/dev/null,当后台运行时必须要加上该参数
  • N: 不执行远程命令,当仅仅用于端口转发时非常有用
  • T: 禁止伪tty的分配
  • q: 静默模式,忽略掉大部分警告和诊断信息

开篇

今天入职,发了工作笔记本x230,据说可以用linux系统,于是果断Fedora 19撸起,安装的时候小郁闷,第一次装好之后想输入中文直接删除了d-bus服务,装了fcitx,结果发现不能用,只好重装fedora了(后来才发现只要在language里面设置一下就好了 --!,囧)

安装完成后的操作

安装yum的remove-leaves插件,删除残留依赖

  1. sudo yum install yum-plugin-remove-with-leaves.noarch
  2. 配置默认启用插件,编辑/etc/yum/pluginconf.d/remove-with-leaves.conf,去掉remove_always=1前面的注释即可

删除用不到的软件

sudo yum remove empathy
sudo yum remove evolution

安装chrome浏览器

  1. 添加chrome的源 在/etc/yum.repos.d/目录下面创建google-chrome.repo文件并写入以下内容:
    
    [google-chrome]
    name=google-chrome - 64-bit
    baseurl=http://dl.google.com/linux/chrome/rpm/stable/x8664
    enabled=1
    gpgcheck=1
    gpgkey=https://dl-ssl.google.com/linux/linux
    signing_key.pub
  2. sudo yum install google-chrome-stable/beta/unstable安装对应的版本

安装Idea

Oracle JDK下载链接居然被墙了,尼玛,vpn连上去下载也不稳定,只要使用linode下好文件之后,再scp到本地,万恶的qiang,rpm -Uvh jdk-xxx.rpm安装好就行。

PS:安装完后运行IDEA提示JAVA_HOME变量未设置,在/etc/profile文件中加入JVM的路径即可,Oracle JDK对应的目录为/usr/java/jdk1.7.0_25

#Oracle JDK for IDEA
JAVA_HOME="/usr/java/jdk1.7.0_25"
export JAVA_HOME

安装VirtualBox

使用官方的RPM进行安装

使用rpm-fusion安装报错,发现原来直接用官方的RPM包安装好简单

  • rpm -ivh 发现报错Recompiling VirtualBox kernel modules [FAILED]
  • 查了这个帖子,装了下kernel-devel
  • 再执行sudo /etc/init.d/vboxdrv setup就可以了,so easy

  • 下载rpm fusion的源,以支持yum安装[下载链接](http://rpmfusion.org/Configuration)
  • 安装好VirtualBox之后,需要装一下当前内核版本对应的`kmod-VirtualBox-xxx`,具体查看运行报错信息即可

PS: 装好之后发现无法上网,查看了下设备管理器发现VMvare的网卡前显示黄色叹号,右键 > 更新驱动 > 手动选择另外一个驱动就好了,是YLMF OS自带的驱动包覆盖了Vmware的默认驱动导致无法上网。参考

装系统注意事项

今天换了ssd,重做了下系统,结果发现无法挂载原先的fedora分区,后来发现是因为两次都使用了LVM分区,而默认的组都是fedora导致无法挂载(当前系统的自动挂载占用了fedora分组),只好重装系统换了一个分区格式,不再使用LVM了。

[2013-07-10]

部署Django

安装apache的mod_python模块

由于默认的centos6源中没有mod_python模块,因此需要安装RHEL EPEL Repo,方法如下

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm

打开remi源

sudo vim /etc/yum.repos.d/remi.repo

编辑[remi]项目下的enabled=0成为enabled=1,就可以通过yum install来安装mod_python了, 参考Installing RHEL EPEL Repo on Centos 5.x or 6.x

注意:modpython在Django1.5中已经被废弃使用,官方建议使用modwsgi

使用mod_wsgi部署Django

安装好mod_wsgi,参看django的文档, 注意这里需要选择对应的版本的参考文档,比如我的就是django 1.5。

Apache配置

<VirtualHost *.80>
Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico

Alias /static/ /path/to/mysite.com/static/

#因为使用了wsgi,所以直接针对整个根目录设置访问权限的方式无效了
#需要分别设定静态文件目录的访问权限和Alias
<Directory /path/to/mysite.com/static>
Order deny,allow
Allow from all
</Directory>

#申明使用mod_wsgi
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

#开放mod_wsgi的权限
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Order allow,deny
Allow from all
</Files>
</Directory>
<VirtualHost *.80>

注意这里,VirtualHost后面的参数*.80是由NameVirtualHost后的*.80所决定的,表示本机 任何介质上的80端口为虚拟主机。 Note that the argument to the <VirtualHost> directive must exactly match the argument to the NameVirtualHost directive. 也就是说VirtualHost之后跟的参数要和NameVirtualHost后设定的参数完全一样,也就是说不能有不同 的NameVirtualHost实体, 参考

Django配置

  1. 设置了DEBUG=False之后,需要在ALLOWED_HOSTS=[]中添加主机名或者'*',不然会报500错误且无法 被Apache捕捉
[2013-06-01]

移动设备Web开发小记

关于touchstart和gesturechange

知识点回顾

  1. 第一根手指放下,触发touchstart
  2. 第二根手指放下,触发gesturestart
  3. 触发第二根手指的touchstart
  4. 立即触发gesturechange
  5. 手指移动,持续触发gesturechange
  6. 第二根手指提起,触发gestureend
  7. 触发第二根手指的touchend
  8. 触发touchstart!多根手指在屏幕上,提起一根,会刷新一次全局touch!重新触发第一根手指的touchstart
  9. 提起第一根手指,触发touchend

碰到的坑

由于我同时需要touchstart和gesturechange事件来绑定不同的操作,因此就在touchstart中设置了 一个延时,然后在gesturechange中clear掉延时句柄,但是测试结果是有时有效有时无效,原来在 gesturechange事件中,会触发多次touchstart,而我只是在gestutechange中进行了clearTimeout, 其实是应该在touchstart中也clearTimeout一下,这样就顺利解决了该问题。

有人说:那你干嘛不直接用click事件?因为采用了Kinetic的框架,在移动设备上不会触发click 事件,真是囧,估计是开发人员为了避免touchstart和ckick事件重复触发,而直接阻止掉了事件的冒泡。 --其实我想说的是这些事件都是由这个框架框架的一个canvas物理引擎所模拟的,人家并没有实现 touchstart 事件到click事件的冒泡。。。

[2013-05-29]

配置服务器记录

安装pip [5.23]

考虑部署毕设项目,结果发现centos上没有pip和easy_install,参考下列方法:

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo easy_install pip
[2013-05-23]

学习IntelliJ IDEA

快捷键

跳转

  • ctrl b跳到变量申明处
  • ctrl [ | ]跳到相应的闭合处

显示

  • ctrl F12快速显示文档结构
  • ctrl shift i显示当前函数的定义
  • ctrl p显示详细参数
  • ctrl ~切换主题

切换

  • alt left|right切换打开文件标签

操作

  • ctrl alt T 包裹代码 ctrl shift del删除包裹
  • ctrl x 删除当前行
  • ctrl r查找替换 ctrl shift r全局查找替换
  • ctrl shift up | down 当前行上移下移
  • ctrl d复制上一行并插入
  • ctrl shift u切换大小写
  • ctrl F11添加/删除标签

选中

  • ctrl shift [ | ] 选中块代码,并跳转到闭合处

注释

  • ctrl / 行内注释 ctrl shift / 多行注释

配置记录

soft wrap 设置换行显示

在用markdown写博文的时候,发现手动换行控制文本长度的方式是错误的--!,因为html会自动将换行符号解析成一个空格,所以在博文排版的时候,就会出现问题咯。而且手动控制换行在博文需要修改的时候,就会异常蛋疼,因为加了几个字就超出了。其实应该设置编辑器换行显示,而不是真正的在文件中进行换行。查找帮助文档,发现应该设置soft wrap,就会在文本超出编辑器视窗时自动进行换行,设置show all soft wraps可以在有编辑器换行的地方都显示箭头以区分。

配置主题和样式

IDEA里面的样式有菜单主题和编辑界面高亮2种,比较容易混淆 1. 菜单主题。在Apperance中设定,有很多方案,修改之后会改变IDEA的外观,菜单的字体、大小、颜色等等 2. 高亮主题。在Editor > Colors & Fonts中设置,默认就2种: default和Darcula,主要是编辑区域关键词的高亮方案。该栏目下面可以针对不同类型的文件设定不同高亮方案,比较复杂。

使用注意事项

设定tags格式错误导致无法生成静态文件

(2013-6-18)在设定文章tags时,由于遗漏了标签名和分隔符-之间的空格,导致jeklly无法生成新的最新静态文件

[2013-05-22]

Google Javascript 编码规范

原文地址

语法规则

删除属性

使用obj.x = null,而不是delete obj.x

this

只在constructors、methods、和closures中使用

编码规范

命名

  • 文件名用小写,避免不同平台大小写敏感度问题,推荐用-连接
  • 可选参数由opt_带头
  • 可变数量参数的函数,最后的参数应该命名为var_args,同时在@param中指出
  • 不要依赖window命名空间

使用JSDoc来进行注释

换行缩进4个空格

JSDoc Tag Reference

@fileoverview
@author kuth@google.com (firstName lastName)
{@code ...} 申明括号内的内容是代码
@const / @const {type}
@constructor //申明是构建函数
@enum
[2013-05-22]

学习使用Kineticjs(Canvas类库)

由于采用SVG方案(Raphaeljs)在IPAD上的展示效果并不好,绘图耗时太大(600ms,5*1000个点), 决定对比一下Canvas方案,找了(Kineticjs),经过测试,同等绘图在IPAD上时间降低到了仅有80ms 左右,对于复杂图形曲线,Canvas才是王道。本文简单记录在学习使用Kineticjs过程中的一些认识和心得。

工作原理图

Kinetic stages are made up of user defined layers. Each layer has two canvas renderers, a scene renderer and a hit graph renderer. The scene renderer is what you can see, and the hit graph renderer is a special hidden canvas that's used for high performance event detection. Each layer can contain shapes, groups of shapes, or groups of other groups. The stage, layers, groups, and shapes are virtual nodes, similar to DOM nodes in an HTML page. Here's an example Node hierarchy:
Kinetic stages由用户定义的layers组成,每一个layer具有两个canvas渲染引擎,一个可见的场景 解析引擎,一个高性能事件检测的碰撞引擎,(在DOM中,每一个layer对应一个背景色透明的canvas元素 stages作为外层容器将所有add到其中的layer进行叠加。)每一个layer作为独立的Canvas元素,可以包含形状, 形状组合,组合的组合,其结构图可以图下所示
Stage | +------+------+ | | Layer Layer | | +-----+-----+ Shape | | Group Group | | + +---+---+ | | | Shape Group Shape | + | Shape

Kinetic.Path

能够根据提供的SVG String来绘制路径,方便复用Rapheal中的代码

Kinetic.Text

直接使用文字来绘制坐标值,在我的项目中消耗了30ms之间,而绘制Grid和仅需要10ms,因此,将文字 作为HTML元素来进行控制,不采用原生的Text。

碰到的问题

无法通过context.fillText动态写入 / 无法使用原生API

因为在回调函数中,立即进行了stage.draw(),导致通过脚本写入的东西都会消失,(原理估计是Kinect 在draw()或者初始化时,不支持原声的Canvas API,而是完全通过Kinect的API来绘制)这也解释了之前 碰到的用Canvas默认的API绘制coordnate无效的原因。 果然,用setTimeout(fn, 0)或者将代码加到stage.add(layer)之后就可以了! 总结:只有stage.add(layer)之后,才是真正的在DOM中创建CANVAS元素,之后才能利用CanvasAPI 来进行操作,其他的调用Kinetic的操作都只是写入一些配置文件。

对layer绑定click事件无效

Kinetic中的事件是由hit graph render实现检测的,对于layer,只能识别出该层上的元素上发生的 点击事件。由于整个stage是由多个layer叠加而成的,因此对于某一层上空白区域的点击,是不会触发 该层上的点击事件的。

[2013-05-19]

使用weinre来调试移动页面

毕设要做的东西涉及到ipad上网页的开发,调试起来没有chrome控制台,咋办?使用weinre!

weinre能做什么?

和之前android设备上调试移动网页类似,提供一个页面,类似chrome控制台,在上面的操作会对应到 ipad或者手机上的页面。

使用weinre

参考链接

安装

sudo npm install weinre

使用

  • 开启服务,如果要跨设备调试,比如用ipad访问电脑上的文件,那么指定服务的ip,例如 weinre ----boundHost 192.168.1.112
  • 需要调试的页面上加入javascript: <script src="http://192.168.1.112:8080/target/target-script-min.js#anonymous"></script>, 加载页面。
  • 浏览器中打开http://192.168.1.112:8080/client/#anonymous, Targets选项表示当前被调试的页面,选中,进入Elements Tab
  • 好了,远程的chrome控制台出现了,移动设备也能完美Debug了
[2013-05-17]

毕设中移动Web开发的一些笔记

触摸事件和点击事件

移动设备中,会有touch事件和mouse事件,其发生的顺序如下所示: touchstart,touchmove,touchend,mouseover,mousemove,mousedown,mouseup,click, touch事件会占用300ms左右的时间,因此直接通过click时间来支持移动设备是不合适的。 在这个过程中,如果阻止了touch事件(preventDefault()),那么后续的鼠标事件将不会触发,这样 就可以同时注册touch事件和click事件,但是在touch事件中,调用e.preventdefault()来停止触发 click事件,以避免多次调用。(注意:使用zepto.js附带的touch event模块时,在tap事件中 调用e.preventDefault()事件无法阻止click事件的触发,只能直接addEventListener才生效)

手势事件 gesture event

参考 这个事件是对touch event的更高层的封装,和touch一样,它同样包括 gesturestart(当有两根或多根手指放到屏幕上的时候触发), gesturechange(当有两根或多根手指在屏幕上,并且有手指移动的时候触发 ), gestureend(当倒数第二根手指提起的时候触发,结束gesture)三个事件回调。 事件处理函数中会得到一个GestureEvent类型的参数,它包含了手指的scale(两根移动过程中分开的比例 )信息和rotation(两根手指间连线转动的角度)信息。

分别将两根手指放到屏幕上时触发的事件

  1. 第一根手指放下,触发touchstart,除此之外什么都不会发生(请参照第二篇文章,手指提起才会触发 mouse的各事件)
  2. 第二根手指放下,触发gesturestart
  3. 触发第二根手指的touchstart
  4. 立即触发gesturechange
  5. 手指移动,持续触发gesturechange,就像鼠标在屏幕上移动的时候不停触发mousemove一样
  6. 第二根手指提起,触发gestureend,以后将不会再触发gesturechange
  7. 触发第二根手指的touchend
  8. 触发touchstart!注意,和第一篇文章里介绍的一样,多根手指在屏幕上,提起一根,会刷新一次全局 touch!重新触发第一根手指的touchstart,这点和苹果官方网站上介绍的不同。
  9. 提起第一根手指,触发touchend
[2013-05-15]

Touch And Mouse - Together Again For The First Time

毕设项目中关于touch和click踩了几个坑,挖到一篇好文,拜读一下 原文链接

同时支持Touch和Mouse

一次触摸发生的事件

  1. touchstart -- 手指放在DOM元素上
  2. touchmove -- 手指在DOM元素上移动
  3. touchend -- 手指离开DOM元素
  4. mouseover
  5. mousemove
  6. mousedown
  7. mouseup
  8. click

设备需要300ms时间来处理touch事件,因此直接通过click事件在移动设备上绑定事件是不合适的 可以在touch事件中,调用e.preventDefault()方法阻止mouse事件触发(但是会阻止所有浏览器默认的 动作,比如滚动等等)

Mousemove事件不会被Touch触发

因此点击拖拽类的插件在移动设备上不一定行得通,使用Range元素来实现拖拽条吧。

Touchmove和Mousemove不是同一件事情

touch事件的target总是开始touch的元素上,不会变化,而mousemove事件的target是当前鼠标下的元素,会变化

[2013-05-15]