duangsuse::Echo
711 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
你没被踢都是好的了,我直接被 @Pythonzh 封了,还删了所有消息,之前我发的代码/文件都删了。
Forwarded from dnaugsuz
不仅不应该怪他们,还应该感谢他们保持了克制,没有赶尽杀绝,因为以后你完全可能遇到更严苛的群友。
说这些话的时候整个人都幼齿了,虽然我已经满 18 了。
反正就是这样,我觉得略微透明一点更好。
duangsuse 是什么时候开始这么自由的把流程和数据依赖利用各种闭包拆开 hack 的呢……

这么做的根本原因好像是为了让代码更好看、更有复用性吧

那又是从何时开始注重「好看的代码」了呢……

好像是从不断重写同一段逻辑开始的吧。

那可不可以把同一个算法,利用不同的语言、不同的框架、不同的建模方法和控制流/内存利用实现细节写很多遍呢……
这样的话又会变得奇怪了啊……
除非写 Lisp,我习惯的是让代码从直觉上易于理解。尽量采用语言本身特性,然后从结构角度抽象,尝试简化控制流或者重构,最后再考虑从其他的角度进行抽象。
duangsuse::Echo
除非写 Lisp,我习惯的是让代码从直觉上易于理解。尽量采用语言本身特性,然后从结构角度抽象,尝试简化控制流或者重构,最后再考虑从其他的角度进行抽象。
仅仅简化控制流是不够的,还要顾及数据流。算法虽然主要是「程序」,但它的目标是「数据」。

大佬说 OOP 的 message passing (to receiver) 不如 Haskell 复用性高,我只能说是仁者见仁。 Haskell 可以把数据和算法一起建模但它不像 OOP 有继承和封装,而我说的是“复用性”
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