永久封存 | Yuuta 台 | 😷 #Pray4Wuhan
仔细观察了日志,发现日志从 28% 到结尾均有各种 Vertx Thread Blocked 异常,从 5s ~ 12s 不等。同时在 Arrays#copyOf、vertx-blocked-thread-checker 线程、OkHttp ConnectionPool 线程、vert.x-eventloop-thread-0 等地方均发生 OOM 异常。
其实可以把 Native 堆给开大点?
-Xmn500M
这样说不定不会 OOM 了,如果只是因为 native memory 限制太大
duangsuse::Echo
其实可以把 Native 堆给开大点?-Xmn500M 这样说不定不会 OOM 了,如果只是因为 native memory 限制太大
https://docs.oracle.com/javase/9/vm/native-memory-tracking.htm#JSJVM-GUID-710CAEA1-7C6D-4D80-AB0C-B0958E329407
https://docs.oracle.com/javase/9/gctuning/ergonomics.htm#JSGCT-GUID-DB4CAE94-2041-4A16-90EC-6AE3D91EC1F1
https://docs.oracle.com/javase/9/gctuning/ergonomics.htm#JSGCT-GUID-DB4CAE94-2041-4A16-90EC-6AE3D91EC1F1
Oracle
Native Memory Tracking
This chapter describes the Native Memory Tracking (NMT) feature. NMT is a Java Hotspot VM feature that tracks internal memory usage for a HotSpot VM. You can access NMT data by using the jcmd utility. NMT does not track memory allocations for third-party…
我们这里也搞过,后来我强行卸了硬盘保护系统... 结果辣鸡 BIOS 只能从 PCI 启动,电脑坏了... 后来老师拆了还原卡又重装了保护系统... 所以我只能 VM #School
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (YuutaW 鱼塔)
雾草 学校电脑 🐮🍺,从 U 盘启动需要管理员密码 🌚
#freedom 总算能用了.... 蓐羊毛翻墙日益艰难?🌚🐕
https://github.com/RikkaApps/Riru/tree/master/riru-core/jni/main
#C 欸我真想写一篇分析的... 可惜自己事情又多
很想学学写 C++,虽然我不是真正意义上不会 C++... 只是 C++ 模板和 constexpr 函数式编程比其他不常用一些而已了。
#C 欸我真想写一篇分析的... 可惜自己事情又多
很想学学写 C++,虽然我不是真正意义上不会 C++... 只是 C++ 模板和 constexpr 函数式编程比其他不常用一些而已了。
GitHub
RikkaApps/Riru
Inject zygote process by replace libmemtrack. Contribute to RikkaApps/Riru development by creating an account on GitHub.
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
顺便一说,DJson 希望有泛型的 ObjectJ<T extends Type> 什么的其实是希望可以这样: 😫 DJson .fromString("{a:1}") .into(new ObjectJ<Number>()) .doParse(); 然后假设这么干可以边解析边检查类型( 但是... 其实 Java 没有真泛型,是泛型擦除实现的泛型... 没有办法拿到 T 的 java.lang.Class<T> 实例... 我开始是想 interface 里也能为类指定 static 方法限定的...…
那个,突然想到如果能拿到 instance 的话是可以使用
上面的是说错了(
Object#getClass() 拿到 Class 的,而 T.getClass() 就不存在,Java 里类就是类对象就是对象,要不然就是静态方法了,不过那就不能编译期检查的(其实可能希望能利用泛型检查)。上面的是说错了(
duangsuse::Echo
@FunctionalInterface interface Parser<R> { @Nullable <? extends R> match(); } @FunctionalInterface interface Matcher<R> { @Nullable boolean matches(<? super R> value); } 所以提供的 parser combinator 方法都有 Parser<R> satisfy(Matcher<Character> predicate); charP…
duangsuse::Echo
草,没时间写了
再 #fix...
这个实际上是错的,因为我把
这是属于不熟练...
这个实际上是错的,因为我把
Main class 直接放在 source dir 下了... 本来应该放在package org.duangsuse.djson; 的这是属于不熟练...
duangsuse::Echo
那个,突然想到如果能拿到 instance 的话是可以使用 Object#getClass() 拿到 Class 的,而 T.getClass() 就不存在,Java 里类就是类对象就是对象,要不然就是静态方法了,不过那就不能编译期检查的(其实可能希望能利用泛型检查)。 上面的是说错了(
This media is not supported in your browser
VIEW IN TELEGRAM
#Java "大佬"(对一些喜欢叫别人大佬的人来说) 错误三连
duangsuse::Echo
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。 当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animat…
这里还有一个 "bitselector" 的问题,我待会更新... #fix #bin
0b0001 = 2^0 = 0x1
0b0010 = 2^1 = 0x2
0b0100 = 2^2 = 0x4
0b1000 = 2^3 = 0x8
然后可以直接对应到 16 进制的,每 4 位 2 进制都可以对应到一位 16 进制
但其实是不对的,我之前以为 16 进制不真正能做 2 进制的简记法,现在知道了...
irb(main):001:0> 0x01000000.to_s(2).size记得上面的表吗?
=> 25
irb(main):002:0> 0x80_00_00_00.to_s(2).size
=> 32
0b0001 = 2^0 = 0x1
0b0010 = 2^1 = 0x2
0b0100 = 2^2 = 0x4
0b1000 = 2^3 = 0x8
然后可以直接对应到 16 进制的,每 4 位 2 进制都可以对应到一位 16 进制
Math.log2(16) #=> 4.0没有影响到程序的正确性(因为 C 的
if (...) 真值就是 0 false 其他都是 true,这里按位和 (&) 运算就算是使用 0xffffffff 也没问题,只要不是 0x0)但其实是不对的,我之前以为 16 进制不真正能做 2 进制的简记法,现在知道了...
#fix #Java 上次本频道和频道主 @duangsuse 大幅误人子弟,实在是令人... 呃,我以后多编程、多写文档和设计草稿、多做算法设计,少直接 Telegram 上说话,少误人子弟了... 🤐
Forwarded from dnaugsuz
对不起,误人子弟了(
Forwarded from dnaugsuz
我到学校的路上就思量着我写的一些东西,发现不对,好丢脸(
Forwarded from dnaugsuz
开始的时候我是误会了
其实这个正则表达式就是匹配这种模式:
1. <字符串起始> "sspai.com" <字符串结束>
2. ".sspai.com" <字符串结束>
但是我脑子一热就直接说等价
1. <字符串起始> [ "." ] "sspai.com" <字符串结束>
其中,尖括号 <> 包裹的文本是必须出现的文本(按其内容字面含义理解),空格无语义、 "" 包裹的是字符串,若输入内容匹配则匹配,
我知道这很智障,但是... 当时要上学了没时间就出错了... 类似的还有我把 Java 7 的泛型写错了... 都会待会改过来
当然匹配过程也可以理解如下(如果你想知道的话,虽然用于从序列提取结构的解析器也未必真的是非常简单的内容,虽然也没有刻意专门保存流位置允许重新匹配分支的)
^ 和 | 的含义,以为 ^ (输入流起始模式, [pattern])一定会匹配的(其实还真不一定... 我真的是糊涂了),所以说 \. 这个单独的 "." 有没有匹配都一样其实这个正则表达式就是匹配这种模式:
1. <字符串起始> "sspai.com" <字符串结束>
2. ".sspai.com" <字符串结束>
但是我脑子一热就直接说等价
1. <字符串起始> [ "." ] "sspai.com" <字符串结束>
其中,尖括号 <> 包裹的文本是必须出现的文本(按其内容字面含义理解),空格无语义、 "" 包裹的是字符串,若输入内容匹配则匹配,
[] 包裹的是可选内容。我知道这很智障,但是... 当时要上学了没时间就出错了... 类似的还有我把 Java 7 的泛型写错了... 都会待会改过来
当然匹配过程也可以理解如下(如果你想知道的话,虽然用于从序列提取结构的解析器也未必真的是非常简单的内容,虽然也没有刻意专门保存流位置允许重新匹配分支的)
static final boolean _match(final String input) {
// (^|\.)sspai.com$
// case ^sspai.com$
if (input == "sspai.com")
return true;
final StringStream s = new StringStream(input);
// case \.sspai.com$ otherwise
retry:
switch (s.next()) {
case '.':
if (s.startsWith("sspai.com")) // "." "sspai.com"
if (s.isEos()) return true; // $
default: goto retry;
}
return false;
}
static final boolean match(final String input) {
try { return _match(input); }
catch (EOFException ignored) { return false; }
}#Android 说到这里, duangsuse 这周啥都没学(暂时有一段时间我可能『停止学习』),给 GeekApk 设计了很棒的东西,有一些概念了,但是具体算法和面向对象分析设计依然在准备中,其中就包括一个 GeekApk 3 时打算加入的 ApkPool 服务,它就可以利用 MultiMap、CountedHashSet、LineDiff/ByteDiff、Class Program Logic Idenity 等数据结构和算法实现对不同应用使用的 Dex 代码(能够利用 PLI 和自然语言分词算法进行自动反混淆和自动类名选择处理)、大型 native library file(如果 BuildID 没问题的话,指不是应用项目本身根据源代码编译来的库文件)、raw file、resource file、resources 以及修订号版本之间的完全记录和差分压缩(增加、删除、修改、重命名),这意味着如果我能设计出类似的算法,再后来 GeekApk 将拥有又一个不错的新技术(虽然已经有相当多了),并且能够将用户能直接引用查看的信息量提到最高(完全解析应用清单和资源包,不仅仅是一个权限列表一个包名、应用名、版本号、修订、hash checksum、size、minSdkVersion、signature、语言支持什么的了,还有更多!还支持使用 PPQL 查询软件包、统计数据!),把下载的数据流量降到最低(因为如果 ApkPool 有某些软件包,就可以使用策略下载功能自动复用一组下载任务里所有能够复用的数据文件了)
dnaugsuz
开始的时候我是误会了 ^ 和 | 的含义,以为 ^ (输入流起始模式, [pattern])一定会匹配的(其实还真不一定... 我真的是糊涂了),所以说 \. 这个单独的 "." 有没有匹配都一样 其实这个正则表达式就是匹配这种模式: 1. <字符串起始> "sspai.com" <字符串结束> 2. ".sspai.com" <字符串结束> 但是我脑子一热就直接说等价 1. <字符串起始> [ "." ] "sspai.com" <字符串结束> 其中,尖括号 <> 包裹的文本是必须出现的文本(…
duangsuse 想着再复习一下使用 #Haskell 编写递归算法
递归算法是相当有用的算法,真的
比如说,你想遍历一个二维矩阵:
[[0,1],[2,3],[4,5]]
首先 this = $0; depth = 1; size = 3
for (i0 in 0..3)
[0,1].printMatrix(0)
[2,3].printMatrix(0)
[4,5].printMatrix(0)
再有一三维矩阵
[
[[0, 1], [2, 3], [4, 5]],
[[2, 3], [4, 5], [6, 7]]
]
for (i0 in 0..2) // depth = 2
for (i0' in 0..3) // d = 1
// print tip matrix
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0' in 0..3) // d = 1
// print tip matrix
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0'' in 0..2)
递归下去,这就完了。 🤔
考虑到新手友好性不写 Haskell,我不会 Scala 也不熟悉 Clojure
我打算顺便练习一下使用
就这样,输出所有组合:
比如说 foldr 操作符
比如,Java 里的
a b 是 HM 的类型变量,类似 Jawa 这种幼儿园语言的泛型
接受
接受
接受
的函数
的函数
用 Kotlin 写就是
当然,GHC 自带类型推导算法,可以推导出 foldr 的类型(Haskell 使用的是 Hindley-Milner 类型系统,可以使用一种 unification 『一致化』算法进行类型推导,我看到了一篇被人抄下来的论文,如果我以后有机会就会实现并讲一下...),后面的定义也很直觉
foldr (+) 0 [1, 2, 3]
= foldr (\x y -> x + y) 0 (1 : 2 : 3 : [])
{- 如果处理列表是空(Nil 构造器),则结果是 v(而 f 的第一个参数就是 x,列表不为空则肯定有一个 x) -}
{- 每次递归都插入一个 f x,f 的第二个参数则要等下一个 xs tail list 的递归完成,最后则够造出类似这样的表达式 -}
= f 1 (f 2 (f 3 (f v)))
\ 是 Haskell 里的 lambda,一个 Lexical Scoping 的匿名函数
递归算法是相当有用的算法,真的
比如说,你想遍历一个二维矩阵:
for (i in 0..m)可是要遍历一个 n 维矩阵,打印出所有项就不行了,虽然不一定是循环做不到的(也可以利用类似 LIFO 栈的结构,是吧,对深度优先搜索、广度优先搜索也是一个道理)
for (j in 0..n)
print(Matrix[i][j])
fun List.printMatrix(int depth)这样,有一二维矩阵:
if (this.size = 0) return
if (depth = 0) this.forEach(::print).also { println() }
for (i0 in 0..this.size)
i0.printMatrix(depth - 1)
[[0,1],[2,3],[4,5]]
首先 this = $0; depth = 1; size = 3
for (i0 in 0..3)
[0,1].printMatrix(0)
[2,3].printMatrix(0)
[4,5].printMatrix(0)
再有一三维矩阵
[
[[0, 1], [2, 3], [4, 5]],
[[2, 3], [4, 5], [6, 7]]
]
for (i0 in 0..2) // depth = 2
for (i0' in 0..3) // d = 1
// print tip matrix
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0' in 0..3) // d = 1
// print tip matrix
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0'' in 0..2)
递归下去,这就完了。 🤔
考虑到新手友好性不写 Haskell,我不会 Scala 也不熟悉 Clojure
我打算顺便练习一下使用
Text.ParserCombinators.ReadP 来解析文本结构,得出 datatype就这样,输出所有组合:
(a|b)c输出列表: ["ac", "bc"]
c(d|e)输出列表:["cd", "ce"]
a(b|c)de(f|g)h输出列表
[Haskell 真的是一门不错的语言,如果可以的话,它真的最好诠释了 JetBrains MPS 的『面向语言编程』 — 最直白的表示形式给你最好的直觉
"abdefh",
"abdegh",
"acdefh",
"acdegh"
]
比如说 foldr 操作符
foldr :: (a -> b -> b) -> b -> ([a] -> [b])
foldr f v [] = v
foldr f v (x : xs) = f x (foldr f v xs)
:: 意味着『has type』 #Learn() 就是普通的『数学上的括号』,它改变操作符结合性,使得 (1 + 1) * 2 可以等于 4 (而不是 1+(1*2) = 3)-> 是 Haskell 的函数类型中缀构造器,它创造一个一元函数(单输入单输出,可以进行柯里化方便函数式箭头操作)比如,Java 里的
Integer.parseInt,用上面的表达方法可以是:Integer.parseInt :: java.lang.String -> java.lang.Integer
那么 (a -> b -> b) 就是说一个函数,接受一个 a 类型的参数,返回一个函数,它接受一个 b 类型的参数,返回一个 b 类型的实例(左结合)a b 是 HM 的类型变量,类似 Jawa 这种幼儿园语言的泛型
foldr :: (a -> b -> b) -> b -> ([a] -> [b])
就是说 foldr 是一个:接受
((a -> b) -> b) 这一函数类型,返回接受
b 类型,返回接受
List a 类型,返回 List b 类型实例的函数的函数
的函数
用 Kotlin 写就是
fun <A, B> foldr(f: (A) -> (B) -> B, v: B): (List<A>) -> List<B>
可见 Type variable 和泛化类型还是很相似的(当然,GHC 自带类型推导算法,可以推导出 foldr 的类型(Haskell 使用的是 Hindley-Milner 类型系统,可以使用一种 unification 『一致化』算法进行类型推导,我看到了一篇被人抄下来的论文,如果我以后有机会就会实现并讲一下...),后面的定义也很直觉
foldr f v [] = v
foldr f v (x : xs) = f x (foldr f v xs)
想象一下,这就是一个『插入』操作符,foldr (+) 0 [1, 2, 3]
= foldr (\x y -> x + y) 0 (1 : 2 : 3 : [])
{- 如果处理列表是空(Nil 构造器),则结果是 v(而 f 的第一个参数就是 x,列表不为空则肯定有一个 x) -}
{- 每次递归都插入一个 f x,f 的第二个参数则要等下一个 xs tail list 的递归完成,最后则够造出类似这样的表达式 -}
= f 1 (f 2 (f 3 (f v)))
\ 是 Haskell 里的 lambda,一个 Lexical Scoping 的匿名函数
List 可以这么理解data List' a = Cons a (List' a) | Nil或者说
data List a where多看看就理解了... 虽然还有很多不说🤔
Cons :: a -> List a -> List a
Nil :: List a
infixl 3 :->
(:) = Cons
[] = Nil
GitHub
antlr/grammars-v4
Grammars written for ANTLR v4; expectation that the grammars are free of actions. - antlr/grammars-v4