Linux nobaraproject
Если не запускается оболочка, то зажимаем 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 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
Установить
sudo dnf install firefox telegram -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
inxi -G
sudo kroko-cli get-gpus
sudo kroko-cli best-driver
sudo kroko-cli autoinstall
Файл не является графическим. Обмен 1С и битрикс
/bitrix/admin/1c_exchange.php
/upload/1c_exchange
Логирование обмена
https://h7team.ru/item/130/
$MESS["FILE_BAD_FILE_TYPE"] = "Файл не является графическим";
/bitrix/modules/main/lang/ru/classes/general/file.php
Вот тут вызов
/bitrix/modules/main/classes/general/file.php
В
/bitrix/modules/main/classes/general/file.php
Перед 3
return GetMessage("FILE_BAD_FILE_TYPE")
Добавляем
$file1 = fopen($_SERVER['DOCUMENT_ROOT'].'/logs/img.php', "a");
fwrite($file1, '<?php exit(); ?>'.date("Ymd H:i.s").' '.print_r([
'$arFile' => $arFile,
'$iMaxSize' => $iMaxSize,
'$iMaxWidth' => $iMaxWidth,
'$iMaxHeight' => $iMaxHeight,
'$access_typies' => $access_typies,
'$bForceMD5' => $bForceMD5,
'$bSkipExt' => $bSkipExt,
'$imgInfo' => $imgInfo,
'$flashEnabled' => $flashEnabled
], true));
fclose($file1);
Записываем логи обмена 1С и битрикс
в /bitrix/admin/1c_exchange.php
<? //exit();
$recording_logs = true;
function h7_add_log($array) {
$maximum_size = 1048576 * 5; // 1mb
$text = "\n\n\n@ ".date("Ymd H:i.s")."\n".print_r($array, true);
$url = $_SERVER['DOCUMENT_ROOT'].'/logs/log.php'; // $_SERVER['DOCUMENT_ROOT'].
if (file_exists($url)) {
if (filesize($url) > $maximum_size) {
rename($url, $_SERVER['DOCUMENT_ROOT'].'/logs/log_'.date("Ymd_His").'.php');
$text = "<?php return; ?>$text";
}
} else {
$text = "<?php return; ?>$text";
}
$file = fopen($url, "a");
fwrite($file, $text);
fclose($file);
}
if ($recording_logs) {
$result = [];
$content = file_get_contents('php://input');
if (!empty($content)) $result['HAVE_CONTENT'] = true;
foreach (['GET', 'POST', 'COOKIE', 'FILES'] as $i => $name) {
$value_name = '_'.$name;
$value = $$value_name;
if (!empty($value)) $result[$name] = $value;
}
if (
isset($_GET['type']) && isset($_GET['mode']) && isset($_GET['filename']) &&
$_GET['type'] === 'catalog' && $_GET['mode'] === 'import' &&
file_exists($_SERVER['DOCUMENT_ROOT'].'/upload/1c_catalog/'.$_GET['filename']) &&
!file_exists($_SERVER['DOCUMENT_ROOT'].'/logs/'.$_GET['filename']) &&
copy(
$_SERVER['DOCUMENT_ROOT'].'/upload/1c_catalog/'.$_GET['filename'] ,
$_SERVER['DOCUMENT_ROOT'].'/logs/'.$_GET['filename']
)
) {
$result['FILE_SAVE'] = $_GET['filename'];
}
if (!empty($result)) {
$result['DATE'] = date("Y-m-d H:i:s");
$result['IP'] = $_SERVER['REMOTE_ADDR'];
$result['HEADERS'] = getallheaders();
h7_add_log($result);
}
}
function save_buffer($buffer) {
h7_add_log([
'DATE' => date("Y-m-d H:i:s"),
'ANSWER' => $buffer
]);
return $buffer;
}
if ($recording_logs) { ob_start('save_buffer'); }
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/admin/1c_exchange.php");
if ($recording_logs) { ob_end_flush(); }
php создать быстро логи logs
$file1 = fopen($_SERVER['DOCUMENT_ROOT'].'/logs/log.php', "a");
fwrite($file1, '<?php exit(); ?>'.date("Ymd H:i.s").' '.print_r([
'$arFile' => $arFile,
], true));
fclose($file1);
Sqlite3 в php
// Если нет файла, то создаёт
$db = new SQLite3('./test.db');
$db->close();
//Открываем другую базу данных для работы
$db->open("another.db");
//Удаляем объект
unset($db);
CREATE TABLE users(id INTEGER, name TEXT, age INTEGER)
id INTEGER PRIMARY KEY AUTOINCREMENT
//Экранирование строк
$name = $db->escapeString($name);
//Для запросов без выборки данных
$sql = "INSERT INTO users (name, age) VALUES ('$name', 25)";
//Возвращает значение булева типа
$result = $db->exec($sql);
//Количество изменённых записей
echo $db->changes();
//Отслеживание ошибок
echo $db->lastErrorCode();
echo $db->lastErrorMsg();
Есть возможность готовить запрос
$sql = "INSERT INTO users (name, age) VALUES (:name, :age)";
//Готовим запрос
$stmt = $db->prepare($sql);
//Привязываем параметры
$stmt->bindParam(':name',$name);
$stmt->bindParam(':age',$age);
//Исполняем запрос
$result = $stmt->execute();
//Закрываем при необходимости
$stmt->close();
$sql = "SELECT name, age FROM users";
// В случае неудачи возвращает false
$result = $db->querySingle($sql);
//В $result - значение первого поля первой записи
$result = $db->querySingle($sql, true);
// В $result - массив значений первой записи
// Стандартная выборка
$result = $db->query($sql);
// Обработка выборки
$row = $result->fetchArray(); // SQLITE3_BOTH
// Получаем ассоциативный массив
$row = $result->fetchArray(SQLITE3_ASSOC);
// Получаем индексированный массив
$row = $result->fetchArray(SQLITE3_NUM);
Прога для просмотра Sqliteman, для винды
https://sourceforge.net/projects/sqliteman/files/latest/download
Или
https://sqlitebrowser.org/
Популярные вопросы по golang
1. Что такое Golang и зачем его использовать?
Golang, также известный как Go, является открытым исходным кодом языком программирования, разработанным в Google. Он создан для упрощения создания эффективных, надежных и масштабируемых приложений. Golang может быть использован для написания серверных приложений, веб-приложений, микросервисов, мобильных приложений и программного обеспечения для IoT и многого другого.
2. Как установить Golang на компьютер?
Golang может быть установлен с официального сайта go-lang.org. После загрузки установочного файла необходимо запустить его и следовать инструкциям по установке. Также есть другие способы установки Golang, например, через менеджеры пакетов или докер.
3. Как создать первую программу на Golang?
Для создания первой программы на Golang необходимо открыть текстовый редактор или интегрированную среду разработки (IDE) и написать следующий код:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
После этого необходимо сохранить файл с расширением .go и скомпилировать программу с помощью команды go build.
4. Как использовать пакеты в Golang?
Для использования пакетов в Golang необходимо импортировать их в свой код с помощью команды import. Например, для использования пакета fmt необходимо написать import "fmt". После этого можно использовать функции и переменные из пакета fmt.
5. Какие типы данных поддерживает Golang?
Golang поддерживает множество типов данных, включая целочисленные типы (int, uint), вещественные типы (float32, float64), логический тип (bool), строковый тип (string) и другие. Также в Golang есть композитные типы, такие как массивы, слайсы, карты и структуры.
6. Как работать с файлами в Golang?
Для работы с файлами в Golang используется пакет os. Например, чтобы открыть файл для чтения, можно использовать функцию os.Open:
file, err := os.Open("file.txt")
if err != nil {
// обработка ошибки
}
Затем можно читать данные из файла с помощью функции Read:
data := make([]byte, 1024)
_, err := file.Read(data)
if err != nil {
// обработка ошибки
}
7. Как выполнять многопоточную обработку данных в Golang?
В Golang для многопоточной обработки данных используется горутины (goroutines) и каналы (channels). Горутины позволяют выполнять асинхронные задачи, а каналы - передавать данные между горутинами. Например, можно использовать горутины для чтения данных из нескольких файлов и передачи их в общий канал:
func readFile(filename string, out chan<- []byte) {
file, err := os.Open(filename)
if err != nil {
// обработка ошибки
}
defer file.Close()
data := make([]byte, 1024)
for {
n, err := file.Read(data)
if err == io.EOF {
break
}
if err != nil {
// обработка ошибки
}
out <- data[:n]
}
close(out)
}
out := make(chan []byte)
go readFile("file1.txt", out)
go readFile("file2.txt", out)
for data := range out {
// обработка данных
}
8. Как тестировать код на Golang?
Для тестирования кода на Golang используется пакет testing. Тестовые функции должны начинаться с префикса Test, принимать на вход объект типа *testing.T и возвращать void. В тестовых функциях можно вызывать функции своего кода и проверять их результаты с помощью функиций проверки, таких как assert.Equal:
import "testing"
func TestAdd(t *testing.T) {
result := add(2, 3)
if result != 5 {
t.Errorf("expected 5, but got %d", result)
}
}
Golang SQLite example
Представим, что у нас есть база данных SQLite с таблицей "users", в которой хранится информация о пользователях в следующем формате:
- ID (целое число, первичный ключ)
- Name (текстовое поле)
- Age (целое число)
Для того, чтобы работать с этой базой данных в Golang, необходимо установить пакет "database/sql" и драйвер SQLite "mattn/go-sqlite3".
1. Подключение к базе данных:
Для начала необходимо открыть соединение с базой данных. Это можно сделать следующим образом:
```
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, err := sql.Open("sqlite3", "./users.db")
if err != nil {
panic(err)
}
defer db.Close()
}
```
В данном примере мы открыли соединение с базой данных "users.db", которая находится в той же директории, что и программа.
2. Создание таблицы:
Для создания таблицы необходимо выполнить SQL-запрос на языке SQL:
```
_, err = db.Exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
if err != nil {
panic(err)
}
```
Здесь мы создали таблицу "users" со столбцами "id", "name" и "age".
3. Добавление записи в таблицу:
Для добавления новой записи в таблицу необходимо выполнить SQL-запрос на языке SQL c использованием метода "Prepare" и "Exec" объекта "db":
```
stmt, err := db.Prepare("INSERT INTO users(name, age) values(?, ?)")
if err != nil {
panic(err)
}
defer stmt.Close()
_, err = stmt.Exec("John", 30)
if err != nil {
panic(err)
}
```
Здесь мы добавляем запись в таблицу "users" с именем "John" и возрастом 30.
4. Выборка данных из таблицы:
Для выборки данных необходимо выполнить SQL-запрос на языке SQL c использованием метода "Query" объекта "db":
```
rows, err := db.Query("SELECT id, name, age FROM users")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var age int
err = rows.Scan(&id, &name, &age)
if err != nil {
panic(err)
}
fmt.Println(id, name, age)
}
```
Здесь мы выбираем все записи из таблицы "users" и выводим их на экран.
5. Обновление записи в таблице:
Для обновления записи необходимо выполнить SQL-запрос на языке SQL c использованием метода "Prepare" и "Exec" объекта "db":
```
stmt, err = db.Prepare("UPDATE users SET age = ? WHERE name = ?")
if err != nil {
panic(err)
}
defer stmt.Close()
_, err = stmt.Exec(35, "John")
if err != nil {
panic(err)
}
```
Здесь мы обновляем возраст пользователя "John" на 35 лет.
6. Удаление записи из таблицы:
Для удаления записи необходимо выполнить SQL-запрос на языке SQL c использованием метода "Prepare" и "Exec" объекта "db":
```
stmt, err = db.Prepare("DELETE FROM users WHERE name = ?")
if err != nil {
panic(err)
}
defer stmt.Close()
_, err = stmt.Exec("John")
if err != nil {
panic(err)
}
```
Здесь мы удаляем пользователя по имени "John" из таблицы "users".
Это только небольшой пример использования Golang и SQLite. С помощью этих методов можно выполнять различные операции с базой данных SQLite и получать необходимые данные.
Словарь программиста для собеседования
Те слова, которые часто спрашивают на собеседованиях..
Так то ими ты можешь пользоваться, просто не знать, как это называется..
Функция высшего порядка — в программировании функция, принимающая в качестве аргументов другие функции или возвращающая другую функцию в качестве результата.
Domain Driven Design (DDD) подход к разработке приложений, основанный на выделении доменов (domain). набор принципов и схем, направленных на создание оптимальных систем объектов. Сводится к созданию программных абстракций, которые называются моделями предметных областей. В эти модели входит бизнес-логика, устанавливающая связь между реальными условиями области применения продукта и кодом.
SOLID
Single responsibility — принцип единственной ответственности
Open-closed — принцип открытости / закрытости
Liskov substitution — принцип подстановки Барбары Лисков
Interface segregation — принцип разделения интерфейса
Dependency inversion — принцип инверсии зависимостей
Принцип единственной обязанности / ответственности (single responsibility principle / SRP) обозначает, что каждый объект должен иметь одну обязанность и эта обязанность должна быть полностью инкапсулирована в класс. Все его сервисы должны быть направлены исключительно на обеспечение этой обязанности.
Принцип открытости / закрытости (open-closed principle / OCP) декларирует, что программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что эти сущности могут менять свое поведение без изменения их исходного кода.
Принцип подстановки Барбары Лисков (Liskov substitution principle / LSP) в формулировке Роберта Мартина: «функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом».
Принцип разделения интерфейса (interface segregation principle / ISP) в формулировке Роберта Мартина: «клиенты не должны зависеть от методов, которые они не используют». Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе. В итоге, при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют.
Принцип инверсии зависимостей (dependency inversion principle / DIP) — модули верхних уровней не должны зависеть от модулей нижних уровней, а оба типа модулей должны зависеть от абстракций; сами абстракции не должны зависеть от деталей, а вот детали должны зависеть от абстракций.
MVC
Модель — этот компонент отвечает за данные, а также определяет структуру приложения. Например, если вы создаете To-Do приложение, код компонента model будет определять список задач и отдельные задачи.
Представление — этот компонент отвечает за взаимодействие с пользователем. То есть код компонента view определяет внешний вид приложения и способы его использования.
Контроллер — этот компонент отвечает за связь между model и view. Код компонента controller определяет, как сайт реагирует на действия пользователя. По сути, это мозг MVC-приложения.
Функция - Фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. Функция может принимать параметры и должна возвращать некоторое значение, возможно void.
Метод - Это функция или процедура, принадлежащая какому-то классу или объекту.
Процедуры - Те же функции, которые ничего не возвращают (void).
Полиморфизм - Способность функции обрабатывать данные разных типов.
Пример: можешь передать функции как число, как строку, так массив и она всё это нормально обработает..
Инкапсуляция (в js замыкания) - Размещение в одном компоненте данных и методов, которые с ними работают.
Для других компонентов ограничение доступа к ненужным функциям/методам/переменным.
Типы языков программирования: Императивные Декларативные Смешанные.
Императивные (C, C++, Java)
Это описание того, как ты делаешь что-то.
Пример: Официант, возьми в руку листок и ручку, запиши на листке ручкой слово "бургер", повернись к кухне, иди до кухни, пока не будешь на расстоянии от неё на вытянутую руку, возьми там бургер, развернись в мою сторону, иди вперёд пока не будешь на расстоянии вытянутой руки от меня, отдай мне бургер..
Декларативные (SQL, HTML)
Описание того, что ты делаешь.
Пример: Официант, принеси мне бургер.
Смешанные (могут быть таковыми) JavaScript, C#, Python.
Динамическое программирование
способ решения сложных задач путём разбиения их на более простые подзадачи.
Часто многие из этих подзадач одинаковы. Подход динамического программирования состоит в том, чтобы решить каждую подзадачу только один раз, сократив тем самым количество вычислений. Это особенно полезно в случаях, когда число повторяющихся подзадач экспоненциально велико.
bitrix lom лом
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
global $USER;
$USER->Authorize(1);
?><a href="/">1</a>
golang book 9
карты
var myMap map[string]float64 = make(map[string]float64)
var myMap map[string]float64{}
создание карты
myMap = make(map[string]int)
myMap["bro"] = 5
fmt.Println(myMap["bro"])
литералы
var myMap map[string]float64{
"a":4.5,
"b":5.6
}
при обращении к несуществующему ключу, будет выведен нулевой ответ, или пустая строка
если обьявить карту, но не запихнуть туда значения, то сама переменная карты будет nil
от карты можно получить 2 значения
value, ok := myMap["a"]
где ok будлево и означает была ли заполнена ячейка по ключу
если проверить, есть ли ключ, то
_, ok := myMap["a"]
package main
import (
"fmt"
)
func main() {
list := []string{
"kot",
"kot",
"sova",
"kot",
"stol",
"sova",
"kot",
"kot",
}
myMap := map[string]int{}
for _, name := range list {
item, ok := myMap[name]
if ok {
item++
} else {
item = 1
}
myMap[name] = item
}
fmt.Printf("%#v\n", myMap)
}
Если надо удалить ключ и значение
delete(myMap, "a")
перебор карты
for key, value := range myMap {}
если только ключи, то
for key := range myMap {}
но порядок их доставания разный..
сортировка
import "sort"
names := []string{"b", "c","a"}
sort.Strings(names)
sort.Ints()
Структуры
var myStruct := struct {
v1 string
v2 int
}
При создании, полям присваивается нулевое значение
myStruct.v2 = 5
создаем свой тип
type myType struct {
}
обычно пишется после импорта
var v3 myType
если вы придумали тип, то нельзя назвать так переменную
При изменении структуры через ссылку, необходимо обращаться к самой структуре
package main
import "fmt"
type user struct {
name string
age int
}
func addAge(user0 *user) {
user0.age++
}
func main() {
var user1 user
user1.name = "ytatav"
user1.age = 19
addAge(&user1)
fmt.Printf("%#v\n", user1)
}
// main.user{name:"ytatav", age:20}
чтоб обратиться к полю структуры по указатклю
var value myStruct
value.myFiled = 3
var pointer *myStruct = &value
fmt.Println((*pointer).myFiled)
можно заменить
fmt.Println(pointer.myFiled)
при передаче указателей на структуры
сильно экономит память
структуры лучше хранить в src в headfirstgo
Для подключения пакета, где хранится тип
package magaz
type Product struct {
Name string
Price int
}
package main
import (
"magaz"
)
func main() {
var s magaz.Product
}
Короткие записи структур Литераллы
tovar := Product{Name:"aaa", Price:456}
Если не заполните поле, то там будет нулевой элкмент текущего типа
в структуре модет быть другая структура
type Product struct {
Name string
Price int
marka1 marka
}
product.marka1.name
когда структура внутри структуры, то можно забить на ее имя
type Product struct {
Name string
Price int
marka
}
тогда обращаться станет проще
product.marka.name1
если это встроенно, то можно сразу
product.name1 без марки
можно определить тип, который не отличается от стандартного
type Liters float64
type Gallons float64
var carF Gallons = Gallons(10.0)
преобразовать
carF = Gallons(Litters(40.0) * 0.264)
просто один тип вставляем в другой
создать метод новый
func (m MyType) sayHi() {
fmt.Println("Hi ", m)
}
value := MyType("world")
value.sayHi()
методы можно определять только там, где определен тип
Litters(2).toGallons()
package main
import "fmt"
type Num int
func (n *Num) Double() {
*n *= 2
}
func main() {
n1 := Num(4)
fmt.Println("orig ", n1)
n1.Double()
fmt.Println("new ", n1)
}
func (l Liters) ToGallons() Gallons { return Gallons(l * 0.264)
}
func (g Gallons) ToLiters() Liters { return Liters(g * 3.785) } func (g Gallons) ToMilliliters() Milliliters { return Milliliters(g * 3785.41) }
package main
import (
"fmt"
)
type Date struct {
Year int
Month int
Day int
}
func (d *Date) SetYear(year int) {
d.Year = year
}
func main() {
date := Date{}
date.SetYear(2023)
fmt.Println(date.Year)
}
ошибки при присваивании
подключаем
errors
а в самих функциях
if year < 1 {
return errors.New("inval year")
}
d.Year = year
return nil
а с наружи принимать так же
if err != nil {
log.Fatal(err)
}
Чтоб не давать прямой доступ переменным структур
то
выносим их в отдельный пакет,
начало их делаем с маленькой буквы
функции для записи и доставания делаем с большой буквы
для сохранения
date.SetDay(5)
для получения
date.Day()
инкапсуляция - скрытие данных однойчасти программы от кода другой
Golang download bitrix backup
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
fmt.Println("start")
url := "https://site.com/bitrix/backup/123.tar"
for i := 0; i < 100; i++ {
if i == 0 {
downloadFile(url)
} else {
newUrl := fmt.Sprintf("%s.%d", url, i)
downloadFile(newUrl)
}
}
}
func downloadFile(url string) {
fmt.Println("Скачиваю ", url)
// Создаем HTTP-запрос
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("Не удалось создать запрос:", err)
return
}
// Выполняем запрос
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("Не удалось выполнить запрос:", err)
return
}
defer resp.Body.Close()
// Получаем имя файла из заголовков ответа
/*
filename := resp.Header.Get("Content-Disposition")
if filename == "" {
// Если имя файла не указано в заголовках, то сгенерируем его случайным образом
filename = "file.zip"
}
*/
urlArray := strings.Split(url, "/")
filename := urlArray[len(urlArray)-1]
// Создаем файл на диске
file, err := os.Create(filename)
if err != nil {
fmt.Println("Не удалось создать файл:", err)
return
}
defer file.Close()
// Записываем содержимое файла в созданный файл на диске
_, err = io.Copy(file, resp.Body)
if err != nil {
fmt.Println("Не удалось записать данные в файл:", err)
return
}
fmt.Println("Файл успешно скачан и сохранен:", filename)
}
Архивировать с консоли sh bash
Архив
sudo apt install zip unzip
zip -r /path/to/files/*
unzip archive.zip
zip -r data.zip data/
sql Удалить все данные и индексы с таблицы, пересоздав её
TRUNCATE TABLE articles;
TRUNCATE TABLE article_chapter;
Доступ для запросов с другого сайта php ajax
// Заголовки для доступности
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Accept, X-PINGOTHER, Content-Type');
js console bot bitrix Для обьединения дублей контактов
let bot = {
getIframe: () => {
let iframe = document.getElementsByTagName('iframe')[0];
return iframe.contentDocument || iframe.contentWindow.document;
},
time: 500,
playStep: (number, timer1) => {
if (!timer1) timer1 = bot.time;
if (bot.active)
setTimeout(() => bot.steps[number](), timer1)
},
start: () => {
bot.active = true
bot.steps[0]()
},
active:false,
stop: () => {
bot.active = false
},
steps: [
() => {
let element = bot.getIframe().getElementsByClassName('crm-entity-merger-column-btn-radio-mark')[0]
if (!element) {
bot.playStep(0)
return;
}
element.click()
bot.playStep(1)
},
() => {
bot.getIframe().getElementById('mergeButton').click()
bot.playStep(0, 3000)
}
]
}
bot.start()
golang book 8
Сегменты
тот же массив, но без размера
var mySlice []string
mySlice = make([]string, 7)
example := make([]int, 5)
example[0] = 1
len(example)
litters := []string{"a", "b"}
из массива можно доставать части в сегменты
mySlice := myArray[1:3]
с какого индекса по какой (до второго индекса, не включая его) достать
если часть не указывать
myArray[:3]
myArray[:]
то с начала до конца массива
сегмент, это как отрезок массива
при изменении сегмента или массива, они видны в обеих случаях
append
прибавляет в коней сегмента
slice = append(slice, "d")
но там есть жоп
если с одного сегмента создаются разные, и в последнем что-то меняется, то изменения будут только в родителе
поэтому лучше при добавлении в сегмент присваивать в тот же сегмент..
так же можно добавлять сразу несколько
slice = append(slice, "d", "v")
если создать сегмент и не создавать в нем переменные, то сам сегмент вернет nil
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
)
func main() {
var numbers []float64
file, err := os.Open("data.txt")
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
//fmt.Println(scanner.Text())
number, err := strconv.ParseFloat(scanner.>
if err != nil {
log.Fatal(err)
}
numbers = append(numbers, number)
}
err = file.Close()
if err != nil {
log.Fatal(err)
}
if scanner.Err() != nil {
log.Fatal(scanner.Err())
}
fmt.Printf("%#v\n", numbers)
}
в случае ошибок с функций, необходимо возвращать пустое значение того же формата и саму ошибку,
либо nil вместо пустого значения
Аргументы командной строки
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Args)
}
0 аргумент - всегда путь к программе
если надо исключить, то
os.Args[1:]
Как делать функции с большим количеством параметров?
добавить ... перед последним типом
func zzz(p1 int, p2 ...string)
в p2 передается сегмент
package main
import (
"fmt"
)
func sredn(numbers ...float64) float64 {
var sum float64 = 0
for _, number := range numbers {
sum += number
}
return sum / float64(len(numbers))
}
func main() {
fmt.Println(sredn(100, 50))
fmt.Println(sredn(90.7, 89.7, 98.5, 92.3))
}
если вы хотите вставить сегмент вместо нескольких аргументов, то используйте многоточие, после сегмента
intSlice := []int{5, 10, 15}
myFunc(intSlice...)
golang book 7
если использовать папки, то
go install src/hw , в котором есть main.go
сохраняет всё в каталог bin
GOPATH переменная, путь рабочей области
для смены
export GOPATH="/code"
set GOPATH = "C:/code"
эта переменная каждый раз сбрасывается
если пакет с гита, то его лучше размещать в
src/github.com/user1/keyboard
есть быстрая установка с гита
go get github.com/user1/keyboard
так же можно посмотреть документацию по пакету
go doc strconv
go doc strconv ParseFloat
для добавления своей докумментации
// program
package p1
// ttt
// yyy
func ddd()
но документация для пакетов должна начинаться со слов Package имя пакета и продолжение
комменты для функций должны начинаться с имени функции
много документаций на golang.org
можно запустить свой сайт с документацией
godoc -http=:6060
http://localhost:6060/pkg/
для остановки ctrl c
тут будет всё, что установили на ваш комп
массивы
var myArray [4]string
myArray[0] = "do"
fmt.Println(myArray[0])
var arr [3]int
var arr [5]time.Time
что с незаполненн элементами массива,
они пустые, либо 0, как и при создании переменных
создать и сразу присвоить значения
var notes [7]string = [7]string{"do", "re", "mi", "fa", "so", "la", "ti"}
notes := [7]string{"do", "re", "mi", "fa", "so", "la", "ti"}
text := [3]string{
"This is a series of long strings",
"which would be awkward to place", "together on a single line",
}
с запятой, после последнего, тоже можно
через fmt.Println сразу можно выводить массив
чтоб отобразить массив через глагол, то
%#v
fmt.Printf("%#v\n", notes)
вывести длину массива
fmt.Println(len(notes))
вот безопасный перебор массива
for index, value := range myArray {
// Блок цикла.
}
если вам не нужен индекс, то кладем его в мусор переменной _
for _, note := range notes { fmt.Println(note)
}
превратить инт во float
weight := float64(index+1)
повар закупает мясо
package main
import (
"fmt"
)
func main() {
list := [3]float64{71.8, 56.2, 89.5}
var quantity float64
var result float64
for index, number := range list {
weight := float64(index+1)
quantity += weight
result += number * weight
fmt.Printf("%f * %f = %f , result = %f\n", number, weight,>
}
result /= quantity
fmt.Println(result)
}
go install github.com/headfirstgo/average
прочитать с файла данные
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("data.txt")
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
err = file.Close()
if err != nil {
log.Fatal(err)
}
if scanner.Err() != nil {
log.Fatal(scanner.Err())
}
}
golang book 6
func rrr (line string, times int) {}
package main
import "fmt"
func paintWall(width float64, height float64) {
area := width * height
fmt.Printf("%.2f litters need\n", area/10.0)
}
func main() {
paintWall(4.2, 3.0)
paintWall(5.2, 3.5)
paintWall(5.0, 3.3)
}
возврат из функций, в конце скобок пишем, какой тип возвращает, и обязательно должна вернуть
func rrr (number int) int {
return number*2
}
import errors
err := errors.New("eee")
fmt.Println(err.Error())
fmt.Println(err)
log.Fatal(err)
err := fmt.Errorf("eee %0.2f", 3.5)
fmt.Println(err.Error())
fmt.Println(err)
возврат нескольких значений
func rrr() (int, bool,string) {
return 1, true, "hello"
}
myInt, myBool, myString := rrr()
еще для возвращаемых значений можно задать имя, как подсказки, но возврат не изменится
func rrr() (number int, a bool, b string) {
func paintWall(width float64, height float64) (float64, error) {
if width < 0 {
return 0, fmt.Errorf("width < 0 %0.2f", width)
}
area := width * height
return area/10.0, nil
}
указатели адреса &a
amount := 6
fmt.Println(amount)
fmt.Println(&amount) // 0x1040a124
можно прочитать тип указателя
fmt.Println(reflect.TypeOf(&myInt))
// *int
*float64
*bool
var myIntPointer *int // эта переменная для хранения указателя
myIntPointer = &myInt
myIntPointer := &myInt
// значение по адресу
*myIntPointer
myInt := 4
myIntPointer = &myInt
fmt.Println(myIntPointer) // 0x104a123
fmt.Println(*myIntPointer) // 4
*myIntPointer = 8
так же обновляется переменная, с которой взят указатель
возврат указателя с функции
func createPointer() *float64 {
myFloat := 98.5
return &myFloat
}
func main() {
var myFloatPointer *float64 = createPointer()
fmt.Println(*myFloatPointer)
}
func printPointer(point *int) {
fmt.Println(*point)
*point += 1
}
показать адрес &a
вывести с адреса *b
хранения адресов в формате *int
функция приёма float с клавиатуры
inputFloat() (float64, error) {
reader := bufio.NewReader(os.Stdin)
input, err := reader.RiadString('\n')
if err != nil {
return 0, err
}
input = strings.TrimSpace(input)
number, err := strconv.ParseFloat(input, 64)
if err != nil {
return 0, err
}
return number, nil
}
go в папке польз
в ней
bin тут откомп код самой программы
pkg тут откомпил код пакетов
src для хранения исходного кода
пакеты должны быть обязательно в папках
src/my/my.go
package my
src/hi/main.go основная прога
названия пакетов только в нижнем регистре,
лучше, чтоб оно состояло из одного слова, если слов несколько, то пишем слитно в едином регистре (strconv)
Не используйте переменные, которые называются как пакеты
ib/go/src/consoleinput/consoleinput.go
package consoleinput
import (
"bufio"
"os"
"strconv"
"strings"
)
func InputFloat() (float64, error) {
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
return 0, err
}
input = strings.TrimSpace(input)
number, err := strconv.ParseFloat(input, 64)
if err != nil {
return 0, err
}
return number, nil
}
константы
const Ttt int = 3
const Ttt = 3
у них нет :=
и обычно обьявляются на уровне пакета
sql Если товар пропал с продажи, то удаляет его из избранного
if (!function_exists('get_sql')) {
function get_sql() {
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/php_interface/dbconn.php');
$sql = new mysqli(
$DBHost,
$DBLogin,
$DBPassword,
$DBName
);
if ($sql->connect_errno) {
add_log([$sql->connect_errno, $sql->connect_error]);
return false;
}
$sql->set_charset('utf8');
return $sql;
}
}
$sql = get_sql();
$sql->query("
DELETE b_redsign_favorite
FROM b_redsign_favorite
LEFT JOIN b_iblock_element AS element
ON b_redsign_favorite.ELEMENT_ID = element.ID AND
element.IBLOCK_ID = '20'
AND element.ACTIVE = 'Y'
WHERE
element.ID IS NULL
");
golang book 5
for
continue
break
package main
import (
"bufio"
"fmt"
"log"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
fmt.Println("Угадай число от 1 до 100")
rand.Seed(time.Now().Unix())
var target int = rand.Intn(100) + 1
win := false
for i := 10; i >= 0; i-- {
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
input = strings.TrimSpace(input)
num1, err := strconv.Atoi(input)
if err != nil {
log.Fatal(err)
}
if num1 > target {
fmt.Println("загаданное число мень>
continue
}
if num1 < target {
fmt.Println("загаданное число боль>
continue
}
win = true
break
}
if win {
fmt.Println("Победа")
} else {
fmt.Println("Провал, число было ", target)
}
}
Красивый вывод
fmt.Printf("About: %0.2f p", 1.0/3.0)
А тут возврат в строку
str := fmt.Sprintf("About: %0.2f p", 1.0/3.0)
fmt.Printf("About: %s = %d \n", "aaa", 5)
fmt.Printf("About: %f p \n", 3.0)
буква после % определяет тип глагола
%f числ с точк
%d число
%s строка
%t булево true или false
%v что угодно
%#v тут энтеры и табы не преобразуются \n
%T сам тип значения int, string
%% знак процента
%12s
%2d это минимальная длина, если текст меньше, то в начале он дополнится пробелами
%5.3f
5 - минимальная ширина всего числа (дробн часть и точк)
3 - ширина дробной части
%.3f да так тоже сработает
функции
func say() {}
say() вызов
после обьявления функции ее можно будет вызывать
если функция должна использ только внутри, то начинай ее с мелкой буквы
Самописная 1С интеграция 1
https://its.1c.ru/db/metod8dev/content/3314/hdoc
https://v8.1c.ru/tekhnologii/obmen-dannymi-i-integratsiya/standarty-i-formaty/protokol-obmena-s-saytom/
Обмен данными с Web-сайтом
Для решения задачи публикации информации о реализуемом товаре, размещения заказов на сайте, приема и обработки заказов и каталогов товаров непосредственно из интерфейсов системы "1С:Предприятие 8" фирмами "1С" и "1С-Битрикс" разработан открытый протокол взаимодействия WEB-сайта и прикладной торговой системы.
Функционально обмен делится на два бизнес-процесса:
1. Выгрузка на сайт коммерческих предложений (каталогов продукции).
2. Прием информации о заказах.
Первый бизнес-процесс обеспечивает публикацию на сайте каталога номенклатурных позиций. Второй необходим для передачи с сайта в информационную систему данных о заказах с сайта и дальнейшую синхронизацию статусов и параметров заказов.
В обоих случаях инициатором обмена выступает система "1С:Предприятие 8". Обмен электронными документами осуществляется в соответствии с форматами, описанными XML-схемой стандарта CommerceML, редакция 2.04 (Загрузить).
Выгрузка каталогов продукции
Каталоги для публикации на сайте выгружаются одним пакетом.
Начало сеанса
Выгрузка каталога начинается с того, что система "1С:Предприятие 8" отправляет http-запрос следующего вида:
http://<сайт>/<путь>/1c_exchange.php?type=catalog&mode=checkauth.
В ответ система управления сайтом передает системе "1С:Предприятие 8" три строки (используется разделитель строк "\n"):
слово "success",
имя Cookie,
значение Cookie.
Все последующие запросы к системе управления сайтом со стороны "1С:Предприятия 8" содержат в заголовке запроса имя и значение Cookie.
Запрос параметров от сайта
Далее следует запрос следующего вида:
http://<сайт>/<путь>/1c_exchange.php?type=catalog&mode=init
В ответ система управления сайтом передает две строки:
1. zip=yes, если сервер поддерживает обмен в zip-формате - в этом случае на следующем шаге файлы должны быть упакованы в zip-формате, или zip=no - в этом случае на следующем шаге файлы не упаковываются и передаются каждый по отдельности.
2. file_limit=<число>, где <число> - максимально допустимый размер файла в байтах для передачи за один запрос. Если системе "1С:Предприятие 8" понадобится передать файл большего размера, его следует разделить на фрагменты.
Выгрузка на сайт
"1С:Предприятие 8" формирует запросы вида:
http://<сайт>/<путь>/1c_exchange.php?type=catalog&mode=file&filename=<имя файла>
для выгрузки на сайт файлов в формате CommerceML. Обмен происходит в виде POST.
В случае успешной записи файла система управления сайтом выдает строку "success".
Пошаговая загрузка каталога
Из "1С:Предприятия 8" производится пошаговая загрузка каталога по запросу с параметрами вида:
http://<сайт>/<путь>/1c_exchange.php?type=catalog&mode=import&filename=<имя файла>
Во время загрузки система управления сайтом направляет ответ в одном из следующих вариантов.
1. Если в первой строке содержится слово "progress", это означает необходимость послать тот же запрос еще раз. В этом случае во второй строке будет возвращен текущий статус обработки, объем загруженных данных, статус импорта и т. д.
2. Если в ответ передается строка со словом "success", то это будет означать сообщение об успешном окончании обработки файла.
3. Если в ходе запроса произошла ошибка, то в первой строке ответа системы управления сайтом будет содержаться слово "failure", а в следующих строках - описание ошибки, произошедшей в процессе обработки запроса.
4. Если произошла необрабатываемая ошибка уровня ядра продукта или sql-запроса, то будет возвращен html-код.
Прием заказов с сайта
Заказы, оформленные на сайте, загружаются в систему "1С:Предприятие 8".
При этом соблюдаются следующие 8 правил:
1. При передаче в систему "1С:Предприятие 8" в заказе устанавливается категория "Заказ с сайта".
2. При формировании заказа в системе "1С:Предприятие 8" записываются номер и дата заказа, с которыми он оформлен на сайте.
3. Поиск контрагента осуществляется по ИНН (индивидуальный номер налогоплательщика) или наименованию (в зависимости от настроек).
4. При загрузке заказа производится поиск договора с контрагентом. Договор ищется среди существующих договоров с клиентом, с признаком ведения взаиморасчетов по заказам (по указанной в настройках загрузки Организации). Если не находится ни один договор, то создается новый.
5. При загрузке заказа загружаются все его свойства, переданные с сайта. Свойства ищутся в системе "1С:Предприятие 8" по наименованию. Если с таким наименованием свойства нет, то заводится новое свойство со значениями типа строка или число.
6. Заказ может модифицироваться в системе "1С:Предприятие 8", при этом его изменения будут выгружаться на сайт.
7. Если заказ оплачивается или отгружается в системе "1С:Предприятие 8", то "состояния" заказа по оплате и по отгрузке выгружаются на сайт только при полном выполнении операции (полной оплате и полной отгрузке). До этого момента заказ считается неоплаченным и неотгруженным.
8. После каждой выгрузки заказа на сайт на стороне сайта определяются значения его категорий (ссылка на категории). Эти значения устанавливаются в системе "1С:Предприятие 8" так, как они присвоены заказу на сайте.
Начало сеанса
Выгрузка каталога начинается с того, что система "1С:Предприятие 8" отправляет http-запрос следующего вида:
http://<сайт>/<путь>/1c_exchange.php?type=sale&mode=checkauth.
В ответ система управления сайтом передает системе "1С:Предприятие 8" три строки (используется разделитель строк "\n"):
слово "success",
имя Cookie,
значение Cookie.
Все последующие запросы к системе управления сайтом со стороны "1С:Предприятия 8" содержат в заголовке запроса имя и значение Cookie.
Далее следует запрос следующего вида:
http://<сайт>/<путь>/1c_exchange.php?type=sale&mode=init
В ответ система управления сайтом передает две строки:
1. zip=yes, если сервер поддерживает обмен в zip-формате - в этом случае на следующем шаге файлы должны быть упакованы в zip-формате, или zip=no - в этом случае на следующем шаге файлы не упаковываются и передаются каждый по отдельности.
2. file_limit=<число>, где <число> - максимально допустимый размер файла в байтах для передачи за один запрос. Если системе "1С:Предприятие 8" понадобится передать файл большего размера, его следует разделить на фрагменты.
Получение файла обмена с сайта
На сайт отправляется запрос вида:
http://<сайт>/<путь>/1c_exchange.php?type=sale&mode=query.
Сайт передает сведения о заказах в формате CommerceML. В случае успешного получения и записи заказов "1С:Предприятие 8" передает на сайт запрос вида:
http://<сайт>/<путь>/1c_exchange.php?type=sale&mode=success
Отправка файла обмена на сайт
Система "1С:Предприятие 8" отправляет на сайт запрос вида:
http://<сайт>/<путь>/1c_exchange.php?type=sale&mode=file&filename=<имя файла>
который загружает на сервер файл обмена, посылая содержимое файла в виде POST.
В случае успешной записи файла система управления сайтом передает строку со словом "success". Дополнительно на следующих строчках могут содержаться замечания по загрузке.
Если в ходе какого-либо запроса произошла ошибка, то в первой строке ответа системы управления сайтом будет содержаться слово "failure", а в следующих строках - описание ошибки, произошедшей в процессе обработки запроса. Если произошла необрабатываемая ошибка уровня ядра продукта или sql-запроса, то будет возвращен html-код.
golang video 1
// https://www.youtube.com/watch?v=G6eZaX_lgbQ&list=PLP19RjSHH4aE9pB77yT1PbXzftGsXFiGl
package main
import "fmt"
func main() {
fmt.Println("HW1")
// Числа
var a int8 = 5 // -128 127 1byte, 8bit
var b int16 = 5 // -32678 32677 2byte, 16bit
var c int32 = 5 // -2 000 000 000 до 2 000 000 000, 4byte
var d int64 = 5 // 9*10^24 8byte
var e uint8 = 5 // 0 255
var f uint16 = 5 // 0 65535
var g uint32 = 5
var h uint64 = 5
var i byte = 5 // == uint8
var i rune = 5 // == int32
var i int = 5 // либо int32 либо int64
var i uint = 5 // либо uint32 либо uint64
var a1 float32 = 31.2
var a1 float64 = 31.2
var c1 complex64 = 1+2i
var c1 complex128 = 4+90i
var d1 bool = true
var d1 bool = false
var name string = "test"
var (
name = "art"
age = 32
)
name, age := "art", 32
}
c := fmt.Sprintf("name is %s and year %d", name, age)
golang book 1
go version
go fmt hello.go отформатировать код
go run hello.go запустить
go build hello.go компилировать в ./hello
package main
import (
"fmt"
"math"
"strings"
)
func main() {
fmt.Println(math.Floor(2.75))
fmt.Println(strings.Title("hello world"))
fmt.Println('s') //115
}
\n \t \" \\
рунна это симвл и его надо в одинарные ковычки
+ - * /
== > < >= <= != !
&& ||
true false
Узнать тип
reflect.TypeOf(42)
создание переменных
var a1 int8 при таком создании там уже 0 или false или пустая строка
var a1, a2 int8
var a3 int8 = 10
var a1, a2 int8 = 5, 3
var a4 = 4
a5 := 5
a6, a7 := 6, 7
a1 = 5
a1, a2 = 5, 3
если имя переменной или функии с большой буквы, то ее можно использовать в другом пакете, кроме текущего
преобразовать тип
var a1 int8 = 5
fmt.Println(reflect.TypeOf(float64(a1)))
golang book 2
package main
import (
"fmt"
"time"
)
func main() {
var now time.Time = time.Now()
var year int = now.Year();
fmt.Println(year)
}
package main
import (
"fmt"
"strings"
)
func main () {
var a1 string = "Hell# w#rld"
replacer := strings.NewReplacer("#", "o")
a2 := replacer.Replace(a1)
fmt.Println(a2)
}
// коммент
/* */
package main
import (
"fmt"
"reflect"
"strings"
)
func main() {
var a1 string = "Hell# w#rld"
replacer := strings.NewReplacer("#", "o")
fmt.Println(reflect.TypeOf(replacer))
a2 := replacer.Replace(a1)
fmt.Println(a2)
}
bool1, error := strconv.ParseBool("true")
file1, error := os.Open("myfile.txt")
responce1, error := http.Get("https://example.com")
если создали переменную и она не используется, то это ошибка
а если так надо, то название переменн которое не должно использов ставьте _
ввод с клавиатуры
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Print("Enter text: ")
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
fmt.Println(input)
}
if 1 > 2 {}
else if
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fmt.Print("Enter text: ")
reader := bufio.NewReader(os.Stdin)
input, error1 := reader.ReadString('\n')
if error1 != nil {
log.Fatal(error1)
}
fmt.Println(input)
}
golang book 3
узнать размер файла
package main
import (
"fmt"
"log"
"os"
)
func main() {
fileinfo, err := os.Stat("./fileSize.go")
if err != nil {
log.Fatal(err)
}
fmt.Println(fileinfo.Size())
}
удали отступы в начале и в конце
strings.TrimSpace(text)
строки в числа цифры
grade, err := strconv.ParseFloat(text, 64)
64 - это для float64
обьявленные переменные не смогут использоваться за пределам обьявленного тела
условия или функции..
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
func main() {
fmt.Print("Enter int: ")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
input = strings.TrimSpace(input)
grade, err := strconv.ParseFloat(input, 64)
if err != nil {
log.Fatal(err)
}
var status string
if grade > 60 {
status = "ok"
} else {
status = "no ok"
}
fmt.Println("Ready: ", status)
}
Когда коротко обьявляем сразу 2 переменные и одно имя новое, а второе старое, то старое перезаписывается
golang book 4
рандом
package main
import (
"fmt"
"math/rand"
)
func main() {
target := rand.Intn(100) + 1
fmt.Println(target)
}
rand.Intn(100) + 1
это чтоб от 1 до 100 включительно
но рандом не рандом..
вот рандом
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
//seconds := time.Now().Unix()
//rand.Seed(seconds)
rand.Seed(time.Now().Unix())
target := rand.Intn(100) + 1
fmt.Println(target)
}
rand.Seed кушает только числа
строку в число
преобразовать в int
input := strings.TrimSpace(input)
value, err := strconv.Atoi(input)
цикл
for i:=4;i<7;i++ {
fmt.Println(i)
} // 4 5 6
i++ i--
-= +=
при вечном цикле ctrl с
for еще используется вместо wile
i:= 1
for i<3 {
fmt.Println(i)
i++
}
Копирование bash linux
cp readme readme2
OR
cp readme Desktop/
Простой пример сокетов на php
Для работы с сокетами на PHP используется расширение "Sockets". Вот простейший пример клиентской части для подключения к серверу и отправки ему сообщения:
```php
<?php
// создание сокета
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// подключение к серверу
$connect = socket_connect($socket, 'localhost', 8000);
// отправка сообщения
$msg = "Hello, server!";
socket_write($socket, $msg, strlen($msg));
// получение ответа от сервера
$response = socket_read($socket, 4096);
// закрытие соединения
socket_close($socket);
?>
```
Серверная часть будет выглядеть примерно так:
```php
<?php
// создание сокета
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// привязка к адресу и порту
socket_bind($socket, 'localhost', 8000);
// ожидание подключения клиента
socket_listen($socket);
// обработка подключений
while (true) {
$client = socket_accept($socket);
$msg = socket_read($client, 1024);
$response = "Hello, client! I got your message: " . $msg;
socket_write($client, $response, strlen($response));
socket_close($client);
}
// закрытие соединения
socket_close($socket);
?>
```
Это только простейший пример работы с сокетами на PHP, в зависимости от задачи могут быть необходимы дополнительные настройки и функции.
Простой пример сокетов на js
JavaScript (JS) не поддерживает сокеты "из коробки", однако можно использовать API WebSocket для создания соединения между клиентом и сервером. Вот пример использования WebSocket на стороне клиента:
```javascript
// создание сокета
var socket = new WebSocket("ws://localhost:8000");
// отправка сообщения на сервер
var msg = "Hello, server!";
socket.send(msg);
// обработка ответа от сервера
socket.onmessage = function(event) {
var response = event.data;
console.log("Ответ от сервера:", response);
};
// закрытие соединения
socket.onclose = function(event) {
console.log("Соединение закрыто");
};
```
Для работы необходимо запустить WebSocket сервер на указанном порту (в данном случае 8000) и обрабатывать входящие сообщения. На стороне сервера можно использовать, например, Node.js и библиотеку ws для создания WebSocket сервера. Вот пример:
```javascript
const WebSocket = require('ws');
// создание сервера
const server = new WebSocket.Server({ port: 8000 });
// обработка подключений
server.on('connection', (socket) => {
// обработка сообщения от клиента
socket.on('message', (msg) => {
console.log('Сообщение от клиента:', msg);
// отправка ответа клиенту
socket.send('Hello, client! I got your message');
});
});
```
Это только простой пример, который можно доработать для своих задач.
Простой пример сокетов на golang
Пример использования сокетов на Golang:
```go
package main
import (
"fmt"
"net"
)
func main() {
// создание сокета
socket, err := net.Dial("tcp", "localhost:8000")
if err != nil {
fmt.Println("Ошибка при создании сокета:", err)
return
}
defer socket.Close()
// отправка сообщения
msg := "Hello, server!"
_, err = socket.Write([]byte(msg))
if err != nil {
fmt.Println("Ошибка при отправке сообщения:", err)
return
}
// получение ответа от сервера
response := make([]byte, 1024)
_, err = socket.Read(response)
if err != nil {
fmt.Println("Ошибка при чтении ответа:", err)
return
}
fmt.Println("Ответ сервера:", string(response))
}
```
Серверная часть для принятия сообщений выглядит так:
```go
package main
import (
"fmt"
"net"
)
func main() {
// создание сокета
listener, err := net.Listen("tcp", ":8000")
if err != nil {
fmt.Println("Ошибка при создании сокета:", err)
return
}
defer listener.Close()
// обработка подключений
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Ошибка при подключении клиента:", err)
return
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
defer conn.Close()
// чтение сообщения от клиента
request := make([]byte, 1024)
_, err := conn.Read(request)
if err != nil {
fmt.Println("Ошибка при чтении сообщения:", err)
return
}
fmt.Println("Сообщение от клиента:", string(request))
// отправка ответа клиенту
response := "Hello, client! I got your message"
_, err = conn.Write([]byte(response))
if err != nil {
fmt.Println("Ошибка при отправке ответа:", err)
return
}
}
```
Это минимальный пример, который можно доработать для своих задач.
Зависимость зарплаты
Зарплата зависит от спроса,
а не от сложности работы..
sql Перенос данных из другой таблицы этой же базы
sql
достать с таблицы articles все id
И добавить их в таблицу article_flag
где есть столбцы: article_id и flag_id;
в поле flag_id всегда ставим '3'
Решение
Предварительно сделай уникальным сочетание
article_id и flag_id
потом делай запрос
INSERT IGNORE INTO article_flag (article_id, flag_id)
SELECT id, '3'
FROM articles;
rsync копирование
apt-get install rsync
rsync -h
Для каталогов
rsync -a --progress откуда куда
Вместо -r используем -a Там сохраняет свойства(время права)
-v: подробный вывод.
-r: рекурсивно копирует данные (но не сохраняет временные метки и разрешения при передаче данных).
-a: режим архива, позволяет рекурсивно копировать файлы, а также сохраняет символические ссылки, права доступа к файлам, права владения пользователей и групп и временные метки.
-z: сжатие данных файла.
-h: human-readable, информация на выводе в формате, удобном для чтения.
rsync -zah --progress откуда куда
rsync -zvh --progress откуда куда
rsync -zvh --progress file1 /var/www
Копирование на удалённый
rsync -a --progress откуда root@ip:/var/www
Копирование с удалённого
rsync -a --progress root@ip:/var/www/file1 /root/test
Только изменения (заменяет файлы, если они изменены)
rsync --update -av откуда куда
Не трогать изменённые файлы
rsync --ignore-existing -av откуда куда
Ограничить по скорости
rsync --bwlimit=100 -zah --progress откуда куда
Для указания порта
rsync -avz --bwlimit=500 -e "ssh -p 1234" /local_folder/ user@host:/remote_folder/
ssh подключиться
ssh root@IP -p PORT
Временная таблица sql TEMPORARY
При ошибке ERROR 1093 (HY000) at line 25: Table 'comments' is specified twice, both as a target for 'INSERT' and as a separate source for data
CREATE TEMPORARY TABLE temp_comments AS
SELECT id FROM comments WHERE created_at = '2015-03-09 02:22:57' LIMIT 1;
DROP TEMPORARY TABLE temp_comments;
".(!empty($item['parent_date']) ? "CREATE TEMPORARY TABLE temp_comments AS
SELECT id FROM comments WHERE created_at = '".$item['parent_date']."' LIMIT 1;" : "")."
INSERT IGNORE INTO `comments` (
`group_type`,
`group_id`,
`model_type`,
`model_id`,
`group_ip`,
".(!empty($item['parent_date']) ? "`parent_id`, " : "")."
`rating`,
`score`,
`body`,
`created_at`
) VALUES (
'App\Models\User',
'1',
'App\Models\Article',
(SELECT `id` FROM `articles` WHERE `url` = '".$item['article_url']."' LIMIT 1),
'".$item['ip']."',
".(!empty($item['parent_date']) ? "(SELECT id FROM temp_comments), " : "")."
'".$item['rating']."',
'0',
'".$item['text']."',
'".$item['date']."'
);
".(!empty($item['parent_date']) ? "DROP TEMPORARY TABLE temp_comments;" : "")."
Ключи ssh быстро подключаться
на винде в cmd
ssh-keygen.exe
или на линуксе
ssh-keygen
То в папке пользователя создаётся .ssh
На самом линуксе, к которому подключаться,
открываем
nano /root/.ssh/authorized_keys
И на новой строки копируем наш ключ, который с .pub
chmod 0600 /root/.ssh/authorized_keys
Если при создании ключа, указывали его другое имя, то при логине
указываем файл приват ключа
ssh -i .\mykey root@ip -p PORT
А если нет, то без ключа i
ssh root@ip -p PORT
https://youtu.be/-KOMKBtL_7I
linux bash установить ssh сервер
sudo apt install openssh-server
sudo service ssh status
Учу python по книге игра шарик
from tkinter import *
import random
import time
class Ball:
def __init__(self, canvas, paddle, color):
self.canvas = canvas
self.paddle = paddle
self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
self.canvas.move(self.id, 245, 100)
starts = [-3, -2, -1, 1, 2, 3]
random.shuffle(starts)
self.x = starts[0]
self.y = -3
self.canvas_height = self.canvas.winfo_height()
self.canvas_width = self.canvas.winfo_width()
self.hit_bottom = False
def hit_paddle(self, pos):
paddle_pos = self.canvas.coords(self.paddle.id)
if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
return True
return False
def draw(self):
self.canvas.move(self.id, self.x, self.y)
pos = self.canvas.coords(self.id)
if pos[1] <= 0:
self.y = 3
if pos[3] >= self.canvas_height:
self.hit_bottom = True
if self.hit_paddle(pos) == True:
self.y = -3
if pos[0] <= 0:
self.x = 3
if pos[2] >= self.canvas_width:
self.x = -3
class Paddle:
def __init__(self, canvas, color):
self.canvas = canvas
self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
self.canvas.move(self.id, 200, 300)
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
def draw(self):
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
if pos[0] <= 0:
self.x = 0
elif pos[2] >= self.canvas_width:
self.x = 0
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2
tk = Tk()
tk.title("Игра")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()
paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle, 'red')
while True:
if ball.hit_bottom == False:
ball.draw()
paddle.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01)
sql по боту выгрузку количество людей по городам
SELECT COUNT(*) AS kol, `city` FROM `users` GROUP BY `city` ORDER BY kol DESC
Изменить токен для подключения в Git
Не проверял, через 90 дней протестирую..
Для изменения токена для подключения в Git выполните команду:
git config --global credential.helper store
Затем выполните команду:
git pull
Введите свои новые учетные данные (имя пользователя и токен).
Завершив работу с токеном, вы можете удалить его из кэша, выполните команду:
git config --global --unset credential.helper
Нажать правую кнопку мыши на windows
Зажать Shift и нажать F10
Shift F10
Установить git на windows
https://git-scm.com/downloads
https://www.youtube.com/watch?v=GsG5roSGha0
Почему выбрал эти языки программирования
python - для быстрого решения бизнес задач
golang - для производительности в нагруженных местах, (это тот же си, только встроенная многопоточность и на нем быстрее и удобнее писать)
Приоритетнее решать задачи,
Оптимизировать - вторично
sql версия version
SELECT VERSION();
SHOW PRIVILEGES;
SHOW DATABASES;
USE bd1;
SHOW TABLES;
Изменить разделители
DELIMITER $$ ;
DELIMITER ; $$
GO Golang install
In Android termux:
apt update && apt upgrade && pkg install golang
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
Bash Linux
// Переходы
cd /var/www
cd www
cd ..
// Что в папке
ls
// Где я
pwd
// Создать папку
mkdir NAME
// Удалить
rm FOLDER -rf
// Узнать размер вес размер папки (s этой папки, h норм формат)
du -hs /home
du -h file.txt
https://itproffi.ru/kak-uznat-razmer-papki-v-linux/
// Инфа о файле
stat file.txt
// Доступное место быстрый просмотр
df -h (df -i для узлов, записи расположений файлов)
Архив
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
Dump SQL
mysqldump -u USER -p PASSWORD -h HOST DATABASE > data-dump.sql
mysqldump -u USER -p PASSWORD DATABASE > data-dump.sql
mysqldump -u USER -p PASSWORD DATABASE | gzip > `date +dump%Y%m%d_%H%M%S.sql.gz`
mysql -u root -p PASSWORD
CREATE DATABASE new_database;
mysql -u USER -p PASSWORD DATABASE < data-dump.sql
USE new_database;
SHOW TABLES;
https://www.oslogic.ru/knowledge/443/dampy-baz-dannyh-mysql-mysqldump/
Half Life 2 читы коды
во время иры намите ~
sv_cheats 1 включает возмоность читов
impulse 82 машин
impulse 83 лодка
impulse 101 выдать вс ору через некоторое время перестат раотать
noclip ходить через стены
f4 вид от третьего
god езсмертие
sv_cheats 1; mp_friendlyfire 1; impulse 101;
impulse 101; give item_healthkit; give item_healthkit; give item_healthkit; give item_healthkit; give item_healthkit; give item_healthkit; give item_healthkit;
give item_ammo_crossbow; give item_ammo_crossbow; give item_ammo_crossbow;
impulse 101; give item_ammo_crossbow; give item_ammo_crossbow; give item_ammo_crossbow; give item_healthkit; give item_healthkit; give item_healthkit; give item_healthkit; give item_battery; give item_battery; give item_battery; give item_battery;
sql битрикс ценные пользователи
SELECT
`USER_ID`,
COUNT(*) AS quantity,
ROUND(SUM(PRICE)) AS summa
FROM `b_sale_order`
WHERE
`LID` = 's1' AND
`CANCELED` = 'N' AND
`DATE_INSERT` > '2021-01-01'
GROUP BY USER_ID
ORDER BY summa DESC
LIMIT 50
Психология дитя родитель взрослый
дитя - хочу, шутить играть, радоваться, счастье
родитель - определяет правильность поступков дитя, совесть, запрещает, все осуждает
взрослый - нужно целесообразно, исполнитель, так же оценщик ситуации, специалист по работе
termux разделить на несколько окон
pkg install tmux
ctrl b %
ctrl b "
публичнвй сайт на телефоне через termux
ngrok.com
mkdir ngrok
cd ngrok/
git clone https://github.com/tchelospy/termux-ngrok.git
cd termux-ngrok/
chmod +x termux-ngrok.sh
./termux-ngrok.sh
ngrok http 3000
php разница в скорости работы двух знаков равно и трех
<?php
$start = microtime(true);
for ($i=0; $i < 1000; $i++) {
$a = 5;
$b = 5;
if ($a == $b) {
// какой-то код
}
}
$end = microtime(true);
$time1 = $end - $start;
$start = microtime(true);
for ($i=0; $i < 1000; $i++) {
$a = 5;
$b = 5;
if ($a === $b) {
// какой-то код
}
}
$end = microtime(true);
$time2 = $end - $start;
echo "Время выполнения с двумя знаками равно: $time1 секунд\n";
echo "Время выполнения с тремя знаками равно: $time2 секунд\n";
Расслабляющий текст от ChatGPT
Закрой глаза и подумай о том, что для тебя действительно важно. Направь свое внимание на приятные мысли и думай о достижениях, которые ты получил. Попробуй почувствовать блаженство и восхищение от того, что достиг.
Смысл жизни во вселенной от ChatGPT
Смысл жизни во Вселенной остаётся загадкой для человечества. Некоторые говорят, что смыслом жизни является поиск и нахождение счастья. Другие думают, что целью жизни может быть достижение знаний и понимания того, что происходит в Вселенной. И другие предполагают, что наша цель в жизни может быть создание и развитие во Вселенной. В конце концов, существует множество разных подходов и мнений для ответа на вопрос о смысле жизни во Вселенной и никто не находит однозначного ответа.
termux install ssh client
pkg install openssh
Горячие клавиши регулирования яркости и звука на python
import keyboard #pip install keyboard
import screen_brightness_control as sbc #pip install screen_brightness_control
import os
switch1 = 0
brightness_step = 4;
def change_brightness(to_up):
#global sbc
brightness = (sbc.get_brightness())[0];
if to_up :
brightness += brightness_step
else :
brightness -= brightness_step
if brightness > 100 :
brightness = 100
if brightness < 0 :
brightness = 0
show("brightness " + str(brightness))
sbc.set_brightness(brightness)
def function_up():
if switch1 == 0 :
keyboard.send("volume up")
show("volume up")
return
change_brightness(True)
def function_down():
if switch1 == 0 :
keyboard.send("volume down")
show("volume down")
return
change_brightness(False)
def function_switch():
global switch1
switch1 += 1
if switch1 == 2 :
switch1 = 0
def show(text) :
os.system('cls||clear')
print(text)
def start():
keyboard.add_hotkey("F10", function_up)
keyboard.add_hotkey("F9", function_down)
keyboard.add_hotkey("F8", function_switch)
sbc.set_brightness(20)
for number in range(20):
keyboard.send("volume down")
show("F8 - switch\nF10 - up\nF9 - down")
text = input()
if text == "1":
start()
start()