duangsuse::Echo
居然还要处理多 Annotation 的情况... 气死我了
我不要处理算了,这就作为另外一个类似 Jawa 的 DSL 算了 hhhh(迫真(跑
simple_parser.rb
5.4 KB
#Ruby 一个普通的 Scannerless Parser
duangsuse::Echo
simple_parser.rb
🤔 接下来 duangsuse 给大家做一瞬生成的现场的表演(良心) #sysadmin #Ruby #Parser #recommended
首先,按照上面的消息把 Retrofit 接口定义的 Java 代码整成这个 Parser 可以理解的格式
然后,执行命令
好魔法的设计模式,虽然感觉好像除了能完全记下来以外也没什么特别的牛逼... 但是不明觉历... 🤔
... 能用就好
首先,按照上面的消息把 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)吐嘈:还没有现在某些前端的设计模式魔法呢.... 如果前端再在自己的设计模式上加点东西,是不是就被完爆了呢?
好魔法的设计模式,虽然感觉好像除了能完全记下来以外也没什么特别的牛逼... 但是不明觉历... 🤔
... 能用就好
duangsuse::Echo
🤔 接下来 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))…
以上脚本只能部分自动化(而且 Spectrum 目前也没有兼容 MutliBody 的 API,因为 GeekApk 没有用到),要使用的话还是得自己修补一下才行...
不过也可以减小工作量了。
不过也可以减小工作量了。
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 不完全兼容,当然有了虚拟机这个或许可以无视
完全用 Ruby 还原校验码生成算法,这很困难(因为编译优化),我之前试过逆向一点小逻辑,都花了很长时间 #reveng
不过,x86 是个很通用的平台,我觉得可以拿 radare 修改汇编代码、对象文件属性给它 port 到一个相对宽泛一点的平台,然后每次用的时候直接用 v86.js 这样的虚拟机器执行,反正桌面端基本都是 x86,Android 端不是有 Token generator 么。
困难在于,如果类似的虚拟机比较『底层』,不是我想的那样只是基于宿主环境,作为一个『翻译』工具而工作,而是在没有操作系统支持的情况下工作,就会很困难。
还有个问题是,很多机器是 x86_64 的,和 x86 不完全兼容,当然有了虚拟机这个或许可以无视
HackingCoolApk_1.zip
39.3 KB
写了一点,API 太多了(
🤔学术的时代结束了?(暴论)( #baidu 我就记得有一个百度学术... 正准备喷百毒没社会责任感不如 Google 呢)
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 开发这设计模式可谓艺术....
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 开发这设计模式可谓艺术....
Forwarded from dnaugsuz
所谓运行期类型,因为 Java 8 有反射特性么,就可以理解为一个
Java 的 Object 类的 Class <?> getClass() 方法,所有正常的 Java 对象都可以拿到它的
这涉及到 OOP 的多态什么的... 反正我也弄不懂就是了(
比如说我们有一个静态方法
🤔 其实我应该用泛型的... 要不然编译期类型和运行期类型的区别也不好显现,算了,我说多了(抱歉)
而所谓的 Kotlin smart cast 呢,就是(代码片段):
Object 的 Class<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 的字节码层面都是第一个参数,因为它是静态方法)来说,所谓编译期类型就是 CharSequencemain 里面对它的调用,运行期类型就是 String(CharSequence 的一个子类型,虽然 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 就可以不写。Forwarded from Yuuta 🎀 | clrd enroute
Kotlin 写 data 是真的舒服(