Skip to content

Instantly share code, notes, and snippets.

View chzyer's full-sized avatar

ChenYe chzyer

  • China
View GitHub Profile
@chzyer
chzyer / go-concurrent-programming.md
Last active June 30, 2020 02:27
golang并发编程 - 例子解析

最近在看《Programming in Go》, 其中关于并发编程写得很不错, 受益非浅, 其中有一些例子是需要多思考才能想明白的, 所以我打算记录下来, 强化一下思路

《Programming in Go》在 Chapter 7. Concurrent Programming 里面一共用3个例子来讲述并发编程的3个模式, 第一个是 filter , 筛选出后缀名和文件大小文件列表, 还算简单就不说, 然后第二个是升级版, 正则版 filter , 不同的是他是根据正则搜索出文件的文本并且列出来. 这个例子我起初看是有点蒙的, 这样写是没错, 但是为什么要这样写, 他的设计思路是什么, 和其他方法相比他有什么优势, 这些都不清楚, 于是决定好好分析一下. 实际上这个例子实现的功能并不复杂, 所以我的文章实际上是在讨论怎么产生出和作者相似的思路.

如果不考虑用 goroutine 的话, 思路其实很简单:

1. 列出文件列表, 编译正则.
2. 遍历文件, 打开并遍历每行, 如果正则能匹配, 记录下来.
3. 列出来.
@chzyer
chzyer / perfect-editor.md
Last active December 12, 2015 09:38
理想的开发利器

为了排除标题党的嫌疑, 我先说明一下这只是一篇"大同社会"的文章. 目前还没有一款编辑器能达到目前的境界, 我只是探讨一下要怎么才算是好的编辑器

文本编辑

面临问题:

编辑器首先要以文本编辑为重, 要足够方便, 只不过这方便需要提供的功能实在是很多, 那么几个可怜兮兮的键盘快捷键实在不够用(不要说通过菜单- -). 

我见过的一些解决方案是:

@chzyer
chzyer / andfree-startup.md
Last active December 31, 2015 10:26
使用AndFree入门安卓开发

本文主要介绍如何通过开源安卓框架Andfree来入门安卓开发.

###前提条件

  1. 了解java的语法
  2. eclipse和ADT环境已经配置好
  3. 部分eclipse操作技巧

###前言

@chzyer
chzyer / decorators-and-functional-python.md
Last active December 10, 2015 23:19
装饰器和功能性python

原文: http://www.brianholdefehr.com/decorators-and-functional-python

装饰器是python的一大特色. 除了他在语言中非常实用之外, 还能够帮助我们通过一个有趣的方式来思考 -- 功能性
我会从头开始解释装饰器是怎么工作的. 我们会从一些你理解装饰器所必须的话题开始. 然后, 我们再去深入得探究几个简单的装饰器的工作原理. 最后, 我们会讨论一些装饰器的高级用法, 比如传入可选性的参数, 同时使用多个装饰器等等.

首先, 让我们用我能想到的最简单的方法来定义Python的函数. 根据这个定义, 我们可以用简单类似的方法来定义装饰器.

A function is a block of reusable code that performs a specific task.

不错, 然后什么又是装饰器呢?

@chzyer
chzyer / product-and-project.md
Created January 11, 2013 06:32
产品与项目

这是个很泛的题目, 对于程序员来说, 这是个选择.

在我看来, 公司分两种, 一种是做产品的, 一种是接项目的(可能还有一种皮包公司不属于我讲的范围)

无可厚非, 做产品要比接项目成就感来的快些, 或者说实在些.就好比在玩游戏中的练级(升级), 见证了产品的一步步成长.

接项目貌似赚钱要直接的多, 但是做完的东西, 做完就跟这个没关系了(可能有一部分需要维护), 拿游戏来类比的话可能类似于做任务.

就开发的过程来说, 专业的项目公司肯定会积累一定的解决方案, 看到可以塞进去的就塞(这里既无褒义也无贬义), 快速完成一个任务交差以便接手下一个, 对于产品的反馈, 大多来自于客户而不是用户.好处是可以接触各式各样的项目, 可能项目的经验会非常丰富, 各方面的解决方案都可以信手拈来.对于产品的定型, 由客户说了算.对于产品, 可能就有不一样的局面, 自己的产品总想着精益求精, 时间相对比较自由, 和项目不同的是可能一年下来都是在做这个产品, 质和量肯定不是项目所能比拟, 产品反馈是直接接触用户获得, 但是用户反馈相应过多过杂, 需要取舍.

@chzyer
chzyer / python-params-default-value.md
Last active February 14, 2017 07:47
关于Python的参数默认值

最近相继遇到几个python的坑...贴一段有意思的代码

def a(b=[]):
	b.append(1)
	return b
print a()
print a()

输出是什么?

@chzyer
chzyer / solve-eclipse-android-cannot-connect-to-vm.md
Created January 11, 2013 06:24
eclipse开发android下,提示Cannot connect to VM

先说起因,由于我在照搬网上hello world的时候不小心把main函数也抄进来了, 所以一直提示cannot connect to VM.

看似是编译完成后就提示,还没将apk传送到手机端。后来把main函数删除也好,整个class删除也好,都不能解决,甚至,删除工程重新建一个同名的工程也不行..一度很郁闷,我是跳过java直接写android,对java很多东西也不是很了解,上网上查,无非是winsock被替换了,只不过我是mac,这不可能。

后来研究了一下发生原理,由于提供了main函数导致eclipse在编译后自动运行这个类,而不是生成到手机,删除了类之后也不能解决, 因为在项目设置的"Run/Debug Settings"里面还存在设置导致eclipse编译后自动运行这个类,所以删除这里就行了

@chzyer
chzyer / putty-key-to-openssh.md
Created January 11, 2013 06:24
windows下putty生成的rsa转成mac下的openssh

之前一直在windows下开发,现在换到mac,发现在windows下生成的private key无法使用,应该说不知道怎么用 我在windows下是使用hg,然后通过pageant来载入key,载入之前要填写一次密码 到了mac下之后,每个用户文件夹里面都有一个.ssh文件夹,将rsa添加进去就行了,terminal下输入 ssh-add key-file-name 就行(key-file-name是名称),假设我的ppk的文件名是key.ppk,我输入ssh-add key.ppk,然后密码一直错误,后来发现两者使用的加密方式不是同一种类型的,然后找到了这篇文章 http://www.handaoliang.com/article_106.html 大致步骤如下

wget http://putty.very.rulez.org/latest/putty-0.60.tar.gz
tar xzvf putty-0.60.tar.gz
cd putty-0.60/unix
@chzyer
chzyer / mac-app-store-unable-buy.md
Created January 11, 2013 06:23
mac app store无法购买软件

想买trine2但是当按下buy app的时候, 提示 It may be damaged or was not signed 但是购买其他则没问题。 然后搜到了一个答案,

I had the same problem on a MacBook Air that ships with Lion

This is how you fix it

Close Every App (Safari, iTunes, AppStore, etc)
@chzyer
chzyer / about-js-compress.md
Created January 11, 2013 06:21
关于js压缩

关于js压缩 今天无聊, 突然想起来搞一个下载漫画的脚本, 毒手又伸向了imanhua.com 我以前写过一个php版的, 其中他对js的加密对我影响不大, 我只要知道他包含漫画所有文件名list的那个文件名就行了 这次我用python版写, 总体的思路是,抓取到该集漫画的所有图片,然后下载下来, 对于其中js就需要我手动去解析, 然后就碰到了下面这样的js压缩代码

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--)d[c]=k[c]||c;k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('5 11=15;5 12=["/3/2/1/0/14.4","/3/2/1/0/13.4","/3/2/1/0/10.4","/3/2/1/0/7.4","/3/2/1/0/6.4","/3/2/1/0/9.4","/3/2/1/0/8.4","/3/2/1/0/22.4","/3/2/1/0/21.4","/3/2/1/0/24.4","/3/2/1/0/23.4","/3/2/1/0/20.4","/3/2/1/0/17.4","/3/2/1/0/16.4","/3/2/1/0/19.4"];5 18=0;',10,25,'72363|54|Images|Files|png|var|imanhua_005|imanhua_004|imanhua_007|imanhua_006|imanhua_003|len|pic|imanhua_002|imanhua_001||imanhua_014|imanhua_013|sid|imanhua_015|imanhua_012|imanhua_009|imanhua_008|imanhua_011|imanhua_010'.split('|'),0,{}))

人为的格式化的话, 大致结构是这样