GIT commit NPE
95 subscribers
298 photos
5 videos
36 links
Кодинг, linux, git, SQL, regex, board games, ножі, треш-індастріал.
Download Telegram
Channel created
Channel photo updated
Мій другий EDC-ніж.
Blade Brothers (Харків), "Оркнейський пазур"
#knives #places
Ці хлопці допомагають мені працювати на карантині
Ті, що творять долю
#boardGames
Десь рік займався спортивним ножовим боєм. Якось за тиждень до Нового року 2019 ми, разом із нашим сенсеєм, зібралися невеликою теплою компанією вдома в одного з наших хлопців.
"Передноворічні посиденькі ножовиків"
#knives
А ви знали, що регекспи можуть бути дуже веселими?

^([^^])^ або (?:\?+?)?(?=\?)

#regex
"Взаємодія з системою контролю версій. Інструкція для новачків".
Зображення взято десь з Хабру. Люблю цю картинку.
#git
Доречі, про системи контролю версій.
Вчора вперше за п'ять років знайомства з git мені згодився reflog. По роботі.

Картіна маслом.
Запушив коміт з двома новими файлами у свою feature-гілку. Дивлюся - а один з них мені і не потрібен. Видалив його, а потім, щоб не створювати нового коміту та не залишати непотрібний файл в історії, роблю
1. git commit --amend
2. git push --force origin my-feature

Здогадайтеся, чи той файл я видалив?..
Отож. Не той.
Маємо: В локальномі репозиторії файла нема (бо amend). У віддаленому - теж (бо force push). А у файлі був SQL строчок на п'ятнадцять, що шліфувався зо дві години.
Перша секунда після: йо...
Друга секунда: о, в мене ж є reflog, я про нього і на мітапі розповідав.

1. git reflog
2. знаходжу хеш того коміту, в якому був потрібний файл
3. git checkout хешКоміту -- шлях/до/файлу
(тільки не загубіть пробіли до і після двох дефісів)
4. маю "втрачений" файл в локальному репозиторії
5. ???
6. профіт!

Мораль.
Git ніколи сам по собі не видаляє дані. І навіть після переписування історії можна знайти "втрачене" (але поки gc на репозиторії ніхто не запускав).

#git
TRUE, FALSE, NULL, fn(NULL)
Булєва логіка - штука логічна. Але в реляційних базах є старий добрий NULL.

Так, ми пам'ятаємо, шо nullable поле тре перевіряти на IS NULL (IS NOT NULL) і ніяк не на =NULL (<>NULL), бо в результаті замість бажаного true або false завжди отримаємо NULL.

Так, ми пам'ятаємо, шо якийсьОператор(NULL) та NOT якийсьОператор(NULL) знову таки дають одне й те саме - NULL (звісно, якщо якийсьОператор не з тих, що вміють поводитися з NULL - IFNULL, COALESCE...).

Ще ми пам'ятаємо, шо NULL є такимсь "третім елементом" у булєвій логіці РСКБД:
true OR NULL —> true
false OR NULL
—> NULL
true AND NULL
—> NULL
false AND NULL
—> false
(принаймні в PostgreSQL та MySQL)

Цікаво, правда?

Та ОСОБЛИВО це, млять, стає цікавим, коли в nullable полі лежить масив і вам треба чекнути щось по типу "чи є значення у цьому масиві": value=ANY(arrayField).
Причому цей предикат ще пов'язаний через AND або OR з іншими. Якось по типу
( condition OR NOT value=ANY(myArray) )
AND
( condition OR NOT value=ANY(myArray) )

Мораль.
Не завжди nullable поля-массиви це зручно. Зробіть NOT NULL та зберігайте пустий масив замість NULL.
І тоді ANY(myArray) поверне канонічне true або false, яке прозоро може бути поєднано з іншими предикатами. І буде вам щастя.

За мотивами написання SQL-міграції, в якій фігурує nullable поле-массив.
... або просто юзайте
COALESCE(arrayField, '{}')
Zombicide.
Цікава гра, атмосферна. Для тих, хто полюбляє зомбі-апокаліпсис.
#boardGames