#blog #dalao #dip https://bokjan.com/ #recommended 看今日 @metowolf 的新 follow,是一个优秀的华南理工在读大牛,他学的是软件工程,写过一些信息学、计算机图形学、图论、操作系统的东西
https://github.com/Bokjan?tab=repositories GitHub
https://github.com/Bokjan?tab=repositories GitHub
Bokjan's
一緒に頑張りましょう!
duangsuse::Echo
今天看见了这个 bot 比较有意思,我们使用 PDL 来伪设计一下这个机器人 使用消息驱动编程,这是一个简单的 Telegram 平台 bot,不使用 inline bot(eg. 按钮菜单、@bot 选项) 功能。 我们的抽象: onHandleCommand (Command, MessageContext) 用户使用 /sucide 命令,或者会加上 bot 的用户名,就要将他封禁一段时间。 observe onHandleCommand(cmd, context) case cmd …
GitHub
GitHub - reo7sp/tgbot-cpp: C++ library for Telegram bot API
C++ library for Telegram bot API. Contribute to reo7sp/tgbot-cpp development by creating an account on GitHub.
duangsuse::Echo
今天看见了这个 bot 比较有意思,我们使用 PDL 来伪设计一下这个机器人 使用消息驱动编程,这是一个简单的 Telegram 平台 bot,不使用 inline bot(eg. 按钮菜单、@bot 选项) 功能。 我们的抽象: onHandleCommand (Command, MessageContext) 用户使用 /sucide 命令,或者会加上 bot 的用户名,就要将他封禁一段时间。 observe onHandleCommand(cmd, context) case cmd …
GitHub
Trumeet/SuicideBot
Just for fun :D. Contribute to Trumeet/SuicideBot development by creating an account on GitHub.
我编译安装了这个 #lib 正在编写程序业务逻辑
duangsuse::Echo
https://github.com/duangsuse/SuicideBot-Cpp 代码已经上传至 #GitHub #CPlusplus #project #Telegram
Tg bot :: Error! connect: Connection refused 🌚...我得找 Boost asio 写个支持 http_proxy 的 client... 欸
This media is not supported in your browser
VIEW IN TELEGRAM
/suicide @dSuicideBot
因为无效我就不继续折腾了... 我写个 JSON Parser 先吧... (汗)
那么我们来学学使用 #C CMake:
cmake_minimum_required(VERSION cmake_min_version)
project(project_name)
set(name value)
CMAKE_CXX_FLAGS
Boost_USE_MULTITHREADED
CMAKE_THREADS_LIBS_INIT
find_package(packageName [COMPONENTS {packageName}] [REQUIRED])
PKG_FOUND
PKG_INCLUDE_DIRS
PKG_LIBRARIES
include_directories(dirs)
add_definitions(defs)
if (case)
endif()
add_executable(targetName sources)
target_link_libraries(target libraries)
这就可以用来写简单的 CLI 程序了 🐱
那么我们来学学使用 #C CMake:
cmake_minimum_required(VERSION cmake_min_version)
project(project_name)
set(name value)
CMAKE_CXX_FLAGS
Boost_USE_MULTITHREADED
CMAKE_THREADS_LIBS_INIT
find_package(packageName [COMPONENTS {packageName}] [REQUIRED])
PKG_FOUND
PKG_INCLUDE_DIRS
PKG_LIBRARIES
include_directories(dirs)
add_definitions(defs)
if (case)
endif()
add_executable(targetName sources)
target_link_libraries(target libraries)
这就可以用来写简单的 CLI 程序了 🐱
停,现在是 DJson 的设计时间。今天暂时只来设计。 #Java
Json 是什么呢? json.org
Json 里可以有这些类型的『数据』
DJson 称之为『Type』,都可能为
java.io.DataInput
java.io.InputStream
java.io.File
java.lang.String
byte[]
java.net.URL
应该支持 UTF8 解码(或许利用 InputStreamReader),并且对于 InputStream、URL 支持顺带指定大小的 Buffer 快捷方式(利用 BufferedInputStream 机制)
—
它应该记录:
+ 输入流
+ 当前读取的文件名 fileName
+ 当前流位置 offset
+ 当前读取的行号 lineN
+ 当前读取的列号 columnN
+ 当前解析状态栈 stateStack
+ 当前解析标记栈 positionStack
它应该支持这些 combinator 方法(其实... 和 Haskell 的 ReadP 还是有很大区别的,但其实也能写 combinator style 的 parser...)
boolean eof()
int available()
void close()
char getChar()
char offset(int n)
void next()
void skip(int n)
StringBuilder lookAheadN(int n)
char lookAhead1()
boolean char(char x)
boolean containsIn(char... xs)
boolean containsIn(Set<Character> xs)
boolean lookAhead(String x)
boolean lookAhead(char x)
StringBuilder takeWhile(Consumer<Char> p)
StringBuilder takeUntil(Consumer<Char> p)
StringBuilder logWhile(Consumer<Char> p)
StringBuilder logUntil(Consumer<Char> p)
void dropWhile(Consumer<Char> p)
void dropUntil(Consumer<Char> p)
int tell()
void seek(int pos)
void begin(String state)
String readState()
void done()
void pushPosition()
int lastPosition()
void loadPosition()
void debug(String debugMessage)
void debug(String debugMessage, PrintStream output)
void fail(String message) throws TextCombinatorError
void asserts(boolean p, String message) throws TextCombinatorError
static Set<Character> range(char i1, char i2)
然后还有真正的 parser 的组合函数,要用到 Java 8 的
<T> T maybe(Parser<T>... parsers)
这样就可以这么匹配,不过只能
in.maybe(
charP("("),
satisfy((c) -> c == "A"),
some(element("1", "2", "3")),
many(elemnet(range("A", "Z"))))
这样,可以这么写一个 Json String Parser:
string
= " character* "
character
= ['0020' .. '10ffff'] - ["\]
| '\' escape
escape
= ["\/bnrt]
| u hex hex hex hex
hex
= digit
| [A-F] | [a-f]
digit = 0 | onenine
onenine = [1-9]
如果不能匹配就 reset 到之前的位置,两种 combinator style 都支持,一个作为后端(TextInputStream, TextReadStream)一个作为前面的封装(TextCombinator)... 🤔
Json 是什么呢? json.org
Json 里可以有这些类型的『数据』
DJson 称之为『Type』,都可能为
null(为了方便,和 JSON 定义相称)ObjectJ<Type>DJson 应该继承于一个 Text ParserCombinator 库,此库应该接受这些参数类型的 Constructor
ArrayJ<Type>
String
Number
Boolean
java.io.DataInput
java.io.InputStream
java.io.File
java.lang.String
byte[]
java.net.URL
应该支持 UTF8 解码(或许利用 InputStreamReader),并且对于 InputStream、URL 支持顺带指定大小的 Buffer 快捷方式(利用 BufferedInputStream 机制)
—
它应该记录:
+ 输入流
+ 当前读取的文件名 fileName
+ 当前流位置 offset
+ 当前读取的行号 lineN
+ 当前读取的列号 columnN
+ 当前解析状态栈 stateStack
+ 当前解析标记栈 positionStack
它应该支持这些 combinator 方法(其实... 和 Haskell 的 ReadP 还是有很大区别的,但其实也能写 combinator style 的 parser...)
boolean eof()
int available()
void close()
char getChar()
char offset(int n)
void next()
void skip(int n)
StringBuilder lookAheadN(int n)
char lookAhead1()
boolean char(char x)
boolean containsIn(char... xs)
boolean containsIn(Set<Character> xs)
boolean lookAhead(String x)
boolean lookAhead(char x)
StringBuilder takeWhile(Consumer<Char> p)
StringBuilder takeUntil(Consumer<Char> p)
StringBuilder logWhile(Consumer<Char> p)
StringBuilder logUntil(Consumer<Char> p)
void dropWhile(Consumer<Char> p)
void dropUntil(Consumer<Char> p)
int tell()
void seek(int pos)
void begin(String state)
String readState()
void done()
void pushPosition()
int lastPosition()
void loadPosition()
void debug(String debugMessage)
void debug(String debugMessage, PrintStream output)
void fail(String message) throws TextCombinatorError
void asserts(boolean p, String message) throws TextCombinatorError
static Set<Character> range(char i1, char i2)
然后还有真正的 parser 的组合函数,要用到 Java 8 的
:: 语法<T> T maybe(Parser<T>... parsers)
这样就可以这么匹配,不过只能
in.maybe(
charP("("),
satisfy((c) -> c == "A"),
some(element("1", "2", "3")),
many(elemnet(range("A", "Z"))))
这样,可以这么写一个 Json String Parser:
string
= " character* "
character
= ['0020' .. '10ffff'] - ["\]
| '\' escape
escape
= ["\/bnrt]
| u hex hex hex hex
hex
= digit
| [A-F] | [a-f]
digit = 0 | onenine
onenine = [1-9]
如果不能匹配就 reset 到之前的位置,两种 combinator style 都支持,一个作为后端(TextInputStream, TextReadStream)一个作为前面的封装(TextCombinator)... 🤔
duangsuse::Echo
停,现在是 DJson 的设计时间。今天暂时只来设计。 #Java Json 是什么呢? json.org Json 里可以有这些类型的『数据』 DJson 称之为『Type』,都可能为 null(为了方便,和 JSON 定义相称) ObjectJ<Type> ArrayJ<Type> String Number Boolean DJson 应该继承于一个 Text ParserCombinator 库,此库应该接受这些参数类型的 Constructor java.io.DataInput j…
顺便一说,DJson 希望有泛型的
但是... 其实 Java 没有真泛型,是泛型擦除实现的泛型... 没有办法拿到
我开始是想
可是真的不可以啊... 泛型里无法拿到任何的类型参数信息呢,除非用 Kotlin
后来... 我觉得还是专门设立一个类似 hamcrest 的 pattern match 检查器好,多道 pass 也没什么的
这样可以
ObjectJ<T extends Type> 什么的其实是希望可以这样: 😫DJson然后假设这么干可以边解析边检查类型(
.fromString("{a:1}")
.into(new ObjectJ<Number>())
.doParse();
但是... 其实 Java 没有真泛型,是泛型擦除实现的泛型... 没有办法拿到
T 的 java.lang.Class<T> 实例...我开始是想
interface 里也能为类指定 static 方法限定的... 这样我用 T.getClass() 什么的就可以进行类型检查了可是真的不可以啊... 泛型里无法拿到任何的类型参数信息呢,除非用 Kotlin
reified Generics后来... 我觉得还是专门设立一个类似 hamcrest 的 pattern match 检查器好,多道 pass 也没什么的
这样可以
DJson或许好一点吧...
.fromString("{ary:[1]}")
.typed(new ObjectJ(new ArrayJ(new NumberJ())))
.doParse()
#pl #cs #plt #recommended https://tinyurl.com/y8xdlfug
冰封的简历... 人家 18 年去宾夕法尼亚州立大学学计算机科学现在有半年多了呃...
IDE 和 Parser、Compiler、Type system、静态分析什么的自然是编译器工程师必须要会的了... 可是冰封还有 Rust 和分布式计算、并行计算、计算机网络、图形前端开发、形式化验证、二进制级别理解等技能,真的是让人... 不可理喻啊 🤪
不过话说起来,复杂的都能解决了这些码农级别或者算法的东西也就不成问题了,何况曾经写过 #OI...
看份简历,居然顺便知道了到底啥是 (依赖类型术语) dependent product type (Pi type) 啥是 dependent pair type(Sigma type),还顺带了解了啥是 Sum type (Tagged Union) 啥是 Product type 啥是 case split... 果然是 🐮🍺 啊....
冰封的简历... 人家 18 年去宾夕法尼亚州立大学学计算机科学现在有半年多了呃...
IDE 和 Parser、Compiler、Type system、静态分析什么的自然是编译器工程师必须要会的了... 可是冰封还有 Rust 和分布式计算、并行计算、计算机网络、图形前端开发、形式化验证、二进制级别理解等技能,真的是让人... 不可理喻啊 🤪
不过话说起来,复杂的都能解决了这些码农级别或者算法的东西也就不成问题了,何况曾经写过 #OI...
看份简历,居然顺便知道了到底啥是 (依赖类型术语) dependent product type (Pi type) 啥是 dependent pair type(Sigma type),还顺带了解了啥是 Sum type (Tagged Union) 啥是 Product type 啥是 case split... 果然是 🐮🍺 啊....