golang собеседования подготовка
https://go.dev/
https://gobyexample.com/
https://metanit.com/go/tutorial/
6 собесов
https://www.youtube.com/watch?v=_rTuAY7b1RE
Сайты
Книги
Задачи для изучения
https://www.youtube.com/watch?v=tjOZ_lhj0vM
https://www.youtube.com/watch?v=aFD4RMn5Jgs
Как управлять своим вниманием?
Управление вниманием - это важный навык, который может помочь вам повысить производительность, концентрацию и эффективность. Вот несколько стратегий, которые могут помочь вам управлять своим вниманием:
1. Поставьте ясные цели: Определите, что именно вы хотите достичь. Когда у вас есть четкая цель, вам легче сосредотачиваться на задаче.
2. Установите приоритеты: Определите, какие задачи наиболее важны, и сначала занимайтесь ими. Это поможет избежать размазанного внимания.
3. Используйте методы планирования: Создайте план или расписание для своих задач. Многие люди находят полезным использовать методы, такие как метод Помодоро (работа в интервалах) или GTD (Getting Things Done).
4. Избегайте многозадачности: Многозадачность может разбить ваше внимание. Лучше сосредотачивайтесь на одной задаче, пока она не будет выполнена, а затем переходите к следующей.
5. Удалите отвлекающие факторы: Избегайте соблазнов, которые могут отвлечь вас, такие как социальные сети, уведомления на телефоне или беспокойства. Возможно, вам потребуется выключить уведомления на время работы.
6. Практикуйте медитацию и осознанность: Медитация и практики осознанности могут помочь улучшить контроль над вашим вниманием и снизить стресс.
7. Заботьтесь о своем физическом здоровье: Здоровое питание, регулярное физическое упражнение и достаточный сон могут существенно повысить вашу способность к концентрации.
8. Постоянно развивайтесь: Учите новые навыки и знания. Интерес к тому, чем вы занимаетесь, может улучшить вашу способность к сосредоточенности.
9. Практикуйте фокусировку внимания: Попробуйте упражнения для тренировки внимания, такие как чтение, решение головоломок или медитация на точке.
10. Отдыхайте и расслабляйтесь: Регулярные перерывы и отдых также важны для поддержания высокой концентрации. Не забывайте давать мозгу время для восстановления.
Помните, что управление вниманием - это навык, который развивается со временем, и каждый человек уникален, поэтому вам может потребоваться экспериментировать, чтобы найти наиболее эффективные стратегии для себя.
Каждую минуту проверять:
тем ли ты занимаешься, что приводит тебя к цели?
Планирование И выделение ограниченоого времени
Твоё внимание - это энергия, не расходуй её зря
Воспринимайте внимание как деньги
Представьте, что ваше внимание — это деньги. У вас ограниченное количество этой валюты. В течение дня вы можете тратить её на «дорогие» и «недорогие» задачи. Серьёзная работа, чтение, значимые для вас дела требуют больше единиц внимания, но стоят меньше. Маловажные дела вроде пролистывания соцсетей требуют меньше внимания, но обходятся дороже. В этом парадокс внимания.
Сосредоточьтесь на задачах, которые имеют для вас наибольшую ценность
На пути к любой цели есть несколько задач, которые важнее всего для успеха. Если пренебрегать ими и заниматься другими делами, у вас будет ощущение занятости, но продуктивность будет страдать.
Откажитесь от многозадачности
Она вредит и продуктивности, и способности работать сосредоточенно.
Знайте, что для вас важнее всего
Говорите «нет» всему, что не соответствует вашим главным приоритетам. Определите их и стройте свой день в соответствии с ними, уделяя им основное внимание.
BLUETOOTH в Arch Linux
ДЛЯ РАБОТЫ С USB BLUETOOTH-МОДУЛЕМ в Arch Linux требуется установить пакет bluez.
1. Убедитесь, что ваш пакетный менеджер и база данных пакетов обновлены:
```
sudo pacman -Syu
```
2. Установите bluez:
```
sudo pacman -S bluez
```
3. Запустите демона Bluetooth и включите его автозагрузку:
```
sudo systemctl start bluetooth.service
sudo systemctl enable bluetooth.service
```
4. Перезагрузите компьютер.
После этого ваш USB Bluetooth-модуль должен заработать в Arch Linux. Чтобы проверить, что он работает, выполните команду:
```
hciconfig
```
Она должна показать устройство Bluetooth с поддержкой Host Controller Interface (HCI). Если такой вывод есть, значит, ваш USB Bluetooth-модуль успешно подключен.
УСТАНОВКА ЯДРА LIQUORIX KERNEL
INSTALL
Debian / Ubuntu / Arch: Install Script
curl -s 'https://liquorix.net/install-liquorix.sh' | sudo bash
ПОСМОТРЕТЬ ЛОГИ ОШИБОК ПРОГРАММ:
journalctl -b -p 3 _COMM=steam
или journalctl -xe
ОБНОВЛЕНИЕ, ДОПОЛНЕНИЕ ЗЕРКАЛ:
https://archlinux.org/mirrors/status/
nano /etc/pacman.d/mirrorlist
После добавления обновить командой sudo pacman -Syu
ФОТОШОП
Для работы фотошопа требутся доп библиотеки в winetricks:
arch linux
btrfs лучше ext4
Так как снимки моментальнеые
Запись в rufus-4.1p.exe
Выбираем DD Запись для линукса
Для вайфай
iwctl
device list
station wlan0 scan
station wlan0 get-networks
station wlan0 connect НазваниеСети
Пароль вифи
exit
ping -c2 archlinux.org
archinstall
budgie
Nvidia propri
multilib // Это чтоб 32 битные шли на 64
Игровое ядро
sudo pacman -S linux-zen
sudo pacman -S linux-lts
sudo mkinitcpio -p linux-lts // Выбор ядра по умолчанию
sudo bootctl update // Для systemd-boot
выбрать ядро в ручную
sudo nano /boot/loader/entries/3434.conf
sudo pacman -Syu // Обновить систему
Установка
sudo pacman -S mc nano htop wget bash-completion unzip zip firefox chromium neofetch wireguard-tools telegram-desktop notepadqq kate flameshot vlc ktorrent discord krita baobab net-tools nvidia-settings ntfs-3g exfat-utils gwenview micro
timeshift
sudo pacman -S flatpak
flatpak install flathub com.visualstudio.code -y &&
flatpak install flathub com.brave.Browser -y &&
flatpak install flathub org.onlyoffice.desktopeditors -y &&
flatpak install flathub org.videolan.VLC -y &&
flatpak install flathub org.kde.krita -y &&
flatpak install flathub org.sqlitebrowser.sqlitebrowser -y &&
flatpak install flathub com.anydesk.Anydesk -y &&
flatpak install flathub org.filezillaproject.Filezilla -y
Если надо ещё
atom obs-studio blender hardinfo gimp libreoffice gparted bash mc transmission-cli kolourpaint inkscape gimp
https://pingvinus.ru/programs/
Удаление
pacman -Rs gimp
Поиск
sudo pacman -Ss steam
Инфо об
pacman -Si steam
Все возможные
sudo pacman -Ss
sudo pacman -Ss >> list.txt
Всё что поставил
pacman -Q
pacman -Q | grep steam
ctrl esc - открывает диспетчер задач как в винде
ctrl alt t - консоль
Arch после установки
Если не запускается оболочка, то зажимаем alt жмём f2 и ждём
https://nobaraproject.org/
Магазин
https://flathub.org/
Установка
sudo dnf install flatpak
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
Bottles - wine
flatpak install flathub com.usebottles.bottles
Установка прав
flatpak override --user --filesystem=/home/admin/windowsapps
Крорбки
flatpak install flathub org.gnome.Boxes
Запустить
flatpak run com.visualstudio.code
Установленны список
flatpak list -d --app --runtime
Удалить
flatpak uninstall telegram
flatpak uninstall org.mozilla.firefox
flatpak --user uninstall com.mojang.Minecraft
flatpak --system uninstall com.mojang.Minecraft
sudo dnf remove xbacklight
dnf install timeshift
Установить
sudo dnf install firefox telegram timeshift htop mc nano neofetch gwenview micro wireguard-tools -y
flatpak install flathub com.brave.Browser -y &&
flatpak install flathub com.visualstudio.code -y &&
flatpak install flathub com.notepadqq.Notepadqq -y &&
flatpak install flathub org.onlyoffice.desktopeditors -y &&
flatpak install flathub org.videolan.VLC -y &&
flatpak install flathub org.kde.krita -y &&
flatpak install flathub org.sqlitebrowser.sqlitebrowser -y &&
flatpak install flathub com.anydesk.Anydesk -y &&
flatpak install flathub org.filezillaproject.Filezilla -y
Старые
flatpak install flathub org.mozilla.firefox -y &&
// Быстрый просмотр картинок
flatpak install flathub de.haeckerfelix.Fragments
flatpak install flathub io.github.Figma_Linux.figma_linux
flatpak install flathub com.sweethome3d.Sweethome3d
flatpak install flathub com.github.bjaraujo.Bombermaaan
flatpak install flathub com.obsproject.Studio
flatpak install flathub uk.org.greenend.chiark.sgtatham.putty
flatpak install flathub org.blender.Blender
flatpak install flathub org.flameshot.Flameshot
flatpak install flathub org.libretro.RetroArch
flatpak install flathub org.ppsspp.PPSSPP
// Вектор рисовалка
flatpak install flathub org.inkscape.Inkscape
// Схемы рисовалка
flatpak install flathub com.jgraph.drawio.desktop
// Игра с блоками Майн стрелялка
flatpak install flathub jp.yvt.OpenSpades -y
%Y-%m-%d %k:%M
// Видеоредакторы
shotcut kdenlive
Горячие клавиши
win p - на каком мониторе показывать
win пробел - меж языками
ctrl alt t - terminal
ctrl alt стрелочки - рабочие столы
Возня с драйверами на видюху
sudo dnf remove nvidia
sudo kroko-cli autoinstall
// Показать все
rpm -qa
// Поиск по показам всех
rpm -qa | grep nvidia525-core
sudo dnf remove nvidia525-core.x86_64
sudo dnf search nvidia525-core
sudo dnf install inxi nvidia525-core nvidia-settings -y
inxi -G
sudo kroko-cli get-gpus
sudo kroko-cli best-driver
sudo kroko-cli autoinstall
Кто такой умный человек?
Тот, кто может
1. Находить ответы на вопросы
2. Принимать эффективные решения
3. Предвидеть последствия
php сжимаем изображения
<pre><?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$text = '/upload/articles/53066/1673596122_594V.jpg
/upload/articles/52994/1671542002_ZkJ7.jpg
/upload/articles/52928/1670425735_3049.jpg
/upload/articles/52928/1670425738_97P9.jpg
/upload/articles/52931/1670427197_BE52.jpg
/upload/articles/52928/1670425728_m3L7.jpg';
$text_webp = str_replace('.jpg', '.webp', $text);
$links = explode("\n", $text);
$links_webp = explode("\n", $text_webp);
// print_r($links_webp); exit();
$imagePath = $_SERVER['DOCUMENT_ROOT'].$links[0];
$sourceImage = imagecreatefromjpeg($imagePath);
//$sourceImage = imagecreatefrompng($imagePath);
if ($sourceImage) {
// Получаем ширину и высоту оригинального изображения
$originalWidth = imagesx($sourceImage);
$originalHeight = imagesy($sourceImage);
// Устанавливаем максимальную ширину
$maxWidth = 720;
$newWidth = $originalWidth;
$newHeight = $originalHeight;
if ($originalWidth > $maxWidth) {
$newWidth = $maxWidth;
$newHeight = round($originalHeight * $maxWidth / $originalWidth);
}
// Создаем новое изображение с измененным размером
$resizedImage = imagecreatetruecolor($newWidth, $newHeight);
// Копируем и изменяем размер оригинального изображения в новое
imagecopyresampled($resizedImage, $sourceImage, 0, 0, 0, 0, $newWidth, $newHeight, $originalWidth, $originalHeight);
$outputPath = $_SERVER['DOCUMENT_ROOT'].$links_webp[0];
$quality = 80;
if (file_exists($outputPath))
unlink($outputPath);
imagewebp($resizedImage, $outputPath, $quality);
imagedestroy($sourceImage);
imagedestroy($resizedImage);
echo 'good '.$outputPath.'<br>';
} else {
echo 'NOT '.$outputPath.'<br>';
}
Сжать js через linux ubuntu консоль
sudo apt update
sudo apt install nodejs
sudo apt install npm
sudo npm install uglify-js -g
uglifyjs main.js -o main.min.js
топ
sudo npm install terser -g
terser main.js -o main.min.js --compress --mangle --mangle-props
npm install clean-css-cli -g
cleancss -o output.min.css input.css
Для сжатия JavaScript файлов через консоль Ubuntu, вы можете использовать утилиту uglifyjs. Убедитесь, что она установлена на вашей системе. Если она не установлена, вы можете установить её с помощью npm (Node.js Package Manager):
Установите Node.js и npm, если они еще не установлены. Вы можете установить их с помощью следующих команд:
sudo apt update
sudo apt install nodejs
sudo apt install npm
Установите uglify-js глобально с помощью npm:
sudo npm install uglify-js -g
Теперь, когда uglifyjs установлен, вы можете использовать его для сжатия JavaScript файлов. Перейдите в каталог, содержащий ваши JS файлы, и выполните команду:
uglifyjs yourfile.js -o yourfile.min.js
Замените yourfile.js на имя вашего JavaScript файла, который вы хотите сжать, и yourfile.min.js на имя, которое вы хотите использовать для сжатой версии файла.
После выполнения этой команды, у вас будет сжатая версия JavaScript файла с расширением .min.js в том же каталоге. Вы можете использовать эту сжатую версию в своем проекте.
Обновление Nodejs
Для обновления Node.js с версии 12.22.9 на более свежую версию в Ubuntu, вы можете воспользоваться утилитой n, которая упрощает управление версиями Node.js. Вот как это сделать:
Установите n с помощью npm (если у вас его ещё нет):
sudo npm install -g n
Затем, используйте n для установки более свежей версии Node.js. Вы можете выбрать версию, которую хотите установить. Например, чтобы установить последнюю стабильную версию:
sudo n stable
Если вы хотите установить конкретную версию, например, Node.js 14:
sudo n 14
После успешной установки новой версии Node.js, вы можете проверить, что версия была обновлена, выполнив:
node -v
Это должно показать новую версию Node.js.
Обратите внимание, что после обновления версии Node.js, вам может потребоваться обновить глобальные npm-пакеты, которые вы установили ранее. Вы можете сделать это, выполнив
npm update -g.
Как правильно завершать собеседования
Спасибо Вам что пришли,
Мы вынуждены сейчас закончить собеседование,
Мы посовещаемся, если придём к выводу, что ваша кандидатура нам подходит, то вышлем ещё тестовое задание
Переменные для cmd в windows
Как в windows сделать так, чтоб запуск был по короткой команде php ? C:\Users\Home\Downloads\php-8.2.10-nts-Win32-vs16-x64\php.exe main.php
Чтобы сделать так, чтобы вы могли запускать PHP-скрипты в командной строке Windows с использованием короткой команды php, вам нужно добавить путь к исполняемому файлу PHP в системную переменную PATH. Вот как это сделать:
Откройте "Панель управления" в Windows.
Перейдите в раздел "Система и безопасность" (или "Система", в зависимости от версии Windows).
Нажмите на "Система" (или "Дополнительные параметры системы") слева.
В открывшемся окне выберите вкладку "Дополнительно".
Нажмите кнопку "Переменные среды".
В разделе "Системные переменные" найдите переменную "Path" и выберите её, затем нажмите "Изменить".
В появившемся окне "Изменение системной переменной" нажмите "Новый" и введите путь к папке, где находится исполняемый файл PHP. Например, добавьте C:\Users\Home\Downloads\php-8.2.10-nts-Win32-vs16-x64\ в список переменных.
Нажмите "ОК", чтобы закрыть все окна и сохранить изменения.
Теперь вы можете запускать PHP-скрипты в командной строке, используя команду php:
php main.php
Теперь команда php будет выполнять скрипты, как вы описали в вашем вопросе.
Тест устройств
Тест камеры
https://ru.webcamtests.com/
Тест микрофона
https://webcammictest.com/ru/check-mic.html
Linux создать ссылку
ln -s /sdcard/golang golang
Bash Linux
// Доступное место быстрый просмотр
df -h (df -i для узлов, записи расположений файлов)
// Узнать размер вес размер папки (s этой папки, h норм формат)
du -hs /var/* | sort -hr
du -hs /home
du -h file.txt
du -sh /var/www/joyeshop.ru/*
du -sh /
du -hd1 /
// Переходы
cd /var/www
cd www
cd ..
// Что в папке
ls
// Где я
pwd
// Создать папку
mkdir NAME
// Удалить
rm FOLDER -rf
https://itproffi.ru/kak-uznat-razmer-papki-v-linux/
// Инфа о файле
stat file.txt
Архив
sudo apt install zip unzip
zip -r /path/to/files/*
unzip archive.zip
-d удалить файл из архива
-r - рекурсивно обходить каталоги
-0 - только архивировать, без сжатия
-9 - наилучший степень сжатия
-F - исправить zip файл
-e - шифровать файлы
zip -9 file.zip data-dump.sql
Развернуть SQL
mysql -u "root" -p"PASS" BDNAME --force < "/root/file.sql"
sql Добавить если нет
У скольких не хватает комментов
SELECT COUNT(*)
FROM articles
WHERE publish = 'prod'
AND id NOT IN (SELECT article_id FROM article_flag)
Включить комменты не хватающим
INSERT INTO article_flag (article_id, flag_id)
SELECT id, 3
FROM articles
WHERE publish = 'prod'
AND id NOT IN (SELECT article_id FROM article_flag)
Какие необходимо сделать проекты, чтоб набраться опыта по golang?
Для набора опыта по Golang рекомендуется выполнить следующие проекты:
1. Создание веб-приложения: Разработайте простое приложение, используя фреймворк Golang, такой как Gin или Echo. Этот проект поможет вам понять основы маршрутизации HTTP, обработки запросов и создания REST API.
2. Система обработки очередей: Разработайте систему обработки очередей с использованием пакета RabbitMQ или Apache Kafka. Это позволит вам понять асинхронную обработку сообщений и распределение задач между различными воркерами.
3. Веб-скрапер: Разработайте программу, которая будет извлекать данные с веб-страниц и сохранять их в базу данных. Используйте пакеты goquery для извлечения данных и GORM для работы с базой данных.
4. Разработка CLI-инструмента: Создайте командную строку (CLI) инструмент, который будет выполнять операции взаимодействия с файловой системой или сетью. Вы можете использовать пакет cobra для создания интерфейса командной строки.
5. Микросервисная архитектура: Разработайте небольшое приложение, состоящее из нескольких микросервисов, которые взаимодействуют друг с другом с использованием протокола gRPC или REST API. Это позволит вам ознакомиться с архитектурой микросервисов и понять, как разделить функциональность приложения на отдельные компоненты.
Эти проекты помогут вам применить и углубить ваши знания по Golang и познакомиться с некоторыми распространенными библиотеками и пакетами.
Ubuntu перезапустить
reboot
LEMP
> /var/log/nginx/error.log
nano /var/log/nginx/error.log
du -h /var/log/nginx/error.log
> /var/log/nginx/access.log
nano /var/log/nginx/access.log
du -h /var/log/nginx/access.log
> /var/log/php8.1-fpm.log
nano /var/log/php8.1-fpm.log
du -h /var/log/php8.1-fpm.log
nano /etc/php/8.1/fpm/php.ini
display_errors = On
/etc/php/8.1/fpm/conf.d
nano /etc/nginx/sites-enabled/joyeshop.ru.conf
nano /etc/nginx/sites-enabled/armango.com.conf
service nginx restart
service php8.1-fpm restart
service mysql restart
чтоб увеличить количество php воркеров
nano /etc/php/8.1/fpm/pool.d/www.conf
pm.max_children поменял с 5 на 16
service php8.1-fpm restart
termux android fedora
start-fedora.sh
#!/data/data/com.termux/files/usr/bin/bash
cd $(dirname $0)
## unset LD_PRELOAD in case termux-exec is installed
unset LD_PRELOAD
command="proot"
command+=" --kill-on-exit"
command+=" --link2symlink"
command+=" -0"
command+=" -r fedora-fs"
if [ -n "$(ls -A fedora-binds)" ]; then
for f in fedora-binds/* ;do
. $f
done
fi
command+=" -b /dev"
command+=" -b /proc"
command+=" -b fedora-fs/root:/dev/shm"
#command+=" -b /data/data/com.termux/files/home:/root"
command+=" -b /sdcard"
command+=" -w /root"
command+=" /usr/bin/env -i"
command+=" HOME=/root"
command+=" PATH=/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/games"
command+=" TERM=$TERM"
command+=" LANG=ru_RU.UTF-8"
#command+=" LANG=C.UTF-8"
command+=" /bin/bash --login"
com="$@"
if [ -z "$1" ];then
exec $command
else
$command -c "$com"
fi
start_vnc.sh
#! /bin/bash
rm -f /tmp/.X1-lock &&
rm -f /tmp/.X11-unix/X1 &&
vncserver :1 -geometry 1280x1280
#800x800
#1024x768
start_vnc_keyboard.sh
#! /bin/bash
rm -f /tmp/.X1-lock &&
rm -f /tmp/.X11-unix/X1 &&
vncserver :1 -geometry 2000x1024
#800x800
#1024x768
vncpasswd
127.0.0.1:5901
golang book 14
Записать в файл
func SaveString(fileName string, text string) error {
err := ioutil.WriteFile(filename, []byte(text), 0600)
return err
}
ограничение области видимости через if
if err := saveString("a.txt","hi"); err != nill {
log.Fatal(err)
}
switch randIntn(3)+1 {
case 1:
fmt.Println()
case 2:
default:
}
он автоматом завершает текущий case
если так не надо, то fallthrough
utf8String := "бгж"
len( длина в байтах
для количества символов
unicode/utf8
utf8.RuneCountInString(
535
segmentString := []rune("привет")
newSegment:= segmentString[3:]
обрезает первые 3 символа
а если превращать в []bute(
то не работает на рус буквах,
так как они по 2байта
в цикле может быть строка, она обработается по символам
точнее по рунам
буферизованные каналы
channel := make(chan string, 3)
3 определяет размер буфера
при отправке значение в буфере
chanel <- "s"
и горутина продолжает работать
если буфер переполнен, то будет блокировка
при извлечении ланных они так же по одному, начиная с первой отправки, ьудут приниматься
http://headfirstgo.com/
https://go.dev/doc/effective_go
чем на golang отличается слайсы от массива?
В Go массивы и слайсы являются двумя разными типами данных, имеющими разные свойства и функциональность.
Массивы в Go являются фиксированной длины последовательностью элементов одного типа. Длина массива задается при его объявлении и не может быть изменена в ходе выполнения программы. Адрес массива – адрес его нулевого элемента. Массивы в Go копируются при передаче в функцию или при присваивании другой переменной, поэтому любые изменения, сделанные внутри функции или в установленной переменной, не повлияют на исходный массив.
Пример объявления массива:
go
var a [5]int // массив из 5 элементов типа int
Слайс (срез) в Go является динамическим массивом, который представляет собой ссылку на последовательность элементов определенного типа. Длина слайса может быть изменена в ходе выполнения программы. Слайс содержит указатель на массив, длину и емкость (capacity). При добавлении элементов в слайс, если длина превышает емкость, будет создан новый массив с большей емкостью, элементы будут скопированы в новый массив, а старый массив будет уничтожен. Если слайс передается в функцию или присваивается другой переменной, копируется только сам слайс, а не его содержимое. Это означает, что любые изменения, сделанные внутри функции или в установленной переменной, будут отражены в исходном слайсе.
Пример объявления слайса:
go
var s []int // слайс из элементов типа int
Таким образом, основное отличие между массивами и слайсами в Go заключается в возможности изменять длину слайса, а также в том, что массивы копируются при присваивании, а слайсы – нет.
php Отображать все ошибки
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
sql запрос на копирование структуры таблицы
sql запрос, который показывает, какой sql запрос необходим на создании такой же таблицы
SHOW CREATE TABLE tableName;
golang book 13
480
html шаблоны формы отправки
html/template
481
func check(err error) {
if err != nil {
log.Fatal(err)
}
view.html
import "html/template"
html, err := template.ParseFiles("view.html")
запись содержимого в writer
err := html.Execute(writer, nil)
485
text/template тоже самое, но более опасен
text := "ttttttt"
tmpl, err := template.New("test").Parse(text)
err := tmpl.Execute(os.Stdout, nil)
вместо записи в вывод браузера, записывает в вывод консоли
os.Stdout работает как файл, но он сразу выводится
count, err := os.Stdout.Write([]byte("hello"))
{{}}
tmpl, err := template.New("test").Parse("123{{.}}456")
err := tmpl.Execute(os.Stdout, 42)
условие в шаблонах
"start{{if .}}123{{end}}555"
"{{range .}}({{.}}){{end}}"
выводит все элементы массива
[]string("do", "re","mi")
Для структур
"Name: {{.Name}}"
так же можно условие
{{if .Active}}
чтение из файла записи
492
execute может передать только один аргумент, чтоб передать несколько, создавайте структуру
потом поля структуры в шаблон ставятся так
{{.count}}
{{range .list}}
{{end}}
html, err := template.ParseFiles("index.html")
data := myStruct{
name : "aaaa"
}
err := html.Execute(os.Stdout, data)
498
ввод данных в формах
func createHandler(writer http.ResponseWriter, request *http.Request) {
text := request.FormValue("inputName")
_, err := writer.Write([]byte(text)
}
переписать код с 504
func createHandler(writer http.ResponseWriter, request *http.Request) {
singature := request.FormValue("singature")
options := os.O_WRONLY | os.O_APPEND | os.O_CREATE
file, err := os.OpenFile("singatures.txt", options, os.FileMode(0600))
checkErr(err)
_, err = fmt.Frintln(file, singature)
checkErr(err)
err = file.Close()
checkErr(err)
}
при отправку данных на отдельной странице принимаем их, после делаем редирект
302
http.Redirect(writer, request, "/books", http.StatusFond)
Переписать весь код 508 и 509
открыть файл
go doc os OpenFile
go doc os O_RDONLY
func main() {
file, err := os.OpenFile("file.txt", os.O_WRONLY, os.FileMode(0600))
checkErr(err)
_, err = file.Write([]byte("text1\n"))
checkErr(err)
err = file.Close()
checkErr(err)
os.O_WRONLY переписать часть файла
os.O_APPEND дописать в конце файла
для просмотра двоичного представления данных
fmt.Printf("%3d: %08b\n", 7, 7)
побитовые операторы
&
|
fmt.Printf("true && false == %t\n", true && false)
fmt.Printf("%b & %b == %b\n", 0, 1, 0&1)
fmt.Printf("%08b\n", 170)
fmt.Printf("%08b\n", 15)
fmt.Printf("%08b\n", 170&15)
fmt.Println(
os.O_RDONLY,
os.O_WRONLY,
os.O_RDWR,
os.O_CREATE,
os.O_APPEND
)
они все инт
0,1,2,64,1024
fmt.Printf("%016b\n", os.O_CREATE|os.O_APPEND)
надо использовать константы а не int,
права и доступы
0 нет разрешений
1 исполнение
2 запись
3 запись и исполнение
4 чтение
5 чтение исполнение
6 запись и чтение
7 запись чтение исполнение
- файл
d каталог
это в начале прав
узнать какие права
fileInfo, err := os.Stat("dir")
checkErr(err)
fmt.Println(fileInfo.Mode())
drwxr-xr-x
для логов
os.O_WRONLY | os.O_APPEND | os.O_CREATE
можно проще
os.Open
os.Create
они проще, чем
os.OpenFile
530
Зависимость зарплаты
Зарплата зависит от спроса,
а не от сложности работы..
Часто зависит от пользы, которое вы даёте другим людям
php пространство имён
Чтобы избежать конфликтов функций, которые находятся в разных файлах, можно использовать пространства имён (namespaces) в PHP.
Пример использования пространств имён для этих двух файлов:
В файле "update.php":
php
namespace MyNamespace1;
function myFunction() {
// Код функции
}
В файле "updateMinimal.php":
php
namespace MyNamespace2;
function myFunction() {
// Код функции
}
Теперь для использования этих функций необходимо указывать пространство имён, чтобы избежать конфликтов:
php
require($_SERVER['DOCUMENT_ROOT'].'/ajax/product_locations/update.php');
require($_SERVER['DOCUMENT_ROOT'].'/ajax/product_locations/updateMinimal.php');
$function1 = MyNamespace1\myFunction();
$function2 = MyNamespace2\myFunction();
Используя пространства имён, вы можете избежать конфликтов и явно указывать, какую функцию вы хотите использовать.
Если хотите использовать в тех файлах глобальные переменные
то new \mysqli(
Подключить модули modules js
import {app} from '/apps/modules/app.js?5'
import {ajax} from '/apps/modules/ajax.js?5'
import {telega} from '/apps/modules/telega.js?5'
import {viewConsole} from '/apps/modules/viewConsole.js?5'
import {searchWithError} from '/apps/modules/searchWithError.js?10'
window.searchWithError = searchWithError
Их так же можно подключать после
import(`/gameMatch/rooms/${roomCode}/room.js`)
.then(module => {
gameMatch.rooms[roomCode] = module.room
gameMatch.rooms[roomCode].main()
})
Установка ядра LIQUORIX KERNEL INSTALL Debian / Ubuntu / Arch: Install Script
УСТАНОВКА ЯДРА LIQUORIX KERNEL
INSTALL
Debian / Ubuntu / Arch: Install Script
curl -s 'https://liquorix.net/install-liquorix.sh' | sudo bash
Обновите образ initramfs. Выполните команду:
sudo mkinitcpio -p linux-lqx
Для изменения ядра по умолчанию в загрузчике systemd на Arch Linux и обновления информации о ядрах, вы можете выполнить следующие действия:
Выполните команду sudo nano /boot/loader/loader.conf, чтобы открыть файл конфигурации загрузчика.
Добавьте следующие две строки в файл конфигурации:
default @saved
timeout 2
Убедитесь, что новое ядро установлен и находится в /boot.
Откройте терминал и выполните команду sudo nano /boot/loader/entries/linux-lqx.conf, чтобы создать новый файл записи для нового ядра.
В открывшемся редакторе nano введите следующий содержимое (вместо linux-lqx используйте фактическое имя ядра):
title Arch Linux (linux-lqx)
linux /vmlinuz-linux-lqx
initrd /initramfs-linux-lqx.img
options root=PARTUUID=4adaa716-5e38-4a68-ab3a-994e35cd8c52 rootflags=subvol=@ rw rootfstype=btrfs
Здесь [UUID-корневого-раздела] должен быть заменен на UUID вашего корневого раздела (который можно узнать, выполнив команду lsblk -f).
Перезагрузите систему, и при следующей загрузке будет предложено выбрать ядро.
Теперь вы можете проверить, что новое ядро является ядром по умолчанию, выполнив команду uname -r. Кроме того, при необходимости можно отредактировать параметры загрузки ядра в файле /boot/loader/entries/<kernel-name>.conf, чтобы настроить его поведение при загрузке.
Перед покупкой бу телефона проверить
Перед покупкой бу телефона необходимо проверить следующие вещи:
Состояние внешнего вида: проверьте наличие трещин, царапин, вмятин или других повреждений на корпусе телефона.
Работоспособность экрана: убедитесь, что экран работает без дефектов, таких как пятна, полосы или неотзывчивые области.
Кнопки регулировки громкости, включения выключения, что все нормально.
Батарея: узнайте, как долго держится заряд батареи и проверьте ее общее состояние.
Камера: протестируйте работу всех камер, включая фронтальную и заднюю, чтобы проверить их функциональность.
Звук: проверьте наличие звука и работоспособность встроенных динамиков и наушников.
Работа SIM-карты: убедитесь, что телефон правильно читает и распознает SIM-карту.
Связь и сеть: проверьте работоспособность Wi-Fi, Bluetooth и сотовой связи.
Операционная система: узнайте, какая версия операционной системы установлена на телефоне и проверьте возможность обновления до последней версии.
Память: проверьте доступное место для хранения данных и узнайте, поддерживает ли телефон расширение памяти с помощью карты памяти.
Проверка IMEI: сверьте IMEI телефона с базой украденных или заблокированных устройств, чтобы не попасть на украденный или незаконный телефон.
При возможности, также рекомендуется сделать пробный звонок, отправить SMS-сообщение, проверить работу приложений и подключиться к интернету для полной проверки функциональности устройства.
modules workerSearchWithError.js
import {searchWithError} from '/apps/modules/searchWithError_test.js?8'
self.addEventListener('message', function(event) {
let data = event.data
switch (data.cmd) {
case 'setDatabase':
searchWithError.setDatabase(data.base)
break;
case 'search':
searchWithError.search(data.text, function(answer) {
self.postMessage({
'cmd': 'searchAnswer',
'base':answer
})
}, data.options)
break;
default:
self.postMessage('Unknown command')
}
}, false)
/*
//'worker': new Worker('/apps/modules/workerSearchWithError.js'),
productAvailability.worker.postMessage({
'cmd': 'setDatabase',
'base': base
})
productAvailability.worker.postMessage({
'cmd': 'search',
'text': text,
'options': {'full':true}
})
productAvailability.worker.addEventListener('message', function(event) {
console.log(event.data);
}, false)
*/
modules viewConsole.js
window.viewConsole = {
'versionDate' : '2023-08-11',
'view' : () => {
return `<textarea id="console_result" style="width:100%;height:280px;box-sizing: border-box;">result</textarea>
<textarea id="console_input" style="width:100%;height:120px;box-sizing: border-box;">alert(5)</textarea>
<center><button onClick="viewConsole.send()">Выполнить</button></center>`
},
'send' : () => {
let console_input = document.getElementById('console_input')
if (!console_input) return;
eval(`let data = [${console_input.value}];
data = data[0];
if (typeof data === 'object')
data = Object.keys(data).join("\\n");
let console_result = document.getElementById('console_result');
if (console_result)
console_result.value += \`\\n\\n=== ${console_input.value} === \\n\` + data;`
)
},
'listenError' : () => {
window.addEventListener('error', (event) => { viewConsole.error(event); } );
},
'error' : (event) => {
let error = event.error
let data = {
'message': error.message,
'file': error.filename,
'line': error.lineno + ':' + error.colno,
'url':location.href,
'userAgent': navigator.userAgent
//'time_at_start_page': Math.ceil(error.timeStamp/1000)+'s'
}
//JSON.stringify(data)
let dataText = Object.keys(data).map((key) => `${key} : ${data[key]}`).join("\n")
let console_result = document.getElementById('console_result')
if (console_result)
console_result.value += `\n\n=== error === \n${dataText}`
}
}
export const viewConsole = window.viewConsole
modules telega.js
export const telega = {
'versionDate' : '2023-08-11',
'main': () => {
if (!Telegram) return;
// На всю высоту
Telegram.WebApp.expand()
},
'user':{},
// Стандартная telegram авторизация
'onAuth' : (user) => {
telega.user = user
},
'chatId': () => (
Telegram &&
Telegram.WebApp &&
Telegram.WebApp.initDataUnsafe &&
Telegram.WebApp.initDataUnsafe.user &&
Telegram.WebApp.initDataUnsafe.user.id ?
Telegram.WebApp.initDataUnsafe.user.id : 0
),
}
modules searchWithError.js
/*
Принцип: если было более 30% совпадений сочетаний 3 букв, то будет список отсортированный по количеству совпадений
Если все сочетания 3х букв слова, которое ищем, нашлись в названии, которое 3 раза перевёрнуто по клавиатуре Привет Ghbdtn Privet Зкшмуе.
Значит это то, что искали..
Иначе выставляем сколько % найденно.
И потом сортируем по этим %
*/
export const searchWithError = {
'versionDate':'2023-08-10',
'minProbability' : 30,
'delay' : 300,
'quantityСharacters' : [2,3],
'data' : {
'list':[]
},
/*
Получение данных в виде
ключ : текст для поиска
так оно в более привычном и минимальном виде
searchWithError.setDatabase({key:value, key:value})
*/
'setDatabase' : (data) => {
searchWithError.data.list = Object.keys(data).map(key => ({
'key': key,
'value': data[key],
'numbers': searchWithError.textToFullSetNumbers(data[key])
}))
},
/*
Преобразовать одно слово в соединении букв в виде цифр
Привет
[[п,р,и],[р,и,в],[и,в,е],[в,е,т]]
[[1087,1088,1080],[1088,1080,1074],[1080,1074,1077],[1074,1077,1090]]
[108710881080, 108810801074, 108010741077, 107410771090]
Тоже самое и с 2 буквами и объединяет эти массивы
*/
'textToSetNumbers' : (text) => {
if (text === '')
return new Set();
let characters = text.toLowerCase().split('')
//new Set(
return new Set(
searchWithError.quantityСharacters.map(quantity =>
Array.from({
'length' : (text.length + 1 - quantity)
}, (_, i) => Number(characters.slice(i, i + quantity)
.map(character => character.charCodeAt())
.join('')
)
)
)
.flat()
)
},
/*
Вывести все варианты слова в виде массива
Привет
[привет, ghbdtn, privet, зкшмук]
*/
'textToVariantsText' : (text) => {
text = text.toLowerCase()
return Array.from(new Set([
text,
searchWithError.textRuToEn(text), // бруско => brusko
searchWithError.textEnToRu(text),
searchWithError.textRuKeyToEn(text), // икгылщ => brusko
searchWithError.textEnKeyToRu(text), // hecrj => бруско
searchWithError.textRuKeyToEn(searchWithError.textEnKeyToRu(text)), // hecrj => бруско => brusko
searchWithError.textRuKeyToEn(searchWithError.textEnToRu(text))
//searchWithError.textEnToRu(searchWithError.textRuKeyToEn(text))
]))
},
/*
Преобразовать слово варианты слов,
варианты в цифры соединений букв
и всё в один сет
Привет
[привет, ghbdtn, privet, зкшмук]
Set(2) { 1, 2 } Set(2) { 1, 2 } Set(2) { 1, 2 }
Set(7) { 1, 2, 3, 4, 5, 6, 7 }
*/
'textToFullSetNumbers': (text) => {
let variantsText = searchWithError.textToVariantsText(text)
return variantsText
.map(text => searchWithError.textToSetNumbers(text))
.reduce((result, set0) => {
set0.forEach((value) => result.add(value))
return result;
}, new Set())
},
'lettersMapping': {
'RuToEn' : {
'а': 'a', 'б': 'b', 'в': 'v',
'г': 'g', 'д': 'd', 'е': 'e',
'ё': 'ye', 'ж': 'zh', 'з': 'z',
'и': 'i', 'й': 'y', 'к': 'k',
'л': 'l', 'м': 'm', 'н': 'n',
'о': 'o', 'п': 'p', 'р': 'r',
'с': 's', 'т': 't', 'у': 'u',
'ф': 'f', 'х': 'h', 'ц': 'c',
'ч': 'ch', 'ш': 'sh', 'щ': 'shch',
'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e',
'ю': 'yu', 'я': 'ya', ' ':' '
},
'EnToRu': {
'a':'а', 'b':'б', 'c':'ц',
'd':'д', 'e':'е', 'f':'ф',
'g':'г', 'h':'х', 'i':'и',
'j':'ж', 'k':'к', 'l':'л',
'm':'м', 'n':'н', 'o':'о',
'p':'п', 'q':'к', 'r':'р',
's':'с', 't':'т', 'u':'у',
'v':'в', 'w':'в', 'x':'кс',
'y':'й', 'z':'з'
},
'EnKeyToRu' : {
'q':'й', 'w':'ц', 'e':'у',
'r':'к', 't':'е', 'y':'н',
'u':'г', 'i':'ш', 'o':'щ',
'p':'з', '[':'х', ']':'ъ',
'a':'ф', 's':'ы', 'd':'в',
'f':'а', 'g':'п', 'h':'р',
'j':'о', 'k':'л', 'l':'д',
';':'ж', '\'':'э', 'z':'я',
'x':'ч', 'c':'с', 'v':'м',
'b':'и', 'n':'т', 'm':'ь',
',':'б', '.':'ю', ' ':' '
},
'RuKeyToEn': {
' ':' ', 'а':'f', 'б':',',
'в':'d', 'г':'u', 'д':'l',
'е':'t', 'ж':';', 'з':'p',
'и':'b', 'й':'q', 'к':'r',
'л':'k', 'м':'v', 'н':'y',
'о':'j', 'п':'g', 'р':'h',
'с':'c', 'т':'n', 'у':'e',
'ф':'a', 'х':'[', 'ц':'w',
'ч':'x', 'ш':'i', 'щ':'o',
'ъ':']', 'ы':'s', 'ь':'m',
'э':'\'', 'ю':'.', 'я':'z'
},
'textTo': (text, lettersMapping) => {
return text
.toLowerCase()
.split('')
//.filter(character => lettersMapping[character])
.map(character => lettersMapping[character] ? lettersMapping[character] : character)
.join('')
}
},
// бруско => brusko
'textRuToEn': (text) => {
return searchWithError.lettersMapping.textTo(text, searchWithError.lettersMapping.RuToEn)
},
'textEnToRu': (text) => {
return searchWithError.lettersMapping.textTo(text, searchWithError.lettersMapping.EnToRu)
},
// икгылщ => brusko
'textRuKeyToEn' : (text) => {
return searchWithError.lettersMapping.textTo(text, searchWithError.lettersMapping.RuKeyToEn)
},
// ,hecrj => бруско
'textEnKeyToRu' : (text) => {
return searchWithError.lettersMapping.textTo(text, searchWithError.lettersMapping.EnKeyToRu)
},
/*
Основная функция поиска
searchWithError.search('Привет', console.log)
[key, key, key]
searchWithError.search('Привет', console.log, {'full':true})
[[key: item], [key: item]]
*/
'search' : (searchText = '', callback = console.log, options = {}) => {
if (searchWithError.data.list.length === 0) {
alert(`Нет базы для поиска,
воспользуйтесь функцией searchWithError.setDatabase({key:value, key:value}),
а после searchWithError.search()`)
return;
}
// Таймер, чтоб не реагировал до тех пор, пока полностью не введут слово
clearTimeout(searchWithError.timer)
searchWithError.timer = setTimeout(() => {
// При очистке поиска очищать результат
if(searchText === '' || searchText.length < 3) {
searchWithError.handleResponse(callback, [], options.arg)
return;
}
// Текст для поиска переводим в массив
let searchNumbers = searchWithError.textToSetNumbers(searchText)
let searchNumbersArray = Array.from(searchNumbers)
// Подсчёт процента, фильтр, сортировка
let result = searchWithError.data.list
.map(item => {
// Количество доступных совпадений
item.quantityСoincidencePossible = searchNumbersArray.length
// Количество найденных совпадений
item.quantityCoincidenceFound = searchNumbersArray.filter(number => item.numbers.has(number)).length
// Процент найденных совпадений // Math.floor(
item.percentCoincidence = item.quantityCoincidenceFound * 100 / item.quantityСoincidencePossible
return item
})
// Оставляем с нормальным процентом
.filter(item => item.percentCoincidence >= searchWithError.minProbability)
// Сортируем по количеству найденных совпадений
.sort((item0, item1) => item0.quantityCoincidenceFound == item1.quantityCoincidenceFound ?
0 : (item0.quantityCoincidenceFound < item1.quantityCoincidenceFound ? 1 : -1)
)
// Если задано количество, то оставляем нужное
if (options.quantity)
result = result
.filter((_, index) => index < options.quantity)
// Полный вывод в виде масивов [[key: item], [key: item]]
if (options.full)
result = result.map(item => {
item.variants = searchWithError.textToVariantsText(item.value)
return [item.key, item]
})
else
// Обычный вывод в виде масивов ключей [key, key, key]
result = result.map(item => item.key)
searchWithError.handleResponse(callback, result, options.arg)
}, searchWithError.delay)
},
// Обработка ответа
'handleResponse' : (callback = console.log, data, arg) => {
if (data === undefined)
callback()
else if (arg === undefined)
callback(data)
else
callback(data, arg)
}
}
modules oldAjax.js
export const oldAjax = {
'ajax' : function(url, data, fun_callback, fun_arg) {
if (!fun_callback) fun_callback = console.log;
var request = new XMLHttpRequest();
request.open('POST', url, true);
request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
if (!data) request.send();
else request.send(Object.keys(data).map(function(key) {
return encodeURIComponent(key) + '=' + encodeURIComponent(data[key]);
}).join('&'));
request.onreadystatechange = function() {
if (request.status !== 200) console.log(request.status + ': ' + request.statusText);
else if(request.readyState !== 4 || !('responseText' in request)) return false;
else if (fun_arg === undefined) fun_callback(request.responseText);
else fun_callback(request.responseText, fun_arg);
};
},
'ajax_json' : function(url, data, fun_callback, fun_arg) {
if (!fun_callback) fun_callback = console.log;
var request = new XMLHttpRequest();
request.open('POST', url, true);
request.setRequestHeader('Content-type', 'application/json');
request.send(JSON.stringify(data));
request.onreadystatechange = function() {
if (request.status !== 200) console.log(request.status + ': ' + request.statusText);
else if(request.readyState !== 4 || !('responseText' in request)) return false;
else {
var result = {};
try { result = JSON.parse(request.responseText); }
catch(e) { console.log(['JSON [X]', e, request.responseText]); }
if (fun_arg === undefined) fun_callback(result);
else fun_callback(result, fun_arg);
}
}
},
'ajax_type' : function(type, data, fun_callback, fun_arg) {
if (typeof data === 'undefined')
data = {};
data.type = type;
oldAjax.ajax_json(oldAjax.ajax_url, data, fun_callback, fun_arg);
},
'ajax_with_files' : function(type, data, input_file, fun_callback, fun_arg) {
data.type = type;
if (!fun_callback) fun_callback = console.log;
var request = new XMLHttpRequest();
request.open('POST', oldAjax.ajax_url, true);
//request.setRequestHeader('Content-type', 'application/json');
var form_data = new FormData();
form_data.append('data', JSON.stringify(data));
if ('0' in input_file.files)
form_data.append('file', input_file.files[0], input_file.files[0].name);
// input_file.files.length
request.send(form_data);
request.onreadystatechange = function() {
if (request.status != 200) console.log(request.status + ': ' + request.statusText);
else if(request.readyState !== 4) return false;
else {
var result = {};
try { result = JSON.parse(request.responseText); }
catch(e) { console.log(['JSON [X]', e, request.responseText]); }
if (fun_arg === undefined) fun_callback(result);
else fun_callback(result, fun_arg);
}
}
}
}
modules cookie.js
export const cookie = {
'versionDate' : '2023-08-11',
'enabled' : navigator.cookieEnabled,
'set' : (key, value) => {
value = value.replace("\n\n", ' ');
value = value.replace("\n", ' ');
var date_end = new Date();
date_end.setFullYear(date_end.getFullYear() + 7);
document.cookie = encodeURIComponent(key) + '=' + encodeURIComponent(value) + '; ' +
(window.location.protocol === 'https:' ? 'SameSite=None; Secure; ' : '') +
'path=/; domain=' + window.location.host + '; expires=' + date_end.toUTCString();
},
'get' : (key) => {
key = encodeURIComponent(key);
var matches = document.cookie.match(new RegExp(
"(?:^|; )" + key.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
},
'remove' : (key) => {
key = encodeURIComponent(key);
var date_end = new Date(0);
document.cookie = key + '=; SameSite=None; Secure; path=/; domain=.' +
window.location.host + '; expires=' + date_end.toUTCString();
},
'clear' : () => {
var array_cookie = document.cookie.split(';');
var name = '';
while (name = array_cookie.pop())
app.cookie.del((name.split('=')[0]).trim());
},
'show' : () => {
console.log(document.cookie.split(';').map(function(value) {
return value.split('=').map(function(value1) {
return value1.trim();
}).join(' = ');
}).join("\n\n"));
}
}
modules app.js
export const app = {
'versionDate' : '2023-08-11',
'show' : (text = 'Hello', id = 'app') => {
let element = document.getElementById(id)
if (element) element.innerHTML = text
},
'stringToInt' : (text) => {
text = String(text)
text = parseInt( text.replace(/\D+/g, '') )
if(Number.isNaN(text)) text = 0
return text
},
'focusElementById' : (id) => {
let element = document.getElementById(id)
if (element) element.focus()
},
'jsonToObject' : (jsonString = '{}') => {
try {
return JSON.parse(jsonString)
} catch (error) {
console.log(['JSON X', error, jsonString])
}
return {}
},
'objectToJson' : (object = {}) => {
return JSON.stringify(object)
},
'windowOnLoadAdd' : (event) => {
if (window.onload)
window.onload = window.onload + event
else
window.onload = event
}
}
modules ajax.js
export const ajax = {
'versionDate' : '2023-08-11',
//'test':true,
'handleResponse' : (callback = console.log, data, arg) => {
if (data === undefined)
callback()
else if (arg === undefined)
callback(data)
else
callback(data, arg)
},
'json' : (url, data = {}, callback = console.log, arg) => {
if (!url)
throw new Error('URL are required.')
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => {
if (!response.ok)
throw new Error(response.status + ' : ' + response.statusText)
//if (ajax.test) console.log(response.text())
return response.json()
})
.then(responseJson => {
ajax.handleResponse(callback, responseJson, arg)
})
.catch(error => {
console.error(error)
});
},
'getText' : (url, callback = console.log, arg) => {
if (!url)
throw new Error('URL are required.')
fetch(url)
.then(response => response.text())
.then(text => {
ajax.handleResponse(callback, text, arg)
})
.catch(error => {
console.error(error)
})
}
}
//window.ajax = ajax
arch linux зеркала
Зеркала
Позже обработаю
--
## Belarus
Server = http://mirror.datacenter.by/pub/archlinux/$repo/os/$arch
## Belarus
Server = http://ftp.byfly.by/pub/archlinux/$repo/os/$arch
## Canada
Server = https://mirror2.evolution-host.com/archlinux/$repo/os/$arch
## Canada
Server = https://arch.mirror.winslow.cloud/$repo/os/$arch
## Canada
Server = https://mirror.csclub.uwaterloo.ca/archlinux/$repo/os/$arch
## Canada
Server = https://mirror.quantum5.ca/archlinux/$repo/os/$arch
## Canada
Server = https://mirror.xenyth.net/archlinux/$repo/os/$arch
## Canada
Server = https://mirror.0xem.ma/arch/$repo/os/$arch
## Canada
Server = https://mirror.scd31.com/arch/$repo/os/$arch
## Canada
Server = http://mirror.0xem.ma/arch/$repo/os/$arch
## Canada
Server = http://mirror.its.dal.ca/archlinux/$repo/os/$arch
## Canada
Server = http://mirror.xenyth.net/archlinux/$repo/os/$arch
## Canada
Server = http://mirror2.evolution-host.com/archlinux/$repo/os/$arch
## Canada
Server = http://mirror.csclub.uwaterloo.ca/archlinux/$repo/os/$arch
## Canada
Server = http://mirror.scd31.com/arch/$repo/os/$arch
## Canada
Server = http://mirror.quantum5.ca/archlinux/$repo/os/$arch
## Canada
Server = http://archlinux.mirror.rafal.ca/$repo/os/$arch
## France
Server = https://mirror.cyberbits.eu/archlinux/$repo/os/$arch
## France
Server = https://archmirror.hogwarts.fr/$repo/os/$arch
## France
Server = https://mirror.ibakerserver.pt/Arch/$repo/os/$arch
## France
Server = https://mirrors.gandi.net/archlinux/$repo/os/$arch
## France
Server = https://archlinux.mailtunnel.eu/$repo/os/$arch
## France
Server = https://mirroir.labhouse.fr/arch/$repo/os/$arch
## France
Server = https://mirrors.eric.ovh/arch/$repo/os/$arch
## France
Server = https://mirror.oldsql.cc/archlinux/$repo/os/$arch
## France
Server = https://mirror.theo546.fr/archlinux/$repo/os/$arch
## France
Server = https://mirrors.slaanesh.org/archlinux/$repo/os/$arch
## France
Server = https://mirror.spaceint.fr/archlinux/$repo/os/$arch
## France
Server = https://mirror.thekinrar.fr/archlinux/$repo/os/$arch
## France
Server = https://mirror.wormhole.eu/archlinux/$repo/os/$arch
## France
Server = https://mirrors.celianvdb.fr/archlinux/$repo/os/$arch
## France
Server = https://arch.yourlabs.org/$repo/os/$arch
## France
Server = http://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
## France
Server = http://mirrors.gandi.net/archlinux/$repo/os/$arch
## France
Server = http://mirroir.labhouse.fr/arch/$repo/os/$arch
## France
Server = http://mirrors.standaloneinstaller.com/archlinux/$repo/os/$arch
## France
Server = http://mirror.theo546.fr/archlinux/$repo/os/$arch
## France
Server = http://archlinux.mailtunnel.eu/$repo/os/$arch
## France
Server = http://archmirror.hogwarts.fr/$repo/os/$arch
## France
Server = http://mir.archlinux.fr/$repo/os/$arch
## France
Server = http://mirror.spaceint.fr/archlinux/$repo/os/$arch
## France
Server = http://mirror.archlinux.ikoula.com/archlinux/$repo/os/$arch
## France
Server = http://mirror.lastmikoi.net/archlinux/$repo/os/$arch
## France
Server = http://ftp.u-strasbg.fr/linux/distributions/archlinux/$repo/os/$arch
## France
Server = http://arch.yourlabs.org/$repo/os/$arch
## France
Server = http://mirrors.celianvdb.fr/archlinux/$repo/os/$arch
## France
Server = http://mirror.cyberbits.eu/archlinux/$repo/os/$arch
## France
Server = http://archlinux.datagr.am/$repo/os/$arch
## France
Server = http://mirror.oldsql.cc/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.selfnet.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.f4st.host/archlinux/$repo/os/$arch
## Germany
Server = https://de.arch.mirror.kescher.at/$repo/os/$arch
## Germany
Server = https://ftp.spline.inf.fu-berlin.de/mirrors/archlinux/$repo/os/$arch
## Germany
Server = https://os.codefionn.eu/archlinux/$repo/os/$arch
## Germany
Server = https://ftp.wrz.de/pub/archlinux/$repo/os/$arch
## Germany
Server = https://archlinux.thaller.ws/$repo/os/$arch
## Germany
Server = https://mirror.mikrogravitation.org/archlinux/$repo/os/$arch
## Germany
Server = https://mirrors.n-ix.net/archlinux/$repo/os/$arch
## Germany
Server = https://arch.jensgutermuth.de/$repo/os/$arch
## Germany
Server = https://mirror.bethselamin.de/$repo/os/$arch
## Germany
Server = https://mirror.kumi.systems/archlinux/$repo/os/$arch
## Germany
Server = https://mirrors.xtom.de/archlinux/$repo/os/$arch
## Germany
Server = https://archlinux.homeinfo.de/$repo/os/$arch
## Germany
Server = https://mirrors.janbruckner.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirrors.niyawe.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.sunred.org/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.moson.org/arch/$repo/os/$arch
## Germany
Server = https://ftp.halifax.rwth-aachen.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.metalgamer.eu/archlinux/$repo/os/$arch
## Germany
Server = https://arch.unixpeople.org/$repo/os/$arch
## Germany
Server = https://mirror.lcarilla.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.fra10.de.leaseweb.net/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.wtnet.de/archlinux/$repo/os/$arch
## Germany
Server = https://archlinux.richard-neumann.de/$repo/os/$arch
## Germany
Server = https://mirror.pseudoform.org/$repo/os/$arch
## Germany
Server = https://packages.oth-regensburg.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.dogado.de/archlinux/$repo/os/$arch
## Germany
Server = https://appuals.com/archlinux/$repo/os/$arch
## Germany
Server = https://arch.mirror.zachlge.org/$repo/os/$arch
## Germany
Server = https://mirror.pagenotfound.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.netcologne.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.iusearchbtw.nl/$repo/os/$arch
## Germany
Server = https://ftp.agdsn.de/pub/mirrors/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.ubrco.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.23m.com/archlinux/$repo/os/$arch
## Germany
Server = https://dist-mirror.fem.tu-ilmenau.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.clientvps.com/archlinux/$repo/os/$arch
## Germany
Server = https://ftp.fau.de/archlinux/$repo/os/$arch
## Germany
Server = https://mirror.cmt.de/archlinux/$repo/os/$arch
## Germany
Server = https://pkg.fef.moe/archlinux/$repo/os/$arch
## Germany
Server = https://arch.phinau.de/$repo/os/$arch
## Germany
Server = http://ftp.uni-hannover.de/archlinux/$repo/os/$arch
## Germany
Server = http://archlinux.mirror.iphh.net/$repo/os/$arch
## Germany
Server = http://mirror.23m.com/archlinux/$repo/os/$arch
## Germany
Server = http://ftp.gwdg.de/pub/linux/archlinux/$repo/os/$arch
## Germany
Server = http://ftp.fau.de/archlinux/$repo/os/$arch
## Germany
Server = http://archlinux.thaller.ws/$repo/os/$arch
## Germany
Server = http://mirror.sunred.org/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.metalgamer.eu/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.selfnet.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirrors.janbruckner.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirrors.xtom.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.mikrogravitation.org/archlinux/$repo/os/$arch
## Germany
Server = http://mirrors.niyawe.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.cmt.de/archlinux/$repo/os/$arch
## Germany
Server = http://arch.jensgutermuth.de/$repo/os/$arch
## Germany
Server = http://mirror.fra10.de.leaseweb.net/archlinux/$repo/os/$arch
## Germany
Server = http://ftp.agdsn.de/pub/mirrors/archlinux/$repo/os/$arch
## Germany
Server = http://ftp-stud.hs-esslingen.de/pub/Mirrors/archlinux/$repo/os/$arch
## Germany
Server = http://archlinux.honkgong.info/$repo/os/$arch
## Germany
Server = http://mirror.netcologne.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.lcarilla.de/archlinux/$repo/os/$arch
## Germany
Server = http://os.codefionn.eu/archlinux/$repo/os/$arch
## Germany
Server = http://arch.mirror.zachlge.org/$repo/os/$arch
## Germany
Server = http://mirror.united-gameserver.de/archlinux/$repo/os/$arch
## Germany
Server = http://packages.oth-regensburg.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.moson.org/arch/$repo/os/$arch
## Germany
Server = http://ftp.hosteurope.de/mirror/ftp.archlinux.org/$repo/os/$arch
## Germany
Server = http://artfiles.org/archlinux.org/$repo/os/$arch
## Germany
Server = http://ftp.halifax.rwth-aachen.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.clientvps.com/archlinux/$repo/os/$arch
## Germany
Server = http://arch.phinau.de/$repo/os/$arch
## Germany
Server = http://ftp.uni-bayreuth.de/linux/archlinux/$repo/os/$arch
## Germany
Server = http://ftp.spline.inf.fu-berlin.de/mirrors/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.pagenotfound.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.f4st.host/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.kumi.systems/archlinux/$repo/os/$arch
## Germany
Server = http://ftp.uni-kl.de/pub/linux/archlinux/$repo/os/$arch
## Germany
Server = http://linux.rz.rub.de/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.wtnet.de/archlinux/$repo/os/$arch
## Germany
Server = http://ftp.wrz.de/pub/archlinux/$repo/os/$arch
## Germany
Server = http://mirrors.n-ix.net/archlinux/$repo/os/$arch
## Germany
Server = http://ftp.tu-chemnitz.de/pub/linux/archlinux/$repo/os/$arch
## Germany
Server = http://mirror.ubrco.de/archlinux/$repo/os/$arch
## Russia
Server = https://mirror.truenetwork.ru/archlinux/$repo/os/$arch
## Russia
Server = https://mirror.yal.sl-chat.ru/archlinux/$repo/os/$arch
## Russia
Server = https://mirror.kamtv.ru/archlinux/$repo/os/$arch
## Russia
Server = https://mirror.yandex.ru/archlinux/$repo/os/$arch
## Russia
Server = https://mirror.nw-sys.ru/archlinux/$repo/os/$arch
## Russia
Server = https://mirror.surf/archlinux/$repo/os/$arch
## Russia
Server = https://mirror.kpfu.ru/archlinux/$repo/os/$arch
## Russia
Server = http://mirror.kamtv.ru/archlinux/$repo/os/$arch
## Russia
Server = http://mirror.surf/archlinux/$repo/os/$arch
## Russia
Server = http://mirror.yandex.ru/archlinux/$repo/os/$arch
## Russia
Server = http://mirrors.powernet.com.ru/archlinux/$repo/os/$arch
## Russia
Server = http://mirror.nw-sys.ru/archlinux/$repo/os/$arch
## Russia
Server = http://mirror.truenetwork.ru/archlinux/$repo/os/$arch
## Russia
Server = http://mirror.kpfu.ru/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.ocf.berkeley.edu/archlinux/$repo/os/$arch
## United States
Server = https://mirror.umd.edu/archlinux/$repo/os/$arch
## United States
Server = https://repo.ialab.dsu.edu/archlinux/$repo/os/$arch
## United States
Server = https://mirror.wdc1.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.radwebhosting.com/archlinux/$repo/os/$arch
## United States
Server = https://ftp.osuosl.org/pub/archlinux/$repo/os/$arch
## United States
Server = https://mirror.mia11.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = https://iad.mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = https://arlm.tyzoid.com/$repo/os/$arch
## United States
Server = https://mirrors.kernel.org/archlinux/$repo/os/$arch
## United States
Server = https://mirror.theash.xyz/arch/$repo/os/$arch
## United States
Server = https://mirror.sfo12.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = https://opencolo.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://coresite.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://ridgewireless.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://volico.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://ord.mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = https://arch.mirror.ivo.st/$repo/os/$arch
## United States
Server = https://southfront.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.sonic.net/archlinux/$repo/os/$arch
## United States
Server = https://plug-mirror.rcac.purdue.edu/archlinux/$repo/os/$arch
## United States
Server = https://mirror.hackingand.coffee/arch/$repo/os/$arch
## United States
Server = https://nnenix.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.bloomu.edu/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.vectair.net/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.lug.mtu.edu/archlinux/$repo/os/$arch
## United States
Server = https://mirror.phx1.us.spryservers.net/archlinux/$repo/os/$arch
## United States
Server = https://dfw.mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.rit.edu/archlinux/$repo/os/$arch
## United States
Server = https://ziply.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://codingflyboy.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://mirror.lty.me/archlinux/$repo/os/$arch
## United States
Server = https://zxcvfdsa.com/arch/$repo/os/$arch
## United States
Server = https://mirror.tmmworkshop.com/archlinux/$repo/os/$arch
## United States
Server = https://arch.hu.fo/archlinux/$repo/os/$arch
## United States
Server = https://mirror2.sandyriver.net/pub/archlinux/$repo/os/$arch
## United States
Server = https://mirror.stephanie.is/archlinux/$repo/os/$arch
## United States
Server = https://iad.mirrors.misaka.one/archlinux/$repo/os/$arch
## United States
Server = https://m.lqy.me/arch/$repo/os/$arch
## United States
Server = https://nocix.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://mirror.clarkson.edu/archlinux/$repo/os/$arch
## United States
Server = https://uvermont.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://ohioix.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://forksystems.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://america.mirror.pkgbuild.com/$repo/os/$arch
## United States
Server = https://irltoolkit.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://mirror.adectra.com/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.mit.edu/archlinux/$repo/os/$arch
## United States
Server = https://mirror.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://mirror.arizona.edu/archlinux/$repo/os/$arch
## United States
Server = https://archmirror1.octyl.net/$repo/os/$arch
## United States
Server = https://mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = https://mirror.dal10.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = https://mirrors.xtom.com/archlinux/$repo/os/$arch
## United States
Server = https://mnvoip.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = https://arch.mirror.constant.com/$repo/os/$arch
## United States
Server = http://mirror.wdc1.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.lug.mtu.edu/archlinux/$repo/os/$arch
## United States
Server = http://uvermont.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://mirror.dal10.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = http://arch.hu.fo/archlinux/$repo/os/$arch
## United States
Server = http://arlm.tyzoid.com/$repo/os/$arch
## United States
Server = http://mirror.fossable.org/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.xmission.com/archlinux/$repo/os/$arch
## United States
Server = http://mirror.phx1.us.spryservers.net/archlinux/$repo/os/$arch
## United States
Server = http://mnvoip.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://mirror.umd.edu/archlinux/$repo/os/$arch
## United States
Server = http://forksystems.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.radwebhosting.com/archlinux/$repo/os/$arch
## United States
Server = http://southfront.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://iad.mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.cat.pdx.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.kernel.org/archlinux/$repo/os/$arch
## United States
Server = http://wcbmedia.io:8000/$repo/os/$arch
## United States
Server = http://mirror.stephanie.is/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.advancedhosters.com/archlinux/$repo/os/$arch
## United States
Server = http://mirror.mia11.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.ocf.berkeley.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.rutgers.edu/archlinux/$repo/os/$arch
## United States
Server = http://ohioix.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://mirror.metrocast.net/archlinux/$repo/os/$arch
## United States
Server = http://mirror.arizona.edu/archlinux/$repo/os/$arch
## United States
Server = http://distro.ibiblio.org/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.sonic.net/archlinux/$repo/os/$arch
## United States
Server = http://opencolo.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://iad.mirrors.misaka.one/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.vectair.net/archlinux/$repo/os/$arch
## United States
Server = http://mirror.math.princeton.edu/pub/archlinux/$repo/os/$arch
## United States
Server = http://mirror.vtti.vt.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirror.siena.edu/archlinux/$repo/os/$arch
## United States
Server = http://dfw.mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = http://volico.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://ziply.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.bloomu.edu/archlinux/$repo/os/$arch
## United States
Server = http://ridgewireless.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.xtom.com/archlinux/$repo/os/$arch
## United States
Server = http://nnenix.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.rit.edu/archlinux/$repo/os/$arch
## United States
Server = http://irltoolkit.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://repo.ialab.dsu.edu/archlinux/$repo/os/$arch
## United States
Server = http://nocix.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://ftp.osuosl.org/pub/archlinux/$repo/os/$arch
## United States
Server = http://mirror.lty.me/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.gigenet.com/archlinux/$repo/os/$arch
## United States
Server = http://mirror.sfo12.us.leaseweb.net/archlinux/$repo/os/$arch
## United States
Server = http://arch.mirror.constant.com/$repo/os/$arch
## United States
Server = http://plug-mirror.rcac.purdue.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirror.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://ord.mirror.rackspace.com/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.mit.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirror.adectra.com/archlinux/$repo/os/$arch
## United States
Server = http://mirrors.acm.wpi.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirror.cs.vt.edu/pub/ArchLinux/$repo/os/$arch
## United States
Server = http://coresite.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://codingflyboy.mm.fcix.net/archlinux/$repo/os/$arch
## United States
Server = http://archmirror1.octyl.net/$repo/os/$arch
## United States
Server = http://www.gtlib.gatech.edu/pub/archlinux/$repo/os/$arch
## United States
Server = http://mirror.clarkson.edu/archlinux/$repo/os/$arch
## United States
Server = http://mirror.hackingand.coffee/arch/$repo/os/$arch
## United States
Server = http://repo.miserver.it.umich.edu/archlinux/$repo/os/$arch
## Worldwide
Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch
--
как загрузить файл через php на github Именно php кодом?
GitHub не предоставляет специального API для загрузки файлов через PHP, однако вы можете использовать API GitHub для создания файла в репозитории.
Для загрузки файла на GitHub с помощью PHP, вам потребуется выполнить следующие шаги:
1. Зарегистрируйтесь на GitHub и создайте репозиторий, в котором будете загружать файлы.
2. Получите личный токен доступа для доступа к API GitHub. Для этого:
- Войдите в свой аккаунт GitHub.
- Нажмите на аватар вашего профиля в правом верхнем углу и выберите "Settings" (Настройки).
- В боковой панели выберите "Developer settings" (Настройки разработчика).
- Перейдите на страницу личных токенов Personal access tokens (classic) или создайте новый токен.
- Укажите необходимые права (например, repo для доступа к репозиториям) и сгенерируйте токен.
- Скопируйте сгенерированный токен – он понадобится вам для отправки запросов API.
3. Создайте PHP-скрипт для загрузки файла на GitHub. Вот пример кода:
<?php
$githubUsername = '';
$githubToken = '';
$githubRepo = '';
$fileName = 'testFile4.txt'; // 'folder/testFile4.txt';
$fileContents = 'hi3';
$commitMessage = 'PHP Script update '.date('Y-m-d H:i:s');
$options = [
'http' => [
'header' => "Content-Type: application/json\r\n".
"Authorization: token $githubToken\r\n" .
"User-Agent: PHP Script/1.0\r\n" .
"Accept: application/vnd.github+json\r\n",
'method' => 'PUT',
'content' => json_encode([
'message' => $commitMessage,
'content' => base64_encode($fileContents)
])
]
];
$context = stream_context_create($options);
$result = file_get_contents("https://api.github.com/repos/$githubUsername/$githubRepo/contents/$fileName", false, $context);
$response = json_decode($result, true);
if (isset($response['content']['download_url'])) {
echo "Файл успешно загружен: " . $response['content']['download_url'];
} else {
echo "Ошибка при загрузке файла.";
}
Внимание! Убедитесь, что ваш личный токен доступа сохраняется в безопасности и не публикуется нигде – он дает полный доступ к ваши репозиториям GitHub.
Используя этот код, вы сможете загрузить файл с заданным именем в указанный репозиторий на GitHub. Будьте уверены, что указали правильные значения для $githubUsername, $githubRepo и $fileName.
Учтите, что этот код использует функцию file_get_contents(), которая может быть отключена в определенных серверных конфигурациях. Если это так, вам придется использовать другой метод отправки запросов к API GitHub, например, cURL.
Для изменения, под
'content' => base64
добавляем
'sha' => 'SHA-хэшФайла', // SHA-хэш текущего содержимого файла на GitHub (можно получить при запросе информации о файле)
Golang структура Архитектура
https://www.youtube.com/watch?v=B0lV7I3FO4E
Пример разработки
1 https://www.youtube.com/watch?v=mr3pywHOz7I
2 https://www.youtube.com/watch?v=RHatXuBXckM
// Точка входа
cmd
-app
--main.go
-parse
--main.go для крона
build
/configs/main.yml
/internal/ (внутренний)1.4 Своё, что под запретом для публикации + Основная бизнес логика
/internal/app/app.go
/pkg/ Доступно для скачивания другим + клиенские библиотеки
/docs/ (авто-генерация через swagger)
// Структуры и их методы
/internal/models/
// Слой комуникации транспорта
/internal/delivery/http/handler.go
/internal/delivery/grpc/
// Для основной бизнес логики
/internal/service/
// Хранилище для работы с базами (mongoDB top)
/internal/repository/
/internal/repository/mongodb/
// Берёт данные с /configs/main.yml
/internal/config/config.go
/internal/config/config_test.go
// Сервер
/server/server.go
// php
index.php
config
-database.php
-constants.php
includes
templates
-header.php
-footer.php
-home.php
-product.php
-cart.php
assets/ - папка с ресурсами, такими как изображения, стили CSS, скрипты JavaScript и т.д.
admin
-index.php
-products.phpудаление).
-orders.php
uploads
Front js import modules
// Стандарт, но нельзя обратиться с консоли
export const ajax = {
'json':1
}
import {ajax} from './ajax.js'
console.log(ajax.json)
// Можно обратиться с консоли
window.ajax = {
'json':1
}
import './ajax.js'
console.log(ajax.json)
Подключить битрикс ядро
define('NOT_CHECK_PERMISSIONS', true); // Убрать форму авторизации
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
Подключить js css
$APPLICATION->AddHeadScript(SITE_TEMPLATE_PATH.'/js/age18.js');
$APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH.'/css/media.css');
$APPLICATION->AddHeadString('<meta name="viewport" content="width=device-width, initial-scale=1.0">');
Учим Kotlin ссылки
Русская документация
https://kotlinlang.ru/
Курс
https://kotlinlang.org/docs/home.html
Курс от гугла
https://developer.android.com/courses/kotlin-bootcamp/overview
Тренироваться кодить, песочница
https://play.kotlinlang.org/
Установка Golang
Arch
sudo pacman -Syu
sudo pacman -S go
Ubuntu
sudo apt update
sudo apt upgrade
sudo apt install golang-go
termux
apt update -y
apt upgrade -y
pkg install golang
go version
go run 1.go
go build 1.go
nano hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
go build ./hello.go
./hello
OR
go run ./hello.go
In windows
https://go.dev/doc/install
Golang book 12
переписать с отправкой структуры с 432
автотесты
import "testing"
func TestMyFunc(t *testing.T) {
t.Error("not good test")
}
имя всегда должно начинаться с Test!
go test /dir
go test /dir -v
-v это максимум подробности
go test /dir -v -run Two
-run запускает тест в названии которого есть two
находит в текущем каталоге все файлы,
которые завершаются на _test.go
и выполняет там все функции, где имена начинаются с Test
, при компиляции на эти файлы не обращают внимание..
func TestMyFunc(t *testing.T){
list := []string("app", "orange")
if myFunc(list) != "norm result" {
t.Error("pipec")
}
}
подробные тесты писать так
func TestMyFunc(t *testing.T){
list := []string("app", "orange")
want := "norm result"
result := myFunc(list)
if result != want {
t.Errorf("myFunc(%#v") = %#v, want %#v", list, result, want)
}
}
если тестов много, то можно определить новый тип, как аргументы, результати через массив через цикл их перебрать
называется табличные тесты
веб приложения
http://localhost:8080/hi
package main
import (
// "fmt"
"log"
"net/http"
)
func web(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("hw"))
}
func main() {
http.HandleFunc("/hi", web)
err := http.ListenAndServe("localhost:8080", nil)
log.Fatal(err)
}
462
465
Преобразовать в байты и обратно
fmt.Println(string([]byte(72, 101, 108, 108, 111))) // Hello
fmt.Println([]byte("Hello")) // [72, 101, 108, 108, 111]
func write(writer http.ResponseWriter, message string) {
_, err := writer.Write([]byte(massage))
if err != nil {
log.Fatal(err)
}
}
функци можно присваивать другую функцию
var newFunc func()
var newFunc func(int, int) float64
newFunc = oldFunc
469
function twice(theFunc func()){
theFunc()
theFunc()
}
Параметры и возвращаемое значение является частью типа функции
480
php Функция отправки письма с файлом
// Функция отправки письма
function XMail($from, $to, $subj, $text, $files){
//$subj=substr(htmlspecialchars(trim($subj)), 0, 1000);
//$subj=mb_convert_encoding($subj, "UTF-8", "CP1251");
//$subj=base64_encode($subj);
//$subj="=?UTF-8?Q?".imap_8bit($subj)."?=";
$subj="=?UTF-8?B?".base64_encode($subj)."?=";
$un = strtoupper(uniqid(time()));
$head = 'From: '.$from."\n";
//$head .='Reply-To: '.$from."\r\n";
//$head .= 'Bcc: ' .$from. "\r\n";
//$head .= "To: $to\n";
$head .= "Subject: $subj\n";
//$head .= "Subject: =?UTF-8?Q?".imap_8bit($subj)."?=";
$head .= "X-Mailer: PHPMail Tool\n";
//$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;charset=utf-8\n"; //utf-8 windows-1251
//$zag .= "\nContent-type:text/plain;charset=utf-8\r\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
if(count($files)>0){
foreach($files as $key=>$value){
if(file_exists($value)){
if(!is_dir($value)){
$filename = $value;
$f = $value['num'];
$f = fopen($value,"rb");
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filename)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filename)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";
}
}
}
}
//file_put_contents('./test.txt', print_r(["$to", "$subj", $zag, $head], true));
if (!@mail("$to", "$subj", $zag, $head))
return 0;
else
return 1;
}
// Отправка одного письма
function mail_go($mail_to, $title, $text){
//return $mail_to.' '.$title.' '.$text;
return XMail('"USER"<user@site.com>', $mail_to, $title, $text, []);
}
Создать бэкап в zip
#! /bin/bash
# sh /root/create_backup.sh
# exit 0
# Файл для периодического создания бэкапов в zip
project_name="pr"
max_old_backups=5
sql_bd_name=""
sql_login=""
sql_password=""
project_dir="/var/www/pr"
backups_dir="/root/backups_${project_name}"
datetime=$(date +"%Y-%m-%d_%H-%M-%S")
new_backup="${backups_dir}/${datetime}.zip"
tmp_sql="${backups_dir}/tmp_${datetime}.sql"
# Если нет этой папки, то создаём
if [ ! -d $backups_dir ]; then
mkdir -p $backups_dir
fi
# Очистка от старых
# Получаем количество файлов в папке
file_count=$(ls -1 $backups_dir | wc -l)
if [ $file_count -gt $max_old_backups ]; then # Если файлов больше
# Сортируем файлы по времени изменения и берём только последние
files_to_delete=$(ls -1t $backups_dir | tail -n $(($file_count - $max_old_backups)))
# Удаляем старые файлы
for file in $files_to_delete; do
rm "${backups_dir}/${file}"
done
fi
echo "Create tmp_sql" &&
mysqldump -u $sql_login -p$sql_password $sql_bd_name > $tmp_sql &&
echo "tmp_sql in zip" &&
zip -q $new_backup $tmp_sql &&
echo "remove tmp_sql" &&
rm $tmp_sql &&
#echo "project in zip" &&
#zip -qr $new_backup $project_dir -x /var/www/pr/public/storage/* -x /var/www/pr/public/uploads/* -x /var/www/pr/storage/app/* &&
du -h $new_backup &&
echo "ready ${new_backup}"
CRON in ubuntu server
sudo apt update
sudo apt install cron
sudo systemctl enable cron Для включения работы в фоне
Файлы хранятся тут
/var/spool/cron/crontabs/
sudo nano /etc/crontab
НО в них лучше не лезть
Управлять всем через
crontab -l Содержимое
crontab -e Редактирование
r удалить
Для определённого пользователя
sudo crontab -u www-data -e
sudo crontab -u www-data -l
* * * * * echo ‘Run this command every minute’ >> /root/file.log
* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1
минута 0–59
час 0–23
День месяца 1–31
месяц 1–12 или ЯНВ–ДЕК
День недели 0–6 или ПНД–ВСК
Каждую минуту:
* * * * *
каждый час в 15 минут:
15 * * * *
Каждый день в 03:15 запускать скрипт:
15 3 * * * ~/script.sh
Каждый понедельник:
0 0 * * 1
Каждый четный час:
* */2 * * *
или
* 0,2,4,6,8,10,12,14,16,18,20,22 * * *
Каждые 10 минут:
*/10 * * * *
Новый год:
59 23 31 dec *
Каждый будний день в 22:00:
0 22 * * 1-5
Для get запросов
wget -O /root/tmp_wget.txt --no-check-certificate "https://site.ru?a=1" >/dev/null 2>&1
*/5 * * * * sh /root/create_backup.sh >/dev/null 2>&1
service cron status
service cron start
service cron stop
service cron restart
sh bash
# Удалить если есть файл
if [ -f $final_file ]; then
rm $final_file
fi
# Создать если нет файла
if [ ! -f $final_file_log ]; then
touch $final_file_log
fi
# Если нет этой папки, то создаём
if [ ! -d $folder_backups ]; then
mkdir -p $folder_backups
fi
linux отложенные задачи
ctrl c закрыть
ctrl z приостановить
jobs посмотреть приостановленные
fg %1 вернуться
command & запускает в фоновом при старте
если после ctrl z ввести bg,
то он запустит тот процесс в фоновом режиме
если после этого просто fg
то он вернется как активный
Форматируем диск linux bash
https://www.youtube.com/watch?v=6L7NP4K1O5Q
какие диски есть
lsblk
для форматирования
sudo wipefs --all /dev/Выбранный_диск
sudo wipefs --all /dev/sdb
Создать раздел
sudo cfdisk /dev/Выбранный_диск
sudo cfdisk /dev/sdb
gpt
всё
запись
yes
lsblk
sudo mkfs.ext4 /dev/Выбранный_диск_из_раздела
sudo mkfs.ext4 /dev/sdb1
дать название (ext4)
sudo e2label /dev/sdb1 "NAME1"
sudo mkdir -p /disks/d
js инверсия страницы
js
document.getElementsByTagName('body')[0].style.cssText = 'filter: invert(1)';
После переустановки linux
sudo apt install kde-plasma-desktop
sudo apt install telegram-desktop
neofetch
apt-get install --reinstall locales
apt update && apt upgrade
sudo apt install wireguard-tools
sudo apt install plasma-nm
- Настроить расположение экранов
- Протестить VSync
- Переключение языка
- Сети (И убрать галочку автоматическое включение)
- Темный режим
- Убрать заставку
- Открытие окна по двойному клику
Настройки, поведение раб среды, Основн парам, выбрать выделяет обьект
- Скриншоты На клавишу
Настройки комбинации комбинации Добавить приложение Flameshot
- Буфер обмена
- Уход в сон отменить
Настройки, управление питанием, и все галочки убрать
- 3 рабочих стола
Настройки, поведение раб среды, Вирт раб столы, Добавить, отключить анимац переходов
Редактировать панель, переместить их в право, и высоту сделать 38
- у телеграмма убрать оконный (меню / настр / Продвин настр/ системн рамка окна (в названии окна))
- У фаерфокс выключить ускорение
В настройках, в поиске [произв]
и убираем 2 галочки:
Использовать рекомендуемые настро
По возможности использовать аппара
- Установка офиса
- Отключить анимацию
- Настроить пуск
Прав кнопкой, настроить виджет, иконка, все, и в поиске menu
- Убрать переключение рабочих столов по скроллу
Правой кнопкой по рабоч столу
настроить рабочий стол и обои
Действия мыши
php sql Мультизапрос
function get_sql() {
$sql = new mysqli(
'localhost',
'',
'',
''
);
if ($sql->connect_errno) {
print_r([$sql->connect_errno, $sql->connect_error]);
exit();
}
$sql->set_charset('utf8');
return $sql;
}
function query_sql_select($request) {
$result = [];
$sql = get_sql();
if ($query = $sql->multi_query($request)) {
do {
if ($res = $sql->store_result()) {
while ($array = $res->fetch_array(MYSQLI_ASSOC)) {
$result[] = $array;
}
$res->free();
}
} while ($sql->more_results() && $sql->next_result());
} else {
// Обработка ошибки SQL
print_r([$sql->errno, $sql->error]);
}
$sql->close();
return $result;
}
nano команды
-j прокрутка на половину экрана, а не на строку
-k Вырезать от курсора до конца строки
-l номера строк перед текстом
-m использовать мышку
nano -l nano1.txt номера строк
nano -B /etc/hello.txt Бэкапнуть при сохранении
nano +6,4 /etc/hello.txt в 6 строку, 4 символ
ctrl o, ctrl s сохранить
ctrl x выход
ctrl g справка
ctrl y вверх
ctrl v вниз
alt 6 копировать
ctrl k вырезать
ctrl u вставить
поиск
ctrl w
ctrl q
по найденным
alt w
alt q
поиск и замена alt r
alt u отменить
alt e повторить
alt n включить номера строк
alt p видимые пробелы
alt x убрать нижнюю панель
ctrl l обновить экран
alt a начать выделение
Битрикс api смена логина и пароля
<?php
$id = 1;
$newLogin = '';
$newPassword = '';
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
global $USER;
$USER->Update($id, [
'EMAIL' => $newLogin,
'LOGIN' => $newLogin,
'PASSWORD' => $newPassword,
'CONFIRM_PASSWORD' => $newPassword
]);
echo $USER->LAST_ERROR;
?>1
Настройки php сервера для битрикс
for ubuntu server
apt install nginx php8.1 php8.1-fpm php8.1-mbstring php8.1-curl php8.1-imap php8.1-mysql php8.1-xml php8.1-xmlrpc php8.1-xsl php8.1-zip php8.1-opcache php8.1-pgsql php8.1-soap php8.1-gd freetype2 mariadb-derver mariadb-client
nano /etc/php/8.1/fpm/php.ini
short_open_tag = On
max_input_vars = 10000
memory_limit = 512M
zlib.output_compression = On
post_max_size = 512M
upload_max_filesize = 1G
mbstring.internal_encoding = UTF-8
opcache.revalidate_freq=0
nano /etc/php/8.1/fpm/pool.d/www.conf
pm.max_children = 16
service php8.1-fpm restart
systemctl enable php8.1-fpm.service
nano /etc/mysql/mariadb.conf.d/50-server.cnf
key_buffer_size = 3G
max_allowed_packet = 3G
max_connections = 1000
mysql_secure_installation
mysql -u root -p
CREATE DATABASE base1;
CREATE USER 'user1' IDENTIFIED BY 'password1';
GRANT ALL ON base1.* TO 'user1'@localhost IDENTIFIED BY 'password1';
FLUSH PRIVILEGES;
exit
systemctl restart mariadb.service
systemctl enable mariadb.service
mkdir /var/www/site.com/
wget https://dev.1c-bitrix.ru/download/scripts/bitrix_server_test.php -P /var/www/site.com
wget https://www.1c-bitrix.ru/download/files/scripts/restore.php -P /var/www/site.com
//cp /root/bitrix_server_test.php /var/www/site.com/
//cp /root/restore.php /var/www/site.com/
chmod -R 755 /var/www/site.com/
chown -R www-data:www-data /var/www/site.com/
nano /etc/nginx/sites-enabled/site.com.conf
systemctl restart nginx.service
systemctl enable nginx.service
Если ldap не запускается нет контакта contact
sudo apt install php8.1-ldap
sudo nano /etc/php/8.1/fpm/php.ini
раскомментил extension=ldap
sudo service php8.1-fpm restart
sudo service php-fpm status
Добавь в
nano /etc/ldap/ldap.conf
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
TLS_CACERTDIR /etc/ssl/certs
TLS_REQCERT never
php ldap active directory Подключение и проверка пользователя
<?php
function checkLdapLogin($login, $password) {
$ldap_connection = ldap_connect('ldaps://192.000.000.000', PORT_INT);
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap_connection, LDAP_OPT_TIMELIMIT, 0);
$ldap_bind = ldap_bind($ldap_connection, 'adminh@user.com', 'PASS');
if (!$ldap_bind) {
echo 'Нет подключения к ldap!';
return false;
}
// Поиск
$search_result = ldap_search(
$ldap_connection,
'DC=corp,DC=armango,DC=net',
"(sAMAccountName=$login)"
);
$entries = ldap_get_entries($ldap_connection, $search_result);
if (empty($entries)) {
return false;
}
// Проверка по доступу пользователя
return ldap_bind($ldap_connection, $entries[0]['dn'], $password) ?
true : false;
}
echo '['.checkLdapLogin('USER_TEST', 'PASS2_TEST').']';
golang book 11
можно откладывать только вызовы функций или методов
получение списка файлов в каталоге
package main
import (
"fmt"
"io/ioutil"
"log"
)
func main() {
files, err := ioutil.ReadDir("./")
if err != nil {
log.Fatal(err)
}
for _, file := range files {
if file.IsDir() {
fmt.Println("Dir ", file.Name())
} else {
fmt.Println("File ", file.Name())
}
}
}
циклы быстрее рекурсии!
рекурсия
showDirRecurses.go
package main
import (
"fmt"
"io/ioutil"
"log"
)
func showAllFiles(way string) {
files, err := ioutil.ReadDir(way)
if err != nil {
log.Fatal(err)
}
for _, file := range files {
if file.IsDir() {
showAllFiles(way + "/" + file.Name>
//fmt.Println("Dir ", file.Name())
} else {
fmt.Println("File ", file.Name())
}
}
}
func main() {
showAllFiles("./")
}
другой метод соединения
path/filepath
filePath := filepath.Join(path, file.Name())
для авариного завершения
panic("aaaaaa")
399
функция паники покажет путь к ней по функциям
recover() восстановиться
выводит текст ошибки и забивает на панику
package main
import "fmt"
func regen() {
fmt.Println(recover())
}
func freak() {
defer regen() // Обязательно в другой функции!
panic("aaaa")
}
func main() {
freak()
fmt.Println("text")
}
Лучше пользоваться обработкой ошибок, чем этмми исключениями паник..
горутины
расходуют меньше памяти, чем потоки
они конкурируют меж собой, кто свободен, тот и берет задачу
413
читаем веб страницу
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
response, err := http.Get("https://h7team.ru")
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
fmt.Println(len(body))
}
документация
go doc http Get
go перед функцией или методом ставит ее паралельно
остановка временно
time.Sleep(time.Second * 60) минута
package main
import (
"fmt"
"time"
)
func manyPrint(str string, quantity int) {
for i := 0; i < quantity; i++ {
fmt.Print(str)
}
}
func main() {
go manyPrint("0", 50)
go manyPrint("1", 50)
manyPrint("2", 100)
time.Sleep(time.Second * 5)
}
222222222222222
110001111000011
Каналы
Для контроля порядка горутин
и передача данных от одной го рутины другой
подобие колбэки
горутины не могут возвращать значения
подобие асинхронности в js
var myChannel chan float64
myChannel = make(chan float64)
или
myChannel := make(chan float64)
func send(myChanel chan string) {
myChannel <- "hi"
}
func main() {
myChannel := make(chan float64)
go send(myChannel)
fmt.PrintLn(<-myChannel)
}
425
package main
import (
"fmt"
)
func abc(channel chan string) {
channel <- "a"
channel <- "b"
channel <- "c"
}
func def(channel chan string) {
channel <- "d"
channel <- "e"
channel <- "f"
}
func main() {
channel1 := make(chan string)
channel2 := make(chan string)
go abc(channel1)
go def(channel2)
fmt.Print(<-channel1)
fmt.Print(<-channel2)
fmt.Print(<-channel1)
fmt.Print(<-channel2)
fmt.Print(<-channel1)
fmt.Print(<-channel2)
}
есл отправка нескольких данных из горутины, то вторая блокируется до тех пор пока первая ее не спрашивает, когда первая спрашивает, тогда вторая начинает заниматься
грубо если не просит, то вторая и не делает
package main
import (
"fmt"
"time"
)
func wait(name string, delay int) {
for i := 0; i < delay; i++ {
fmt.Println(name, " sleep")
time.Sleep(time.Second)
}
}
func send(channel chan string) {
wait("send", 3)
fmt.Println("val1")
channel <- "a"
fmt.Println("val2")
channel <- "b"
}
func main() {
channel := make(chan string)
go send(channel)
wait("main", 5)
fmt.Println(<-channel)
fmt.Println("podumai")
fmt.Println(<-channel)
}
main sleep
send sleep
main sleep
send sleep
send sleep
main sleep
val1
main sleep
main sleep
a
podumai
val2
b
Как бы второй ответ начинает создаваться только тогда, когда был выполнен первый
видимо он не создается, когда канал занят первым
package main
import (
"fmt"
"time"
)
func wait(name string, delay int) {
for i := 0; i < delay; i++ {
fmt.Println(name, " work")
time.Sleep(time.Second)
}
}
func send(channel chan string) {
wait("rab", 3)
fmt.Println("val1")
channel <- "a"
wait("rab", 15)
fmt.Println("val2")
channel <- "b"
}
func main() {
channel := make(chan string)
go send(channel)
wait("bos", 10)
fmt.Println(<-channel)
fmt.Println("obed")
wait("bos", 8)
fmt.Println(<-channel)
fmt.Println("to home")
}
427
GNU nano 7.2 rutinSizeSite.go
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func responseSize(url string, channel chan int) {
fmt.Println("Get ", url)
responce, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer responce.Body.Close()
body, err := ioutil.ReadAll(responce.Body)
if err != nil {
log.Fatal(err)
}
channel <- len(body)
}
func main() {
sizes := make(chan int)
urls := []string{
"https://h7team.ru",
"https://google.com",
"https://ya.ru",
}
for _, url := range urls {
go responseSize(url, sizes)
}
for i := 0; i < len(urls); i++ {
fmt.Println(<-sizes)
}
}
431
Изменить права на директорию папку bash sh linux
ls -alh /var/www/site.com/bootstrap
sudo chmod -R 755 /var/www/site.com/bootstrap/cache
sudo chown -R user:www-data /var/www/site.com/bootstrap/cache
js удалить элемент
const h1 = document.querySelector('h1')
const parent = h1.parentNode
parent.removeChild(h1)
или
element.parentNode.removeChild(element)
Quake Live quake 3 arena
угол обзора
/cg_fov 110
/g_gametype sniper
Подключаемся
ipconfig
ifconfig
/connect 192.168.__.__:27960
Добавить ботов
/addbot Trainer 5 0 1000 Trainer1
/addbot Hunter 5 0 1000 Hunter1
/addbot Slash 5 0 1000 Slash1
/addbot Mynx 5 0 1000 Mynx1
/addbot Crash 5 0 1000 Crash1
/addbot Daemia 5 0 1000 Daemia1
/addbot Major 5 0 1000 Major1
/addbot Angel 5 0 1000 Angel_top
/addbot Lucy 5 0 1000 Lucy1
Создать sql базу данных через консоль
Добавить пользователя, через ssh с правами на просмотр
код.
ОБЯЗАТЕЛЬНО У ПАРОЛЯ ОДИНАРНЫЕ КОВЫЧКИ!!!
mysql --user="root" --password='pass0'
CREATE USER 'user1'@'%' IDENTIFIED BY 'pass1';
GRANT SELECT ON * . * TO 'user1'@'%';
GRANT SELECT, CREATE ON * . * TO 'user1'@'%';
REVOKE SELECT ON * . * TO 'user1'@'%';
mysql --user="root" --password="pass1"
CREATE USER 'user1'@'%' IDENTIFIED BY 'pass2';
CREATE DATABASE bd1;
USE bd1
GRANT CREATE, ALTER, SELECT, INSERT, UPDATE, DELETE ON bd1 . * TO user1;
GRANT DROP ON bd1 . * TO user1;
REVOKE DROP ON bd1 . * TO user1;
..
Список прав
CREATE — Позволяет пользователям создавать базы данных/таблицы
SELECT — Разрешает делать выборку данных
INSERT — Право добавлять новые записи в таблицы
UPDATE — Позволяет изменять существующие записи в таблицах
DELETE — Даёт право удалять записи из таблиц
DROP — Возможность удалять записи в базе данных/таблицах
аб. https://www.hostinger.ru/rukovodstva/kak-sozdat-polzovatelya-mysql-i-nastroit-prava-dostupa/ Подробная инструкция
Архивировать с консоли sh bash
Архив
sudo apt install zip unzip
zip -r /path/to/files/*
unzip archive.zip
zip -r data.zip data/
zip -qr data.zip data/ Тихо
unzip имя_файла.zip -d /tmp
Linux стать root
sudo su
или
sudo -i
MX Linux ubuntu
sudo apt install telegram-desktop
sudo apt install anydesk
sudo apt install chromium-browser
lemp arch linux
sudo pacman -S nginx mysql php php-fpm php-mysql
sudo nano /etc/nginx/nginx.conf
http {
...
types_hash_max_size 2048;
types_hash_bucket_size 64;
...
}
sudo nginx -t
sudo systemctl start nginx.service
sudo systemctl restart nginx.service
sudo systemctl status nginx.service
/etc/php/php.ini
sudo systemctl restart php-fpm.service
kubernetes arch linux
kubernetes
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
sudo pacman -S docker kubectl
kubectl cluster-info
kubectl run my-app --image=nginx --port=80
Модификация битрикс ядра
Проверить ядро на модификацию
/bitrix/admin/checklist.php тест "Ядро проекта не модифицировалось"
Перезагрузить ядро
/bitrix/admin/update_system.php?BX_SUPPORT_PROTOCOL21=Y
21 - текущий день месяца
cron инструкция
https://dev.1c-bitrix.ru/community/webdev/user/8078/blog/implementation-of-all-agents-in-cron/,
golang book 10
для проверки количества символов в строке
подключаем
unicode/utf8
if utf8.RuneCountInString(title) > 20
packege calendarmark
import (
"unicode/utf8"
"my/date"
)
type Event struct {
title String
Date
}
func (e *Event) Title() string {
return e.title
}
func (e *Event) Title(title string) string {
if utf8.RuneCountInString(title) > 20 {
return errors.New("invalit title")
}
etitle = title
return nill
}
Интерфейсы
это набор средств для взаимодействия с программой
type MyInterface interfacee {
method1()
method2(float64) что получает
method3() string что возвращает
}
обьявляем переменные, использующие интерфейс
var value mypkg.MyInterface
value.method1()
интерфейс просто описывает, какие методы обязательно содержать
package main
import "fmt"
type Whistle string
func (w Whistle) MakeSound() {
fmt.Println("Tweet!")
}
type Horn string
func (h Horn) MakeSound() {
fmt.Println("Honk!")
}
type NoiseMaker interface{ MakeSound() }
func main() {
var toy NoiseMaker // Хоть тут тип интерфейс
toy = Whistle("Toyco Canary") // Все равно присваиваем переменную
toy.MakeSound()
toy = Horn("Toyco Blaster")
toy.MakeSound()
}
еще интерфейс блокирует доступ к сторонним функциям
при присвоение в интерфейс
интерфейс = что-то
мы можем вызывать только функции интерфейса
Утверждение типа
как я понял, это передача данных интерфейса в тот же тип
var mark1 Marker = Robot("12")
var robot Robot = Marker.(Robot)
robot, ok := Marker.(Robot)
ok true false
если доставать не тот тип из интерфейса,
то именно во время выполнения (не компиляции) будет паника
при таком возврате, есть второе возвращаемое значение
где если true то все норм передалось
false все пошло не как надо
и если ок, то используем необходимые функции
error это тоже интерфейс, который есть по умолчанию
package main
import (
"fmt"
"log"
)
type OverError float64
func (o OverError) Error() string {
return fmt.Sprintf("Over %02f", o)
}
func checkTemperature(actual float64, safe float64) error {
excess := actual - safe
if excess > 0 {
return OverError(excess)
}
return nil
}
func main() {
var err error = checkTemperature(121.379, 100.0)
if err != nil {
log.Fatal(err)
}
}
по правилам этикета в тип необходимо добавлять метод
Stringer
для красивого вывода
376
так же рно воспринимается по умолчанию для вывода
type Milliliters float64 func (m Milliliters) String() string {
return fmt.Sprintf("%0.2f mL", m)
}
func main() { fmt.Println(Gallons(12.09248342)) fmt.Println(Liters(12.09248342)) fmt.Println(Millilite rs(12.09248342))
}
для документаций
go doc
interface{} пустой интерфейс
это для передачи значения любого типа в функцию
интерфейс не описывает что, он говорит только действия
383
os.Args содержит все аргументы запуска программы
всегда закрывайте файлы при чтении
чтоб экономить ресурсы
defer
она откладывает действие на момент завершения функции либо программы
package main
import "fmt"
func Socialize() {
defer fmt.Println("1")
defer fmt.Println("2")
fmt.Println("3")
fmt.Println("4")
}
func main() {
Socialize()
Socialize()
}
34213421
defer
пофигу на return
и они закрываются снизу вверх
и вызывается до вывода ошибки
программа для сумиирования float64
с файла
sumFloat64File.go
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
)
func OpenFile(fileName string) (*os.File, error) {
fmt.Println("Opening ", fileName)
return os.Open(fileName)
}
func CloseFile(file *os.File) {
fmt.Println("Closing file")
file.Close()
}
func GetFloats(fileName string) ([]float64, error) {
var numbers []float64
file, err := OpenFile(fileName)
if err != nil {
return nil, err
}
defer CloseFile(file)
scaner := bufio.NewScanner(file)
for scaner.Scan() {
number, err := strconv.ParseFloat(scaner.T>
if err != nil {
return nil, err
}
numbers = append(numbers, number)
}
if scaner.Err() != nil {
return nil, scaner.Err()
}
return numbers, nil
}
func main() {
numbers, err := GetFloats(os.Args[1])
if err != nil {
log.Fatal(err)
}
var sum float64 = 0
for _, number := range numbers {
sum += number
}
fmt.Printf("Sum: %0.2f\n", sum)
}
385
YAY (AUR)
Установка
pacman -S --needed git base-devel
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
Основные команды использования, например, для поиска пакета или приложения:
1
yay -Ss <package-name>
Чтобы установить приложение с помощью yay:
1
yay -S <package-name>
Если вы хотите выполнить обновление системы
1
yay -Syu
Обновите систему, включая установленные пакеты AUR.
1
yay -Syua
yay Псевдоним yay -Syu.
yay <Search Term> Настоящее меню выбора установки пакета.
yay -Bi <dir> Установите зависимости и создайте локальный PKGBUILD.
yay -G <AUR Package> Скачать PKGBUILD из ABS или AUR. ( yay v12.0 + )
yay -Gp <AUR Package> Печать на стандартный PKGBUILD из ABS или AUR.
yay -Ps Печать системы статистики.
yay -Syu --devel Выполните обновление системы, а также проверьте наличие обновлений пакета разработки.
yay -Syu --timeupdate Выполните обновление системы и используйте время модификации PKGBUILD (, а не номер версии ), чтобы определить обновление.
yay -Wu <AUR Package> Unvote для пакета ( Требуется настройка AUR_USERNAME и AUR_PASSWORD переменные среды ) ( yay v11.3 + )
yay -Wv <AUR Package> Голосовать за пакет ( Требуется настройка AUR_USERNAME и AUR_PASSWORD переменные среды ). ( yay v11.3 + )
yay -Y --combinedupgrade --save Сделайте комбинированное обновление режима по умолчанию.
yay -Y --gendb Создать базу данных пакетов разработки, используемую для обновления devel.
yay -Yc Очистите ненужные зависимости.
Собранные пакеты хранятся по адресу ~/home/(имя_пользователя)/.cache/yay
fish in Linux
Установка:
sudo pacman -S fish
Запуск fish через .bashrc
Оставьте Bash оболочкой по умолчанию и просто добавьте строку exec fish в подходящий файл настроек Bash, например .bashrc. Это позволит Bash правильно выполнить source файла /etc/profile и всех файлов в /etc/profile.d/. Поскольку процесс Bash полностью заменяется на процесс fish, выход из fish также приведёт к выходу из терминала.
файл находится здесь
~/.bashrc
flatpak в Linux
Добавить удалённый репозиторий
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
удалить репозиторий
flatpak remote-delete flathub
поиск приложений
flatpak search gimp
Установка приложений
$ flatpak install flathub org.gimp.GIMP
Начиная с Flatpak 1.2, команда install может искать приложения. просто:
$ flatpak install gimp
Запуск приложений
flatpak run org.gimp.GIMP
Обновление
flatpak update
Список установленных приложений
flatpak list
Для того, чтобы просто вывести список установленных приложений, запустите:
$ flatpak list --app
Чтобы удалить приложение, запустите:
$ flatpak uninstall org.gimp.GIMP
Чтобы удалить среды выполнения и расширения, которые не используются установленными приложениями, используйте:
$ flatpak uninstall --unused
Чтобы узнать, какие изменения были внесены в вашу установку Flatpak с течением времени, вы можете просмотреть журналы (начиная с 1.2):
$ flatpak history
команды pacman в Arch Linux
Избегайте определенных команд pacman
Избегать делать частичные обновления. Другими словами, никогда не беги pacman -Sy; вместо этого всегда используйте pacman -Syu.
Установка определенных пакетов
# pacman -S package_name1 package_name2 ...
Удаление пакетов
Чтобы удалить один пакет, оставив все его зависимости установленными:
# pacman -R имя_пакета
Чтобы удалить пакет и его зависимости, которые не требуются ни одним другим установленным пакетом:
# pacman -Rs имя_пакета
Вышеуказанное может иногда отказываться запускаться при удалении группы, которая содержит необходимые пакеты. В этом случае попробуйте:
# pacman -Rsu имя_пакета
Команда pacman -Qdtq показывает нам список ненужных зависимостей. Однако для их устранения необходимо комбинировать его с pacman -R. Это выглядело бы так:
pacman -Rs $(pacman -Qdtq)
В будущем не забывайте удалять пакеты с помощью параметра -Rs (R для удаления рассматриваемого пакета, s для удаления всех его зависимостей).
pacman -Rs mypackage
Поскольку мы занимаемся очисткой нашей системы, мы также можем увидеть, как очистить системный кеш пакетов (то есть, как очистить загруженные пакеты, которые были позже установлены и которые pacman остались на вашем компьютере, на случай, если вам потребуется их переустановить или вернуть к более ранней версии).
pacman -Scc
Pacman сохраняет важные файлы конфигурации при удалении определенных приложений и называет их расширением: .pacsave. Чтобы предотвратить создание этих файлов резервных копий, используйте -n опция:
# pacman -Rn имя_пакета
Обновление пакетов
# pacman -Syu
Запрос баз данных пакетов
Пакман запрашивает локальную базу данных пакетов с -Q флаг, база данных синхронизации с -S флаг и база данных файлов с -F флаг. Посмотреть pacman -Q --help, pacman -S --help и pacman -F --help для соответствующих подварий каждого флага.
Pacman может искать пакеты в базе данных, ища как имена, так и описания пакетов:
$ pacman -Ss string1 string2 ...
Для поиска уже установленных пакетов:
$ pacman -Qs string1 string2 ...
Для отображения обширной информации о данном пакете:
$ pacman -Si имя_пакета
Для того, чтобы просмотреть список всех установленных пакетов в Arch Linux, можно использовать следующую команду:
pacman -Q
Очистка кэша пакета
Pacman хранит свои загруженные пакеты в /var/cache/pacman/pkg/ и не удаляет старые или неустановленные версии автоматически. Это имеет некоторые преимущества:
Это позволяет понижать пакет без необходимости извлекать предыдущую версию другими способами, такими как Архив Linux Архив.
Удаленный пакет можно легко переустановить непосредственно из каталога кэша, не требуя новой загрузки из хранилища.
Однако необходимо периодически очищать кэш, чтобы каталог не увеличивался бесконечно.
paccache ( 8 ) скрипт, предоставленный в Пакман-вклад пакет, удаляет все кэшированные версии установленных и неустановленных пакетов, за исключением самых последних трех, по умолчанию:
# paccache -r
Вы также можете определить, сколько последних версий вы хотите сохранить. Чтобы сохранить только одну предыдущую версию, используйте:
# paccache -rk1
Добавить -u/--uninstalled переключиться, чтобы ограничить действие paccache для удаленных пакетов. Например, чтобы удалить все кэшированные версии неустановленных пакетов, используйте следующее:
# paccache -ruk0
Чтобы удалить все кэшированные пакеты, которые в данный момент не установлены, и неиспользованную базу данных синхронизации, выполните:
# pacman -Sc
Чтобы удалить все файлы из кэша, дважды используйте чистый переключатель, это самый агрессивный подход, который ничего не оставит в каталоге кэша:
# pacman -Scc
Установите «локальный» пакет, который не из удаленного хранилища (, например, пакет из AUR):
# pacman -U /path/to/package/package_name-version.pkg.tar.zst
Установите «удаленный» пакет ( не из репозитория, указанного в Пакман's файлы конфигурации ):
# pacman -U http://www.example.com/repo/example.pkg.tar.zst
Синхронизация базы данных файлов:
pacman -Fy
Поиск пакета, содержащего файл, например.:
pacman -F pacman
pkgcacheclean
pkgcacheclean это приложение для очистки кэша пакетов pacman в Arch Linux.
pkgcacheclean [options] [preserve_number]
grub в Arch Linux
Для обновления информации о новых ядрах в загрузчике grub в Arch Linux выполните следующие шаги:
1. Откройте терминал.
2. Обновите систему:
```
sudo pacman -Syu
```
3. Используйте команду:
```
sudo grub-mkconfig -o /boot/grub/grub.cfg
```
Эта команда создаст новый файл конфигурации grub.cfg на основе информации о найденных ядрах и активных разделах в вашей системе.
4. Перезапустите компьютер, чтобы убедиться в том, что информация о новых ядрах успешно добавлена в загрузчик grub.
Настройка grub
Отключите подменю grub, чтобы все доступные версии ядра отображались на главном экране (а не в расширенных параметрах).
Настройте grub для вызова последней загруженной записи ядра и использования ее в качестве записи по умолчанию для загрузки в следующий раз.
Необходимо расскомментировать и указать следующее:
GRUB_DISABLE_SUBMENU = y
GRUB_DEFAULT="saved"
GRUB_SAVEDEFAULT="true"
Чтобы изменения вступили в силу, вам необходимо заново сгенерировать файл конфигурации. Для этого откройте терминал и выполните следующую команду:
$ sudo grub-mkconfig -o /boot/grub/grub.cfg