过去做了点什么

过去的好长一段时间blog都没怎么动过了。也许从来都没有人看,缺少一种动力吧。

从前有一只小鸟,它有着世界上最优美动听的嗓音,它生活在一个山谷,山谷中也没有其他的小鸟,而它从来没能飞出这个山谷。有一天小鸟死了。那这个歌声最美的小鸟在这个世界上存在过吗??

看了许多,想了许多,可是觉得没什么好说的。作罢。

那就看我做了什么吧。

之前在准备用js写一个迷宫小游戏。使用<canvas>元素来画图,通过查找了些迷宫生成的算法,总算能够画出迷宫出来了,不过游戏最重要的构成,操作部分由于某些因素,搁置下来了,不了了之〜

接下来想,了解web编程,一如既往的pyton,选择了flask这个高级的web框架,跟着官方教程中的例子中写了个小网站,还是有点意思的,不过使用的高级web框架,对于网络编程抽象了太多,对于网络编程还是没有多少更多的了解。 一个完整的网站所需要的还是需要各方面的知识的,例如:数据库,(我对数据库的了解和使用实在是太少了)对框架的熟悉程度也很重要,更需要好的想法。我想对http协议,tcp/ip的运行机制跟多的了解,对网络通信和结构的跟多了解,应该都会更有帮助吧。还有网站的安全应该是非常重要的。

于是我找到了这几个系列文章

温习了下python,写了一个显示目录树型结构的脚本和一个迷你httpServer,有些类似python -m SimpleHTTPServer。不够还是不太适应用class,面向对象的来写程序,不过对于一些高级语言来说,万物皆对象,本就是面向对象的,不用专门写class。为了面向对象而面向对象,不好,不管是面向对象还是面向过程还是函数式,不过都是设计模式而已。

代码很烂。。。

#directory_tree.py

#!/usr/bin/env python
#coding:utf-8

import os

def directory_tree(pwd,d=0):
	if os.path.isdir(pwd):
		print d*'-'+'\__',os.path.basename(pwd)
		for i in os.listdir(pwd):
			directory_tree(pwd+'/'+i,d+1)
	else:
		print d*'-'+'|--',os.path.basename(pwd)

if __name__ == '__main__':
	pwd = os.getcwd()
	directory_tree(pwd)

#http.py

#!/usr/bin/env python
#coding:utf-8

import socket,os

text_header = '''
HTTP/1.1 200 OK  
Content-Type: text/html; charset=UTF-8
Server: MineCraft/0.0.1

'''

img_header = '''
HTTP/1.1 200 OK  
Content-Type: image/jpg

'''

download_header = '''
HTTP/1.1 200 OK  
Content-Type: application/download

'''

edit = '''
data:text/html, <style type="text/css">#e{position:absolute;top:0;right:0;bottom:0;left:0;}</style><div id="e"></div><script src="http://d1n0x3qji82z53.cloudfront.net/src-min-noconflict/ace.js" type="text/javascript" charset="utf-8"></script><script>var e=ace.edit("e");e.setTheme("ace/theme/monokai");e.getSession().setMode("ace/mode/ruby");</script>
'''

HOST='0.0.0.0'
PORT=8081


def htmlpage():
	def html(title,content):
		return '''
<!DOCTYPE html>
<html>
<head>
	<title> %(title)s</title>
	<style type="text/css"> h1 {border-bottom: 1px solid #c0c0c0;margin-bottom: 10px;padding-bottom: 10px;white-space: nowrap;}</style>
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
	<h1> Directory listing for %(title)s</h1>
	%(content)s
</body>
		''' %{'title':title,'content':content}
	return html

def element(inner,tags):
	return inner.join(tags)

def listpage(pwd):
	file_list = os.listdir(pwd)
	file_list.sort() #sort list
	li = ''
	forback = '<li><a href="..">..<a></li>'
	li = forback + li  # back
	for i in file_list:
		if os.path.isdir(pwd+'/'+i):
			i+='/'
		i = '<a href="%(url)s">%(url)s</a>' %{'url':i}
		li += element(i,['<li>','</li>'])
	content = element(li,['<ul>','</ul>'])
	html = htmlpage()
	return html(pwd,content)

def get_file(path):
	try:
		f = open(path, 'rb')
		response = f.read()
		f.close()
		return response
	except  IOError:
		return '404 <b>%s</b> File not found!' %path

def getResponse(src):
	path = src[1:] # relative path
	if path == '':
		path = './'
	if path[-1] == '/':
		#directory
		return text_header+listpage(path) 
	else:
		#file
		return get_file(path)

def main():
	s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	s.bind((HOST, PORT))
	print 'Server on: http://%s:%d' %(HOST,PORT)
	while True:
		s.listen(5)
		conn,addr = s.accept()
		request   = conn.recv(2048)

		if request != '':
			method = request.split(' ')[0]
			src    = request.split(' ')[1]
			print addr,'%s %s' %(method, src)
			# main
			if method == 'GET':
				content = getResponse(src)
				conn.send(content)
				conn.close()
			# need to improve
			if method == 'POST':
				conn.send(request)
				conn.close()

			if method == 'EDIT':
				conn.send(edit)
				conn.close()
		else:
			print 'request empty'
			conn.close()


if __name__ == '__main__':
	main()

高兴的是这两个小程序在linux和win下都可以运行,哈哈,跨平台就是好!httpServer不支持中文。要是给这个httpserver加上上传文件的功能后,以后局域网内的文件分享就很方便了,不管是别人给我传文件还是我传文件给别人。

老写这些有意思么?就不能写写生活。

我想也没有人会对我是生活感兴趣吧。就算写出来也是 It’s broing.

而且我也不会说:“这就是我的生活呀。”

显然还有其他的。

我败了个mx2。用起来感觉还行,挺漂亮的,美观,也实用,不过系统的bug和不满意之处也挺多的,电量也是捉襟见肘的,我并没有插电话卡使用,电量一天一冲必须的,android都这样?屏幕很细腻,摄像头,照相成像感觉很一般,没有宣传的那样好。

mx2争议最大的是 smartbar 了,本人觉得还行,是个特色,不一定就比原生的好,但是也没差到哪里去。是魅族的特点,能用够用,也没有特不适应的地方。有人说 smartbar的设计有违 android4.0的设计规范,我觉得并没有,反而是根据 google这个虚拟按键设计的改进,只是这个设计是魅族出的,而不是 google定的,有些弱势、缺少软件应用的支持。

smartbar的位置就是原生 android虚拟按键的位置,原生的是三个按钮是“返回”,“home”,“运行程序列表”。 魅族的做法是略去固定的虚拟按键,用 smartbar 来代替虚拟按键的位置和功能同时对应用的”底部操作栏“进行适配,就是说android的虚拟按键由底部的触摸“home”键来代替,虚拟按键的其他功能整合到应用的”底部操作栏“中。( android4.0设计规范中”底部操作栏“显然是很重要的一部分,同时也与4.0以下的版本有很多的不同)就是说如果没有 smartbar,替代这一空间的是原生的虚拟按键,只不过是 smartbar通常都是孤零零的一个“返回键”出现在其中,空出好大一部分,有些人看着碍眼,就好像出去吃饭上了菜,可是菜盘子很大菜很少,好吃亏呀(~想不出合适的比喻了)。“home”和“运行程序列表”的功能则是用一个触摸按键来代替的,单击是“home”,双击是解锁屏幕或者”运行程序列表“,向上划过触摸键是”返回“。触摸键的手势操作是个可以好好开发的地方,貌似最新的 flyme2.1体验固件就有这个功能了,我没有刷。(吐槽下,这个使用频繁的触摸按键在需要双击解锁屏幕的时候用起来特别不爽,按快了按慢了都不能正常反应,而且触摸按键的触摸反应仿佛是慢一拍、迟钝,用户体验很差,就是看起来好看和整洁)。

所以可以这样说,魅族的 smartbar和触摸按键设计是 iOS home键与 android的虚拟按键 杂交出来的结果。

有人经常说:smartbar占了整整一排的空间却只有一个返回键,这不是浪费屏幕空间么? android4.0是设计就是这样的,smartbar 加上触摸键 代替的原本的底栏三个固定的虚拟按键

继续问,在有些应用下,会有双底栏出现太不和谐了!—-适配的问题 某些应用自己都不适配android4.0设计规范,照搬 iOS设计,你怎么能怪 smartbar呢? 大哥,你就当这一排是虚拟按键不就行了,那些不符合 android4.0设计标准的应用不管在哪都看起来不和谐。

其实 smartbar还是能适配一些应用的,适配了还是很方便的,尤其是android设备的屏幕越来越大,更多的操作最好还是在屏幕下方就可以完成。

总结:将 android4.0虚拟按键的一部分功能交给了mx2面板上的触摸键,并将虚拟按键的其他功能融合应用程序的底部操作栏形成了 smartbar,原本虚拟按键的位置由 smartbar来代替。你可以理解为节省了虚拟按键所占的屏幕空间,也可以理解为节省了原本应用的“底部操作栏”所占的屏幕空间。可现实是,smartbar 对于很多应用并不能很好的适配,依然是双层底栏,(那些本就不符合 android4.0设计标准就不说了)只是没有达到原本预期的设计效果而已,也没见糟糕到哪去,没有了smartbar屏幕空间依然会被虚拟按键所占据,只不过虚拟按键的一些功能转给面板上的触摸键了,而触摸键的反映迟钝是一败笔。要是触摸键的手势操作丰富起来,并且与应用的适配跟上,魅族“特色”的 android按键设计也就算成功了。

来几个样张?

1

2

3

4

Tag:碎碎念code Published under (CC) BY-NC-SA