2016-11-06

Reactive programming, từ declarative programming đến RxJava, RxAndroid (phần 1)

Dạo sau này khi code mình xài Python, Scala nhiều hơn. Một cách tự nhiên sẽ đụng nhiều hơn về functional programming. Tất nhiên lúc trước khi code web và Node thì cũng đã không lạ gì với style này kiểu như chắc chắn phải xài lodash chẳng hạn. 1 thời gian sau đó là xem qua Swift và dạo gần đây là RxAndroid. Có vẻ functional programming đang được chú ý nhiều ngày càng nhiều hơn. Lại nhớ cái hồi F# mới ra, cũng download sách vào đọc 1 xíu xong rồi cũng quăn :D. Cũng nhiều lần tính nghiên cứu sâu hơn, định note lại những cái đã xem lâu rồi nhưng lười. Bây giờ thì "ít lười" hơn, và cũng nên note lại cho thấm.


RxAndroid

RxJava là một bản port từ Netflix của Reactive Extensions (Rx) dành cho Java. 
Ban đầu Reactive Extensions (Rx) chỉ là một bộ thư viện (a set of libraries) do một nhóm nghiên cứu tại Microsoft Open Technologies do Erik Meijer (kiến trúc sư/architect) và các thành viên (có thể kể đến Jeffery Van GoghWes DyerBart De Smet) phát triển.
Sau đó Rx được công bố mã nguồn (November, 2012) trở thành open-source project trên Codeplex (đã chuyển qua Github Reactive Extensions for .NET) với mục đích mở rộng việc sử dụng Rx để tăng khả năng tương tác cho các ứng dụng trên nhiều loại thiết bị và môi trường cloud. 
Trong một bài phỏng vấn (Rx in 15 minutes - Rx is here!!!!!), Erik Meijer (Architect) đã trình bày ý tưởng tạo ra Rx khi so sánh mô hình Pull (Interactive) với mô hình Push (Reactive) với data source IEnumerable (đặc biệt để tăng hiệu quả làm việc với LINQ). Rx được tạo ra bằng cách định nghĩa IObservables và IObservers tương ứng với IEnumerables và IEnumerators, unify các method và cách sử dụng (hay API).Theo đó định nghĩa ban đầu của Rx là Rx = Observables + LINQ + Schedulers.

RxJava được định nghĩa như sau:
RxJava is a Java VM implementation of ReactiveX (Reactive Extensions): a library for composing asynchronous and event-based programs by using observable sequences.

RxAndroid là mở rộng của RxJava sử dụng cho lập trình ứng dụng Android.
RxAndroid adds the minimum classes to RxJava that make writing reactive components in Android applications easy and hassle-free.

What is ReactiveX?

Theo giới thiệu của chính ReactiveX thì ReactiveX là
An API for asynchronous programming with observable streams.
hay
ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming.
ReactiveX dùng để lập trình bất đồng bộ với các dòng dữ liệu có thể "quan sát" (có nghĩa là push/emit, dạng push model). Hay ReactiveX là sự kết hợp các ý tưởng tốt nhất từ Observer patternIterator pattern và functional programming (lập trình hàm).

Có thể dùng ReactiveX với nhiều implementation cho các ngôn ngữ khác nhau: RxJava, RxJS, Rx.NET, RxScala, RxPy hay RxSwift...

Programming paradigms

Trước khi sử dụng reactive programming (RP) cần nói qua về programming paradigm. Tiếp theo cần phân biệt hai programming paradigm là imperative programming và  declarative programming.
Paradigm là gì? Paradigm là một thuật ngữ chỉ hình mẫu, lý thuyết, khái niệm, giả thuyết hoặc khung tham chiếu. Có một vài ý kiến cho rằng có thể dịch paradigm thành mô hình trong tiếng Việt, tức programming paradigm sẽ dịch là mô hình lập trình. Tuy nhiên "mô hình" không thể truyền tải hết những ý nghĩa của của paradigm. Có thể coi thuật ngữ paradigm tương ứng với ý nghĩa của từ mô thức(method + model + pattern .../模式 [MÔ THỨC], 範例 [PHẠM LỆ] hay 模范 [MÔ PHẠM]) tức là mô hình hình mẫu kết hợp với phương thức, cách thức. Cũng có thể cho rằng một programming paradigm là một trường phái lập trình (school/流派 [LƯU PHÁI]).

Không thể có sự so sánh chung cho các paradigm vì không có tiêu chuẩn để so sánh và căn bản các paradigm có các suy nghĩ, cách nhìn và phương pháp hoàn toàn khác nhau.

Ví dụ các programming paradigm hay được nhắc tới như sau:
§  Imperative programming (tạm dịch lập trình chỉ thị/mệnh lệnh)
§  Declarative programming (tạm dịch lập trình khai báo)
§  Object-oriented programming (OOP, lập trình hướng đối tượng)
§  Procedural programming (tạm dịch lập trình thủ tục)
§  Functional programming (tạm dịch lập trình hàm/lập trình hướng chức năng)
§  Logic programming

Functional programming và logic programming có thể được coi là "declarative".
Hầu hết các ngôn ngữ lập trình đều là các ngôn ngữ nhiều paradigm (multi-paradigm programming languages) có nghĩa support nhiều hơn một programming paradigm.

Imperative programming vs declarative programming

Imperative programming theo Wikipedia
Imperative programming is a programming paradigm that uses statements that change program's state.
Là paradigm sử dụng các phát biểu/lệnh/chỉ thị (statements/instructions) dùng để thay đổi trạng thái của chương trình.
Imperative programming focuses on describing how a program operates.
Imperative programming tập trung vào việc mô tả các chương trình thực hiện. Tức tập trung vào mô tả làm các nào thực hiện việc gì đó, chỉ thị cho computer/compiler thực hiện những gì mình muốn xảy ra từng bước (giống đặt bản thân vào vai của computer). Đây là các tiếp cận với programming rất tự nhiên từ những ngày đầu khi mà compiler còn rất đơn giản.

Structured programming là programming paradigm subset của imperative programming khi các chức năng (functionality) được chia thành những đơn vị (units). Cách thực hiện phân chia có thể thấy như phân chia thành blockscontrol flows, và subroutines hay cao hơn là những modulespackages. Ví dụ với control flow có thể thấy cách tiếp cận này đã không còn khuyến khích sử dụng go-to statements.

Theo định nghĩa như trên thì object oriented programming (OOP như C#, Java, Python) "tự nhiên" được coi là subset của structured programming khi các chức năng được tổ chức theo hướng chia thành những đối tượng. 
Phần còn lại không hướng đối tượng mà tổ chức  tổ chức các statements thành những procedures (hay functions) được gọi là procedural programming (như Pascal, Fortran, C) hiển nhiên cũng là một subset của structured programming.
Thật ra cũng có những ý kiến không đồng tình với kết luận trên khi cho rằng nếu đơn thuần structured programming sẽ có cách tiếp cập top-down trong khi đó OOP lại có cả cách tiếp cập bottom-up (khi bài toán đi lên từ các object). 
Tương tự có ý kiến không đồng ý quan hệ giữa OOP và procedural programming trong structured programming như đã nói ở trên khi cho rằnh OOP là subset của procedural programming khi mà việc thao tác với các objects cũng thông qua các methods đã được định sẵn. Tất nhiên là không có vấn đề gì. Tình huống này giống như việc mọi người hay so sánh giữa C++ và C nhưng phần lớn trường hợp C là subset của C++ (well written, và chính xác hơn là ANSI C, xem Is C a subset of C++?).
Ngược lại với imperative programming, declarative programming được định nghĩa như sau:
Declarative programming is a programming paradigm—a style of building the structure and elements of computer programs—that expresses the logic of a computation without describing its control flow.
Declarative programming mô tả vấn đề hay cách giải quyết mà không đi sâu vào việc mô tả tường minh trạng thái của công việc sẽ được tiến hành. Tức là mô tả cái mà mình mong muốn và phần còn lại cách thực hiện sẽ dành cho computer. 

Việc này có liên quan nhiều đến sự so sánh giữa statements và expressions.
Expression (biểu thức) thể hiện hay là cách mô tả giá trị, cần phải được evaluated (đánh giá) để trả về giá trị (tức nếu chỉ riêng một mình thì expression không thể làm gì cả). Một ví dụ hay gặp là biểu thức logic (logical expression/boolean expression). Do đó expression có thể pass như một đối số (argument) cho một function trong khi statement thông thường thì không (do không trả về giá trị). 
Vấn đề là với các ngôn ngữ như C/C++ chỉ cần thêm semicolon ; là có thể chuyển một expression thành một statement gọi là expression statements. Rõ ràng mọi developer đều nhận thấy là expression sẽ được evaluated và giá trị trả về coi như bị vứt đi (có vẻ như vô hại).
Điều đáng nói ở đây là trường hợp của gán giá trị assignment và toán tử gán assignment operator. Một khi cho phép expression chuyển thành một statement thì thông thường toán tử gán (assignment operator) cũng được cho phép xuất hiện trong expression (như C/C++), tức là cho phép việc chuyển một statement thành một expression. Với các ngôn ngữ cho phép điều này (C/C++) giá trị trả về của assignment statement sẽ là giá trị của expression sau khi evaluated và gán cho variable. Khi đó assignment statement không đơn thuần là một statement mà còn là một expression.
Việc duy trì quan hệ statements và expressions như trên được cho rằng sẽ có thể dẫn tới side-effects. Khi xem kỹ đoạn code sau, chuyện xảy ra nếu func có thể làm một điều gì đó không hay, có vẻ như không còn vô hại được nữa:

1 + 2 * func(3);

Side effects là gì? Nói chung là những hiệu ứng không mong muốn. Ví dụ khi thực hiện một statement có trả về một kết quả ẩn và kết quả trả về này có thể làm thay đổi giá trị được lưu trữ (hay nói chung là trạng thái) của các đối tượng khác. 
Giả sử một lỗi nếu mắc phải với assignment operator của C/C++ thì rất khó nhận ra (nhất là thời kỳ IDE còn cùi mía): phép gán trả về kết quả 10 và tự động casting sang kiểu boolean là true.

if(a = 10) {

}

Hay một ví dụ tương tự cũng của  assignment operator như sau

double x = 3.5;
int y;
double z = y = x;  // z = 3

Ngoài ra side-effect cũng thường xảy ra khi một function call thay đổi một giá trị bên ngoài (outside world, như global variable hay static variable hay thậm chí một method thay đổi một member variable không tường minh hoặc không theo đúng thiết kế).

Việc nhập nhằng giữa statements và expressions có thể thấy xảy ra ở tất cả các ngôn ngữ giống C (bao gồm C/C++, C# hay Java). Một số nhà thiết kế ngôn ngữ lập trình nghĩ theo hướng khác vì không thích điều này và mong muốn là tìm một giải pháp giảm thiểu side-effects. Theo đó một cách "tự nhiên" imperative programming thiên về statements thì declarative programming focus vào solution sẽ thiên về expressions. Ví dụ các functional programming sẽ tìm cách loại bỏ statements nhất là assignment statements bằng cách chỉ sử dụng expressions và một dạng gọi là khởi tạo giá trị (initialization) hay declaration style.
Để dễ hiểu hơn 1 chút, bạn cần xem qua ví dụ tính tổng một array. Với imperative programming, việc thực hiện dạng như sau:

var  numbers = [1, 2, 3, 4, 5]
var  sum = 0
for(var i = 0; i < numbers.length; i++) {
   sum = sum + numbers[i];
}

Với declarative programming code sẽ có dạng như sau

var numbers = [1, 2, 3, 4, 5]
var sum = numbers.reduce((x, y) => x + y)

Cụ thể với Scala 

val numbers = Array(1, 2, 3, 4, 5)
var sum = 0
       
for(i <- 0 to numbers.length - 1) {
   sum = sum + numbers(i)
}


val numbers = Array(1, 2, 3, 4, 5)
val sum = numbers.reduceLeft[Int](_ + _)

Hay x2 với một array cách tiếp cận imperative programming sẽ là khai báo một array mới, duyệt array cũ và push vào array mới từng giá trị của element nhân 2. Trong khi declarative programming sẽ code như sau:

val numbers = Array(1, 2, 3, 4, 5)
val doubled = numbers.map(x => 2 * x)

Ví dụ trên thể hiện hai "cái nhìn" rất khác nhau, với declarative programming thì việc quan tâm là focus vào logic như x => 2 *x. Tất nhiên nhiều người sẽ đặt câu hỏi, chuyện gì ở bên trong function map hay reduce kia. Rõ ràng có thể đặt lại vấn đề là việc thực hiện này có sự giúp sức của libraries hay hệ thống.

Thực ra có thể đưa ra ví dụ dễ dàng bắt gặp hơn (đồng nghĩa là ít thắc mắc/ý kiến hơn) khi sử dụng ngôn ngữ truy vấn như SQL:

SELECT * FROM Users WHERE country = 'USA';

Rõ ràng ít người thắc mắc câu query này hoạt động như thế nào hơn là việc xuất hiện cái method map hay reduce kia (gần như chấp nhận). Con người là như vậy, nhiều khi biết 1 chút ít sẽ là rào cản để đón nhận cái mới.
Một số ví dụ khác có thể thấy trong những năm qua như LINQ với C#

var odds = collection.Where(num => num % 2 != 0);

Thực ra các markup languages không xa lạ gì như HTML, XML, XAML là những ví dụ thiên về declarative khi được sử dụng để khai báo UI thay vì thực sự code để paint UI (được render bởi engine/libraries).
Declarative programming có lẽ gần với giấc mơ về lập trình hơn. Vì một ngày nào đó sẽ chỉ cần dùng ngôn ngữ tự nhiên coding bằng cách kêu computer tính "sum" mà không cần code một cái gì hết.
Việc sử dụng declarative programming được cho là giảm thiểu side effects (tác dụng phụ/hiệu ứng phụ/hiệu ứng bên lề). Điều này sẽ được nói rõ hơn với functional programming.

Reactive programming

Reactive programming (RP, tạm dịch lập trình phản ứng) không phải là khái niệm mới mẻ vì thực chất đã được giới thiệu từ những năm 70s. Tuy nhiên có những hạn chế về mặt implementation (compiler còn chưa phát triển) và quan trọng nhất là nhu cầu hay yêu cầu để nó có thể phát triển còn chưa lớn, chưa có một enterprise lớn dạng "cây đa cây đề" nào phát động. Sự phát triển của reactive programming không phải là ngẫu nhiên khi đi chung với sự phát triển của microservices (kiến trúc nhiều dịch vụ nhỏ), multi-core CPU, distributed processing hay parallel distributed processing tức việc xử lý data thường có tính chất concurrent, parallel (xem thêm concurrent vs parallel), asynchronous (bất đồng bộ), từ nhiều nguồn (hay là nhiều flow). Xem thêm Notes on Reactive Programming tại Spring.io hay Why Reactive Programming Is Not a Fad tại DZone.

Theo Wikipedia:
Reactive programming is a programming paradigm oriented around data flows and the propagation of change.

Reactive programming là programming paradigm hướng tới việc xử lý dòng dữ liệu và sự lan truyền thay đổi.
Đơn giản có thể coi reactive programming là cách lập trình với những toolbox nhằm nâng mức trừu tượng (the level of abstraction) của source code lên một mức cao hơn khi focus (tập trung) vào việc xử lý các  sự kiện và quan hệ giữa các sự kiện (the interdependence of events) mô tả business logic thay vì phải tốn nhiều thời gian cho việc tổ chức cài đặt (implementation) các chi tiết nhằm giải quyết các business logic này.

Phần sau sẽ trình bày tiếp functional programming, functional reactive programming trước khi đi qua RxJava.

2016-10-04

The requested security information is either unavailable or cannot be displayed.


Đôi khi vì copy lỗi hoặc move folder lỗi (hay copy từ Linux qua) xảy ra việc file hay folder sao ko thể xóa hay rename, move. Thông thường lỗi do mất, hoặc lý do gì đó không có security attributes. Khi đó chọn Properties > Tab Security sẽ hiện thông báo "The requested security information is either unavailable or cannot be displayed."

Mới đầu khi gặp lỗi này thường rất là "điên", có thể sửa bằng dùng DOS name 8.3.

Dùng dir /x để lấy 8.3 name, xong rename folder hay file này dùng 8.3 name.



Sau khi rename thì folder sẽ trở lại bình thường :D

Xem thêm http://techguy615.blogspot.com/2011/10/requested-security-information-is.html
http://superuser.com/questions/481006/the-requested-security-information-is-either-unavailable-or-cannot-be-displayed

2016-08-07

Unix, Linux, TRON và nhiều thứ...

Giờ có chút "liên quan" copy lại note từ hồi Yahoo! 360. Là một số thứ mình note từ 2005-2006, khi có blog :D. Nói chung từ nhiều nguồn, 1 số thông tin theo kiểu "truyền thuyết" cũng có.

Chừng 15 năm từ ngày đụng vào Linux, cá nhân mình thì không bao giờ cho rằng Linux phù hợp với PC (chạy được nhưng ko bao giờ thấy ổn). Cứ xài Microsoft Offce vs OpenOffice hay LibreOffice rồi cảm nhận. Sự khác biệt cũng từa tựa như vậy.

----------------------------
Unix
----------------------------
Unix là một OS đa nhiệm, đa người dùng được phát triển vào năm 1969 bởi AT&T tại phòng thí nghiệm Bell Labs. Hầu hết đều được phát triển để chạy tối ưu trên một hoặc một nhóm kiến trúc phần cứng nhất định. Unix cũng thiết kế để phù hợp với yêu cầu và hoạt động cụ thể của doanh nghiệp.
Hơn nữa Unix cung cấp kernel dưới dạng nhị phân và thường phân phối dạng monolithic (monolithic = nguyên khối). Tức ít có chuyện module mo điếc gì cả, ít có chuyện customize, chọn softwares ... (:D mua thì mua ko mua thì biến, no chê đắt)

----------------------------
Open Group và SUS
----------------------------
Các version của Unix đóng nhưng nhiều hệ thống vẫn được gọi chung là Unix. Thương hiệu Unix là mở?

Unix là tên được đăng ký thương hiệu và sở hữu bởi Open Group. Open Group đưa ra một bộ tiêu chuẩn cho OS là Single UNIX Specification (SUS). OS nào đạt được các tiêu chuẩn này,
đăng ký thì sẽ được gọi là Unix. Một số OS có thể kể IBM AIX, HP UX, SCO Unixware, SCO OpenServer, Sun Solaris, Mac OS X (on Intel processors).

Một vài OS ko thỏa mãn SUS nhưng giống Unix thường được gọi là Unix-like như BSD, FreeBSD.
Mac OS X được phát triển từ BSD tới NextStep vốn ko thỏa mãn SUS, nhưng sau khi điều chỉnh lại thỏa mãn SUS được gọi là Unix-based (mang thương hiệu Unix, tên mỹ miều Unix-based graphical interface operating systems (OS) developed and marketed by Apple Inc.).

Xem ví dụ trên website của Open Group
http://www.opengroup.org/openbrand/register/

The Open Brand - Register of Certified Products
UNIX 03
Company Name: Apple Inc.
Product Name: Mac OS X Version 10.5 Leopard
Environment: on Intel-based Macintosh computers
Registered on: 18-May-2007

Unix là một OS đóng (tính chất đóng) vậy "ban đầu" lấy đâu ra Unix-like. Thực sự ban đầu Unix cung cấp cho các trường ĐH và các doanh nghiệp có nhu cầu với đầy đủ thiết kế và công cụ. Thậm chí các tổ chức này còn được cung cấp các ví dụ và cả source code. Vì vậy các trường ĐH và các công ty có cơ sở để có thể viết lại nguyên HĐH.

Kể từ năm 80s, một số nhóm/công ty đã phát triển những OS có triết lý thiết kế gần giống với Unix (Unix philosophy) cũng gọi là Unix-like chứ ko phải từ source code hay thiết kế.

Hỏi ngu: đem Linux distro nào đó điều chỉnh xong đăng ký thành Unix-based được ko? Trả lời ko? Đã ko thích nhau thì chơi với nhau làm gì. Mà có thích cũng ko có tiền. Source code đổi như chong chóng, cứ ra release mới đem đăng ký thì tiền đâu? free chắc có tiền trên trời rơi xuống?

----------------------------
GNU/Linux
----------------------------
Linux bản thân là một kernel, core của OS (không phải là một OS: không có shell; không có bootloader GRUB, LILO, syslinux; không có môi trường desktop GNOME, KDE hay cũng ko có
init system-hệ thống khởi tạo như init, upstart, systemd).

GNU ban đầu là tham vọng của FSF (Tổ chức Phần mềm Tự do) nhằm xây dựng một tập hợp các free softwares bao gồm cả kernel, nói chung gói gọn là một OS giống Unix nhưng tự do (tự do: về tiền và free nhiều thứ, tự do vs miễn phí). Xem thêm khái niệm tương thích interface với Unix - POSIX Portable Operating System Interface for Unix.
Phân biệt free softwares vs open source softwares

Thực tế GNU ra đời từ lâu (1983) đã phát triển một bộ gần hết các công cụ và phần mềm "tự do" để sử dụng với Unix bao gồm 1 đống softwares, utilities nhưng mãi vẫn chưa có OS (chính xác là kernel OS). Đến năm 1991, GNU project đã hoàn thành 1 số phần công việc để build GNU operating system như GCC (GNU C compiler), GNU shell utilities (rất nhiều shell utilities), bash command-line shell, text editor. Về graphical desktop có thể "xài ké" các nguồn mở có sẵn như X Window System bỏ vào. Tuy nhiên core của OS là GNU Hurd kernel đã tiến hành phát triển nhưng chưa xong
(tham vọng làm microdesign kernel và bị delay, sau hơn 25 năm GNU Hurd kernel chưa release, nói cho đúng là ko có một stable version nào được release). Kernel là một mảnh còn thiếu của GNU.

Khi Linux join GNU Project thì GNU coi như là đã đầy đủ (năm 1991). Khi đó một phân phối sẽ gom nhân Linux, các softwares và utilities GNU, thêm giao diện X Window System ... sẽ tạo thành một hệ điều hành hoàn chỉnh.

Tất nhiên phải nói cho rõ khi Linux phát triển thì được nhiều cá nhân/nhóm/công ty gọi chung là cộng đồng đóng góp. Trong đó FSF vẫn đóng góp nhiều nhất (kể cả về cộng đồng, công cụ, định hướng, triết lý ...)

----------------------------
GNU/Linux hay Linux hay cái gì nữa ...
----------------------------

Nếu gọi là GNU/Linux thì gây ra tranh luận quá tập trung vào GNU. Nếu vậy có thể phải ghi là
Mozilla/KDE/Apache/X.org/GNU/Linux vì một distributions ít nhất cũng bao gồm các bác organizations bự bự như thế.

Richard Stallman- ý kiến của boss GNU (founded Free Software Foundation)

Hàng triệu người dùng sử dụng OS đã được phát triển nhằm đem tới sự tự do (ý nói đã được GNU định hướng phát triển)- nhưng mà éo biết điều đó, bởi họ nghĩ rằng hệ thống là Linux (system is Linux) và nó được phát triển bởi một sinh viên (Linus Torvalds, sinh viên University of Helsinki) chỉ để cho vui 'just for fun'.

Xem Linus Torvalds nói vụ này
https://groups.google.com/forum/?fromgroups=#!msg/comp.os.linux.misc/Cm15HxjDGRs/su3OHyLUgXcJ
Linus Torvalds trả lời năm 1996
Thảo luận vấn đề này là đã đủ lâu (:D lâu và chắc nhiều). Nó ko phải là vấn đề thực sự, tức người ta gọi là Linux thì kệ nó đi vì credit vẫn ghi rõ ràng (cho cả 2). Nhưng mà cá nhân thì tao thích gọi nó là Linux.

----------------------------
Còn gì khác? Popular OS? 
----------------------------
TRON (The Real-time Operating system Nucleus) là open real-time operating system kernel design.
Nhiều cơ sở để cho rằng trong 1 thời gian rất lâu không phải Microsoft, cũng ko phải các Linux distro hay Unix là OS phổ biến nhất. Khoảng những năm 2003, Industrial TRON (ITRON) mới là OS phổ biến nhất thế giới (nếu coi là OS), chạy trên hàng tỷ các thiết bị điện tử.

TRON ra đời năm 1984, từ những thiết kế của Prof. Dr. Ken Sakamura, University of Tokyo.
TRON với nhiều ưu thế vượt trội từng vì nhiều lý do bao gồm cả "chính trị" đã ko được phát triển cho PC (bị dìm cho chết). Do may mắn (hay do đưa đẩy) TRON phần nhiều phổ biến trên các thiết bị điện tử như đồ gia dụng.
http://www.linuxinsider.com/story/31855.html

Năm 1989, hãng điện tử "khổng lồ" Nhật Bản Matsushita Electric Industrial Co. (1918-2008, tên sau này là Panasonic) giới thiệu BTRON PC, một PC gây "choáng váng" ngành công nghiệp với khả năng tiên tiến của nó (ngon hơn MS-DOS -> Windows 3.1x). Các BTRON PC dùng chip 80286 Intel 8 MHz và có 2 MB bộ nhớ, nhưng có thể hiển thị video màu chuyển động trong một cửa sổ riêng biệt (giao diện đồ họa- GUI).

Ngoài ra, hệ thống dual-boot cho phép chạy cả hai hệ điều hành BTRON và MS-DOS.
BTRON đã từng có "cơ hội" để chiếm một phần thị phần OS dành cho desktop trên thị trường.

Khi chính phủ Nhật Bản (ủng hộ của MITI- Ministry of International Trade and Industry và MOE) tuyên bố sẽ cài đặt BTRON PC trong các trường học của Nhật Bản, chính phủ Mỹ (đầu tiên là USTR) đã phản đối và coi "sáng kiến ​"​của Nhật Bản là "thực tế và có tiềm năng can thiệp thị trường"
đồng thời đe dọa trừng phạt nếu kế hoạch này được thực hiện.

Do phụ thuộc thị trường xuất khẩu Mỹ, Nhật Bản đã "nhanh chóng" bỏ kế hoạch này. Kéo theo đó là những thiệt hại cho TRON. Gần như tất cả các công ty Nhật Bản tham gia vào các hoạt động liên quan đến TRON đã "tự động" hủy bỏ các dự án.

Từ trước đó, Microsoft bị nghi là đã tác động để U.S. government "chơi" TRON
(nhiều tác giả kêu chính là nó chứ khỏi nghi- với nhiều bằng chứng lịch sử). Microsoft được cho là sợ TRON khi đó sẽ "phá" thống trị của NEC Corp. (đang chạy MS-DOS) tại thị trường PC ở Nhật.

Chưa kể có cả nghi ngờ "bóng dáng" U.S Army liên quan trong vụ tai nạn JAL123 ngày 12/8/1985 chết 520 người (thuộc loại nhiều bí ẩn và lớn nhất thế giới). Vụ JAL123 bị nghi ngờ ko phải tai nạn thông thường mà là kết quả "cuộc chiến" với nhiều thành phần (SDF, U.S Army, NSA, cả Nga...)
Mỹ là nghi can "ám sát" 4 doanh nghiệp lớn nhất vùng Kansai (đại diện cộng đồng doanh nghiệp Kansai). Các cty này phản đối Plaza Accord và nghe nói còn ủng hộ phát triển công nghệ hạt nhân nội địa (nghe đâu mang trên máy bay kỹ thuật, thiết bị hạt nhân và đầu đạn hạt nhân...). Trong vụ này 17 technicians TRON OS quan trọng của Matsushita (Panasonic) cũng "ra đi".

Thỏa ước Plaza Accord (hay hiệp định) giữa Mỹ, Nhật Bản, Đức (Tây Đức), Anh và Pháp (G5) ký tại Plaza, New York 22/09/1985 mục đích chính giảm giá USD so với Yên Nhật và Mark Đức.
(cơ bản hạn chế thâm hụt thương mại với Nhật, hàng Mỹ ko thành công tại thị trường Nhật).

May mắn Industrial TRON (ITRON) nhờ ít liên can (focus vào hệ thống công nghiệp và embedded systems trong khi BTRON là business và education) nên sống sót tốt hơn. ITRON vẫn chạy trên nhiều các tiện ích của Nhật Bản, thiết bị gia dụng, thiết bị điện tử ô tô, robot, trên cả các vệ tinh.
http://www.ertl.jp/ITRON/home-e.html

Bất ngờ, năm 2003, Microsoft tham gia T-Engine Forum (xem danh sách thành viên trên http://www.t-engine.org, website giờ là http://www.tron.org)

So sánh với RTLinux (hard realtime RTOS microkernel)
Có nhiều tranh luận cho rằng ITRON có hiệu suất về thời gian vượt trội và do thiết kế TRON là một RTOS thực sự còn RTLinux thì ko real-time. Ngoài ra RTLinux footprint tính bằng MB, ITRON chỉ tính bằng KB.

----------------------------
The GNU C Library (glibc)
----------------------------

https://www.gnu.org/software/libc/download.html
libc6 và glibc là cùng một version của libc là version 2 của GNU C library nhưng là version 6 của Linux C library. GNU C Library gọi thông dụng là glibc là một dự án của GNU implement thư viện C chuẩn C standard library. C standard library là thư viện chuẩn của ngôn ngữ C, còn gọi là thư viện ANSI C (ANSI C standard).

Khi được chuẩn hóa (ví dụ C99 theo ISO/IEC 9899:1999) có thể gọi là thư viện chuẩn ISO: ISO C library. Có nhiều cài đặt như BSD libc, GNU C Library glibc, Microsoft run-time library msvcrt ...

Mặc dù gọi là C library nhưng hiện tại support cả C++ (và các ngôn ngữ khác).

Fork "Linux libc"
Những năm 1990s, Linux kernel (developers phát triển Linux kernel) forked glibc và gọi là "Linux libc" và maintained riêng từ version 2 đến version 5.

Đến khi FSF released glibc 2.0 vào 1997 chuẩn hơn, POSIX ok hơn, Linux kernel developers bỏ fork và quay lại glibc. Theo Richard Stallman thì code của Linux libc không thể merged vào glibc vì 1 số lý do quan trọng nhất là vấn đề không rõ ràng về authorship (quyền tác giả).

Khi glibc mà bị gì thì ảnh hưởng nguyên 1 đám "đi theo" từ Linux, smartphones đến IoT.
Xem thêm http://www.infosecurity-magazine.com/news/glibc-flaw-affects-linux-machines/

----------------------------
Firmware, Linux firmware
----------------------------
Nhiều devices (hardware) gồm 2 phần "software" chính để hoạt động trên OS.

+ Driver để system nói chuyện với hardware
+ Firmware thường uploaded trực tiếp vào device (một dạng lập trình cho hardware mà nằm trên device hay có thể gọi là embedded software). Ban đầu firmware có thể nằm để sẵn trên device's ROM sau này là Flash memory. Trên Linux thì thông thường firmware có thể được nạp bởi driver vào device khi initialization.

Ranh giới 2 thằng firmware và software không cụ thể lắm, firmware thường thao tác với các operation low-level.

----------------------------
Debian GNU/Linux
----------------------------

Debian là một trong những Linux distributions ra đời sớm nhất. Bản stable (ổn định) phát hành chính thức có tên là Debian GNU/Linux xây trên nhân Linux + 1 số công cụ hệ thống khác.
Hiện tại Debian xài 1 số nhân khác như FreeBSD, kFreeBSD ví dụ Debian GNU/kFreeBSD.
Hầu hết Debian phân phối tuân theo GNU General Public License.

Nhiều OS xây trên Debian như Ubuntu, Knoppix, Linux Mint. Debian nổi tiếng với trình quản lý package Advanced Packaging Tool-APT và hệ thống các chính sách kiểm tra nghiêm ngặt chất lượng các package, quá trình phát triển, phiên bản...

2016-06-09

Happy birthday to you/祝你生日快乐 (Chinese)

歌曲名: 祝你生日快乐


zhù

shēng rì
生日
kuài lè
快乐!

Happy birthday to you,
zhù

shēng rì
生日
kuài lè
快乐!

happy birthday to you.
zhù

xìng fú,
幸福,
zhù

jiàn kāng
健康

Wish you happiness, wish you health.
zhù

qián tú
前途
guāng míng
光明。

Wish your future is bright.

zhù

shēng rì
生日
kuài lè
快乐!

Happy birthday to you,
zhù

shēng rì
生日
kuài lè
快乐!

happy birthday to you.
zhù

xìng fú,
幸福,
zhù

jiàn kāng
健康

Wish you happiness, wish you health.
yǒu

wēn nuǎn
温暖
jiā tíng
家庭。

and have a cozy family.



2016-06-06

Mười năm (十年/Ten years) – Trần Dịch Tấn (陳奕迅/Eason Chan)

Mười năm (十年/Ten years) – Trần Dịch Tấn (陳奕迅/Eason Chan)
Album: 《黑白灰》
Ngày phát hành: 2003年04月




Rúguǒ 
如果
nà 
liǎng 
gè 
zì 
méiyǒu 
没有
chàndǒu 
颤抖

nếu nói hai chữ ấy không hề run sợ,
Wǒ 
bù 
huì 
fāxiàn 
发现
wǒ 
nánshòu 
难受

anh đã không thể nhận ra nỗi đau của mình
Zěnme 
怎么
shuō 
chūkǒu 
出口
yě 
bùguò 
不过
shì 
fēnshǒu 
分手

làm sao để nói ra, chỉ là "chia tay" thôi mà
Rúguǒ 
如果
duìyú 
对于
míngtiān 
明天
méiyǒu 
没有
yāoqiú 
要求

nếu không còn hy vọng nào cho ngày mai
Qiān 
qiānshǒu 
牵手
jiù 
xiàng 
lǚyóu 
旅游

thì như nắm tay cùng du ngoạn
Chéng 
qiān 
shàng 
wàn 
gè 
ménkǒu 
门口
zǒng 
yǒuyī 
有一
gèrén 
个人
yào 
xiān 
zǒu 

qua muôn vàn cách cửa, cũng đều có người đi trước.

x2
Huáibào 
怀抱
jìrán 
既然
bùnéng 
不能
dòuliú 
逗留

hoài bão không thể giữ lại
Hébù 
何不
zài 
líkāi 
离开
de 
shíhòu 
时候

tại sao khi chia ly 
Yībiān 
一边
xiǎngshòu 
享受
yībiān 
一边
lèi liú 
泪流

không cứ vừa tận hưởng, vừa rơi lệ 

Shí 
nián 
zhīqián 
之前

mười năm trước 
Wǒ 
bù 
rènshi 
认识
nǐ, 
你,
nǐ 
bù 
shǔyú 
属于
wǒ 

anh không quen em, em cũng không thuộc về anh 
Wǒmen 
我们
háishì 
还是
yīyàng 
一样
péi 
zài 
yīgè 
一个
mòshēng 
陌生
rén 
zuǒyòu 
左右

chúng ta giống nhau, đứng cạnh một người xa lạ 
Zǒuguò 
走过
jiànjiàn 
渐渐
shúxī 
熟悉
de 
jiētóu 
街头

lướt qua nhau trên những con phố quen thuộc 

Shí 
nián 
zhīhòu 
之后

mười năm sau 
Wǒmen 
我们
shì 
péngyǒu 
朋友
hái 
kěyǐ 
可以
wènhòu 
问候

chúng ta là bạn bè, cũng có thể hỏi thăm nhau 
Zhǐshì 
只是
nà 
zhǒng 
wēnróu 
温柔
zài 
yě 
zhǎo 
bù 
dào 
yǒngbào 
拥抱
de 
lǐyóu 
理由

nhưng sự dịu dàng ấy, không phải lý do để có thể ôm em 
Qíngrén 
情人
zuìhòu 
最后
nánmiǎn 
难免
lún 
wèi 
péngyǒu 
朋友

tình nhân cuối cùng miễn cưỡng trở thành bạn.

Zhídào 
直到
hé 
nǐ 
zuòle 
做了
duōnián 
多年
péngyǒu 
朋友

nhiều năm làm bạn cùng em 
Cái 
míngbái 
明白
wǒ 
de 
yǎnlèi 
眼泪

anh mới hiểu rõ nước mắt của anh 
Bùshì 
不是
wèi 
nǐ 
ér 
liú 
yě 
wèi 
biérén 
别人
ér 
liú. 
流.

không khóc vì em, thì cũng sẽ khóc vì một người con gái khác.