2019-10-21

Sự thật về big data (với data scientists)

Chém thì chém ... nhưng sự thật vẫn sẽ rất khác
When asked what is the largest dataset analyzed, data scientists (the people working on analyzing data) respond that a laptop is usually enough for their needs.

2019-07-17

Remove PDF password (security) with qpdf


Đôi khi nhận file PDF nhưng bị đóng đấu "SECURED". Mình không thể clear password hay edit được mặc dù biết password. Cũng không thể print thành PDF khác được. Chưa kể trong Foxit không có enable mấy functions cần dùng.

Thực hiện như hướng dẫn ở đây


  1. Grab https://github.com/qpdf/qpdf/releases
  2. Unzip/Install and navigate to the bin folder that holds qpdf.exe (or similar for your platform)
  3. Place the PDF you wish to work on in the same folder
  4. Run: qpdf --decrypt InputFile.pdf OutputFile.pdf (use "s if the file name has spaces).
  5. Do what you like with the OutputFile.
If your PDF file is user password protected, change step 4 to qpdf --decrypt --password=yourpassword InputFile OutputFile
This won't work for Adobe Digital Editions and may have issues with digitally-signed files.
Some discussion on the background of these owner password restrictions at https://lwn.net/Articles/335415/ .

2019-04-30

青春有你 (Qing chun you ni)/To youth/Gửi thanh xuân - 蔡佩軒/Ariel Tsai/Thái Bội Hiên

青春有你 (Qing chun you ni)/To youth/Gửi thanh xuân
藝人/Singer: 蔡佩軒/Ariel Tsai/Thái Bội Hiên
专辑/Album: 《青春有你》
發行月份/Release date: 2018年05月






Zàicì
再次
jiànmiàn
见面
wǒmen
我们
yòu
huì
zài
nǎlǐ
哪里

Lần tới không biết chúng ta sẽ gặp nhau nơi nào?
Where we are when we will meet again?
shìfǒu
是否
huì
réng
yǒu
xiāngtóng
相同
de
mòqì
默契

Liệu có còn có thể ngầm hiểu ý nhau?
Will us still have same tacit understanding?
jiàoshì
教室

yǒu
wǒmen
我們
qīngchūn
青春
de
shēnyǐng
身影

Là hình ảnh của thời thanh xuân của chúng ta trong lớp học ngày ấy
There is our youth shadow in the classroom

chū
cāochǎng
操場
zǒu
jìnle
進了
huíyì
回憶

Cùng bước ra sân trường, và bước vào ký ức
Step out to the field, step in to the memories

shíguāng
時光
fēishì
飛逝
zǒng
ràng
rén
cuòshǒubùjí
措手不及

Thời gian trôi quá nhanh khiến ta không kịp chuẩn bị
Times flies fast, always makes people unprepared
xiǎng
qián
xíng
xīn
què
hái
liú
zàiyuán
在原


Muốn tiến về phía trước nhưng trong lòng vẫn lưu luyến nơi đây
Step forward but heart still stay there
yīnwèi
因為
yǒu

qīngchūn
青春
jiù
yǒule
有了
yìyì
意義

Bởi vì em nên thanh xuân mới trở nên ý nghĩa
My youth become meaningful because of you

huì
wàngjì
忘記
zhǐ
huì
gèng
zhēnxī
珍惜

Sẽ không quên chỉ là thêm trân trọng
Never forget but only will cherish more

zhōng
shēng
xiǎngqǐ
響起
shuí
shuō
líbié
離別
shì
jiéjú
結局

Ai nói chuông reo lên, ly biệt là kết thúc
The bell clock is rang, who said parting is the end
hái
yǒu
hǎoduō
好多
gùshì
故事
děngzhe
等著
wǒmen
我們
jìxù
繼續

Vẫn còn nhiều câu chuyện chờ chúng ta tiếp tục
There’s still more story waiting for us to continue

huítóu
回頭
kàn
huì
fāxiàn
發現

yīzhí
一直
zài
zhèlǐ
這裡

Khi ngoảnh lại em sẽ thấy tôi luôn ở nơi đây
When you look back, you'll realize that I still here
wèi
mèngxiǎng
夢想
wǒmen
我們
yīqǐ
一起
nǔlì
努力

Vì ước mơ chúng ta sẽ cùng nỗ lực
We keep fighting for dream

shíguāng
時光
fēishì
飛逝
zǒng
ràng
rén
cuòshǒubùjí
措手不及

Thời gian trôi quá nhanh khiến ta không kịp chuẩn bị
Times flies fast, always makes people unprepared
xiǎng
qián
xíng
xīn
què
hái
liú
zàiyuán
在原


Muốn tiến về phía trước nhưng trong lòng vẫn lưu luyến nơi đây
Step forward but heart still stay there
yīnwèi
因為
yǒu

qīngchūn
青春
jiù
yǒule
有了
yìyì
意義

Bởi vì em nên thanh xuân mới trở nên ý nghĩa
My youth become meaningful because of you

huì
wàngjì
忘記
zhǐ
huì
gèng
zhēnxī
珍惜

Sẽ không quên chỉ là thêm trân trọng
Never forget but only will cherish more

zhōng
shēng
xiǎngqǐ
響起
shuí
shuō
líbié
離別
shì
jiéjú
結局

Ai nói chuông reo lên, ly biệt là kết thúc
The bell clock is rang, who said parting is the end
hái
yǒu
hǎoduō
好多
gùshì
故事
děngzhe
等著
wǒmen
我們
jìxù
繼續

Vẫn còn nhiều câu chuyện chờ chúng ta tiếp tục
There’s still more story waiting for us to continue

huítóu
回頭
kàn
huì
fāxiàn
發現

yīzhí
一直
zài
zhèlǐ
這裡

Khi ngoảnh lại em sẽ thấy tôi luôn ở nơi đây
When you look back, you'll realize that I still here
wèi
mèngxiǎng
夢想
wǒmen
我們
yīqǐ
一起
nǔlì
努力

Vì ước mơ chúng ta sẽ cùng nỗ lực
We keep fighting for dream

zhōng
shēng
xiǎngqǐ
響起
shuí
shuō
líbié
離別
shì
jiéjú
結局

Ai nói chuông reo lên, ly biệt là kết thúc
The bell clock is rang, who said parting is the end
hái
yǒu
hǎoduō
好多
gùshì
故事
děngzhe
等著
wǒmen
我們
jìxù
繼續

Vẫn còn nhiều câu chuyện chờ chúng ta tiếp tục
There’s still more story waiting for us to continue

huítóu
回頭
kàn
huì
fāxiàn
發現

yīzhí
一直
zài
zhèlǐ
這裡

Khi ngoảnh lại em sẽ thấy tôi luôn ở nơi đây
When you look back, you'll realize that I still here
wèi
mèngxiǎng
夢想
wǒmen
我們
yīqǐ
一起
nǔlì
努力

Vì ước mơ chúng ta sẽ cùng nỗ lực
We keep fighting for dream

xièxiè
謝謝
qīngchūn
青春
yǒule
有了


Cảm ơn vì thanh xuân có em
Thanks my youth has you

2018-07-23

What is MVI? Model-View-Intent


Thế là gần 2 năm trôi qua từ lần gần đây nhất mình nói về Android architecture từ tháng 11/2016 Android evolution ... the right architecture?

OK lúc đó Hannes Dorfmann chỉ mới đề cập đến ý tưởng MVI (04 Mar 2016) và muốn chuyển ý tưởng này từ Javascript sang Android. Lúc đó Google còn chưa chính thức ra Android Architecture Components.

Bài viết đầu tiên trong series về MVI của Hannes Dorfmann là vào tháng 01/2017, còn bài viết cuối là vào tháng 05/2018. Nói chung cũng vừa mới đây thôi.

Series của Hannes Dorfmann, tất nhiên là bạn nên đọc hết, đọc một cách kỹ càng
Gần đây công ty lại chuẩn bị một số project mới về mobile nên mình lại cảm thấy ngứa nghề developer. Mặc dù focus vào phát triển sản phẩm như tính năng và không đi sâu vào implement nhưng nhiều khi dạo quanh và đọc các thông tin về architecture cũng có cái thú vị của nó. Càng về sau mình thấy cần thiết phải có một triết lý và các giá trị rõ ràng khi xây dựng sản phẩm từ cả thiết kế đến implementation.

Đầu tiên nói về MVI. Nó là viết tắt của Model-View-Intent. Intent ở đây không phải là Intent của Android (đừng mắc bệnh nghề nghiệp). Phải nói mình rất ấn tượng với lập luận đơn giản của MVI, về unidirectional flow. Muốn tìm về cuội nguồn của MVI thì phải đi từ Cycle.js của André Staltz một framework hướng functional và reactive – A functional and reactive JavaScript framework for predictable code. Một lưu ý thêm ở đây là mục đích framework này nhằm tổ chức code một cách predictable.

Quay lại một chút về trending năm 2017 (development thôi nhé). Đầu năm bên cạnh những thứ liên quan nhiều đến thiết kế như Lottie, motion, onboarding ... sẽ có MVP, MVVM, RxJava (từ v1 sang v2), Dagger2. Chốt lại cuối năm 2017 thì vẫn là sử dụng MVP và MVVM (Google recommended), thêm Kotlin, Android Architecture Components và có thể là Flutter.

Như vậy cả năm 2017 architecture vẫn xoay quanh MVP và MVVM. Tuy nhiên, mình cũng như nhiều developer khác nhận xét thì MVP và MVVM vẫn gây một chút cảm giác thiếu khi không giới thiệu một data flow nào như kiểu Redux. Cái này là điểm mấu chốt để tổ chức predictable code. Dĩ nhiên đó là lý do khi dùng reactive với 2 architecture này, reactive sẽ không phát huy hết khả năng của mình.

Bạn có thể chọn MVP hay MVVM như khuyến khích của Google. Tuy nhiên cá nhân mình thích MVI vì triết lý đơn giản của nó hơn. Ý tưởng của MVI là giao tiếp Human-Computer thể hiển như một vòng tròn, một vòng lặp thì chính xác hơn (cycle).


Khi thể hiện dưới dạng chuỗi các function thì như sau:


Đầu tiên hệ thống (computer/app) lấy input có thể từ DB, Restful API để hiển thị theo cách nào đó. Nó là view(model). Sau khi hiển thị xong thì nó là input của người dùng user. User sẽ thao tác trên ứng dụng ví dụ click chẳng hạn. 

Function intent() sẽ nhận các input từ user, chuyển nó sang model và function model() nhận các input này để thay đổi trạng thái. Cuối cùng function view() sẽ nhận tham số từ output của model() để cập nhật lại UI, hoàn tất một cycle.

Tới đây có lẽ khá đủ cho một bài giới thiệu. Việc còn lại là bắt tay vào làm thử cái gì đó. Re-factor lại một project đã làm cũng có thể, đọc thêm trên GitHub hay Medium... À nhớ là Mosby đã có implement MVI rồi.

Mosby library https://github.com/sockeqwe/mosby

G9

2018-01-25

Excel: last character/string match in a string

Đôi khi có nhu cầu phải tìm ký tự hay sub-string cuối cùng xuất hiện trong Excel.
Search thì cũng ra nhanh nhưng mình note lại đây tập trung 1 chỗ.

Ví dụ
https://stackoverflow.com/questions/18617349/excel-last-character-string-match-in-a-string
https://www.excel-university.com/find-the-last-occurrence-of-a-delimiter-to-retrieve-the-lowest-sub-account-from-quickbooks-in-excel/

=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))

Mình dùng công thức này, ví dụ tìm "\" cuối cùng của cell A1

=SEARCH("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))

2017-12-30

How to register a Baibu account without a mainland Chinese mobile number

Đăng ký tài khoản Baidu để làm gì

  1. Để dùng Baidu Wangpan 百度网盘 tức Baidu Web Disk hay Baidu Web Drive, tên trước đó của nó là Baidu Cloud 百度云 https://pan.baidu.com/. Baidu đầu tư cả chục tỷ CNY cho cái đám này :D là ít. Nó cho phép lưu trữ tới 2TB (khởi đầu là 1TB) miễn phí, 2TB nhé quên Dropbox, OneDrive hay Google Drive đi, upload file đến 4GB, tool download/upload, sync. Có tính năng de-duplicate file torrent, có nghĩa là chỉ cần up file torrent lên Wangpan, nếu file torrent này được ghi nhận là đã có trên Wangpan, bạn có thể save về account của mình (resources sharing). Cho phép leech file torrents tức là download torrents online. Có tính năng phân tách "thư mục riêng tư" hay "thư mục ẩn" private zone hay hidden zone "ẩn tàng không gian" 隐藏空间. Nói chung rất rất là TQ và châu Á. Client app thì ngoại trừ tiếng Trung (mình cũng biết đôi chút) là trở ngại còn lại không có gì quá khó khăn để sử dụng. 



  2. Phần thứ 2 là các thứ liên quan đến development http://developer.baidu.com/ không đề cập nhiều ở đây. Baidu có nhiều thứ những cái mình có dùng như Echart https://ecomfe.github.io/echarts-doc/public/en/index.htmlhttp://echarts.baidu.com/ hay push notification ... Gần đây là Baidu AI, mình chưa đụng qua nhưng chắc cũng nên xem. Nó từng mời cả Andrew Ng về làm chief scientist của AI group cơ mà.
  3. Để TQ nó tốn resource chơi :D, để biết người ta ntn...

Đăng ký như thế nào

Nếu không phải từ TQ thì thực hiện đăng ký từ link sau:
https://passport.baidu.com/v2/?reg&overseas=1

Lưu ý là chỉ định từ "hải ngoại" :D overseas=1

Nếu không có chỉ định này tức ngầm định đăng ký từ Trung Quốc đại lục (中国大陆|Mainland China)

Đăng ký phải dùng dùng số di động từ Trung Quốc đại lục. Không có option để chọn nước


Đăng ký từ hải ngoại, có option để chọn nước ví dụ Việt Nam là +84 (+84 越南). Chỉ được đăng ký tài khoản với số di động chưa được đăng ký trước đó.


2017-12-28

Windows 10: show This PC icon on desktop, hide HomeGroup icon, hide OneDrive, hide Folders on This PC...

Khi chuyển qua Windows 10 có nhiều thứ không cần thiết thì lại có, những thứ cần thiết thì không thấy đâu.
Mấy thứ này lâu rồi nhưng không note lại. Mỗi lần làm lại đi search 1 vòng.


  1. Show This PC icon lên desktop: Windows + I  » Theme and related settings »  Scroll xuống Related settings (hoặc trên PC màn hình lớn thì nằm bên tay phải) » Desktop icon settings » Checked Computer » Có thể rename This PC thành My computer bằng cách chọn và edit.



  2. Remove HomeGroup icon trong File Exploere: Windows + I  » tương tự như trên vào Desktop icon settings » Unchecked Network. Bước tiếp theo vào Windows + E  »  View  »  Options hoặc Windows + I  » search File Explorer Options » View » Unchecked Use Sharing Wizard (recommended)
  3. Hide OneDrive icon trong File Explorer: chạy Registry Edit » Windows + R » regedit » search HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6} bằng cách navigate tới HKEY_CLASSES_ROOT\CLSID» Ctrl + F » Find {018D5C66-4533-4307-9B53-224DE2ED1FE6}. Tắt System.IsPinnedToNameSpaceTree bằng cách set giá trị là 0.


  4. Bỏ các icon trong Folders của This PC trong File Explorer: Windows quản lý bật tắt các folder này trong Registry. Thực hiện navigate tới HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions rồi search. Trong đám này chỉ có Desktop và Download là may ra cần giữ còn lại nên cho đi hết. Thực hiện bật tắt tại key ThisPCPolicy, chuyển thành Hide tại:

    Documents Folder:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{f42ee2d3-909f-4907-8871-4c22fc0bf756}\PropertyBag

    Pictures Folder:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{0ddd015d-b06c-45d5-8c4c-f59713854639}\PropertyBag

    Videos Folder:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{35286a68-3c57-41a1-bbb1-0eae73d76c95}\PropertyBag

    Downloads Folder:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{7d83ee9b-2244-4e70-b1f5-5393042af1e4}\PropertyBag

    Music Folder:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{a0c69a99-21c8-4671-8703-7934162fcf1d}\PropertyBag

    Desktop Folder:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}\PropertyBag

  5. Bỏ các icon 3D Object trong Folders của This PC trong File Explorer: navigate tới HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace và HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace rồi xóa {0DB7E03F-FC29-4DC6-9020-FF41B59E513A}. Không cần phải restart máy.