Cіпласпластик
Доки у відпустці, вирішив написати нарешті автоматичний фільтр 💩 виконавців. АПІшка #Spotify все ж не дає дізлайкати пісні в Discover Weekly, але пофіг, з цим ще можна жити у напівавтоматичному режимі — аби список давало. А от апішка #ШІ-шки вчора видавала…
На моїй вулиці сьогодні свято! #Spotify нарешті повернув можливість блокувати для себе бісових виконавців повністю 🥳 🎉 🥳
Please open Telegram to view this post
VIEW IN TELEGRAM
Тримайте топовий інтерактивний(!) мануал з кривих Безьє.
Треба якось буде його українською перекласти. Але тексту там багацько.
Треба якось буде його українською перекласти. Але тексту там багацько.
pomax.github.io
A Primer on Bézier Curves
A detailed explanation of Bézier curves, and how to do the many things that we commonly want to do with them.
Media is too big
VIEW IN TELEGRAM
Де це Сіпласпластик знов подівся? Працює, мабуть…
Ще б пак працює!
Отже, у вільний час, якого на жаль не так багато, потроху допомагаю перекладати гру українською. І щоб перевірити локалізацію на власне грі, треба стягнути поточний файл з перекладом з Crowdin та закинути у потрібну теку.
От тільки файл — це CSV, і Crowdin автоматично огортає кожне значення в лапки, а парсер гри цього не розуміє, бо там розробники не заморочувалися. Ну й додаткові ще якісь реквайрменти до того файлу є.
Що роблять нормальні люди у такому випадку? — Виправляють все файнд-реплейсом у ноутпаді.
Що роблять адекватні люди з навичками програмування? — Пишуть скрипт на💻 у три рядки, який виправлятиме все автоматично.
Що роблю я? — Я пишу рушій для запуску «правил», написаних на #QML😅
Отож правила + опціональний логотип (гри) + додаткові файли для копіювання лежать в бандлі. Концепція бандлів з #macOS мені дуже подобається: це така тека з різноманітним мотлохом, але система відображає її як файл і, коли дабл-клікаєш, відкриває відповідну програму. На вінді, звісно, так не працює, тому я просто всередину бандла поклав ще один додатковий порожній файл з кастомним розширенням, і дабл-клікаю там вже по ньому.
QML-рушій крутиться в UI-треді, тож коли йшла обробка файлу, все завмирало, чим дуже мене дратувало. Але виявилося, що можна мати декілька рушіїв в одному процесі! Мені так навіть краще. Я в окремому треді запускаю рушій для опрацювання правил, а в UI-ному тільки… UI. І вони один з одним комунікують там якось сигналами. На одному з етапів розробки у мене так летіло 50к сигналів в секунду😄 , тому UI все одно не реагував — довелося трохи оптимізнути. Зараз там, думаю, ну сотня тих сигналів, може, якщо не менше.
Користувач просто драг-н-дропає файл у вікно, й воно фігачить. Наразі є декілька видів правил:
•
•
•
•
• Окрім того, існує
Люди з команди поки що не дуже оцінили прикол, відреагувавши доволі вʼяло — мабуть, тому що треба текст перекладати, а не хуйнею маятися😅 Але мене прям бісило руками це робити щоразу, тож я не встояв, бо коли мене щось з інструментів дратує, я весь час про це думаю й не можу сфокусуватися на роботі.
Думаю згодом ще додати можливість порівнювати рядок з оригіналом + підтримку інших форматів на кшталт XLIFF + автоматичний апдейт з Crowdin, щоб руками ото не качати. Але поки що мені й так норм.
Ще б пак працює!
Отже, у вільний час, якого на жаль не так багато, потроху допомагаю перекладати гру українською. І щоб перевірити локалізацію на власне грі, треба стягнути поточний файл з перекладом з Crowdin та закинути у потрібну теку.
От тільки файл — це CSV, і Crowdin автоматично огортає кожне значення в лапки, а парсер гри цього не розуміє, бо там розробники не заморочувалися. Ну й додаткові ще якісь реквайрменти до того файлу є.
Що роблять нормальні люди у такому випадку? — Виправляють все файнд-реплейсом у ноутпаді.
Що роблять адекватні люди з навичками програмування? — Пишуть скрипт на
Що роблю я? — Я пишу рушій для запуску «правил», написаних на #QML
Отож правила + опціональний логотип (гри) + додаткові файли для копіювання лежать в бандлі. Концепція бандлів з #macOS мені дуже подобається: це така тека з різноманітним мотлохом, але система відображає її як файл і, коли дабл-клікаєш, відкриває відповідну програму. На вінді, звісно, так не працює, тому я просто всередину бандла поклав ще один додатковий порожній файл з кастомним розширенням, і дабл-клікаю там вже по ньому.
QML-рушій крутиться в UI-треді, тож коли йшла обробка файлу, все завмирало, чим дуже мене дратувало. Але виявилося, що можна мати декілька рушіїв в одному процесі! Мені так навіть краще. Я в окремому треді запускаю рушій для опрацювання правил, а в UI-ному тільки… UI. І вони один з одним комунікують там якось сигналами. На одному з етапів розробки у мене так летіло 50к сигналів в секунду
Користувач просто драг-н-дропає файл у вікно, й воно фігачить. Наразі є декілька видів правил:
•
FileRule
отримує на вхід чисто імʼя файлу й далі робить з ним ті перевірки, що хоче, в колбеці ensure
.•
ItemRule
запускається для кожного рядку тексту, тож отримує цей рядок та його індекс. Окрім того, можна задефайнити ще fix
, який автоматично щось виправлятиме.•
InstallCurrentFile
дозволяє поточний файл закинути у якусь теку, опціонально під іншим імʼям.•
InstallFiles
— майже те саме, але копіює якісь статичні файли з бандлу.• Окрім того, існує
Group
, щоб можна було групувати декілька рулів, а значить — виносити їх в окремі реюзабл-файли! Їх можна вкладати одна в одну, й воно врешті просто «розчиняє» їх, роблячи щось на кшталт flatten
.Люди з команди поки що не дуже оцінили прикол, відреагувавши доволі вʼяло — мабуть, тому що треба текст перекладати, а не хуйнею маятися
Думаю згодом ще додати можливість порівнювати рядок з оригіналом + підтримку інших форматів на кшталт XLIFF + автоматичний апдейт з Crowdin, щоб руками ото не качати. Але поки що мені й так норм.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Як же замахав кривий софт… Особливо софт, який йде з якимись пристроями, які без нього нормально не здатні працювати.
Найкраще це видно по компаніях, що заробили собі імʼя на розробці периферійних пристроїв — їхній софт найгірший!
Візьмемо, наприклад, Logitech. (Памʼятаєте «неймовірні історії» про те, як їхня служба підтримки просто надсилала новий пристрій, коли ваш поточний ламався? Виявляється, в Європі так будь-яка поважна компанія робить). У мене зараз їхня мишка MX Master 3, і вона прям класна. Дуже подобається основне колесо, яке скоріш за все електромагнітне і контролюється прошивкою. Але мова якраз не про прошивку, а про те лайно, яке заведено називати «драйверами». Насправді сам драйвер там крихітний, підозрюю, але до нього ще йде прога-конфігуратор на 250 МБ. Коли я цю мишку на роботі отримав та намагався початково налаштувати, то воно навіть не завжди її детектило.
А зараз, бува, анлочиш комп, а деякі додаткові кнопки не працюють взагалі because fuck you thatʼs why. Якщо пощастить, то після наступного сліпа запрацюють знов.
Ще у мене є їхній Logitech Harmony Elite. Так, це той самий «універсальний пульт», софт якого хтось колись реверсив та познаходив там купу прикладів геніального інжинірінгу в якомусь дикому міксі технологій від флеша до вбудованого Apache чи шо там було у них — зараз вже важко знайти (а кажуть, наче інтернет все памʼятає). Чудовий пристрій: подобаються кнопки, підсвітка, екран за наших часів вже не вау, але нормальний, навіть з тачем, та навіть акселерометр є, підозрюю, якщо вже він якось реагує, коли в руки його береш. Але софт — це пиздець. За всі роки я так і не зміг його сконфігурувати так, як хотілося б. Навіть тупо комбінація телевізор+саундбар — це вже біль, бо саундбар вмикати-вимикати окремо не треба — його телевізор контролює. А якщо додати, що у мене телевізор можна «вимкнути» так, щоб він прикидався картиною, а можна вимкнути повністю, то все — капець! Good luck with that.
Або візьмемо RØDE. Вони заробили собі імʼя тим, що роблять чудові й не дуже дорогі мікрофони. Але суто мікрофоном в наш час покупців вже не знайдеш, треба ж фічі. Є от їхній Wireless Go (ну або Me/Pro), який вміє звук прям в себе писати. Але впродовж довгого часу їхня прога дозволяла експортувати записи з внутрішньої памʼяті тільки по одному🤯
А зараз RØDE вирішили задовольнити потреби стрімерів та ютуберів усіляких. І так вийшло, що у мене є їхній Streamer X. Хардварно пристрій мені дуже подобається (коли працює): кнопки норм, дві крутилки й все таке. Але софт — це жах. По-перше, прогу навіть не можна в трей сховати — постійно маячить відкрита. Інколи не детектить пристрій взагалі, який, до речі, раніше через мій thunderbolt-док працював норм, тепер ні — тільки напряму. Інколи кораптить звук з ніхуя, причому про це неможливо дізнатися, адже на монітори виводить все ок. Під макось навіть раутінгу звуку з програм немає. Кнопками можна генерити MIDI-сигнали, щоб контролювати інші штуки, але саму цю прогу контролювати через MIDI не можна🤦♂️ Але найжахливіше, що він не вимикає підсвітку, коли комп йде в сліп, а хуячить, як прожектор на стадіоні — я вирішив це папірцем, зацініть відос.
Ще у мене є два Stream Deck від Elgato. До цих хлопаків питань майже нема: все працює, як того очікуєш. Хіба що трохи дивнувато, що їхній конфігуратор важить 860 МБ! Наша тулза, що ми з командою на роботі зробили за 2,5 місяці, важить майже 190 МБ, причому сам бінарь — 1 МБ з копійками, а решта — то Qt-ліби🤡 І то я там напакував все, не розбираючись зайвий раз: думаю, можна до сотки збити загалом. Так ось окрім того, що наша тулза має низку функцій, заради яких ми її розробляли, вона також має свій конфігуратор для Stream Deck! І це не плагін до офіційної проги: нам офіційна прога взагалі не потрібна — ми з пристроєм напряму через USB працюємо.
Щоразу, як я вкотре натрапляю на якесь таке лайно, мені дуже кортить написати їм та запропонувати свої послуги. Я навіть так робив разок, але мене звісно відправили погуляти😅
Та питання лишається відкритим: якого хєра‽ Ви не можете нормальних програмістів найняти чи шо?
Найкраще це видно по компаніях, що заробили собі імʼя на розробці периферійних пристроїв — їхній софт найгірший!
Візьмемо, наприклад, Logitech. (Памʼятаєте «неймовірні історії» про те, як їхня служба підтримки просто надсилала новий пристрій, коли ваш поточний ламався? Виявляється, в Європі так будь-яка поважна компанія робить). У мене зараз їхня мишка MX Master 3, і вона прям класна. Дуже подобається основне колесо, яке скоріш за все електромагнітне і контролюється прошивкою. Але мова якраз не про прошивку, а про те лайно, яке заведено називати «драйверами». Насправді сам драйвер там крихітний, підозрюю, але до нього ще йде прога-конфігуратор на 250 МБ. Коли я цю мишку на роботі отримав та намагався початково налаштувати, то воно навіть не завжди її детектило.
А зараз, бува, анлочиш комп, а деякі додаткові кнопки не працюють взагалі because fuck you thatʼs why. Якщо пощастить, то після наступного сліпа запрацюють знов.
Ще у мене є їхній Logitech Harmony Elite. Так, це той самий «універсальний пульт», софт якого хтось колись реверсив та познаходив там купу прикладів геніального інжинірінгу в якомусь дикому міксі технологій від флеша до вбудованого Apache чи шо там було у них — зараз вже важко знайти (а кажуть, наче інтернет все памʼятає). Чудовий пристрій: подобаються кнопки, підсвітка, екран за наших часів вже не вау, але нормальний, навіть з тачем, та навіть акселерометр є, підозрюю, якщо вже він якось реагує, коли в руки його береш. Але софт — це пиздець. За всі роки я так і не зміг його сконфігурувати так, як хотілося б. Навіть тупо комбінація телевізор+саундбар — це вже біль, бо саундбар вмикати-вимикати окремо не треба — його телевізор контролює. А якщо додати, що у мене телевізор можна «вимкнути» так, щоб він прикидався картиною, а можна вимкнути повністю, то все — капець! Good luck with that.
Або візьмемо RØDE. Вони заробили собі імʼя тим, що роблять чудові й не дуже дорогі мікрофони. Але суто мікрофоном в наш час покупців вже не знайдеш, треба ж фічі. Є от їхній Wireless Go (ну або Me/Pro), який вміє звук прям в себе писати. Але впродовж довгого часу їхня прога дозволяла експортувати записи з внутрішньої памʼяті тільки по одному
А зараз RØDE вирішили задовольнити потреби стрімерів та ютуберів усіляких. І так вийшло, що у мене є їхній Streamer X. Хардварно пристрій мені дуже подобається (коли працює): кнопки норм, дві крутилки й все таке. Але софт — це жах. По-перше, прогу навіть не можна в трей сховати — постійно маячить відкрита. Інколи не детектить пристрій взагалі, який, до речі, раніше через мій thunderbolt-док працював норм, тепер ні — тільки напряму. Інколи кораптить звук з ніхуя, причому про це неможливо дізнатися, адже на монітори виводить все ок. Під макось навіть раутінгу звуку з програм немає. Кнопками можна генерити MIDI-сигнали, щоб контролювати інші штуки, але саму цю прогу контролювати через MIDI не можна
Ще у мене є два Stream Deck від Elgato. До цих хлопаків питань майже нема: все працює, як того очікуєш. Хіба що трохи дивнувато, що їхній конфігуратор важить 860 МБ! Наша тулза, що ми з командою на роботі зробили за 2,5 місяці, важить майже 190 МБ, причому сам бінарь — 1 МБ з копійками, а решта — то Qt-ліби
Щоразу, як я вкотре натрапляю на якесь таке лайно, мені дуже кортить написати їм та запропонувати свої послуги. Я навіть так робив разок, але мене звісно відправили погуляти
Та питання лишається відкритим: якого хєра‽ Ви не можете нормальних програмістів найняти чи шо?
Please open Telegram to view this post
VIEW IN TELEGRAM
Продовжуючи вчорашню тему, але вже в більш творчому напрямі…
Зараз той етап, коли люди раптом згадали, що взагалі-то пристрій зробити не так і складно. Не мені, звісно, бо я як не тямив, так і не почну. Але ж від розумніших людей щодня з'являються якісь гаражні, часто опенсорсні поробки, адже будь-хто може купити собі мікроконтролерів по 10 баксів за відро та зробити з ними щось путнє. А сучасні мікроконтролери — це потужність. Ті ж STM-ки, мабуть, крутіші за всі ігрові консолі мого дитинства разом узяті. В ESP32 ще й WiFi є. В їхньому останньому(?) P4 взагалі двоядерний проц на 400 МГц, та ще й додаткові інструкції для AI. На крайняк можна взагалі просто Raspberry Pi Zero взяти — то взагалі жир. Існує купа фреймворків, купа тулів. Береш та робиш.
Але з того, що я бачу: нерідко таким займаються саме програмісти, а ми знаємо, що програміст та зручність сумісні настільки ж, наскільки вода та олія: якщо числа в терміналі побігли, то можна вважати роботу виконаною. Тому якщо це черговий «cyberdeck», то це гола плата з напаяним екраном, якщо це смарт-годинник, то якась шняга з дротами в усі боки, примотана ізострічкою до руки.
Нє, 3D-принтери дійсно значно покращили цей момент, тож хтось запарюється хоча б упакувати свій винахід з купи компонентів у паралелепіпед. Ну, принаймні зробити собі власну клавіатуру вже стало майже повсякденністю, тож прогрес є. Але якість все одно не порівняти з технологіями масового виробництва на жаль.
І тільки одиниці спроможні довести справу до дійсно класного хардварного продукту: такі зазвичай одразу на кікстартер йдуть. І я як доволі частий у минулому гість-споживач на кікстартері можу впевнено заявити: більшість з них врешті обйобується на софті. Глючні та сирі мобільні проги-компаньйони, половина фічей не працює, обіцянки-цяцянки й ось все це.
Отож… моя проблема яка? У мене руки криві, щоб зробити дійсно компактний, приємний на дотик, зручний та цілісний пристрій. А їхня проблема яка? Що на розробку софта бюджетів вже наприкінці не лишилося… Ну то дайте мені пристрій та SDK! Так, я готовий за це заплатити (але не 500 баксів)!
Ті ж універсальні пульти взяти… На кікстартері щомісяця новий, кожен обіцяє підтримку тисяч пристроїв від сотень вендорів, а врешті це все виливається в прогу в Google Play на 2,1⭐️ рейтингу, а за пів року компанія перестає існувати. На що ви розраховували? Що Logitech ледь-ледь змогла, а ви-то точно зможете краще? Не треба мені суперуніверсальний конфігуратор — краще дайте мені можливість робити те, що я хочу, під мої конкретні юзкейси. Цільова авдиторія звісно інша, менша, зате спроможна заплатити більше.
Безумовно, зробити зручний та простий високорівневий SDK — задача чи не складніша за написання прикладного софту. Але це також можна перекласти на користувачів вже. Хтось зробить фреймворк, хтось щось на ньому, а хтось і до #lowcode доведе, щоб люди без програмерської освіти змогли творити. А вони це можуть! Подивіться, які дашборди роблять не програмісти для Home Assistant: та вони кращі, ніж будь-що, що колись зроблю я😅
Певні рухи в цей бік відбуваються. Як, наприклад, оцей смарт-годинник — не прям вау, але й не повне лайно. Але бляха, дивитися на 100501-й аналог геймбоя або чергове «рішення» на бредборді з вʼязкою дротів — немає сил вже, їй-богу. Як же хочеться щось завершене з хардварного погляду, але «чистий лист» та зручні інструменти — з софтварного.
Купили б щось таке? Чи може вже?
Зараз той етап, коли люди раптом згадали, що взагалі-то пристрій зробити не так і складно. Не мені, звісно, бо я як не тямив, так і не почну. Але ж від розумніших людей щодня з'являються якісь гаражні, часто опенсорсні поробки, адже будь-хто може купити собі мікроконтролерів по 10 баксів за відро та зробити з ними щось путнє. А сучасні мікроконтролери — це потужність. Ті ж STM-ки, мабуть, крутіші за всі ігрові консолі мого дитинства разом узяті. В ESP32 ще й WiFi є. В їхньому останньому(?) P4 взагалі двоядерний проц на 400 МГц, та ще й додаткові інструкції для AI. На крайняк можна взагалі просто Raspberry Pi Zero взяти — то взагалі жир. Існує купа фреймворків, купа тулів. Береш та робиш.
Але з того, що я бачу: нерідко таким займаються саме програмісти, а ми знаємо, що програміст та зручність сумісні настільки ж, наскільки вода та олія: якщо числа в терміналі побігли, то можна вважати роботу виконаною. Тому якщо це черговий «cyberdeck», то це гола плата з напаяним екраном, якщо це смарт-годинник, то якась шняга з дротами в усі боки, примотана ізострічкою до руки.
Нє, 3D-принтери дійсно значно покращили цей момент, тож хтось запарюється хоча б упакувати свій винахід з купи компонентів у паралелепіпед. Ну, принаймні зробити собі власну клавіатуру вже стало майже повсякденністю, тож прогрес є. Але якість все одно не порівняти з технологіями масового виробництва на жаль.
І тільки одиниці спроможні довести справу до дійсно класного хардварного продукту: такі зазвичай одразу на кікстартер йдуть. І я як доволі частий у минулому гість-споживач на кікстартері можу впевнено заявити: більшість з них врешті обйобується на софті. Глючні та сирі мобільні проги-компаньйони, половина фічей не працює, обіцянки-цяцянки й ось все це.
Отож… моя проблема яка? У мене руки криві, щоб зробити дійсно компактний, приємний на дотик, зручний та цілісний пристрій. А їхня проблема яка? Що на розробку софта бюджетів вже наприкінці не лишилося… Ну то дайте мені пристрій та SDK! Так, я готовий за це заплатити (але не 500 баксів)!
Ті ж універсальні пульти взяти… На кікстартері щомісяця новий, кожен обіцяє підтримку тисяч пристроїв від сотень вендорів, а врешті це все виливається в прогу в Google Play на 2,1
Безумовно, зробити зручний та простий високорівневий SDK — задача чи не складніша за написання прикладного софту. Але це також можна перекласти на користувачів вже. Хтось зробить фреймворк, хтось щось на ньому, а хтось і до #lowcode доведе, щоб люди без програмерської освіти змогли творити. А вони це можуть! Подивіться, які дашборди роблять не програмісти для Home Assistant: та вони кращі, ніж будь-що, що колись зроблю я
Певні рухи в цей бік відбуваються. Як, наприклад, оцей смарт-годинник — не прям вау, але й не повне лайно. Але бляха, дивитися на 100501-й аналог геймбоя або чергове «рішення» на бредборді з вʼязкою дротів — немає сил вже, їй-богу. Як же хочеться щось завершене з хардварного погляду, але «чистий лист» та зручні інструменти — з софтварного.
Купили б щось таке? Чи може вже?
Please open Telegram to view this post
VIEW IN TELEGRAM
Писати на 💻 у VS Code 💻 — це, звісно, класно і зручно, але блять… Треба було брати комп зі 128 ГБ оперативи.
(Другий рядок з
(Другий рядок з
java
— це SonarLint, до речі, теж з VS Code).Please open Telegram to view this post
VIEW IN TELEGRAM
Сьогодні пʼятниця, й особисто в мене сьогодні вихідний.
А ви думали чи, може, навіть мріяли колись про чотириденний робочий тиждень? Я теж!
І я не тільки спробував, працюючи при цьому в аутсорс-компанії⛴ , а й зробив його для всієї своєї команди 😎
P.S. З вас усіх по репосту, бо скіки можна, їй-богу. Ексклюзивний матеріал врешті-решт😉
А ви думали чи, може, навіть мріяли колись про чотириденний робочий тиждень? Я теж!
І я не тільки спробував, працюючи при цьому в аутсорс-компанії
P.S. З вас усіх по репосту, бо скіки можна, їй-богу. Ексклюзивний матеріал врешті-решт
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegraph
Про чотириденний робочий тиждень
Темою особистої продуктивності я цікавлюся давно. Зокрема тому, що якось я майже пів року працював шість днів на тиждень, а врешті значна кількість результатів моєї роботи та моїх прагнень як менеджера помножилася на нуль, що невідворотно призвело до вигорання.…
Як вам «новий» прогрес-бар для відосів на ютубі?
Я вже декілька тижнів це спостерігаю й щоразу висаджуюся, що у мене монік поплив і паплюжить кольори. Питання тут два: Нахуя та навіщо?
Уявіть собі роботу в гуглі: круто, еге ж? Компанія мрії. Мабуть пів року це узгоджували.
Почуваюся як той чувак з анекдоту, що 10 років рахує сірники в коробках. Сподіваюся, ви це теж бачите😅
Я вже декілька тижнів це спостерігаю й щоразу висаджуюся, що у мене монік поплив і паплюжить кольори. Питання тут два: Нахуя та навіщо?
Уявіть собі роботу в гуглі: круто, еге ж? Компанія мрії. Мабуть пів року це узгоджували.
Почуваюся як той чувак з анекдоту, що 10 років рахує сірники в коробках. Сподіваюся, ви це теж бачите
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Якщо хтось чекав можливості знову порекламувати мені Rust, то ось вона.
Писав учора на C++ знов. Прога вже чудово працює на macOS — треба було тільки перезібрати під вінду. Але білд пофейлився з отакою помилкою (і ще з понад сотнею інших):
Так, а шо там у нас на 65-му рядку?
🙄 Е-е-е-ем…
Щоб ви розуміли, в цьому хедері навіть інклудів немає. Але! Вони були в тій одиниці трансляції, куди цей хедер потрапляв. Там вище була пачка інклудів кьюта, і я підозрюю, що якийсь з них врешті інклудив
Після виправлення цього нарешті зібралося йзапрацю… крашнулося на старті. В дебагу крашить гарантовано, в релізі 3 рази з 5 🤔 Ще мінус пів години життя. Щоправда 20 хвилин я витратив на те, щоб підʼєднати дебажні символи та вказати шлях до сорців, щоб хоч якось збагнути, де проблема. Це не допомогло. Але інтуїція врешті скерувала погляд на один клас, де я забув проініціалізувати вказівник 🤡
Ну нічо, колись нарешті модулі в плюсах запрацюють, а потім заімплементять Safe C++, і тоді заживемо😂
Писав учора на C++ знов. Прога вже чудово працює на macOS — треба було тільки перезібрати під вінду. Але білд пофейлився з отакою помилкою (і ще з понад сотнею інших):
dmp_diff.h(65): error C2059: syntax error: '('
Так, а шо там у нас на 65-му рядку?
enum class Operation { DELETE, INSERT, EQUAL };
Щоб ви розуміли, в цьому хедері навіть інклудів немає. Але! Вони були в тій одиниці трансляції, куди цей хедер потрапляв. Там вище була пачка інклудів кьюта, і я підозрюю, що якийсь з них врешті інклудив
Windows.h
, а десь там воно дефайнить макрос DELETE
. Я колись давно з цим вже стикався, та на жаль забув, тож знов витратив на це зайві пів години.Після виправлення цього нарешті зібралося й
nullptr
ʼом Ну нічо, колись нарешті модулі в плюсах запрацюють, а потім заімплементять Safe C++, і тоді заживемо
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Сьогодні майстер-клас від 💻 про те, як не треба робити #UI.
Please open Telegram to view this post
VIEW IN TELEGRAM
Попри назву каналу я тут про C++ пишу не надто часто, як мені здається. Ну бо що про нього писати — все й так зрозуміло. Тим паче я взагалі UI зазвичай кодю, тобто кнопки по вікну рухаю, тож чого від мене взагалі можна чекати.
Та вчора глянув доповідь Саттера з cppcon, і щось прям кайфонув. Напрям, яким рухається розвиток мови, мене здебільшого влаштовує (хоча методи, якими це досягається — ну таке…).
Ця доповідь є продовженням його іншого виступу 2017 року про метакласи. Я ще тоді був у захваті, однак, потім було 7 років «тиші».
Короч, якщо коротко, то все йде у компайл-тайм (раптом досі не було очевидно), і конкретно зараз всі розмови ведуться про рефлексію, яка теж працюватиме під час компіляції. Спершу ця тема з компайл-таймом виглядала мені так, наче це буде сильно обмежувати, та з іншого боку, якщо вам треба робити рантайм-рефлексію, то ви можете під час компіляції нагенерувати собі всі потрібні засоби для цього, щоб потім можна було в рантаймі використовувати. (Але синтаксис там пиздець. А ви чого очікували? гг).
Ще Саттер зачепив тему safety звісно, бо куди ж без цього нині. Того, що я почув, мені достатньо, щоб продовжити успішно ігнорувати Rust😂
Потім ще з Александреску вони на сцені потеревенили про регулярні вирази та парсери граматик, для яких під час компіляції генерується оптимальний код. І щось згадали про AI. Ну й таке. Помріяли й досить.
Ще була прикольна цитата Страуструпа про те, що «всередині C++ сидить значно менша, безпечніша, зручніша й загалом крутіша та лаконічніша мова, яка проситься назовні»(і ця мова — LISP 😂.)
Загалом цікаво доволі, мені сподобалося. Хоча півтори години слухати про💻 — це треба або значну витримку мати, або не хотіти займатися іншими справами ще сильніше 😅
Та вчора глянув доповідь Саттера з cppcon, і щось прям кайфонув. Напрям, яким рухається розвиток мови, мене здебільшого влаштовує (хоча методи, якими це досягається — ну таке…).
Ця доповідь є продовженням його іншого виступу 2017 року про метакласи. Я ще тоді був у захваті, однак, потім було 7 років «тиші».
Короч, якщо коротко, то все йде у компайл-тайм (раптом досі не було очевидно), і конкретно зараз всі розмови ведуться про рефлексію, яка теж працюватиме під час компіляції. Спершу ця тема з компайл-таймом виглядала мені так, наче це буде сильно обмежувати, та з іншого боку, якщо вам треба робити рантайм-рефлексію, то ви можете під час компіляції нагенерувати собі всі потрібні засоби для цього, щоб потім можна було в рантаймі використовувати. (Але синтаксис там пиздець. А ви чого очікували? гг).
Ще Саттер зачепив тему safety звісно, бо куди ж без цього нині. Того, що я почув, мені достатньо, щоб продовжити успішно ігнорувати Rust
Потім ще з Александреску вони на сцені потеревенили про регулярні вирази та парсери граматик, для яких під час компіляції генерується оптимальний код. І щось згадали про AI. Ну й таке. Помріяли й досить.
Ще була прикольна цитата Страуструпа про те, що «всередині C++ сидить значно менша, безпечніша, зручніша й загалом крутіша та лаконічніша мова, яка проситься назовні»
Загалом цікаво доволі, мені сподобалося. Хоча півтори години слухати про
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Peering Forward - C++’s Next Decade - Herb Sutter - CppCon 2024
https://cppcon.org
CppCon 2024 Early Access: https://cppcon.org/early-access
Access All 2024 Session Videos Ahead of Their Official Release To YouTube. At least 30 days exclusive access through the Early Access system. Videos will be released to the CppCon…
CppCon 2024 Early Access: https://cppcon.org/early-access
Access All 2024 Session Videos Ahead of Their Official Release To YouTube. At least 30 days exclusive access through the Early Access system. Videos will be released to the CppCon…
Forwarded from Мамкін Архітектор
як раз на цю тему (с++, пост ще не прочитав) сьогоднішній мем в нашій групі мемів
Вирішив спробувати написати парсер бінарного формату логів (DLT — Diagnostic Log and Trace protocol). Є, звісно, офіційна відкрита специфікація від AUTOSAR. Читати такі зазвичай вкрай неприємно — дуже сухий текст з перехресними посиланнями на реквайрменти, причому в PDF-ці це не клікабельні посилання, а тупо текстовий ідентифікатор у дужках.
Але якщо перебороти себе з читанням, то якраз імплементувати щось по таких спеках — це просто пісня. Все чітко та детально розписане — бери й транслюй у код собі.
Так я й зробив. Вирішив використовувати Kaitai Struct, про який вже згадував раніше. Формат DLT не суперскладний, але вельми обʼємний, тож нормально часу на це пішло. Потестував на парі маленьких файлів — все чудово.
А потім запускаю у їхній (локально піднятій) web IDE на більш практично-реалістичному файлі на 1,3 мільйона записів — а воно всирається десь посеред парсингу і не пише, де саме. Двійковим пошуком швидко знайшов, що відбувається це в районі 18093-го запису. Дивлюся — і не розумію. Навіть десять разів перевірив свою імплементацію.
Короч, у файлі зберігаються бінарні записи один за одним. Починається все з
До того ж у standard header лежить загальна довжина повідомлення, і по ній чітко видно, що там саме 4 байти в кінці лишається. Але! Якщо відкрити у якійсь програмі для перегляду логів, наприклад у Chipmunk, то воно хаває файл без проблем. Як?
Виходячи з того значення, яке Chipmunk показує, виявилося, що їхній парсер (на расті до речі) тупо ігнорує загальну довжину повідомлення, а читає собі спокійнісенько 8 байтів з тієї позиції, з якої його попросили. І нічо, що друга половина — це вже початок нового повідомлення🤯
Але головне питання тут не до Chipmunk. Я щось просто не второпаю, як можна було записати такий файл. Може й тупо баг, звісно, і там мав бути🥲
P.S. До речі, у процесі ще намагався використовувати ImHex, про який теж згадував, але при написанні власних патернів він крашить що курва. Неможливо користуватися взагалі.
Але якщо перебороти себе з читанням, то якраз імплементувати щось по таких спеках — це просто пісня. Все чітко та детально розписане — бери й транслюй у код собі.
Так я й зробив. Вирішив використовувати Kaitai Struct, про який вже згадував раніше. Формат DLT не суперскладний, але вельми обʼємний, тож нормально часу на це пішло. Потестував на парі маленьких файлів — все чудово.
А потім запускаю у їхній (локально піднятій) web IDE на більш практично-реалістичному файлі на 1,3 мільйона записів — а воно всирається десь посеред парсингу і не пише, де саме. Двійковим пошуком швидко знайшов, що відбувається це в районі 18093-го запису. Дивлюся — і не розумію. Навіть десять разів перевірив свою імплементацію.
Короч, у файлі зберігаються бінарні записи один за одним. Починається все з
["DLT", 0x1]
, далі йде storage header, standard header, опціональний extended header та payload. В пейлоді лежить довільна кількість «аргументів» різних типів: тип вказаний бітово на початку пейлода, а саме значення лежить за ним. І там вказано, що має бути unsigned int64, але лежить всього 4 байти! Ну й парсер такий: «Відмовляюся працювати далі!»До того ж у standard header лежить загальна довжина повідомлення, і по ній чітко видно, що там саме 4 байти в кінці лишається. Але! Якщо відкрити у якійсь програмі для перегляду логів, наприклад у Chipmunk, то воно хаває файл без проблем. Як?
Виходячи з того значення, яке Chipmunk показує, виявилося, що їхній парсер (на расті до речі) тупо ігнорує загальну довжину повідомлення, а читає собі спокійнісенько 8 байтів з тієї позиції, з якої його попросили. І нічо, що друга половина — це вже початок нового повідомлення
Але головне питання тут не до Chipmunk. Я щось просто не второпаю, як можна було записати такий файл. Може й тупо баг, звісно, і там мав бути
uint32
, а не uint64
, але трясця — тут же навіть думати не сильно треба було: маючи спеку, просто йдеш по ній, пишеш код, а потім пишеш тести, бо в специфікації всі реквайрменти максимально чітко прописані, де який біт має бути виставлений за яких умов. Сумно якось це все трохи P.S. До речі, у процесі ще намагався використовувати ImHex, про який теж згадував, але при написанні власних патернів він крашить що курва. Неможливо користуватися взагалі.
Please open Telegram to view this post
VIEW IN TELEGRAM
Був у мене донедавна «кишеньковий» роутер від TP-Link (TL-WR902AC) за 25 євро. Шматок дешевого пластику, проте, свою справу він робив: зупиняєшся у якомусь готелі, наприклад, а там Wi-Fi з цим тупим так званим captive portal — це коли тебе спочатку кидає на веб-сторінку авторизації. А деякі ще й обмежують кількість пристроїв, які можна одночасно використовувати. Телефон чи планшет ще хєр би з ним, але на якійсь ігровій консолі вже не скористаєшся, якщо там навіть бравзера немає. В принципі можна з телефона просто «затетерити» 4G/5G, але це якось незручно, ще й не завжди звʼязок норм.
Звісно, проблема трохи надумана, особливо з моїми відпустками два рази на пʼять років, а останнім часом навіть вони «локальні», та все ж зручно було: просто підʼєднуєш цей роутер до Wi-Fi/Ethernet де завгодно й сидиш зі своїм NAT. От тільки цього року він раптово вмер. Просто перестав будь-які ознаки життя подавати.
Тож буквально ось-ось узяв собі замінник — китайський GL-iNet Beryl AX. Він, звісно, трохи більший вже за розміром (досі менше за айфон, але товщий звісно), зате значно фічастіший. По-перше, тут з коробки йде OpenWRT з якоюсь надбудовою від GL-iNet (втім можна це все знести та прошити чистий OpenWRT), а це дуже потужна прошивка. Наприклад, я собі в декілька кліків підняв Taillscale💠 прям на роутері. По-друге, у ньому 2,5-гігабітний Ethernet, Wi-Fi 6, 512 MB RAM (вдвічі більше, ніж у моєму першому компі), можливість підʼєднати зовнішнє сховище через USB або мобілку як модем, підтримка Wireguard з коробки тощо. За якимсь хєром ще руснявий AdGuard Home вбудований, але це ж OpenWRT — можна легко видалити.
Короч, якось так виходить, що цей роутер за низкою параметрів краще, ніж між основний домашній 😅 Коштував, правда, вже аж цілих 75 євро, але якщо він протримається хоча б років 8–10, як попередній, то буде норм.
Звісно, проблема трохи надумана, особливо з моїми відпустками два рази на пʼять років, а останнім часом навіть вони «локальні», та все ж зручно було: просто підʼєднуєш цей роутер до Wi-Fi/Ethernet де завгодно й сидиш зі своїм NAT. От тільки цього року він раптово вмер. Просто перестав будь-які ознаки життя подавати.
Тож буквально ось-ось узяв собі замінник — китайський GL-iNet Beryl AX. Він, звісно, трохи більший вже за розміром (досі менше за айфон, але товщий звісно), зате значно фічастіший. По-перше, тут з коробки йде OpenWRT з якоюсь надбудовою від GL-iNet (втім можна це все знести та прошити чистий OpenWRT), а це дуже потужна прошивка. Наприклад, я собі в декілька кліків підняв Taillscale
Короч, якось так виходить, що цей роутер за низкою параметрів краще, ніж між основний домашній 😅 Коштував, правда, вже аж цілих 75 євро, але якщо він протримається хоча б років 8–10, як попередній, то буде норм.
Please open Telegram to view this post
VIEW IN TELEGRAM
Там сьогодні почався Advent of Code: треба розвʼязувати задачки будь-якою мовою. Щодня по дві штуки.
У мене загалом ані часу вільного на це, ані значного бажання, однак, чогось вирішив спробувати. Планую упоротися по мовах, яких не торкався роками.
Сьогодні почав з Haskell💻 . Руки досі памʼятають, хоча й витратив десь годину, щоб встановити все й згадати, як запускати 😅 На розʼязання самих задач пішло десь 25 хвилин, бо зробив усе вкрай прямолінійно, утім… яка вже різниця.
Ще навіть не певен, чи не обламає мене завтра продовжувати ) Подивимося. Долучайтеся також чи шо, я навіть для чогось лідерборд створив:
У мене загалом ані часу вільного на це, ані значного бажання, однак, чогось вирішив спробувати. Планую упоротися по мовах, яких не торкався роками.
Сьогодні почав з Haskell
Ще навіть не певен, чи не обламає мене завтра продовжувати ) Подивимося. Долучайтеся також чи шо, я навіть для чогось лідерборд створив:
4272620-3487bc2a
.Please open Telegram to view this post
VIEW IN TELEGRAM
Класно бути програмістом на C++: захотів покодити іншою мовою — скомпілив її 😂
От я сьогодні з цього почав, бо вирішив згадати мову io, але під arm64 на macOS її немає, бо там якийсь асемблерний код не компілюється. Автори кажуть, мовляв, треба окрему версію Homebrew поставити для цього, але то якогось занадто головняково, тож я просто скомпілював з сорців. Версія з
Першу сьогоднішню задачу з Advent of Code я розвʼязав дуже швидко, а от другу вже повертів туди-сюди, бо, як це часто буває, налажав десь у корнер-кейсах. А там якраз був ОДИН такий😅
Тепер про саму мову. Вона наче й не складна, але є там трохи дивні моменти, коли начебто схожі конструкції поводять себе трохи по-різному.
З класного: там все є виразом (expression), тобто у всього є результат, тому можна хоч цикл
Ще з цікавого: вирішив я написати функціюз трохи тупою назвою
Використовую її потім якось отак (тут
Прикол тут наступний: якогось спеціального синтаксису для лямбд немає.
У
Працює io десь разів у 10 повільніше за Haskell. Файл на 1000 рядків у мене оброблявся 200 з копійками мілісекунд. З іншого боку, оптимізаціями там і не пахне. Не казатиму вам, яка складність у мого алгоритму, бо там треш ))
От я сьогодні з цього почав, бо вирішив згадати мову io, але під arm64 на macOS її немає, бо там якийсь асемблерний код не компілюється. Автори кажуть, мовляв, треба окрему версію Homebrew поставити для цього, але то якогось занадто головняково, тож я просто скомпілював з сорців. Версія з
master
одразу падала з помилкою, тому довелося трохи пострибати по теґах.Першу сьогоднішню задачу з Advent of Code я розвʼязав дуже швидко, а от другу вже повертів туди-сюди, бо, як це часто буває, налажав десь у корнер-кейсах. А там якраз був ОДИН такий
Тепер про саму мову. Вона наче й не складна, але є там трохи дивні моменти, коли начебто схожі конструкції поводять себе трохи по-різному.
З класного: там все є виразом (expression), тобто у всього є результат, тому можна хоч цикл
for
записати у змінну. Ну, насправді це й не цикл, а просто функція в Object
. Взагалі треба дуже уважно дивитися, що яка функція повертає, бо інколи це не те що ти очікуєш.Ще з цікавого: вирішив я написати функцію
mapPairs
, яка виконує блок коду на кожній парі зі списку та повертає список результатів. Мабуть, можна було цікавіше щось вигадати, але пох.Використовую її потім якось отак (тут
report
— це список):increasing := true
decreasing := true
report mapPairs(l, r,
increasing = increasing and l < r
decreasing = decreasing and l > r
result := (increasing or decreasing) and (l - r) abs <= 3
"#{l}, #{r}: #{result}" interpolate println
result
)
Прикол тут наступний: якогось спеціального синтаксису для лямбд немає.
mapPairs
— це просто метод з трьома параметрами: l
, r
та блок коду. Причому l
та r
я до того ніде не створював, але в блоці коду їх використовую разом з іншими змінними з локального скоупа, звідки викликаю це. Як же це працює? А отак:List mapPairs := method(
left := call argAt(0) name
right := call argAt(1) name
body := call argAt(2)
context := Object clone prependProto(call sender)
if(call sender hasLocalSlot("self"),
context setSlot("self", call sender self)
)
result := List clone
for (i, 0, self size - 2,
context setSlot(left, self at(i))
context setSlot(right, self at(i + 1))
result append(context doMessage(body))
)
result
)
У
context
клонується все з sender
(так-так, в io методи — це надсилання повідомлень, як у SmallTalk), потім у ньому ж створюються l
та r
, а потім отой блок коду виконується вже в цьому контексті. Трошки винесло мені мозок короч.Працює io десь разів у 10 повільніше за Haskell. Файл на 1000 рядків у мене оброблявся 200 з копійками мілісекунд. З іншого боку, оптимізаціями там і не пахне. Не казатиму вам, яка складність у мого алгоритму, бо там треш ))
Please open Telegram to view this post
VIEW IN TELEGRAM
Так-так, задовбав уже вас усіх з Advent of Code. Але довго я не витримаю, обіцяю.
Втім сьогодні задачі були вкрай легкі. І особливо — якщо розвʼязувати їх за допомогою мови🆕 .
Вкотре нагадую, що Nushell — це наразі найкрутіша та найзручніша оболонка, яка до того ж ще й стрімко розвивається (і написана на Rustas if someone cares ). Мова Nu — статично типізована, передає через пайп структуровані дані, має купу корисних функцій у стандартній бібліотеці тощо. Просто погляньте:
Кайф же! (Взагалі-то тут можна було одним
Забудьте про Fish, PowerShell чи, боже збав, Zsh та Bash — тільки Nushell!
Втім сьогодні задачі були вкрай легкі. І особливо — якщо розвʼязувати їх за допомогою мови
Вкотре нагадую, що Nushell — це наразі найкрутіша та найзручніша оболонка, яка до того ж ще й стрімко розвивається (і написана на Rust
export def solve-one [fileName: string] [nothing -> int] {
log info $"Reading from ($fileName)"
let result = (open $fileName
| parse --regex '(mul\((?P<a>\d+),(?P<b>\d+)\))'
| into int a b
| upsert c {|it| $it.a * $it.b}
| math sum
| get c
)
$result
}
Кайф же! (Взагалі-то тут можна було одним
reduce
все зробити, але мені отак покроково більше подобається). І працює швидко: приклади та вхідні дані для обох задач обробляє за 20 мс разом узяті. Забудьте про Fish, PowerShell чи, боже збав, Zsh та Bash — тільки Nushell!
Please open Telegram to view this post
VIEW IN TELEGRAM