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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。 当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animat…
最后一句(我懒得再看 drakeet 的博客和文章什么的了,怕又引起撕逼,虽然我对技术还是很客气的... 而且现在我不虚,除了要和我谈 Monad 和范畴论图论线性代数什么的):
我才知道 drakeet 使用的排序算法是从大学的时候改的... 而且他还学过 Objc 和 iOS 开发...

https://blog.csdn.net/drakeet/article/details/12948029 👈 here, 《还是用csdn吧》

那么我这周最后谈一下这个博文最后提的问题,太久流于一个话题对我来说也不好。

我发现,其实酷安开发者们大学生也不少。by_syk 应该也是大学生吧

NSNumber *temp = [[NSNumber alloc] init];

//「从小到大」排序
for (NSInteger i = 0; i < aHundredArray.count - 1; i++) {
for (NSInteger j = i+1; j > aHundredArray.count; j++) {

if (aHundredArray[j] < aHundredArray[j-1]) {
temp = aHundredArray[j-1];
aHundredArray[j-1] = aHundredArray[j];
aHundredArray[j] = temp;
}
}
}
---------------------
作者:drakeet

我们用伪代码描述一下,反正我们不再乎是 Objc、Swift 还是 C++ 是吧?因为交换排序本来就应该是任何正常编程语言都能写的,Haskell 靠 forM_, (!!) 都能写(或许吧)

var ary[n]
predicate x y = not $ x `lessThan` y

for i in ary.indicesWithoutLast |>
local suc_i = i +1 — next item index
if (ary[i] `predicate` ary[suc_i]) swap(ary, i, suc_i)

怎么样,好看吧?这是个『不能使用』的交换排序算法,交换比较谓词函数为 (not · lessThan),换句话说,我们认为列表应该是 [a(<b), b (<c), c] 才对,否则就交换索引致使它成那样。

那么不对在哪里?假设我们有一个列表

[1, 3, 4] 排序结果显然是正确的,因为它不需要消除任何逆序对
[4, 1, 3] 在 i = 0 的时候,我们消除了一个逆序对 [4, 1][1, 4],然后 i = 1 结束循环时 [4, 3] 也被消除,得到有序列表

那么这个算法(我写的,不是原算法...)其实就是简单交换排序... 是没问题的(迫真,其实有问题... 比如 [4, 1, 3, 2] 就不能排序,因为它不足以把 2 交换到顶部,至于数据模式,就是 [d, a, b, c], a > b, a > c, d > a, 算法输出只能是 [a, b, c, d]... 好吧我输了,我这么抽象的时候找不出不能排序的... 但我觉得不对,肯定有无法交换到『前面』的模式的)

那么问题来了,到底为啥一半有序一半无序?因为我开始看错了...

for (NSInteger i = 0; i < aHundredArray.count - 1; i++)
for (NSInteger j = i+1; j > aHundredArray.count; j++)

什么魔性循环... 比如对于输入 [4, 3, 2, 1], for
count = 4
i = 0
j = 1 — j 不可能 greaterThan count,因为所有 i 循环中的 j (aka. succ i) 在 range bound (0:(count-1)-1+1) 内,(count - 1) 不可能 greaterThan countj++ 为死代码, 第二个循环不存在,, 看来我上面的是对的
swap([4,3,2,1], 0, 1)
i = 1
j = 2
swap([3,4,2,1], 1, 2)
i = 3
j = 4
swap([3,2,4,1], 3, 4)
(endfor)
result = [3, 2, 1, 4]

这就是所谓的『排了一半』,我们注意到 3 和 2 是逆序的,因为我们在交换 &2 和 &1 的时候没有考虑到前面有个 3 打破了期望的偏序关系(只知 3 > 2 不知 3 > 1,何况知道手也短无事可做)。

然后你们看到了,后来 drakeet 也在 LayoutFormatter 里觉悟了原来交换步长只有 1 啊!逆序对只是个 pair,更大的逆序是无法靠交换相邻项消除的,所以用了一个 for (i = 0; i < j - 1; i++), 完美
🎉 那么看完了以上两条消息,不会觉得我智商不如 drakeet 了吧?
anonymous poll

🐱 – 4
👍👍👍👍👍👍👍 100%

👥 4 people voted so far.
是这样的,的确别扭... 不过改过来就是选择排序了
绝望,网易云音乐的播放器貌似出问题了,爆音、解码回放速度跟不上,Firefox 的 WebAudio 却没有任何问题,只得上 debugger,尝试修复...
大哥,这都 H5 时代了,用啥第三方 js 库啊... WebAudio API 不行么
槽,WebAudio API MediaWrap 播放都有问题,XYVODPlayer 用的 WebAudio 当然也有问题... 看来 Fx 得更新了?
哦,没问题的是 video API... 🙈
duangsuse::Echo
哦,没问题的是 video API... 🙈
duangsuse 知道的还是太少了啊(说起来这种 streaming player cache 不知道怎么写呢?而且集群计算和网络流就不会
https://www.mdui.org/docs/collapse #gui 一些 animation,比如说 ripple, duangsuse 也没有实现过...

如果动画过程中 touch release, 就立刻展开么... 要不然曲线就会越来越慢?会不会要记录按下的时间,因为按的时长越短涟漪展开速度越快?
This media is not supported in your browser
VIEW IN TELEGRAM
#GeekApk 最后我吐槽一下,然后去写 DJson 吧(浪费了太多时间,DJson 还要写一 TextInputStream 代理呢... 虽然不需要 parser combinator

欸话说刚才看的时候又见到了汉语机器学习 + 歌声合成的实例... 即使在 B 站...
这年头啥都逃不过浮点计算... 😕
NVIDA 的高性能计算库 OpenSeq2Seq: toolkit for distributed and mixed precision training of sequence-to-sequence models
可以用于语音识别和合成、自然语言建模处理等流行操作...

这年头不想当码农难啊,要不然就得学习『使用』一些自己看不懂的东西,做『用户』... 😐


> 我主要想看看谁会继续领导
> 否则就是瞎写嘛

< 没有生产力,活不下去,哪里有闲心政治,就像一群没有自理能力的人无法组成社会一样


这是前几个星期我在凉了的 GeekApk user 讨论组看到的一小段消息

🤔 duangsuse 想关于这些『创业』系信息技术『从业者』发表一些自己的看法。

🗒 此广播不应在任何程度、任何侧面上被理解为对『创业』的不敬、对群不对人,请勿对号入座。

——
GeekApk 嘛... 一些人可能以为是我自己开始想搞出这个坑来叫一群仇酷安(当然,也可以说,是“恨铁不成钢”,可惜我们并不拥有酷安,呵呵)的人一起填或者要组队破坏酷服务的(GeekApk 组曾经是有一次被拿来组织了一次 DoS,目标是酷安的静态页面,并且导致了主要酷服务(这里分为 coolapk.com, dl.coolapk.com, api.coolapk.com, 主服务是说 coolapk.com 主站)宕机半小时,当然,也有可能是酷安本身土豆服务器过于辣鸡导致的,我不是此活动的策划者,甚至不是 GeekApk 的『管理者』,也不能算是『创建者』,对酷安的『失去初心』亦无仇视心态)

其实真的不是,我开始比较 naive(正如当初我以为,why Rust? It's fast!),就是想自己弄一个,本来的『项目』是 Dropage,虽然只有一个『蓝皮书』(现在可以说是『烂』了,呵呵)

后来呢,就不得不提到 @iVanilla (现在 Deleted 了... 或许是主动删号的吧,或许... 😶) 弄出了 GeekApk 项目(我自己不想咸得没事去组织一群人弄这种事情,虽然他说是自己早有想法,但是我在某小群里提到自己的打算后再找我私聊讨论并且建立 GeekApk 的,虽然我开始天真无邪 Too young too simple, 但是也不至于捅出这个篓子,因为我打算自己弄,弄完了... 呃... 我觉得照那个样子啥都弄不完),不得不承认他是很好的进行了一些『商业』上的帮助,并且讨论了一些『商业』上的东西... 可惜后来 GeekApk 是这样,那么我这条广播,是想告诉你们为啥它『咕咕』了,为啥会是这样而不是我们都认为的皆大欢喜 good ending — 大家齐心协力弄出了类似酷安的东西,然后欢天喜地地入驻进去,开始的人全成了 GeekApk 里最 dalao 的权限,然后本来『屈居』在酷安的人也都过来了,本来只知酷安的人后来也注册了 GeekApk 帐号,GeekApk 一周年,大家都高喊 GeekApk 万岁万岁万万岁... 还要成立什么米国美国公司,拉赞助... 😶

嗯,drakeet 曾经直白地批判过 GeekApk,除了他无视本组都是一群运维菜鸡而且我仍在学习之外(恕我直言,而且也未必有人维护着多大的集群,体验过什么分布式架构和高性能计算技术)『空壳』我还是很认同的,当然不要以为我也顺带着『仇视』他,我对技术比对人更感兴趣,看问题一向对事不对人。

https://github.com/GeekApk 到现在真正的错误,上面『幼稚和空壳』已经能很好地概括出来了

有些人说 GeekApk 错在用爱发电,在我看来真正致命的却是另一个缺口:用爱发电,其实也未必不可,在自己的业余时间(可能足够长)里做想做的事情,在自己的经济能力范围内要求必要的服务,本来就是人生的一大乐事,可是那个 GeekApk 却是要你用不断咕咕叫🐦的空头支票去给『酷安变质』的信仰充值,这就不行了。

信仰自然还是要有的,可是有一天没有依附的希望终将消散,光靠信仰光环,画饼充饥,能扛过一天,扛得过一年么?

所谓的项目,没有拥有基本技术能力的参与者,没有能做实事的人,就好比一台没有电源的机器,连动力都没有,你说它该怎么工作?靠推吗?你说没有人有能力写代码的『网络技术公司』靠什么去做项目、做产品、做平台、占领『市场』?靠『xxxx 天内出 OO』的承诺吗?

崇才科技。大家都认为是吹的,可是,没有那些抄来、改来的『产品』,想来媒体要炒作,光靠某泽的学历怎么这么高,故事怎么这么大佬,也无物可炒啊?00 后开公司,前浪死在沙滩上啊,哇好厉害,可是有啥东西做出来呢?
没有?那有啥好说的?
可是他们这群脚本小子,『自己动手』(“丰衣足食”)『做』出来了『崇才』课表、『崇才』萌狼输入法,加上『无薪资』『QQ 群』等『企业』 flag,就像是真正的 SOHO(Small Office Home Office) 公司了,何况还有名分的,不是么?

而 GeekApk 还要降一档次,因为名分上的东西都没有,我们也没人『自己动手』去把酷安复制一下(这种程度能力的人都没有,好吧,的确有一个高性能计算的大佬被我『赶跑』了... 其实那时候 GeekApk 连个设计本本都没有,不像 R 还有个第一版明确定义),没有一个拿来骗人的『酷极安』『产品』,也没一个 50w 资本的注册公司和大手子转发评论,最后当然是烟消云散啥都没留下。(呵呵

GeekApk 需要的是什么?是白皮书、贷款、基金、股票、融资、股票期权、资金链、生态圈?是项目?是员工、运维、CTO、CIO、CEO、COO?是 “用 Trello”、“用 Rails”、“用 Laravel”、”用 Go“、“用 Vue”、“用 OO”?是 “不能『抄』酷安”“即使身死绝不自我审查”?它们都出现过,都消失了,说到底,『产品』的核心还是靠着软件工程实战的程序逻辑,其他的,『一步到位』、测试、文档、打包、可读性、可扩展性、可维护性、健壮性,编程技巧,都是次要,『库』的核心还是抽象、架构和算法,『应用程序』的核心还是业务逻辑,产品的核心还是你要提供的东西本身,其他的,在没有一个存在的展开基础的时候,都是一纸空谈。

著名计算机科学家沃思(NiklausWirth)提出一个公式:
  算法 + 数据结构 = 程序
其中算法是程序的灵魂。

是灵魂啊!你到底想干什么?你知道吗?

在你还没学会走好路之前,不要被眼前斑驳陆离的世界迷惑,拒绝政治、拒绝形式主义,就是给自己一个更广阔的天空。
— duangsuse, Sun Apr 21, 2019
Forwarded from 羽毛的小白板
#friend https://github.com/Yuru-ekis 今天认识了一位也在 JVM 的 dalao @Yukisruri 🐱
今天看见了这个 bot 比较有意思,我们使用 PDL 来伪设计一下这个机器人

使用消息驱动编程,这是一个简单的 Telegram 平台 bot,不使用 inline bot(eg. 按钮菜单、@bot 选项) 功能。

我们的抽象:

onHandleCommand
(Command, MessageContext)

用户使用 /sucide 命令,或者会加上 bot 的用户名,就要将他封禁一段时间。

observe onHandleCommand(cmd, context)
case cmd
"sucide" ->
res = sucideUser(context.group, context.sender)
res.map_err { |e| reply(context, e) }
tease(context, res.ok!())
otherwise -> reply(context, "Unexpected command " ++ cmd)

然后有 procedure:

fn randomTimeRange()
return Random.nextInt($_("minTime"), $_("maxTime")))

来拿到一个随机时间,并且我们假设 Telegram 暴露了一个『block 用户 for 一个时间段』的接口
并且假设『消息位置』肯定是一个 group

然后有 sucideUser(user)

fn sucideUser(group, user)
unless group.group? return Err("Not a group")
results Telegram.block(group, user, PERM_DENY_SEND, randomTimeRange())

这时候我们不管别的,假设有这么一层可以抽象出来(而且的确可以,Telegram 总不可能只告诉 bot 自己被发了哪个命令不告诉是谁在哪里发的)。

然后我们可以取笑封禁用户

fn tease(ctx, millisec)
  reply(ctx, "你被封禁了 " ++ Time.pretty(millisec) ++ ",完美!")

🤪
Forwarded from Deleted Account
Congratulations! You are blocked for 85 seconds (random value, min: 30s, max: 5 minutes). Enjoy your offline time!
#blog #dalao #dip https://bokjan.com/ #recommended 看今日 @metowolf 的新 follow,是一个优秀的华南理工在读大牛,他学的是软件工程,写过一些信息学、计算机图形学、图论、操作系统的东西

https://github.com/Bokjan?tab=repositories GitHub