Kolejne próby nagrywania dronem DJI MINI 4 PRO. Zdjęcia zarejestrowane chwilę po WOŚP – Światełku do nieba. Przedstawiają pięknie oświetlony most.
Wczorajszy WOŚP
Wielka Orkiestra Świątecznej Pomocy w Toruniu. W dniu 28 stycznia 2024 roku punktualnie o 20:00 przy kapitalnym nagłośnieniu odbył się niesamowity pokaz laserów.
Timer w React Component
Wywoływanie rekurencyjne funkcji w React-cie z wykorzystaniem „setTimeout” i odwoływanie się w nich do stanów jest dość problematyczne. Taka funkcja „widzi zamrożony stan” pomimo tego, że może go zmieniać.
Poniżej sposób na timer (wykonywanie akcji z opóźnieniem) z możliwością dostępu do stanów w komponencie Reacta.
const [timerCounter, setTimerCounter] = useState(0);
useEffect(() => {
const id = setTimeout(
() => setTimerCounter(timerCounter + 1),
1000
);
console.log("TIK", timerCounter);
return () => clearTimeout(id);
}, [timerCounter]);
Przykład heartbeat-a odpytującego API
const [doReloadTime, setDoReloadTime] = useState(1000);
const [fetchState, setFetchState] =
useState<string>("waiting");
// aktualizacja danych
const onData = useCallback((data: any) => {
// ...
}, []);
// pobieranie danych z API
const reloadData = useCallback(() => {
setFetchState("waiting");
fetch(...)
.then(res => {
onData(res);
setFetchState("done");
setDoReloadTime(1000);
})
.catch(err => {
onData(null);
setFetchState("error");
setDoReloadTime(5000);
});
}, [onData]);
// heartbeat
useEffect(() => {
if (!reloadData || doReloadTime <= 0)
return;
setTimeout(() => {
reloadData();
}, doReloadTime);
setDoReloadTime(0);
}, [doReloadTime, reloadData]);
Nieszawka nocą
Widok z drona nocą zimową porą. Film zarejestrowano w pobliżu skrzyżowania ulic Nieszawska i Zagrodowa. Temperatura powietrza -5 st. C
Wał w okolicy Krowiego Mostku
Film nagrany za pomocą drona Dji Mini 4 Pro.
Lokalizacja: Toruń, ul. Wiślana w okolicach „Krowiego mostku”.
Widok na ul. Nieszawską, węzeł kolejowy oraz na pola przy wale.
Alternatywa dla STRING_SPLIT w MSSQL
Poniżej przykład podzielenia tekstu i wprowadzenie go do tabeli. Ciąg znaków odseparowany od siebie np. przecinkiem. Dane w tabeli można dalej przetwarzać w SQL.
Poniższy przykład również pomaga obejść błąd
’STRING_SPLIT’ is not a recognized built-in function name.
Przykładowo mamy ciąg znaków odseparowany przecinkiem:
declare @str2arr as varchar(200);
set @str2arr = '5, 10, 12';
Aby podzielić ciąg znaków (String) i wprowadzić dane do tymczasowej tabeli należy wykonać:
declare @Str2ArrTable as table(p int);
insert into @Str2ArrTable
select trim(split.a.value('.', 'VARCHAR(100)'))
from (select Cast ('
cross apply data.nodes ('/M') AS Split(a);
Dane znajdują się w tabeli. Aby je podejrzeć:
select * from @Str2ArrTable;
Dane z tabeli można wykorzystań np. w innym zapytaniu SQL jako warunek:
select * from Dokumenty where typDok in (
select p from @Str2ArrTable
);
Ograniczenie dostępu do magazynu w Subiekcie
Na chwilę obecną za pomocą interfejsu w systemie Subiekt GT istnieje możliwość udostępnienia tylko jednego lub wszystkich magazynów. Czasami zachodzi konieczność nadania dostępu do więcej niż jednego, ale nie do wszystkich magazynów. W bazie Subiekta znajduje się tabela sl_MagazynProfil
, w której są wpisy odpowiedzialne za wykluczenie użytkownika z magazynów.
Poniżej skrypt SQL, który umożliwia wykluczenie z magazynu wszystkich użytkowników z wyjątkiem wskazanych (Kowalski Jan, Lewandowski Marcin, ID 1, ID 2
/* Definicja Magazynu */
declare @magId INT;
set @magId = 10;
/* Usunięcie poprzedniej konfiguracji */
delete from sl_MagazynProfil where pf_IdObiektu = @magId;
/* Nowa konfiguracja */
insert into sl_MagazynProfil
select @magId, uz_Id
from pd_Uzytkownik
where uz_Status = 1
and not (uz_Nazwisko = 'Kowalski' and uz_Imie = 'Jan')
and not (uz_Nazwisko = 'Lewandowski' and uz_Imie = 'Marcin')
and uz_Id not in (1, 2);
/* Podgląd konfiguracji */
select mag_Symbol, uz_Nazwisko, uz_Imie
from sl_MagazynProfil, pd_Uzytkownik, sl_Magazyn
where pf_idUzytkownika = uz_Id and mag_Id = sl_MagazynProfil.pf_IdObiektu and pf_IdObiektu = @magId;
Definicja magazynu ID 10
set @magId = 10;
(...)
Użytkownicy, którzy mają mieć dostęp
(...)
and not (uz_Nazwisko = 'Kowalski' and uz_Imie = 'Jan')
and not (uz_Nazwisko = 'Lewandowski' and uz_Imie = 'Marcin')
and uz_Id not in (1, 2)
(...)
Skrytobójca w Ghost of Tsushima
Gameplay z jednej z misji fabularnych. Zadanie polega na przedostaniu się do Twierdzy Yarikawa ukrytym za wodospadem przejściem. Twierdza jest oblężona przez Mongołów, a podczas wykonywania misji gracz nie może zostać wykryty. Poziom trudności: Śmiertelny (Lethal).
Spacer z kamieniem w bucie i nie tylko ;)
W Toruniu również można fajnie pobiegać. Trasa: 16KM wałem, a później lasem wokół Nieszawki.
Filmik testowy:
Nightskating Toruń
Finałowy, trzeci w tym roku nocny przejazd na rolkach przez Toruń. Jest to pożegnanie sezonu i przywitanie roku szkolnego. Start spod centrum handlowego Plaza, godz. 20:00.