Язык C — узнаем размер массива без шуму и пыли без sizeof

Я часто думаю о жизни и пришел к такому выводу, что многое в ней лишнее. Поэтому нафига нам подключаемые библиотеки если можно все написать самому. И пусть пузатый дядька по имени бизнес вытирая потные подмышки скажет нам делай бть… не как лучше, а как быстрее. В этот раз мы засунем ему болт в задний проход и пойдем своей дорогой.

Задача: нужно узнать длину массива, но без sizeof, ибо будем считать, что мы одни на планете и на все написанные ранее библиотеки «поклали прибор».

#include <stdio.h>

int main(void) {

//наш массивчик
int left[] = {2,67,89,200,100,100};

//узнаем размер массива без функции sizeof
int size = *(&left + 1) - left;
    printf("%d\n", size);    
  return 0;
}

Здесь следующее:

&left - указатель на массив из 6 элементов
(&left + 1) - адрес на 6 целых чисел - указатель на массив из 6 целых чисел
*(&left + 1) - тот же адрес, что и (&left + 1) , но тип указателя int *

Понятно что нифига асболютно не понятно. Что тут происходит подробно напишу позже.

Запись опубликована автором в рубрике С с метками .

Gitlab API — создание, обновление файла на PHP

Ранее я писал как можно через curl в Linux выполнить запрос в Linux на создание файла или его обновление в репозитории Gitlab через его API. Ниже показано как это сделать через Curl, но уже в PHP.

Получить информацию по репозиторию:

<?php
$headers = ['PRIVATE-TOKEN: 123ABC'];

$url = 'https://main-git.ru/api/v4/projects/Dima/%2Fdima-tools';

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                        
curl_setopt($curl, CURLOPT_URL, $url);

$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

var_dump($info);
var_dump($result);

Создать файл в репозитории:


<?php

$json_array = array("branch" => "master", "author_email" => "dima@example.com", "author_name" => "Firstname Lastname", "content" => "some content", "commit_message" => "create a new file");

$JSON = json_encode($json_array);

$headers = array('PRIVATE-TOKEN: 123ABC', 'Content-Type: application/json');
$url = 'https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                               
$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

Обновить файл в репозитории, при этом наполнить его содержимым из другого файла (create json array from file in php):


<?php

//читаем файл в строку, в файле должны быть переводы строк "\n" если хотите, чтобы в  //Gitlab была не одна строка без переносов
$hosts = file_get_contents('./file/hosts.txt');

$json_array = array("branch" => "master", "author_email" => "dima@russia.ru", "author_name" => "Red Dima", "content" => $hosts, "commit_message" => "update file");

$JSON = json_encode($json_array);

$headers = array('PRIVATE-TOKEN: 123ABC', 'Content-Type: application/json');
$url = 'https://main-git.msk.ru/api/v4/projects/1/repository/files/ansible%2Fhosts';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($curl, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                               
$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

var_dump($info);
var_dump($result);

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