Alvila mājaslapa RELOADED
SeparatorSākumsSeparatorProjektiSeparatorProgrammasSeparatorRakstu darbiSeparator


Magazīnatmiņa
15.06.2006

Vakarnakt atkal nosapņoju kārtējo murgaino programmēšanas sapni :)

Šoreiz iedomāsimies situāciju: mūsu rīcībā ir procesors ar divām magazīnas (steka) tipa atmiņām, kurš prot izpildīt šādas darbības:

  • PUSH - ievieto skaitli magazīnā
  • DUP - "izņem" skaitli no magazīnas un tajā ievieto divas skaitļa kopijas
  • SWAP - "izņem" divus skaitļus no magazīnas un ievieto tos atpakaļ apgrieztā secībā.
  • + - "izņem" divus skaitļus no magazīnas "augšdaļas", saskaita tos un rezultātu ievieto magazīnas augšdaļā
  • > - "izņem" divus skaitļus no magazīnas "augšdaļas" un salīdzina tos. Ja pirmais no tiem ir lielāks par otro, ievieto magazīnā skaitli 1; pretējā gadījumā ievieto magazīnā 0.
  • AND - "izņem" divus skaitļus no magazīnas "augšdaļas" un veic to salīdzināšanu pa bitiem pēc loģiskā UN principa. Rezultātu ievieto magazīnā.
  • OR - līdzīgi, kā AND, tikai salīdzināšanu veic pēc loģiskā VAI principa.
  • NOT - "izņem" skaitli no magazīnas un tajā ievieto rezultātu pēc šī skaitļa apstrādes pēc loģiskā NE principa (invertē to).
  • SAVE - "izņem" skaitli no magazīnas un saglabā to "otrajā" magazīnā.
  • RESTORE - "izņem" skaitli no "otrās" magazīnas un ievieto to galvenajā.

Visi skaitļi ir 8 bitu veseli skaitļi.

Interesanti, vai ar šīm darbībām ir iespējams realizēt šeit aprakstītās darbības?

Mēģināsim.

Atņemšana "-"

Bez komentāriem. Ļoti vienkārši, IMHO.

NOT
+
PUSH 1
+

Salīdzināšana "<"

Riebīgākā daļa ir ņemt vērā, ka var gadīties situācijas, kurās pirmais skaitlis ir 255. Tās arī ir jāapstrādā.

DUP
SAVE
PUSH 254
RESTORE
>
SAVE
PUSH 1
+
>
NOT
RESTORE
OR

Salīdzināšana "<>"

Tāds savdabīgs Hanojas torņu uzdevums. Ja magazīnā ir AB, tad jāiegūst ABAB, jo jāveic divas salīdzināšanas.

SAVE
DUP
RESTORE
DUP
SAVE
SWAP
RESTORE
>
SAVE
<
RESTORE
AND

Salīdzināšana "="

Šī jau ir pavisam vienkārša :)

<>
NOT
PUSH 1
AND

Izrādās, šo darbību realizācija bez reģistriem it nemaz nav sarežģīta. Ja kādam ir interese, varu uzdot uzdevumu - kā to visu realizēt bez palīgmagazīnas? Iespējams, jāpievieno kādu papildus darbību, bet kādu? Nekādi nevaru izdomāt...


Komentāri (2)

Homeopātija
14.06.2006

Priecājieties jel - panaceja ir dzimusi! Kādā lieliskā, zinātniskiem pierādījumiem pārsātinātā Latvijas Interneta resursā Jūs atradīsit neapgāžamus pierādījumus tam, ka ķīmiskās zāles nevienam nav vajadzīgas!

Izrādās, visas cilvēces veselības problēmas rodas tāpēc, ka notiek masveidīga apārstēšanās, kā rezultātā notiek organisma imunitātes krišanās. Imunitātes krišanos novērst Jums palīdzēs ārstēšanās ar tīru ūdeni! Kā rakstīts Vikipēdijā, homeopātija balstās uz zāļu aktīvās vielas atšķaidīšanu līdz pat 1060 reizēm. Ņemot vērā Avogadro skaitli - 6,02 x 1023 g/mol, kļūst skaidrs, ka, iegūstot galarezultātā iegūtā šķīduma trauciņu, ir visnotaļ maza iespēja, ka tajā atradīsit kaut vienu aktīvās vielas molekulu. Domājāt, ar to esam pierādījuši, ka homeopātijas patiesais nosaukums ir šarlatānisms Q.E.D.? Nekā nebija!

Citāts iz minētā zinātniskā resursa:

Saprotams, ka tādi šķīdumi nevar izraisīt alerģiskas reakcijas vai kādas kaitīgas blakusiedarbības, bet vai tie var ārstēt? Jā, var gan.
Cilvēka organismā visas izmaiņas un regulācija notiek ar bioloģiski aktīvu vielu palīdzību. Šie bioloģiskie signāli ir ļoti niecīgi, proti, vielu daudzumi ir šausmīgi mazi un tomēr organisms tos jūt, uztver un pieskaņo savas darbības konkrētajiem apstākļiem. Homeopātiskie preparāti ir šķietami niecīgos daudzumos, bet tieši tādi daudzumi ir piemēroti cilvēka organismam. Pirmais un galvenais rādītājs ir pieredze - homeopātija ārstē gan hroniskas, gan akūtas slimības. Labi panākumi gūti epilepsijas, nakts enurēzes, hronisku ādas slimību, alerģiju, multiplās sklerozes, locītavu u. c. slimību ārstēšanā.
Ja kāds domā, ka homeopātiskie preparāti palīdz tikai tiem kuri tai tic, tad jāsaka, ka homeopātija labi palīdz arī dzīvniekiem.
Tūkstoškārtīgā atšķaidījumā aktīvā viela nav konstatējama pat ar modernām metodēm. Kas tad tur ir tas ārstējošais? Jau mūsu dienās ir noskaidrots homeopātisko atšķaidījumu iedarbības mehānisms. Noslēpums slēpjas šķīdumu kratīšanā, kad ārstnieciskās vielas un šķīdinātāja molekulas sitas viena pret otru kā pasažieri pilnā trolejbusā. Rezultātā šķīdinātāja molekulās paliek aktīvās vielas nospiedumi jeb šķīdinātājs iegūst aktīvās vielas ārstnieciskās īpašības, bet atbrīvojas no nevēlamām blakus parādībām.

Redziet, redziet? Viss šīs panacejas noslēpums ir kratīšana! Kratīšana jau izsenis ir zinātniski pamatota - to paveica jau 15.gadsimta alķīmiķi, mēģinot no smiltīm iegūt zeltu.

Bet nu nopietni - sarakstot murgainu tekstu, minot tajā visdažādākos zinātniskos terminus jeb vienkāršāk - reti dzirdētus svešvārdus, jaucot ķīmiju, fiziku un alķīmiju, kā arī nepamatotus apgalvojumus, varam panākt vēlamo efektu - mietpilsoņi tam notic. Tāda jau ir pasaules patiesība - ja cilvēks neko no lasītā nesaprot, tad bieži vien tam tāpat notic. Vēl viens, pavisam īss citāts no mūsu ūberhomeopātu resursa: Varbūt jūs šai parādībai atradīsiet citu iemeslu, bet zinātnieki domā, ka[...]. Teikšu īsi - parādiet man tos zinātniekus...


Komentāri (10)

Loose Change 2nd Edition
12.06.2006

Vienkārši interesanti par 2001.gada 11.septembri.

Skatāmies šeit.


Komentāri (6)

vi rulez
12.06.2006

Šiten te pavisam nejauši uzgāju interesantu padomu vi izmantošanā:

Dear Adelie,
I have a list of records in the format "lastname, firstname initial." I need to turn them into "firstname initial lastname." Any advice?
-- Marketing Drone

While I normally don't believe in helping anyone with "marketing" in their title, my heart is touched that you've come to me. Try this command in Vim:

:%s/\([^,]*\), \(.*\)/\2 \1/

Kurš vēl apgalvos, ka vi nav lietotājam draudzīgs? :)


Komentāri (4)

Lielais brālis Bils tevi vēro
08.06.2006

Izrādās, sīkmīkstā uzņēmuma programmiņa Windows Genuine Advantage regulāri (reizi dienā, cik noprotu), sazinās ar Lielo brāli Bilu, lai noskaidrotu, vai jūsu datorā ir licencēta Windows kopija.

Diez, ko vēl šis rīks dara? Varbūt klusītēm pārsūta Lielajam brālim Bilam jūsu dokumentus, e-pastus un internetbankas paroles (ja esat tik dumjš un glabājat tās datorā vai darbam ar tām izmantojat ēzelīti)?


Komentāri (1)

Ādolfs dzied
08.06.2006

Ui, ku labs :)

Skatāmies šeit.


Komentāri (1)

Laikam jau jūdzos...
08.06.2006

Vakar sapnī (laikam jau jāsaka - murgā) redzēju šādas lietas...

Iedomāsimies, ka eksistē kāds iedomāts skaitļotājs (procesors, whatever) ar šādām īpašībām:

  • pieejami divi 8 bitu reģistri - A un B
  • pieejams rezultāta reģistrs R
  • iespējams veikt šādas darbības:
    • A OR B -> R - loģiskais VAI
    • A AND B -> R - loģiskais UN
    • NOT A -> R - loģiskais NE ar reģistru A
    • NOT B -> R - loģiskais NE ar reģistru B
    • A > B -> R - salīdzinām A un B. Atkarībā no rezultāta (A>B vai arī nav), reģistrā R tiek ievadīts 0 vai 1
    • LOAD A, n - reģistrā A ielādē skaitli n
    • LOAD B, n - reģistrā B ielādē skaitli n
    • LOAD A, R - reģistrā A ielādē R saturu
    • LOAD B, R - reģistrā B ielādē R saturu
    • A + B -> R - saskaita A un B un reģistrs tiek saglabāts R.
    • PUSH - reģistra R saturs tiek saglabāts magazīnas tipa atmiņā (LIFO jeb stekā)
    • POP - reģistrā R saturs tiek ielādēts no magazīnas tipa atmiņas (ja tā ir tukša, saņemam "0")
    • SAVE - tiek saglabāti reģistri A un B
    • RESTORE - tiek atjaunoti reģistri A un B
  • visas Būla loģikas darbības tiek veiktas "pa bitam"
  • ja summa pārsniedz 255 (R taču arī ir 8 bitu reģistrs, tad notiek "liekā" bita "nomešana"

Tagad iedomāsimies, ka vēlamies realizēt šādas darbības (nosauksim tās par makrokomandām):

  • A - B -> R - no A atņem B un rezultātu ieraksta R
  • A = B -> R - ja A=B, tad R ieraksta 1; pretējā gadījumā ieraksta 0
  • A < B -> R - ja AA <> B -> R - ja A<>B, tad R ieraksta 1; pretējā gadījumā ieraksta 0

Interesantākais ir tas, ka katru no šīm darbībām mēs varam realizēt!

Sāksim, tātad:

A - B -> R

Iedomāsimies, ka reģistrā A ir 5 un B - 3. Rezultātā iekš R būtu jābūt 2. Kā mēs to varam iegūt? Vispirms iedomāsimies, kā varam atņemt tieši 1.

A + 254 -> A - 1

Kāpēc tā? Vienkārši:

A = 5
5 + 254 = 259

Tā kā notiek "liekā" bita nomešana, iegūstam 4.

Ja pieskaitīsim 253, iegūsim 3, t.i., būtībā A - 2.

Tas nozīmē, ka mazinātāju B mums ir jāizsaka kā

255 - B

To varam izdarīt pavisam vienkārši - veicot darbības

NOT B -> R
LOAD B, R

Kopumā atņemšanas makrokomanda izskatās šādi:

NOT B -> R
LOAD B, R
A + B -> R

Pārbaudīsim. Kā jau vienojāmies, reģistrā A ir 5 un reģistrā B - 3.

Pirmās komandas izpildes rezultāts būs (skaidrībai pierakstīsim arī binārajā sistēmā):

NOT 3 (%00000011) = 252 (%11111100)

Otrā komanda vienkārši reģistrā B ielādē iegūto rezultātu.

Trešās komandas izpildes rezultāts būs

5 + 252 = 257

Tā kā notiek "liekā" bita nomešana, reģistrā R būs... 2.

Q.E.D.

Pirms makrokomandas izsaukuma jāsaglabā reģistru A un B saturu, ko veic šim nolūkam ieviestā komanda SAVE. To jāveic, jo reģistra B saturs tiek "sabojāts". Pēc komandas izsaukuma reģistru saturu jāatjauno.

SAVE
NOT B -> R
LOAD B, R
A + B -> R
RESTORE

A = B -> R

Tagad mēs jau droši varam izmantot makrokomandu A - B -> R. Kā salīdzināt divus skaitļus? Patiesībā jau vienkārši:

1) Ja (A+1) > B izpildās un

2) (A-1) > B neizpildās, tad varam secināt, ka A = B.

Patiešām, salīdzināsim divus skaitļus - A=3 un B=3.

Redzam, ka (3+1) > 3 izpildās un (3-1) > 3 neizpildās

Kā to realizēt? Mēģināsim.

Vispirms realizēsim pirmo - saskaitīšanu un salīdzināšanu.

SAVE
LOAD B, 1
A + B -> R
RESTORE
SAVE
LOAD A, R
A > B -> R
RESTORE

Šajā brīdī reģistrs R satur 1, ja (A+1) > B. Saglabāsim šo vērtību.

PUSH

Realizēsim arī otro daļu.

SAVE
LOAD B, 254
A + B -> R
RESTORE
SAVE
LOAD A, R
A > B -> R
LOAD A, R
NOT A -> R
PUSH
RESTORE

Tagad magazīnas atmiņā ir ievietoti divi elementi, kuriem abiem jābūt 1. Veiksim pēdējo daļu:

SAVE
POP
LOAD A, R
POP
LOAD B, R
A AND B -> R
RESTORE

Patiesībā šī bloka "SAVE" un iepriekšējā bloka "RESTORE" varējām arī izlaist.

Kopā makrokomandas kods izskatās šādi:

SAVE
LOAD B, 1
A + B -> R
RESTORE
SAVE
LOAD A, R
A > B -> R
RESTORE
PUSH
SAVE
LOAD B, 254
A + B -> R
RESTORE
SAVE
LOAD A, R
A > B -> R
LOAD A, R
NOT A -> R
LOAD A, R
POP
LOAD B, R
A AND B -> R
RESTORE

Mēģināsim izsekot šī koda darbībai, salīdzinot skaitļus A=3 un B=3.

  1. Vispirms tiek saglabāti reģistri A un B. Tā kā tie tiek saglabāti ne-magazīnas atmiņā, tad jāuzmanās ar SAVE/RESTORE secību.
  2. Reģistrā B ielādējam 1 un pieskaitām to A saturam. Rezultātā reģistrā R ir 4.
  3. Atjaunojam A un B reģistrus un tūlīt tos atkal saglabājam.
  4. Reģistrā A ielādējam iegūto 4, un salīdzinām 4 ar 3. Reģistrā R ir 1.
  5. Atjaunojam reģistrus un saglabājam R magazīnas atmiņā.
  6. Saglabājam reģistrus un B ielādējam 254. Kā jau konstatējām, veidojot atņemšanas makrokomandu, pieskaitot 8 bitu skaitlim 254, iegūsim šī skaitļa vērtību n, tai atņemot 1 (t.i., n-1). Rezultātā reģistrā R ir 2.
  7. Atjaunojam un saglabājam reģistrus A un B.
  8. Reģistrā A ielādējam R saturu un salīdzinām - šoreiz, vai 2 > 3. Tā, protams, nav, un reģistrā R ir 0.
  9. Ielādējam reģistrā A šo nulli un veicam darbību NOT A. Rezultātā iekš R būs 255. "It kā" jau nav labi, bet vēlāk sapratīsit šo viltībiņu.
  10. Reģistrā A ielādējam R saturu un atjaunojam nākamo R vērtību no magazīnas (no pirmās salīdzināšanas).
  11. Reģistrā B ielādējam jauno B vērtību un veicam to abu salīdzināšanu pēc loģiskā UN principa. Rezultātā R būs vai nu 1, vai 0. Pēc tam atjaunojam reģistrus A un B.

Kur šeit bija viltība ar to, ka reģistrs R satur vai nu 0, vai 255?

Skatāmies:

a) pēc salīdzināšanas pirmā vērtība ir 0 un otrā 0. Pēc loģiskā UN sanāks, ka rezultāts ir 0. Ļoti labi.

b) Pirmā vērtība ir 1 un otrā 0. Rezultāts - 0. Arī labi.

c) Pirmā vērtība ir 0 un otrā 1. Rezultāts - 0.

d) Pirmā vērtība ir 1 un otrā - 255. Rezultāts būs 1. Kāpēc? Skatāmies:

00000001 AND 11111111 = 00000001. Jauki, ne? :)

Darbību A < B -> R un A <> B -> R izveidi atstāšu tiem, kam tas interesē. It kā jau nekas liels, bet kaut ko tādu redzēt sapņos - tas gan ir kaut kas...


Komentāri (7)

Popki
01.06.2006

Noskatāmies video. Kā jau savulaik teikts - Krieviju ar prātu nesaprast :)


Komentāri (0)

KDE gļuki ar Kat
01.06.2006

Jaunajās KDE versijās (kādās nu jaunajās patiesībā - cik zinu, sākot ar KDE 3.4) ir pieejama tāda jauka lietiņa, kā failu indeksēšanas serviss Kat Desktop Search Environment. Viss jau būtu ļoti jauki, un tomēr...

Kādai kastei ar Mandriva 2006 pēkšņi parādījās ļoti dīvaina uzvedība - iestartējot KDE, sāka crashot kded. Pie tam šī avarēšana izskatījās ļoti dīvaini - ik pa aptuveni 15 sekundēm tika iestartēts jauns kded, kurš, kā jau kārtīgam softam pieklājas, nekavējoties avarēja, vienlaikus izvadot crash dialoglogu.

Sākumā nolēmu izmantot metodi zvans "jautājums Gūglei". Neizdevās - forumos par šādu problēmu pārsvarā sastopami tikai problēmziņojumi bez atbildēm vai ar atbildēm iz sērijas "skaties kded sourci". Pieļauju, ka kritiskā gadījumā varētu arī mēģināt C++ kodā kaut ko labot (domāju, ka C++ pārzinu neslikti :), tomēr šī nebija tā reize, kad vēlētos to darīt - vēl jo vairāk tādēļ, ka problēma parādījās pēkšņi. Kā vienmēr, lietotājs nespēja atcerēties, kādas darbības veicis pirms problēmas parādīšanās. :)

Sāku analizēt situāciju. Failā .xsession-errors crasha brīdī bija atrodamas rindiņas (precīzi necitēšu), ka tiek veikta QSQLite3 objekta inicializācija, pēc kā kded avarē. Hmm, kura KDE komponente izmanto SQLite datu bāzi, pie tam, spriežot pēc regulārās avarēšanas, dara to regulāri? Pareizi, Kat. Tālāk atradu Kat datu bāzes failu - /home/user/.kde/share/apps/kat/db.kat. Tas bija izaudzis līdz kādiem 16 MiB. Failu gluži vienkārši izdzēsu. Un brīnums - pie nākamās Kat startēšanās (un Kat startēšanu veic kded, ja kas) tika izveidota jauna datu bāze un viss darbojās bez gļukiem. :)

Tātad, neliels rezumē - ja jūsu datorā parādās šādi pat KDE gļuki, vai nu atslēdziet Kat lietošanu, vai nu izveidojiet nelielu skriptiņu, kurš regulāri pārbauda minētā faila apjomu un vajadzības gadījumā to dzēš. Kaut kā tā. :)


Komentāri (4)

The Albino Code
29.05.2006

Uhcī, LOL :)

Domājāt, ka Da Vinci Code ir kaut kas lielisks? Neā. Skatāmies The Albino Code. :)


Komentāri (0)

Left

Lapas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Kopā ieraksti: 184

Right

Versija 1.0.4. © 1999-2010 Alvils Bērziņš. Visas šī darba tiesības aizsargātas. Lapa darbojas ar DEVLAT CMS.