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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from dnaugsuz
特别来给 Rachel 提建议。
首先, print("=== a ===") 可以抽提:
private fun title(text: String) = println("=== $text ===")
然后, context?.let {...} 可以换成
context?.run {
getSharedPreferences("emm").all.forEach { print("${it.key} ${it.value}") }
}
另外我建议在这种 block 嵌套的情况下使用 for (item in items) 而非 Iterable.forEach
顺便引一个官方文档: Scope functions
Forwarded from Rachel 碎碎念 (IFTTT)
Kotlin 的语法糖写起来是真的舒服
虽然已经火星很多年
但是毕竟最近才重拾所以 pic.twitter.com/54mzUti90W— Rachel 呱 (@tangrui003) April 3, 2020
#PL 晚上散步的时候忽然回想到部分绝句设计细节🤔

绝句亮点特性:
逗号表示法、中缀否定、记法、中缀链、人称文法

顺序:
事/回 (回重写、回交)

分支控制流:
若/判 (「判你」 是第二人称)

循环控制流:
重复/对 (「对…里的……」 是第三人称)
停下、略过

第二人称还包括 且/或链
第三人称还包括 中缀链

绝句的 label 定义,对 block 是 ,[] 对控制结构是 对[]
引用则是 [^]

值绑定模式:
常/变/量

只有 量 可以类型推导, 常/变 直接跟后面写类型。

真假 字
字节 短数 数 长数
短实 实

类/物/例
储物 例物 况物 标物
扩物 内物 抽象物

公开 族内 私下 内部

抽象/实现 开放/终定/覆写 记法
晚成
尾递归 断续
为了吹哨人、发哨人,以及所有为了疫情努力过的人(当然,显然我不包括在其中)
本频道 image 象征性灰今明两天。 #Telegram #China

#Python Pillow:
from PIL import Image
def grayifyFile(name):
img = Image.open(name)
img.convert("L").save(name.rsplit(".")[0])

grayifyFile("image.png")

OpenCV #CV #Cplusplus:
#include <cxcore.h>
#include <vector>
#include <cv.h>
#include <highgui.h>

#include <errno.h>
#include <dirent.h>
#include <iostream>
#include <queue>
(不是的)
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(gray)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} "gray.c++")
target_link_libraries(gray ${OpenCV_LIBS})

gray.c++
#include <cv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <highgui.h>

using namespace cv;

const char* TITLE_GRAY = "Gray Image";

int main() {
namedWindow(TITLE_GRAY, CV_WINDOW_AUTOSIZE);
Mat img = imread("image.jpg");
Mat gray_img; cvtColor(img, gray_img, CV_BGR2GRAY);
imshow(TITLE_GRAY, gray_img); waitKey();
imwrite("image_bw.jpg", gray_img);
return 0;
}

#Kotlin + #java.awt.image:
import java.io.File
import javax.imageio.ImageIO

import java.awt.image.BufferedImage
import java.awt.image.RenderedImage

object Img {
@JvmStatic fun main(vararg args: String) {
val image = ImageIO.read(File("image.jpg"))
val image_gray = image.mapPixels(::luma)
image_gray.writeTo("image_bw.jpg")
}
fun BufferedImage.mapPixels(transform: (Int) -> Int): BufferedImage {
val newImg = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
for (y in 0 until height)
for (x in 0 until width)
newImg.setRGB(x, y, transform(this.getRGB(x, y)))
return newImg
}
fun RenderedImage.writeTo(path: String) {
ImageIO.write(this, path.substringAfter("."), File(path))
}
/** R * 299/1000 + G * 587/1000 + B * 114/1000 */
//see also https://www.cnblogs.com/bixiaopengblog/p/7462961.html
fun luma(rgb: Int): Int {
val (r, g, b) = unpackRGB(rgb)
val lum = r * 299/1000 + g * 587/1000 + b * 114/1000
return repackRGB(lum, lum, lum)
}
fun repackRGB(r: Int, g: Int, b: Int): Int = (r shl 16) or (g shl 8) or b
fun unpackRGB(rgb: Int): IntArray = intArrayOf(rgb byte 2, rgb byte 1, rgb byte 0)
private infix fun Int.byte(n: Int) = this shr (n*8) and 0xFF
}
Channel photo updated
Forwarded from dnaugsuz
草,这个状态机实在是太 ** 了
Forwarded from dnaugsuz
没有注意到必须有一个栈,而且这个栈还得决定参数得添加到哪个 CallAST.Call 参数列表里,我发现我用 for 的设计就是个错误…… 本来打算快速弄完了的
Forwarded from dnaugsuz
我应该用递归下降法的
Forwarded from dnaugsuz
之前写的 lexer 也很草
Forwarded from dnaugsuz
说了这句话我就开始写,结果发现我自己其实也就是个弟弟
Forwarded from dnaugsuz
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from dnaugsuz
构造 Call(callee, param) 的时候突然发现自己扫 callee 的时候没存。
看来整个都没有用了,毕竟是递归结构……

我根本不清楚到底要写什么…… 一开始就给整的 generator,我都忘了本来是
# Expr = name '(' Expr {',' Expr}? ')' | name | digits
# predefined names: True, False, None
call_syntax.py
2.6 KB
本以为是个王者(迫真)最后发现是个菜鸡 #Python #code
草,不写了不写了我投降
call_syntax.py
3.2 KB
In [4]: parse(tokenize("dsds(True,False,None,dss(232))"))                                                           
Out[4]: Call('dsds', [Const(True), Const('False'), Const('None'), Call('dss', [Const(232)])])
又不是不能用(暴论
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from dnaugsuz
就因为 Iterator 没打算写 lookahead (因为我把这个当 feature,认真的)
然后这里又没有 ParserKt 的 contextual,就顺手用了 exception 来处理需要 lookahead 的 Name / Call…… 正常返回是 name、abnormal termination 是读到 ',' 了
结果就把 Expr {',' Expr} 写出了这种清奇的画风,又因为 toplevel() 也可能读到闭括号(我没做好读取数据处理域控制)
我就顺手给 toplevel() 加了个逻辑……

但是还是可以用,我就 ***了
大概就是想把 lookahead 变成在栈上 "lookbehind",结果失败了草(name 的后面一个 token 肯定是 '(' 或 ',' ,但应该取决于是不是在括号内才对啊……)

ParserKt 可以处理这种文法,不过是通过 Piped 解析器处理的,如果读完 Name 后还能找到 ( 的话就可以再继续读下一部分,否则直接返回无消耗,前提是 k=1

完全不支持 lookahead 真的可行吗……其实支持也不需要花多大力气
dnaugsuz
就因为 Iterator 没打算写 lookahead (因为我把这个当 feature,认真的) 然后这里又没有 ParserKt 的 contextual,就顺手用了 exception 来处理需要 lookahead 的 Name / Call…… 正常返回是 name、abnormal termination 是读到 ',' 了 结果就把 Expr {',' Expr} 写出了这种清奇的画风,又因为 toplevel() 也可能读到闭括号(我没做好读取数据处理域控制) 我就顺手给 toplevel()…
这个 name',' 的问题可以视为是一个代码复用性的问题。 #PLT #DontKnow

在 Toplevel 里, name '(' ;在 Call 里, name ','
可以预读 name 后面的 punctuation ,但是总有不像预期的 ( 那样的情况,这时就需要特殊处理
为了复用 Toplevel 解析器,就必须做到对非 expected token 情况的处理,比如把预取的东西放回去,看等下别的子解析器会处理——最简单的做法
否则的话,Toplevel 里有一套 disambigNameCall 、Call 里面的另一套不仅预取继承自 Toplevel 的,还得有为 ',' 时继续扫描下一个逗号切分项目的能力(可以用异常之类的传递,但那没法类型安全)

一般来说,lookahead 并不是一件特别难的事情好不好…… 这个文法就可以用 LL(1) 流,只需在读完 name 后看一下 peek 是不是 '(' 即可 disambiguate 了。

ParserKt 之所以可以用 Piped,是因为它的流本身带一个 peek(1) 的能力,相当于 lookahead-1 的文法都是支持的,但它没法优雅地支持更多 lookahead、更复杂的文法了。
Forwarded from Fan Dang
话说 vertx deploy 多个实例,为啥他们能共用一个 tcp 端口?(指 HTTP 服务