技术长文汇总

魔改大赛这样开始比较快
Github仓库备份
用Devise+Omniauth实现第三方登录
商品分类之无限极分类
实现Product【一种规格一个价格】
Markdown渲染(全栈营教程同款)

我在求职群一个月的收获总结

有些东西真的要实战,即使是模拟实战
有些东西真的要反复实战,即使是反复模拟实战

在比赛结束以后,其实很多人都懈怠了。
我感觉自己还是蛮幸运的,进了求职群,
每一次作业都是在逼自己去实战,有些东西,不逼一下,可能要挤到节骨眼了才会去思考去想。
人有时候就是很懒。
这个其实一直以来也是一个疑问?就是如何通过一些手段去逼自己去思考,逼自己去实战。
(后面有答案)

关于Landing Page 之 简历的应用

简历的第一版是采用的Landing Page的逻辑来做的。
最初做出来自我感觉不错,后来找两个人参考以后,有一位朋友就提出了很大的质疑,会觉得我上面自我吹嘘的内容太多了。这导致,我重新换了一个角度来思考简历的问题,Landing Page其实更适合去抓普罗大众的眼球,而HR对待简历与我们平常面对一个LandingPage的心态是完全不一样的,HR阅简历无数,其实,自我吹嘘的那些内容,很可能,他们根本不会看,甚至会吐槽,尤其像程序员简历,可能更多的是匹配技术关键词,与查看以往经历,来判断。所以就有了我后来的第二版,对于我这种没有什么编程经验的人,更多的就是罗列实实在在的技术。
其实在知乎里,也找到类似逻辑的验证:写简历,你只需要提供论据,而让对方来下结论,而不是你自己来下这个结论。

关于群机制

先交1000元的群费,只有完成任务,才能返还。这个机制真的是很有用,那每次老师布置作业的时候,都会有相当的压力,因为1000元对于我来说,不算是个小数目,所以这个促进我战斗的动力还是很强的。

关于自我介绍录音

这个作业相当有趣,一直以为,自我介绍,就是随便两句就搞定,甚至一度觉得面试官如果在拿着你的简历的时候,还要你做自我介绍,那这个面试官就是SB.... 也是在看了一些帖子,又去询问了有人资经历的朋友,才知道,这个环节是有它存在的意义的,比如,一般面试官,可能都没有时间提前看你的简历,所以,会让你做自我介绍,然后趁这个时间,赶紧了解一下你的信息。其次,很多人自我介绍就是重复简历上的内容,而其实面试官更想要听简历上没有的内容,所以,我们可以采取的策略就是,简历上有些内容可以有意的写的简短一点,然后自我介绍的时候把一些有利的内容进行展开。
再着,自己给自己录音,由于我想要尽量模拟还原面试的场景,所以,选择先背下来,不背不知道,还是,很要下点功夫,也是在这个过程中,让我突然感觉,简历、面试,的准备工作真的是很多很细,并不想以前以为的那样随意、简单。

关于提取练习

一个月的学习与思考,我也对提取练习的操作,有了新一层的实施方案。
原理:呵护自己对编程的热情
策略:
* 视频/文字课程/书籍 转成自己可操作的操作手册 并反复练习
* 把操作手册转换为技术文章,分享给别人
* 做成PPT,开直播,模拟有学生,讲给学生听
* 去meetup真实讲给别人听
思考:「里程碑」是呵护自己热情的一个重要手段,一旦你又里程碑式的进步或产品,一定要停下来,享受那种感觉,胜利的感觉,自我陶醉的感觉,享受它,才会再次渴望它。

大环境

从多方面了解到,国内业内对我们这些从全栈营出来的学员,持有极大的怀疑态度,甚至是负面情绪…所以,形式并不容乐观,面试找工作,最终还是要落到实打实的技术。但作为真正从全栈营走出来的学员,我很清楚我从中得到了什么,只是需要时间和自己的努力,才能证明给别人看你是真正有实力的。同时,也深深的感受到了肩上的压力,我们出去以后的表现,就直接影响他人对全栈营的看法。而谁也不想自己喜爱的东西,被别人挑三拣四,招人非议,我想我们唯一能做的就是,在未来的3~5年内,埋头把自己所学到的方法,运用到未来的成长中去,它日成为中坚力量的那一刻,可以回头告诉他们,键盘侠你们错了。

ShawWOW电视广告LandingPage分析

一句话形容自己:

You will saying WOW every time you use this towel.
It's like a chamois it's like a towel like a sponge.

使用它的三大好处

1. 吸水性超强 (一共穿插3个实验)



2. 到处都可以用

3. 洗涤方便 (丢到洗衣机就好了)

使用者见证


找了四个人来说使用体验

Call to Action

1. 再次强调随处可用

2. 与竟品对比绝对优势

3. 价钱超级实惠

ORID - 2017.7.3~7.9

Objective (客观描述事实)

一个星期都在研究实时聊天应用
写了一个复刻版的微信
周末meetup见了陈慧娟😄

Reflective (主观描述感想)
  • 你要如何形容今天的情绪?
    • 累并高兴着
  • 今天的高峰是什么?
    • 见陈慧娟
  • 今天的低点是什么?
Interpretative (分析寻找意义何在)
  • 今天学到了什么?

    • 面试可能还真的需要先面两家看看,才知道是怎么回事
    • 视频学习法:
      1. 首先完整的看一遍视频,不管你听懂没听懂,都不要停下来
      2. 然后第二遍结合快进的方式,把视频里的整个代码过程,写在笔记本中,转为文字教程内容
      3. 第三遍第四遍第五遍…不看视频,对照文字教程进行多遍练习
    • 关于教育的思考:好教育是奢侈品,好的教育机构只是暂时的天堂,一旦走出来,最终还是要面对中国国情。
      1. 如果你花很大的价钱让宝宝上一个很好的早教,家长自己没觉悟,效果也有限。
      2. 如果你花很大的价钱让宝宝上一个早教+幼儿园,毕业以后进入传统的小学,孩子会因为巨大的落差,与老师的压力,而面临崩溃,极大打击自信心的风险。
      3. 如果你花很大的价钱让宝宝上一个早教->幼儿园->小学,毕业以后进入传统的中学,会面临一样的崩溃,一样的自信心打击
      4. 如果你花很大的价钱让宝宝上属于同一体系的教育机构,早教->幼儿园->小学->中学->大学,那么很好,没有问题。

以此见得,如果你想让你的孩子真正受益于先进的教育机构,那么,要做就要做全套,从早教育到大学。
也就是说,从早教开始,一旦你开始花这个钱,你就要掂量掂量自己,有没有这个经济实力,一直花大价钱上好学校,如果将来因为经济实力,而使得你的孩子,回到传统学校进行学习,那么可能会造成严重的后果。
所以,好的教育真的是奢侈品,给有钱人玩的东西。
那么,对于大多数的我们应该怎么办呢?
解答:投资自己,让自己变的更好,我不是说多赚钱,而是,你不要寄希望于学校老师能引领你的孩子,而应该不断投资自己,让自己一直在变的越来越好,身体力行的去影响孩子,做孩子真正意义上的精神引路人。

  • 智商税其实我们一直都在交,不过,有些智商税也就是快速成长的必经之路。
  • 面试重点:devise原理详解(自己写登录系统),session与cookies的区别,
Decision (决定下一步的行动)
  • 网上我的fake_weichat
  • 进行技术文章的撰写
  • 修正练习文章,多遍练习
  • 看教材内容

为什么Routes中的Update有PATCH与PUT两种http请求路径

PUT的定义

rfc1945中的定义:

The PUT method requests that the enclosed entity be stored under the
supplied Request-URI. If the Request-URI refers to an already
existing resource, the enclosed entity should be considered as a
modified version of the one residing on the origin server. If the
Request-URI does not point to an existing resource, and that URI is
capable of being defined as a new resource by the requesting user
agent, the origin server can create the resource with that URI.

The fundamental difference between the POST and PUT requests is
reflected in the different meaning of the Request-URI. The URI in a
POST request identifies the resource that will handle the enclosed
entity as data to be processed. That resource may be a data-accepting
process, a gateway to some other protocol, or a separate entity that
accepts annotations. In contrast, the URI in a PUT request identifies
the entity enclosed with the request -- the user agent knows what URI
is intended and the server should not apply the request to some other
resource.
Patch的定义

rfc5789中的定义

Several applications extending the Hypertext Transfer Protocol (HTTP)
require a feature to do partial resource modification.  The existing
HTTP PUT method only allows a complete replacement of a document.
This proposal adds a new HTTP method, PATCH, to modify an existing
HTTP resource.

这里明确指出,因为许多情况下都需要一个去对resource进行局部更改的请求,
而PUT是对一个docuemnt的进行整体替换
所以,就新定义了一个PATCH请求,来专门处理这个有局部请求的request

Rails社区早有讨论

rails issues 348
早先rails 4之前,update都是用的put
而在这个官方issues中,就可以发现针对这个问题,展开了很多讨论,
最后一致认为,PATCH更适合我们的update方法,所以,就把PATCH作为update的默认request方法,
不过由上面的截图也看到了,虽然默认是PATCH,但是,原有的PUT还是得到了保留,
应该是留给你开发者有特殊需求的时候使用的。

Rails官法blog也作出详细解释

Edge Rails: PATCH is the new primary HTTP method for updates | Riding Rails
在看完这篇以后,也对restful有了更清晰的认识
/posts/:id/edit这样的URI分层都属于是资源(resources)分层,
它只有一个目的,就是标注定位,你要操作(CRUD等)的资源文件放在哪的仓库中,
而你要做的操作,也就是action,则由HTTP method来定义,
也就是GET,POST,PUT,PATCH,DELETE这些请求
这些请求更重要的是其语意上的差别,好比是一个统一的规则,
便于所有人进行通用的合作

为何要有这么多method

HTTP中post和put的根本区别和优势? - 知乎
我并不想查太多,不过看一点这篇知乎里Tom Goong的回答,应该能明白一点,这个统一的规则会带来什么好处。

Rails如何知道form是New/Edit,submit是Create/Update

疑惑

这个问题起源于董明娟提出一个JDStore中的疑惑:
在app/views/carts/index.html.erb中

<%= form_for cart_item, url: cart_item_path(cart_item.product_id) do |f| %>
    <%= f.select :quantity, 1..cart_item.product.quantity %>
    <%= f.submit "更新", data: { disable_with: "Submiting..." } %>
<% end %>

这个cart_item的form,rails是怎么知道request要提交到CartItemsController的update方法中去的?

错误认识

我最初一直以为只要设置好这个url: car_item_path(cart_item.product_id)form自然就知道要过去了,但是,转念一想,发现,这里只提供了部分信息,只提供了URI地址,在没有写单独注明controller的情况下,form顶多它要请求的网址是 /cart_item/:id,然后需要去到CartItemsController而已,当并不知道对应的action是什么?

探索

我们再看一下rake routes的结果

会发现create和update的URI并不一样
这时,你会觉得我之前说的是错的,rails就是靠设置这个url来判断是create还是update
那么,我在这里先告诉你,经过测试这个并不能决定最终会提交到哪个方法中。
为什么?(还是先说正确答案吧)

正确答案:Rails是通过判断与这个form绑定的对象是否在依然在数据库中有效存在,来决定这个form是edit_from还是new_form,从而也就决定了其将来时请求到update还是create

不是很明白?举个例子吧。
在一个只有Post的Model的Rails项目中
app/view/posts/_form.html.erb

<%= form_for post do |f| %>

        <div class="field">
            <%= f.label :title %>
            <%= f.text_field :title %>
        </div>

        <div class="actions">
            <%= f.submit %>
        </div>

<% end %>

Rails会通过post.persisted?来判断
post.persited? == true就说明数据库中已经有这个post的存在,于是就判定其为edit_form
post.persited? == false就说明数据库中还没有这个post的存在,于是就判定其为new_form

接着,就会很好奇,这个edit_form与new_form到底有什么不同,因为从页面上看起来都一样啊?
于是,我们继续做实验:打开一个edit页面与一个new页面,然后用inspect检查器看看html到底有些什么不同?

虽然form里的method的都是post
但是edit_form中,还有一个隐藏的input

<input tyep="hidden" name="_method" value="pathch">

我们在PostsController的Update方法开头打一个断点,然后查看params,得到如下内容

这个时候我们可以再回看这张route图

update的http请求method就是PATCH

那么也就是说,rails是根据object.persisted?来判断edit/new
如果是edit就在form里增加一个隐藏的input,在这个input上定义一个_method: "patch"的属性,
最终通过它来告诉Rails我点击submit按钮的时候,是要create还是update

又一问

那么,相信很多人,马上就会问,为什么不直接把form的method设定为patch?
答案就是:大多数浏览器只默认支持GET与POST,而不支持patch,所以就采用了这种隐藏input的巧妙方法
更详细的叙述,请看这两个链接:
PATCH vs. POST
Are the PUT, DELETE, HEAD, etc methods available in most web browsers?

读form_helper源码

接下来我们再来放个大招,读一下Rails负责生成form的form_helper源码
rails/form_helper.rb at 4-0-stable · rails/rails · GitHub

注意看这一句,
当object存在与数据库中的时候,就把action设置为:edit,method设置为:patch
按object不在数据库中存在的时候,就把action设置为:new,method设置为:post

趣味实验

大家可以去把controller里的new方法做如下改动

然后去new里面提交一下代码,看看,最终submit到create方法还是update方法中去了

到此,相信对rails如何生成edit/new form和如何做submit判断create/update已经比较清楚了

ORID - 2017.6.29

Objective (客观描述事实)

粗略搜集了十几家公司的资料
写了一篇简历
发现rails如何区分form是edit还是new
查询debug相关工具
看Xdite直播

Reflective (主观描述感想)
  • 你要如何形容今天的情绪?
    • 还不错
  • 今天的高峰是什么?
    • 发现Rails的源码也并没有那么难读
  • 今天的低点是什么?
    • 简历写完感觉丝毫没有体现出我的优势
Interpretative (分析寻找意义何在)
  • 今天学到了什么?

    • 简历一句话形容自己还蛮重要的,但同时感觉也是超级难
    • rails是根据@object.persisted?来判断是要作为edit form还是new form
  • 今天的一个重要的领悟是什么?

    • 一切迷茫的事情,都是没有把开放性问题转为封闭性问题
Decision (决定下一步的行动)
  • 做Nic布置的Extra作业
  • 写一点项目中用到的技术文章

ORID - 2017.6.28

Objective (客观描述事实)

写完并发布markdown渲染的文章
给搭档讲我在routes里的新发现
写了一篇bin/setup的总结文
初步弄明白了symbol与string的区别

Reflective (主观描述感想)
  • 你要如何形容今天的情绪?
    • 还不错
  • 今天的高峰是什么?
    • 发布markdown文章受到好评
  • 今天的低点是什么?
    • 给搭档讲routes新发现的时候,各种坑
Interpretative (分析寻找意义何在)
  • 今天学到了什么?

    • string每次使用都是新的一个object,而symbol就一直是用一个object,且hash的时候尽量使用symbol,这样节省内存
    • 平日里用的rails/rake,bin/setup,这些都是项目里的bin文件夹下的几个脚本文件 也就是说我们平日里在命令行输入命令,也就等于是在调用那些脚本,并给那些脚本传入参数,脚本就根据我们传入的参数运行一系列脚本
  • 今天的一个重要的领悟是什么?

    • 没有
Decision (决定下一步的行动)
  • 做Nic布置的两个作业
  • 写一点项目中用到的技术文章

ORID - 2017.6.27

Objective (客观描述事实)

把电脑和网线搬到另一个房间
与文文谈心
帮搭档解决了一个问题

Reflective (主观描述感想)
  • 你要如何形容今天的情绪?
    • 乱糟糟
  • 今天的高峰是什么?
    • 有了新的办公学习环境
  • 今天的低点是什么?
    • 没有
Interpretative (分析寻找意义何在)
  • 今天学到了什么?

    • 定期与自己的伴侣交流心里变化是必须的,结婚两年后的对方都已经不是当初的自己,都有很大的变化,所以思想需要时刻保持同步
  • 今天的一个重要的领悟是什么?

    • 没有
Decision (决定下一步的行动)
  • 继续练习课程
  • 写一点项目中用到的技术文章
  • 由meetup一次解bug,来谈谈params(放在这怕忘了)

ORID - 2017.6.25/6.26

Objective (客观描述事实)

写了一篇markdown的教程
帮朋友制作问卷调查与PPT

Reflective (主观描述感想)
  • 你要如何形容今天的情绪?
    • 复杂略较早
  • 今天的高峰是什么?
    • 显示器来了
  • 今天的低点是什么?
    • 没有
Interpretative (分析寻找意义何在)
  • 今天学到了什么?

    • 自己的节奏还是很容易被别人夺走的
  • 今天的一个重要的领悟是什么?

    • 没有
Decision (决定下一步的行动)
  • 继续练习课程
  • 写一点项目中用到的技术文章
  • 由meetup一次解bug,来谈谈params(放在这怕忘了)