+7

Misc notes of frequently used commands

Intro

Đây là một số những command mình hay dùng (hoặc khó nhớ quá, lần nào cũng phải search lại). Note lên đây để lưu trữ, biết đâu lại có ích cho ai đó 😆

  • Disclamer 1: Có nhiều lệnh anti-pattern, anti-security. Use at your own risk. Mình ko chịu trách nhiệm đâu nhé 😆
  • Disclamer 2: RTFM !
  • Disclamer 3: Nêu lưu thành bash alias, dùng cho tiện 😄

Flask Babel

Gần đây mình có thêm i18n vào cho 1 app bằng Flask, sử dụng flask_babel, thấy khá là dễ dùng, tuy nhiên còn 1 số chỗ mắc mà trong docs ko có.

Cài đặt

pip install Flask-Babel

Trong config.py thêm

BABEL_DEFAULT_LOCALE = 'vi'
BABEL_DEFAULT_TIMEZONE = 'UTC'
BABEL_TRANSLATION_DIRECTORIES = os.path.join(basedir, 'translations')

với basedir là đường dẫn đến thư mục root của project. Mình thấy ko có dòng cuối thì flask babel ko nhận được thư mục dịch.

Thêm các getter sau:

@babel.localeselector
def get_locale():
    # if a user is logged in, use the locale from the user settings
    user = getattr(g, 'user', None)
    if user is not None:
        return user.locale
    # otherwise try to guess the language from the user accept
    # header the browser transmits.  We support de/fr/en in this
    # example.  The best match wins.
    return request.accept_languages.best_match(['de', 'fr', 'en'])

@babel.timezoneselector
def get_timezone():
    user = getattr(g, 'user', None)
    if user is not None:
        return user.timezone

trong app/__init__.py

from flask_babel import Babel, gettext

app.config.from_object('config')
babel = Babel(app)

trong docs hiện vẫn là flask.ext.babel như vậy sẽ báo lỗi import, thay như trên sẽ import được. Thường các package flask.ext.* nếu lỗi đều có thể thay như vậy.

Thêm babel.cfg vào thư mục gốc:

[python: app/**.py]
[jinja2: app/templates/**/*.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

chạy

pybabel extract -F babel.cfg -o messages.pot .
# hoặc
pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .

Thêm bản dịch

pybabel init -i messages.pot -d translations -l ja

Import trong các file view mà chúng ta dùng

from flask_babel import gettext, ngettext, _

thường thì sẽ sử dụng _ là chính. Ví dụ:

msgid "You've joined team <strong>%(name)s</strong> !"

Compile file *.po.

pybabel compile -d translations

Bạn có thể dùng extension Run on Save để tự động hoá việc compile mỗi lần save file. Ví dụ:

"emeraldwalk.runonsave": {
    "commands": [
        {
            "match": "\\.po$",
            "isAsync": true,
            "cmd": "${workspaceRoot}/venv/bin/pybabel compile -d ${workspaceRoot}/translations"
        }
    ]
}

MySQL

Dump DB để backup

mysqldump --opt --host=0.0.0.0 --user=user_name_here -ppassword_here db_name_here > backupDB/XXX.sql

(Not recommend vì sẽ lưu pass trong bash history 😆 )

Sửa lại start id từ 1

ALTER TABLE tbl AUTO_INCREMENT = 1;

Combo tạo user và DB (chôm của anh Trần Đức Thắng)

CREATE USER "admin"@"localhost" IDENTIFIED BY "admin_la_dep_trai";
CREATE DATABASE my_db CHARACTER SET utf8;
GRANT ALL ON my_db.* to admin@localhost;
FLUSH PRIVILEGES;

Đổi pass user

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

Tạm tắt foreign key check để truncate DB (cho nhanh)

SET foreign_key_checks = 0;

Alembic

Tạo revision mới dựa trên thay đổi model.

alembic revision --autogenerate -m "Added account table"

Celery

celery -A app.celery worker --concurrency=10 -lDEBUG --logfile tmp/celery.log

celery -A app.celery flower --address=0.0.0.0 --port=1337

Combo seek-and-destroy: tìm tất cả các process của celery và kill. Dùng được cho tất cả các thể loại process kiểu master-worker khác: nginx, erl,...

ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9

Remove *.pyc files

find . -name "*.pyc" -exec rm -rf {} \;

JQuery

Lấy ra danh sách các event handler. Giờ chắc không ai dùng JQuery mấy nữa rồi.

jQuery._data(document.getElementById('_chatText'), "events" );

Docker

docker run -t -i ctf_tools /bin/bash

Xoá các images bị "mồ côi" và container đã exit.

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

Redis

Xoá hàng loạt key trong redis

redis-cli KEYS "matrix6*" | xargs redis-cli DEL

Regex

Nên đọc (nhưng mà chưa có thời gian)

http://www.regular-expressions.info/lookaround.html

Disk usage

Check dung lượng các thư mục và sắp xếp theo thứ tự giảm dần

sudo du --max-depth=1 | sort -nr

Create Ubuntu desktop icon

Cài đặt

sudo apt-get install gnome-panel
gnome-desktop-item-edit ~/Desktop/ --create-new

và chỉnh sửa lại icon, đường dẫn.

Python Inspect

import code; code.interact(local=locals())

Gunicorn

gunicorn -w 4 -b 0.0.0.0:4000 app:app --reload --daemon --error-logfile error.log --access-logfile access.log

gunicorn -w 2 -b 0.0.0.0:4000 app:app --reload --daemon

gunicorn -k gevent -w 4 -b 0.0.0.0:4000 app:app --reload --daemon --error-logfile error.log --access-logfile access.log

Muốn chạy với gevent (async) thì cần cài thêm

pip install gevent

Batch resize GIF images

mogrify -resize "80x80>" -quality 100 -format gif -path resized *.gif

dùng cho việc thêm emo vào Chat++. Với image bình thường có thể dùng convert.

Show IP addresses

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Batch replace in files

grep -lr "MyProject" . | grep -v ".git" | xargs sed -ie 's/MyProject/AwesomeProject/g'

SQLAlchemy

Cú pháp ORM so sánh với None và kiểm tra IN

ClassName.id.in_()

ClassName.id.isnot(None)

ClassName.id == None

(~ClassName.id.any(ClassName.id.in_()))

PostgresSQL

initdb -D /usr/local/var/postgres/

/usr/local/Cellar/postgresql/10.3/bin/createuser -s postgres
psql -U postgres -h localhost

tail /usr/local/var/log/postgres.log

Ethereum

web3.personal.unlockAccount('0xE0ca...c1f7', 'mypass')

List connection on port

lsof -Pn -i4 | grep 1935

Setup auto-restart service

Thuận tiện cho việc chạy 1 file liên tục, tự động restart khi bị chết.

easy_install supervisor

File config

sudo vim /etc/supervisor/supervisord.conf
[supervisord]
logfile = /tmp/supervisord.log
user = nguyen.anh.tien

[program:tcp_sudoku]
directory=/home/nguyen.anh.tien/tcp_sudoku
command=python sudoku_service.py
stderr_logfile=sudoku.log
stdout_logfile=sudoku.log
autostart=true
autorestart=true

Extra

Gần đây có phát hiện ra app Boostnote chuyên dùng để take-note cho lập trình viên khá đẹp, khá tiện, hỗ trợ đồng bộ qua Dropbox ❤️


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.