在开始正文之前,先啰嗦两句,在我的编程生涯中,没受过什么科班教育,凭着对计算只因的热爱,「野路子」比较多。按照百度百科中对「野生」的解释,我是一名「野生的码农」:
野生,意思是动植物在野外自然生长而非经人工驯养或培植
我是在安医大读了3年多医学后,觉得不是这块料,转头自学了1年的计算机系课程后,跨考了中科大的计算机系(11系)研究生(学硕),运气还行,一次就上岸了。中科大就不用介绍了,安医大可能很多人不知道,只得强行蹭一波名人的热度了:
安医,许嵩的本科学校,我和他同届;著名黑客 tk 教主也是安医毕业的,他俩都在90周年校庆中被评为了优秀校友
当然,安医校友中还有更杰出的,尤其是今年,可谓是家喻户晓、如雷贯耳、炙手可热、闻者落泪,点到为止,你懂的
3年多前,趁着在腾讯转岗的间隙,我写过一篇文章《》,介绍了跨专业考研时的心路历程以及我写文章时的工作和生活状态,打算持续更新读研、工作时的一些趣事。然鹅,自那之后,工作更忙了,2019年底开始管理团队。2020年初,那啥开始了,生活完全被打乱了。再也没时间,没心情写东西了。
7月底,我结束了整整10年的北漂生活,回到了合肥上班,关于这个抉择,感兴趣的朋友可以看看这篇文章《》。相对而言,合肥的工作没北京那么忙,所以,从10月底开始,我又开始随缘更新了。觉得文章有点意思的朋友,不妨点个关注,防止失联。虽然现在有点空余时间了,但更新速度不敢保证,跟老婆吵架的频率大致成反比
先说个最近错过的发财机会,11月底,在海鲜市场发现了个奇葩的计算器,看上去就很厉害的样子,69不包邮,入手了1台。卖家发货前,我隐约感觉这是个好东西,又追加购买了1台,最后是两台150元包邮,这是我手里的两台:
奇葩计算器
到手后,确实像我猜想的那样,是Android系统,9.0版本。研究了1分钟,打开开发者模式,用adb安装AIDA64,详细配置:
全志 A50 CPU,32位,4核1.5GHz;1G RAM,8G ROM;5.4寸屏幕,1280*720 分辨率
单声道扬声器,光线传感器,WIFi,蓝牙,typec 接口,支持OTG,没有 GPS
据网友拆机,有空余内存和SD卡焊盘,但直接焊上同规格内存颗粒不识别,可能跟 MacBook 一样,扩内存时需要同步改电阻
这么多按键,用来玩模拟器游戏应该不错,然而NES.emu和GBA.emu都识别不了按键,只有它自带的计算器能识别。自己写了个 demo,确实是收不到onKeyDown事件。把自带计算器的 apk 拖出来,反编译看看,居然是什么tty,需要每个APP打开串口dev/ttyS4监听键盘输入,而非 Android 系统标准的onKeyDown,淦!
直觉告诉我,这玩意肯定会火,这个造型的安卓机太罕见了,垃圾佬狂喜,学生党摸鱼神器。果不其然,就在我购买的同时,酷安大佬也发现了这货,不到2天,卖家手里的1000多台就卖光了。现在涨到159了,还有网友愿意加价100购买我手里的,当然没舍得出。
如果我当初直接把卖家手里的机器都包圆了,每台加价50出,保守能赚5个w,够买台心心念的本田NSS350了。可惜我胆子小,没敢出手(其实是股票和基金亏麻了),不过也可能是好事,至少不会被网暴:
他恶意哄抬物价,靠计算器赚了一套房,这究竟是道德的沦丧,还是人性的扭曲?!
也正是这件事勾起了我对往事的回忆,决定写点东西,聊聊我是如何在计算器的吸引下,走上了码农之路,并顺便用计算器换了几台 MacBook。大多发生在我读书和工作初期,希望对读者有所启发。
声明下,我不是标题党,文中的所有事件都是真实发生过的,我对着打了骨折的工资条承诺:
0x1. 接近完美的 MacBook Air本文内容,贵在真实,如有虚构,(工资)折上加折
9月底的时候,合肥日常气温还在30度以上,为了避免电脑散热导致全球变暖,我斥巨资0.00013亿,全款购买了一台顶配 24GB 内存的 M2 款深空灰 MacBook Air。这台机器除了屏幕小了点,音响效果垃圾外,其他地方堪称完美了,重量轻,续航长,性能好。刚买完不久,就听说明年春季要发布15.5寸的 MBA,看来跟股票一样,又没把握好出手的时机。
这些年,花了不少钱购买苹果产品,我不是果粉,只是觉得苹果的生态不错,用起来省心,质量也过得去,同价位找不到体验更好的产品了。算下来,这是我购买的第3台苹果笔记本了,另外两台是2014年时购买的顶配港版15寸 MBP 和2015年时给老婆购买的丐版13寸 MBA,分别耗资 1.5w 和 0.6w。
但是,你敢信,这些 MacBook 竟然是用1台价值10元的二手计算器换来的。计算器长下面这个样子:
科学计算器
注意看,这个宝贝叫小帅,它是所有故事的起点,不过即使帅气如小帅,也只能屈尊男二号,男一号当然是我了。本文会按照时间顺序,介绍小帅如何在我的英明带领下,一路披荆斩棘,身价暴涨数千倍,从计算器逆袭成多台 MacBook 的。
0x3. 如何用计算器换 MacBook相信大家都看过「如何把大象装进冰箱」的段子,如下图所示分为3步:
把大象装进冰箱
同理,用计算器换 MacBook 也是3步:
1. 挑选 MacBook
2. 物物交换
3. 润!
全文完,祝您幸福,可狱不可囚的新生活就在阎前了。哈哈哈哈,有没有上当的赶脚?裤子都脱了,你就给我看这?
虽然上面只是个段子,但其实整体步骤是差不多的,只不过第2步需要补充亿点点细节,请试试看:
算术入门
好了,不开玩笑了,因为实际的「物物交换」的过程非常坎坷,时间跨度长达12年,我会分成3篇文章来介绍,内容简介:
1. 大学前的懵懵懂懂 -- 不堪一击
2. 本科时的误打误撞 -- 初学乍练
3. 读研时的不务正业 -- 略知一二
每篇文章中,都会分享一些真实发生的小故事。不是为了水文章数量,担心文章太长,读者看了一半就跑路了
0x4. 人生的第一台科学计算器初二(2000年)左右,数学书上有了科学计算器的介绍,貌似是用来计算三角函数的,记不清了。因为我家是农村的,周围买不到这种「高级」的科学计算器。于是,托同学帮我买一台,印象中是18块钱,他说直接买他的好了,没用几天,只要10块钱,成交!于是,他拥有了10块钱私房钱,我拥有了人生的第一台科学计算器,就是本文开头图片的那款,带时间显示的。
那个年代,没啥玩的东西,计算器也成了电子玩具之一。连蹲坑都拿在手上,闲着没事就一通乱按,看看能算出个啥。很快啊,我就熟练到了炉火纯青的地步,对所有功能都了然于胸,包括阶乘、随机数、二进制等。除了「->rθ」和「CPLX」,这是极坐标、复数相关的,初中水平有限,不知道是做什么用的。
因为熟悉,还用它搞过恶作剧,把同学的计算器改成16进制,此时,只有「加减乘除」基本功能可用,sin、cos等函数都失效了。再输入一些字母,即使重新开机也依然停留在16进制,类似下面这种显示:
16进制
同学以为计算器坏了,找我赔,场面一度十分和谐
当然,作为计算器,它更多的时间还是用来计算的,虽然是因为数学课买的,但数学课几乎没有过,印象中计算过统计中的方差和线性回归。主要用途还是物理和化学,用来计算浮力、做功、分子量、方程式啥的,节约了很多无聊的人肉计算时间。
让我感兴趣的是,这货是如何算的这么快的,高斯虽然能口算 1~100 的和,但他肯定口算不了 1~69 的积。为什么是69,而不是100?没用的知识:
一般的科学计算器只能计算到69的阶乘,因为69! = 1.7112245*10^98,70! = 1.1978572*10^100
而计算器使用科学计数法时,其指数部分最多显示两位数,所以,最大只能计算69!
补充两个当时发现的无聊的例子,只看结果的前几位数字,很完美,但后面「跑偏」了:
a. 1234567890*8 = 9876543120
b. 1111111111/9 = 123456790.1
如同我们的人生一样,并不会总是按照自己设想的路线图发展的:①. 你可能多年以后才能获得曾经梦寐以求的东西,像a中的2出现在了1之后 ②. 更有可能的是,你永远也得不到想要的东西,就像b中的8一样。我现在真的觉得,这些都是命,强求不得,要坦然接受生命中的不如意。
扯远了,为了探寻科学的真理,中考后的一个夜黑风高的大白天,我举起了39米的大刀,温柔地划开了它的胸膛,得到了若干电阻电容晶振以及一块看不懂的电路板,电路板上有块圆形的牛屎芯片。就这样,我人生中的第一台科学计算器走完了它光辉的一生,享年2岁。
0x5. 早逝的超级函数计算器上高中后,又花20块钱买了台山寨的夏普科学计算器,比之前那台少了时间功能,其他功能一毛一样。节省流量,图片就不放了。
每次逛书店和城隍庙,都会去卖计算器的柜台转转,看看有没有更高级的计算器。即使买不起,看着密密麻麻的按键,也是一种享受。遗憾的是,它们除了外观略有不同,功能上和我手里那台没有任何区别,实在是无趣。直到高三下学期的某天,午饭吃饱后,不想在教室里吃狗粮,去城隍庙透透气,意外发现了一款看上去就很高级的计算器,屏幕是点阵的,按钮非常多,还能输入26个英文字母,如下图:
超级函数计算器
这货的中文名字十分很霸气,叫「超级函数计算器」,印在 A 面的外壳上,拍照时已经遗失。老板娘开价80,我是学生,抹个零,8块。你是畜生也不行,滚!最后貌似是38还是48买来的,简单研究了下,相比我手里那台山寨夏普,这家伙确实配得上「超级」的名头。它内置了很多物理和化学的公式及常数,也可以自定义公式,输入各变量的值,直接输出公式的值。例如:E=mc^2,输入m 的取值后,E会自动计算出来,c 是内置的常量之一。
临近高考,没时间再研究其他更复杂的功能了,高考后,就把它给我妹了。然而,没多久,它就被我妹摔驾崩了,享年1岁。上面的照片貌似是05年用同学的手机拍的,它那会已经薨了大半年了,相当于拍的是「尸体」了。我后来拆开看过,电路板很漂亮,里面有好几块十分工整的方形牛屎芯片。抱歉,看不懂硬件,只能这么苍白的表达了。
因为它的早逝,一直没能搞清楚它到底有哪些功能,我现在还时常在网上搜索这款机器,希望能能再买一台。可惜一无所获,可能是保有量极少吧,甚至连资料都找不到。罢了,随缘吧,让往事随风。
0x6. 码农之路的启蒙老师在每个人的成长道路上,都有一位带领自己入门的启蒙老师,我也不例外,我的启蒙老师是下面这位:
武藤兰
呃,不好意思,放错图了,这是另一个领域的启蒙老师,比编程启蒙要晚上好几年。
相信绝大多数程序员的启蒙老师都是凡人,而我的编程启蒙老师是位神仙 -- 文曲星:
文曲星 PC1000a
遗憾的是,文曲星老师已经遗失在岁月的长河里了,图中的文曲星是我最近花了130大洋买的,还是比台版文曲星「哈电族」更常罕见的港版。卖家可能是怕我到手刀,反复叮嘱我港版安装程序会有乱码,建议我买国行的CC800。我说乱码无所谓,买回来回忆下青春,主要是为了情怀,能用就行,还让卖家顺便帮我装了几个程序。
高一,花400多买了台支持数码录音的文曲星 PC1000,没多久机器出问题了,换成了刚出不久的PC1000a,不支持数码录音,但外观更小巧,配色更舒服,看上去就像是一台迷你笔记本电脑。让人费解的是,我用它玩了两年多俄罗斯方块,词汇量居然没有丝毫进步,足以证明文曲星并不能提高英语成绩。
文曲星也自带了很多计算器的功能,有科学计算、公式计算、统计计算等等,两个没用的知识:
1. 文曲星能计算的最大阶乘数是 3208! = 8.6168014*10^9856
2. 文曲星能显示的时间范围是1932年1月1日 ~ 2031年12月31日
高三的某天,打开文曲星准备算点什么,不小心进入了「计算/换算」里的GVBASIC,只有一个光标在闪动。虽然之前也进来过,但一直不知道是做什么用的,所以每次都是立刻就退出来了。那天可能是无聊,本着来都来了的精神,亦或是大意了,没有闪,我按下了「求助」按钮,阅读起了机器自带的帮助,里面有IF、FOR、GOTO、ASCII等内容的介绍,隐约地感觉是编程相关的功能。
高一的微机课结束后,除了偶尔去网吧冲浪,就没机会接触到电脑了。而且微机课也只是教了点打字和微软三件套等皮毛,最后一课时,微机老师简单演示了Visual Basic编程,看上去很厉害的样子,不过,我是真没看懂他在搞毛。难道文曲星也能像电脑一样编程?
当时,恰逢数学刚学完椭圆不久,发现帮助里有个ELLIPSE的指令,可以用来画椭圆,帮助内容如下:
ELLIPSE 画椭圆
用法:
ELLIPSE X0,YO,A,B,FILL,TYPE
*FILL=1 填充
*FILL=0 不填充
*TYPE=1 画椭圆
*TYPE=0 清椭圆
如:
]10 GRAPH
]30 ELLIPSE 80,40,60,30,1
把示例代码输入文曲星后,按下RUN运行,立刻显示了个实心的椭圆,尝试把代码中的1改成0,椭圆就没有填充了:
文曲星绘制椭圆
卧槽,好神奇,后来还尝试了CIRCLE画圆、LINE画直线等内置指令,绘制出的图形完美符合数学中的相关定义。靠着阅读帮助,我在文曲星上学会了赋值、条件、循环等编程中最基础的知识。所以,正是文曲星教会了我编程,是指引我走上码农之路的启蒙老师。但也仅限于入门了,PC1000a的代码编辑体验实在太糟糕了,在没有电脑的情况下,很难开发超过10行的程序。
当时,数学正在学习极限、导数的内容,如果能把函数图像绘制出来,不少函数的极值能一眼看出来了,但可惜的是,绝大多数函数图像是很难通过手工画出来的的。高一的时候,看过数学老师用电脑软件演示过任意函数图像的绘制,感觉真 TMD 牛逼。
于是,我就想,能否通过编程,让文曲星也能绘制任意函数的图像呢?然鹅,心有余而力不足,我也只能是想想了,毕竟刚学会1 1=2,就想计算微积分,属实是痴人说梦了。后来,班里的一位电脑高手给我传了个程序,号称能在文曲星上绘制任意函数的图像,例如绘制y(x)=x*sin(x)的函数图像:
文曲星绘制函数图像
据高手说,这是他自己开发的,应该是真的吧,因为他还给喜欢的女孩开发了个类似flash的小动画,编程能力杠杠的。那时他在开发中国象棋和任意函数求导的程序,据他说很复杂,应该是没能在高中毕业前完成。
虽然我当时不知道他是如何做到绘制任意函数图像的,但是我用的很欢乐,晚上做题做累了,打开程序,编辑个非常复杂的函数,看看图像长什么样子,也算是为数不多的消遣了。小镇做题家的快乐,就是这么朴实无华且枯燥
然鹅,没多久,这种简单的快乐就被下面的妖艳贱货给取代了:
黄金英雄坛说
这是当年文曲星上非常火爆的《黄金英雄坛说》,也是我第一次接触RPG游戏,比较上瘾,玩坏了两个键盘,废了几十个5号电池。
三年前,为了再体验一把当年的快乐,特意买了个横版MiYoo开源游戏机,自带文曲星CC800模拟器并内置了《黄金英雄坛说》,上手5分钟后放弃,操作太繁琐了;也在 iPhone 上装过《英雄坛说》,同样是玩了5分钟弃疗了;即使是最近买的文曲星 PC1000a上,也只玩了10分钟就退出了。
并非是游戏不好玩,游戏还是那个游戏,但我已经不是那个我了:
高中,虽然家境贫寒,但也能吃饱穿暖,学习成绩也不错,基本没有需要我操心的事
现在,上有老下有小,每天睁开眼就要面对生活、工作上的琐事,何以解忧,唯有搞钱
如我和卖家的沟通一样,我是因为「回忆青春」才买的这台文曲星,打开文曲星的瞬间,似乎又回到了无忧忧虑的少年时代,得以片刻的喘息。
其实,我现在是个不折不扣的的「垃圾佬」,买了挺多类似的二手老物件,以手机居多,以后有机会再找个主题分享给大家。
0x7. 冰火两重天的体验高考前几天,最后的一次模拟考试,年级第10名,是我高中时代最好的排名,科大,等我。高考,大概班级第30名左右,而平时都是在前3名徘徊的,是我整个高中最差的一次了,只比二本线高了40来分,科大,再见了。除了语文,所有科都考的很烂,妈的,我也不知道为啥,明明题目简单的一匹,可能是过于轻敌了吧。
高考的滑铁卢,着实让我 emo 了好久,整日以泪洗面,不愿踏出闺房半步。短短几天,从顶点跌入谷底,没去东莞,也体验了一把冰火两重天。本想着复读一年,圆了中科大的梦想,但是父母看到我的状态,根本不敢让我复读,万一来年又没考好,你丫岂不是要玉玉到自挂东南枝了?
最后,在家人的劝说和化学老师的建议下,报了与中科大仅一字之差、一街之隔的医科大:
中科大与安医大
我在安医和科大都听过类似的故事:
某某因为学习压力大,转学到马路对面了,那里压力小不少,从此杳无音信
地图里的科大中区,当年还是合肥学院,那么安医、安大、科大、合肥学院,谁是压力较小的「马路对面」呢?都不是,「马路对面」是指中间的「第四人民医院」,这是一所精神病医院
不过,我在那片区域流窜了9年,还真不知道「四院」具体在哪,也就没见过它的真容了。没想到,多年以后,我们一家三口走进了北京的一所精神病医院:某年暑假,老婆来北京慰问我,自检两道杠。为了尽快确认一下是否真的阳了,我带着她骑上我心爱的 N(>=3) 手电驴,以 25km/h 的速度飞奔向最近的一所大医院 -- 回龙观医院。
当医生得知我们要抽血检查 HCG 时,用一种难以置信的语气跟我说:
小伙子,你应该是来错地方了,我们这是一所精神病医院
卧槽,哈哈哈哈,医生也忍不住笑了起来。啊,不好意思,再见了,您嘞!至今,老婆还会时不时地拿这事嘲讽一下我
言归正传,再说回高考。其实,在填志愿之前,我从未考虑过学医,我甚至都不知道安医在合肥,我一直以为的安医是芜湖的皖南医学院。我感兴趣的是电子或化学类专业,象征性地报了郑大提前批的计算机系和安师大的化学系,曾经根本看不上的学校,如今也高攀不起了。学医,将来哪怕是找不到工作,当个赤脚医生也能混的不错。听上去也还行?那就从了吧。
决定认命之后,为了找点事做,避免胡思乱想导致又玉玉了,花100买了个小霸王学习机,又花35买了个 RPG 游戏卡带 --《封神榜》。购买《封神榜》,也是受《英雄坛说》影响,那里面的剧情和对话都很好玩,以为所有 RPG 游戏都是这样,就找老板随便买了个 RPG 卡带。事后,我才发现,我并不喜欢玩游戏,尤其不喜欢这种练级类的游戏,一来没有耐心,二来打怪升级,实在是太无聊了。我只跟同学一起玩了前1/5剧情,剩下的都是他一个人玩通关的。
听说小霸王上有个学习卡,支持BASIC编程,为了一睹她的芳容,我顶着40度的烈日,跑了好几家店都没找到,只能作罢。直到多年以后,我才用 PC 模拟器看到了学习卡的真面目:
小霸王学习卡
如果当年找到了学习卡,会因为更早地学会了编程,影响我后来的发展轨迹吗?我想大抵是不会的,横竖都是不可能,因为即使是现在,面对黑乎乎的F-BASIC窗口,除了PRINT,我也实在想不起再输入点啥了,何况当年小白的我。而且就在那个暑假,我还把表姐家的电脑借过来了1个多月,*最多的事就是在《抢滩登陆》和《雷电》里打飞机。电脑技能方面,除了学会了安装和卸载软件,连打字的指法都没尝试去学,更别说学会编程了,这波是叶公好龙了,属于是。
0x8. 未完待续 & 彩蛋至此,花了好几个晚上和两个周末,码了近7000字,终于把大学前的编程启蒙阶段写完了。剩下的两篇文章,也在准备素材了,争取春节前更新完毕。因为现在毒圈已经缩小到公司同楼层了,如果我没有按时交卷,除了在跟老婆友好地交换意见外,更大的可能就是我加入圈了,请知悉。
在写了
其实,上面文曲星绘制的y(x)=x*sin(x)的图像是错误的,有细心的读者发现吗?这个程序是咸鱼卖家给我安装的,估计是计算 y 坐标的地方手抖了,多输入了个负号,当年我同学给的那个是没问题的。
前面提到,为了搞清楚按键事件监听,我反编译了奇葩计算器的 apk,发现了这样一段代码:
package xx.oo;
public class SerialPortHelper {
private static Context mContext;
private static SerialPortHelper mInstance;
public SerialPortHelper() {
foo();
bar();
}
public static synchronized SerialPortHelper getInstance(Context context) {
SerialPortHelper serialPortHelper;
synchronized (SerialPortHelper.class) {
mContext = context;
if (mInstance == null) {
synchronized (SerialPortHelper.class) {
if (mInstance == null) {
mInstance = new SerialPortHelper();
}
}
}
serialPortHelper = mInstance;
}
return serialPortHelper;
}
}
请Java和Android攻城狮帮忙 Review 一下,上面有几处错误?
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved