我已有升级时淘汰下来的机箱,电源和散热。还有之前买的 Unraid 系统。所以在咸鱼上捡了些老硬件(垃圾):老平台的 CPU 和 主板。再配上DDR3内存,装上了两块硬盘,装了个NAS。
以下是我配的硬件
硬件 | 价钱 |
---|---|
硬盘 - 日立 4t * 2 | 633 |
主板 - B85n phoenix | 388 |
Cpu - i3 4150 | 200 |
内存 - DDR 3 4G + 8G | 220 |
总1441 |
除了已有的设备之外花了总共了1441。硬件性能对NAS来说是足够了。虽然没有像群晖那样小巧和稳定,但也能满足我的需求。
在组装过程中除了一个小毛病。让我折腾了一整个晚上。当时后悔自己没有买新硬件。最终确定是内存的问题。换新的以后好了。
前几天在公司二手群里看到有人发布出售主机信息,发现原来可以更便宜,但也差不多。
]]>我用Hexo生成静态页面,免费部署在Firebase上。本博客就是用这么一个方案服务给读者的。
Hexo 有好多不同风格的主题可以选择。我用的是一个比较大众的主题 apollo 。
我一开始就开启了又 Disqus 提供的评论功能。因为在 Apollo 主题上开启Disqus评论功能很简单,在配置里开启一下就可以了。
但是免费版的 Disqus 评论功能会在评论区域的向下方显示广告。我好久之前就看过朋友的博客用Github Issue当作评论功能来用的方案。假期刚好有时间可以折腾一下博客。所以搜索了一下怎么操作,发现还很好弄的,就整了一个。
我用的是由 utterances 提供的方案。需要创建一个公开的仓库,并且把Issue授权给utterances。在需要展示评论的页面加他们的JavaScript脚本。当页面被打开时他们的脚本被执行,通过当前页面的信息(如,标题,url 或 页面路径)找到对应的issue并且显示出来。
1 | <script src="https://utteranc.es/client.js" |
多继承就是Mixin。虽然Java class 是不支持多继承的,但是可以通过 interface 的多继承来组装功能,然后把新的对象里的每一个方法代理给相应的实现该接口的对象就可以。
以下例子是用 植物 和 食物 来组装 蔬菜。
Plant
和 Food
接口的定义:
1 | interface Plant { |
Plant
和 Food
接口的实现:
1 | class FoodImp implements Food { |
有了上面基础类型以后,可以通过动态代理组装一个新的对象,让对象拥有 Plant
和 Food
的功能。
MixinProxy 会记录每一个方法对应的代理者。当具体方法被调用时,找到记录里的代理者让它执行方法。
1 | class Pair<T, U> { |
给 MixinProxy.newInstance 提供 接口实现实例 和对应的 接口 来实例出组装对象 (vegetable
)。组装对象拥有 Food
和 Plant
的功能。
1 | public class Test { |
程序输出
1 | Taste is good |
让人懵逼的模式。(我开始写这篇文章的时候,还不是很看懂,写完应该懂了 🤣
1 | class SelfBounded<T extends SelfBounded<T>> { //... |
试图理解一下
先从简单的泛型开始
1 | class A<T> { |
类 A
中有一个类型参数 T
,实例变量 property
的类型,setProperty
方法接受一个该类型的参数,getProperty
方法返回值也是该类型。
现在希望从类 A
中的参数和返回的类型都是类型 B
。所以先定义一下类 B
然后让新的类 C
继承与 A<B>
,结果如下:
1 | class B {} |
可以把上述定义简化一下,在定义 B
时直接继承于 A<B>
,让 B
出现在自己在继承的类中,这个叫奇异递归泛型(Curiously recurring generics, CRG)
The “curiously recurring” part refers to the fact that your class appears, rather curiously, in its own base class. (“奇特递归” 指你的类奇特的出现在自己的父类中)
1 | class B extends A<B> {} |
在这模式中可以把 A
看作一个模板,B
套用了模板 A
。
如果把 A
看作一个模板的话,它会有一个问题,使用模板(继承于A
)的类没限制只能使用自己为类型参数,就是说类 B
继承 A
的时候 A
的类型参数可以不是 B
。
1 | class C {} |
为了解决这个问题,即限制继承的类只能使用它自己为类型参数可以把 A
里的泛型范围加一个上限。如下:
1 | class A<T extends A<T>> {} |
现在继承于 A 的类只能提供自己为泛型参数。
1 | class C {} |
这不就是让人懵逼的模式么 🤣
1 | class A<T extends A<T>> {} |
wait()
和 notify()
来实现。生产者(Producer)和消费者(Consumer)同时关注产品(Product)的状态。即,有和没有。(这个实例只有一个生产者和一个消费者)。
当没有产品时
当有产品时
相互通知来协调。
有一个有限长度的产品(Product)队列,生产者(Producer)给队列加产品,消费者(Consumer)从队列取产品。
通过队列的阻塞来协调
阻塞队列对客户屏蔽了协同相关的细节,大大简化生产者和消费者实现复杂性。
wait()
and notify()
1 | import java.util.concurrent.ExecutorService; |
BlockingQueue:
1 | import java.util.concurrent.BlockingQueue; |
Output:
1 | > Task :ProducerConsumer.main() |
等了两个月时间价格稍微合理了以后我也上了车,买上了3080显卡。虽然被捆绑销售了一个电源,但我是挺乐意的,毕竟电源也需要换。
12月一号下了单,三号到货,兴奋的开始装起来了。
最快方案:把现有电源换成新的,然后把原有线插新的上。改动会很少,干就是了。
没有想到旧的cpu供电线是不能插在新的电源上。其插口稍有不同。导致我对主板上的线动手了。换起新电源配的线了。还好主板供电线和硬盘供电线是可以插进去的就没有换。
虽然电源的线让我折腾了一些,也总算是装好了。把显卡从盒子里拿出来,往插座上一挪,发现根本插不上去。翻车了!这显卡(技嘉Rtx3080雪鹰)需要2.5个槽位,然而我机箱最大能装两个槽位的显卡,空间不够。
因为没有规划好,白干了。这个项目回到起点了。
向大佬咨询过以后,选择了体积少一点的机箱,先马 趣造I’m。根据机箱参数,有四个槽位,显卡是能装的进去。但是电源的位置是比较特殊,开起来能不能装全靠电源尺寸了。虽然还是有翻车的可能,但太喜欢这小机箱了。体积的份上机还是想试一下。
把主板、散热器和电源都从老的机箱里拆出来了,要装到新机箱里。
为了确定我的电源和显卡能不能装进去,先要把电源和显卡装上了。幸好电源是在同类型中算是尺寸小(短)的,显卡是能装上去。
装上主板以后,有一次翻车:我的水冷散热是装不上了。在京东买了一个风冷散热器,第二天就到货了。
装了散热器和两个SATA硬盘,东西齐了,要启动了。
接上电源,按了一下启动按钮。电源通了一下电就停下了。再按,没有任何反应。拔了电源重新插上,按了一下启动按钮。电源又通了一下电就停下了。再按,没有任何反应…。难道是电源坏了?
把电源的线拿出来,接上旧的电源上。电源接了电后,按了一下启动按钮,风扇猛转起来,正常启动了。难道新电源是坏的?
我把新电源上的显卡和硬盘供电线都拔了,只剩CPU和主板供电线,重新接电试了一下,发现是能启动。原来是显卡或者硬盘供电有问题。我继续挨个试了一下,是硬盘供电线的祸。
重新把东西都装起来,启动了一下。
终于”正常”启动了,哈哈,把显卡驱动装了一下,妥了。打开文件管理器,只显示系统盘,其他硬盘不见了。
是不是硬盘电源没插好。把线重插,重启!打开文件管理器,咋还是没有…..。
这是怎么了?
把电源换成老电源,重启!打开文件管理器,还是只有系统盘。
把硬盘拿出来,放在硬盘盒里,用usb接口链接。PC没有反应,Mac没有反应。
硬盘应 该是被烧了。
仔细想了一下,应该是新电源用老电源的线导致的。问了一下大佬,也是一样的猜测。就这么额外收获两个坏硬盘。还好里面的不是重要数据。
本来只想买个显卡,结果把机、电源、散热也换了,还坏了两硬盘,折腾了好久,没有规划好的锅。
]]>Last week I designed a logo for my blog. I draw my name in the particular form. My colleges suggested me to make a font with it after they saw my logo. Then I tried and made a font.
I designed 26 letters in downcase with Linea Sketch app on IPad. Then redrew it with Illustrator. Then exported every single letter in SVG format. After set letters layout with FontForge, I generated a font, which only contains the 26 downcase letters and period. I pushed hole files to the Github.
Download from here.
]]>上次要办理的事情没有办到,今天又来了一趟长沙。上次回去以后接到了一个他们的电话。我问事办好了没有,对方肯定了一下。所以今天就坐高铁过来,试图继续办理一下。
因为上次来的时候行程没有安排好,所以这次重新计划了一下出行方式。早上八点的高铁去长沙。行程5个半小时。晚上18:50的航班回来,九点正回到北京。反正办理好只需要半个小时左右的时间。从车站来回各一个小时。也就两个半小时的事情。我可有下午13:30到晚上18:50,五个小时20分钟的时间。应该足够了。
所以我坐上早上的高铁,往长沙出发了。这是我第一次坐这么长途的高铁。我来想的是在车上看一会书,至少可以用笔记本写点东西。但车厢里有点吵,没有我想象的那么完美。坐在我侧后座位的旅客,刷视频刷个不停(我猜刷的不是抖音就是快手)。然后我坐在靠过道的座位上,并且我旁边的那些人都是旅途中变了几次,还有个人经常出去进来,让我不得不经常站起来让路,没能安心做我自己的事。并且我坐的位置有个不好的地方,是三个人共享一个插座,远远少于旁边两座两个人共享的一个插座。然后座位前面的板子不太适合放笔记本,如果前面的人变一下座位靠背的倾斜度,有可能压到屏幕。刚好我的笔记本屏幕差点被压了,所以之后不敢放上面了。
中午到了长沙的办理地点。工作人员看到我回想了一下我上次来过的事,然后转达给了相关的人。但最后结果是,这次还是办不了。所以我这次一来,大概扮演了一个快递员的角色(哈哈哈哈)。问题是出于上次有他们单位的人找我说事的时候我误解了(大概是因为我们俩的普通话都不标准导致了无法准确的传达信息)。但在营业厅的工作人员的态度很好,很热情。他们每句都表示了一下,对我带来了不便而歉意。最后还说会单独给我寄过去的。我是很感动的。
今天算是我来长沙玩了,所以我去了上次吃饭的地方。又吃了一遍好吃的凉面(下次过来还会吃这家的凉面)。吃完饭之后去隔壁的步行街喝一杯咖啡。查了一下有没有同事找我,并且回复了一下几个工作相关的消息,然后拿着相机拍照去了。拍了一会没发现时间过的很快。往机场走的时候里我的航班起飞还有一个小时50分钟的时间。20分钟做地铁,20分钟做轻轨,20分钟过安检。时间应该来的及。
慢吞吞走到地铁,发现已经过了10分钟了。从取款机取了一下钱,再去人工售票人员那买票(因为没有零钱),又过了差不多10分钟了。当我乘上地铁时候只剩不到一个半小时的时间了。所以到机场路上,每一个换乘的点我都是跑着过去的。连出发厅也是跑着去的。到办理登机牌的窗口时,离起飞还有22分钟。我把证件递给了工作人员,她说我已经不在登机人列表里了。人生第一次误机了。工作人员让我去航空公司窗口问一下接下来该怎么做。
航空公司人热情的跟我说,他可以帮我改签到明天相同时间的航班。我说我需要今天就得走。然后他叫我重新买晚上票吧。我想了一下也没有其他办法,所以拿出信用卡准备买了。我的卡是一张南航的联名卡。所以我想尝试用我的积分来买一张,这样应该会便宜点吧。
所以到了南航的窗口。漂亮的服务人员查了一下账号,说可以免费兑换一张22点的飞机。我很高兴的说:“帮我订吧”。服务人员面带着笑容,叫我打南航热线。打了电话,选好航班准备给我订的时候,热线那边的人叫我输入一下密码。输了几个密码都是错误的。第一次想用一下积分,不出意料的掉链子了。
那就改一下密码呗。“请给我改一下密码!”,电话对方:“那我给你的末尾xxxx”的电话发一下重置密码的短信。啊啊啊啊,那是已经不用了号码。然后她叫我先去官网验证一下身份。这样我可以更改我的预留手机号。然后各种各样的验证方式都试过了一遍之后,最终没有能通过验证。我猜应该是我的名字有点特别的原因吧。真是无奈。准备认命要买票的时候,在重置密码的页面看到可以去前台认证的提示。去前台问了一下,果然是可以的。再次感谢漂亮的工作人员。办完之后冷静下来想了一下,到底哪里除了问题呢。一直就在服务窗口旁边给热线打了好多电话,却没去服务窗口问。
就这样票也有了,接下来就等登机好了。候机厅给手机充了一下点,并且写了这个日志。离登机还有半个小时的时候,通知说:航班延迟,起飞时间待定。如果我误机的那次航班延误了的话,该多好。今天误机了一次,现在航班又要延误。今天的行程又变的又要让人很累了。
2018年五月28日,长沙。
最后,航班延误两个小时之后起飞了。回到家的时候已经凌晨三点了。计划好的行程最终跟上次一样了。第二天还得上班,所以回来就睡了。
虽然那一天过的很不顺,但现在回想一下还是挺有意思,有不少惊喜。
]]>Exercise 1.3. Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers.
Following is my solution:
1 | (define (min x y) (if (< x y) x y)) |
这是我第二次去厦门,第一次是上大学时候去的。
去的时候坐的是早上七点半的航班,所以五点半就出门赶机场了。北京的早上还挺冷的,平时在公司室内穿短袖的我也冻的发抖。早上早起加昨晚因为准备行李睡的晚,所以上飞机就睡了。被降落时的震动遥醒了。
公司订的酒店是挺不错的,预定好酒店是公司以往的习惯。这家酒店叫的位置在和平码头附近,挨着环岛路,对面是鼓浪屿,旁边是中山路。虽然看起来比上次/上上次年会时住的酒店小一点,但是位置跟周围环境太棒了,所以住的很舒服的。
住进酒店把行李放下了之后,跟老乡同事和他在厦门工作的老乡学弟一起吃饭去了。老乡同事的老乡学弟是带我们去吃了老乡的饭菜。
吃完回来,还是觉得困,所以继续补睡眠了。
睡醒之后跟同事出去在旁边的咖啡店用星冰乐跟三明治填饱了肚子,然后去过个马路就到的海边走了一会,聊了好多乱七八糟的话题。其中关于意大利的话题还很有意思的。咱们两都认为在欧洲意大利的经济是落后于北欧那些国家的原因是他们的懒散。虽然他们不够勤奋,但是意大利人是挺热爱生活的,这一点是很让人欣慰的。
回到酒店之后写一个小程序(上篇说的程序),写到晚上12点,大概用了两三个小时。困的倒下就睡了。
第二天早上,九点多睡醒,去吃了早餐。我很喜欢酒店的早餐。这可能是很少住这么好的酒店,以前没有看过酒店丰富免费早餐的原因。吃完早餐开始享受休闲的第二天了。
回到房间,我勤奋的同事去解决临时发现的一个Bug,而我看了两集随便找的美剧。等他忙完之后咱们跟同事学弟一起去吃了午饭。吃完饭直接去海边散步了。在海边走的时候遇到一个大叔在推销玩帆船的旅游项目,听着很激动就跟他走了。咱们坐上了大叔的轿车。大叔在车上反复跟我们强调说:“本来是188的,现在公司活动就78。你们一会再船上跟其他游客说你们也是188买的票”。占便宜的感觉就是好,哈哈。车开了差不多20分钟,开到了厦门岛的另一边,五缘湾帆船港。
港里停了好多帆船,看着就很兴奋。排了一会队之后上船了。我们坐的船上有八个人,除了我们以外的四个游客,还有驾船人。所有人穿上了救生衣,驾驶人松开了绳子,出发了。船出了港口,开到了离港口不远的地方。帆船倾斜的太厉害了,如果不是有个钢丝护栏可以抓紧的话,人完全可以掉水里的。所以怕的不敢拿出手机拍照。船平稳了之后驾驶员说我们可以去船头。我们三个人小心翼翼爬到了船头,然后扶着船桅杆站了起来。在帆船上站着看海,站着发呆了一会。这是到现在为止我离大海最近的一次体验,心理又平静又激动。然后大家都纷纷拿出手机拍照片、拍视频了。船回了港口。虽然只有40多分钟的时间,但是很好玩的。下了船,我们往回酒店走了。
晚上是公司今年的年会。公司人一起在酒店吃饭了。当然还有大家期待已久的抽奖活动。今年我成功抽到了一个《阳光普照Plus》奖了。大家一起吃吃乐乐以后回房间了。我们几个同事一起看了好久的视频。其中有老外翻新老发动机,翻新老摩托车的视频。还有市面上流行的几款电视机评测视频。原来SONY电视就是好的。
第三天,年会活动的最后一天,早上起来发现眼睛红的很难受。吃早餐回来在房间又睡了一会,以便眼睛可以好一点。醒来以后眼睛是好了一点。我跟两个同事一起出去转了一会。我们去了一个茶叶店。茶叶店老板给我们泡了几种茶。可以明显的感觉到各不一样的口感。咱们坐了很久,茶叶店老板给我们介绍了我们喝过的几种茶叶分别是在哪里长的,怎么做出来的等等事情。我两个同事都买了一些茶叶。
从茶叶店出来以后去咖啡店买了杯饮料,打算沿着海边走一会。但眼睛又开始红的快睁不开了,所以先去药店买了一瓶滴眼液。眼液滴了两下眼睛好了不少。就按原计划在海边走了一会,拍了一些照片。然后回到酒店等着大家集合去机场。
在等大家回来集合的空闲时间里,我搭了此博客,简单配置了一下。去机场的巴士上我写了第一篇博客文章。
到了机场快到登机的时候。机场通知我们要坐的航班延迟了,登机时间待定。在机场等了两个多小时之后才登机,回到首都了。
]]>代码如下:
1 |
|
运行结果:
1 | ruby practice.rb |
虽然之前开(搭)过几次博客,但都没有持续不久就坚持不下去了。当时的想法是弄一个技术博客,然后没有什么拿得出的技术,并且写作能力也不行,坚持不了多久就停下来了。
这次重新搭博客的想法也有了一段时间了。但还是带着写技术的想法,拖延了好久。最近想通了,想随便写写东西了。今天终于执行了。
]]>