Pages

Friday, December 3, 2021

Khế ước ngẫu nhiên

 Để tạo một số ngẫu nhiên từ 0 tới x, ta phải nhân số cực trên, chính là x, với Math.random().

Giả sử x là hai từ/tiếng đầu tiên trong Kiều, như người ta nói, đời người, số random kia ắt sẽ mỗi người một phận, đã được destined đặt trong khế ước nào đấy, nếu có, với thượng đế.

Nếu có ai đó, như mệ, mà cuộc đời ưu ái thương tặng con số random ấy lớn hơn số cực đại kia, thì cũng là ơn riêng.

Xin vĩnh biệt mệ, người vẫn hay cho chúng tôi những con cá khô mỗi lần giáp hạt.

Trên đời lại vắng một người thỉnh thoảng hỏi tôi, hế lô, chúng mày kiếm ăn ra sao. À, ý là cần cá khô thì mần răng tao không biết, cứ mò về với ngôi nhà có rặng phi lao nhé.

Ai cũng ngơ ngác. Con mèo chắc cũng thế, khi căn nhà bắt đầu vắng tiếng ai đó…

Biển đang cuộn sóng. Nước quanh làng lềnh phềnh. Góc nhà, một bịch cá khô lủ khủ vẫn lủng lẳng bất cần. À, cho những đứa nào cần nhé. Của mệ đấy.


Thursday, May 20, 2021

Covid vào thành

 Nổi tiếng nhất huyện tôi là Chí Phèo. Nổi tiếng nhất làng tôi là Tạ Biên Cương.

Giờ làng nổi lềnh phềnh trên mặt báo vì Covid 19. Ngày thứ hai bị phong tỏa với gần chục ca. Sáng nay, sau khi một cháu lớp đệ nhất dương tính, cả lớp cháu mấy chục bé rồng rắn tí xíu "lên đường" cách li 21 ngày. Bố mẹ nước mắt trông theo. Biết làm sao.

Tôi cũng không biết phải làm sao. Chỉ mong tất cả mọi người bình tĩnh và bình an. Sinh ra và lớn lên ở làng, bạn sẽ như có họ với tất cả mọi người vậy.

Mẹ tôi chắc lại nói, đấy, ma quỷ con ạ. Có thể covid là một trò đùa của Thanos với mã vạch 69X. Mà kệ nó đi mẹ ạ. Mẹ cứ ở trong nhà với đàn gà là được. Thóc còn rất nhiều đúng không ?

Tuesday, May 11, 2021

Covid vây thành

 Làng tôi cách tâm dịch covid lần này có một cánh đồng. Không thể không hoảng hốt khi nghe em tôi nói, covid nó đang đánh võng quanh làng rồi anh ạ. 

Không biết những vạt hoa trồng vội trên cánh đồng có trổ bông mùa này? Tiếng chuông nhà thờ vẫn sẽ bình an như thế? Tôi thật không dám tưởng tượng khi nhớ lại cảnh người ta "thui" các xác chết một cách vội vàng và xuề xòa ở đẩu đâu Ấn Độ.

Trong cơn mưa tầm tã tôi tiễn cha, lần cuối, lên cánh đồng làng gần 10 năm trước, có những khoảng khắc tôi đã cảm thấy mình bất lực đến tuyệt vọng. Từng bước chân một tiễn ông, từng ngôi nhà xe đi qua, những cơn thốc giật của giông gió... Từng giây phút một, tôi có cảm giác mình và mọi người như đang lang thang trong một cái địa ngục trần ai vậy, lửa phần phật thổi, chẳng có ai đuổi phía sau, nhưng phía trước vô định và tuyệt vọng.

Bất chợt cái cảm giác ấy trở lại trong một chiều hay tin covid đã đánh thành tới nơi rồi.

Chỉ mong là, có lẽ, tôi đã nghĩ quá nhiều.

Friday, March 5, 2021

phận thợ dạy

- “Dạ cụ, bạn cụ, cậu thợ dạy lại gọi điện thoại ạ!”

- “Lại hẹn nợ tạm bợ? ”, cụ Nghị bụng phệ, giọng lụ khụ vặn vẹo. 

Thợ dạy lạch bạch chạy lại đoạn cụ Nghị ngụ.

- “Dạ cụ, bệnh dịch đại nạn, định bụng mượn cụ chục bịch gạo, hẹn nợ một chặp ạ...", thợ dạy ngượng nghịu.

- "Thợ điện mượn tạ gạo, thợ dạy mượn chục bị. Bệnh dịch, thợ được dạy, tạm vậy. Chạy vạy đặng vượt đại dịch. Mẹ bọn khựa, loại dựng chuyện bệnh tật. Chuyện gạo thợ dạy nợ... “ cụ Nghị giận. Đoạn “thợ dạy mượn gạo”, giọng cụ dịu lại.

- “Dạ cụ, thật ngại. Phận thợ dạy đạo mạo, gặp dịch bụng sạch gạo, tội thật. Cụ thiệt lợi hại. Thợ dạy nợ cụ”, thợ dạy biện bạch.

- “Được”, cụ Nghị gật gật.

- “Dạ, dạ cụ...”, thợ dạy cậy miệng.

- “Thợ dạy, cậu bạn nhậu cụ, dạy cậu đại cụ, lại ngại ngại vậy?”,

 - “Dạ cụ, thiệt ngại. Thợ dạy định ...định... mượn cụ một triệu ạ”, thợ dạy sượng miệng.

- “Một triệu?”, cụ Nghị định bụng thụi thợ dạy một bịch.

-“Dạ, hẹn cụ nợ một triệu, cộng chục bịch gạo mượn cụ đợt nọ ạ”.

-“Liệu thợ dạy định bụng xạo cụ? Cụ cực giận bọn xạo xạo”. 

Phận thợ dạy, mọi việc trọng đại tạm gạt, lục đục sự nghiệp học, dạy học. Cụ Nghị lặng lặng. Lộn ruột, thợ dạy bợ đại cục gạch, định bụng... đập bậy.

-"Được, thợ dạy ạ, cậu bạn cụ, một triệu vậy”, cụ Nghị sợ chuyện bậy. Thực bụng, đợt bệnh dịch, cụ định bụng... kệ cụ bọn thợ dạy. Trộ mặt thợ dạy giận giận, cụ sợ.

- "Dạ, cụ rộng lượng ạ. Cụ nhận một lậy ạ”, thợ dạy loạng quạng. 

Đoạn, thợ dạy chạy một mạch lại chợ. Một triệu rượu thịt. Một lậy một triệu. 

Chuyện thợ dạy dại dột phận thợ nhậu, một chuyện lạ... một chuyện bịa bậy bạ...

Monday, February 22, 2021

Saturday, February 13, 2021

phụ nữ Huế

 Tôi phải lấy làm ngưỡng mộ những o những mệ người Huế.

Phụ nữ Việt, sinh sống thôn quê, phần đông vai u thịt bắp, gánh gồng gia đình. Nuôi heo đặng nuôi con. Phần lớn khó nghèo và đáng ngưỡng mộ.

Nhưng ở Huế, cái đói khổ có phần khốc liệt hơn. Những người đàn bà suốt đời, phần lớn, bị trói buộc vào rất rất nhiều những quy định không thành luật của tập tục lề thói, khiến cho họ đánh mất đi sự tự do và bản năng sáng tạo. Những cuộc đời lặp lại trong vô thức. Nhẫn nhục, tuân phục và không dám phẫn nộ hoặc phản kháng.

Trái ngược với sự chặt chẽ đến khô khan của tục lệ mà người phụ nữ tuân phục, đa số nam nhân được ưu ái và do đó thường phóng túng, phóng khoáng hơn hẳn, tuy rằng kha khá người, vì thế, kỉ luật yếu. 

Nhiều nhà thơ mà không phải văn, có thể từ đây xuất hiện. 

Những người phụ nữ tội nghiệp và yếu đuối nhẫn nhịn đến trọn đời. 

Việc cuối cùng họ thường làm là trao lại của cải và cả thái độ sống ấy cho con cháu. Như một di sản.

Chúng ta không có bước nhảy nào cả. Sự phóng túng nam nhân và sự nhẫn nhịn khắc kỉ nữ giới, ở đây, vẫn như hai đoàn tàu ngược chiều.

Friday, March 30, 2018

PHP và UTF-8

Hiện PHP chưa (thật sự) hỗ trợ Unicode ở tầng thấp, do đó, để hiển thị được chuỗi UTF-8, bắt buộc phải có thêm các thao tác xử lý bổ sung, trên web, HTML, SQL.

Bài này mình tóm lược lại về UTF8 và PHP.

UTF-8 ở chính ngôn ngữ PHP

Giả sử ta có character a, á, ư. Thử nghiệm với hai cặp hàm strlen()/mb_strlen() và strpos()/mb_strpos().

Kết quả với hàm tính lượng bytes có kết quả tương ứng như sau:

echo strlen('a'); //1
echo mb_strlen('a'); //1
echo strlen('á'); //2
echo mb_strlen('á'); //1

Ở đây có thể tạm kết luận, với các string multi-bytes (chẳng hạn theo chuẩn Unicode như tiếng Việt),  số lượng bytes sẽ khác nhau giữa hàm strlen() và mb_strlen().
 
Kết quả với hàm tìm character có trong string:

echo strpos("mana", "a"); //1
echo strpos("mán", "á"); //1
echo mb_strpos("mana", "a"); //1

echo strpos("mưán", "á"); //3
echo mb_strpos("mưán", "á"); //2


echo strpos("mán ư", "ư"); //5
echo mb_strpos("mán ư", "ư"); //4

Hàm tìm character cũng vậy, có sự khác biệt rất lớn giữa hàm strpos() và mb_strpos().

Như vậy ta buộc phải dùng các hàm có dạng mb_* khi xử lý string Unicode, đây là các hàm chuyên trị cho Unicode. Tuy nhiên, không phải hàm xử lý chuỗi nào cũng có hàm mb_ tương ứng.

Bạn có thể thiết lập mb_internal_encoding() ở đầu mỗi file PHP và hàm mb_http_output() ngay ở vị trí PHP xuất ra dữ liệu ngoài trình duyệt.

Ngoài ra, nhiều hàm PHP xử lý string có thể có thêm tham số xác định dạng mã hóa. Chẳng hạn như  htmlentities().

UTF-8 ở trên hệ điều hành

Hiện nay PHP có thể chạy ở hầu hết các hệ điều hành, gồm cả Linux và Windows. Nhưng cách PHP xử lý tên file ở mỗi hệ điều hành là có thể khác nhau, trong đó, hỗ trợ Linux tốt nhất. Chẳng hạn trên Windows, nếu dùng PHP tạo một file với mã non-ASCII, lỗi có thể xuất hiện. Trên Linux và OSX, bạn có thể mã hóa tên file dạng UTF-8, nhưng trên Windows, buộc phải dùng chuẩn ISO-8859-1.

UTF-8 khi mần ăn với MySQ 

Lưu ý 1: Để chắc chắn là chuỗi trên PHP sang MYSQL lưu ở định dạng UTF-8, hãy thiết lập character và collation là utf8bm4 (theo kinh nghiệm của mình có khả năng hiển thị các kí tự "lạ" nhiều hơn UTF8 thông thường, chẳng hạn có lần mình làm về phiên âm tiếng Anh thì chỉ khi thiết lập utf8bm4, hệ thống mới hiển thị được).

Lưu ý 2: Phải thiết lập trong kết nối với mysql khi viết bằng PHP. Giờ thì chắc là toàn dân xài PDO nên mình có thể thiết lập như sau:


$db
= new PDO('dblib:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);


Với PHP 5.3.6, tùy chọn charset chưa có nên có thể thực hiện theo tùy chọn sau:


$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

Với mysqli, ta buộc phải thiết lập như sau:

$conn = mysqli_connect('localhost','db_username','password','your_database_name');
 mysqli_set_charset($conn,"utf8"); 

UTF-8 trên trình duyệt

Để chắc chắn là PHP sẽ xuất UTF-8, có thể dùng hàm mb_http_output(). Trên trình duyệt thì ta thường thiết lập  tùy chọn meta charset như sau, đặt trong thẻ <head>
  <meta charset="utf-8">

https://phpbestpractices.org/#utf-8

https://stackoverflow.com/questions/4475548/pdo-mysql-and-broken-utf-8-encoding

Thursday, March 29, 2018

[PHP basic] Chuyển string sang array với split(), str_split(), explode() và pre_split()

Vốn dĩ một chuỗi string trong PHP có thể coi là một array, nhưng chuỗi này chuyển sang array lại dựa vào số byte, và một cách nào đấy có thể tạm nói rằng, khi chuyển qua array thì dựa vào character.

Ví dụ "hello world" thì khi loop với for ta được h-e-l-l-o-[space]-w-o-r-l-d.

Giờ ta muốn tách chuỗi theo các nhu cầu khác thì sao? PHP có sẵn 4 hàm split(), str_split(), explode() và pre_split() để chuyển sang array.

1) split() chú ý là hàm này đã bị loại bỏ trên PHP7, vẫn dùng được trên PHP5 nhưng sẽ có warning lỗi. PHP4 thì okey.

2) str_split() sinh ra để thay thế split() với tính năng tương tự, hoạt động okey trên PHP7.

str_split(string,length) . Như vậy delimiter nằm phía phải, đơn vị là số.

Diễn giải: hàm str_split() sẽ tách chuỗi thành array và việc tách chuỗi này tính theo số lượng character được quy định trong delimiter. Mặc định nếu không truyền vào là 1.

Giả sử:

$str = "This is a text which will be used to do something.";

print_r(str_split($str, 1)); // Array ( [0] => T [1] => h [2] => i [3] => s [4] => [5] => i [6] => s [7] => [8] => a [9] => [10] => t [11] => e [12] => x [13] => t [14] => [15] => w [16] => h [17] => i [18] => c [19] => h [20] => [21] => w [22] => i [23] => l [24] => l [25] => [26] => b [27] => e [28] => [29] => u [30] => s [31] => e [32] => d [33] => [34] => t [35] => o [36] => [37] => d [38] => o [39] => [40] => s [41] => o [42] => m [43] => e [44] => t [45] => h [46] => i [47] => n [48] => g [49] => .

print_r(str_split($str, 5));//Array ( [0] => This [1] => is a [2] => text [3] => which [4] => will [5] => be u [6] => sed t [7] => o do [8] => somet [9] => hing. )

 3) explode() cắt string theo string.

cú pháp: explode ( string $delimiter , string $string [, int $limit ] ).

Như vậy delimiter nằm phía trái. Việc chuyển chuỗi sang array tính theo chính character, không phải theo số lượng character như làm str_split(). Mặc định tham số thứ 2 của hàm str_split() là 1 nên không cần truyền vào tham số thứ 2 nếu muốn chuyển chuỗi dựa vào 1 character, nhưng explode() bắt buộc phải có delimiter.

ví dụ 1:

$str = "This is a text which will be used to do something.";

print_r(explode("t",$str)); //Array ( [0] => This is a [1] => ex [2] => which will be used [3] => o do some [4] => hing. ) 

ví dụ 2:
$str = "dạy nhau học";

print_r(explode("h", $str));//Array ( [0] => dạy n [1] => au [2] => ọc )

Ví dụ 3: 
$str = "Dạy |sớm |dạy| nhau| học";

print_r(explode("|",$str));//Array ( [0] => Dạy [1] => sớm [2] => dạy [3] => nhau [4] => học )

Nhìn ví dụ 3 sẽ thấy một đặc điểm quan trọng của explode() là nó sẽ xóa chính character là delimiter sau khi convert. Mình hay dùng cái này nhất để tách dữ liệu text và chuyển vào database.



Mình tham khảo tại: https://dotoplay.wordpress.com/2015/08/20/differences-between-str_split-and-explode-in-php/

Wednesday, March 28, 2018

[PHP basic] String là array

PHP là một ngôn ngữ lỏng lẻo (=== bốc phét là linh hoạt), vì thế có nhiều ngoại lệ khi xử lý. Bài này nói về việc string được xử lý như array.

Giả sử ta có biến sau:

$mystr = "Hello world!";

Số character của biến trên là 12. Để đếm tổng số character của string, ta dùng hàm strlen();

1) Giờ thử echo xem string này là array ra sao. Ví dụ:

echo $mystr[0] hoặc $mystr[0], ta đều có H.

2) Giờ sửa string này bằng cách thêm vào một giá trị thay thế, giả sử:

$mystr{0} hoặc $mystr[0] = "K";

3) Giờ echo $mystr; ta sẽ thấy "Hello world!" biến thành "Kello world!";

Giờ ta thử in ra từng character dùng for. Nếu là array ta dùng count() để đếm số elements trong array. Vì đây là string nên ta đếm bằng strlen() như đã nói ở trên.

 $tongsokytu = strlen($mystr);

echo $tongsokytu."<br>";

for ($i=0; $i < $tongsokytu; $i++) {
    echo $mystr[$i]."-";
  }


Kết quả: H-e-l-l-o- -w-o-r-l-d-!-

Nếu tiếng Việt string là "dậy nhậu học" thì kết quả là: "d-�-�-�-y- -n-h-�-�-�-u- -h-�-�-�-c-", hầm bà lằm luôn. Có gì đó sai sai :-)

 
 

Tuesday, March 27, 2018

PHP - Tìm 2 elements giống nhau trong mảng

Hôm ni đọc một câu hỏi phỏng vấn, khá dzui. Tìm 2 elements giống nhau trong một array.
Giả sử ta có mảng (array) sau:

$mang = array(1, 4, 5, 3, 5, 7, 4);


Phân tích, nhìn thì thấy có 2 elements là 4 và 5 là trùng nhau.

Vậy ta cần duyệt qua mảng và đối chiếu từng yếu tốt/thành phần trong mảng.

Để duyệt mảng tuần tự ta dùng for, mảng bất tuần tự (key chứa string), ta dùng foreach.

Đầu tiên ta đếm xem có bao nhiêu thành phần trong mảng: $b = count($mang); //trả về 7

Giả sử cần tìm số lớn nhất thì đây: echo "số lớn nhất trong mảng: ".max($mang)."<br>";

Giờ ta duyệt qua mảng như sau:


for ($i=0; $i < $b; $i++) { 

    for ($j = $i+1; $j < $b; $j++) {

            if($mang[$i]==$mang[$j]){

            echo "số trùng là:".$mang[$i]."<br>";
            }       
    }

}   

Lưu ý là ta cần duyệt 2 lần, một lần cho thành phần trong mảng và lần còn lại cho các thành phần khác. Lưu ý $j = $i + 1;

Code trên trả về 4 và 5.

Trong khi đó, so sánh giữa 2 mảng dùng array_intesect(), như code sau:

$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");

$a2=array("e"=>"red","f"=>"green","g"=>"blue"); $result=array_intersect($a1,$a2);

print_r($result); //Array ( [a] => red [b] => green [c] => blue )