Qua

Reader

A list of all postings of all blogs on Qua where the author has configured the blog to publish on this page.

from 非普遍理性

#G #至冬行动

电影《莫斯科行动》paro。

旧至冬落幕、愚人众解散的两年后,“公子”接到一件令他追忆过去的任务。

“……先生竟连这个也准备了吗?!它怎么会正好被冲到这儿?”

“正如公子所说,水道泄洪令人想起洞潜时的情形,而基金会恰有一些接近使用年限的氧气瓶,我便事先放置了一些。氧气瓶的平均密度和人体相近,普遍理性而论,我们被冲到哪儿,它就会被冲到哪儿。”

这些语句暗藏着某些信息,隐迹于至冬语的动词变位之中;若是达达利亚没有如此沉浸在自己的思绪里,一定能在当时就注意到对方特意使用了第一人称和过去时态。

璃月明确反对训练与使用“乌鸦”和“燕子”,不知道钟离对这类间谍了解如何,但前特工清楚,要是他在愚人众的老师看到自己刚才的表现,一定会安排他重修课程。

在钟离身边,他好像总是急于倾吐……钟离是不是猜到了自己最后想说什么?理当如此,愚人众内部关于璃月前大使的资料形容他或许掌握了洞悉人心的仙术,而且他应该也确实看出了自己的局促,体贴地换了话题,谈起璃月方面对主犯做的侧写。

“此人睚眦必报,对金钱抱有极其强烈的渴望,并且非常享受旁人的关注。今日公子枪法入神,报销了那笔赃款,叫他功亏一篑,他的团伙必然还有动作,不会就此消失。”

达达利亚差点被夸得放下所有纠结。他捋了捋后脑的湿发,道:“我还在想今天算不算失败了……察觉他们对水宫的行动是运气好,之后要如何入手呢?这些人一定会转移落脚点吧。”

“至冬宫的璃月人有限,自会发生新的巧合。”钟离微微一笑,“前几日,有人试图通过古闻基金会租赁的仓库进行接洽,求购其中存放的一架MG-3。感谢公子拍摄的照片,我们确认她正是劫案主犯的女友。”

“他们要战斗机干嘛?”他只觉得匪夷所思。

“对方的要求是‘仍可使用的军用机,战斗机最佳’,叫我也吃了一惊。幸好他们应当不是准备策划什么惊天动地的大场面,只想做中间人,赚一笔差价。有趣的是,根据多方排查,最终购买者是受劫列车上的一位乘客。”

“他应该不介意直接同基金会交易,让我们的人直接去‘见’那些劫匪。”达达利亚立刻反应过来。

钟离颔首,认下了“我们”这个词。“璃月警方会在他们定下时间地点之后与其沟通,以免走漏消息。”

再过十余分钟,水就将灌满这片空间,现在两人已经感到呼吸略有不畅。钟离指点了几句潜水面罩的使用方法,让他尝试之后又定下联络手势,他们便不再开口;璃月人开始穿戴氧气瓶,达达利亚也将手电固定在小臂上。他最后吸满一口气,与对方交换眼神,两人一同沉入水中。

湖边长大的年轻人很快适应了水下的环境,睁眼见到钟离的刘海、鬓发和长辫纷纷漂起,伴着疏落的气泡,在角度奇妙的打光下呈现出流动般的色泽,整个画面宛如描绘某个超凡存在的降临。他情不自禁伸手,被一把抓住,拉近了递上呼吸器。

达达利亚自觉不必解释这个微不足道的误会,接过来咬住。他们无需深潜,根据先前的路线规划,这瓶标准氧气足够他们平安游到出口再游回来。他按指示既深且缓地吐吸,两次之后把这玩意儿还给钟离,屏息看他拨开头发,将咬合器含入口中。

他还来不及细想自己应当细想什么,周围便陡然一静——这里终于被彻底注满,水无法再继续涌入,影响他们的行动。达达利亚晃了晃光源,示意对方出发。

两人并肩潜泳,每隔十米交换一次气嘴。在这幽晦而缄默的水下世界,天即是地,前后难分,耳中唯余自己的心跳和呼吸。这把手电并非专门用于潜水,只能照亮眼前短短一截锥形,反射微光的气泡扑面而来,划过脸颊,而暗流从一旁温柔拂来——那是钟离拨开水体造成的动静,让他得以确认对方始终在身侧。

在乌拉尔山脉的融雪和伏尔加流域的降雨中,达达利亚渐渐失去对时间的感受。他们如此游了不知多久,直至穿过某扇拱门。泄洪仍未结束,这条通道算是位于下游,尽头便有出口。两人顺流而行,钟离又握住他的手腕,给他戴上面罩,打了个上浮的手势。

达达利亚答以“收到”,忽然反手回握过去,又改为揽住肩膀。他放开呼吸器,任它在水中扭动着咕嘟冒泡,另一只手捏开对方下巴,侧头贴上双唇,渡去一口新鲜的氧气。

他的心跳得太快了,以至于鼓膜都被泵来的血液有节律地敲响。唇上触感柔软温热,与他严丝合缝。几万条胡思乱想相约在同一时刻冲进大脑——他开始忧虑自己的屏息时间会不会因为心率失控大大缩短,又能否支撑到两人浮上水面;他还觉得舌头这个器官从未拥有如此强烈的存在感,必须全力控制它不要探向不该去的地方。

像是过了几秒,又像是过了一辈子,钟离将手按在他背上。这一按仿佛将他的心脏按回了正常工作速度。随后上身压力一轻,他忧虑之事没有发生——他们都浮出了水面,得以正常呼吸。

强行捏造的理由不复存在,达达利亚缓缓松开对方。钟离睁开眼睛,又眨了眨,水珠从睫毛上滚落,他顿时不知道这时候该说什么。那当然算不上一个吻,可一切都昭然若揭,没有什么需要解释。

“谢谢?”钟离道,话音里带了一丝笑意。

“……我的荣幸。”他把头发向后抹去,真心实意地回答。


年轻的璃月警察在地面隐蔽处等待,见到他们时明显松了口气。简单交换情报之后,他将车留给两人,自己骑着摩托走了。主犯和他的同乘者杳无踪影,不过另外两名嫌疑人被守株待兔的警方逮个正着。如果不出意外,天亮之前应当就能从他们口中撬出新的情报;小警察正是赶着回去参与下一步行动。

达达利亚第二次宿在基金会。这夜发生了太多事,他来不及一一思量,便在霓裳花香里坠入沉眠。醒来时已天光大亮,他换上钟离借他的衣服,一套款式简洁的衬衫长裤;他俩身材相仿,只是肩膀稍窄,叫他看起来像个窜得太快的青春期学生。

他有点儿期望在茶水间看到钟离,再次品尝一碗卧了蛋的面条,但那里空无一人,桌上放了两份相同的三明治。恐怕又是摩拉克斯那些来去无踪的手下。他饥肠辘辘,烧水烹茶,吃掉了多半是为自己准备的那份早餐,钟离仍然没有出现。昨夜的一切都仿若梦境,回忆起来如同隔着轻软的晨雾,太阳一照便只剩下唇上幽灵般的触感。

那若有还无的温度叫他没法再毫无顾忌地探查这栋小楼。

钟离一丝不乱的办公桌突兀地摆着一个文件袋,或许是和三明治一起到的,而他从书柜里挑了一本至冬语的璃月神话考,倒进沙发看了起来。在他读完第一章之前,楼上传来洗漱的响动。他起身,按照此前查到的方式泡上一壶绿茶,又加热了三明治。

“甘而不涩,馥郁如兰。”钟离抿一口清亮的茶汤,带着几分讶异冲他微笑,“要沏出这样的口感,颇需一番功夫。公子费心了。”

“乌鸦”会练习如何凭空脸红起来,但达达利亚现在只希望自己学过相反的。他跟着啜了一口,指望从中领会那种从未体验过的香气。

幸而前大使从不叫人难堪。“可以劳烦公子把我桌上的文件袋拿过来吗?如果有的话。”他道。

“钟离先生,吃饭的时候看东西不好。”达达利亚说完立刻意识到,自己不知怎么拿出了对待幼弟小妹的态度。

“那请公子先替我看一遍吧——有几份材料本就与阁下有关。”对方从善如流地回答。

 

TBC

 

下集预告:公子快递(?

 
阅读更多

from Licht ist leicht

Blau ist die weibliche Farbe. Sie steht für das Element Wasser, den Mond, ist fließend und kühlend

Rot ist die männliche Farbe. Sie steht für Feuer, die Sonne, Stärke und wirkt wärmend. Bei Naturvölkern ist es noch so.

Zur besseren Übersicht:

männlich weiblich
Klinge Dreieck d. M. Kelch Dreieck d. W.
rot blau
Sonne Mond
Mars Venus
Feuer Wasser
wärmend kühlend
stark/statisch fließend
fest weich
intellektuell intuitiv
logisch kreativ
analytisch ganzheitlich
wissenschaftlich fühlend

Die weibliche Energie wirkt kühlend und beruhigend auf das erhitzte Gemüt der Männer, welche in alten Erzählungen nach einem langen Tag der Stärkedemonstration und Jagd nach Hause kamen und sich an der Schulter ihrer Frau ausruhten.

Im Pentagramm mit den Elementen ist die Symbolik leicht erkennbar:

Pentagramm

Die Kirche / Satanisten haben die Farben vertauscht (Pentagramm gedreht) um die Energie zu schwächen. Rot ist die niedrigst schwingende Farbe und steht für Sexualität und Satanismus. Sie wird heute falsch als die Farbe der Liebe interpretiert. Valentin sei Dank.

Grün ist die Farbe der Herzensliebe. Das Herzsymbol leitet sich von alten Abbildungen mit Efeuranken ab. Grün ist die mittlere Farbe des Regenbogens und die Farbe des Herzchakras (Anahata Anahata), welches ebenso der energetischen Mitte des Menschen entspricht. Es ist außerdem die wichtigste Farbe für die menschlichen Augen.

Hier ist auch das Zusammenspiel der Farben blau für das weibliche, rot für das Männliche und grün für die verbindende Herzensliebe ersichtlich: Human Brain Farben

 
Weiterlesen...

from Lo spazio intermedio

(articolo pubblicato quasi contemporaneamente su L'isola di Ula-Ula.)

Medium è morto. Almeno per tutti quelli che non scrivono in inglese. La piattaforma a un certo punto ha iniziato a chiedere soldi. Non per la manutenzione della piattaforma stessa, ma per pagare chi realizzava i contenuti. In inglese, ovviamente. E neanche tutti, ma con criteri che non sono mai stati chiariti, almeno fino a che sono stato dietro alle e-mail che venivano dalla piattaforma. Certo, quello che scrivevo in questo attacco era vero nel 2020, e fondamentalmente mi pare che continua a essere vero ancora oggi. E per scrivere questo post, che è di fatto quello inaugurale sul mio arrivo qui su noblogo, sono andato a curiosare un po' proprio su Medium, scoprendo che dei blogger italiani, uno degli ultimi ancora presenti lì è l'amico Peppe Liberti con un post di ormai giugno. Onestamente, per come avevo intenzione di utilizzare Medium, abbandonare quel luogo internettiano non è di per sé un dramma, per cui ora che da Lo spazio intermedio mi sono spostato qui, su questa Isola di Ula-Ula, penso di proseguire con il programma che mi ero prefisso: recuperare, con le opportune modifiche, i post pubblicati su Medium e riempire l'isola di altri contenuti, cose di facile scrittura come per esempio i recuperi di vecchi post che la facevano da padrone sul mio account di Medium. Tra l'altro ho potuto importare non solo quanto pubblicato, ma anche quanto scritto in bozza nel precedente spazio, per cui potrei riempire questo noblogo con maggiore costanza rispetto a qua.name.

Per cui... Medium è morto. Lunga vita a WriteFreely.

#scrittura #fediverso #medium #writefreely

 
Read more...

from نویساک

مدتی است ذهن مرا سخت مشغول کرده است. بیش از همیشه نیاز به آن را احساس می‌کنم. با این‌حال، دقیقا نمی‌دانم چیست. به دنبال یک تعریف جامع و مانع هم نیستم. کافی است کمی مرا از بلاتکایفی دربیاورد، پس از آن قول می‌دهم هر کجا نیاز بود، آن را ویرایش کنم.

چشمانم داشت گرم خواب می‌شد اما ذهنم درون جلسه روان‌درمانی امروزم می‌گشت. رسیدم به آن «فلسفی زیستن» چونان یک سبک زندگی، یک بینش، یک شیوه تفکر، و انتخاب. تناقضی که میان «فلسفی زیستن» و رفاه مادی و شغل پردرآمد وجود دارد. نقطه آغاز همین جاست. من می‌دانم که پرداختن به «چراهای» زندگی نیازمند زمان و تمرکز بسیار است، چنانچه پیگیری یک حرفه و شغل پردرآمد. از طرفی انتخاب یک راه، یعنی انتخاب نکردن راه‌های دیگر. با اینکه می‌بینم چگونه دل در گرو اندیشه فلسفی دارم، نمی‌دانم چطور می‌توان فلسفی زیست. امروز بی‌تا برای من توضیح داد که این پرسش خود یک پرسش فلسفی است. فلسفه نمی‌تواند چیزی جدای از زندگی باشد.

من می‌بینم که دشوار است در مقابل سبک زندگی پرلذت اطرافیانم مقاومت کنم. اما اینکه چنین میلی وجود دارد، آن سبک زندگی را برای من موجه نمی‌کند. راستش من آدم لذت طلبی هستم، مشکل اینجاست که من پرتوقع ام. من به دنبال چیزی بیش از لذت‌های زودگذر مادی ام. آن‌ها کافی نیستند. یا دست‌کم، جنس‌شان با روان من جور نیست.

شاید چیزی که نیاز دارم خویشتن‌داری است. خویشتن‌داری در جهان ما چیست؟ برای شروع، یک مکث و درنگ. در جهان پرسرعت ما، کمی مکث برای درنگ، ممکن است اجازه دهد که به این پرسش بیاندیشم. خویشتن‌داری برای من چیست؟

 
بیشتر بخوانید...

from veer66

Compile-time type checking is a great way to catch errors early, but it is not a guarantee of correctness. Even simple subroutines can be incorrect. For example, is_old_enough is a subroutine for checking whether a person is at least 21 years old.

fn is_old_enough(a_person: &Person) -> bool {
    a_person.age > 20
}

Here is an example of how the is_old_enough subroutine could be incorrectly implemented:

fn is_old_enough(a_person: &Person) -> bool {
    a_person.age >= 20
}

Adding an equals sign (=) to the code changes the behavior of the subroutine, even though the code is still type-safe. The similar bug is found in Servo, but the type was integer.

Testing the entire program manually or programmatically is essential, but it can be difficult to catch all errors, especially those hidden in the details. Testing subroutines is important because it allows testers to focus on small, well-defined units of code. This makes it easier to identify and fix errors. Here are three prerequisites for testing subroutines:

  1. Defining subroutines
  2. An input environment for testing
  3. Result validation

Defining subroutines

Some programming languages encourage programmers to define subroutines more than others. This is because some languages have features that make it easier and more natural to define and use subroutines.

Defining subroutines in BASIC programming language

In the 1970s, to define a subroutine in BASIC, you would assign it a line number and use the RETURN statement.

1000 PRINT "SUBROUTINE"
1100 RETURN 

We can call a subroutine in a program using the GOSUB command, followed by the line number of the subroutine.

GOSUB 1000 

Defining a subroutine in BASIC is as simple as using the GOTO statement, but with the added convenience of being able to return to the calling code.

Defining subroutines in Common Lisp

In Common Lisp, a function is a subroutine that always returns a value when it is called with a specific set of inputs. This Common Lisp code processes a-person, which is a member of the list people one-by-one using the DOLIST command. If a-person is at least 21 years old, the program will print it out.

(dolist (a-person people)
   (when (> (person-age a-person) 20) 
        (print a-person)))

We can create a new function from the part (> (person-age a-person) 20) by using the DEFUN command, with a function name – old-enough?, and an input variable, which is a-person.

(defun old-enough? (a-person) 
    (> (person-age a-person) 20))

Then, in the main program, we substitute the code part (> (person-age a-person) 20) with a function call (old-enough? a-person).

(dolist (a-person people)
   (when (old-enough? a-person)
        (print a-person)))

Common Lisp encourages programmers to create subroutines by making it easy to copy and paste parts of code, which are also known as expressions, or forms.

Defining subroutines in Java

Here is a Java version of a print-a-person-if-at-least-21 program. Java uses the for loop instead of the Common Lisp DOLIST command.

for (var a_person: people) {
   if (a_person.age > 20) {
      System.out.println(a_person);
   }
}

We can create a function from the expression (a_person.age > 20) using this syntax.

private static boolean isOldEnough(Person a_person) {
    return a_person.age > 20;
}

In addition to Common Lisp, Java requires type annotations for functions. The function is_old_enough was annotated as a function that takes a Person as input and returns a boolean. Moreover, In Java, programmers must decide whether a function belongs to a class or an object by using the static keyword. In Java, programmers also use the private and public keywords to control access to functions. Java functions always require a return statement, similar to BASIC subroutines, except for functions that do not return any value.

Java encourages programmers to create subroutines, but with more annotations, it is not as encouraging as Common Lisp.

Defining subroutines in Crystal: Static typing doesn't mean more annotations.

My explanation of Java, a statically typed programming language, may have led to the misconception that statically typed languages require more annotations. Crystal – another statically typed programming language is the counter example. Here is a Crystal version of a print-a-person-if-at-least-21 program. Instead of the DOLIST command, Crystal uses the EACH command.

people.each {|a_person| puts person if a_person.age > 20}

To create a function, we can copy the expression a_person.age > 20, and paste it into DEF ... END block, without any type annotations or any RETURN statement.

def old_enough?(a_person)
  a_person.age > 20
end

We can substitute the expression a_person.age > 20 with a function call oldenough?(aperson).

people.each {|a_person| puts a_person if old_enough?(a_person)}

So, the ease of defining a function in Crystal is on par with Common Lisp.

Defining subroutines in Rust

Here is a Rust version of a print-a-person-if-at-least-21 program, which look almost identical to Java version.

for a_person in people {
  if a_person.age > 20 {
     println!("{:?}", a_person)
  }
}

Surprisingly, the Rust version of is_old_enough looks similar to the Crystal version, but with type annotations. Type annotation in Rust is more complicated than in Java because Rust has references and programmers need to think about the lifetime of variables. Type annotations and lifetimes could make it more difficult for programmers to write subroutines in Rust.

fn is_old_enough(a_person: &Person) -> bool {
    a_person.age > 20
}

Type annotations make definitions precise and easier to read, but they require more work, can be distracting, and do not help encouraging a programming to create a subroutine.

Preparing an environment for calling a subroutine

Some programming language features and software design can make preparing the environment for calling a subroutine difficult. Moreover, maintaining the code used for preparing the environment could require unnecessary work if the code is too coupled with data structures, which are usually changed.

Preparing an environment in Common Lisp and JavaScript

The variable a-person is an environment for calling the function old-enough?. We create a data structure from a struct in Common Lisp by calling a function make-*. In this example, we call a function make-person.

(make-person :name "A" :age 30)

Moreover, we can make a data structure from a struct using #S syntax, which is in the same form as it is printed.

#S(PERSON :NAME "A" :AGE 30)

This #S syntax is very useful when we have existing data structures, because it allows us to use printed data structures to prepare the environment later. This is especially helpful when we want to build long or complex data structures, such as a list of 1,000 people.

In JavaScript, we can prepare data structures in a similar way to Common Lisp, but without specifying the types of the data.

{"name": "A", "age": 30}

Like Common Lisp, JavaScript can dump data structures to JSON format using the JSON.stringify() command.

It is easy to prepare a data structure as an environment for calling Common Lisp and JavaScript functions, especially because we can reuse the format that a data structure was dumped from memory.

Preparing an environment in Java and Rust

In Java, we create a data structure by instantiating a class using the new keyword. The arguments, which are the input values for creating an object, are sent in a strict order without any keywords, such as :name and :age seen in the Common Lisp example. This style should be fine when the number of arguments does not exceed three.

var a_person = new Person("A", 30);

We can call the function is_old_enough, which in Java is a class method.

is_old_enough(a_person)

Alternatively, we can define the function is_old_enough as an object method, and then call it with this syntax.

a.is_old_enough()

Still, the method for preparing the person data structure remains the same. So class methods are not necessarily easier to test than object methods.

In Rust, we create a data structure with the similar syntax to Rust. However, Rust has a more step, which is converting &str to String using the function to_string.

Person {name: "A".to_string(), age: 30}

Although both Java and Rust cannot use printed format for creating data structure directly. We can use JSON library to dump and load data.

So, preparing an environment in Java and Rust is not as convenient as Common Lisp or JavaScript, since we cannot copy printed data structure, and directly use it in the program without a help of an additional library.

The difficulty in preparing the environment is caused by the software design.

Sometimes preparing the environment is difficult because of the software design. To create a Person object in this example, we must pass in the person's name and a service that can return their age.

Person(String name, Service service) {
    this.name = name;
    age = service.getAge(name) ;
}

// ...

var a_person = new Person("A", service);

So, we cannot prepare a person data structure with a specific age without creating a service, which is remotely related to test the function is_old_enough.

Using basic data structure

Instead of defining a class or a struct, we can use a list for representing personal data.

'(:name "A" :age 30)

Using a list removes unnecessary restrictions on creating a person, even though our design is primarily to get a person from a service. Here is an example of calling a function to obtain a person data structure from a service.

(get-person "A" service) 

In JavaScript, we can create an object, which is idiomatic for JavaScript, instead of a list.

{"name": "A", "age": 30}

In Java, we use HashMap although creating HashMap in Java does not look as concise as list in Common Lisp.

However, using a list or other basic data structure also has a downside, which will be explained later.

Modifying the data structure affects the code for preparing an environment.

Given, we added reward to the struct person.

struct Person {
  name: String,
  age: u32,
  reward: u32,
}

This code for creating a Person data structure would be broken.

Person {name: "A".to_string(), age: 10}

We have to create a data structure by passing a reward value.

Person {name: "A".to_string(), age: 10, reward: 800} 

It may seem trivial, but I've never enjoyed fixing repetitive code in tests.

Use default values for values we don't care about.

In Rust, we can create a data structure with default values, and then we assigned only a value that we care.

let mut a_person = Person::default(); 
a_person.age = 30 

Before we use the function default, we put #[derive(Default)] before the struct definition.

#[derive(Default)]
struct Person {
    name: String,
    age: u32,
}

In Common Lisp, we can put default values in the struct definition. Then we can call a function make-person by passing a value that we care about.

(defstruct person 
  (name "") 
  (age 0))

(make-person :age 30)

Using basic data structure

We can use a list instead of a specific struct, and in a list, we can put only :age with other values. Still, we can run the test.

(setq a-person '(:age 30)) 
(old-enough? a-person) 

Using basic data structures has some downsides. Lists and hash tables do not perform as well as structs, because accessing struct member is very fast. The position of each struct member in memory is calculated arithmetically. Moreover, when everything is a list, a compiler cannot help checking types since their types are the same. A programmer may have no idea how the data structure looks like by looking a function definition. Still, we alleviate solve these problems by using a runtime schema such as JSON Schema.

Preparing an environment for async function and database connection is not convenient

Some subroutines need a database connection to establish. Some subroutines need an async event loop to run before testing, for example, async functions in Rust. Preparing a fake database and connecting the everything before testing is inconvenient, especially for testing a function like is_old_enough?, which can be fixed by improving the software design. Testing async functions become easier by using a tool, such as Tokio::test.

Testing a subroutine in the production environment

Testing in the production environment is not preferable, but sometimes it is necessary, especially when we cannot reproduce the problem somewhere else. Common Lisp can run Read-Eval-Print Loop (REPL) along with the production, so we can always test subroutines. Many languages come with an REPL, but we have to make sure that libraries and frameworks play well the REPL. In Common Lisp community, libraries and frameworks are usually REPL-friendly.

Result validation

After running a subroutine, we usually want to validate the result either manually or programatically.

Programatical validation

Most data comparison functions check if the data is the same object in memory, which is not what we want in this case. The code below does not return true even if the content of the data structures is the same because the EQ function does not compare the content.

(eq 
    (get-eldest_person people) 
    (make-person :name "C" :age 120))

When testing, we usually want to compare data structures for content equality. In Common Lisp, we can use the EQUALP function to do this, instead of the EQ function.

(equalp 
    (get-eldest_person people) 
    (make-person :name "C" :age 120))

In Rust, we solve this issue by insert #[derive(PartialEq)] before the struct definition.

#[derive(PartialEq)]
struct Person {
    pub name: String,
    pub age: u32,
}

Manual validation

Manually validating a complex data structure can be difficult, so there are many tools that can display data in a structured view. In Common Lisp, we can use Emacs inspectors like slime-inspect and sly-inspect, or we can use Clouseau, which is part of McCLIM. For other programming languages, I typically convert data structures to JSON and view them in Firefox.

 
Read more...

from نویساک

می‌خواستم فقط از لازانیا و میز شام عکس بگذارم و بگویم که چه شب عاشقانه‌ای از سر گذراندیم. ولی خب این همه‌ی واقعیت نیست. البته شب به‌غایت رمانتیکی بود اما باید توضیح بدهم که چگونه به چنین شبی رسیدیم.

به اشتراک‌گذاشتن تصاویر و کلیپ‌های عاشقانه در شبکه‌های اجتماعی، ژانر محبوبی است که مانند هر محتوای دیگری که در این فضا وجود دارد، قسمت‌های نازیبای آن حذف شده است. گاهی آنقدر غیرواقعی به نظر می‌رسند که گمان می‌کنیم داشتن یک رابطه عاطفی و عاشقانه غیرممکن خواهد بود.

اما من ابایی ندارم از اینکه بگویم ما چقدر دعوا و جروبحث کردیم، چقدر ناامن شدیم، چقدر رنجیدیم تا بتوانیم حرف بزنیم یا چقدر سخت بود که بپذیریم نقاط ضعفمان شریکمان را ناامید کرده است. چقدر گریه کردیم و فکر کردیم ما هرگز نمی‌توانیم عشق را تجربه کنیم. گمان می‌کردیم الگوی مسموم و بیمار رابطه‌ی پدر و مادرمان قرار است تا ابد در زندگی ما نیز تکرار شود.

چقدر هنوز می‌ترسیم. چقدر از آینده می‌ترسیم.

ندیدم وقتی کسی درباره رابطه خوبش حرف می‌زند، ذکر کند که چقدر زمان گذاشته اند تا در آخر بفهمند که آتش همه‌ی جنجال‌ها از گور یک سوتفاهم برآمده است. اینکه بارها حس کردند که شریکشان زبان‌ نفهم است یا از سیاره دیگر آمده. فکر کردند که نکند زمان و انرژی‌شان را بیهوده برای این رابطه گذاشته اند؟

اما، حسام‌الدین، همیشه به من تذکر می‌دهد که هیچ نیمهٔ گمشده‌ای وجود ندارد، ما خودمان تصمیم می‌گیریم چه کسی نیمهٔ گمشده ما باشد. این حرف را آویزه گوشم کرده ام. حتا وقتی راه‌های تماس و گپ را مسدود کرده بودیم، ته دلمان امید داشتیم که هنوز می‌توانیم حرف بزنیم.

و گفت‌وگویمان به فرساینده‌ترین ساعت‌های رابطه تبدیل می‌شد. با اینکه گمان می‌کردیم ما متفاوتیم و همیشه به گفت‌وگو گشوده ایم و آدمی همیشه باید انتقادپذیر باشد، با اینحال گاهی مانند دو کودک خشمگین سر یکدیگر داد می‌زدیم و گاهی ناسزا نیز می‌گفتیم.

روزهایی که آرام و بالغ هستیم، به یکدیگر اطمینان می‌دهیم که هرگز نمی‌خواهیم به یکدیگر آسیب بزنیم و در صورتی که احساس ناامنی کردیم، می‌توانیم با یک پرسش ساده، منظور یکدیگر را روشن کنیم.

حالا می‌دانیم بهترین دستاورد رابطه ما تا اینجا این بوده است که جداشدن یک گزینه‌ی روی میز نیست. یک رابطه خوب ساختنی است. اگرچه قرار نیست یکدیگر را تغییر دهیم اما هرکس مسئول بهتر شدن خودش است. تعهد برای ما خیانت نکردن نیست، بلکه تلاش برای صمیمیت و امنیت در رابطه است، از راه ِ گفت‌وگو، رشدکردن، و همدلی.

می‌دانم تازه مسیرمان را آغازیده ایم. اما سالی که نکوست، از بهارش پیداست!

*هر اپیزود در رابطه‌مان به گذشتن از یک بحران اشاره دارد. بحران‌هایی که ممکن بود منجر به جدایی شود.

 
Read more...

from Vahid

آن روز نیز مانند روز‌های کاری دیگر به پایان رسیده بود. من، حسن، ابراهیم و سایر همکاران درحال ترک محل کار بودیم. طبق معمول فاصلهٔ اتاق تا آسانسور را درحال شوخی کردن با یکدیگر طی کردیم تا به آسانسور رسیدیم. از ابراهیم خواستم کیفم را نگه دارد تا بتوانم بند کفشم را ببندم. در همین لحظه آسانسور در طبقه چهارم که ما حضور داشتیم توقف کرد. از آنجایی که تعداد ما بیشتر از ظرفیت مجاز آسانسور بود، یا باید در دو نوبت از آسانسور استفاده می‌کردیم یا برای استفاده از آسانسور راهرو‌های دیگر به آنجا می‌رفتیم یا از راه‌پله استفاده می‌کردیم. با شیطنت یکی از دوستان، رقابتی برای زودتر سوار شدن به آسانسور شروع شد و تعدادی سریع به داخل آسانسور پریدند. من و حسن که جا مانده بودیم برای اینکه از سایرین عقب نمانیم، به سمت راه‌پله دویدیم. در همین لحظه در باز آسانسور مقابل نظر ما را به خود جلب نمود. بی‌درنگ به داخل آن رفتیم و من دکمه طبقه همکف را فشار دادم. در آسانسور درحال بسته شدن بود که تازه متوجه نکته عجیبی شدیم. این آسانسور سال‌هاست که خراب بوده و هرگز ندیده بودیم از آن استفاده شود! هنگامی که در کاملا بسته شد به نکتهٔ عجیب‌تری پی بردیم. تعداد دکمه های این آسانسور با سایر آسانسور‌های ساختمان و همچنین تعداد طبقه‌های ساختمان متفاوت بود. ساختمان محل کار ما با درنظر گرفتن طبقهٔ همکف، هفت طبقه است. اما تعداد دکمه‌های این آسانسور خیلی بیشتر بود! فضای درون آسانسور سنگین بود و روشنایی کمی داشت. هنگامی که آسانسور شروع به حرکت کرد متوجه شدیم که چراغ دکمهٔ همکف خاموش شده و دکمه طبقهٔ نهم زیرزمین یعنی پایین‌ترین طبقه در آسانسور فعال شده است. اطمینان داشتم که دکمهٔ درست را فشار داده‌ام، پس چرا آسانسور خود به خود داشت به سمت زیرزمین می‌رفت؟ زیرزمینی که تا به این لحظه از وجودش بی‌خبر بودیم. آسانسور با سرعت زیادی حرکت می‌کرد. طوری که فکر می‌کردیم درحال سقوط هستیم. طولی نکشید که در طبقه نهم زیرزمین توقف کردیم و در شروع به باز شدن کرد. تا همین جا هم من و حسن هر دو دچار ترس و اضطراب عجیبی شده بودیم. اما با باز شدن در آسانسور، وحشت سراسر وجودمان را فراگرفت. خدایا...! چه می‌بینم...! آسانسور ما را به راهرو‌ای نمور و تاریک منتقل کرده بود. فضای جلو آسانسور به اندازه یک اتاق ده متری بود که به راهرو اصلی منتهی می‌شد. دیوار‌ها، سقف و کف راهرو همه از جنس بتن بود و کف آن کمی آب جمع شده بود. بوی شدید و زننده‌ای مانند کافور فضا را پر کرده بود. از مقابل آسانسور و تا جایی که دید داشتیم تخت‌های بیمارستانی‌ای را می‌دیدیم که جنازه انسان بر روی آن‌ها قرار داشت و بر روی هر جنازه ملحفهٔ سفیدی کشیده شده بود. در گوشه‌ای از آن مکان جعبه هایی از جنس پلاستیک، چوب و فلز بر روی هم قرار گرفته بود. از برچسب و نوشته‌های روی جعبه‌های فلزی و پلاستیکی مشخص بود که مربوط به دارو یا تجهیزات بیمارستانی و آزمایشگاهی هستند و جعبه‌های چوبی مانند جعبهٔ تجهیزات نظامی. در گوشهٔ دیگری از اتاق یک تی نخی آغشته به خون در کنار یک سطل فلزی دیده می‌شد. با وحشت از آسانسور خارج شدیم و از میان جنازه ها گذشتیم تا به راهرو اصلی رسیدیم. راهرو باریک بود. عرض آن حدود یک متر و نیم بود و از هرطرف تا جایی که تاریکی مطلق دید را محدود می‌کرد امتداد داشت. در هر دوطرف راهرو در فاصله‌های منظم درهای فلزی بدون روزنه‌ای به چشم می‌خورد که گویی سال‌هاست باز نشده‌اند. از شدت استرس و ترس پاهایمان سست شده بود. عرق سردی بر پیشانی‌مان نشسته و سراسر بدنمان به رعشه افتاده بود. به هیچ وجه شهامت آن را نداشتیم که از این جلوتر برویم. در تمام این مدت من و حسن کلامی بر زبان جاری نکرده بودیم اما به شکل عجیبی انگار ذهن یکدیگر را می‌خواندیم و از افکار هم با خبر بودیم. سریع به سمت آسانسور برگشتیم. دکمه طبقه همکف را پشت سر هم فشار می‌دادم تا هرچه سریع‌تر از این مکان نفرین‌شده خارج شویم. آسانسور بسته شد ولی باز هم دکمه طبقه همکف غیرفعال شد و این بار طبقه نهم یعنی بالاترین طبقه آسانسور فعال شد. من بارها از راه‌پله اظطراری طبقه ششم به بام ساختمان رفته بودم؛ طبقه دیگری وجود نداشت! آسانسور با سرعت به سمت بالا حرکت کرد و در طبقه نهم متوقف شد. فضای این طبقه مانند ساختمانی نیمه کاره و درحال ساخت بود که اطراف آن هیچ ساختمان و سازه دیگری به چشم نمی‌خورد. از آسانسور خارج شدیم. تعدادی کارگر مشغول به کار بر روی ساختمان بودند که با دیدن ما برای چند لحظه دست از کار کشیدند و به ما خیره شدند. ابتدا گمان کردیم از حال و روز ما تعجب کرده‌اند. اما لحظه‌ای بعد متوجه شدیم که از حضور ما در آن طبقه جا خورده‌اند. گویی که بدون اجازه وارد حریم آن‌ها شده‌ایم و انگار قرار نبوده هرگز این اتفاق رخ بدهد. کارگران به کار خود مشغول شدند ولی با گوشه چشم ما را زیر نظر داشتند. خواستیم به سمت آسانسور برگردیم، اما از ترس بازگشت به زیرزمین از این کار منصرف شدیم. دیگر تحمل این شرایط پیچیده برایم ممکن نبود. کمی جلوتر رفتم و از کارگری راه خروج را پرسیدم. مکثی کرد و بی ‌‌‌‌‌‌آنکه کلمه‌ای بگوید به سمتی اشاره نمود. جهت دست او را دنبال کردم و راه‌پله‌ای را در گوشه‌ای از ساختمان دیدم. به همراه حسن به سمت آن دویدیم. فضای داخل آن کاملا تاریک بود. سراسیمه پله‌هایی که جهت آن‌ها به سمت بالا بود را طی کردیم. هنگامی که از راه‌پله خارج شدیم، با دیدن محیط و مکانی که به آن وارد شده بودیم کم مانده بود از تعجب شاخ درآوریم. ما به مکانی گام نهاده بودیم که مانند کاروانسرایی ویرانه وسط بیابان بود. هوا کاملا تاریک شده بود و حتا یک ستاره هم در آسمان دیده نمی‌شد. سرم را سمت راه‌پله برگرداندم، اما آنجا نبود. درحالی که تنها یک قدم از آن فاصله گرفته بودیم. کاروانسرا مانند یک هزارتو بود. هرچه جستجو می‌کردیم هیچ ورودی، خروجی یا روزنه‌ای به بیرون از آن نمی‌یافتیم و ناامیدانه به دور خود می‌چرخیدیم. هرچند هیچ کسی را پیرامون خود نمی‌دیدیم، اما همواره حضور موجودی را در اطراف خود حس می‌کردیم. گویی ما را زیر نظر دارد و درحال تعقیب ماست. این موضوع باعث وحشت دوچندان ما می‌شد. از شدت ترس و استرس داشتم از حال می‌رفتم که صدای فریاد حسن را شنیدم: «وحید! بیا... راه رو پیدا کردم!». بعد سریع به سمتی دوید و به پشت دیواری چرخید. بی‌درنگ دنبالش رفتم اما حسن را ندیدم. چند بار صدایش زدم اما پاسخی نداد. شروع کردم به فریاد کشیدن. با اینکه کاروانسرا مسقف نبود اما پژواک صدایم در هزارتو می‌پیچید. مدتی دویدم و فریاد کشیدم اما هرچه حسن را صدا می‌زدم فایده‌ای نداشت و خبری از او نبود. دیگر کاملا درمانده شده بودم. نفس هایم به شماره افتاده بود و ضربان قلبم آنچنان بالا رفته بود که کم مانده بود از سینه‌ام بیرون بزند. زانوهایم دیگر تحمل نداشتند. ناخواسته بر روی زمین نشستم و خواستم از تنهایی و بی‌پناهی گریه کنم، اما رمقی برای این کار هم برایم نمانده بود. در همین لحظه درست رو به رویم حسن را دیدم که سرش را از دریچه یا گودالی که بر روی زمین بود بیرون آورد و همراه با تکان دادن دست صدایم زد: «وحید! من اینجام!». با دیدن حسن انگار دنیا را به من داده بودند. از خوشحالی جانی دوباره گرفتم و با تمام توان به سمتش دویدم. به یک متری درچه رسیده بودم که حسن به درون آن دالان اشاره کرد و گفت:«بیا، راه خروج از این طرفه». تمام ناامیدی‌هایم به یکباره به شادی مبدل شد. اما همین که خواست قدم دیگری بردارم، ساق پای چپم به شدت تیر کشید و از درد بر روی زمین افتادم. ناگهان فضا به کلی تغییر کرد و در چشم بر هم زدنی خودم را در اتاق خوابم یافتم که بر روی تختم دراز کشیده‌ام. یعنی همه‌اش خواب بود؟ آه... خدا را شکر! همچنان ساق پایم به شدت درد می‌کرد. عضلات ساق پایم گرفته بود. گاهی این اتفاق برایم می‌افتد. تلاش کردم بلند شوم و برای رفع گرفتگی عضلات پایم، کمی حرکات کششی انجام دهم. اما گویی کنترل بدنم را در اختیار نداشتم. هیچ یک از اعضای بدنم را نمی‌توانستم تکان بدهم. انگار دچار فلج خواب شده بودم. فلج خواب با آن حالت وهم‌ آلودش به همراه درد ناشی از گرفتگی عضلات پا، درست بعد از یک کابوس تجربه بسیار بدی بود. از این وضعیت کفرم درآمده بود. درون ذهنم شروع به فریاد زدن کردم و به بدنم می‌گفتم: «واقعا؟!؟!». درست در همین لحضه کاملا از خواب پریدم و با سختی و درد بسیار پایم را کمی کش دادم تا درد برطرف شود. اما اضطراب آن کابوس تا صبح خواب را از چشمانم ربود.
#کابوس #خواب #خواب‌نما #ترس #وحشت @vahid@persadon.com

 
بیشتر بخوانید...

from نویساک

دارم فرومی‌پاشم.

می‌گوید: مگر بار اولت است؟ تو همیشه حالت خراب است. خل وضع ای. باید منتظر باشیم تا بیفتی و بمیری تا همه از شرت خلاص شوند، حتا کسانی که اصلا نمی‌دانند وجود داری. تو نحس ای. حتا کودکان هم به صورت تو نمی‌خندند. آه کاش فقط نمی‌خندیدند، آنها گریه می‌کنند. تو شر ای. ذاتت خراب و پوسیده است. همه جا را به گند می‌کشی. می‌خواهی با جمله‌ها و اطوار درست، خوب به نظر برسی و کثافتت را پنهان کنی ولی شدنی نیست. بالا بروی، پایین بیایی تو کثافت ای.

حوصله ندارم داستان تعریف کنم. اصلا مسئله داستان‌ها نیستند. اصلا مهم نیست که چه شد این شد. در نهایت چیزی که هست، احساس زجرآوری است که حالا داریم و باید «یاد بگیریم» با آن کنار بیاییم.

می‌گوید: تو؟ کودن! اگر قرار بود چیزی یاد بگیری به اندازه کافی فرصت داشتی. تنها راهی که مانده دعاست. دعا نه برای شفا، بلکه دعا کن زودتر بمیری. باورم نمی‌شود آنقدر خودت را دوست داری که با این همه احساس گندی که در تو جمع شده باز هم تلاش می‌کنی زندگی کنی و آدم‌ها را گول بزنی که تو را دوست داشته باشند. همین خودش دلیلی است که تو چقدر اوضاعت خراب است. سالهاست می‌گویم خودت را خلاص کن. دوست داری هربار ببینی که خوب و کافی نیستی؟ لذت می‌بری از این همه زجری که می‌کشی؟ چندبار دیگر لازم است سیاه بودنت به رخت کشیده شود؟ چندبار دیگر باید تو را دیوانه و بد و بیمار و ضعیف و ناچیز و غیره و غیره خطاب کنند. چقدر حوصله داری زن! چقدر عاشق خودت هستی که هیچ کدام از اینها را به خودت نمی‌گیری. تا آخر عمر می‌خواهی با خودت بگویی حالا آنقدرها هم بد نیستم؟ بعد از ترس اینکه یکبار دیگر اینها را بشنوی، می‌خزی گوشه لانه‌ات که هیچ به هیچ. آه همیشه پاک کردن صورت مسئله راحت‌ترین است.

خودکشی هم پاک کردن صورت مسئله است.

اوه البته! آدم چیز چندش‌آور و کثیف را پاک می‌کند. آدم کثافت و خرابی را از بین می‌برد؛ مثل تو. تو یک زندگی آفت‌خورده ای. تو مرض ای. و تنها با مردنت خوب خواهی شد. گاهی حل مسئله شبیه به پاک‌کردن صورت مسئله است. می‌بینی؟! چیزی نداری بگویی. چیزی برای گفتن نیست. دیگر نمی‌توانی به آن جمله‌های مقوایی تکیه کنی که با یک قطره اشک مچاله و خراب می‌شوند. نه نه دیگر کف‌گیرت خورده به ته دیگ. یا خودت تمامش می‌کنی یا آنقدر این‌ها را می‌گویم تا ذره ذره نابود شوی. می‌دانم خودآزاری، لذت می‌بری چنین خار و خفیفت کنم. آه گاهی واقعا دلم برایت می‌سوزد. چون واقعا تقصیر تو نیست که به چنین موجود چندش‌آوری تبدیل شده ای اما این تقصیر توست که زنده ماندی و چنین موجودی را پروار کردی. زخم‌های کوچکی که تنها درد تو بود حالا پر از بیماری و کثافت اند که روی آدم‌های دیگر می‌پاشی. خب می‌خواهی بگویی آنها هم اینکار را می‌کنند؟ خب آنها هم باید از بین بروند. خسته ای؟ بمیر و تا ابد استراحت کن. فکر می‌کنی برای بی‌تا بفرستی که دست مرا رو کنی؟ آه تو واقعا مرا به خنده می‌اندازی. تو واقعا موجود ضعیف و بیچاره‌ای هستی. اگر من به تو اهمیت نمی‌دهم چرا دیگری باید اهمیت بدهد؟

 
Read more...

from veer66

โปรแกรม

คำสั่งคำสั่งเดียวหรือหลายๆ คำสั่งที่เรียงกันเป็นลำดับ

ตัวอย่างโปรแกรม

Dim i As Integer  
For i = 1 To 3
  Print "สวัสดี"
Next

ผลการรัน:

สวัสดี
สวัสดี
สวัสดี

ตัวแปร

ตัวแปรคือที่ที่มีชื่อเอาไว้เก็บข้อมูล

ตัวอย่างโปรแกรม

Dim i As Integer
i = 20
Print i

ผลการรัน

20

โปรแกรมย่อย

ส่วนของโปรแกรมที่ถูกเรียกใช้ได้ในโปรแกรมนั้น เรียกอีกอย่างว่า “Subroutine”

ตัวอย่างโปรแกรม

Sub GreetThreeTimes()
  Dim i As Integer
  For i = 1 To 3
    Print "สวัสดี"
  Next
End

GreetThreeTimes
GreetThreeTimes

ผลการรัน

สวัสดี
สวัสดี
สวัสดี
สวัสดี
สวัสดี
สวัสดี

ฟังก์ชัน

คือโปรแกรมย่อยที่ทำงานเสร็จแล้วให้ค่าบางอย่างเสมอ

ตัวอย่างโปรแกรม Book.class

Function Add10(n As Integer) As Integer
  Dim m As Integer
  m = n + 10  
  Return m
End

Print Add10(20)

ผลการรัน

30

อ็อบเจกต์และคลาส

  • อ็อบเจกคือสิ่งประกอบไปด้วยโปรแกรมย่อยและตัวแปร
  • คลาสคือสิ่งที่กำหนดอ็อบเจกต์

ตัวอย่างโปรแกรม

Id As String
Title As String
Author As String

Sub PrintObject()  
  Print Id, Title, Author
End

ข้อกำหนดในการเข้าถึง

  • Public ใช้ได้จากทุกส่วนของโปรแกรม
  • Private ใช้ได้เฉพาะในอ็อบเจกต์เดียวกัน

ตัวอย่างโปรแกรม Book.class

Public Id As String
Public Title As String
Public Author As String

Public Sub PrintObject()  
  Print Id, Title, Author
End

การสร้างอ็อบเจกต์

สร้างอ็อบเจกต์ตามที่คลาสกำหนดโดยคำสั่ง “New”

ตัวอย่างแบบยาว

Dim Book1 As Book
Book1 = New Book

ตัวอย่างแบบสั้น

Dim Book1 As New Book

การใช้งานตัวแปรของอ็อบเจกต์

ชื่อออปเจกต์.ชื่อตัวแปร

ตัวอย่างโปรแกรม

  Dim Book1 As New Book
  Book1.Title = "โฉมหน้าศักดินาไทย"
  Print Book1.Title

การใช้งานโปรแกรมย่อยของอ็อบเจกต์

โปรแกรมย่อยของอ็อบเจกต์หรือที่เรียกอีกอย่างว่า “เมท็อด”

ชื่ออ็อบเจกต์.ชื่อโปรแกรมย่อย

ตัวอย่างโปรแกรม

  Dim Book1 As New Book
  Book1.Title = "โฉมหน้าศักดินาไทย"
  Book1.Author = "จิตร"
  Book1.Id = "TH001"
  Book1.PrintObject

ผลการรัน

โฉมหน้าศักดินาไทย	จิตร		TH001

สังกัดอ็อบเจกต์หรือคลาส

  • ปกติแล้วสังกัดอ็อบเจกต์
  • ให้สังกัดคลาสให้ใส่คำว่า “static”
  • โปรแกรมย่อยสังกัดคลาสใช้ได้โดยไม่ต้องสร้างอ็อบเจกต์

ตัวอย่างคลาส Book.class

Public Id As String
Public Title As String
Public Author As String

Public Sub PrintObject()  
  Print Id, Title, Author
End

Static Public Sub Info() 
  Print "หนังสือเป็นสื่อ"
End

ตัวอย่างการเรียกใช้งานโปรแกรมย่อยที่สังกัดคลาส

Book.Info
 
Read more...

from نویساک

همیشه این احساس حضور دارد. همیشه احساس می‌کنم باید کارهایم را تمام کنم تا نوبت به نوشتن برسد یا دقیق‌تر بگویم، به خودم برسد. نوشتن خود من است و پرداختن به خودم است. چه نوشتنی؟ هرچیز. بگذار بگوییم تداعی. حالا هم داشتم به کوه کارهای عقب‌افتاده نگاه می‌انداختم که به‌خاطر دو هفته تعطیلی و مسافرت ناقابل روی هم تلنبار شده است. هیچ میلی به انجام دادنشان ندارم. می‌خواستم خواندن کتاب هری پاتر را ادامه دهم، اما یک احساس مرموزی داشتم. هرگاه به شکل غیرقابل کنترلی کتاب می‌خوانم احساس عجیبی دارم. دیگر مرز جهان واقعی و کتاب گم می‌شود. انگار چیزی که مرا به سمت خواندن می‌کشد، داستان کتاب نیست، بلکه چیزی در دنیای واقعی مرا دفع می‌کند. انگاری من می‌خواهم از چیزی فرار کنم و کجا بهتر از داستان‌ها. البته فرار به جهان کتاب‌ها لطف بیشتری نسبت به فضای مجازی با محتوای مبتذلشان است، با این حال در نظر من فرار کردن کاری بیمارگون است. پس به مانیتور خیره شدم و از خودم پرسیدم: راستش رو بگو، چی توی مغزت می‌گذره؟ چیزی که در حال نوشتن آن هستم، پاسخ نه چندان صادقانه و مقدمه‌وار به این پرسش است. چیزی که ذهن مرا مشغول می‌کند، خود «نوشتن» است. دیروز با بی‌تا جلسه داشتم. بحث ما دوباره به نوشتن و زبان رسید. برای من توضیح داد که چگونه روان بر زبان سوار است. در نتیجه هر نوشتنی از ناخودآگاه برمی‌آید، به‌ویژه نوشتن خلاقانه که شاید بتوان آن را تداعی گفت. البته هیجان‌انگیزترین قسمت آن این است که نمی‌توانیم به کسی بگوییم که «ننویس». به عبارت دیگر، هیچ نوشته‌ای که تداعی باشد، نمی‌تواند در وضعیت کمال قرار بگیرد. چرا که واژه‌ها در آن نوشته به نزدیک‌ترین مفاهیم درون ذهن‌مان اشاره دارند. آنها دقیقا ما را توصیف می‌کنند. تو گویی واژه‌ها دقیقا در حال انجام کاری هستند که برای آن ساخته شده اند، انتقال معنا. آنها اهمیتی نمی‌دهند که نیت خودآگاه ما از به‌کاربردنشان چیست،‌ اینکه می‌خواهیم خودنمایی کنیم یا سانسور. اگر نوشتن دقیقا چنین چیزی باشد، که البته نمی‌توان از این بابت مطمئن بود، از این پس می‌توانم بنویسم بدون اینکه به‌دنبال بهترین نوشته باشم. اگر چه گستردن دایره واژگان و مفاهیم و اصطلاحات می‌تواند مرا در این سفر خودشناسانه بیشتر همراهی کند، اما اصل کار همان است؛ نوشتن!

 
Read more...

from veer66

  1. Choose the right mirror, e.g. rpmfind
  2. Install taint codecs etc.
  3. Install Thai fonts
  4. Customize the keyboard layout
  5. Add fonts.conf
  6. Choose LibreOffice default language/fonts
  7. Add Flathub
  8. Install Discover and make Flatpak as the default package manager
 
Read more...

from veer66

คำออกตัว

ผมไม่ได้เรียนเกี่ยวกับกฎหมายและไม่ได้ทำงานเกี่ยวกับกฎหมาย

ซอฟต์แวร์เสรีและโอเพนซอร์ส

ซอฟต์แวร์เสรีเป็นซอฟต์แวร์ที่เคารพสิทธิของผู้ใช้และชุมชน ได้แก่ สิทธิในการรัน ทำซ้ำ เผยแพร่ ศึกษา แก้ไข และปรับปรุงโปรแกรม อย่างไรก็ตามในเวลาต่อมามีขบวนการโอเพนซอร์สเกิดขึ้นเพื่อสร้างแนวร่วมกับบริษัทกระแสหลัก โดยแก้จำกัด 2 ประการของซอฟต์แวร์เสรี ได้แก่ (1) ซอฟต์แวร์เสรีในภาษาอังกฤษเรียกว่า “free software” โดยคำว่า free หมายถึงเสรีก็ได้หรือไม่เสียค่าใช้จ่ายก็ได้และมักจะถูกเข้าใจผิดว่าหมายถึงไม่เสียค่าใช้จ่าย และ (2) ศัพท์ว่า “free software” ทำให้ชาวบริษัทจำนวนมากกังวลใจ

อย่างไรก็ตามภาษาไทยไม่มีปัญหาความคลุมเครือของคำว่า “เสรี” แบบคำว่า “free” ในภาษาอังกฤษ และยังไม่มีข้อมูลว่าชาวบริษัทในประเทศไทยรู้สึกดีกับศัพท์ว่า “โอเพนซอร์ส” กว่าศัพท์ว่า “เสรี” นอกจากนั้นคำว่า “เสรี” เช่น ตลาดเสรี การค้าเสรี เสรีประชาธิปไตย ก็เป็นคำศัพท์ที่มีความหมายไปในทางทุนนิยมที่ชื่นชอบของบริษัทที่แสวงหาผลกำไรแบบปกติ

หลักการ

โปรแกรมใดจะเป็นซอฟต์แวร์เสรีก็ต่อเมื่อมีเสรีภาพ 4 อย่างข้อต่อไปนี้

  1. เสรีภาพที่จะใช้งานโปรแกรมเพื่อจุดประสงค์อะไรก็ตาม
  2. เสรีภาพในการศึกษาและแก้ไขดัดแปลงโปรแกรม ข้อนี้ทำให้ต้องเข้าถึง source code ได้
  3. เสรีภาพในการเผยแพร่ซอฟต์แวร์ที่ยังไม่ได้แก้ไข
  4. เสรีภาพในการเผยแพร่แวร์ที่แก้ไขแล้วออกไป

กฎหมายไทย

จากพระราชบัญญัติลิขสิทธิ์ มาตรา 27 “การกระทำอย่างใดอย่างหนึ่งแก่งานอันมีลิขสิทธิ์ตามพระราชบัญญัตินี้ โดยไม่ได้รับอนุญาตตามมาตรา ๑๕ (๕) ให้ถือว่าเป็นการละเมิดลิขสิทธิ์ ถ้าได้กระทำดังต่อไปนี้ (๑) ทำซ้ำหรือดัดแปลง (๒) เผยแพร่ต่อสาธารณชน” เห็นได้ว่ามาตรานี้จำกัดเสรีภาพในดัดแปลงแก้และเผยแพร่งานซึ่งขัดกับหลักซอฟต์แวร์เสรี นอกจากนั้นในมาตรา 4 ระบุไว้ว่าโปรแกรมคอมพิวเตอร์เป็นวรรณกรรมและในมาตรา 6 ระบุว่าวรรณกรรมเป็นงานอันมีลิขสิทธิ์ทำให้โปรแกรมคอมพิวเตอร์เข้าข่ายนี้ด้วย

นอกจากนั้นผู้สร้างสรรค์ผลงานเป็นผู้มีลิขสิทธิ์ ตามมาตรา 8 ดังนั้นผู้มีลิขสิทธิ์จึงเกิดขึ้นโดยที่ไม่ต้องจดหรือลงทะเบียนกับรัฐเลย และเจ้าของลิขสิทธิ์ไม่มีอำนาจในการยกเลิกลิขสิทธิ์ในมาตรา 15 ซอฟต์แวร์เสรีจึงต้องเป็นโปรแกรมคอมพิวเตอร์ที่มีลิขสิทธิ์ ไม่ใช่โปรแกรมไม่มีลิขสิทธิ์

อย่างไรก็ตามเพื่อให้ทุกคนมีเสรีภาพตามหลักการซอฟต์แวร์เสรี เจ้าของลิขสิทธิ์อนุญาตให้ทุกคนมีสิทธิ์ในการทำซ้ำหรือดัดแปลง เผยแพร่ต่อสาธารณชน ให้เช่าหรือให้สำเนาได้เป็นการทั่วไปโดยระบุไว้ในสัญญาอนุญาต

ส่วนประกอบของสัญญาอนุญาตพื้นฐาน

สัญญาอนุญาตก็คืออนุญาตอย่างน้อยให้ทำตามเสรีภาพที่ควรมีของซอฟต์แวรเสรีคืออนุญาตให้ใช้งาน ทำซ้ำ เผยแพร่ เช่น บางส่วนของสัญญาอนุญาตแบบ Expat/MIT «Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:» จะเห็นว่ามีคำว่า use copy modify publish และ distribute ด้วย

ความเป็นสาธารณะ

คนธรรมดามักจะช่วยเหลือส่วนรวมก่อนช่วยเหลือเอกชนหรือบุคคลที่ไม่ได้เป็นอะไรกัน เช่น บริจาคหนังสือให้สมุดสาธารณะแทนที่จะบริจาคให้ห้องสมุดส่วนตัวของคหบดีท่านหนึ่งที่ไม่รู้จักกัน การลงทุนลงแรงกับซอฟต์แวร์เสรีก็คล้ายกัน ในกรณีคนปกติก็อยากช่วยพัฒนาซอฟต์แวร์ที่มีความเป็นสาธารณะมากกว่าซอฟต์แวร์ของคนที่ไม่ได้เกี่ยวข้องกัน

คนทั่วไปยิ่งไม่อยากให้คู่แข่งเอาเปรียบ สำหรับซอฟต์แวร์เสรีการที่คู่แข่งแก้ไขปรับปรุงแล้วเอาไปขายหรือใช้ในกิจการแต่ไม่เผยแพร่รหัสต้นฉบับ (source code) สู่สาธารณะ อาจมองว่าเป็นการเอาเปรียบคนอื่นจนเกินไป สัญญาอนุญาตบางแบบโดย เช่น GNU General Public License (GPL) สร้างมาเพื่อจัดการประเด็นนี้โดยมีข้อความส่วนหนึ่งว่า “You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:” ซึ่งมีเงื่อนไขให้เผยแพร่รหัสต้นฉบับที่แก้ไขแล้ว ตัวอย่างซอฟร์แวร์ที่ใช้สัญญาอนุญาต GPL เช่น Linux Wordpress VLC Blender ซึ่งเป็นซอฟต์แวร์ที่ได้รับความนิยม และโดยเฉพาะ Linux มีเอกชนหลายเจ้าช่วยกันพัฒนา

อย่างไรก็ตามในยุคที่ใช้งานผ่านเครือข่ายก็มีการอ้างว่าไม่ได้เผยแพร่โปรแกรม จึงไม่ต้องแจกจ่ายรหัสต้นฉบับจึงมีสัญญาอนุญาต GNU AFFERO GENERAL PUBLIC LICENSE (AGPL) ซึ่งมีข้อความส่วนหนึ่งว่า “Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software.” เป็นเงื่อนไขว่าต้องแจกจ่ายรหัสต้นฉบับเมื่อมีนำโปรแกรมที่แก้ไขปรับปรุงไปให้ใช้ผ่านเครือข่ายคอมพิวเตอร์ ตัวอย่างซอฟต์แวร์ที่ใช้สัญญาอนุญาต AGPL เช่น Mastodon Nextcloud OnlyOffice ทั้งหมดเป็นโปรแกรมสำหรับใช้งานผ่านระบบเครือข่าย

สิทธิบัตร

ประเทศไทยยังไม่สิทธิบัตรซอฟต์แวร์ แต่ไม่ใช่ทุกคนอยู่ในประเทศไทยหรือจะอยู่ในประเทศไทยตลอดเวลา จึงต้องคำนึงถึงสิทธิบัตรด้วย เพราะไม่ละเมิดลิขสิทธิ์แต่ละเมิดสิทธิบัตรก็เสียทรัพย์ได้ ดังนั้นสัญญาอนุญาต GPL รุ่นที่ 3 จึงมีข้อความเกี่ยวกับการยุติสิทธิบัตรและค่าสินไหมด้วย «A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License» เช่น เดียวกับสัญญาอนุญาต Apache รุ่นที่ 2 ก็มีความลักษณะคล้ายกันว่า “Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work”

ส่วนที่ไม่ใช่โปรแกรม

สัญญาอนุญาตที่เป็นที่นิยมใช้กับเอกสาร รูปภาพ วิดีโอ และเพลงโดยเฉพาะคือสัญญาอนุญาตครีเอทีฟคอมมอนส์ ซึ่งเขียนย่อว่า CC โดยมีเงื่อนไขย่อยให้เลือกคือ BY คือให้เครดิตว่าเจ้าของผลงาน SA คือหากมีการแก้ไขปรับปรุงต้องเผยแพร่งานที่แก้ไขในสัญญาอนุญาตแบบเดียวกัน NC คือห้ามใช้เพื่อการค้า ND คือห้ามดัดแปลง ซึ่งจะเป็นได้ว่าเงื่อนไข NC และ ND ขัดกับหลักการซอฟต์แวร์เสรี โครงการที่ใช้สัญญาอนุญาตครีเอทีฟคอมมอนส์ เช่น วิกิพีเดีย สัญญาอนุญาตครีเอทีฟคอมมอนส์ถึงแม้จะมีบางบางที่เข้ากันไม่ได้กับซอฟต์แวร์เสรี แต่ก็เป็นการให้สิทธิเป็นการทั่วไปกับสาธารณะกล่าวคือทุกคนได้รับสิทธิ ต่างจากข้อตกลงที่ของบริการโซเชียลมีเดียหลายรายที่ผู้ใช้จะใช้งานได้ก็ต่อเมื่อยอมรับข้อตกลงที่ให้สิทธิแพลตฟอร์มนำผลงานไปใช้ ประมวลผล แก้ไขดัดแปลง เผยแพร่ หรือแม้แต่อนุญาตคนอื่นต่อ

การเลือกสัญญาอนุญาต

โดยทั่วไปควรเลือกสัญญาอนุญาตที่มีความเป็นสาธารณะ เช่น GPL หรือ AGPL เพราะคนธรรมดาย่อมอยากช่วยส่วนรวมมากกว่าเอกชน ยกเว้น

  • โปรแกรมสั้นมากใช้ APACHE-2.0 เพราะเขียนใหม่เอาก็ได้ง่าย ๆ ใช้ GPL ก็ไม่มีประโยชน์
  • ต้องการใช้งานกว้างขวางถึงแม้บุคคลหรือนิติบุคคลที่นำไปใช้จะไม่เผยแพร่ส่วนที่แก้ไขก็ตาม เช่น libogg ที่อยากให้คนใช้ OGG แทน MP3 ให้ใช้สัญญาอนุญาต APACHE-2.0
  • ไลบรารี (Library) ที่ไม่ได้รวมเข้ามาเป็นส่วนเดียวกับโปรแกรม (dynamic link) ที่ต้องการให้คนใช้งานกว้างขวาง แต่ไม่ต้องการให้ไลบรารีเองโดนยังคงความเป็นสาธารณะ แต่ไม่มีเงื่อนกับโปรแกรมที่เรียกใช้ไลบรารี

ควรหลีกเลี่ยงสัญญาอนุญาตแบบ Expat หรือสัญญาอนุญาต MIT เพราะอาจจะทำให้ชุมชนที่พัฒนาและใช้งานซอฟต์แวร์ถูกคุกคามโดยใช้สิทธิบัตรได้ อย่างไรก็ตามอาจจะมีความจำเป็นต้องใช้สัญญาอนุญาตแบบนี้กับองค์กรที่มีความต้องพิเศษและพิจารณาแล้วว่าส่งผลดีกับตัวเองและส่วนรวม

อ่านเพิ่ม

 
Read more...

from A new Japanese learner takes on JRPGs

While playing an RPG has been good for seeing new words, I'm finding it hard to glean the grammar and sentence structure from this exercise. So instead of continuing, I'm currently learning grammar from a textbook! I will return, once I can conjugate verbs at least.

 
Read more...

from Finanzas Personales

Primer día acá. Veamos:

Metas: – Llegar a 2035 con plata suficiente para jubilarme y hacer lo que se me venga en gana – Salir pronto de deudas

Monto requerido: $250.000.000.-

Patrimonio actual: – Cuenta líquida: $70.000 en 2 cuentas – Cuenta de ahorros/inversiones: $436.317, en una cuenta Tenpo

Gastos mensuales: Promedio: No tengo a mano ahora la libretita, pero son como $1.950.000.-

Ingresos mensuales: Fijos: $1.000.000 Variables: ahí jugando a veces cumplo con la meta, a veces no

 
Leer más...

from Vahid

این روز‌ها استقبال از شبکه های اجتماعی #آزاد و #نامتمرکز بیشتر شده و با اتفاق‌هایی که در #توییتر و #ردیت افتاده، مهاجرت کاربران به #فدیورس سرعت بیشتری گرفته. با توجه به اینکه اکثر کاربران از گوشی تلفن همراه و اپ رسمی #ماستودون برای ایجاد حساب کاربری استفاده می‌کنند، بدون اطلاع از ساختار شبکه‌های اجتماعی نامتمرکز و وجود نمونه‌های متعدد از سرورها و نرم‌افزارهای قابل استفاده؛ همگی بر روی سرور mastodon.social حساب ایجاد می‌کنند. این سرور بزرگ‌ترین و شلوغ‌ترین سرور ماستودونه که توسط خود توسعه دهنده ماستودون ایجاد شده و متاسفانه برای کاربران داخل ایران فیلتره. شاید با خودتون فکر کنید که بزرگ‌تر بودنش و اینکه سرور متعلق به خود توسعه دهنده است که خوبه و مزیتش حساب می‌شه. این فکر به این دلیل بوجود میاد که ذهنیتی که شما از شبکه‌های اجتماعی دارید، مربوط به شبکه‌های اجتماعی متمرکز مثل توییتر و #اینستاگرام و... است و ساختار فدیورس رو درک نکردید. پیشنهاد می‌کنم کمی درمورد فدیورس مطالعه کنید تا متوجه بشید مواردی که درمورد mastodon.social بیان شد، درواقع نقاط ضعف اونه و بهتره کاربران بین نمونه‌های کوچک‌تر، با قوانین و شرایط مناسب جمع و گروه کاربری خاص خودش تقسیم بشن. پس از گذشت مدت زمان کمی، تعدادی از کاربران متوجه این موضوع می‌شن و پرسشی که براشون پیش میاد اینه که حالا چه کنیم؟ در نرم‌افزار ماستودون قابلیتی برای انتقال حساب کاربری از نمونه‌ای به نمونه دیگر وجود داره که کار رو برای مهاجرت ساده می‌کنه. با انجام فرایند انتقال حساب، افرادی رو که پیگیری می‌کنید و افرادی که شما رو پیگیری می‌کنند، به صورت خودکار به حساب جدید منتقل می‌شن. دقت داشته باشید که فرایند انتقال به نمونه دیگری از ماستودون، پست‌های قبلی شما رو منتقل نمی‌کنه. درعوض حساب قدیمی شما رو با حساب جدید لینک می‌کنه و با انجام این کار، نیازی به انتقال پست‌های قدیمی ندارید.

نحوه انتقال حساب:

1- ابتدا حساب جدید رو در نمونه مورد نظرتون ایجاد کنید.

2- از قسمت Account گزینه Account settings رو انتخاب کنید. تصویر تنظیمات اکانت ماستودون

3- گزینه Moving from a different account رو انتخاب کنید. تصویر بخش انتقال حساب در ماستودون

4- در این بخش باید یک Alias از حساب قدیمیتون ایجاد کنید. دقت کنید که فرمت اون باید مشابه این باشه: user@domain.tld تصویر بخش ایجاد Alias در ماستودون

5- حالا وارد تنظیمات حساب قدیمیتون شده و به بخش Account settings برید.

6- گزینه Move to a different account رو انتخاب کنید.

7- در فیلد Handle of the new account آدرس نمایه جدیدتون رو مانند مثال وارد کرده و رمز فعلی حساب قدیمی رو در فیلد Current password وارد نمایید. حالا گزینه Move followers رو کلیک کنید. بخش ایجاد Handle حساب جدید در ماستودون

تمام! بعد از مدت کمی مخاطبان حساب قبلی به حساب جدید منتقل خواهد شد. تصویر وضعیت نمایه بعد از انتقال حساب در ماستودون

در ادامه می‌تونید بعضی از داده‌ها مثل Bookmarks یا بلاک لیست و... رو از بخش Import and Export استخراج کرده و در حساب جدید بارگذاری کنید.

امیدوارم این پست بتونه توی انتقال حساب در ماستودون بهتون کمک کنه.

برای آشنایی بیشتر با فدیورس پیشنهاد می‌کنم نحوه عملکردش رو از لینک های زیر مطالعه کنید: – English by Alireza Hayatiترجمه فارسی از پارسا رنجبر

#mastodon #fediverse

 
بیشتر بخوانید...