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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
> 说实话java的 notnull String+null会报出空指针异常真的是缺德啊(所以养成了String==null?"":String的不良习惯 提到这个,就不得不说 string concatenation 的标准了... 另外 null 就是 null,String 肯定是 Object 啦,好像不能认为 null 是一种 Object 不过我不知道为啥这里有个 String#isNullOrEmpty.... emmm 我以为是应该抛 NPE 的(OOP 的方法调用 receiver 是空)…
Java 9 以上会使用 StringConcatFactory 的 makeConcatWithConstants 来进行转换(不过也能拿到相同的结果)
然后 Java 8 会生成以下的字节码
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=1, args_size=1
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: ldc #5 // String a
12: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: aconst_null
16: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
19: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: return
LineNumberTable:
line 3: 0
line 4: 25


看起来就是把 null 作为 Object 往 StringBuilder 里赛了

jshell> StringBuilder builder = new StringBuilder()
builder ==>

jshell> builder.append("a")
$2 ==> a

jshell> builder.append((Object)null)
$3 ==> anull
duangsuse::Echo
Java 9 以上会使用 StringConcatFactory 的 makeConcatWithConstants 来进行转换(不过也能拿到相同的结果) 然后 Java 8 会生成以下的字节码 public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=1…
搞基 Jawa9
这厮怕是要能优化别人

final as = new String[] {"a", "v", "c"};
String fin = "";
for (String a : as) {
fin = fin + a;
}

这种程序了
rt. idea 说 ex 肯定是 null
唉,没用的,只有讨论那些有前途的工程技术才可能有人看,我这种人.... 呃.... 你们懒得看。

什么 C 啊、Haskell 啊、编译器啊、静态分析静态检查啊、关系代数啊,算法啊、操作系统啊、软件工程理论啊.... 如果只是作为『赠品』都是浮云

流行的就是那么一点,一招鲜吃遍天,开始的专业得选流行的做才好。

我以后要是上大学,不管专科本科,就和 drakeet 一样,我要学开发,写应用。
偶尔写点好玩点的库什么的... 虽然应用层真的是水浅... 真的就是无脑的堆积,没意思的复制抄改.... 离了网络不能编程...
我真的不想总是写没有 GUI 没有 pattern 的东西,但是也没时间写那些比较耗时的... emmm....

有前途多好... 🙁
计算机科学... 有什么前途
看上次华为吹的,还不如让几个计算机科学的过来整呢。
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
唉,没用的,只有讨论那些有前途的工程技术才可能有人看,我这种人.... 呃.... 你们懒得看。 什么 C 啊、Haskell 啊、编译器啊、静态分析静态检查啊、关系代数啊,算法啊、操作系统啊、软件工程理论啊.... 如果只是作为『赠品』都是浮云 流行的就是那么一点,一招鲜吃遍天,开始的专业得选流行的做才好。 我以后要是上大学,不管专科本科,就和 drakeet 一样,我要学开发,写应用。 偶尔写点好玩点的库什么的... 虽然应用层真的是水浅... 真的就是无脑的堆积,没意思的复制抄改.... 离了网络不能编程...…
恕我直言,应用层真的是浅薄...

比如说,你只需要知道几个名字就可以写代码...

比如 Android 的 support annotations,

@MainThread @WorkerThread @NonNull @Nullable @RequireApi @RestrictTo

比如那个 LayoutFormatter 的 Gradle 插件,我现在就能默写下来(不包括包名,因为太长了没去记)

首先有一个 Task 对象,我们抽象的是 Task
这个 Task 要知道自己要 Format(就是 File readText/process/writeText)哪些文件,我们有 Gradle 的 ConfigurableFileTree 抽象

@Task
class FormatTask extends Task {
private ConfigurableFileTree xmlFiles;

public FormatTask(ConfigurableFileTree tree) { xmlFiles = tree; }
@Override public void run() {
for (File f : xmlFiles.files()) {
Path fp = sun.nio.Paths.getPath(f.toURI());
String fp_contents = new String(sun.nio.Files.readAllBytes(fp));
String fp_pretty = format(fp_contents);
Files.write(fp, fp_pretty.getBytes());
}
}
}

然后我们要有一个 Plugin 类来注册这个 Task,groovy 会 apply from 'path.to.class' 来 Apply 一个 Plugin 到 RootProject

class XmlFormatterPlugin extends SimplePlugin {
@Override
public void apply(Project proj) {
final FormatTask ftask = new FormatTask(getXmlFileTree(proj));
proj.getTasks().create("format-layout", "Format Android XML Layout resources", ftask);
}

private static ConfigurableFileTree getXmlFileTree(Project proj) { return proj.fileTree(makeFileTreeArg(".", "**/*.xml")); }

private static HashMap<String, String> makeFileTreeArg(String dir, String include) {
HashMap<String, String> argt = new HashMap<>();
argt.put("dir", dir); argt.put("include", include);
return argt;
}
}

平铺直叙,毫无 ABC(Assignment、Branches、Conditions)
这才是我不想写太多应用的理由... 有时候真的是我没有时间写应用
其次是现在写这些没意思
默写错(做其他开放定义的修改后没错的除外)的有:

FormatTask#run 可能抛出未捕获的异常 IOException,但是没有标记

XmlFormatterPlugin 使用了 A 类实例 Project#getTasks()
但是 A 类没有 create(String, String, Task): void 这个方法(但是有 create(String, Class<? extends Task>, Consumer<? extends Task>): void

Project#fileTree(Map<String, String>) 的第一个参数是 List 而非 Map
.... 还有些名字的错误,不过 IDE 都可以解决了
你 block 了也没有用... 他又不看,我的处理方式就是直接 ignore 掉,和你意见性格不合的人可能很多,不喜欢直接不交往即可

反正我这个人也天生隔绝交往.... 😭
duangsuse::Echo
Python files/lines/code/doc/blanks 6 / 1372 / 1020 / 100 / 252 一个 GIMP 插件,欲安装请速 INSTALL 待会会有功能展示和使用帮助
This media is not supported in your browser
VIEW IN TELEGRAM
跪求 star.... 好歹我也熬了两天夜啊
这里不针对任何人,只是有感而发,对不起冯老师了...

有时候觉得说国内的 #Android 大佬...
很多时候不过就是应用层的开发人员而已,连框架都没写过...
也做不出什么有创意的东西来...
也不真正了解自己处在的 Android 平台
也不尝试去理解任何图形界面应用,Desktop 还是 Mobile 的 common pattern
也不去多学习一点,多提升自己....
也不学学 Google, Square, Bumptech, GuardSquare, Xposed, Magisk, Anko, Realm, JakeWharton, ASM, Groovy, SpringBoot 那样,做点能广为人用的东西出来...
最多也就弄个可能很平凡容易复制的平台而已... 那种耗时却不需要什么不错的点子的东西,而且重视营销,老是喜欢抄...

我很困惑... 我觉得这种一直在当码农从来没做过太多事情的大佬真的不应该叫大佬...
难道中国的程序员全都是这样的?都只有一点行动力?都没有多么高的编程功底?

中国有大佬,也有做 Android 开发的大佬,可是我觉得平时能看到对一切都有点理解或者最基础的了解的人,还是少数...
Forwarded from 芝士和培根 (YuutaW 鱼塔)
这里推荐一下冯老师 ( @oasisfeng ) 的 Twitter: https://twitter.com/oasisfeng 。冯老师不仅是一位 Android 界高手,他的 twitter 也非常有含金量,推荐关注。

#未分类
#sb (撕逼) #China #android https://t.me/dsuse/10339

其实我很喜欢撕逼?(跑
其实我只是想围观

好不容易我看到了 drakeet 以他的新性格又被卷入了撕逼中....
话说我的性格变了吗?肯定变了,但是我自我感觉我依然是友好的(

虽然 drakeet 的确是有理.... 但如上所说,我很感兴趣这些...

其实 drakeet 的老性格就有可能会引发撕逼了已经...

比如说他之前『自己都看不懂』的『混淆技术』,我要发肯定语气就会弱一点,至少不会... 显得他容易自满...

虽然他之前的确是有努力的,可是这自满... 怎么说,而且他离开大学之后也未必又真的技术上有太大的进步。

真的最好不要自满的。"满招损""谦受益"
原因大家都知道,想想身边那些不受欢迎的人,30% 左右都是不能“正确“认识自己和别人遭致各种冲突的

世界著名的发明家爱迪生,晚年变得骄傲自负,甚至对手下的人说:"不要向我建议什么,任何高明的建议也超越不了我的思维。"这样,他堵塞了自己智慧的源泉,丧失了前进的动力,也就不可能再有什么重大的发明了。

对比一下 drakeet 回复我『或许可以实现支持手动排序的同时自动排序剩余项?』消息的态度,越来越不耐烦:任何建议,如果是反对我之前哪怕是可能不确定的理解,我都很难去接受

当然关于这件事情技术上的问题,我后来在自己的频道发了自己的理由:

某排序算法:5 没有被手动排序过,5 在 1 前面,4 被手动排序过,4 也在 1 前面,可 5 和 4 谁在谁前?


===========
真的有完人吗?你觉得自己的技术到现在完整了吗? 🤔
这是一个值得我们去思考的问题。

《逍遥游》(又胡乱扯)里把鹏和蜩与鴬鸠做了对比:

“当鹏飞往南海时,水浪击起达三千里,借着旋风盘旋直上九万里,它是乘着六月的大风飞去的。”野马般奔腾的雾气,飞扬的灰尘,以及生物都是被风所吹而飘动的。天色苍茫,难道是它真正的颜色吗?还是因为太远太高,看不到它的边际呢?鹏往下看,也是这样罢了。再说,水蓄积得不深厚,那么它就没有力量负载起大船。把一杯水倒在堂上的低洼之处,一根小草就可以成为船。如果把一个杯子放上去,就会被粘住,这是因为水浅而船大了。风力积蓄得不大,就没有力量承载巨大的翅膀。所以鹏高飞九万里,那风就在它的下面,然后它才可以乘风而行。鹏背负着青天而无所拦阻,然后才开始向南飞行。

蝉和小斑鸠讥笑鹏说:“我们奋力而飞,碰到榆树和檀树就停止,有时飞不上去,落在地上就是了。何必要飞九万里到向南海去呢?”到近郊去的人,只带当天吃的三餐粮食就可当天回来,肚子还是饱饱的。到百里外的人,就要准备一宿的粮食。到千里外的人,要聚积三个月的粮食。蝉和小斑鸠这两只小虫又知道什么呢。

或许,怎么看自己的技术水平,就是对自己预期的『小大之辩』吧

我本来就已经很菜了,希望我永远都不要是完人,要不然,我真的没法混了(跑路)🙈

我自己是怎么样的,我就不说了,但是这里有一个答案:

#Zhihu 回答:你在编程的过程中会通过做出一点东西而觉得自己比周围人厉害很多从而获得爽感吗?

note: 上面加『』的原因是,我觉得『使用某某工具』不能拿来吹,所以有点点奇怪的感觉...
Forwarded from 层叠 - The Cascading
「纯纯写作」的开发者 Drakeet 决定将分享平台从 Telegram 移动到知识星球。相关公告中也提出了 Telegram 频道不适合此种分享的几个理由。

说得挺对的。Telegram 频道确实对评论也不是很友好。在分享这件事上,也不能指望它能和知识星球这样的专门平台一样好。

原文:https://t.me/drakeets/1605
#web https://railsgirlsjr.com/guides/sc/
复习了一下 MVC

首先,基本任何应用程序都需要依赖管理和运行时

所以有 GEM Management 和 RVM

然后,Web 框架所谓框架,就是要能自行的根据提供的信息做一些自动化完成的事情

所以有 Rails Generators

然后是 MVC

MVC 有一个流行的概念,REST,表述式状态转移,把实体的状态变动映射到 HTTP 和 URL 上,被映射的实体集合被称为 Resources

MVC,首先第一个是 "M", Model

Model, data model, 你的数据模型,Rails 有 ActiveRecord ORM

第二个是 "C", Controller

Controller,控制器,是暴露数据模型为可操作(比如,CRUD,Create-Read-Update-Delete)的一种方式,控制器绑定到一个『context path』提供指定域(比如 user, comment, admin)的服务访问

Rails 提供的抽象是 ActiveController

第三个是 "V", View

View,视图,美是智慧的体现,只要有了 Windows,DOS 没人会用

Rails 提供了 Ruby 内置的模板系统,ERB,Embedded Ruby 结合 ERB 模板来展示数据

模板语言是这样的(HTML,ERB):

ETML_ADDS = <<EERB
<!DOCTYPE html PUBLIC>
<html lang="en">
<body>
<ul>
<% [1,2,3].each do |i| %>
<li><%= i %> + 1 = <%= i + 1 %></li>
<% end %>
</ul>
</body>
</html>
EERB

require 'erb'
erb = ERB.new(ETML_ADDS, nil, '<>')
erb.filename = 'adds.html'
puts erb.src
erb.run

#coding:UTF-8
_erbout = +''; _erbout.<< "<!DOCTYPE html PUBLIC>\n".freeze
#...
;  [1,2,3].each do |i| 
_erbout.<< " <li>".freeze; _erbout.<<(( i ).to_s); _erbout.<< " + 1 = ".freeze; _erbout.<<(( i + 1 ).to_s); _erbout.<< "</li>\n".freeze
; end
_erbout.<< "</ul>\n".freeze
#...

<ul>
<li>1+ 1 = 2</li>
<li>2+ 1 = 3</li>
<li>3+ 1 = 4</li>
</ul>

至于模板程序相信都会写啦(跑路
简而言之,<%%> 里的是 Ruby 处理的代码,给 Ruby(可能是给下文的 %= 用的)
<%=%> 里面的是 Ruby 输出的代码,给 Ruby 处理求值,结果输出
其他的是不相干的东西,直接输出。
吐槽一下,Ruby 怎么没有强行按照关键字传递参数的功能...