Arduino操作74HC595

On 三月 5, 2013, in 技术记录, by pensz

74HC595是一个寄存器,他能够将串行的输入累积成一次并行的输出。要做的测试就是通过一个输入pin来控制多个输出pin的状态。

pin14就是接收arduino主板串行的输入,比如:

pin14输入1,且bitorder设置为MSBFIRST,则Q0输出为1,Q1  - Q7都输出为0

pin14输入3,且bitorder设置为MSBFIRST,则Q0、Q1输出为1,Q2  - Q7都输出为0

pin14输入255,且bitorder设置为MSBFIRST,Q0  - Q7都输出为0

可以说将pin14的输入转成一个二进制数,Q0 – Q7分别是他们的第1位 – 第8位。
操作74HC595,最简单的操作方法当然是使用shiftout,官方就有示例:http://arduino.cc/en/Tutorial/ShiftOut
当然,还可以使用更加高效的SPI库来操作:其实操作起来也很简单
pinMode(SS, OUTPUT)
SPI.begin()
SPI.setBitOrder(MSBFIRST)
然后是根据需要调用
digitalWrite(SS, LOW)
SPI.transfer(data)
digitalWrite(SS, HIGH)
需要注意的是几根pin的对应
SS Slave Select(默认arduino上的10) 就是 74HC595中的 pin12
MOSI(默认arduino上的11) 就是  74HC595中的 pin14
CLK(默认arduino上的13) 就是  74HC595中的 pin11
MISO 在本示例无需连接,如果要arduino接收数据,就是 74HC595中的 pin9
参考资料
http://arduino.tw/articlesindex/extend-io/213-74hc595.html
Tagged with:  

其实联通网站上的累计通话时间和实际计费的时间差不多。

如果要准确的统计,那得依赖些脚本了。

从联通的网站上面把通话记录复制出来,放到一个文件中,如 /tmp/x 然后保存以下代码到一个shell文件calllog.sh。
然后执行 cat /tmp/x | bash calllog.sh,最后就可以看到通话时间了。

awk '$4 != "被叫" && $5 != "10010"{
print $0;
pos1 = index($3, "分");
pos2 = index($3, "秒");
min=0
if (pos1 > 0) {
min = substr($3, 1, pos1-1);
# print "min:" min;
}
if (pos2 > 0) {
min = min + 1;
}

print "tmin:", min;
total += min;
}
END {
print "total:", total;
}
'

Tagged with:  

php中的curl几点需要注意的地方

On 十二月 2, 2012, in 技术记录, by pensz

1 CURLOPT_POSTFIELDS中的玄机

curl_setop($ch, CURLOPT_POSTFIELDS, $var); 但不知道内有玄机,php的doc里面有这么一段话。

If value is an array, the Content-Type header will be set to multipart/form-data.

要知道一般POST时,会以application/x-www-form-urlencoded 的 Content-Type POST。而 multipart/form-data 一般用于上传文件。

关于两者的区别,不想读rfc的可以先看看 http://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data

两种情形下POST样例:

application/x-www-form-urlencoded 形式的POST

POST / HTTP/1.1
Host: 192.168.201.197
Accept: */*
Accept-Encoding: gzip
Content-Length: 8
Content-Type: application/x-www-form-urlencoded

url=xxxx

multipart/form-data 格式的POST:

POST / HTTP/1.1
Host: 192.168.201.197
Accept: */*
Accept-Encoding: gzip
Content-Length: 153
Content-Type: multipart/form-data; boundary=—————————-e62c3de4a033

Content-Disposition: form-data; name=”url”

xxx

2 curl中PUT文件

现在都流行RESTful的接口,很多接口要求客户端PUT方式上传文件。在php中,使用curl发起PUT的请求,有两种方法:

curl_setopt($ch, CURLOPT_PUT, 1);
或者
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ‘PUT’);

当你想使用PUT上传文件时,请不要使用第二种,因为它不会上传文件。

 

Tagged with:  

关于bash的启动运行的文件

On 十二月 1, 2012, in 技术记录, by pensz

工作上经常碰到环境变量不对,bash运行行为和自己期望的不一致,于是想花点时间看看bash.

说起来,这件事情应该再简单不过了,看看bash手册上写的便是了.

http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

但是坦白来说,我花了很长时间才看明白了一点.

看到的一些结论
如果是login的shell,那么bash在运行先执行 /etc/profile ;然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile;如果找到其中一个文件就执行之,后面的就不执行了.

如果是interactive的非login shell,则先会执行 /etc/bash.bashrc,如果~/.bashrc存在的话,接着执行~/.bashrc.

如果是非interactive的,且非login shell,则执行 $BASH_ENV 对应的shell.

ssh到远端的机器,远端机器上的bash会执行什么呢?如果是login shell,不用说,和第1种一样;如果是ssh remote-machine ‘cmd’这种的(也就是我们一般shell脚本里面调用形式),则会执行~/.bashrc(远端机器上的bash在编译bash的时候define了SSH_SOURCE_BASHRC ).

有些问题
什么是interactive shell,什么是login shell

interactive shell就是顾名思义,有用户交互的,检查方法就是在命令行下执行 echo $-,如果有i这个选项,则就是interactive shell 了.

login shell简单来说就是bash启动的时候加了 -l选项.

举几个实际的例子:

interactive & login shell:

linux登录到真实的终端tty1

interactive & non-login shell:

打开终端模拟器,在终端模拟器里面执行/bin/bash -i cmdfile

non-interactive & login shell

在终端模拟器里面执行/bin/bash -l cmdfile

non-interactive & non-login shell:

在终端模拟器里面执行/bin/bash cmdfile

为什么我在手动在机器上可以ssh到远端机器的,但是在shell脚本里面不行?

这种情形出现在ssh到远端机器的private key是有passphase 的,简单来说,ssh 到远端机器的时候,你还需要输入这个pass phase的,那为什么你一般ssh到远端机器的时候不要输入passphase呢,这个就是ssh-agent的功劳了,ssh通过环境变量中的SSH_AUTH_SOCK和SSH_AGENT_PID获得真实的private key。

简单来说,因为这个时候有了SSH相关环境变量。这些环境变量一般在通过keychain设置的,而keychain一般是startup脚本里面执行的。 解决办法就是bash -l.

骗人吧,按你的说法,ssh过去要执行~/.bashrc的,但是我~/.bashrc里面的命令没有执行

应该.bashrc里面有一段话,[ -z "$PS1" ] && return 也就是说,如果是非interactive的时候,PS1不会被设置,然后就return了,后面的命令当然没有执行.

interactive & login 的shell怎么也执行 ~/.bashrc 了?

看看 ~/.bash_profile, ~/.bash_login, ~/.profile 这几个文件中,应该有写

if [ -f "$HOME/.bashrc" ]; then
. “$HOME/.bashrc”
fi
ssh remote-machine ‘cmd’ 为什么不行啊?

一样的道理,PATH环境变量不是在 ~/.bashrc里面设置的.

ssh remote-mache ‘cmd’ 的时候不执行~/.bashrc啊?

编译bash的时候没有define SSH_SOURCE_BASHRC.

我的cmdfile在shebang部分里面已经声明了#!/bin/bash -l 了,但是它表现的不是login shell

不要使用 /bin/bash cmdfile 这种方式运行,要么使用cmdfile直接运行,要么使用/bin/bash -l cmdfile运行.

Tagged with:  

hive相关

On 十一月 24, 2012, in 技术记录, by pensz

最近一直使用hadoop hive做数据分析,遇到一些问题,也收获一些,记一下。

一些经验和大家分享:

1 使用external table会比较方便管理,将数据放到hdfs中,然后再基于hdfs建external表,这样你可以随心所欲的管理你的数据,可以使用hive的external table来查询,也可以自己直接写mapreduce job来处理;使用external table的另外一个好处是可以随便改变table的schema,因为在drop table时数据不会丢失;只是删除元信息,所以,如果schema需要调整,删掉重新建就是了。

2 能使用hql做的事情还是用hql吧,写mapreduce毕竟麻烦,数据调试是个问题。

3 hql和sql还是有些地方不一样的,比如group by的时候不能用column的alias,详情可以参考我的这个回答

4 hql里面的条件可以随便的使用like ‘%%’ 了,因为基本上所有的hql都会转换成mapreduce job,所以,你使用like ‘%%’只是在map的时候稍微多了点计算量而已。

5 hwi玩玩还可以,但是无法真正用于生产环境:结果默认保存到内存中;输入的hql有错又不知道是什么错;跑一段时间会挂掉;界面极度难用等等,这些问题都是它被正式使用的障碍。

一些问题的解决方法:

hive报metadata错:

FAILED: Error in metadata: javax.jdo.JDOFatalInternalException: Unexpected exception caught.
NestedThrowables:
java.lang.reflect.InvocationTargetException
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

解决方法:删掉 $HADOOP_HOME/build ,这种情况很有可能是大家的hadoop用的是src版本,然后编译出来有build,具体为什么会因此报错,还不得而知。

hadoop datanode无法启动:

这个主要是mac os上会遇到,在$HADOOP_HOME/logs/*datanode*out 中看日志,会发现有:

Unable to load realm info from SCDynamicStore

在$HADOOP_HOME/conf/hadoop-env.sh 中设置一下HADOOP_OPTS即可

export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"

hwi无法启动:

在$HIVE_HOME/conf/hdfs-site.xml中加入

<property>
    <name>hive.hwi.war.file</name>
    <value>/lib/hive-hwi-0.8.1.war</value>
    <description>注意上面的地,war换成你自己的包文件名称</description>
</property>
Tagged with:  

hadoop trails

On 十一月 24, 2012, in 技术记录, by pensz

最近在捣鼓hadoop相关东东,部门里面需要总结一个hadoop相关的trails,方便后面freshmen加入时可以参考。写了写,可能不对,供新手参考。自己也还是一个新手啊。

hadoop还是很多值得学习的地方,hadoop建立者Dogg Cutting 也是lucene的作者,现在又是ASF的主席。

 

名词解释

与hadoop关联的软件、名词非常多,这里列出一些常用的。

  • hadoop: 一整套分布式存储、计算解决方案
  • hdfs: 一套分布式文件系统
  • mapreduce: 一套分布式计算框架
  • hbase: 基于hdfs的column family 的nosql数据库
  • hive: 一套将类似sql的hql转换成mapreduce job的工具
  • thrift: 一套用于各种语言间通讯的协议以及实现

搭建环境

搭建基本的hadoop环境

  • 在本地环境搭建伪分布式的hadoop环境,包括基本的hdfs和mapreduce
  • 在本地环境搭建hive和hbase等关联的环境

检验

  • 本地能够搭建一个hadoop环境,并且实现以下功能
  • 将本地文件放入hdfs
  • 运行一个基于hdfs的mapreduce示例程序

使用hdfs

需要知道的知识

  • hadoop文件存放的方式
  • hadoop对文件系统操作命令行的使用

检验

  • 上传文件到hdfs
  • 从hdfs中获取文件到本地

使用mapreduce

需要知道的知识

  • 基本的java面向类编程
  • mapreduce的过程
  • 如何自己写一个mapreduce程序
  • 如何运行mapreduce程序

检验

  • 知道什么逻辑应该在map端处理,什么逻辑在reduce时处理
  • 写一个程序统计一个文件中各个单词出现的次数

进一步了解hdfs

需要知道的知识

  • hdfs的架构
  • namenode和datanode的作用
  • hdfs中的block

检验

  • 描述一个客户端上传文件到hdfs时,各个结点之间的通讯次序。

进一步了解mapreduce

需要知道的知识

  • 数据如何在map和reduce过程传递的
  • job是如何分配的
  • 输入的数据是如何分配给map程序的
  • map计算出来的结果是如何组织的,然后传递给reduce的
  • 一个任务map的个数取决于哪些因素

检验

  • 描述一个客户端提交了一个mapreduce的任务,hadoop内部各个结点做了哪些动作。
  • 自定义mapreduce的InputFormat, OutputFormat, Writable

 

Tagged with:  

在eclipse中调试solr

On 六月 10, 2012, in 自言自语, by pensz

最近需要查看搜索执行代码的情况,故需要在eclipse中调试solr,网上出名那篇来自lucid的《setting up apache solr in eclipse》,但个人觉得不是很方便。

自己看了一下,可以使用以下方法:

1 下载solr的src包,并解压

2 解压后,在解压后的根目录执行ant eclipse,即生成eclipse需要的项目文件

打开eclipse,File > Import > Existing Projects into Workspace

选择刚才解压后的根目录,这时候java build path等都已经设置好了。

3 Open Type找到StartSolrJetty 这个类,修改main方法里面的setPort参数为默认的8983,以及ContextPath,War

War为”solr/webapp/web/”

最后的代码应该是这样的:

Server server = new Server();

SocketConnector connector = new SocketConnector();

// Set some timeout options to make debugging easier.

connector.setMaxIdleTime(1000 * 60 * 60);

connector.setSoLingerTime(-1);

connector.setPort(8983);

server.setConnectors(new Connector[] { connector });

WebAppContext bb = new WebAppContext();

bb.setServer(server);

bb.setContextPath(“/solr”);

bb.setWar(“solr/webapp/web”);

 

4 设置solr.solr.home,并run

在run configure中Arguments > VM arguments中写入

-Dsolr.solr.home=solr/example/solr

使用solr自带的一个example作为sold配置的根目录,如果你有其他的solr配置目录,设置之即可。

点击run即可,debug也是一样可以用了。

 

swfupload笔记

On 三月 4, 2012, in 技术记录, by pensz

很早以前记的,放在草稿箱里,没有发出来,现发出来,因为是笔记,所以看起来可能比较乱。

swfupload是上传大文件、显示上传进度以及一次上传多个文件的很好选择。但由于其采用了flash做为上传的客户端,带来了以下问题:

  • cookie无法和浏览器共享:如果你限制用户登录了后才能上传,那么,用户在浏览器里的cookie你要通过post的形式传过去。
  • 跨域问题:若swfupload所用的swf文件和上传处理段不在同一域名,便有此跨域问题,解决倒也简单,在上传处理端加个crossdomain.xml即可。

crossdomain.xml示例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="all"/>
    <allow-access-from domain="*.swfuploadfile.com" />
    <allow-http-request-headers-from domain="*" headers="*" />
</cross-domain-policy>

更让人头疼的是报2038错误(error=-200 message=#2038),这个错误实在折腾人啊。

先看看adobe官网是怎么说的:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html?filter_flash=cs5&filter_flashplayer=10.2&filter_air=2.6
里面讲到了ioerror出现的可能

  • An input/output error occurs while the player is reading, writing, or transmitting the file.
  • The SWF file tries to upload a file to a server that requires authentication (such as a user name and password). During upload, Flash Player or Adobe AIR does not provide a means for users to enter passwords. If a SWF file tries to upload a file to a server that requires authentication, the upload fails.
  • The SWF file tries to download a file from a server that requires authentication, within the stand-alone or external player. During download, the stand-alone and external players do not provide a means for users to enter passwords. If a SWF file in these players tries to download a file from a server that requires authentication, the download fails. File download can succeed only in the ActiveX control, browser plug-in players, and the Adobe AIR runtime.
  • The value passed to the url parameter in the upload() method contains an invalid protocol. Valid protocols are HTTP and HTTPS.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/runtimeErrors.html

  • 2038 File I/O Error.This error occurs when an application can’t get file size, creation date or modification data using the FileReference API.

大概意思就是没有办法获得文件信息,另外一方面是由于上传接口需要http验证,无法输入用户名和密码无法所致。

那么先检查一下上传接口是否有上述问题(使用最原始的上传方式检查),如果上传接口正常,那么需要想想是不是客户端的问题了。有用户说杀毒软件会禁止flash上传,这个我没有实际的验证,但的确遇到过在同一swfupload系统,在有些客户端报2038错,而在其他的地方正常。

若所有的客户端都出现此问题,那么还是有可能上传接口的问题,我就碰到一例:

情况如下:

  • 上传接口前面有一nginx做转发,且这个nginx距离实际处理上传文件的app服务器还有一段距离。
  • 上传小文件正常,上传大文件会报2038 io error。
  • 若不使用nginx转发,flash直接往app服务器上传文件,大文件也正常上传。

去检查nginx的log

cat nginx.log  | grep Flash | awk ‘$12 == 413 {print $0}’

发现nginx的响应状态是499,而非正常的200。

怀疑nginx转发有问题,在客户端上传的同时,在nginx服务器上抓包看看:

sudo tcpdump  -vvv -n -A host upload-app and port 80

发现nginx转发的request的post数据不全,同时upload-app服务器上给出的响应是 400 bad request。

至此,初步将原因定为flash player主动断开连接,因为本地的nginx log里面是499,关于499,http协议rfc2616中没有定义,通过相关资料查询可得,499为客户端(flash player)主动断开连接。关于nginx的499可以参考以下文章:

为什么flash会主动断开连接?我也不知。

 

 

 

 

Tagged with:  

杂记

On 一月 17, 2012, in 自言自语, by pensz

总要写点什么吧?不为别的,为了2012-12-21前多写写文章,多给这个星球留下些琐碎。

还记得大学时,高崇伊老师跟我们讲,有人问大物理学家费曼,如果世界真的毁灭了,只能留给后人一句话,这句话是什么。费曼说,世界是由原子构成的。

假设2012-12-21真的是世界末日,你会愿意像这样生活、工作吗?会对现在做的一切都是满意吗?2011年,当我每天都对这些说no时,我再也无法忍受,我选择了重新开始。

写写过去一年的总结?新的一年的展望?

总结就罢了,过去的一年都在审视自己的现状,审视自己过去做过的事情,再怎么总结也挤不出什么味道。

展望也很简单,生活上希望有所改变;工作上面,能够把目前手上负责的几个项目做好,能够带出一个好的团队来。过去的一年真的没有什么进步。

听着王力宏的《唯一》,仿佛时间回到了十年前的傍晚,我坐在教室后面上自习,当时学校广播里放的也是这个歌。只是,这歌还是这歌,时间逝去,再已无法追回。大学的论坛很多时候都不敢上去,每每上去,看着熟悉又模糊的照片和文字,都会偷偷的把眼泪往肚子里咽;不是失望,也不是激动,而是对那段已经逝去的青涩,心里有诸多不舍和不甘。想念当时军训完用帽子舀花香的情形,虽然当时兵败2001高考,但幸运有一个基地班的过渡,我没有继续颓废下去。

有时候真的不知道从何说起,人真的是复杂的动物。罢矣,收拾心情,明天继续上班。

 

一般情况下,我们使用一个dns服务器就能达到我们的需求,但有时候我们需要针对不同域名,使用不同的dns,如以下场景:

  • 需要dns服务器A去解释某国外域名
  • 需要dns服务器B去解释局域网内部的域名
  • 默认使用dns服务器C

通用的解决方法是使用自己搭建的dns forwarder服务器,然后针对不同的zone设置不同的dns服务器,bind和dnsmasq都可以做这种dns forwarder的工作。

但如果你是在mac中,则有更加简单的方法:

  1. 在 /etc/ 目录下建立 resolver 文件夹,即 /etc/resolver 目录
  2. 在/etc/resolver 目录下,针对不同的域名zone建立不同的解析文件;如我要对zwsun.com使用192.168.1.1的dns服务器,则建立文件zwsun.com,内容为: nameserver 192.168.1.1
  3. ping zwsun.com看看,证实一下是否设置成功

上述操作需要在root下,另外,需要说明的 是,nslookup的结果不会受这个文件的影响,但对ping程序是会生效的。

一般的策略是将大部分域名解析的dns设置在 /etc/resolv.conf中,也就是通过网络偏好设置,特殊解析需求的可以在/etc/resolver目录下建立对应的文件。

Tagged with: