Rust — увеличить по счетчику значение в HashMap

Я использовал хэш-таблицу в качестве дедубликатора имени ключа. Аналог ассоциативного массива в PHP, когда есть имя ключа и его значение и необходимо добавлять новые значения по имени ключа, при этом нам не нужно каждый раз дублировать эти имена ключей- они должны быть уникальными. Но при этом нам нужно для каждого ключа увеличить его значение, например на +1.

use std::collections::HashMap;
fn main() { 
     
let mut fruits:HashMap<String, i32> = HashMap::new();  

fruits.insert(String::from("sds"), 122); 

fruits.insert(String::from("qqqq"), 22);    

fruits.entry("sds".to_string()).and_modify(|count| *count += 1).or_insert(0);  

let first_fruit = fruits.get("sds"); //123    

println!("{:?}", first_fruit);}

Пример на Replit тут

RabbitMQ — отправка и чтение очереди через curl

Данный запрос можно делать даже из bash в Linux так как используются стандартные инструменты.

Все необходимое (обменник, очереди) можно создать через WEB-интерфейс RabbitMQ Managment. Предполагаем , что они уже созданы.

Отправляем сообщение в очередь.

В примере ниже :

vhost — имя хоста (exchanges)

delivery_mode 2 — записываем в режиме когда данные очереди сохраняются даже после падения сервера (сохраняются на диск)

routing_key — имя нашей очереди

payload — в данном случае строка , которую мы передаем в сообщении

%2F/amq.default — имя обменника внутри хоста

curl -s -u user:password -H "Accept: application/json" -H "Content-Type:application/json" -X POST -d'{
    "vhost": "Test_Virtual_Host",
    "properties": {
        "delivery_mode": 2,
        "headers": {}
    },
    "routing_key": "testqueues",
    "payload":"/dfgdfgfd/dfgdfg/dfgdfgfdg.dat",
    "headers": {},
    "props": {},
    "payload_encoding": "string"
}' http://127.0.0.1:15672/api/exchanges/%2F/amq.default/publish

Читаем сообщение.

curl -s -u user:password -H "content-type:application/json" -X POST -d'{
"count":2,
"ackmode":"ack_requeue_false",
"encoding":"auto",
"truncate":5000
}' http://127.0.0.1:15672/api/queues/%2F/testqueues/get

Удалить обменник через curl.

curl -s -u admin:1234567890 -X DELETE http://127.0.0.1:15672/api/vhosts/Test_Virtual_Host

Rust — счетчик в ведущими нулями

Задача:  вывести счетчик с ведущими нулями, пример 0001, 0002 и т.д.

Задача не сложная, но не стандартная и предполагает несколько вариантов реализации. Мой вариант реализован на том, что мы считаем длину стандартного int счетчика и в зависимости от нее добавляем перед ним нужно количество нулей, которые у нас являются уже строкой.

fn main(){
  
  (1..1002).for_each(|n| {
        let _str: String = n.to_string();
        let lenght = _str.len();    
        let mut _zero = String::from("000");

        if lenght == 2{
            _zero = String::from("00");
        }
        else if lenght == 3{
            _zero = String::from("0");
        }
        else if lenght == 4{
            _zero = String::from("");
        }
    
      println!("{}{}",_zero, n);
});
  
    
}

Реализация этого же через match:

fn main(){
  
  (1..1002).for_each(|n| {
        let _str: String = n.to_string();
        let lenght = _str.len();    
        
    match lenght {
        2 => {println!("00{}", n);}
        3 => {println!("0{}", n);}
        4 => {println!("{}", n);}
        _ => {println!("000{}", n);}
    }
        
    
});
  
    
}

Rust — вырезать подстроку с начала и конца строки

fn main() {

    let str = "/app/dima/var/test_log.stat.json";  
    //cut "/app/dima/var/"
     let slice = &str[14..];
    //cut ".stat.json"
     let len = slice.len() - 10;
    let substr = &slice[..len];  
    
     println!("{}", substr);
}

Логика такая:

  1. сначала удаляем путь — он содержит в данном случае постоянную длину.
  2. удаляем путь
  3. вычисляем длину строки
  4. удаляем длину подстроки .stat.json

Пример работающего кода

Rust — вывести тип переменной

/*
show me type of variable
use example: println!("{}",variable.type_name());
*/
pub trait AnyExt {
    fn type_name(&self) -> &'static str;
}

impl<T> AnyExt for T {
    fn type_name(&self) -> &'static str {
        std::any::type_name::<T>()
    }
}

fn main() {
let num = 1; 
println!("{}",num.type_name());
}

Результат в данном случае будет :

i32

Язык 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);