Ruby HTTP get/post

Simple get

Простая функция для отправки http get.

def get(request)
request = CGI::escape(request)
uri = URI("http://#{$server}/#{request}")
Net::HTTP.get(uri)
end

Get with header

Пример запроса с header. Обращаю внимание, что в старой версии ruby 1.9.3 обязательно нужно к uri применить метод .request_uri, в новых не обязательно.

Читать дальше

Ruby: генератор списка выходных на год

Простейший генератор списка выходных на год.

Что можно кастомизировать (жирным в коде):

  • В переменной cur_date указываем дату отчета
  • В счетчике можно подкрутить количество дней с 365 до любого количества
  • Строку вывода можно заменить генерацией INSERT в какую то SQL таблицу (закоменчено)
#bin/generate_vacation_list.rb

require 'time'

cur_date = Date.new(2019,1,1)
counter = 0
while counter < 365
 puts "#{cur_date}" if cur_date.saturday?


Читать дальше

Ruby: работа с текстом

 String Class

Индексы

Строка в ruby является объектом класса String.  По индексу строки, по аналогии с индексом массива, можно извлекать, изменять и удалять данные из строки. Причем обращения по индексу идет через те же квадратные скобки, что и для массива.

Обращаясь к строке можно извлечь например первые 6 элементов или последний символ на основе индекса строки, по типу того, как мы извлекаем элементы array:

str[start, lenght]
str[0,6] - извлекаем первые 6 элементов, где 0 - первый символ, 6 - сколько символов от первого
str[7..10] - извлекаем с 7го по 10ый символы используя range
str[-1] - извлекаем последний символ из строки
str[-6,6] - извлекаем с конца строки шесть последний символов
str[-6..-1] - извлекаем с конца строки шесть последний символов используя range

Кроме получения данных по индексу можно эти данные и менять/удалять/добавлять:

str[0,6] = "new_first_6_char" - заменяем первые 6 элементов на новые
str[0,6] = "" - удаляем
str[16,0] = "the end" - добавляем в конец строки данные (16 символ последний)
str[-1,0] = "the end" - добавляем в конец строки данные (более корректный способ)
Методы

Почти все в ruby является объектом.

Читать дальше

Ruby: работа с ФС (файлами и папками)

ФАЙЛЫ

дока

Прежде всего нужно обозначить, что закрытие файла крайне необходимый процесс:
1) открытый файл может быть заблокирован файловой системой для других скриптов
2) при открытии создается file descriptor, их количество ограничено файловой системой, хотя и обычно значение ограничения довольно большое
3) могут произойти race conditions, когда несколько процессов пытаются прочитать/записать один и тот же ресурс (в данном случае файл) в один момент времени

Чтение и вывод

# вывод контента (первой строки)
File.open("test.txt") do |file| # открытие файла
 puts file.gets # вывод контента (первой строки)
end # автоматическое закрытие по завершению метода Open, про необходимость закрытия теория выше

# Вывод всех строк
File.open("test.txt").each do |line|
 puts line
end

# Кладем строки файла в array, где каждая новая строка является отдельным элементом массива.


Читать дальше

Ruby: работаем с базой mysql

Как показала недолгая практика использования gem mysql, лучше его не использовать вообще, а сразу использовать gem mysql2.

gem mysql не развивается (последний апдейт в 2013) и имеет косяки, например, с кодировкой (кириллица кладется в cp1251 и изменить, насколько я понял, никак).

Читать дальше

Ruby: удаляем спец. символы перед insert в базу

Метод на ruby по удалению мусора в виде разных скобок, exclamation и других символов, которые гарантированно приведут к ошибке при insert в базу. При необходимости можно добавить символы в переменную pattern.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ....


Читать дальше

Telegram bot на Ruby c gem telegram-bot-ruby

РЕСУРСЫ, переменные И МЕТОДЫ
  • https://core.telegram.org/bots/api – основной необходимый MAN. Очень крутой, но не хватает примеров
  • https://github.com/atipugin/telegram-bot-ruby – ruby gem telegram, есть пример кода для разных кейсов
  • https://github.com/mustafababil/Telegram-Weather-Bot/blob/master/responseController.py – пример бота в телеграм на python
METHOD
bot.api.send_message - основной метод, отправка сообщений
bot.api.answer_callback_query- ответ на CallBackQuery, отвечать нужно после обработки сообщения, чтобы ошибки ответа на callback не привели к проблемам с самим ответом
bot.api.deleteMessage - удаление сообщений (своих, исходящих от бота)

ID
rqst.from.id - user info id.


Читать дальше

Скрипт на событие логина по SSH

Пришла идея создания скрипта для логгирования события подключения по SSH в таблицу SQL и уведомления о подключении определенных пользователей определенным пользователям:
  • писать всем пользователям о подключении их самих – сами пользователи знают, когда заходят и заход тогда, когда ты это делать не мог – есть повод обеспокоиться
  • админу писать о подключении всех пользователей, имеющих права на sudo
В целом логгирование в linux встроено по умолчанию – утилита last показывает полный лог авторизаций с момента создания файла /var/log/wtmp и продолжительность pts, а в lastlog есть информация о последнем подключении.

Читать дальше

Динамическое формирование окончания слов во множественном числе

Достаточно для анализа 10 символов чтобы делать правильное окончание.

Метод на ruby:

 def spelling(number)
  last_digit = number.to_s.split(//).last(1).join # identify last digit
  spell = "" if last_digit == "1"
  spell = "а" if last_digit =~ /^([2-4])$/
  spell = "ов" if last_digit =~ /^([0]|[5-9])$/
  two_last_digit = number.to_s.split(//).last(2).join # identify last two digit
  spell = "ов" if two_last_digit =~ /^([1][1-9])$/
  spell
 end

puts "Вы можете подписаться еще на <count> объект#{spelling(<count>)}"

Метод на php – не очень грамотно написан (лучше array и сопоставление, regexp как в случае с ruby или ifelse), но рабочий:

function spelling($number)
{
 $splitted_array = str_split("$number");
 $last_digit = end($splitted_array);
 $penultimate = prev($splitted_array);
 if ($penultimate == "1") {return "ов";}
 if ($last_digit == "1") {return "";}
 if ($last_digit == "2") {return "а";}
 if ($last_digit == "3") {return "а";}
 if ($last_digit == "4") {return "а";}
 if ($last_digit == "0") {return "ов";}
 if ($last_digit == "5") {return "ов";}
 if ($last_digit == "6") {return "ов";}
 if ($last_digit == "7") {return "ов";}
 if ($last_digit == "8") {return "ов";}
 if ($last_digit == "9") {return "ов";}
}

$spell = spelling($res_users);
echo "Влияние: $res_users клиент$spell";

 

Читать дальше

Ruby простая отправка писем

Простая отправка писем в ruby без вложений:
#!/usr/bin/env ruby
#coding: utf-8
 
require 'net/smtp'
 
from = 'login@exmpl.com'
to = [ "mail_to@exmpl.com", "mail_to2@exmpl.com" ]
theme = 'Subj!'
text= "Msg"
message = ""
message<<"From: admin <#{from}>\n"
message<<"To: #{to}\n"
message<<"Subject: #{theme}\n"
message<<text
Net::SMTP.start('smtp.exmpl.com', 25, 'exmpl.ru',
 'login', 'pass', :plain) do |smtp|
smtp.send_message message, from, to
end
gem mail поддерживает отправку с вложениями.


Читать дальше