Forwarded from dnaugsuz
SpringBoot 里有低级(数据库 Schema 和查询)的 Repository 和高级的 Service(实体集合操作的高层抽象)
比如说这里有一个 People
比如说这里有一个 People
@Table(name = "people")然后可以有 PeopleRepository 和 PeopleService
@Entity
data class Person (@Id @GeneratedValue(strategy = GenerationType.IDENTITY) val name: PeopleId, val age: Int): Serializable
@Repository interface PeopleRepository : CrudRepository<People, PeopleId>
@Service class PeopleService :
PeopleRepository {
@Autowired lateinit val repo: PeopleRepository
fun makePeople(name: String, age: Int) ...
}
然后你的应用里可以用 SpringBoot 的依赖注入直接拿到服务的接口实例
duangsuse::Echo
最后在铺垫了这么多之后我们可以看看 Java 基本型的位长度了: 所谓基本型就是: byte short int long float double char boolean == Java 可以对这些『基元类型』进行打包(到 Java Heap,堆上,用于 pass-by-reference 等,一般 int 等类型都是按值复制“传递” pass-by-value 的) === 传递和堆上存储 private class Product2 { String name, int value;…
接上面没有写完的:
最终结果:
https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats
Float 有 24 个二进制位的有效数值,Double 则有 53 个
JavaScript 的 Number 默认为 Double,不过 ES6 也加入了 Integer 和 Integer literal
实际上一些语言里 True False 完全可以只是一个类型的数据构造器而已...
比如 Haskell:
====
完结撒花! 🌸
尾记:
上面的东西意义不明确,而且有点冗长
有人可能会说我写东西经常这样(废话一大堆)
其实这正是我的风格,我有这样先写 background 的习惯,
不同于其他很多人(尤其是学院派),我会把一些比较难理解的东西一遍一遍的重复,这是为了能更好的记住他们,顺带多传播点信息
就是这样,喵。
最终结果:
assertSignedMinMax(8, Byte.class)
assertSignedMinMax(16, Short.class)
assertSignedMinMax(32, Integer.class)
assertSignedMinMax(64, Long.class)
这是整形Float.MIN_VALUE //=> 1.4E-45这是实型(准确的说只是有理数不是实数)
Float.MAX_VALUE //=> 3.4028235E38
Double.MIN_VALUE //=> 4.9E-324
Double.MAX_VALUE //=> 1.7976931348623157E308
https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats
Float 有 24 个二进制位的有效数值,Double 则有 53 个
JavaScript 的 Number 默认为 Double,不过 ES6 也加入了 Integer 和 Integer literal
1000n
Character 的最小值为 0,想也知道(往下肯定不是 Unicode 有效的,再说还有下面的 unsigned)(int) Character.MIN_VALUE //=> 0
(int) Character.MAX_VALUE //=> 65535
最大值是 2 ^ sizeof(unsigned short)
Boolean 是完全可枚举的(理论上或者实践上或者语义上),就不需要认为它是 Number 了实际上一些语言里 True False 完全可以只是一个类型的数据构造器而已...
比如 Haskell:
data Boolean = True | False deriving (Eq, Show, Read, Enum)
比如 Agda:data Bool: Type0 where
true false : Bool
https://agda.github.io/agda-stdlib/Agda.Builtin.Bool.html====
完结撒花! 🌸
尾记:
上面的东西意义不明确,而且有点冗长
有人可能会说我写东西经常这样(废话一大堆)
其实这正是我的风格,我有这样先写 background 的习惯,
不同于其他很多人(尤其是学院派),我会把一些比较难理解的东西一遍一遍的重复,这是为了能更好的记住他们,顺带多传播点信息
就是这样,喵。
#Math #music
最近知道了两个之前不知道的芝士: 🤔
+ 音高是什么!
+ x 的 (n 的倒数次方)等于开 x 的 n 次方根
where
n 的倒数: 1 / n
x 的 k 次方: x {* x} repeats for (k-1) times
n 的 k 次方根: (x 的 k 次方 = n) => x
+ 数学函数和数学操作符是不一样的
最近知道了两个之前不知道的芝士: 🤔
+ 音高是什么!
+ x 的 (n 的倒数次方)等于开 x 的 n 次方根
where
n 的倒数: 1 / n
x 的 k 次方: x {* x} repeats for (k-1) times
n 的 k 次方根: (x 的 k 次方 = n) => x
+ 数学函数和数学操作符是不一样的
Telegram
duangsuse::Echo
咳咳,我记得上一段时间的确发了一个说“暂停学习”的广播来着,现在找不到了...(可能是,我的确停止学习了很久吧)
这两周才开始继续看起来一些东西,
《Rustonomicon》(我当时打印的是英文版,这本书是写 Rust 程序设计语言实现底层一点的算法结构库的、也提到了不少 Rust 的细节,和任何『安全』系统编程,虽然这里主要是数据结构,需要考虑的东西,比如异常安全和指针别名、零长类型、原子性和并发安全、OS/Hardware 的实现细节什么的)
《Kotlin 极简教程》(书写的这么好,我很后悔…
这两周才开始继续看起来一些东西,
《Rustonomicon》(我当时打印的是英文版,这本书是写 Rust 程序设计语言实现底层一点的算法结构库的、也提到了不少 Rust 的细节,和任何『安全』系统编程,虽然这里主要是数据结构,需要考虑的东西,比如异常安全和指针别名、零长类型、原子性和并发安全、OS/Hardware 的实现细节什么的)
《Kotlin 极简教程》(书写的这么好,我很后悔…
duangsuse::Echo
#Math #music 最近知道了两个之前不知道的芝士: 🤔 + 音高是什么! + x 的 (n 的倒数次方)等于开 x 的 n 次方根 where n 的倒数: 1 / n x 的 k 次方: x {* x} repeats for (k-1) times n 的 k 次方根: (x 的 k 次方 = n) => x + 数学函数和数学操作符是不一样的
#tech #daily #Java #JavaScript #dev
🐱 duangsuse 的学习日常 ⭐️
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容)
+ 高性能计算::C 语言和高性能计算、x86 汇编和 SIMD(单指令多数据)运算、JNI 外置原生算法
+ 软件架构::FFMpeg av* 库水印程序
+ 数据库::关系代数 #db
+ {Android, 数据结构和算法}::Android 的离散数组 SparseArray 和 ArrayMap #algorithm
+ 数据结构和算法::这些算法和数据结构,忘记了吗?
+ Rust/数据结构和算法::Rust 的 Vector 实现
+ Rust::Hole 类型、snappy 绑定、Tree 类型、LinkedList、Box、Rc、std::thread 等
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写一个 Android 上的 Service!(感谢 @YuutaW 提供学习资源,ShutdownService 默写)
+ 软件项目管理::Gradle 的抽象总结
+ JavaScript ES6: sm.ms.js
+ JavaScript ES6: 基于 CheerIO 和 Requests.js-promise-native 的爬虫,默写(感谢 @ice1000 的原实现,这可能是冰封哥有史以来最奇怪的代码,因为他写了两个完全可以被替换为更有意义结构的没有用的控制结构...)
+ JavaScript ES6: ArrayBuffer, DataView 读 BMP、再看 ASCII 艺术画生成
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ Kotlin::Shell execute
+ Kotlin::Coroutine
+ Kotlin::Kotlin Native 和 Kotlin JavaScript 与 Gradle/Groovy
+ Kotlin HTML DSL
+ Kotlin 内部代理类 (Delegates)
+ Kotlin OkHttp 同步/异步封装
+ C 程序设计语言::libBMP 和 libWAV
+ C 程序设计语言::OpenGL 体验
+ 无脑模式::线性代数::高斯·约当消元法(Gauss Jordan)解齐次线性方程组(Homogenuous Linear Equation Group)
+ 无脑模式::C++/Qt::拼音分词、英文音标转换和 TTS 合成
+ 无脑模式::Haskell 抄写 Haskell 的 AlgorithmW Hindley-Milner Type system type infer algorithm 实现
+ Javax Servlet 架构体验 🤔
🐱 duangsuse 的学习日常 ⭐️
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容)
+ 高性能计算::C 语言和高性能计算、x86 汇编和 SIMD(单指令多数据)运算、JNI 外置原生算法
+ 软件架构::FFMpeg av* 库水印程序
+ 数据库::关系代数 #db
+ {Android, 数据结构和算法}::Android 的离散数组 SparseArray 和 ArrayMap #algorithm
+ 数据结构和算法::这些算法和数据结构,忘记了吗?
+ Rust/数据结构和算法::Rust 的 Vector 实现
+ Rust::Hole 类型、snappy 绑定、Tree 类型、LinkedList、Box、Rc、std::thread 等
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写一个 Android 上的 Service!(感谢 @YuutaW 提供学习资源,ShutdownService 默写)
+ 软件项目管理::Gradle 的抽象总结
+ JavaScript ES6: sm.ms.js
+ JavaScript ES6: 基于 CheerIO 和 Requests.js-promise-native 的爬虫,默写(感谢 @ice1000 的原实现,这可能是冰封哥有史以来最奇怪的代码,因为他写了两个完全可以被替换为更有意义结构的没有用的控制结构...)
+ JavaScript ES6: ArrayBuffer, DataView 读 BMP、再看 ASCII 艺术画生成
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ Kotlin::Shell execute
+ Kotlin::Coroutine
+ Kotlin::Kotlin Native 和 Kotlin JavaScript 与 Gradle/Groovy
+ Kotlin HTML DSL
+ Kotlin 内部代理类 (Delegates)
+ Kotlin OkHttp 同步/异步封装
+ C 程序设计语言::libBMP 和 libWAV
+ C 程序设计语言::OpenGL 体验
+ 无脑模式::线性代数::高斯·约当消元法(Gauss Jordan)解齐次线性方程组(Homogenuous Linear Equation Group)
+ 无脑模式::C++/Qt::拼音分词、英文音标转换和 TTS 合成
+ 无脑模式::Haskell 抄写 Haskell 的 AlgorithmW Hindley-Milner Type system type infer algorithm 实现
+ Javax Servlet 架构体验 🤔
duangsuse::Echo
#tech #daily #Java #JavaScript #dev 🐱 duangsuse 的学习日常 ⭐️ + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容) + 高性能计算::C 语言和高性能计算、x86…
https://raw.githubusercontent.com/yairchu/Algorithm-W-Step-By-Step/master/AlgorithmW.lhs
现在就可以试用 Haskell 编写的 Type inferer,可惜我还要再抄一遍(🙈
现在就可以试用 Haskell 编写的 Type inferer,可惜我还要再抄一遍(🙈
AlgorithmW.tex: Algorithm.lhs
lhs2Tex $< > $@
AlgorithmW.pdf: AlgorithmW.tex
latex $<
pdflatex $<
AlgorithmW: Algotithm.lhs
ghc --make $<
https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.htmlwww.gnu.org
Automatic Variables (GNU make)
Next: How Patterns Match, Previous: Pattern Rule Examples, Up: Defining and Redefining Pattern Rules [Contents][Index]
#Haskell 开心。
ghc -e main AlgorithmW.lhsForwarded from dnaugsuz
个人觉得,还是写 SQL 规范一些,MongoDB 有 Java 的 stream EDSL
比如
比如
MongoClient.<init>(String host, int port)然后可能要这么操作:
MongoClient#getDatabase(String name)
MongoDatabase#createCollection(String name)
MongoDatabase#getCollection(String name)
MongoCollection<>#createIndex(Index, IndexOptions)
Index.<init>(String key, Order)
IndexOptions#unique(boolean)
MongoCollection#find()比如
#sort()
#filter
#limit()
#into()
users.find(eq(User.K_ID, "duangsuse"))
但是觉得要优化的话,MongoDB 更高层一些呢,但是 SQL 会规范很多Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (Yuuta | a.k.a. 鱼塔 🐟)
卒。
选错了 VHD,把 Root VHD 当 Child 选了,然后手残 Bootice 点了压缩。
卒,开机就重启。看来只能用 Root 了
选错了 VHD,把 Root VHD 当 Child 选了,然后手残 Bootice 点了压缩。
卒,开机就重启。看来只能用 Root 了
#Java https://javaranch.com/journal/2002/01/jlsjan2002.html
你可能不知道的 Java 语法 "Qualified class instance creation":最好的解释...
你可能不知道的 Java 语法 "Qualified class instance creation":最好的解释...
duangsuse::Echo
#Java https://javaranch.com/journal/2002/01/jlsjan2002.html 你可能不知道的 Java 语法 "Qualified class instance creation":最好的解释...
上 DuckDuckGo 居然没几个人、没几个教程知道还有这种语法... 可谓冷门了...
duangsuse::Echo
上 DuckDuckGo 居然没几个人、没几个教程知道还有这种语法... 可谓冷门了...
我也无法快速理解了,只能到时候看编译器源码吧(
最近 CSS 和 JavaScript 都宣布了一个管道操作符,还不能使用。尽管反复看,前一个只记得住使用范围(<table>)… 后一个只记得住作用(简化连锁函数调用)… 真是要多用才能理解,才能记住。
duangsuse::Echo
最近 CSS 和 JavaScript 都宣布了一个管道操作符,还不能使用。尽管反复看,前一个只记得住使用范围(<table>)… 后一个只记得住作用(简化连锁函数调用)… 真是要多用才能理解,才能记住。
不过,这个 Qualified class instance creation 可不是新的 Java Feature 了(至少是 Java 1.2 就有),新的是
var local variable type inference (Java 10+),Java 以前一直是显式类型的语言呢,现在终于有了 Type inference。
duangsuse::Echo
#tech #daily #Java #JavaScript #dev 🐱 duangsuse 的学习日常 ⭐️ + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容) + 高性能计算::C 语言和高性能计算、x86…
如你们所见,很多,所以一天是无法完成的,所以这个列表慢慢累积...
先默写一下 Java 和 Kotlin 的 Modifiers
== Java
Class members
Classes
先默写一下 Java 和 Kotlin 的 Modifiers
== Java
Class members
abstract final static strictfp volatile stransientProcedural
native synchronized== Kotlin
Classes
abstract open finalClass members
enum annotation data sealed
abstract open final override lateinitProcedural
const
suspend infix operator inline external tailrec
Access controlpublic private protected interal
Parametersvararg crossinline noinline
Parameterized Type Variancein out
Type Parametersreified#Java #Kotlin https://gist.github.com/duangsuse/dfc532a16f547459bcf3f4f8d922d849 更新了一个字
https://gist.github.com/duangsuse/dfc532a16f547459bcf3f4f8d922d849/revisions
Void 改成了 Nothing
其实 Unit 也可以,反正 Void 类型只有一种可能的值:null
Nothing? 和 Unit 也都是一样(被 Rust 称为 Zero Size Types,因为他们在值的层面讨论只有一种可能性:Unit 就是 object Unit、Nothing? 就是 null、Void 也是 null),而 Nothing 类型没有可能的值(Empty Type/Bottom Type,这个名字是来源与它在子类型层次结构里处于最底端的缘故)
https://gist.github.com/duangsuse/dfc532a16f547459bcf3f4f8d922d849/revisions
Void 改成了 Nothing
其实 Unit 也可以,反正 Void 类型只有一种可能的值:null
Nothing? 和 Unit 也都是一样(被 Rust 称为 Zero Size Types,因为他们在值的层面讨论只有一种可能性:Unit 就是 object Unit、Nothing? 就是 null、Void 也是 null),而 Nothing 类型没有可能的值(Empty Type/Bottom Type,这个名字是来源与它在子类型层次结构里处于最底端的缘故)
val empty: Nothing? = null
虽然 Nothing? 的语义很正常,但是 unsupported [Array<Nothing> in return type is illegal]
...Gist
Essay: Android cancellable asynchronous task API abstractoin in Kotlin
Essay: Android cancellable asynchronous task API abstractoin in Kotlin - Essay-Android-AsynchronousTaskAbstractoin.kt
duangsuse::Echo
#tech #daily #Java #JavaScript #dev 🐱 duangsuse 的学习日常 ⭐️ + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容) + 高性能计算::C 语言和高性能计算、x86…
这次就有一些我最想先弄的东西:
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::常见名词
+ 数据库::关系代数 #db
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写 Android ShutdownService
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ JavaScript ES6: sm.ms.js
+ Kotlin::Shell execute
+ Kotlin OkHttp 同步/异步封装
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::常见名词
+ 数据库::关系代数 #db
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写 Android ShutdownService
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ JavaScript ES6: sm.ms.js
+ Kotlin::Shell execute
+ Kotlin OkHttp 同步/异步封装
#security https://t.me/dsuses/2956 🤔 说起来我之前一直丢脸地不知道加盐是什么原理... 嘛其实也未必,我知道 hash 算法、局部敏感的 hash 算法、HashMap、SHA 算法,可是之前知道的没有这么详细
比如说,对我的名字计算 sha256 值:
不过也可以这样,允许用户设置一个『盐』值,我们把这些信息以一种我们自己知道可以重复(幂等)的方式混淆到原数据上面,作为一种预处理:
一般直接用 concat 就可以了
比如说,对我的名字计算 sha256 值:
import java.security.*
val sha256 = MessageDigest.getInstance("SHA-256")
sha256.reset()// fold Left
sha256.update(("duangsuse" as? java.lang.String)?.getBytes())
fun <T : Number> Iterable<T>.hexDigest(): String = this.fold(StringBuilder()) { acc, it -> acc.append(String.format("%02x", it)) }.toString()
fun <T : Number> Array<T>?.hexDigest(): String? = this?.toList()?.hexDigest()
fun ByteArray?.hexDigest(): String? = this?.asList()?.hexDigest()
fun MessageDigest.mkHash(bs: ByteArray): ByteArray = this.run { reset() }.run { update(bs); digest() }
val String.bytes: ByteArray? get() = (this as? java.lang.String)?.getBytes()
val name_shasum = "duangsuse".bytes?.let { sha256.mkHash(it) }.hexDigest()
但是如果 cracker 有一个 hash 字典,然后它知道我名字的 hash 值是 e3b0c44...
我就傻冒了,我的身份将被冒充,并且他这个肮脏侥幸的数学破坏者会弄到我的明文密码 😭不过也可以这样,允许用户设置一个『盐』值,我们把这些信息以一种我们自己知道可以重复(幂等)的方式混淆到原数据上面,作为一种预处理:
一般直接用 concat 就可以了
inline fun String.salted() = System.getProperty("salt", "") + this
只要每次计算 hash 的时候都先按照可重复的方法预处理,就可以增强 hash 的保密效果,不那么容易碰撞了,也可以进行同样的身份验证。Telegram
duangsues.is_a? SaltedFish
为了防止撞库攻击,很多人都建议任何密码相同(或相关)的用户修改自己的密码。
~想法~
所以,改成什么?
1.自己要能记忆
2.不同网站/程序不一样
3.不同密码之间无关连
思考了一下
希望:“即使断网也能查看密码”
所以要在本地完成计算。
同时“希望能在任何平台算出密码”
所以不想使用密码管理器。
~实施~
于是决定:
1.想好一个"盐"(可以有任何字符,长度也可以很大),记下来。
2.将其和要设置的网站的域名拼接
3.计算sha256
4.取最后几位作为该网站密码,位数建议多点(8…
~想法~
所以,改成什么?
1.自己要能记忆
2.不同网站/程序不一样
3.不同密码之间无关连
思考了一下
希望:“即使断网也能查看密码”
所以要在本地完成计算。
同时“希望能在任何平台算出密码”
所以不想使用密码管理器。
~实施~
于是决定:
1.想好一个"盐"(可以有任何字符,长度也可以很大),记下来。
2.将其和要设置的网站的域名拼接
3.计算sha256
4.取最后几位作为该网站密码,位数建议多点(8…
duangsuse::Echo
…8103 年 SHA256 早被撞烂了吧🌚
现在还好哇,我们现在很多文件验证也是用 SHA-256
何况我不是密码学的人不懂这些东西,我们只是用来写应用而已,很多 JVM 程序员这辈子干过和密码学最近的也不过就是用 IDEA 自动生成的 * 31
何况我不是密码学的人不懂这些东西,我们只是用来写应用而已,很多 JVM 程序员这辈子干过和密码学最近的也不过就是用 IDEA 自动生成的 * 31
int hashCode(); 算法了,我以后只要不是要忽略某些字段的 hashCode,再也不会让 IDEA 去自动生成这种无意义的代码