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。

旧至冬落幕、愚人众解散的两年后,“公子”终于接到一件像样的任务。

警方接受了他的建议,而助手已经将车发动:“先生用麻醉枪?对方有手雷的话,五十米以外可以吗?”

“够了。”钟离道。他摇下一点车窗,瞄准警方告知的位置。监听耳机隔绝了百余米外战斗机降落的声音,向他播送基地内的一片嘈杂,然后,在他数到第十七声枪响时,传来一声高喝:“二层北数第五个窗口!”

几乎同一时间,一个身影跃出那个已经破损的窗户。钟离算好提前量,在他落地翻滚时一枪命中对方大腿。那人惨叫一声,没能站起来,却也没有放弃,拖着伤腿试图爬行。

达达利亚恰在此时接入通讯:“漂亮,钟离先生!还有剩的吗?可不可以留一个给我?”

“还有一个。”钟离告诉他。最后的在逃嫌疑人从邻近窗口窜出,距他更远一些。在他能够重新瞄准之前,伤者向主犯伸出手,却被同伙一枪打中脖颈,血溅出数米之远。

频道中一时无人说话。那名主犯沿蛇形路线向飞机狂奔,达达利亚降落时掀起的黄尘犹未落定,掩住亡命之徒的身形。麻醉枪的精度相较军用枪械略有不足,钟离轻轻呼出一口气,“那就交给你了,公子。留他一命。”

“收到。”达达利亚说。

他本可以坐等对方自投罗网,然而方才一幕足以激怒任何对生命抱有最低限度尊重的人。临时飞行员戴上护目镜,打开座舱罩,撑住边缘一跃而下,甚至没有携带热武器。徒手夺枪是愚人众特工的基本训练内容,达达利亚于这一项表现优异,不过眼前的对手尚不需要他用出自己所掌握的全部技巧。主犯刚举起枪,就被他以左臂架开,上身被迫随之转向左侧,无法继续攻击;接着是一记勾拳,至冬青年身量更高,直接砸到太阳穴上,对方应声倒地,当场昏迷,不过达达利亚仍按操典将人翻过来用膝盖压制,从裤兜里掏出手铐锁好。

夷琯驾车驶近,见到这套行云流水的动作不由开口称赞:“先生这次请来的搭档,可真是张wildcard。”

“我有意吸纳他入基金会。”钟离道。

“有位本地面孔许多时候确实方便许多。”她停车开门,去处理那架老式战斗机的后续交付工作,以运输车把它送往真正的买家处。

达达利亚小跑过来,忽然停住,扭头呸呸吐出两口灰,又抹了把脸,没急着上车,而是拉高风镜,示意钟离摇下车窗。他单手搭在窗框上缘,俯身抛出一连串问题:

“先生恐高吗?有高原反应吗?会用降落伞吗?航空燃油有多贵,我的佣金能负担吗?——还有时间带先生坐MG-3兜个风吗?”

“不,无,会,恐怕不能,民间渠道很贵,”钟离含笑依次回答,“之后有时间,但这架已经是别人的了。”

他夸张地叹了口气,钻进驾驶席。废弃基地烧起来一小片,他在钟离的指引下穿梭于警车、救护车和救火车之间,把人送去同璃月与至冬的官方人员交谈。十多分钟后,钟离回到车上。“基金会名下还有其它飞机。这里收尾不需要我们,往至冬宫开吧。这段路兜风也不错。”他道。

达达利亚驶过一段碎石地,拐上公路,深踩油门,立刻决定这是他的梦中情车,哪怕身边并没有谁——即使在年久失修的公路上飞驰,车上也几乎感受不到任何颠簸。他的同乘者拧开收音机,此地信号不佳,女主持人用略微失真的声线断断续续地向他们介绍一位百年前去世的国宝级作曲家。钟离说得对,年轻人想,这段路很适合兜风——他们面前是无垠的戈壁,身后是飞扬的浮尘;太阳正照耀着整个至冬,这条笔直长路目力所及的尽头反射日光,辉煌夺目。他全神贯注地享受此刻的速度,将先前短暂兴奋后的失落抛在一边,直到钟离用一个拧开盖子的保温杯贴了贴他的胳膊。

“电解质水。”璃月人道。

这种又甜又咸的饮品实在称不上好喝。达达利亚大口灌下小半杯,道谢之后交还对方。“钟离先生,主犯归案,任务算是……结束了吗?”

在这一刻,他希望这条公路无限延伸。

“取决于看待者的视角。”钟离说,“对于璃月专案组而言,至冬的工作自然可以告一个段落了。”

“——但还有人尚未落网。”达达利亚领会了他的言外之意,心知这是来自前大使的珍贵指导,思索片刻后道,“他的女友,他们的销赃和走私渠道,还有其他与之相关的不法分子……都该由至冬方面接手。”

“方才同他们聊过,安全局会继续跟进。”

“那先生对我的委托……”达达利亚在《1812序曲》的最后说,希望结尾处的炮声为自己过于明显的情绪遮掩一二。

“我也会,所以委托继续。公子放心,会加钱。”他的话音含着一丝笑意。


达达利亚心道若能常伴左右,扣钱都行。他畅想过接下来的任务时间如何度过,钟离会不会与他一同行动,没想到事务繁杂,之后十天也就见了对方一面:前大使安排专案组搭乘专机低调回国,并在此前带他参加了他们的阶段性庆功宴。每个璃月人都信誓旦旦,如果不是尚未结案,不宜饮酒,一定能把他喝趴下;他自然也放出狠话,并且开始遗憾同这群人今后恐怕再难产生什么交集。

钟离让他尽量把专案组搭乘下一班至冬璃月列车回国的假消息散出去,自己则同安全局达成某种协议,开始指导他们为收官之战展开演习训练,以免又发生上次杀手大闹总部大楼这样不体面的情况。待前特工成果斐然,获悉主犯的情人正在招兵买马意图停车劫人的动向,钟离又请他负责演训一事,自己不知去忙什么了。

不过有些话或许本不必说,难道有什么是钟离不知道的吗?基金会借买主身份与主犯接洽时,付过一笔可观的定金,他曾以为这是必要的投入,如今才看明白又是璃月人的安排:为对方提供募集人手的资本,好将这些至冬宫的不安定因素一网打尽。

眼下,达达利亚伏在边境车库楼顶。厂房门户大开,灯火通明,将他的身形彻底隐于高处的黑暗中,但他仍谨慎地藏在临时搭建的掩体后。两国列车轨道形制不同,需要在此更换车轮方可继续运行。根据推演,晚间八至翌日零时的检修时间是劫匪同党的最佳行动机会;半天前,前特工的私人暗线也确认了计划确实如此。若他们得逞,整班列车的司乘都会沦为人质。

夏季昼长夜短,至冬纬度高,便尤为如此。达达利亚从夕阳残照时分等了一个多小时,直至暮色四合,远远近近的林与山都化作暝蒙的墨痕。九点光景,几道光忽然划破浓黑,在树影间隐现。他举起望远镜观察片刻,心中有了判断,接通对讲机道:“他们来了,还有二十分钟左右。”

有人同他交接观察哨岗。他叮嘱几句,下楼返回室内。庞大的十八节列车已经停在起重机上,抬升至半空,本该人声鼎沸的车厢却一片寂静,应有的技术人员也杳无影踪。达达利亚登上头等区,终于在这周第一次见到了钟离。

璃月人在卧铺上坐得笔直,对面的安全局副局长则靠在一等座才有的沙发上。他们之间的火车标配小桌板摆着两个杯子,靠床的飘着茶香,不过已经没了热气。达达利亚进来时,顺手提起门边的热水瓶,为他们加到半满。

钟离左手捧着巴掌宽的笔记本正在阅读,在他进门后啪地一声合起,收进了外套中。他为热水道谢,请达达利亚坐在身边,年轻人自然不会推辞,抬眼见到副局长带着点惊奇的眼神。稍加思索,他明白过来——刚才完全是自己下意识的行动,而之前在局里演训时,前特工可一次都没有做过这样端茶送水的貌似逢迎之举。

车库的广播设备启动了,开始播放事先准备的旅客聊天和机械装卸录音。根据他们行动计划,这代表敌人已经进入五公里范围内。“对方多半会先集合,休整片刻后行动。不妨猜猜他们何时开始吧?”钟离开口。他又递来那个保温杯,里面仍是不太好喝的功能饮料,达达利亚一口干下,然后问他分去半杯茶水。

“九点三十五分。”璃月人望着电子钟,轻声道。

 

TBC

 

下集预告:我觉得应该是最后一集了!

 
阅读更多

from 非普遍理性

#G #至冬行动

电影《莫斯科行动》paro。

旧至冬落幕、愚人众解散的两年后,“公子”终于接到一件像样的任务。

文件袋里有达达利亚在愚人众时的档案,钟离请他找出和战斗机驾驶有关的部分,又递去一份S-27和MG-3的对比。“主犯团伙先前正在同基金会商榷送货方案,把飞机开到交易地点的一方自然能在之后的行动中占据极大主动。他们想要自己‘提货’,试图以此压价,我们则表示能够提供后续航空燃油,和代为协调空域使用权。”钟离很快用完早餐,为自己斟上第二道茶,“我猜公子大约会对这样的‘送货’工作产生兴趣,但是请勿急于接受——仓库里的那架虽然已经反复查验,理论上仍能使用,可毕竟是早该报废的型号,与阁下拥有充足经验的三代机相比,沿袭了两种截然不同的设计路线。请务必看过材料之后再做决定。”

他们坐在沙发两侧,阅读各自的文件,窗帘缝隙处漏进来的一线阳光渐渐从桌旁爬到他的脚边。“以公子的履历,很难理解安全局错失遗珠。阁下的师长中,有人目前在东蒙德吗?”钟离忽然轻声问。

前大使的推测一针见血,达达利亚给出肯定的回答,房间便又只剩簌簌的翻页声。中午时分,他学完材料。正如钟离所说,驾驶飞机即使为了“送货”,也比赌场保安有意思得多,他想不到拒绝的理由。从另一个角度考虑,古董战斗机也不是谁都能送的货,他宁可为钟离做成这件事的是自己。

在他正要开口之时,电话响了。他听出交易的另一方在价格方面有所退让,但要求卖家尽快交货——璃月警方的嫌疑人侧写相当准确:昨夜之后,他们竟没有尽快转移,而是想着尽快赚上一笔。达达利亚怀疑他们妥协的原因或许包括团伙中能开飞机的已经落网。他向仍在通话的钟离点了点头,示意自己已经作出决定。

钟离瞧了他一眼。挂上电话后,他收好所有纸张,当着达达利亚的面锁进暗格。“先去吃饭。下午为公子预约了医院,现在刚好添上飞行员体检。”

前特工完全体会得到,钟离待他看似一如往常,可那维持得滴水不漏的距离感已经为自己放下了几分。这叫他在快乐之余产生了轻微的不忿:他们之间,璃月人似乎是彻底的领舞者。他离门口更近一些,抢先从衣帽架取下对方的长外套——口袋是空的。他悻悻然递过去,“钟离先生,”他清了清嗓子,“你对每个‘护卫’都这么好吗?”

“公子阁下,你知道的,我不需要护卫。”钟离笑着将对方想找的车钥匙抛给他,然后抖开风衣披上,转身出门时故意叫下摆扫过年轻人的大腿——那种触感绝无可能仅由布料的质量造成;前特工知道里面一定藏了什么,只是判断不出具体内容。长辫随着他的动作荡开,掀起渺渺香浪,叫达达利亚想要立刻亲吻他的发梢。

他关上门,快走几步与钟离并肩而行。钟离当他是值得信任的搭档,这很好。至于其它,或许应当等到此事终了——优秀的乌鸦都知道,任务期间不谈私情。


除了被发现时常熬夜,达达利亚的体检报告显示他的状态维持得极好。交易时间定在一周之后,训练窗口极为有限,他直接推掉赌场的工作,甚至没有收拾行李,便与钟离一同前往位于邻市的仓库。出发时他两手空空,抵达之后倒是什么都不缺,基金会准备好了他们可能用到的一切,他只需要全身心投入到排满了的日程中。

前两天他复习完一本厚厚的空气动力学,第三日交易地点敲定下来,对方选了至冬宫远郊一处废弃火箭基地。他一边研究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@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...