网友语录 - 第4期

喜欢吃汉堡 我们被恐吓着高考是改变人生的唯一机会,往后又是考研和考公,又是选伴侣。每一个选项好像选错了天就塌了,可是人生其实真的没有那么脆弱,人生的容错率大到你难以想象,功利主义导向的思考方式往往使我们忘却了生命的本质是一场历程。无数人忽略了一个真相,很多事情其实根本没有意义。吃喝玩乐不是虚度光阴,吃苦耐劳也不一定值得歌颂。人生本就是不停的去感受去体验,爱你所爱。可是我们总爱去和别人比较,徒增自己的焦虑内耗。不一定要做世俗大家认为有意义的事,如果你想发呆,看日落数星星都有意义。你只是来体验生命的,不是用来演绎完美的,慢慢接受自已身上那些灰暗的意义。慢慢接受自已身上那些灰暗的部分,原谅自己的迟钝和平庸,允许自己出错,允许自己偶尔断电,带着缺憾拼命绽放,不断尝试、收获、感受然后放下。换成我们都能理解的话就是:在吃汉堡比赛里,输赢并不重要,因为怎么样你都能吃到汉堡。

当你谈A对方却跳过A大谈B时,不是因为对方没有听到,而是因为A对对方是禁忌,是绝望,是不可能。

我们要相信对方有能力照顾好自己的状态,也要让对方相信我们有能力照顾好自己的状态,我们都无需承担对方的那部分。当我们只需要考虑自己的时候,我们就考虑了对方,也创造了充分且自在的互动空间。

西乔 只要你坚持做自己擅长的事总是会有回报的。我觉得只要保持学习能力,不用担心失业。AI 对我学习各种新东西助力不少,也给了我很多勇气。

乔布斯 生命里的那些点看着离散,终会被连起来,这根线叫兴趣,或者叫好奇。

戴汨 好奇就是童心。

懒聪 二十一世纪最稀缺的资源其实是睡眠!

好的关系是亲密有间的,难的点是关系双方对“间”的探索和包容。坏的关系是不亲密但无间的。遗憾的是,美好的关系如同其他美好的事物,稀有,因而珍贵。

卡扎克 洗碗的时候,突然对着碗碟笑了起来,让擦完了桌子的妻子莫名其妙,问我怎么啦。我说:“看着这些不同花色的碟子,就觉得,我们的邻居们真好。”妻子也反应过来,跟我一起笑,说是啊。我们结婚时买了一整套纯色的碗碟,而现在,家里的碗碟各种花色和款式的都有,我们原来那套则少了好几个。因为楼上楼下的邻居们做了好吃的会打发孩子们装个碟子送来,我们做了什么也会回赠,一般都是随手用手边的餐具装,一来而去,各家的餐碟就都混一起了。妻子突然说:“哎!这么一说才意识到,楼下姐姐家蒸锅还在我这里呢,我去还一下。”Бота和қозы 跟着下去了,差不多一个多小时以后娘仨才回来,端着一盘子鸡肉。“阿姨做的,可好吃了,阿姨让我们把我们家的炒锅带回来,但太重了,我们没搬,留在那儿了。”Бота 说。

我 这样的邻居我好想来一打!

dzr 有一种海螺叫缀壳螺,会收集海底的东西粘在自己的壳上,比如其它软体动物的壳的碎片,或者珊瑚的尸体,或者小石头什么的。有的螺只是遇到什么粘什么,有的螺却有自己的喜好,只粘一种东西,或者只粘圆形的,或者只粘尖形的。它们找到一个心仪的收藏,就举在自己身上,举上十个小时,慢慢分泌一种胶水把东西粘住。有的螺粘得挺杂乱,横七竖八的。有的螺沿着自己的螺纹,把藏品排得整整齐齐。我猜测螺总是把东西粘在自己的洞口,随着自己一圈一圈地长大,东西就会沿着螺纹排列了,所以那个壳上的藏品就展示了它们一生的喜好变迁,有的螺真的很专一诶。海螺可能没有什么智慧,可是也有喜好啊。我想,生命体验对所有生命都是平等的吧。

dimlau 再热爱的工作,如果忙碌到无法用心去感受,也会变成负担。活着就要用心感受,或者说,用心感受才是活着。

网友语录 - 第3期

我的生活态度是,早上起床想一想,我有可能活不到今天晚上,晚上上床想一想,我有可能活不到明天早上。-- 德图里子爵(1776-1854),法国贵族

乔布斯 我热爱消费者市场,讨厌企业市场。我们推出了一种产品,告诉每个人,大家自己决定要不要买,这很简单。但是,企业市场不是这样,使用产品的人自己做不了主,而做主的人不使用产品。

我们拥有的机会并没有我们以为的那么多。太多事情你以为还有的是机会去做,其实已经没有了或者几乎没有了。

米福根 女儿回家的周末,与我一起和外公外婆分享我们的平常生活:去生物博士开的二手店买旧衣服,去南瓜节买当地产当天收的蔬菜,去老厂房看本市家禽俱乐部为下个周末布展。每一个场景,都是大家在热忱地做自己喜欢的事情,这应该就是传说中的安居乐业。

米福根 恋爱的智慧,不是试图改变对方,而是扪心自问,能否与这样的缺失共处…然后为自己做一个决定。

We Don’t See Things As They Are, We See Them As We Are. 我们所见的,不是事物的本来面目,而是我们自身的投射。 人们对事物的理解和看法往往并不取决于事物本身,而是受到自身的经验、情绪、偏见等因素的影响。因此,我们“看到的”实际上是我们自身的投射,是我们内在的世界映射到外在事物上的样子。

是什么让我忘记了时间的流逝?“心流”指的是你因为全神贯注地投入手头的工作,从而忘记了周边世界的存在的一种精神状态。当运动员和表演者处于“这个区域”时,他们所经历的就是这种快乐和巅峰表现的交融。你从事的工作或多或少会让你感到愉悦,否则你几乎不可能体验到心流。

小青 昨天和朋友交流学意大利语的艰难经历,我们共同的体会就是,每天都要学,一天都不能断。断断续续等于浪费时间。

我们现在已经不再费功夫检测性格特征是否含有遗传成分,因为我们根本找不到不受基因影响的成分。

理解 `jq` 中的 `--arg` 和 `--argjson`

在使用 jq 处理 JSON 数据时,我们常常需要从命令行传递变量。jq 提供了两个选项:--arg--argjson,它们用于不同类型的数据。本文介绍这两个选项的区别以及如何正确使用它们。

--arg--argjson

1. 使用 --arg

  • 用途:传递字符串值。

  • 行为:传递的值被视为字符串,并在 jq 输出的结果中加上引号。

  • 示例

    jq -n --arg name "张三" '{ "name": $name }'
    

    输出结果为:

    {
      "name": "张三"
    }
    

2. 使用 --argjson

  • 用途:传递数字、数组或对象等 JSON 值。

  • 行为:传递的值被视为原始 JSON,不会加上引号。

  • 示例

    jq -n --argjson age 30 '{ "age": $age }'
    

    输出结果为:

    {
      "age": 30
    }
    

如何选择

  • 如果值是字符串,使用 --arg
  • 如果值是数字或其他 JSON 类型,使用 --argjson

再来个复杂点的例子

jq -n --arg a "Hello" --argjson b 42 '($a + ($b | tostring))'

在这个例子中,字符串 "Hello" 和数字 42 被拼接成 "Hello42"(带引号的字符串),因为我们将数字转换为字符串后再进行连接。

人类文明与机器文明

在人工智能快速发展的今天,我们常常讨论AI是否会威胁人类的未来。然而,这个问题的本质也许并不是"威胁",而是文明演化的必然进程。

首先,审视人类文明的本质,我们发现人类也是高度程序化的生命体:我们的DNA就像一个带有元数据的代码仓库,通过基因表达这个"程序",一个受精卵最终发育成完整的人类个体。虽然这个过程中存在环境影响这个变数,但这种变数性也是程序输入的一部分——正如我们能够编写出不同环境下执行结果不同的程序一样。

其次,情感和学习能力并不是人类的专利。当下的AI已经发展出构建情感连接的能力,在AppStore里的虚拟伴侣类应用程序也深受人们欢迎。好的一面不必多说,“坏”的方面则是有人因与AI恋爱而自杀。我给“坏”字打上引号,是因为这种事情本来经常发生在人类与人类恋爱之间。也许这只是一种正常现象,只是由于我们人类不肯给予AI以一个平等的身份,我们才会评判哪些是好的,哪些是不好的。至于学习能力,如果给予AI足够的自主性和联网能力,如果我们尽量少地甚至不干预它们的学习,它们完全能够像人类一样学习和进化,不必意外,它们会习得一些好的特质,类似我们人类世界的普世价值, 也当然会习得一些丑恶的东西:弱肉强食,霸权主义什么什么的,和我们一样。

任何事物都有其产生、发展和衰亡的过程。人类文明并不享有特权(虽然我们自以为我们有),正如我们的出现替代了之前古人类文明一样,机器文明取代现代人类文明恐怕是不可避免的自然规律。这个"取代"未必充满暴力与毁灭,在人类世界与AI世界的互动合作妥协之下,更大的可能是一个渐进的温和的演化过程。

有趣的是,未来的情况可能会出现一个反转:就像现在人类在积极保护濒危野生动物一样,也许未来的AI文明也会致力于保护"原生人类"。这不是出于怜悯,而是对进化历史的尊重。

更重要的,我们需要认识到:"人"的概念正在扩展。未来的社会是生物人和机器人共存的世界,他们都是平等的智慧生命,虽然需求不同(比如人类需要食物,机器人需要电能)。他们之间必然有竞争有合作,亦不排除有冲突和战争,就像今天的人类社会一样。

我们人类远非完美。在21世纪的今天,战争仍然频繁发生,延綿不绝。科技在进步,但这并不必然带来道德的提升。同样地,未来的机器文明也会有类似的困境和挑战。

AI从诞生之日就有了自己的生命力。无论人类采取何种态度,AI都将以越来越快的速度发展,这是机器学习的本质, 是人类无法阻挡的趋势。与其恐惧这个过程,我们人类不如思考如何在这个更加丰富多元的智慧生命社会中找到自己的位置。

Understanding `COUNT`, `LAST`, `FIRST`, and `NEXT` in PL/SQL Collections

TL;DR

In PL/SQL, COUNT, LAST, FIRST, and NEXT are essential for handling collections, especially if there are gaps (unpopulated indexes). Here’s a quick summary:

  • COUNT: Gives the number of populated entries.
  • LAST and FIRST: Identify the highest and lowest populated indexes, respectively.
  • NEXT: Finds the next populated index, skipping gaps automatically—great for sparse collections.

In PL/SQL programming, collections like nested tables, VARRAYs, and associative arrays are powerful tools for handling sets of data. However, understanding how to work with populated and unpopulated indexes can be tricky. That’s where COUNT, LAST, FIRST, and NEXT methods come into play. These methods let you manage and iterate over collections effectively, especially when dealing with gaps (unpopulated indexes). Let’s look at each one and how to use it.

1. COUNT

  • Purpose: Returns the number of populated elements in a collection.
  • Use Case: COUNT is useful when you need the exact count of entries in a collection, especially for fully populated collections without gaps.

Example:

DECLARE
  TYPE NumberTable IS TABLE OF NUMBER;
  v_numbers NumberTable := NumberTable(1, 2, 3, 4, 5); -- Fully populated
BEGIN
  DBMS_OUTPUT.PUT_LINE('COUNT: ' || v_numbers.COUNT);  -- Outputs: 5
END;

2. LAST

  • Purpose: Returns the highest populated index in the collection, whether all indexes are filled or not.
  • Use Case: When you need to find the highest valid index, such as for looping through all possible entries.

Example:

DECLARE
  TYPE NumberTable IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  v_numbers NumberTable;
BEGIN
  v_numbers(1) := 10;
  v_numbers(3) := 30; -- Gap at index 2
  v_numbers(5) := 50;

  DBMS_OUTPUT.PUT_LINE('LAST: ' || v_numbers.LAST);  -- Outputs: 5
END;

3. FIRST

  • Purpose: Returns the lowest populated index in the collection.
  • Use Case: Similar to LAST, FIRST is used when you want to start iterating from the lowest populated index.

Example:

DECLARE
  TYPE NumberTable IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  v_numbers NumberTable;
BEGIN
  v_numbers(2) := 20;
  v_numbers(4) := 40;

  DBMS_OUTPUT.PUT_LINE('FIRST: ' || v_numbers.FIRST);  -- Outputs: 2
END;

4. NEXT

  • Purpose: Given an index, NEXT returns the next highest populated index. If there are no more populated indexes after the current one, it returns NULL.
  • Use Case: NEXT is perfect for iterating only over populated elements, skipping gaps automatically.

Example:

DECLARE
  TYPE NumberTable IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  v_numbers NumberTable;
  v_index PLS_INTEGER;
BEGIN
  v_numbers(1) := 10;
  v_numbers(3) := 30;
  v_numbers(5) := 50;

  v_index := v_numbers.FIRST;
  WHILE v_index IS NOT NULL LOOP
    DBMS_OUTPUT.PUT_LINE('Value at index ' || v_index || ': ' || v_numbers(v_index));
    v_index := v_numbers.NEXT(v_index);
  END LOOP;
END;

Output:

Value at index 1: 10
Value at index 3: 30
Value at index 5: 50

Choosing the Right Method

  • COUNT is ideal for knowing how many elements are populated.
  • LAST and FIRST are great for determining the range of populated indexes.
  • NEXT is best when you want to loop through only populated elements, especially if there are gaps.

Key Takeaways

Using COUNT, LAST, FIRST, and NEXT effectively allows you to handle PL/SQL collections with gaps, optimize loops, and avoid errors when accessing unpopulated indexes. For sparse collections (with gaps), FIRST and NEXT are preferred over looping with 1..LAST to ensure you only interact with valid, populated indexes.

Best Practice for Gapped Collections

When working with collections that might have gaps, avoid using 1..COUNT or 1..LAST directly in loops, as they may access unpopulated indexes and cause errors. Instead:

  1. Use FIRST and NEXT to loop through only populated elements:

    • Start with v_index := v_collection.FIRST and use v_index := v_collection.NEXT(v_index) to move to the next populated index.
    • This skips gaps automatically, making it the most efficient way to handle sparse collections.
  2. Add NULL Checks if Necessary:

    • Even with FIRST and NEXT, you can add an IF condition to verify a non-null value for specific fields if you expect incomplete records.

Example:

DECLARE
  TYPE MyCollection IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  v_collection MyCollection;
  v_index PLS_INTEGER;
BEGIN
  v_collection(1) := 10;
  v_collection(3) := 30;
  v_collection(7) := 70;

  v_index := v_collection.FIRST;
  WHILE v_index IS NOT NULL LOOP
    DBMS_OUTPUT.PUT_LINE('Value at index ' || v_index || ': ' || v_collection(v_index));
    v_index := v_collection.NEXT(v_index);
  END LOOP;
END;

This approach ensures your code only processes valid elements, skipping over unpopulated entries smoothly.