duangsuse::Echo
#ML #Python 接下来安装一点用于数据分析的东西 pip3 install --user --compile -U pandas matplotlib sklearn 如果有权限你也可以去掉 --user flag,-U 的意思是如果有的话安装更新 我们使用 Python 3,当然,要是有 IPython 和 Spyder 这种为数据分析 REPL 优化的东西就更好了,不过下面直接用 IPython3 现代机器学习算法主要包含概念学习、规则学习、基于解释学习、基于实例学习、遗传学习、强化学习…
还是 sin wave 之类的数据,
Pandas 的
只需要使用 EDSL(内部领域专属语言)操作它的实例就可以快速获得好看的数据图了,不需要不断去 plot 啊 add seris 再设置 xlabel ylabel 啊,都被良好封装(styles, chart type)了
上面本频道也有过 Ruby + GNUPlot 的版本
matplotlib
可以这么用:from math import sin, cos, tan
from numpy import arange, array
from matplotlib import pyplot
from pandas import DataFrame, Series
xs = arange(0, 100, 0.1)
sinys = [sin(x) for x in xs]
cosys = [cos(x) for x in xs]
tanys = [tan(x) for x in xs]
plot.style.use('Solarize_Light2')
DataFrame(array([[xs], [sinys], [cosys], [tanys]]), columns = 'x sin(x) cos(x) tan(x)'.split())
... 不行def kv(name): return (name, globals()[name])
func_tab = DataFrame.from_items(dict(kv(xs), kv(sinys), kv(cosys), kv(tanys)))
... 不行waves = DataFrame()
waves['x'] = xs
waves['sin(x)'] = sinys; waves['cos(x)'] = cosys; waves['tan(x)'] = tanys
waves.index.name = 'x'
waves.plot(title='Triangle waves')
就可以得到好看的折线图了,并且非常容易使用Pandas 的
DataFrame
就是字面意义上的数据框:一打可能有名字(index
)的数据序列(pandas.Series
)只需要使用 EDSL(内部领域专属语言)操作它的实例就可以快速获得好看的数据图了,不需要不断去 plot 啊 add seris 再设置 xlabel ylabel 啊,都被良好封装(styles, chart type)了
上面本频道也有过 Ruby + GNUPlot 的版本
Telegram
duangsuse::Echo
require 'gnuplot'
xs = []; ys = []
_dataset = r.map { |it| it['published'] }
ps = _dataset.sort_by { |d| d.day }.reverse.each { |k| xs << k.day; ys << _dataset.count { |it| it.day == k.day } }
Gnuplot.open do |p|
Gnuplot::Plot.new(p) do |plot|
plot.title…
xs = []; ys = []
_dataset = r.map { |it| it['published'] }
ps = _dataset.sort_by { |d| d.day }.reverse.each { |k| xs << k.day; ys << _dataset.count { |it| it.day == k.day } }
Gnuplot.open do |p|
Gnuplot::Plot.new(p) do |plot|
plot.title…
#Ruby
Dir.glob('.*').let { |fs| fs.zip(fs.map { |name| name.gsub(//){$1} }).each { |c| o,n=c; File.rename(o, n) } }
for ln in $<.each_line do好久以前的 #Ruby
next unless ln.start_with?('mv')
_mv, src, dst = ln.split
puts("mv #{dst} #{src}")
end
def bulkRename(re_src, pat_dst, fmt_dst)
re_dst = Regexp.new(pat_dst)
selected = Dir.glob(re_src)
for name in selected
newnam = name.gsub(re_dst, fmt_dst)
puts("mv #{name} #{newnam}")
File.rename(name, newnam)
end
end
case ARGV.size # Just br size is OK
when 0 then warn("Usage: #{$0} [select] re_dst fmt_dst")
when 1 then puts(Dir.glob($*[0]))
when 2 then bulkRename('*', $*[0], $*[1])
when 3 then bulkRename($*[0], $*[1], $*[2])
end
说实话,看到 #Ruby 关系式求解器 里作者实现了个
作者的实现方式也很奇怪, interleaveWith 就是
Iterable.interleave_with
我觉得挺奇怪的,真的是要 interleave? 总觉得可以 zipWith 什么的,但作者的水平又不可能不知道 zipWith作者的实现方式也很奇怪, interleaveWith 就是
(xs=[a, b], ys=[c, d]) res=[a, c, b, d]
而已,但他用的方式是一个 Array 不断 push pop 这么 cycle 下去的
duangsuse::Echo
https://github.com/corsis/XParsec/blob/master/XParsec.fs#L99 看不懂。 看到 Sigma 我还以为是表达 Sum type (safe union) 的呢,真是无语╯﹏╰ 不过多向输入的解析 ParserKt 就收下作 NonlinearFeed 了,虽然我不知道有什么用,但反正 state 和 BaseJoinBy 这种极端情况的 API 都有了,多加一个也正好能让 alsoDo 有用点(不过 Feed 为避免用 Character 泛型引用造成不必要的开销,看来只能把…
嗯…… 谈到 XML 解析突然想到 #Java 的 SAX(Simple API for XML) 和 XMLPull
React 用的也好像 E4X(ECMAScript for XML) 啊
我常区分函数的『主动』与『被动』,比如说计算就是主动,事件和入口就是被动;其实工程界把 push 称为主动, pull 称为被动(当然和 git pull 不同😂),这也是一个比较 English 化的词
XMLPull 被称为最快的 XML 解析器,其实准确来讲它只是一种数据封装思路——不直接新分配并提供数据对象,而是把尽可能裸值化的它提供给 onXXX 函数(比如你只是找 <a href> 就没必要构造整个 Document 对象),这样就能大幅减轻 GC 压力(C++ 也就没必要用 shared_ptr 了,因为根本不存在对象引用,只有虚表的覆写函数)
这个思路其实也怪好的,而且它也能兼容(利用数据栈)构造如 XMLNode 的递归结构,从而作为可扩展的底层来提供。
之前用过 #Ruby 的 XML 解析器 Nokogiri ,那叫一个烂…… 它不是 XMLPull 模式却有“高性能”的觉悟, Node.attributes 都是 Array 非 Hash... 貌似连 CSS selector 也没有只支持 XPath,实在是太草了
说起来, ParserKt 也包含这种思路。
虽然 Pattern<T> = (Feed,ShowReq?) -> T 是明确要『主动』构造 T (这样看起来它的性能不如 ANTLR, GLL, LALR 这类状态栈算法的『被动』 action)
一方面, ParserKt 的可组合性允许创建不依赖 Pair/Triple/Tuple 的 Seq 而可以复用余下所有定义,是能够通过切换少数调用来支持 pull 模式的 event listener 的
另一方面,pull 一定比 push 快因为使用了“高级算法” 其实是常见的误区,而且对DSL解析器而言构造AST数据是主要目的,实际上有 JS 解析器框架里,JSON 跑分结果最好的反而是手写递归下降法,且 Lua 初版是利用 YaCC 生成解析器,后来反以手工重写。
虽然这种方法有 push 的一些固有限制——阻塞、不能统一处理错误消息/部分结果,但它的高代码质量却能带来意想不到的优化,而这种方法支持的文法并不比 pull 少。
有时候选择代码质量、高抽象度、简化的底层接口并不意味着牺牲性能,因为在其上下建立的实现技巧完全可能追回那点小小的开销。
比如,Fold 模式能支持 asInt(16) 这类已经是最低开销的数值读取,而无需“action”将其“rewrite”成 String.toInt ,从不需要用左递归蹩脚的语法来“优化”,而对于参数列表之类也无出其二, asList() 甚至还能 asMap() ,避免创建多余的结构去保留临时 String/List<Pair> ,直接从提出值到构造大结果,何尝不是一种 XMLPull 式思路
尽管用“万能的”左递归优化可以实现 Fold 和 OpChain 所解决的问题,但没人用它——实际上有 DSL 设计需求的人还不少,但有多少人会把 digits 定义成 (digits digit)|digit 的形式?大家看到左递归链的优先级解析就糊涂,甚至不知道为什么加减在前乘除在后
想像一下,如果一个人为了优化 ES5 的解析器而把所有能 Fold 的循环重写其 action,变成左递归定义,看起来会如何?
所以唯一的解决方案就是简化表示法本身,分清主次,用适度特例化的 API 取代“万能” “广义”的“好好先生”们。
React 用的也好像 E4X(ECMAScript for XML) 啊
我常区分函数的『主动』与『被动』,比如说计算就是主动,事件和入口就是被动;其实工程界把 push 称为主动, pull 称为被动(当然和 git pull 不同😂),这也是一个比较 English 化的词
XMLPull 被称为最快的 XML 解析器,其实准确来讲它只是一种数据封装思路——不直接新分配并提供数据对象,而是把尽可能裸值化的它提供给 onXXX 函数(比如你只是找 <a href> 就没必要构造整个 Document 对象),这样就能大幅减轻 GC 压力(C++ 也就没必要用 shared_ptr 了,因为根本不存在对象引用,只有虚表的覆写函数)
这个思路其实也怪好的,而且它也能兼容(利用数据栈)构造如 XMLNode 的递归结构,从而作为可扩展的底层来提供。
之前用过 #Ruby 的 XML 解析器 Nokogiri ,那叫一个烂…… 它不是 XMLPull 模式却有“高性能”的觉悟, Node.attributes 都是 Array 非 Hash... 貌似连 CSS selector 也没有只支持 XPath,实在是太草了
说起来, ParserKt 也包含这种思路。
虽然 Pattern<T> = (Feed,ShowReq?) -> T 是明确要『主动』构造 T (这样看起来它的性能不如 ANTLR, GLL, LALR 这类状态栈算法的『被动』 action)
一方面, ParserKt 的可组合性允许创建不依赖 Pair/Triple/Tuple 的 Seq 而可以复用余下所有定义,是能够通过切换少数调用来支持 pull 模式的 event listener 的
另一方面,pull 一定比 push 快因为使用了“高级算法” 其实是常见的误区,而且对DSL解析器而言构造AST数据是主要目的,实际上有 JS 解析器框架里,JSON 跑分结果最好的反而是手写递归下降法,且 Lua 初版是利用 YaCC 生成解析器,后来反以手工重写。
虽然这种方法有 push 的一些固有限制——阻塞、不能统一处理错误消息/部分结果,但它的高代码质量却能带来意想不到的优化,而这种方法支持的文法并不比 pull 少。
有时候选择代码质量、高抽象度、简化的底层接口并不意味着牺牲性能,因为在其上下建立的实现技巧完全可能追回那点小小的开销。
比如,Fold 模式能支持 asInt(16) 这类已经是最低开销的数值读取,而无需“action”将其“rewrite”成 String.toInt ,从不需要用左递归蹩脚的语法来“优化”,而对于参数列表之类也无出其二, asList() 甚至还能 asMap() ,避免创建多余的结构去保留临时 String/List<Pair> ,直接从提出值到构造大结果,何尝不是一种 XMLPull 式思路
尽管用“万能的”左递归优化可以实现 Fold 和 OpChain 所解决的问题,但没人用它——实际上有 DSL 设计需求的人还不少,但有多少人会把 digits 定义成 (digits digit)|digit 的形式?大家看到左递归链的优先级解析就糊涂,甚至不知道为什么加减在前乘除在后
想像一下,如果一个人为了优化 ES5 的解析器而把所有能 Fold 的循环重写其 action,变成左递归定义,看起来会如何?
所以唯一的解决方案就是简化表示法本身,分清主次,用适度特例化的 API 取代“万能” “广义”的“好好先生”们。
GitHub
GitHub - benjamin-hodgson/Pidgin: A lightweight and fast parsing library for C#.
A lightweight and fast parsing library for C#. Contribute to benjamin-hodgson/Pidgin development by creating an account on GitHub.
duangsuse::Echo
😃 那么,简而言之,我觉得有价值的信息: def get_link(h); "https://tttttt.me/dsuse/#{h['debug']['no'] + 9511 + 20}"; end + 一共统计了 187 条消息。 2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse + 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签 + 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签…
#Ruby
草 好怀念啊; Ruby 的 OOP 是怎么玩的都忘掉一大半,还好基础语法、控制流和 mixin 什么的都没忘... 🤪
不过 gem 工具下载也没个提示,还不如 pip 。这些脚本语言的开发者很多人都喜欢搞 term color ,但是竟连搞好交互和灵活性都不会
什么时候能写 bash_completions 才能算好的 cli 开发者吧
Python 的各种新 pm 不用 pip 和 setuptools 都不会弄了, Ruby 还是自带 bundler, install 。
真的搞不懂 isolation 是在干什么,为什么要 isolate dependencies 啊,为什么要 venv 啊,直接用系统版本,向前兼容不好吗
妈耶, MRI 2.6 的 libruby.so 更新,还要这么操作才能修复老库,试了半天 #GitHub 发现还是只能按官方用 bundler 来... 不然识别不了插件
这个东西把
还好渲染是正常的,所有 md 文件不管带不带 header 都支持
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
草 好怀念啊; Ruby 的 OOP 是怎么玩的都忘掉一大半,还好基础语法、控制流和 mixin 什么的都没忘... 🤪
不过 gem 工具下载也没个提示,还不如 pip 。这些脚本语言的开发者很多人都喜欢搞 term color ,但是竟连搞好交互和灵活性都不会
什么时候能写 bash_completions 才能算好的 cli 开发者吧
Python 的各种新 pm 不用 pip 和 setuptools 都不会弄了, Ruby 还是自带 bundler, install 。
真的搞不懂 isolation 是在干什么,为什么要 isolate dependencies 啊,为什么要 venv 啊,直接用系统版本,向前兼容不好吗
sudo gem pristine commonmarker
妈耶, MRI 2.6 的 libruby.so 更新,还要这么操作才能修复老库,试了半天 #GitHub 发现还是只能按官方用 bundler 来... 不然识别不了插件
echo 'gem "github-pages", "~> 211", group: :jekyll_plugins'>Gemfile
bundler exec jekyll s
这个东西把
Others/CommentBot/vertxBusGen/build/js/node_modules/balanced-match/README.md
的 node_modules 也 include 进去了,结果 Liquid 模板语法错误 😂还好渲染是正常的,所有 md 文件不管带不带 header 都支持
GitHub Pages
Dependency versions
GitHub Pages uses the following dependencies and versions
#HTML #JS #DontKnow 你知道吗? 🤔
HTMLElement 的
如果不用 JQ ,可选注册
element 和 node 的区别在于,前者只能是 <a> <b> <div> 这样的元素,后者可以是
HTML 里基于 XML 的部分有三种情况:
有许多方法可以缩写 HTML ,最常见的是基于 CSS 选择器的 emmet.io 和基于缩进的 模板语言 #Ruby slim-lang.com ,而
想在社交平台分享自己的网站, OpenGraph 了解下?
-
-
- JS 最不常用的两个关键字:
如果用
HTMLElement 的
remove()
和 replaceWith(e1)
都不需要手动拿 e.parentElement
,只有 insertBefore(e1, e)
需要在 parent 上如果不用 JQ ,可选注册
document "DOMContentLoaded"
或 window "load"
事件element 和 node 的区别在于,前者只能是 <a> <b> <div> 这样的元素,后者可以是
#text
文本标签。HTML 里基于 XML 的部分有三种情况:
<meta charset="UTF-8">
的单独标签、 <div></div>
的配对标签(with childNodes
)、 <link rel="stylesheet"/>
的折叠(collapsed)标签,有些配对标签也有折叠形式,但折叠和 no children 是不同情况。有许多方法可以缩写 HTML ,最常见的是基于 CSS 选择器的 emmet.io 和基于缩进的 模板语言 #Ruby slim-lang.com ,而
DOMParser
本身也支持兼容解析修正一些不完整的文档。想在社交平台分享自己的网站, OpenGraph 了解下?
-
!!""
和 !!0
、 !![]
都是 true ,第一点往往造成隐患 必须详细检查-
undefined == null
,所以有时用 === 区别严格相等性- JS 最不常用的两个关键字:
delete o[k];
和 v=with(o,o1) { attr }
许多时候:如果用
e.onclick =
的简写,在任何地方的(其他)脚本重复注册时会导致覆盖,所以尽可能用 addEventListener
JS 里较短参数的函数兼容较长处的类型限制(允许无视参数),但在调用时省略默认参数可能造成性能问题,在绘图/大批/频繁处理时,需要多用图形界面的 profilerogp.me
Open Graph protocol
The Open Graph protocol enables any web page to become a rich object in a social graph.
#js #DontKnow 原型链:(感谢 @JackWorks 提供相关信息)
访问语法都是动态解析的,比如
- 普通对象 [规范]
-
- 类数组对象(数组的特殊行为就在这里)
- 模块对象(
-
此外,
原来是往 proto 上找属性!
这就解释了
因为在这个算法里你可以看到,Receiver 是跟着递归一路传递下去的
原来是
本地如果有就不会查 prototype 了
明白了,和之前写的 LuaOOP 很像,都是层叠属性查找
“ 大佬能交换下原型链相关知识吗
之前看加 Mixin 好像是说把 prototype 除了哪两个属性的什么全部复制一下
#Python 和 #Ruby 的情况我都了解, Py 是 mro() 链查询,
https://paste.ubuntu.com/p/tJv7QpSjGt/ liuil-util 的 #TypeScript mixin.ts 重写
访问语法都是动态解析的,比如
x.prop
或 x["prop"]就是
x.[[Get]]("prop", x)ES 里一共有五种不同的
[[Get]]
实现,分别是- 普通对象 [规范]
-
Argument
对象(你们今天应该不会用到了)- 类数组对象(数组的特殊行为就在这里)
- 模块对象(
import * as Mod
里的 Mod
)-
Proxy
对象(reflect proxy 全 delegate)此外,
Object.getOwnPropertyDescriptor(o, k)
可以获取可配置 enumerable, writeable 等属性的配置对象Object.[get/set]PrototypeOf(o)和
o.__proto__
是它的「超类虚表」[[Get]]
过程的 Receiver (第二参数)很重要,如果没有这个 Receiver,基于原型链的 OOP 其实是做不起来的原来是往 proto 上找属性!
这就解释了
Array.prototype.map
之类的东西parent = { method() { return this; } }最简单的解释是, Receiver 就是属性访问的时候最上层的那个对象,会被当成
child = {}; child.__proto__ = parent;
child.a = 1; child.method(); // 返回自身
this
用。因为在这个算法里你可以看到,Receiver 是跟着递归一路传递下去的
原来是
o["RESOLVE"](o.prototype, "attr", receiver=o)
!(当然,肯定是先查本地,然后才查 prototype本地如果有就不会查 prototype 了
明白了,和之前写的 LuaOOP 很像,都是层叠属性查找
“ 大佬能交换下原型链相关知识吗
之前看加 Mixin 好像是说把 prototype 除了哪两个属性的什么全部复制一下
#Python 和 #Ruby 的情况我都了解, Py 是 mro() 链查询,
A.wtf
和 a.wtf
都是往 class A 找成员,后者实质是 type(a).wtf(a)
所以得到 bound method ,而直接 A.wtf
就是 bind 操作@staticmethod
直接不收 self ,不需要 bound 所以可以在类和实例上用https://paste.ubuntu.com/p/tJv7QpSjGt/ liuil-util 的 #TypeScript mixin.ts 重写
Telegram
duangsuse::Echo
#Lua #oop #PL 🤔刚才体验写标准Android之前又把 LuaOOP 默写了一遍,构造器调用子类优先了,重写后果然感觉优化了不少(也提升了效率编程自信心)
#PLT #Scala #Java #Ruby #Rust #learn https://ray-eldath.me/programming/thoughts-on-rust-1
总结几句:
Java 是主流的托管(managed) 语言,重量级的 GraalVM JS 甚至比 v8 更快,尽管有 valgrind, cppcheck 等工具, 90% 的 CVE 都是 #clang #cplusplus 内存不严谨导致的安全问题,所以托管更适合实际应用。
Scala 是重视语言特性可组合性的函数式语言,它连
Ruby 是一个灵活优雅的脚本语言,你可以 mokey patch
Ruby 的 {|x| x} closure 即闭包语法也被 Rust 使用,连 for 语法本质都是用
Rust 是 be explicit 的语言,它重视内存片的所有权等比 C 方便而失严谨的概念,但同时也加入了
Rust 的 Copy 和 Clone (深浅复制) 都是作为 trait 显式的,而浮点数判等 Math.EPSILON 也是应显式的
嘛,比起『子语言』我可能更倾向『语法集』『语言功能点语法集』这种更精确的描述
总结几句:
Java 是主流的托管(managed) 语言,重量级的 GraalVM JS 甚至比 v8 更快,尽管有 valgrind, cppcheck 等工具, 90% 的 CVE 都是 #clang #cplusplus 内存不严谨导致的安全问题,所以托管更适合实际应用。
Scala 是重视语言特性可组合性的函数式语言,它连
enum class
都没有,而用 enum 的本质 newtype (受检的 typealise) 和直接的 extends 解决枚举类型;它的类型都是 higher kind 上的星号实现的,而构造函数类型的箭头是接收任意(包括函数)类型的二参操作符 #functional Ruby 是一个灵活优雅的脚本语言,你可以 mokey patch
Int.+
运算符让 REPL 都爆炸,它也支持 case when guardsRuby 的 {|x| x} closure 即闭包语法也被 Rust 使用,连 for 语法本质都是用
.each do
闭包,运行时很少阻止程序员执行能解释的代码(但没有 JS 的疯狂隐式转换)并且支持内省(introspect)Rust 是 be explicit 的语言,它重视内存片的所有权等比 C 方便而失严谨的概念,但同时也加入了
format!()
等编译期 macro 的支持,也是一门重视严谨性、定义一致性的语言Rust 的 Copy 和 Clone (深浅复制) 都是作为 trait 显式的,而浮点数判等 Math.EPSILON 也是应显式的
嘛,比起『子语言』我可能更倾向『语法集』『语言功能点语法集』这种更精确的描述
Ray Eldath's Blog
简单聊聊编程语言的哲学,以及关于 Rust 的一些想法 (1)
本文是一篇「小作品」。 草,写着写着发现越写越长,一点也不「小」嘛。 或许我真的应该尝试一下「小」作品的体例才是。 我的长期TODO列表里已经躺着五六篇以“博文”开头的条目——原本想着寒假一周一篇很快就能写完,然而到现在也没动笔。爆肝填坑了一个星期,今天实在有点累,不大想打开 RustLion,于是把这篇坑了很久的文章写一写。 在这几篇坑了这么久的文章中其实有一篇已经写了前半部分了,然而咕了
duangsuse::Echo
#日常精神分裂 #旧事重提 #Java #JS #PLT #cplusplus #project A: 啊真的很头疼呢, JPlayer 的 fix 和 depth.html 附赠的 Myson 数据描述语言…… B: 像往常一样,我们一起想想吧。 A: 首先说 JPlayer ,这个原先是作为重写 Yuuta 大佬项目的东西,变的蛮多的,后来也有完全的 C++ 重写。 这个东西最后也是长期熬夜 timedout ,失败点是为优化性能加的 Ringbuffer 队列缓冲区利用有瑕疵,导致最后一次缓冲的内容没放完退出…
#Ruby https://haml.info/ 按现在的计划那个 HTML 预处理应该是这样
对比:
—
如果允许省略 tagName 等于 div 的话(RegExp 匹配..),最后一行是
我觉得十分有必要增加 define, include 和 for, if 语句 🤔 可以用作简化版宏调用 进一步避免模板化
对比:
%section.container
%h1= post.title
%h2= post.subtitle
.content
= post.content
—
section class=container增加了个带 : 无换行、缩进。
h1: =post.title
h2: =post.title
div class=content: =post.content
如果允许省略 tagName 等于 div 的话(RegExp 匹配..),最后一行是
class=content: =post.content
我觉得十分有必要增加 define, include 和 for, if 语句 🤔 可以用作简化版宏调用 进一步避免模板化
duangsuse::Echo
#windows #sysadmin bcdedit /set {default} recoveryenabled No Win10 在 ntfsresize 缩放了 C: mbr 分区后,正常缓慢开启一次,爆炸了,貌似和空间不够有关(第一次给太少了)🌝 现在正无法正常重启中, WinRE 可以说没有用,只会说什么 srt.log ,我看了是空的一个字没有,最后还是 chkdsk/f C: , sfc/scannow, bootrec,bcdboot, dism,diskpart 这些有点用,可惜没法修复问题,开…
发现是 sys32/drivers 的一些 .sys 文件坏了🌚 估计要找人复制
话说 SUSE 安装 DVD 的 linuxrc 也真是方便,只需要指定 linux initrd 然后连使用 iso: 安装 source 都不支持,手动挂载点也不行(非得选 hard drive 还是 cdrom 还是 net 然后自己挂载检查)
害得我不得不把 iso 里的 repodata media.1 x86_64 noarch *.asc 甚至 boot 给复制了一份到硬盘才行……
不过 SUSE 也真是可以啊, YaST 和 Kiwi , OBS 和 OpenQA 都是很知名的 Linux 生态工具
而 #Ruby YaST 支持很多 GUI 前端也包含分区编辑器这些麻烦的功能,非常有新意🌚
systemd 的套装也开始代替各种 pid0 软件了, wicked 也被 NetworkManager 取代了,真的那么厉害吗
话说 SUSE 安装 DVD 的 linuxrc 也真是方便,只需要指定 linux initrd 然后连使用 iso: 安装 source 都不支持,手动挂载点也不行(非得选 hard drive 还是 cdrom 还是 net 然后自己挂载检查)
害得我不得不把 iso 里的 repodata media.1 x86_64 noarch *.asc 甚至 boot 给复制了一份到硬盘才行……
不过 SUSE 也真是可以啊, YaST 和 Kiwi , OBS 和 OpenQA 都是很知名的 Linux 生态工具
而 #Ruby YaST 支持很多 GUI 前端也包含分区编辑器这些麻烦的功能,非常有新意🌚
systemd 的套装也开始代替各种 pid0 软件了, wicked 也被 NetworkManager 取代了,真的那么厉害吗
php:敏杰语言(确信🌚👍 我整个人都敏捷起来了,使用Jawa和Go
都是些JP玩家讨论 asyncio和netty,orm啥哪个好,还有 C#, Go+ DDD.. 魔怔概念
#Ruby 这里有个2D数组编序的..
def spiral_print m
return '' if m.size == 0
m.map(&:shift).join + spiral_print(m.reverse.transpose)
end
妈耶,这mT真的是2D数组..
spiral_print([
['a','b','c','d'],
['e','f','g','h'],
['i','j','k','l']
])
# -> 'aeijklhdcbfg'
噢螺旋向内啊..能看出先是左侧消1,然后末,然后右、始。所以 while m; puts a.map{shift};a.reverse.transpose! ,果然必须转置90度
都是些JP玩家讨论 asyncio和netty,orm啥哪个好,还有 C#, Go+ DDD.. 魔怔概念
#Ruby 这里有个2D数组编序的..
def spiral_print m
return '' if m.size == 0
m.map(&:shift).join + spiral_print(m.reverse.transpose)
end
妈耶,这mT真的是2D数组..
spiral_print([
['a','b','c','d'],
['e','f','g','h'],
['i','j','k','l']
])
# -> 'aeijklhdcbfg'
噢螺旋向内啊..能看出先是左侧消1,然后末,然后右、始。所以 while m; puts a.map{shift};a.reverse.transpose! ,果然必须转置90度
#ruby #plt Quine 编译接龙 https://www.fxzhihu.com/question/30262900/answer/47877068
https://www.ioccc.org/2012/tromp/hint.html #fp lambda 元循环 解释器(https://www.zhihu.com/question/30262900/answer/49589781
Quine(蒯恩)一般是指能打印出自身源码的程序
IOCCC,全称The International Obfuscated C Code Contest (国际难懂C代码大赛),顾名思义,是一场比谁能写出最“让人无语”的C代码的比赛。
btw. 同问题下有个 Shadertoy.com 类的C++答案,太丑了,把 vec3 拆成了RGB三个函数,代码重复率爆炸
还有两个中国特有的:
https://www.ioccc.org/2012/tromp/hint.html #fp lambda 元循环 解释器(https://www.zhihu.com/question/30262900/answer/49589781
Quine(蒯恩)一般是指能打印出自身源码的程序
_='_=%r;print (_%%_) ';print (_%_
)IOCCC,全称The International Obfuscated C Code Contest (国际难懂C代码大赛),顾名思义,是一场比谁能写出最“让人无语”的C代码的比赛。
btw. 同问题下有个 Shadertoy.com 类的C++答案,太丑了,把 vec3 拆成了RGB三个函数,代码重复率爆炸
还有两个中国特有的:
curl --connect-timeout 1 https://google.com 2>&1 >/dev/null &&你在中国
body.contains("的")? "UTF-8":"GBK"。 \u{E79A84} 在GBK是鐨殑,很罕见
FxZhihu / Fixup Zhihu
有没有一段代码,让你为人类的智慧击节叫好? - @朴三世 | FxZhihu
mame/quine-relay · GitHub [图片] [图片] 突然发现已经100种语言了,想看50种语言的进50分支。 [图片] 璀璨无比谈不上,反正让我震惊了会儿,原来可以这样玩
#security #ruby tcpdump https://ruby-china.org/topics/43886
https_instrument 还只是一个玩具,我只测试了一个最简单的例子。对我来说,写这样的工具是一件很有趣的事情。 许多公司的开发机,没有 root 权限,它毕竟也不是科技公司。。。
相比 eBPF ecapture,这种方法除了不用 root 权限外,开发起来也更容易,不需要额外的支持,但 eBPF 是单独的内存空间,操作复杂的 Go 数据结构就极其困难,比如 hash map。
可以用 LD_PRELOAD 替换动态连结库的方法,相应代码。我之前的文章也有相关的介绍。
用 Ruby 构造请求,并用 stack profiling tool 查看请求了哪些方法,从而缩小范围。我用的是 https://github.com/yfractal/sdb
LD_PRELOAD,虽然可以 instrument openssl,但没法改程序本身的代码。理论上,通过改 binary,比如在相应的地址插入 int3,生成新的 bianry,应该可以达到类似的效果,或者直接在编译的时候做相应操作,再或者改 ELF。
相比 eBPF ,个人更喜欢 function Interposing 这种方法
https_instrument 还只是一个玩具,我只测试了一个最简单的例子。对我来说,写这样的工具是一件很有趣的事情。 许多公司的开发机,没有 root 权限,它毕竟也不是科技公司。。。
相比 eBPF ecapture,这种方法除了不用 root 权限外,开发起来也更容易,不需要额外的支持,但 eBPF 是单独的内存空间,操作复杂的 Go 数据结构就极其困难,比如 hash map。
可以用 LD_PRELOAD 替换动态连结库的方法,相应代码。我之前的文章也有相关的介绍。
用 Ruby 构造请求,并用 stack profiling tool 查看请求了哪些方法,从而缩小范围。我用的是 https://github.com/yfractal/sdb
static int Real__SSL_read (void *ssl, void *buf, int num) { return SSL_read (ssl, buf, num); }
extern int __interpose_SSL_read (void *ssl, void *buf, int num);
LD_PRELOAD,虽然可以 instrument openssl,但没法改程序本身的代码。理论上,通过改 binary,比如在相应的地址插入 int3,生成新的 bianry,应该可以达到类似的效果,或者直接在编译的时候做相应操作,再或者改 ELF。
相比 eBPF ,个人更喜欢 function Interposing 这种方法
ruby-china.org
无 root 权限、证书查看 Ruby HTTPS 请求内容
Introduction 本文的代码在 https://github.com/yfractal/sdb/tree/main/sdb-shim 在开发或者排查问题的时候,时常会需要查看请求内容。比如著名的 tcpdump 可以查看 ht...