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 نویساک

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

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

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

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

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

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 نویساک

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

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

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

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

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

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

 
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 FS Fans

این روز‌ها استقبال از شبکه های اجتماعی #آزاد و #نامتمرکز بیشتر شده و با اتفاق‌هایی که در #توییتر و #ردیت افتاده، مهاجرت کاربران به #فدیورس سرعت بیشتری گرفته. با توجه به اینکه اکثر کاربران از گوشی تلفن همراه و اپ رسمی #ماستودون برای ایجاد حساب کاربری استفاده می‌کنند، بدون اطلاع از ساختار شبکه‌های اجتماعی نامتمرکز و وجود نمونه‌های متعدد از سرورها و نرم‌افزارهای قابل استفاده؛ همگی بر روی سرور 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

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

from diorama

The group of people that administer MastodonUno and the Diggitaverse is known under the name of Devol. The group grows up in the shadow of filippodb – former web 2.0 sorcerer, prodigal techbro, and de facto Devol group leader. It is an error to infer a 100% overlap between their own thoughts and filippodb’s since the group shows some degree of independent judgement. However, this is not the case we discuss today. It seems a ChatGPT-like stochastic parrot was trained on filippodb’s messages and wrote an appeal on Devol’s official blog. The group makes accusations against the author of the blog you are currently reading, against people in the fediverse sharing its posts, and against fediverse instances hosting those people. At the moment being, their accusations are made of informal, both public statements and private messages.

Their words are made to let people think they will promote legal actions against them. As far as I know, nobody has received a formal cease-and-desist letter by their lawyer. However, the use of pettifoging language is intended to “persuade” people to stop keeping themselves informed and it similarly affects the public discourse as legal bullying (a sort of para-legal bullying?). You can find a few words about 101 Criminal Law as bonus part at the bottom of the post.

Instead of preventive self-censorship, one should do the opposite, documenting and sharing information. The key is solidarity, so that one will not feel alone and isolated by such baseless accusations. Do not trust Devol’s reconstructions and wanna-be quotes. Always read the context where words are written. Several examples as follows: – The fact that «Filippo Della Bianca himself enthusiastically rolled out the red carpet to Claudio Messora [...] one of Della Bianca’s old acquaintances, from the days when Byoblu was “yet another” HIV/AIDS denialist blog under the Diggita umbrella» becomes – in Devol’s words – that Filippo Della Bianca is accused of belonging to a sort-of “HIV/AIDS denialist” sect, and of supporting these theories («parte di una sorta di setta di “ HIV/AIDS denialist” e appoggiare queste teorie»). It is a straw man to avoid criticism.

Figure 1: Diggita sharing button on young Byoblu website. October 2008.

Figure 2: Diggita sharing button on Byoblu website before the 2019 restyling. February 2018, ten years later.

Figure 3: “Hello, world. Welcome, Freedom!”. filippodb boosts Byoblu admin account (which belongs to Messora). 15/04/2020.

Figure 4: filippodb’s enthusiasm about 10k new users in the fediverse cannot be undermined by Byoblu node spreading fake news. 19/04/2020.

Figure 5: Byoblu looking for experts for a video. 21/04/2020.

Figure 6: “Byoblu got everybody in the line!”. filippodb’s enthusiasm is actually esteem (envy?). 09/05/2020.

  • The fact that «Mastodon Uno silences critics against their “welcoming behaviour” towards fascists-and-the-like, [N.A.: the reference is the sentence before, i.e. Byoblu itself that at the time has already fully developed a red-brown third-positioning] mainly the accounts of isolateByoblu and isolateGab. (screenshot)» becomes that Filippo Della Bianca is accused of having a site doing [sic] “welcoming behaviour” “towards fascists-and-the-like” («avere un sito che fa “welcoming behaviour” “towards fascists-and-the-like”»). Another straw man.

Figure 7: MastodonUno instance silences isolateByoblu and isolateGab counter-information initiatives, which used the tag #byoblu to spread awareness about Byoblu instance. In the meantime, posts by Byoblu supporters were visible. That way, no one in the MastodonUno could be reached by isolateByoblu and isolateGab. 06/08/2020.

Figure 8: such abused Martin Niemöller’s sermon, adapted for Byoblu, the time self-organised instances de-federated Byoblu. filippodb boosts the toot, roughly meaning “We will not de-federate it”. 20/04/2020.

Figure 9: filippodb defies criticism. “If MastodonSocial does not de-federate Byoblu, therefore MastodonUno will not take responsibilities.” 17/04/2020.

Figure 10: again, filippodb defies criticism. The fact that Byoblu spreads out the fediverse was not enough to de-federate it. Byoblu promised they will block far-right content (!) so that is enough for MastodonUno. 19/04/2020.

Figure 11: again x2, filippodb defies criticism. Byoblu updated policy to block fascist content. That is enough for MastodonUno. 24/04/2020.

Figure 12: 6 months later, MastodonUno had still been federating Byoblu. Since isolateByoblu accounts outside MastodonUno were silenced by MastodonUno, the initiative made a brand-new account on MastodonUno. The day after, isolateByoblu on MastodonUno was silenced, so that its messages could not go in the MastodonUno home and federated timeline. 18/10/2020.

  • Conversely, the fact that the brand owners do not file a complaint against Devol does not mean that their websites are authorised by the brand owners («I siti mastodon(dot)uno, peertube(dot)uno, pixelfed(dot)uno, funkwahale(dot)it [sic] mobilizon(dot)it ecc. sono tutti autorizzati dai rispettivi proprietari dei brand»). This is just a blatant lie.

Figure 13: Funkwhale developers collective blocks FunkwhaleIt. 02/04/2020.

Figure 14: Framasoft (the NGO developing Mobilizon and Peertube) warns against country-based or language-based centralising strategies. In reply to people asking for the officialism of MobilizonIt and PeertubeUno. 16/11/2020.

If Devol made arguments of this kind, I hope you would not mind some suggestion: – Do not give in to provocation. Aggressive stances are made on purpose to attract any kind of criticism, so that they can cherry-pick which kind of criticism and deflect criticism as a whole with whataboutism. Don’t give them a chance. – Consider to de-federate MastodonUno. Federation means trust. It is not the first time you expose your user base and your server to legal action, and professional data harvesters are fed by your user base (unencrypted!) messages, interactions, and metadata. For such a long time, we have lost the focus that this para-legal bullying puts the existence of self-organised instances and the lives themselves of both hosts and guests at perils.

I am sorry for technicalities but I think knowing some basics of Criminal Law helps us to face that kind of accusations. ⚠️ N.B.: do not take my words as legal advice.

First of all, just for the sake of example, let us assume the conducts we treat here are relevant in Italy and Italian jurisdiction holds, according to electronic commerce regulations. Do not take that assumption for granted: consider it as a worst case scenario.

The concept of freedom of speech in Italy is different from other countries, e.g. U.S.A.: there is no absolute right to tell the truth. The Court of Cassation (the Italian court of last resort) identified the following 3 criteria to discriminate freedom of speech from defamation, which is a criminal offence: 1- countenance of language 2- truthfulness of the events narrated 3- public relevance of the fact So, as long as the 3 criteria are fulfilled, one can sleep soundly. For further information, read Casarotti’s recap here (N.B.: Italian). Can these 3 criteria be applied in our case? Who reads is left to make their own judgement. If that is the case, who admin the Diggitaverse are fully responsible of bad reputation with their conducts.

Last but not least, if: 1- anyone accuses – even informally – someone of a criminal offence, 2- the events narrated are false, and 3- that might provoke an investigation by Italian authorities, then it is calumny (the “formal slander”) and it is on turn a criminal offence. The “might provoke” part is the key, since it is a crime even if the act itself did not cause harm to the protected interests: it is a “crime of danger” (“Gefährdungsdelikt”). Words written on a fairly unknown blog have – even abstractly – zero risk to start an investigation by Italian authorities. Consider that, the post you are currently reading is the first where the criminal relevance of brandjacking conducts is discussed, not because we have ever had some sort of interest in criminal prosecution. We are forced to discuss it because we are on turn accused of another crime – calumny. And the discussion is trivial: copyright infringement (the umbrella term for brandjacking etc.) shall be filed by the copyright holder as a complaint, otherwise there is no criminal relevance. And all the offences that are prosecuted on complaint cannot be the premise of a calumny, unless the complaint is filed and investigations are needed to check whether the offence itself is punishable only by complaint (some clue here, page 10, N.B.: Italian), which is totally not the case for copyright infringement.

 
Continua...

from Lo spazio intermedio

Mentre sto consultando le fonti dell'articolo sul multiverso appartenente alla serie Quelli che cavalcano il fulmine, mi rendo conto che sono passati 10 anni dalla prima “foto” di un atomo di idrogeno. E allora vale la pena estrarre quel pezzettino da un articolo scritto per il mio blog DropSea qualcosa come 5 anni fa.

La struttura dell'atomo

Gli esperimenti di Millikan del 1916 e di Compton del 1921 fornirono indizi sulla natura dell'elettrone e delle sue interazioni con la materia. Sono del 1924 i due lavori indipendenti di Albert Einstein e di Louis de Broglie che suggeriscono l'esistenza di onde di materia le cui frequenza e lunghezza d'onda sono definite dalle due relazioni:

$\nu = \frac{E}{c}$ $\lambda = \frac{h}{p}$

L'anno dopo ecco arrivare la famosa equazione di Erwin Schroedinger, che può essere intesa come una sorta di generalizzazione matematica dell'equazione di Planck-Einstein. E infine nel 1927 ecco l'esperimento di Davisson e Germer dove un cristallo di nichel viene fatto attraversare da un fascio di elettroni. Ci sono tutti gli ingredienti per suggerire una descrizione il più accurata possibile dell'atomo. Il primo a lanciarsi in tale impresa fu Niels Bohr con il suo famoso modello planetario dell'atomo di idrogeno; a seguire quello che potremmo chiamare l'atomo di de Broglie, dove l'elettrone si muove oscillando intorno al nucleo guidato da un'onda di materia; infine ecco arrivare l'atomo di Schrodinger, dove l'elettrone è visto come un'onda la cui struttura è simile a una sfera di densità. L'elettrone è così delocalizzato intorno al nucleo. Tale descrizione è stata verificata nel 2013 con la prima osservazione degli orbitali dell'atomo di idrogeno.

atomo di idrogeno eccitato

#meccanica-quantistica #atomo-di-idrogeno #fisica

 
Read more...

from manunkind

me (human) ≠ you (machine)

if NLP ≠ NLU

are you a you?

how is it me a me?

will we ever meet? (in the flow of active inferences?)

[but: will we be able to imagine alien intelligences?]

 
Lire la suite...