十一假期这么长,本想着前段时间没有学习,这里给补上。半路接了个网站,要用php开发,寻思着学个框架吧,开发还快速,选择了貌似中国最好的php框架,边看thinkphp官网的文档,然后到论坛下载了一个blog,就开工了。文档很详细,学起来也简单,偷懒中写完了。1000rmb到手了。顺便用到PHP-ExcelReader,一起学习了
这样其实也不错,可以很快的将学到的东西用到实践中去,以后用php快速开发可以用thinkphp的这个框架了^_^。
本想着假期接着学习golang和erlang的,现在泡汤了。抽时间一点一点的看实在是不符合我的性格,像我看小说,不看则已,一看就必须看完它。
Read more...
Network programming with Go
很不错的教程,讲的很详细。《Network programming with Go》http://jan.newmarch.name/golang/,照着教程写了一个小程序。
Read more...
//server.go
package main
import(
"fmt"
"net"
"os"
"time"
)
func handleClient(conn *net.UDPConn){
var buf [512]byte
n, addr, err := conn.ReadFromUDP(buf[0:])
if err != nil{
return
}
fmt.Println(string(buf[0:]))
daytime := time.Now().String()
fmt.Println(n,addr)
conn.WriteToUDP([]byte(daytime),addr)
}
func checkError(err error){
if err != nil{
fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())
os.Exit(1)
}
}
func main(){
service := ":1200"
udpAddr, err := net.ResolveUDPAddr("up4",service)
checkError(err)
conn,err := net.ListenUDP("udp",udpAddr)
checkError(err)
for{
handleClient(conn)
}
}
//client.go
package main
import(
"fmt"
"net"
"os"
)
func checkError(err error){
if err != nil{
fmt.Fprintf(os.Stderr,"Fatal error:%s",err.Error())
os.Exit(1)
}
}
func main(){
if len(os.Args) != 2{
fmt.Fprintf(os.Stderr, "Usage:%s host:port", os.Args[0])
os.Exit(1)
}
service := os.Args[1]
udpAddr, err := net.ResolveUDPAddr("up4",service)
checkError(err)
conn,err := net.DialUDP("udp",nil,udpAddr)
checkError(err)
_,err = conn.Write([]byte("hello"))
checkError(err)
var buf [512]byte
n,err := conn.Read(buf[0:])
checkError(err)
fmt.Println(string(buf[0:n]))
os.Exit(0)
}
,以后再扩展功能,先睡觉。
这段时间总结
找到第一份实习工作,正在努力中。。。
创业公司,做棋牌游戏,应聘前知道要用c++,从图书馆借了两本书。看了一下,基本还是语法和注意问题:书名《你必须知道的222个C++语言问题》《C++应用程序性能优化》。感觉《C++应用程序性能优化》这本书讲的要好很多。面试时,没问技术问题,看我对计算机比较感兴趣,就留下了。
开始主要将官方主页重写了。用的php,框架是别人拼凑的我用他的代码完成工作,有时候放不开手脚,不敢改。一是自己不保证改了这里,对先前写好的代码没有影响。二是嫌太麻烦。我想还不如我重写,或换个框架。
学到的东西还是很多的,以前生活中的小事(比如随手的帮助),脑子中有却不行动。现在受韩哥(在学校时是学生会的)影响这些事也敢做了。只是自己自由学习的时间比较少了,博客更新也出不来,很多事我一放下基本就拿不起来了。
今晚有点累,小小总结一下,顺便想在关于那,写写自己的计算机史。假期里接了一个小活,时间又不多了,虽然其中也有小偷懒。
Read more...
javascript提示是否删除
非常简单实用的方法,收藏了。这几天写的东西没用jquery,但是有些功能还是想从简,比如这个提示是否删除。最简单的方法还是只是弹个提示框,于是找到这个方法。
JavaScript弹出确认消息框判断是否删除,删除前提示用户是否删除,点是删除,点否返回。
Read more...
删除
用法:onClick="return confirm('是否删除此条记录?')"
onClick在点击时(这里是指点击这条超链接)触发,confirm会返回“是”(true)或者“否”(false),返回“否”就不产生跳转。
原来这个js中return可以控制超链接是否跳转啊,神奇,嘿嘿,忒神奇了~
golang中strings包学习第二篇
func Join(a []string, sep string) string
,连接字符串,以sep作为分隔符
例子:
s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", "))
输出:
foo, bar, baz
,源代码分析
1.判断a的长度,0时,返回空字符串,长度为1时,返回a[0].
2.否则,在变量n中保存将要生产字符串的长度。计算方法len(a)-1个sep的长度 + 数组a中字符串长度和。
3.创建一个长度为n的byte数组。将数据复制到数组中,copy()将返回复制元素的个数,用bp来记录复制的位置。最后转成string返回。
func Split(s, sep string) []string
,分割字符串,sep为空字串时,与上一篇讲到的一样,相当于每个字符之间的间隔。s中没有sep,返回值里只有一个元素s。
例子:
fmt.Printf("%q\n", strings.Split("a,b,c", ","))
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
fmt.Printf("%q\n", strings.Split(" xyz ", ""))
fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))
输出:
["a" "b" "c"]
["" "man " "plan " "canal panama"]
[" " "x" "y" "z" " "]
[""]
,源代码return genSplit(s, sep, 0, -1)
看看func genSplit(s, sep string, sepSave, n int) []string。
func genSplit(s, sep string, sepSave, n int) []string
,有几个函数都用到这个函数,通用分割字符串的函数。
n 是返回分割的个数,-1时,返回所有。
sepSave是被分割的位置在sep所在位置的偏移,被用于SplitAfter和SplitAfterN这些函数,使用len(sep)作为sepsave可以返回sep最后一个字符前面的字串作为一个分割。
1.n为0时,返回nil。
2.sep为空字串,return explode(s, n),
3.当n<0时,应该返回所有,n为Count(s, sep) + 1,表示长度。
4.定义几个变量,c是用于比较是否和sep相等,都是先比较第一个字符。相等再看字符串长度为一,则找到;不为一,比较整个sep。a是被返回的数组,na是在数组中存储的位置。
东西零碎 utf8包的内容,写下来的目的是使自己是真正的明白,而不是一看知道是这么回事,但是不想为什么要这样写。现在感觉自己用来学习的时间很少,珍惜一下。
golang中strings包学习
打算把golang的常用包都看一遍,分析一下包的代码,觉得从中会学到golang的编程方法^_^。
Read more...
func Index(s, sep string) int
返回s中第一次出现sep的位置,如果没有返回-1.
例子:
代码:
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
输出:
4
-1
看源码中index的实现方法,
1.取得sep的长度。如果长度为零,返回0。否则取sep第一个字符。
2.如果长度为1,for循环比较s[i]和sep[0],相等,返回i。都不相等,返回-1。
3.如果长度大于1,for循环比较(先比较s[i]和sep[0],不相等就i++,再比较s[i:i+n] == sep。)成立返回i,否则返回-1。比较的上限是i+n。
相关函数:
func Contains(s, substr string) bool
如果substr在s中,返回true。
代码:
fmt.Println(strings.Contains("seafood", "foo"))
fmt.Println(strings.Contains("seafood", "bar"))
fmt.Println(strings.Contains("seafood", ""))
fmt.Println(strings.Contains("", ""))
输出:
true
false
true
true
源代码中用index函数实现,return Index(s, substr) >= 0。
func LastIndex(s, sep string) int
,返回在s中最后一次出现sep的位置,不存在返回-1。
例子就过了,源代码分析,与index()相似,但是判断的时候是从s的后边向前判断。
func Count(s, sep string) int
,统计sep在s中出现的次数,非重叠的,比如s=“eeee”,sep="ee",结果返回2.
例子:
fmt.Println(strings.Count("cheese", "e"))
fmt.Println(strings.Count("five", "")) // before & after each rune
结果:
3
5
,我对第二个例子不理解,在群里问了一番,开始回答的我没明白。后来第二个给我回答我才明白:这里“”字符串指的就是字符串中每个字符之间的空字符串T_T,函数返回了s中有几个这样的空字符串。后面的英文注释直接看不懂T_T,悲催。现在看应该是每个字符的前面加后面。。。
源代码中“”时,返回utf8.RuneCountInString(s) + 1,这里不用len,我测试了一下对于一个中文len返回的长度是3,这里不符,所以用utf8.RuneCountInString。utf8.RuneCountInString是使用range来遍历的字符串,与len计数不同,一个中文长度为1。
但是在接下来遍历s和sep都是用的len(),也就是说比如
fmt.Println(strings.Count("我的我的", "\x88"))你会得到结果2,这是因为
”我的“会被\xe6\x88\x91\xe7\x9a\x84遍历,你将从中找到\x88。
fmt.Println(strings.Count("five", ""))
然后还是分两种情况,len(sep)=1和大于1两种情况。
bootstrap和1kbgrid结合使用
真心不懂css,以前写点小东西,不是扒就是用的bootstrap。现在要我自己写一个支持ie6的界面,有点慌。
bootstrap是只支持ie7+,虽然有写ie6的hack,可能是我用的不好,效果不喜欢。
自己大体测试了一下,ie6不支持bootstrap中的布局方面和组件那些导航什么的。
http://twitter.github.com/bootstrap
现在bootstrap网站提供自己制定功能,可以选择自己使用的css功能,我只用了Base CSS和Alerts,再有需要就重新添加导出一份。网站布局的设定我就找了一个1kbgrid,http://www.1kbgrid.com/。很方便,很小。配合使用写了三个页面感觉很不错。
css设计也是一门艺术,但是第一次学时可能教材不好,安不下心来感觉很乱。以后就不再想学了。
Read more...
golang的Panic和Recover
在看《build web application with golang》地址:https://github.com/astaxie/build-web-application-with-golang
看到Panic和Recover这一节,对Panic和Recover有了了解。
Go没有例如像Java那样的异常机制:不能抛出一个异常。作为代替,它使用了panic和recover机制。一定要记得,这应当作为最后的手段被使用,你的代码中应当没有,或者很少的令人恐慌的东西。这是个强大的工具,明智的使用它。那么,应该如何使用它。
Panic
Read more...
是一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。当函数F调用panic,函数F的执行被中断,但是F中的延迟函数会正常执 行,然后F返回到调用它的地方。在调用的地方,F的行为就像调用了panic。这一过程继续向上,直到发生panic的goroutine中所有调用的函 数返回,此时程序退出。恐慌可以直接调用panic产生。也可以由运行时错误产生,例如访问越界的数组。Recover
是一个内建的函数,可以让进入令人恐慌的流程中的goroutine恢复过来。Recover仅在延迟函数中有效。在正常的执行过程中,调用 recover会返回nil,并且没有其他任何效果。如果当前的goroutine 陷入恐慌,调用recover可以捕获到panic的输入值,并且恢复正常的执行。最容易理解就是给个例子,文章里有例子:
package main
import(
"fmt"
//"os"
)
var user = ""
func inita() {
defer func(){
fmt.Print("defer##\n")
}()
if user == "" {
fmt.Print("@@@before panic\n")
panic("no value for user\n")
fmt.Print("!!after panic\n")
}
}
func throwsPanic (f func()) (b bool){
defer func(){
if x:= recover(); x != nil{
fmt.Print(x)
b = true
}
}()
f()
fmt.Print("after the func run")
return
}
func main(){
throwsPanic(inita)
}
执行结果:
D:\go>go run b.go
@@@before panic
defer##
no value for user
如上面所说的:
panic在user=""时,打断了函数的执行,fmt.Print("!!after panic\n")没有执行。
但函数中的延迟函数会正常执行,打印了 ”defer##“。然后返回到调用该函数的地方,继续上面的过程。
直到执行完所有函数的defer,退出程序。
Recover可以捕获到panic的值,上面的打印“no value for user”。并且恢复正常的执行。
wamp搭建环境不能ip访问的解决办法
apache在本机上访问正常,但是用ip访问为403禁止访问!
apache配置文件修改:
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride all
#
# Controls who can get stuff from this server.
#
# onlineoffline tag - don't remove
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from 127.0.0.1修改为Allow from all,没有查文档,搜索解决。
Read more...
PHP5 PDO使用
在wamp下的开发环境,查找资料有两种方法。使用query,使用prepare。看的代码是第二种,网上说第二种效率高,并且安全。
总结使用方法:
Read more...
$sth = $dbh->prepare('update db set zh_CN= :str where SN=:SN');
$sth->bindParam(':str',$str,PDO::PARAM_STR,12);
$sth->bindParam(':SN',$SN);
$sth->execute();
$sth->lastInsertId();
$sth->closeCursor();
源代码使用bindValue(),lastInsertId()返回id。