DEV: Рубиновые тона – Telegram
DEV: Рубиновые тона
3.22K subscribers
143 photos
2 videos
8 files
976 links
Анонсы новых видео о программировании (Ruby/Rails, Solidity/Ethereum, Python, JS и не только), практические советы, обзор полезных инструментов и новости из мира IT
Download Telegram
Сегодня просто музыка (впрочем, лично у меня сегодня "просто музыка" была несколько часов, пока я пытался что-то изобрести в ableton, но пока вышло средне). If you party, party hard https://www.youtube.com/watch?v=CRvI_Q2apJo
4👌2👍1
Нашёл смешную инфографику
😁132
Тот самый момент, когда хочется сказать "haha, I live here".
👀1
Интересно. Как выясняется, переменные immutable в Solidity можно переопределять в цикле for внутри конструктора (хотя, судя по всему, в версии 0.20.0 это починили). Забавно, что в цикле while уже нельзя 😄 Больше того, если цикл for не выполнится ни разу, по по факту переменная не будет инициализирована (останется дефолтное значение). Команда Solidity уже подтвердила этот прикол, но по их словам каких-то серьёзных багов они не предвидят.

Да, и ещё один неочевидный момент (это уже не баг, а просто факт) - на данный момент строки нельзя делать immutable, только constant. https://twitter.com/0xHE1M/status/1658145426044858374
👍7😱1
Развлечёмся :) Какой у вас был первый язык программирования?! Да мне и самому очень любопытно. Про себя скажу честно - C++, но было очень сложно, поэтому какое-то время сидел на QBasic и VB.
Anonymous Poll
12%
Python
17%
Ruby
13%
JS/TS
13%
C/C++
21%
Pascal/Delphi
2%
Solidity/Yul/...
4%
Java/Kotlin
4%
C#
5%
PHP
8%
Другой (свой ответ)
👍2
Ну, и последнее на ближайшие пару дней (как обычно, я могу работать только запоями, тем более, что и запасы сидра очень ограничены).

Это тоже рубрика "записки на манжетах" для чтения "когда-нибудь потом". Вообще-то, эта мысль думалась уже какое-то время, но после прочтения одного материала по теме оформилась.

Так вот, у всех у нас есть guilty pleasure - чего тут греха таить. Знаете, какое у меня? Ну, в общем, я примерно раз в месяц смотрю американский рестлинг, причём даже плачу за это что-то в районе 9 баксов, иначе там только всякое старьё можно смотреть. Постоянные выпуски меня мало интересуют, тк они выходят на сайте WWE с запозданием в месяц (кроме скучного NXT), ну, либо надо быть счастливым обладателем специального TV - не знаю, не уверен, что в наших европейских ебенях что-то подобное есть.

Короче, посматриваю всякие большие события, да, бывает. Спрашивается - зачем? Там ведь всё ненастоящее. Ну, если надо настоящее, то можно посмотреть и бокс, какие вопросы, иногда какие-то бои гляжу (я очень ждал бой Усик - Фьюри, но увы, не сложилось). Но в рестлинге совсем другой коленкор. Ну, вот вы фильмы смотрите? Помните, у Джеки Чана были классные боевики? Но ведь тоже бои-то ненастоящие. Да, трюки бедный китаец делал сам, ломая себе всё, что только можно. А вот убивают они друг друга всё-таки понарошку.

Так и тут - это элементы хореографии, театра и боевых искусств. Кое-что про это я знаю, потому что время от времени хожу помахать руками в зал (это когда просыхаю после сидра). Так а чего я про всё это рассказываю-то?

Потому что я понял простую вещь: преподаватель в интернете (на том же YT) - это тоже что-то вроде рестлера, который частенько играет роль, но только эта роль очень сильно срослась с его личной жизнью. Иными словами, нужно сделать так, чтобы было интересно, чтобы зацепить. Поэтому мне нужно придумать какую-то задачу, с которой я буду "биться", которая будет сравнительно сложной, но которую в итоге удастся победить совместными со зрителем усилиями.

А потом по следам пережитого я, может быть, смогу рассказывать, как сидел целый день с этим видео, как приходил в себя, как отпаивал себя тем самым сидром и вообще из дома три дня не выходил. Грубо говоря, конечно.

И народ скажет - ну, это же всё понарошку. Конечно, это просто разыгранный сценарий, на самом деле он сел и записал всё за 20-30 минут. Ну, эти люди тоже не совсем правы. Да, что-то понарошку, да, своего "ученика" в уроках по Ruby я подкалывал несколько наигранно (хотя он действительно лентяй, каких поискать). Но это тот самый случай, когда образ вторгается в личную жизнь, пожалуй.

Действительно можно сидеть с одним видео полдня, делать по нескольку дублей, причём тебя постоянно отвлекают - то кошка захочет повеселиться и побегать, то телефон звонит у жены (звук выключать - это скучно), то на улице какие-то долботрясы орут, то в колокола звонят на главной площади, то пароход гудит, то ещё что-то. Ну, или просто не можешь найти нужных слов (я никогда не пишу сценарий). Потом редактируешь это дело. В итоге, ты действительно чувствуешь себя, как будто тебя как следует отмудохал какой-нибудь Эдж. А потом вернёшься к этим мыслям на следующий день и думаешь: а всё-таки классно! Меня ведь Эдж отмудохал, а других нет.

Впрочем, где-то в душе ты понимаешь, что в своём образе (gimmick) можешь позволить себе больше, чем в реальной жизни. Как это было в известном фильме - кто ты без этого своего железного костюма (ну, или без шляпы и очков)?
16👍4🤝211🔥1🤯1
Что ж, результаты опроса выше интересные. Выходит, что у многих первым языком был Паскаль - это, в общем, вполне ожидаемо. Но также в лидерах внезапно Ruby и C, что сравнительно нетипично (я бы ожидал увидеть на втором месте Питон или JS). Также любопытно, что почти никто не начинал с чего-то типа Java или C#. Ну, с Solidity понятно 😄 Хотя были и другие ответы - к примеру, R и Basic.

В общем, любопытно получилось. Спасибо за участие 🤟
👍9🔥5🎉2
В этом уроке по Solidity мы узнаем, как немного оптимизировать наш код и убрать дублирующийся код с помощью паттерна file, который также можно назвать dynamic dispatch. Посмотрим, как этот паттерн работает, как его реализовать и как задействовать вместе с ним перегруженные функции. https://www.youtube.com/watch?v=6LS6LPppu80
👍10❤‍🔥311🔥1
Ещё немного вас повеселю, как вы это любите. В общем вышел трек, конечно же, небольшой (как это было у Тэффи). Название отсылает к пану Станиславу. Надо ещё что-то написать, но не знаю, что именно. Менеджер PR говорит - импровизируй, потом придумаем https://www.youtube.com/watch?v=lheZSb2GIdQ
2🔥1
Я тут потихоньку готовлю пару уроков про хэши и прочее, и пока для интереса сделал простую реализацию для алгоритма Луна. Это довольно интересный, но простой принцип свёртки, который можно использовать для быстрой проверки корректности разных кодов, кредитных карт и прочего.

Грубо говоря, если у нас есть какой-то длинный идентификатор (код) из цифр, мы можем сделать для него контрольный разряд. Делается так:

1) Берём каждую цифру из кода по очереди, начиная с самой правой

2) Суммируем эти цифры, но каждый второй элемент предварительно умножаем на 2, начиная с самого правого. Так, если есть последовательность "1234", то выходит что-то в духе "4 * 2 + 3 + 2 * 2 + 1".

3) Если в результате умножения на 2 вышло число > 10, то просто суммируем его разряды (к примеру, если 14, то делаем 1 + 4)

4) Получившийся результат R используем в формуле (R mod 10) - или аналогичной, там их много

5) Итог и будет контрольным разрядом, который дописывается в конец кода

6) Для проверки корректности этого разряда достаточно применить операцию к коду ещё раз (предварительно отбросив код)

К примеру, имея код

"1369"

получаем

(9 * 2) + 6 + (3 * 2) + 1

18 + 6 + 6 + 1

(1 + 8) + 6 + 6 + 1

22

(22 mod 10) = 2

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

Можно написать простую реализацию (хотя и наивную)

class Luhn
def add_validation_to(code)
"#{code}#{check_digit_for(code)}"
end

def valid?(code)
code_chars = code.to_s.chars

check_digit_for(code_chars[0...-1]) == code_chars[-1].to_i
end

private

def check_digit_for(code)
digest = code.to_s.chars.reverse.map(&:to_i).inject(0) do |res, num|
res + num.divmod(10).sum
end

digest % 10
end
end

luhn = Luhn.new

validated = luhn.add_validation_to('12345')

puts luhn.valid?(validated)
👍17🌚10🔥41
Есть такой формат XLIFF, он используется в некоторых системах типа Angular, Symfony, iOS. В общем, сделал по нему обзор с точки зрения спецификации (что там есть, как это устроено) и как всё это дело перевести без сильных проблем (тк формат куда сложнее, чем обычный JSON). Тут можно почитать https://lokalise.com/blog/how-to-open-and-translate-xliff-files-in-our-online-editor/
👍7
Ещё к вопросу о всякой криптографии. В этот раз простой пример реализации RSA - это алгоритм, где используется открытый и закрытый ключ. По факту, это всё строится на простых числах.

Изначально задаются два простых числа (случайных) и по ним вычисляется открытый и закрытый ключ. А затем получается, что если использовать правильную формулу при шифровке с помощью открытого ключа, то расшифровать сообщение можно закрытым ключом, опять же если задействовать правильную формулу. Это уже доказали всякие умные дядьки, так что нам можно просто пользоваться плодами их работы.

Выходит что-то такое

# frozen_string_literal: true

require 'prime'

class SimpleRSA
def initialize(limit = 20)
p = random_prime(limit)
q = random_prime(limit)

@max = p * q

totient = (p - 1) * (q - 1)

@pub_key = pub_key_from totient

@priv_key = priv_key_from totient
end

def encrypt(string)
message = message_for string

message.map do |char_code|
(char_code**@pub_key) % @max
end
end

def decrypt(secret)
secret.map do |s_char|
(
(s_char**@priv_key) % @max
).chr
end.join
end

private

def priv_key_from(totient)
d = gcd_extended(totient, @pub_key)[2]

d.positive? ? d : (totient - d.abs)
end

def pub_key_from(totient, generator = Prime::EratosthenesGenerator.new)
next_prime = generator.next

return if next_prime >= totient

return next_prime if gcd_extended(next_prime, totient)[0] == 1

pub_key_from totient, generator
end

def gcd_extended(a, b)
return b, 0, 1 if a.zero?

gcd, x1, y1 = gcd_extended(b % a, a)

x = y1 - (b / a) * x1
y = x1

[gcd, x, y]
end

def random_prime(limit)
Prime.take(rand(0..limit)).last
end

def message_for(str)
str
.upcase
.chars
.map(&:ord)
end
end

d = SimpleRSA.new

enc_message = d.encrypt('hi from kruk')

puts enc_message.inspect

puts d.decrypt(enc_message).inspect


Это пока наброски грядущих уроков, но в целом любопытная штука
🔥13👍7👀2👏1
В этом уроке по криптографии мы обсудим, что такое хэши, зачем они нужны и как работают. Мы обсудим некоторые ключевые свойства хэшей и узнаем откуда они появились. Также мы рассмотрим алгоритм Луна и напишем собственный алгоритм для хэширования произвольных строк.

По моему скромному мнению, видео этой серии будут интересны для любого специалиста IT.

https://www.youtube.com/watch?v=IglTG5MGgvg
15👍9🔥5❤‍🔥1👏1👾1
Знаете, я сейчас вдруг вспомнил забавную вещь. Люди, у которых намётанный глаз, почему-то легко распознают тех, кто работает в сфере IT. И это вовсе не преувеличение, потому что меня раскрывали в разных странах 😂 Возможно, выдавал парашют, волочащийся сзади.

- Скажем, однажды таксист напрямую спросил, не работаю ли я случайно программистом, а то очень похоже. Ну, спросил вежливо, просто для поддержания разговора, потом ещё поинтересовался, как часто я взламываю сайты

- Несколько лет назад в Черногории мы встретили девушку, которая переехала откуда-то с постсоветского пространства, разговорились, она сразу подметила, что я из IT. Дескать, у неё раньше был парень тоже "какой-то такой".

- Недавно ходил подключать себе 5G и покупать новый маршрутизатор, так девушка-консультант высказалась в духе того, что "ты похож на чела, который с настройкой сможет сам разобраться, так что объяснять не буду что к чему"

- Ну, и много лет назад сотрудница одного ночного клуба тоже заметила, что я наверняка из какой-то такой области

И вот думай что хочешь. Ну, я воспринимаю это, как комплимент. Но всё равно забавно 😂 У вас такое бывало?
👨‍💻16
У меня тут новый пост вышел, в этот раз про разновидности JSON и использование этих файлов для хранения переводов https://lokalise.com/blog/json-l10n/
82