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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from 羽毛的小白板
总的还是能发现些套路,虽然还不习惯这种开发模式
duangsuse::Echo
居然还要处理多 Annotation 的情况... 气死我了
我不要处理算了,这就作为另外一个类似 Jawa 的 DSL 算了 hhhh(迫真(跑
改成 @MultiPartPost
ScannerLessParsing 一时爽、一直写 ScannerLessParser 一直爽 🤔 — 妈妈再也不用担心我的 parser 需要 Regex / 速度慢 / 体积大 / 不够灵活了
走出半生(指脚本小子)仍是 Java Parser... 🤔 (图为第一个递归子解析器结构,Java 的泛型参数解析)
勉强完成了这个 Parser,使用的框架还有很多需要修改的地方,希望以后这种能力能派上用场。 #Ruby #PL #Parser
simple_parser.rb
5.4 KB
#Ruby 一个普通的 Scannerless Parser
duangsuse::Echo
simple_parser.rb
🤔 接下来 duangsuse 给大家做一瞬生成的现场的表演(良心) #sysadmin #Ruby #Parser #recommended


首先,按照上面的消息把 Retrofit 接口定义的 Java 代码整成这个 Parser 可以理解的格式

然后,执行命令 ruby simple_parser.rb retrofit.java 1>result.json,导出成果到 JSON 文件

ary = File.read('result.json').yield_self(&JSON.method(:parse))


接下来就是魔法的时候了(迫真)

class Interface
attr_accessor :name, :method, :path, :args, :type
def initialize(json)
@method = json['method']
@path = json['path_template']
@name = json['fun']['name']
@args = json['fun']['args']
@type = json['fun']['type']
end

def codegen_method; return method == 'GET' ? '' : "#{method}@" end
def codegen_type_name; case type['name'] when 'List' then 'array' end; end
def codegen_type
if type.is_a?(String) then "-> #{type}" else "-> #{codegen_type_name}:#{type['inner']}" end
end
def codegen_args
args.map do |a|
web_param = a['name']
param = a['param']
type = a['type']
case a['ann']
when 'Query' then "#{param}:#{type}"
when 'Body' then "#{param}:#{type}-body"
end
end.join(', ')
end

def codegen
"#{codegen_method}#{name}(#{codegen_args})#{codegen_type}\n = #{path}"
end
end

然后

puts ary.map(&Interface.method(:new)).map(&:codegen)

吐嘈:还没有现在某些前端的设计模式魔法呢.... 如果前端再在自己的设计模式上加点东西,是不是就被完爆了呢?
好魔法的设计模式,虽然感觉好像除了能完全记下来以外也没什么特别的牛逼... 但是不明觉历... 🤔
... 能用就好
那么这样就 OK 多了
This media is not supported in your browser
VIEW IN TELEGRAM
等到我写完 Spec 文件并且解决 API 客户端的兼容问题、下一步就该讨论怎么破解酷安的『官方』客户端口令验证保护,让它能在 Ruby Spectrum 的环境下可用

完全用 Ruby 还原校验码生成算法,这很困难(因为编译优化),我之前试过逆向一点小逻辑,都花了很长时间 #reveng
不过,x86 是个很通用的平台,我觉得可以拿 radare 修改汇编代码、对象文件属性给它 port 到一个相对宽泛一点的平台,然后每次用的时候直接用 v86.js 这样的虚拟机器执行,反正桌面端基本都是 x86,Android 端不是有 Token generator 么。

困难在于,如果类似的虚拟机比较『底层』,不是我想的那样只是基于宿主环境,作为一个『翻译』工具而工作,而是在没有操作系统支持的情况下工作,就会很困难。

还有个问题是,很多机器是 x86_64 的,和 x86 不完全兼容,当然有了虚拟机这个或许可以无视
HackingCoolApk_1.zip
39.3 KB
写了一点,API 太多了(
🤔学术的时代结束了?(暴论)( #baidu 我就记得有一个百度学术... 正准备喷百毒没社会责任感不如 Google 呢)
这个期刊都已经有 7 年没有更新了 🤔
Forwarded from duangsuse Throws
Forwarded from dnaugsuz
PHP(
F#、Haskell、Scala、Scheme、Clojure 什么的吹抽象思维能力和对编程语言的理解(当然还有递归、算法数据结构、集合论、图论...)
C#、Java、Kotlin、Swift、Obj-c 吹各种清奇的设计模式和 OO 风格,以及对实际应用编程的描述能力(复杂度封装)
Python、Ruby、JavaScript 吹一大堆各种社区库、数据处理语法便利和元编程(Python dalao,对 Matlab、Octave、Woflram 也是一样)
C、C++、D、Go、Rust 吹底层编程机器相关属性访问度和高性能高并发,计算机网络有时候也看这种

各种鄙视链好像都还没有 PHP 的份(可能 PHP 要靠语法上的奇特,比比较 UNIX-like 的 Ruby 和 Python 给人感觉还 UNIX 2333)

PHP 是杂交的,但是我感觉 PHP 的程序员很多时候没有啥可以吹的(
可能是 PHP 写的应用都不需要多秀吧(跑 🤔

每次看到隔壁 Android 开发,一大堆 XXXFragment XXXManager XXXProvider XXXAdaptor XXXResolver XXXService ViewHolder RecyclerView AIDL 各种设计模式类继承、计算机图形学画画 sin cos acos 就不明觉历。
比起 Qt,Android 开发这设计模式可谓艺术....
#Java #JVM 虽然是很垃圾的东西,因为写了一点也拿过来分享一下,算是低端科普。
Forwarded from dnaugsuz
所谓运行期类型,因为 Java 8 有反射特性么,就可以理解为一个 ObjectClass<T> 🤔
Java 的 Object 类的 Class <?> getClass() 方法,所有正常的 Java 对象都可以拿到它的 Class<T>,我值的运行期类型是这个

这涉及到 OOP 的多态什么的... 反正我也弄不懂就是了(

比如说我们有一个静态方法 Foo.printMessage,所谓静态方法呢就是一个类而不是它的对象所拥有的行为,因为 Java 不是 Ruby 那种内建高等 Inspect 特性的语言,所以类是类对象是对象,当然也有历史的原因 :(

class Foo {
static PrintStream out = System.out;

static void printMessage(CharSequence msg) {
Foo.out.println(msg);
Foo.out.println(msg.getClass().getCanonicalName());
}

static void main(String... argv) { Foo.printMessage(String.valueOf("Hello")); }
}

对于 printMessage 的第一个参数(无论对于 Java 语言层面还是 Java 的字节码层面都是第一个参数,因为它是静态方法)来说,所谓编译期类型就是 CharSequence
main 里面对它的调用,运行期类型就是 StringCharSequence 的一个子类型,虽然 CharSequence 实际上是一个接口,但在不同层面/方向看它就会有不同的结果,可以 javap java.lang.CharSequence 检查一下 CharSequence 的源码)
🤔 其实我应该用泛型的... 要不然编译期类型和运行期类型的区别也不好显现,算了,我说多了(抱歉)


而所谓的 Kotlin smart cast 呢,就是(代码片段):

final Object obj = (Object) String.valueOf("");
if (obj instanceof String) {
String message = /* 这个是不必要的强制转换,因为执行到这里已经能说明 obj 是个 string */ (String) obj;
}


Kotlin 编译器可以根据控制流分析自动推导出在这个分支里 obj 肯定是个 String,所以 (String) obj 这种 Boilerplate code 就可以不写。