Lennakim

I am lennakim

0%

1
2
3
4
5
6
7
8
9
10
11
12
13
14

//定義方法 animation-delay-n
@mixin animation-delay-seconds($n){
&:nth-child(#{$n}){
animation-delay: #{$n*2}s;
}
}

div {
@include animation-delay-seconds(1);
@include animation-delay-seconds(3);
@include animation-delay-seconds(5);
}

生成的css 如下:

1
2
3
4
5
6
7
8
9
10
11
12
div:nth-child(1) {
animation-delay: 2s;
}

div:nth-child(3) {
animation-delay: 6s;
}

div:nth-child(5) {
animation-delay: 10s;
}

资料

use-nth-child-value-as-a-sass-variable

select-every-nth-element-in-css

sass-meister

chrome的每次升级都猝不及防, 升级到42后, 突然发现chrome的默认的书签管理器很不习惯,
没有之前简洁, 操作很繁琐, 我这么懒的人非常不习惯, 搜索下 能不能关掉chrome的书签管理器.

在chrome的url输入框 输入以下内容, 在下拉菜单选择 停用(disabled) 就ok了.

1
chrome://flags/#enhanced-bookmarks-experiment

世界变得跟之前一样安静了.

最近换了一个Mac pro本子, 把原来的blog项目导入到新本子中, 发现不能run了.
到官方代码仓库看了下, 作者已经升级hexo, 现在pro安装的hexo版本比较高.
Breaking Changes in Hexo 3.0, 从题目上看, 作者也是蛮狠的.

升级hexo, 请戳 Migrating from 2.x to 3.0

在这里纪下我的升级步骤

First

修改 ./package.json

1
2
3
4
5
{
"hexo": {
"version": ""
}
}

Second

安装hexo组件

1
2
3
npm install hexo-cli -g
npm install hexo --save

安装生成器

1
2
3
4
npm install hexo-generator-index --save
npm install hexo-generator-archive --save
npm install hexo-generator-category --save
npm install hexo-generator-tag --save

安装server

1
npm install hexo-server --save

Third

安装部署工具, 由于我用github page, 只用安装hexo-deployer-git

1
2
npm install hexo-deployer-git --save

升级各种插件

1
2
3
4
npm install hexo-renderer-marked@0.2 --save
npm install hexo-renderer-stylus@0.2 --save
npm install hexo-generator-feed@1 --save
npm install hexo-generator-sitemap@1 --save

最后不要忘了这个

1
2
npm install hexo-renderer-ejs --save

不装 ejs 会出现hexo-issues-632描述的问题

As it is, the world is big. 这么宏观的主题, hold不住啊. 今天得知上家公司的技术团队辞职了,
遂有感而发. 回想去年这个时候, 正是人生巅峰, 公司巅峰, 不提也罢.

peatio 确实是个 全明星技术团队, 阵容超豪华, 随便拿出一个人都能当CTO, 偶除外.
我属于板凳球员, 要想了解板凳深度, 看我就行了, 所见即所得.
即使都是全明星球员, 也不一定能拿总冠军.

xiaolai 玩法很邪门, 既当投资人, 又是pm, 想法超多, 对产品的热情不持久.
学习能力很强, 但感觉是体验生活, 而不是在投资领域卖力气. 对于btc大亨来说, 可能就是要任性吧.

我在14年底离开, 绝不是提前嗅到btc不景气,原因很多吧.
一个比较大的原因: 我自己在那段时间, 心态比较失衡, 感觉不开心了, 所以选择离开了.

又靠倒了一家公司(虽公司实体还在, 但在我心里已倒下), 我迫切希望入党, 希望组织收留我.

世界这么大, 祝他们找到新的征程.

留照以兹纪念

可能是本人 用GUI比较多的缘故, 对默认的 git diff 形式不太直观.
之前用svn的时候 配置过 vimdiff, 所以配置下git的vimdiff.

1
2
3
4
5
git config --global diff.tool vimdiff # 设置diff工具为 vimdiff

git config --global difftool.prompt false

git config --global alias.d difftool # 设置别名

只要输入 git d, 感觉是不是更直观了呢?

资料

更换svn diff为vimdiff
Vimdiff 使用

最近一直在做 api server, 有时候也需要分析手机App的网络请求, 之前在win环境下一直用 fiddler
做这样的工作, 然后在 mac下发现了Charles, 样子是个花瓶, 不过功能很强大哦.

说下步骤

1 确保手机和mac在同一个局域网

2 设置Charles代理, Proxy -> Proxy Settings, 保持默认即可, 记住端口 8888

3 查看mac 本地ip

1
2
3
4
5
6
7
ifconfig |grep inet

inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet6 fe07::1%lo0 prefixlen 64 scopeid 0x1
inet6 fe07::9e40:8ff:fe9d:2136%en0 prefixlen 64 scopeid 0x4
inet 192.168.1.109 netmask 0xffffff00 broadcast 192.168.1.205

本地 ip地址是 192.168.1.109

4 设置手机

设置 -> 无线局域网 -> 点蓝色的info图标, 找到 http 代理

服务器 输入mac本地ip 192.168.1.109, 端口输入 8888

5 charles 会提示弹窗 , allow 即可.

在左侧栏, 就可以看到请求的连接了.


另外 charles 可以模拟网络速度, 很贴心, 通过 Proxy-> Throtting Settings

PS 免费版 charles 会有些限制.

资料

fiddler
wireshark
使用charles来抓取手机App的网络包

今天是清明节, 我没有回到老家, 没有为母亲扫墓, 心里很不舒服.
母亲在2011年去世, 一晃已经离开我三年多了.
三年前, 我还在为第一份工作奔波, 在我拿到第一份工资之前, 母亲永远离开了我.
我感觉到了生命的急促, 转瞬即逝.
曾经感到人生忽明忽暗, 没了期盼. 现在我想说: 麻麻, 我很好, 我一直很乖.

斯人已逝, 言犹在耳, 谢谢母亲.

附上李志的『妈妈

querying 查询

忽略某些字段的查询用 without, 只查询某些字段可以用 only.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class User
include Mongoid::Document
include Mongoid::Timestamps

field :name, type: String
field :email, type: String
field :gender, type: String
end

User.without(:name)
User.without(:name, :gender)
User.only(:name)
User.only(:name, :email)

aggregation 聚合

group

我们有时需要 类似 sql 的 group 功能 , mongoid 提供了对 mongoDB aggregate 的支持,
这样可以使用 mongoDB 的 $group 函数了。

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
30
31
32
33
class User
include Mongoid::Document
include Mongoid::Timestamps

def self.added_fans(day_num)

self.collection.aggregate(
{
"$match" => {
"followable_type" => "User",
"created_at" => {
"$gte" => yesterday.to_i.days.ago.beginning_of_day, # 大于等于 昨天的开始时间
"$lte" => Date.yesterday.end_of_day # 小于等于 昨天的结束的时间
}
}
}, # 查询条件
{
"$group" => {
_id: "$follow_id", # 根据 follow_id 分组统计
matches: { "$sum" => 1 } # 统计数量
}
},
{
"$sort" => { matches: -1 } #倒序
},
{
"$limit" => 10
}
)
end

end

map_reduce

map_reduce

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
class Band

def self.likes_count
map = %Q{
function() {
emit(this.name, { likes: this.likes }); # 发送 name 与 likes
}
}

reduce = %Q{
function(key, values) {
var result = { likes: 0 };

values.forEach(function(value) {

result.likes += value.likes; # 获得 value.likes 并 累加

});

return result; #输出结果
}
}

map_reduce(map, reduce).out(inline: true)
end
end

Band.likes_count

MapReduce 概念可以查看wiki
或者知乎

在用rails创建项目的时候, 有时候有生成一些 help_spec view_spec 文件, 在实际项目中这些文件
基本不会用到, 可以禁用某些 generators, 不在生成 help_spec view_spec文件.

1
2
3
4
5
6
7
# /config/application.rb

config.generators do |g|
g.test_framework :rspec, fixture: false
g.view_specs false
g.helper_specs false
end

inherited_resources 可以为controller 自动添加 action.
kaminari是常用的分页插件.
inherited_resources 默认的 index action 是没有分页功能的, 这是个灾难, 添加以下代码为 index 实现分页.

1
2
3
class Car < ActiveRecord::Base
scope :recent, -> {order(created_at: :desc)}
end
1
2
3
4
5
6
7
8
9
10
11
12
class CarsController < ApplicationController

inherit_resources

protected

def collection
end_of_association_chain.recent.page(params[:page])
end

end

资料

Kaminari work with Inherited Resources

remote tag的用法总是记不住, 2015-03-10 有更新

Git-Remote

1
2
3
4
5
6
7
git remote add <shortname> <url> #新建远程仓库
git remote set-url origin <url>
git remote set-branches [--add] <name> <branch>
git remote set-url [--push] <name> <newurl> [<oldurl>]
git remote set-url --add <name> <newurl>
git remote set-url --delete <name> <url>

Git-Tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git tag #列出标签

git tag v0.1.2-light 创建轻量标签

git tag -a v0.1.2 -m "0.1.2 Version" #创建附注标签

git push origin v0.1.2 # 将v0.1.2标签提交到git服务器

git push origin –tags # 将本地所有标签一次性提交到git服务器

git tag -d v0.1.2 # 删除标签

git show v0.1.2 # 用git show命令可以查看标签的版本信息

git tag -a v0.1.1 9fbc3d0 # 给指定的commit打标签


Update 2015-03-10

1
2
3
4
5
6
7
8
9
10
11
# 移动分支到某个 commit
git branch -f <branch> <commit>

# github reset br remote head
git reset --hard origin/<br-name>

#rename git branch
git branch -m <oldname> <newname>

# 修改当前分支
git branch -m <newname>

参考

http://blog.csdn.net/wangjia55/article/details/8793577
http://www.cnblogs.com/wang_yb/p/3867221.html

swift 有一个特别的关键字 – extension

1
2
3
4
5
6
7
8
9
10
11
12
13
extension Double{
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}

let oneInch = 25.4.mm
println("One inch is \(oneInch) meters")

let aMarathon = 42.km + 195.m
println("Amarathon is \(aMarathon) meters long")

马上想到的是 ruby monkey-patch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Fixnum

def seconds
return self
end

def minutes
return self*60
end

def days
return self*60*60
end
end
############
5.seconds
2.minutes
1.days


在ios的例子中 ViewControllerExtensions 扩展ViewController, 继承 UITableViewDataSource , 并实现 protocol ,

类似ruby中用 module 扩展class.

参考

Swift扩展-Extension

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

// 没有返回值的无参函数
func sayHello() {
// do something
}

// 返回 string 类型
func sayHello() -> String {
return "Hi, shooter!"
}

// 一个参数
func sayHello(name: String) -> String {
// do something
}

// 多个参数
func sayHello(name: String, age: Int) -> String {
return "Hi, \(name), age is \(age)!"
}

// 参数默认值
func combineName(firstName: String, lastName: String, separator: String = "-") {
return firstName + separator + lastName
}

// 可变参数
func add(numbers: Int...) -> Int {
var total = 0
for i in numbers {
total += i
}

return total
}

// 函数参数别名
func combineName(firstName first: String, lastName last: String) {
// accessing the parameters can be done by referencing
// "first" and "last" respectively
return first + " " + last;
}

var fullName = combineName(firstName: "Steve", lastName: "Wozniak")

参考

C#与Swift的函数比较

ios应用在很多时候需要关闭键盘, 记录2种方式.

1 输入完成, 点击某个按钮的时候关闭键盘, 只需要在这个按钮事件调用输入框的 resignFirstResponder

1
2
3
@IBAction func okTapped(sender: AnyObject) {
nameTxt.resignFirstResponder() //触发okTapped按钮的事件 关闭键盘
}

2 当手指离开屏幕的时候 关闭键盘, 需要重写touchesEnded

1
2
3
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
nameTxt.resignFirstResponder() //当手指离开屏幕 关闭键盘
}

源码地址 ViewController.swift

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
import UIKit

class ViewController: UIViewController {

@IBOutlet weak var nameTxt: UITextField! //定义输入框
@IBOutlet weak var resultLab: UILabel! //定义显示框

override func viewDidLoad() {
super.viewDidLoad()
nameTxt.placeholder = "邹倩雯"
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
nameTxt.resignFirstResponder() //当手指离开屏幕 关闭键盘
}

@IBAction func okTapped(sender: AnyObject) {
nameTxt.resignFirstResponder() //触发okTapped按钮的事件 关闭键盘

resultLab.text = "hi, \(nameTxt.text)"
}

}

自从去年12月底辞职, 休息了很长时间, 今天开始新的工作, 从rails跨界到ios, 从零学习ios.

2015算是回归年, 回归的一个意思嘛, 见到了很多许久没见的朋友,
从北京 -> 秦皇岛 -> 石家庄 -> 老家 -> 北京, 溜达一圈, 每到一个地方,
就跟很多年没见的同学 朋友聚了一次, 最久的从06年就没再见过, 最短的从09年也没怎么联系了.

回归的另一个意思是, 在工作上重新开始, 跨界从零开始学ios,
像11年那样, 放弃java, 一头扎进rails, 从一个陌生的领域重新起步.

中间有个小插曲: 在石家庄的时候, 我看完电影, 钱包被偷了, 身份证 银行卡 信用卡 通通没了.
以为本命年的晦气过去了, 结果年来了个神补刀.
不得已回老家, 呆了几天, 本打算想去杭州, 结果钱包这事儿一搅和, 不去了.
在老家的这几天, 终于下定决心, 去朋友呆的公司工作, 跟他一起从零开始学习ios.


Update 2015-03-15

在14年除夕这天, 我曾丢钱包的那家影院的老板娘告诉我: 钱包找到了, 钱包卡在了椅子的缝隙里.
估计是我不小心, 钱包从口袋里掉了出来, 卡在了这里, 当时在地上找了半天, 徒劳无功, 还以为被人偷走了。
太感谢那位老板娘了.

回归又多了层含义: 是不是运气开始好转呢?