cg33

凡是过往,皆为序章


  • 首页

  • 归档

Mins,一个mini版的restful api资源服务器

发表于 2018-07-09 | 更新于 2019-04-11

介绍

又双叒叕造了一个轮子。Mins,mini server。一个小型服务器。主要用来做一些小型项目开发,或者前端调试用的服务器。内置完成了增删改查的api。只要配置好数据表,就可以对数据表的资源进行增删改查,用约定好的api路由。用来补充略显鸡肋而常用的”nodejs启动服务器”或”php -S”操作。

项目地址

https://github.com/chenhg5/mins

使用

十分的简单,利用提供的二进制文件,传入参数 -c 即可。

1
mins -c /the/config/file/path

路由

方法 路径
GET /resource/:table/id/:id
DELETE /resource/:table/id/:id
PUT /resource/:table/id/:id
POST /resource/:table

说明

POST 与 PUT 即为增加和修改,均需要通过表单传参数,对应参数名就是数据库表字段名,返回内容都是json格式。

Go语言编写的web管理平台生成框架

发表于 2018-07-07 | 更新于 2019-04-11

介绍

Web管理平台的工具已经有很多了。但是基于Go的比较少,于是补充了个轮子。用Go来写会有什么好处呢?根据个人的开发经验,基本每个需要交付的项目都会有数据管理平台的需求。而管理平台的编码其实大部分都是重复工作,增删改查,还有前端的页面编写。再加上部署环境等会耗费很多开发时间。这个工作几乎每个项目都需要,所以是完全可以节省的开发成本。GoAdmin也是基于这样的需求生产的。GoAdmin作为一个用Go写的Web管理平台生成工具,会充分利用Go的优点。零部署时间,可移植化(windows, linux, mac),简单配置安装,性能优秀等等。

由于此类的轮子php较多,也是因为国内用php开发的盆友多。此前的考虑是通过Go来调用php的框架实现可移植,但难度很大。因而考虑重新造轮子。本项目的灵感来自laravel-admin。感谢laravel-admin的作者。

项目地址

https://github.com/chenhg5/go-admin

项目开发

后端基于fasthttp,前端页面基于adminlte。fasthttp是性能比原生go的net/http还要优秀的网络包。而adminlte则是世界应用广泛的前端管理ui框架。

项目预览

项目开发进度

目前可移植化工作尚未完成,但是已经初步可以使用给go开发人员。需要将项目源码clone到本地,然后在本地配置构建,之后就可以运行了,详细请访问项目readme。

欢迎加入开发。^-^

基于golang channel的轻量级异步任务分发器

发表于 2018-07-02 | 更新于 2019-04-11

项目地址:https://github.com/chenhg5/go-task

有时候我们为了更好的利用计算机资源,可以把一些耗时长的任务队列化异步执行。举个对应简单的生活中例子就是大多数餐厅里面点菜都是先找地方做,看了菜单选好菜之后找服务员点菜,此时再等待菜做好送上来。这里餐厅厨房就是计算机的底层资源,菜就是待执行的任务,而服务员就是我们的go channel。

关于消息队列有很多好用的框架,如nsq,nats,kafka等等。但有时我们只需要轻量级的异步任务工具,而不需要太过于”复杂”的框架相对于我们的需求来说。于是借鉴一些项目框架,做了一个小小的封装。

go-task的使用很简单,只需要初始化一个任务处理器,然后往处理器里面添加任务,然后处理器就会异步地去执行了。

举餐厅的例子,代码如下:

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
46
47
48
49
package main

import (
"runtime"
"fmt"
"time"
"github.com/chenhg5/go-task"
"strconv"
)

func main() {

// init
task.InitTaskReceiver(runtime.NumCPU())

// 有十个人同时点菜
for i := 0; i < 10; i++ {
task.AddTask(task.NewTask(
map[string]interface{}{
"user" : strconv.Itoa(i),
}, // 参数
[]task.FacFunc{ordering, cooking, deliverying}, // 任务列表
-1), // -1代表任务不超时
)
}

time.Sleep(time.Second * 50)
}

// 下单任务
func ordering(uuid string, param map[string]interface{}) (string, error) {
fmt.Println("user " + param["user"].(string) + " is ordering")
time.Sleep(time.Second * 1)
return uuid, nil
}

// 做菜任务
func cooking(uuid string, param map[string]interface{}) (string, error) {
fmt.Println("user " + param["user"].(string) + " is cooking")
time.Sleep(time.Second * 1)
return uuid, nil
}

// 配送任务
func deliverying(uuid string, param map[string]interface{}) (string, error) {
fmt.Println("user " + param["user"].(string) + " is deliverying")
time.Sleep(time.Second * 1)
return uuid, nil
}

跑一遍,就会看到:

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
user 0 is ordering
user 1 is ordering
user 2 is ordering
user 3 is ordering
user 4 is ordering
user 5 is ordering
user 6 is ordering
user 7 is ordering
user 0 is cooking
user 2 is cooking
user 1 is cooking
user 3 is cooking
user 4 is cooking
user 5 is cooking
user 6 is cooking
user 7 is cooking
user 0 is deliverying
user 1 is deliverying
user 2 is deliverying
user 3 is deliverying
user 6 is deliverying
user 7 is deliverying
user 5 is deliverying
user 4 is deliverying
user 8 is ordering
user 9 is ordering
user 8 is cooking
user 9 is cooking
user 9 is deliverying
user 8 is deliverying

基于gokit的微服务项目骨架ko

发表于 2018-05-05 | 更新于 2019-04-11

前段时间发布了一个小小的web开发项目骨架morningo,性能与效率齐飞,开发速度在短暂时间熟悉go语言后应该是匹配php,ruby等这些脚本语言,而后期项目并发性能,基本并发到上千乃至上万tcp连接没问题。但从业务架构层面看,项目再发展,数据库存在瓶颈,单体项目耦合度高,可维护性差,可延展性差,存在很多问题。因而项目早期可以采用单体架构,但后期仍然推荐的是面向服务的分布式架构。分布式的架构模式虽然带来了增加的代码量,服务间沟通的成本,但整体项目更具有弹性,延展性更好。

项目地址:https://github.com/chenhg5/ko

gokit介绍

go语言的优点不用赘述,那么基于go的微服务框架有吗?gokit就是一个go语言相关的微服务工具包。它自身称为toolkit,并不是framework。也就是gokit是将一系列的服务集合在一起,提供接口,从而让开发者自由组合搭建自己的微服务项目。基本上看完gokit的例子就可以动手模仿着写一个类似的小项目。gokit的结构分为:

clipboard.png

transport

决定用哪种方式提供服务请求,一般就是 http,rpc

endpoint

是gokit最重要的一个层,是一个抽象的接收请求返回响应的函数类型。在这个定义的类型里面会去调用service层的方法,组装成response返回。而gokit中的所有中间件组件都是通过装饰者设计模式注入的。

1
2
3
4
5
6
7
8
9
10
type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)

func(log Logger, in endpoint.Endpoint) endpoint.Endpoint {
return func(ctx context.Context, req interface{}) (interface{}, error) {
logger.Log("input", toJSON(req))
resp, err := in(ctx, req)
logger.Log("output", toJSON(resp), "err", err)
return resp, err
}
}

service

所有的具体方法写在这里,可以理解为单体web框架中的控制器部分。

工具包

这三个层组成一个gokit微服务应用。此外,作为一个工具包,gokit为此提供了很多微服务工具组件。

clipboard.png

  • 认证组件(basic, jwt)
  • 回路熔断器
  • 日志组件
  • 普罗米修斯监控系统
  • 限流器
  • 服务发现系统接口(etcd, consul等)
  • 路由跟踪
  • …

这些组件大大方便了我们开发一个微服务应用。

关于ko

ko是一个基于gokit的微服务架构应用开发骨架。一个基本的微服务架构包括:分发层api网关,监控系统,日志系统,服务提供层等。ko的目的是提供一个架构参考,从而减短开发者上手微服务架构的时间,最终是想提供一个思路让开发人员能够在极短的时间内架构起一个正式环境完备功能的微服务架构应用,并可以马上着手于开发业务功能。同时,避免与各种基础服务之间耦合度过高,提供灵活的服务定制接口给开发者。ko会在gokit的基础上,会提供一个解耦且功能完备的Api网关,带有数据连接等功能完备的服务层,以及辅助项目构建的命令行脚手架工具。目前ko还在不断完善开发中,会在本文中更新进度。附传统的基础模型架构图。

clipboard.png

参考资料

[1] https://www.jianshu.com/p/cffe039fa060
[2] https://www.jianshu.com/p/0c34a75569b1
[3] https://gokit.io/faq/

php脚本开发Alfred workflow

发表于 2018-04-19 | 更新于 2019-04-11

使用mac的码农应该不会没用过大名鼎鼎的Alfred,至少也听说过。反正我自从接触mac下了Alfred,就基本不会用到mac的spotlight。Alfred源何强大,也是因为他的工作流(workflow)。想想你是不是经常为了查找本地公网ip,需要:打开浏览器,输入百度,输入ip,搜索。自从用了Alfred后,几个按键就帮你搞定了。为了翻译一个单词,需要:打开浏览器,搜索打开百度/谷歌翻译,输入单词,然后才得到结果。如今用了Alfred,option+space+yd+space+单词,搞定了。很geek,很奶思。这样棒的产品,请了解一下!不要999,不要99,只要19…欧元。当蓝了,我是不会跟你说是可能可以破解的。那购买了这款这么棒的产品后,当蓝还有更棒的功能,那就是你可以自己写自己的workflow了,不管你是php程序员,python程序员,ruby程序员还是就写个shell啥的,都可以。Alfred提供了简单的接口给码农们自嗨。下面演示一下用php开发两个简单的workflow。

unicode2utf8
unicode转utf8 https://github.com/chenhg5/Unicode2Utf8

clipboard.png

make a string
生成随机字符串 https://github.com/chenhg5/MakeStrAlfred

clipboard.png

演示一下

用Alfred打开Alfred的偏好设置。

clipboard.png

左下点击+打开一个blank workflow

clipboard.png

加入一个script filter的input

clipboard.png

然后双击进去填写各种明显的信息,在下方选择php开始写代码。

clipboard.png

这里的'{query}'代表了在alfred输入框关键词后面的输入。然后require_once的脚本位置在下面这里:

clipboard.png

右键打开workflow文件夹,各种资源文件也放里面。然后撸代码就可以。注意脚本会输出一个xml字符串,这个字符串就是alfred检索出来的列表,xml有各种属性可以去探索,但最基本的可以设置icon/title/subtitle/copy text等等。可以看代码注释。

附php的一个workflow开发包:https://github.com/joetannenbaum/alfred-workflow

为什么又要推荐一个新的web框架

发表于 2018-04-10 | 更新于 2019-04-11

很难找到一款开发效率高,易上手能够广泛推广,性能好(节省成本抗住大并发C10k), 部署简单(一键部署,无需配置任何环境)的Http项目开发框架。如果有,那么一定是用Go语言开发的吧!看到很多php的仁兄还没接触Go语言。想起以往用php框架像laravel开发,php-fpm部署运行,并发起来疯狂加机器的日子,眼泪就流下来。尽管后来有了swoole这种优秀的解决方案。Go的天生底层网络处理优势还是独树一帜(请忘了它的语法)。于是,我向即将或已经遭受并发之苦,成本之痛,部署之心累的底层码农们推荐一门神奇的语言Go,以及一个优秀的Web开发框架Gin。Beego?听过很多吐槽,不敢轻易用。由于Gin很”简单”,根据一些个人的开发习惯,整理了一个基于Gin新手入门项目开发骨架,欢迎下载一波感受一下。以下正文:

地址:https://github.com/chenhg5/morningo

MorningGo : Gin WebApp Project Skeleton

基于Gin的web项目开发框架。仅供参考。

更高的开发效率,
更好的性能,
更简单整洁的项目组织结构,
更快的部署。

适合于小型项目,大中型项目(pv高、需求复杂度高)移步 kit、go-micro、kite

环境要求

  • GO >= 1.8

项目安装运行

使用安装器安装

安装项目

1
2
3
4
5
6
7
8
cd $GOPATH/src

wget https://gitee.com/cg33/morningo-installer/raw/master/morningo-installer # mac
wget https://gitee.com/cg33/morningo-installer/raw/master/morningo-installer-linus # linus
wget https://gitee.com/cg33/morningo-installer/raw/master/morningo-installer.exe # windows

chmod +x morningo-installer
./morningo-installer --project-name web

加载依赖

1
2
cd web
make deps

测试

1
make test

平滑重启

1
make restart

运行

1
make

浏览器访问 http://localhost:4000/api/index

项目部署

生成可执行文件

1
2
make build # linus用户
make cross # mac/windows用户

将

关于代理的使用,```routers.go```中有示例。运行的同时会在文件夹下生成```pid```文件,每次更新完文件后执行如下命令即可平滑热更。
1
2
```
kill -INT $(cat pid) && ./morningo # 即停止旧的进程,重启新的执行文件

项目结构

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

.
├── Makefile
├── README.md
├── command
│   └── sword.go
├── config 全局配置
│   └── env.go
├── connections 存储连接
│   ├── database
│   │   ├── mongodb
│   │   └── mysql
│   └── redis
│   └── redis.go
├── controllers 控制器
│   └── MainController.go
├── filters 中间件
│   └── auth 认证中间件
│      ├── drivers 认证引擎
│   └── auth.go
├── frontend 前端资源
│   ├── assets
│   │   ├── css
│   │   ├── images
│   │   └── js
│   ├── dist
│   └── templates
│   └── index.tpl
├── handle.go 全局错误处理
├── main.go
├── models 模型
│   └── User.go
├── module 项目模块
│   └── schedule
│   └── schedule.go 定时任务模块
├── routers.go 路由
├── routers_test.go api测试
├── storage
│   ├── cache 缓存文件
│   └── logs 项目日志
│   ├── access.log
│   └── error.log
└── vendor govendor 第三方包

箱子里有什么 what`s in the box

HTTP 层(基于Gin)

  • 路由
  • 中间件
  • 控制器
  • 请求
  • 响应
  • 视图
  • Session

前端

  • tpl模板

安全

  • 用户认证
  • 用户授权
  • 加密解密
  • 哈希

综合话题

  • dancer 命令行
  • 缓存系统
  • 错误与日志
  • 任务调度

数据库

  • mysql
  • mongodb
  • redis

ORM(基于gorm)

测试

  • api 测试

项目依赖

  • web框架:github.com/gin-gonic/gin
  • ORM包:github.com/jinzhu/gorm
  • Redis:github.com/go-redis/redis
  • Mysql:github.com/go-sql-driver/mysql
  • Wechat:github.com/silenceper/wechat
  • 任务调度:github.com/robfig/cron

少年锦时

发表于 2015-12-30

[转]科学把妹法

发表于 2015-12-23

[1].曾经有一位生物学人士,公布了工科把妹第一弹,暨“巴甫洛夫把妹法”:

每天给你那位心仪的女同事/女同学的抽屉里都放上精心准备的早餐,并且保持缄默不语,无论她如何询问,都不要说话。

如此坚持一至两个月,当妹子已经对你每天的准时早餐习以为常时,突然停止送餐,她心中一定会产生深深的疑惑及失落,同时会满怀兴趣与疑问找到你询问,这时再一鼓作气将其拿下。    

此法借鉴了不朽的生物学家巴甫洛夫之“条件反射试验”,故名“巴甫洛夫把妹法”。

[2].生物界良策在前,物理界岂甘人后!今天,就将向大家隆重推出量子论的胜利—-“薛定谔把妹法”!                        

众所周知,为了浅显的说明量子论的概率特性,伟大的薛定谔同志作出过一个假设:                                

一只猫与一种衰变概率为50%的放射物质同放在一个箱子里(此放射性物质一旦衰变,与盖格计数器相连接的小锤就击碎一个装氰化物的瓶子,然后猫就…挂了),如果打开箱子,我们可以知道物质是否衰变,猫是否死亡。而在没打开箱子的时候,这猫就处在一个既可能生,又可能已死的“半生半死”的可怜状态。   

这就是:事件在被观察以前,一直处在一个所谓“概率云”的状态下,一旦受到观察,则坍缩为实体。

以上是引言,正文在此:

薛定谔把妹法乃是建立在巴甫洛夫把妹法之上的威力加强版:

每天早上,你拿出一个硬币抛掷,让伟大的随机性来决定今天是否给妹子送早餐。
这样,当妹子每天打开抽屉之前,都不知道是否有早餐,而早餐的有无乃是一个独立随机事件,完全无法推测。每天的早餐对于妹子都是一个未知的神秘存在,妹子将逐渐为这一神秘的现象所吸引,最终将不可避免的对这个送餐人产生极大的兴趣,你在她的心中蒙上了神秘的面纱。

这个谜一样的男子,这一刻薛定谔附体,带着量子论般深沉的哀愁,让她从此不能自拔!

总结:此帖将“早餐把妹”这样一个物理现象提升到了科学研究的领域,为了深入研究,故开创“早餐把妹学”在此暂设立两条基本假设为公理:

1 妹早上必然打开抽屉。
2 妹能感受到可能放在抽屉里的早餐。(即能感觉到抽屉里有早餐,且对其做出反映)

请给我这个谜一样的男子,这一刻薛定谔附体,带着量子论般深沉的哀愁,让我从此不能自拔!

[3].还可以再加强!

把妹这事儿,少了海森堡怎么行?!

测不准把妹法加强补丁如下:

如果抛硬币的结果为当天不送早餐,那么就拍一张本来可能送出的早餐图,显示清楚各种食物、饮料、水果的搭配,包括原料表和营养成分表,放在妹子的抽屉里。

如果抛硬币的结果是当天送早餐,那么就将准备好的早餐放到搅拌机里,打碎搅拌均匀成糊状,并包好放在妹子的抽屉里。

这样一来,妹子要么吃得到早餐,但不知道吃的是什么东西;要么很清楚今天早餐食谱,但是吃不到,进而对海森堡的吃不准原理有了更深的体会。

一颗扑通扑通乱跳的芳心就这样在物理学的强大引力场下被俘获了。

[4].还可以再加强!

华生把妹法和斯金纳把妹法

华生的把妹方法继承自巴甫洛夫的衣钵,仍然是传统的刺激条件反射, 但是按照华生的理论,纯粹的行为主义者可以喊出这样一句话:

给我一打女同事,我还你一堆软妹子!

众所周知经典行为主义将感觉、知觉、激情、情绪等都用刺激和反馈行为来描述。巴普洛夫的条件反射是基于单纯的神经系统,而华生更注意肌肉与腺体。但不论如何,行为主义者的观念中,是通过转换的手法来“清除”意识的,也就是说,他把一些意识内容转换成身体的内部刺激或肌肉的动觉反馈。

行为主义不在于寻找那种普遍的内省的“妹子”,而在于将一张张白纸塑造成软妹子。

取一定的样本量,在一批女同事/女同学抽屉里都放上精心准备的早餐,并且保持缄默不语,无论她如何询问,都不要说话。(S)

另取同样样本量的女同事/女同学作对照组,两组都安装摄像头和外部体温计观察。

在一定时间后,早餐的行为形成之后再从原来的组中挑选一半施以午餐反馈行为,对照组将自动离开,而目标组将继续情绪条件反射的习得。(R)

接下来的晚餐习得和夜宵习得就水到渠成了。

不过,缺陷是比较费钱!

不过既然是走养成路线,大撒网的气度就是经典行为主义者的浪漫。

斯金纳的操作行为主义把妹法

B.F.斯金纳,新行为主义的旗手

他对条件反射的进一步理解使得把妹比华生的手段要来得经济而高效。

首先我们来了解一下斯金纳箱:

斯金纳关于操作性条件反射作用的实验,是在他设计的一种动物实验仪器即著名的斯金纳箱中进行的。箱内放进一只白鼠或鸽子,并设一杠杆或键,箱子的构造尽可能排除一切外部刺激。动物在箱内可自由活动,当它压杠杆或啄键时,就会有一团食物掉进箱子下方的盘中,动物就能吃到食物。箱外有一装置记录动物的动作。斯金纳的实验与巴甫洛夫的条件反射实验的不同在于:(1)在斯金纳箱中的被试动物可自由活动,而不是被绑在架子上;(2)被试动物的反应不是由已知的某种刺激物引起的,操作性行为(压杠杆或啄键)是获得强化刺激(食物)的手段;(3)反应不是唾液腺活动,而是骨骼肌活动;(4)实验的目的不是揭示大脑皮层活动的规律,而是为了表明刺激与反应的关系,从而有效地控制有机体的行为。

也就是说,强化行为是把妹的手段和目的。斯金纳认为强化刺激不是与反应同时发生的,也不需要先于反应,而是随着反应发生。有机体必须先做出我们所期望的反应,然后得到“报酬”,就能形成一次有效的正强化。

那么如何操作呢?

我们首先看一下TBBT当中Sheldon对Penny的一次实例:当Sheldon发现Penny做出适合自己期望的行为时,就给她一颗巧克力,这就是一次”GOOD Penny”的操作条件,也就是说,我们操作的标志在于“我”对对方有何等的期望,然后才有的放矢地进行操作条件反射和强化的构建。

当然,负强化的操作也可以参见Sheldon对Lenord的”BAD Lenord”的操作示范(喷水)

那么推广到把妹法就是这样的:

操作1:当你心仪的女同事/女同学在无意之间为你做了一点小事,向你认真地微笑,或者称赞你的时候,就在她抽屉里都放上精心准备的早餐,并且保持缄默不语,无论她如何询问,都不要说话。(她并不知道会是谁放的)

原则是:她没有对你示好,就不放,她有一点点好,就通过放早餐(正强化),她如果对你表示厌恶,可以用不动声色的负强化(具体的可以参考她讨厌什么)。

如此以往操作下去(基本上也比较省早餐钱),总之是要比巴甫洛夫来得高效一点。

操作2:当你心仪的女同事/女同学在无意之间来你房间一次的时候,给她以奶茶的正强化刺激。

操作3:当你心仪的女同事/女同学在无意之间触碰到你的时候,给她以巧克力的正强化刺激。

操作4:当你心仪的女同事/女同学在无意之间……给她……的正强化刺激

…..

也就是说,强化刺激是可以无处不在的,但是不论如何,负强化是要慎用的,斯金纳等人也指出负强化的效果很难跟正强化相提并论……

[5].严肃再加强:

推荐采用可变-比率程序表 即VR程序表,此程序表产生的反应速率最高,抗消退能力最强。

即只固定正强化出现的平均次数,但具体出现在那一次是可变的。

具体而言,当心仪的mm有意无意的做出有利于二人关系的行为时,统计其次数,并在平均正强化量一定的情况下随机的给予正向刺激。

人们会用一种赌博的心态来对待VR程序表,三番五次的尝试。长此以往,成功在望矣。

[6].加强版~~

米尔格拉姆把妹法~

先说明一下米尔格拉姆实验:随机选择实验参与者做“教师”,关在一个小屋子里,实验设计者假冒“学生”,关在隔壁一个小屋子里,“教师”看不到“学生”但是能听见彼此声音。然后给教师一张问题卡和答案卡,教师隔着墙壁问学生问题,学生答对了就继续问答,答错了就由教师操纵电击学生。每次答错,电击伏特数会加大。而教师听到的是实验者事先准备好的电击声音和尖叫声的录音。

电压 “学生”的反应

伏特 反应
75V 嘟囔
120V 痛叫
150V 说,他想退出试验
200V 大叫:“血管里的血都冻住了。”
300V 拒绝回答问题
超过330 V 静默

实验开始于1961年7月,也就是纳粹党徒阿道夫·艾希曼被抓回耶路撒冷审判,被判死刑后的一年。米尔格拉姆设计了这个实验,便是为了测试“艾希曼以及其他千百万名参与了犹太人大屠杀的纳粹追随者,有没有可能只是单纯的服从了上级的命令呢?我们能称呼他们为大屠杀的凶手吗?”整个实验可能只是设计好,为了测试寻常美国民众会不会遵从命令违背道德良心—如同德国人在纳粹时期一样,而这便是实验的初衷之一。

以上是实验原型介绍,现在正文开始:

哥为实验设计者,选择自己心仪的妹子来充当上面这个实验里“教师”的角色。妹子被告知自己应准备好自己最喜欢的早餐食谱以及相关问题,然后隔着墙问哥问题。也是假冒电击,只不过墙另一边除了哥在放被电击的声音之外,还有一个内容丰富应有尽有的冰箱,哥根据妹子的问题给妹子准备早餐。等到电击超过330V哥就静默了,妹子就惭愧地退出实验了,然后一出门就看到哥淫笑着端着妹子心仪的早餐等在实验室外面了。

于是乎妹子感觉被电击的不是哥,而是自己了~~~~

[7].帕金森把妹法:明天给你那位心仪的女同事/女同学的抽屉里都放上精心准备的早餐28份,没错也就是四周且包含休息日的量,并且保持缄默不语,无论她如何询问,都不要说话。

如此只需一天,你那堆满她书桌的早餐一定给她带来了不朽的震惊与惊慌,此时趁她惊魂未定一举拿下。

此法参考了著名的帕金森法则,帕金森法则认为,任务的重要性和复杂度与所分配的完成任务的时间密切相关。这就是不断迫近的最终时限的魔力。如果给你24小时去完成一项任务,时间的压力促使你集中精力去执行,别无选择只能做最重要的部分。同样的任务,如果给你1周去完成,它就换来了小题大作的6天。如果给你2个月的时间,但愿不要这样,它就变成了一场精神磨难。因为精力更高度集中,短时限内做出的最终产品通常不比长时限内做出来的差,甚至质量更高。

[8].爱因斯坦把妹法

“众所周知”,爱爷在引出广义相对论时提出一个简单的思维实验:在远离星体一望无垠的宇宙空间里,上帝说:“要有电梯。”于是出现了一只电梯。上帝继续说:“要有绳。”于是电梯顶上系了根缆绳。上帝还是有点寂寞,于是边以加速度g拉缆绳边说:“要有人。”于是一个男人呱呱落在了电梯里,一副理工相,谁叫他是男人呢,很自觉地开始研究电梯。上帝造电梯时忘了造窗户,因此理工男对电梯外一无所知,他只晓得自己怎么使劲跳还是会落到电梯底板上来,多次尝试后很命贱地开始研究跳的高度和下落时间的关系(上帝适时地说了“要有实验工具…”)久而久之,他居然算出了g。但丫是个无神论者,懒得管上帝寂不寂寞,他只认电梯底板,认为那个才是宇宙(电梯)中最牛逼的东西,无时无刻不在产生一种被他后来称做“重力”的远距离神秘效应。

不罗嗦了,回到早餐。早餐在这里必须是类似于重力的一种效应,美妙的口感与脚踏实地都能唤起幸福感,区别仅仅在于姑娘们对前者效应的敏感区集中在舌部。

我们要学的,正如爱因斯坦老爷可以用一架重力场外加速“上升”的电梯制造出重力的假象,那么,考虑到腰间不那么饱满的钱袋,为何不去制造出早餐的假象呢?

第1天,夜深人静了,爱因斯坦会在女同学的抽屉里留张纸条:“明早这里将会有份早餐。”

第2天,姑娘的反应:有人暗恋我?不会是恶作剧吧?开始期待第三天。

第3天,姑娘还是矜持地自带了早餐,外表平静内心潮涌地打开抽屉。唉伊西——没有早餐!还是一张纸条:“这是今天的早餐。”姑娘又气又笑地揉掉它,开始吃自备早餐。

第4天,姑娘老老实实带了早餐,一开抽屉,还是只有纸条:“这是今天的早餐。”揉掉。

第5天,同上。

……

第n天,同上。

第n+1天,姑娘不揉纸条了,开始边吃自备早餐边欣赏起笔迹来。

……

第2n天,姑娘乐呵呵地看到纸条后开始巴普络夫式地吃早餐。

第2n+1天,姑娘站到了爱因斯坦电梯门口。“这是今天的早餐。”几个字的视觉效应已与自备早餐的美妙口感建立了通感。

……

第3n天,姑娘进了电梯。

第3n+1天,一个伟大的公式水彩画般地印入姑娘脑海中:纸条=早餐(惯性力=重力)

……

第4n天,姑娘没有发现纸条。上帝拉累了,电梯匀速直线了,g点没了,姑娘悬浮了,早餐难以下咽了。

第4n+1天,姑娘耷拉着脑袋还是先去开抽屉,此刻再抠门你就下辈子再把妹吧!一份可爱的实体早餐跳了出来!刷着她的眼帘!量身定做!精心打造!没有纸条!姑娘骚荡不安地左顾右盼。这时年轻帅气的爱因斯坦稳步过去递上纸条,上面潇洒飘逸着几颗帅字:“久等了,头一回做成功。”

此法经济实惠,缺陷是有点耗时间,不过爱因斯坦的粉丝应该不缺时间。

[9].尾递归把妹法

尾递归是针对传统的递归算法而言的,传统的递归算法在很多时候被视为洪水猛兽。它的名声狼籍,好像永远和低效联系在一起。

尾递归就是从最后开始计算,每递归一次就算出相应的结果,也就是说,函数调用出现在调用者函数的尾部,因为是尾部,所以根本没有必要去保存任何局部变量。直接让被调用的函数返回时越过调用者,返回到调用者的调用者去。

传统把妹算法是一个O(n)复杂度的算法。由于把妹算法的完成时间无法预估,也就是问题规模n无法预估,而且使用传统的递归把妹算法时,每进行一次递归,都需要在堆栈上保存新的状态,因此,对堆栈深度的需求也是无法预估的。在问题规模较大,也就是妹子比较顽固的情况下,极有可能导致堆栈溢出。鉴于此,我们应该使用尾递归算法来解决这个问题。

具体来说,我们可以假设当某一天妹子吃完早餐之后,会给出非零的返回值,意即把妹成功。因此,只需要在递归函数的尾部返回妹子在下一天吃完早餐之后的返回值,即可实现尾递归。

由于尾递归并不需要额外的堆栈空间,因此,可以更高效地获得妹子的最终返回值。

以下是使用类Lua语法实现的伪代码:

require("Sister")
 function HandleSister(day)
 if Sister:EatBreakfast(day) == 1 then
   return 1
 else
 -- tail recursive
    return HandleSister(day + 1)
 end
 end

[10].千呼万唤始出来 —- 牛顿把妹法

看到现代物理硕果累累,经典物理也不禁跃跃欲试

众所周知,牛顿三大定律是经典物理中经典:

牛顿第一定律(惯性定律):物体在不受外力的作用下,总保持匀速直线运动状态或静止状态,直到有外力迫使它改变这种状态为止

牛顿第二定律(加速度定律):物体的加速度跟物体所受的合外力成正比,跟物体的质量成反比,加速度的方向跟合外力的方向相同

牛顿第三定律(作用力与反作用力定律):两个物体之间的作用力和反作用力,大小相等,方向相反

应用到把妹学上就是:

牛顿把妹法第一定律:在不受外力作用时,妹总是沿原生活轨迹匀速直线运动,或保持静止

牛顿把妹法第二定律:妹的加速度与妹受到的把力成正比,加速度方向与合力方向相同

牛顿把妹法第三定律:妹受到的作用力与妹的反作用力,大小相等,方向相反

具体指导方法如下:

妹在被哥把之前,沿着自己的生活轨迹匀速直线运动或保持静止状态。在哥对妹施加把力之后,既送早餐之后。妹就在把力的作用下脱离了自己本来的轨迹,匀加速运动。并且,把力越大,既送的早餐越好,送的越勤,妹的加速度也就越大。不过,除了把力,还有来自妹本身和妹身边的同学/同事家人等各个方向的阻力,并随着妹速度的增加而增加。因此,妹实际的运动方向是这几种力的合力。这就要求哥得会受力分析,计算出把力的方向和大小。

最终,在通往幸福的方向上,妹匀加速前进

[转]《源代码》:薛定谔定律里的那只猫

发表于 2015-12-20

  佛祖有云:一步一生花,一花一世界

  《源代码》这部影片,本没有太多好说的。其画面说不上震撼火爆,但很明快流畅,剧情算不上惊心动魄,却是跌宕起伏。若不去究其内里,大可以把它看成一部适合在电影院约上三五朋友,边嚼爆米花边看的标准商业片。其真正值得探讨的,是导演借以建立其故事架构的概念,若深入其中,则另有一番天地。

决定论(机械论):
  影片故事的核心概念是平行宇宙,但要说到这个概念,首先要回答的一个问题是:什么是随机?举一个简单的例子,掷骰子普遍被认为是一种随机现象。因为它的结果无法预知,所以赌博的人都靠他来搏运气。但深入的考查后会发现其可能并不是一个随机事件。骰子落地得到的结果跟其起始条件和环境因素严格相关,若是能够准确控制投出的起始位子,角度,方向,空气流动,温度等所有因素,那么每次投出的结果便会一模一样。也就是说掷骰子这个看似随机的过程实际上很可能是一个确定的过程。
  骰子如此,那么当然硬币也一样,计算机生成的随机数则是通过某种算法得到的伪随机数(通常与计时器相联系),如果以此深究下去,你会惊讶的发现所有你能想到的随机现象也许都是伪随机。每一个结果都是造成它的原因的结果,而它的原因,又是其自身原因的结果。花是注定要开的,因为那阵风带来了花蜜,风是注定要来的,因为远方的蝴蝶拍了拍翅膀(蝴蝶效应),蝴蝶是注定要拍翅膀的,因为另一只女蝴蝶正光着身子偏偏起舞。
  如此看来似乎一切都已注定,过去的原因决定了现在的结果,那么作为自认高等的人能够摆脱束缚,拥有自由吗?在决定论者看来,这是在自欺欺人。
自由意志:
  哲学上来说,人所能拥有的全部自由是选择的自由,也就是所谓的自由意志。当墨菲斯向尼奥摊开双手时,尼奥便开始行使这样的自由,但无论他吃下哪颗药丸,他的选择早已注定。人们会思前想后,考虑所有因素,作出决定,并执着的认为这是自己的决定。但仔细考虑一下,如果让人在一辆劳斯莱斯和一辆奥迪间选择,100个人中99个会选前者,而剩下的那个想要用他的选择来证明自身的自由,但这样做的他不仅首先受到了证明自身自由这一想法决定(而这一想法又是由于想要反向驳决定论这一冲动而来的,这一冲动又自有其原因)进行了反向选择从而正好证明了决定论,还损失了一辆劳斯莱斯。就如同《奠基》(又名《盗梦空间》)里所说的:当你试着不要去想大象的时候,你首先想到的便是大象。
  有人也许会想,如果面对两辆几乎一模一样的劳斯莱斯,唯一的不同是底盘上的一个字母,而选择者无法看到这个字母,那么选择者作出的选择不就不受其他因素支配的影响了事件的发展了吗?但若仔细考虑,选择者可能会因为偏爱方向右而顺手选择右边的一辆,而他的这种偏爱可能是小时候的某种创伤造成的信念固着。如此一来我们仍然可以说人并不存在自由意志,一切都已决定,只是我们无法了解。
  面对一个如此悲观的结论,大多数人难以平静。我们真的对自己无能为力吗?我饿了所以我吃了个面包,我冷了,所以我穿了件衣服,我长大性冲动了,所以我找了个老婆,我看了某本旅行日志或者某篇杂志上爱琴海的美丽风光,所以生出了环游世界的梦想。我们就这样被生活推着,随波逐流。我们是剧中的角色,编剧却另有其人,他只是轻轻推了推第一张骨牌,便创造了这大千世界。他是谁?有人说是上帝,有人说是安拉,但这又是另一个问题了。

量子理论:
  在18,19世纪,基于因果循环的拉普拉斯信条所建立的决定论统治着整个思想界。包括从牛顿到爱因斯坦的众多大家都是其信徒。然而,一场科学上的革命却为非决定论哲学带来了曙光。量子力学的建立在微观层面上质疑了宏观因果律,其提出处于所谓“叠加态”的微观粒子之状态是不确定的,从而将随机这一概念再次拉回我们眼前。
  举一个例子,通常我们认为原子核之外有电子围绕,然而根据量子力学,这些电子并不是像地球绕着太阳转一样围着原子核绕圈,它可能出现在核周围任意位置中的一个,或者说这一个电子同时出现在他可能出现的位置。只有通过观察,我们才能决定其状态,然而令人蛋疼的是观察又改变了其状态。那么在观察之前电子到底处于什么状态呢?这个问题的蛋疼程度可以通过一个比喻来说明:你来我家做客,我在不在家呢?当你打开门的时候你才能确定我在不在,但在开门之前,我处于什么状态呢?这时我有多个分身,可能在家,可能在学校,可能在路上。我同时处于所有可能处于的位置的叠加态,直到你开门看了一眼,于是我的位置确定了。

薛定谔的猫:
  这样的事情别说你想不通,无数物理学家和哲学家都抓破了头,于是薛定谔想出了一个思想实验:将一只猫关在箱子里,箱内还置有一小块铀、一个盛有毒气的玻璃瓶,以及一套受检测器控制的、由锤子构成的执行机构。铀是不稳定的元素,衰变时放出射线触发检测器,驱动锤子击碎玻璃瓶,释放出毒气将猫毒死。铀未衰变前,毒气未放出,猫是活的。铀原子在何时衰变是不确定的,所以它处于叠加态。薛定谔挖苦说:在箱子未打开进行观测前,按照量子力学的解释,箱中之猫处于 “死-活叠加态”——既死了又活着,要等有人打开箱子看一眼才能决定猫的生死。用量子力学的术语来说,在打开箱子那一刻,因为你看了一眼,波函数塌陷了。这简直匪夷所思,微观的混沌变为宏观的荒谬——猫要么死了,要么活着,两者必居其一,不可能同时既死又活。难怪霍金听到薛定谔猫佯谬时说:“我去拿枪把猫打死!”

平行宇宙:
  对于这只令人蛋疼的猫和波函数的塌陷,一个合理的解释是宇宙在此刻分裂了。在这一刻,所有的可能性同时发生于分裂出的平行宇宙之中,猫在一些宇宙中死了,而在另一些宇宙中活着。这一解释是对决定论的重大打击,其假设了微观的不确定性不仅仅影响微观,这种不确定的叠加态让我们在事件发生的那一刻进入了众多可能宇宙中的一个,难怪佛曰:一花一世界。
  在《源代码》里,主角柯尔特·斯蒂文斯上尉便是通过Dr. Rutledge发明的某种装置用Fentress的残留脑波量子力场(电影中的假想)一次次的回到“肖恩”睡醒睁开眼那一刻的叠加态上并进入众多平行可能宇宙中的一个。这就是为什么每次他张开眼,发生的事都大体一样却又有所不同。第一次醒来时克里斯蒂娜告诉他她取消了某事,然后挂了个电话,并没有帮“肖恩”擦鞋上的可乐。第二次醒来时克里斯蒂娜告诉“肖恩”她注册了法律课并准备到印度去,没有电话响起,并且帮他擦了鞋上的可乐。影片中还有很多其他细节就不一一列举了。
  宇宙的分裂不断地进行并呈现进化树的模式,所有的可能宇宙都可以向后溯源到唯一初始点,但事件的发展却让宇宙相互分离并不再联系。这也就解释了为什么“肖恩”第一次在火车上打电话给Dr. Rutledge后,Rutledge无法收到他的电话留言,因为后一个Rutlegde并非由“肖恩”回去的那个宇宙发展而来。而后来“肖恩”发信息给 “戈德温”时她收到了他的信息,因为这时的她处于的宇宙位于“肖恩”发信息这一事件节点之后。  
  从平行宇宙的进化树模式我们可以知道,影片中的Colter所拯救的只能是众多平行宇宙中的一个(这一个又会在拯救这一事件结束时分裂成众多)。但是我们可以设想,由安置炸弹事件发展而来的其他宇宙可能也有(也可能没有)这样一个Colter在执行这样一个任务。但进化树的模式却带来一个问题:所有的Colter都回到了同一个时间点的叠加态(可溯源,并且此源唯一),但这些Colter又拥有未来的记忆,于是当他们回到叠加态时会让此时这个Colter拥有各种各样未来可能宇宙的记忆并互相冲突。或者换一个说法,众多来自未来可能宇宙的Colter带着自身记忆进入了张开眼睛那一刻的Colter,此刻他不仅拥有多个灵魂(假设用灵魂这一形式),而且这些灵魂还来自同一个人。对这一逻辑问题,影片无法回答,因为其设想的返回机制本身就是不存在的,但这却引出了另一个问题。

本体论:
  我是谁,存在是什么,到底是什么决定了我是我,上一时间单元的我到了下一时间单元还是那个我吗?这个问题在影片里的提出是Colter看到镜中的自己是另一副模样(Fentress的样子)那一刻,和Colter认为周围的一切是虚拟的影像。
  
  要考虑这一问题可以从一颗辣椒开始。如果我是上海人,我可能觉得这辣椒特别辣,但我是重庆人,我很可能觉得它一点都不辣。那么到底他辣不辣呢?这取决于我的味蕾向大脑传递的信号。同一个道理,我可能看到这颗辣椒是红色,但一个红绿色盲可能会反驳说它是绿色。我可以找一大帮人来帮我证明我是对的,但如果全世界的人都是红绿色盲呢?那么似乎情况便成了这颗辣椒公认的颜色是绿色,而我才是红绿色盲。如此深究下去我们甚至可以直接质疑这辣椒的存在。我现在确证其存在不过是因为我能看到它,摸到它,尝到它等等。但归根到底这些不过是一堆感觉信号,可以设想利用计算机模拟出所有这些信号并向脑中传递,一个不存在的辣椒便活生生的出现在了我的观念之中。
  
  如此推想我们似乎永远也无法确定眼前景象的真伪,而我们对于物质世界的确证感(对于唯物主义者)的唯一来源只能是罗素口中的“本能信仰”。因为根据奥坎姆剃刀原则,似乎没有必要假想一个复杂的由心灵构建的世界。

弦论:
  那么,到底什么才是物质的根本性质呢?要回答这个问题,弦论是最佳候选理论。看过Big bang的同学对这个词都不会陌生,我们智商高达180的谢耳朵同学正是在抓破脑袋研究这个理论。此理论假设,宇宙的基本组成单位是一维弦,无数震荡着的一维弦或是这些弦形成的闭合圈相互共鸣,形成了三千世界,一花一木皆是共鸣所产生的象。可以通过一个比喻更加形象的说明。将一维弦比作是琴弦,当拨动琴弦时,其振动产生了音乐,并通过空气的谐振被我们听到。音乐便是象。它不是琴弦本身,更加不是空气,但我们确确实实听到了它。

  小结:正如我们看到的一花一木,其非弦本身,却是弦所产生的象,似有还无。难怪佛曰:色即是空,空即是色。又曰:菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。

论信仰

发表于 2015-08-02 | 更新于 2015-12-10

  从大学一年级到大学三年级即将大学四年级,时间过得很快。从前听着师兄调侃自己是大三大四的老油条,觉得好好笑,而今自己却也已经成为了众多老油条大军中的一员。

  油条老了,还能吃吗?

  吃是可以的,只是没那么好吃了。皱了,更油了。回想过去的自己是亮丽有锋芒的,如今呢?算得上“老奸巨猾”了。有时候看到大一的小鲜肉总会有一种莫名优越感,心里有一种冲动想过去拍拍他们的肩膀,说上一句,“你们还年轻呐,慢慢体会。”确实很多事情是看破不说破,如果你没有亲身体验过的话,单看表面可能觉得很深奥,但事后往往不是这样。大脑就是这么奇特,总能营造一种跟现实不一样的感觉,或期待,或崇拜。有如,信仰。

  前几天,女票从一家互联网旅游公司辞职了。他们所属团队的人心涣散,很多人都想离开,然而很多人并没有离开。做运营的团队外在看起来很高大,毕竟作为有名气的互联网公司。但实际上是做着“兼职”感觉的工作。作为一名大三大四的有点资质的大学生,去做一份这样的工作显然是不好的。但因为不了解,希望更多的了解,而且工作有着对于大学生来说还不错的工资,所以在离开与不离开的选择上还是选择了留下。

  她走了之后,很多人问她为什么离开,是不是这份工作不好。她都跟他们说不是,让他们加油。其实是不是,经历过才知道。看不看得到希望,也没人说得清楚。从局部到全局来看,你所被灌输的信念和斗志,不一定是“真”的。很可能你跨过了局部边界的那条线之后,你会发现这种斗志是无意义的,这时的你,就慢慢地变成所说的“老油条”。油条老矣,尚能思否?尚能进取否?

  可以,你终究会找到新的信念,投入新的工作。但要明白的是,很可能我们跨越过的局部所进入的全局很可能只是一个更大的局部而已。在这个更大的局部中,我们被灌输以新的斗志新的信念,然后走上新的征程。

  于是,不断的充满斗志,跨越局部,顿悟迷茫徘徊,充满斗志,跨越……何时我们能打破循环?


“时间时间会给我答案。”


  也许回过头来,发现最大的局限是我们的内心,当跨越了内心的时候,就无所谓局部与全局了吧。

123
cg33

cg33

一个喜欢代码的小孩
22 日志
  • Mins,一个mini版的restful...
  • Go语言编写的web管理平台生成框架
  • 基于golang channel的轻量级...
  • 基于gokit的微服务项目骨架ko
  • php脚本开发Alfred workfl...
  • ....
RSS
© 2019 cg33
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v7.1.0