duangsuse::Echo
F**king delegates 为什么没有用,然后不能直接 by... Kotlin 一大堆 Property 抽象也看不懂...
This media is not supported in your browser
VIEW IN TELEGRAM
啊我的 Delegate 写错了啊!只是
我应该写个 TimeStamp 接口然后一起的...
Serializable by 的话当然没有自动代理实现 Date... 对象代理用的也不对,应该引用 property 的我应该写个 TimeStamp 接口然后一起的...
https://github.com/duangsuse/TelegramMessageScanner-KotlinMulti-Failed/blob/master/src/commonMain/kotlin/org/duangsuse/messagescanner/model/Date.kt
白写了这么久,可惜 Kotlin Common 居然有这些东西本来应该自带的,Kotlin 的 Doc 上也有说有 Common 版本的,IDEA 的 project template 居然都没法直接用,真是令人心累啊...(跑
白写了这么久,可惜 Kotlin Common 居然有这些东西本来应该自带的,Kotlin 的 Doc 上也有说有 Common 版本的,IDEA 的 project template 居然都没法直接用,真是令人心累啊...(跑
GitHub
duangsuse/TelegramMessageScanner-KotlinMulti-Failed
[FAILED] (Gradle+Groovy/Kotlin JVM&JS) Tired of writing junk code over and over again - duangsuse/TelegramMessageScanner-KotlinMulti-Failed
duangsuse::Echo
可以使用。不过我觉得 Regex 可以修改以减少后序处理的过程。 import java.util.regex.*; pat = Pattern.compile("(^|\\s)#(?!#)((\\S(?<![\\(\\)]))+)") m = pat.matcher("#abc #dev") m.reset() while (m.find()) { println(m.group().trim()) }
🤔 一旦开始写的东西,都是一些对真正的业务逻辑来说可有可无的东西时,就比较危险了...
下面 duangsuse,唉,希望早日能有快速完成任何实际工程的能力吧。
—
Maven 的 POM 怎么写又忘了,我思量着要不要先拿大家都觉得很垃圾的 Java 8 来完成这个扫描器
下面 duangsuse,唉,希望早日能有快速完成任何实际工程的能力吧。
—
Maven 的 POM 怎么写又忘了,我思量着要不要先拿大家都觉得很垃圾的 Java 8 来完成这个扫描器
<dependenciesManagement>
<dependencies>
<dependency>
<groupId>org.duangsuse</groupId>
<artifactId>telegram_message_scanner</artifactId>
<version>1.0.0</version>
<scope>main</scope>
<dependency>
</dependencies>
</dependenciesManagement>
Gradle 的也很难记,Gradle 的 Configuration、Task、Artifact、Plugin、Dependencies、Repositories 也不好记... gradle 用一些 fileTree, doLast, extendFrom, copy, delete, each 什么的... 累。This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
🤔 一旦开始写的东西,都是一些对真正的业务逻辑来说可有可无的东西时,就比较危险了... 下面 duangsuse,唉,希望早日能有快速完成任何实际工程的能力吧。 — Maven 的 POM 怎么写又忘了,我思量着要不要先拿大家都觉得很垃圾的 Java 8 来完成这个扫描器 <dependenciesManagement> <dependencies> <dependency> <groupId>org.duangsuse</groupId> <artifactId>telegra…
立即把 randomSelection 重构一下找灵感(
GitHub
duangsuse/randomSelection
📚 Random text item selection for presentation-making usage 点名器 - duangsuse/randomSelection
duangsuse::Echo
😲 Sticker
duangsuse 不好的地方主要在于记忆不好,比如上次我记得我记了 Maven 的一些模型侧面,可是现在全忘了:
记得一个 Maven 包有(默写的,记住的):
ArtifictId, GroupId, VersionName
Name, PackagingType, Description, Url
Developer name, developer id
SCM, SCM Connection, SCM developer connection
Licence, licence name, licence url
可是,实际上还有
+ SCM(url)
+ Licence(dist)
太微不足道了,如果要开发 Qt 程序呢?有些 signal 和 slot 怎么记... 界面的东西
如果 duangsuse 能写出类似这样的代码,可能会稍微安心一点,可是好像没有写出过(或许吧)。
其实 duangsuse 真的会写位运算... 就差 OI 级别的位运算了。
记得一个 Maven 包有(默写的,记住的):
ArtifictId, GroupId, VersionName
Name, PackagingType, Description, Url
Developer name, developer id
SCM, SCM Connection, SCM developer connection
Licence, licence name, licence url
可是,实际上还有
+ SCM(url)
+ Licence(dist)
太微不足道了,如果要开发 Qt 程序呢?有些 signal 和 slot 怎么记... 界面的东西
如果 duangsuse 能写出类似这样的代码,可能会稍微安心一点,可是好像没有写出过(或许吧)。
其实 duangsuse 真的会写位运算... 就差 OI 级别的位运算了。
GitHub
shazam/axmlparser
An updated version of AXMLParser, compatible with aapt2 - shazam/axmlparser
duangsuse::Echo
可是 Qt 的视图模型比较不方便,太看重 Fixed size 了,容器类没有 Gravity,视图不能 size match parent,很难受,Qt 也有列表控件模型(Model-View based、Item model based)
🤔 已经手工写了一个小例子出来,希望能愉快的使用 C++ 和 Qt Widgets、QObject(Signal&Slots)
之前的 randomSelection,用了 Qt4 Widgets、Qt event、QTextStream、Timer、QLabel、qrand、qgetenv 等。
duangsuse 已经会使用 Qt 进行文件 IO 和简单的 configuration 读取等操作,Qt 算法库(比如 QVector,QString)基本能用,对 Qt 基本视图模型(Point、Widget、Layout、Widget Proprerties、Plattle、Color、Geometry)和基本工具(QTimer)也有了解。
之前的 randomSelection,用了 Qt4 Widgets、Qt event、QTextStream、Timer、QLabel、qrand、qgetenv 等。
duangsuse 已经会使用 Qt 进行文件 IO 和简单的 configuration 读取等操作,Qt 算法库(比如 QVector,QString)基本能用,对 Qt 基本视图模型(Point、Widget、Layout、Widget Proprerties、Plattle、Color、Geometry)和基本工具(QTimer)也有了解。
duangsuse::Echo
🤔 已经手工写了一个小例子出来,希望能愉快的使用 C++ 和 Qt Widgets、QObject(Signal&Slots) 之前的 randomSelection,用了 Qt4 Widgets、Qt event、QTextStream、Timer、QLabel、qrand、qgetenv 等。 duangsuse 已经会使用 Qt 进行文件 IO 和简单的 configuration 读取等操作,Qt 算法库(比如 QVector,QString)基本能用,对 Qt 基本视图模型(Point、Wid…
GitHub
duangsuse/Qt-Qt5-Widgets-Intro
:thinking:. Contribute to duangsuse/Qt-Qt5-Widgets-Intro development by creating an account on GitHub.
This media is not supported in your browser
VIEW IN TELEGRAM
可是写了很多垃圾代码,却只能在自己还会的地方练习,因为自己不会的地方几乎要熬夜去学(跑
准备继续写那个拖了很久的 TelegramMessageParser...
准备继续写那个拖了很久的 TelegramMessageParser...
#Java #Kotlin #JVM #CS #PL #dev 🤔
duangsuse 发现自己对 Java 在集合类里泛型问题的又有了新一层的理解。
为什么容器类需要用泛型?
因为肯定是希望
Java 里默认的泛型形变,是 Invarant(不变) 的
这种情况下,虽然我们知道 Cat 是 Animal,但是
如果我们要编写一个
在这里,根据 Java 的 PECS(Producer-Extends-Consumer-Super)原则,我们知道
但是为什么呢? 🤔
这里你只会了解到和程序设计语言类型有关的信息,Kotlin 的类型投影什么的不会讲。
—
泛型的『型变』是什么?
泛型的型变就是告诉 Java 类型检查器,一种泛型类的子类型关系,和它的参数化类型有什么样的联系。
这样,我们就可以实现类型安全的容器类泛化类型操作。
+ 协变(covariant):Cat 是 Animal,List<Cat> 也是 List<Animal>
+ 逆变(contravariant):Cat 是 Animal,List<Animal> (这时可能被用作输出) 是 List<Cat>
+ 不变:无论 Cat 是不是 Animal,List<Cat> 和 List<Animal> 之间没有太大的关系
在这里,子类型的『级别』,
有类型 P 是类型 C 的父类型,
Kotlin 里面,泛型的
有类型 P 是类型 C 的父类型,
其实我们想说,为了类型安全,
我们希望所有对象都的确实现了
所以,我们需要一个 producer —
反过来说,
PECS,我们知道现在该用
所以,当『输出到集合(使用
这样,output(装着某种
这就使用了泛型的逆变
duangsuse 发现自己对 Java 在集合类里泛型问题的又有了新一层的理解。
为什么容器类需要用泛型?
因为肯定是希望
List<Animal> 能够去 addAll(List<Cat>) 的呢。Java 里默认的泛型形变,是 Invarant(不变) 的
这种情况下,虽然我们知道 Cat 是 Animal,但是
List<Cat> 却和 List<Animal> 不存在子类型 subtyping 关系!如果我们要编写一个
addAll(??? other) 函数,保证类型安全(List<Cat> 显然不应该保存 List<Animal>!),并且让 Java 的类型检查器可以做检查的话,就必须指定泛型型变!在这里,根据 Java 的 PECS(Producer-Extends-Consumer-Super)原则,我们知道
addAll 的类型,显然应该是 void addAll(List<? extends T> input); 但是为什么呢? 🤔
这里你只会了解到和程序设计语言类型有关的信息,Kotlin 的类型投影什么的不会讲。
—
泛型的『型变』是什么?
泛型的型变就是告诉 Java 类型检查器,一种泛型类的子类型关系,和它的参数化类型有什么样的联系。
这样,我们就可以实现类型安全的容器类泛化类型操作。
+ 协变(covariant):Cat 是 Animal,List<Cat> 也是 List<Animal>
+ 逆变(contravariant):Cat 是 Animal,List<Animal> (这时可能被用作输出) 是 List<Cat>
+ 不变:无论 Cat 是不是 Animal,List<Cat> 和 List<Animal> 之间没有太大的关系
在这里,子类型的『级别』,
父类型为小子类型为大,以 lessThan 序排行,可能类似这样:1. Object(kotlin.Any)Kotlin 里面,泛型的
2. Animal
3. Cat
in T 指定了可取类型的下界 — 可选类型 ? 必须是 super T(T 的超类)才可以,而 Animal 的确 super 了 Cat,所以可取类型必须 (lessThan Cat)
它实现了泛型的逆变 —有类型 P 是类型 C 的父类型,
P lessThan C
类型 F<? super C> 是 F<P> 的父类型 (_<P> lessThan _<? lessThan C>)Kotlin 里面,泛型的
out T 指定了可取类型集合的上界 — 可取类型 ? 必须是 extends T(T 的子类型)才可以,而 Cat 的确 extends from 了 Animal,所以可取类型必须 (greaterThan Animal)
它实现了泛型的协变 —有类型 P 是类型 C 的父类型,
P lessThan C
类型 F<? extends C> 是 F<P> 的子类型 (_<P> greaterThan _<? greaterThan C>)其实我们想说,为了类型安全,
List<Animal> 的容器里,可以放的东西类型应该是:? extends Animal
也可以说是 ? greaterThan Animal,反正比 Animal 能就可以了(跑)我们希望所有对象都的确实现了
Animal(可以装 Animal 和它的子类扩充)所以,我们需要一个 producer —
List<? extends Animal> 来喂数据,进行 addAll 操作(利用一个 Iterable<T>,这里 T 就肯定是某种 Animal, 或者说我们利用 T get(); 方法肯定会拿到 Animal)反过来说,
popAll 呢?PECS,我们知道现在该用
in T 了 🤔fun popAll(output: Collection<in T>): Unit
或者说,void popAll(Collection<? super T> output);我们不希望任何容器,包括
output 被放上不好的东西(某种不是 Animal 的东西!)所以,当『输出到集合(使用
void add(T item); 方法)』的时候,不如反转一下子类型关系!(相对于 addAll)这样,output(装着某种
T) 就只会被 add 上一些 extends T 的东西(这个类型自己),保证了类型安全这就使用了泛型的逆变
duangsuse::Echo
非常的难受,但这居然还比 Gradle、CMake 要简单一点?(可能不是
看了一下 IDEA 的 #Java 语言版本提示,我默写一下:
1.3: Plain Old Java (2000)
1.4:
5: Autoboxing,
6:
7: ARM, Diamond, multi-catch (2011)
8: Lambda and Type annotations (2013)
9: Modules,
10: Local variable inference (2018)
11: Local variable syntax for lambda parameters (2018)
没有成功,但是也快了,只是 Java 7 的默写错了,别的有漏的。
啊,提起 Java,这门『垃圾』语言(和 CSharp、Kotlin、Rust 等相比就是垃圾了,差一点没 Julia、R、Fortran 之类的厉害?'跑,,,,),也未必是被大部分人完全理解的呢。
那么我们今天来完全理解一下,自 1995 年从 Oak 更名,1997 年的 Java 1.1 开始,之间提到 2004 年语法糖飞跃的 Java 5,再到最近 2018 年的 Java 11 结束,我们会看到所有的 Java 语法。(其实语法上的已经足够浅层次了,但是即使这样,很多人都能注意到自己没见过的 Java 语法)
当然,定义什么的冗长(好歹 James 老头子也是博士学位啊!)所以得感谢 ANTLR
🤔 #Learn #PL #OOP
1.3: Plain Old Java (2000)
1.4:
assert keyword (2002)5: Autoboxing,
enum, generics (2004)6:
@Override in interfaces (2006)7: ARM, Diamond, multi-catch (2011)
8: Lambda and Type annotations (2013)
9: Modules,
private fields in interfaces (2017)10: Local variable inference (2018)
11: Local variable syntax for lambda parameters (2018)
没有成功,但是也快了,只是 Java 7 的默写错了,别的有漏的。
啊,提起 Java,这门『垃圾』语言(和 CSharp、Kotlin、Rust 等相比就是垃圾了,差一点没 Julia、R、Fortran 之类的厉害?'跑,,,,),也未必是被大部分人完全理解的呢。
那么我们今天来完全理解一下,自 1995 年从 Oak 更名,1997 年的 Java 1.1 开始,之间提到 2004 年语法糖飞跃的 Java 5,再到最近 2018 年的 Java 11 结束,我们会看到所有的 Java 语法。(其实语法上的已经足够浅层次了,但是即使这样,很多人都能注意到自己没见过的 Java 语法)
当然,定义什么的冗长(好歹 James 老头子也是博士学位啊!)所以得感谢 ANTLR
🤔 #Learn #PL #OOP
GitHub
sdklite/aapt
Android Asset Packaging Tool. Contribute to sdklite/aapt development by creating an account on GitHub.