阅读视图

发现新文章,点击刷新页面。
🔲 ☆

Using ActionCable and React to Create a Simple Chat App

Online example: https://ac.aiichat.cn

Code repository: https://github.com/renny-ren/action-chat

Introduction

In this article, I'm going to explore how to leverage the power of Rails ActionCable and React to build a web chat application. ActionCable provides a straightforward way to incorporate real-time features into Rails applications, while React serves as a powerful and flexible frontend framework. By combining these technologies, we can create an interactive and dynamic chat application. Let's dive into the details of how to implement this solution.

Setting up the Environment

Before we dive into the implementation details, make sure you have the following prerequisites in place:
- Ruby on Rails: Ensure that you have Rails installed on your local machine.
- React: Familiarize yourself with React and have a basic understanding of how React components and states work.

Creating the ActionCable Channel

To begin with, let's create an ActionCable channel for our chat application. In your terminal, run the following command to generate the channel:

rails g channel chat_channel

This command will generate a chat_channel.rb file under the app/channels directory. Open this file and update it as follows:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "ChatChannel"
  end

  def unsubscribed
    # Any cleanup needed when the channel is unsubscribed
  end
  
  def receive(data)
    @message = user.messages.create(body: data["body"])
    ActionCable.server.broadcast("ChatChannel", JSON.parse(@message.to_json))
  end
end

stream_from method inside the subscribed specifies the channel you want to subscribe to and receive updates from. It means that whenever there is a new message sent to the ChatChannel, the clients subscribed to this channel will receive the message in real-time.

Creating the ActionCable Consumer

To establish a connection between the client and the server, we need to create an ActionCable consumer in our React application. Add the following code snippet where you want to initiate the connection:

app/javascript/channels/consumer.js

// Create a consumer object
const consumer = ActionCable.createConsumer();

This code initializes an ActionCable consumer object, which acts as the bridge between the client and the server.

Subscribing to the Channel

Now, let's subscribe to the chat channel we created earlier. Use the following code snippet to subscribe to the channel:

// Subscribe to a channel
const subscription = consumer.subscriptions.create("ChatChannel");

Ensure that the channel name passed matches the name of the channel you defined in your Rails application.

Unsubscribing from the Channel

If at any point you want to unsubscribe from the chat channel, you can call the unsubscribe method on the subscription object:

subscription.unsubscribe();

This will effectively terminate the connection and stop receiving updates from the channel.

Disconnecting the Consumer

Finally, when you're done using the consumer object, it's good practice to disconnect it. Use the following code snippet to disconnect the consumer:

consumer.disconnect();

This will release any resources associated with the consumer and prevent unnecessary connections.

 

Online example: https://ac.aiichat.cn

Code repository: https://github.com/renny-ren/action-chat

Reference

Refer to the following resources for more detailed information and examples:

Integrating ActionCable with React

Simple chatroom with Rails 6 and ActionCable

rails-sse-and-websockets GitHub Repository

🔲 ☆

纪念左耳朵耗子


没有想到突然以这样的方式看到皓叔,在百度的热搜榜。

前几天看到这个噩耗时,我正在地铁上,非常震惊。一开始是不敢相信,然后感到错愕,从我上地铁到下地铁,我整个人是木在那里,一直在刷相关的消息,朋友圈已经刷屏了。

好几天过去了,今天忙完,看到了这个仓库,里面记录了大家对左耳朵耗子的点滴回忆,我把这个仓库大家写的文字基本都看了一遍,然后自己也来写一写。

初识

大概是 2016 年吧,我还没毕业,那时偶然间刷到了酷壳的文章,很受启发,当时就收藏了。

后来又刷到了,我说这篇文章怎么写这么好,一看又是皓叔出品,果然是精品啊。

皓叔很多文章一看就是经过深度思考总结出来的,像《X-Y PROBLEM》,《谈谈我的“三观”》这些,都是很经典,一方面我发现找到了共鸣,有一些观点,有一些我认为的但是没有说出来的,皓叔说出来了,简直不能认同更多;另一方面让人感觉醍醐灌顶,深受启发。

一面之缘

我是普通野生程序员一枚,在前司上班时候,有一天,我们 leader 说邀请到了左耳朵耗子来给我们分享,我当时看了非常激动,期待着他的到来,没想到突然就能见到自己敬仰的人,想听听大佬会带来什么样的分享。

第二天皓叔来了,一身朴素的装扮,沉稳的技术人形象,背着个包,和在网上看到的照片上一模一样的衣服,甚至可以说是和修理工人有几分相似。

白发苍苍,我看过他说的,那段时间家庭的事,父亲的事,一下头发就白了。

分享的时候我就坐他旁边,听得津津有味。我还记得他说他这人很喜欢总结,确实,在他分享过程中不难看出他自己独特的思考,他对于事情的认真的态度,以及钻研的精神,这些都是令我十分敬佩的。

就像 Kevin 说的,他聊了很多,他喜欢对比阿里和亚麻的企业文化,我当时还截屏了,这张截图一直保留到现在。

分享完皓叔就要赶去机场了,空隙间和他聊了几句,还记得他说:“你们现在都叫我皓叔了啊…”

我想,虽然按辈分讲可以叫叔了,但看了大家写的,他应该不太喜欢这个称呼,哈哈。

结尾

我与皓哥其实没有太多交集,大部分时候我都是默默地看,看他发的文章,看他朋友圈的分享,偶尔点个赞,看他在推特上和别人深夜对线。
但我从他身上学到了很多,他的认知、他的思考、他的态度。我很佩服皓哥的钻研精神、分享精神和乐于助人的精神。

长期坚持深耕底层技术,不容易;博客坚持分享二十年,不容易;他说帮助他人收获最大的是自己,他说至少 45 岁之前不会写书因为觉得自己积累不够,他还痛恨那些出烂书的人,有自己的痛恨手册。

关注多年,就我个人主观片面的了解而言,皓哥是一个有原则、棱角分明、犀利、热爱技术、谦逊、对自己有高标准高要求的人。

虽然有时候他的一些言论我也无法认同,有时候感觉他怼人怼得太直接了,有时候觉得他太犀利了,但一个人不可能什么都是对的,这不妨碍其他的内容给人的正向激励和影响。
所以最近看到一些无脑的评论,我实在无法理解,还有各种黑他的,哈哈,不过这也正说明了他的影响力。

对于一些人来讲,可能无法理解失去这样一位前辈对我们是什么样的打击。

天妒英才,惋惜之余,我相信皓哥留下的文章和作品将会继续影响、激励着中国的程序员们。

最后贴上这句在任何平台都能看到座右铭:


 

🔲 ⭐

卸载英雄联盟

上个月底的某一天,凌晨2:48分,我又一次把英雄联盟卸载了。

这是我第二次卸载。上次是在21年的3月份卸载的,然后今年1月初又下载了。

原因是,我发现我做很多事情都容易上瘾,不卸载的话,我总是会想去玩,而且一玩就停不下来。

按理说我自制力并不差,我也做了不少逆人性的事情,但是为什么每次玩英雄联盟就停不下来呢?

说好听点,我把它总结为对胜利的渴望和对卓越的追求。

输了想再来,我一定要赢一把!这是对胜利的渴望。比如连跪10把,会一直认为下一把一定能赢了,一定要再玩一把。

赢了想再来,我今天一定要打个5连胜!这是对卓越的追求。赢多少局才会满足呢?两连胜?五连胜?十连胜?不,我发现永无止境。

这么看来,我似乎是一个很在乎结果的人(至少在玩英雄联盟这件事上是的),玩游戏本来是为了放松自己、为了开心,然而我成了不在乎过程,就是想赢一把,再赢一把。玩到凌晨两三点了,人都困得快睡着了,还想着要赢一把,所以这到底是我在玩游戏还是游戏玩我呢?

其实不仅仅是打游戏,我似乎做很多事情都是这样。

弹琴能弹到凌晨三四点、写字写通宵、写代码兴奋了写通宵,这些都是有过的。

简单来说,当我做自己喜欢的事情的时候,是容易陷进去的,做一件事就认认真真做一件事,有始有终,不搞出点名堂来誓不罢休。

当然了,我也不是任何时候都是这个状态,如果是和朋友或者是和其他人一起,应该是在乎过程更多一些。而自己一个人玩英雄联盟的时候,就喜欢单排,搞点有成就感的事情。

另一方面,英雄联盟一局游戏的时间比较长,一旦玩了半天输了,沉没成本就比较大,就总是和自己过意不去。

大概算一下,我已经打了数千把,平均每把就按20分钟算,4000把就是8万分钟,也就是说我至少是花了1000多个小时在这上面的。然而我通过打英雄联盟收获了什么呢?并没有多少收获,除了玩的过程中的快乐,剩下的就是玩完之后一次次的忏悔。

与其这样不如直接卸载了,就不要去碰它,把这些大把的时间花在别的更有意义的事情上,提升自己。

 

🔲 ⭐

记我的爷爷

上周五,2021年7月16日,下午两点过,我接到电话,得知爷爷走了。

第一反应是懵的,因为之前没有任何准备,突然听到这么一个消息,大脑一片空白,不敢相信。

直到我看到照片,看到视频,看到门前摆满了花圈、坐满了人,我才意识到,爷爷是真的走了。

我知道这一天总会到来,但我没有想到,会这么快。

在这之前,爷爷身体不好,卧病在床已多日,�但不久前我们通电话的时候,他还似乎一切正常。所以突如其来的噩耗,让我感到一丝惊讶。

今年三月份,爷爷骨头断裂,在医院痛得不行,我东拼西凑拿出了一万五,爷爷做了手术。没想到不到四个月,爷爷就走了。

我也问过我自己,这个钱花得值不值,答案是没有什么值不值的,在那种情况下,�做手术能缓解病痛,�所以我毅然决然地支持。

我想,如果爷爷当时没做手术,是不是可能活得更久呢?我不知道。但我知道的是,如果当时我没拿出钱,而几个月后爷爷走了,这一定会成为我一辈子的遗憾。我不想后悔。

 

坐夜的晚上,我守在门前,一个通宵。真的有一种难受,连眼泪都不会流。

半夜4点的时候,狗竟然也没睡,不知道从哪里跑出来了,朝着我大叫不停。我发现它在找吃的,也许是饿急了吧,这几天可能也没人管他。我去给它找了点吃的,洗干净,扔给它。它很快就吃了,果然是饿坏了。吃完之后,它也不睡觉,还去屋里转了转,似乎它也知道爷爷走了。

很快就5点了,我们一路护送爷爷上了山、下葬。

回到家之后,我睡了一会,醒来后,我稍微回过神了,一幕幕场景浮现在我眼前:

- 那时候快递还不那么发达,没有配送服务,快递走邮政 EMS 寄到了邮局,爷爷陪我去取快递

- 以前我买了个篮球架,爷爷背着篮球架回家,我们一起组装好

- 初中时,早上叫我起床上学,晚上催我睡觉,给我做饭。经常问我想吃什么,几点放学,要不要回来吃饭(最爱吃爷爷做的小土豆)

- 上次见面离开时,爷爷颤抖的手递给我两颗糖果

- 教他用手机,怎么看照片,怎么看新闻

- 上一次通话,爷爷说我今年运气会很好。我问他身体好点了没,他说没什么问题,不用担心我。

- 爷爷最后一次给我打电话,我在忙没有接到,回过去的时候,他也没有接到。

……

我的脑海里闪过了太多片段,眼泪忍不住地流。我已经记不得上次流泪是什么时候了,至少是很多年前了。

轻描淡写的文字无法表达我的感受,这个世界上也没有真正的感同身受。道理大家都懂,但只有真正亲身经历的人,才会有体会。

 

我知道,沉溺在悲伤里,只会越陷越深的。时间会冲淡一切,并不是时间本身会冲淡一切,而是在一段时间的长河中,大大小小的事情会把以前的事情冲淡。

生死之外无大事,大事都经历过了,人生又还有什么好怕的呢?

要做一个向前看的人,乐观生活,坚强地面对人生。

亲人永远活在心中,这样就不会有真正意义的死去。把他们当做努力的动力,生活的信仰,让他们为你骄傲。

 

🔲 ☆

《人生算法》读书笔记

1

先说说我思考过好几次的问题:人为什么要阅读?读书到底有啥用?

这个问题我其实一直没想明白,直到我看到了这么一句话:

一本书读完,可能很快就忘干净了,就像竹篮打水,是一场空。

但是竹篮经过一次次水的洗礼,会一次比一次干净。一个人每天看书,可能记不住什么,但是在潜意识里会明白,什么是对,什么是错。

我觉得说得太好了。昨天我又看到个视频,说的是阅读就像你人每天吃进去的食物一样,你3天前吃的是什么?你已经不记得了,但是它成为了你的养分。这说的其实是同一个意思。

另外,越阅读,才越发现自己的无知,越发现自己需要学习,又给自己提供了动力。

 

2

尽管我是一个很有耐心的人,但我很难静下心来阅读一篇长文,就是手机上的公众号那种长文,我仿佛有“阅读长文恐惧症”,看到那种文章我就只想快点翻到最下面看看评论结束。总结起来,其实有这么几点原因:
  • 文章看着太长了,滚动条那么短,一眼翻不到头,目标太大。其实这和做事情是一个道理,不拆解成多个小目标的话根本没法玩

  • 在用手机的时候是一个相对比较放松的状态,并没想着要专注地阅读,所以突然遇到一篇长文,是很难花大量时间去阅读的

 
相比之下,读纸质书就不同了,读书、写作可以真正让我静下心来,让内心得到安放,不那么浮躁。
 
回到《人生算法》这本书,结构非常清晰,还把内容分成了九段心法和十八关算法,每章就是一关,每一关的内容也不多,就那么几页,读起来也不费劲,每天闯两关,目标很清晰,颇有一种打怪升级的感觉。

 

3

书的开篇从一个游戏引入:

想象一下,你现在中了一个大奖,你面前有两个按钮:按下第一个按钮,你可以马上拿走100万美元;按下第二个按钮,你有50%的概率获得一亿美元,也有50%的可能什么也拿不到。这两个按钮,只能选一个,你会选哪个?

哈哈,这个题作者在书里提供了几种思考方案,很有意思。

这本书里面确实讲了很多道理,但是都不空洞,结合了很多实际的案例、实验或是生活中贴切的小事。同时内容还覆盖了金融、概率统计、数学、物理学、心理学、哲学等等多个领域,光是新名词我就学习了好多。

不过正如上面所说,如果现在要我一五一十地讲出来这本书写了些啥还是有些困难的,不过我记录了一些关键点,下面随便摘抄列举一下:

  • 复利

一张纸在对折6次之后再想进行对折就非常困难了,理论上来讲,如果对折27次,纸张的厚度可达1.3万米,远远超过了珠穆朗玛峰的高度。这就是复利的魔力。

“人生就像滚雪球,重要的是找到很湿的雪和很长的坡”

 

  • 用垄断实现复利优势

作者讲了一件有趣的事情:不管你觉得自己内心多么丰富,你在其他大部分人心目中,可能就是一个标签。比如,那个特别能聊天的人,那个搞投资的人,那个卖房子的人,等等。这个标签是你独一无二的价值。

 

  • 回到过去能改变命运吗

如果你现在有一个机会,可以搭乘时光机穿梭回到过去,改变你做过的任意一个决定,你觉得自己的命运会因此而改变吗?

一个城市每年大约发生100起凶杀案,如果可以搭乘时光机回到过去,提前把这100个嫌犯抓住,是不是这座城市就不会有凶杀案了?

作者的回答是:不会。

 

这章我记录了两个关键词:一个是大数定律,一个是稀释。

简单来说,大数定律应该是统计学的一个词吧,讲的是一个随机事件多次重复发生,它的结果所呈现的长期稳定性。书中举了几个例子。

另外稀释就是大数对小数会有稀释作用,不断地抛硬币,正面朝上的概率会不断趋近于50%

 

“我们在人生中犯一两个错误的时候,不要纠结,不要总想着修正它,你应该继续做正确的事。”

“当我们以一生为期限,复盘命运的时候,我们的命运就无法取决于一两次选择,因为它取决于我们自身的系统。性格决定行为方式,行为方式决定命运。”这也是前面的问题答案是否定的原因。

 

  • 灰度认知、黑白决策、疯子行动

  • 双我思维

  • 浑球儿思维

  • 获得好姻缘的算法

  • 防爆思维

  • 时间权和概率权

  • 时间贴现与延迟满足

  • 人生的三个旋钮

 

                 

总的来说,《人生算法》这本书就是一次自我意识的塑造之旅,很耐人寻味,强烈推荐。 

 

🔲 ☆

《不拘一格》读书笔记

“员工可以自己决定休假,没有限期,不需要审批”

“取消差旅和报销制度,员工可以自己做决策”

“我们招聘最好的员工, 仅仅做到称职也要拿钱走人”

“按市场最高价支付工资,不搞KPI,末位淘汰是我们最为排斥的规定”

“取消奖金制度,直接把奖金加到工资里”

“永远保持坦诚。身为领导者,不能让你的下属对你的决策感到不解和诧异”

以上这些比较独特的观点来自于市值千亿的 Netflix 公司的文化手册。

 

No Rules Rules《不拘一格》据说是 Netflix CEO 哈斯廷斯出的第一本书。刚出版不久我就下单了,因为看了个简介视频,里面的内容吸引了我,一家千亿市值的公司的企业文化到底是怎么样的呢?我就来吃瓜看看。

这本书的结构很清晰,是一本讲管理的书籍,但是完全不是那种讲理论知识的,而是哈斯廷斯以及一名记者,结合公司多年来的实际发展经历,以及对公司员工的采访,针对具体的问题而总结出的解决方案,所以像我这种完全不懂管理的人也可以看得津津有味。

与其说是在讲管理,不如说是在讲故事,在记录,记录的就是 Netflix 公司发展过程中遇到的各种问题和思考,比较特别的是他们愿意把这些全都写出来,包括企业文化、公司内部的管理章程、制度和手册等,我想这确实也与他们的「坦诚」的价值观相对应。

书中的很多观点正如书名一样,没有规则的规则,真的是比较颠覆常规的方法,可以引发很多思考。比如上下班打卡究竟考核的是什么呢?奖金有用吗?奖金低的人和奖金高的人谁的任务会完成得更好?KPI到底有用吗,应该怎么使用?什么时候应该制定规则,什么时候要选择自由?

再比如公司取消了报销审批制度,就有员工会开始虚假报销,或者大手大脚的花钱,甚至从报销中牟利,这种情况是怎么处理的呢,如何防止类似的情况发生呢?这些都在书中给出了答案,故事情节可谓跌宕起伏。

其实整本书基本是围绕三个点来讲的:

- 提高人才密度

- 提高坦诚度

- 取消管控

 

这三点就像一个飞轮,做完之后又来:

- 进一步提高人才密度

- 进一步提高谈成都

- 取消更多管控

……

「自由与责任」可以说是贯穿整本书的线索,读完后就会发现,“取消休假审批,想休多久就休多久”,“取消报销审批,取消管控”,“鼓励员工参加其他面试,鼓励员工知道自己的市场价,支付市场最高工资,支付丰厚的遣散费”,这些听起来很吸引人的点,这一切的自由,都是有对应的责任的。选择「自由与责任」,还是选择「规则与流程」,这其实只是两种不同的管理思路,它们的适用场景也有所不同。

当然了,书里也有一些具有普适性的方法,比如在提高坦诚度的一章中,鼓励大家以积极的态度说出你真实的想法,其中就提出了「4A 反馈准则」,我觉得这个准则非常好:

  1. 目的在于帮助 (Aim to assist)

  2. 反馈应具有可行性 (Actionable)

  3. 感激与赞赏 (Appreciate)

  4. 接受或拒绝 (Accept or discard)

其实很简单,对于提供反馈的人来说,第一点,目的在于帮助,即你的态度应该是积极的,不是为了发泄,不是为了中伤别人,也不是为了自己捞取资本;第二点,反馈应具有可行性,而不是提供一个模糊的说法。

而对于接受反馈的人来说,“我们在受到批评时都会为自己辩护或寻找借口,这是人类的本能,我们都会条件反射地进行自我保护,当你收到反馈时,你需要有意识地反抗这种本能”,毕竟如果别人真诚地给你提出反馈,帮助你成长,你应该是报以感激的心态,不是吗?最后,接收到了反馈,不是说每条都需要照办,应该选择接收或拒绝。

像这样的方法和案例在书中还有很多。

总的来说,这本书给我们提供了一种新的管理思路,对于我这种吃瓜群众来说,也可以当故事听听,还是很推荐大家阅读的。

 

❌