четверг, 27 июня 2019 г.

Git удаление ветки из локального репозитория, после удаления ее через веб интерфейс

Если удалить ветку через веб-интерфейс, она остается в локальном репозитории даже если

git fetch origin

Для очистки от удаленной ветки нужно использовать опцию --prune

git remote prune origin --dry-run (для проверки) или
git fetch origin --prune

Ссылки

Python generate ssh key for server ssh access

Установка

pip3 install pycryptodome

Пример:

from os import chmod
from Crypto.PublicKey import RSA

key = RSA.generate(4096)
with open("id_rsa", 'wb') as content_file:
    chmod("id_rsa", 0o600)
    content_file.write(key.exportKey('PEM'))
pubkey = key.publickey()
with open("id_rsa.pub", 'wb') as content_file:
    chmod("id_rsa.pub", 0o600)
    content_file.write(pubkey.exportKey('OpenSSH'))

exportKey('PEM') exportKey('OpenSSH') PEM формат нужен для приватного ключа, OpenSSH - для паблик ключа.
В chmod permissions указаны в соответствии python-дружественным синтаксисом 0o600. 

Linux Nginx location

https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx/
http://world-blog.ru/nginx-location-regulyarnye-vyrazheniya
https://habr.com/ru/post/348206/

среда, 26 июня 2019 г.

Python OptionParser парсер аргументов строки запуска приложения

link
if __name__ == "__main__":
    parser = OptionParser()
    group = OptionGroup(parser, "Merge Options",
                        "By default, only issues with status "
                        "['To Test' and 'Pending'] will be merged")
    group.add_option("--merge-status-in-progress",
                     action="store_true",
                     dest="merge_in_progress",
                     default=False,
                     help="Merge issue branches with status"
                     "In progress + 100 % [default: False]")
    group.add_option("--merge-all-outdated-branches",
                     action="store_true",
                     dest="merge_all_outdated_branches",
                     default=False,
                     help="Merge all outdated branches")

    parser.add_option_group(group)
    (options, args) = parser.parse_args()

    if options.merge_all_outdated_branches:
        sys.exit(merge_outdated_branches())

    sys.exit(auto_merge(options.merge_in_progress))

Запуск app-merge.py --merge-status-in-progress и без опции вызовет выполнение функции auto_merge()app-merge.py --merge-all-outdated-branches вызовет выполнение функции merge_outdated_branches()

action="store_true" аргумент без параметров (--a)
action="store" аргумент с параметрами (--a 10)

Python форматирование даты

Дату из формата 2019-06-25T09:10:50 +0000 преобразовать в формат 25-06-2019

import datetime

datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y")

переменную v iso формата преобразуем в нужный формат %d-%m-%Y (+0000 - это %z)

Пример со сравнением дат:

current_date = datetime.datetime.now()

# дата старше на две недели в iso формате
curr_time_minus_two_weeks = datetime.datetime.isoformat(current_date - timedelta(weeks=2))

for br in branches:
    branches = project.branches.list(all=True)
    for k, v in br.commit.items():
        # check whether commited date older tnan current date in two weeks
        if k == "committed_date" and v < curr_time_minus_two_weeks:
            logger.info("Branch: %s", br.name)            
            logger.info("committed date %s is older than two weeks ago %s", datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y"), datetime.datetime.strptime(curr_time_minus_two_weeks, '%Y-%m-%dT%H:%M:%S.%f').strftime("%d-%m-%Y"))

PHP Laravel add user

Задача добавить нового юзера в приложение

php artisan tinker

>>> DB::table('users')->insert(['name'=>'MyUsername','email'=>'thisis@myemail.com','password'=>Hash::make('123456')])

вторник, 18 июня 2019 г.

Linux nginx proxy_pass

Make port with basic http authentication for json requests

server {
    listen 3001;

    location /
    {
        access_log off;
        error_log /var/log/nginx/error_gateway.log;

        auth_basic "gateway";
        auth_basic_user_file /etc/nginx/gateway;

        default_type application/json;
        proxy_pass http://127.0.0.1:3000;
    }
}

Python gitlab branches

List of branches with excluding protected branches and cherry-pick hotfix revert patch words in name of branches

        gitlab_abc = gitlab.Gitlab(GITLAB_URL, TOKEN, api_version=4)
        project = gitlab_abc.projects.get(ABC_PROJECT)

        branches = project.branches.list(all=True)
        for br in branches:
            if not(br.protected) and "cherry-pick" not in br.name and "revert" not in br.name and "hotfix" not in br.name and "patch" not in br.name:
                print("br.name: ", br.name)
                for k, v in br.commit.items():
                    if k == "committed_date":
                        print("committed_date: ", v)

br.name:  issue-1234
committed_date:  2019-05-15T14:39:35.000+00:00

пятница, 7 июня 2019 г.

Node debug app.js

В помощь по отлову ошибок

node --inspect app.js

help покажет доступные команды, 
run - запустить приложение, 
n (next) - выполнять строка за строкой
.exit - выйти

четверг, 6 июня 2019 г.

Facebook Permanent Page Access Token

Для скрипта, который отслеживает новые сообщения на странице, нужно получить постоянный токен (маркер в русском переводе)
Я добавлен в администраторы https://developers.facebook.com для нужного мне приложения.
Использую этот мануал https://stackoverflow.com/questions/17197970/facebook-permanent-page-access-token
1) Get Short-Lived Access Token
На этой странице, в инструментах https://developers.facebook.com/tools/accesstoken/ , есть краткосрочный токен/маркер
2) Generate Long-Lived Access Token (long_lived_access_token)
Если там нажать отладка/debug можно увидеть срок действия, если краткосрочный, то будет активна кнопка продлить маркер дотупа/токен. Поэтому второй пункт прошел не так как в мануале
3) Get User ID (account_id)
там же в отладке видно user ID
4) Get Permanent Page Access Token
https://graph.facebook.com/v2.10/{account_id}/accounts?access_token={long_lived_access_token}
В отладчике https://developers.facebook.com/tools/debug/accesstoken проверить статус

Отладка новых сообщений:
{app_id}/conversations?fields=updated_time,senders,unread_count
запускать с Permanent Page Access Token