好多年前为了锻炼英文数字的敏感度做了一个 app。最近想更新一波,发现需要备案了。还需要有软著才能上应用市场。
因此提供一个下载地址供大家下载吧:
点击这里 或者扫码二维码


做一个有趣的人
好多年前为了锻炼英文数字的敏感度做了一个 app。最近想更新一波,发现需要备案了。还需要有软著才能上应用市场。
因此提供一个下载地址供大家下载吧:
点击这里 或者扫码二维码

这是一个简单的不能再简单的问题,然而,就是这样简单的常见问题,往往会被忽视,从而给未来的某一天埋坑。
大多数编程语言都提供了built-in 截取字符串的方法。
比如 Python最为简单直观,比如从”Hello, World!” 中提取出 World 可以通过下标直接获取
text = "Hello, World!" substring = text[7:12] print(substring) #print World
在 JS 中,String 也提供
text = "Hello, World!" substring = text.substring(7,12) print(substring) //print 'World'
在 Android 中,Kotlin 和 Java 的 String 同样有类似的方法:
val text = "Hello, World!" val substring = text.substring(7,12) print(substring) //print 'World'
相信你也一定写过上面的代码,但是真的会如你的预期得到想要的结果吗?
kotlin 的拓展函数,为这个语言带来极大的可玩性。可以极大的减少现有类的大小, 比如 string这个类 在Android 的 java实现中 有三千多行

但是在 Kotlin 版本中的 String类只有50多行,不到一屏。是不是匪夷所思
继续阅读“Kotlin 拓展函数”在众多介绍软件架构的书籍中,特别是 OOP 语言为基准的话,你一定听说过一句话“组合优于继承” 【Favor composition over inheritance】
为什么这么说? 我们来看一个例子。继承非常好理解,我们需要创建一只鸡,一只鸭,我们很容易抽象出“鸟类”这个父类。如下:
继续阅读“聊聊Kotlin中的继承和组合”我们看一些源码发现,一些源码,在范型前面添加了一些关键字 in 或者 out,这又是什么呢?比如 kotlin内置的 Comparable.kt

再比如,Collections.MutableIterable 接口

为什么会有一些加in,有一些加out 呢?了解这个之前我们来看下
泛型(Generics)是一种允许类、接口和方法操作任意类型(类型参数)的特性。泛型提供了一种类型安全的方式来处理对象集合和其他数据结构,而无需在编译时指定具体的类型。
举一个栗子:
继续阅读“Kotlin 范型中的in 和out 是什么?”如今各种语法糖越来越方便,以前很多难以直观理解的代码,通过语法糖包装下,变得越来越好用,典型的有 lambda表达式,协程, flow, rx 等等,用起来是不亦乐乎。
很对第三方sdk也逐渐从传统的callbck形式逐渐提供flow形式的接口,让适用方能够比较自然的接入。
继续阅读“Python将回调函数转为可迭代对象|convert callback into generator in Python”要想获取外网IP,可以直接使用curl获取。
curl ipecho.net/plain
有些时候,我们不得不导出pdf,一些软件会要求购买vip服务才行,但是如果你装了python环境的话,其实现成的包就能帮你完成这个操作。
第一步需要安装fitz和PyMuPDF
大概三十多M。国内网络比较差的情况下可以使用清华源 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install fitz -i https://pypi.tuna.tsinghua.edu.cn/simple pip install PyMuPDF继续阅读“Python如何将pdf导出图片格式”
python: symbol lookup error: /data/home/xxxxxproject/venv/lib/python3.9/site-packages/torch/lib/../../nvidia/cudnn/lib/libcudnn_cnn_infer.so.8: undefined symbol: _ZN15TracebackLoggerC1EPKc, version libcudnn_ops_infer.so.8
如果你遇到上面错误,可以ldd看一下libcudnn_ops_infer.so.8 指向的不是我们的venv下的目标so
ldd /data/home/projxxx/venv/lib/python3.9/site-packages/torch/lib/../../nvidia/cudnn/lib/libcudnn_cnn_infer.so.8
ldd: warning: you do not have execution permission for `/data/home/xxxxxxxproject/venv/lib/python3.9/site-packages/torch/lib/../../nvidia/cudnn/lib/libcudnn_cnn_infer.so.8'
linux-vdso.so.1 (0x00007ffcee0e1000)
/$LIB/libonion_block.so => /lib64/libonion_block.so (0x00007f81c7053000)
/$LIB/libonion.so => /lib64/libonion.so (0x00007f81ee291000)
libcudnn_ops_infer.so.8 => /usr/local/cuda-11.0/lib64/libcudnn_ops_infer.so.8 (0x00007f81b5507000)
libz.so.1 => /lib64/libz.so.1 (0x00007f81b52f0000)
librt.so.1 => /lib64/librt.so.1 (0x00007f81b50e7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f81b4ec7000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f81b4cc3000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f81b4b2b000)
libm.so.6 => /lib64/libm.so.6 (0x00007f81b47a9000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f81ee261000)
libc.so.6 => /lib64/libc.so.6 (0x00007f81b43e7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f81ee172000)
可以看到,libcudnn_ops_infer 并非指像我们虚拟环境下的路径,可以重新指定搜索路径
export LD_LIBRARY_PATH=~/projectxxxxxx/venv/lib/python3.9/site-packages/nvidia/cudnnib:$LD_LIBRARY_PATH
上面xxxxxx 就是你的项目地址, venv是虚拟环境目录
最近开发使用Kotlin确实挺爽的,就在于这门语言足够现代化,和JetBrains家的编辑器结合起来更是无敌了,自动提示,编译优化都是很实用的,但这样基本也脱离不了这个生态了,话说今天使用List的遍历,居然有六种方式,使用哪种方式都可以。这样虽然看起来很庞大,看起来很难记的样子,但是好在编译器+idea足够聪明,记住一两种就OK了。这有点像是我们学习英语,随着对语义的更加紧准的表达,英文单词拓展到了十几二十万个。(方便的同时也会加大人们的记忆负担)
brandList.forEach {
println(it)
}
for (brand in brandList) {
println(brand)
}
for (index in 0 until brandList.size) {
println("$index:${brandList[index]}")
}
for (index in 0..brandList.lastIndex) {
println("$index:${brandList[index]}")
}
for (index in brandList.indices) {
println("$index:${brandList[index]}")
}
brandList.forEachIndexed { index, brand ->
println("$index:${brand}")
}