============
== vtranq ==
============

Bootstrap Tips

Column sizes

REF: https://getbootstrap.com/docs/3.3/css/#grid

  • xs = extra small screens (mobile phones), <768px
  • sm = small screens (tablets), ≥768px
  • md = medium screens (medium desktops),≥992px
  • lg = large screens (large desktops), ≥1200px

You should usually classify a div using multiple column classes so it behaves differently depending on the screen size (this is the heart of what makes bootstrap responsive). eg: a div with classes col-xs-6 and col-sm-4 will span half the screen on the mobile phone (xs) and 1/3 of the screen on tablets(sm).

<div class="col-xs-6 col-sm-4">Column 1</div> <!-- 1/2 width on mobile, 1/3 screen on tablet) -->
<div class="col-xs-6 col-sm-8">Column 2</div> <!-- 1/2 width on mobile, 2/3 width on tablet) -->

NOTE: Grid classes for a given screen size apply to that screen size and larger unless another declaration overrides it (i.e. col-xs-6 col-md-4 spans 6 columns on xs and sm, and 4 columns on md and lg, even though sm and lg were never explicitly declared)

NOTE: if you don’t define xs, it will default to col-xs-12 (i.e. col-sm-6 is half the width on sm, md and lg screens, but full-width on xs screens)

  • Chủ yếu định nghĩa .col-md- dành cho desktop trở lên (tức ngầm apply cho col-lg) và .col-xs- dành cho phone và tablets (tức ngầm apply cho col-sm)

Alignments

<p class="text-left">Left aligned text.</p>
<p class="text-center">Center aligned text.</p>
<p class="text-right">Right aligned text.</p>
<p class="text-justify">Justified text.</p>
<p class="text-nowrap">No wrap text.</p>

Transformation

<p class="text-lowercase">Lowercased text.</p>
<p class="text-uppercase">Uppercased text.</p>
<p class="text-capitalize">Capitalized text.</p>

Text colors

<p class="text-muted">...</p>
<p class="text-primary">...</p>
<p class="text-success">...</p>
<p class="text-info">...</p>
<p class="text-warning">...</p>
<p class="text-danger">...</p>

Background colors

<p class="bg-primary">...</p>
<p class="bg-success">...</p>
<p class="bg-info">...</p>
<p class="bg-warning">...</p>
<p class="bg-danger">...</p>

Float

<div class="pull-left">...</div>
<div class="pull-right">...</div>

Caret

<span class="caret"></span>

Close button

<button type="button" class="close" aria-label="Close"><span aria-hidden="true">&times;</span></button>

Center

<div class="center-block">...</div>

Clear fix

<div class="clearfix">...</div

Images

<img src="..." class="img-responsive" alt="Responsive image">
<img src="..." alt="..." class="img-rounded">
<img src="..." alt="..." class="img-circle">
<img src="..." alt="..." class="img-thumbnail">

Accordion (Hugo version)

<style>
.panel-title {
	position: relative;
	cursor: pointer;
}

.panel-title::after {
    content: "\f106";
    color: #333;
    top: -2px;
    right: 0px;
    position: absolute;
    font-family: 'Line Awesome Free';
    font-weight: 900;
    -moz-osx-font-smoothing: grayscale;
    -webkit-font-smoothing: antialiased;
    display: inline-block;
    font-style: normal;
    font-variant: normal;
    text-rendering: auto;
    line-height: 1;
}

.panel-title.collapsed::after {
	content: "\f107";
}
</style>

<div class="panel-group" id="parent">
    {{range $index, $element := .items}}
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4 class="panel-title collapsed" data-parent="#parent" data-toggle="collapse" data-target="#panel-{{$index}}">{{$element.title}}</h4>
            </div>
            <div id="panel-{{$index}}" class="panel-collapse collapse">
                <div class="panel-body">{{$element.text}}</div>
            </div>
        </div>
    {{end}}
</div>

NOTES:

  • Khai báo thuộc tính data-parent cho các panel con trỏ đến id của panel group nếu muốn tại một thời điểm chỉ show maximum 1 panel

Worklog - Week 04/10

MỤC TIÊU:

  • Hoàn chỉnh template và nội dung cho dev.vms
  • Finalize phần accounting 2020 cho VMS và cập nhật các báo cáo năm trước 2019
  • Plan nội dung và launch phiên bản draft cho cargotek cho các giải pháp logistics/warehouse
  • In phiếu thu cho OLC

PHÁT SINH:

  • Genome: thêm chức năng copy genes và lọc theo 1 list các gene
  • Import to CLINVAR table using Rust in dev/rust/hello, dùng cargo run --release
  • Thêm cột ADDITIONAL_USER_CLNSIGN trong phần kết quả filter, nhưng tạm thời không cần query db vì trong data file đã có sẵn thông tin Clinvar_CLNSIG rồi

VMS

Line Awesome

  • Line Awesome is a free, icon-based outline font created as an alternative to Font Awesome 5.11
  • Line Awesome consists of ~1380 flat line icons that offer complete coverage of the main Font Awesome icon set.
  • While Font Awesome is optimized for 14×14 px, Line Awesome looks great in 32×32 px
  • Icon can have 3 styles: regular, solid or brand. For each style there is a corresponding class: lar, las or lab.
  • Danh sách các icon: https://iconos8.es/line-awesome
<link href="https://unpkg.com/line-awesome@1.3.0/dist/line-awesome/css/line-awesome.min.css" rel="stylesheet"/>

Usage:

<i class="las la-angle-left"></i>

OLC

  • In phiếu thu từ sales invoice

How to Fix Let Encrypt Certificate Error

Vấn đề

  • Có rất nhiều website/app sử dụng free SSL certificate của Let’s Encrypt, mà SSL này là con của CA root DST Root CA X3
  • Ngày 30/10/2021 thì DST Root CA X3 hết hạn nên các website sử dụng SSL certificate của Let’s Encrypt sẽ bị báo lỗi
  • Let’s Encrypt đã xử lý vấn đề này từ lâu bằng cách thay DST Root CA X3 bằng CA root mới là ISRG Root X1. Nếu các máy tính / client có cài ISRG Root X1 này rồi thì sẽ không bị vấn đề gì với việc DST Root CA X3 bị hết hạn
  • Tuy nhiên, vấn đề ở đây là có nhiều máy tính không được cập nhật ISRG Root X1, ví dụ, do họ tắt chức năng Windows Update đi chẳng hạn. Khi đó các máy này sẽ bị báo lỗi invalid SSL certificate (vì các máy này không chấp nhận ISRG Root X1)

Giải pháp

  • Hoặc: các website này phải thay SSL certificate bằng một cái mới, thuộc một CA root nào đó mà các máy tính đang hỗ trợ
    • Ví dụ như thay bằng free SSL certificate cung cấp bởi ZeroSSL.com
  • Hoặc: cập nhật lại hệ điều hành / hoặc chạy Windows Update để hệ điều hành cập nhật thêm ISRG Root X1 vào hệ thống
  • Hoặc: tải ISRG Root X1 về và cập nhật bằng tay ISRG Root X1 vào hệ thống
  • Hoặc: sử dụng trình duyệt Firefox. Trình duyệt này đã tự động hỗ trợ ISRG Root X1 nên không bị lỗi invalid SSL certificate như trên

Hướng dẫn

Tạo SSL certificate với ZeroSSL.com

cd ~
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m myemail@example.com
(restart terminal)
acme.sh -h
  • Bước 3: tạo SSL certificate
(vào webroot của domain cần tạo SSL)
acme.sh --issue -d example.com -w .

hoặc:

acme.sh --issue --nginx -d example.com -d www.example.com

Nếu muốn debug thì thêm --debug 2 vào cuối các câu lệnh trên

  • Bước 4: gắn SSL certificate vừa tạo vào cấu hình nginx của website tương ứng, như ví dụ sau:
server {
	server_name example.com www.example.com;
    server_tokens off;
    index index.html;

    location / {
        root /space1/customers/example.com/www/hugo/public/;
    }

    listen   443;
    ssl    on;
    ssl_certificate        /root/.acme.sh/example.com/fullchain.cer;
    ssl_certificate_key    /root/.acme.sh/example.com/example.com.key;

    error_page 404 /404.html;
}
  • Bước 5: service nginx reload và kiểm tra trên browser xem certificate đã được cập nhật mới chưa

Cập nhật bằng tay ISRG Root X1

Active
   ISRG Root X1 (RSA 4096, O = Internet Security Research Group, CN = ISRG Root X1)
       Self-signed: der, pem, txt
  • Bước 3: install certificate này bằng cách nhấp đúp lên tập tin isrgrootx1.der. Sau đó chọn để install vào phần Trusted Root Certificates
  • Bước 4: Kiểm tra lại bằng certmgr.msc xem certificate ISRG Root X1 đã vào trong hệ thống chưa
  • Bước 5: Kiểm tra lại trên browser xem website còn bị lỗi certificate hay không

Worklog - Week 27/09

MỤC TIÊU:

  • Hoàn chỉnh template và nội dung cho dev.vms
  • Finalize phần accounting 2020 cho VMS và cập nhật các báo cáo năm trước 2019
  • Plan nội dung và launch phiên bản draft cho cargotek cho các giải pháp logistics/warehouse
  • Kết xuất ra Excel để import vào hóa đơn điện tử

VMS

OLC

  • Kết xuất ra Excel để import vào hóa đơn điện tử
    • Làm trên dev.olc trước
      • Branch on_nfsnk_2

SSL

Install ACME.SH

REF: https://github.com/acmesh-official/acme.sh

cd ~
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m myemail@example.com
(restart terminal)
acme.sh -h
  • Tạo certificate
(vào webroot của domain cần tạo SSL)
acme.sh --issue -d example.com -w .

hoặc:

acme.sh --issue --nginx -d example.com -d www.example.com
  • Debug

Nếu muốn debug thì thêm --debug 2 vào cuối các câu lệnh trên

  • Cấu hình nginx như ví dụ sau:
server {
	server_name example.com www.example.com;
    server_tokens off;
    index index.html;

    location / {
        root /space1/customers/example.com/www/hugo/public/;
    }

    listen   443;
    ssl    on;
    ssl_certificate        /root/.acme.sh/example.com/fullchain.cer;
    ssl_certificate_key    /root/.acme.sh/example.com/example.com.key;

    error_page 404 /404.html;
}

All the certs will be renewed automatically every 60 days.

However, you can also force to renew a cert:

acme.sh --renew -d example.com --force

Misc

Using ZeroSSL’s free-forever plan you can register three 90-day certificates entirely free. You’ll never need to pay for them, just renew every few months.

ZeroSSL also offers a variety of packages for simplifying your SSL management. The Basic package for example starts at $8/month and offers unlimited 90-day certificates, and even three 1-year certificates so you can renew annually and forget about them the rest of the time.

cd /root/.acme.sh/example.com
cat certificate.crt ca_bundle.crt >> fullchain.cer

NOTE: trong /root/.acme.sh/example.com đã có vietml.com.key rồi, giờ chỉ cần merge certificate.crt ca_bundle.crt để tạo fullchain.cer

Fix Let’s encrypt error in Windows 7

  • Bước 1: download các certificate về: https://letsencrypt.org/certificates/
  • Bước 2: install các certificate này
    • one tip is to make sure you double click the .der file to install it. Do not try to Import using certmgr.msc or Google Chrome.
  • Bước 3: Kiểm tra lại bằng certmgr.msc

Cách khác: nếu dùng trình duyệt Firefox sẽ không bị lỗi certificate expired này

Takeaways

  • Nên dùng Stripe cho nghiệp vụ thanh toán
  • ZeroSSL gói free thì trên dashboard chỉ được tạo 3 SSL free, nhưng nếu mình dùng acme.sh trên console thì có thể tạo không giới hạn các certificates

Refererences

Javascript Tips

Add / remove class

var element = document.getElementById('element');
element.classList.add('class-1');
element.classList.add('class-2', 'class-3');
element.classList.remove('class-3');

Modify CSS

document.getElementById("navbar").style.padding = "80px 10px";
document.getElementById("logo").style.fontSize = "35px";

Hide menu on scroll-down and show menu on scroll-up

(function () {
    var lastScroll = 0;

    window.onscroll = function() {
        var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
        var navbar = document.getElementById("navbar");

        if (currentScroll > 80) {
            navbar.classList.add('scrolled');
        } else {
            navbar.classList.remove('scrolled');
        }

        if (currentScroll > 300 && lastScroll <= currentScroll){
            navbar.classList.add('unpinned');
        }else{
            navbar.classList.remove('unpinned');
        }

        lastScroll = currentScroll;
    };
})();

Và khai báo CSS như ví dụ sau:

#navbar.scrolled {
    background-color: #fff;
    margin-top: 15px;
}
#navbar.scrolled .navbar-nav > li > a {
    color: #337ab7;
}
#navbar.scrolled #logo {
    stroke: #337ab7!important;
}
#navbar.unpinned {
    transform: translateY(calc(-100% - 5px));
}

Hugo Tips

Check if a partial template exists

{{ $partialPath := printf "headers/%s.html" .Type }}
{{ if templates.Exists ( printf "partials/%s" $partialPath ) }}
    {{ partial $partialPath . }}
{{ else }}
    {{ partial "headers/default.html" . }}
{{ end }}

Get image size

{{ $imgData := imageConfig "themes/mainroad/static/img/avatar.png" }}

<p><code>avatar.png</code> is {{ $imgData.Width }} pixels wide and
    {{ $imgData.Height }} pixels high.</p>

Check if image exists

<!-- Image path on file system -->
{{ $imgPath := "/static/static/images/hugo-gopher.png" }}

<!-- Check whether the path exists -->
{{ if fileExists $imgPath }}

    <!-- Load image data with imageConfig and insert it with `<img>` -->
    {{ $img := imageConfig $imgPath }}
    <img src="/static/images/hugo-gopher.png"
        width="{{ $img.Width }}" height="{{ $img.Height }}"
        alt="Hugo Gopher">

{{ else }}

    <!-- Trigger an error message with that the file or path couldn't be found -->
    {{ errorf "Specified file at %s not found." $imgPath }}

{{ end }}

Check if a file exists

{{ if fileExists "/themes/mainroad/static/img/avatar.png" }}
    <img src="/img/avatar.png" alt="Author avatar" width="90" height="90">
{{ end }}

Check if a directory exists

{{ $postFolder := "/content/post/" }}
{{ if fileExists $postFolder }}

    <p>There's a 'post' content folder. These are its files:</p>

    {{ range readDir $postFolder }}
        {{ .Name }}<br>
    {{ end }}

{{ end }}

Suport SCSS

  • Tạo tập tin /themes/<themename>/assets/scss/style.scss với nội dung ví dụ như:
@import 'sections/next.scss';
@import 'sections/cta.scss';
@import 'sections/whitepaper.scss';
@import 'custom.scss';
  • Trong partials/head.html, gắn code như ví dụ sau:
{{ $styles := slice }}
{{ $styles := $styles | append (resources.Get "scss/style.scss" | resources.ExecuteAsTemplate "style.scss" . | toCSS) }}
{{ $styles := $styles | resources.Concat "/css/style.css" | minify | fingerprint "sha512"}}
<style type="text/css">{{$styles.Content | safeCSS}}</style>

Cho phép markdown & shortcode con bên trong shortcode cha

Shortcode con khi render sẽ ra html; như vậy nội dung shortcode cha sẽ có chứa html; do đó, phải cấu hình để cho phép HTML, nếu không HTML sẽ bị obmitted

Thêm vào cấu hình trong file config.toml như sau:

[markup]
  [markup.goldmark]
    [markup.goldmark.renderer]
      unsafe = true

Khi đó, cho phép ta dùng shortcode như ví dụ sau:

{{`<row class="bg-pattern ptb50"`>}}

{{`% column `%}}
### Title

Text

![](image.png)
{{`% /column `%}}

{{`% column `%}}
### Title

Text

![](image.png)

{{`<button "Download" "https://www.example.com"`>}}

{{`% /column `%}}

{{`</row`>}}

Lưu ý: có 2 cách gọi shortcode

  • Cách 1, dùng {{<>}}`: cách này sẽ không parse markdown bên trong (nếu có)
  • Cách 2, dùng {{%%}}`: cách này có parse markdown bên trong (nếu có)

.Pages vs .RegularPages

  • A regular page is a “post” page or a “content” page.
    • A leaf bundle is a regular page.
  • A list page can list regular pages and other list pages. Some examples are: homepage, section pages, taxonomy term (/tags/) and taxonomy (/tags/foo/) pages.
    • A branch bundle is a list page.

.Site.Pages : Collection of all pages of the site: regular pages, sections, taxonomies, etc. – Superset of everything!

.Site.RegularPages : Collection of only regular pages.

The above .Site... page collections can be accessed from any scope in the templates.

Pagination

REF: https://gohugo.io/templates/pagination/

Để cấu hình pagination thì thêm vào trong config.toml

paginate = 10

Khi đó, có thể hiển thị danh sách các posts trong một paginated page như sau:

{{ $paginator := .Paginate (where site.RegularPages "Section" "==" "blog") }}
{{ range $paginator.Pages }}
<div class="col-md-6">
    {{ .Render "article" }}
</div>
{{ end }}

Để hiển thị thanh paginator thì cách đơn giản nhất là dùng như sau:

{{ template "_internal/pagination.html" . }}

Range with index

<div class="panel-group" id="accordion">
    {{range $index, $element := .items}}
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4 class="panel-title" data-toggle="collapse" data-target="#panel-{{$index}}">{{$element.title}}</h4>
            </div>
            <div id="panel-{{$index}}" class="panel-collapse collapse">
                <div class="panel-body">{{$element.text}}</div>
            </div>
        </div>
    {{end}}
</div>

Minify HTML output

hugo -D --minify

Target 2021

2021

  • Triển khai phiên bản mới website VMS
  • Finalize phần accounting 2020 + 2021 cho VMS
  • Đưa An Phú vào hệ thống accounting
  • Đưa Anh Vũ vào hệ thống accounting
  • Launch & sales trên cargotek
  • Launch & sales gnot
  • Triển khai cho các domain khác

Tháng 9

  • Finalize phần accounting 2020 cho VMS và cập nhật các báo cáo năm trước 2019
  • Ghi nhận tất cả số liệu 2021 của VMS vào hệ thống, và cho phép chạy thử ra báo cáo tài chính

Tháng 10-12

  • Triển khai phiên bản mới website VMS
  • Triển khai cargotek
  • Landing page cho phần genome

Worklog - Week 20/09

MỤC TIÊU:

  • Template và nội dung ban đầu cho dev.vms

VMS

  • Implement bare structure cho trang /services (chỉ cần load các thông tin text lên là được)
    • content/services/_index.md
      • Khai báo cho slider
  • Implement các building blocks
  • Implement trang /services
    • Có slider gồm những featured content có liên quan chung đến services
  • Error: tại sao trang http://dev.vietmaisolutions.com/services/blockchain/ ko show nội dung bên trong lên?
    • Fixed: là do phần code định nghĩa nội dung bị đặt nhầm ngoài frontmaster
  • Implement trang /services/a-specific-service/
    • Có slider gồm những featured content có liên quan đến service này
  • [3] Implement trang /services/a-specific-service/overview.html
  • Implement trang /about
  • Implement trang / (home)
  • Implement một trang thông thường có khai báo header_background: https://www.infosys.com/newsroom/features/2021/best-big-companies-work-for-2021.html
  • [2] Implement một trang thông thường khác: https://www.infosys.com/services/data-analytics/case-studies/future-of-retail-demand.html
  • Các section riêng có thể có menu riêng
    • Các trang nằm trong careers thì có menu riêng –> khai báo trong [[menu.careers]]
    • Các trang nằm trong services thì có menu riêng –> khai báo trong [[menu.services]]
  • Dùng fontawesome 4.7.0
  • Dùng font Myriad pro
  • SVG logo, font Inconsola với generator là https://danmarshall.github.io/google-font-to-svg-path/
  • Error: Chưa lấy được baseURL để show trên header
    • Fixed: tất cả các biến khai báo trong config khi lấy ra thì đều phải uppercase ký tự đầu tiên –> site.BaseURL, hoặc .Site.BaseURL hoặc $.Site.BaseURL đều trả cùng kết quả
  • Toggle / hide top menu khi scroll
  • Thay remote images trong css bằng static images
  • CSS/JS nào kích thước nhỏ thì embed vào HTML luôn
  • Check responsive style trên phone
  • Tách riêng file SCSS cho các section khác nhau (nhưng khi build ra thì merge các file lại với nhau)

OLC

  • Kết xuất ra Excel để import vào hóa đơn điện tử

Python

ML

  • Paper mới: A Novel Handwritten Digit Classification System Based on Convolutional Neural Network Approach

Hugo

SVG

  • In order to create an SVG file, you need to have a vector version of the logo or illustration
  • Creating an SVG file, or Scalable Vector Graphics file, to use for your website can be done with fairly simple design tools like Adobe Illustrator, Photoshop, or Corel Draw.
  • Tạo SVG từ text + Google Font: https://danmarshall.github.io/google-font-to-svg-path/

Misc

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link rel="stylesheet" type="text/css"
          href="style.css"/>
</head>

<body>

<h1>Generated from: http://www.cufonfonts.com</h1><br/>
<h1 style="font-family:'Myriad Pro Regular';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Condensed';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Condensed Italic';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Light';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Semibold';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Semibold Italic';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Bold Condensed';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Bold';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Bold Italic';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>
<h1 style="font-family:'Myriad Pro Bold Condensed Italic';font-weight:normal;font-size:42px">AaBbCcDdEeFfGgHhŞşIıİi Example</h1>


</body>
</html>

Takeaways

  • Nên dùng Stripe cho nghiệp vụ thanh toán

Centos vs Ubuntu

Centos
  • CentOS is a better choice for the enterprise than Ubuntu. That’s because CentOS is more secure and more stable. Plus, when you enlist enterprise support for CentOS, it’s a top choice for enterprise Linux
  • The biggest difference between the two Linux distributions is that Ubuntu is based on the Debian architecture while CentOS is forked from Red Hat Enterprise Linux. In Ubuntu, you can download DEB packages using the apt-get package manager.
  • CentOS is considered to be a more stable distribution compared to Ubuntu
  • Ubuntu is a more secure system than Debian. Debian is considered a much stabler system and is much easier to manage than Ubuntu
  • Ubuntu server has a great deal of support for container and cloud deployments which makes it superior to CentOS in this domain
  • CentOS is more stable and supported by a large community. Debian has relatively less market preference.
  • Oracle Linux. The closest alternative option to CentOS 8 Linux with RPM package management is the Oracle Enterprise Linux or OEL. It is also free and open source but for support, the user has to pay, otherwise, the rest of everything is free to use just like CentOS
  • In December 2020, Red Hat, which had acquired the CentOS project, abruptly announced a change in its focus in the wake of Red Hat’s acquisition by IBM. The company announced that the latest version, version 9, would end support at the end of 2021, much shorter than the 10-year schedule Red Hat had promised earlier, in favor of the rolling-release CentOS Stream development version. Support for Version 8 will end in 2024 as scheduled
  • CentOS Linux 8, as a rebuild of RHEL 8, will end at the end of 2024
  • The future of the CentOS Project is CentOS Stream
  • CentOS Stream is less stable than CentOS 8. CentOS Stream will get updates before RHEL while CentOS 8 did get them after RHEL
  • There will not be a CentOS Linux 9
  • Updates for the CentOS Linux 7 distribution continue as before until June 30, 2024

Rocky Linux

  • After the termination of CentOS 9 support, developers at CentOS have released a new distribution named Rocky Linux
  • Like the original CentOS, Rocky is a free drop-in replacement for RHEL
  • Images are available for both x86-64 and ARM processors. For each architecture, there are “Minimal”, “DVD”, and “Boot” options. The definition of “Minimal” seems relative because it weighs in at 1.73 GB
  • Rocky Linux 8.4 is binary compatible with the Red Hat Enterprise Linux 8.4. Hence it is powered by stable Linux Kernel 4.8 at the core
  • Rocky Linux isn’t a rolling release distribution—it will be more like CentOS than CentOS now is
  • Rocky Linux cloud platforms include Amazon Web Services (AWS) and Google Cloud Platform, but the project suggests it will be expanding these options soon
  • If you rely on CentOS and you don’t want to run CentOS stream or pay for RHEL, you could very well consider Rocky Linux when a stable version becomes available

Download

AlmaLinux

  • AlmaLinux OS is an open-source, community-driven project that is built from the source code of Red Hat Enterprise Linux (RHEL)
  • AlmaLinux was officially released on March 30 2021. It’s a binary compatible fork of RHEL 8.3
  • AlmaLinux was maintained by CloudLinux, a company that provides server hosting.
  • 1:1 RHEL and CentOS compatible. AlmaLinux OS is the only 100% community owned and governed, open source, and forever-free, enterprise-grade Linux distribution
  • CentOS replacement AlmaLinux will be available on Azure Marketplace at no extra software cost, and Microsoft will sponsor a global mirror network for the operating system,
  • AlmaLinux was created by CloudLinux, who is backing the new CentOS fork at the tune of $1 million annually. That’s some serious coin to put up for an operating system. CloudLinux gets it; they know how important CentOS has been over the years, and how much it will continue to mean to both the Linux community and enterprise-class businesses
  • As a non-profit 501(c)(6) organization, AlmaLinux will be led by a governing board for the newly-created AlmaLinux Open Source Foundation.
  • SecureBoot is not available with AlmaLinux
  • AlmaLinux was named after the Latin word for “soul” to honor the vital role of community contributions in its creation
  • CloudLinux has committed a $1 million dollars annual endowment to support the project

Download

AlmaLinux vs. Rocky Linux

  • Both AlmaLinux and Rocky Linux are RHEL-rebuilds that have emerged in response to the Red Hat announcement on Dec 8, 2020.
  • With both projects coalescing to fill the same vacuum that will be left by CentOS 8, both should be relatively identical. Not only to each other, but to the upstream RHEL release that they are rebuilt from. Where we expect to see differences is in release lag, responsiveness to bug reports, communication and transparency of the project leads.
  • Google Cloud hỗ trợ chính thức cho RockyLinux, nhưng không chính thức cho AlmaLinux
# gcloud compute images list | grep rocky
rocky-linux-8-v20210817                               rocky-linux-cloud    rocky-linux-8                                 READY

# gcloud compute images list --project almalinux-cloud --no-standard-images
NAME                   PROJECT          FAMILY       DEPRECATED  STATUS
almalinux-8-v20210817  almalinux-cloud  almalinux-8              READY

CONCLUSION: Tiếp tục sử dụng Centos 7, không cần upgrade lên 8 làm gì, và next OS để trial sẽ là RockyLinux (vì tinh thần của người sáng lập CentOS)

Rust and Cargo - Getting Started

TAKE-AWAY:

  • Cài đặt Rust
  • Dùng cargo để tạo, build và run một project
  • Đọc file Excel .xlsx từng dòng một

Cài đặt Rust

cd $HOME
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
rustup update
rustc --version
cargo --version

Dùng cargo để tạo, build và run một project

mkdir ~/projects
cd ~/projects
cargo new hello_world
cd hello_world
cargo build
cargo run
(hoặc muốn chạy nhanh hơn thì: cargo run --release)

Đọc file Excel .xlsx từng dòng một

Dùng thư viện calamine để đọc file Excel.

  • Thêm vào Cargo.toml
[dependencies]
calamine = "*"
  • Edit lại code trong src/main.rs
use calamine::{Reader, open_workbook, Xlsx};
use std::time::{Duration, Instant};

fn main() {
    let start = Instant::now();

    let mut excel: Xlsx<_> = open_workbook("/path/to/test.xlsx").unwrap();

    let mut count = 0;

    if let Some(Ok(r)) = excel.worksheet_range("Sheet1") {
        for row in r.rows() {
            for _col in row.iter() {
                //println!("{:?}", col);
            }
            count += 1;
        }
    }

    let duration = start.elapsed();

    println!("DONE! {:?} rows in {:?}", count, duration)
}
  • Build và chạy chương trình: cargo run --release

Ref

Previous Page 3 of 4 Next Page