Forwarded from dnaugsuz
也是和 drakeet 之前的事情弄的(
毕竟我也是有点看不太惯现在在 M$ 的离开大学五年然后技术除了熟练度几乎没有任何长进,一直在写简单的逻辑从未有过别的想法的... 呃... 虽然这是有点过分了
毕竟我也是有点看不太惯现在在 M$ 的离开大学五年然后技术除了熟练度几乎没有任何长进,一直在写简单的逻辑从未有过别的想法的... 呃... 虽然这是有点过分了
Forwarded from dnaugsuz
作为爱好者来看待
难道 Kotlin/Common 的程序员不是 JVM 程序员?
难道 String 不是 CharSequence?
难道 Kotlin/Common 的程序员不是 JVM 程序员?
难道 String 不是 CharSequence?
Forwarded from dnaugsuz
可是这也正是我曾经对他说的话,我个人并没有什么特别的在提高自己的地位...
我只是一直在尝试学习...
我只是一直在尝试学习...
Forwarded from dnaugsuz
学习是没有错的... 可能大家学的方向是有点不一样而已,但我真的是作为一个交际人,我相信我绝对不是自傲的
Forwarded from dnaugsuz
Forwarded from dnaugsuz
你说上面的,其实我自己大概也注意到了(因为我自我感觉,如果这些信息不准确,我可能会被喷,如果我把自己的姿态降到不能再低,显然信息准确性怎么样都好)
我说的比较随性,这也是因为平时在 @dsuse 里 CS 广播发多了的原因导致我总是这样不带感情的提这些东西...
希望你没有感觉自己被冒犯到就好 🐱
下面的
而是说所有『年轻人』都最好出来体验生活,多尝试一点...
我说的比较随性,这也是因为平时在 @dsuse 里 CS 广播发多了的原因导致我总是这样不带感情的提这些东西...
希望你没有感觉自己被冒犯到就好 🐱
下面的
但是年轻人 🐸
就是出来体验生活的,为什么不多尝试一点(
我可没有说我是长者呦,这里有一个地方误会了,因为我多加了个折行,其实我的意思是:但是年轻人就是出来体验生活的,为什么不多尝试一点(
我没有以『年轻人』称呼你(虽然似乎我高二比你大一点)而是说所有『年轻人』都最好出来体验生活,多尝试一点...
Telegram
duangsuse ¯\_(ツ)_/¯ | ∈ [E²PROM, 范畴论|单子] in TaR Party
过个两三年可能不是梦,但要看造化.... 如果你一直待在应用层不肯去看你平时收藏的 dalao blog 的话显然你也只能一直做应用层的事情... 不会有本质上的提升
我觉得... 虽然时间可以带来经验
但是年轻人 🐸
就是出来体验生活的,为什么不多尝试一点(
我觉得... 虽然时间可以带来经验
但是年轻人 🐸
就是出来体验生活的,为什么不多尝试一点(
Forwarded from AlPlank (Al Pt)
为了防止撞库攻击,很多人都建议任何密码相同(或相关)的用户修改自己的密码。
~想法~
所以,改成什么?
1.自己要能记忆
2.不同网站/程序不一样
3.不同密码之间无关连
思考了一下
希望:“即使断网也能查看密码”
所以要在本地完成计算。
同时“希望能在任何平台算出密码”
所以不想使用密码管理器。
~实施~
于是决定:
1.想好一个"盐"(可以有任何字符,长度也可以很大),记下来。
2.将其和要设置的网站的域名拼接
3.计算sha256
4.取最后几位作为该网站密码,位数建议多点(8-12)。
~问题~
优点?
即使有人脱了数据库,拿到了你的密码,也无法登录;
不需要密码管理软件,防止被密码管理软件坑到(也不需要钱钱购买);
缺点?
上一条中,如果针对你个人进行攻击,根据你的社会信息猜测盐值,或暴力猜测"盐"值(猜盐-计算sha256-比较脱库获得的网站密码)
需要手工记下sha256的最后几位,可能对记忆力不好的用户是个挑战。
可能的因为操作不当的漏洞?
在shell执行时,history里会留下记录;
如果偷懒复制粘贴,可能会被有剪贴板访问权限的程序偷了密码。
为什么sha256而不是md5?
因为其计算起来比md5慢,这样可以略微增加暴力破解者的计算成本,而对于用户,也不会感知缓慢。
copyright @AlPlank 1989-8103
#public
~想法~
所以,改成什么?
1.自己要能记忆
2.不同网站/程序不一样
3.不同密码之间无关连
思考了一下
希望:“即使断网也能查看密码”
所以要在本地完成计算。
同时“希望能在任何平台算出密码”
所以不想使用密码管理器。
~实施~
于是决定:
1.想好一个"盐"(可以有任何字符,长度也可以很大),记下来。
2.将其和要设置的网站的域名拼接
3.计算sha256
4.取最后几位作为该网站密码,位数建议多点(8-12)。
~问题~
优点?
即使有人脱了数据库,拿到了你的密码,也无法登录;
不需要密码管理软件,防止被密码管理软件坑到(也不需要钱钱购买);
缺点?
上一条中,如果针对你个人进行攻击,根据你的社会信息猜测盐值,或暴力猜测"盐"值(猜盐-计算sha256-比较脱库获得的网站密码)
需要手工记下sha256的最后几位,可能对记忆力不好的用户是个挑战。
可能的因为操作不当的漏洞?
在shell执行时,history里会留下记录;
如果偷懒复制粘贴,可能会被有剪贴板访问权限的程序偷了密码。
为什么sha256而不是md5?
因为其计算起来比md5慢,这样可以略微增加暴力破解者的计算成本,而对于用户,也不会感知缓慢。
copyright @AlPlank 1989-8103
#public
Forwarded from dnaugsuz
NLP 部分和我们编译原理的解析器理论是相通的,但首先
+ 我只会写比较好看的递归下降法解析器
+ 实际上在 Parser Compiler (Compiler Compiler, 比如 re2c, yacc, bison) 和 Scanner generator 领域(对应 Lex-Yacc Style Parsers)
他们基本都用 NFA, DFA 这种自动机(上面的 NFA, DFA 都只是根据下一个状态属性命名的自动状态机的类型)
实际上,函数式编程向的人们基本都会直接用一段程序的状态替代这种(到状态机匹配指令和状态表的)编译器 + 状态机
而且递归下降法也很快,基于递归下降和 LR 的解析组合子也能解析很多很复杂的文法,基于组合子自动机的也可以自动做诸如左递归消除的解析器优化
+ 不过,这是说编译原理里的解析器理论,和自然语言处理里的还是蛮不一样的
比如说,我们的语法可能是固定的
比如
define num = 1
define hundred = 100
define str = "Hello"
define yes = true define no = false (注意这里不需要换行,看上面的语法规则你就知道为什么)
当然如果 ';' 这个字符被视为空白也可以写成
define yes = true; define no = false
calculate "hello" .. " " .. "world"
calculate 1 + 1
二元表达式链看起来不是多么好办(但是可以左递归什么的,可以直接将优先级大的二元运算符比如 "*" "/" 表达式左右都结合优先级小的),不过自然语言处理要“处理”的问题可比这个简单的递归算法复杂得多
上面括号里的情况:
👆 比如说我们的语法可能是固定的
那 NLP 就不是这种情况喽,看 HanLP 它说它用了 Markov 链,这也是一种机器学习预测算法
看架构 NLP 的分词器显然要和解析器互相协作,依据两方的『猜测』决定最终的算法输出,这是我们编译原理里所没有的,何况它还支持监督学习自动识别单词和单词词性词类呢
不管怎么说建议你先学一下编译原理和简单的机器学习,比如 KNN、决策树、朴素贝叶丝分类器
以及语法,比如中文语法
自然语言处理虽然要做到极致的话,是不得不引入越来越多的分析和学习的,但是做事情也要看程度
LLVM Cookbook 的翻译者也是要学 NLP 的,不过他又半道学了一会编译原理,这是个不错的路径选择
你要学习的话,就赶快先试着自己写一个解释器看看,如果这样的能力都没有的话,自然语言处理是很难入门的,(新手村都出不了,跑)
而且最好先写点 NLP 的应用,比如说,主语推导?(将动词的隐式主语推导出来,显式输出出来)
+ 我只会写比较好看的递归下降法解析器
+ 实际上在 Parser Compiler (Compiler Compiler, 比如 re2c, yacc, bison) 和 Scanner generator 领域(对应 Lex-Yacc Style Parsers)
他们基本都用 NFA, DFA 这种自动机(上面的 NFA, DFA 都只是根据下一个状态属性命名的自动状态机的类型)
实际上,函数式编程向的人们基本都会直接用一段程序的状态替代这种(到状态机匹配指令和状态表的)编译器 + 状态机
而且递归下降法也很快,基于递归下降和 LR 的解析组合子也能解析很多很复杂的文法,基于组合子自动机的也可以自动做诸如左递归消除的解析器优化
+ 不过,这是说编译原理里的解析器理论,和自然语言处理里的还是蛮不一样的
比如说,我们的语法可能是固定的
program = many (_ statement _)猜猜这能匹配什么(当然即使是“辣鸡”的编译原理向解析器也有运算符结合处理的问题,对于不懂递归的人来说这有点烧脑,是真的)
statement
= define | calculate
where
define = string "define" _ identifier _ char '=' _ value
calculate = string "calculate" _ expr
identifier = [a-zA-Z_] [a-zA-Z0-9_]*
value
= litInt | litString | litBoolean
where
litInt = [0-9]+
litString = char '"' char* char '"'
litBoolean = string "true" | string "false"
expr
= intAdd | stringConcat | booleanAnd
where
intAdd = expr '+' expr
stringConcat = expr '..' expr
booleanAnd = expr 'and' expr
_ = spaces
比如
define num = 1
define hundred = 100
define str = "Hello"
define yes = true define no = false (注意这里不需要换行,看上面的语法规则你就知道为什么)
当然如果 ';' 这个字符被视为空白也可以写成
define yes = true; define no = false
calculate "hello" .. " " .. "world"
calculate 1 + 1
二元表达式链看起来不是多么好办(但是可以左递归什么的,可以直接将优先级大的二元运算符比如 "*" "/" 表达式左右都结合优先级小的),不过自然语言处理要“处理”的问题可比这个简单的递归算法复杂得多
上面括号里的情况:
(=) 的前面是规则的名字;后面是规则的模式one = "1" (|) 组合一组可能的模式,实际上它的结果是这些模式中任何一种 booleanLiteral = "true" | "false"这样实际上在解析规则的模式字面上定义了优先级,结合性问题估计也可以用类似手段去做
Expr = BinAddSub
BinAddSub
= AtomExp ("+" | "-") AtomExp
| BinMulDiv
BinMulDiv
= AtomExp ("*" | "/") AtomExp
| AtomExp
👆 比如说我们的语法可能是固定的
那 NLP 就不是这种情况喽,看 HanLP 它说它用了 Markov 链,这也是一种机器学习预测算法
看架构 NLP 的分词器显然要和解析器互相协作,依据两方的『猜测』决定最终的算法输出,这是我们编译原理里所没有的,何况它还支持监督学习自动识别单词和单词词性词类呢
不管怎么说建议你先学一下编译原理和简单的机器学习,比如 KNN、决策树、朴素贝叶丝分类器
以及语法,比如中文语法
自然语言处理虽然要做到极致的话,是不得不引入越来越多的分析和学习的,但是做事情也要看程度
LLVM Cookbook 的翻译者也是要学 NLP 的,不过他又半道学了一会编译原理,这是个不错的路径选择
你要学习的话,就赶快先试着自己写一个解释器看看,如果这样的能力都没有的话,自然语言处理是很难入门的,(新手村都出不了,跑)
而且最好先写点 NLP 的应用,比如说,主语推导?(将动词的隐式主语推导出来,显式输出出来)
GeekSpec 虽然非常不成熟(而且也没有技术支持...),但是它的确比 Swagger API Tools 的辣鸡 Schema-YAML 语法更优秀,它可以描述的东西是 OpenAPI 3.0 的一个子集
但是!它非常符合直觉,设想一下,如果你要在设计 API 的时候看着一大堆
我都不敢想是什么样子,OpenAPI 由一群连编译原理和 DSL、面向语言编程都没见过的前端『全栈』工程师来设计... 难道就没有人发现写 OpenAPI 的时候很淡疼?即使是 YAML 换了 JSON 也一样?
(不如隔壁 cucumber.io 它还有门 DSL)
对 GeekSpec 来说就不存在这个问题,它的定义式更简洁富于可读性
它是诞生于这条 (https://t.iss.one/dsuse/9017)广播的,我大概花了三四天... 整整三四天啊
对于动辄几十个 HTTP API 接口大一点的应用,直接用 OpenAPI 解决 HTTP 接口定义真的大丈夫?
(GeekSpec 是 Swagger YAML 的子类型、GeekSpec 实现了 Swagger OpenAPI Spec)
而且基于 GeekSpec 的定义上,还有 Spectrum 工具 (https://t.iss.one/dsuse/9120)(和信号处理无关)做辅助:
但是!它非常符合直觉,设想一下,如果你要在设计 API 的时候看着一大堆
非常空阔的缩进行,你定义一个参数还得按一下缩进,看一个接口有几个参数还得慢慢数,而连自己在设计的接口叫啥名字都不能被很快地看到的话...我都不敢想是什么样子,OpenAPI 由一群连编译原理和 DSL、面向语言编程都没见过的前端『全栈』工程师来设计... 难道就没有人发现写 OpenAPI 的时候很淡疼?即使是 YAML 换了 JSON 也一样?
(不如隔壁 cucumber.io 它还有门 DSL)
对 GeekSpec 来说就不存在这个问题,它的定义式更简洁富于可读性
它是诞生于这条 (https://t.iss.one/dsuse/9017)广播的,我大概花了三四天... 整整三四天啊
searchUser(type:String?{username,nickname,bio}, kw-path:String, sort:String?{created,followers}) -> array:GeekUser
= user/search/{kw}
想想这类接口,Swagger 又能把它写成几行呢?你写下面这种代码... 又要多花多长时间呢?对于动辄几十个 HTTP API 接口大一点的应用,直接用 OpenAPI 解决 HTTP 接口定义真的大丈夫?
getAllUsers() -> array:string = /users(当然这等价于)
GET@getAllUsers() -> array:string = /users如果你会(用 JavaScript 或者 Ruby)写稍微麻烦一点的算法,就能简单地把 GeekSpec 语言的代码转化为 YAML 结构,就可以实现 GeekSpec 语言对 Swagger Tools 的兼容
/users:
get:
summary: Returns a list of users.
description: Optional extended description in CommonMark or HTML.
responses:
"200": # status code
description: A JSON array of user names
content:
application/json:
schema:
type: array
items:
type: string
(GeekSpec 是 Swagger YAML 的子类型、GeekSpec 实现了 Swagger OpenAPI Spec)
而且基于 GeekSpec 的定义上,还有 Spectrum 工具 (https://t.iss.one/dsuse/9120)(和信号处理无关)做辅助:
spectrum(0.6)> status
[+] Total 67 APIs, method count: GET: 37; POST: 8; PUT: 11; DELETE: 11
receiving ["String", "UserId", "Int", "CategoryId", "AppId", "CommentId", "UserSize", "TimelineSize", "NotificationSize", "AppSize", "CommentSize"]
and returning 67 types (["string", "GeekUser", "Category", "App", "AppUpdate", "Timeline", "Notification", "number", "Comment"])
[+] 55 path params, 3 body params
spectrum(0.9)> tree :args
...
POST /admin/makeUser
* username:String
PUT /admin/resetMetaHash/{uid}
* uid-path:UserId
* shash:String?
而且还支持作为测试客户端spectrum(0.1)> listUser
[!] Arity mismatch: expected 3 (not optional 0), got 0
[*] NOTE: fill first optional argument to get started
listUser(sort:String?{created, followers}, sliceFrom:UserSize?, sliceTo:UserSize?) -> array:GeekUser
= GET user/all
spectrum(0.2)> listUser 'created'
=> {"timestamp"=>1549876643013,
"status"=>500,
"error"=>"Internal Server Error",
"message"=>"Optional int parameter 'sliceFrom' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.",
"path"=>"/user/all"}GitHub
duangsuse-valid-projects/GeekApk
GeekApk, the dying SpringBoot(a.k.a. Sping initializr) server for GeekApk(a.k.a 极安) (R - duangsuse-valid-projects/GeekApk
Forwarded from dnaugsuz
import Control.Applicative
data Move = U | D | L | R
deriving (Eq, Show, Read, Enum)
type Map = [[Bool]]
type Point = (Int, Int)
type Hitsory a = [a]
type TracedRoute = (History Move)
dfs :: Map -> Point -> History Point -> Maybe TracedRoute
dfs map target history step
| step == target = Just []
| step `outbounds` map = Nothing
| blocked or walked = Nothing
| otherwise
= firstJust (fmap try [Up, Down, Left, Right])
where这是个;它递归搜索一个
(x, y) = step
blocked = not (map !! x !! y)
walked = step `elem` history
outbounds p m = let (px, py) = p
in px >= length m or py >= length m !! px
tryDfs m t s = dfs m t [] s
boolean[][] 数组,返回从某一点到指定点的路径否则可以选择向正上/下/左/右方尝试移动
据说某个学校(指 CDLFS,成都某外国语学校)初中的 OI 生都会做
Forwarded from dnaugsuz
https://github.com/JetBrains/Exposed#sql-dsl-sample
好耶,比某些 Annotation based AOP 框架高到不知哪里去了
然后还可以使用 DataAccessObjects 的风格
好耶,比某些 Annotation based AOP 框架高到不知哪里去了
object Users : Table() {
// Column<out T>
val id = varchar("id", 10).primaryKey()
val name = varchar("name", length = 50)
val cityId = (integer("city_id") references Cities.id).nullable()
}
object Cities : Table() {
val id = integer("id").autoIncrement().primaryKey()
val name = varchar("name", 50)
}
...Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
transaction {
SchemaUtils.create (Cities, Users)
val saintPetersburgId = Cities.insert { it[name] = "St. Petersburg" } get Cities.id
Users.insert { it[id] = "andrey"; it[name] = "Andrey"; it[cityId] = saintPetersburgId }
}
...for (city in Cities.selectAll()) println("${city[Cities.id]}: ${city[Cities.name]}")
本来就应该使用这种风格的然后还可以使用 DataAccessObjects 的风格
object Users : IntIdTable() {
val name = varchar("name", 50).index()
val city = reference("city", Cities)
val age = integer("age")
}
class User(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<User>(Users)
var name by Users.name
var city by (City referencedOn Users.city).nullable()
var age by Users.age
}
...User.new {
name = "duangsuse"
age = 17
}GitHub
GitHub - JetBrains/Exposed: Kotlin SQL Framework
Kotlin SQL Framework. Contribute to JetBrains/Exposed development by creating an account on GitHub.