Gitlab — создать файл и обновить через API

Логика работы такая:

  • создаем файл в репозитории с нужным описанием
  • обновляем этот файл

Нужно создать создать ключ, заходим в пользовательские настройки, Access Tokens — пишем название, ставим нужны права и сохраняем, запомнив ключ.

Для начала нужно знать id проекта, его можно увидеть или в web-версии или выполнить запрос:

curl -GET -H 'Content-Type: application/json' --insecure --header 'PRIVATE-TOKEN: 123ABC' 'https://main-git.ru/api/v4/projects/Dima%2Fdima-tools'

В ответ придет Json, который будет будет содержать первый атрибут с именем id и номеров вашего проекта.

В Gitlab файл можно закачать как для использования в issue или merge request(в ответ придет markdown с ссылкой на файл для вставки). Запрос должен должен быть вот такой:

curl -i -k -H "PRIVATE-TOKEN: 123ABC" "https://main-git.ru/api/v4/projects/1/uploads" -X POST -F 'file=@testapi.txt'

В ответ придет вот такой ответ:
{"alt":"testapi.txt","url":"/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt","full_path":"/Dima/dima-tools/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt","markdown":"[testapi.txt](/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt)"}

Отсюда вот этот кусок :


[testapi.txt](/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt)

Его можно вставлять как markdown.

Второй вариант - это когда нам необходимо создать или обновить файл в нашем репозитории. Сначала создаем директорию app  и файл c именем main.c внутри нашего репозитория:

curl --insecure --request POST --header 'PRIVATE-TOKEN: 123ABC' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", "content": "some content", "commit_message": "create a new file"}' "https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain%2Ec"

В ответ получаем Json:

{"file_path":"app/main.c","branch":"master"}

Далее если мы хотим обновить этот файл выполняем запрос:
curl --insecure --request PUT --header 'PRIVATE-TOKEN: 123ABC' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname","content": "some content new", "commit_message": "update file"}' "https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain%2Ec"

curl --insecure --request PUT --header 'PRIVATE-TOKEN: 123ABC' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname","content": "some content new", "commit_message": "update file"}' "https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain%2Ec"

В ответ придет Json, что обновление произведено. Если вы попытаетесь закачать уже существующий с таким именем файл - будет выдано сообщение, что такой файл уже существует и повторно не будет закачано. 

Таким образом можно использовать эту возможность даже в Bash напрямую из под Linux, не используя при этом общепринятые языки программирования. Можно переделать его, например, в PHP через Curl.

PHP — найти и показать дубли в ассоциативном массиве

Есть ассоциативный массив $result_arr , нужно найти и показать дубли по имени определенного элемента ‘sku’.

//смотрим дубли
$arr_c = array_column($result_arr, 'sku');
$dupes = array_diff(array_count_values($arr_c), [1]);
var_dump($dupes);

Gitlab и fullchain сертификат для работы Runner

Если у вас Gitlab работает на субдомене, то для работы gitlab runners и вообще для работы https рекомендуется ставить сертификат, содержащий полную цепочку от вашего субдомена до корневого домена.

У нас имеется:

  1. .crt файл, содержащий открытую публичную часть нашего сертификата субдомена
  2. .key файл, содержащий приватный ключ субдомена
  3. .pem файл, содержащий публичную часть корневого сертификата домена

Закрытый ключь домена — your_domain_name.key
Первичный сертификат — your_domain_name.crt
Промежуточный сертификат — DigiCertCA.crt
Корневой сертификат — TrustedRoot.crt

.pem должен выглядеть примерно так:

Создание .pem файла с закрытым ключем для всей цепочки:

Make sure to include the beginning and end tags on each certificate. The result should look like this:

——BEGIN RSA PRIVATE KEY——
(your_domain_name.key)
——END RSA PRIVATE KEY——
——BEGIN CERTIFICATE——
(your_domain_name.crt)
——END CERTIFICATE——
——BEGIN CERTIFICATE——
(DigiCertCA.crt)
——END CERTIFICATE——
——BEGIN CERTIFICATE——
(TrustedRoot.crt)
——END CERTIFICATE——

Получается что наш .pem будет состоять из нескольких частей.

Дальше нам нужно из .pem сгенерировать приватный ключ:

openssl rsa -in fullchain.pem -out fullchain_private.key

Далее копируем наш получившийся fullchain_private.key в директорию /etc/gitlab/ssl/ и переименовываем его чтобы не запутаться в your_domain_name.key

Из файла .pem убираем приватный ключь и копируем его в директорию /etc/gitlab/ssl/ c именем your_domain_name.pem

Далее в конфиг файл добавляем строки (или меняем):

nginx[‘ssl_certificate’] = «/etc/gitlab/ssl/your_domain_name.pem»

nginx[‘ssl_certificate_key’] = «/etc/gitlab/ssl/your_domain_name.key»

Переконфигурируем Gitlab:

sudo gitlab-ctl reconfigure


Проверяем что все добавилось:

sudo openssl s_client -connect  your_domain_name:443 -showcerts /dev/null

C — диапазон случайных чисел от 10 до -10

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>

int main() { 
int tmp = 10;

 for (int i = 0; i < 20; i++){
     
      printf( "Cлучайное для числа %d из диапазона -10 до 10 = %d\n", tmp--, rand() % 21 + (-10));
 }
return 0; 
}

Что происходит именно в

rand() % 21 + (-10)

функция rand() выдаёт значение от 0 до 2^15 - 1 (32767)

rand() % 21 вычисляет остаток от деления полученного случайного числа на 21 (т.е. от 0 до 20).

поскольку остатки цикличны таким образом реализуется генерация случайного числа от 0 до 20 включительно

+ (-10) смещает случайное число влево на 10, т.е. вместо случайного числа в диапазоне 0..20 получается случайное число в диапазоне -10..10

Кидалы в Интернет — pbdq.net

Сайт гавно, берут деньги при этом не дают гарантий и клянутся что все сделают. При этом идут на контакт и после получения денег тишина. Никаких гарантий не дают, деньги вперед требуют. Принимают на Киви-кошелек, зарегистрированный на номере +79252542934 . Автор «Крик», пример его поста https://new.pbdq.net/topic/11798-pts-osago-notarialnye-blanki-diplomy-i-drugoe/

Дает почту sologrand@safemail.xyz , но похоже тоже подставная.

Остерегайтесь этого сайта и доменов на нем — все в одной связке чтобы кинуть.

Вывести из лог-файла Apache строки, которые находятся в интервале указанного времени.

Вот такая история…

По быстрому, чтобы не парить мозга с копированием кода можно просто выполнить команду:

wget https://raw.githubusercontent.com/solaryssky/PERL/main/apache_log_parser.pl && chmod 0777 ./apache_log_parser.pl

Использовать так:

./apache_log_parser.pl -s=13:00 -e=13:59 ./access.log

Linux Kali — подключаемся через RDP

Для включения RDP в Kali Linux нужно установить сервер XRDP далее включить автозагрузку

Устанавливаем cервер XRDP:

apt-get install xrdp

Запускаем и добавляем в атозапуск xrdp:

service xrdp start
service xrdp-sesman start
update-rc.d xrdp enable

Для более менее комфортной работы поменяй в настройках RDP качество изображения на 16bit и сделайте однотонную заставку на рабочий стол.

Долбанный Битрикс — как добавить локальное видео

Долбобитрикс почему то глючит и при вставке в статью ссылки на видео, через функционал который у него есть — просто тупо ничего не делает.

Короче в HTML5 можно видео вставить вот так

<video src="video.ogv" controls></video> 

И все нормально работает с локальным видео.

PHP — ворочаем большие массивы

Была задача сделать сверку 2 файлов в каждом по 1 млн. строк. Сверка на уровне базы занимала оочень продолжительное время, примерно сутки и более.
Как и сколько времени это займет на PHP если делать это в памяти через массивы?
Разбираемся.
Изначальный элемент 1 массива (один элемент для примера)
[0]=> string(128) «183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»

Изначальный элемент 2 массива (один элемент для примера)
[0]=> string(128) «183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»

Далее используем функцию array_flip – она возвращает массив наоборот, то есть ключи массива становятся значениями, а значения массива становятся ключами

И тогда:

Измененный элемент 1 массива станет таким
[«183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»]=> int(0)

Измененный элемент 2 массива станет таким
[«183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»]=> int(0)

Смысл этого в том, что далее мы будем сравнивать элементы не по значению элемента, а по ключам(это даст нам возможность схлопнуть массивы по одинаковым значениям ключей), которые сейчас у нас содержат значения элементов.

Далее запускаем скрипт и получаем строки из 2 файла, которых нет в 1 файле и записываем в результирующий файл

dima@Ubuntu:~/PHP/array_compare$ time php -d memory_limit=4G ./compare.php

Время выполнения скрипта у меня (но у меня стоит PHP7.2 )составило 12 секунд
Памяти мы потребили на момент выполнения 400 мб

Memory Consumption is 0.37 MB
Memory Consumption is 401.56 MB
real 0m12,664s
user 0m4,008s
sys 0m8,600s

Сам скрипт довольно простой, благодаря готовым функциям PHP и сейчас сам скрипт вот

//читаем 1 файл в массив
$a = file(«random_1.csv»);
//читаем 2 файл в массив
$b = file(«random_2.csv»);

//соритруем массивы
sort($a, SORT_STRING);
sort($b, SORT_STRING);

//функция для вычисления расхождений 1 массива от 2 массива
function large_array_diff($b, $a){
// меняем наборот в 1 массиве ключ и значение
$at = array_flip($a);
// меняем наборот во 2 массиве ключ и значение
$bt = array_flip($b);
//вычисляем расхождение массивов сравнивая ключи
$d = array_diff_key($bt, $at);
//возвращаем в функции массив-результат сравнения ключей
return array_keys($d);
}
//выполянем функцию подставляя массивы в качестве аргументов
$diff = large_array_diff($b, $a);
//пишем результат сравнения в файл
file_put_contents(‘compare_diff.csv’, $diff, FILE_APPEND);

Тест на PHP5.6 – более медленный чем 7 версия и больше жрет памяти.

Строки получились более длинными вот так например
0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;1

Результат сравнения двух файлов с 1 млн строк

  • времени работали 8 секунд
  • памяти пожрали 1Гб
  • в результирующий файл попало 1 млн строк (т.е разница между файлами 100%) Проверил потом diff – показал разницу всех строк
    [ium@0400hpium03 array_compare]$ diff random_1.csv random_2.csv | wc -l
    2000002
  • проверял на файлах с меньшим количеством строк, чтобы смотреть разницу – скрипт работает правильно, т.е ошибок нет при сравнении строк находит только разные.

[tnm@0400hp]$ time php -d memory_limit=4G ./compare.php

Memory Consumption is 0.22 MB
Memory Consumption is 1054.2 MB
real 0m8.286s
user 0m5.263s
sys 0m2.812s