├── .gitignore ├── LICENSE.txt ├── README.md ├── apps └── pixiu │ ├── README.md │ ├── banner.jpg │ ├── inbox.jpg │ ├── inbox.png │ ├── notification.jpg │ └── privacy │ └── README.md ├── articles ├── 2014 │ ├── catnut-first-release │ │ └── README.md │ ├── http-restful-error-handling │ │ ├── README.md │ │ ├── http-restful-error-handling-1.png │ │ ├── http-restful-error-handling-2.png │ │ ├── http-restful-error-handling-3.png │ │ ├── http-restful-error-handling-4.png │ │ ├── http-restful-error-handling-5.png │ │ ├── http-restful-error-handling-6.png │ │ ├── http-restful-error-handling-7.png │ │ └── http-restful-error-handling-8.png │ ├── java8-lambda-with-android │ │ └── README.md │ ├── merge-android-studio-build-system │ │ └── README.md │ ├── move-to-android-studio │ │ └── README.md │ ├── recycler-view-super-fast-listview │ │ └── README.md │ └── wechat-api │ │ └── README.md ├── 2015 │ ├── a-journey-on-the-android-main-thread-lifecycle-bits │ │ └── README.md │ ├── a-journey-on-the-android-main-thread-psvm │ │ ├── README.md │ │ └── zygote.png │ ├── key-bindings │ │ └── README.md │ ├── learning-vi-again-part1 │ │ └── README.md │ ├── longist.me │ │ └── README.md │ ├── production-flavor-dribble │ │ └── README.md │ └── xiaologntongxue.com │ │ └── README.md ├── 2016 │ ├── android-build-gradle │ │ └── README.md │ ├── android-indexer │ │ ├── README.md │ │ └── screenshot.gif │ ├── bits-everywhere │ │ ├── README.md │ │ └── go101010.jpg │ ├── concurrent-hk │ │ ├── README.md │ │ ├── elevator.jpg │ │ ├── elevator@full.jpg │ │ ├── victoria_harbour.jpg │ │ └── victoria_harbour@full.jpg │ ├── fast-recover-your-OS │ │ ├── README.md │ │ └── recover.jpg │ ├── get-started-with-raspberry-pi-3 │ │ ├── README.md │ │ ├── rpi-gui.jpg │ │ └── rpi.jpg │ ├── go-to-java │ │ └── README.md │ ├── hacking-android-divider │ │ ├── README.md │ │ ├── final-work.jpg │ │ ├── perf-matters.jpg │ │ └── wechat.jpg │ ├── hacking-spotlight │ │ ├── README.md │ │ ├── showcase.jpg │ │ └── spotlight.jpg │ ├── neat-src-organization │ │ └── README.md │ ├── raas │ │ ├── README.md │ │ └── docker-raspberry-pi.jpg │ ├── support-http2 │ │ ├── README.md │ │ ├── http.jpg │ │ └── http2.jpg │ ├── view-pager-1 │ │ ├── README.md │ │ ├── vp1_auto.gif │ │ ├── vp1_infinite.gif │ │ └── vp1_interacting.gif │ └── why-we-can-send-to-gmail-in-china │ │ ├── README.md │ │ ├── gmail.jpg │ │ └── inbox.jpg ├── 2017 │ ├── a-rough-http2-speed-test │ │ ├── README.org │ │ ├── http.jpg │ │ ├── http2.jpg │ │ ├── https.jpg │ │ └── wireshark.jpg │ ├── english-writing │ │ ├── README.org │ │ └── teos.jpg │ ├── hacking-library-network-with-ipv6 │ │ ├── README.md │ │ ├── library.jpg │ │ └── orignal.jpg │ ├── how-does-qq-know-who-i-am │ │ ├── README.md │ │ └── qq.jpg │ ├── lessons-from-gmail-api-a-batch-request-design-doc │ │ ├── README.md │ │ └── art.jpg │ ├── pixiu-1.0.0-on-mac-app-store │ │ └── README.md │ └── xiaolongtongxue.com │ │ ├── README.md │ │ ├── sunset.jpg │ │ └── sunset@full.jpg ├── 2019 │ ├── contribute-klog │ │ ├── README.md │ │ ├── README.org │ │ └── k8s.jpg │ ├── how-to-pay-between-different-merchants-in-wechat │ │ ├── README.md │ │ ├── README.org │ │ └── wechat-pay.png │ └── read-google-logging-library-glog │ │ ├── README.md │ │ └── README.org ├── 2020 │ ├── a-philosophy-of-software-design │ │ ├── README.md │ │ ├── README.org │ │ └── apsd.jpg │ ├── envoy-l4-and-l7-proxy-with-shadowsocks │ │ ├── README.html │ │ ├── README.md │ │ ├── README.org │ │ ├── pcap.png │ │ └── ss-websocket.png │ ├── istio-architecture │ │ ├── README.md │ │ ├── README.org │ │ └── lrg.jpg │ ├── istio-wechat-domain-verify │ │ ├── README.html │ │ ├── README.md │ │ ├── README.org │ │ └── istio.png │ ├── move-to-kubernetes │ │ ├── README.md │ │ ├── README.org │ │ └── k8s-as-a-car.jpg │ ├── network-proxy-and-k8s-network │ │ ├── README.html │ │ ├── README.md │ │ ├── README.org │ │ ├── l2-fannel.png │ │ ├── l3.png │ │ ├── l4.png │ │ ├── l7.png │ │ └── proxy.png │ └── tls-termination-and-origination │ │ ├── README.md │ │ ├── README.org │ │ ├── docker.png │ │ ├── origination.png │ │ ├── termination.png │ │ └── wx.png ├── 2021 │ ├── go1.16-io-fs │ │ ├── README.md │ │ ├── README.org │ │ └── go.jpeg │ ├── how-does-go-handle-http-request-timeout-and-cancel │ │ ├── README.md │ │ ├── README.org │ │ ├── debug.png │ │ └── go-http-timeout.png │ ├── sync-loop │ │ ├── README.md │ │ ├── README.org │ │ ├── android-k8s.jpeg │ │ ├── android-loop.png │ │ └── anr.jpeg │ └── thoughts-on-contributing-github │ │ ├── README.md │ │ └── result.png └── 2022 │ ├── fix-yaml-multi-line-format │ ├── README.md │ └── photo-1470252649378-9c29740c9fa8.jpeg │ ├── kubernetes-yaml-formatter │ ├── README.md │ ├── cover.jpeg │ └── showcase.gif │ └── more-than-k8s │ ├── README.md │ └── photo-1439405326854-014607f694d7.jpeg ├── learning ├── git │ └── get-started │ │ └── README.md ├── go │ └── get-started │ │ └── README.md ├── gradle │ ├── basic-script │ │ └── README.md │ ├── build-lifecycle │ │ └── README.md │ ├── dependency-best-practise │ │ └── README.md │ ├── java-plugin │ │ └── README.md │ └── multi-project-builds │ │ └── README.md ├── http │ └── web-servers │ │ └── README.md ├── linux │ ├── ifcfg │ │ └── README.md │ ├── linux-cmd-intro │ │ └── README.md │ └── shell-useful-stuff │ │ └── README.md └── vim │ ├── advanced-editing │ └── README.md │ └── global-replacement │ └── README.md ├── memories ├── 2013 │ ├── confused-hesitate │ │ └── README.md │ ├── how-pain-it-is │ │ └── README.md │ ├── thinking-after-tx │ │ └── README.md │ └── xida.jpg ├── 2014 │ ├── 2-call │ │ └── README.md │ ├── bad-date │ │ └── README.md │ ├── bad-may-be-nice │ │ └── README.md │ ├── class-party │ │ └── README.md │ ├── dormitory-7 │ │ └── README.md │ ├── golden-ball │ │ └── README.md │ ├── last-college-contest │ │ └── README.md │ ├── one-and-a-half-months-work │ │ └── README.md │ ├── shaoyifu-walcott-zhihu │ │ └── README.md │ ├── sherlock-holmes │ │ └── README.md │ ├── sichuan │ │ └── README.md │ ├── trust │ │ └── README.md │ ├── vocation-first-day │ │ └── README.md │ ├── wanna-go-home │ │ └── README.md │ ├── weixin-public-get-stared │ │ └── README.md │ └── xida.jpg ├── 2015 │ ├── 2016 │ │ └── README.md │ ├── crossing-wutong-mountain │ │ ├── README.md │ │ ├── entrance-door.jpg │ │ ├── fall.jpg │ │ ├── hero-slope.jpg │ │ ├── music.jpg │ │ ├── peek.jpg │ │ ├── playing-water.jpg │ │ ├── road.jpg │ │ ├── sleepy.jpg │ │ ├── small-wutong.jpg │ │ ├── taishan-stream.jpg │ │ ├── there.jpg │ │ └── washing-face.jpg │ ├── crossing-xiangsi-hill │ │ ├── README.md │ │ ├── bycycling-view.jpg │ │ ├── dinner-weekeng.jpg │ │ ├── fishing.jpg │ │ ├── green-way.jpg │ │ ├── hill.jpg │ │ ├── internet-coffee.jpg │ │ ├── king-cat.jpg │ │ ├── look-through.jpg │ │ ├── monument.jpg │ │ ├── photo-skill.jpg │ │ ├── sunset.jpg │ │ └── wanting.jpg │ ├── github-figurine │ │ └── README.md │ ├── github-group-buying-2nd │ │ ├── README.md │ │ ├── github-group-buying-2nd-1.jpg │ │ ├── github-group-buying-2nd-10.jpg │ │ ├── github-group-buying-2nd-11.jpg │ │ ├── github-group-buying-2nd-2.jpg │ │ ├── github-group-buying-2nd-3.jpg │ │ ├── github-group-buying-2nd-4.jpg │ │ ├── github-group-buying-2nd-5.jpg │ │ ├── github-group-buying-2nd-6.jpg │ │ ├── github-group-buying-2nd-7.jpg │ │ ├── github-group-buying-2nd-8.jpg │ │ └── github-group-buying-2nd-9.jpg │ ├── github-octocat-group-buying-1st │ │ ├── README.md │ │ ├── octocat-1.jpg │ │ ├── octocat-2.jpg │ │ ├── octocat-3.jpg │ │ ├── octocat-4.jpg │ │ ├── octocat-5.jpg │ │ ├── octocat-6.jpg │ │ ├── octocat-7.jpg │ │ ├── octocat-8.jpg │ │ └── octocat-9.jpg │ └── happy-ending │ │ ├── README.md │ │ └── xida.jpg ├── 2016 │ ├── climbing-nanshan │ │ ├── README.md │ │ ├── map.jpg │ │ └── view.jpg │ ├── climbing-tanglang │ │ ├── README.md │ │ ├── intro.jpg │ │ ├── map.jpg │ │ ├── on-the-way.jpg │ │ ├── view.jpg │ │ └── way.jpg │ ├── go-revamp │ │ ├── README.md │ │ └── seq.png │ └── sell-gobook │ │ ├── README.md │ │ └── gobook.jpg ├── 2017 │ └── 2016-reading-list │ │ ├── README.md │ │ └── we-space.jpg └── 2018 │ ├── 12-years-with-football │ ├── README.org │ └── ball.jpg │ ├── airbnb-first-experience │ ├── README.org │ ├── gt.jpg │ ├── living-room.jpg │ ├── mojito.jpg │ └── room.jpg │ ├── macbook-screen-repairness │ ├── README.org │ ├── holiday-plaza-night.jpg │ ├── holiday-plaza.jpg │ ├── list1.png │ ├── list2.png │ └── mbp.jpg │ ├── weekly-26 │ ├── README.org │ └── ukulele.jpg │ ├── weekly-27 │ ├── README.org │ ├── food.jpg │ ├── running.jpg │ └── view.jpg │ ├── weekly-28 │ ├── README.org │ ├── st.png │ └── worldcup.jpg │ └── weekly-29 │ ├── README.org │ ├── breakfast.jpg │ ├── one_piece.jpg │ ├── pic1.jpg │ ├── pic2.jpg │ └── pic3.jpg ├── misc └── resume │ ├── README.md │ └── README.org ├── readings └── the-storied-life-of-a.j.fikry │ ├── README.md │ └── cover.jpg ├── share ├── 4-interviews-to-be-a-googler │ └── README.md ├── master-data-strutcture-and-algorithms │ └── README.md ├── what-are-the-characteristics-of-a-bad-software-engineer │ └── README.md └── which-startups-have-the-best-stories │ └── README.md └── things ├── timing ├── README.md └── timing.jpg ├── wechat └── README.md ├── word-category └── README.md └── zhihu-pioneer └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | assets/ 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Think fast, talk smart, write more. 2 | 3 | -------------------------------------------------------------------------------- /apps/pixiu/README.md: -------------------------------------------------------------------------------- 1 | Pixiu - an Inbox and Notification App for Gmail on macOS 2 | === 3 | [![Mac App Store](https://devimages.apple.com.edgekey.net/app-store/marketing/guidelines/mac/images/badge-download-on-the-mac-app-store.svg)](https://geo.itunes.apple.com/app/id1195433805) 4 | 5 | Love the web, keen on Mac? If you stick to the web-based Gmail, with Pixiu, keep up with your inbox snippets and notifications right on your menu bar! 6 | 7 | Pixiu is a small and clean mailbox app based on [Gmail API][gmail-api]. It's free and no privacy tracking. 8 | 9 | It's simple and useful. 10 | 11 | - Push notifications when new mails coming 12 | - View all your inbox snippets on your menu bar 13 | 14 | Click the snippet or notification item, it will take you to the Gmail thread page. That's it, no more. 15 | 16 | In the settings window, you can also make some changes, 17 | 18 | - start on login 19 | - pause/resume syncing 20 | - change syncing interval 21 | - turn on/off notifications 22 | - feel free to revoke authorization 23 | 24 | In addition, you can manually trigger syncing by `command + R` shortcuts. 25 | 26 | Privacy Policy can be found [here](privacy). 27 | 28 | Hope it helps! 29 | 30 | ![](inbox.jpg?imageView2/2/w/1024/format/jpg) 31 | 32 | ![](notification.jpg?imageView2/2/w/1024/format/jpg) 33 | 34 | ## One More Thing 35 | This is my first app after learning Swift myself and first trying the Apple platform. The process is fun and hard, and I would like to share some experience in the following serials posts. 36 | 37 | - [Pixiu 1.0.0 on Mac App Store](/articles/2017/pixiu-1.0.0-on-mac-app-store/) share some experience about the journey 38 | - [Lessons From Gmail API - a Batch Request Design Doc](/articles/2017/lessons-from-gmail-api-a-batch-request-design-doc) 39 | 40 | Many thanks to my friend *L* for a lot art work. 41 | 42 | Thanks for reading. 43 | 44 | ## Misc 45 | - If Google is blocked on your region, you must have a valid **HTTPS Proxy** in network settings. 46 | - In Chinese, Pixiu is 貔貅, a Chinese mythical hybrid creature considered to be a very powerful protector to practitioners of Feng Shui. You can find more [here][pixiu]. 47 | 48 | ## EOF 49 | ```yaml 50 | summary: Pixiu - an Inbox and Notification App for Gmail on macOS 51 | weather: cold 52 | license: cc-40-by 53 | location: 22,114 54 | background: banner.jpg 55 | tags: 56 | - Products 57 | - macOS 58 | date: 2017-01-15T20:12:17+08:00 59 | ``` 60 | 61 | [gmail-api]: https://developers.google.com/gmail/api/ 62 | [pixiu]: https://en.wikipedia.org/wiki/Pixiu 63 | -------------------------------------------------------------------------------- /apps/pixiu/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/apps/pixiu/banner.jpg -------------------------------------------------------------------------------- /apps/pixiu/inbox.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/apps/pixiu/inbox.jpg -------------------------------------------------------------------------------- /apps/pixiu/inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/apps/pixiu/inbox.png -------------------------------------------------------------------------------- /apps/pixiu/notification.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/apps/pixiu/notification.jpg -------------------------------------------------------------------------------- /apps/pixiu/privacy/README.md: -------------------------------------------------------------------------------- 1 | Privacy Policy 2 | === 3 | This policy applies to all information collected or submitted on the Pixiu application for macOS. 4 | 5 | ## Data Controllers and Owners 6 | longkai, i@xiaolongtongxue.com 7 | 8 | ## Information We Collect 9 | We do not collect or read any user data include your mail address and usage data except [Fabric Crashlytics][Fabric], which is embedded in Pixiu's code to provide crash reporting. All the reporting is anonymous via Fabric. We never share it and only use it to improve app stability. 10 | 11 | We do not use Cookie. No subscribe newsletters. 12 | 13 | Login information is freely provided by the User, and is only transmitted securely to Google servers to allow the user to login with his/her account. No email address and password information are read or transmitted. 14 | 15 | When you use Google Gmail services, to which Pixiu gives you access, you trust Google with your information and accept their terms of service, which can be found [here][Google]. 16 | 17 | ## Your Consent 18 | By using our app, you consent to our privacy policy. 19 | 20 | If you have questions, you can reach us at i@xiaolongtongxue.com 21 | 22 | ## Changes to This Policy 23 | Any future change to this policy will be posted to this page. 24 | 25 | ## EOF 26 | ```yaml 27 | hide: true 28 | summary: Pixiu Privacy Policy 29 | weather: cold 30 | license: all-rights-reserved 31 | location: 22,114 32 | background: ../banner.jpg 33 | tags: 34 | - Privacy Policy 35 | date: 2017-01-17T11:48:57+08:00 36 | ``` 37 | 38 | [Fabric]: https://fabric.io/privacy 39 | [Google]: https://www.google.com/mail/help/terms_of_use.html 40 | -------------------------------------------------------------------------------- /articles/2014/catnut-first-release/README.md: -------------------------------------------------------------------------------- 1 | Catnut 微博app第一个版本发布了 2 | ====== 3 | 很高兴的告诉大家,今天Catnut的第一个公开版本发布了,这还不是正式版,毕竟版本号还没到1.0嘛,新鲜出炉,我敢保证,肯定会有些fc啊,崩溃什么的,请大家见谅,并给我反馈,我有时间一定会改进的。 4 | 5 | app[下载地址][1] [项目主页][2] 6 | 7 | ![catnut](https://farm8.staticflickr.com/7417/12923931494_b40944bdcd_o.png) 8 | 9 | 经过29,30,31号这几天的尝试和重构,微博的核心功能基本上都ok了,当然,也只是包含核心功能哈,美其名曰,简洁。不过老实说,这个app感觉像是自己对微博的理解,对我来说这些功能基本上都是刚需了。有的人真的就只是需要快速的获取自己感兴趣最新的信息,发发微博,评论一下,查看自己的或者感兴趣的人的时间线,诸如此类,仅此而已。对于那些臃肿的东西,大杂烩似的,从来都不会感冒。 10 | 11 | 说说这个app的特点吧,简洁,流畅,去广告,省流量,支持离线查看,并且附带了一个每天更新的发现精彩瞬间的福利~ 12 | 13 | ## 程序设计 14 | 程序的架构我觉得还是非常不错的(个人卖瓜),参考了Google I/O 2010的一篇论文,写的一个RESTFUL风格的app,整体来说,整个层次都挺清晰的,从界面,api封装,发送请求,解析请求,本地缓存,即时显示数据诸如此类。所有的耗费时间的操作(除了显示表情和打开uri吧)都放在了异步线程处理,基本上应该不会出现程序卡死(我从来没遇到过)的情况了,当然,fc(闪退)还是有可能的,不过这不是一码事Orz 15 | 16 | 整个操作还是挺流畅的吧,刷新还是加载更多都挺快的,把时间线一直拉长,拉到1000+的微博还是很流畅的Orz 我的机器是1G的内存,相信能跑的起Android 4.1+的机器基本上不会低于1G的内存。(测试环境为wifi, Android4.4.2&art) 17 | 18 | 此外,这app挺省流量的,尽可能的通过少的请求获取尽可能多的数据。app支持离线功能,尽可能的会把得到的数据缓存起来,这些数据可以在没有网络的情况下或者你自己设置是否优先选择本地数据加载哈~ 19 | 20 | ## 界面设计 21 | 这个应该是很朴素的Android Design了,参考(也可以说是模仿,那话咋说,模仿是最好的恭维嘛)了Twitter的界面,不少图标也是从Twitter那里拿到的,说得我都不好意思了,反正估计大多数人也不知道有Twitter这个存在吧Orz 22 | 23 | 用微信的朋友们可能发现微信5.2的界面变了,和以前大不一样了,也许爱玩app的你也发现了其实市面上存在不少类似微信界面设计的应用,不过更多的是类似之前微信界面的应用,比如现在的官方微博,什么什么的,那不是Android的风格,那个是水果IOS的风格。至于这两个平台的设计理念我也不想讨论了,其实我也不太懂哈!不过可以预见,会有越来越多的app会的界面会转向微信那种界面,大家应该会逐渐接受的,我说的是Android平台哦Orz 24 | 25 | ## 其它 26 | 好久没来微信公众平台了码字了,要改!这段时间码代码去了,都是码Orz,大家有什么反馈意见欢迎通过微信反馈哦! 27 | 28 | --- 29 | 2014-03-05 30 | 31 | ### EOF 32 | ```yaml 33 | background: https://farm8.staticflickr.com/7417/12923931494_b40944bdcd_o.png 34 | hide: false 35 | license: cc-40-by 36 | location: Nanning 37 | summary: 简洁,流畅,去广告,省流量,支持离线查看,并且附带了一个每天更新的发现精彩瞬间的福利~ 38 | tags: 39 | - Campus 40 | weather: "" 41 | date: 2014-03-05T00:33:19+08:00 42 | ``` 43 | 44 | [1]: https://dl.dropboxusercontent.com/u/96034496/apps/catnut-latest.apk "app downlaod link" 45 | [2]: http://longkai.github.io/catnut/ "project host" 46 | -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-1.png -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-2.png -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-3.png -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-4.png -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-5.png -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-6.png -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-7.png -------------------------------------------------------------------------------- /articles/2014/http-restful-error-handling/http-restful-error-handling-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2014/http-restful-error-handling/http-restful-error-handling-8.png -------------------------------------------------------------------------------- /articles/2014/java8-lambda-with-android/README.md: -------------------------------------------------------------------------------- 1 | 在Android中使用Java8的lambda表达式 2 | === 3 | 4 | ![showcase][] 5 | -- 6 | 7 | 好久没写blog了,原因也懒得解释,无非是太懒了。不过最近开始坚持跑步了,跑了也快两个月了,坚持下来的感觉真的很好,不管跑得快与慢,长与短,总之,去跑就对了。所以,关键就是,去写就对了,至于内容,嗯哼,肯定是积极的啦! 8 | 9 | 写写关于我目前的工作上的东东吧,最近这段时间都在忙公司的Android端app,一个人也要是一个团队,仿佛自己好像已经习惯了这种节奏...写Android应用,开发语言自然是Java,我用Java也蛮久了,从最开始的Java SE到Java EE的一大堆开源框架到现在的Android应用,感觉这语言比起现在流行的一些语言诸如Go,JavaScript,Swift等,确实感觉编写的过程有时候挺慢的,真不如那些语言风骚啊。不过也还好了,语言工具嘛,用得顺手达到目的就好了。嗯哼,不过身边的同事貌似都是Java黑,哎,好吧。我承认,在语言简洁性上面Java确实啰嗦。不过今年春Oracle官方终于释出了最新的JDK8,引入了函数式编程,lambda表达式等新特性,虽然推出来有点晚,但是好歹也是有了嘛。 10 | 11 | 坑爹的在于,Android使用的Java版本不是Oracle她家的,而是一个已经废弃了的Apache Harmony项目,这个项目大概就是兼容了JDK6的一个Java API...Google和Oracle这两家还一直在闹个不停...总之,Android的Java可以理解为Java6。貌似Google已经改进可以兼容Java7的语法了(好像还是只能用在Kitkat上)...我们想要使用lambda还是不行... 12 | 13 | happy coding, happy hacking. 开源社区可是很伟大的,Google一下,你就会发现有一个叫做[retro-lambda][]的项目,它可以在JDK6使用上lambda的语法,另外,还有一个基于Gradle的插件[gradle-retro-lambda][],可以在Android Studio中编译通过lambda的语法。看看下面的代码对比,是不是感觉很棒呢~ 14 | 15 | ```java 16 | public class MainActivity extends ActionBarActivity { 17 | @Override protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | TextView text = new TextView(this); 20 | text.setText("Hello, lambda in Android!"); 21 | setContentView(text); 22 | 23 | // add an on click listener 24 | 25 | // 1. the old way 26 | text.setOnClickListener(new View.OnClickListener() { 27 | @Override public void onClick(View v) { 28 | Toast.makeText(MainActivity.this, "salutation!", Toast.LENGTH_SHORT).show(); 29 | } 30 | }); 31 | // 2. the lambda way 32 | text.setOnClickListener(v -> Toast.makeText(this, "salutation!", Toast.LENGTH_SHORT).show()); 33 | // usually in android we must separate worker and ui thread 34 | new Thread(() -> { 35 | try { 36 | // simulate a worker thread 37 | TimeUnit.SECONDS.sleep(3); 38 | } catch (InterruptedException ignore) { 39 | } 40 | // post to ui thread 41 | runOnUiThread(() -> text.setText("after hard work =.=")); 42 | }).start(); 43 | } 44 | } 45 | ``` 46 | 47 | 看看上面的代码,是不是感觉用这种方式写起来很优雅呢?在八月底,我已经将公司的app切换到这种模式来了,目前用着挺好的,还没有发现什么问题。但是有两件事得注意一下。第一是前天我刚升级到Android Studio 0.9编译项目的时候提示出了问题,``Cannot invoke method remove() on null object``,Google了一下,发现原来gradle-retro-lambda这插件的问题,然后升级了这插件就没有问题了。第二是如果你最后打包的apk需要混淆,貌似有些问题,之前我尝试过混淆,没有成功,由于项目紧,就没有继续尝试了,以后还会尝试。 48 | 49 | 如果你在使用的过程中有什么问题或者发现欢迎告诉我~ 50 | 51 | ### EOF 52 | ```yaml 53 | background: https://ww4.sinaimg.cn/large/aa61ae0egw1ely9jgwzenj21io0v4aht.jpg 54 | hide: false 55 | license: cc-40-by 56 | location: Shenzhen 57 | summary: "" 58 | tags: 59 | - Android 60 | weather: "" 61 | date: 2014-11-04T00:45:07+08:00 62 | ``` 63 | 64 | [showcase]: https://ww4.sinaimg.cn/large/aa61ae0egw1ely9jgwzenj21io0v4aht.jpg 65 | [retro-lambda]: https://github.com/orfjackal/retrolambda 66 | [gradle-retro-lambda]: https://github.com/evant/gradle-retrolambda 67 | 68 | -------------------------------------------------------------------------------- /articles/2014/move-to-android-studio/README.md: -------------------------------------------------------------------------------- 1 | 是时候使用Android Studio写Android应用了 2 | === 3 | 香皂用完了,来sz也俩月了,Hello, sz ^_^ 4 | 5 | 最近工作挺忙的,一个人负责公司的Android端,每天都会有新的发现或者想法,并且将其运用在项目中,感觉还蛮不错的。我想我现在不记下来和大家分享一下,以后也很难了0.0. 6 | 7 | 于是,决定每天下班前都和大家分享今天的发现,不光是技术哦,还有你懂的~但是,我很懒的,不保证都能更新,也不保证有意思,技术这东西,唉。。。 8 | 9 | 那么开始吧。 10 | 11 | --- 12 | 13 | 上周末,趁着刚release完一个阶段的版本,将项目重构了一下。具体主要是将项目IDE从Intellj IDEA切换到了Android Studio,支持使用Java8的lambda表达式写Android了哦,并且提供了多渠道自动打包的功能,想打多少渠道包就打多少,不费事儿,之前,按照公司要求,打了140多个渠道包,写的自动打包脚本够疼的(当时使用的是IDEA),各种问题,不过搞定了之后还真有意思的! 14 | 15 | 如果你现在还是用Eclipse写Android那么你真的可以尝试切换到Android Studio了,Eclipse支持的构建真的落后了,你能想象在Eclipse加入一个带有res目录的lib是有多蛋疼吗?btw, Google也已经将中心放在了Android Studio上。如果你现在用IDEA开发,那么切换到Android Studio毫无压力(Android Studio就是基于IDEA,除了构建方式和一些new features,并无二致),只会更easy。 16 | 17 | 一年前的这个时候,那时我还在用Eclipse写Java EE,当时虽然Eclipse已经被我玩得「一溜一溜」的,但是总是觉得还是缺乏灵活,当时看到Google推出的基于IDEA的Android Studio,认识了IDEA(其实早有听闻,只是没有尝试),后来花了三天熟悉,就再也不想用Eclipse了,后来陆续使用Gradle取代Maven开发项目了... 18 | 19 | 再后来写Android,尝试用了Studio,慢的简直无法忍受,而且各种奇奇怪怪的问题,IDEA则是速度秒杀的节奏,唯一不爽的IDEA的项目构建虽然引入了Module化,但是各种项目间的依赖得你自己去调,对Android了解不深的同学估计过不了这关,就很难再继续了。调几次还好(并且可以加深项目的熟悉程度),但是调多次就烦了。Android Studio当时就是在项目构建上优秀些。 20 | 21 | 前几天,看到Android Studio到了0.8.x的beta版了,试了试,发现快了很多耶,虽然还是慢于IDEA,但是已经可以接受了。而且一些feture很赞~并且当时项目的构建已趋复杂,并且多渠道打包那一个叫麻烦,于是趁着周末,切换了。用来开发一周了,感觉很不错,一些很nice的feature接下来会介绍~ 22 | 23 | 如果是旧项目切换过来,那么,项目结构和Android Studio的默认项目结构基本上是不一致的,如果使用了git这样的vcs,肯定是不能任性改项目目录的。好在Android Studio(实质是Gradle)有着很灵活的构建方式。附一段兼容项目目录结构代码 24 | 25 | ```groovy 26 | android { 27 | sourceSets { 28 | main { 29 | assets.srcDirs = ['assets'] 30 | res.srcDirs = ['res'] 31 | aidl.srcDirs = ['src'] 32 | resources.srcDirs = ['src'] 33 | renderscript.srcDirs = ['src'] 34 | java.srcDirs = ['src'] 35 | jniLibs.srcDirs = ['jni'] // native lib 36 | manifest.srcFile 'AndroidManifest.xml' 37 | } 38 | } 39 | } 40 | ``` 41 | 42 | --- 43 | by longkai on 2014-08-30 in Sz. 44 | 45 | ### EOF 46 | ```yaml 47 | background: /assets/images/default.jpg 48 | hide: false 49 | license: cc-40-by 50 | location: Shenzhen 51 | summary: "" 52 | tags: 53 | - Android 54 | weather: "" 55 | date: 2014-08-31T01:09:52+08:00 56 | ``` 57 | -------------------------------------------------------------------------------- /articles/2014/wechat-api/README.md: -------------------------------------------------------------------------------- 1 | 微信API接口接入 2 | ================= 3 | 4 | ![wechat](https://farm4.staticflickr.com/3716/11872041935_032fee59b9_o.png) 5 | 6 | 今晚,打开微信公众平台的网页时突然想试试微信开发者的API,毕竟这个比较火嘛,很多企业甚至是个人都接入了微信的API接口开展业务。 7 | 8 | 正当要申请时,看到微信提供了测试帐号,于是就申请了一个来测测(有效期只有1天),首先借着某某服务器(=.=)来进行了验证,这个很简单,马上就通过了。然后在界面那里看到了不少接口,想试试「自定义菜单」的接口,照着例子弄了一下,嗯,还挺不错的,如果有个自定义菜单的话估计能更好玩。 9 | 10 | 接下来我就想拿我这个公众号(没有认证)来试试,这尼玛,认证是通过了,但是就只有三个接口可以使用,一个接收你们的消息,另一个就是接收后给你们回复了,还有一个事件推送(比如添加/取消关注时触发的)。哎,基本上没有太多用呢=.= 11 | 12 | 然后分别试了试这三个接口,都可以了,就是功能太少了。突然有个想法,**假如你有微信公众号API接入的需要可以联系我(目前只支持非认证号),我可以免费提供这样一个程序和服务器资源(这不是广告)** 当然,如果是认证号,更欢迎联系我哦^_^ 13 | 14 | 最后,真的很想吐槽一下微信的接口,其实做得并不好。文档写得比较糟糕,不够详细,有些东西没说清楚;代码区域没有格式化;字段使用的编码风格又不统一(这让服务端写得很难受);最讨厌的就是一会用json,一会用xml,看不懂(因为我的程序始终用json,然而java自带的xml解析简直是灭绝师太,而我又不想再添加一个库);另外,错误处理的时候返回200的状态码,这实际上是不符合http协议的规范的。btw,已经上传到微信的图片还不能从微信那里获得,还得另外上传一个到别处╮(╯_╰)╭ 15 | 16 | 以上,技术贴。今晚码了一晚上代码,原谅我再码这一坨大家看不懂的狗屁文字。 17 | 18 | --- 19 | 2014-01-10 20 | 21 | 22 | ### EOF 23 | ```yaml 24 | background: /assets/images/default.jpg 25 | date: 2014-01-10T23:30:39+08:00 26 | hide: false 27 | license: cc-40-by 28 | location: Nanning 29 | summary: 假如你有微信公众号 API 接入的需求可以联系我,我可以免费提供这样的程序和服务器资源 :) 30 | tags: 31 | - Campus 32 | weather: "" 33 | ``` 34 | -------------------------------------------------------------------------------- /articles/2015/a-journey-on-the-android-main-thread-psvm/zygote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2015/a-journey-on-the-android-main-thread-psvm/zygote.png -------------------------------------------------------------------------------- /articles/2015/longist.me/README.md: -------------------------------------------------------------------------------- 1 | 我的个人站点上线啦 2 | === 3 | 4 | 我的个人站点上线了,网址是http://longist.me, 欢迎逛逛~ 5 | 6 | 说来惭愧,本来今年年前就配置好了域名和Digital Ocean的服务器,想捣鼓一个啥啥啥出来玩玩的。但是迟迟都没有动手。一来自己还是懒,总以为自己还没准备好,但是准备好了再上路是有多难,甚至胎死腹中;二来也许是自己还是有点忙吧,下班已经挺晚了,不如以往爱折腾了吧。 7 | 8 | 不过,好在借着上周末,趁着欧冠决赛,突然心血来潮,花了点时间还是折腾出了一个网站,其实也就是一个界面而已。过程并不简单,感觉和一年前写web差了好多,好着力。一方面,自己也不想沿用以前的那套(jquery + bootstrap + j2ee),老是在做一样的东西没有什么长进。并且,写server的时候用java,写Android的时候还是用java,累觉不爱。做一件小小的事情还要很多代码,那确实说明这语言有缺陷或者用在了不合适的地方。还有js,感觉现在的web发展好快啊(也许和自己做得少有关吧)。貌似现在浏览器原生的js就已经很厉害了,不像那个时候在学校,还要兼容IE6...哈哈哈。 9 | 10 | 对我来说,这个项目的技术栈几乎是全新的。backend使用了Golang,这个语言虽然在大学就玩过了,但是没有在实际中写过它以至于很多东西都是不清不楚似懂非懂的,还得再系统的学学,正好借这个项目使使。frontend使用了Polymer,她的slogan是「Leverage the future of the web platform today」,确实挺酷的,前端开发简直...用过就知道。在刚刚结束的Google IO 2015中大版本升级到1.0了,好棒。 11 | 12 | 至于为什么使用这个两个,估计是很早就关注这两个项目了吧。不说这么多技术上的东西了,简单说一下网站的roadmap吧。 13 | 14 | 1. 静态站点,主要是展现article列表,然后redirect到github的markdown渲染。所以,基本上是没有做什么,但是至少是有个网站了,对吧...同时,还可以搭配微信的公众号再做一次redirect到github的markdown。 I love Github flavored markdown. 15 | 16 | 2. 利用Developer Program Member,通过github的webhook做钩子,hook到backend,每当有git push到github,便在backend更新内容。考虑直接把rendered的markdown持久化到backend,不redirect到github。 17 | 18 | 3. Android and iOS native app. 19 | 20 | 4. featrues, experiment, imagine, etc. 21 | 22 | *I have been keeping learning something really cool and new while making it better and better.* 23 | 24 | 已经很久没有更新东西了,一直在走,似乎忘了什么。其实我还是想写东西,做一个手艺人,在vim上写最纯粹的文字。 25 | 26 | -- 27 | 2015-06-08 28 | 29 | ### EOF 30 | ```yaml 31 | background: /assets/images/default.jpg 32 | hide: false 33 | license: cc-40-by 34 | location: Shenzhen 35 | summary: ' 谨以此纪念原来的域名-.-' 36 | tags: 37 | - Web 38 | weather: "" 39 | date: 2015-06-08T23:19:48+08:00 40 | ``` 41 | -------------------------------------------------------------------------------- /articles/2015/production-flavor-dribble/README.md: -------------------------------------------------------------------------------- 1 | 多运行时环境自动化构建 2 | === 3 | 4 | **本文假设Android编译环境为gradle** 5 | 6 | ## 场景1 7 | 在Android的开发和测试等环节中少不了构建。通常我们会有一个测试环境(内部环境)和一个生产环境(最终用户使用的环境)或者更多。比如,在开发中我们使用后端接口的BASE_ENDPOINT可能是``http(s)://dev.example.com``,最终用户使用的BASE_ENDPOINT可能是``http(s)://api.example.com``。这样做的好处是显然的,没有人会如此自信到用生产环境来开发。 8 | 9 | 因此,少不了切换环境,而切换环境一般涉及到修改配置信息,这些**配置信息应该是写在自动化构建脚本中**并且自动应用到构建中,而不是打包前自己手动修改,这样改很乏味和易错。试想,开发调试到很晚都累成狗了,终于灭掉了list上的一堆bug,最后打包了,手抖把生产环境的配置写成了测试环境的,悲剧了... 10 | 11 | ## 技巧1 12 | 在build(debug或者release,或者其他的flavor)的时候自动切换配置。 13 | 14 | 在每一个android相关的项目中的都会有一个``BuildConfig.java``文件,这个文件是由Android-Gradle插件依据构建环境(debug,release或者production flavor)自动生成的,我们不应该手动修改它。正如它的名字一样,构建配置,这里面全是一些``public static final``全局常量,比如版本号,版本信息,是否debug环境等,这些常量均可以在程序中引用。试想,如果能够给这个文件添加一些自定义的配置信息,不就解决场景1的问题了吗? 15 | 16 | ```groovy 17 | buildTypes { 18 | debug { 19 | buildConfigField "String", "END_POINT", "\"http://dev.example.com\"" 20 | buildConfigField "int", "FOO", "1" 21 | // others 22 | } 23 | 24 | release { 25 | buildConfigField "String", "END_POINT", "\"http://api.example.com\"" 26 | // others 27 | } 28 | } 29 | ``` 30 | 31 | 如上,那么对应到不同的环境(切换build variants或者打包(debug or release)),``BuildConfig.java``会追加相应的常量如下,你可以任意添加你想要的。 32 | 33 | > debug env 34 | 35 | ```java 36 | public static final String END_POINT = "http://dev.example.com"; 37 | public static final int FOO = 1; 38 | ``` 39 | 40 | > release env 41 | 42 | ```java 43 | public static final String END_POINT = "http://api.example.com"; 44 | ``` 45 | 46 | ## 场景2 47 | 测试环境和生产环境的数据基本是不一样的。有些时候,测试完测试环境后,还得测一下生产环境(量变引起质变,不少时候一些测试环境没问题的到了生产环境就出问题了)。一般来说,这个时候,你得**打两个release包,一个是测试环境,一个是生产环境**。 48 | 49 | ## 技巧2 50 | **技巧1**是理想的情况。只有打debug包的时候才会使用测试环境的配置。此时,我们需要一个release包也使用测试环境的数据。那么,这个时候就需要``productFlavors``来帮忙了,一次搞定俩~ 51 | 52 | ```groovy 53 | productFlavors { 54 | // 测试环境下的release包 55 | internal { 56 | buildConfigField "String", "END_POINT", "\"http://dev.example.com\"" 57 | // others 58 | } 59 | 60 | // 生产环境下的release包 61 | production { 62 | buildConfigField "String", "END_POINT", "\"http://api.example.com\"" 63 | // others 64 | } 65 | } 66 | ``` 67 | 68 | 这里要注意,``BuildConfig.java``生成常量的顺序是先``buildType {...}``,再``productFlavors {...}``,最后到``defaultConfig {...}``,**如果有重复的字段,那么只会生成最先出现的那个字段**,而不是后面的把前面的给覆盖掉,这应该是一个bug。 69 | 70 | ## Bonus 71 | 最后,还有一个技巧,如果我有很多flavors,如何切换当前的开发环境(比如说不想打包,只是想debug一下)到某个flavor? 72 | 73 | 以之前的``internal``和``production``两个flavor为例,这里总共会有4个**Build Variants**,分别是: 74 | 75 | ``` 76 | internalDebug 77 | internalRelease 78 | productionDebug 79 | productionRelease 80 | ``` 81 | 82 | 点击Android Studio的 **Build Variants** tool window,就看可以看到这4个东东,然后选择一个,就可以把当前的工作环境切换到某个flavor了。 83 | 84 | === 85 | feedback welcome, happy coding~ 86 | 87 | ### EOF 88 | ```yaml 89 | background: /assets/images/default.jpg 90 | hide: false 91 | license: cc-40-by 92 | location: Shenzhen 93 | summary: Android 多运行时环境自动化构建的两种方法 94 | tags: 95 | - Android 96 | weather: "" 97 | date: 2015-07-28T20:16:55+08:00 98 | ``` 99 | -------------------------------------------------------------------------------- /articles/2015/xiaologntongxue.com/README.md: -------------------------------------------------------------------------------- 1 | 新的域名,新的站点 2 | === 3 | 4 | #### Revamp 5 | 一直觉得,只有**.com**的域名才是最有价值的域名,加上去年[namecheap][1]送的一年**.me**域名快到期了,所以,想着想着就把**xiaolongtongxue.com**这个域名给买了下来,顺便看着有ssl的促销活动,也把站点配置成了**https**,看着地址栏绿色的锁,感觉很棒~ 6 | 7 | 在学校的时候做过一段时间的前端,但是一直没有花太多的时间在这方面,尤其是js。所以之前的主页,也只是一个壳而已。但是,出于学习的目的,使用了[webcomponents][2]这项技术,但是,貌似目前就只有比较新的Chrome完全支持了吧,其他的浏览器都是用[polyfill][3]这个去兼容的,猜测应该是做了大量的hack。尝试了几个其他的浏览器,不是加载慢就是错乱的页面,不支持这项技术。出于这种原因,一直都想着改版,但是时间和技术上的(主要是对js的不熟悉),也就一直耽搁了。 8 | 9 | 前段时间,在[Hacker News][4]上看到一个新项目,用go写的静态网站生成器,叫做[Hugo][5],由于我也使用go,看了一下感觉还不错,心里也琢磨着拿这个项目来作为新主页可以一战啊。 10 | 11 | 于是,大伙看到了现在的站点。 12 | 13 | #### Todo 14 | 1. 现在感觉虽然比之前好看多了,但是在使用Hugo的过程中,发现一些缺陷(比如路径,本地图片资源,url定位,修改了markdown源文件等)这应该也和当前的版本0.15还不成熟有关系;Hugo生成的是静态站点,这没什么不好,但是static is static,有些东西缺少dynamic可能就没那么灵活了,比如说以后可能需要一个backend的实现呢?所以,找个时间自己实现一套backend还是有想象力的。 15 | 16 | 2. 目前前端的展现也是套用社区的theme。始终觉得自己怎么**都应该把前端学好**,到时候写一个自己的theme。 17 | 18 | 3. Github WebHook, 每当有内容push到Github,都应该是自动的把内容更新到站点。 19 | 20 | #### One More Thing 21 | 之前有用过longist.me这个域名作为翻墙服务器的同学注意了,这个域名将在16年1月底到期,记得切换域名到xiaolongtongxue.com吧,其余配置照旧:) 22 | 23 | #### EOF 24 | ```yaml 25 | background: /assets/images/default.jpg 26 | hide: false 27 | license: cc-40-by 28 | location: Shenzhen 29 | summary: "" 30 | tags: 31 | - Web 32 | weather: a little cold 33 | date: 2015-12-22T02:59:14+08:00 34 | ``` 35 | 36 | [1]: www.namecheap.com 37 | [2]: webcomponents.org 38 | [3]: webcomponents.org/polyfills/ 39 | [4]: https://news.ycombinator.com 40 | [5]: https://gohugo.io "Hugo :: A fast and modern static website engine" 41 | -------------------------------------------------------------------------------- /articles/2016/android-indexer/README.md: -------------------------------------------------------------------------------- 1 | Android Indexer 2 | === 3 | 4 | > An indexer view like Wechat. 5 | 6 | 这是昨天在深入研究 Android 2D Text Drawing (过几天花时间写篇相关的文字) 后,一个偶然的情况下突然想写个东西实践一下吧(关于 font metrics 的),和 draw text 有关,看到微信的联系人右边的 indexer,于是也想自己去 draw 一个吧,于是就写成了一个库,还 publish 到了 jcenter 上。熟悉 Android 的朋友知道这样就可以直接通过 gradle 导入到 Android 项目里啦~ 7 | 8 | 以前自己做过的项目也要求一个类似的控件,当时自己水平还不够。于是 Google 找了一个,还是比较旧的项目,自己 download 下来,copy 到自己项目里,手动组织成一个 android library 项目,非常的麻烦。 9 | 10 | 具体的实现这里就不赘述啦,可以去项目的 [Github][1] 瞅瞅源码,这个 library 只有一个类,还是比较简单是使用和扩展的,希望能帮助到有需要的同学们 :) 11 | 12 | ### Screenshot 13 | ![Screenshot](screenshot.gif) 14 | 15 | ### Usage 16 | ```groovy 17 | // import to your build.gradle 18 | compile 'com.xiaolongtongxue:indexer:1.1' 19 | ``` 20 | 21 | ```xml 22 | 23 | 31 | ``` 32 | 33 | ```java 34 | // ... 35 | IndexerView indexerView = (IndexerView) findViewById(R.id.indexer); 36 | // put list or String[] 37 | List list = new ArrayList<>(); 38 | for (char i = 'A'; i <= 'Z'; i++) { 39 | list.add(Character.toString(i)); 40 | } 41 | indexerView.setAlphabets(list); 42 | // or just String 43 | indexerView.setAlphabets("ABCDEFG"); 44 | 45 | // call the listener 46 | indexerView.setOnIndexChangeListener(new IndexerView.OnIndexerChangeListener() { 47 | @Override public void onIndexChange(int index, String key) { 48 | // do sth with index or key 49 | } 50 | }); 51 | 52 | // you can also change the text size and color 53 | indexerView.setTextColor(Color.BLACK); 54 | indexerView.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics())); 55 | // ... 56 | ``` 57 | 58 | ### One More Thing 59 | 其实昨天还写了一个叫做[gfdl][2]小程序,用来自动下载 Google Fonts,由于众所周知的原因,国内的网络大多数情况下无法访问 Google Fonts,而我的网站使用了几个非常漂亮的字体 =_= 60 | 61 | 感兴趣的朋友去 Github 上看看或者拿来用用,用 go 写的。 62 | 63 | ### EOF 64 | ```yaml 65 | background: /assets/images/default.jpg 66 | hide: false 67 | license: cc-40-by 68 | location: Shenzhen 69 | summary: An indexer view like Wechat. 70 | tags: 71 | - Android 72 | weather: a sudden cold 73 | date: 2016-03-11T00:55:48+08:00 74 | ``` 75 | 76 | [1]: https://github.com/longkai/indexer 77 | [2]: https://github.com/longkai/xiaolongtongxue.com/tree/alpha/cmd/gfdl 78 | 79 | 80 | -------------------------------------------------------------------------------- /articles/2016/android-indexer/screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/android-indexer/screenshot.gif -------------------------------------------------------------------------------- /articles/2016/bits-everywhere/go101010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/bits-everywhere/go101010.jpg -------------------------------------------------------------------------------- /articles/2016/concurrent-hk/README.md: -------------------------------------------------------------------------------- 1 | # 并发的香港 2 | 3 | ![雨后维港](victoria_harbour.jpg) 4 | 5 | ## Before the Start 6 | 上周末和同学在香港玩了两天。 7 | 8 | 本文内容基于几个旅途见闻的思考:**人口稠密且高度繁忙的香港,如何保其持良好的运作的?** 9 | 10 | 这是个并发的世界,分享给打算去玩的朋友 :) 11 | 12 | ## 过关时 13 | 过关的时候人相当多,大厅人满为患,这时工作人员打开了负一楼的通关通道转移了相当一部分游客,大厅压力骤减。 14 | 15 | 这个栗子:当一个或若干个 routine(可以理解为线程,以下同)的工作负载很大时,可以考虑增设更多的 routine 去处理。 16 | 17 | > 接下来,我和同学分别排到了两个看起来长度一样的队列中,看看谁比谁先过关(是不是很无聊😝)。同学先比我过关,但是又能怎样呢,还不是要再等我😄。 18 | 19 | 这个栗子:如果我和同学站在同一队伍中,那么先过关的同学必然会阻塞(因为他要等待另一个同学过关后再一块走)。站在不同的队伍中理论上会比站在同一队伍中节约时间(队伍一样长,假设每个游客的通过时间基本一样),所以这实际上是两个 routine 之间的同步问题:速度快的 routine(先过关的同学)会阻塞等待速度较慢的 routine(后过关的同学),然后同步进行下一步(一同去玩)。 20 | 21 | ## 地铁里 22 | > 地铁站乘客流量巨大,不仅出入闸口非常之多,体积普遍非常之大。 23 | 24 | 这个栗子:足够多的 routine 再配备足够大的内存,保证了高负载的大型系系统的良好运转。 25 | 26 | > 出入闸口的时刻,请预先掏出地铁卡,不要等到了闸口才找,这样会挡住后面的乘客们(大家都很忙的)。 27 | 28 | 这个栗子:如果一个操作(这里指乘客掏出地铁卡出入地铁)需要较长的时间,这个时候应该将其挂起(吊打!)或者放到其他的 routine(先到角落里去找你的卡!),千万不要阻塞了后续 routine 出入闸口。 29 | 30 | ## 电梯上 31 | > 乘扶手电梯时,如果你不赶时间,请往右边站,留出左边的位置给赶时间的人。 32 | 33 | ![半山扶梯](elevator.jpg) 34 | 35 | 这个栗子:所有不忙的操作(不赶时间的乘客)都不该阻塞忙的操作(赶时间的游客)。这就好比图形界面程序,绝不能阻塞 UI routine,所有忙的操作都扔到其他 routine 中处理,留给用户一个流畅的体验;留出电梯左边的通道给赶时间的人有一种很和谐的感觉 :) 36 | 37 | ## 过马路 38 | > 在香港,很少很少有人闯红灯,不论是行色匆忙的行人还是快速行驶的汽车都遵守着生命线。每当嘟嘟声连续不断的时候,人走;嘟嘟声断断续续的时候,车走。非常有秩序。 39 | 40 | 这个栗子:这也可以理解为 routine 间的通信问题。routine1(汽车们)routine2(行人们)同一时刻只能有一个进行,另一个则被阻塞。两者之间需要通信,告之对方谁谁阻塞了,谁谁可以运行了。 41 | 42 | 如果把道路看做是一块内存数据,通过「嘟嘟声」来进行通信,保证了在给定的时间内,只有一个 routine 有权限访问它,实际上体现了 Golang 的[哲学][1]: 43 | 44 | > Do not communicate by sharing memory; instead, share memory by communicating. 45 | 46 | ## One More Thing 47 | 以上,纯属胡扯,如有雷同,文明旅游 :) 48 | 49 | PS: 感谢@Liger 同学的审阅 50 | 51 | ## EOF 52 | ```yaml 53 | hide: false 54 | license: cc-40-by 55 | location: Hong Kong 56 | summary: 上周末和同学在香港玩了两天,本文内容基于几个旅途见闻的思考 57 | background: victoria_harbour.jpg 58 | tags: 59 | - Programming,Thoughts 60 | weather: a bit cold 61 | date: 2016-01-20T18:28:43+08:00 62 | ``` 63 | 64 | [1]: https://blog.golang.org/share-memory-by-communicating 65 | -------------------------------------------------------------------------------- /articles/2016/concurrent-hk/elevator.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/concurrent-hk/elevator.jpg -------------------------------------------------------------------------------- /articles/2016/concurrent-hk/elevator@full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/concurrent-hk/elevator@full.jpg -------------------------------------------------------------------------------- /articles/2016/concurrent-hk/victoria_harbour.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/concurrent-hk/victoria_harbour.jpg -------------------------------------------------------------------------------- /articles/2016/concurrent-hk/victoria_harbour@full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/concurrent-hk/victoria_harbour@full.jpg -------------------------------------------------------------------------------- /articles/2016/fast-recover-your-OS/README.md: -------------------------------------------------------------------------------- 1 | Fast Recover Your macOS 2 | === 3 | From time to time, we might switch to a new machine or factory reset our OS for some reasons. You do not want to install every software from scratch since it is tedious and easy forgetting which app you need. Besides, things only goes worse if you are a developer because a lot of configurations need to be done. 4 | 5 | Last week I experienced this scenario that I installed the public Beta of the latest macOS where a lot of stuff just did not work. I have no choice but recovering. Fortunately, nearly all my important files are text-based so backup to the USB flash drive really fast(I do not use Time Machine since I have that little stuff to store). Finally, gave it a restore. 6 | 7 | Then, I follow the following steps then a quite shining and working OS is welcome. 8 | 9 | * Remapping ``CAPSLOCK`` to ``CTRL``, and vice-versa if you are a hard core Unix user 10 | * Apply voice announcing the time every 15 min in Date&Time setting 11 | * Apply three finger dragging window 12 | * Go to Mac appstore to download what you have purchased and need 13 | * Open native terminal then activate command-line tool with xcode 14 | * Install ``homebrew`` on native terminal 15 | * Go to Dropbox to copy the backup brew list file then run the restore script 16 | * Open __iterm2__(restore from brew cask) then apply github backup dot files(__vim__, __zprezto__, __gitconfig__, etc.) 17 | * Makes __iterm2__ and __zsh__ default workflow 18 | * Configure __dropbox__ app and ``ln`` to the local directory 19 | * Apply apps settings if settings file(or app preference screenshots) saved in Dropbox 20 | * Install your favorite typeface if necessary 21 | * Finally, configure the login items and you may put your name on your screen(-/-) if necessary 22 | 23 | All done, when it comes to automation, do it without manually. 24 | 25 | One more thing, I recommend you install Dropbox and soft linking(``ln``) other important directories, then all files are syncing amazingly! 26 | 27 | My backup and recover script is fairly easy as following, 28 | 29 | ```sh 30 | #!/bin/bash 31 | /path/to/backuped-pkgs | xargs brew install 32 | cat /path/to/backuped-apps | xargs brew cask install 33 | ``` 34 | 35 | ```sh 36 | #!/bin/bash 37 | /usr/local/bin/brew ls > /path/to/backuped-pkgs 38 | /usr/local/bin/brew cask ls > /path/to/backuped-apps 39 | ``` 40 | 41 | We can automate a little further, every Friday 12am schedule ``crontab`` triggering the update/backup task, 42 | ```sh 43 | # every friday 12:00, update and cleanup then backup 44 | 0 12 * * 5 /usr/local/bin/brew update && /usr/local/bin/brew upgrade && /usr/local/bin/brew cleanup && ~/Documents/configurations/brew/brew-backup.sh 45 | # at same time update vim plugins 46 | 0 12 * * 5 /Applications/MacVim.app/Contents/MacOS/Vim +PlugUpdate +PlugClean +qall 47 | # same with zprezto 48 | 0 12 * * 5 /usr/local/bin/git -C ~/.zprezto pull upstream master && /usr/local/bin/git -C ~/.zprezto submodule foreach git pull origin master 49 | # clean useless docker images 50 | 0 12 * * 5 ~/Documents/scripts/clean_docker.sh 51 | ``` 52 | 53 | that would be great without being aware of it. Note all the paths must be **absolute**. 54 | 55 | #### EOF 56 | ```yaml 57 | background: recover.jpg 58 | hide: false 59 | license: cc-40-by 60 | location: Shenzhen 61 | summary: 'When it comes to automation, do it without manually.' 62 | tags: 63 | - learning 64 | - automation 65 | weather: hot 66 | date: 2016-07-18T08:09:17+08:00 67 | ``` 68 | -------------------------------------------------------------------------------- /articles/2016/fast-recover-your-OS/recover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/fast-recover-your-OS/recover.jpg -------------------------------------------------------------------------------- /articles/2016/get-started-with-raspberry-pi-3/rpi-gui.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/get-started-with-raspberry-pi-3/rpi-gui.jpg -------------------------------------------------------------------------------- /articles/2016/get-started-with-raspberry-pi-3/rpi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/get-started-with-raspberry-pi-3/rpi.jpg -------------------------------------------------------------------------------- /articles/2016/hacking-android-divider/final-work.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/hacking-android-divider/final-work.jpg -------------------------------------------------------------------------------- /articles/2016/hacking-android-divider/perf-matters.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/hacking-android-divider/perf-matters.jpg -------------------------------------------------------------------------------- /articles/2016/hacking-android-divider/wechat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/hacking-android-divider/wechat.jpg -------------------------------------------------------------------------------- /articles/2016/hacking-spotlight/README.md: -------------------------------------------------------------------------------- 1 | Enable Spotlight Suggestions 2 | === 3 | If you're using Mac, this article may appeal to you. 4 | 5 | ## What's it? 6 | According to Apple, 7 | 8 | > Spotlight helps you quickly locate files on your Mac, and more. 9 | 10 | You should read [this][apple-desc] if you have no idea about it. In short, it improves your productivity **quickly**, search files, open/switch apps, lookup words, do calculation, search online with wiki, twitter, etc. 11 | 12 | Below is a video showcase in action(if you cannot open it, try [this][qq-video]). 13 | 14 | [![Spotlight Demo on Vimeo](showcase.jpg?imageView2/2/w/512/format/jpg)](https://vimeo.com/190262280) 15 | 16 | Come on, try on your Mac, you would find it helpful. However, some of you may notice that your spotlight doesn't show any **online results** but local stuff. If you did see it, free feel to skip the following section and enjoy your day:) 17 | 18 | Why I cannot see it? Well, because you're not int the [Apple's feature availability][avaiable-list] list. 19 | 20 | But, how can I enable it? 21 | 22 | ## Disclaimer 23 | - As of this writing(**Nov 2016**), things would change in the future and this article may not work for you. 24 | - Test on macOS 10.12.1 only, not sure other environments. 25 | 26 | Don't worry, you can still give it a try with hints providing in this post. 27 | 28 | ## Pre-requisite 29 | - A little knowledge about Web, i.e. HTTP. 30 | - A proxy server lives in the [list][avaiable-list] and a client on your local Mac. 31 | 32 | Actually, it's all about **how to use a proxy application**. 33 | 34 | ## How It Works? 35 | Since the feature only available in a certain of country, Apple must know where you are when you using Spotlight. As far as I know, there're three ways that one remote end can **guess** your location. 36 | 37 | 1. **Language & Region** based location. 38 | 2. **GPS** based location. 39 | 3. **IP Geographic** based location. 40 | 41 | Tried all of them and I suppose Apple use solution 2 and fallback to solution 3. No matter what methods it uses one things is for sure: **they talk via network**, i.e. HTTP protocol. 42 | 43 | So, by disabling GPS when searching then letting the search requests go through an HTTP proxy, we're done! 44 | 45 | ## In Action 46 | ### System Settings 47 | Sequentially, 48 | 49 | 1. System Preferences 50 | 2. Security & Privacy 51 | 3. Privacy 52 | 4. Unlock 53 | 5. scroll to the end of the list 54 | 6. Details... 55 | 7. uncheck Location-Based Suggestions 56 | 8. Done and Lock it 57 | 58 | ### Apply Proxy Rules 59 | By watching the HTTP requests, the three domain Apple uses for Spotlight suggestion are, 60 | 61 | - `ls.apple.com` 62 | - `smoot.apple.com` 63 | - `configuration.apple.com` 64 | 65 | Hence, put these domains to your proxy rule list(or global proxy which may cause network laggy). 66 | 67 | To be clear, any domain has this three **suffix** should go through a proxy, i.e. `a.b.c.ls.apple.com`. 68 | 69 | ## Further Thoughts 70 | It works for me very well, however, there're still some things should be taken into count: 71 | 72 | * The Wikipedia not work in the *Dictionary* app 73 | * Privacy, since all our search keywords exposed to Apple 74 | * By disabling the GPS and IP rule proxy, I'm not sure it would break any functionality 75 | 76 | For the former, it's not a big deal since wiki works in Spotlight but if you make it work, please let me know. The latter, I treat it as a reminder, protecting our privacy from time to time. The last, basically not, it only has something to do with the Location-Based Suggestions but it's all about assumption. 77 | 78 | 79 | 80 | Thanks for reading. 81 | 82 | ## EOF 83 | ```yaml 84 | summary: Enable Spotlight suggestions where not available in your country. 85 | weather: a bit cold 86 | license: cc-40-by 87 | location: 22, 114 88 | background: spotlight.jpg?imageView2/2/w/1024/format/jpg 89 | tags: 90 | - Hacking 91 | date: 2016-11-04T23:14:40+08:00 92 | ``` 93 | 94 | [avaiable-list]: http://www.apple.com/ios/feature-availability/#spotlight-suggestions-spotlight-suggestions 95 | [apple-desc]: https://support.apple.com/en-us/HT204014 96 | [qq-video]: https://v.qq.com/x/page/m03438kx2xx.html 97 | 98 | -------------------------------------------------------------------------------- /articles/2016/hacking-spotlight/showcase.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/hacking-spotlight/showcase.jpg -------------------------------------------------------------------------------- /articles/2016/hacking-spotlight/spotlight.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/hacking-spotlight/spotlight.jpg -------------------------------------------------------------------------------- /articles/2016/neat-src-organization/README.md: -------------------------------------------------------------------------------- 1 | A neat way to organize your source code 2 | === 3 | 4 | ### Before the Start 5 | As a developer, we deal with words, files, directories every day. You don't want your codebase messing up just like you do in your code architecture, the style, or the code itself. 6 | 7 | In the book [How Google Works][1], it says, 'Messiness is a virtue'(page 38). It's not something around us neatly but the way we do something neatly matters. If you have not a clear way to organize, maybe you've come to the right place. 8 | 9 | The way below is inspired from [the GOPATH Setting of Golang][2]. 10 | 11 | ### Put all your code in one single place 12 | I prefer ``~/src``. It's clear and points the user home directory thus you have all the **rwx** access. 13 | 14 | ### Classify your project 15 | Assuming you have 4 types of projects, ``{}`` is a placeholder. 16 | 17 | 1. Company project: ``~/src/{example.com}/{project}`` 18 | 2. Community project: ``~/src/{example.org}/{project}`` or ``~/src/github.com/{organization}/{project}`` 19 | 3. Personal project: ``~/src/github.com/{you}/{project}`` 20 | 4. Testing *foo bar* project: ``~/src/foo-bar/{project}`` 21 | 22 | Note: I strongly recommend you to choose **github.com(or alternatives)** as root path of personal project. I know the feeling when you write something cool and want share with others. This is called social coding and what makes a good software today. However, if you don't want to open source, just keep it there and no publish proceeding. 23 | 24 | ### What if I clone a project form a remote repository? 25 | Same, suppose the author or the community called Bob, puts it into ``~/src/github.com/Bob/{project}``. 26 | 27 | ### Bonus 28 | After you build a project from ``~/src`` and outputs executeable file(s), resident it to ``~/bin`` if you have no other good reasons. The same goes for the ``var, usr, pkg, lib, etc.``. Be a good citizen in *Nix world. 29 | 30 | If you write Go code, set ``GOPATH`` to ``~/src``, all your build artifacts would be seen in ``~/bin``, it's fine, isn't it? 31 | 32 | Finally, there are no rules from this article but some personal suggestions. Thanks for reading, happy hacking! 33 | 34 | ### EOF 35 | ```yaml 36 | background: /assets/images/default.jpg 37 | hide: false 38 | license: cc-40-by 39 | location: Guilin 40 | summary: "" 41 | tags: 42 | - Programming 43 | - Thoughts 44 | weather: very cold so no code 45 | date: 2016-02-05T20:27:21+08:00 46 | ``` 47 | 48 | [1]: http://www.amazon.com/How-Google-Works-Eric-Schmidt/dp/1455582344 49 | [2]: https://golang.org/doc/code.html#Organization 50 | -------------------------------------------------------------------------------- /articles/2016/raas/README.md: -------------------------------------------------------------------------------- 1 | Raspberry Pi as a Service 2 | === 3 | Borrowing from those popular expressions, i.e. `XaaS`, this article gives a brief story about setting up some of the services right from a tiny Pi. 4 | 5 | ## Local DNS Mapping 6 | A server usually has a static IP address or more for providing a sustainable and convenient service for the users, which is absolutely fine in the public network. What's more, people don't get well with numbers but text so the DNS comes into play. Our Pi lives in the local or private network, a **static numeric** IP would be in a mess. Supposing you set Pi's IP to `192.168.1.233`, all of the network(i.e. TCP/IP) based service needs an IP address, e.g. ssh, http(s), ftp, etc. Plus sometimes you need to specify a port associate with the service. What a mess. 7 | 8 | We need to set up a local DNS service. Say, `raspberrypi.local` points to `192.168.1.233`, then everything is fine. Besides, a sub-domain may more helpful to escape from numeric **port**. Say, `git.raspberrypi.local` points to the git service, `www.raspberrypi.local` points to the web, etc. It's all about multiplexing with host names. 9 | 10 | > You can use Nginx do this job. 11 | 12 | There're many ways to reach this goal. For example, you can setup your local DNS server, modifying your `/etc/hosts` directly, or using [Multicast DNS][mDNS]. The first one requires some network experience which may suit for those power users. The middle one is the most effective, and the last one is the most flexible, **set once, apply everywhere**(the whole local network). 13 | 14 | If there's a Unix based system, you can try dial `raspberrypi.local`, which may have already been set up! 15 | 16 | > Check out **avahi** or **Bonjour** if get stuck. 17 | 18 | ## Local Git Service 19 | How about host your own Github like service locally? Github is great and you can always use it. However, for some reasons, maybe sensitive or private, you can't push your work. In this case, a local git service is awesome, you have a full control your work, plus a replica bonus. 20 | 21 | There're many open source git services letting you deploy locally, like [gitlab][gitlab], [gogs][gogs] even git itself! 22 | 23 | For a tiny Pi, I suppose the lightweight *gogs* it's enough. The good news, its deployment is fair simple, no other dependencies required. By the way, you can use docker for a quick start. 24 | 25 | ## Local Cloud Storage 26 | Like the previous section, what about making your personal cloud storage service? There're a lot of intents, security, privacy, terms of service etc. It's always a good choice that only you have the full access control your data. 27 | 28 | I chose [ownCloud][ownCloud], an open source providing cross platform client support(i.e. Web, Android, iOS). Plus, it offers some rich features like [WebDAV][WebDAV], [CalDAV][CalDAV], [CardDAV][CardDAV], with which freely syncing and restoring your private contacts, calendar events, etc. 29 | 30 | ## Full Stack Proxy Server 31 | With Pi's wireless support and built-in Linux OS, there's no reason you can't control your network, even other advanced stuff. 32 | 33 | You know it. 34 | 35 | 36 | Happy hacking. 37 | 38 | ## EOF 39 | ```yaml 40 | summary: Borrowing from those popular expressions, i.e. `XaaS`, this article gives a brief story about setting up some of the well known services right from a tiny Pi. 41 | weather: fine 42 | license: cc-40-by 43 | location: 22,114 44 | background: docker-raspberry-pi.jpg 45 | tags: 46 | - Hacking 47 | date: 2016-11-17T18:29:55+08:00 48 | ``` 49 | [mDNS]: https://en.wikipedia.org/wiki/Multicast_DNS 50 | [gitlab]: https://about.gitlab.com 51 | [gogs]: https://github.com/gogits/gogs 52 | [ownCloud]: https://owncloud.org/ 53 | [WebDAV]: https://en.wikipedia.org/wiki/WebDAV 54 | [CalDAV]: https://en.wikipedia.org/wiki/CalDAV 55 | [CardDAV]: https://en.wikipedia.org/wiki/CardDAV 56 | 57 | -------------------------------------------------------------------------------- /articles/2016/raas/docker-raspberry-pi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/raas/docker-raspberry-pi.jpg -------------------------------------------------------------------------------- /articles/2016/support-http2/README.md: -------------------------------------------------------------------------------- 1 | 拥抱 HTTP/2 2 | === 3 | > Behind every successful web transaction lurks the Hypertext Transfer Protocol(HTTP), the language by which web clients and servers exchange documents and information. -- HTTP, The Definitive Guide 4 | 5 | 很多人可能不知道 tcp/udp/ip 是什么鬼,但很可能知道 http,因为网址基本上都以 http 开头。HTTP 伴随着互联网的发展也走过了几十个年头,从1991年最初提出的 HTTP/0.9 到90年代末提出也是现在使用最广泛的 HTTP/1.1;我们也经历从没有电脑到有电脑再到智能手机,从单纯地浏览网页到语音图片视频,从最开始的 IE 到火狐,谷歌,edge 甚至现在各种各样的 app。每天都在变化,潜移默化的改变我们的生活,而 HTTP 协议本身并没有改变。不得不说 HTTP(以及底层的tcp/ip)简直不能再棒。 6 | 7 | 然而,也该到改变的时候了。 8 | 9 | ## SPDY 10 | SPDY(发音:speedy)是 Google 最初开发的 **开放网络传输协议**。她最主要的目标是减少网页加载的等待时间并且增强安全性。通过压缩,多路复用和优先级来缩短时间。HTTP/2 协议便主要基于 SPDY,在 2015年2月 HTTP/2 标准通过了之后,Google 已经声明会支持标准并废弃 SPDY。 11 | 12 | SPDY 并不是要取代 HTTP,她只是修改了 http 的请求与响应的方式。这意味着所有已经存在的服务端应用并不要作出修改而只需增加 SPDY 模块(一般来说,服务端应用指的是用程序语言写的后端,要做修改是的 web 应用服务器,比如 nginx,apache 等)。 13 | 14 | 关于 SPDY 的内容这里并不赘述,感兴趣的朋友可以看看[维基百科][1]或其他相关资料。 15 | 16 | ## HTTP/2 17 | HTTP/2 是 HTTP 协议的第二个主要版本。她基于 SPDY 协议,由 HTTP 工作小组开发(翻译得真变扭......)。她是 HTTP/1.1 后的第一个新版本,在2015年2月17号通过标准。基本上所有的主流浏览器都在2015年底增加了 HTTP/2 的支持。 18 | 19 | 她的主要目标如下: 20 | 21 | - 允许客户端或者服务端选择使用 HTTP/1.1,HTTP/2 甚至其他非 HTTP 协议 22 | - 与 HTTP/1.1 的兼容性 23 | - 通过一下方式降低网页加载的等待时间: 24 | - 压缩 HTTP 请求头部 25 | - 服务端 push 技术 26 | - 请求管道化 27 | - 修复 HTTP 1.x 存在的 [head-of-line][2] 问题 28 | - 通过多路复用一个 tcp 连接发起多次请求 29 | - 支持更宽泛的应用程序,比如桌面/移动浏览器,web api,代理服务器,cdn 等 30 | 31 | 具体的也不赘述了,都是翻译自[维基百科][3]的...... 32 | 33 | 截至至16年2月,据 W2Techs 的统计,全世界流量排名前1千万的网站中支持 HTTP/2 的占6.7%。很高兴,我的 https://www.xiaolongtongxue.com 也于2016年3月28晚上支持 HTTP/2 啦!试了一下,比以前快了一些;注意,这不是幻觉,注意,这不是幻觉! 34 | 35 | ![xiaolongtongxue.com](http2.jpg) 36 | 37 | ## 拥抱变化 38 | 以前上软件工程课的时候,时常听到「拥抱变化」这个词;现在工作了,更加确信这句话,没有什么是不会变化的,应该以积极的态度去面对变化。上上周看完了吴军博士的 [硅谷之谜][4] 里面揭露硅谷成功的科学方法论,其中最重要的一条:[控制论][5]。我感觉这和拥抱变化是一个意思。 39 | 40 | 在牛顿力学中,任何复杂的东西都可以分解成细小的部分,通过分析计算,再整合到原来复杂的问题中从而将问题解决(有点像高中物理的整体法与隔离法)。牛顿定律是第一、二次工业革命的钥匙。然而,在信息时代,牛顿定律并不适用了(并不是没用了,而是不适合在信息时代快速发展的场景,然而她还是绝大多数原理的基础)。 41 | 42 | 在第二次世界大战末期,德国研发并且向英国投放了几十枚导弹。德国的导弹工程师运用力学运动原理经过对所有可能发生的情况进行精密地测算,然而并没有命中,反而差之千里。战后这一部分工程去了美国参与了后来阿波罗登月的计划。这一次,是控制论让飞船到了月球。在飞船行进的过程中,根据综合遇到的情况以及周边的情况来预测下一步的行动,而不是直接计算所有可能出现的问题。 43 | 44 | 这个故事,告诉我们,赶紧支持 HTTP/2 吧 :) 45 | 46 | ## One More Thing 47 | 在支持之前,一定要做好准备和测试。一些软件,其实还没有达到 stable 的状态,比如我使用的 nginx,但这并不妨碍尝试,其实这倒是个挺好的 testing 机会。 48 | 49 | 推荐一个非常好用的资源,来自 ff 的 [mozilla][6]。 50 | 51 | Happy hacking. 52 | 53 | ### EOF 54 | ```yaml 55 | background: http.jpg 56 | hide: false 57 | license: cc-40-by 58 | location: Shenzhen 59 | summary: Let's support HTTP/2. 60 | tags: 61 | - Web 62 | weather: fine but a bit cold 63 | date: 2016-03-29T02:55:36+08:00 64 | ``` 65 | 66 | [1]: https://en.wikipedia.org/wiki/SPDY 67 | [2]: https://en.wikipedia.org/wiki/Head-of-line_blocking 68 | [3]: https://en.wikipedia.org/wiki/HTTP/2 69 | [4]: http://book.douban.com/subject/26665230 70 | [5]: https://en.wikipedia.org/wiki/Cybernetics 71 | [6]: https://mozilla.github.io/server-side-tls/ssl-config-generator/ 72 | -------------------------------------------------------------------------------- /articles/2016/support-http2/http.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/support-http2/http.jpg -------------------------------------------------------------------------------- /articles/2016/support-http2/http2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/support-http2/http2.jpg -------------------------------------------------------------------------------- /articles/2016/view-pager-1/vp1_auto.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/view-pager-1/vp1_auto.gif -------------------------------------------------------------------------------- /articles/2016/view-pager-1/vp1_infinite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/view-pager-1/vp1_infinite.gif -------------------------------------------------------------------------------- /articles/2016/view-pager-1/vp1_interacting.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/view-pager-1/vp1_interacting.gif -------------------------------------------------------------------------------- /articles/2016/why-we-can-send-to-gmail-in-china/gmail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/why-we-can-send-to-gmail-in-china/gmail.jpg -------------------------------------------------------------------------------- /articles/2016/why-we-can-send-to-gmail-in-china/inbox.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2016/why-we-can-send-to-gmail-in-china/inbox.jpg -------------------------------------------------------------------------------- /articles/2017/a-rough-http2-speed-test/http.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/a-rough-http2-speed-test/http.jpg -------------------------------------------------------------------------------- /articles/2017/a-rough-http2-speed-test/http2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/a-rough-http2-speed-test/http2.jpg -------------------------------------------------------------------------------- /articles/2017/a-rough-http2-speed-test/https.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/a-rough-http2-speed-test/https.jpg -------------------------------------------------------------------------------- /articles/2017/a-rough-http2-speed-test/wireshark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/a-rough-http2-speed-test/wireshark.jpg -------------------------------------------------------------------------------- /articles/2017/english-writing/teos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/english-writing/teos.jpg -------------------------------------------------------------------------------- /articles/2017/hacking-library-network-with-ipv6/library.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/hacking-library-network-with-ipv6/library.jpg -------------------------------------------------------------------------------- /articles/2017/hacking-library-network-with-ipv6/orignal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/hacking-library-network-with-ipv6/orignal.jpg -------------------------------------------------------------------------------- /articles/2017/how-does-qq-know-who-i-am/qq.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/how-does-qq-know-who-i-am/qq.jpg -------------------------------------------------------------------------------- /articles/2017/lessons-from-gmail-api-a-batch-request-design-doc/art.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/lessons-from-gmail-api-a-batch-request-design-doc/art.jpg -------------------------------------------------------------------------------- /articles/2017/xiaolongtongxue.com/sunset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/xiaolongtongxue.com/sunset.jpg -------------------------------------------------------------------------------- /articles/2017/xiaolongtongxue.com/sunset@full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2017/xiaolongtongxue.com/sunset@full.jpg -------------------------------------------------------------------------------- /articles/2019/contribute-klog/README.md: -------------------------------------------------------------------------------- 1 | 2 | # 给Kubernetes下的klog项目贡献代码 3 | 4 | 先前写过一篇glog源码阅读的[文章](./read-google-logging-library-glog),在使用的过程中发现一些体验问题,偶然发现Kubernetes项目其实已经fork了glog维护着一个[klog](https://github.com/kubernetes/klog)项目,并使用它作为日志库。看了下,刚好也解决了默认所有配置都在`init()`中初始化带来的问题。 5 | 6 | 此外,还引入了一个`log_file`的新选项,允许将所有的日志输出到一个单独的文件上,这对调试来说更方便一些。于是尝试了一下,发现example并没有输出文件日志,比较困惑,还是翻看了下源码,原来日志默认是打在`stderr`上的,比如要将`logtostderr`设置为false才会有文件日志。 7 | 8 | 困惑消除了,解决办法也有了,但是觉得example的代码比较误导新人:如果不看代码,是很难发现这个细微的问题的。于是想着要不我也给这项目提交一个fix? 9 | 10 | 终于,在接下来一个星期的某个中午,午饭后看了一下[contribution guide](https://github.com/kubernetes/community/tree/master/contributors/guide)就开干了。 11 | 12 | 先fork了仓库到本地,按照规范的style添加了一行代码和一行注释,commit log还是琢磨了一下,参考klog项目前人的提交记录,第一行标题简要的写做了什么,然后详情中写变更原因和解决办法,以及`Signed-off-by`标签。现在想来,平常的项目commit log提交是只有标题,还是很随意的,对于回溯,好像就压根儿没有过。就好比看着这段代码发呆,当时为什么会这样写? 13 | 14 | 接下来就在GitHub上发起了一个[Pull Request](https://github.com/kubernetes/klog/pull/103),照着模版填写了一些信息提交,然后就是一系列的bot自动化验证cla是否签署和代码是否通过测试。cla好办,对于个人贡献者只需要去Linux foundation创建一个账号并签署协议然后和GitHub绑定。 15 | 16 | 一系列的检查OK后,机器人会提示你使用`/assign @github_id`指令去请求某个项目的核心贡献者去review你的代码,第一次用很高级。看了下,那些reviewers都是Google的大牛,诚惶诚恐。 17 | 18 | 到了晚上,也就是西方的工作时间,收到了review的邮件,让我改一下注释,并且给了注释应该的样子。确实,原来的注释英语不地道,修改后的可读性高了,既说明了问题的原因,还说明了解决的办法。改完后,提交然后继续请求review。 19 | 20 | 没过过久,又收到了邮件,要求我把两条提交合并成一条。`rebase squash`这些命令很少用到,我们平时虽然也是用分支合并代码,但是几乎没有要求在合并的时候压缩commit,所以history看起来总是乱糟糟的。深深地感觉这些开源项目的流程概念很超前,很牛皮。 21 | 22 | 最后,老外很nice地approve了我的PR,还给我点了个赞,哈哈。 23 | 24 | 很荣幸,虽然只是Kubernetes下的一个小项目,虽然只有一行代码和一行注释。整个过程,从阅读源代码,fix bug,写commit log,以及review中各种细节以及自动化流程,相比平时写的代码,这才是真正地做项目。 25 | 26 | 在开源中学习,并做出贡献。 27 | 28 | ## EOF 29 | 30 | ```yaml 31 | title: 给Kubernetes的klog项目提交代码 32 | summary: 在开源中学习,并做出贡献。 33 | weather: fine 34 | license: cc-40-by 35 | location: 22, 114 36 | background: ./k8s.jpg 37 | tags: [Kubernetes, open source] 38 | date: 2019-10-20T21:56:59+08:00 39 | ``` 40 | -------------------------------------------------------------------------------- /articles/2019/contribute-klog/README.org: -------------------------------------------------------------------------------- 1 | #+OPTIONS: toc:nil 2 | * 给Kubernetes下的klog项目贡献代码 3 | 4 | 先前写过一篇glog源码阅读的[[./read-google-logging-library-glog][文章]],在使用的过程中发现一些体验问题,偶然发现Kubernetes项目其实已经fork了glog维护着一个[[https://github.com/kubernetes/klog][klog]]项目,并使用它作为日志库。看了下,刚好也解决了默认所有配置都在=init()=中初始化带来的问题。 5 | 6 | 此外,还引入了一个=log_file=的新选项,允许将所有的日志输出到一个单独的文件上,这对调试来说更方便一些。于是尝试了一下,发现example并没有输出文件日志,比较困惑,还是翻看了下源码,原来日志默认是打在=stderr=上的,比如要将=logtostderr=设置为false才会有文件日志。 7 | 8 | 困惑消除了,解决办法也有了,但是觉得example的代码比较误导新人:如果不看代码,是很难发现这个细微的问题的。于是想着要不我也给这项目提交一个fix? 9 | 10 | 终于,在接下来一个星期的某个中午,午饭后看了一下[[https://github.com/kubernetes/community/tree/master/contributors/guide][contribution guide]]就开干了。 11 | 12 | 先fork了仓库到本地,按照规范的style添加了一行代码和一行注释,commit log还是琢磨了一下,参考klog项目前人的提交记录,第一行标题简要的写做了什么,然后详情中写变更原因和解决办法,以及=Signed-off-by=标签。现在想来,平常的项目commit log提交是只有标题,还是很随意的,对于回溯,好像就压根儿没有过。就好比看着这段代码发呆,当时为什么会这样写? 13 | 14 | 接下来就在GitHub上发起了一个[[https://github.com/kubernetes/klog/pull/103][Pull Request]],照着模版填写了一些信息提交,然后就是一系列的bot自动化验证cla是否签署和代码是否通过测试。cla好办,对于个人贡献者只需要去Linux foundation创建一个账号并签署协议然后和GitHub绑定。 15 | 16 | 一系列的检查OK后,机器人会提示你使用=/assign @github_id=指令去请求某个项目的核心贡献者去review你的代码,第一次用很高级。看了下,那些reviewers都是Google的大牛,诚惶诚恐。 17 | 18 | 到了晚上,也就是西方的工作时间,收到了review的邮件,让我改一下注释,并且给了注释应该的样子。确实,原来的注释英语不地道,修改后的可读性高了,既说明了问题的原因,还说明了解决的办法。改完后,提交然后继续请求review。 19 | 20 | 没过过久,又收到了邮件,要求我把两条提交合并成一条。=rebase squash=这些命令很少用到,我们平时虽然也是用分支合并代码,但是几乎没有要求在合并的时候压缩commit,所以history看起来总是乱糟糟的。深深地感觉这些开源项目的流程概念很超前,很牛皮。 21 | 22 | 最后,老外很nice地approve了我的PR,还给我点了个赞,哈哈。 23 | 24 | 很荣幸,虽然只是Kubernetes下的一个小项目,虽然只有一行代码和一行注释。整个过程,从阅读源代码,fix bug,写commit log,以及review中各种细节以及自动化流程,相比平时写的代码,这才是真正地做项目。 25 | 26 | 在开源中学习,并做出贡献。 27 | 28 | ** EOF 29 | 30 | #+BEGIN_SRC yaml 31 | title: 给Kubernetes的klog项目提交代码 32 | summary: 在开源中学习,并做出贡献。 33 | weather: fine 34 | license: cc-40-by 35 | location: 22, 114 36 | background: ./k8s.jpg 37 | tags: [Kubernetes, open source] 38 | date: 2019-10-20T21:56:59+08:00 39 | #+END_SRC 40 | -------------------------------------------------------------------------------- /articles/2019/contribute-klog/k8s.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2019/contribute-klog/k8s.jpg -------------------------------------------------------------------------------- /articles/2019/how-to-pay-between-different-merchants-in-wechat/README.md: -------------------------------------------------------------------------------- 1 | 2 | # 如何在不同主体的小程序和商户上发起微信支付 3 | 4 | 最近在负责一个市级的政府医疗门户小程序, 涉及到线上的支付, 过程中遇到了不少的坑, 这里记录下来希望对你有用 :) 5 | 6 | ## 问题 7 | 8 | 先说下背景, 小程序的主体是卫健委, 连接了市级的N家医院, 每家医院都在微信平台申请了支付的商户号. 小程序的很多业务 (挂号, 门诊, 住院等) 都涉及到线上的支付. 9 | 10 | 不同于公众号的H5支付, H5支付在后台调用统一下单的时候需要获得用户的 `openid`, 前端可以调用微信的 `jsapi` 得到 `code` 发给后端, 再由后端调用微信接口获得该用户的 `openid` 从而发起支付. 这里要注意的是, **即使用户没有关注该支付商户的公众号, 后端也能获得用户的openid**, 原因在于这里实际上做了一次 **静默授权( `scope=snsapi_base`), 用户无需点击授权并自动跳转至回调页)**. 11 | 12 | 小程序和H5的统一下单接口本质上是一样的, 也需要openid, 不幸的是, 小程序没法像前端那样通过调用 `jsapi` 获得 `code`, 因为所有以 `api.weixin.qq.com` 为域名的HTTP都无法请求, 因此套用H5的方式是行不通的. 13 | 14 | 那么如何在小程序调起微信支付呢? 15 | 16 | 关键在于 `openid` 的获得, 不同的支付模式下 `openid` 的获取都不一样. 17 | 18 | ## 普通模式 19 | 20 | 这是最简单的模式, 小程序和收款商户拥有同一个主体, 那么就可以直连收款了. `openid` 也就是当前在小程序支付用户的 `openid`. 21 | 22 | 由于小程序的主体 (卫健委) 和各医院不是一个主体, 所以普通模式下单是不行的. 23 | 24 | ## 联合运营模式 25 | 26 | 普通模式真的不行吗? 其实也可以. 27 | 28 | 微信提供了一种叫做联合运营的模式, 相当于把主体不同的公众号和商户绑定在一起, 看起来就成了一个主体, 就可以通过普通模式进行统一下单了. 这里的 `openid` 也即当前在小程序支付用户的. 29 | 30 | 需要注意的是联合运营的申请需要准备不少微信, 卫健委和不同医院的材料, 耗时较长 (我们在内部花了一周的时间). 31 | 32 | 申请下来就按照普通模式开发就好了. 33 | 34 | ## 服务商模式 35 | 36 | 服务商模式相当于一个第三方代理 (有自己的商户号), 医院把自己的商户号挂在服务商那 (作为子商户号), 小程序只需要和服务商进行支付 (前提是在服务商关联小程序). 统一下单的时候涉及到的几个关键字段: 37 | 38 | - **`appid`:** 服务商APPID 39 | - **`mch_id`:** 服务商商户号 40 | - **`sub_appid`:** 当前调起支付的小程序APPID 41 | - **`sub_mch_id`:** 子商户号(也即收款的医院) 42 | - **`sub_openid`:** 当前调起支付的用户的小程序的openid 43 | 44 | 这里的 `sub_openid` 怎么获取困扰了我们很久, 我们不得已才走了联合运营那条路. 后来经过和微信团队的沟通, 发现这个 `sub_openid` 原来就是用户在小程序的! 45 | 46 | ## 联合运营 vs. 服务商 47 | 48 | 我到底应该选择那种模式? 49 | 50 | 首先, 两种模式都需要申请, 来来回回流程都挺长. 具体流程是商务的同事去做的, 大伙可以网上查或者咨询微信. 我们只谈谈在开发和运营上孰优孰劣. 51 | 52 | 开发上, 可能会觉得联合模式会简单些, 因为就和普通模式一样嘛. 53 | 54 | 其实不然. 55 | 56 | 普通模式下, 调用微信支付提供的接口, 你需要收集各家医院的证书密钥, 且不说别人愿意给你, 维护成本也挺高的. 57 | 58 | 然后 **对账** 也是个问题. 正因为和普通模式一样, 通过商户号去调用微信接口拉去对账单时, 你拉到的是这个商户号全部的订单. 有什么问题? 如果医院在其他地方也委托其他的服务商或者自己 (通过普通模式) 收款, 三者拉到的对账单都是一样的. 举个栗子, 同一个房间, 好几个人都有钥匙, 看到不该看的东西, 很不安全, 对账也是个麻烦事. 59 | 60 | 服务商模式就能很好的规避这些问题. 61 | 62 | 所以最终我们还是会从联合运营模式转到服务商模式. 63 | 64 | ## 致谢 65 | 66 | 感谢几位同事的审阅, 尤其是陆同学提供的题图 :) 67 | 68 | ## EOF 69 | 70 | ```yaml 71 | summary: 如何在不同主体的小程序和商户上发起微信支付? 72 | weather: rainy 73 | license: cc-40-by 74 | location: 22, 114 75 | background: ./wechat-pay.png 76 | tags: [小程序, 微信支付] 77 | date: 2019-06-30T02:18:56+08:00 78 | ``` 79 | -------------------------------------------------------------------------------- /articles/2019/how-to-pay-between-different-merchants-in-wechat/README.org: -------------------------------------------------------------------------------- 1 | #+OPTIONS: ^:nil 2 | #+OPTIONS: toc:nil 3 | * 如何在不同主体的小程序和商户上发起微信支付 4 | 最近在负责一个市级的政府医疗门户小程序, 涉及到线上的支付, 过程中遇到了不少的坑, 这里记录下来希望对你有用 :) 5 | 6 | ** 问题 7 | 先说下背景, 小程序的主体是卫健委, 连接了市级的N家医院, 每家医院都在微信平台申请了支付的商户号. 小程序的很多业务 (挂号, 门诊, 住院等) 都涉及到线上的支付. 8 | 9 | 不同于公众号的H5支付, H5支付在后台调用统一下单的时候需要获得用户的 =openid=, 前端可以调用微信的 =jsapi= 得到 =code= 发给后端, 再由后端调用微信接口获得该用户的 =openid= 从而发起支付. 这里要注意的是, *即使用户没有关注该支付商户的公众号, 后端也能获得用户的openid*, 原因在于这里实际上做了一次 *静默授权( =scope=snsapi_base=), 用户无需点击授权并自动跳转至回调页)*. 10 | 11 | 小程序和H5的统一下单接口本质上是一样的, 也需要openid, 不幸的是, 小程序没法像前端那样通过调用 =jsapi= 获得 =code=, 因为所有以 =api.weixin.qq.com= 为域名的HTTP都无法请求, 因此套用H5的方式是行不通的. 12 | 13 | 那么如何在小程序调起微信支付呢? 14 | 15 | 关键在于 =openid= 的获得, 不同的支付模式下 =openid= 的获取都不一样. 16 | 17 | ** 普通模式 18 | 这是最简单的模式, 小程序和收款商户拥有同一个主体, 那么就可以直连收款了. =openid= 也就是当前在小程序支付用户的 =openid=. 19 | 20 | 由于小程序的主体 (卫健委) 和各医院不是一个主体, 所以普通模式下单是不行的. 21 | 22 | ** 联合运营模式 23 | 普通模式真的不行吗? 其实也可以. 24 | 25 | 微信提供了一种叫做联合运营的模式, 相当于把主体不同的公众号和商户绑定在一起, 看起来就成了一个主体, 就可以通过普通模式进行统一下单了. 这里的 =openid= 也即当前在小程序支付用户的. 26 | 27 | 需要注意的是联合运营的申请需要准备不少微信, 卫健委和不同医院的材料, 耗时较长 (我们在内部花了一周的时间). 28 | 29 | 申请下来就按照普通模式开发就好了. 30 | 31 | ** 服务商模式 32 | 服务商模式相当于一个第三方代理 (有自己的商户号), 医院把自己的商户号挂在服务商那 (作为子商户号), 小程序只需要和服务商进行支付 (前提是在服务商关联小程序). 统一下单的时候涉及到的几个关键字段: 33 | 34 | - =appid= :: 服务商APPID 35 | - =mch_id= :: 服务商商户号 36 | - =sub_appid= :: 当前调起支付的小程序APPID 37 | - =sub_mch_id= :: 子商户号(也即收款的医院) 38 | - =sub_openid= :: 当前调起支付的用户的小程序的openid 39 | 40 | 这里的 =sub_openid= 怎么获取困扰了我们很久, 我们不得已才走了联合运营那条路. 后来经过和微信团队的沟通, 发现这个 =sub_openid= 原来就是用户在小程序的! 41 | 42 | ** 联合运营 vs. 服务商 43 | 我到底应该选择那种模式? 44 | 45 | 首先, 两种模式都需要申请, 来来回回流程都挺长. 具体流程是商务的同事去做的, 大伙可以网上查或者咨询微信. 我们只谈谈在开发和运营上孰优孰劣. 46 | 47 | 开发上, 可能会觉得联合模式会简单些, 因为就和普通模式一样嘛. 48 | 49 | 其实不然. 50 | 51 | 普通模式下, 调用微信支付提供的接口, 你需要收集各家医院的证书密钥, 且不说别人愿意给你, 维护成本也挺高的. 52 | 53 | 然后 *对账* 也是个问题. 正因为和普通模式一样, 通过商户号去调用微信接口拉去对账单时, 你拉到的是这个商户号全部的订单. 有什么问题? 如果医院在其他地方也委托其他的服务商或者自己 (通过普通模式) 收款, 三者拉到的对账单都是一样的. 举个栗子, 同一个房间, 好几个人都有钥匙, 看到不该看的东西, 很不安全, 对账也是个麻烦事. 54 | 55 | 服务商模式就能很好的规避这些问题. 56 | 57 | 所以最终我们还是会从联合运营模式转到服务商模式. 58 | 59 | ** 致谢 60 | 感谢几位同事的审阅, 尤其是陆同学提供的题图 :) 61 | 62 | ** EOF 63 | #+BEGIN_SRC yaml 64 | summary: 如何在不同主体的小程序和商户上发起微信支付? 65 | weather: rainy 66 | license: cc-40-by 67 | location: 22, 114 68 | background: ./wechat-pay.png 69 | tags: [小程序, 微信支付] 70 | date: 2019-06-30T02:18:56+08:00 71 | #+END_SRC 72 | -------------------------------------------------------------------------------- /articles/2019/how-to-pay-between-different-merchants-in-wechat/wechat-pay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2019/how-to-pay-between-different-merchants-in-wechat/wechat-pay.png -------------------------------------------------------------------------------- /articles/2020/a-philosophy-of-software-design/README.md: -------------------------------------------------------------------------------- 1 | 2 | # A Philosophy of Software Design 3 | 4 | 这是本月看的第三本书,也是第四篇读书回顾。 5 | 6 | 最初注意到这本书大概是18年底在Hacker News看到的一则帖子,里面有一个[YouTube](https://www.youtube.com/watch?v=bmSAYlu0NcY)链接,是斯坦福大学的教授,也就是本书作者在Google内部的一个演讲,关于软件设计和它刚写的这本书。不懂设计的我,觉得他讲的颇有大师风范,一些观点真是余音绕梁。大概从那时起,我也开始更多地关注设计。当时苦于国内没有这本书,出于对这本书对喜爱购买了原版书。 7 | 8 | 一年半过去了,中间陆陆续续翻看,最近又过了一遍,回过头来,这本书可以作为是很多同学软件设计的启蒙书。里面提炼的设计原则和典型的设计缺陷,在日常的开发中,以及在很多开源项目里,看别人的代码,就特别能够感受得到。好的设计赏心悦目,解决复杂的问题看起来却比较简单,这里面有很多东西都值得思考和学习。 9 | 10 | 如何评价代码好坏?以前可能觉得代码写得简洁漂亮,使用了很多流行的技术,完成需求且bug少,现在看起来都不是必要条件,好的设计才是关键。在Google code review的[guideline](https://google.github.io/eng-practices/review/reviewer/)中,列了很多条规则,比如有功能性,测试,文档,代码规范,其中第一条也是最重要的一条:良好的设计。 11 | 12 | 好了,说了这些,开始聊下本书吧。 13 | 14 | 在计算机科学中最基本的问题是,问题分解(problem decomposition):如何把复杂的问题拆分成若干个可以独立解决的小问题。这道理几乎每个学过分治算法的同学都懂,但知易行难,设计能力是普通和高质高效程序员的分水岭。 15 | 16 | 设计的本质是管理(降低)复杂度,这比其他任何东西都重要。复杂的表现有很多,比如代码难以理解,没有测试,关系混乱,改动牵一发而动全身等,作者给复杂下了一个通用的定义:任何让系统难以理解和改动的都可以称之为复杂。具体的表现可以总结为三种: 17 | 18 | 1. 改动很多地方 19 | 2. 认知负担 20 | 3. 有很多不清楚的东西 21 | 22 | 问题间的关联太多,就像一张网一样纷繁复杂,这就造成了1,2;而代码写得太晦涩,难以理解导致了2,3。尽可能地减少问题间的关联关系,简洁易懂,可读性好的代码是解决复杂的关键。 23 | 24 | 复杂度是可以量化的,作者给出了公式,每个模块本身的复杂度乘以在该模块付出的时间,最后求和。所以从数学的角度,想要降低复杂度,要么降低模块的复杂度,要么减少花费的时间。前者通过良好的设计解决,后者可以将复杂抽象封装起来,比如借助成熟的组件,这样可能就不需要自己去解决了。 25 | 26 | 作为开发人员,首先心里得有杆秤:只写能用的代码是不够的。原因在于现在的软件开发都是在上一个版本上基础迭代的,我们每次提交的代码,如果设计没有变得更好,那多半就变坏,复杂度会随着迭代一直增加,代码库的质量也就越来越坏。在日常开发中,不应该只关注于完成功能,而是先考虑如何更好的设计。长期来看,带来的收益是巨大的,不仅是个人和项目本身。 27 | 28 | 说的都是大道理,那么该如何做呢? 29 | 30 | 首先模块应该被设计成深模块,可以把模块抽象成矩形,面积表示模块提供的功能,而最上的那条边可以认为是模块对外暴露的接口,越短表示接口越简单。什么样的接口才是简单的呢?相当简单的接口和极其复杂的功能。因为这样接口的结果,隐藏了对使用者不重要的信息,那么模块间的依赖就少了,复杂的改动和认知这些复杂度也就少了。这里作者用unix的io函数作为例子,unix仅仅用了5个简单的io函数就实现了复杂的io(底层有硬件的交互,磁盘寻址,系统调用等,很多时候调用者只是想读一个文件成string,仅此而已),对比Java的io,嗯。 31 | 32 | ``` 33 | +-----------+ 34 | | | 35 | | | 36 | | | 37 | +-----------+ 38 | 39 | (deep module) 40 | 41 | +------------------------------+ 42 | | | 43 | +------------------------------+ 44 | 45 | (shallow module) 46 | ``` 47 | 48 | 后续的章节都是针对如何设计深模块展开。比如信息的隐藏,避免暴露不重要的信息而增加依赖,否则很多地方都要去了解处理这些信息,这就造成认知负担和改动很多地方。此外,接口的设计应当要简单通用,尽管当前我们只是实现一个具体的功能。不同的层应该有不同的抽象,拿常见的MVC举栗,经常看到不同的层都是直接调用下一层,接口签名几乎都是一样的,这种设计应该保持警惕。接下来就是应该尽可能地将复杂在模块内部处理掉,而不是简单的抛给上层,大多数情况下,底层的模块了解的细节信息更多,内部处理可以使得接口更简单,调用者的心智负担小了也就更开心。再者就是关于模块应该分离还是合并的讨论,总的来说原则就是降低复杂度,从这原则出发,对于需要共享信息,相互依赖,减少重复的,大多数时候会选择合并,这样使得模块的接口更简单。最后一个是错误的处理,关键是需要减少错误处理的地方,避免代码里到处都是抛出异常和错误处理代码,这是编程中我们最不想面对也最容易出错的地方。作者列举了几个方法,包括通过定义某种语义,错误就会不复存在。比如说`unsetEnv(key)`,定义为调用后将不存在key这个变量,如果key不存在,直接返回成功即可,它本来就不存在嘛。这个规则看起来简单,但是实际中经常发现一些接口,会把临界值作为异常返回的。 49 | 50 | 后续章节是关于如何写可读性好的代码的,可读性好的代码可以降低认知和减少不清楚的地方。代码的可读性好是由读者来评判的,不以作者的意志为转移(这也说明code review 的重要性)。这就要求我们在命名风格,注释上要保持一致性,简单性,这里就不展开说了。 51 | 52 | 最后还有一点,虽然设计重要,但是也不能过度,要在设计和具体实现间做取舍,不应该时间花费了,取得的收益却很小,甚至是负的。 53 | 54 | ## EOF 55 | 56 | ```yaml 57 | summary: book review for A Philosophy of Software Design 58 | weather: a little rain 59 | license: cc-40-by 60 | location: 22, 114 61 | background: ./apsd.jpg 62 | tags: [design, book, review] 63 | date: 2020-03-26T08:00:15+08:00 64 | ``` 65 | -------------------------------------------------------------------------------- /articles/2020/a-philosophy-of-software-design/README.org: -------------------------------------------------------------------------------- 1 | #+OPTIONS: toc:nil 2 | * A Philosophy of Software Design 3 | 4 | 这是本月看的第三本书,也是第四篇读书回顾。 5 | 6 | 最初注意到这本书大概是18年底在Hacker News看到的一则帖子,里面有一个[[https://www.youtube.com/watch?v=bmSAYlu0NcY][YouTube]]链接,是斯坦福大学的教授,也就是本书作者在Google内部的一个演讲,关于软件设计和它刚写的这本书。不懂设计的我,觉得他讲的颇有大师风范,一些观点真是余音绕梁。大概从那时起,我也开始更多地关注设计。当时苦于国内没有这本书,出于对这本书对喜爱购买了原版书。 7 | 8 | 一年半过去了,中间陆陆续续翻看,最近又过了一遍,回过头来,这本书可以作为是很多同学软件设计的启蒙书。里面提炼的设计原则和典型的设计缺陷,在日常的开发中,以及在很多开源项目里,看别人的代码,就特别能够感受得到。好的设计赏心悦目,解决复杂的问题看起来却比较简单,这里面有很多东西都值得思考和学习。 9 | 10 | 如何评价代码好坏?以前可能觉得代码写得简洁漂亮,使用了很多流行的技术,完成需求且bug少,现在看起来都不是必要条件,好的设计才是关键。在Google code review的[[https://google.github.io/eng-practices/review/reviewer/][guideline]]中,列了很多条规则,比如有功能性,测试,文档,代码规范,其中第一条也是最重要的一条:良好的设计。 11 | 12 | 好了,说了这些,开始聊下本书吧。 13 | 14 | 在计算机科学中最基本的问题是,问题分解(problem decomposition):如何把复杂的问题拆分成若干个可以独立解决的小问题。这道理几乎每个学过分治算法的同学都懂,但知易行难,设计能力是普通和高质高效程序员的分水岭。 15 | 16 | 设计的本质是管理(降低)复杂度,这比其他任何东西都重要。复杂的表现有很多,比如代码难以理解,没有测试,关系混乱,改动牵一发而动全身等,作者给复杂下了一个通用的定义:任何让系统难以理解和改动的都可以称之为复杂。具体的表现可以总结为三种: 17 | 18 | 1. 改动很多地方 19 | 2. 认知负担 20 | 3. 有很多不清楚的东西 21 | 22 | 问题间的关联太多,就像一张网一样纷繁复杂,这就造成了1,2;而代码写得太晦涩,难以理解导致了2,3。尽可能地减少问题间的关联关系,简洁易懂,可读性好的代码是解决复杂的关键。 23 | 24 | 复杂度是可以量化的,作者给出了公式,每个模块本身的复杂度乘以在该模块付出的时间,最后求和。所以从数学的角度,想要降低复杂度,要么降低模块的复杂度,要么减少花费的时间。前者通过良好的设计解决,后者可以将复杂抽象封装起来,比如借助成熟的组件,这样可能就不需要自己去解决了。 25 | 26 | 作为开发人员,首先心里得有杆秤:只写能用的代码是不够的。原因在于现在的软件开发都是在上一个版本上基础迭代的,我们每次提交的代码,如果设计没有变得更好,那多半就变坏,复杂度会随着迭代一直增加,代码库的质量也就越来越坏。在日常开发中,不应该只关注于完成功能,而是先考虑如何更好的设计。长期来看,带来的收益是巨大的,不仅是个人和项目本身。 27 | 28 | 说的都是大道理,那么该如何做呢? 29 | 30 | 首先模块应该被设计成深模块,可以把模块抽象成矩形,面积表示模块提供的功能,而最上的那条边可以认为是模块对外暴露的接口,越短表示接口越简单。什么样的接口才是简单的呢?相当简单的接口和极其复杂的功能。因为这样接口的结果,隐藏了对使用者不重要的信息,那么模块间的依赖就少了,复杂的改动和认知这些复杂度也就少了。这里作者用unix的io函数作为例子,unix仅仅用了5个简单的io函数就实现了复杂的io(底层有硬件的交互,磁盘寻址,系统调用等,很多时候调用者只是想读一个文件成string,仅此而已),对比Java的io,嗯。 31 | 32 | #+begin_src 33 | +-----------+ 34 | | | 35 | | | 36 | | | 37 | +-----------+ 38 | 39 | (deep module) 40 | 41 | +------------------------------+ 42 | | | 43 | +------------------------------+ 44 | 45 | (shallow module) 46 | #+end_src 47 | 48 | 后续的章节都是针对如何设计深模块展开。比如信息的隐藏,避免暴露不重要的信息而增加依赖,否则很多地方都要去了解处理这些信息,这就造成认知负担和改动很多地方。此外,接口的设计应当要简单通用,尽管当前我们只是实现一个具体的功能。不同的层应该有不同的抽象,拿常见的MVC举栗,经常看到不同的层都是直接调用下一层,接口签名几乎都是一样的,这种设计应该保持警惕。接下来就是应该尽可能地将复杂在模块内部处理掉,而不是简单的抛给上层,大多数情况下,底层的模块了解的细节信息更多,内部处理可以使得接口更简单,调用者的心智负担小了也就更开心。再者就是关于模块应该分离还是合并的讨论,总的来说原则就是降低复杂度,从这原则出发,对于需要共享信息,相互依赖,减少重复的,大多数时候会选择合并,这样使得模块的接口更简单。最后一个是错误的处理,关键是需要减少错误处理的地方,避免代码里到处都是抛出异常和错误处理代码,这是编程中我们最不想面对也最容易出错的地方。作者列举了几个方法,包括通过定义某种语义,错误就会不复存在。比如说=unsetEnv(key)=,定义为调用后将不存在key这个变量,如果key不存在,直接返回成功即可,它本来就不存在嘛。这个规则看起来简单,但是实际中经常发现一些接口,会把临界值作为异常返回的。 49 | 50 | 后续章节是关于如何写可读性好的代码的,可读性好的代码可以降低认知和减少不清楚的地方。代码的可读性好是由读者来评判的,不以作者的意志为转移(这也说明code review 的重要性)。这就要求我们在命名风格,注释上要保持一致性,简单性,这里就不展开说了。 51 | 52 | 最后还有一点,虽然设计重要,但是也不能过度,要在设计和具体实现间做取舍,不应该时间花费了,取得的收益却很小,甚至是负的。 53 | 54 | ** EOF 55 | 56 | #+BEGIN_SRC yaml 57 | summary: book review for A Philosophy of Software Design 58 | weather: a little rain 59 | license: cc-40-by 60 | location: 22, 114 61 | background: ./apsd.jpg 62 | tags: [design, book, review] 63 | date: 2020-03-26T08:00:15+08:00 64 | #+END_SRC 65 | -------------------------------------------------------------------------------- /articles/2020/a-philosophy-of-software-design/apsd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/a-philosophy-of-software-design/apsd.jpg -------------------------------------------------------------------------------- /articles/2020/envoy-l4-and-l7-proxy-with-shadowsocks/pcap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/envoy-l4-and-l7-proxy-with-shadowsocks/pcap.png -------------------------------------------------------------------------------- /articles/2020/envoy-l4-and-l7-proxy-with-shadowsocks/ss-websocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/envoy-l4-and-l7-proxy-with-shadowsocks/ss-websocket.png -------------------------------------------------------------------------------- /articles/2020/istio-architecture/lrg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/istio-architecture/lrg.jpg -------------------------------------------------------------------------------- /articles/2020/istio-wechat-domain-verify/istio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/istio-wechat-domain-verify/istio.png -------------------------------------------------------------------------------- /articles/2020/move-to-kubernetes/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Move to Kubernetes 3 | 4 | 上个周末,在个人服务器上整了个Kubernetes,把原来所有基于Docker的服务切换到了k8s上。没错,你现在浏览的页面,powered by k8s😬 5 | 6 | favicon换了个emoji,感觉又年轻了一些:) 7 | 8 | ## Why 9 | 10 | 为毛把这小破网站挂在k8s上?这让我想起了在推上看到这图,一种大炮打蚊子赶脚: 11 | 12 | ![k8s-as-a-car](k8s-as-a-car.jpg) 13 | 14 | hmmm,其实这也不是本意。原来免费的GCE账号到期了,一些重要的服务还是得继续,于是室友给了我他的新注册的Google账号,继续白嫖一年。。。 15 | 16 | 原来的服务是基于`docker-compose`的,使用乞丐版套餐,micro,只有600M内存。这样剩下的赠金就能都花在流量上,GCE上出站中国的流量是最贵的。然鹅这回600M内存的却很难把所有的服务跑起来,不是Dropbox起不来就是容器启动的时候各种OOM。 17 | 18 | 多次尝试无果后只能转向1.6G内存的plan了,但是想了一下,这些服务用这么多资源又浪费,要不整个单节点Kubernetes算了,这不,最近搭了好几个私有云下的集群。 19 | 20 | 说干就干。 21 | 22 | ## How 23 | 24 | 现在搭建k8s已经很容易了,尤其是在没有网络的问题的国外。别看机器配置小,其实有1G内存就可以,当然这样可以运行的pod不会多,但是对于个人站点来说,没啥鸭梨。 25 | 26 | 先前试过ubuntu官方出一个[MicroK8s](https://microk8s.io/)项目,但是体验不好,所以最终还是使用了更纯正的[kubeadm](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/)。虽说kubeadm要求每节点最低配置2CPU,2G内存,但是这些preflight check忽略掉就行了,加上选项`ignore-preflight-errors=NumCPU`,不出意外单节点的集群就建好了。在这过程中写了一个一键安装docker和k8s的[脚本](https://gist.github.com/longkai/e1f57d5612e86957e5b5c51f120c5a95),在GCE上多次测试通过,感兴趣可以了解下。 27 | 28 | 最后把原来docker的运行参数改成k8s的各种资源,最终的服务是这个样子的(亮点自寻👻) 29 | 30 | ```sh 31 | $ kubectl get svc | awk '{ print $1 }' 32 | NAME 33 | envoy-ingress 34 | essays 35 | kubernetes 36 | nginx 37 | omnifocus 38 | shadowsocks-libev 39 | ``` 40 | 41 | ## Results 42 | 43 | > Learning by doing. 44 | 45 | 把服务丢在k8s上后,对于这个站点,其实就感觉就是更现代了些。当然后面可玩性也多了,能尝试更多新的东西。 46 | 47 | 比如我们在生产环境使用[istio](https://istio.io/)做微服务网格,但是这配置肯定带不动。istio网络相关的特性其实依靠Lyft的[Envoy](https://www.envoyproxy.io/)项目,于是可以直接部署了一个envoy服务作为ingress gateway。在这个过程中,你会发现istio的virtual service都是对envoy配置的封装。某些时候,istio配置无法满足业务需求时,我们就需要使用`EnovyFilter`去和envoy打交道了。这需求其实很常见,比如pod需要得到remote的real ip,或者希望在envoy sidecar中直接提供`GRPC-JSON Transcoder`的能力(这样就不用再多加一个没什么意义的grpc-gateway容器)。这些功能都需要直接撸envoy,了解envoy越多,istio使用和理解越顺手。 48 | 49 | envoy在lb这一块,比nginx灵活易用太多,当然envoy项目也是站在后来者的视角上,更适合现在这种微服务架构吧。注意这里并不是说envoy可以取代nginx了,两者各有所长,所以两个我都用了😂。envoy做lb/observer,nginx做web/cache。 50 | 51 | BTW,envoy还代理了shadowsocks的服务,让它看起来就是一个标准的80/443端口web服务。这就很有意思了,感觉我可以专门写一篇envoy的文章了,嗯。 52 | 53 | 最后感谢Dropbox和Github提供的持久化存储,把复杂的东西弄简单。 54 | 55 | ## To Be Continued 56 | 57 | 好不容易活到2020年了,还没被消灭,还有很多事要做。 58 | 59 | 新的一年希望能沉淀,思考,记录更多。 60 | 61 | ## Acknowledgments 62 | 63 | 题图来自[推特](https://twitter.com/dexhorthy/status/856639005462417409) 64 | 65 | ## EOF 66 | 67 | ```yaml 68 | summary: 上周末,整了个k8s,写了个一键部署脚本 69 | weather: fine 70 | license: cc-40-by 71 | location: 22, 114 72 | background: k8s-as-a-car.jpg 73 | tags: [k8s, envoy] 74 | date: 2020-01-13T23:48:08+08:00 75 | ``` 76 | -------------------------------------------------------------------------------- /articles/2020/move-to-kubernetes/README.org: -------------------------------------------------------------------------------- 1 | #+OPTIONS: toc:nil 2 | * Move to Kubernetes 3 | 上个周末,在个人服务器上整了个Kubernetes,把原来所有基于Docker的服务切换到了k8s上。没错,你现在浏览的页面,powered by k8s😬 4 | 5 | favicon换了个emoji,感觉又年轻了一些:) 6 | 7 | ** Why 8 | 为毛把这小破网站挂在k8s上?这让我想起了在推上看到这图,一种大炮打蚊子赶脚: 9 | 10 | [[file:k8s-as-a-car.jpg][k8s-as-a-car]] 11 | 12 | hmmm,其实这也不是本意。原来免费的GCE账号到期了,一些重要的服务还是得继续,于是室友给了我他的新注册的Google账号,继续白嫖一年。。。 13 | 14 | 原来的服务是基于=docker-compose=的,使用乞丐版套餐,micro,只有600M内存。这样剩下的赠金就能都花在流量上,GCE上出站中国的流量是最贵的。然鹅这回600M内存的却很难把所有的服务跑起来,不是Dropbox起不来就是容器启动的时候各种OOM。 15 | 16 | 多次尝试无果后只能转向1.6G内存的plan了,但是想了一下,这些服务用这么多资源又浪费,要不整个单节点Kubernetes算了,这不,最近搭了好几个私有云下的集群。 17 | 18 | 说干就干。 19 | ** How 20 | 现在搭建k8s已经很容易了,尤其是在没有网络的问题的国外。别看机器配置小,其实有1G内存就可以,当然这样可以运行的pod不会多,但是对于个人站点来说,没啥鸭梨。 21 | 22 | 先前试过ubuntu官方出一个[[https://microk8s.io/][MicroK8s]]项目,但是体验不好,所以最终还是使用了更纯正的[[https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/][kubeadm]]。虽说kubeadm要求每节点最低配置2CPU,2G内存,但是这些preflight check忽略掉就行了,加上选项=ignore-preflight-errors=NumCPU=,不出意外单节点的集群就建好了。在这过程中写了一个一键安装docker和k8s的[[https://gist.github.com/longkai/e1f57d5612e86957e5b5c51f120c5a95][脚本]],在GCE上多次测试通过,感兴趣可以了解下。 23 | 24 | 最后把原来docker的运行参数改成k8s的各种资源,最终的服务是这个样子的(亮点自寻👻) 25 | 26 | #+begin_src sh 27 | $ kubectl get svc | awk '{ print $1 }' 28 | NAME 29 | envoy-ingress 30 | essays 31 | kubernetes 32 | nginx 33 | omnifocus 34 | shadowsocks-libev 35 | #+end_src 36 | ** Results 37 | #+begin_quote 38 | Learning by doing. 39 | #+end_quote 40 | 41 | 把服务丢在k8s上后,对于这个站点,其实就感觉就是更现代了些。当然后面可玩性也多了,能尝试更多新的东西。 42 | 43 | 比如我们在生产环境使用[[https://istio.io/][istio]]做微服务网格,但是这配置肯定带不动。istio网络相关的特性其实依靠Lyft的[[https://www.envoyproxy.io/][Envoy]]项目,于是可以直接部署了一个envoy服务作为ingress gateway。在这个过程中,你会发现istio的virtual service都是对envoy配置的封装。某些时候,istio配置无法满足业务需求时,我们就需要使用=EnovyFilter=去和envoy打交道了。这需求其实很常见,比如pod需要得到remote的real ip,或者希望在envoy sidecar中直接提供=GRPC-JSON Transcoder=的能力(这样就不用再多加一个没什么意义的grpc-gateway容器)。这些功能都需要直接撸envoy,了解envoy越多,istio使用和理解越顺手。 44 | 45 | envoy在lb这一块,比nginx灵活易用太多,当然envoy项目也是站在后来者的视角上,更适合现在这种微服务架构吧。注意这里并不是说envoy可以取代nginx了,两者各有所长,所以两个我都用了😂。envoy做lb/observer,nginx做web/cache。 46 | 47 | BTW,envoy还代理了shadowsocks的服务,让它看起来就是一个标准的80/443端口web服务。这就很有意思了,感觉我可以专门写一篇envoy的文章了,嗯。 48 | 49 | 最后感谢Dropbox和Github提供的持久化存储,把复杂的东西弄简单。 50 | ** To Be Continued 51 | 好不容易活到2020年了,还没被消灭,还有很多事要做。 52 | 53 | 新的一年希望能沉淀,思考,记录更多。 54 | ** Acknowledgments 55 | 题图来自[[https://twitter.com/dexhorthy/status/856639005462417409][推特]] 56 | ** EOF 57 | 58 | #+BEGIN_SRC yaml 59 | summary: 上周末,整了个k8s,写了个一键部署脚本 60 | weather: fine 61 | license: cc-40-by 62 | location: 22, 114 63 | background: k8s-as-a-car.jpg 64 | tags: [k8s, envoy] 65 | date: 2020-01-13T23:48:08+08:00 66 | #+END_SRC 67 | -------------------------------------------------------------------------------- /articles/2020/move-to-kubernetes/k8s-as-a-car.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/move-to-kubernetes/k8s-as-a-car.jpg -------------------------------------------------------------------------------- /articles/2020/network-proxy-and-k8s-network/README.md: -------------------------------------------------------------------------------- 1 | 2 | # 浅谈网络代理和 Kubernetes 网络模型 3 | 4 | 作为这一系列的第二篇,今天来谈谈作者比较感兴趣的一个主题,网络代理。 5 | 6 | 代理可以类比是现实生活中的各种中介吧,网络代理则与我们日常网上活动息息相关。客户端不是直接和服务端通信,而是经过中间的一个代理服务器的转发处理,这中间相当有一个用户定义的函数可以对进出的流量干点什么,一个网络请求在传输中很可能不只经过一个代理服务器。 7 | 8 | ![img](proxy.png "proxy") 9 | 10 | 很难想象没有代理,我们的网络会是什么样子,隐私,安全,性能,以及绕过防火墙,甚至于构建大规模的分布式系统。 11 | 12 | 限于时间和篇幅,本文介绍一些理论的东西,下一篇会实践一些这方面的有用且有趣的东西。 13 | 14 | OK,说了这么多,先粗浅地聊聊网络模型。 15 | 16 | 我们知道,网络的实现TCP/IP是四层的,而在设计上则通常使用[OSI七层模型](https://zh.wikipedia.org/wiki/OSI%E6%A8%A1%E5%9E%8B)描述。七层模型自顶向下,功能及其常见协议简要如下: 17 | 18 | | layer | function | protocols | 19 | |----- |------------ |--------------- | 20 | | 应用层 | 某类应用具体的业务逻辑 | http,ssh, mysql | 21 | | 表示层 | 转换应用层的数据,如加密 | tls | 22 | | 会话层 | 会话管理 | socks5 | 23 | | 传输层 | 两个主机间的数据传输 | tcp, udp | 24 | | 网络层 | 数据包在不同网络间的移动 | ip, icmp, igmp | 25 | | 链路层 | 直连节点间数据交换 | 以太网,Wi-Fi,蓝牙 | 26 | | 物理层 | 网络设备和物理传输介质 | NaN | 27 | 28 | 上层的数据向前追加下一层的协议信息封帧,一路向南,最后经由物理传输介质(比如光缆),这样数字信息就在物理世界中传输了。而我们今天谈论的主角,网络代理理论上可以工作在任一层(物理层目测不行),但是按照功能和通用性,常见的代理工作在L2/3/4/7,这也是TCP/IP在七层中的对应。越往下,代理提供的功能越单一,毕竟底层了解的信息相对较少。按照功能,有时候也叫负载均衡,本文统一称之为代理。 29 | 30 | L2常见的代理是[网桥](https://zh.wikipedia.org/wiki/%E6%A9%8B%E6%8E%A5%E5%99%A8),或者[交换机](https://zh.wikipedia.org/wiki/%E7%B6%B2%E8%B7%AF%E4%BA%A4%E6%8F%9B%E5%99%A8),不同主机的网卡连接到同一个网桥上,主机间就可以直接连通了,网桥就是实实在在的一个代理,我们可以网桥内部增加一些代码,比如根据根据MAC的地址规则进行转发([ARP Proxy](https://en.wikipedia.org/wiki/Proxy_ARP))或者广播隔离([VLAN](https://zh.wikipedia.org/wiki/%E8%99%9A%E6%8B%9F%E5%B1%80%E5%9F%9F%E7%BD%91)),但这样的功能局限在局域网,通常会配合L3一同工作。Kubernetes的flannel网络插件便是采用这种方式集群里所有的节点和容器连通(Overlay Network)。每个节点上的Pod都有一个虚拟网卡(veth)并连接到该节点上的同一个网桥(cni0)中,Pod里数据包统一通过网桥发送到Fannel.1([VTEP](https://zh.wikipedia.org/wiki/%E8%99%9B%E6%93%AC%E5%B1%80%E5%9F%9F%E7%B6%B2%E6%93%B4%E5%B1%95)设备)中,通过VXLAN内核模块和etcd里存储的目的MAC/IP映射信息,将数据包封帧为一个UDP数据包,透过宿主机的网卡发往目的主机的Pod。看起来像是所有的节点和容器都是2层连通的。 31 | 32 | ![img](l2-fannel.png "layer2 proxy") 33 | 34 | L3常见的代理是路由器,用来在不同的网络间转发数据包,因此路由器通常放置于两个网络的边界相互连接。L3最重要的信息便是源和目的IP地址,有了这俩信息,我们可以就可以根据路由策略把原本是A到B的转发到C上(DNAT),或者将源地址改成B(SNAT),甚至丢弃这个数据包(防火墙)。对比2层代理,3层适用范围就大多了。家里多个设备连接到路由器都可以上网(通常配合L4的NAPT使用),就使用[NAT](https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2)技术,这极大地缓解了IPv4地址短缺的问题(某种意义上也一再推迟了IPv6的部署)。一个比较实用的例子就是透明代理(TPPROXY),比如在路由器对非大陆的目的IP统统转发到一个中间无障碍代理服务器,这样就加速了境外网站的访问,而这对客户端是透明的,完全不需要做什么配置(当然路由配置还是要的),也意识不到其实已经走了代理。Kubernetes也有对应3层网络方案,如calico,每一个Pod都有一个虚拟IP,当节点A的Pod(IP1)想访问节点B的Pod(IP2)时,通过cni插件设置的路由规则,将其发送到某个中间路由设备上,最后到达节点B,看起来所有的节点和Pod都是3层连通的(IP都可以ping通)。 35 | 36 | ![img](l3.png "layer3 proxy") 37 | 38 | L4常见代理有NAPT,[LVS](https://zh.wikipedia.org/wiki/Linux%E8%99%9A%E6%8B%9F%E6%9C%8D%E5%8A%A1%E5%99%A8)。4层重要信息有源目的端口和tcp状态,配合3层的源目的IP,就可以进行传输层代理,或者说负载均衡了。比如目的是ip1:port1,会转发到[ip2:port2, ip3:port3, …]中的一个。在Kubernetes中的Service实际上就是一组Pod的负载均衡,service提供一个稳定的虚拟IP,指向一组Pod的IP(不稳定)和端口(Endpoints),每当有流量请求service的IP:port,按照轮询的方式将流量导入到某个Pod中。具体实现则是通过kube-proxy组件在宿主机节点上设置各种iptalbes规则(NAT,NAPT,端口转发等)实现(也可以使用LVS实现)。 39 | 40 | ![img](l4.png "layer4 proxy") 41 | 42 | L7的Web则是我们最最常见的代理了,这一层是具体的应用层,持有的信息很多,可以读取消息中的内容来做决策,根据策略可以做很多事情,因此L7代理根据功能有很多别名,如负载均衡,缓存,[WAF](https://en.wikipedia.org/wiki/Web_application_firewall),TLS [termination](https://en.wikipedia.org/wiki/TLS_termination_proxy)/[origination](https://istio.io/docs/tasks/traffic-management/egress/egress-tls-origination/),gateway,正/反向代理,鉴权等。可以根据`Host`头和URL进行反向代理(工作在服务端),也可以对明文的HTTP加上TLS的正向代理(工作在客户端),还可以对请求URL路由到其他的服务,不一而足。 43 | 44 | ![img](l7.png "layer7 proxy") 45 | 46 | 好了,说了这么多,用那个好呢? 47 | 48 | 越底层的性能越好,也更通用,但是由于持有信息太少了,所以扩展性和易用性不如上层。 49 | 50 | 这个问题可以类比为存储中间件,我们有关系数据库,文档数据库,缓存,消息队列,倒排索引,对象存储这些选项。每个都各有千秋,关键在于我们业务的使用方式,只用一种存储通常是不够的。 51 | 52 | 比如在一个Kubernetes集群中,我们会给service配置一个外部的LoadBalancer(L3)或者NodePort(L4);在我们的业务ingress gateway中,我们会使用L7代理进行各种策略,路由,TLS剥离,鉴权,熔断等;而Kubernetes集群本身网络则组合使用L2/3连通。 53 | 54 | 虽然网络将不同的机器连接在了一起使之能相互通信,这是分布式系统的基石之一。但是网络是不确定的,数据包可能丢失,可能无法连通,可能无序,也可能重发,超时,各种问题,所以在设计分布式系统的时候,要具有容错性,就算部分网络分区出错,整体功能仍然可用([CAP](https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86)的P)。 55 | 56 | 说的比较浅,自己也仅仅是比较浅的认知,后续有机会和时间应该会找几个方面深入地去研究并写一些东西。涉及到的东西比较多,有不对的地方欢迎提出指正。 57 | 58 | 图片均来自网络。 59 | 60 | ## EOF 61 | 62 | ```yaml 63 | summary: 浅谈网络代理和k8s的网络,包括L2/L3/L4/L7 64 | weather: hot 65 | license: cc-40-by 66 | location: mars 67 | background: ./proxy.png 68 | tags: [network, k8s] 69 | date: 2020-05-08T00:52:00+08:00 70 | ``` 71 | -------------------------------------------------------------------------------- /articles/2020/network-proxy-and-k8s-network/l2-fannel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/network-proxy-and-k8s-network/l2-fannel.png -------------------------------------------------------------------------------- /articles/2020/network-proxy-and-k8s-network/l3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/network-proxy-and-k8s-network/l3.png -------------------------------------------------------------------------------- /articles/2020/network-proxy-and-k8s-network/l4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/network-proxy-and-k8s-network/l4.png -------------------------------------------------------------------------------- /articles/2020/network-proxy-and-k8s-network/l7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/network-proxy-and-k8s-network/l7.png -------------------------------------------------------------------------------- /articles/2020/network-proxy-and-k8s-network/proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/network-proxy-and-k8s-network/proxy.png -------------------------------------------------------------------------------- /articles/2020/tls-termination-and-origination/docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/tls-termination-and-origination/docker.png -------------------------------------------------------------------------------- /articles/2020/tls-termination-and-origination/origination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/tls-termination-and-origination/origination.png -------------------------------------------------------------------------------- /articles/2020/tls-termination-and-origination/termination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/tls-termination-and-origination/termination.png -------------------------------------------------------------------------------- /articles/2020/tls-termination-and-origination/wx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2020/tls-termination-and-origination/wx.png -------------------------------------------------------------------------------- /articles/2021/go1.16-io-fs/README.org: -------------------------------------------------------------------------------- 1 | * go1.16 io/fs 2 | 3 | Content goes here... 4 | 5 | ** EOF 6 | 7 | #+BEGIN_SRC yaml 8 | summary: 9 | weather: 10 | license: cc-40-by 11 | location: 12 | background: 13 | tags: [tag1, tag2] 14 | date: 2021-04-12T21:20:27+08:00 15 | #+END_SRC 16 | -------------------------------------------------------------------------------- /articles/2021/go1.16-io-fs/go.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2021/go1.16-io-fs/go.jpeg -------------------------------------------------------------------------------- /articles/2021/how-does-go-handle-http-request-timeout-and-cancel/README.org: -------------------------------------------------------------------------------- 1 | * how does go handle http request timeout and cancel 2 | 3 | Content goes here... 4 | 5 | ** EOF 6 | 7 | #+BEGIN_SRC yaml 8 | summary: 9 | weather: 10 | license: cc-40-by 11 | location: 12 | background: 13 | tags: [tag1, tag2] 14 | date: 2021-04-06T19:56:49+08:00 15 | #+END_SRC 16 | -------------------------------------------------------------------------------- /articles/2021/how-does-go-handle-http-request-timeout-and-cancel/debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2021/how-does-go-handle-http-request-timeout-and-cancel/debug.png -------------------------------------------------------------------------------- /articles/2021/how-does-go-handle-http-request-timeout-and-cancel/go-http-timeout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2021/how-does-go-handle-http-request-timeout-and-cancel/go-http-timeout.png -------------------------------------------------------------------------------- /articles/2021/sync-loop/README.org: -------------------------------------------------------------------------------- 1 | * sync loop 2 | 3 | Content goes here... 4 | 5 | ** EOF 6 | 7 | #+BEGIN_SRC yaml 8 | summary: 9 | weather: 10 | license: cc-40-by 11 | location: 12 | background: 13 | tags: [tag1, tag2] 14 | date: 2021-04-08T20:40:29+08:00 15 | #+END_SRC 16 | -------------------------------------------------------------------------------- /articles/2021/sync-loop/android-k8s.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2021/sync-loop/android-k8s.jpeg -------------------------------------------------------------------------------- /articles/2021/sync-loop/android-loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2021/sync-loop/android-loop.png -------------------------------------------------------------------------------- /articles/2021/sync-loop/anr.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2021/sync-loop/anr.jpeg -------------------------------------------------------------------------------- /articles/2021/thoughts-on-contributing-github/README.md: -------------------------------------------------------------------------------- 1 | # 给GitHub做了点微小的贡献和思考 2 | 3 | ![result](result.png) 4 | 5 | 不知道你有没有注意到,现在在GitHub上查看*Protocol Buffer*源码时,含有*gRPC*的部分已经能显示高亮了。 6 | 7 | 什么,难道不应该是这样吗?或许你觉得这是理所当然的,也许你很少在GitHub上浏览`.proto`源码,这个功能确实是最近才加上的。并且,刚好,这个特性是我加上去的。 8 | 9 | ## 缘由 10 | 最近的工作内容有很大一部分是将一些组件云原生化,涉及到不少开源的东西,比如Helm,Grafana,Envoy等,大体上是将他们先用Helm打包,然后通过定义CRD集成到Operator中,再写一些运维相关的逻辑。 11 | 12 | 由于不少东西也不熟悉,所以这个过程中,需要经常查阅他们的文档,甚至是代码,时而会发现一些拼写错误,或者不合理可以改进的地方,以及少数体验上的问题。于是顺手就在GitHub上提issue或者pr。这篇讨论的就是其中感受最深的一个。 13 | 14 | gRPC是目前在云原生领域使用比较广泛的技术了,很多项目通过proto来定义服务的接口,然后通过网关接收外部的RESTful-JSON的请求调用。所以想要调用某个服务的API,查看他proto的gRPC就比较直接。 15 | 16 | 某天在GitHub查看Envoy的xDS接口的`.proto`文件时,突然发现那块代码居然没有高亮,全是一团黑漆漆的,对比编辑器里有语法高亮的看起来太难受了,都2021年,怎么就没人注意到呢?于是就在GitHub官方的[linguist](https://github.com/github/linguist)仓库上提了一个feature request的[issue](https://github.com/github/linguist/issues/5334)。 17 | 18 | 没过多久,GitHub的人就给了回复。比较详细的解释了原因,由于GitHub上有众多的语言需要高亮,他们都是利用社区已有的语法高亮代码来做,也就是说每个语言都有一个对应开源的语法高亮的仓库,而GitHub做的就是一个支持各种语言的框架和syntax repo list维护的工作,定期更新。而proto的语法高亮仓库,已经很久没有更新,不活跃了。并且建议我去拿[vscode的语法高亮](https://github.com/zxh0/vscode-proto3)更新下,做做贡献。 19 | 20 | 给这位大佬点赞,反馈快,信息量很足,给明了指引。看了下文档,写得很清晰,虽然我不懂*ruby*,但是跟着文档,不需费多大劲也能完成,于是当天晚上就加了加班,把[pr](https://github.com/github/linguist/pull/5336)发了出去。 21 | 22 | 很快,第二天大佬就[`lgtm`](https://www.jianshu.com/p/238a1e1f4037)把pr合并了,并且告诉我刚好错过了4月的月更,需要到下个月了。 23 | 24 | 于是最近大家看到了更新后的效果。 25 | 26 | ## 一些思考 27 | 我们都说Github的体验很好,除了它几乎已经是所有开源项目托管的地方,以及网页细节做得好,还有很大一部分原因是在对待开发者这件事上。如果仅仅是作为`git push`和`git clone`的一个远程仓库,那GitHub肯定不是今天的GitHub。 28 | 29 | GitHub在的远程托管的基础上,做了很多对开发者友好的工具,软件开发流程整个生命周期几乎都有,而且细节上体验上都很好,甚至是你还可以通过API接口来满足个性化的需求。 30 | 31 | 比如README Markdown的渲染,我一直觉得,是GitHub把Markdown这种写作方式给流行了起来,到目前为止,它所渲染的效果也是最棒的。在此基础上,推出了GitHub pages,给了项目一个介绍,文档的静态页面,当然有的人直接拿它来做个人blog,你也可以提供自己的域名解析。更有甚者利用这个特点,来分发软件源,比如helm,maven。去年GitHub还加入了README个人主页,也是一个玩出花的功能。 32 | 33 | 还有GitHub的核心功能,*issue*和*Pull Request*,也许正是这两个功能,重新定义了现代开源软件的开发方式,让更多的人参与进来。使用者可以针对bug,功能,文档等等提出issue,然后通过pull request的方式贡献代码,code review,整个社区的人都可以参与(当然有一些我们只能边缘ob学习),CI/CD,最后merge到主仓库。GitHub做了很多细节上的优化,比如code review的diff查看,与CI/CD的集成,还有很多自动化流程的机器人,有时候参与这些*现代化*的开发方式还是有趣并且能学到很多。 34 | 35 | 最后谈谈GitHub的API,projects,issues,pull requests,actions等等功能都可以通过API调用,使得用户可以根据项目自身需要定制化集成。以前可能觉得好厉害,放到如今也算是一个产品的标配了。虽然现在很多平台都提供了API接口,但是体验怎么样,真的好用吗,符合标准习惯吗,使用心智负担高吗,文档靠谱吗,兼容性考虑了吗,真的替开发者考虑了吗?**又不是不能用**,懂的都懂。 36 | 37 | 想了想,作为一个为开发者服务的平台,除了稳定地提供平台应有的功能,不断地提升用户体验,还应该有一个更**善良**的出发点,引导用户成长,与用户共同进步。这也是腾讯的价值观,**用户为本,科技向善**的一种体现。作为平台方,在提供技术产品的同时,有责任输出一些好的标准的技术,最佳实践甚至一些工程师文化,能够让用户学到些东西;反过来,用户也能在使用过程中,提出一些改进的意见甚至贡献,这样就更好了。 38 | 39 | GitHub API就是这样一个非常好的例子: 40 | 41 | > GitHub announced a public API one month after the site launched. We’ve evolved this platform through three versions, adhering to RFC standards and embracing new design patterns to provide a clear and consistent interface. We’ve often heard that our REST API was an inspiration for other companies; countless tutorials refer to our endpoints. 42 | 43 | 上面这段话摘录在其官方博客[The GitHub GraphQL API](https://github.blog/2016-09-14-the-github-graphql-api/)。Github在迭代API的时候始终遵守标准和新的设计模式去提供清晰一致的接口,这启发了很多公司的API设计,很多教程都参考了他们的API。 44 | 45 | 确实如此,每次使用他们的API都有一种*愉悦*的体验,授之以鱼(解决问题),又授之以渔(提供启发)。一些命名风格,HTTP协议的细节,还有一些设计上的考量。以至于当你在设计API时,有时候也会突然想去那取经。 46 | 47 | 其实第一节的叙述,也从另一方面佐证了GitHub的成功,与开源社区(主要用户)互相成就。GitHub上绝大多数都是开源项目,然后GitHub本身也是建立在众多开源项目上的(实际上今天所有的项目都受益于开源)。就拿代码语法高亮来说,用户提出了一个合理的功能需求,它反馈很**及时**和**友好**,提供了足够有用的信息和解决方案,不是排期让内部员工去实现,而是鼓励用户(开发者)去做贡献,用户本身也是一群创作者。用户也乐于去做这件事(这里面会有成就感以及学到东西),细节体验更好了,更多用户受益了,平台自然也就越来越好了。 48 | 49 | 得开发者得天下,这就是它成功的原因吧。Linux如此,Android/iOS如此,GitHub也一样。 50 | 51 | ## EOF 52 | 53 | ```yaml 54 | summary: 作为一个为开发者服务的平台,除了稳定地提供平台应有的功能,不断地提升用户体验,还应该有一个更**善良**的出发点,引导用户成长,与用户共同进步。 55 | weather: fine 56 | license: cc-40-by 57 | location: Tencent Building 58 | background: result.png 59 | tags: [Open Source, Github, Thoughts] 60 | date: 2021-06-06T21:22:34+08:00 61 | ``` 62 | -------------------------------------------------------------------------------- /articles/2021/thoughts-on-contributing-github/result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2021/thoughts-on-contributing-github/result.png -------------------------------------------------------------------------------- /articles/2022/fix-yaml-multi-line-format/photo-1470252649378-9c29740c9fa8.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2022/fix-yaml-multi-line-format/photo-1470252649378-9c29740c9fa8.jpeg -------------------------------------------------------------------------------- /articles/2022/kubernetes-yaml-formatter/README.md: -------------------------------------------------------------------------------- 1 | # 上架了一个 vscode 插件 2 | 3 | 插件市场的地址在[这里](https://marketplace.visualstudio.com/items?itemName=kennylong.kubernetes-yaml-formatter),先上一下效果吧: 4 | 5 | ![Format YAML](showcase.gif) 6 | 7 | 作为一个后端工程师,平时没少接触DevOps工具,比如 Kubernetes,Ansible Playbooks,CI/CD pipeline 等等,而这些通常使用YAML格式来作为描述语言。每天都会接触到或多或少yaml文件,不开玩笑的说,有些时候也算个YAML工程师了。 8 | 9 | 如果你也觉得是这样,那这个插件很可能对你有用。 10 | 11 | 拿k8s的YAML来举个栗子: 12 | 13 | ```yaml 14 | apiVersion: apps/v1 15 | kind: Deployment 16 | metadata: 17 | name: nginx-deployment 18 | spec: 19 | selector: 20 | matchLabels: 21 | app: nginx 22 | replicas: 2 23 | template: 24 | metadata: 25 | labels: 26 | app: nginx 27 | spec: 28 | containers: 29 | - name: nginx 30 | image: nginx:1.14.2 31 | ports: 32 | - containerPort: 80 33 | ``` 34 | 35 | 不知道你注意到没有,对于序列(sequence)类型(`containers`和`ports`),k8s采用的是**无缩进**的风格。每当使用[kubectl](https://kubernetes.io/docs/reference/kubectl/)命令去操作(get/edit等等)资源时,都是不带缩进的。更不用说像[kustomize](https://github.com/kubernetes-sigs/kustomize)这样的工具还会[强制](https://github.com/kubernetes-sigs/kustomize/issues/3946)你这么做。 36 | 37 | 不幸的是,vscode内置的YAML格式化插件有着它自己的[哲学](https://prettier.io/docs/en/option-philosophy.html)。它**始终会缩进**并且[拒绝提供一个选项](https://github.com/prettier/prettier/issues/12385)来满足上述场景。 38 | 39 | 所以默认插件就没啥用了。我不得不自己去手动处理缩进,否则会两边风格不统一,看起来怪怪的很不舒服。 40 | 41 | 重复这过程很乏味,尝试了其他插件也无果,所以我写了这么个插件来让世界变得更美好一点点。现在你可以自由地控制想要什么样的风格。 42 | 43 | 过程中感谢好朋友[陆鹏鹏](https://github.com/iamlupeng1991)帮忙设计了icon。 44 | 45 | 当然必须还有开源社区,本质上这插件是[google/yamlfmt](https://github.com/google/yamlfmt)的一个封装,在使用的过程中发现一些问题,然后提了PR,review合并到上游,最后用Github Actions自动发布,这其中的学习和实践体验很棒。 46 | 47 | 也欢迎同学们的贡献或者建议,希望它能够帮助到你:) 48 | 49 | ## EOF 50 | 51 | ```yaml 52 | summary: 写了个vscode插件,如果同学们平常接触k8s这类的DevOps工具比较多,应该会有帮助。 53 | weather: hot 54 | license: cc-40-by 55 | location: Guilin 56 | background: ./cover.jpeg 57 | tags: [k8s, vscode, DevOps] 58 | date: 2022-09-30T19:30:00+08:00 59 | ``` -------------------------------------------------------------------------------- /articles/2022/kubernetes-yaml-formatter/cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2022/kubernetes-yaml-formatter/cover.jpeg -------------------------------------------------------------------------------- /articles/2022/kubernetes-yaml-formatter/showcase.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2022/kubernetes-yaml-formatter/showcase.gif -------------------------------------------------------------------------------- /articles/2022/more-than-k8s/photo-1439405326854-014607f694d7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/articles/2022/more-than-k8s/photo-1439405326854-014607f694d7.jpeg -------------------------------------------------------------------------------- /learning/go/get-started/README.md: -------------------------------------------------------------------------------- 1 | go lang 初探 2 | ============ 3 | 4 | ## 安装 5 | 请参考官方文档或者google 6 | 7 | ## 设置GOPATH变量 8 | ### GOPATH变量是指自己的代码库的目录。go约定所有的代码都必须按照开源代码的目录放置,不管你是否开源还是不开源。位置是任意的,假设我们把代码库放到``~/src/go``下,那么就把``export GOPATH=~/src/go``即可,当然你也可以有多个src目录,需要的时候改变一下GOPATH就行啦。 9 | 10 | ### 接下来,看看go约定的目录结构 11 | ``` 12 | $GOPATH 13 | src/ 14 | bin/ 15 | pkg/ 16 | ``` 17 | 其中,``src``指的是源代码存放目录,``bin``表示go构建的可执行文件目,``pgk``就有点像第三方或者自己的依赖(像maven仓库) 18 | 19 | ### 建立自己的源码目录 20 | go要求开源代码的目录放置,那么假设你有一个github帐号,那么``github.com/userid``就是你的源码根路径,加起来就是``$GOPATH/src/github.com/longkai/`` 21 | 22 | ## 构建第一个go项目 23 | ### 建立项目目录 24 | 假设项目名叫hello,那么 25 | ```sh 26 | # 进入你的源码目录,建立项目 27 | $ cd $GOPATH/src/github.com/userid 28 | $ mkdir hello 29 | $ vim hello.go 30 | # edit file 31 | ``` 32 | 最终的hello.go内容 33 | ```go 34 | package main 35 | 36 | import "fmt" 37 | 38 | func main() { 39 | fmt.Println("Hello, World!") 40 | } 41 | ``` 42 | 43 | 接下来,你可以在hello目录下键入``go install``或者任意目录``go install github.com/userid/hello``。如果shell没有任何输出,就表示执行成功了。接下来,在``$GOPATH/bin``目录下后生成hello的可执行文件,为了方便以后的工作,强烈建议把``$GOPATH/bin``假如到环境变量中!执行``export PATH=$PATH:$GOPATH/bin``即可! 44 | 45 | 运行hello程序,就可以看到熟悉的东西啦! 46 | 47 | ## 创建自己的package 48 | package有点像java的package,是用来组织自己的源代码的。但是区别还是有的。go的package不要求和java那样必须和目录一致,也就是说像``/path/to/package``下的go源码文件,你的package name可以和package不一样(但是最好一样吧,比较好管理),但是同一个目录下的所有go源码的package必须一样(不包含子目录)。另外,main是一个特殊的package name,他表示生成的是可执行文件。 49 | 50 | 那么接下来我们以``go-test``目录新建一个lib 51 | 52 | ```sh 53 | $ mkdir -p $GOPATH/src/github.com/userid/go-test 54 | $ vim cal.go 55 | # edit file 56 | ``` 57 | 最终的文件 58 | ```go 59 | package cal 60 | 61 | func Add(a, b int) int { 62 | return a + b 63 | } 64 | 65 | func Minus(a, b int) int { 66 | return a - b 67 | } 68 | 69 | func Times(a, b int) int { 70 | return a * b 71 | } 72 | 73 | func Divide(a, b int) int { 74 | return a / b 75 | } 76 | ``` 77 | 测试以下~ 78 | 我们的测试文件,``cal_test.go``,名字也是约定必须以xx_test.go的字样! 79 | ```go 80 | package cal 81 | 82 | import "testing" 83 | 84 | func TestAdd(t *testing.T) { 85 | const a, b, result = 1, 2, 3 86 | if value := Add(a, b); value != result { 87 | t.Errorf("error!") 88 | } 89 | } 90 | 91 | func TestMinus(t *testing.T) { 92 | const a, b, result = 1, 2, -1 93 | if value := Minus(a, b); value != result { 94 | t.Errorf("error!") 95 | } 96 | } 97 | 98 | func TestTimes(t *testing.T) { 99 | const a, b, result = 1, 2, 2 100 | if value := Times(a, b); value != result { 101 | t.Errorf("error!") 102 | } 103 | 104 | func TestDivide(t *testing.T) { 105 | const a, b, result = 4, 2, 2 106 | if value := Divide(a, b); value != result { 107 | t.Errorf("error!") 108 | } 109 | } 110 | ``` 111 | 112 | 测试的func名也是约定的Test_FuncName(),接下来,与前面install类似,执行go test即可看到是否通过测试! 113 | 114 | 如果通过了测试,接下来再``go install``,没有输出任何信息的话就标识ok啦,在``$GOPATH/pkg/``下应该能找到和你的系统相关的lib了 115 | 116 | ## 调用刚才的lib 117 | ```sh 118 | # vim $GOPATH/src/github.com/userid/hello/hello.go 119 | # edit file 120 | ``` 121 | 最终的内容,这里我们没有使用和目录名意义的package name,其实是不太好的= = 122 | ```go 123 | package main 124 | 125 | import ( 126 | "fmt" 127 | "github.com/go-test" 128 | ) 129 | 130 | func main() { 131 | fmt.Printf("3+2=%d\n", cal.Add(3, 2)) 132 | } 133 | ``` 134 | 135 | 接下来,依照之前的构建方式``go install``,没有任何输出的话,运行hello就好了 136 | 137 | 另外,package下面还可以有子package,也是和刚才的类似的 138 | 139 | ## 从远程获取lib 140 | git的源代码目录非常的好处就是有利于整个go源代码的管理,你所有用到的代码都统一放到了``$GOPATH``下,比如你需要使用到``example.com/xxx``的源码,那么相应的目录就是``$GOPATH/src/example.com/xxx``,尤其适合git,hg这种版本控制系统!!! 141 | 142 | 用``go get ecamle.com/xxx/project``可以自动的下载远程版本库到你的$GOPATH中,很方便,不过前提是你得装有git,hg这些软件才行 143 | 144 | ## 抓取远程lib到本地进行构建 145 | 已刚才的hello项目为例,该项目已经push到了远程的github版本库。 146 | 147 | 首先,``go get github.com/longkai/go-test``,那么go-test这个源码会自动下载到你的本地,如果已经存在了的话就不用下载了,然后重新install刚才的hello项目即可! 148 | 149 | ## 说明 150 | 1. 这个笔记参考的是[官方的文档](http://golang.org/doc/code.html), 强烈大家看看这个文档!这里不详细。 151 | 2. 欢迎讨论,我的邮箱是im.longkai@gmail.com 152 | 153 | ### EOF 154 | ```yaml 155 | background: /assets/images/default.jpg 156 | hide: false 157 | license: cc-40-by 158 | location: Nanning 159 | summary: "" 160 | tags: 161 | - Campus 162 | - Golang 163 | weather: "" 164 | date: 2013-12-05T18:18:07+08:00 165 | ``` 166 | -------------------------------------------------------------------------------- /learning/gradle/basic-script/README.md: -------------------------------------------------------------------------------- 1 | Basic Script 2 | === 3 | 4 | Every thing in Gradle sits on top of two basic concepts: **project** and **tasks** 5 | 6 | 1. each gradle **build** is made up of one or more **projects** 7 | 2. each gradle **project** is made up of noe or more **task** 8 | 9 | ## a simple hello world of gradle task 10 | 11 | ```groovy 12 | task hello { 13 | doLast { 14 | println 'Hello, World!' 15 | } 16 | } 17 | ``` 18 | the shortcut of the above sample, as you can see below, it' s nicer than above 19 | 20 | ```groovy 21 | task << { 22 | println 'Hello, World!' 23 | } 24 | ``` 25 | 26 | 下面来简单的介绍一下gradle构建的基本语法。 27 | 28 | build.gradle 29 | ```groovy 30 | task << upper { 31 | String str = 'hello' 32 | println 'before: ' + str 33 | println 'after: ' + str.toUpperCase() 34 | } 35 | ``` 36 | 在shell中键入`gradle -q upper`就会得到下面的的结果: 37 | 38 | ``` 39 | before: hello 40 | after: HELLO 41 | ``` 42 | 43 | ## task的依赖 44 | 比如task b的运行必须依赖于task a的运行 45 | ```groovy 46 | task a << { 47 | println 'a' 48 | } 49 | 50 | task b(dependsOn: a) << { 51 | println 'b' 52 | } 53 | ``` 54 | 运行`gradle -q a`便会得到下面的结果 55 | ``` 56 | a 57 | b 58 | ``` 59 | 当然,并不是意为着a 一定到先于a申明,下面的例子说明了这一点 60 | ```groovy 61 | task a(dependsOn: 'b') << { 62 | println 'a' 63 | } 64 | 65 | task b << { 66 | println 'b' 67 | } 68 | ``` 69 | 这样也是可以的,但是如你所见,这样b就需要用引号括起来当作字符串看待,否则会报错的 70 | 71 | ## 默认的task 72 | 如果项目没有指定task,但是可以指定默认的task,比如在子项目中没有明确指出的话,可以继承父项目的task(如果父项目有的话) 73 | 74 | ```groovy 75 | defaultTasks: 'clean', 'run' 76 | 77 | task clean << { 78 | println 'clean...' 79 | } 80 | 81 | task run << { 82 | println 'run...' 83 | } 84 | 85 | task other << { 86 | ptinln 'othering...' 87 | } 88 | ``` 89 | 90 | ### EOF 91 | ```yaml 92 | background: /assets/images/default.jpg 93 | hide: false 94 | license: cc-40-by 95 | location: Nanning 96 | summary: "" 97 | tags: 98 | - Campus 99 | - Gradle 100 | weather: "" 101 | date: 2013-08-07T04:09:20+08:00 102 | ``` 103 | -------------------------------------------------------------------------------- /learning/gradle/build-lifecycle/README.md: -------------------------------------------------------------------------------- 1 | The Build Lifecycle 2 | ================== 3 | 4 | ## 构建的三个阶段 5 | > 1. 初始化(Gradle支持多项目的构建,在这个阶段gradle会决定哪些项目将会被纳入构建,并且为每个构建实例化Instance对象) 6 | > 2. 配置 7 | > 3. 执行(执行配置阶段中的task) 8 | 9 | ## settings文件 10 | 文件名必须是settings.gradle,它会在初始化阶段被执行。一个多项目的构建必须有一个settings文件。 11 | 12 | ## muilti-project需要记住的五点 13 | > 1. allprojects 14 | > 2. subprojects 15 | > 3. evaluationDependsOn 16 | > 4. evaluationDependsOnChildren 17 | > 5. project lib dependcency 18 | 19 | ### EOF 20 | ```yaml 21 | background: /assets/images/default.jpg 22 | hide: false 23 | license: cc-40-by 24 | location: Nanning 25 | summary: "" 26 | tags: 27 | - Campus 28 | - Gradle 29 | weather: "" 30 | date: 2013-08-07T22:12:46+08:00 31 | ``` 32 | -------------------------------------------------------------------------------- /learning/gradle/java-plugin/README.md: -------------------------------------------------------------------------------- 1 | The Java Plugin 2 | =============== 3 | 4 | java plugin给项目添加了java的编译,测试和打包等功能。它同时也是很多其他plugin的依赖。 5 | 6 | ## 使用 7 | 要使用java plugin,只需要在你的`build.gradle`中添加如下一行 8 | ```groovy 9 | apply plugin: 'java' 10 | ``` 11 | ## Tasks 12 | > 1. compileJava(使用javac编译src/main/java中的源代码) 13 | > 2. processResources(将src/main/resources中的资源文件复制到主程序编译后的类路径下) 14 | > 3. classes(compileJava+processResources) 15 | > 4. compileTestJava(使用javac编译src/test/java总的源代码) 16 | > 5. processTestResources (将src/test/resources中的资源文件复制到主程序编译后的类路径下) 17 | > 6. testClasses(compileTestJava+processTestResources) 18 | > 7. jar(将源代码打包成jar文件) 19 | > 8. javadoc(使用javadoc生成项目的javadoc) 20 | > 9. test(对项目进行单元测试,junit或者testng) 21 | > 10. uploadArchives(上传项目生成的可执行文件到在configuration指定的目录) 22 | > 11. clean(删除项目的build目录) 23 | > 12. cleanTaskName(删除特定命令生产了中间文件以及最终文件,比如cleanTest将会删除掉test过程中生成的文件) 24 | 25 | 对于每一个添加到项目中的源代码目录,java plugin添加了如下的task 26 | > 1. compileSourceSetJava(用javac编译给定的源代码目录) 27 | > 2. processSourceSetResources(复制资源文件到生成的主类目录) 28 | > 3. sourceSetClasses(前面两个相加) 29 | 30 | 此外,java plugin也添加了构建生命周期的task 31 | > 1. assemble(编译整个项目) 32 | > 2. check(检查项目) 33 | > 3. build (assenble+check) 34 | > 4. buildNeeded(对项目和此项目所有的依赖执行完成的构建) 35 | > 5. buildDependents(对项目和对于本项目有依赖的项目执行完整的构建) 36 | > 6. buildConfigurationName(使用特定的配置对项目进行构建) 37 | > 7. uploadConfigurationName(使用特定的配置上传项目) 38 | 39 | 下面是想各种tasks间的关系 40 | > ![taskrelationship](https://docs.gradle.org/current/userguide/img/javaPluginTasks.png) 41 | 42 | ## java plugin 的一些属性 43 | > 1. sourceSets 包括了项目的源代码 44 | > 2. sourceCompatibility 项目的兼容性 45 | > 3. targetCompatibility 项目编译时使用的jdk 46 | > 4. archivesBaseName 生成的项目名,默认是项目名.jar(.zip)等 47 | > 5. manifest jar文件里包含的manifest文件 48 | 49 | ### EOF 50 | ```yaml 51 | background: //docs.gradle.org/current/userguide/img/javaPluginTasks.png 52 | hide: false 53 | license: cc-40-by 54 | location: Nanning 55 | summary: "" 56 | tags: 57 | - Campus 58 | - Gradle 59 | weather: "" 60 | date: 2013-08-08T16:09:38+08:00 61 | ``` 62 | -------------------------------------------------------------------------------- /learning/http/web-servers/README.md: -------------------------------------------------------------------------------- 1 | Web Servers 2 | === 3 | ## Web Servers Come in All Shapes and Sizes 4 | A Web server processes HTTP request and servers responses. The term "web server" can refer either to web server software or to the particular device or computer dedicated to serving the web pages. 5 | 6 | ## Web Server Implementations 7 | Web Servers implement HTTP and the related TCP connection handling. 8 | 9 | ## Set up connection -- accept a client connection, or close if the client is unwanted. 10 | 11 | ### Handleing New Connections 12 | 13 | ### Client Hostname Identification 14 | Most Web servers can be configured to convert client IP address into client hostnames, using "reverse DNS". Since it slow down web transactions, ususaly disabled. 15 | 16 | ### Determing the Client User Through ident 17 | for security reason, it was deprecated. 18 | 19 | ## Receive request -- read an HTTP request message for the internet. 20 | 21 | ### Parsing 22 | When parsing the request message, the web server: 23 | 1. Parse the request line looking for the request method, the specified resource identifier(URI), and he version number, each separated by a single space, and ending with a carriage-return line-feed(CRLF) sequence. 24 | 2. Reads the message headers, each ending in CRLF 25 | 3. Detects the end-of-headers bland line, ending in CRLF(if present) 26 | 4. Read the request body, if any(length specified by the Content-Length header) 27 | 28 | ### Internal Representations of Messages 29 | Internal data structure that makes message easy to manipulate. 30 | 31 | ### Connection Input/Output Processing Architectures 32 | 1. Single-thread web servers 33 | 2. Multiprocess and Multithreaded web server 34 | 3. Multiplexed I/O servers 35 | 4. Multiplexed Multithreaded web servers 36 | 37 | ## Process request -- interpret the request message and take action. 38 | TODO 39 | 40 | ## Access resource -- access the resource specified in the message. 41 | 42 | ### Doctoots 43 | Like the File system 44 | 45 | ### virtually hosted doctoors 46 | Vitually hosted web servers host multiple web sites on the same web server, giving each site its own distinct document root on the server. 47 | 48 | The server can tell the web sites using the HTTP Host header, of from distinct IP addresses. 49 | 50 | ### User home directory doctoors 51 | ``GET /~bob/index.html HTTP/1.1`` 52 | 53 | ### Directory Listing 54 | A web servers can receive request for directory URLs, where the path resolves to a directory, not a file. There are three different action would be taken: 55 | 1. Return an error 56 | 2. Return a special, default, "index file" instead of the directory. 57 | 3. Scan the directory, and return an HTML page containing the contents. 58 | 59 | ### Dynamic Content Resource Mapping 60 | cgi-bin, java servlet, asp, etc. 61 | 62 | ### Server-Side Includes(SSI) 63 | 64 | ### Access Controls 65 | refer HTTP authentication 66 | 67 | ## Send response -- send the response back to the client 68 | For persistent Connections, the connection may stay open, in which case the server needs to be extra cautious to compute the Content-Length header correctly, or the client will have no way of knowing when a response ends. 69 | 70 | ## Construct response -- create the HTTP response message with the right headers. 71 | 72 | ### Response Entities(if there was a body) 73 | 1. A **Content-Type** header, describing the MIME type of the response body 74 | 2. A **Content-Length** header, describing the size of the response body 75 | 3. The actual message body content 76 | 77 | ### MIME Typing 78 | mime.types, Magic typing, Explicit typing, Type negotiation. Web servers also can be configured to associate particular files with MIME types. 79 | 80 | ### Redirection 81 | Permanently moved resources, Temporarily moved resources, URL augmentation, Load balancing, Server affinity, Canonicalizing directory names 82 | 83 | ## Log transaction -- place notes about the completed transaction in a log file. 84 | 85 | ### EOF 86 | ```yaml 87 | background: /assets/images/default.jpg 88 | hide: false 89 | license: cc-40-by 90 | location: Shenzhen 91 | summary: 'HTTP: The Definitive Guide' 92 | tags: 93 | - Web 94 | weather: "" 95 | date: 2015-09-26T12:31:18+08:00 96 | ``` 97 | -------------------------------------------------------------------------------- /learning/linux/ifcfg/README.md: -------------------------------------------------------------------------------- 1 | Linux 中网络的配置 2 | === 3 | 4 | ## 为什么配置静态IP很重要 5 | linux服务器下配置静态的IP是一项**非常重要而且基本**的操作。 6 | 7 | 如果网络配置不成功,那么linux在网络上很多优秀的软件和性能都无从谈起。 8 | 9 | 所以,今天我们就来谈论一下如何在linux服务器上配置**静态IP** 10 | 11 | ## 配置方式 12 | 我们以**Centos 6.3**为例,其他的distros大同小异。 13 | 14 | 输入如下命令: 15 | 16 | `vim /etc/sysconfig/network-scripts/ifcfg-eth0` 17 | 18 | 其中*eth0*指的是网卡号,你可以先使用`dmesg | grep 'eth'`去查看一下操作系统识别 19 | 到了那些网卡,然后根据识别到的网卡去选择ifcfg-xxx。 20 | 21 | 然后就是我们的配置的重点了: 22 | 23 | --- 24 | 25 | ```sh 26 | DEVICE="eth0" 27 | BOOTPROTO="none" 28 | HWADDR="08:00:27:ED:FF:CF" 29 | ONBOOT="yes" 30 | NM_CONTROLLED="no" 31 | TYPE="Ethernet" 32 | IPADDR=192.168.1.100 33 | NETMASK=255.255.255.0 34 | GATEWAY=192.168.1.1 35 | NETWORK=192.168.1.0 36 | BROADCAST=192.168.1.255 37 | MTU=1500 38 | ``` 39 | 40 | --- 41 | 下面来简单解释一下: 42 | 43 | *``DEVICE``* 表示网卡设备名称,这个要和ifcfg-**xxx**一致才行。 44 | 45 | *``BOOTPROTO``* 表示自动获得IP,这个我们当然不需要啦,填写**static**效果是一样的。 46 | 47 | *``HWADDR``* 表示网卡的MAC地址,只有一块网卡的时候可以省略,但是**最好填上**。 48 | 49 | *``ONBOOT``* 表示是否开机启动,是yes,否no。 50 | 51 | *``NM_CONTROLLED``* 是否允许图形界面配置网络参数,当然不需要。 52 | 53 | *``TYPE``* 网络类型。 54 | 55 | *``IPADDR``* IP地址。 56 | 57 | *``NETMASK``* 子网掩码。 58 | 59 | *``GATEWAY``* 默认网关,注意,**如果有多块网卡,那么只能配置一个**。 60 | 61 | *``NETWORK``* 网络。 62 | 63 | *``BROADCAST``* 广播地址。 64 | 65 | *``MTU``* 最大传输单元。 66 | 67 | --- 68 | 69 | 配置好之后,重启网络即可。 70 | 71 | `service network restart` 72 | 73 | 然后你可以查看一下是否OK 74 | 75 | `ifconfig eth0` 76 | 77 | > 实际上,最后三项可以不配置,``NETWORK``和``BROADCAST``可以由系统算出, 78 | > 至于``MTU``看看自己网络的实际情况了。 79 | 80 | ## 联系我 81 | >欢迎联系我,我的邮箱是im.longkai@gmail.com 82 | 83 | >longkai,2013-07-03 84 | 85 | ### EOF 86 | ```yaml 87 | background: /assets/images/default.jpg 88 | hide: false 89 | license: cc-40-by 90 | location: Nanning 91 | summary: "" 92 | tags: 93 | - Campus 94 | - Linux 95 | weather: "" 96 | date: 2014-01-13T23:33:00+08:00 97 | ``` 98 | -------------------------------------------------------------------------------- /learning/linux/linux-cmd-intro/README.md: -------------------------------------------------------------------------------- 1 | linux命令的基本说明 2 | =================== 3 | 4 | # 任何的linux都是以一种特定这种方式使用 5 | 6 | ```sh 7 | ls stdin stdout -file -- opt --help --version 8 | 9 | ls [options] [files] 10 | ``` 11 | 12 | 其中``[]``表示可选,替换里面的内容即可 13 | 14 | 下面说明这六个选项的功能(若受支持) 15 | 16 | ## stdin 17 | 命令从标准输入读取数据(如键盘) 18 | 19 | ## stdout 20 | 命令将数据送到标准输出(如屏幕) 21 | 22 | ## -file 23 | 1. 当用'-'符号代替**输入**文件名时,表示命令将从标准输入读取数据 24 | 2. 当用'-'符号代替**输出**文件名时,表示命令将向标准输出写入数据 25 | 26 | ```sh 27 | # wc命令分别从file1,标准输入,file2读取数据 28 | $ wc file1 - file2 29 | ``` 30 | 31 | ## -- opt 32 | 如果选项包括'--',则意味着选项到此结束,其后命令行出现的任何部分都不能作为选项 33 | 34 | ```sh 35 | # 查看'-file'文件的信息 36 | $ ls -- -file 37 | 38 | # 给ls命令添加file选项(实际上是不存在这个选项的) 39 | $ ls -file 40 | ``` 41 | 42 | ## --help 43 | 表示向该命令传递``--help``选项可以打印出其帮助信息 44 | 45 | ```sh 46 | # 查看ls的帮助信息 47 | $ ls --help 48 | ``` 49 | 50 | ## --version 51 | 表示向该命令传递``--version``选项可以打印其版本信息 52 | 53 | ```sh 54 | # 查看ls的版本 55 | $ ls --version 56 | ``` 57 | 58 | ## 注意事项 59 | 1. 以上某些情况下mac的终端并不适用,毕竟mac并不是linux 60 | 2. 以上的命令选项说明参考《linux口袋书(第二版)》,可能你需要查阅这本书才能查看某个命令是否支持上述的某些选项了:-) 61 | 62 | ### EOF 63 | ```yaml 64 | background: /assets/images/default.jpg 65 | hide: false 66 | license: cc-40-by 67 | location: Nanning 68 | summary: "" 69 | tags: 70 | - Campus 71 | - Linux 72 | weather: "" 73 | date: 2013-11-28T19:52:15+08:00 74 | ``` 75 | -------------------------------------------------------------------------------- /learning/linux/shell-useful-stuff/README.md: -------------------------------------------------------------------------------- 1 | sh的一些很有用但是易忽略的方面 2 | ================================ 3 | 4 | # 说明 5 | 这里说的易忽略,是由于我经常忘记或者一直依赖都不知道还有这茬=.= 6 | 7 | 感觉还是能够提示效率的,故在此记一记:-) 8 | 9 | ## 通配符 10 | 通配符不能匹配开头的``.``和文件夹分隔符``/`` 11 | 12 | 1. `*` 零个或者多个连续的字符 13 | 2. `?` 单个字符 14 | 3. `[set]` 出现在set中的任何单个字符 15 | 4. `[^set]` 任何在set中**未**出现的单个字符 16 | 5. `[!set]` 同^ 17 | 18 | ```sh 19 | # 查看fib.c 20 | $ ls -l f[aeiou]b.c 21 | ``` 22 | 23 | ## 花括号 24 | 含花括号的命令可以扩展为多个参数,以逗号分隔 25 | 26 | ```sh 27 | # 打印 hello.c hello.cpp hello.java 28 | $ echo hello.{c,cpp,java} 29 | ``` 30 | 31 | ## 输入/输出重定向 32 | sh可以将标准输入stdin,标准输出stdout,标准错误输出stderr重定向为文件。 33 | 34 | 也就是说,任何命令都可以使用``<``将输入数据来源从stdin重定向到文件。 35 | 36 | ```sh 37 | # 将cmd的标准输入重定向到file文件 38 | $ cmd < file 39 | 40 | # 将echo的输出从标准输出重定向到文件 41 | $ echo 'string' > file 42 | # 追加到文件末尾 43 | $ echo 'append' >> file 44 | 45 | # 将标准错误输出stderr重定向到文件并且标准输出打印在屏幕上 46 | $ cmd 2> file 47 | 48 | # 将stderr与stdout同时重定向到文件 49 | $ cmd > out 2> errr 50 | # 简化 51 | $ cmd >& out_and_error 52 | ``` 53 | 54 | ## 一些快捷键 55 | ``^ -> ctrl`` ``% -> alt`` 56 | 57 | 1. ^a 光标到行首 58 | 2. ^e 光标到行为 59 | 3. ^u 删除光标到行首的内容 60 | 4. ^k 删除光标到行尾的内容 61 | 5. ^w 删除光标前的一个单词 62 | 6. %d 删除光标后的一个单词 63 | 7. ^d 删除光标后的一个字符 64 | 8. ^h 删除光标前的一个字符 65 | 9. ^r 提供几个关键字,搜索历史命令并执行(重要) 66 | 10. %. 上一条命令的最后一个选项(esc+.同样效果) 67 | 68 | ### EOF 69 | ```yaml 70 | background: /assets/images/default.jpg 71 | hide: false 72 | license: cc-40-by 73 | location: Nanning 74 | summary: "" 75 | tags: 76 | - Campus 77 | - Linux 78 | weather: "" 79 | date: 2013-11-28T19:52:15+08:00 80 | ``` 81 | -------------------------------------------------------------------------------- /learning/vim/advanced-editing/README.md: -------------------------------------------------------------------------------- 1 | Advanced Editing 2 | === 3 | 4 | ## Customizing vi 5 | 6 | ### The :set command 7 | ``:set option`` to turn a toggle option on 8 | ``:set nooption`` to turn a toggle option off 9 | ``:set all`` display complete list of options 10 | ``:set option?`` find out the option by name 11 | ``:set`` shows options that you have specifically changed 12 | 13 | ### Executing Unix Commands 14 | ``:!command`` 15 | ``:(n)r !command`` 16 | 17 | ### Saving Commands 18 | ``:ab abbr phrase`` 19 | ``:unab abbr`` 20 | ``:ab`` 21 | 22 | ``:map x sqquence`` 23 | ``:unmap x`` 24 | ``:map`` 25 | 26 | the keys not used in command mode that available for user-defined commands: 27 | 1. Letters: g, K, q, V, v 28 | 2. Control kyes: ^A, ^K, ^O, ^W, ^X 29 | 3. Symbols: _, *, \, = 30 | 31 | 32 | ### EOF 33 | ```yaml 34 | background: /assets/images/default.jpg 35 | hide: false 36 | license: cc-40-by 37 | location: Shenzhen 38 | summary: "" 39 | tags: 40 | - Campus 41 | - Vim 42 | weather: "" 43 | date: 2015-09-27T15:03:12+08:00 44 | ``` 45 | -------------------------------------------------------------------------------- /learning/vim/global-replacement/README.md: -------------------------------------------------------------------------------- 1 | Global Replacement 2 | === 3 | 4 | ## Basic syntax 5 | ``:s/old/new`` changes the **first** occurrence of the pattern __old__ to __new__ on the current line. 6 | 7 | ``:s/old/new/g`` change **every** occurrence of __old__ to __new__ on the current line. 8 | 9 | ``:1,$s/old/new/g`` change every occurrence of __old__ to __new__ within the entire file. 10 | 11 | ``:%s/old/new/g`` % represents 1,$. 12 | 13 | ``.,+5s/old/new/g`` represents from the current line to the next five. 14 | 15 | ## Confirming Substitutions 16 | use ``/``, ``n`` and ``.`` is more useful when you not intent to replacement globally. 17 | 18 | ## Context-Sensitive Replacement 19 | ``:g/pattern/s/old/new/g`` This syntax lets you search for a pattern, and then, once you find the line with the pattern, make a substitution on a string different from the pattern. 20 | 21 | ### EOF 22 | ```yaml 23 | background: /assets/images/default.jpg 24 | hide: false 25 | license: cc-40-by 26 | location: Shenzhen 27 | summary: "" 28 | tags: 29 | - Campus 30 | - Vim 31 | weather: "" 32 | date: 2015-09-27T01:18:43+08:00 33 | ``` 34 | -------------------------------------------------------------------------------- /memories/2013/confused-hesitate/README.md: -------------------------------------------------------------------------------- 1 | 迷茫or犹豫? 2 | =========== 3 | 4 | 这三天连着考了3科,虽然还有3科,但是对于我来说已经结束了。 5 | 由于要去北京参加个比赛,所以后面3科都被缓考了。这缓考倒是缓了我一口气,不然这学期就真跪了-_- 6 | 根据不完全统计,下学期至少会补考3科(因为缓考后和补考的一起考),最多会补考7科-.-。 7 | 这是什么概念!!!已经学渣了吗? 8 | 9 | 或许在某些层面上,真的是这样,真的是这样。在某些学校,我早该被退学N+1了。可是你懂的,我在C大。 10 | 根据完全统计,本学期有3门课一节课没有上过,唯一的一次就是在考试的时候终于见到了老师的真容-.- 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 | (原文记不太清,意思相近)听多了没什么,现在感觉,真是多么符合现在的情况啊!哎! 50 | 51 | 我觉得,我似乎应该听从我自己内心的想法。 52 | 53 | 直接去就业?那么面对的是,社会经历一点也没有的我,投身到了这片汪洋中,面对着票子,房子,妹纸,车子,孩子等等的压力:-( 54 | 或许没有说的那么可怕,但是还是值得思考的。现在就业,估计就是码农了,根据我的情况和一些经历,工作应该很幸苦,而且各种现实的限制。 55 | 很多想法或许由于客观的环境原因,人事,物事等等而搁浅,这不是我想要的。 56 | 57 | 我想要的,现在就业不能满足,将来估计也比较难。 58 | 我想在我有生之年能赶上一波浪潮,甚至是站在浪潮之巅。 59 | 就像《浪潮之巅》一书中说的那样,人生这一辈子,能遇到多少到浪潮,更有多少人能够有幸赶上这浪潮, 60 | 给社会创造些什么,甚至是改变世界不枉此生呢? 61 | 我想和优秀的人才,优秀的环境,优秀的想法,优秀的团队一起,共同去做一回弄潮儿, 62 | 哪怕我只是一个幕后的低微的参与者,我也会尽我所能,为这波潮水增添激情! 63 | 64 | 这便是我的想法,回想乔布斯说,人生不带来,死不带走,就应该遵循自己的想法去活着。 65 | 若能赶上这波浪潮,此生足矣。 66 | 67 | 这便是我的想法。看起来不太实际,但是这是我的追求。 68 | 69 | 如果现在就业,估计就那样了吧,一天一天过,我很自信能把事情做好,但是这真的不是我想要的。 70 | 好的企业估计又挺难,这年头还是得看证书,看成绩,或者后门,官富xx的。 71 | 72 | 到一个有一流人才,一流环境,一流团队的地方去吧。 73 | 74 | 骚年,加油。 75 | 76 | ### EOF 77 | ```yaml 78 | background: ../xida.jpg 79 | hide: false 80 | license: cc-40-by 81 | location: Nanning 82 | summary: 迷茫还是犹豫?大四了,直接就业还是继续学习?是安定工作还是坚持自己内心的想法? 83 | tags: 84 | - Campus 85 | - Thoughts 86 | weather: "" 87 | date: 2013-07-06T01:33:20+08:00 88 | ``` 89 | -------------------------------------------------------------------------------- /memories/2013/how-pain-it-is/README.md: -------------------------------------------------------------------------------- 1 | 多么痛的领悟 2 | ============ 3 | 4 | 这次腾讯校招就差那么一点就可以拿到offer,最终却倒在自己的无知的几句话。 5 | 6 | 是的,我想工作一段时间回到家乡。 7 | 8 | 是的,我怀念校园,我从未体验过顶级的学校,包括初中高中大学。我心中有一个名校梦,我也一直想体验一下真正的大学,科研的生活。 9 | 10 | 是的,我还意外的获得了保研的资格。。。 11 | 12 | 但是,我没有说我想工作很长一段时间想回去。只是我觉得人不可能工作一辈子,家庭才是最终的归宿。另外,我喜欢的人是桂林的。 13 | 14 | 怀念学校并不代表着一定要去到学校,工作了也能学到很多东西。或许工作很长很长一段时间后我会去学校看看。 15 | 16 | 保研,我去广州之前已经放弃了自己也从来没有想过要这个,只是hr问我成绩怎么样时以为这样说成绩还不错就说了出来。 17 | 18 | 只是,以上这些我都只说了前者。 19 | 20 | 大学三年,自己付出了挺多的时间做自己想做的事,希望到一个大平台去实现自己那小而大的理想。到了找工作的时候,也许是太快太顺,没有任何面试准备的我直接就到了终面,最终倒在了几个很愚蠢,但是却又是我内心的想法上面。归根到底还是自己的不足,没有事先准备面试的技巧。以为自己会的就说,自己不会的就不说,太笨了,错过了一次这么好的机会。 21 | 22 | 挺郁闷,这次打击还是挺大的。但是想回来,从广州到深圳,自己确实也收获到了很多之前没有的东西,人生的头20年还是局限了,应该早早的出来看看外面的世界,也许很多想法就不一样了。 23 | 24 | 认识到自己的不足,你还年轻,30岁之前不怕失败,尽管结果都是不如人意,原因我现在想起来是屡教不改吧,犯了很多错,却从来没有真正意识到问题的严重性,而且总是失败在细节上。*知识是努力就可以学到的,但是其它的东西却可以帮你走得更远*。每次犯完错之后很懊悔,想要改变,但是后面又回到了原来的状态,循环。。。现在想起来真是觉得捶胸顿足啊。。。似乎我已经习惯这样了,做一件事总是达不到预期,而且大家都以为你会做好的。 25 | 26 | *《乔布斯传》*上说,**人生的头三十年,你培养习惯;人生的后三十年,习惯塑造你**。习惯,现在改还来得及,你现在22岁,如果再不改,那就难啦,骚年。 27 | 28 | 最近看了杨澜的*《一问一世界》*,里面有句话,**评价一个男人不是看他的前半生,而是看他的后半生**。现在的失败是积累,即使教训很严重。 29 | 30 | 杨振学姐说得对,不管结果怎么样,至少你追求过,努力过。 31 | 32 | 不过,我还是好喜欢我喜欢的东西的呢。 33 | 34 | *如果你已经来了这么远,也许还可以再前进一点*。 35 | 36 | ========================= 37 | 最后附上咸鱼的歌词吧,听起来有点理想化,但是这是多么痛的领悟啊 38 | 39 | > 我是一只咸鱼 不想承认 也不能否认 40 | 41 | > 不要同情我笨 又夸我天真 还梦想着翻身 42 | 43 | > 咸鱼就算翻身 还是只咸鱼 输得也诚恳 44 | 45 | > 至少到最后 我还有咸鱼 不腐烂的自尊 46 | 47 | > 我没有任何天分 我却有梦的天真 48 | 49 | > 我是傻 不是蠢 50 | 51 | > 我将会证明 用我的一生 52 | 53 | > 我 如果有梦 54 | 55 | > 有没有错 错过才会更加明白 56 | 57 | > 明白坚持是什么 58 | 59 | > 我 如果有梦 60 | 61 | > 梦要够疯 够疯才能变成英雄 62 | 63 | > 总会有一篇 我的传说 64 | 65 | 66 | > 我不好也不坏 不特别出众 我只是敢不同 67 | 68 | > 我的人生就是 一错再错 错完了再重头 69 | 70 | > 也许放弃掉一些 活得更轻松 我却不再是我 71 | 72 | > 我不愿一生 晒太阳吹风 咸鱼也要有梦 73 | 74 | 75 | > 我没有任何天分 我却有梦的天真 76 | 77 | > 我是傻 不是蠢 我将会证明 用我的一生 78 | 79 | > 我 如果有梦 80 | 81 | > 有没有错 错过才会更加明白 82 | 83 | > 明白坚持是什么 84 | 85 | > 我 如果有梦 86 | 87 | > 梦要够疯 够疯才能变成英雄 88 | 89 | > 总会有一篇 我的传说 90 | 91 | 92 | > 我 如果有梦 93 | 94 | > 有没有错 错过才会更加明白 95 | 96 | > 明白坚持是什么 97 | 98 | > 我 如果有梦 99 | 100 | > 梦要够疯 够疯才能变成英雄 101 | 102 | > 总会有一篇 我的传说 103 | 104 | 105 | > (有一天 有我的天空) 106 | 107 | > 做我的英雄 在我的天空 108 | 109 | > 我知道你懂 知道你会懂 110 | 111 | ========================= 112 | 113 | *longkai@2013-10-31* 114 | 115 | ### EOF 116 | ```yaml 117 | background: ../xida.jpg 118 | hide: false 119 | license: cc-40-by 120 | location: Nanning 121 | summary: "" 122 | tags: 123 | - Campus 124 | - Thoughts 125 | weather: "" 126 | date: 2013-10-31T03:07:42+08:00 127 | ``` 128 | -------------------------------------------------------------------------------- /memories/2013/thinking-after-tx/README.md: -------------------------------------------------------------------------------- 1 | 对于自己不良习惯的思考(腾讯校招后的反思) 2 | ======================= 3 | 4 | 1. 保持耐心,尤其是对于简单的事情。做一件事情,尤其要注意它的开始,避免一开始就陷入到事情最主要的部分中。 5 | 6 | 2. 对于别人不会而自己会的领域,要保持谦虚的态度去分享自己所理解的东西。 7 | 8 | 3. 当别人对自己的观点质疑(即使质疑是错的),也要保持谦虚的态度去反驳。 9 | 10 | 4. 永远不要想当然。自己觉得这样,但是别人并不认同。只有最终确认后才可以加以判断。 11 | 12 | 5. 凡事都要准备好,不要因为自己第一次尝试或者自己已经能够搞定那件事了而忽略了一些很关键的细节。犯这种错误,倒在最后是非常愚蠢的事情。 13 | 14 | 6. 注意时间,必须要做的事情可以尽可能的先做好,再留出剩余的时间做其他的事情。 15 | 16 | 7. 不要太主观自我了,而把自己的想法强加给别人,这样别人也许会按照你的方式做,但是是非常愚蠢的。 17 | 18 | 8. 保持自信,即使你觉得现在失败了,没有什么希望了:-) 也要自信的做好收场。 19 | 20 | 9. 坚持自己所爱的,看到自己的不足,保持希望并且努力争取! 21 | 22 | 10. 有了好的想法就马上去执行,不要拖延! 23 | 24 | ### EOF 25 | ```yaml 26 | background: ../xida.jpg 27 | hide: false 28 | license: cc-40-by 29 | location: Nanning 30 | summary: "" 31 | tags: 32 | - Campus 33 | - Thoughts 34 | weather: "" 35 | date: 2013-10-31T03:07:42+08:00 36 | ``` 37 | -------------------------------------------------------------------------------- /memories/2013/xida.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2013/xida.jpg -------------------------------------------------------------------------------- /memories/2014/2-call/README.md: -------------------------------------------------------------------------------- 1 | 两个电话 2 | ======== 3 | 10点多,早晨。 4 | 5 | 此时我还在睡觉=.=(昨晚又搞到比较晚,调试新浪微博的api接口,一直都想为某人做一个微博app)突然铃声响起,看看居然是个陌生的号码,来自四川成都,迷迷糊糊的接了。一开始没听出是谁,然后听这口音着实似曾相识,直到对方说,“我是老曾”,oh,no,居然没把曾哥认出来╮(╯_╰)╭ 6 | 7 | 曾哥是我在雨无声给我最大影响的人。在那里待了近三年,有时候,我会觉得最开心的时候还是当小弟的时候,可以认识很多小伙伴,可以一起玩耍学习和做事(尽管事情现在看起来是很琐碎),有不懂的地方去学长的宿舍,学长会手把手教你,晚上还可以去狗洞吃宵夜,关键是,学长请客^_^ 那些年,我们混过的雨无声,有时间,我得把一些事情给写一写。 8 | 9 | 曾哥行程匆忙,关键是还有女朋友在等他,我们也没有机会聚一聚,不过,来日方长嘛。 10 | 11 | 从成都回到南宁后,曾哥还记得给我打个电话,谢谢^_^ 12 | 13 | -- 14 | 15 | 7点多,傍晚。 16 | 17 | 这时刚去打饭,回来的路上,电话又响了,是老爸打来的。 18 | 19 | 你啥时回来啊,车票买了没,老实说,这些问题前几天都说了,我就不厌其烦的在重复给老爸= = 20 | 21 | 接下来,预料之外的是老爸说,“小时候和你一起玩耍的xx18号结婚了,你记得那天之前回来啊”。听到之后,确实有一些小吃惊,儿时的小伙伴居然就结婚了,转念一想,确实,我们貌似都走在这条路上了呢。想着想着,原本还是替朋友感到高兴的,但是想到自己又有些不是滋味了,自慰一下吧,你还年轻,加油=.= 22 | 23 | -- 24 | 25 | 总有那么个时刻,会让你想到一些人,一些事,让你感动或者回忆,并且迎上去追求一些人,一些事。 26 | 27 | --- 28 | 2014-01-12 29 | 30 | ### EOF 31 | ```yaml 32 | background: ../xida.jpg 33 | hide: false 34 | license: cc-40-by 35 | location: Nanning 36 | summary: 总有那么个时刻,会让你想到一些人,一些事,让你感动或者回忆,并且迎上去追求一些人,一些事。 37 | tags: 38 | - Campus 39 | - Thoughts 40 | weather: "" 41 | date: 2014-01-12T23:54:44+08:00 42 | ``` 43 | -------------------------------------------------------------------------------- /memories/2014/bad-date/README.md: -------------------------------------------------------------------------------- 1 | 拿什么拯救你,我的情商 2 | ====================== 3 | ![安慰](https://farm3.staticflickr.com/2834/11737680053_b2a69e4f5f_o.png) 4 | 5 | 今天犯了几件很脑残的事情,搞得自己挺郁闷的。本来已经约好了一个女生去听一场音乐会的。嗯,单纯的去听一场音乐会。于是又叫了一位情侣一块去,男的是我同班同学,女的是那个女生的同班同学,我原以为这样气氛可能更好。但是忘了告诉那个女生我还叫了人,这太不科学了。。。 6 | 7 | 后来演变成我没怎么和那个女生说啥,反而和我同学一路上聊,她们俩也倒没怎么聊,回来吃东西的时候还弄了一件很脑残的事情,自己简直呆得无敌,不提了。真的,有些时候,明明自己想这样做的,但是最后却那样做了,相反的方向。这些事情你后面回想起来很2很2,但是事情就是这样发生了。 8 | 9 | 难道是情商被狗吃了么? 10 | 11 | 大学这几年,弄自己感兴趣的东西的时间相对多了些,老实说在社交这方面自己确实算个白痴=.=现在得寻求改变,假如之前我有冒犯过你的话,请见谅...或者直接回复骂我几句吧,我这人老是不晓得错... 12 | 13 | 大伙儿有什么想说的都可以给我留言呐,我会晚些时候回复你的。 14 | 15 | 16 | 然后,今天考研了,四年前,我是想着我也会参加的,但是这几年发生了不少事,也许人总是在改变中不断成长吧。嗯,考研的朋友们加油啊,祝你们考场得意! 17 | 18 | 最后,送给大家一句话,是在路过中大的一棵树上看到的: 19 | 20 | > **在路上,我们一起走向远方,只是不要忘了来时的路,还有你我的梦想。** 21 | 22 | -- 23 | image from the Internet 24 | 25 | ### EOF 26 | ```yaml 27 | background: //farm3.staticflickr.com/2834/11737680053_b2a69e4f5f_o.png 28 | hide: false 29 | license: cc-40-by 30 | location: Nanning 31 | summary: "" 32 | tags: 33 | - Campus 34 | - Thoughts 35 | weather: "" 36 | date: 2014-01-04T06:45:42+08:00 37 | ``` 38 | -------------------------------------------------------------------------------- /memories/2014/bad-may-be-nice/README.md: -------------------------------------------------------------------------------- 1 | 车票已逝微博非晚 2 | ================ 3 | ![Lego](http://farm6.staticflickr.com/5472/11965239225_1b5eeb6d18_o.jpg) 4 | 5 | 今天终于一次把boss(课程设计)给秒了,过程和结果没有说得那么恐怖=.=,完全不像某同学去了四次才过(并且每次老师都会问不同的问题)。不过得感谢这位同学,舍生取义,为大伙提供了大量的实战经验~老师也很忙,估计也无心恋战了吧,所以你好我好他也好哈。 6 | 7 | 嗯,基本上可以放假了,除开一些小事。不过悲剧的是今晚去12306买票的时候发现这几天回家的票都没了,呃,前几天看还有的,自己也不确定具体哪天回家就没买,活该啊= =,又得多呆几天了。 8 | 9 | 不过也好,这几天也没事了,可以利用这几天在学校把一直想为某人做的一个新浪微博客户端原型给做出来,**Android**系统的,出于各种原因,不想向下兼容低版本了鸟,至少得**4.1.2**版本哦╮(╯_╰)╭ 10 | 11 | 学生时代写的东西,谈不上实际的用途,都是凭着兴趣学习和分享嘛,都开源了,所以这次也不例外。如果对程序设计感兴趣可以在我的[github](https://github.com/longkai/catnut)上关注一下哦,fork,clone,bug issue各种都欢迎! 12 | 13 | --- 14 | 题图作者 [Jure Kravanja](http://500px.com/yurko) 15 | 16 | 2014-01-15 17 | 18 | ### EOF 19 | ```yaml 20 | background: //farm6.staticflickr.com/5472/11965239225_1b5eeb6d18_o.jpg 21 | date: 2014-01-15T23:40:09+08:00 22 | hide: false 23 | license: cc-40-by 24 | location: Nanning 25 | summary: 这几天没票回家了,那就写个微博 app 吧 26 | tags: 27 | - Campus 28 | weather: "" 29 | ``` 30 | -------------------------------------------------------------------------------- /memories/2014/class-party/README.md: -------------------------------------------------------------------------------- 1 | 班级聚餐 2 | ======== 3 | 4 | 今天,研究生考试结束了,考研的朋友们辛苦啦。不管结果怎么样,过程就是奖励。现在,尽情的放纵一下吧,have a nice time~ 5 | 6 | 然后,今晚我们班级的聚餐如约而至。大四这上学期,大家各奔东西,找工作的找工作,考研的考研,该干什么的干什么,确实难得聚在一起咧。下学期,就毕业鸟,想到这里怎么都有些蛋蛋的忧伤=.=,是我想多了。。。 7 | 8 | 今晚我们吃的是自助火锅,我们那桌是变态辣,一桌重口味的人坐在一起什么氛围?你们感受下。。。 9 | 10 | 记住今晚的笑脸,若干年后,我们还会有这样的笑脸^_^ 11 | 12 | ![班级聚餐](https://farm8.staticflickr.com/7408/11777122836_b1195900d4_o.jpg) 13 | 14 | ![班级聚餐](https://farm6.staticflickr.com/5478/11776770354_8bf80a3a77_o.jpg) 15 | 16 | ![班级聚餐](https://farm4.staticflickr.com/3773/11776351475_4d7849434f_o.jpg) 17 | 18 | ![班级聚餐](https://farm6.staticflickr.com/5533/11776795053_4f1c9fff61_o.jpg) 19 | 20 | 21 | ### EOF 22 | ```yaml 23 | background: //farm8.staticflickr.com/7408/11777122836_b1195900d4_o.jpg 24 | hide: false 25 | license: cc-40-by 26 | location: Nanning 27 | summary: 大四上 - 班级聚餐 28 | tags: 29 | - Campus 30 | weather: "" 31 | date: 2014-01-05T23:18:29+08:00 32 | ``` 33 | -------------------------------------------------------------------------------- /memories/2014/dormitory-7/README.md: -------------------------------------------------------------------------------- 1 | 宿舍记忆 01-07 2 | ============== 3 | 4 | 大学4年,宿舍是我们停留的港湾,在这里每天都有精彩的剧本发生。 5 | 6 | 剧本虽好,可惜临近剧终。感叹之余,何不记一记,若干年后也可以笑一笑咧~ 7 | 8 | 以上,缘起。 9 | 10 | --- 11 | 12 | 时间:2014-01-07晚 13 | 14 | 地点:西10#306 15 | 16 | 人物:all 17 | 18 | > 此时已经是晚上11点左右,大伙都在各自弄自己的东西。 19 | 20 | j:啊,我的大物第二次重修跪了。。。 21 | 22 | all:这么爽~多少分? 23 | 24 | j:27。。。 25 | 26 | all:叼炸天~ 27 | 28 | s:h哥(此君大物也重修2次了),你的咧? 29 | 30 | h:(躺在床上看小说)啊?我应该过了。 31 | 32 | s:过叼啊,清考吧,少年,你又可以和j一起愉快的玩耍了~ 33 | 34 | j:是啊,h哥,我们一起愉快的玩耍吧~ 35 | 36 | l:哈哈,你们的水平在一个频道上,你们对未来的期待相同,你们又可以一块愉快的玩耍鸟~ 37 | 38 | h:玩你妹。。 39 | 40 | > 过了若干时间,l洗完澡走过去,发现h哥又躺在床上。。。 41 | 42 | l:h哥,多少啊 43 | 44 | h:哎,不会自己看嘛 45 | 46 | l:54,喔,h哥你是j的一倍啊~ 47 | 48 | h:一球样。 49 | 50 | j:h哥叼啊,是我一倍多 51 | 52 | s:你上次多少? 53 | 54 | j:上次考试直接不去,0分。 55 | 56 | s:喔,这尼玛,进步很大嘛,少年~ 57 | 58 | j:是啊,27倍,不对,从0到27,这是无穷倍啊~ 59 | 60 | > 又过了没多久,h哥在玩欢乐斗地主,战斗了很久了。。。 61 | 62 | h:这尼玛,不是队友傻逼,就是牌傻逼,又没豆了。。。l,你还有吗? 63 | 64 | l:喔,h哥坚挺啊,我早就没了。。。哎,h哥,我们不能一起愉快的玩耍了 65 | 66 | h:玩你mb,老s,拿你号来我斗一下 67 | 68 | > s迟疑了一下。。。 69 | 70 | s:1293***43284290,密码是#¥%¥#@%#¥%@ 71 | 72 | h:喔,又可以斗了~ 73 | 74 | l:h哥,我们没法一起愉快玩耍了 75 | 76 | h:别吵哥 77 | 78 | > 没过多久 79 | 80 | h:咋回事,又没了,老s~ 81 | 82 | s:有,3423&^%%%*&*8 密码3#¥#@¥#@¥#@¥@ 83 | 84 | 。。。。。 85 | 86 | > 不知从什么时候开始,h哥又躺在了床上。。。。 87 | 88 | > 又不知从什么时候,h哥睡着了。。。。 89 | 90 | > 到了第二天下午,h哥醒来了。。。。 91 | 92 | --- 93 | 本故事纯属写实,如有雷同,请君一笑! 94 | 95 | 96 | ### EOF 97 | ```yaml 98 | background: ../xida.jpg 99 | hide: false 100 | license: cc-40-by 101 | location: Nanning 102 | summary: 大学4年,宿舍是我们停留的港湾,在这里每天都有精彩的剧本发生。剧本虽好,可惜临近剧终。感叹之余,何不记一记,若干年后也可以笑一笑咧~ 103 | tags: 104 | - Campus 105 | weather: "" 106 | date: 2014-01-08T23:36:56+08:00 107 | ``` 108 | -------------------------------------------------------------------------------- /memories/2014/golden-ball/README.md: -------------------------------------------------------------------------------- 1 | 金球奖 2 | ====== 3 | 今天聊聊足球吧~ 4 | 5 | 昨晚,更确切的说应该是今天早上凌晨4点多(这个点好冷=.=)的时候,本来不太舒服的,但是实在忍不住,还是爬起来打开电脑做了做了两件事╮(╯_╰)╭ 今年的金球奖颁奖和一场英超直播,维拉vs阿森纳。 6 | 7 | 两件事都挺符合预期的。c罗获得金球奖,阿森纳客场艰难拿下3分重回英超榜首! 8 | 9 | -- 10 | 11 | ![arsenal](https://farm4.staticflickr.com/3823/11949666736_bb75712cb8_o.jpg) 12 | 13 | 先说说那场比赛吧,此役阿森纳是客场作战,本赛季首回合维拉曾经3:1击败了阿森纳,所以,这场比赛不容再有失,另外争冠对手切尔西和曼城在先赛一场的情况下在积分榜已经超越了阿森纳,本场比赛必须赢下,夺回积分榜头名!整场比赛维拉打得很好,虽然我下半场打了好长的盹,但是感觉阿森纳就是凭借一分钟内连进两球赢下了比赛,其余的时间很难创造出进球的机会,反倒是比赛的最后阶段被对手压着打=.= 不过好在还是赢下了这场比赛,太棒了,不枉熬夜看球的球迷啊~~接下来冬季转会期得买进一些球员啊,再接再厉! 14 | 15 | -- 16 | 17 | ![golden ball](https://farm6.staticflickr.com/5515/11949272384_c82173de1b_o.jpg) 18 | 19 | 金球奖是足球最高的个人荣誉,可以说是蛋糕上的草莓。c罗自2008年后再获金球奖,打破了梅西连续四年(2009-2012)的垄断,恭喜c罗~老实说,虽然我不是巴塞罗那球迷,但是还是非常欣赏梅西的,但是看梅西获得荣誉已经看腻了=/= 进球如机器,各种冠军,奖项拿到手软(就差世界杯了)。真心觉得他不是这个星球的。当然c罗也不遑多让,整个2013年他好像打进了60+进球吧,虽然没有梅西2012年进了90+那么恐怖,但是也是今年火力最猛的球星了,再说今年梅西状态也没有之前那么好(但是还是很牛逼的。。。),年末又伤了,今年的表现也确实不如c罗,所以恭喜c罗!这两个人就像诸葛亮和周瑜一样,都是这几年足坛的代表,我总觉得能看到他们的竞争是一件难得的事~ 20 | 21 | 最后,悲剧的里贝里,要是在几年前,金球奖肯定是他的,论个人荣誉,德甲,欧冠等等能拿的他都拿了,个人表现虽不如前面两位那么抢眼,但是他的冠军摆在哪里,再说,c罗貌似今年随皇马一个冠军也没拿到,其实是一个失败的赛季。不过,联想到自从金球奖几年前并入国际足联后,投票的渠道增多,基本上是以球星来评判了,两年前的斯内德便是如此悲剧(那年他不论是冠军和个人表现都很出彩,但是梅西进了90+球)。 22 | 23 | -- 24 | 25 | 以上,聊聊足球~ 26 | 27 | --- 28 | 图片来自互联网 29 | 30 | 2014-01-14 31 | 32 | 33 | ### EOF 34 | ```yaml 35 | background: //farm4.staticflickr.com/3823/11949666736_bb75712cb8_o.jpg 36 | hide: false 37 | license: cc-40-by 38 | location: Nanning 39 | summary: c罗获得金球奖,阿森纳客场艰难拿下3分重回英超榜首! 40 | tags: 41 | - Campus 42 | weather: "" 43 | date: 2014-01-14T23:28:07+08:00 44 | ``` 45 | -------------------------------------------------------------------------------- /memories/2014/last-college-contest/README.md: -------------------------------------------------------------------------------- 1 | 大学考试那点事 2 | ============== 3 | 4 | 今天,考完了本学期最后一科考试,算下来,也是大学最后一科考试了(如果本学期木有挂科的话=.=)。你还记得每当你考完试的时候的感受吗?是后悔没有刷够分呢,还是担心自己要挂科了想着怎么打电话给老师求情呐,还是是考试过就行毫无压力,亦或是想着去哪里happy一下咧,或者,毫无感觉=.= 5 | 6 | 突然觉得,这也是不是学生生涯中最后一次考试呢(应该不是)?想到这里,我怎么又有些淡淡的忧伤了,哈哈,考了这么多年的考试,说实在的,还是有点怀念的咧。 7 | 8 | --- 9 | 10 | 大一的时候,那时候,木有电脑(不得不说,那时候精力充沛,各种活动,各种乱七八糟的都参合一下),又是刚从高中过来,又是想着考研的孩子(毕竟自己高考没咋样嘛),一有时间就往图书馆或者自习室里钻,到了考试周更是这样,仿佛除了考试就没了别的,感觉和高中类似。那个时候啊,考试是个神圣东西,不敢怠慢。以至于一直觉得考试无压力,分数还不错。并且,考试完,也就意味着可以回家了,所以,我总是期待着。 11 | 12 | -- 13 | 14 | 大二的时候啊,那时候啊,有了电脑,被兴趣绑架了,社团活动只参加了雨无声,跑去图书馆看书也不是数学,英语这些了,更多的时候喜欢查看计算机相关书籍,并且,图书馆的不是太旧就是太少,渐渐的满足不了我的需求,于是就是去网上下载最新的原版的电子书(不得不说,这些书非常好,尤其是[O'Reilly][1]的动物书, 还能提高英语水平),于是乎,对着电脑的时间就更长了。于是乎,对于上课和考试就有了一些懈怠,开始有一些没有什么意义的课不去上了。但是,到了考试前还是非常认真的对待,所以,成绩依旧保持得可以。不过,还是挂了一科,蛋疼的课。。。 15 | 16 | -- 17 | 18 | 大三的时候呢,自己上升到了校园网站的管理层,自己终于可以干一些什么了,当时也是很有激情和精力呐,技术活和体力活都干了,有时感觉像是在做全职一样呢。这样一来,对于上课和考试,似乎已经比不上这些事情了。翘了很多课,对于考试也不是那么虔诚了,感觉像是不到考试最后一天就不去碰它。一部分考试前一晚去自习教室通宵一晚基本上就搞定了,当然啦,分数自然是低空飘过那种了,体会到大一时曾经觉得考试上80分是多么的轻松是如此的无知=.= 记得有一次,有一门考试一直没有看过,然后考前一晚还去组织了一场晚会,搞到晚上一点多才回宿舍,不是一般的累啊,通宵也搞不了了,索性睡下第二天裸奔。后来,靠着大伙的助攻和自己的记忆飘过= = 19 | 20 | -- 21 | 22 | 大四,就不想说了,找工作的找工作,考研的考研,课基本上没去过,考试也是闭卷成为了开卷=.= 这不是明摆着放过我们大四狗么。。。对于考试,没啥感情鸟,根本不复习,直接过(原谅我这么说,老师,最近这几门课别卡我呀)。 23 | 24 | --- 25 | 以上,粗略记一下大学几年的考试。 26 | 27 | --- 28 | 2014-01-09 29 | 30 | 31 | ### EOF 32 | ```yaml 33 | background: ../xida.jpg 34 | hide: false 35 | license: cc-40-by 36 | location: Nanning 37 | summary: 还记得每当你考完试的时候的感受吗?是后悔没有刷够分呢,还是担心自己要挂科了想着怎么打电话给老师求情呐 =.= 38 | tags: 39 | - Campus 40 | weather: "" 41 | date: 2014-01-09T23:02:54+08:00 42 | ``` 43 | 44 | [1]: http://zh.wikipedia.org/wiki/%E6%AD%90%E8%90%8A%E7%A6%AE 45 | -------------------------------------------------------------------------------- /memories/2014/one-and-a-half-months-work/README.md: -------------------------------------------------------------------------------- 1 | 工作一个半月了 2 | === 3 | 毕业后,来深圳一个半月了,距离上一次写东西已经过了好长一段时间。工作的时间很长,每天下班都很晚,回到家里(我终于有个家了,回想起刚来的那几天,还是挺难的...),洗个澡,玩玩手机,看看感兴趣的东西,或者和朋友们聊聊天没多久就倒下了。要知道,一个多月前,还在学校的时候,不是做自己感兴趣的事情,或者玩玩游戏到凌晨3,4点,也是很常见的事情,工作了,不是学生了-.- 4 | 5 | 现在在公司一个人负责Android端的开发,一个半月过去了,虽然有不少问题,不过,看起来,我还是能一个人hold住这个端的。对于刚毕业的我来说,还是挺感激这个机会。公司只有我一个Android工程师,没有人带,出了问题只能自己去想办法解决,这个过程,你可以感受一下。过程就是奖励,可是,说真的,这样很容易局限自己,所以,需要交流,需要扩宽自己的眼界。公司有不少其它领域的牛人,找个时间多向他们学学,而且,我可不仅仅会写Android应用哦,嘿嘿。 6 | 7 | 公司貌似主推的是iOS,对于Android貌似很不给她面子,这也是我很遗憾的地方。还是那句话,不管你所处的环境怎么样,不要局限自己。 8 | 9 | 说到这里,我再扯扯...忙于工作之余,不要被工作局限了。就像这周,加班加成狗了,回到家都12点,回来了还得弄一会。我知道,我的能力和心态都还有问题,否则不会弄得这么狼狈,需要重构。 10 | 11 | 昨天和飘聊天,发现过于专注一件事情确实很容易忽略其他的东西(其实你自己都麻木到意识不到)。虽然我一无所有的来到这里,想要争取有些什么,但是这绝非单单工作能够带来。生活不仅仅是工作,她应该是有趣的,有感情的。我又抖机灵了...希望工作时解决问题机灵一些,这样其他的时间就多一些啦。 12 | 13 | 从今天起,回到时不时写东西的状态,不然,日子一天一天过,都没留下些啥。 14 | 15 | === 16 | > 天空不曾留下鸟飞过的痕迹,但我已飞过。 -- 泰戈尔 17 | 18 | 19 | ### EOF 20 | ```yaml 21 | background: //farm9.staticflickr.com/8037/7998186215_6d9e5e51bc.jpg 22 | hide: false 23 | license: cc-40-by 24 | location: Shenzhen 25 | summary: 毕业一个半月了,好久没写些啥了... 26 | tags: 27 | - Work 28 | - Thoughts 29 | weather: "" 30 | date: 2014-08-18T09:18:07+08:00 31 | ``` 32 | -------------------------------------------------------------------------------- /memories/2014/shaoyifu-walcott-zhihu/README.md: -------------------------------------------------------------------------------- 1 | 邵逸夫,沃尔科特与知乎 2 | ====================== 3 | 4 | 今天早上爬起来,打开邮件,顺带着看了看新闻,有三件事,值得记录一下。原谅我文笔,记个流水账=.= 5 | 6 | ## 邵逸夫 7 | 邵逸夫于今日去世了。听到逸夫这个词,你是否也和我一样想到一连串的逸夫楼?这几年去过不少学校,尤其是北京的高校,发现几乎每个学校都有一所逸夫楼,当时就给我留下挺深的印象,感慨这个可敬的老人对教育的支持。这么伟大的一位老人,在今天离开了我们,逸夫爷爷一路走好。 8 | 9 | [邵逸夫相关视频](http://v.qq.com/topic/2014/syf.html "邵逸夫相关视频") 10 | 11 | ## 沃尔科特 12 | 另一个不幸的消息,沃尔科特伤退6个月,现在是1月,今年的世界杯将于6月中旬在巴西举行,6个月,很可能连世界杯也赶不上了,要知道,沃尔科特还没有踢过世界杯。祝福沃尔科特,但愿6月的绿茵场上有你驰骋的身影!哎,阿森纳为何如此悲剧?现在锋线上已经伤了吉鲁,本特纳,唯一的前锋波多尔斯基状态又不给力,又是争冠最要紧的时刻,在这个节骨眼上。。。回想起2007-2008赛季,那个赛季枪手也是类似的情况,一直领跑英超积分榜,直到2月份的时候前锋爱德华多断腿赛季报销,之后阿森纳便失去了竞争力。。。不要这样好不好,沃尔科特也是刚复出一个多月,这个月状态他非常好,6场比赛进了5球和3助攻。。。跪求温格买人,不然这赛季又难了,不愿9年无冠:-( 13 | 14 | ![wish walcott](https://farm8.staticflickr.com/7294/11817939844_f60ede6dfe_o.png) 15 | 16 | > 不过,主力重伤后的愈挫愈勇拿下英超,枪手也不是没有先例。2001-02赛季,主力左前卫罗伯特-皮雷在3月份重伤告别当赛季,此后阿森纳英超逆转曼联,足总杯也一举夺魁,夺得“双冠王”。皮雷本人还获得了当赛季的英超最佳,英超夺冠庆典上,亨利、亚当斯、维埃拉向着身着便装而来的皮雷行“跪拜”大礼,也成为了英超20多年来永恒的经典。(from sina) 17 | 18 | ## 「创业时,我们在知乎聊什么?」 19 | 早上查看知乎推送的邮件,发现知乎居然出书了~而且还是一本自己挺感兴趣的书,关于互联网,关于创业,关于李开复,关于张小龙等等~虽然是预售,但是还是迫不及待去预订鸟~然后发现了一件有趣的事,我家门口居然也可以收到快递了,哦耶,不过为毛预计送达日期是1月28日咧,好久,查看了一下29是大年三十,也好,过年有本好书看^_^ 20 | 21 | 关于这本书,还是比较推荐给大家的,具体请看今日的另一篇「图书推荐」的文章。另外,知乎www.zhihu.com是个不错的网站,大伙有事没事可以去看看自己感兴趣的东西哦! 22 | 23 | ![创业时,我们在知乎聊什么?](https://farm6.staticflickr.com/5527/11818274986_5884ed8a29_o.jpg) 24 | 25 | --- 26 | 以上,不知所云。。。 27 | 28 | -- 29 | image from the Internet 30 | 31 | --- 32 | 2014-01-07 33 | 34 | 35 | ### EOF 36 | ```yaml 37 | background: //farm8.staticflickr.com/7294/11817939844_f60ede6dfe_o.png 38 | hide: false 39 | license: cc-40-by 40 | location: Nanning 41 | summary: "" 42 | tags: 43 | - Campus 44 | weather: "" 45 | date: 2014-01-07T21:34:30+08:00 46 | ``` 47 | -------------------------------------------------------------------------------- /memories/2014/sherlock-holmes/README.md: -------------------------------------------------------------------------------- 1 | 福尔摩斯 2 | ======== 3 | 放假回家匿了一阵子,没写东西了,有点不好意思...坚持每天都在微信写点啥做起来确实蛮难的。算啦,没有必要强求,有时间,有灵感或者想写就写写,是为涂鸦! 4 | 5 | 谢谢几位朋友在微信给我的留言,居然说我的文笔不错,这个说不上啦,我自己都不知道这个公众号定位如何,写的内容乱七八糟的。不过真的谢谢你们,容忍我的“涂鸦”,我会继续写下去的。 6 | 7 | --- 8 | 9 | 初一这天,在家里宅了一天,把三季福尔摩斯看完了,太过瘾了,编剧真是个天才,把19世纪的背景转移到了现代,没有了那个年代伦敦昏黄暗淡的街灯,哒哒不停的马车,风光旖旎的原野,取而代之的是笔记本电脑,博客,iPhone,Twitter,4G种种属于现代的元素,so great!他哥哥麦克劳夫特在英国政府任要职,给了他很多方便,不过这哥哥不厚道啊,一直监视着弟弟...还有华生,这剧情怎么老是有搞基的倾向(后来google了一下说有个编剧是个gay...)...另外感觉有点不够劲就是莫里亚蒂和福尔摩斯的较量,好在第三季埋下了伏笔,估计第四季回归了吧,不过目测得等到15年了...哎,不过真心很好看,你值得期待! 10 | 11 | 不要说我土,现在才看哈,其实这也是大学为数不多的几部追过的电视剧啦Orz 其实我收藏有一部福尔摩斯探案全集了...非常喜欢福尔摩斯这个形象,他和诸葛亮简直是东西方两个料事如神的绝配(个人愚见)。 12 | 13 | 我最欣赏诸葛亮说过话是:”**淡泊明知,宁静致远**“。而福尔摩斯咧,其实这家伙也说过一些很有趣的话的:”**我的人生就是一场漫长的逃亡,为的是摆脱平淡庸俗的生活状态**“。(『红发俱乐部』) 14 | 15 | 小孩子就是喜欢英雄。 16 | 17 | --- 18 | 19 | 最后给大家说一个笑话:-) 20 | 21 | >福尔摩斯和华生一起到郊外露营,享用完一顿美餐和一瓶美酒后,他俩钻进了帐篷。 22 | 23 | >凌晨三点左右,福尔摩斯推醒华生,如是问道:“华生,你能不能抬头看看天空,再把你的发现告诉我呢?” 24 | 25 | >华生说道:“我看到了亿万颗星星。” 26 | 27 | >福尔摩斯接着问道:“很好,你从中推理出了什么结论呢?” 28 | 29 | >华生回答道:“从天文学的角度来推理,结论是宇宙中存在亿万个星系,很可能还存在亿亿颗行星。从占星学的角度来推理,结论是土星升入了狮子座。从神学的角度推,结论是上帝至高至大,我们至卑至小。从计时学的角度来推理,结论是眼下大约是凌晨三点。从气象学的角度来推,结论是明天的天气非常不错。你有推理出了什么结论呢,福尔摩斯?” 30 | 31 | >福尔摩斯咬牙切齿的说:“有人偷走了咱的帐篷。” 32 | 33 | *** 34 | 35 | 2014-02-01 36 | 37 | ### EOF 38 | ```yaml 39 | background: ../xida.jpg 40 | hide: false 41 | license: cc-40-by 42 | location: Guilin 43 | summary: 福尔摩斯:「我的人生就是一场漫长的逃亡,为的是摆脱平淡庸俗的生活状态」 44 | tags: 45 | - Campus 46 | weather: "" 47 | date: 2014-02-01T23:14:58+08:00 48 | ``` 49 | -------------------------------------------------------------------------------- /memories/2014/trust/README.md: -------------------------------------------------------------------------------- 1 | 被信任的感觉 2 | ============ 3 | ![trust](https://farm3.staticflickr.com/2818/11998229406_002daa10b7_o.jpg) 4 | 5 | 今天发生了一件很不愉快的事情,非常的不爽,心中有条猛兽奔过的感觉。 6 | 7 | 刚洗完澡,现在感觉也不那么强烈了,也不想想那么沉重的话题=_= 8 | 9 | 被别人信任时,或者说别人相信你的时候,这是一种怎样的感觉? 10 | 11 | 脑海里立马想到了《火影忍者》里的鸣人,介个我想大伙们或多或少都应该了解吧。他一出生就得不到周围的任何人的认同,认为他是妖狐,是个祸害。但是他没有过于在意这些,他有理想,成为火影。他的老师伊鲁卡是第一个相信这个“不学无术”的学生的人,鸣人非常感动,此后他凭着自己说到做到的努力的改变了别人的想法,获得了越来越多小伙伴的信任,朝着自己的梦想而去。 12 | 13 | 漫画总是带有理想主义的色彩。现实中,我总觉得能得到别人的信任是一件非常开心的事情,别人相信你,并且你也回馈别人的信任,这样不是很好么?当然,这里的别人不是随便的一些人,而是那些我们也同样认同的人。 14 | 15 | 记得大二上学期的时候,当时自己刚学习web编程,基本上很多东西都似懂非懂,当时学长很直接了当的给了我一个任务去做,写一个投票系统在“十大歌手”的时候用。当时那个惊讶呀,我觉得力不从心,但是学长还鼓励我说说能做多少做多少,肯定能做好的。当时我很佩服学长掌握的各种技术,神乎其神的样子,看到学长这么相信自己,也就硬着头皮上了。吃饭上课的时候都想这这件事,时间也不多,就省去睡觉的时间去弄,当时这个那个不会呀=.=最后东西确实弄出来了,不过根本不能用,感觉有愧于学长的信任。那个时候,好怕见到学长的=.=(因为我怕他会问我做得怎么样了)后来,学长也没说啥的,拿了我的代码,帮我修改,还说我做得不错,其实是很渣的一个东西。 16 | 17 | 再后来,学长们把网站交给了我们。那时我们也是类似的感觉,我和另外几个做技术的同学都非常干劲,深感觉得在我们这一年至少得不出篓子吧。考试前一天依然奋战在服务器机房,晚会这种场合,熬夜甚至通宵调试bug和增加功能以及怎样去开发一些新的东西去扩大网站的影响力等等这些场景现在一一浮现过。每当有同学反应出网站有问题的时候总是觉得不好意思,赶紧去修补,更不用说前辈们反应了= = 18 | 19 | 或许是遇到了好学长,或许自己不是一个好学长,或许只是too young too simple 20 | 21 | --- 22 | 图片来自互联网 23 | 24 | 2014-01-17 25 | 26 | 27 | ### EOF 28 | ```yaml 29 | background: //farm3.staticflickr.com/2818/11998229406_002daa10b7_o.jpg 30 | hide: false 31 | license: cc-40-by 32 | location: Nanning 33 | summary: 被别人信任时,或者说别人相信你的时候,这是一种怎样的感觉? 34 | tags: 35 | - Campus 36 | - Thoughts 37 | weather: "" 38 | date: 2014-01-17T23:50:18+08:00 39 | ``` 40 | -------------------------------------------------------------------------------- /memories/2014/vocation-first-day/README.md: -------------------------------------------------------------------------------- 1 | 放假第一天 2 | ============ 3 | ![git log](http://farm3.staticflickr.com/2858/12013399865_40bed1727a_o.png) 4 | 5 | 刚洗完澡出来,水真热,都有点不敢近身,看着俩手都红了,难道是放假了没人和我抢热水了么=/= 6 | 7 | 嗯,今天正式放寒假了,其实好多同学都提前走了呢。天还没亮,舍友就起身收拾行李回家了,又走了一个,现在就还剩俩了,另外一个舍友白天也要去参加培训,所以,只剩我一个人镇守宿舍鸟。校园里顿时略显的有些“萧条”的样子,没有以往那样热闹,到处可见来来往往的行李。不过今天天气不错,下午可以出去晒晒太阳~ 8 | 9 | 昨晚一整晚就没怎么睡着,早上目送舍友离开后也全无睡意=.= 也不知道干啥了,索性打开电脑,开始前天计划弄的一个微博app项目,这是死宅的节奏啊。。。 10 | 11 | 打开音乐,边听边哼,再思考着怎么完成这个过程那个过程,再在纸上笔画笔画,再伴随着清脆的键盘音,其实,这样的节奏也不错的挺难得的咧^_^,原来我们宿舍平常是那么的热闹哈~ 12 | 13 | 总结出三点: 14 | 15 | 1. 现在听SHE的歌发现特有感觉 16 | 17 | 2. 新浪sdk略坑啊,授权方式居然还定义了自己的样式,并且还是闭源的,果断放弃它的sdk,自己去使用OAuth2去弄 18 | 19 | 3. 忘记去晒太阳了= = 20 | 21 | 项目已经开始了,感兴趣的朋友可以去我的github上关注一下哦~ 22 | 23 | 突然想起今晚有场球=.=,已经开始了,大家假期愉快,晚安! 24 | 25 | --- 26 | 2014-01-18 27 | 28 | 29 | ### EOF 30 | ```yaml 31 | background: //farm3.staticflickr.com/2858/12013399865_40bed1727a_o.png 32 | hide: false 33 | license: cc-40-by 34 | location: Nanning 35 | summary: 放假啦,大家假期愉快 :) 36 | tags: 37 | - Campus 38 | weather: "" 39 | date: 2014-01-18T23:48:27+08:00 40 | ``` 41 | -------------------------------------------------------------------------------- /memories/2014/wanna-go-home/README.md: -------------------------------------------------------------------------------- 1 | 想回家了 2 | ======== 3 | ![回家](https://farm9.staticflickr.com/8037/7998186215_6d9e5e51bc.jpg) 4 | 5 | 周六,无课,考试也没了,又睡了一个大懒觉,吃个饭,上个网,看看自己感兴趣的网页,接着捣鼓了一下一些程序。突然有想写个好玩的东西出来的冲动,刚画了几个图,又觉得没什么劲了,这玩意写出来也只是自己玩玩吧=.= 6 | 7 | 又是宅的一天╮(╯_╰)╭ 真想约个人出去走走,聊聊。貌似想约的都回家了呢,其他同学们估计也都宅在宿舍。今天天气阴沉的很,快发霉的感觉。 8 | 9 | 这几天都有同学路过路过宿舍门口道别,断断续续的听到行李箱滚轮旋转的声音,这是回家的节奏啊。你为何还不回家? 10 | 11 | 还有一个大Boss(课程设计)和一群野怪(杂事)要打,Boss只能单刷,不能组队,并且你只有两次机会挑战,否则Boss就一年后再刷新(重修鸟)=.= 为毛隔壁班的那么爽,组队打小怪(他们小组完成,并且是研究生检查)。。。这尼玛,我可以申请转班嘛=.= 哎,也怪自己之前都没弄这课设,这学期都不知道干别的啥去了,想到这学期一些失败的经历就越觉得烦躁。 12 | 13 | 想回家了。 14 | 15 | 想念在家的日子,可以睡到很晚爸妈都不管你,可以静下来看看书,可以重新定义自己想要的到底是什么,可以吃到家里的饭菜,还有家乡的米粉以及等等,可以走在熟悉的街道,可以邀好友一起~ 16 | 17 | 我们都会回家的,一切都会好起来的。 18 | 19 | --- 20 | 图片来自flickr,by cjc51 21 | 22 | 2014-01-11 23 | 24 | 25 | ### EOF 26 | ```yaml 27 | background: //farm9.staticflickr.com/8037/7998186215_6d9e5e51bc.jpg 28 | hide: false 29 | license: cc-40-by 30 | location: Nanning 31 | summary: 我们都会回家的,一切都会好起来的。 32 | tags: 33 | - Campus 34 | - Thoughts 35 | weather: "" 36 | date: 2014-01-14T22:31:16+08:00 37 | ``` 38 | -------------------------------------------------------------------------------- /memories/2014/weixin-public-get-stared/README.md: -------------------------------------------------------------------------------- 1 | 征求建议 2 | ============ 3 | 4 | 昨晚连着看了两场球。 5 | 6 | 一场阿森纳vs卡迪夫城,2:0,比分看起来是完胜,但是过程非常艰难,最后88分钟才由替补上场的本特纳打破僵局,补时阶段沃尔科特锦上添花,这场胜利来之不易,阿森纳力压曼城回到了英超积分榜头名,太棒了。8年了,从2006年到现在,已经8年没有拿到冠军了,这赛季,也是我大学的最后一年,希望能触摸到冠军奖杯! 7 | 8 | 另一场是曼联vs热刺,热刺2:1客场在老特拉福德拿下了自己的克星曼联,站在中立球迷的角度上看,曼联这赛季联赛基本无望了,甚至考虑到目前积分榜前四的竞争力,可能前四的位置都拿不到。老实说,有点开心,风水轮流转嘛,曼联统治了英超那么多年,也该换换了。我邪恶了,曼联加油! 9 | 10 | 连看这两场比赛貌似就凌晨三点多了,也许是因为阿森纳赢了吧,居然还睡不下=.=,又看了一些其他的内容,最后搞到睡到今天中午才起来,特困......唉,真的是熬夜的命啊,这几年基本上每场比赛都追,不知道以后还有不有这样的机会咯。今天一直很困,晚上又睡了一觉。不过,既然决定了每天记录一些东西,就应该坚持写,今天才14年的第二天呀。。。 11 | 12 | 于是你们就看到了这篇很搓的文字,事实上,我也不知道我在写啥,貌似是足球吧。可能你会喜欢,这样我也开心啦,但是更有可能你不会喜欢,这不要紧,我会继续好好写,也许下一篇你就会喜欢或者觉得有用。弄这个的初衷就是尝试一种新的方式和大家分享与交流,内容不限~ 13 | 14 | 嗯,对于这个公众号怎么弄,现在我也还是在摸索中,如果你有什么好的建议,欢迎告诉我! 15 | 16 | 最后,和大家分享一句话,晚安! 17 | 18 | > **有人说:『2013,爱你一生; 2014,爱你一世』** 19 | 20 | -- 21 | image from Jure Kravanja 22 | 23 | 24 | ### EOF 25 | ```yaml 26 | background: ../xida.jpg 27 | hide: false 28 | license: cc-40-by 29 | location: Nanning 30 | summary: 对于这个公众号怎么弄,现在我也还是在摸索中。有什么好的建议,欢迎告诉我! 31 | tags: 32 | - Campus 33 | weather: "" 34 | date: 2014-01-03T00:20:48+08:00 35 | ``` 36 | -------------------------------------------------------------------------------- /memories/2014/xida.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2014/xida.jpg -------------------------------------------------------------------------------- /memories/2015/2016/README.md: -------------------------------------------------------------------------------- 1 | From 2015 to 2016 2 | === 3 | 4 | #### 2015 5 | 2015快结束了,这一年,去了几个地方,看了不少文字,玩了好些东西,写了不少程序...嗯,总得来说还是成长了不少,虽然觉得有些东西本来可以避免的,但还是硬着头皮去撞了...还有30分钟就到2016了,留给2015的时间不多了,感激这一年的经历,还是把目光投向2016吧:) 6 | 7 | 去年,好像是没有定啥目标的,想了想要是在2016年的这个时候,回过头来看自己这一年,总不能再重复2015年的目标吧。蛤蛤,做个计划,也期望2016能更好! 8 | 9 | #### 2016 10 | * 读50本书 11 | * 写50篇blog(读书笔记不算,包含10篇英文的) 12 | * 去3个从来没有去过的城市 13 | * 爬深圳剩余没完成的山(应该还剩一半,大概9座) 14 | * 锻炼身体,至少50%的日子应该是和运动做朋友的 15 | * 认识新朋友 16 | * 继续在户外的日子 17 | * 学1门新的语言(自然语言或计算机语言) 18 | * 写2个兴趣项目 19 | * 贡献社区,给成熟的开源项目提交代码,在stackoverflow上获得更多的reputation 20 | * Happy Hacking! 21 | 22 | #### One More Thing 23 | 有些东西没怎么多想,但是这些确实都是自己想做或者已经在做的事情,**未完成的得继续完成,没有做过的应尽力尝试**,这也是2015最后对2016说的话了,新年快乐! 24 | 25 | ### EOF 26 | ```yaml 27 | background: /assets/images/default.jpg 28 | hide: false 29 | license: cc-40-by 30 | location: Shenzhen 31 | summary: "" 32 | tags: 33 | - Life 34 | - Thoughts 35 | weather: a fine day:) 36 | date: 2015-12-31T23:59:04+08:00 37 | ``` 38 | -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/README.md: -------------------------------------------------------------------------------- 1 | 翻越大梧桐 2 | === 3 | 上周日,天气一如既往的炎热。来深圳整整一年了,我和朋友们终于踏上了去往梧桐山的路上。 4 | 5 | 不打算写什么游记啥的,post几张图和大伙分享吧! 6 | 7 | ![](entrance-door.jpg) 8 | > 梧桐山的大门(好像是北门吧),我们是坐211公交去的,有点偏 9 | 10 | -- 11 | ![](taishan-stream.jpg) 12 | > 我们就是沿着这个开始走(灰常长,但是没有难度),泰山涧 -> 葫芦径 -> 好汉坡 -> 大梧桐 13 | 14 | -- 15 | ![](playing-water.jpg) 16 | > 炎炎夏日,来山里玩玩水真清凉!!! 17 | 18 | -- 19 | ![](washing-face.jpg) 20 | > 走累了,借着溪水洗把脸,吃个果子,真舒服啊!!! 21 | 22 | -- 23 | ![](fall.jpg) 24 | > 一路听着水流声,很亲近 25 | 26 | -- 27 | ![](road.jpg) 28 | > 最难走的路是这样的。。 29 | 30 | -- 31 | ![](sleepy.jpg) 32 | > 在这个亭子上,吹着风,睡了一个小时- - 33 | 34 | -- 35 | ![](hero-slope.jpg) 36 | > 开始爬好汉坡,大概三百米的海拔,全程几乎都是上行,没有什么平缓的道路 37 | 38 | -- 39 | ![](peek.jpg) 40 | > get there, finally! 41 | 42 | -- 43 | ![](small-wutong.jpg) 44 | > 对面的小梧桐 45 | 46 | -- 47 | ![](music.jpg) 48 | > 山顶的摇滚,帅! 49 | 50 | -- 51 | ![](there.jpg) 52 | > 谁能告诉我,那是哪儿? 53 | 54 | 55 | **世界那么大,我想每周都出去玩,if I could I would.** 56 | 57 | -- 58 | 2015-07-05 59 | 60 | 61 | ### EOF 62 | ```yaml 63 | background: there.jpg 64 | hide: false 65 | license: cc-40-by 66 | location: Shenzhen 67 | summary: 前方多图预警! 68 | tags: 69 | - Life 70 | - Outdoor 71 | weather: "" 72 | date: 2015-07-06T20:46:29+08:00 73 | ``` 74 | -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/entrance-door.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/entrance-door.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/fall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/fall.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/hero-slope.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/hero-slope.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/music.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/music.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/peek.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/peek.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/playing-water.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/playing-water.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/road.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/road.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/sleepy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/sleepy.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/small-wutong.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/small-wutong.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/taishan-stream.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/taishan-stream.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/there.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/there.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-wutong-mountain/washing-face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-wutong-mountain/washing-face.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/README.md: -------------------------------------------------------------------------------- 1 | 越过山丘 2 | === 3 | Hi,上个周末很开心。小龙萌生了一个 wild thoughts,好像姗姗来迟,又从未走远,悄悄生根萌芽。至于是什么,咳咳,这是国家机密,到时候大伙就知道了,可能很快,也可能会晚一会,但不会太久。有些事现在不做,也许一辈子都不会做了! 4 | 5 | 这一切,都要感谢我几个好朋友,小遥同学,章鱼哥哥,江苏同学。对,还有 king 同学,上周末,和 king 玩得很开心,随手记个流水账吧- - 6 | 7 | -- 8 | ![](dinner-weekeng.jpg) 9 | > 好棒的烤鱼~感谢 king 等我那么久~这家店挺文艺的。地址在西丽,叫「烤鱼小镇」,可能要找一会儿 10 | 11 | -- 12 | ![](internet-coffee.jpg) 13 | > 大学毕业第一次去网吧玩- -,哈哈哈,好怀念啊。和一个中锋配合了一晚上,非常默契~另外,还有一个再拉萨火车站通宵的小前锋哥们,第二天早上6点 坐火车去湖南。最后一把,居然没钱到时间了,把队友给坑了,我的错!!! 14 | 15 | -- 16 | ![](king-cat.jpg) 17 | > king 家的猫,死宅啊- - 18 | 19 | -- 20 | ![](fishing.jpg) 21 | > 慵懒的周末,约起三五好友,或者带上自己的狗去钓鱼事件非常棒的事情呢! 22 | 23 | -- 24 | ![](monument.jpg) 25 | > 这是碑,你确定? 26 | 27 | -- 28 | ![](photo-skill.jpg) 29 | > 摄影技术仍需努力,之前拍的都是黑乎乎的- - 30 | 31 | -- 32 | ![](bycycling-view.jpg) 33 | > 骑行,爬坡挺有挑战,风景很好,一路上很多很多骑行客! 34 | 35 | -- 36 | ![](green-way.jpg) 37 | > 想撸一辆车了,每个周末骑行一遭,想想好棒哎 38 | 39 | -- 40 | ![](sunset.jpg) 41 | > 夕阳西下,停下来也不错~ 42 | 43 | -- 44 | ![](look-through.jpg) 45 | > 越过山丘 46 | 47 | -- 48 | ![](wanting.jpg) 49 | > 好棒的车,我也想要一辆 50 | 51 | -- 52 | ![](hill.jpg) 53 | > 终章 54 | 55 | 56 | **越过山丘,时不我予的哀愁** 57 | 58 | 今天无意中听到朋友提到这首这首歌,山丘,感觉挺有味道。继续,my wild thought! 59 | 60 | ### 越过山丘,词曲:李宗盛 61 | > 想说却还没说的 还很多 62 | 63 | > 攒着是因为想写成歌 64 | 65 | > 让人轻轻地唱着 淡淡地记着 66 | 67 | > 就算终于忘了 也值了 68 | 69 | > 说不定我一生涓滴意念 70 | 71 | > 侥幸汇成河 72 | 73 | > 然后我俩各自一端 74 | 75 | > 望着大河弯弯 终于敢放胆 76 | 77 | > 嘻皮笑脸 面对 人生的难 78 | 79 | > 也许我们从未成熟 80 | 81 | > 还没能晓得 就快要老了 82 | 83 | > 尽管心里活着的还是那个 84 | 85 | > 年轻人 86 | 87 | > 因为不安而频频回首 88 | 89 | > 无知地索求 羞耻于求救 90 | 91 | > 不知疲倦地翻越 每一个山丘 92 | 93 | > 越过山丘 虽然已白了头 94 | 95 | > 喋喋不休 时不我予的哀愁 96 | 97 | > 还未如愿见着不朽 98 | 99 | > 就把自己先搞丢 100 | 101 | > 越过山丘 才发现无人等候 102 | 103 | > 喋喋不休 再也唤不回温柔 104 | 105 | > 为何记不得上一次是谁给的拥抱 106 | 107 | > 在什么时候 108 | 109 | > 我没有刻意隐藏 也无意让你感伤 110 | 111 | > 多少次我们无醉不欢 112 | 113 | > 咒骂人生太短 唏嘘相见恨晚 114 | 115 | > 让女人把妆哭花了 也不管 116 | 117 | > 遗憾我们从未成熟 118 | 119 | > 还没能晓得 就已经老了 120 | 121 | > 尽力却仍不明白 122 | 123 | > 身边的年轻人 124 | 125 | > 给自己随便找个理由 126 | 127 | > 向情爱的挑逗 命运的左右 128 | 129 | > 不自量力地还手 直至死方休 130 | 131 | > 越过山丘 虽然已白了头 132 | 133 | > 喋喋不休 时不我予的哀愁 134 | 135 | > 还未如愿见着不朽 136 | 137 | > 就把自己先搞丢 138 | 139 | > 越过山丘 才发现无人等候 140 | 141 | > 喋喋不休 再也唤不回了温柔 142 | 143 | > 为何记不得上一次是谁给的拥抱 144 | 145 | > 在什么时候 146 | 147 | > 越过山丘 虽然已白了头 148 | 149 | > 喋喋不休 时不我予的哀愁 150 | 151 | > 还未如愿见着不朽 152 | 153 | > 就把自己先搞丢 154 | 155 | > 越过山丘 才发现无人等候 156 | 157 | > 喋喋不休 再也唤不回了温柔 158 | 159 | > 为何记不得上一次是谁给的拥抱 160 | 161 | > 在什么时候 162 | 163 | > 喋喋不休 时不我予的哀愁 164 | 165 | > 向情爱的挑逗 命运的左右 166 | 167 | > 不自量力地还手 直至死方休 168 | 169 | > 为何记不得上一次是谁给的拥抱 170 | 171 | > 在什么时候 172 | 173 | 174 | ### EOF 175 | ```yaml 176 | background: wanting.jpg 177 | hide: false 178 | license: cc-40-by 179 | location: Shenzhen 180 | summary: 越过山丘,虽然已白了头;喋喋不休,时不我予的哀愁 181 | tags: 182 | - Life 183 | - Outdoor 184 | weather: "" 185 | date: 2015-07-13T19:38:20+08:00 186 | ``` 187 | -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/bycycling-view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/bycycling-view.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/dinner-weekeng.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/dinner-weekeng.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/fishing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/fishing.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/green-way.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/green-way.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/hill.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/hill.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/internet-coffee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/internet-coffee.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/king-cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/king-cat.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/look-through.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/look-through.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/monument.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/monument.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/photo-skill.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/photo-skill.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/sunset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/sunset.jpg -------------------------------------------------------------------------------- /memories/2015/crossing-xiangsi-hill/wanting.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/crossing-xiangsi-hill/wanting.jpg -------------------------------------------------------------------------------- /memories/2015/github-figurine/README.md: -------------------------------------------------------------------------------- 1 | 团购 Github 手办 2 | === 3 | ![](https://cdn.shopify.com/s/files/1/0051/4802/products/mona-1_1024x1024.jpg?v=1422555084) 4 | 5 | Github越来越流行,几乎是软件工程师们每天工作都要浏览的网站。有没有想过,放一个真正的Github Octocat(对,没错,就是那只猫)手办在你旁边是一种怎样的体验? 6 | 7 | 感兴趣的同学可以访问Github手办的[官方链接](https://github.myshopify.com/products/5-inch-octocat-figurine)查看一下。通过视频可以看到质量还是不错的,Made with ♥ by Github,并且Only available on Github,个人觉得还是挺有收藏价值的。 8 | 9 | 于是乎也就有了这次团购的想法,本次团购非盈利,价格上也没有优惠,只是小范围的发起,主要目的为了节省运费和简化大伙的海淘流程,需要先行预约,费用大家均摊。 10 | 11 | 有任何问题欢迎通过微信号``longkai_simplicity``联系。另外其实我个人也没有海淘的经验,如果哪同学位有过相关经验非常希望他来组织这次团购! 12 | 13 | ## 团购流程(初步拟订,欢迎更好的建议) 14 | 1. 参与者先通过微信联系购买意向,确定购买的加入一个微信群方便之后的沟通 15 | 2. 截至时间之后统计购买人数N,确认大家均摊的价格``(单价40刀 * N + 总国际邮费) / N``,然后通过微信或者支付宝转账到发起人处,最后把转账信息截图和个人收货地址通过微信发给发起人 16 | 3. 购买成功后把订单和物流信息发给大家 17 | 4. 等待... 18 | 5. 如果**入境时被税**,另行通知... 19 | 6. 到达国内后通过**快递到付**的方式分发给大家 20 | 7. **截至日期**初定于本月底(7月31日)晚上12点结束 21 | 22 | ## 风险声明 23 | 1. 如果国际快递状态几周未发生变化,github会**重新补发** 24 | 2. 不排除包裹丢失的可能性(虽然很小),也算是海淘需要承受的风险吧 25 | 3. 如果始终未收到包裹,发起人会尽力向github及快递公司申请赔偿,但**不保证全额赔付**,毕竟是**非盈利性质**的团购。 26 | 27 | ## 国际邮费的标准(截至7月22日数据) 28 | 件数 | 邮费($) 29 | -----|--------- 30 | 1 | 22.29 31 | 2 | 33.21 32 | 3 | 41.94 33 | 4 | 70.73 34 | 5 | 74.37 35 | 6 | 78.01 36 | 7 | 81.65 37 | 8 | 85.29 38 | 9 | 88.93 39 | 10 | 96.21 40 | 41 | ## 尺寸大小(5寸,截图如下) 42 | ![](http://upload-images.jianshu.io/upload_images/64809-2985e20781ee8ece.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240) 43 | 44 | ![](https://cdn.shopify.com/s/files/1/0051/4802/products/mona-2_1024x1024.jpg?v=1422555084) 45 | 46 | 47 | ### EOF 48 | ```yaml 49 | background: https://cdn.shopify.com/s/files/1/0051/4802/products/mona-2_1024x1024.jpg?v=1422555084 50 | hide: false 51 | license: cc-40-by 52 | location: Shenzhen 53 | summary: 最近迷上了手办,还想从岛国弄一个初音的-.- 54 | tags: 55 | - Activity 56 | weather: "" 57 | date: 2015-07-24T14:25:39+08:00 58 | ``` 59 | -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/README.md: -------------------------------------------------------------------------------- 1 | Github团购第二轮 2 | === 3 | ## 这一次 4 | 20人,7折,14天,无税,第二次Github团购就这样迅速结束了。这次团购很快,感谢各位同学的支持! 5 | 6 | 这次团购其实是上一次的延续,在第一次团购结束之后,陆续又有不少同学询问是否还有下一轮,随着人数越来越多(一度达到了30人)以及第一次的成功结束,第二次也就顺理成章了。由于我的问题,确定团购的时间延迟了一些,但是当最终确定方案后,大伙的的响应速度非常之快,很快就付款下单了,赞! 7 | 8 | 依旧要感谢Github,再次给了7折优惠码。和Github沟通很愉快,并且在邮件中提到了上一次团购有一个章鱼喵手办的胡子缺失了,他们非常客气地在这次包裹中补了4份胡子...看到输入折扣码后直接少了快300刀,那感觉还是挺舒服的,哈哈。这回团购的物品不局限于手办了,还有其他的周边产品包括马克杯子,贴纸,还有Github的文化衫,感觉都还不错的。尤其是那个杯子,本来自己也想买一个,但是下单时提示同一型号的杯子每个订单限制一个,也只好忍痛割爱了。也许,下一次,再发个邮件问问能不能多买几个,蛤蛤。还有那个贴纸也不错,很久很久没有玩过贴纸了,这回不知道买啥就买了一包,拿到的时候感觉真的挺好玩的。但是笔记本已经没有地方可以贴了,考虑送人哈,尤其是妹子^_^ 后来看到一个同学电脑贴满了贴纸,才发现还可以这样玩的,赞! 9 | 10 | 最后,我觉得弄Github周边这个团购,除了给大伙带来一些福利之外,对我来说则是认识了一群很有趣的朋友。最初也没有想过会这样,只是自己一个人买觉得运费太贵,想找些朋友来均摊,没想过会梅开二度,更没想过认识不少小伙伴。有户外爱好者,有通过API查物流的,有通过Github issue来讨论团购问题的,有一起看球的HHKB风骚无刻党,有Emacs党,还有Java同学,golang同学,iOS同学,等等,很高兴认识你们😄 11 | 12 | ## 下一次 13 | 最近又有不少朋友表示想要参团了,有技术圈子的朋友,也有萌妹子,有给孩子买衣服的,更有想要买头盔的-_-# 大概已经有十几个了吧,借这个机会,谢谢大家的支持,团购的原则和流程和[原来](https://github.com/longkai/longkai/blob/master/memories/2015/07/github-figurine.md)基本一致(参考前两次的经验稍有修改,具体在微信群中说明),不限于手办,其他的周边产品都行,至于折扣,我会尽力去和Github沟通争取,截至时间暂定于本月底,9月29号收款,9月30号付款下单。不出意外的话,马克杯是我的。 14 | 15 | 谢谢大伙的支持! 16 | 17 | ## One More Thing 18 | 今天去穿越东西冲了,走了一天,挺累的,突然想起欠一篇这次团购的记录,于是就写成这个样子了...下面晒一下同学们收到手办后的图(如有版权问题,请联系我-_-#) 19 | 20 | 大伙晚安! 21 | 22 | ![](github-group-buying-2nd-1.jpg) 23 | ![](github-group-buying-2nd-2.jpg) 24 | ![](github-group-buying-2nd-3.jpg) 25 | ![](github-group-buying-2nd-4.jpg) 26 | ![](github-group-buying-2nd-5.jpg) 27 | ![](github-group-buying-2nd-6.jpg) 28 | ![](github-group-buying-2nd-7.jpg) 29 | ![](github-group-buying-2nd-8.jpg) 30 | ![](github-group-buying-2nd-9.jpg) 31 | ![](github-group-buying-2nd-10.jpg) 32 | ![](github-group-buying-2nd-11.jpg) 33 | 34 | ### EOF 35 | ```yaml 36 | background: github-group-buying-2nd-1.jpg 37 | hide: false 38 | license: cc-40-by 39 | location: Shenzhen 40 | summary: 这一次,下一次 41 | tags: 42 | - Activity 43 | weather: "" 44 | date: 2015-09-20T23:50:47+08:00 45 | ``` 46 | -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-1.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-10.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-11.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-2.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-3.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-4.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-5.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-6.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-7.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-8.jpg -------------------------------------------------------------------------------- /memories/2015/github-group-buying-2nd/github-group-buying-2nd-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-group-buying-2nd/github-group-buying-2nd-9.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/README.md: -------------------------------------------------------------------------------- 1 | GitHub Octocat 手办团购第一轮 2 | === 3 | ![](https://cdn.shopify.com/s/files/1/0051/4802/products/mona-1_1024x1024.jpg?v=1422555084) 4 | 5 | 今天,抗战胜利日,组织的第二波GitHub团购下单了,借着这个机会,突然觉得,假若没有第一次团购的经历,自然也没有这一次。借着这个机会,记录一下第一次的团购那些事儿吧~ 6 | 7 | ## 起源 8 | 第一次见到GitHub Octocat大概是去年刚毕业的时候,是非常Geek的一个同事在公司的微信群上发的图片和链接吧,当时他便问其他的同事,有谁感兴趣的,一起去团购一个吧?我一看到就觉得这玩意不错啊(当时还不知道手办是个啥东西...),然后就举手的,但是好像就没有人响应了,最后也就无疾而终了... 9 | 10 | 再后来,大概是今年,看到一个朋友桌子上摆放着各式各样的动漫人形玩具吧,感觉挺有意思的,整个桌子上瞬间就不单调了,而后才知道了手办这个概念。接下来,一个偶然的机会和朋友去会展中心参加了动漫展,感觉像是,又发现了一个很有意思的世界~然后,发现当时一个初音的coser挺pretty的,顿时就萌发了想要一个手办的想法。 11 | 12 | 说办就办,经过多方了解与调研,手办得是原产的才好,那里好呢,自然是岛国啦。恰好有一个同学再岛国毕业旅行吧,于是就问那个同学能否带一个回来,最后貌似是1200软妹币吧,当时我就震惊了,犹豫了一下,朋友已经飞回国了... 13 | 14 | 接下来几天连代码都写不好了,一想到代码,就想到了好像GitHub有一个类似的东西来着,于是就去官方的shop看了一下,40刀一个,并且一个国际运费都要20刀!然后随便改了改数值,发现个数越多,平均的运费就越少,于是就想到了要是有其他朋友一起购买,那不就可以省一些运费了嘛,这难道就是传说中的共享经济? 15 | 16 | 有些跑题了,总之,接下来就写了团购GitHub手办的blog,老实说,我没有想过会有几个人感兴趣甚至是参团的,甚至我觉得写出来也就是好玩儿,过几天我自个儿就去下单了。 17 | 18 | ## 助力 19 | 不出所料,在blog发出去一连几天都没有人参团,有的人不理解为啥要花钱买一个相对来说贵的东西,我也很理解他们,这其实很正常。就比如说为什么一个女生翻越艰难的山路到达山顶只是为了找到一个好的拍摄地点拍摄自己想要的照片,知道的人很理解,不知道的人其实也很好理解。 20 | 21 | 然后有一天,好朋友salt tiger微信中问我,那个团购需要需要他的帮忙在圈子里宣传一下?我说好啊,然后比较认真的态度重新修订了流程和相关的风险并且通过GitHub Pull Request的方式修改团购的那篇blog(这种协作方式真的不能再酷,甚至是有朋友后来提议直接在GitHub的issue区进行讨论并提交团购信息,WOW)并转发到了自己的网站和微博中。非常感谢! 22 | 23 | 接下来,在一周的时间内,陆陆续续不少同学表示参团。本身是没有折扣的,突然想到要不给GitHub官方发个邮件过去试试,为大伙争取一些优惠哈哈。很快,GitHub第二天就很nice的给了30%优惠的折扣码(并且,第二次也给了,LOL)。就这样,本来1000刀的,瞬间就少了300刀,那感觉还是蛮爽的。 24 | 25 | 在商量付款的时候,考虑到潜在的关税和国内邮费的问题,最后大家统一按照2^8每件的方式付款,nice。 26 | 27 | ## 到达 28 | 大概是在付款后3-4天之后GitHub开始发货,使用usps的空运过来。大概2天就到了北京,之后的时间就比较漫长了,几天都没见到物流状态的变化,大概一周后,才看到attempt delivery的状态。WOW,没有被税,好棒!淡淡的高兴之余,可是等了4,5天都没看到快递过来。后面网上查了一下,貌似usps到了国内之后,就由EMS派送了,在EMS查了一下,果然有,蛋疼的是他就是没有派送过来! 29 | 30 | 于是打了电话过去问,他们说地址上没有写联系号码就不知道怎么送,要凭本人身份证去附件的邮局自取,我也只能呵呵了。实际上后来发现,再usps的运单上,是写了我的邮件地址和手机号码的。呵呵,再一次。 31 | 32 | 总之,在七夕那天,很坑爹去邮局自提了,很大很重的一个箱子外面贴着GitHub的订单,上面明明已经写得很清楚了价格,但是还没有被税,WOW。接下来,当天晚上给团购的朋友们寄送并且多退少补余下的钱。这里不得不提顺丰,真心快!当天晚上从深圳寄出的,第二天北京的朋友就已经有收到的了。 33 | 34 | ## 尾声 35 | 收到手办后朋友们都发来晒手办的图,WOW,感觉还是蛮不错的!这里未经他们允许,擅自把图片贴在这里会不会被举报啊,嘿嘿。 36 | 37 | 由于第一次手办结束之后,陆续又有很多朋友表示继续参团,并且在第一次团购的时候有一个朋友表示少了胡须,给GitHub发邮件确认了之后他们也表示会将胡须寄出,于是也就有了今天这一次,也是第二次的团购。 38 | 39 | 谢谢大伙,谢谢在团购中给予帮助与支持的朋友们,认识你们挺好的,LOL~ 40 | 41 | ![](octocat-1.jpg) 42 | 43 | ![](octocat-2.jpg) 44 | 45 | ![](octocat-3.jpg) 46 | 47 | ![](octocat-4.jpg) 48 | 49 | ![](octocat-5.jpg) 50 | 51 | ![](octocat-6.jpg) 52 | 53 | ![](octocat-7.jpg) 54 | 55 | ![](octocat-8.jpg) 56 | 57 | ![](octocat-9.jpg) 58 | 59 | 60 | ### EOF 61 | ```yaml 62 | background: octocat-6.jpg 63 | hide: false 64 | license: cc-40-by 65 | location: Shenzhen 66 | summary: 今天,抗战胜利日,组织的第二波GitHub团购下单了,借着这个机会,突然觉得,假若没有第一次团购的经历,自然也没有这一次。借着这个机会,记录一下第一次的团购那些事儿吧~ 67 | tags: 68 | - Activity 69 | weather: "" 70 | date: 2015-09-04T01:25:24+08:00 71 | ``` 72 | -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-1.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-2.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-3.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-4.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-5.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-6.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-7.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-8.jpg -------------------------------------------------------------------------------- /memories/2015/github-octocat-group-buying-1st/octocat-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/github-octocat-group-buying-1st/octocat-9.jpg -------------------------------------------------------------------------------- /memories/2015/happy-ending/README.md: -------------------------------------------------------------------------------- 1 | 毕业快乐,各位! 2 | === 3 | 4 | 今晚,大学舍友「江苏」同学从杭州打电话来约去跑步,欣然同意。然后去旁边的荔香公园跑了快3公里,好久没跑了,好累啊... 5 | 6 | 慢慢悠悠地荡回家,陆续遇见路人问路,有中年大哥,也有像是刚毕业背着包的学生。嗯,欣然指明了他们要去的方向。然后接着走回家,走到天桥上,望着繁忙的深南大道上来来往往的车辆,不自觉地想到了去年的这个时候。 7 | 8 | === 9 | 10 | 大概是6月28日上午终于拿到了毕业证和学位证(学院一拖再拖),然后下午简单地收拾了一下四年的东西(基本都送了或者扔了),和隔壁宿舍的大伙互道珍重。然后去了隔壁的那栋女生宿舍,噎着的话依旧没有说出来(不知道该怎么形容),踏上了回家的动车。 11 | 12 | 大概是傍晚到家后,放置了行李,然后和爸妈吃了晚饭,在家睡了一晚(其实整晚都没睡着),大清早地由老爸送到了机场(机场真远),匆匆打包了一碗米粉,可惜没有油条。 13 | 14 | 然后大概两小时(好像没这么久),就到了深圳机场。当时用的手机仍是2G卡,加上异地漫游,于是就在机场蹭wifi向家人朋友们报平安并且查查攻略和路线什么鬼的。接着在师兄的建议下,搭乘机场巴士到了南山区科苑北站,科兴科学园,我即将工作的地方。 15 | 16 | 那天是星期天,天真的我,以为那天会有人在公司!然后打了一个电话给全哥,当时公司的技术负责人,可以说是他把我带到深圳的。他当时大概在hk吧,于是就让公司的MM飘飘给我一些帮助,好像还建立一个微信群。飘飘和我一样,也是大四,接下来的一年,她给了我不少帮助。她建议我在深大周边找个地方住下,好像是这样。 17 | 18 | 然后我就背着书包,沿着科苑路走到深南大道,沿着深南大道走啊走,看呀看,拍拍照,感受这个城市(绿化特别好,氛围很喜欢),然后又绕着深大走了一圈,到了一个门,大概是学府路那边?然后几经波折,找了个旅店休息了,好贵,100多一天,大概住了一个周(还好学校当时退还的学费到账了),直到师兄帮忙到现在的地方借宿。 19 | 20 | 第二天,开始上班。由于还不太清楚公交,索性走路去上班,沿着深大走到深南大道,再走到科苑北,我是小瞧了深圳的天气和路线,走了好远,出了一身汗...然后到了公司,认识了一些同事,拿到了一台新的MacBook Pro,开始了人生第一份正式工作。 21 | 22 | 接连几天下班,已经挺晚的了,还得去找房子,特别感谢公司的设计JJ小哥,带我去附近找房子。当时的房子那一个难找,那一个贵啊,也是活该,正值毕业季,又没有事先规划(太懒了),搞得非常非常麻烦。很累,又不熟悉路,一个人摸索着回旅店。背着感觉很重的书包,走啊走,看着地图导航,问问路上的行人,拖着疲惫的双腿走回去。不止一次,经过今晚的天桥上。 23 | 24 | 回到旅店,灰常晚了,实在太累,在床上一趴就是到天明,然后洗浴就去上班。 25 | 26 | 大概一周都这是过来的,直到现在的落脚点。 27 | 28 | === 29 | 30 | 一年了,时间过得真快。特别感谢师兄们,全哥,飘飘还有那些一起经历的人们。匆匆那年,其实当时也是在毕业前才决定到深圳,本来已经是准备北上了的。现在回忆起来尽管感觉像是轻描淡写,但是那种感觉,那种带有一些未知的冒险的旅途,比起满满的计划还是要酷一些。来深圳,不后悔。 31 | 32 | 「最美的邂逅总是在远方」,毕业快乐,各位! 33 | 34 | === 35 | 2015-07-02 36 | 37 | 38 | ### EOF 39 | ```yaml 40 | background: xida.jpg 41 | hide: false 42 | license: cc-40-by 43 | location: Shenzhen 44 | summary: 「最美的邂逅总是在远方」,毕业快乐,各位! 45 | tags: 46 | - Campus 47 | - Thoughts 48 | weather: "" 49 | date: 2015-07-03T01:36:19+08:00 50 | ``` 51 | -------------------------------------------------------------------------------- /memories/2015/happy-ending/xida.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2015/happy-ending/xida.jpg -------------------------------------------------------------------------------- /memories/2016/climbing-nanshan/README.md: -------------------------------------------------------------------------------- 1 | 翻越南山 2 | === 3 | 4 | 上周末和朋友约好去爬南山,已经走到了山脚下,无奈天公不作美;于是本周六再上南山。 5 | 6 | 南山区之所以为南山区,原因多半是区内有大小两座南山吧,根据[维基百科][1]的说法: 7 | 8 | > 因辖区内拥有风光秀丽的大南山、小南山和建村历史700多年的南山村,故命名为南山区。 9 | 10 | ![map](map.jpg) 11 | 12 | 大南山位于南山半岛上,海拔大概有**336**米,整体有点像是个上边较长的梯形;共有3个登山口,分别是别墅登山口,海关登山口和北登山口;然而我每次上山都是从海上世界的别墅登山口上山,可能是那交通较为方便吧...... 13 | 14 | 从别墅登山口的沿山路上山非常容易,台阶相对海关登山口平稳多了,而且一路上凉风习习,不间断的树荫。随着高度的爬升,渐渐就可以俯瞰到山脚下的蛇口,深圳湾以及深圳湾大桥连接的香港了。 15 | 16 | ![view](view.jpg) 17 | 18 | 天气依旧坑爹,2,3点暗得像是6,7点的样子,而且大雾严重影响了可见性。 19 | 20 | 在山顶待了一会,看起来就要下雨了,我们没带伞于是就沿着盘山公路朝着北登山口的盘山公路下山了。顺便说一句,这条路下行坡度较陡,走着走着真刹不住车...... 21 | 22 | 下周见。 23 | 24 | ## EOF 25 | ```yaml 26 | background: view.jpg 27 | hide: false 28 | license: cc-40-by 29 | location: Shenzhen 30 | summary: 翻越大南山 31 | tags: 32 | - Outdoor 33 | weather: rainy & foggy 34 | date: 2016-04-09T20:12:17+08:00 35 | ``` 36 | 37 | [1]: https://zh.wikipedia.org/wiki/%E5%8D%97%E5%B1%B1%E5%8C%BA_(%E6%B7%B1%E5%9C%B3%E5%B8%82) 38 | -------------------------------------------------------------------------------- /memories/2016/climbing-nanshan/map.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/climbing-nanshan/map.jpg -------------------------------------------------------------------------------- /memories/2016/climbing-nanshan/view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/climbing-nanshan/view.jpg -------------------------------------------------------------------------------- /memories/2016/climbing-tanglang/README.md: -------------------------------------------------------------------------------- 1 | 翻越塘朗山 2 | === 3 | 4 | > 小隐于野大隐于市 -- 东方朔 5 | 6 | 四月初的天气不错,于是找了个周六和朋友踏上了久违的户外。 7 | 8 | 大多数人看到的深圳可能是一座新兴的现代化城市,遍地而起的高楼大厦;然而,忽略了她的山青水秀,就像[引言][1], 9 | 10 | > 闲逸潇洒的生活不一定要到林泉野径去才能体会得到,更高层次隐逸生活是在都市繁华之中,在心灵净土独善其身,找到一份宁静。 11 | 12 | 深圳便是这样一座城市:靠海多山,深圳湾,红树林,南澳东西冲,杨梅坑,大小南山,梧桐山,...,能想到的太多了。 13 | 14 | 放下周一至周五繁忙的工作,周末找个时间,约上三五好友,踏上户外的路上,其实也挺不错的呢。 15 | 16 | 从去年下半年开始,自己和朋友陆陆续续翻越、穿越了十几个地方,今年的计划之一是把深圳大大小小十八座山都给翻越一遍。 17 | 18 | 春天到了,该出去走走了,这一次,我们去的是塘朗山。 19 | 20 | ## 塘朗山 21 | 塘朗山位于深圳中部,交通方便;登山道多,可近可远,近则2小时左右便可登顶下山,远则可以登顶后继续穿越梅林后山至梅林水库甚至更远(上一次用了快6小时......) 22 | 23 | 从地形图上看到,塘朗山及其顶峰只是占左边的一小块,右边那一片一直连绵到梅林水库甚至更远的相思林公园......考虑到冬眠有一段时间了,不胜脚力,这一次还是简单地选择了从桃源村的塘朗山公园荔云登山道上到顶峰,再顺着盘山公路下山,走走停停,总共两小时不到吧。 24 | 25 | ![](map.jpg) 26 | 27 | ![](intro.jpg) 28 | 29 | ![](way.jpg) 30 | 31 | ![](on-the-way.jpg) 32 | 33 | ![](view.jpg) 34 | 35 | ## By The Way 36 | 不知道写啥了,不打算写成攻略,也不想成为流水记......记录一下匆匆忙忙的生活之余吧;记忆,也是这样一点一滴形成的吧? 37 | 38 | 春天到了,也该出去走走罢! 39 | 40 | ## EOF 41 | ```yaml 42 | background: view.jpg 43 | hide: false 44 | license: cc-40-by 45 | location: Shenzhen 46 | summary: 春天到了,出去走走吧 47 | tags: 48 | - Outdoor 49 | weather: humid & foggy 50 | date: 2016-04-03T23:12:17+08:00 51 | ``` 52 | 53 | [1]: http://baike.baidu.com/link?url=kPPoRrHVLRe8kn7ziY8L2m5qxzhlxAZ34eCGqZAzXtmsyw8ryTz0_XxxMXGlQjDkYuPFE6QDE2fC1SG2s0UoLa 54 | -------------------------------------------------------------------------------- /memories/2016/climbing-tanglang/intro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/climbing-tanglang/intro.jpg -------------------------------------------------------------------------------- /memories/2016/climbing-tanglang/map.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/climbing-tanglang/map.jpg -------------------------------------------------------------------------------- /memories/2016/climbing-tanglang/on-the-way.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/climbing-tanglang/on-the-way.jpg -------------------------------------------------------------------------------- /memories/2016/climbing-tanglang/view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/climbing-tanglang/view.jpg -------------------------------------------------------------------------------- /memories/2016/climbing-tanglang/way.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/climbing-tanglang/way.jpg -------------------------------------------------------------------------------- /memories/2016/go-revamp/seq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/go-revamp/seq.png -------------------------------------------------------------------------------- /memories/2016/sell-gobook/README.md: -------------------------------------------------------------------------------- 1 | [已售]出售新书: The Go Programming Language 2 | === 3 | 4 | > Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. 5 | 6 | > -- golang.org 7 | 8 | 上周末去香港自提了海淘的几本书,其中就包含了这本去年(2015)11月才初版的《[The Go Programming Language][1]》技术书籍,虽说刚出版没多久,但注定会成为 golang 社区的经典书籍,就像《[The C programming Language][2]》之于 C 语言。 9 | 10 | 至于语言本身,这里也就不在谈论了,这里只谈论这本书,以及,我为何要出售这本刚到手的书...... 11 | 12 | ## 出版社 13 | 先谈谈出版社吧。 14 | 15 | 经过这几年的看书学习,渐渐地对出版社有了些认识,就像译林的国外名著一般比人民文学好一些,说白了也就是品牌效应。计算科学相关的图书(这里讨论的是国外)的出版社貌似也不是很多,其中包括著名的动物书O'Reilly,Addison-Wesley Professional Computing Series,Manning 的 xx In Action 等。 16 | 17 | 其中动物书的书最多也最新,大多是时下最流行的,据介绍编辑大多也是技术出身,排版格式支持也最好(话说我看得最多的就是这个了......学生时代经济拮据,只能去下原版电子书了)。 18 | 19 | 而 Addison-Wesley Professional Computing Series 经常出版经典的计算科学相关的书,如大家所熟知《The C Programming Language》《设计模式》《计算机程序设计的艺术》《编程珠玑》等。 20 | 21 | 所以,既然这本书出版自 Addison-Wesley ,注定也是要成为经典的......不信?那么接着往下看。 22 | 23 | ## 作者 24 | 作者分别来自学术界和工业界,这样一来给人一种兼具理论和实践的样子(确实有这意思)。 25 | 26 | 作者之一,[Brian W. Kernighan][3],熟悉 C 语言的同学应该了解他是谁。对没错,他就是那本 C 语言的合著者之一。他在贝尔实验室待过,是 awk 语言的 k,现在在普林斯顿大学担任教授。除了 C 和 Go,他还写/合著过好几本经典书籍,如《The Unix Programming Environment》《Software Tools in Pascal 》等,其中有个叫 [Rob Pike][4] 的家伙和他有过多次合作,而 Rob 是 Golang 的设计(布道)者。 27 | 28 | 另一位作者是 Google 的工程师,写了超过15年的程序,这也是很多人难以企及的高度吧。 29 | 30 | 从作者们来看,用娱乐圈的话来说,算是跨界合作,蛤蛤-.- 31 | 32 | ## 内容 33 | 作为看过快2遍的人来说,这本书的内容绝对精彩甚至经典,她带我从基本门外汉成为 gopher(go 开发者)。通过这本书,我不仅仅学到了 go 本身,还有不少思想,以及计算科学一些底层的东西。美亚评价分4.8分,满分5分。 34 | 35 | 题外话,实际上在拿到纸书之前,在朋友@silttiger 的帮助下,已经在 kindle 上看过快1.5遍了。 36 | 37 | 这里,通过列举书的章节来简单地谈谈我学到的东西(看得不深入的抱歉哈......) 38 | 39 | #### 1. Tutorial 40 | 给你一个 golang 的初步的感性认识,从 ``Hello, World`` 到 http server,例子不是玩具,而是 real problem。 41 | 42 | #### 2. Program Structure 43 | 这章主要介绍的 go 的程序结构,关键字,和其他语言比较大的区别。 44 | 45 | #### 3. Basic Data Types 46 | ``bool``, ``int``, ``float``,``string``,变量常量这些,看起来略简单,但是相对于 java 来说更接近底层,对于深入理解有较大帮助,尤其 string,能够让你理解什么是 utf-8。 47 | 48 | #### 4. Composite Types 49 | 数组,slice(类似线性表)map,struct 等,尤其是深入底层解释 slice 值得一看。 50 | 51 | #### 5. Functions 52 | 函数式编程,栗子极好,及其最佳实践。理解后对于后续的面向对象方法,接口和核心的并发很有帮助。 53 | 54 | #### 6. Methods 55 | go 特殊的面向对象机制。 56 | 57 | #### 7. Interfaces 58 | go **低耦合** 的接口模式,栗子很棒,很丰富和实用。 59 | 60 | #### 8. Goroutines and Channels 61 | 并发基础,channel,select 等,chat server 栗子非常有深意。 62 | 63 | #### 9. Concurrency with Shared Variables 64 | 并发安全相关,介绍很深入,non-blocking 栗子值得多看几次。 65 | 66 | #### 10,11,12,13 67 | 这里略过了,感兴趣的可以自己去看看。 68 | 69 | 70 | 好了,不继续背书了,既然这本书这么好,为什么要卖这本书? 71 | 72 | ## 为什么出售? 73 | 理由很简单,因为我有两本。 74 | 75 | 为毛有两本?因为美帝的快递坑爹啊,顿时觉得我大天朝 **n 日达** 简直无敌。我在美亚上下单到收货的过程一波三折,几来几去,用了 **一个月** 才从发货处运送到尚且在美国的转运仓库...... 76 | 77 | 醉了,我本来发起了退款申请;谁知道过了几天他居然到了,然后在这期间,我发现中亚购买原版书有满300-150的优惠,次日达!!于是毫不犹豫拿下了。 78 | 79 | 所以现在有两本,所以我打算出售从美亚海淘回来的那本,所有的清单都还健在,至于价格,现定于原价出售,价格包括美亚售价+海淘转运费,以及国内快递...... 80 | 81 | 最终的价格为美亚购买价格(26.48刀)+ 转运费(200/3,我买了3本书)+ 国内快递费,凑个好数字也就基本上是255元;总的价格肯定是低于 [中亚的价格][5] 以及自己去海淘的价格。 82 | 83 | 相对国内的书来说,看起来贵了,然而这毕竟是知识,还是第一手的知识。当然,等待国人翻译的版本或者影印版那也是可以的。 84 | 85 | ## 在哪交易? 86 | [闲鱼链接在此][6] ,有任何疑问欢迎联系我 :) 87 | 88 | ## One More Thing 89 | 连续第二天跑步了,坚持。俗话说,4月不跑步,5月徒伤悲! 90 | 91 | ### EOF 92 | ```yaml 93 | background: gobook.jpg 94 | hide: false 95 | license: cc-40-by 96 | location: Shenzhen 97 | summary: 出版社 + 作者 + 内容 = 注定经典的一本书 98 | tags: 99 | - Reading 100 | - Golang 101 | weather: run fun 102 | date: 2016-04-01T23:46:37+08:00 103 | ``` 104 | 105 | [1]: http://www.amazon.com/Programming-Language-Addison-Wesley-Professional-Computing/dp/0134190440/ref=sr_1_1?s=books&ie=UTF8&qid=1459200107&sr=1-1&keywords=the+go+programming+language 106 | [2]: http://www.amazon.com/The-Programming-Language-Brian-Kernighan/dp/0131103628 107 | [3]: https://en.wikipedia.org/wiki/Brian_Kernighan 108 | [4]: https://en.wikipedia.org/wiki/Rob_Pike 109 | [5]: http://www.amazon.cn/The-Go-Programming-Language-Donovan-Alan-A-A/dp/0134190440/ref=sr_1_2?s=books&ie=UTF8&qid=1459199881&sr=1-2&keywords=the+go+programming+language 110 | [6]: https://2.taobao.com/item.htm?spm=2007.1000622.0.0.qGPPRg&id=529035556591 111 | -------------------------------------------------------------------------------- /memories/2016/sell-gobook/gobook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2016/sell-gobook/gobook.jpg -------------------------------------------------------------------------------- /memories/2017/2016-reading-list/we-space.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2017/2016-reading-list/we-space.jpg -------------------------------------------------------------------------------- /memories/2018/12-years-with-football/ball.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/12-years-with-football/ball.jpg -------------------------------------------------------------------------------- /memories/2018/airbnb-first-experience/README.org: -------------------------------------------------------------------------------- 1 | * Airbnb 民宿初体验 2 | 3 | #+BEGIN_QUOTE 4 | *更新:* 5月2号早上到深圳时,看到了主人给我撰写了评论: 5 | 6 | “有礼貌的男生,很会生活。退房时整理了床铺,房间保持的很干净,欢迎你下次入住呀!” 7 | 8 | 谢谢,有机会还会去的。 9 | #+END_QUOTE 10 | 11 | 五一去北京办点事儿,事情搞砸了,很遗憾,回去再继续好好学习,改变,生活和工作吧。 12 | 13 | 心情比较糟糕,还好住的地方还是很让人舒服,能让人安静地思考。这次没有选择酒店旅馆,而是选择了民宿。一来假期出行人多,前者较贵不好订或者便宜点的各种问题;二来,也是最主要的,就是想体验一下不同吧。 14 | 15 | 民宿,就是主人把自己家空余的房间,甚至是沙发给旅客短期居住使用。相对酒店来说,自由度很高,你可以用相对低廉的价格住到相当好的房间,以一种客人的体验入住,可以和主人聊天,了解这个城市,甚至是一块儿吃饭,等等。 16 | 17 | Airbnb(中文叫爱彼迎),自己很早就听过这个世界上最大的民宿平台了,可以在手机app和网站上预约世界各地的房间。15年去上海差点就预定好了,但是后面因为时间冲突取消掉了。这次去北京突然想起她了,就果断用上了。对比了一下,最后选择了一个看起来很不错,实际上也很好的地方。 18 | 19 | 28号提前了一点下班就直接提着行李箱去往深圳北坐动卧去北京,现在想起那时心里既忐忑又有点小期待的。动卧的体验也很好,夕发朝至,晚上8点开,第二天早上七点就到北京西了,你还可以睡一觉,相对坐飞机挺舒服的,这是飞机之外的另一个好选择哦。 20 | 21 | [[file:gt.jpg]] 22 | 23 | #+BEGIN_QUOTE 24 | 动卧上的晚餐(其实是零食。。 25 | #+END_QUOTE 26 | 27 | 早上到北京很准时,然后坐地铁去目的地,不得不说北京的地铁真的是太方便了,无远弗届,看着那密密麻麻的线路图还真不好找路线;另外,北京地铁还支持二维码,Apple Pay进站,方便得不要不要的,对比深圳那地铁,真是差了好远呢。 28 | 29 | 坐了好长时间到了目的地铁,过程有些曲折,主人的留的电话又是停机的,但是最后还是找着了,哈哈。美女房东人特别好,给你说明各种问题,提供必要的物品。房间很棒,干净宽敞明亮,给人一种特别的舒服的感觉。倒是我觉得有点不好意思,以后自己的家也要收拾干净像这样舒服才行呢。 30 | 31 | [[file:room.jpg]] 32 | 33 | [[file:living-room.jpg]] 34 | 35 | #+BEGIN_QUOTE 36 | 宽敞明亮舒适干净的房间 37 | 38 | 主人很多书,一看就很文艺 39 | #+END_QUOTE 40 | 41 | 洗了个澡出门,慢慢地走出小区,发觉特别地宁静和友善。不住地鸟叫声让人听着很舒服,刚来的时候找门牌单元号还有老大爷老大妈主动地给你指路,很温馨,真的。身后突然遛出一条小柯基,围着你转,感觉好可爱,哈哈,问了问这小家伙的主人是否自己可以拍个照,她爽快地答应了,只是mojito(汪的名字)太害羞了,都不敢正对着你,噗。这样出门的一天,整个人的心情都非常好。 42 | 43 | [[file:mojito.jpg]] 44 | 45 | #+BEGIN_QUOTE 46 | Don't be shy 47 | #+END_QUOTE 48 | 49 | 今晚要回深圳了,非常感谢主人的招待还有朋友的陪伴。很棒的居住体验,推荐! 50 | 51 | 再见,北京。 52 | 53 | 54 | ** 广告 55 | 56 | 最后打个广告吧,如果你没用过airbnb的话,通过我的[[https://abnb.me/e/6FuqYXhNyM][链接]]注册账号将会获得¥175的旅行基金哦。 57 | 58 | ** EOF 59 | 60 | #+BEGIN_SRC yaml 61 | summary: Airbnb 民宿初体验,2018,五一,北京 62 | weather: cloudy 63 | license: cc-40-by 64 | location: 39.92, 116.43 65 | background: ./room.jpg 66 | tags: [旅行] 67 | date: 2018-05-01T15:28:50+08:00 68 | #+END_SRC 69 | -------------------------------------------------------------------------------- /memories/2018/airbnb-first-experience/gt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/airbnb-first-experience/gt.jpg -------------------------------------------------------------------------------- /memories/2018/airbnb-first-experience/living-room.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/airbnb-first-experience/living-room.jpg -------------------------------------------------------------------------------- /memories/2018/airbnb-first-experience/mojito.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/airbnb-first-experience/mojito.jpg -------------------------------------------------------------------------------- /memories/2018/airbnb-first-experience/room.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/airbnb-first-experience/room.jpg -------------------------------------------------------------------------------- /memories/2018/macbook-screen-repairness/README.org: -------------------------------------------------------------------------------- 1 | * MacBook 换屏小记 2 | 3 | MacBook Pro Retina 的屏幕显示非常清晰锐利,用过之后就不想看原来那些低分辨率的屏幕了。但是这屏幕有个致命的缺点,屏幕涂层容易脱落,据说是 Apple 为了防止屏幕眩光而设计的。一开始自己也没注意,直到2年前某天朋友指出屏幕有点花才发现,然后尝试用包装盒里配的黑色布加水去擦拭,才发现根本擦不掉!具体的图片自己没有拍,网上搜一下有很多。不过只有在熄屏以及非常暗的时候才看得比较明显,否则也不影响体验。当时网上查了下,好像是多数机器都有这状况,购买激活之日起3年内都可以免费更换。由于自己平常都是外接屏幕使用的,本子通常用来看看网页,所以也没太着急。 4 | 5 | 我是15年5月31号在香港买的,3年也快到了,网上看过一些相关的换屏文章后,上上周自己抱着试一试的心态在网上预约一下 genius bar,根本没有空余的名额嘛。好像一直是这样一个约不到的情况,点了个立即与 Apple 支持部门人员通话的选项,两三分钟后 Apple 就打电话来了。她很有礼貌和专业的询问了情况然后愉快地给我预约了益田假日广场的名额。根据她的说法,购买之日起4年内都行,厉害了(2016年之后的只有2年,貌似是对于新款)。 6 | 7 | 约的时间是上周六12点半,准时到了之后工作人员很客气的安排的位置等候。发现有很多人是现场预约的,对面对一哥们说得等到下午5点了。还好,下次要是网上约不到对话可以直接打电话给客服。没过多久,对接对工作人员来了。问机器是啥问题,我说屏幕涂层脱落,他看了一眼,直接就说帮我换屏。估计这也是一个普遍的问题吧,然后说会检查一下是否还有其他的问题,然后2-7个自然日内会打电话通知去拿。很利索。 8 | 9 | [[file:holiday-plaza.jpg]] 10 | 11 | #+BEGIN_QUOTE 12 | 白天,很热 13 | #+END_QUOTE 14 | 15 | 周日傍晚在超市买菜,突然接到一个电话,0755开头的,然后猜到是多半是苹果打来多。没错,说电脑屏幕已经换好了,晚上就可以去拿了。然后检查的时候发现电池鼓胀,根据苹果的政策,3年之内可以免费更换,换电池顺便也把键盘给换了。真刺激啊,心中一阵小开心,还好自己试了一下,就差那么三四天,换得了一个新的屏幕和电池键盘,价值8k大洋,难道 CPU 和内存就值3k多么... 16 | 17 | [[file:holiday-plaza-night.jpg]] 18 | 19 | #+BEGIN_QUOTE 20 | 夜晚,还是很热。。 21 | #+END_QUOTE 22 | 23 | [[file:list1.png]] 24 | 25 | [[file:list2.png]] 26 | 27 | #+BEGIN_QUOTE 28 | 维修清单,贼贵了,东西好用,但是坏了真的修不起啊。。。 29 | #+END_QUOTE 30 | 31 | 拿到电脑后,检查了下,ABC 面都换了。小情人干净得又换了新的衣服,一起生活,学习和工作3年了,一直都有你在身边。 32 | 33 | [[file:mbp.jpg]] 34 | 35 | #+BEGIN_QUOTE 36 | 又可以换贴纸啦 37 | #+END_QUOTE 38 | 39 | 最后总结一下,给有同样问题的小伙伴们: 40 | 41 | - 激活之日起三年内(四年内也可以试试) 42 | - 电话给苹果客服说明涂层脱落的问题 43 | - 不区分国行还是其他地方的机器,在大陆是可以更换的 44 | - 苹果的品控是越来越差了 45 | 46 | ** EOF 47 | 48 | #+BEGIN_SRC yaml 49 | summary: MacBook 换屏小记 50 | weather: hot 51 | license: cc-40-by 52 | location: 22, 114 53 | background: holiday-plaza.jpg 54 | tags: [misc] 55 | date: 2018-06-03T02:35:09+08:00 56 | #+END_SRC 57 | -------------------------------------------------------------------------------- /memories/2018/macbook-screen-repairness/holiday-plaza-night.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/macbook-screen-repairness/holiday-plaza-night.jpg -------------------------------------------------------------------------------- /memories/2018/macbook-screen-repairness/holiday-plaza.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/macbook-screen-repairness/holiday-plaza.jpg -------------------------------------------------------------------------------- /memories/2018/macbook-screen-repairness/list1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/macbook-screen-repairness/list1.png -------------------------------------------------------------------------------- /memories/2018/macbook-screen-repairness/list2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/macbook-screen-repairness/list2.png -------------------------------------------------------------------------------- /memories/2018/macbook-screen-repairness/mbp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/macbook-screen-repairness/mbp.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-26/README.org: -------------------------------------------------------------------------------- 1 | * 活在当下(26/52) 2 | 3 | 活在当下。 4 | 5 | 生活总要留下点什么,于是便有了这篇小记,以一周为单位,看看这周做了什么,随便写写一些见闻和思考。 6 | 7 | ** 健康 8 | 9 | 健康排在首位。 10 | 11 | 先看看睡眠状况,这是个老大难了。由于世界杯看球和有些时间加班或者睡前玩会儿游戏啥的,这周的睡眠时间比较晚,也比较短。数据来自 iPhone 健康。 12 | 13 | | Week | fall asleep | get up | 14 | | Mon | 01:51 | 07:46 | 15 | | Tue | 00:20 | 07:10 | 16 | | Wed | 00:53 | 07:01 | 17 | | Thu | 01:59 | 07:25 | 18 | | Fri | 01:20 | 07:00 | 19 | | Sat | 01:34 | 07:09 | 20 | | Sun | 00:47 | 07:00 | 21 | 22 | 平均下来,每天睡觉时间差不多6小时,睡得晚的原因前面说了,起得早的原因,一方面是天气热了睡不了太久,另一个重要的原因是得去锻炼一下。以下是这周的运动情况,数据来自 Nike+ Run Club。 23 | 24 | | Week | distance/km | time | 25 | |------+-------------+-------| 26 | | Mon | 2.04 | 13:48 | 27 | | Tue | 2.03 | 13:26 | 28 | | Wed | 2.02 | 12:33 | 29 | | Thu | 2.03 | 12:40 | 30 | | Fri | 2.02 | 13:44 | 31 | | Sat | 2.02 | 12:59 | 32 | | Sun | 2.04 | 12:49 | 33 | 34 | 本周全勤~虽然跑的距离不长,速度也跟不上以前了,但就目前这个状况,能出门就是好的了。跑前还会做会儿热身(目前感觉没啥用),跑后也顺便拉伸一下。总体来说还是不得要领,科学健身了解一下吧。另外除了跑步也可以尝试其他的健身项目,只是觉得简单,可以练练耐力。 35 | 36 | 起早除了要跑步,还有另一个原因就是去买菜,哈哈哈。是不是觉得不太现实?一开始我也觉得是,但是后面习惯了就好了。早上买菜比较新鲜,如果自己下班再去买可能就比较晚没啥可卖的了。唯一的是麻烦的是大妈有点多。从5月开始绝大多数时间都是在家里做饭了,顺便带第二天的午饭到公司吃。解决温饱问题的同时,自己也可以学着体验生活吧。做饭成本主要在于时间,自己就算做成黑暗料理,感觉也比外卖好吃?这也许是心理作用,自己做的饭,跪着也也要吃完。不过确实是饭量也大了,肚子疼的状况几乎没有了。顺便说一句,经常招待室友吃饭。 37 | 38 | 本周比较遗憾,仅有周五没有下厨房。现阶段主要还是局限在简单的炒菜,当然,味道也是越来越好了。接下来要在色相和菜系上花点时间琢磨一下,听说看视频比较好?另外早上如果有时间可以做做早餐?前几天看了下厨房app搞得一个“早餐马拉松”的活动,看到好多精致的早餐。一日之计在于晨,争取某天也能做到那样吧,哈哈。 39 | 40 | ** 学尤克里里 41 | 42 | 这周业余主要花在了学习尤克里里上(当然,还有游戏,逃)。关于起因和经过可能是另一篇博客了。 43 | 44 | 大抵是5月底买的琴,然鹅的确是本周才开始认真地学和练。话说好像这乐器只要多练就行,几乎不需要乐理知识。每天都有花至少1小时的时间,主要还是周末的练的时间多,当然我觉得把打游戏的时间分配过去应该会很充裕吧,哈哈。。从基础的调音到识谱,每天20分钟的爬格子练习,接着是单音弹奏,琶音,和弦,以及扫弦弹唱。进度还是比较快的,目前是卡在了扫弦弹唱毫无节奏以及几个和弦比较难按得准和稳,还是需要时间来多练吧。现在可以比较有感觉的琶音弹一些小曲了,像《可惜不是你》,《天空之城》。 45 | 46 | 希望下周能找到弹唱的节奏~ 47 | 48 | ** 阅读 49 | 50 | 这周看完了3本书,嗯,只是这周看完,有些书之前已经在阅读了。主要的时间是周末早上,跑完步吃完早饭洗漱就去附近的南山图书馆坐一早上,效率很高。 51 | 52 | 影响最大的是《穷爸爸,富爸爸》。有些道理以前听过,但是真正看完了书才会觉得有血有肉。比如说, 53 | 54 | #+BEGIN_QUOTE 55 | 穷人和中产阶级为钱而工作,富人让钱为他工作。 56 | 57 | 他们不明白为什么自己老缺钱,于是以为多挣点钱就能解决问题,几乎没有人意识到缺乏财商教育才是问题的关键。 58 | #+END_QUOTE 59 | 60 | 听了那么多道理,那么我们应该怎么做呢?emmmm,这里展开了就太多了,后面应该会写一些相关的实践(目前已经在试着来了)。强烈推荐大伙看看这本书。总结一下自己现在想到和能做到的: 61 | 62 | - 了解什么是资产负债表 63 | - 关注自己的事业,构筑资产项 64 | - 学点会计和营销的东西 65 | - 首先支付自己,把支出控制在资产带来的收益以下(前提是不以牺牲舒适为代价) 66 | 67 | 在投资之前,一定得先了解市场,知道自己在做什么。所以现在还是多投资自己吧,这周还看了一会《手把手教你读财报》的书,还没看完,但是看得人一头雾水,所以学点会计是没错的。 68 | 69 | 另外还看完了阿加莎克里斯蒂的《无人生还》,书不长,类似的手法以前有见过所以看得比较快。这本书开创了童谣杀人和孤岛模式,着实很经典,看完了书还找来电影看了,推荐~ 70 | 71 | ** 事件 72 | 73 | 有点困了,只说一件事。 74 | 75 | 大学室友给我从他家乡寄来了一箱芒果。很感动,毕业整整四年了,想起以前的一些事,多谢,睡在我上铺的兄弟。 76 | 77 | 于是现在可以每天带一个芒果作为下午茶了。 78 | 79 | ** EOF 80 | 81 | #+BEGIN_SRC yaml 82 | summary: 跑步,做饭,尤克里里,阅读,活在当下 83 | weather: fine 84 | license: cc-40-by 85 | location: 22, 114 86 | background: ukulele.jpg 87 | tags: [weekly] 88 | date: 2018-07-03T02:02:24+08:00 89 | #+END_SRC 90 | -------------------------------------------------------------------------------- /memories/2018/weekly-26/ukulele.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-26/ukulele.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-27/README.org: -------------------------------------------------------------------------------- 1 | * 活在当下(27/52) 2 | 3 | 本周比较平淡,主要是工作上的事儿占据了大多数时间。 4 | 5 | ** 健康 6 | 7 | 还是从健康开始。 8 | 9 | | Week | fall asleep | get up | 10 | |------+-------------+--------| 11 | | Mon | 00:47 | 7:00 | 12 | | Tue | 03:53 | 07:51 | 13 | | Web | 01:02 | 07:19 | 14 | | Thu | 01:28 | 07:22 | 15 | | Fri | 00:54 | 07:09 | 16 | | Sat | 01:10 | 07:00 | 17 | | Sun | 03:08 | 07:00 | 18 | 19 | 睡眠情况比上周更差了,似乎是无解的问题?周二那天3点多睡是因为睡不着突然想写点什么,于是有了上周的第一篇一周小记。天,现在在写第二篇也已经是凌晨1点半了。似乎总是想着拖延,这是病,得治。快点儿写吧。 20 | 21 | 睡觉保持着晚睡的惯性,好在锻炼也没闲着。 22 | 23 | | Week | distance/km | duration | 24 | | Mon | 2.20 | 13.53 | 25 | | Tue | 2.04 | 12:56 | 26 | | Web | 2.03 | 12:40 | 27 | | Thu | 2.15 | 14:42 | 28 | | Fri | 2.22 | 13:58 | 29 | | Sat | 2.05 | 14:15 | 30 | | Sun | 3.03 | 35:48 | 31 | 32 | 这周依旧保持着全勤,比较特别的是周日和朋友参加了苏宁举办的荧光跑。全程5公里,然而都是边走边聊天,只是最后跑了一会儿到终点,所以时间长了。挺久没参加这种活动了,偶尔来玩玩也不错,找找刚毕业那会儿的感觉。中心公园夜跑的景色还是不错的。 33 | 34 | [[file:view.jpg]] 35 | 36 | 看看,爱跑步的人,运气不会太差~ 37 | 38 | [[file:running.jpg]] 39 | 40 | 最后说说这周的一个突破,自己不仅每天下厨房,还开始做早餐了,感觉做早餐比炒菜要有趣得多?周末做了特地买了面粉,弄了一个鸡蛋牛奶芒果蛋饼,样子一般般,但是味道的确是挺好的。可惜,鸡蛋煎蛋有点儿焦。 41 | 42 | [[file:food.jpg]] 43 | 44 | 唯有爱与美食不可辜负,继续找寻乐趣吧! 45 | 46 | ** 尤克里里弹唱 47 | 48 | 这周练琴有一天没练琴,练的时间也比上周少了。主要还是卡在了扫弦弹唱那块,尤其是D和弦,手指按到位真的是一点信心也没有;扫弦也是,时不时就扫出不和谐的音。还是要多练,这也是学会弹唱的必由之路呀。虽然很多人说x天学会y,但是作为一个严谨的程序员,会信? 49 | 50 | 好在这个周六晚上终于把弹和唱的节奏找到了,接下来是多练。目前在学周杰伦的《菊花台》和许巍的《温暖》。 51 | 52 | ** 工作 53 | 54 | 说说工作的事儿。这周工作比较忙,主要是解决一个性能问题(实际也是修复以前慢的bug)。在这个过程中,发现自己不再像过去那样对于新技术总是有着强烈的学习欲望并且想着应用在现有的项目中,并且工作中一直在写业务,运用框架,自己以前喜欢研究的基础类东西现在甚至是有些惧怕和遗忘了。 55 | 56 | 这不是好事儿,就像有的时候觉得一段时间不看书,就少了点什么。趁着有时间多看一下开源项目的代码吧,乔老爷子说过, 57 | 58 | #+BEGIN_QUOTE 59 | stay foolish, stay hungry 60 | #+END_QUOTE 61 | 62 | ** 事件 63 | 64 | 周末和4年未见的大学校友参加的荧光跑。她刚毕业来的深圳,奔波于找房,很辛苦。感概深圳居不易,以及这几年涨得太快了。聊到工作,她满怀着憧憬想要在事业上捞起袖子干。想当初自己刚毕业的时候也是那样,特别的充满干劲,似乎把能投入的都投入在了工作和学习上。现在似乎工作上缺少点激情了,还被她戏称为「老油条」。 65 | 66 | 一路上我们会被各种事情给改变,但是停下来思考一下,现在是不是自己想要的那个样子。 67 | 68 | 最后想到一句话,不忘初心,放得始终。 69 | 70 | 毕业四年快乐。 71 | 72 | ** EOF 73 | 74 | #+BEGIN_SRC yaml 75 | summary: life and learn 76 | weather: fine 77 | license: cc-40-by 78 | location: 22, 114 79 | background: view.jpg 80 | tags: [weekly] 81 | date: 2018-07-10T01:20:21+08:00 82 | #+END_SRC 83 | -------------------------------------------------------------------------------- /memories/2018/weekly-27/food.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-27/food.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-27/running.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-27/running.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-27/view.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-27/view.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-28/README.org: -------------------------------------------------------------------------------- 1 | * 活在当下(28/52) 2 | 3 | ** 健康 4 | 5 | 睡的还是比较晚,报表就不列了,屡教不改,都不好意思了。 6 | 7 | 说到锻炼,这周都是夜跑,感觉夜跑比早上更有精神。周五到周末连续下了几天的雨,天公不作美,非战之罪,周五周六就没有跑,好在周日在世界杯决赛之前冒着细雨慢跑3km,算是决赛前到洗礼吧~由于时间太晚了,以至于周四在公园直接被保安大哥给劝退了,哈哈,没到2km的及格线。 8 | 9 | | Week | distance/km | duration | 10 | |------+-------------+----------| 11 | | Mon | 2.01 | 14:26 | 12 | | Tue | 2.23 | 14:52 | 13 | | Wed | 2.04 | 13:20 | 14 | | Thu | 1.18 | 07:57 | 15 | | Sun | 3.10 | 21:32 | 16 | 17 | 连续跑步的记录断了(大概有20天吧),还好连续做饭倒是坚持了下来,每天早上做,顺便做做早餐,由于这几天舍友回家了,所以量比较多,加上可能会加会儿班,所以午餐和晚餐一块儿带了。我也是挺服我自个儿的~从没想过我会带饭,还是双份。 18 | 19 | 总有一些东西值得去坚持,就像跑完步,app语音播放的即时激励: 20 | 21 | #+BEGIN_QUOTE 22 | 重要的不是你到表现,而是你的出现。 23 | #+END_QUOTE 24 | 25 | 但是,也不能太将就了,既然去做就每天进步一点点,譬如说做菜。 26 | 27 | ** 学习尤克里里 28 | 29 | 很遗憾,这周回来得比较晚,周一到周五都没有练,只是在周末练。emmmmm,怎么说,老问题了,还是卡在扫弦弹唱那块,和弦转换太慢了,而且按不稳也不准。我觉得找个人指导指导可能比自己瞎折腾好些。 30 | 31 | ** 阅读 32 | 33 | 周六早上去图书馆看了2本书。 34 | 35 | 主要看的是《解读基金--我的投资观与实践》。了解一下怎么赚更多钱吧,哈哈。这本书讲得比较通俗,适合我这种从没买过基金的小白。 36 | 37 | 于是这周买了100块股票性基金,第一天就赚了2.65,对比了一下,放1w块在余额宝一天也没这么多呀。当然,收益越大,风险也越大,等它跌的时候,估计跌的也多。 38 | 39 | 投资是长期的事情,我的100块,请开始你的表演。 40 | 41 | ** 世界杯决赛 42 | 43 | 法国赢了。虽然我是法国球迷,但是心里面其实是支持克罗地亚赢?也许吧,把游戏竞猜币all in了一把,清仓。 44 | 45 | 有趣的是,这届杯赛,讲究传控踢法的都再见了,卫冕冠军德国小组赛出局,西班牙倒在了16强,这俩可分别是10和14年的冠军呀。决赛也是,克罗地亚有控球进攻优势,但把握机会的能力不如法国,运气也不太好,前2个进球分别是乌龙球和点球。但法国真的太稳了,就像农药里, 46 | 47 | #+BEGIN_QUOTE 48 | 猥琐发育,别浪 49 | #+END_QUOTE 50 | 51 | 放弃控球,防守反击,球员本身实力也强,对教练的战术也执行得很到位,犀利的反击刀刀致命,可怜的克罗地亚。不过真的要为克罗地亚点赞,他们很坚强,淘汰赛每次都是面对不利的局面,连续打了三场加时赛最终才拿到决赛入场券。 52 | 53 | 决赛面对实力更胜一筹的法国,在3:1落后前踢的真是好,进攻很有威胁,无奈法国战术更狠吧,运气也站在那边。法国也是吸取了16年在家门口的欧洲杯决赛失利的教训,很务实的踢法,虽然场面不太好看,但是冠军奖杯终归是到手了。 54 | 55 | 4年后卡塔尔再见,真想那时候能在现场看球。 56 | 57 | ** 事儿 58 | 59 | 工作上遇到了一个小问题,之前Google搜索相关的答案没搜到,后面自己解决了。在搜索的过程中发现stackoverflow上有人提了和我一样的问题,于是就把解决办法贴了上去,很简洁。没想到过了一段事件,社区的朋友评论到: 60 | 61 | #+BEGIN_QUOTE 62 | While this may solve the OP's problem, it would be a better answer if you edit it to explain why this works. A description of what utf8mb4 is would be a good start. 63 | #+END_QUOTE 64 | 65 | 知其然,也要知其所以然。后面查阅了文档,就对相关的背景和知识做了介绍,自己也对这个问题理解得更深入了。 66 | 67 | 感慨一下,现在工作,发现问题很多时候Google搜到解决办法多是copy-then-paste,然后看看能不能解决自己的问题,不行的话就换下一个,实在不行就自己想办法解决(很少见),但是对于问题本身却没有那种深究的冲动了。 68 | 69 | 另外,有1年多没有在stackoverflow上答题了,但是这段时间的reputation(积分)却涨了一倍,今年得分还排在top 8%。不的不感概,这就像投资一样,默默的给你赚取收益。 70 | 71 | 在这上面答题其实是个很好的学习方式,将你的答案整理分享出去,不仅自己对这个问题有深入的理解,还能帮助别人。就算别人已经回答过了,如果你有更好的办法,改进,甚至是疑问,也可以提出来,还能赚取积分,多好的事儿。 72 | 73 | [[file:st.png]] 74 | 75 | ** EOF 76 | 77 | #+BEGIN_SRC yaml 78 | summary: 猥琐发育,别浪 79 | weather: rainy 80 | license: cc-40-by 81 | location: 22, 113 82 | background: worldcup.jpg 83 | tags: [weekly] 84 | date: 2018-07-16T02:45:43+08:00 85 | #+END_SRC 86 | -------------------------------------------------------------------------------- /memories/2018/weekly-28/st.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-28/st.png -------------------------------------------------------------------------------- /memories/2018/weekly-28/worldcup.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-28/worldcup.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-29/README.org: -------------------------------------------------------------------------------- 1 | * 活在当下(29/52) 2 | 3 | 这篇似乎拖的时间有点长了,写得也很水,emmmmm 4 | 5 | ** 健康 6 | 7 | 世界杯过去了,睡眠时间貌似好了一些,但也没好到哪去,不提也罢。有个同事最近腰不行了,去检查了一下,好像问题不大,但是我也得悠着点儿了,有点方。 8 | 9 | 周一好像下雨了吧,就没有跑步,都是上午跑,感觉可以在2km的基础上加量了,周六就跑了3km,感觉还行。 10 | 11 | | Week | distance/km | duration | 12 | |------+-------------+----------| 13 | | Tue | 2.20 | 14:00 | 14 | | Wed | 2.22 | 15:10 | 15 | | Thu | 2.28 | 14:04 | 16 | | Fri | 2.24 | 13:55 | 17 | | Sat | 3.36 | 22:33 | 18 | | Sun | 2.05 | 13:29 | 19 | 20 | 说到饮食,这周每天都有做早餐,做了好几次玉米+鸡蛋,感觉很好做,早上起来去楼下买2根玉米棒子再加上2个鸡蛋放锅里加点儿水蒸一波,跑完步回来正好吃,味道很不错呢。嗯,顺便也给室友做一份。 21 | 22 | 依旧每天下厨房,带午饭去公司。这样的日子持续一段时间,挺久没去外面下过馆子了,刚好周末赶上深圳动漫展,约了一个朋友吃午饭,第一次去吃回转寿司,发现好多东西都不懂唉,芥末真的是呛死人。 23 | 24 | 还是感觉自己做的好,另外还有相当大的进步空间。 25 | 26 | [[file:breakfast.jpg]] 27 | 28 | ** 学习 29 | 30 | 这周没怎么练琴,许巍的《时光》还是弹唱结合得不了,更不用说《稻香》了。一回家吃完饭躺着就不想动了,确实是有点累,和室友农药开黑几把这一天也就过了。 31 | 32 | PS:这周也没看书,彻底荒废在游戏里了。 33 | 34 | ** 漫展 35 | 36 | 最后放一波深圳第十届漫展小姐姐的皂片吧。走在漫展的熙熙攘攘人群里,不知不觉的一瞬间,又想起你。这不就是许巍的《时光》么,哈哈哈。 37 | 38 | [[file:one_piece.jpg]] 39 | 40 | [[file:pic1.jpg]] 41 | 42 | #+BEGIN_QUOTE 43 | 农药的 cosplay 真的好多 44 | #+END_QUOTE 45 | 46 | [[file:pic2.jpg]] 47 | 48 | [[file:pic3.jpg]] 49 | 50 | 51 | 写于深圳南山图书馆。 52 | 53 | ** EOF 54 | 55 | #+BEGIN_SRC yaml 56 | summary: 好像只有漫展是亮点。。 57 | weather: hot 58 | license: cc-40-by 59 | location: 22, 114 60 | background: pic1.jpg 61 | tags: [weekly] 62 | date: 2018-07-27T01:39:14+08:00 63 | #+END_SRC 64 | -------------------------------------------------------------------------------- /memories/2018/weekly-29/breakfast.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-29/breakfast.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-29/one_piece.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-29/one_piece.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-29/pic1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-29/pic1.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-29/pic2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-29/pic2.jpg -------------------------------------------------------------------------------- /memories/2018/weekly-29/pic3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/memories/2018/weekly-29/pic3.jpg -------------------------------------------------------------------------------- /misc/resume/README.md: -------------------------------------------------------------------------------- 1 | 2 | # 龙凯 3 | 4 | - 13168001399 5 | - 广东 - 深圳 - 南山 6 | - im.longkai@gmail.com 7 | - 8 | - 9 | - 意向岗位:Go 后台开发,Kubernetes 容器平台相关开发 10 | 11 | ## 技术能力 12 | 13 | - 熟悉 Go/Java,了解并使用过 C/JavaScript/Swift 等语言 14 | - 熟悉 Go 环境下的 REST/gRPC 服务端开发 15 | - 了解 MySQL,Redis 等存储中间件 16 | - 熟悉 Android 开发,了解 iOS/Web/小程序 的开发 17 | - 熟悉 Kubernetes/Docker 平台相关的计算和网络,熟悉 Istio 服务网格 18 | - 熟练使用 Linux 进行日常工作开发,喜好折腾各种效率和网络工具,如 Emacs/Vim/curl/ss/tcpdump/Wireshark 19 | - 熟悉常用的数据结构和算法,并发编程,了解分布式系统设计,对 TCP/IP 协议栈有较深的理解,如 TLS,HTTP,HTTP/2,WebSocket 20 | 21 | ## 项目经历 22 | 23 | ### 深圳瓶子科技(腾讯全资子公司) - 客户端/后台 开发工程师(2017-5 至今) 24 | 25 | - 腾讯云长沙市超脑项目 / 健康长沙门户 (19年4月至今) 26 | - 技术负责人 27 | - 设计并实现了一个 Non-Blocking 的获取第三方 API token 服务,安全高效地解决了不同版本,环境的应用间并发获取 token 资源的问题 28 | - 设计并实现了一个使用 DSL 描述 HTTP 接口调用与适配的库,包含字段映射,类型转换,格式化,请求依赖等,大大简化了适配不同供应商接口代码的编写 29 | - 将业务 API server 的接口重构为 Google 的最佳实践,统一了接近70%的接口风格,增加版本控制,更稳定方便和客户端对接 30 | - 在项目中紧跟标准,如参考 [RFC6749](https://tools.ietf.org/html/rfc6749) 和 [RFC7807](https://tools.ietf.org/html/rfc7807)分别实现了OAuth2授权,无状态的JWT&JWK认证,以及统一友好的接口错误,易于接入和快速定位问题 31 | - 引入 Protocol Buffers/gRPC 通信协议,并在 Envoy sidecar 上实现了 gRPC-JSON 转码,同时支持 REST/JSON 调用,减少了前后端对接时间,提升了后台30%的开发效率 32 | - 主导项目从单个大应用,转换为各个微服务的过程;搭建 Kubernetes 集群,将所有的服务迁移到 k8s 上,大大提高了项目的敏捷度并扩宽了团队的技术栈 33 | - 使用 Istio 服务网格进行流量管理,路由,监控,发布新版时线上服务 zero down-time,并且多个分支进行A/B测试互不影响,开发与测试更容易 34 | - 自动化单元测试,私有Docker镜像构建,自动部署等工作流程并与工蜂和企业微信消息连接,提升了开发体验与效率 35 | - 求知鸟付费课程项目 (18年3月至19年4月) 36 | - 学习并使用 SpringBoot 开发微信公众平台相关的业务 37 | - 负责运营后台和推荐系统的开发,提升了10%用户的活跃度 38 | - 搭建ELK栈,收集各个系统的日志,并通过规则监控,方便定位问题 39 | - 活点地图项目 / Android&iOS(17年7月至18年2月) 40 | - 负责核心的好友地图交互,即时聊天里表情动画的开发 41 | 42 | ### 深圳市时时医科技有限公司 - Android 开发工程师 (2015-6 至 2016-2) 43 | 44 | - 神经脊柱医患 Android 45 | - 技术负责人 46 | - 负责即时通信模块,方便医生与患者沟通 47 | 48 | ### 深圳市爱美购科技有限公司 - Android 开发工程师 (2014-6 至 2015-6) 49 | 50 | - 么么嗖海淘 Android 51 | - 负责首页,商品详情,购物车,订单,微信/支付宝支付,物流查询,自定义控件等模块;其中前半年里只有自己一个人开发,从零到上线 52 | - 在 Android 端实现了自定义模版引擎,将服务端下发的布局描述文件渲染成原生界面,使得无需提交新版,便能快速地上线一些运营活动 53 | 54 | ## 教育 55 | 56 | 广西大学 - 计算机科学与技术 - 本科 (2010 至 2014) 57 | 58 | 英语六级,能够熟练地阅读和撰写英文文档 59 | 60 | ## EOF 61 | 62 | ```yaml 63 | hide: true 64 | license: all-rights-resered 65 | location: 22, 114 66 | tags: [Career] 67 | title: Resume 68 | weather: fine 69 | date: 2017-04-17T12:17:00+08:00 70 | ``` 71 | -------------------------------------------------------------------------------- /misc/resume/README.org: -------------------------------------------------------------------------------- 1 | #+OPTIONS: toc:nil 2 | * 龙凯 3 | 4 | - 13168001399 5 | - 广东 - 深圳 - 南山 6 | - im.longkai@gmail.com 7 | - https://www.xiaolongtongxue.com 8 | - https://m.douban.com/people/60187253 9 | - 意向岗位:Go 后台开发,Kubernetes 容器平台相关开发 10 | 11 | ** 技术能力 12 | 13 | - 熟悉 Go/Java,了解并使用过 C/JavaScript/Swift 等语言 14 | - 熟悉 Go 环境下的 REST/gRPC 服务端开发 15 | - 了解 MySQL,Redis 等存储中间件 16 | - 熟悉 Android 开发,了解 iOS/Web/小程序 的开发 17 | - 熟悉 Kubernetes/Docker 平台相关的计算和网络,熟悉 Istio 服务网格 18 | - 熟练使用 Linux 进行日常工作开发,喜好折腾各种效率和网络工具,如 Emacs/Vim/curl/ss/tcpdump/Wireshark 19 | - 熟悉常用的数据结构和算法,并发编程,了解分布式系统设计,对 TCP/IP 协议栈有较深的理解,如 TLS,HTTP,HTTP/2,WebSocket 20 | 21 | ** 项目经历 22 | 23 | *** 深圳瓶子科技(腾讯全资子公司) - 客户端/后台 开发工程师(2017-5 至今) 24 | 25 | - 腾讯云长沙市超脑项目 / 健康长沙门户 (19年4月至今) 26 | - 技术负责人 27 | - 设计并实现了一个 Non-Blocking 的获取第三方 API token 服务,安全高效地解决了不同版本,环境的应用间并发获取 token 资源的问题 28 | - 设计并实现了一个使用 DSL 描述 HTTP 接口调用与适配的库,包含字段映射,类型转换,格式化,请求依赖等,大大简化了适配不同供应商接口代码的编写 29 | - 将业务 API server 的接口重构为 Google 的最佳实践,统一了接近70%的接口风格,增加版本控制,更稳定方便和客户端对接 30 | - 在项目中紧跟标准,如参考 [[https://tools.ietf.org/html/rfc6749][RFC6749]] 和 [[https://tools.ietf.org/html/rfc7807][RFC7807]]分别实现了OAuth2授权,无状态的JWT&JWK认证,以及统一友好的接口错误,易于接入和快速定位问题 31 | - 引入 Protocol Buffers/gRPC 通信协议,并在 Envoy sidecar 上实现了 gRPC-JSON 转码,同时支持 REST/JSON 调用,减少了前后端对接时间,提升了后台30%的开发效率 32 | - 主导项目从单个大应用,转换为各个微服务的过程;搭建 Kubernetes 集群,将所有的服务迁移到 k8s 上,大大提高了项目的敏捷度并扩宽了团队的技术栈 33 | - 使用 Istio 服务网格进行流量管理,路由,监控,发布新版时线上服务 zero down-time,并且多个分支进行A/B测试互不影响,开发与测试更容易 34 | - 自动化单元测试,私有Docker镜像构建,自动部署等工作流程并与工蜂和企业微信消息连接,提升了开发体验与效率 35 | - 求知鸟付费课程项目 (18年3月至19年4月) 36 | - 学习并使用 SpringBoot 开发微信公众平台相关的业务 37 | - 负责运营后台和推荐系统的开发,提升了10%用户的活跃度 38 | - 搭建ELK栈,收集各个系统的日志,并通过规则监控,方便定位问题 39 | - 活点地图项目 / Android&iOS(17年7月至18年2月) 40 | - 负责核心的好友地图交互,即时聊天里表情动画的开发 41 | 42 | *** 深圳市时时医科技有限公司 - Android 开发工程师 (2015-6 至 2016-2) 43 | 44 | - 神经脊柱医患 Android 45 | - 技术负责人 46 | - 负责即时通信模块,方便医生与患者沟通 47 | 48 | *** 深圳市爱美购科技有限公司 - Android 开发工程师 (2014-6 至 2015-6) 49 | 50 | - 么么嗖海淘 Android 51 | - 负责首页,商品详情,购物车,订单,微信/支付宝支付,物流查询,自定义控件等模块;其中前半年里只有自己一个人开发,从零到上线 52 | - 在 Android 端实现了自定义模版引擎,将服务端下发的布局描述文件渲染成原生界面,使得无需提交新版,便能快速地上线一些运营活动 53 | 54 | ** 教育 55 | 56 | 广西大学 - 计算机科学与技术 - 本科 (2010 至 2014) 57 | 58 | 英语六级,能够熟练地阅读和撰写英文文档 59 | 60 | ** EOF 61 | #+BEGIN_SRC yaml 62 | hide: true 63 | license: all-rights-resered 64 | location: 22, 114 65 | tags: [Career] 66 | title: Resume 67 | weather: fine 68 | date: 2017-04-17T12:17:00+08:00 69 | #+END_SRC 70 | 71 | -------------------------------------------------------------------------------- /readings/the-storied-life-of-a.j.fikry/README.md: -------------------------------------------------------------------------------- 1 | 岛上书店 2 | === 3 | 4 | > 没有谁是一座孤岛,每本书都是一个世界 5 | 6 | ![cover](cover.jpg) 7 | 8 | - 作者:[美] 加布瑞̇̇埃拉・泽文 (Gabrielle Zevin) 9 | - 译者:孙仲旭,李玉瑶 10 | - 原名:The storied life of A.J.Fikry 11 | - ISBN:978-7-5399-7181-0 12 | - 出版:江苏凤凰文艺出版社 13 | - 版次:2015年5月第1版 2015年8月第3次印刷 14 | - 字数:167k 15 | - 阅读:2016-4-3 16 | 17 | ## 故事 18 | > 没有书店的小镇算不上一个小镇。 19 | 20 | 大学毕业后,A.J.费里克和他美丽的妻子妮可在一座与世隔绝的小岛上开了一家书店。妮可是岛上的本地人,而 A.J. 一直和岛上的人格格不入。妮可死于一次不幸的车祸之后 A.J 一直抑郁不振,加上他独特的选书品位以及对顾客的糟糕态度,生意惨淡。 21 | 22 | 一天,出版社的新女业务员阿米莉娅上门来到岛上书店推荐当季的图书,然而 A.J. 傲慢无理的态度把阿米莉娅给气走了。晚上,A.J. 又想起了自己的妻子,在烂醉中入眠。然而早上起来的时候,他唯一的值钱的珍藏版图书不见了......生活就像孤岛一样,感觉就快要把自己喝死了。 23 | 24 | 一天晚上,他回到家里,发现一个神秘的包裹出现在书店,包裹里的是一个2岁大的女孩,遗书上写着希望女孩能在一个有书本围绕着的环境下长大。A.J. 出于对小女孩的喜爱克服困难收养了这个叫玛雅的女孩。他照顾她,也挽救了在孤岛中的自己,同时也将他自己和岛上的人连接起来。他开始认真生活,发现自己逐渐对阿米莉娅产生了好感,阅读把他们连接了起来,通过分享读书,了解阿米莉娅的喜好,心意相通,最终打动了她,她俩克服路途的阻隔以及家庭的压力终成眷属。书店业务重回正规,一个完美的妻子,聪明伶俐的女儿。与此同时,与之连接起来的一切都是非常的平淡而美好。 25 | 26 | 故事到这里只进行了一半,丢失的书哪去了?小女孩到底是谁?以及,书店最后怎么样了? 27 | 28 | ## 书评 29 | > 是爱把一切连接起来。 30 | 31 | 不知道你曾经有过这样的感觉,当喜欢上一个东西,一个人的时候,你很可能会喜欢上与之相连接的人事物。 32 | 33 | 小的时候喜欢收集小浣熊水浒传卡片,于是对水浒传电视剧,书感兴趣,于是对四大名著感兴趣,于是对阅读感兴趣...... 34 | 35 | 06世界杯,捷克 vs 美国,[罗西基][1]打入了两个精彩的世界波,开始对足球感兴趣;之后罗西基转会阿森纳,开始喜欢亨利,博格坎普;你开始熬夜看球,英超,欧冠......我相信,很多人也是知道姚明(或者乔丹)才开始喜欢 NBA,麦蒂,科比,火箭,等等等等...... 36 | 37 | 上高中的时候对一个女生很有好感,当你打听到她的英语很好,于是你也努力地学英语,练习 VOA 的美语,听欧美的音乐,电影,访问 Twitter,Facebook 这些流行的网站(那时还没有墙),然后你对 Google 感兴趣,喜欢体验他们的各种产品,Gmail,Chrome, Google Calendar 不一而足到后来的 Android(这是后话了),于是你填了计算机专业的志愿...... 38 | 39 | 她是 Hebe 的粉丝,于是你也开始喜欢 Hebe(后来是真的喜欢)...... 40 | 41 | 大学的时候,因为阅读英语文献没有压力,学习的时候经常都是直接看外文原版,某种程度上又提升了专业能力,开始喜欢捣鼓一些有趣好玩的东西...... 42 | 43 | ...... 44 | 45 | 这一切,都是源于对生活的热爱(直观地说,每天总有那么几件事在支撑/驱动着你),会把更多的连接在一起,让我们发现,创造更多美好的人事物。 46 | 47 | > 因为从心底害怕自己不值得被爱,我们独来独往;然而就是因为独来独往,才让我们以为自己不值得被爱。有一天,你不知道是什么时候,你会驱车上路。有一天不知道是什么时候,你会遇到她(他)。你会被爱,因为你今生第一次真正不再孤单。你会选择不再孤单下去。 48 | 49 | ## By The Way 50 | 这感觉,看这类型的书自己就是在找虐...... 51 | 52 | ## EOF 53 | ```yaml 54 | background: cover.jpg 55 | hide: false 56 | license: cc-40-by 57 | location: Shenzhen 58 | summary: 没有谁是一座孤岛,每本书都是一个世界。第一次写「书评」(也许不算是......) 59 | tags: 60 | - Reading 61 | - Bookshelf 62 | weather: terrific good 63 | date: 2016-04-06T20:30:01+08:00 64 | ``` 65 | 66 | [1]: http://baike.baidu.com/link?url=dtb0xbnD2BZGJRPfCa0cBfD3pVh7V_xYH_9CcEcFrvU1FdGLTnJ7NwS4X53AWTBJfbcLZQ6-SFIl9CTfbF99k4-JqNYA8mowm7nmCkFwdDLiOqvKmHQJzTYxEWkAhgHjXvgoFnSB2dD0YJyBHHDK0_ 67 | -------------------------------------------------------------------------------- /readings/the-storied-life-of-a.j.fikry/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/readings/the-storied-life-of-a.j.fikry/cover.jpg -------------------------------------------------------------------------------- /share/4-interviews-to-be-a-googler/README.md: -------------------------------------------------------------------------------- 1 | 我的4次Google面试经历 2 | ===== 3 | 4 | ## 提问 5 | 如何利用半年的时间打造自己的技术并进入Facebook或者Google这样的公司? 6 | 7 | ## 译文 8 | 我完全理解你现在的感受。三年前我获得了计算机专业理学学士学位,毕业前我唯一想的事情便是去Google工作。在我毕业前,我在一次电话面试中表现不错并得到了Youtube软件工程师面试的机会。当我完成那次面试走出来时,我对我的表现感到很满意,但是不久就得到了拒绝了消息。我花了很长时间去反思我哪里做错了。 9 | 10 | 这是我人生中的第一次技术面试,在这之前我我没有任何的经验。现在回想起来,当时我各方面都没有准备好。 11 | 12 | **积累坚实的面试经验。**面试本事就是一门技术,当你没有意识到它的重要性时你也就不大会去锻炼这门技术。面试得越多,你也就会越自信。当你能够清楚地表达你的观点那么其它的东西也就水到渠成了。 13 | 14 | 想想你是如何回答『请简单地介绍一下自己』这个老生常谈的问题的。经过非常非常多的面试后,我觉得这个问题更多的在于面试官而不是面试者。从你的回答中面试官想看到你是否是他想要找的人(贴士:简洁并且和应聘职位相关)。当做一个自我推销吧:-) 15 | 16 | === 17 | 18 | 一年后,我获得了更多的面试经验,我又重新应聘同样的职位但是不同的部门。同样的,我在电话面试中表现不错得到了面试的机会。 19 | 20 | 在接下来的两周时间里,我重拾课本,拿起了纸和笔去复习一些知识。我花了很多时间专注于数据结构与算法,决心不犯同样的错误。 21 | 22 | 我参加了面试并尽了我最大的努力,我对自己能够如此的努力学习和回答那些很难的问题感到骄傲。但是,再一次的,我又被拒绝了。 23 | 24 | **把你的热情转化为实力。**这是我在加入Google的路上学到的最重要的事情。 25 | 26 | 我做错什么了?*我面试了一个不合适的职位。*和你一样,我对web开发非常着迷。我想了一下,我有计算机专业的学位,专业对口的话最合适的便是软件工程师。我当时逼着自己每天都学习C++或者Java程序设计,然而我实际的兴趣却在与前端技术,比如HTML/CSS/JavaScript。 27 | 28 | 我觉得很悲剧,我需要调整我的方向转到web开发去,并把它作为我的职业道路。我阅读了很多技术博客,买了一些书,参加技术交流会,渴望学到更多,成为一个更好的web开发者。 29 | 30 | == 31 | 32 | 一年后,我又应聘了上次面试的部门,但这次的职位是用户界面工程师。再一次的,我又得到了面试机会。招聘主管告诉我几乎从来面见过有三次来面试的家伙... 33 | 34 | 再一次,我花了好几周时间学习,参加面试,感觉我已经让面试官心动了。在最后,我的面试官给了我一个Google杯子,印着『完成了三次Google面试』,感觉像一个奖杯。好吧,这更像是一个安慰,因为,我第三次被拒绝了。 35 | 36 | 在这个时候发生了几件事,我想到了放弃。我想换个职业,与之前不同,我停止了在一棵树上吊死的节奏,开始专注于自我提升。我再也不去纠结面试那里做得不好了或者那里我可以做得更好了。这不重要了,我得专注于现实,充分利用现有的一切。 37 | 38 | 我做了两件在职业生涯中非常有意义的决定:我开始参加开源项目,在其中做出贡献并且尽一切可能的学习web性能优化方面的技术。在参加过的一些技术研讨会中,我选择了专注与New York Web性能优化研讨小组。我换了一个专注与web性能优化的工作,并且获得了在研讨小组演讲的机会,由于这个演讲,我又得到了web性能优化最出名的组织(Velocity)演讲的机会。太棒了~ 39 | 40 | === 41 | 42 | **保持积极乐观** 43 | 44 | 意想不到的事情发生了,我收到了一封最初面试我的面试官来自Youtube的邮件。有一个web开发者的职位开放,她觉得我很适合。我抓住了这个机会,经过了电话面试,提前进入了面试阶段。 45 | 46 | 我回到了加州然后经历了一系列熟悉的面试流程,当然,还有一系列很难的面试题。和之前三次一样,都是5进1,我真的希望我可以表现得更好。过往的经历就像视频重播一样,我已经看到很多次,这次也开始感到担心和焦虑。 47 | 48 | 与我的焦虑和一直浮现的拒绝场景相反,我终于可以在Google工作了。 49 | 50 | 以上,对于那些追逐梦想工作的同学,我的建议是: 51 | 52 | 1. 不要莽撞,直接就上了。在你准备好之前还是积累足够多的面试经验吧。在推销你的技术技能前先学会推销自己。 53 | 2. 找到自己适合的职业,知道自己能够给公司带来什么。适合的职业,如饥似渴的继续学习,使你的职业生涯更进一步。 54 | 3. 不要放弃,你已经在通往成功的道路上了。 55 | 56 | ## 原文信息 57 | > Title: [What are the ways to utilize 6 months to build skill-set to get hired at Facebook or Google?][1] 58 | 59 | > Author: [Rick Viscomi][2], Web Developer at Google 60 | 61 | ### EOF 62 | ```yaml 63 | background: /assets/images/default.jpg 64 | hide: false 65 | license: cc-40-by 66 | location: Nanning 67 | summary: 译文 68 | tags: 69 | - Campus 70 | - Translation 71 | weather: "" 72 | date: 2014-05-27T03:06:44+08:00 73 | ``` 74 | 75 | [1]: http://www.quora.com/Career-Advice/What-are-the-ways-to-utilize-6-months-to-build-skill-set-to-get-hired-at-Facebook-or-Google/answer/Rick-Viscomi?srid=twt8&share=1 76 | [2]: http://jrvis.com/ 77 | 78 | 79 | -------------------------------------------------------------------------------- /share/master-data-strutcture-and-algorithms/README.md: -------------------------------------------------------------------------------- 1 | 如何掌握算法与数据结构,成为编程专家 2 | ==================================== 3 | 4 | ## 译文 5 | 访问[Timus Online Judge][3]这个站点,然后按照顺序一个一个的把题目解决。如果你感到无聊可以适当的跳过一些不感兴趣的。如果你无法解决那题目,去看看那题目相关的讨论。如果还是没有帮助,那去问问别人吧(比如StackOverflow,或者朋友,甚至是Quora等) 假设你完成了那上面的50-100道题目,那么应该懂得一些基本的算法了并且可以编写一些小的代码了。接下来你可以去[Codeforces][4]这个网站做做他们每周进行的一个编程比赛,也可以做做TopCoder的比赛题。当你在比赛时没有弄明白的,赛后再想办法弄懂。 6 | 7 | 假设你已经进入了Codeforces或者TopCoder的Div 1,那么表示你已经拥有了以下技能: 8 | 9 | 1. 你已经是一个算法/数据结构方面的专家,你应该和一个计算机科学专业的本科生水平相当,并且可以去Google这样的公司找一份工作了 10 | 2. 你可以编写实际的代码了,这是一项少有并且神奇的技能 11 | 12 | 但是你仍然缺少很多编程方面的知识: 13 | 14 | 1. 什么是线程?我该怎么样解决并发的问题? 15 | 2. 内存管理实际上是怎么工作的?函数的调用又是怎么做到的?线程的调度在实际中又是怎么工作的? 16 | 3. 机器与机器之间是如何交流的?网络是个啥玩意? 17 | 4. 我该如何做一个界面使得用户能够与之交互? 18 | 19 | 我不知道有那些简单的方式可以学会以上这些,但是可以提供一些建议: 20 | * 试着写一个操作系统去学习#1和#2(我觉得可以网上会有一些教程) 21 | * 写一个游戏去学习#4 22 | * 写一个多用户在线游戏去学习#3 23 | 24 | ## 原文信息 25 | > Title: [What are good ways to master algorithms and data structure to be a programming expert?][1] 26 | 27 | > Author: [Jonathan Paulson][2], Software Engineer at Google 28 | 29 | ### EOF 30 | ```yaml 31 | background: /assets/images/default.jpg 32 | hide: false 33 | license: cc-40-by 34 | location: Nanning 35 | summary: 译文 36 | tags: 37 | - Campus 38 | - Translation 39 | weather: "" 40 | date: 2014-05-23T03:19:48+08:00 41 | ``` 42 | 43 | [1]: http://www.quora.com/Algorithms/What-are-good-ways-to-master-algorithms-and-data-structure-to-be-a-programming-expert 44 | [2]: http://www.quora.com/Jonathan-Paulson 45 | [3]: http://acm.timus.ru/problemset.aspx?space=1&page=all&sort=difficulty 46 | [4]: http://codeforces.com/ 47 | -------------------------------------------------------------------------------- /share/what-are-the-characteristics-of-a-bad-software-engineer/README.md: -------------------------------------------------------------------------------- 1 | 糟糕软件工程师的特征? 2 | ==================== 3 | 4 | > 原作者[Nachiket Naik](http://www.quora.com/Nachiket-Naik),[原文链接](http://www.quora.com/Software-Engineering/What-are-the-characteristics-of-a-bad-software-engineer) 5 | 6 | > 翻译的真不好,建议查看原文:-) 7 | 8 | 在我的经验里,以下是一个糟糕的软件工程师具有的特征: 9 | 10 | ### 1. 机械的使用StckOverflow 11 | 这个家伙遇到了一个错误,然后他很快的Google并找到了第一个搜索结果。**问题并不是在于从StackOverflow直接复制别人的解决方案。** 我认为StackOverflow上比起一些参考手册有更多的解决方案。不要误会,StackOverflow如果不是最好的那也是一个非常棒的资源。关键在于有些人只是机器式的应用那些程序而不去了解问题的前前后后,没有充分的理解问题的环境,并且它是否真的适用于当前的问题。更多的时候我见过一些人更愿意相信他们见到了在线社区和论坛而不是眼前的代码和系统。 12 | 13 | ### 2. 我不是一个测试的 14 | 我不需要测试代码,那是测试工程师做的。在这个成熟的敏捷方法论的时代,我不觉得这个观念有所减弱,对于测试还是有一种惰性。部分原因是对于测试环境的搭建没有兴趣,还有部分原因是缺少测试相关的知识(也有一部分原因是一些开发人员看不起测试的...)。 15 | 16 | ### 3. 我讨厌文档 17 | 有些人觉得代码的文档必须像诗歌一样好,他们缺少那种文字方面的天赋,或者写文档并不是他们工作内容。在我看来,这些都是可持续发展软件最大的敌人。好的软件并不意味着提供非常多酷的特性。好的软件有些一些好的特性,被很多人持续地使用,并且能够被别人阅读,修改等。这家公司的开发人员相信少一些技术性的东西,精确和详尽的文档是公司成功最大的保证。 18 | 19 | ### 4. 丑陋的xxx 20 | 我的代码能运行,但是: 21 | 1. 我的变量名有x, flag, str, arr等等 22 | 2. 我的大部分代码都写在一个方法里 23 | 3. 没有缩进 24 | 4. 没有一致的代码风格 25 | 5. 全局变量的使用等等 26 | 对于我个人来说这些都是非常讨厌的东西,但是这并不意味这代码是糟糕的,有可能这是写得最好的一段代码。但是如果一条钻石项链被埋在了废墟之中,没有人会发现,也没有人愿意清理它,更不会戴上它了。 27 | 28 | ### 5. 短期投资 29 | 编码,部署,继续,他没有试图去关注一些潜在的问题。给他一个编码任务,他就能够打了鸡血一样的交上代码,然后得到了一个修复和能用的软件,他不能从中得到更多的东西了。有些时候,开发者得自私一些,不仅仅关注于在截至日期前交付代码,更应该关注能从这个过程中学到什么。 30 | 31 | ### 6. 抵抗 32 | 『我没有做个这个』『这看起来太糟糕了』『这不是我的问题』『这个和我修复的有关系,但是是另一个家伙犯的错』『我不能修复这里,叫写这段代码的那个家伙来修复』修复这些错误代码的人在继续前进,你呢? 33 | 34 | ### 7. 独裁者 35 | 『他们的想法』vs『你的想法』,我敢肯定这里肯定有一个争论。有时候他按照他自己的方式去做了,不管怎么样他们肯定会回来找到他实现的那段代码,有些时候即使代码能工作,测试和代码看起来非常nice也会让他们感到不舒服。这个人将是高效团队一个大的瓶颈,将是面对压力第一个奔溃并且开始指手画脚。这个人不适合团队,另一方面他或许是一个有经验,好的开发者。 36 | 37 | ### 8. 过分谨慎 38 | Java开发者当得知需要写一个Python脚本的时候通常会不知所措,当需求发生变化的时候他会感到恐慌。他有可能会选择拙劣地写一些糟糕的『曲线救国』的做法。这些人为了避免自己不熟悉的东西会做很多糟糕的事情,他们不愿意接触自己不熟悉的领域。这对于新手来说很常见,有经验的开发者会慢慢地离开他们熟悉的领域去欣然接受新的东西。 39 | 40 | ### 9. 粗心 41 | 忘记备份,快照,一个项目有着多个工作目录,有着很多``System.out.println()``在生产环境中等等。这些在新手当中很常见但是会随着经验的提升越来越好。 42 | 43 | ### 10. 懒 44 | 他们通常觉得他们能够使用一些小技巧使得系统能够工作能自豪。他们会找到一些『魔法』般的做法。我的经验告诉我这些90%只是表面上有用,这些做法很糟糕并且迟早会奔溃并且会话费更多额外的时间去弥补。 45 | 46 | ### EOF 47 | ```yaml 48 | background: /assets/images/default.jpg 49 | hide: false 50 | license: cc-40-by 51 | location: Nanning 52 | summary: 译文 53 | tags: 54 | - Campus 55 | - Translation 56 | weather: "" 57 | date: 2014-05-20T01:27:47+08:00 58 | ``` 59 | -------------------------------------------------------------------------------- /share/which-startups-have-the-best-stories/README.md: -------------------------------------------------------------------------------- 1 | 哪个初创公司有着最令人着迷故事 2 | ============================== 3 | 4 | 这是一个在Quora上看到的问答,非常有意思的一个问题。现在和大家分享一个票数最高的回答,个人翻译的不是很好请见谅,强烈建议查看[原文][]。 5 | 6 | ## 译文 7 | > 在Facebook最开始的那段时间,只有不到15名员工。一个在那里干了几周叫做Steve Chen的家伙觉得那里不适合他,他想离开创立自己的公司,他想做一个视频公司。 8 | 9 | > Matt Cohler,最开始把Chen招进来的家伙尝试说服他。『你正在犯一个巨大的错!Facebook将会成为一个很大的公司!再说已经有非常非常多的视频网站了,如果你这样做你会后悔一辈子的!』 10 | 11 | > Chen没有被说服,他决心去做自己想做的事。他离开了Facebook创立了YouTube。 12 | 13 | --- 14 | 15 | > 原答主,[Neal Wu][] 16 | 17 | ## 尾声 18 | Facebook和YouTube今天的成就无需多言,看到这个故事你是否也有或多或少的想法呢:-) 19 | 20 | ### EOF 21 | ```yaml 22 | background: /assets/images/default.jpg 23 | hide: false 24 | license: cc-40-by 25 | location: Nanning 26 | summary: 翻译 27 | tags: 28 | - Campus 29 | - Translation 30 | weather: "" 31 | date: 2014-05-10T02:22:22+08:00 32 | ``` 33 | 34 | [原文]: http://www.quora.com/Startups/Which-startups-have-the-best-stories 35 | [Neal Wu]: http://www.quora.com/Neal-Wu 36 | -------------------------------------------------------------------------------- /things/timing/README.md: -------------------------------------------------------------------------------- 1 | 时间都去哪了? 2 | === 3 | 4 | ![Timing app screen shot](timing.jpg) 5 | 6 | #### Timing 7 | 今天,趁着西方圣诞节打折,又购买了一款Mac上的应用,叫做[Timing][1],用来跟踪每天花在电脑上不同应用的时间。貌似每到圣诞节,老外就喜欢发版本和搞促销,猜测类似于咱们国家过年放长假了吧,赶紧完成今年的计划收拾东西准备回家陪伴家人。 8 | 9 | 关于Timing,这几天试用了一会,正是发现挺棒的才入手的。根据这几天的统计,除了花费在Developping和Reading上的时间,有相当一部分时间是用在了QQ和微信的聊天上的。然而,仔细想想这两个[IM][2]应用并没有带来多大的效率提升,大部分都是和工作和学习无关的聊天。当然,不可能也不现实一直保证百分百的工作状态,但是看到每天都把这么多时间花在这上面,还是觉得不太合理的。想到自己还有很多东西想要学,很多东西想要去做,时不我予的哀愁啊~ 10 | 11 | 另一方面,在**工作和学习之中**,不可避免的要和其他人沟通,否则就闭门造车了。QQ和微信沟通的确很方便,甚至是太方便了以至于我们在不停地发送消息,这里面不可避免就产生了消息冗余,甚至聊着聊着就成了完全背离主题的闲聊了。另一方面,在消息流中,重要的消息可能就悄悄的溜走了。注意,这里的场景是在工作和学习之中。 12 | 13 | 在这种场景下,我们需要一个新的沟通协作工具。邮件是最先想到也是每天都会用到的,但是使用的过程中,感觉到太正式(这样倒可以很好的避免消息的冗余),一封邮件发送,转发,抄送,回复,来来去去,你一个我一个和盖楼一样,人一多,事情一复杂,可能真的就剪不断理还乱了。但是邮件弥补了IM软件的缺点,正式,重要的信息不会遗漏等。但是有些时候给人一种敬畏感,不能像IM那样畅快的发言,有些时候,一些想法可能就憋着了。 14 | 15 | 所以需要更好的工具,于是就想到了[Slack][3],这个一直听闻很火但从未用过的软件,拉着两个好友一起玩了一会,UI很赞,体验很棒。事实上,以上两段感受都是在使用了Slack之后对比得出的。Slack完全也能够当成一个IM来用,但是毕竟是团队协作,拿这个来聊天着实蛋疼...发送的每条消息都可以pin住并且给予reaction,这样就能够避免了重要信息的流失。此外,还能够发附件,成员能够对其进行评论等,相对于邮件来说,不那么正式,个人感觉能更好的促成结论达成或者摩擦出更好的想法。其他的,强大简单的搜索,mention@,star,files, downloads等没有怎么玩,但是给人的感觉,就是更好的促进了沟通与协作。 16 | 17 | 以上,不知所云,简而言之,可以理解为就是用合理利用好时间,用合适的工具提高效率吧~ 18 | 19 | #### One More Thing 20 | 起初,是想写关于支持正版软件付费购买的,但是没想到一扯扯到协作沟通的软件去了,甚至是感觉倒是像给Slack做广告...诶,也许大学的时候应该修大学写作这门课的:-( 21 | 22 | ### EOF 23 | ```yaml 24 | background: timing.jpg 25 | hide: false 26 | license: cc-40-by 27 | location: Shenzhen 28 | summary: "" 29 | tags: 30 | - Things 31 | weather: "" 32 | date: 2015-12-25T21:47:57+08:00 33 | ``` 34 | 35 | 36 | [1]: https://timingapp.com "Timing - The Best Automatic Mac Time Tracking for ..." 37 | [2]: https://en.wikipedia.org/wiki/Instant_messaging "Instant messaging" 38 | [3]: https://slack.com/ "Slack: Be less busy" 39 | -------------------------------------------------------------------------------- /things/timing/timing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/longkai/essays/186b4bb32613b1a0c7b138820c177209b8068862/things/timing/timing.jpg -------------------------------------------------------------------------------- /things/wechat/README.md: -------------------------------------------------------------------------------- 1 | 微信,你应该知道的玩法 2 | ====================== 3 | ![wechat](https://farm3.staticflickr.com/2811/11738815385_6f650ff36a_q.jpg) 4 | 5 | 微信,是一种生活方式。 6 | 7 | 没错,现在给大伙推荐的App就是你现在用的微信,也许你已经用的非常多了,也许你刚刚使用,这些都不要紧,接下来不做很啰嗦的介绍,简单的列举一下我觉得比较好的服务(目前微信的公众平台已经能满足企业的需求了,不过在这里谈论这个没啥意义=.=) 8 | 9 | 其他的资源网上有很多,大伙感兴趣可以去看看,比如维基百科,或者微信自带的帮助(5.1版本下,我->设置->关于微信->帮助与反馈) 10 | 11 | ## 更纯粹的IM(即时通讯)软件 12 | 相对于qq而言,大家是否觉得它过于臃肿呢?里面好多东西咱都用不上,而且费电,老实说,界面设计也不如微信(其实两者都没有符合Android的设计规范,站在Android平台上来看),如果你需要一个纯粹的QQ,那么微信是更适合的选择。微信和qq都是腾讯家的,微信可以导入qq的好友列表,甚至你可以使用微信的「离线qq」插件直接在微信上面聊qq,真的,我觉得qq基本上没有啥用了的咧。另外,微信提供的聊天功能远比qq丰富(不过,好像最近的qq加上了类似微信的聊天功能),比如语音聊天,群发,群聊,实时对讲机等很多特性,聊天体验确实来的比qq爽。 13 | 14 | ## 与手机通讯录的整合(Android平台) 15 | 如果你使用新版的Android系统(估计需要4.1+)以及较新版的微信(估计5.0+),那么也许你已经发现在你的通讯录上已经出现了微信联系人。(参考小米系统(miui)的设置,联系人->设置->要显示的联系人->分账户显示->选择你的微信帐号即可) 16 | 17 | 下面你可以看到,联系人详情中出现了微信的聊天和朋友圈,这时你还会用短信吗(当然,那位朋友得打开微信)?运营商该颤抖了 18 | 19 | ![微信联系人](https://farm6.staticflickr.com/5543/11739769636_a3c696d042_o.jpg) 20 | 21 | ## 朋友圈 22 | 这个可以理解为微信的社交圈吧,类似于qq空间,但是也比qq空间更纯粹,她实际上是一个相册,你可以上传你的照片并且附带上一段文字(也可以直接发送文字,但是这个设置成了隐藏功能,长按那个相机按钮即可)。可以选择私密或者公开,也可以选择性开放给一部分好友看到,这个,老实说,我觉得比qq空间好多了。空间相对而言过于臃肿,这个更纯粹,文字与图片,够了。这是一个精美的相册。此外,她还可以同步到qq空间,腾讯微博哦,所以,你在微信上发表的东西,是可以同步到qq空间的。更进一步,如果你使用Twitter(不知道是啥可以忽略这里)并且在本地上安装有Twitter的App,那么把你的语言设置到English,还可以同步到Twitter呢,Facebook类似。非常的方便,我想,这也是微信国际化的一个方面。btw,微信国际化找了梅西代言。 23 | 24 | ## 收藏 25 | 你可以有1G的空间收藏你喜欢的东西,比如图片,文字,连接,文章,甚至语音和文件等,相对来说,看到个有意思的东西点一下收藏还是不费事的。 26 | 27 | ## 插件 28 | 微信默认没有开启一部分功能(这比qq要好),如果你有需要,自己将那个功能开启即可,比如QQ,朋友圈,摇一摇,收发qq邮箱邮件等等。(5.1版本下,设置->通用->功能) 29 | 30 | ![微信插件](https://farm8.staticflickr.com/7435/11739770176_3a979bd60e_o.png) 31 | 32 | ## 游戏 33 | 微信5.0之后推出的打飞机不知道大家还有没有印象?这么一个看起来很渣的游戏但是却取得了轰动的效应,这个在传统的互联网上是很难看到的,但是,在移动互联网,微信,这样的社交平台上,出现也不是什么难事。毕竟,庞大的用户基数,社交粘性,以及不同以往的玩法确实都挺吸引人的。游戏是腾讯最赚钱的一块,现在,腾讯又来了。节奏大师,天天爱消除什么的,推出一下App就能排名到前几,确实吊炸天。 34 | 35 | ## 支付 36 | 这个,是最最牛逼的创意了。微信现在扫一扫可以付款了,你知道吗?她或许以后会融入我们的日常生活。不管你信不信,反正我信了。现在支付宝是在线支付的老大,但是这个位置目测已经危险了(不然阿里也不会强推来往,具体请Google)。试想一下,你每天都去淘宝,或者京东这样的网站购物吗?大多数人不会,但是你每天都要吃饭,出行对不对?用微信扫一扫就能办到。这个潜在的市场比起现在的网店来说真的是大得多。也许你还没见到过,去年10月底去深圳大学的时候,在那里的教学楼的饮料自动贩卖机就有微信支付了。就是这样,你们感受下。 37 | 38 | ## 网页版 39 | 手机打字慢?可以体验微信网页版。登录 wx.qq.com 扫一扫即可实现。 40 | 41 | ## 扫一扫 42 | 微信不仅能扫二维码,还能扫商品的条形码(可以看到商品的详细信息,评价,以及网购价格等),图书的封面,街景(这个可以查看周围街道的实景,不过较卡,费流量,实际上用的是gps导航)等 43 | 44 | ## 微信公众平台 45 | 嗯,这个我想不用介绍了。 46 | 47 | 48 | ### EOF 49 | ```yaml 50 | background: //farm3.staticflickr.com/2811/11738815385_6f650ff36a_q.jpg 51 | hide: false 52 | license: cc-40-by 53 | location: Nanning 54 | summary: 微信,你应该知道的玩法 55 | tags: 56 | - Campus 57 | - Things 58 | weather: "" 59 | date: 2014-01-04T06:31:36+08:00 60 | ``` 61 | -------------------------------------------------------------------------------- /things/word-category/README.md: -------------------------------------------------------------------------------- 1 | 给word文档添加自动目录 2 | ====================== 3 | 4 | 今天要写个课程设计报告,要求需要有个目录。其实我对word也不熟悉,只是会一般的使用而已,更多的时候我喜欢先在[vim][vim]这样的纯文本编辑器中编辑好了文字后在挪到word上添加样式(给我的感觉,windows可以没有,但是不能没有office,因为现在文案书写都是用office咧=.=)。很多时候,**我们应该专注于文字本身**,而word则提供一个强大的样式的功能(当然,word的功能超级强大的,远远不止这些)。 5 | 6 | 好啦,参考了一下微软家的文档,给文档增加目录其实是一件非常轻松的事情。貌似有挺多种方法的,我选择了一种简单的方式,其它的方式请自行搜索。 7 | 8 | 我用的是word2013,word2010和2007甚至是2003都应该没有什么差别(如果有疑问可以去参考微软对应版本office文档)。 9 | 10 | ## 目录先于内容 11 | 首先,目录肯定是先于其它内容,所以简单起见,在新建的空白文档里按下``ctrl+Enter``键,添加一个新页,把第一页留作目录。 12 | 13 | ## 插入标题 14 | 接着,在刚才添加的新页中建立标题,通过标题来建立目录式最简单的方式。那么,怎么建立标题呢?很简单的,先敲几个字,如图所示。 15 | 16 | ![添加标题文字](https://farm3.staticflickr.com/2875/11797614676_1af1f0dac9_o.png) 17 | 18 | 接下来,选中刚才敲的文字,选择``开始->标题1`` 19 | 20 | ![插入一个标题](https://farm6.staticflickr.com/5528/11797615006_2d5333b773_o.png) 21 | 22 | 如果觉得标题样式不好看,可以改的哦。 23 | 24 | ## 制作目录 25 | 回到第一页,我们要作为目录那一页,然后点击``引用->目录->自动目录->自动目录1/自动目录2``(选一个即可) 26 | ![选择目录](https://farm8.staticflickr.com/7314/11797095763_99dd90428b_o.png) 27 | 28 | ![生成目录](https://farm4.staticflickr.com/3765/11797614996_a2ff0aa8d8_o.png) 29 | 30 | 可以看到,目录生成了,不过,标题又回到了第一页,不过没有关系,由于我们使用的是自动目录,把标题移动到你想要的页码,然后点击``引用->更新目录->只更新页码/更新整个目录``即可更新页码哟。 31 | 32 | ## 添加二级目录 33 | 添加二级目录和上面添加的一级目录类似,只不过,把你的标题设置成标题2即可(貌似只有三级标题,所以最多只能设置三级目录哦,如果有更多的需求,那么建议你搜索一下) 34 | 35 | 最终的样子应该是这样子的 36 | ![最终效果](https://farm4.staticflickr.com/3785/11797095733_2bfc45632b_o.png) 37 | 38 | ## 参考资料 39 | [office帮助 - 创建目录](http://office.microsoft.com/zh-cn/word-help/HA102824256.aspx "创建目录") 40 | 41 | ### EOF 42 | ```yaml 43 | background: //farm4.staticflickr.com/3785/11797095733_2bfc45632b_o.png 44 | hide: false 45 | license: cc-40-by 46 | location: Nanning 47 | summary: "" 48 | tags: 49 | - Campus 50 | - Things 51 | weather: "" 52 | date: 2014-01-06T20:35:41+08:00 53 | ``` 54 | 55 | [vim]: http://zh.wikipedia.org/zh-cn/Vim "vim" 56 | -------------------------------------------------------------------------------- /things/zhihu-pioneer/README.md: -------------------------------------------------------------------------------- 1 | 「创业时,我们在知乎聊什么?」 2 | ============================= 3 | 4 | ![「创业时,我们在知乎聊什么?」](https://farm6.staticflickr.com/5527/11818274986_5884ed8a29_o.jpg) 5 | 6 | 今天给大家推荐一本书(不过这本书目前只是预售哦)。如果你喜欢互联网,有大大的或者小小的梦想,或者你喜欢了解一些事情从无到有的过程,更或者你只是想随便看看,我觉得这本书都挺适合读一读。 7 | 8 | 这本书叫做 - 「创业时,我们在知乎聊什么?」 9 | 10 | 首先有必要说说知乎,这个非常棒的一个网站,原谅我无耻在知乎匿了很久=.=,一直在看别人分享的答案,还没有回答一个问题。关于知乎的介绍,大家自己去访问一下这个网站吧,你会发现你感兴趣的东西的。这里就摘录官方的说明好了: 11 | 12 | > 知乎,中国社交问答网站的先行者,其愿景是“组织各个领域的知识,把人们大脑里的知识、经验、见解搬上互联网”。知乎社区聚集了中国互联网上科技、商业、文化等领域里最具创造力的人群,他们来自于金融、医疗、法律、传媒、教育等众多行业,拥有丰富的从业经验,较高的经济收入和社会地位。 13 | 14 | 让我们来看看在这本书谁在聊创业: 15 | 16 | 1. 李开复 - 创新工厂创始人,前微软,Google副总裁 17 | 2. 张小龙 - 微信之父 18 | 3. 雷军 - 小米公司联合创始人,天使投资人 19 | 4. 王小川 - 搜狗创始人 20 | 5. ... 21 | 22 | 看到这里,不知道你心中是否有一些悸动,或者有一些兴趣呢?如果有,那么这本书也许适合看一看。 23 | 24 | 最后,原谅我无耻的摘录亚马逊的图书介绍和图片: 25 | 26 | > 《创业时,我们在知乎聊什么?》前所未有的互联网出版实验,500万知友亲手甄选内容,知乎三年创业问答精华大集结,史上最真诚创业书,用互联网思维讲透创业的逻辑,在知乎,最强大互联网创业群体真实分享创业路上的荣耀与隐忧,从Idea到步入正轨,创业公司如何招人、做技术、卖产品、找融资、建团队、处理法务?他们在知乎聊创业:创新工场创始人李开复,天使投资人 徐小平,小米科技创始人 雷军,微信之父 张小龙,美团网创始人 王兴,搜狗创立者 王小川,虎360创始人 周鸿祎,虾米网创始人 南 瓜 ,VeryCD创始人 黄一孟 ,啪啪创始人 许朝军 ,知乎联合创始人 黄继新 ,鲜果网创始人 梁公军 ,课程格子创始人 李天放 ,手机之家创始人 高春辉 ……他们这样聊创业:创业的理由有100种,但不论你选了哪一个,你所要面对的事情也许都是一样的,你这个创业项目如果腾讯跟进了,完全复制你的产品模式,你怎么办?创始人之间越是熟悉,越是要“先小人后君子”,平常心,不吹牛,不畏惧我不止一次看到创业者“拍脑袋”,凡事都是“我觉着吧”,而不是“用户觉着吧”。不赚钱的企业是没有存在价值的,这一点,所有创业的人都必须记在心中人才,团队,周报,不理智的完美主义是很危险的事。看一份商业计划书就像和一个人交谈。把这个‘人’写好,无论从内容还是风度。唯有用户与爱,不可辜负…… 27 | 28 | ![「创业时,我们在知乎聊什么?」](https://farm6.staticflickr.com/5486/11817936854_c6746be0ba_o.jpg) 29 | ![「创业时,我们在知乎聊什么?」](https://farm8.staticflickr.com/7387/11818272586_9cbd2fd7a1_o.jpg) 30 | ![「创业时,我们在知乎聊什么?」](https://farm4.staticflickr.com/3743/11817935744_707cb32c73_o.jpg) 31 | ![「创业时,我们在知乎聊什么?」](https://farm3.staticflickr.com/2830/11818270016_e00462f04b_o.jpg) 32 | ![「创业时,我们在知乎聊什么?」](https://farm6.staticflickr.com/5544/11817933264_e46799e9cc_o.jpg) 33 | 34 | --- 35 | image from the Internet 36 | 37 | 38 | ### EOF 39 | ```yaml 40 | background: //farm6.staticflickr.com/5527/11818274986_5884ed8a29_o.jpg 41 | hide: false 42 | license: cc-40-by 43 | location: Nanning 44 | summary: "" 45 | tags: 46 | - Campus 47 | - Reading 48 | weather: "" 49 | date: 2014-01-07T22:18:39+08:00 50 | ``` 51 | --------------------------------------------------------------------------------