Một bài tiểu luận viết chơi cho những ai chưa thực sự làm thủ thư nên chưa thể viết có thể copy. Bạn có thể xào bài thoải mái miễn bạn có cảm giác “khó ăn cát bê tông”. Nếu bạn ăn bê tông dễ dàng, vui lòng không sử dụng bài được xào lại từ các công cụ lập trình.
Thủ thư là người chịu trách nhiệm tổ chức, quản lý và cung cấp quyền truy cập vào các tài nguyên thông tin trong thư viện. Họ chịu trách nhiệm lựa chọn và mua sách, tạp chí, cơ sở dữ liệu và các tài liệu khác cho bộ sưu tập của thư viện, cũng như lập danh mục và phân loại chúng để người dùng tin dễ dàng truy xuất.
Thủ thư cũng hỗ trợ người dùng tin trong việc định vị tài nguyên thông tin và cung cấp hướng dẫn về cách sử dụng chúng một cách hiệu quả. Họ có thể phát triển và cung cấp các chương trình và dịch vụ đáp ứng nhu cầu của cộng đồng, chẳng hạn như các chương trình xóa mù chữ, câu lạc bộ sách hoặc các sự kiện văn hóa.
Ngoài các tài liệu in truyền thống, các thủ thư hiện đại cũng chịu trách nhiệm quản lý tài nguyên kỹ thuật số, bao gồm sách điện tử, cơ sở dữ liệu trực tuyến và nội dung đa phương tiện.
Một thủ thư chính chuyên phải luôn cập nhật những thay đổi trong công nghệ và các xu hướng mới nhất trong khoa học thông tin để đảm bảo rằng người dùng tin có quyền truy cập vào các tài nguyên mới nhất và có liên quan nhất.
Thủ thư có thể làm việc trong nhiều môi trường khác nhau, bao gồm thư viện học thuật, thư viện công cộng, thư viện trường học, thư viện đặc biệt và thư viện công ty. Họ có thể chuyên về các lĩnh vực như văn học thiếu nhi, luật, khoa học tên lửa, tôn giáo hoặc nghiên cứu y học.
Thủ thư đóng vai trò quan trọng như một giấc mơ trong xã hội bằng cách tạo điều kiện tiếp cận thông tin và thúc đẩy xóa mù chữ, nâng cao đời sống tinh thần, văn minh của người dân. Ngoài trách nhiệm thực tế của họ, thủ thư cũng là những người gác cổng ngôi đền văn hóa quan trọng, quản lý các bộ sưu tập và tạo ra các chương trình phản ánh và làm phong phú thêm cộng đồng mà họ phục vụ. Một số trách nhiệm chính mà thủ thư thường lãnh giáo bao gồm:
Phát triển bộ sưu tập: Thủ thư chịu trách nhiệm lựa chọn, thu thập và sắp xếp tài liệu cho bộ sưu tập thư viện của họ. Điều này có thể bao gồm sách, tạp chí, tạp chí, báo, tài nguyên kỹ thuật số và tài liệu đa phương tiện.
Lập danh mục và phân loại: Một khi tài liệu đã được mua, thủ thư phải lập danh mục và phân loại chúng để bạn đọc có thể dễ dàng định vị và truy cập.
Dịch vụ tham khảo: Thủ thư giúp bạn đọc xác định vị trí thông tin họ cần bằng cách trả lời các câu hỏi tham khảo, cung cấp hỗ trợ nghiên cứu và hướng dẫn bạn đọc quen thông qua các tài nguyên của thư viện.
Hướng dẫn thông tin: Thủ thư cũng có thể cung cấp hướng dẫn về cách sử dụng tài nguyên thư viện một cách hiệu quả, bao gồm các chiến lược tìm kiếm, sử dụng cơ sở dữ liệu và định dạng trích dẫn.
Lập trình máy tính: Thủ thư thường tạo và thực hiện các chương trình, phần mềm, app thúc đẩy khả năng đọc viết, nhận thức văn hóa và học tập suốt đời.
Nếu bạn quan tâm đến việc tìm hiểu thêm về nghề thủ thư hoặc cân nhắc tự mình theo đuổi sự nghiệp một cô, chú thủ thư dễ thương bạn có thể tìm thấy hữu ích khi khám phá một số lợi ích của vai trò thủ thư trong cuộc sống. Hiệp hội Thư viện Hoa Kỳ (ALA) đã biên soạn một danh sách 10 lý do hàng đầu để trở thành một thủ thư. Theo họ:
“Điều duy nhất tôi thích nhất khi trở thành một thủ thư là… một bữa tiệc di động. Tôi đã được tuyển dụng trong các thư viện học thuật, công cộng và trường học ở ba tiểu bang khác nhau làm việc trong các dịch vụ kỹ thuật, dịch vụ công cộng và lớp học …“
Cuối tuần rảnh rỗi, sau khi giải quyết được đoạn code quá trần ai khoai củ.. đành đi cà khịa chơi. Cái đoạn code này được viết ổn, nhưng phải sau hơn một tuần ngồi vò đầu bứt tóc debug, trace từng dòng để xem logic sai lạc chỗ nào mới phát hiện hóa ra… cấu hình sai, code không liên quan.
Khi bạn nghĩ ra trò bẩn bựa, nó xuất hiện ngay
Đầu tiên mở trình duyệt web lên xem có gì bẩn bựa? Bỗng nhiên trình duyệt hỏi có đồng bộ bookmark
Dù không hiểu lắm về đồng bộ ở đây là làm gì, vẫn thử OK xem sao. Vậy là mất chừng 20 giây, bookmark đã được đồng bộ về, ra một mớ như sau:
Không có gì là bẩn bựa… chỉ là quả lừa
Click ngẫu nhiên lên một bookmark cũ
Cái blog cũ xưa của một ông lương y nào đó tên là Thuận Nghĩa. Nói thật, không thể nhớ được ông này là ông nào, từng ghé blog của ông từ thuở nào. Có lẽ đã lâu lắm rồi, từ thời phong trào viết blog hãy còn là ở những ngày vàng son cũng nên. Kệ, cứ lướt lướt tí xíu…
Nhặt được 2 cái hình này:
Hahaha, đại ca William Sydney Porter có đội mồ sống lại, ông cũng không ngờ rằng tác phẩm của mình có thể truyền cảm hứng khắp năm châu, bốn bể… đến mức ngày nay bọn trẻ trâu lấy ra để troll nhau.
Vậy là đi đứt buổi sáng sau khi lướt web đọc lan man… vài chục trang web dạng “khai quật mộ cổ”.
Bạn là một Linux user? Có thể bạn chỉ mới bắt đầu với hành trình vọc Linux hoặc dùng trên 3 năm, vấn đề cập nhật kernel luôn luôn là việc làm nhàm chán, tẻ ngắt mà nếu không làm thì lại lo ngại về một lỗ hổng bảo mật nào đó có thể khiến cuộc sống số của bạn đảo lộn.
Bài viết này chỉ như ghi chú lại những gì vừa thực hiện (dù đã biết từ lâu nhưng cứ tưởng đâu phải đăng ký trả tiền subscribe theo năm, nhưng hóa ra là miễn phí cho cá nhân) liên quan đến cập nhật Kernel tự động mà không cần khởi động lại máy. Nào, bắt đầu thôi.
Hãy chắc rằng bạn dùng hệ điều hành Ubuntu và đăng ký Ubuntu One/ Ubuntu Pro
Đăng ký một tài khoản tại https://ubuntu.com/pro
Sau khi có tài khoản nếu hệ thống không tự động login, bạn cần login để truy cập trang https://ubuntu.com/pro/dashboard
Thực hiện một số lệnh trên Terminal của bạn
Lần lượt gõ các lệnh sau mà không cần chớp mắt 😀
Lệnh trên có thể không cần thiết nếu bạn sử dụng Ubuntu 20.04 trở đi. Giả sử bạn có gõ thừa lệnh trên cũng không vấn đề gì, hệ thống sẽ báo đã có rồi.
Lệnh trên thành công sẽ báo: canonical-livepatch 10.6.0 from Canonical✓ installed
Nếu báo lỗi hay gì đó, bạn tự xử lý nhé.
Tiếp tục gõ lệnh:
để cài đặt cái gọi là Ubuntu Pro Client.
Quay lại trang https://ubuntu.com/pro/dashboard thấy như hình:
Copy chuỗi như trên hình (của bạn dĩ nhiên khác chút xíu). Gõ lệnh:
Không cần giải thích, bạn biết sẽ phải thay token của bạn vào câu lệnh ở chỗ khoanh đỏ hình bên trên.
Bạn có thể chờ đợi mất 2 phút để lệnh hoàn tất. Với những thông báo trong quá trình chạy gần như sau:
Tiếp theo, gõ lệnh:
Để thấy được tình trạng của máy bạn. Vậy là xong rồi đó. Từ nay mỗi khi có kernel mới, Livepatch sẽ tự làm nhiệm vụ của mình mà bạn không cần phải restart lại máy.
Cách đây chừng nửa năm người viết bài này có dịp viết một ứng dụng web nhỏ để hỗ trợ nhóm bạn bè quản lý một số file tài liệu để có thể chia sẻ với nhau một cách dễ dàng. Lúc đó viết code chỉ mất tầm 3 ngày là xong. Từ đó đến nay web chạy tốt, ổn định. Nhưng…
Có sự nhầm lẫn trong việc phân quyền
Vì là ứng dụng một người viết code duy nhất nên anh ta cũng là tester và hỗ trợ, hướng dẫn người sử dụng luôn. Tình nhìn xảy ra vì có người dùng có nhiều hơn một thư mục nên đã xảy ra trong quá trình upload có sai sót về kiểm tra nên người nọ đã upload nhầm vào thư mục người kia.
Điều khôi hài hơn là trong việc phân quyền nhầm người ta đã không thể download tài liệu của mình đưa lên nhưng lại download được tài liệu khác.
Trong quá trình viết code có kiểm thử, nhưng khó bao quát được hết các tình huống, khi sử dụng một thời gian mới có nhiều điều buồn cười.
Khi di chuyển server đành phải xử lý thủ công
Gần đây hosting đã bị đầy nên chuyển sang server mới. Vì ứng dụng nhỏ nên không có các thứ như cài đặt, kiểm tra tính toàn vẹn dữ liệu này nọ nên đã nảy sinh ra vấn đề, chưa gọi thảm hoạ lắm nhưng cũng phải xử lý thủ công vì không biết file nào sau khi đổi tên đã là file nào.
Cũng thật may mắn khi đang có vài bạn nữ với kỹ năng tin học văn phòng khá nên phân cho mỗi người vài trăm file để họ rà soát và gắn lại cho đúng. Việc đơn giản vậy mà cũng mất 2 ngày mới hoàn tất. Thật quá nguy hiểm!
Bài học
Trong quá trình upload file luôn xảy ra trường hợp sai sót, file bị đứt gãy hoặc không được đưa vào đúng thư mục. Do đó cần phải có đoạn mã để kiểm tra việc này.
Chưa hết, trong cơ sở dữ liệu nên lưu kích thước của file để trường hợp nhầm lẫn, thất lạc có thể nhanh chóng viết một vài script để dò tìm, đối soát, tiết kiệm rất nhiều công sức rà soát thủ công. Nếu có hàng ngàn file sẽ là thảm hoạ vậy.
Bạn sử dụng hệ điều hành Linux để phát triển phần mềm ứng dụng trên môi trường NodeJS và rất bực mình khi thường xuyên bị báo lỗi với quyền liên quan NodeJS hoặc có những cảnh báo cảm thấy không lấy gì làm vui vẻ, tích cực cho lắm? Bài viết này chia sẻ phần nào cách KACBT đối mặt với vấn đề, có thể bạn tìm thấy sự hữu ích, áp dụng được.
Chưa cài NodeJS muốn cài từ đầu, không dùng root
Ghé vào trang https://nodejs.org/download/release để tải phiên bản Node.js bạn muốn dùng để tải về dưới dạng file .tar.gz
Thực hiện các lệnh sau:
Các lệnh cài đặt Node.js với user thường
Sau cùng, hãy kiểm tra thành quả của bạn xem đã ổn chưa với lệnh node –version
Bạn tự do thay đổi node-v18.14.0-linux-x64.tar.gz bằng phiên bản Node.js của bạn, thư mục nodejs-apps bằng tên thư mục do bạn tự đặt nhé.
Đã có Node.js trên máy, muốn thay đổi thành user bình thường
Thực hiện lệnh npm config get prefix để xem có phải hiện ra /usr hay không? Nếu đúng, thực hiện tiếp các lệnh sau:
Cài Node.js global cho user thường
Cách này có hai điều cần lưu ý:
Nếu trước đây bạn đã phải dùng root để cài đặt các modules và có app nào đó đã chạy thì rồi sẽ báo bạn không có quyền. Cách xử lý: sudo chown -R whoami ~/.npm && sudo chown -R whoami /usr/local/lib/node_modules
Để có thể lần khởi động máy sau, các thiết lập trên vẫn còn tác dụng, bạn phải có lệnh: echo -e “export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin” >> ~/.bashrc
Sử dụng NVM (Node Version Manager) khi bạn muốn khác bên trên
Cách này tất nhiên lúc ban đầu cần mất chút thời gian để làm quen, sử dụng. Nhưng lợi ích lâu dài của nó là xứng đáng với những gì bỏ ra.
Vào trang https://github.com/nvm-sh/nvm xem phần Installing and Updating và làm theo, hết sức dễ dàng, bạn có thể xem chỉ với vài câu lệnh:
Sử dụng NVM để quản lý các phiên bản Node.js
Đây là cách đáp ứng tốt nhất các yêu cầu phức tạp về Node.js khi cần sử dụng nhiều phiên bản khác nhau, các gói cài đặt khác nhau của ứng dụng cần phiên bản khác nhau tránh “giẫm đạp” lên nhau thành một mớ hỗn độn mất kiểm soát.
Bài này đăng lại comment từ một status Facebook do chính tác giả comment trên group Facebook mang tên Học lập trình web (F8 – Fullstack.edu.vn). Tại sao đăng lại? Tại vì thấy có vẻ như nhiều bạn trẻ (và không còn quá trẻ nữa khi ở tuổi 26 đến 32) mà lại hay hỏi những câu rất lơ ngơ. Có thể một trong số đó vô tình vào KACBT để học HTML, sẵn đọc luôn cho bớt mơ mộng.
Vấn đề của những bạn mơ bước chân vào lập trình là gì?
Vấn đề lớn nhất của những người không đủ tiêu chuẩn để gia nhập nghề mới dù loay hoay nhiều năm, học lung tung cả lên hết trung tâm nọ, trung tâm kia, mua hàng chục khóa học online với giá khoảng 9 đến 99 đô la.
Gần đây, tui vô tình nghe một Podcast về những người học lập trình kiểu mì ăn liền. Podcast đó phản ánh một thực tế rằng nhiều kẻ mơ mộng, suy nghĩ khá hời hợt về nghề lập trình.
Mấy cái KHÔNG sau cần giải quyết hoặc khắc phục phần lớn thì tiêu chuẩn nghề mới nâng cao lên được, mới có thể đi làm.
Tiếng Anh yếu kém: cái này đánh rớt hết 80% những người mơ mộng muốn chuyển sang làm trong lĩnh vực lập trình, hay nói đúng hơn, chưa tới được bãi gửi xe lấy gì mà tham dự sự kiện?
Người học không chịu kết bạn ngoài đời, không đi chơi giao lưu với dân trong nghề để học hỏi, không mò đến các event về ngành định chuyển qua để được tắm trong không khí của nó, để hít thở, ngửi mùi, kích thích sự hứng thú với nghề mới. Trong khi đó toàn lên mạng tám với dân ngoại đạo, showbiz của nghề hơn là dân trong nghề. Dân trong nghề thực thụ lại ít tám trên mạng, có tám họ toàn vô những chỗ khá chuyên sâu.
Tạp chí chuyên ngành là “vũ khí” rất quan trọng để tìm hiểu, học hỏi, nghiên cứu một chuyên môn mới nhưng hầu hết thanh niên Việt Nam (trừ những HS, SV từng làm nghiên cứu khoa học ở trường/ đại học hoặc bị thầy cô giáo bắt tìm đọc tạp chí để làm bài tập/ đề tài nghiên cứu) KHÔNG biết tạp chí chuyên ngành là gì, ngay cả dân đang trong nghề còn chưa biết đến có sự tồn tại của chúng, mà lại cho rằng chúng kém hữu ích, và hẳn họ chỉ ở mức thợ code là hết mức.
Người học sợ, ngại đọc sách và cũng sợ tham gia các khóa học dạng MOOC đủ chuẩn SCORM hoặc AICC mà chỉ thích xem clip, đọc các tut, xem video clip, học mót các course dạng bootcamp mà người hướng dẫn không có chứng chỉ về sư phạm giảng dạy.
Đặc điểm của nghề mang tính kỹ thuật/ ứng dụng như IT, lập trình
Ngành kỹ thuật khác nhiều so với các ngành xã hội đó là phải đề cao tính chất làm để học chứ không phải học để làm. Cho nên, người học phải nhúng tay vào làm mới học được. Ai có tư tưởng học lý thuyết cho nhuyễn rồi mới thực hành là hỏng, hỏng bét, hoặc chỉ học thực hành, xao nhãng lý thuyết cũng hỏng. Hai món này phải đan xen, cài vào nhau trong mỗi buổi học thì mới là cách học phù hợp.
Ví dụ như để làm được giao diện trang web thì phải lôi “đồ nghề” là trình soạn thảo văn bản thô, thu thập các file hình ảnh (được thiết kế trên Photoshop, tìm kiếm trên mạng, kho ảnh trước đó) rồi ngồi mà lắp chúng lại, trong quá trình lắp sẽ phải thì đọc “tài liệu hướng dẫn”, không khác so với lấy bộ đồ chơi lắp ghép Lego ra chơi.
Để học được vào, được thấm, hiểu rõ, khi học người học cần phải ép bản thân mình vào tư thế không thoải mái, tránh rơi vào giấc ngủ hoặc dễ bị xao nhãng bởi mấy thứ linh tinh. Bạn có thể tham khảo một cô bác sĩ người Anh nói về việc này.
Ví dụ: kiếm một cái màn hình mà 25 phút nó tắt một lần, 5 phút sau mới lại bật lên được thì ta sẽ thấy 25 phút rất quý báu, tranh thủ mà cày cho xong đoạn code nào đó tránh để màn hình làm cho mất hứng. Bàn phím thì nên mua một cái second-hand tiếng Nhật để buộc phải thuộc cách gõ code, bởi việc nhìn mặt phím là vô dụng. Tất nhiên, bạn đừng ngây thơ nghĩ rằng có cái màn hình nào mua mới ngoài tiệm có sẵn chức năng 25 phút tắt một lần. Cách học là bạn phải suy nghĩ vấn đề, tìm kiếm phần mềm trên máy tính để thực hiện chức năng đó cho bạn.
Kết: Khắc phục được các vấn đề trên, việc chuyển sang nghề viết code là trong tầm tay các bạn.
Có thể nói rằng nếu chỉ có HTML, một trang web trông không khác gì những công trình xây thô thấy còn nguyên gạch, vữa. Hoặc muốn dễ hình dung hơn, bạn tìm một hotgirl Trung Quốc để mặt mộc. Từ các bài trước, chúng ta đã làm một trang web về trà sữa chưa có chút nào CSS.
Bài hôm nay, chúng ta mở file bai5.html ra, Save As thành bai7.html để thực hành.
Tạo file CSS và viết vài rule
Tạo file bai7.css , save vào thư mục D:\xampp\htdocs\css (nếu chưa có thư mục css bạn phải tự tạo, đây là kiến thức tin học căn bản, KACBT mặc định bạn đã nắm biết).
Soạn nội dung file bai7.css như sau:
Hình 1. Nội dung file bai7.css
Luôn Save file lại trước khi làm gì hơn. Ta cũng nhớ lại lý thuyết đã học ở bài trước, giờ thì mở file bai7.html ra để sửa.
Hình 2. Dòng 5 chính là gắn CSS vào HTML
Save lại file và mở trình duyệt lên truy cập để xem thử hình hài trang web thế nào. Trông cũng vui mắt rồi:
Hình 3. Diện mạo trang web khi có chút CSS
Hoan hô bạn, giờ đây bạn đã thấy ánh sáng le lói ở cuối đường hầm. Trang web trông như vào thập niên ’90 của thế kỷ trước. Không sao, chúng ta đang ở mức học “bảng cửu chương” trong quá trình học toán, rồi sẽ làm toán được.
Thêm một vài rule nữa, kèm chút giải thích
KACBT cũng nhại theo giới showbiz, tiết lộ cho bạn một… tin động trời: vừa rồi đã gặp thảm hoạ về ổ cứng nên mất sạch tất cả những gì liên quan đến những bài học từ bữa giờ. Vì thế cho nên, thực sự đoạn mã minh hoạ trong bài 7 này không còn, và KACBT cũng phải ngồi gõ lại từ bài 5.
Điều khôi hài xảy ra: nếu bạn chú ý quan sát, đoạn HTML hiện đang chưa đúng với ở bài 5. Ở bài 5 có một DIV bọc ngoài MAIN. Giờ phải sửa lại cho giống bài 5 đã rồi làm gì làm:
Bọc DIV có class là three-cols bên ngoài
Nhớ đóng thẻ DIV, nếu không gây lỗi valid
Cũng cần nói thêm rằng, bạn chỉ sửa mã như trên nếu bạn ngồi gõ mã ở bài này, còn nếu bạn đã Save as từ file bai5.html thì không cần phải làm gì thêm, nếu đã làm, hãy nhớ “undo” các bước, nếu không sẽ có 2 thẻ DIV bọc nhau chẳng để làm gì.
Mở file bai7.css lên, sửa rule cho header thành như sau:
Viết thêm một số dòng để trang trí HEADER
Đọc thấy dòng ảnh nền ở trên, không cần phải nhắc bạn cũng phải biết rằng tìm một hình ảnh làm ảnh nền bỏ vào thư mục images để khi xem trang web hiện được ảnh này lên.
Có một phép mầu xảy ra khi bạn thử chỉnh hiển thị trang web bằng cách bấm Ctrl + dấu trừ để thu nhỏ trang web của bạn (hoặc màn hình của bạn rộng, hỗ trợ full HD trở lên), bạn sẽ chứng kiến được cái ảnh nền nó nhảy lập lại một cái bên tay phải. Đó là mặc định của thuộc tính background-image.
Chỉ cần thêm vào sau dòng thuộc tính này, giờ đây rule cho HEADER trông như sau:
Không cho lặp lại ảnh nền bằng thuộc tính background-repeat có giá trị no-repeat
Nhớ bấm Ctrl + số không để trình duyệt bạn trở về xem trang web đúng 100% của nó nhé, nếu quên, bạn có thể sẽ nhìn web của bạn không đúng tỉ lệ thật của nó.
Bạn có thể tung hoành với CSS của bạn bằng cách thêm rule, bổ sung các thuộc tính cho rule đang có để làm thế nào cho trang web của bạn được đẹp hơn. KACBT không “cầm tay chỉ việc” cho bạn những thứ đó, mà bạn phải tự động não, tự thực hành,… hòng tiến bộ, hiểu bài.
Chúng tôi chỉ có thể thử cung cấp vào rule, bạn có thể gõ lại vào file CSS để xem chuyện gì xảy ra, rồi có thể thay đổi để cảm thấy ưng ý hơn. Ví dụ, đoạn CSS sau:
Một vài khối rule CSS mà bạn có thể thử áp dụng
Một số thuộc tính được gọi là shorthand. Nghĩa là một thuộc tính shorthand cho phép thiết lập nhiều thuộc tính đồng thời thay vì phải viết rời từng thuộc tính. Áp dụng shorthand sẽ giúp viết CSS gọn gàng hơn. Nhưng nhược điểm là bạn phải làm nhiều mới có thể nhớ đúng thứ tự các giá trị, nếu không nhớ đúng, có thể kết quả sẽ khác với mong đợi.
Thuộc tính background là một thuộc tính dạng shorthand. Ta có ví dụ sau:
Viết rời từng thuộc tính
Đoạn nhiều thuộc tính như trên, gom lại thành 1 thuộc tính shorthand:
Thuộc tính background là thuộc tính shorthand
Bạn có thể tìm hiểu thêm về Shorthand properties trên trang của tổ chức Mozilla.
Một vài mẹo hay dân trong nghề phải biết
Dù bạn chỉ học làm web dưới dạng nghiệp dư amateur chơi cho vui, điều đó không ngăn cản KACBT và bạn trao đổi với nhau vài thứ của dân trong nghề, cũng dễ để áp dụng. Nào, bắt đầu ngay.
CSS Reset
Mặc định trình duyệt có một số định nghĩa ngầm về CSS để khimở một file HTML lên thì có thể hiển thị được nội dung, đọc được. Nhưng các trình duyệt web khác nhau lại không thống nhất nhau về việc này dẫn đến khi viết CSS, bạn đã kiểm tra tới lui thấy không có gì sai sót nhưng những gì hiển trị trên trang web lại không như mong đợi, loay hoay đủ kiểu bạn vẫn bó tay. Các đại ca lâu năm trong nghề giải quyết vấn đề này bằng cách sử dụng cái gọi là CSS Reset (hoặc Reset CSS), đó là một số rule CSS được viết sẵn, mỗi khi bạn định viết CSS thì hãy copy các rule này vào đầu file CSS của bạn hoặc đặt trong một file reset.css và nhúng ngay vào HTML của bạn. Nội dung CSS Reset như sau:
/***
The new CSS reset - version 1.8.2 (last updated 23.12.2022)
GitHub page: https://github.com/elad2412/the-new-css-reset
***/
/*
Remove all the styles of the "User-Agent-Stylesheet", except for the 'display' property
- The "symbol *" part is to solve Firefox SVG sprite bug
*/
*:where(:not(html, iframe, canvas, img, svg, video, audio):not(svg *, symbol *)) {
all: unset;
display: revert;
}
/* Preferred box-sizing value */
*,
*::before,
*::after {
box-sizing: border-box;
}
/* Reapply the pointer cursor for anchor tags */
a, button {
cursor: revert;
}
/* Remove list styles (bullets/numbers) */
ol, ul, menu {
list-style: none;
}
/* For images to not be able to exceed their container */
img {
max-inline-size: 100%;
max-block-size: 100%;
}
/* removes spacing between cells in tables */
table {
border-collapse: collapse;
}
/* Safari - solving issue when using user-select:none on the <body> text input doesn't working */
input, textarea {
-webkit-user-select: auto;
}
/* revert the 'white-space' property for textarea elements on Safari */
textarea {
white-space: revert;
}
/* minimum style to allow to style meter element */
meter {
-webkit-appearance: revert;
appearance: revert;
}
/* preformatted text - use only for this feature */
pre {
all: revert;
}
/* reset default text opacity of input placeholder */
::placeholder {
color: unset;
}
/* remove default dot (•) sign */
::marker {
content: "";
}
/* fix the feature of 'hidden' attribute.
display:revert; revert to element instead of attribute */
:where([hidden]) {
display: none;
}
/* revert for bug in Chromium browsers
- fix for the content editable attribute will work properly.
- webkit-user-select: auto; added for Safari in case of using user-select:none on wrapper element*/
:where([contenteditable]:not([contenteditable="false"])) {
-moz-user-modify: read-write;
-webkit-user-modify: read-write;
overflow-wrap: break-word;
-webkit-line-break: after-white-space;
-webkit-user-select: auto;
}
/* apply back the draggable feature - exist only in Chromium and Safari */
:where([draggable="true"]) {
-webkit-user-drag: element;
}
/* Revert Modal native behavior */
:where(dialog:modal) {
all: revert;
}
Bạn cũng có thể sử dụng một mẫu CSS khác được gọi là normalize.css có nội dung như sau:
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}
Chúng tôi không có lời bình nào về tốt/ xấu, hay/ dở của hai mẫu CSS kể trên mà bạn thử áp dụng vào chọn cái phù hợp với bản thân mình. Hoặc, ở đẳng cấp cao hơn, bạn chế ra một thứ cho riêng bạn, đó chính là việc học đã hiểu bài, áp dụng tốt và nâng cao hơn một bước.
Nếu bạn để ý, ngay cả CSS Reset (hoặc Reset CSS) kể trên cũng đã là một bản cải tiến của cái nguyên ban đầu, phù hợp hơn với cách trình duyệt web hiện đại ngày nay. Bản gốc của Eric A. Meyer cũng đã cải tiến 1 lần, như sau:
Trong quá khứ, khi CSS hãy còn chưa mạnh mẽ như ngày nay, cách để có một hình tròn trên trang web đó là phải sử dụng trình xử lý ảnh để cắt gọn trước thành hình tròn rồi xuất thành ảnh GIF (thuở ban đầu), hoặc ảnh PNG có nền trong suốt.
Ngày nay, bạn dễ dàng tạo ra được ảnh trong khung tròn với chưa đến chục dòng CSS, học thuộc lòng để áp dụng luôn.
Nếu hình ảnh của bạn vuông, hãy áp dụng đoạn HTML & CSS này.
Trong thực tế, hình ảnh đa số là hình chữ nhật chứ không phải hình vuông. Do đó, hãy sử dụng một trong hai lựa chọn sau đây tuỳ ảnh bạn là chữ nhật dọc (chiều rộng hẹp, nhỏ hơn chiều cao) hay chữ nhật ngang (chiều rộng > chiều cao).
Hình ảnh dọc thì áp dụng như này. Chú ý sửa kích thước cho phù hợp với mong muốn của bạn.
Trong khi đó, nếu hình ảnh bạn có xu hướng ngang, tức là chiều rộng lớn hơn chiều cao, hãy nhớ đoạn CSS bên dưới để áp dụng:
Hình ảnh ngang thì áp dụng CSS như này.
Canh giữa một khối trong một khối
Chúng tôi minh hoạ bằng DIV, bạn có thể dùng khối khác miễn khối đó có display là block.
Mẫu chốt của mẹo này là vùng khoanh đỏ trên hình
Như vậy, chúng ta kết thúc bài 7 này ở đây. Hẹn gặp bạn ở bài kế tiếp.
Bài tập thực hành
Thay đổi FOOTER để trông bắt mắt hơn bằng cách thêm thông tin trong file HTML, thêm rule trong file CSS
Thay đổi thanh lề trái, thanh lề phải của trang web
Thêm nội dung cho phần MAIN để trang web trở nên hấp dẫn hơn
Hiện nay nhiều nhà cung cấp web hosting không cho phép gửi email bằng hàm gửi mail mặc định bởi vì tình hình spam, hoặc gửi email được nhưng luôn rơi vào thư mục spam của người nhận. Đó là chưa kể có một sự thật thú vị: nếu cung cấp gửi email như vậy thì có còn mấy khách hàng đăng ký dịch vụ email hosting cơ chứ.
Do vậy, dân vọc Web sẽ nghĩ đến cách làm sao gửi được email. Cụ thể bài viết này sẽ hướng dẫn bạn cách làm sao để WordPress
Thực hiện theo hướng dẫn chính chủ từ Google
Chỉ cần đọc bài này và làm theo. Nếu làm được xem như xong. Chưa làm được bạn hãy đọc tiếp bên dưới.
Sau bước 3 nghĩa là đã bật được chức năng xác thực hai bước cho tài khoản Google.
Tại sao việc bật xác thực 2 bước này là quan trọng, buộc phải làm? Có 2 lý do cho vấn đề:
Thứ nhất: Google không còn cho phép dùng mật khẩu của tài khoản Google để xác thực việc gửi email thông qua một ứng dụng mà không có sự tương tác trực tiếp của con người.
Thứ hai: thật tai hại nếu lộ mật khẩu của tài khoản Google khi mà tài khoản đó đang được bạn dùng như một “chìa khoá vạn năng” mở cửa vào cánh cửa của mọi dịch vụ liên quan đến Google. Nếu lộ mật khẩu đó mà không kèm xác thực 2 bước, cuộc đời của bạn có thể rơi xuống bùn, thật chứ không đùa.
Vậy nên, sau khi kích hoạt được xác thực 2 bước rồi, ta mới là phần (4) App passwords như khoanh đỏ ở hình bên trên. Click mục đó, nó sẽ:
Hình 2. Màn hình cho phép tạo mật khẩu App
Nếu bạn đã từng tạo App password trước đây thì trong danh sách có liệt kê, còn không thì sẽ trống trơn. Giờ đây bạn quan tâm đến vùng như khoanh đỏ trên Hình 2.
Click chọn Select app xổ ra menu và chọc như hình dưới:
Hình 3. Đặt tên cho App mà bạn sẽ dùng
Nghe tên mật khẩu app, mật khẩu ứng dụng cực kỳ tối nghĩa với người Việt chúng ta, nhất là nếu bạn không phải dân công nghệ thông tin. Thực sự hiểu vầy cho dễ: Google xem các thứ kết nối tới dịch vụ của họ là một “ứng dụng” (phần mềm/ trình duyệt/ trang web/ phần mềm máy chủ).
Vậy nên, bạn cần đặt tên gì đó để sau này nhìn vào bạn biết/ gợi nhớ là cái mật khẩu này tạo ra để dùng làm gì, ở đâu. Không ai cấm bạn đặt trên nghe mỹ miều và vô nghĩa cả, nhưng đừng tự làm rối mình kiểu bạn bán cá nhưng có tên là Tôm.
Ngay khi gõ vài ký tự để đặt tên, bạn sẽ nhận thấy nút Generate chuyển trạng thái xanh cho phép click. Lúc này click sẽ sinh ra một cái gọi là App password, đây chính là kết quả chúng ta đang mong đợi.
Hình 4. Kết quả mật khẩu tạo ra.
Copy lại 16 ký tự chữ thường trong ô màu vàng/ cũng nên chụp ảnh màn hình lại để sử dụng về sau khi cần bởi vì ta không thể thấy được mật khẩu này thêm lần nào nữa. Bấm nút DONE để hoàn tất.
Dùng thông số cấu hình cho mã nguồn của bạn
Chúng tôi minh hoạ với code PHP, dùng thư viện nguồn mở có sẵn gọi là PHPMailer, nếu bạn sử dụng ngôn ngữ lập trình khác thì bạn chỉ cần sử dụng cú pháp của ngôn ngữ đó, lấy lại các thông số username và mật khẩu như trong hình.
Hình 5. Cấu hình SMTP Gmail dùng trong PHP.
Chú ý: thay cái mật khẩu ở hình trên với mật khẩu có được từ mục tương đương Hình 4 trên. Không có nghĩa là bạn lấy mật khẩu app của chúng tôi có email của bạn.
Bài này đơn giản là một hướng dẫn nhanh cho một học viên học Web. Anh ấy muốn cho khách truy cập trang đọc được những file PDF anh ấy tự làm hoặc sưu tầm được nhưng không muốn cho người dùng dễ dàng download về.
Sử dụng các thư viện để xử lý chuyên thì hoặc mất tiền hoặc quá khó cho người bắt đầu. Vì thế, chúng tôi hướng dẫn cách làm thông qua công cụ đọc file của Google.
Đưa file của bạn lên Google Drive
Truy cập vào trang drive chấm google chấm com để upload file PDF của bạn lên. Nhớ tạo một thư mục riêng trước khi upload file PDF vào, vì liên quan đến việc phân quyền, nên nếu để ở thư mục chung hoặc thư mục có nhiều file không muốn chia sẻ khác, bạn sẽ gặp rủi ro về bảo mật.
Khi file PDF đã được tải lên ngon lành, nhấp đúp lên file để xem, sẽ hiển thị file trong một hộp cho phép đọc file như một trình PDF reader hoặc PDF viewer. Lúc này, nhìn bên góc phải sẽ thấy:
Hình 1. Click dấu 3 chấm, click tiếp mục Share
Click vào vùng khoanh đỏ lần lượt từ trên xuống như trên hình, sẽ xuất hiện cửa sổ cho phép chỉnh thông số về chia sẻ, trông như này:
Hình 2. Click vào biểu tượngbánh xe như trên hình.
Ở cửa sổ này, không thao tác gì trên cửa sổ ngoại trừ việc click vào biểu tượng hình bánh xe ở góc phải trên của cửa sổ như hình minh hoạ trên. Lúc ấy, một khung nhỏ khác hiện ra:
Hình 3. Click bỏ dấu tick ở mục thứ hai
Chỉ cần click bỏ chọn ở mục “Viewer and commenters can see…” đi. Quay lại cửa sổ Hình 2 click nút Copy link trước khi bấm nút Done. Lúc này ta có địa chỉ URL trong bộ nhớ, trông như sau:
Hình 4. Địa chỉ URL chia sẻ file PDF
Ta để ý cái dòng dài dài vô nghĩa này nó sẽ có cấu trúc nào đó, và ta sẽ thấy sau chữ d thường kèm dấu chém là một chuỗi “mật mã Da Vinci”, ta chọn đoạn này mãi cho đến dấu chém tới đứng trước chữ view. Như vùng chọn màu xanh là cây được minh hoạ:
Copy cái đoạn tô màu xanh lá cây.
Hiển nhiên, trong trường hợp file của bạn sẽ không giống hệt như cái đoạn minh hoạ ở trên rồi, nhưng nó vẫn nằm trong cấu trúc tương tự. Giờ thì bạn mở trình soạn thảo văn bản thô (Notepad nếu dùng Windows) hoặc code editor trên máy tính của bạn và chế biến nó trông như sau:
Hình 5. Đoạn mã HTML cần dùng.
Vậy là bạn có đoạn HTML để có thể nhúng vào trang web của bạn rồi. Có thể làm ngay để xem thử.
Nếu bạn để ý kỹ, bạn không chỉ copy nguyên cái đoạn bôi màu xanh lá cây, mà bắt đầu luôn ngay từ đầu. Dễ dàng phải không nào.
Minh hoạ cho việc chúng ta vừa làm trông kết quả như sau:
Trong thực tế, nếu bạn thử nghiệm, người dùng mà không đăng nhập tài khoản Google (hoặc Gmail) của họ, họ sẽ không đọc được file PDF nhúng trên trang web của bạn đâu đấy.
Việc giải quyết cho người đọc không cần đăng nhập tài khoản Google của họ xin nhường lại cho bạn xử lý, đây là cách chúng tôi thường áp dụng để người đọc bài không nên làm theo như con vẹt mà cần phải có chút xoay xở để kỹ năng sử dụng máy tính, Internet ngày càng tốt hơn.
Tuy nhiên, chúng tôi gợi ý rằng bạn nên xem lại tuỳ chỉnh của bạn ở cái tương ứng với Hình 2 trong bài này.
Bài viết đầu tiên cho chuyên mục này, lẽ ra gọi mục là blog cho dễ chịu, với tên “chém gió” hơi kinh dị ấy nhỉ? Kể về thảm hoạ với máy tính xảy ra cách đây mấy ngày như tự an ủi, cũng để thấy rằng chỉ một phút lơ mơ, xuống hố cả nút.
À, mà nhất là các bạn có thái độ phân biệt vùng miền, tui xin được nói trước là tui là một kẻ xét trên bình diện địa lý văn hoá, ngôn ngữ học, là người sử dụng một thứ tiếng trộn lẫn, nấu lẩu thập cẩm tả pí lù. Tui nhiều lúc sử dụng giọng điệu chua ngoa, gây khó chịu, lúc khác lại sử dụng phương ngữ của các “người anh em” trong cộng đồng 54 dân tộc… Những điều này là không chủ ý, nó là một thứ tui không lý giải được tại sao như vậy. Đen Vâu cũng không lý giải được sao anh ấy nói giọng Bắc nhưng khi hát (đọc Rap) lại giọng Nam.
Một buổi sáng đẹp trời
Đó là một ngày đẹp trời, trời Nha Trang mưa ơi là mưa, mỗi ngày có nhiều đợt mưa khác nhau, mưa rồi tạnh, tạnh rồi mưa.
Buổi sáng như mọi ngày, lên văn phòng đâu đó tầm 7:30. Việc đầu tiên: bật máy tính; việc tiếp theo: nấu nước pha cà phê.
Trong lúc chờ đợi cà phê vừa pha đủ nguội để làm một tợp như mọi ngày, hắn bật máy tính lên kiểm tra lại code kiếc hôm qua chạy ra sao. Bỗng cảm thấy ngạc nhiên đến bất ngờ khi hiện lỗi lên, trong khi tối hôm qua vẫn chạy tốt. Sau khi đọc thông báo lỗi đã được bật error_reporting(E_ALL); trong php.ini, xác định vấn đề là hỏng chức năng Memcached.
Hoá ra là thư viện liên kết động của một mô-đun PHP cách sao đó hôm qua chạy tốt, hôm nay bỗng không nạp được.
Có lẽ việc tương thích kém, vì thế, hắn lấy mã nguồn về để build lại luôn các thứ, rồi ghép vào, mất hơn hai giờ. Trong lúc gom các thứ, đàng nào cũng mất công build from source, sẵn tiện, nâng cấp lên phiên bản mới nhất của bộ 3 AMP của máy chủ LAMP luôn thể.
Thảm hoạ đã được gieo mầm
Vì cấu trúc thư mục dài dòng nên mỗi lần gõ lệnh phức tạp, vậy là làm vài cái soft link để rút gọi lại, đỡ vất vả phải gõ. Như vậy, có đến 3 cửa sổ Terminal trên Ubuntu được mở ra để gõ lệnh.
Sau một hồi gõ lệnh nọ lệnh kia, lúc này xong xuôi. Mới nghĩ dọn dẹp bớt cái mớ bùng nhùng chuẩn bị cho build trước đó cần gỡ bỏ. Vậy là gõ lệnh rm để dọn dẹp. Đã rất cẩn thận là thường chuyển vào thư mục mới gõ để xoá sạch bên trong, tránh nhầm ra bên ngoài. Thế quái nào trong các cửa sổ Terminal lại có cái cửa sổ đang đứng ở thư mục gốc của user mặc định mà dấu nhắc trông như đang ở thư mục cần dọn dẹp. Khi gõ lệnh xong, chuyển ngay qua cửa sổ khác để xem việc download một mã nguồn khác bằng wget tới đâu rồi, và dời qua bàn bên để lấy cà phê uống.
Khi quay lại máy tính, nhìn vào một cửa sổ Terminal tim tím, thấy download vẫn đang nửa chừng, chuyển qua cửa sổ gõ lệnh xoá vừa nãy vẫn chưa thấy dấu nhắc lệnh xuất hiện trở lại. Dựng tóc gáy, nhận thấy có gì đó sai sai. Lẽ nào xoá có vài thư mục mỗi thư mục chừng vài chục MB mà lâu đến như vậy. Vội vàng Ctrl + C để ngắt lệnh.
Nhìn lại mới thấy lần cuối partition dành cho /home dung lượng 367GB chiếm 97%, giờ chỉ còn chiếm 41%. Như vậy đi tong một lượng dữ liệu tính theo MB lớn hơn số còn lại.
Thiếu kinh nghiệm trong việc giữ nguyên hiện trường trên Linux
Lẽ ra lúc này dừng tất cả những gì đang chạy trên máy tính lại, để yên máy vẫn bật đó để ngồi sang máy khác tra cứu trên mạng Internet xem nên làm gì tiếp theo.
Lúc bấy giờ, hoảng loạn quá nên tui đã shutdown máy theo đúng chức năng của hệ điều hành. Cái này tưởng đâu giữ nguyên hiện trường nhưng thật tai hại làm sao.
Sau khi shutdown, lẽ ra là lấy ổ cứng mang sang máy khác để xử lý ngay còn được. Đàng này dại dột boot lại máy để chạy USB cứu hộ nhằm xử lý. Khởi động UEFI nó nạp nhanh quá, lóng ngóng bấm phím để chuyển sang ưu tiên khởi động USB không kịp, Ubuntu trên ổ cứng lại khởi động như bình thường.
Đây là lúc mà các phần mềm chạy nền đã ghi đè lên những file, thư mục đã bị xoá bởi lệnh rm gây ra thảm hoạ kia khiến cho việc phục hồi bất khả thi.
Bản sao lưu trong ổ cứng ngoài?
Cứ mỗi một tuần tui đều sao lưu một lần. Hài hước thay, trong tình huống này việc sao lưu lại chẳng có ích gì. Mọi thứ hay ho làm trong tuần vừa rồi đều bay sạch. Những tập tin, thư mục vừa tạo ra mới là cái cần vì source code được viết ròng rã mấy tháng gần đây được tinh chỉnh, di chuyển qua lại, có nhiều thay đổi lớn so với các tuần trước đây.
Vậy là bản sao lưu ở ổ cứng ngoài gần như chỉ để yên tâm rằng những thứ xưa cũ còn đó, chứ không ích gì cho công việc tuần này.
Tốn mớ tiền chứ không đùa
Gỡ ổ cứng qua gắn qua máy khác, chép lại một file image dạng RAW để vọc.
Chép nguyên ổ cứng ra thành Raw Image
Ổ cứng sau đó được gửi đi Sài Gòn để người ta phục hồi. Có hỏi qua điện thoại, chỗ phục hồi có nói rằng hồi giờ chủ yếu phục hồi với file dạng NTFS chứ còn ext4 trên hệ GPT là họ cũng chưa từng làm nhưng họ làm ở cấp thấp hơn, hy vọng vớt vát được phần nào.
Với bản RAW chép lại từ ổ cứng, tui đã mount lên thành ổ cứng ảo và dùng Live USB để boot máy lên thử cứu xem sao. Tình hình ngày hôm nay đang như hình:
Đang vớt vát lại chút file còn sót lại
Ba ngày đã trôi qua, bây giờ máy vẫn đang chạy như này:
Đang chép vài file phục hồi ra ổ cứng ngoài
Có cái hay là hay chỗ nào?
Chuyển sang ngồi máy mới dùng tạm, cũng phải tiếp tục công việc chứ không thì nhiều thứ không kịp bàn giao cho khách.
Lâu ngày không dùng máy tính chạy Windows, ngồi vào máy Windows cảm thấy lạ lẫm gì đâu. Gõ lệnh cứ phải cố nhớ lại các lệnh ngày xưa (lần cuối dùng Windows là năm 2011, nếu không kể việc thỉnh thoảng dùng Windows chỉ để in file PDF mà không đụng gì khác) mình từng biết là gì, kiểu như ls gì lại phải dir, rồi muốn xem file, bên Linux có cat, bên Windows bó tay, tra cứu PowerShell cũng muốn… vỡ mật.
Trong lúc đang vò đầu bứt tai vì công việc đình trệ, loay hoay với cái máy tính Windows cà khổ thì có lúc phải ngồi dựa ngửa ra mà thở… và có đứa bạn rủ tối hôm đó đi ăn xả xui.
Nghe đi ăn cảm thấy có lý thiệt đó, thật hay nữa là khác. Tối đến, đi ngay và luôn, vậy là tối 2 đứa đi ăn, lúc tạnh lúc mưa. Ăn xong lại mò về văn phòng xem thử liệu có thử tự cứu được quái gì không? Hỏng bét, mặc dùng là thư mục home đã nằm ở partition riêng nhưng vì đã khởi động máy lên, các ứng dụng chạy ngầm ghi be bét vào thư mục .config khiến cho mọi thứ loạn cả lên, không chắc cứu được gì nhiều.
Bài học lịch sử được rút ra
Tất nhiên là nếu gặp lại một lần nữa như hiện nay sẽ cứ để cho lệnh rm chạy cho xong luôn. Trong lúc đó không làm gì khác, cũng không shutdown máy luôn. Sau khi lệnh chạy xong sẽ:
Trích xuất journal ra
Dùng ext4magic để chép file bị xoá được phục hồi ra ổ cứng gắn ngoài
Nhưng bài học phụ trợ cho kinh nghiệm này đó là cuối mỗi ngày phải bỏ thời gian sao lưu “thành quả” của ngày hôm trước cho chắc ăn. Nhỡ có thảm hoạ xảy ra như lần này cũng không đau thương cho lắm.