选择初心

原文地址:http://www.zreading.cn/archives/6818.html

一个老教授在课堂上问大家:“如果你去山上砍树,正好面前有两棵树,一棵粗,另一棵细,你会砍哪一棵?” Read More

岁月更新,人随春好

原文地址:http://www.zreading.cn/archives/6800.html

  • 狂欢是一群人的寂寞,孤独是一个人的狂欢。
  • 常有人抱怨,我太单纯、太善良、太理性、太有理想,所以赚不到钱。不,一个真正善良理性的理想者,根本不会发出这种抱怨,一棵梅花不会抱怨自己太梅花。很多人在商业与人生上的失败,正因为他们不够单纯,不够善良、不够理性,也没有理想。
  • 有些事情天然具有巨大的传播力,但却毫无价值,明星的绯闻就是。这些事情,沉淀几天,就有结论,一般来说,当事人都不是什么好东西。时间的价值不要浪费在这些事上。如果一个人愿意为这些事浪费时间,那说明他的时间是没什么价值的。——连岳
  • 想占尽便宜的人,就是最便宜的人,往往忘了最有价值的事。
  • 完美的逻辑闭环:我付了钱所以不需要说谢谢(对服务人员);我说了谢谢所以不需要给钱(对帮了忙的熟人)。
  • 这个世界,是属于好人、属于有美德的、勤奋的人。不相信这点的人,不过是在劝说自己作恶,并把作恶的原因归结于他人。
  • 优势本身就是捆住优势的绳索,劣势本身就是赌一把运气的理由。是处在劣势的人,越要孤注一掷。相反,越是处在优势的人,越要谨慎,让实力带来的优势稳稳地发挥出来。
  • 发财,是靠时运,利用不同社会群体的利益对冲,完成财富积累。赚钱,完全靠了本事,纵然环境再恶劣,仍然能够赚到钱,你想能不难吗?会赚钱之人,才有能力创业。
  • 人确实应该不在乎名利,不应为此所累。但是,翻过高山才能说不在乎山高,因为挑战是需要勇气的。你都没有奋斗过,就说我不在乎名利,不对吧?你应该去积极地生活,积极地面对生活的挑战。
  • 人的一生,能力和努力固然重要,但最重要的是,具备作为人应该有的正确的思维方式。
  • Read More

    最终我们也都会明白。

    所谓多,就是少。

    你过了一天,可以说,你的人生,又多了一天。

    也可以说,你的人生,又少了一天。

    而所有的有,都是为了无。 Read More

    使用VueJS和Laravel对用户的输入进行实时验证

    原文链接: https://itnext.io/vuejs-and-laravel-realtime-unique-input-validation-a6d9220be1c5

    我经常面临的一个问题是需要对用户的输入做唯一性得实时验证。最常见的场景是当你在注册时验证用户名,用户必须不断尝试提交表单来验证输入的用户名是否可用使用。这是由于验证在服务端进行并展示结果给用户。

    在我的项目中使用了Vuetify和VeeValidate,我将用它来解决我的问题。下面讨论的这些概念或方法,也可以使用其他的组件实现,但是也许需要一些修改调整。

    我将使用一个从我的一系列多用户的网站应用(multi-tenant web applications)中提炼出一个DEMO项目。下面是演示项目的地址以及系列文章的第一部分:

    laravel-tenancy-passport-demo
    Laravel Passport and Hyn\Tenancy — Part 1

    好戏开始!

    在这个项目中,每一个注册用户都有自己唯一的子域名及其控制面板。域名是在注册时选择并且是唯一的,所以需要在用户填写域名的时候就立即告诉他是否可用,这需要通过API在数据库中检查域名是否可用,如果存在则返回false,反之true。

    正如所上所说,这里使用VeeValidate进行验证,文档: https://baianat.github.io/vee-validate/

    Vuetify 是一个非常棒的UI框架,它会大大提高开发效率。文档:https://vuetifyjs.com/en/getting-started/quick-start

    VeeValidate 配置

    使用极其简单,只需要引入并添加需要的配置即可。下面是我的app.js配置示例:

    //Imports import Vue from 'vue' import VueRouter from 'vue-router' import Vuetify from 'vuetify' import VeeValidate from 'vee-validate' import App from '@/App' import routes from '@/routes.js' //Load Plugins Vue.use(VueRouter) Vue.use(Vuetify) Vue.use(VeeValidate, { inject: false }) //Router configuration const router = new VueRouter({ mode: 'history', routes }) export const vm = new Vue({ el: '#app', render: h => h(App), router }); Read More

    Google Cloud 的 API 设计

    转自: https://zhuanlan.zhihu.com/p/27458970

    最近(很久前)在设计 API 接口的时候发现了一些很难取舍的地方,就看了下业界领先的企业都是怎么设计类似 API 的,发现了很多之前设计的缺陷和一些新的思路。主要参考了 AWS 和 Google Cloud 的 API 设计,两家的设计可以说是把两个不同的风格发挥到了极致,做同样的事情 API 的各个方面都可以设计的完全不一样。Google 有一个自己的 API Design 规范可以在网上找到,不过真实的 GCE API 规范略有一些出入。而 AWS 的 API 设计是没有什么文档的,只能通过现有的 API 进行逆向工程来反推设计理念。这篇文章会比较琐碎,更像是一个读书笔记,细节的东西会比较多。
    Google Cloud API Read More

    教你如何用 Macbook Air 支撑 20w 并发的抢购

    方法一(较猥琐):

    • 购买 Macbook Air(必须)
    • 准备好瓜子、茶水、鸡蛋、板凳(必须)
    • 编写一个 json 文件,内容如下:
    {"success":false,"message":"u6ca1u62a2u5230uff0cu8bf7u518du63a5u518du5389u54e6~"}
    • 到 Ari papapa cloud, seven cow 等各种云上注册试用帐号,越多越好,并上传准备好的 json 文件,抢购页面用到的静态文件也记得放上去
    • 使用世界上最好的语言写抢购逻辑,不用加缓存,直接访问数据库就好
    • 在 Macbook Air 上搭建 nginx + php-fpm,调整 php-fpm worker 数为 1,防止占用过多系统资源;调大 nginx worker_connections 数,修改所有报错的 HTTP 返回值为 200,内容为第三步的 json,最后部署上抢购代码
    • 将抢购的 api 域名指向各种云及 Macbook Air,并使用 CDN 等各种高端技术进行分流,确保 99.9% 的流量分到各种云上,server(Macbook Air) 上只承担很小很小的流量。如果不会用 CDN 之类的,也可以弄很多很多二级域名,比如 api1.xxx.com api2.xxx.com 这样的,指向各种各样的云,然后将抢购所用的域名 CNAME 过去。这样显得域名很多,机器也很多的样子
    • 重点来了:抢购开始,在 Air 上打开 flash、视频、游戏等,开的程序越多越好,制造服务器很忙,抢购很紧张的假象。搬来茶水、瓜子和板凳开始看电影、玩游戏
    • 抢购结束,把鸡蛋打碎倒在 Air 上,开始去各个云上删除或更换 json 文件
    • 发公关文,说抢购圆满结束,服务器热得都快起火了,并附上被煎熟的鸡蛋截图,换来各种惊叹

    方法二(较优雅): Read More

    PDO: bindParam versus bindValue

    绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符。 不同于 PDOStatement::bindValue() ,此变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值。

    http://php.net/manual/zh/pdostatement.bindparam.php

    [With bindParam] Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

    So, for example:

    $sex = 'male';
    $s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
    $s->bindParam(':sex', $sex); // use bindParam to bind the variable
    $sex = 'female';
    $s->execute(); // executed with WHERE sex = 'female'
    Read More

    Inotify: Linux文件系统事件监控框架

    准备

    安装

    yum install -y inotify-tools incron

    简单的文件变化通知样例

    创建文件夹

    mkdir /tmp/inotify-test

    启动监控

    inotifywait -rme modify,close_write,create,delete /tmp/inotify-test

    测试

    更多信息移步inotify-tools wiki

    使用incron

    incron,它是一个类似于cron的守护进程(daemon),传统的cron守护进程都是在规定的某个时间段内执行,而incron由于使用了Inotify,可以由事件触发执行。同时incron的安装简单而直观,比如在debian上,首先在/etc/incron.allow中添加使用incron的用户(debian默认不允许用户使用incron,因为如果incron使用不慎的话,例如形成死循环,则会导致系统宕机) Read More

    JavaScript立即调用的函数表达式

    什么是自执行?

    在JavaScript里,任何function在执行的时候都会创建一个执行上下文,因为为function声明的变量和function有可能只在该function内部,这个上下文,在调用function的时候,提供了一种简单的方式来创建自由变量或私有子function。

    // 由于该function里返回了另外一个function,其中这个function可以访问自由变量i
    // 所有说,这个内部的function实际上是有权限可以调用内部的对象。

    function makeCounter() {
    // 只能在makeCounter内部访问i
    var i = 0;

    return function () {
    console.log(++i);
    };
    }

    // 注意,counter和counter2是不同的实例,分别有自己范围内的i。

    var counter = makeCounter();
    counter(); // logs: 1
    counter(); // logs: 2

    var counter2 = makeCounter();
    counter2(); // logs: 1
    counter2(); // logs: 2

    alert(i); // 引用错误:i没有defind(因为i是存在于makeCounter内部)。 Read More