Delphi 10.3 süntaks natuke C suunas

juuni 28, 2019

Esmalt märkus: õppimiseks täiesti tasuta versioon Delphist olemas https://www.embarcadero.com/products/delphi/starter.

Panin mõned näited ntx inline muutujad.

// ***
for var I := 1 to 1 do
showmessage(i.ToString);

// ***
for var I : Integer := 1 to 1 do
showmessage(i.ToString);

// ***
var t := TStringList.Create;
for var x: String in t do
begin
var y := x; // nagu C++ auto muutuja, ei pea tüüpi täpsustama, kompilaator leiab selle ise
showmessage(y);
end;
t.Free;

MS SQL: viewd on teie sõbrad…

märts 28, 2019

Arusaamatul põhjusel inimesed kardavad view’sid. Võin öelda, et olles MS SQL andmebaasiga sõber alates 2000 aastast juba, ütlen view’d on teie sõbrad. Toon ühe lihtsa näite, mida mina kasutanud. Viewd sai mitu probleemi lahendatud:

  1. Kasutajad ei pääse otse ühelegi tabelile ligi, kõik toimub läbi view’de. Õigused omistate vaid viewle !

  2. Viewdes saab where lauses piirata kirjete nähtavust õigustega. MSSQL lubab viewd kasutada kui “tabelit” kui view genereeritud stiilis (ei tohi olla select osas teiste tabelite välju !) SELECT minutabel.* FROM minutabel JOIN Osakonnad  o ON o.id = minutabel.osakondid AND o.tootajalogin = suser_name()

  3. Viewdes saab kuvada vaid nö live kirjeid, üheski natukene tõsisemas süsteemis reaalselt kirjeid ei kustutata. Põhjus lihtne, kui mingi probleem, saab läbi kustutatud kirjete näha, mida on korda saadetud. Stiilis … WHERE kustutatud = 0

Koheselt tuleb saalis köhatus, aga mis siis juhtub, kui lähtetabelisse tekivad uued väljad, view ju neid ei kuva. Ärge muretsege: lihtsalt üks väike lisaliigutus, ei pea VIEW’d droppima ja uuesti looma. Viimase tegevusega kaoks ka kõik õigused.

Vaid üks käsk: sp_refreshview supervaade_vw

Panen siia ka koodinäite:

CREATE TABLE tmp_kasutaja
(
id INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY,
eesnimi VARCHAR(35),
pereknimi VARCHAR(35),
lisajaid INTEGER,
lisatudkp DATETIME,
muutjaid INTEGER,
muudetudkp DATETIME,
kustutajaid INTEGER,
kustutatudkp DATETIME,
kustutatud BIT
)

 

CREATE VIEW tmp_kasutaja_vw
AS
SELECT * FROM tmp_kasutaja WHERE kustutatud = 0

Kuna kustutamine pole kunagi hea mõte, sest tihti kasutajatel tekib kollektiivne mäluauk ja alati infosüsteemid süüdi. Siis sellised kirjete logid stiilis, et kustutatud kirje reaalselt ei kustu ja muutja ning lisaja salvestatakse, see tegevus parandab tihti kollektiivset mäluauku.  Nii mõnelegi kasutajale järsku tuleb meelde, jaaa ma vist kustutasin midagi.  Teine variant teha tervilik auditlogi, kus igasugust muutmist logitakse, aga tihti ka sellisest “lihtsast” auditlogist täiesti piisab (kes muutis, kes lisas, kes kustutas).

Selleks teeme ühe toreda INSTED OF TRIGGERI

CREATE TRIGGER tmp_kasutaja_upt_del_trg ON dbo.tmp_kasutaja INSTEAD OF DELETE
AS
BEGIN

DECLARE @tootajaid INT;

SET NOCOUNT ON;
SELECT @tootajaid = id
FROM Tootaja
WHERE login = SUSER_NAME()

UPDATE t
SET kustutatud=1, kustutajaid=@tootajaid, kustutatudkp=GETDATE()
FROM tmp_kasutaja t
INNER JOIN deleted d ON
t.id = d.id

END

 

CREATE TRIGGER tmp_kasutaja_upt_trg on tmp_kasutaja
FOR UPDATE, INSERT
AS
BEGIN
DECLARE @tootajaid INT;

SET NOCOUNT ON;
SELECT @tootajaid = id
FROM Tootaja
WHERE login = SUSER_NAME()

IF EXISTS(SELECT * FROM DELETED)
BEGIN
IF UPDATE(kustutatud) return
UPDATE t
SET muutjaid=@tootajaid, muudetudkp=GETDATE()
FROM tmp_kasutaja t
INNER JOIN DELETED d ON
d.id = t.id
END ELSE
BEGIN
UPDATE t
SET lisajaid=@tootajaid, lisatudkp=GETDATE()
FROM tmp_kasutaja t
INNER JOIN INSERTED i ON
i.id = t.id
END
END

 

PostgreSQL kontrollige alati public rolli õigusi

märts 7, 2019

Nooremprogrammeerijatele ei tohi kunagi anda admin õigusi, selle tõestuseks oli üks firma, kus avastasin, et GRANT ALL oli publicule antud. Siis kui küsisid, et miks te nii tegite, aga Googles oli mingi rida selline. Peale seda kahjuks pidin 10 minutit pead vastu lauda taguma ja mõtlema, mida koolides õpetatakse. Normaalne õiguste haldus käib nii, et tehakse Group role’d ja õigusi juhitakse läbi selle rolli.

Esmalt tehke enda baasis päring, vaadake üle, mis publicul lubatud

SELECT grantee, privilege_type ,table_name
FROM information_schema.role_table_grants
WHERE grantee = ‘PUBLIC’ and table_name NOT LIKE ‘pg_%’

Ja sequence õigused saate järgneva päringuga:

SELECT cl.oid, relname, pg_get_userbyid(relowner) AS seqowner, relacl, description,
(SELECT array_agg(label) FROM pg_seclabels sl1 WHERE sl1.objoid=cl.oid) AS labels,
(SELECT array_agg(provider) FROM pg_seclabels sl2 WHERE sl2.objoid=cl.oid) AS providers
FROM pg_class cl
LEFT OUTER JOIN pg_description des ON (des.objoid=cl.oid AND des.classoid=’pg_class’::regclass)
WHERE relkind = ‘S’
ORDER BY relname

Mina antud juhul eemaldasin publicult õigusi ükshaaval, et saaks vaadata kas mõni noorem programmeerijate süsteem kukub kokku või mitte:

REVOKE TRUNCATE ON ALL TABLES IN SCHEMA public FROM public;
REVOKE DELETE ON ALL TABLES IN SCHEMA public FROM public;
REVOKE UPDATE ON ALL TABLES IN SCHEMA public FROM public;
REVOKE INSERT ON ALL TABLES IN SCHEMA public FROM public;
REVOKE REFERENCES ON ALL TABLES IN SCHEMA public FROM public;
REVOKE TRIGGER ON ALL TABLES IN SCHEMA public FROM public;
REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM public;

Normaalses maailma tehakse nö Group role töötajatele

CREATE ROLE tootajate_roll NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

https://www.postgresql.org/docs/9.1/sql-grant.html

Aga siin peate ise otsustama, mis tegevusi töötaja roll tegelikkuses tohiks teha ja võimalik,
osade tabelite õigusi pärast eraldi muuta rollis. See lihtsalt näide

GRANT INSERT,SELECT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO tootajate_roll;

Raspberry mikroarvuti ja külmataluvus…

november 30, 2018

Järjest enam tellitakse minult erinevaid automaatikalahendusi Raspberry peale ja loomulikult on ka suure ringi küsimus, kuidas Raspberry õues käitub. Võin teile rahulikult kinnitada, et -21 kraadi pole ka probleeme.

Aga peate täitma eeldused, Raspberry kindlasti panna suuremasse veekindlasse karpi ja soovitan panna ülemisse ossa. Juhul kui mingit moodi ongi kondens sisse saanud, siis see vedelik vajub alla. Samuti suurem kinnine karp aitab ja soojusel siiski hajuda.Kõik karbi kaablisisendid silikoonige ära.

Kuna mälukaardid võivad siiski hakata väga suurte miinuskraadidega tõrkuma, siis kindlasti panna Industrial SD Memory Cards tüüpi kaart.

MSSQL and ramdrive (ImDisk ), bad idea…

juuli 26, 2018

I woke up in the morning and tried to optimize my MSSQL server. Simple optimization; since tempdb has quite a lot of traffic, I decided to move it to ramdrive.

USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = ‘Z:\SQLData\tempdb.mdf’);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = ‘Z:\SQLLog\templog.ldf’);
GO

AND this was a major failure…SQL server won’t start.

“An unexpected error occurred while checking the sector size for the file ‘Z:\tempdb\tempdb.mdf’. Move the file to a local NTFS volume, where the sector size can be retrieved. Check the SQL Server error log for more information.”

To start SQL server and restore previous tempdb location. Step one: unmount ramdrive disk (Z:). Step two: mount USB stick with letter Z:. Then restart SQL server and restore tempdb paths.

Taasavastasin enda jaoks Opera veebisirvija (no – ads rokib)

oktoober 26, 2016

operabenchmarkKuna reklaame topitakse tänapäeval arutult sisse, siis veebilehtede laadimine võtab isegikiire ühendusega juba aega ning arvuti CPU saab kõvasti vatti.

Opera download link

Nüüd ka AdBlock ja teised läinud marketingi teed, kus osad firmad saavad …läbida sealt ostes endale nö turvalise reklaami teenuse sealt. Ehk need reklaamiblokeerijad pole enam usaldusväärsed.

Kõige rohkem meeldiski Opera native adblock (ehk sirvijas saab kohe reklaame peita), lahe ka ta kuvab statistika, kaua läheb lehe laadimine koos reklaamidega ja ilma…

Self made tuulegeneka staatori ja rootori “upgrade”

juuli 25, 2016

Seekord pikka teksti ei kirjuta, varasem kirjutis on siin http://www.stiigo.com/ideed/generaator/generaator_osa1.htm

Vahel ikka hea igapäevase programmeerimise kõrvalt midagi muud teha, sest siis saab aju ka 99% tööle panna 😛

Rootoris: N52 klassiga magnetid, üldiselt tehke mida tahate, aga ärge neid magneteid omavahel kokku laske, sest siis võivad peened killud näkku lennata. Staatoris 1.6mm mähisetraat ja EPOt kasutatud. Rootoris kasutatud polüestervaiku, millesse lisatud talki, et tugevust juurde anda, samuti et kuivamisel ei kuumeneks üle. Talgiga see asi, et selle võiks enne atsetoonis ära lahustada.

IMG_0031

IMG_0033

IMG_0034

IMG_0039

IMG_0040

IMG_0042

IMG_0045

IMG_0081

IMG_0082

IMG_0084

MSSQL: aeglaste päringute tuvastamine

juuni 8, 2016

Vahel on palju tööd, et leida päringud, mis SQL serverit mõttetult koormavad, SQL trace pole ka alati parim abivahend.
Antud päring aitab aeglaselt jooksvad päringud tuvastada.

SELECT TOP 50
[Average CPU used] = total_worker_time / qs.execution_count,
[Total CPU used] = total_worker_time,
[Execution count] = qs.execution_count,
[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset END –
qs.statement_start_offset)/2)
,[Parent Query] = qt.text
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Average CPU used] DESC;

Win 10 + Ubuntu = Winux

märts 31, 2016

Huvitav kas varsti saab Ubuntule mõeldud custom binareid jooksutada Windowsi peal (Winuxi peal) 🙂

http://fossbytes.com/ubuntu-linux-on-windows-10-here-are-pictures-screenshots/

Heh… MS SQL server töötab nüüd ka Linuxil

märts 8, 2016

Announcing SQL Server on Linux

https://blogs.microsoft.com/blog/2016/03/07/announcing-sql-server-on-linux/

Postimehe kommentaariumis IP jälle “avalikult” nähtav

veebruar 25, 2016

Kaotati ära anonüümsed kommentaarid, okei…enamasti minu “tarbimisharjumus” oli neid lugeda, mitte isegi niipalju artikleid ja neid sõimu kommentaare lihtsalt ei märganud või nende reiting muudeti nii madalaks, et need kadusid ära. Julgen arvata, et selline sõnavabaduse piiramine mõjub ka otseselt reklaamikäibele.

Mõneti naljakas, et käib selline sõnavabaduse piiramine, eriti kus Euroopa Liidu kohtu pretsedent olemas, et portaal / leht ei vastuta sealsete kommentaaride avalikustamise eest.

News sites not liable for ’insulting and rude’ reader comments, says ECHR

Aastaid tarkvaraarenduses olles on tekkinud rumal komme numbrites näha mingeid andmeid või seost: sisetunne ütles, et vaata korra Firefoxis (Firebugi -> Net) tabis selle Postimehe kommentaariumi JSON vastust …parrot.php väljundit.

Saaks aru, et ma pole sellest rääkinud: 2012 juba teavitasin neid, see viga parandati, nüüd jälle täpselt sama asi tehtud.

https://tingmarprog.wordpress.com/2012/06/05/postimehe-uus-kommentaarium-voimalik-saada-katte-kommenteerija-ip/

Kui IP’d jsonis hoiate, tehke vähemalt mingi hash sellest, aga mitte nii, et seda saavad kõik lugeda. Muutun kurjaks, kui näen sama vea kordamist.

Võtke kommentaaride json lahti, huvi pakub meile tag “tsa” ning sealne nimistu ja sellest esimene numbriline osa (int), teine osa vist mingi md5 räsi.

…”tsa\”:{\”1384334536_ea9e51b8f445250e4c373631cf3953f7

Kirjutame ühe imelise rea käsureale:

tracert 1384334536

ja saame kenasti nimelahenduse, kindlasti põnev näha, mis firmadest kommenteeritakse 😉

Vähendame Windows 10 … “nuhkimisvajadust”

veebruar 10, 2016

Vaatasin, et GitHubis tekkinud projekt, mis võimaldab läbi GUI keelata ära Windowsi featureid, mis tihti on kaheldava väärtusega.

https://github.com/10se1ucgo/DisableWinTracking

AdBlock pole enam usaldusväärne…

oktoober 4, 2015

AdBlock Extension has been Sold to an ‘Unknown Buyer’
http://thehackernews.com/2015/10/adblock-extension.html

Windows 10 Raspberry Pi 2 jaoks …

august 12, 2015

..paistab, et peab hakkama katsetama 😉

http://ms-iot.github.io/content/en-US/Downloads.htm

MSSQL: no-break space ja trim funktsioon

mai 31, 2015

Nii üle pika astusin ämbisse, eeldasin et MS SQL LTRIM / RTRIM suudab ka “no break space” tüüpi tühikud eemaldada (koodiga U+00A0). Tõde see, et ei eemalda…

DECLARE @p NVARCHAR(255)
SET @p = REPLICATE(CHAR(160),16) + 'Tekst' + REPLICATE(CHAR(160),16)
SET @p = RTRIM(LTRIM(@p))
SELECT @p

Antud juhul aitab vaid replace :)

SELECT REPLACE(@p,CHAR(160),'')