duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from dnaugsuz
SpringBoot 里有低级(数据库 Schema 和查询)的 Repository 和高级的 Service(实体集合操作的高层抽象)

比如说这里有一个 People

@Table(name = "people")
@Entity
data class Person (@Id @GeneratedValue(strategy = GenerationType.IDENTITY) val name: PeopleId, val age: Int): Serializable

然后可以有 PeopleRepository 和 PeopleService

@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;…
接上面没有写完的:
最终结果:

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 的习惯,
不同于其他很多人(尤其是学院派),我会把一些比较难理解的东西一遍一遍的重复,这是为了能更好的记住他们,顺带多传播点信息
就是这样,喵。
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 架构体验 🤔
#Haskell 开心。 ghc -e main AlgorithmW.lhs
Forwarded 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 了
Forwarded from dnaugsuz
我 压 我 自 己
#Java https://javaranch.com/journal/2002/01/jlsjan2002.html
你可能不知道的 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

abstract final static strictfp volatile stransient

Procedural

native synchronized

== Kotlin

Classes

abstract open final
enum annotation data sealed

Class members

abstract open final override lateinit
const

Procedural

suspend infix operator inline external tailrec

Access control

public private protected interal

Parameters

vararg crossinline noinline

Parameterized Type Variance

in out

Type Parameters

reified
#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,这个名字是来源与它在子类型层次结构里处于最底端的缘故)

val empty: Nothing? = null

虽然 Nothing? 的语义很正常,但是 unsupported [Array<Nothing> in return type is illegal]
...
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 同步/异步封装
#security https://t.me/dsuses/2956 🤔 说起来我之前一直丢脸地不知道加盐是什么原理... 嘛其实也未必,我知道 hash 算法、局部敏感的 hash 算法、HashMap、SHA 算法,可是之前知道的没有这么详细

比如说,对我的名字计算 sha256 值:

import java.security.*

val sha256 = MessageDigest.getInstance("SHA-256")
sha256.reset()
sha256.update(("duangsuse" as? java.lang.String)?.getBytes())

// fold Left
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 的保密效果,不那么容易碰撞了,也可以进行同样的身份验证。
…8103 年 SHA256 早被撞烂了吧🌚
duangsuse::Echo
…8103 年 SHA256 早被撞烂了吧🌚
现在还好哇,我们现在很多文件验证也是用 SHA-256
何况我不是密码学的人不懂这些东西,我们只是用来写应用而已,很多 JVM 程序员这辈子干过和密码学最近的也不过就是用 IDEA 自动生成的 * 31 int hashCode(); 算法了,我以后只要不是要忽略某些字段的 hashCode,再也不会让 IDEA 去自动生成这种无意义的代码