duangsuse::Echo
717 subscribers
4.25K photos
130 videos
583 files
6.47K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
#tech #CS 来科普一打有趣的信息技术相关知识: 🤗 1. Windows 里的 A: B: C: 盘符,为什么 C: 盘是『系统盘』? 首先我们考虑一下,如果你要做一个文件管理『基于分区』操作系统,你觉得第一个『盘(标识)符』应该分配给谁? 当然是安装操作系统的那块分区啊!因为首先有了操作系统,计算机才有好玩的人机界面嘛。 💻 那么,为什么我们不从 A: 盘符开始分配,还非得从 C: 开始呢? 因̶为̶ ̶W̶i̶n̶d̶o̶w̶s̶ ̶想̶向̶ ̶B̶C̶P̶L̶ ̶致̶敬̶(被打死)…
2. 为啥 Return 键要叫 Return [ref:wiki]

以前还没有计算机的时候,人们使用机械打字机打出工整的文档。

学过程序设计的朋友,可能知道这货代表的字符,在 ASCII 字符编码上还有两个几乎完全等价的别名,同时还在 Linux/Windows/MacOS 上面给用户造成了不少的困扰

— 这就是一个『大端/小端』问题,是用 ASCII 的 "\r"(MacOS) 还是 "\n"(Linux) 还是 "\r\n"(Windows) 表示『换行(NewLine)』?
(其实这里有个讨论等价的问题,Linux 和 Darwin 都是 OS Kernel,但 MacOS 和 Windows 就是整个操作系统了,这里请大家姑妄听之,发动自己的智慧尽量理解,不用太纠结)

但这条消息不是讲这个的(有意了解,看上面的 wiki 链接)

Originally, the term "carriage return" referred to a mechanism or lever on a typewriter.

为啥
Enter 键被称为回车键呢?回车的本意就是指打字机的『字车(carriage)』回到起始位置,走纸换行,开始打下一行字而已

有喷墨打印机的人会注意到它的工作方式:里面有个可以左右移动的喷墨装置,它高速移动并向纸上喷出墨水,同时打完一个单位(比如,一行)走纸换行,继续工作直到完成该页打印

那为什么不叫 RETURN 键叫 Enter 键呢?维基百科,你怎么看?

On computer keyboards, the enter key in most cases causes a command line, window form, or dialog box to operate its default function. This is typically to finish an "entry" and begin the desired process, and is usually an alternative to pressing an OK button.

因为我们经常输入一行命令,用
[Enter] 键执行它。对于已经不止能打字的计算机,这是一个更贴切的名字!
duangsuse::Echo
2. 为啥 Return 键要叫 Return [ref:wiki] 以前还没有计算机的时候,人们使用机械打字机打出工整的文档。 学过程序设计的朋友,可能知道这货代表的字符,在 ASCII 字符编码上还有两个几乎完全等价的别名,同时还在 Linux/Windows/MacOS 上面给用户造成了不少的困扰 — 这就是一个『大端/小端』问题,是用 ASCII 的 "\r"(MacOS) 还是 "\n"(Linux) 还是 "\r\n"(Windows) 表示『换行(NewLine)』? (其实这里有个讨论等价的问题,Linux…
3. 震惊!QWERTY 键盘布局开始的设计理念居然是为了放慢打字速度!

维基百科

The construction of the "Type Writer" had two flaws that made the product susceptible to jams. Firstly, characters were mounted on metal arms or type bars, which would clash and jam if neighbouring arms were pressed at the same time or in rapid succession.
Secondly, its printing point was located beneath the paper carriage, invisible to the operator, a so-called "up-stroke" design. Consequently, jams were especially serious, because the typist could only discover the mishap by raising the carriage to inspect what had been typed. The solution was to place commonly used letter-pairs (like "th" or "st") so that their type bars were not neighbouring, avoiding jams.[2]


这种布局方式,开始并不是为了打字速度考虑,而是为了使得当时蹩脚的打字机的按键更不容易卡住!

万恶的历史遗留之罪 emmm 😟
duangsuse::Echo
3. 震惊!QWERTY 键盘布局开始的设计理念居然是为了放慢打字速度! 看维基百科 The construction of the "Type Writer" had two flaws that made the product susceptible to jams. Firstly, characters were mounted on metal arms or type bars, which would clash and jam if neighbouring arms were pressed…
因为这条比较短,我再这里特别感谢一个:上面的问题全部是从 《趣味百科》这本杂志里选择的(我已经忘记原书是哪个系列的,找不到相应链接了,应该是某些类似儿童文学的杂志社写的)。
同时,也感谢无私奉献和记录知识的 Wikipedia 和百度词条编辑者们,是你们的努力使得历史变得对所有人来说触手可及! #life #wiki
duangsuse::Echo
3. 震惊!QWERTY 键盘布局开始的设计理念居然是为了放慢打字速度! 看维基百科 The construction of the "Type Writer" had two flaws that made the product susceptible to jams. Firstly, characters were mounted on metal arms or type bars, which would clash and jam if neighbouring arms were pressed…
4. 以前用『外国人的机器』打电报的时候,没有汉字字符,是怎么打出去的呢?

以前的确是不能打中文,后来我们有了自己的电报码,就是说又可以用中文交流信息了

世界上第一部中文电报电码书《电报书籍》出世,由威基谒绘制,于1871年5月出版并投入使用。此刻上海和香港之间的电报线路已于一个月前开通。威基谒的《电报书籍》成为之后代码修正和提升的主要灵感来源。在1871年由出使法国的蒲安臣使团的张德彝编制的另一本电报书——《电信新法》 ,这本书修正了威基谒的系统,使它在数据排列上遵照一种更严格的方式。但这两种电码本,字码数量太少,不能满足使用的需要,1881年时任上海电报局总办的郑观应,主持对电码本扩编,扩编至9000余字,取名《四码电报新编》,即后来屡经重订的《中国电报新编》。

在 Telegram 上谈 Telegram,是不是很接̶地̶气̶(被打死)
duangsuse::Echo
4. 以前用『外国人的机器』打电报的时候,没有汉字字符,是怎么打出去的呢? 以前的确是不能打中文,后来我们有了自己的电报码,就是说又可以用中文交流信息了 世界上第一部中文电报电码书《电报书籍》出世,由威基谒绘制,于1871年5月出版并投入使用。此刻上海和香港之间的电报线路已于一个月前开通。威基谒的《电报书籍》成为之后代码修正和提升的主要灵感来源。在1871年由出使法国的蒲安臣使团的张德彝编制的另一本电报书——《电信新法》 ,这本书修正了威基谒的系统,使它在数据排列上遵照一种更严格的方式。但这两种电码…
5. 手机和磁卡放在一起,会不会『消磁』?

== 对于磁卡来说,『消磁』是什么?
以磁性介质存储信息的物品,因为受到外界强磁场的干扰,其中依赖磁性所存储的信息被破坏、改变、消失的情况被称为消磁
需要注意的是,IC 卡使用 IC 芯片利用射频传递信息,IC 卡也会因为其他物理损害导致信息错误等无法读取的情况,但原因几乎都不是消磁。

== 手机旁边有强磁场吗?
考虑一下智能手机一般拥有的内部设施,比如话筒和听筒、扩音器、陀螺仪、加速度传感器等,在磁卡『能接触到』的范围内,磁性貌似都不能强到足以使磁卡消磁的情况

== 手机射频会产生强磁场吗?
具有远距离传输能力的高频电磁波被称为射频,手机使用的频段(拿 CDMA 举例)工作频率都在 800~900MHz 之内,而在 300MHz~1GHz 内的无线电频率,属于甚高频(VHF)和特高频(UHF)之内
在这个程度上,电磁波的磁场不大,不足以改变磁卡里的信息使得它『消磁』而无法使用
电磁波理论,详情知乎 #zhihu

当然对于爱学习的孩子来讲,无线电(硬件层面)和信号处理(基本是软件层面,如果是复杂一点的信号处理的话)是个不错的展开面(跑)
duangsuse::Echo
5. 手机和磁卡放在一起,会不会『消磁』? == 对于磁卡来说,『消磁』是什么? 以磁性介质存储信息的物品,因为受到外界强磁场的干扰,其中依赖磁性所存储的信息被破坏、改变、消失的情况被称为消磁 需要注意的是,IC 卡使用 IC 芯片利用射频传递信息,IC 卡也会因为其他物理损害导致信息错误等无法读取的情况,但原因几乎都不是消磁。 == 手机旁边有强磁场吗? 考虑一下智能手机一般拥有的内部设施,比如话筒和听筒、扩音器、陀螺仪、加速度传感器等,在磁卡『能接触到』的范围内,磁性貌似都不能强到足以使磁卡消磁的情况…
6. 世界上第一个网站是什么?

惊闻刘国梁荣当乒协主席,深感高兴。虽然我们未曾有过交集,但乒乓球运动员身穿红色战袍,跟孙悟空喜欢的颜色一样。今年下半年,中美合拍的电影西游记即将正式开机,我继续扮演美猴王孙悟空,我会用美猴王艺术形象努力创造一个正能量的形象,文体两开花,弘扬中华文化,希望大家能多多关注。

别别别别打我,我是友军(跑) 🤪

我们从 Internet 早期开始一个简单的编年史!

Internet 是什么呢?你不知道,我也不知道。但我只知 Telegram 很好玩,你也只知开发各种网络 IO 的应用很有趣。

我们为啥需要 Internet(这不明摆着吗?要不然现在你也不该在这个地方说闲话了)

以下信息 全全 部部 都是我从 Tsinghua(读『清华』,邮政式拼音 #zhihu )大学的 《Internet 原理与技术》(第一版,清华出版社第五次印刷)部分摘录下来的(全都摘自第一章的历史部分,想来那么数学的电学信号模型很大的,很数学根本无法科普嘛)
这书是赵锦蓉老师(我不知道他的学位 2333,但应该至少是博士)编著的,如果有问题,找他去,和我无关,吾只系搬运工(跑)


计算机网络是指通过各种通信设备将计算机连接起来,并在计算机间进行信息传输的网络。
按跨越的地理范围可分为局域网 LAN 和广域网 WAN

世界上最大也是最成功的网络,就是你我现在正在收益于的 Internet, 它由许多物理网络互联而构成,包含数亿个用户,并且现在这个数目还在爆炸式增长
它是由美国的 ARPANET 发展来的,ARPANET 是第一个计算机广域网
ARPANET(Advanced Research Projects Agency Network) 是 1969 年 12 月(67 年提议、72 年公开演示),正式投入运营的计算机网络,当时仅有 4 个节点,距今已有 50 余年

计算机网络是端系统(end system)
网络上的计算机被称为『主机』host(即使 C/S 模型里,分客户机和服务器)
网络上的主机和通信设备,都被称为网络的『节点』node
网络上的传输介质,比如,双绞线和光纤,被称为『链路』link

计算机网络也是括扑几何学上的『图』graph,这也意味着,它之上可以应用很多图处理算法,比如狄克斯特拉算法(1959 年的老东西了,原论文可以在这里预览,虽然开始是发表某期刊的)


目前最流行的局域网架构是以太网(Ethernet)

网络上一般有一些流行的,用于通信的设备,比如交换机、路由器、集线器、调制解调器

信息在网络上,一般使用包交换手段进行传输

很早的时候,网络上出现过很多『交流协议』protocol,第一个比较标准化的模型,是 OSI 七层模型(Open System Interconnection)
它是由 ISO 国际标准化组织在 20 世纪 70 年代末开发的

它分为 物理层、数据链路层、网络层、传输层、表示层、会话层、应用层 七层

物理层的数据单元 DPDU,一般被称为『帧』frame
数据链路层的包 NPDU,一般被称为『包』packet


OSI 过于复杂,没有被市场所接受,于是后来就有了成功的 TCP/IP (传输控制协议/网际协议)统一模型

它作为一个计算机网络通信标准,已经被 BSD、Linux、UNIX、Windows、Darwin 等现在流行的操作系统/操作系统内核实现

TCP/IP 代表 TCP 和 IP 这两个协议的集合,它于 1974 年被 Cerf 和 Kahn 提出,它于上个世纪 80-90 年代在互联上大行其道,其传输速率也不断攀升

它的顶层是应用层(综合了表示层、甚至会话层的部分功能),下面依次是传输层、网络层,以及物理层(可能是 Ethernet、PPP、X.25 等等)

网络层,他们使用 IP(网际协议),当然也有协作 ICMP
传输层,他们使用 TCP 和 UDP(用户数据报协议)
应用层,就有了我们所熟悉的 DNS(UDP)、HTTP、FTP、SMTP、Telnet 了

Internet,是多种物理网络的互联网

那么我们还得提到 IANA example.org ,点击试试看?
当然还得连带提到 ICANNIABIETFIESG 什么的
也可以顺带提到 IEEE,虽然和计算机网络没有太大关系(你是瞧不起我电子电器的)

呃,反正计算机网络这方面,电子工程、信号处理、信息学编码、密码学、二进制什么的知识需要层出不穷,历史也有一大堆,所以,讲太多了,不过也好,已经讲到 TCP 了

那么下面有请 WWW (World Wide Web)时代的小猪脚:URL、HTTP、HTML(不过这里没有 CSS,层叠样式表 和 JavaScript 了,讲远了)

当然到这一层,很多复杂性都看不见了,基本就是一 HTTP 请求/回复的事(基本就一 METHOD、一 URL 一 HEADERS 一 BODY),RPC 就 OK 了,到了 RESTFul+面向文档数据库(但是不是图数据库,因为图数据库反而暴露出了更多关系型的细节,为了优化查询性能工程师豁出去了hhhh) 时代,那更爽了,hhhh

首先 URL:URL 是全局唯一资源定位符,它的 IETF RFC 是 RFC1738, 当然后面还有更普适的 URI(Identifier)
RFC1738 是 1994 年的,而 1995 年,又是一个 Web 基础规范 — HTML 2.0 [RFC1866],诞生了!
URI 的 RFC 编号是 RFC3986.


那么我们终于可以解答第一个问题了,世界上第一个网站是什么?

WWW,World Wide Web 概念,它要传输『文档』,依赖一种文档格式,

这种文档格式,我们称它为 HTML(超文本标记语言)
而我们要能通过某种方式获取到这种文档,这种方式,我们称它为 HTTP(超文本传输协议)

而文档,只有一份,多没意思啊,很多时候我们会引用别人的文档 — 无论是创立新研究发现动辄几百页的论文、抑或书籍,甚至一篇不到 500 行的博文都要或多或少地引用点东西
于是我们想让 HTML 支持某种引用其他文档的方式,再泛化一下,引用其他任何资源的方式,首先,我们需要知道资源的位置
于是就有了 URL,和后来的 URI
然后我们得知道资源的格式,以便在客户端渲染(显示)它
于是就有了之后的 MIME (RFC 2045)

他们都在 IETF 上有自己的 RFC 文档:
<dl>
<dt>HTTP 1.1
<dd>2616
<dt>HTML 2.0
<dd>1866
<dt>URL
<dd>1738
<dt>URI
<dd>3986
</dl>

看看 HTML 2.0(RFC1866) — 一个网站的『必备』技术被标准化的时间,1995 年
看看此 RFC 的 section 9.3, 它提到了一个 URL


<!--    html-1.dtd

Document Type Definition for the HyperText Markup Language
with Level 1 Extensions (HTML Level 1 DTD).

$Id: html-1.dtd,v 1.2 1995/03/29 18:53:10 connolly Exp $

Author: Daniel W. Connolly <connolly@w3.org>
See Also: http://info.cern.ch/hypertext/WWW/MarkUp/MarkUp.html

-->

你就发现了世界上第一个基于 WWW 技术的『网站』,它现在还在运行!


惊闻 CERN RFC2616 创建了 HTTP/1.1,深感高兴。虽然我们未曾有过交集,但计算机网络枝蔓远大,跟用无数个孙悟空的筋斗云传输的一样。今年下半年,中美合拍...,我继续...,...努力创造一个正能量的形象,文体两开花...多多支持。
duangsuse::Echo
6. 世界上第一个网站是什么? 惊闻刘国梁荣当乒协主席,深感高兴。虽然我们未曾有过交集,但乒乓球运动员身穿红色战袍,跟孙悟空喜欢的颜色一样。今年下半年,中美合拍的电影西游记即将正式开机,我继续扮演美猴王孙悟空,我会用美猴王艺术形象努力创造一个正能量的形象,文体两开花,弘扬中华文化,希望大家能多多关注。 别别别别打我,我是友军(跑) 🤪 我们从 Internet 早期开始一个简单的编年史! Internet 是什么呢?你不知道,我也不知道。但我只知 Telegram 很好玩,你也只知开发各种网络 IO…
7. WiFi (/ˈwaɪfaɪ/, 念『歪wai1』『负爱fu4ai4』🤣) 是啥

WiFi 无线抱̶枕̶保真技术啊,但是这些东西,知识复杂性梯度太大了,没啥好讲的啊!

说点概念吧:
— 它是一个无线电双工信息传输技术
— 98 年的技术,开始有专利,并且在 WLAN 技术里,一直无可替代,20 年了
可惜啊可惜无可替代(跑路)
— 它的标准 AP 射频设备,IEEE 802.11

Wifi 目前有三个版本,
WiFi4 — 802.11n — 72–600 Mbit/s
Wi‑Fi5 — 802.11ac — 433–6933 Mbit/s
Wi‑Fi6 — 802.11ax — 600–9608 Mbit/s

啊,真多,不过我懒得讲了,因为我看书上没有写太多,而我是个本本主义者(逃跑)

列点术语和解释吧:
局域网(LAN)
就是在一片小地理区域的计算机网络(皮)
无线局域网(WLAN)
同上,不过是不用物理线路连接的(再皮)
Wi-Fi
无线保真技术,当然也有一说称本身没有任何含义,无线保真为与『高保真音质 HiFi』的混淆,但现在联盟官方也已经开始使用这种解释
Wifi 是一种无线电无线局域网技术,基于 IEEE 802.11 标准
2.4GHz
所谓 WiFi,常见 802.11n
20和40MHz信道宽度下最快72和150Mbit/s
2.5GHz
所谓 5G WiFi,常见 802.11ax

Wi-Fi 设备:如个人计算机,游戏机,智能手机或数字音频播放器可以从范围内的无线网络连接到网络
热点:一个或多个(互联)接入点,可以组成一个面积由几间房间到数平方英里范围的上网空间,覆盖的面积大小可能取决于接入点的重叠范围

路由器:结合了调制解调器和Wi-Fi接入点
因为家用无线路由器的功率较小,所以其信号覆盖范围、信号强度也较小。随着MiFi和WiBro(携带式Wi-Fi路由器)的出现,可以很容易地创建自己的Wi-Fi热点,透过电信网络连接到网络。现在,许多移动电话(智能手机)也可充当小型无线路由器,供周围的设备连接互联网。

Ad-hoc(即地模式):不经路由器而是客户端直接连接到另一个客户端的Wi-Fi设备。

Wi-Fi无线覆盖范围,也包含了浴室、厨房和花园等地,使网络无所不在。
Wi-Fi无线网络还可以提供免费使用的公开热点和各种商业服务。



当然,老谈计算机科学很累的,历史的东西,很多都不好玩(违心话)
对于 WiFi 这种有意思的东西,我们得 Hack 啊,AP、这么多概念,为什么不好好利用一下,钻钻可能的空子,享受一下控制别人的乐趣呢?(恶趣味)

不像程序员(虽然很多骇客也是程序员),骇客们经常喜欢搞破坏,但其实更准确的说法是他们总是做坏事(调皮的语气)

在信息技术的计算机网络上下文上,这一般是说:

+ 欺骗信息传输参与者、截取信息(嗅探/欺骗)
+ 篡改信息,破坏信息系统

这些不怀好意的操作,统称为攻击(attack)

针对 WiFi 的攻击,被称为无线攻击
虽然不一定有 RFID 攻击值钱,也可能没有后门有效,也没有 Web 攻击(e.g. XSS、SQLi、各种有可能是弱智级别的漏洞利用)有意思、没有 DDoS 暴力、没有社工和数字取证兴奋 🐸、没有软件逆向工程靠谱,没有硬件逆向工程坑爹

但它是很多有意思的攻击的敲门砖,记得我家的无线安全就靠 WiFi 安全(和 SSL)来保护,也就是说也可能很值钱,尤其是曾经没有 SSL 的时候(跑)
但是也是相当有趣的。

如果实在干不过 WPA2(别说 WEP 了,那玩意,分分钟给你破解掉,很多不防 PIN 攻击的 router 也早挂了)(肯定的,有种你去和 512-bit key RSA 杠,以目前计算机的算力,太阳还在的时间内还杠不完)
那就上 mdk3 吧,我以前用那玩意开过 Fake AP Flood

当然,如果你坚信你的攻击对象是个纸张,你可以试用 Fluxion,它能利用任何不明事理的小白用户『欸,我家 WiFi 怎么断了?』,社会工程他们,让他们乖乖地把自己的 WiFi 密码交给攻击者『哦,原来我家的 WiFi 遭到攻击了,需要验证密码,那我就填上去』『哇,又恢复网络访问了!我可以刷 TikTok 了』(他们还以为自己是安全的呢!可笑)(过一会『啊?我没有发过这个抖音视频啊?这是怎么回事?』)

当然,19 年的 315 晚会上,你们能看到使用语音识别和合成、chatbot 技术的垃圾骚扰电话『开发商』,他们就用到了『探针』Fake AP 来搜集身边的 WiFi 设备,拿到他们的机器地址(MAC)和数据库比对以探查附近的用户信息。

这就是这种『不怀好意』的方式的魅力。 — 当然今年这群人呢,已经不能继续这么做下去了,这是侵犯用户隐私的。
duangsuse::Echo
7. WiFi (/ˈwaɪfaɪ/, 念『歪wai1』『负爱fu4ai4』🤣) 是啥 WiFi 无线抱̶枕̶保真技术啊,但是这些东西,知识复杂性梯度太大了,没啥好讲的啊! 说点概念吧: — 它是一个无线电双工信息传输技术 — 98 年的技术,开始有专利,并且在 WLAN 技术里,一直无可替代,20 年了 可惜啊可惜无可替代(跑路) — 它的标准 AP 射频设备,IEEE 802.11 Wifi 目前有三个版本, WiFi4 — 802.11n — 72–600 Mbit/s Wi‑Fi5 — 802.11ac…
8. 是先有鸡还是先有蛋?

等等,别急,看完下面这行代码你就知道了!

"
🐔🥚
".match(/(.)/ug).sort() //=> Array [ "
🐔
", "
🥚
" ]


是先有鸡!

...等等,真的是先有鸡?

'🐔'.codePointAt() //=> 128020(U+1F414)
'🥚'.codePointAt() //=>129370(U+1F95A)

我们知道,Unicode 码表在扩展的时候,是不会考虑到什么先后顺序的!

比如它会颠倒因果顺序,这就很灵性了。

["👫", "👪"].sort() //=> Array [ "👪", "👫" ]

显然是先有 👱🏼‍♂️🍹👩🏼‍🦳 才有 👪 (装作很确定一样,嗯嗯)


好吧,那么进入正题:

先有蛋。

如果你说的蛋没有限定是鸡蛋的话 — 看起来就是这样的啊

最早的恐龙蛋,可以追溯到一亿多年前的白垩纪,而的驯化历史就晚太多了,4000 年前。
目前回家自学半年时间,使用PHP+MySQL初步搭建了一个简易新闻网站

我当时就喷了,自学半年才这个三脚猫水
平,也不知道这位同学工程到了个什么程度呢,是测试套件写了几万行呢还是自己设计了什么不得了的框架和去繁复的方案呢、还是写出了个不得了的 Web 应用呢,还是使用了最新的框架、最新的技术、最新的点子呢,比如,OAuth、RESTFul、灰盒测试、特性测试?还是说有部分是用 C++ 写的呢?还是说你在算法上达到了多么高的造诣?形式化验证程序逻辑?自己写了所有平台的客户端?我现在真的很佩服轮子哥的忍耐能力。要是我一上去就喷... 我这种没素质的人。

这种应用层的东西,我觉得即使是入门,PHP,即使对于高中生来讲,三个月时间足矣。而这位大学生,勉强搭建这种简易新闻(没错,它的身份验证可以瞎做、访问控制可以少做、而信息保密性几乎不需要考虑,其他信息安全侧面交给框架和运维吧,打包部署不是我的事情,是框架的事情,监控管理有运维工具呢)网站都花了半年左右的时间,我不知道这位是学到了什么程度。

我自学有两年了(实际上很长一段时间以来,都是『业余时间』,总的来说四舍五入也就一年而已),今年三月,这是第三年,我觉得好的学习者只应该学习,他们不应该去强调某种『学习方法』『学习技巧』『捷径』让自己分心,他们不应该这么功利地去学习,这是短视的。

本苏当年在酷安的时候,利用 AIDE 的交互式教程,虽然我连子类型是啥都不知道,也实现了一些简单的 Android 应用(虽然很多连个列表视图都没有,第一个我只花了三四天的时间过了一遍教程,然后就写出了一个使用 android.util.Base64 的前端应用),一个大学生,写 Web 时代的『后端/全栈』应用,就难到需要半年时间完成?


真正能达到对计算机科学,交叉了那么多知识系统、那么多学科,把那么多领域都融会贯通程度的人,都很难想象他们平时会去追求什么『技巧』什么『捷径』

除了死干,还是死干,除了死磕死背还是死背,坚持那么多个月、那么多年,把十几本、几十本书翻来覆去看不知多少遍,把各种优质工程不断拿来剖析重写,不断写博文、看博文、看论文、写论文,技术都是一天一天积累来的,不费力气想靠着一点肤浅的理解吃饭,吃一阵子可以,能这么滴水不入地在这个领域干一辈子?那是中国计算机工程的悲哀。

技术就是积累来的,每个人的智商总是差异不大,那就看谁更能积累深刻了,一天天的努力,最后能积累起来,一天比一天多会一个知识点、一周比一周多了解一个问题、一个月多涉足一个领域,最后可以达到融会贯通。

拥有奶酪,就拥有幸福;
如果你不改变,就会被淘汰;
越早放弃旧的奶酪,你就会发现新的奶酪;
随着奶酪的变化而变化,并享受变化!

有捷径为什么你能走别人不能走,你比别人多条腿、多张嘴?


『教官,能不能给我们传授一下,您一招必胜的绝技呀。』

凭什么有这种绝技就只能你会别人不会。成绩都是练出来的,就看谁能在逼近极限的同时犯更少的错误,你过的每一个弯,都没有机会再来一次,你犯的每一个错,都会断送整场比赛,甚至你的一生。

竞技体育,成绩是练出来的,冠军是撞出来的。作为一个拉力车手,冲出赛道没有任何缓冲区域,旁边可能是墙是树,是水库,是悬崖。就看谁能在逼近极限的同时,犯更少的错误。你过得每一个弯都没有机会再来一次!你犯的每一个错,都会断送整场比赛。你所爱的事业和别的运动不一样,需要你的专业和冷静。

巴音布鲁克,1462道弯,109公里。
耍小聪明,赢得了100米,赢不了100公里。
你问我绝招,绝招只有两个字,奉献!
就是把你的全部,奉献给你所热爱的一切。
我每天在脑海里开20遍,5年,3万6千遍,
我能记住每一个弯道。

所要的就是这种精神 — 奉献

奉献到不知道自己在奉献,当奉献成为常态的时候,你才能成为一个真正的优秀的软件工程者,而不是仅仅一个『称职』的软件工程者。

== UPDATE: 上面的言过了,这位同学的追求和我的不一样,所以上面的,全当我胡说算了。

这位同学也就是想好好生活,对于这方面,老师、同学、家人想必说的也不少了,我也没什么经验,不能帮到任何一点。
所以呢,只要能看清自己在技术上处在哪种层次,我根本不会『看不起』这些人,因为他们只是在做自己喜欢做的事而已(我也一样),我完全可以无视他们的『职位』而只把他们当成自然人看待。emmmm 🌝
上面的文字只能代表我自己对以后几十年经验的老程的期待,因为热爱生活的人肯定学的更慢一些,这是非常正常的。

虽然我确实比较笨,但无端被人议论起智商问题还是有点恼火,我就回家自己搞搞技术,打算以此谋生而已,招谁惹谁了 ……
羽毛的小白板
极端 https://www.zhihu.com/question/317346252
#backend #GeekApk #SQL select * from yourTable limit 14 offset (4-1)*14;

🤔 我之前设计的 GeekApk 还没写 Database service 层,可是我居然因为没写到最后就不知道这个东西... 虽然我知道 SQL LIMIT,但我所想的却是 先 LIMIT 查询了之后,结果上 JVM 再去 subsequence...

我甚至还真把这个当回事了,还以为得专门抽提一个函数完成分页功能(geekapk API 的分页是很灵活的,使用的参数基本等价于 LIMIT 和 OFFSET)

还有,我刚才居然以为 LIMIT OFFSET 的 LIMIT 是基于整个关系行表头位置来说的偏移量,也就是说得 SELECT * FROM _ LIMIT (4-2)*14 OFFSET (4-1)*14... 简直毫无脑子

A, B, C, ... 都是关系元组

Table = [A | B | C | D | E | F]
SELECT * FROM Table LIMIT 1;
[A]
SELECT * FROM Table LIMIT 1 OFFSET 2;
[B]

(define pageSize 3)
(define collect-page' (pageSize page)
SELECT * FROM Table
LIMIT ${pageSize} OFFSET ((${page}-1)*${pageSize}))
(define collect-page (n) (collect-page' pageSize n))

(collect-page 1) = SELECT * FROM Table LIMIT 3 OFFSET (1-1)*3
[A | B | C]

(collect-page 2) = SELECT * FROM Table LIMIT 3 OFFSET (2-1)*3
= [A | B | C <OFFSET:3> D | E | F] Read 3
= [D | E | F]

== UPDATE: 我刚才用 SQLite 3 测试了一下,SQLite 其实是从 0 开始索引的,所以上面的是错的,我应该再减去 1...
至于为什么他们自己的就没有问题,是因为第一个 (1-1) 碰巧是 0,forall n in {R}. 0*n = 0,但是如果不为零,就得考虑零基数组的问题了...

create table test(text name);
foreach(x in listOf('a', 'b', 'c', 'd')) insert into test values(x);
select * from test limit 3;
select * from test limit 1;
select * from test limit 1 offset 1;
select * from test limit 1 offset 0; -- no returning records

(没用到啥关系代数知识,一方面也是关系代数那点操作符不够,虽然可以自己造新含义...)
唉,看来我还是了解的不够仔细。
其实我也相当努力了... 可是,其实有些东西就是要花时间... 而且我现在还没有机会沾染计算机图形学和人工智能
duangsuse::Echo
😔 Sticker
所以 GeekApk v1b trivial 的不得了的权限验证和所谓高难度的分页,都是智障级别的.... 除了被不良工程的 GeekSpec、Spectrum,我不知道它还有什么可取之处... 只要我现在完成这个临时的版本,真该啥时候重写的。
This media is not supported in your browser
VIEW IN TELEGRAM
#DuangsuseSB 煞笔警告一次
duangsuse::Echo
#DuangsuseSB 煞笔警告一次
好吧,好吧,duangsuse 来恢复一下心情,顺便写今天最后一个代码:默写重写 @YuutaW 的 RandomPicture

完全默写,包括 Gradle 构建文件(除了 Vertx 的依赖关系 Coordinate 在外)
并且,不得使用 IDEA 等具有自动补齐功能的 IDE

== 首先,我们来玩个简单的文件排序游戏,因为 duangsuse 不是学算法的(我以后会学)所以不考虑算法层的东西,就快速排序吧(因为它不需要我花时间去记,皮一下哦)(反正怎么说我,交换、插入、选择排序里,我也只会快排、冒泡、简单选择,虽然 OI 基础里还有简单插入、希尔排序、堆排序)。

肯定要用 Kotlin 最好,Haskell?那玩意 IO 模块的 API 我还不是老熟,现在弄了又要花掉十几分钟时间。

首先,我们要这么定义我们的『顺序』(基于 Int 优先级):
优先级,0 为最高优先级,往后依次递减,排序时使用 greaterThan ([a|b],若 a greaterThan b,则交换顺序) 来比较

针对每个字符,使用求和函数归并出优先级:
[A-Z] 范围内,递减优先级(0..23)
[a-z] 范围内,递减优先级,比 [A-Z] 小(23..49)
[0-9] 范围内,比 [a-z] 小(49..59)
任意其他字符,不影响优先级(0)

首先我们定义快速排序函数:

fun <E> quickSort(compare: Comparator<E>)
= fun (items: List<E>, lhsStart: Int = 0, rhsEnd: Int = items.lastIndex) {
// recursion base: like [1] / [2]
if (items.size < 2) return items;

// select swap pivot
val pivot = items.size / 2
// recursion
val lhsSorted = quickSort(compare)(items[lhsStart..pivot], pivot, );
val rhsSorted = quickSort(compare)(items[pivot..rhsEnd], pivot, );

// exchange mybe?
if (compare(lhsSorted.last(), rhsSorted.first()) > 0) {
// lhs is greaterThan rhs, swap then
return rhsSorted + lhsSorted
} else { return lhsSorted + rhsSorted }
}

以上这个函数写了我差不多半个小时,但是没有成功,我始终忘记了应该怎么模拟调用栈来设计算法... 🤔
所以我索性直接抄了某本算法书上的算法,我说过我是本本主义者。

fun <E> List<E>.quickSort(cmp: Comparator<E>): List<E> {
if (this.size < 2) return listOf()
val pivot = this[this.size / 2]
val less = this.filter { cmp.compare(pivot, it) > 0 }
val more = this.filter { cmp.compare(pivot, it) < 0 }
return more.quickSort(cmp) + pivot + less.quickSort(cmp)
}

import java.text.Collator
val col = Collator.getInstance()
const val TEXT = "hello HELLO 810 114514 1919810 z ab cd dc"
TEXT.split(' ').quickSort(col)

[z, HELLO, dc, cd, ab, 1919810]


我开始居然忘记递归调用 quickSort 了... 最近思路有点崩溃,看不到数据的流动了。
然后居然又忘记了,基线条件,列表的大小必须得大于等于 2 才有顺序一说啊!
亏我还想画图分析来着... 回头发现自己连顺序是啥都忘记了
没有思路了... 大概是老了吧

我得恶补一下算法了... 我居然不知道,左边的必须全是比 pivot 小的元素、右边的全得是比 pivot 大的元素,才能交换啊!唉
可怜的、不是天才的 duangsuse,长得又不好看,emmmmm....

然后是 [A-Z] [a-z] [0-9] 的排序

class StringComparator: Comparator<String> {
override fun compare(r: String, l: String): Int = toLevel(r).compareTo(toLevel(l))
override fun equals(o: Any?) = o is StringComparator // Stateless comparator

companion object Helper {
fun toLevel(str: String) = str.fold(0, ::appendLevel)
private fun appendLevel(acc: Int, ch: Char) = acc + getCharLevel(ch)
fun getCharLevel(ch: Char): Int = when (ch) {
in 'A'..'Z' -> ch - 'A'
in 'a'..'z' -> ch - 'a' + 26
in '0'..'9' -> ch - '0' + ('a'-'0'+2)
else -> 0
}
}
}
}

且慢,那么,假若我们希望开头的字符优先级更高呢?
这就是我们用 fold 而不是 sum 的原因啊!

修改一下:

fun toLevel(str: String) = str.fold((0, str.size), ::appendLevel)
private fun appendLevel(acc: Int, chnk: (Char, Int)) = (acc + chnk.second * getCharLevel(chnk.first), chnk.second - 1)

:: 从第一个字符开始以字符串长度数,每个字符都递减,然后把当前字符的长度,乘当前字符的优先级

那么是测试时间了呢。
好了,我玩够了。


和画出 mindmap,给大家讲出『Vibrator 到 System Service』所有的知识点。

快快写完睡觉吧。