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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
🤔 想想 Scanner 是不是不够优雅...
数据会类似这样
duangsuse::Echo
🤔 想想 Scanner 是不是不够优雅...
我觉得就 Scanner 的逻辑结构上应该不够优雅,state 几乎是个笑话、lineDoUntil 非得加一个『keepLastLineOnce』才能用(doUntil 是在 scan body 里看到 new message header 的时候用的,可是等到这个 Message 返回,新 message 头会被下一次 iteration 直接忽视掉(因为我没设计好数据流,然后每次由判断 hasNext 的函数读新行的),导致漏掉偶数消息,不得不引入类似『mark/reset』的机制才可以),不过能用就好(跑路 🙈
telegramscanner.zip
20.8 KB
❤️ 🤔
duangsuse::Echo
telegramscanner.zip
最后写下 XML 序列化就彻底完成了!(因为这个最终是要用 Ruby 来查询数据的,虽然我有写 JavaFX GUI 的打算,可是我觉得还是晚一点好。
🤔 这是写 HTML 的节奏?虽然是 XML... 跑,反正都是 SGML 呢?(
telegramscanner.zip
23.6 KB
telegram-scanner.jar
34.2 KB
Maven jar plugin 生成的 Jar application,可选 -test, -dump, -dump-yaml, -dump-debug-yaml
duangsuse::Echo
🤔 这是写 HTML 的节奏?虽然是 XML... 跑,反正都是 SGML 呢?(
完结撒花! OwO #Telegram #project
使用『Copy selected text』格式复制 Telegram Desktop Qt 的消息,这个软件可以以行为单位解析它,输出『消息对象』数组。下面会利用这个软件和 Ruby 来给大家分析最近本频道的广播。
使用 cat ~/count.txt | java -jar telegram-scanner.jar -dump > test.xml 命令,它会输出 XML 结构,类似这样
duangsuse::Echo
Photo
Ruby 里,要把它解析成 List & Object 的形式,只需要利用 Nokogiri:

require 'nokogiri'

plain = File.read('test.xml')
doc = Nokogiri.parse(plain)

root = doc.children[0]

def collect_real_tags(xml)
i = 1; ret = []
while i < xml.size
ret << xml[i]
i += 2
end
return ret
end

real = collect_real_tags root.children

m = real.map { |n| n.children.find_all { |i| i.is_a? Nokogiri::XML::Element } }

m.map! { |a| a.find_all { |i| i.name == "dt" }.zip(a.find_all { |i| i.name == "dd" }).map { |n| [n.first.children[0].text, n.last.children.text] } }
m.map!(&:to_h)

r = m.dup

最后再 post-process 一下就可以了

r.map! { |h| h.merge({'debug' => %w[no off line message_line].zip(h['debug'].match(/\{message_no=(\d+),\s*offset=(\d+),\s*line=(\d+),\s*message_line=(\d+)\}/).captures.map(&:to_i)).to_h, 'hashtags' => h['hashtags'].tr("[]", "").split(','), 'links' => h['links'].tr("[] ", "").split(',') }) }

# time
r.map! { |h| h.merge({ 'published' => Time.at(0, h['published'].to_i, :millisecond) }) }
#Ruby 滥用 Ruby
🤔 下面就是本 #Telegram Channel 的消息内容统计信息了
duangsuse::Echo
在 Ruby 里,要把它解析成 List & Object 的形式,只需要利用 Nokogiri: require 'nokogiri' plain = File.read('test.xml') doc = Nokogiri.parse(plain) root = doc.children[0] def collect_real_tags(xml) i = 1; ret = [] while i < xml.size ret << xml[i] i += 2 end …
可惜没有绘制成图表 plot 好看一些 🤔

r.size #=> 187

一共统计了 187 条消息。

r.sort_by { |it| it['published'] }.first['published']
=> 2019-03-24 11:22:00 +0800

第一条消息是
2019-03-24 11:22
发送的

r.sort_by { |it| it['published'] }.last['published']
=> 2019-04-05 20:06:00 +0800

最后一条消息是
2019-04-05 20:06
发送的


🔗 有 XXX 的消息条数

r.find_all { |it| it['body_type'] == 'HAS_HASHTAGS' }.size
=> 42
#Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签

r.find_all { |it| it['body_type'] == 'HAS_LINKS' }.size
=> 37
含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签

r.find_all { |it| it['body_type'] == 'HAS_LINKS_AND_HASTAGS' }.size
=> 17
都有的消息有 17 条,占总消息的 9%

众所总周知,这种消息一般是很优秀的消息(跑),值得大家观摩,它们分别是:

r.sort_by { |it| it['debug']['no'] }

我们看到,第一条消息是 2019-03-24 11:22:00 的 AXMLParser 广播

https://t.me/dsuse/9512

它的总编号是 9512, 不过,因为零基数组微妙的差异(解析的时候用了两次零基数组),得加上 1 才可以

puts r.find_all { |it| it['body_type'] == 'HAS_LINKS_AND_HASTAGS' }.map { |m| "https://t.me/dsuse/#{m['debug']['no'] + 9511 +1}" }.sort.join("\n")

::
https://t.me/dsuse/9527
https://t.me/dsuse/9541
https://t.me/dsuse/9576
https://t.me/dsuse/9580
https://t.me/dsuse/9585
...

或者详细一点:
puts r.find_all { |it| it['body_type'] == 'HAS_LINKS_AND_HASTAGS' }.map { |m| "https://t.me/dsuse/#{m['debug']['no'] + 9511 +1}\n#{m['body'][0..50]}...\n" }.sort.join("\n")

https://t.me/dsuse/9527
#Ruby #Project 一个失败的尝试,但是我也了解了二进制 IO 的一些信息

https:/...

https://t.me/dsuse/9541
https://zhuanlan.zhihu.com/p/60171538

#dotNet

...

https://t.me/dsuse/9576
#Mozilla #ES6 #JavaScript #frontend #backend 啊,的确,不...

https://t.me/dsuse/9580
#tech #CS 来科普一打有趣的信息技术相关知识: 🤗

1. Windows 里的 A: B: ...

https://t.me/dsuse/9585
5. 手机和磁卡放在一起,会不会『消磁』?

== 对于磁卡来说,『消磁』是什么?
以磁性介质存储...

https://t.me/dsuse/9586
6. 世界上第一个网站是什么?

惊闻刘国梁荣当乒协主席,深感高兴。虽然我们未曾有过交集,但乒乓球运动...

https://t.me/dsuse/9605
https://github.com/duangsuse/RandomPicture 我必须得感谢自己...

https://t.me/dsuse/9621
我待会把坑填完... #Android #blogPOst

https://blog.yuuta.m...

https://t.me/dsuse/9637
效率.... 🤐

那既然已经花了很多时间就再多花一点(皮)

演示一下这个功能:

[DuangSU...

https://t.me/dsuse/9638
最后,快速了解一下 #Android 系统服务 (https://blog.yuuta.moe/201...

https://t.me/dsuse/9643
https://github.com/LineageOS/android_frameworks_bas...

https://t.me/dsuse/9645
#blog #recommended https://bindog.github.io/

...

https://t.me/dsuse/9654
#CS #fix 下面我来给大家解释一下停机问题和 NP 困难到底是什么,和我这里提到的 NP-har...

https://t.me/dsuse/9663
现在开始讲解方才 @drakeet 的排序问题

5 没有被手动排序过,5 排在 1 前面,4 被手动...

https://t.me/dsuse/9676
#Android 类似的设计详询 Android Input Methods (https://dev...

https://t.me/dsuse/9684
感谢 @haoyet @eGluZl 等热心用户的建议,YuutaW 主要参照 https://www...

https://t.me/dsuse/9689
#通知

我们的MTProxy已经上线,欢迎使用
点击这里设置代理 (https://t.me/pro...
修改了 SourceManager 相关的细节,正在发布新版本