有关Node.js 试玩文件操作的简易笔记

[迁移]

0x80 iojs

node.js与io.js的故事真是黄金档连续剧啊2333

0x81 干嘛的

node.js旨在搭建高性能的web服务用于处理并发数万的连接,但是我感觉拿来玩玩真不错~

0x82 nodejs安装

可通过tarball方式编译安装 debian系安装非常容易 apt-get install nodejs npm即可。
nodejs 是解释器 npm 是nodejs包管理工具。

Read More

有关基本正则表达式的简易笔记

[迁移]

0x80 来源

正则表达式RE无论是原生支持还是作为模块,存在于各大编程语言和工具当中,也确实提高了工作效率。
对于源于Unix的ed工具的grep的扩展工具egrep,在shell中出场的机会很多,此笔记用于记录正则的常见元字符。

0x81 基础约定

  1. ‘^’行开始元字符 $行结尾元字符 ‘^cat$’ -> cat单行文本
  2. ‘[ ]’ 字符组 ‘gr[ae]y’ -> gray,grey
  3. ‘[1-4]’ 字符组连字符’-‘ ‘A[1-4]B’ -> A1B,A2B,A3B,A4B
    PS:对于'A[-4]B' -> A-B,A4B 其中连字符'-'临近字符组元字符时相当于普通字符
    
  4. ‘[^1-4]’ 字符组排除字符 ‘A[^1-6]B’ -> ‘A[^123456]B’ -> 除A1B…A6B的其他匹配项
    PS:'q[^u]' 不匹配类似Iraq等以q结尾的项,因为q[^u]是匹配q后不包含u的匹配项而不是允许不匹配
    
  5. ‘.’ 任意字符匹配符 ‘A.B’ -> AaB,A B,……
    PS:'[.]'中的'.'为普通字符 'A[.]B' -> A.B
    
  6. ‘|’ 子表达式或字符 进行或匹配,只需任一表达式匹配 ‘A|B’ -> xAx,xBx
    PS:'()'可表示多选范围 'gr[ae]y' -> 'gr(a|e)y'
    
  7. ‘\<’词开始元字符 ‘>‘词结束元字符 ‘\’ -> 包含cat文本的所有行
  8. ‘?’可选项字符(0个或1个) ‘+’多次重复字符(1个或n个) ‘*‘任意前字符(任意个)
    PS:'4(th)?' -> 4,4th    'a+' -> a,aa,aaa,......    'a*' -> (),a,aa,aaa,......
    
  9. ‘{1,3}’ 匹配量词区间字符 ‘*’的具化 ‘a{1,3}’ -> a,aa,aaa
  10. \ 转义字符以及反向引用 ‘.‘指普通字符’.’ ‘\1VVVV\2’(’$1VVVV$2’)指前匹配项分别填充1,2位置

以上10条规则便是简单的正则表达式匹配规则,对于不同的流派或实现会出现差异,其中以Perl的元字符数量和规范性最强,很多语言或工具宣称自己的RE高度兼容PerlRE。哈哈哈哈哈哈

Android HttpClient和多线程下载

[迁移]

0x80 HttpClient

虽然HttpClient类已被抛弃,Google官方推荐使用HttpUrlConnection代替,但是它的用法依然对于网络操作的使用有所帮助。
HttpClient是Apache封装的一个网页客户端模拟类,其中封装了一些方法用于简化Http操作。

0x81 GET用法

1
HttpGet httpGet = new HttpGet("http://host:port/index.php?username=" + URLEncoder.encode(username,"UTF-8") + "&password=" + URLEncoder.encode(password,"UTF-8"));

0x82 POST用法

1
2
3
4
5
HttpPost httpPost = new HttpPost(url);
List parameters = new ArryList();
parameters.add(new BasicNameValuePair("username",username));
parameters.add(new BasicNameValuePair("password",password));
httpPost.setEntity(new URLEncoderFormEntity(parameters,"UTF-8"));

Read More

有关LibGDX TrueTypeFont处理的简易笔记

[迁移]

0x80 谨以备忘

libgdx/extensions/libgdx-freetype用于处理TTF字库。

0x81 常用Class

1
2
3
4
private BitmapFont font; // 位图字体
private FreeTypeFontGenerator generator; // 字体生成器
private FreeTypeBitmapFontData fontData; // 字体生成器输出字体数据
private SpriteBatch batch; // 画笔

0x82 初始化变量

1
2
3
4
5
(create阶段):
generator = new FreeTypeFontGenerator(Gdx.files.internal("data/sans.ttf")); // 从文件构造生成器
fontData = generator.generateData(25, FreeTypeFontGenerator.DEFAULT_CHARS + "世界你好",false); // DEFAULT_CHARS 包含了最基本的字符 "+"后接的是汉字字符映射集,不可重复
font = new BitmapFont(fontData, fontData.getTextureRegions(),false); // 从字体数据中获取字体对象
batch = new SpriteBatch();

0x83 GL绘制

1
2
(render阶段):
font.draw(batch, "你好,世界\nTest", 100, 100); // 绘制字体 ("\n"无效,换行使用drawMultiLine)

0x84 PS

new BitmapFont() 默认构造字体为15pt Arial字体。

有关LibGDX Animation的简易笔记

[迁移]

0x80 简介

libGDX是常用的Android游戏框架, 而Animation类用于将一组图片按照一定的顺序展示,形成动画。

0x81 常用Class

1
2
3
4
5
6
private float statetime; // 状态时间
private Animation walkAnimation; // 动画类
private Texture walkSheet; // 包含图片素材的表格式图片纹理
private TextureRegion [] walkFrames; // 一维数组,用于保存上方Texture经过裁剪后得到的图片集合
private TextureRegion currentFrame; // 当前帧,指代当前时间节点显示的图片
private SpriteBatch batch; // 画笔,用于在render期间绘制图像

0x82 初始化变量

1
2
3
4
5
6
7
8
9
(create阶段):
Texture.setEnforcePotImages(false); // 将纹理的强制2点阵关闭,这样才能使用任意分辨率的图片(libgdx 0.9.9 之前的限制)
walkSheet = new Texture(Gdx.files.internal("data/1.png")); // 读取纹理data/1.png
TextureRegion[][] temp = TextureRegion.split(walkSheet,walkSheet.getWidth() / FRAME_COL, walkSheet.getHeight()/ FRAME_ROW); // 二维数组临时保存2d裁剪的结果
walkFrames[] = temp[][]; // 将临时数组内容传到之前定义的用于展示的一维数组
walkAnimation = new Animation(0.05f, walkFrames); // 使用帧数组创建动画实例,时间间隔为0.05f
walkAnimation.setPlayMode(Animation.LOOP); // 设置动画播放模式为普通循环
batch = new SpriteBatch(); // 构造画笔实例
statetime = 0;

0x83 GL绘制

1
2
3
4
5
6
7
8
(render阶段):
Gdx.gl.glClearColor(0, 0, 0, 0); // 置背景全黑
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
statetime += Gdx.graphics.getDeltaTime(); // 当前状态时间为gdx默认图形绘制间隔时间增值
currentFrame = walkAnimation.getKeyFrame(statetime, true); // 获取关键帧
batch.begin();
batch.draw(currentFrame, 0, 0, 500, 500); // 画笔绘制当前帧
batch.end();

0x84 总结

Texture纹理图片经裁剪放入一个TextureRegion[],动画类通过该帧数组实例化一个内容动态的实例(该实例按时间轴播放),之后每隔一定的时间(比如deltatime)获取该实例当前帧并使用画笔绘制出来。

Nginx 功能试用

[迁移]

0x81 基本功能

基本的反向代理,负载均衡,访问缓存,URl重写,读写分离。

0x82 反向代理

反向代理:使用location 进行相应地标识

1
2
3
4
5
6
7
8
9
10
11
12
13
location ~*\.php$ { #location 原生支持RE ~用于匹配敏感大小写 ~*用于匹配不敏感大小写 ^~普通匹配(一般用于匹配目录) =用于固定精确匹配(通常用于单一文件,例如=404 )@指代另一个location
fastcgi_pass http://host:port; #代理指向的地址端口
proxy_set_header X-Forwarded-For $remote_addr; #设置请求头添加X-Forwarded-For域,在后端若是apache使用$(X-Forwarded-For)!的方式将真正的请求网站打印出来
}
```Config

反向代理的严苛性

```Config
location /forum/ {
proxy_pass http://host:port/forum/;
#proxy_pass http://host:port/bbs/; #本地名称替换
}

Read More

Nginx php-cgi配置笔记

[迁移]

0x81 Nginx是什么

Nginx 是一个服务器引擎,其基本作用类似于Apache,支持单进程多线程响应多个服务器请求(与Apache的prefork不同),并支持反向代理。

0x82 正反向代理

简单的讲:

  • 正向代理即是一般的代理服务器,用于帮助客户端访问自己不能访问的服务器;
  • 反向代理即是服务器的代理,通常服务器指定用于反向代理的地址,用于接受服务器请求。

在本例中,Nginx就相当于代理服务器,而php-cgi就是真正用于解析php脚本的后端。

Read More

Android Activity

[迁移,2017-03-21修改]

0x81 什么是Activity

Activity是Android四大组件之一,是View的承载者和控制者。Android设计之初将Activity视作Controller这一层,这样使得View与Controller糅合,到后期代码变得十分难维护,所以现在都比较使用MVP、MVVM甚至两者结合的MVPVM的混合模式开发,当然具体的设计模式还是业务需求和具体情况。

0x82 Activity与setContentView关系

我们通常会在Actvity的onCreate回调当中调用setContentView方法设置内容,最终构成如下层次:

(图是别人的哈哈哈,如果不能用告诉我~)

Activity层次图

这其中PhoneWindow是系统对Window的唯一实现类,DecorView就是我们getDecorView方法获取的部分,contentLayout的FrameLayout就是android.R.id.content对应的空间,它们都不是我们设置的View,setContentView实际上是经历了Window->WindowManager最终把View添加到了contentLayout里,可以看一下除了使用getWindow().setContentView(layoutResID);添加View之外(在Framework刚构造出Activity时创建了Window这些东西),还调用了initWindowDecorActionBar();,这里以后有机会也记录一下~

Read More