现在看来 Swagger 的规范好正规呢,但是如果 GeekAPk API 要拿 Swagger 重写,那不知道要花多少时间呢
duangsuse::Echo
现在看来 Swagger 的规范好正规呢,但是如果 GeekAPk API 要拿 Swagger 重写,那不知道要花多少时间呢
上面提到的 spec,我当时压根没写完,只定义了几个模型
但居然写了 503 行
我的脑子都快 struct 不了这个 YAML 文档了,一大堆二维文法,而且结构又复杂... 🤔
全是竖着的简直淡疼,如果没有 Schema 补齐、可以说 Swagger 这个工具就完全没有用了... (因为写 spec 将花费比现在很多 bootstrap 自动化方案更多的时间...)
(好吧,就是迫真自演 GeekSpec,但是,其实我希望能让它可以扩展一下来兼容 Swagger OpenAPI 3.0 YAML,我真的没有说骄傲什么的,比我牛逼的人很多,不缺一个只能写垃圾程序的 duangsuse
以后 GeekSpec 的更新版本或许会能作为 Swagger OpenAPI 的一种描述方式,也能有一个 OpenAPI 的后端
但居然写了 503 行
我的脑子都快 struct 不了这个 YAML 文档了,一大堆二维文法,而且结构又复杂... 🤔
全是竖着的简直淡疼,如果没有 Schema 补齐、可以说 Swagger 这个工具就完全没有用了... (因为写 spec 将花费比现在很多 bootstrap 自动化方案更多的时间...)
/{username}/token:
get:
tags:
- User
summary: Authorize user
operationId: getToken
parameters:
- name: password
in: query
description: User password
required: true
schema:
type: string
example: sa1tedFi$h
- name: username
in: path
description: User to get new token
schema:
type: string
example: duangsuse
required: true
responses:
200:
description: Got app access token
content:
application/json:
schema:
$ref: '#/components/schemas/AuthToken'
default:
description: Auth failed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
其实这么复杂的 OpenAPI 3.0 YAML 结构要表示的只是一个最简单最容易理解的定义(指民科的过度设计,但我觉得民科和前端打架还是民科赢 hhhh,实际上都没赢...):type datetime: string = Date我真的不想去学习『如何阅读几乎全是竖排的 YAML』... 所以想来要 GeekApk 利用 Swagger 好像有点难受(迫真
result OK: status = 200
data AuthToken "Authorization token"
= { token: string, expires: datetime }
## Begin API definition
== user
'''
Authorize user
*password: User password
'example_password'
*username: User to get new token
'duangsuse'
>OK: Got app access token
>*: Auth failed
'''
getToken(password: string, username-path: string)
-> (OK) AuthToken
(*) Error
= /:username/token
(好吧,就是迫真自演 GeekSpec,但是,其实我希望能让它可以扩展一下来兼容 Swagger OpenAPI 3.0 YAML,我真的没有说骄傲什么的,比我牛逼的人很多,不缺一个只能写垃圾程序的 duangsuse
以后 GeekSpec 的更新版本或许会能作为 Swagger OpenAPI 的一种描述方式,也能有一个 OpenAPI 的后端
duangsuse::Echo
上面提到的 spec,我当时压根没写完,只定义了几个模型 但居然写了 503 行 我的脑子都快 struct 不了这个 YAML 文档了,一大堆二维文法,而且结构又复杂... 🤔 全是竖着的简直淡疼,如果没有 Schema 补齐、可以说 Swagger 这个工具就完全没有用了... (因为写 spec 将花费比现在很多 bootstrap 自动化方案更多的时间...) /{username}/token: get: tags: - User summary:…
This media is not supported in your browser
VIEW IN TELEGRAM
对类型系统了解不够,还停留在 Java 的幼儿园级别...
其实 GeekSpec 还是蛮工程的,所以什么类型系统实际上就没有,不是那种通常 General-Purpose 意义下的类型系统
考虑一下 GeekSpec 类型的用途,就是标记一种数据类型,这种 HTTP 协议其实都有兼容的...(Content-Type,MIME 类型)
比如说 datetime,可能就是说绑定到原生的某种结构对象,和泛型什么的其实根本没关系(当然泛型也不是什么高级玩意)
其实对于 POSIX C 的 time_t 来说,一个所谓的
其实 GeekSpec 还是蛮工程的,所以什么类型系统实际上就没有,不是那种通常 General-Purpose 意义下的类型系统
考虑一下 GeekSpec 类型的用途,就是标记一种数据类型,这种 HTTP 协议其实都有兼容的...(Content-Type,MIME 类型)
比如说 datetime,可能就是说绑定到原生的某种结构对象,和泛型什么的其实根本没关系(当然泛型也不是什么高级玩意)
其实对于 POSIX C 的 time_t 来说,一个所谓的
datetime 或许可以这么表达?type datetime: string
= (C Linux) time_t
(Ruby) Time
read datetime {
#impl C Linux
return (time_t) atol(str);
#end
#impl Ruby
return Time.at(0, str.to_i, :millisecond)
#end
}
put datetime {
#impl C Linux
size_t size;
char *out;
size = snprinf(out, size, "%l", datetime);
if (size < 0) return NULL;
size++;
out = malloc(size);
if (out == NULL) return NULL;
size = snprintf(out, size, "%l", datetime);
if (size == 0) {
free(out);
return NULL;
}
return out;
#end
#impl Ruby
return sprintf('%i', datetime.tv_sec * 1000 + datetime.tv_usec)
#end
}
validate datetime {
#impl Ruby
str.match? /[0-9]+/
#end
}
路漫漫其修远兮 吾将上下而求索 🤔#JavaScript #frontend #Backend https://github.com/sindresorhus/is
对值进行类型检查,很甜、支持 TypeScript 的 Type guard(就是 Kotlin 的智能类型推导)
对值进行类型检查,很甜、支持 TypeScript 的 Type guard(就是 Kotlin 的智能类型推导)
function excited(arg) {
if (is.string(arg)) {
return arg + '!';
}
if (is.number(arg)) {
return arg & 1926;
}
}
['frog', -1].map(excited).forEach(console.log);GitHub
GitHub - sindresorhus/is: Type check values
Type check values. Contribute to sindresorhus/is development by creating an account on GitHub.
#GeekApk https://github.com/duangsuse/GeekApk/commit/ca554b78c042da018366f5138c6799bfe3707522
控制器逻辑的最后一道坎🤔
写完,就开始正式实现控制器逻辑了。
管理员用户验证已经实现了,手工测试正常(但是目前服务器好像不会自动创建第一个管理员用户,是个问题)
用户验证部分,估计一时间考虑的不周全,有些验证应该抽出来单独做的,然后有一个 general 一点的逻辑的可以用 middleware 实现
现在好像越写越没有信心了,大概是垃圾代码写多了(是真的,好多余赘代码、非常平铺直叙或者莫名其妙),时间拖长了(绝望)
我不想重构重构重构... 能用就可以,等待 v2 重写吧(绝望)
有没有愿意帮忙一起实现的(
控制器逻辑的最后一道坎🤔
写完,就开始正式实现控制器逻辑了。
管理员用户验证已经实现了,手工测试正常(但是目前服务器好像不会自动创建第一个管理员用户,是个问题)
用户验证部分,估计一时间考虑的不周全,有些验证应该抽出来单独做的,然后有一个 general 一点的逻辑的可以用 middleware 实现
现在好像越写越没有信心了,大概是垃圾代码写多了(是真的,好多余赘代码、非常平铺直叙或者莫名其妙),时间拖长了(绝望)
我不想重构重构重构... 能用就可以,等待 v2 重写吧(绝望)
有没有愿意帮忙一起实现的(
GitHub
Code(Filters): Implement authentication filters · duangsuse/GeekApk@ca554b7
- TODO: Implement logic for UserAuthentication
Forwarded from dnaugsuz
HTML 的代码都是 GeekSpec(就是 GeekApk 的 Swagger)测试项目里的视图模板(完成了,不需要操心),目前 Server 没有任何的 View Mapping(
Haskell 代码是没有任何业务代码的空壳(以后可能打算写来利用 GeekSpec DSL 生成代码),目前项目还没有用 Haskell,也不需要操心(别问我为什么不会 Scala)
JavaScript 的代码是不需要操心的,目前写的就是一个 GeekSpec DSL 的 Parser 和 GeekSpec 的 Kotlin+Spring API Endpoint 绑定代码生成器
Ruby 的就是一个 Spectrum + Spectrum Checks,第一个是 GeekApk 的 API 测试工具(也可以用于其他能被 GeekSpec 描述的 API)
第二个是基于 Spectrum API 客户端的黑盒接口测试
Groovy 的是一个小工具的代码(用 Groovy 只是为了方便从 Kotlin 类里读取数据,它也是个代(类似)码导出器),不需要考虑
Kotlin 才是需要写的,然而 Kotlin 语法结构很类似 Java,很多 Java 程序员一下子就可以入门(确信)
目前项目不需要测试驱动开发(因为我不想在一大堆测试不通过的情况下写代码...),也没有一个 OAuth、Message Queue、高级 CDI、外部验证库什么的,可以说是非常纯的 MC(没有 V),甚至每写一段逻辑都不需要写对应的自动化测试,所以说是小学生都会啊(比起那些真正的大佬来说,已经完全超离 MVC 的抽象,进入 HTTP 甚至 TCP/UDP 甚至 Socket 层了,序列化、持久化什么的都是自己搞)
而且只需要写基于 MVC 框架思维方式的很模式化的代码,所以我觉得对于任何有 J2EE MVC 经验的后端都不难
Haskell 代码是没有任何业务代码的空壳(以后可能打算写来利用 GeekSpec DSL 生成代码),目前项目还没有用 Haskell,也不需要操心(别问我为什么不会 Scala)
JavaScript 的代码是不需要操心的,目前写的就是一个 GeekSpec DSL 的 Parser 和 GeekSpec 的 Kotlin+Spring API Endpoint 绑定代码生成器
Ruby 的就是一个 Spectrum + Spectrum Checks,第一个是 GeekApk 的 API 测试工具(也可以用于其他能被 GeekSpec 描述的 API)
第二个是基于 Spectrum API 客户端的黑盒接口测试
Groovy 的是一个小工具的代码(用 Groovy 只是为了方便从 Kotlin 类里读取数据,它也是个代(类似)码导出器),不需要考虑
Kotlin 才是需要写的,然而 Kotlin 语法结构很类似 Java,很多 Java 程序员一下子就可以入门(确信)
目前项目不需要测试驱动开发(因为我不想在一大堆测试不通过的情况下写代码...),也没有一个 OAuth、Message Queue、高级 CDI、外部验证库什么的,可以说是非常纯的 MC(没有 V),甚至每写一段逻辑都不需要写对应的自动化测试,所以说是小学生都会啊(比起那些真正的大佬来说,已经完全超离 MVC 的抽象,进入 HTTP 甚至 TCP/UDP 甚至 Socket 层了,序列化、持久化什么的都是自己搞)
而且只需要写基于 MVC 框架思维方式的很模式化的代码,所以我觉得对于任何有 J2EE MVC 经验的后端都不难
Forwarded from duangsuse Throws
🤔我去我居然才想起来其实 CoolApk API v6 居然不是基于 RESTFul 的,而且设计上也有问题... (该用 DELETE 方法的全部用的是 POST,而且没有树形结构,就是所有 controller 平铺在 / 路径下)
GA v1 API 已经可怜垃圾至此了居然还有比 CoolApk v6 Api 好的地方.... 感动到不行。
为了庆祝顺便恢复一下失败感,决定拿 Spectrum 0.1.0 测试一下访问 CoolApk API,自然也包含逆向工程内容的(因为他们做了该死的验证...),限时两天。
GA v1 API 已经可怜垃圾至此了居然还有比 CoolApk v6 Api 好的地方.... 感动到不行。
为了庆祝顺便恢复一下失败感,决定拿 Spectrum 0.1.0 测试一下访问 CoolApk API,自然也包含逆向工程内容的(因为他们做了该死的验证...),限时两天。
GitHub
GitHub - bjzhou/Coolapk-kotlin: 酷安开源版.....
酷安开源版..... Contribute to bjzhou/Coolapk-kotlin development by creating an account on GitHub.
#dev 看到 TravisCI 的小绿勾瞬间爽到... 🤔
偶尔红叉一下很难受
偶尔红叉一下很难受
duangsuse::Echo
习惯性的在写 parser 🤔 可是觉得不如 Android 开发有时候用到的 Pattern 们和自己布局的 View 们,怕被喷。
这里为了兼容用的是 Ruby 的 ARGF 特殊文件... emmm
这个对象有时候是没有
我没法用 ungetc 实现 peek(从输入流拿到一个 char,然后放回去,用来实现简单的结构判定)
不得不说,不能 lookahead 非常淡疼(虽然我可以模拟 buffer 来实现 peek_char)
那么写不写这个 buffer 呢?算了...
这个对象有时候是没有
ungetc 方法的 🤪我没法用 ungetc 实现 peek(从输入流拿到一个 char,然后放回去,用来实现简单的结构判定)
不得不说,不能 lookahead 非常淡疼(虽然我可以模拟 buffer 来实现 peek_char)
那么写不写这个 buffer 呢?算了...
This media is not supported in your browser
VIEW IN TELEGRAM
这个 parser 不够好,但也足够用。只要能解析这个文件就可以了。
duangsuse::Echo
连这都不会的 duangsuse 总算写出来了... 🤔 不过是一个简单的 scannerless parser 而已就花了好多时间,这还能不能和任何一个懂一分钱设计模式的 Android 前端比呢... 希望哪天能回到 Android.
This media is not supported in your browser
VIEW IN TELEGRAM
HackingCoolApk.zip
31.7 KB
目前的工作目录 #CoolApk