Jasper Ji

开口不在舌头上

0%

这本书比较老,要不是因为跟乔布斯读过有关系,很少会引起大家的注意,另外书里的例子是90年代的东西,有些东西涉及硬盘之类的案例,更重要的是这本书面向的是企业管理者和想内部创新的相关人,个人觉得对于很多人不会有共鸣感。因为在一家传统行业的公司从事信息化建设的相关工作,也才开始体会书中的东西。

盈利

创新性业务与旧的业务的比较,大家都比较在意是否盈利,这就面临一个问题要不要盈利?不盈利,那么公司是否愿意投入一定时间的可能亏损的资金投入。但是要求盈利的话,那么这个项目很有可能会变味,因为按照书中描述的创新性项目一般盈利性差,短期内实际还是亏损。个人觉得没有丰腴资金流的公司很难做这样的内部创新。

独立

实际中我们可能会借助于传统来开展创新性的工作,所以会把二者一起考虑,但事实证明最好还是独立一个跟旧的业务分离开的部门。这样的好处是,避免传统与创新部门的比较,包括薪资、文化等,创新性的很大程度与旧的之间存在不一样的部分,所以最好能独立开来。

创新

这个也是书中讨论的,其实跟是不是公司内部创新没有太大的关系,其实更具有普遍性。创新的产品可能在当下没有优势,但是随着时间的发展会在某个点突破性能的点,从而替代旧的技术,这点非常值得创业者思考自己的项目是否属于这类,但也有个问题,比如书中提到的电动车,那是90年,即使到现在这个依旧是比较小众的,所以也许看准了,但是如果在初期的话,也很有可能因为过早的介入而夭折。

内卷

内部创新最大的敌人就是内卷,尤其在已经很成熟的行业。我想到了曾经的手机霸主诺基亚,理论上来看最好的手机应该由他们产生,但是颠覆行业的却都不是这些企业。

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
brew install nginx

## 安装成功后
Docroot is: /usr/local/var/www

The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.

nginx will load all files in /usr/local/etc/nginx/servers/.

To have launchd start nginx now and restart at login:
brew services start nginx
Or, if you don't want/need a background service you can just run:
nginx

配置

默认根目录/usr/local/var/www,可以在配置文件/usr/local/etc/nginx/nginx.conf中修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
server {
listen 8080; # 端口可以自己修改
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root index # 自定义路径
index index.html index.htm;
}
...

图片服务器,需要配置images目录,在conf文件中增加如下,然后重启。

1
2
3
4
5
location /images {
root /xxxx/xxxx; # 图片存放的目录
autoindex on; # 开启目录游览
}

管理

使用brew来管理服务

1
2
3
brew services start nginx # 启动Nginx后台服务
brew services restart nginx # 重启Nginx后台服务
brew services stop nginx # 停止Nginx服务

诊断

Nginx诊断,有遇到过Nginx已经启动,但是无法访问,可以使用nginx -t来诊断具体的错误。

匿名函数和闭包似乎成了现代语言必备的,因为自己接触的语言也多,所以特意做了下目前自己接触的这些语言不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}

func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}

这是Go语言的原始版本,例子来源于tour.golang.org,后面会用其他的语言来写相同的例子。

JavaScript的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
function adder() {
let sum = 0
return function (x) {
sum += x
return sum
}
}

let pos = adder(), neg = adder()

for (let i = 0; i < 10; i++) {
console.log(pos(i) + " " + neg(-2 * i))
}

Swift 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Foundation

func adder()->(Int)->Int {
var sum=0
return {(x: Int)->Int in
sum += x;
return sum
}
}

var pos = adder(), neg=adder();

for i in (0...9) {
print("\(pos(i))" + " " + "\(neg(-2*i))")
}

断断续续的看了些Common Lisp的东西,主要是田春冰河翻译的那本《实用Common Lisp编程》,另外网上有人翻译了《ANSI Common Lisp》也有看,另一本《Common Lisp: A Gentle Introduction to Symbolic Computation》。总得写点东西,于是就写了这个双色球的小程序。

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
(defconstant total-red-ball 33)
(defconstant total-blue-ball 16)

(defun select-red-ball (red-balls double-balls)
(let (x)
(setq x (elt red-balls (random (length red-balls))))
(vector-push x double-balls)
(delete x red-balls)))

(defun create-double-balls()
(let ((red-balls (make-array total-red-ball :fill-pointer 0))
(blue-balls (make-array total-blue-ball :fill-pointer 0))
(double-balls (make-array 7 :fill-pointer 0)))
(loop for i from 1 to total-red-ball do (vector-push i red-balls))
(loop for i from 1 to total-blue-ball do (vector-push i blue-balls))
(dotimes (n 6)
(select-red-ball red-balls double-balls))
(setq double-balls (sort double-balls #'<))
(vector-push (elt blue-balls (random 16)) double-balls)
(print double-balls)))

(defun gen(n)
(dotimes (i n)
(create-double-balls)))

Lisp特殊的语法风格确实与C体系的语言有很大不同,不过如果有编程经验的话,还是比较容易上手,比如函数的传参,传个数组的话,实际上传指针了。定义局部变量的方式比如用LET

1
2
3
4
rake 'new_post["title"]' # 创建文章
rake generate # 生成文章
rake preview # 本地预览博客
rake deploy # 发布博客

修改文章创建的日期格式,我比较喜欢类似2020-01-01 00:00:00这样的格式,修改_config.yml

1
2
date_format: "%Y-%m-%d"
time_format: "%H:%M:%S" # 这个新增的,默认配置文件没有的

持续记录在工作中一些MySQL使用心得。

二进制日志

二进制日志文件默认会存放在 /var/lib/mysql目录下,配合mysqlbinlog可以查看数据的变更,--base64-output=decode-rows -v加上这个可以使日志可读。

1
mysqlbinlog --start-datetime="2020-07-14 10:00:00" --stop-datetime="2020-07-14 10:05:00" binlog.000001 --base64-output=decode-rows -v

创建用户

访问远程数据库时,创建相应的用户。

1
2
3
create user 'root'@'本机IP' identified by '数据库密码';
grant all privileges on *.* to 'root'@'本机IP' with grant option;
flush privileges;

使用Macbook Pro已经有6、7年了,总结下用到的一些不错的配件。

键盘

首推HHKB了,整体设计很复古,键位布局很紧凑,很轻非常适合携带。尤其是新版的本使用虚拟操作栏和蝶式键盘后,基本上写程序都是用的HHKB。键盘没有方向键,一般使用FN组合建。没有大小写按键,可以使用Shift+字母键来代替。价位确实比较高,也不是机械轴,质量当然没得说,几年过去依旧完好,最主要其实就是感觉跟苹果一样都是追求极致的那种,一句话很搭。

另外菲尔可的78键的也不错,我买的是青轴,这个键盘听说是有加钢板,所以敲着声音更清脆。关于机械轴,很多刚开始玩机械需要注意的一定要买青轴,实际上青轴真的也没有传说中的多吵,而这个也是最能体现机械件轴的地方,所以推荐买青轴了。这个键盘比较重,不合适携带。

鼠标

原装的鼠标当然好,不过也是真贵。推荐一款淘宝上只需不到20元的ACTME的蓝牙充电鼠标。虽然廉价但鼠标移动很顺畅,从来没有卡顿过。比一些大牌的好,至少在mac系统下。

扩展坞

新版的Macbook Pro确实轻了不少,换来的是一堆的Type-C的接口。扩展坞这种东西也成必须要买的配件,目前用的是绿联的,除了有些发烫外,其他的转接功能都正常使用,不过用扩展坞给手机充电确实不快,应该用慢来形容。

键盘膜

之前的本和现在的都用的Moshi的这个牌子,主要是做工好,跟键盘的贴合度都没有问题。虽然有点小贵,上个本的依旧完好无缺,一个可以把本淘汰掉,依旧完好的膜,也算值得。

Octopress 这东西放在5年前那会是多那么的流行,不过后来好像被Hexo超越了。打开大部分的博客都是Hexo的,Octopress的已经很少见了。15年的时候用Github Page建立Octopress的博客,写一篇iOS的文章后就再也没有更新了。虽然也有使用Hexo替换Octopress的想法,不过想想还是算了。

网上吐槽Octopress意思是生成文章比较慢,不过我这种写文章的速度话,也不会有多少文章,所以没有设么好担心的。也许过几年后文章多了,Hexo的也不流行了。

修改Octopress对于我来说也不是什么问题,本身我现在也在做Web开发,所以看看一些文档也能修改。Octopress中因为使用谷歌提供的服务缘故,在国内访问很慢,基本上把jQuery的引用改成国内可以访问的就好,另外屏蔽掉插件中关于推特的项,插件里面还有Google +这样的东西,也都一并屏蔽。Google +都已经被关掉了,这就是长时间不更新的问题,确实会有一些已经老旧的东西。不过这些都是小问题,核心的东西是生成静态的html的网页,所以对于一个懂Web开发的人来说,自己动手改改都不是问题。

Octopress默认的风格比起Hexo的要好看,属于耐看型,我也懒得去折腾主题插件,最主要的能展示文章就好,另外也适配了手机屏幕。

首先要是有一个界面开发的经历那最好了,类似桌面界面开发其实是相通的。游戏开发中的界面跟这个略微不同。大部分会用到框架提供的组件,熟练的使用常用的组件是很有必要的。应该尽可能的多去尝试不同组件的使用机会,这样才能扩大组件的使用见识。

应该用面对对象的角度去研究文档,继承关系以及实现了什么样的协议,顺着这样的路走下去就会对框架有个整体的认识。不少人看着也开发了好一段时间,但就是不曾系统的研究过这些东西。遇到问题了,还是停留在百度这样境界。

框架和语言的问题,一开始开发的时候基本上不会对这个进行分类。实际上语言是需要单独学习的,研究的越深刻才能越自由。

设计模式,如果不是项目开发到一定规模很难会有所领悟,而且你是项目负责的,一般新手建议从研究系统框架中使用到的设计模式入手,这样更实际点。

HTTP协议需要单独研究,有本书《HTTP权威指南》非常详尽。Charles这样的抓包工具可以作为辅助研究这个的工具。除此还可以研究下AFNetworking源代码以及原生的请求类。

关系型数据库需要单独找本书看下,不是简单的会使用增删改查就可以了,比如怎么多表联查,怎么排序,SQL语句提供的功能远不只这些。

Core Data应该用,建议学习下Rails这个后台开发的东西,你就会明白多数的框架都不会直接去操作SQL,而是通过包装来简化或者影藏其中的复杂性。问题远远的比想得复杂,原始的刀耕火种的方式会让你累个半死,所以最好用现成的解决方案了。

以前用过Wordpress搭建过博客,后来也不知道怎么就断了。重新开始写博客,是因为看到网上不少好的独立博客的文章受益不少,也算是另一种回馈吧。

Octopress一年前就搭建过,现在又重新开始写。发现原来参考的搭建博客的博主已经换了引擎,不过我还是更喜欢Octopress吧,所以继续用吧,文章才是重点了。

之前已经搭建好了博客,github上已经有两个分支了,source和master。首先应该把source分支给克隆下来,博客的源文件了;master则是编译后的博客静态文件了。

发布的时候遇到了点问题

_deploy这个是发布目录,如果重新拉取git的话,手动创建并把Master分支拉取到这个目录。

自定义域名

Source目录下创建CNAME文件,填写自己的域名,当然也需要在域名管理设置DNS。生成文章时会自动把CNAME文件复制到_deploy目录最后同步到Master分支。

启用Https

启用自定义域名后,Enforce HTTPS单选框一直是灰色的。后来搜索了下是需要在域名管理那块设置CAA,类似这样。

1
CAA c2lang.com 0 issue "letsencrypt.org"