kk Blog —— 通用基础

date [-d @int|str] [+%s|"+%F %T"]

ruby基础

Find

http://ruby-doc.org/stdlib-1.9.3/libdoc/find/rdoc/Find.html

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'find'
total_size = 0
Find.find(ENV["HOME"]) do |path|
  if FileTest.directory?(path)
    if File.basename(path)[0] == ?.
      Find.prune       # Don't look any further into this directory.
    else
      next
    end
  else
    total_size += FileTest.size(path)
  end
end

Time

1
2
3
4
p Time.parse(“2002-03-17”)       #=> Sun Mar 17 00:00:00 +0800[v2] 2002
p Time.now        # =>Mon Oct 20 06:02:10 JST 2003
p Time.now.to_a      # => [10, 2, 6, 20, 10, 2003, 1, 293,false, "JST"]
p Time.now.to_f      # => 1418540681.0154862

liquid用法笔记

原文

  • 注意本文代码中的 { {,{ %,% },} },{ { {,} } } 中间的空格都要去掉才能执行

在折腾github上博客的时候, 遇到一些jekyll, 正确来说应该是Liquid用法的问题。 于是一系列搜索之后终于找到了比较容易理解的文档>>

关于Liquid的语法使用,看完一遍,就能愉快的在github上继续折腾博客了。有些看不大懂,没翻译,都是自己的见解,有些根本用不上就不解释了。

Liquid有两种标记类型: Output 和 Tag.

Output标记,用于输出文本,格式采用 { { 两个尖括号包围 } }
Tag标记,用于执行命令或者处理 格式: { % 一对尖括号内一对百分号 % }

我的见解是: 类比jsp格式, Output相当于 <%=variable>,即输出变量值;
Tag相当于<% int i=2 ;%>,一种数据处理,但不做输出效果.

Output

例子:

1
2
3
Hello { {name} }
Hello { {user.name} }
Hello { { 'tobi' } }
高级Output: Filters//过滤器

Filters过滤器,数据处理的操作方法.
过滤器的第一个参数,往往是过滤器运算符'|‘左边的Output,而过滤器的返回值,是通过过滤运算符右边的操作所得到的,过滤器可以叠加操作,最终得到该Output所要输出的值。(这段我见解,翻译不过来 = =)
如下:

1
2
3
Hello { { 'tobi' | upcase } }
Hello tobi has { { 'tobi' | size } } letters!
Hello { { 'now' | date: "%Y %h" } }
标准过滤器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
date - 格式化时间
capitalize - 输出字符串,字符串(句子)首字母大写 e.g. 假设tb为"hello world"{ { tb|capitalize } } #=> 'Hello world'
downcase - 转换小写
upcase - 转换大写
first - 获取数组的第一个元素
last - 获取数组的最后一个元素
join - 用指定的字符拼接数组元素
sort - 排序数组
map - map/collect an array on a given property
size - 返回数组大小
escape - 转移字符串
escape_once - returns an escaped version of html without affecting existing escaped entities
strip_html - 除去字符串中的html标签?
strip_newlines - 除去字符串中的回车?
newline_to_br - 将所有的回车"\n" 转换成"<br />"?
replace - 替换所有匹配内容 e.g.{ { 'forfor' | replace:'for', 'bar' } } #=> 'barbar'
replace_first - 替换第一个匹配内容 e.g.{ { 'forfor' | replace_first:'for', 'bar' } } #=> 'barfor'
remove - 移除所有匹配内容 e.g.{ { 'forbarforbar' | remove:'for'} } #=> 'barbar'
remove_first - 移除第一个匹配内容 e.g.{ { 'forbarforbar' | remove_first:'for'} } #=> 'barforbar'
truncate - truncate a string down to x characters
truncatewords - truncate a string down to x words
prepend - 在字符串前面加上内容 e.g.{ {'bar'|prepend:'far'} } #=> 'farbar'
append - 字符串后面加上内容 e.g.{ {'bar'|append: 'foo'} }#=> 'barfoo'
minus - 减法 e.g. { {4|minus:2} } #=>2
plus - 加法 e.g. { { 4|plus:2} } #=> 6
times - 乘法 e.g. { {10|times:2} } #=> 20
divided_by - 除法 e.g. { { 10 | divided_by:2} } #=> 5
split - 分割字符串 e.g.{ { "a~b" | split:'~'} } #=> ['a','b']
modulo - 取余 e.g. { { 3 | modulo:2 } } #=> 1

Tags

Tag在模板中起到处理逻辑的作用。
下面是目前支持的Tag:

1
2
3
4
5
6
7
8
9
10
assign - 定义变量 e.g. { % assign tt = 1 % } 定义了变量tt数值为1
capture - Block tag为变量赋值 e.g.{ % capture dont % }{ { tt } }{ % endcapture % } 将tt的值赋给 dont
case - Block tag its the standard case...when block
comment - Block tag 注释
cycle - Cycle is usually used within a loop to alternate between values, like colors or DOM classes.
for - for循环block
if - 判断block
include - 引入模板
raw - 转义内容tag e.g.{ % raw % }{ { this } }{ % endraw% } #=> '{ { this } }'
unless - Mirror of if statement
Comments

注释隐藏

1
2
We made 1 million dollars { % comment % } in losses { % endcomment % } this year
Raw

当包裹内容出现冲突语法时,不会执行其处理。

1
2
3
{ % raw % }
  In Handlebars, { { this } } will be HTML-escaped, but { { { that } } } will not.
{ % endraw % }
if/else

e.g.

1
2
3
{ % if user % }
  Hello { { user.name } }
{ % endif % }
1
2
3
4
# Same as above
{ % if user != null % }
  Hello { { user.name } }
{ % endif % }
1
2
3
{ % if user.name != 'tobi' % }
  Hello non-tobi
{ % endif % }
1
2
3
4
# Same as above
{ % unless user.name == 'tobi' % }
  Hello non-tobi
{ % endunless % }
1
2
3
{ % if user.payments.size > 0  % }
   you paid !
{ % endif % }
Case Statement

多条件

1
2
3
4
5
6
7
8
{ % case condition % }
{ % when 1 % }
hit 1
{ % when 2 or 3 % }
hit 2 or 3
{ % else % }
... else ...
{ % endcase % }
1
2
3
4
5
6
7
8
9
{ % case template % }

{ % when 'label' % }
	 // { { label.title } }
{ % when 'product' % }
	 // { { product.vendor | link_to_vendor } } / { { product.title } }
{ % else % }
	 // { {page_title} }
{ % endcase % }
Cycle

循环列举

1
2
3
4
{ % cycle 'one', 'two', 'three' % }
{ % cycle 'one', 'two', 'three' % }
{ % cycle 'one', 'two', 'three' % }
{ % cycle 'one', 'two', 'three' % }

结果:

1
2
3
4
one
two
three
one

可以通过命名分组:

1
2
3
4
{ % cycle 'group 1': 'one', 'two', 'three' % }
{ % cycle 'group 1': 'one', 'two', 'three' % }
{ % cycle 'group 2': 'one', 'two', 'three' % }
{ % cycle 'group 2': 'one', 'two', 'three' % }

结果:

1
2
3
4
one
two
one
two
for 循环

循环集合:

1
2
3
{ % for item in array % }
  { { item } }
{ % endfor % }

遍历hash时:item[0]包含键,item[1]包含值

1
2
3
{ % for item in hash % }
  { { item[0] } }: { { item[1] } }
{ % endfor % }

for循环时,下列变量可以辅助使用:

1
2
3
4
5
6
7
forloop.length      # => length of the entire for loop
forloop.index       # => index of the current iteration
forloop.index0      # => index of the current iteration (zero based)
forloop.rindex      # => how many items are still left?
forloop.rindex0     # => how many items are still left? (zero based)
forloop.first       # => is this the first iteration?
forloop.last        # => is this the last iteration?

还有一些变量可以用来处理循环时选择性处理:
limit:int - 限制遍历个数
offset:int - 从第n个数开始遍历

1
2
3
4
5
# array = [1,2,3,4,5,6]
{ % for item in array limit:2 offset:2 % }
  { { item } }
{ % endfor % }
# results in 3,4

反序遍历:

1
2
3
{ % for item in collection reversed % } 
{ {item} } 
{ % endfor % }

除了遍历集合,还可以定义一个范围的数字来遍历:

1
2
3
4
5
# if item.quantity is 4...
{ % for i in (1..item.quantity) % }
  { { i } }
{ % endfor % }
# results in 1,2,3,4
变量赋值

赋值变量:

1
2
3
4
5
{ % assign name = 'freestyle' % }

{ % for t in collections.tags % }{ % if t == name % }
  <p>Freestyle!</p>
{ % endif % }{ % endfor % }

还可以赋值布尔值:

1
2
3
4
5
6
7
8
9
{ % assign freestyle = false % }

{ % for t in collections.tags % }{ % if t == 'freestyle' % }
  { % assign freestyle = true % }
{ % endif % }{ % endfor % }

{ % if freestyle % }
  <p>Freestyle!</p>
{ % endif % }

赋值处理过的数据:可以用capture

1
2
3
4
5
6
7
8
{ % capture attribute_name % }{ { item.title | handleize } }-{ { i } }-color{ % endcapture % }

  <label for="{ { attribute_name } }">Color:</label>
  <select name="attributes[{ { attribute_name } }]" id="{ { attribute_name } }">
	<option value="red">Red</option>
	<option value="green">Green</option>
	<option value="blue">Blue</option>
  </select>

Android模拟器

首先下载Android SDK ,完成安装openjdk-6-jre,还需要安装ia32-libs bison flex libglu1-mesa-dev 。
将下载回来的Android SDK解压缩后进入文件夹,运行tools/monitor
Window->Android SDK Manager 选择想要的模拟的android安转
Window->Android Virtual Device Manager 模拟器管理界面。

下载不了sdk就 https://awk.so/#newwindow=1&q=dl-ssl.google.com+ip
搜索dl-ssl.google.com的IP,然后在hosts替换掉。如 203.208.46.200

安装apk

在电脑上运行 adb install /XXX/YYY.apk

android虚拟机QQ

http://www.findspace.name/easycoding/415

中文输入法

要到设置->语言和输入法中勾选选择输入,再点击输入法靠右的地方进行设置。

ubuntu下,使用chrome 浏览器运行安卓apk程序

使用usb进行调试

一 下载

下载 platform-tools 或 adt-bundle-linux-x86_64-XXX.zip(这个很大)

二 连接

adb start-server 打开服务
如果一切正常的话
输入
adb devices
就能显示出当前连接到电脑的android设备 ^_^
试试这个命令
adb shell
就能在Ubuntu上的终端执行android的shell命令了
su
切换到root

或者

adb root

adb shell
不过这种不一定成功

三 fastboot 模式

有些手机有自己的刷机软件,这种的fastboot连不上–大品牌
没有自己的刷机软件的,一般都可以用fastboot连接–杂牌、国产。。。

查看设备, 注意fastboot要加-i,其他网上搜到的对我试的三种机子都无效。 http://bbs.nubia.cn/thread-167619-1-1.html

1
2
3
4
5
lsusb
Bus 002 Device 001: ID 19d2:2286 xxxx机型


fastboot -i 0x19D2 devices

四 不能执行的sdcard分区如下

$ mount

1
/dev/block/vold/93:80 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0

我用的平台,默认加载sdcard分区是noexec,所以无法执行该分区下的文件。

重新加载该分区mount -o rw,remount /mnt/sdcard /sdcard

然后一切正常,自己的执行程序现在工作正常了。

编译Android的kernel

一 下载

  1. 下载arm编译器
    https://launchpad.net/gcc-arm-embedded/+download

  2. 进入到你的android源代码目录,敲入下面命令:
    git clone http://android.googlesource.com/kernel/goldfish.git kernel

  3. cd kernel 进入我们刚才创建的kernel文件夹

  4. git branch -avv 查看远程的git 库
    我们选择remotes/origin/android-goldfish-2.6.29分支来下载

  5. git checkout -b android-goldfish-2.6.29 remotes/origin/android-goldfish-2.6.29

二 编译kernel代码

  1. 设置环境变量
    export PATH=$PATH:~/andr-perf/gcc-arm-none-eabi-4_8-2014q3/bin

  2. 修改kernel下面的makefile文件,修改
    ARCH ?= $(SUBARCH)
    CROSS_COMPILE ?=
    这两个字段成如下内容:
    ARCH ?= arm
    CROSS_COMPILE ?= arm-none-eabi-
    // 但是对于make goldfish_armv7_defconfig这样编译的内核模拟器好像启动不了,应该是默认编译成v5的,需要改成v7。或者可以改成ndk的编译器
    // CROSS_COMPILE ?= /home/kk/andr-perf/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-

  3. 开始编译,敲入如下命令
    make goldfish_defconfig
    或者看arch/arm/configs/目录下有什么,就挑一个make XXX

  4. 正式编译,敲入如下命令
    make

正式编译成功之后,我们会看到如下文字:
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready

三 利用新编译的kernel来启动模拟器

  1. 在启动模拟器之前,先设置模拟器的目录到环境变量$PATH中去:
    USER-NAME@MACHINE-NAME:~/Android$ export PATH=$PATH:~/android_prj/out/host/linux-x86/bin

  2. 设置ANDROID_PRODUCT_OUT环境变量:
    USER-NAME@MACHINE-NAME:~/Android$ export ANDROID_PRODUCT_OUT=~/android_prj/out/target/product/generic
    同样,如果你的源代码目录不是android_prj,请注意修改下。另外,如果你已经配置了环境变量。则不必如此。建议最好写到配置文件 ~/.bash_rc配置文件里面去。 免得每次都要配置

  3. 启动模拟器
    一、 cd ~/android_prj 回到源代码目录
    sandy@ubuntu:~/android_prj$ emulator -kernel ./kernel/arch/arm/boot/zImage 利用刚才我们编译的kernel内核启动模拟器
    二、 emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImage
    -avd后面的参数 myavd即为模拟器的名字,-kernel后面的参数就找到刚才编译出的内核的路径。
    若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间,3分钟到15分钟不等。

  4. 验证结果
    待模拟器启动完毕之后,我们敲入adb shell
    第一次会说device offline,不管它,再敲入一遍,就会进入adb 调试
    然后cd proc 进入proc目录,cat version