Paprastumas ir logika
Deja, bet tai kraupi šių dienų tiesa…
.
Deja, bet tai kraupi šių dienų tiesa…
.
Taigi, mano MS Visual Studio naujausias Heading’as “Get ready for C# 4.0″. Tai aš ir atsidarau. O atsidaręs matau…
… matau, kad C# dar improvement’us, kuris Php turi seniausias.
Taigi didžioji C# naujiena ‘dynamic‘ keyword’as, kurio paskirtis nusakyta šia eilute:
“Now you can create dynamic objects and let their types be determined at run time.”
T.y., kad nebereikės aprašinėt kintamųjų tipo, o jų tipas bus nustatytas kompilavimo metu.
Pavyzdys kodo(C#):
dynamic info = new ExpandoObject();
info.a = "Noriu";
info.b = 10;
info.c = 'k';
info.d = 'a';
info.e = 'i';
info.viskaMoku = true;
Pavyzdys kodo Php:
<?php
$a = "Noriu";
$b = 10;
$c = 'k';
$d = 'a';
$e = 'i';
$viska_moku = true;
?>
————-
Antrasis dalykas, apie kurį aš svajojau 100 metų nors vienoje kitoje kalboje. Ir ‘at last’, MS atėjo į protą – tai galimybė deklaruoti default parametrų reikšmes, t.y. tai ką Php turi jau aibę metų:
Kodo pavyzdys(C#):
public static void masina(int ratuSkaicius = 4, bool galiVaziuoti=true) { }Kvietimai:
autoparkas.masina();
autoparkas.masina(3);
static function masina($ratu_skaicius = 4, $gali_vaziuoti=true) { }
$autoparkas::masina();
$autoparkas::masina(3);—————–
4.Php funkcijų – print_r(), var_dump().
Assembler – mov hujAX,dafigznaetkudaQX;
Pascal - is it (NOT)(STILL)(COULD BE) a programming language???
Java – Am I dead? Oh… it’s just a lagggggggg.
C# – my intention is to be a php.
Php – why the hell I’m so perfect and everybody rips me?
Python – “Get set! Ready! Fire in the hole!”
Logo – Left, Left, Right, Right, Right, Towards, Bump! Ouch! :D
—-
Got it?
Šitas dalykas daug nervų sugadino, kol susigaudžiau kame replės.
O esmė ta, kad priskiri delegatą eventui, ir kai delegatas executina funkciją, kuri nuskaito duomenis iš user RTFBox input’o įrašydamas į List variable’ą per Add(), o Windows forma buvo sukurtas turinti ‘DataGridView’ objektą, kurios konstruktoriuje yra aiškiai nurodyta:
public StackForm(ref Stack refToStack)
{
<...>
this.stackDataGridView.DataSource = refToStack.stackData;
<...>
}
Padarius bet kokį Add’ą, Remove’ą, Forma elgdavosi labai keistai – tai sureguodamo, tai nesureguodamo, tai rodydavo kad pridėtų elementų nėra, arba rodydavo nebeegzistuojančius elementus, o ant jų paspaudus execeptionus pradėdavo mėtyti.
Taigi teko susirasti WorkAround’ą
, ir šitas bajeris labai efektyviai veikia, tiesiog po bet kokių pokyčiu List variable’a(aka kolekcijoje), formos data bind’o update’ą forsuojame iškviesdami funkciją:
public void updateStackData()
{
// Force a refresh of the DataGridView
((CurrencyManager)stackDataGridView.BindingContext[this.stack.stackData]).Refresh();
}
Tikiuosi kam nors padės
.
Intel AVX, IA-128(Intel Iatanium), Intel x32-64 developer manuals, bei C#, C#, C# … Tūkstančiai eilučių C# kodo(tiksliau – jau turbūt ir dešimtimis tūkstančių eilučių galima būtų skaičiuot
).
v0.99 pre alpha versiją jau turim
:
1. v 0.99 pre-alpha versijos galimybės:
Tvarkingai veikia neveikia nei vienas režimas
.
+/- daugmaž veikia IA-32ee, bei IA-32e režimai, ‘legacy mode’ bloke.
8 lygių puslapiavimo lentelėje(PML8…PML4, PDPT, PDT, PT) 80 proc. atveju adresai nepasiklysta
aprašyta ~600 cpu komandų ir jų variantų, iš jų +/- ~30 tvarkingai realizuotos (570 left
)
Galutinėje versijoje turėtų būti realizuota ~200 komandų ir jų variantų, beta versijai pilnai turėtų pakakti ir ~50 veikiančių komandų
.
Kalbų palaikymas – angliška versija dar labai smarkiai buksuoja, tad kol kas tik mono-language support (sorry, englishman
).
————
Final release date ????-??-?? ;D. O šiaip tai – Summer, 2010
. (I guess???
).
int nibbleRequired = (int)Math.Truncate((double)updateBit / 4);
int reversedChangingHexNibble = oldRegValue.Length - nibbleRequired - 1;
char[] hexBitChar = {'0'};
hexBitChar[0] = oldRegValue[reversedChangingHexNibble];
uint hexBitValue = Convert.ToUInt32(System.Text.Encoding.ASCII.GetString(Encoding.ASCII. GetBytes(hexBitChar)));
Ypač paskutinė eilutė man patinka. Aišku galima SHIFTinti << ir >>, bet toje interpretacijos tas dalykas netinka. ![]()
Su php užtektų 1 eilutės, pvz. išsitraukti pirmus 3 bitus:
printf(“[%2.3s]\n”, decbin(hexdec(“0EFFA”)));
Gana keistų minčių teko pasiskaityti iš C# vieno iš kūrėjų, bei dabartinio ’.NET product unit manager’. Kas keisčiausia, kad jis visas -.NET kalbas (VB, C#, F#, IronPython, IronRuby) vertina lygiavertiškai, ir planuoja, nepaisant to ar C# VS VB bus 50:50 ar 70:30 santykiu, visas naujas funkcijas, kaip supratau, nori kurti lygiagrečiai VB.
Aš asmeniškai apskritai nesuprantu, kokia reali prasmė tobulinti Visual Basic’ą, kuris kaip pamenu, dar 2002 pačio microsoft buvo paskelbta kaip ‘retiring‘ ir apskritai, kodėl nauji žmonės išvis turėtų domėtis Visual Basic’u. Asmeniškai neketinu parašyti nė eilutes Visual Basic’u(kurio aišku ir nemoku, ir mokytis neketinu). Sakyčiau greičiausiai čia būtų tu 30-50 metų JAV programerių, kurių JAV firmose yra begalės, ir kurie visiškai nepripažysta ‘outdated’ dalykų.
Beje, girdėjote apie Php hip-hop? Ne, tai nieko bendro su muzika neturi, na bet tiek kurie yra labai labai labai advanced programeriai php srityje, supranta apie ką aš
. Remiantis hip-hop’u, visas C# ir Python lieka toli gale
)). Panašu kad iš Php ir Zend pusės dar yra stiprių galimybių pasistūmėti į prieki.
Dar vienas dalykas – ar jau bandėt opera 10.51. Asmenškai esu apakęs – taip greit vykdomo JS kodo neteiko matyti. Mano 400-800 eilučių DHMTL parserius, ir objektų perkūrimais(new(), remove() [hate of IE6,7] kupino JS kodo vykdymas stulbinantis – IE ir Firefox lieka smarkiai gale. Opera NETIK kad VISIŠKAI neapkrauna CPU su parseriu, bet vykdo tarsi tai būtų ‘native application’, t.y. zero-load time’as
… Didelis pliusas ir pagarba už tai, į operos pusę… Ir ahh, CSS 3.0 ir opera 10.5 tiesiog idealiai dera kartu… Na bet viską css 3.0 serijoje į vietą turėtų pastatyti IE9, kurio pasirodymas jau visai ne už kalnų(ar jau turite developers IE9 versiją – nelaimei, tik W6/W7, apie W5 MS nuomonė jau seniai aiški(nelaimei, ji nesutampa su mano nuomone apie W5) – kiek žinau sheduled ie realease yra 2011 Q1. Tik neaišku final, official ar pre-release.
'dabar skaičiuosime tikrąjį id' AS comment_1
Bet, tų Zend projektų yra ne visi, ypač tie, kuriems turiu daryti Maintenance’ą, kurie buvo buildinti 5-6yrs ago.

100 eilučių MySQL užklausa
Taigi, Php 5.3.0 įtraukė GOTO, kaip JUMP label’į.
Gal ir nebūčiau rašęs šio įrašo, bet pačiam prisireikė labai keisto dalyko – perkelti kinamąjį į ankstesnį kodo tašką:
if(isset($var)) { $best_product_to_print = $var; <.. PRINT IT ..> }
$var = best_price_of_inserted(insert_lots_of_products($query_arr)));
Nelaimei su $output = ob_get_contents(); Php leidžia tik override’inti pvz. <title></title> tagu’s, bet ne užsettinti kintamuosius. Tad čia add_to_header(); function nepanaudosi.
PS. Jeigu kam nors kyla klausimas – kada to reikia, tai atsakau: jeigu įmonė pasirašo softą, ir jį pardavinėja krūvai įmonių. Po to kažkuriai vienai prisireikia pakeisti algoritmą kažkokiai vienai tos sistemos funkcijai. Kadangi niekas neduoda kišti nagų prie branduolio kodo, yra galimybė jį overridinti iš MODULIŲ kodo. Problema ta, kad iki šiol to pakako tik ob_get_content(); pagalba, replace’inant HTML turinį. ŠIUO ATVEJU irgi PAKAKTŲ perrašyti HTMLą. problema yra ta, kad failų ten yra šimtai, o perrašomų html kodo eilučių būtų tūkstančiai, kadangi priklausomai nuo parametrų algoritmui, skirtingas turinys yra generuojamas. Todėl logiškiausias dalykas būtų funkcija: submit_to_code_index(‘variable_name’,'variable_value’); Kadangi failai tarpusavyje bendrauja parametrų pagalba, reiktų periimti kodo valdymą, bei pateikti naujas parametro reikšmes.
Todėl pasiskaičiau keletą įdomesnių temų stackoverflow’e apie GOTO in Php.
http://stackoverflow.com/questions/723324/php-and-the-goto-statement-to-be-added-in-php-5-3
http://stackoverflow.com/questions/1900017/is-goto-in-php-evil
Ir kaip supratau, vienintelis siūlymas naudoti GOTO yra tik debug tikslais(net patys php dev’ą tą rašė). Kitaip tariant teisingiausiai GOTO apibūdino šis komentaras:
Unless you are programming in assembler, GOTO should always be treated the same way as the life vest of the airplanes: it is good to have them available, but if you need to use them it means that you are in big trouble.
Tas pats ir pluginų rašymas atgyvenusioms sistemoms – jeigu tau nurodo – nesvarbu kaip, privalai rasti sprendimą su tuo ką turi(šiuo atžvilgiu negali keisti branduolio kodo), tokiu atveju matyt galima būtų naudoti goto, arba kažkokiu kitu būdu perimti srautą( stackoverflowe iškėliau tokį klausimą).
Beje net patys Php dev’ai savo manual’e apie GOTO( /control-structures.goto.php ) yra įdėję:

Why not goto
Dar vienas komentaras iš StackOverFlow’o labai į temą:
in college i always used to use goto statements when i wanted to piss off my professors, muahahaha….the programs would of course still work perfectly but i could always see their eyes twitching when they’d come across those little statements – espais
Kitaip tariant, nėra pateisinamos priežasties naudoti goto, bet kartais nėra kitos išeities, jeigu nenori būtu ‘tuoju, kuris perkurs neteisingai veikiančią sistemą iš pagrindų‘. Tegu tai daro kiti
.
[PAPILDYTAS - 2009.12.11]
Atsakom į esminį klausimą:
“Why Mysql is hundred and one time better than IBM DB2″.
MySQL’eriai rašo: LIMIT 12;
IBM DB2’seriai rašo: FETCH FIRST 12 ROWS ONLY;
MySQL’eriai rašo: LIMIT 67,12
IBM DB2’seriai: nervinasi ir rašo lioliasdešimt eilučių užklausą
MySQL’eriai rašo:
(SELECT a FROM b WHERE c LIMIT 67,12)
UNION (SELECT a FROM b WHERE c LIMIT 111,2) ORDER BY a LIMIT 16,21
IBM DB2’seriai:
priversti pasiduoti, nes jų galvoje užklausos kodo
kiekis įgavo atžymą brain_overflow=1.
Mysql’eriai rašo:
auto_increment
IBM DB2’seriai rašo:
GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
Mysql’eriai rašo:
$man_ne_zhopa = mysql_insert_id();
IBM DB2’seriai rašo:
$i_luv_word_identity = IDENTITY_VAL_LOCAL();
Čia iš esmė tas pats, tik kad Mysql’as panaudojo savo brand’ing funkcijos pavadinimui.
Mysql’eriai rašo:
CREATE TABLE IF NOT EXIST agurkai
IBM DB2’seriai rašo:
Begin atomic if( exists(SELECT 1 FROM syscat.tables WHERE tabschema = 'MYSCHEMA' AND tabname = 'agurkai') ) then DROP TABLE MYSCHEMA.agurkai else CREATE TABLE MYSCHEMA.agurkai; end if; End
Mysql’eriai rašo:
DROP TABLE IF EXIST agurkai
IBM DB2’seriai rašo:
Begin atomic if( exists(SELECT 1 FROM syscat.tables WHERE tabschema='MYSCHEMA' AND tabname='agurkai') ) then DROP TABLE MYSCHEMA.agurkai; end if; End
Mysql’eriai rūpinasi resursų taupymu(field2 išnaudojam int(11), su 4******…..) :
CREATE TABLE a(
field1 bigint(11) unsigned NOT NULL,
filed2 int(11) unsigned NOT NULL
))
IBM DB2’seriams vietos taupymas visiškai vienodai(aukštesnę užklausą db2 parašyti gausis tik taip):
CREATE TABLE a(
field1 bigint NOT NULL,
filed2 bigint NOT NULL
))
Kad netaupo vietos DB2’seriai, jau pastebėjom. Bet kad jie apskritai įgnoruoja ‘taupius’ laukelių tipus, t.y. tinyint’ą tai dar ‘protingiau’…
Ignoruoja ir plačius laukelius jie, t.y. 65535′iolio TEXT’ą, bei ilgesnįjį jo brolį LONG TEXT’ą . Vietoj jų tik CLOB’ą gali pasiūlyti.
MySQL šitas dalykas veiks:
FOREIGN KEY organizer_validation(identity_code)
O štai DB2 jau spjaudysis errorais – neva DB2 nesupranta ilgesnių nei 18 simbolių.
Mysql’e veiks ir šitas dalykas:
field3 varchar(255)
O štai DB2 šis limitas nestandartinis – ir maksimalus kuris veiks:
field3 varchar(254)
Turint omenyje kad PC viskas dvejetainiame/šešioliktainiame variante, tai MySQL’o [0-255] rodos į temą, o štai DB2 matyt kažkur kitur
…
O čia dar vienas bajeris, privertęs mane nusijuokti iš DB2 ‘developerio’ atsakymo.
Man įdomu ką IBM DB2’seriai atsakytų į klausimą – aš noriu nustatyti naują auto_incement reikšmę(tarkim prirašiau šlamšto, ir dabar vėl noriu kad skaičiuotų nuo 97). Mysql’eris parašys:
ALTER TABLE `table name` AUTO_INCREMENT=new_value;
DB2′erio pirmoji mintis:
aaaaaaaaa…………oooooooooooo……. hmmmmmmmm……????…. Nobody use that.
Ir tada duos ‘klasišką patarimą‘(paimta tiesiai iš IBM DB2 vieno iš support saitų):
What the heck are you doing that you need to do such a thing. Either make you ID so big you'll never have to worry about it BIGINT or DEC(31,0) if you are afraid of liability of your descendantsOr don't use identity to begin with and use a natural key. Cheers, Serge
--
Serge Rielau
DB2 Solutions Development
IBM Toronto Lab
Jo, ilgam prajuokino. Na visad galima spręsti problemą įvairiai. Tarkim aš nežinau kokio dydžio bus duomenų masyvas mano programoje – tai velniop tuos pointerius ir ‘dynamic lists’ – susikuriame kvadratilijonį kvadratilijonuoju masyvą, išskirdami 100GB vietos harde ir galvos neskaudės. Sakyčiau būtų tikrai TOK(tobulai optimalus kodas).
:D:D
Ale linksmi žmonės dirba IBM. Vietoje pripažinimo kad FAIL tas jų DB2, pasakys ‘nafig tau to reikia‘
.
————
Na bet galiausiai atsirado dar didesnis proto šviesuolis, kuris pasiūlė sukurti trigerį kuris executinis RESTART funkciją kas kuris laikas. Savo nuomonę apie trigerius(kuri yra vieša paslapis), aš išsakysiu įrašo pabaigoje.
Kitas pasiūlė nudropinti visą lentelę ir iš naujo perkurti
.
——————-
………. Ir taip toliau
Tikiuosi visiems aišku “Why IBM DB2 sucks very much”.
Ir kaip pasaulyje dar gali būti žmonių kurie reikalauja programuoti šita kledaro lygio kalba.
Čia buvo retorinis pamąstymas.
—————
Pabaigai: Mano asmeninė nuomonė apie trigerius:
sux sux sux sux sux sux sux sux sux sux sux sux sux sux sux fuck sux
sux sux sux sux sux fuck sux sux sux sux sux sux sux sux sux sux sux
sux sux sux sux sux sux sux sux sux sux sux sux sux sux sux fuck sux
sux sux sux sux sux sux fuck sux sux sux sux sux sux sux sux sux sux
sux sux sux sux sux sux sux sux sux sux sux sux sux sux sux
Beje, ar tai tik sutapimas – bet trigerį pirmą kartą ‘life ever‘ panaudojau tik universitete, kai dėl jo privalomo naudojimo tiesiog ‘užlipo’. Vienintelis atvejis kada trigeris gali būti naudojamas, tai tik tuomet kai kartu neprogramuojama pati programa – čia praktiškai trigeris leidžia interpretuoti programos kodą. Ir realybėje(teorija – gražu, realybė – kai būna iš tiesų), bet kuriam ‘newly hired software engineer’ yra daug papraščiau CTRL+F pagalba(net ir find in files atveju), išsiaiškinti ką kode reiškia dalis:
UPDATE ".DB_CLIENT."
SET client_new_orientation='".$core->validate_orientation($client['ornt'])."'
WHERE client_id=1
Nei sėdėti 2 valandas ir nesuprasti kodėl gaunami SQL_STATE errorai atlikus trivialią užklausą:
UPDATE clients SET savings_after_robery=10000.49 WHERE client_id=1
Dar mane kamuoja kažkokia mistiška nuojauta, kad per artimiausius n-metų aš jo daugiau galiu ir nebepanaudoti.
PS. Dar aš kartais ignoruoju ‘read more’ dalį. Todėl visą blogo įrašą šį kartą atpyliau į “excerpt’ą”.
Prieš kelis mėnesius maniau kad apie XML’ą žinau didžiąją dalį ir ten nieko naujo būti negali. xml.gz kūrimus/eksportavimus/nuskaitymus laikiau sudėtingesne užduotimi.
Tačiau, kaip sakome, technologijos ir reikalavimai vietoje nestovi.
Todėl visai nenustebau gavęs requirement listą su reikalavimais:
* Tiems, kas nežino:
PNR - Passenger Name Record
CRS – Computer reservations system
GDS – Global Distribution Systems
Dar vienas dalykas kuris mane kiek nudžiugino yra tai, kad vis dėl to iš universiteto naudos kažkiek yra. Iki universiteto UML diagramų paišyti ir jų skaityti tikrai papildomų pastangų mokytis nedariau. Turėjau galima sakyti tik pačius pagrindus, būtinus suprasti reikalavimus.
O štai dabar jau turbūt gerą pusmetį pastebiu kad visi projektai kuriuos kuruoju/programuoju ar dalyvauju realizuojant/programuojant eina su milžiniškomis *.pdf dokomentacijomis:
Na ir čia jau turbūt nenuostabu, kad visi tie ‘docummentation’ai kupini sekų, būsenų, ER, klasių(class), veiklos(activity), objektų(objects) ir netgi diegimo(deployment) diagramų.
Todėl dabar jau turbūt užtikrintai galiu sakyti, neįsisavinus UML’o praktiškai nieko stambesnio nesuprogramuosi, nes requirementus ir realizaciją aprašo matomai specialūs UML ‘profai’, kurių atrodo kiekvienoje stambesnėje įmonėje yra net po keletą.
Na o iš viso to seka, kad funkcinis programavimas tampa praktiškai neįmanomas norint teisingai realizuoti reikalavimus. Viskas praktiškai seka tik per objektus.
———-
Vis dažniau pastaraisiais mėnesiais į mano valgiaraštį patenka prieskonis ‘Python’. Todėl visai nenustembu kad Gūglas gražina 28 milijonus rezultatų su fraze ‘Python VS Php’.
Vienas žmogelis kaip argumetą ‘why the php is the greatest programming language in the world’, pateikia šias eilutes:
$a = 'var'; $b = 'iable';
$variable = 'var';
echo ${$a.$b};
$filter = array("name", "email");
foreach($filter as $v) $$v = $_POST[$v];
Šaunu, ar ne?
Nedaugelis programavimo kalbų gali pasigirti tokia realizacija
Pitonu paskutinės dvi eilutės būtų realizuojamos taip:
post = {'name': 'ijoshua', 'email': 'spam@example.com', 'extra': 'data'} filter = ['name', 'email'] for k in filter: locals()[k] = post[k] print name, email
Kuri programavimo kalba yra geresnė, atsakymai ir ginčai turbūt būtų beprasmiai, tačiau bendrai ką pastebėjau, tai, jeigu žmogus programuoja Php, jis yra linkęs po kiek metų išmokti ir Python(o jeigu tiksliau, tai Ruby on Rails programavimą, na bet Python turbūt būtų geriausias jų atstovas). Ir būna nemažai atveju netgi taip, kad tas programuotojas pereina nuo Php į Python.
Tačiau visi Python’instai kažkodėl labai dažnai pasisako prieš Php, ir nė nebando pažinti šios programavimo kalbos subtilybių.
Python(ir viso ruby on rails) privalumas yra tas, kas jis pasižymi geresniu skaitomumu nei Php. Ten nebėra kabučių print’e, kabliataškių eilutės pabaigoje, nebeliko ir laužtinių skliaustų {}. Praktiškai kodas turėtų išties gebėti būti rašomas ir skaitomas greičiau. Bet ne visada praktika atitinka tikrovę.
Tačiau,
Na bet tai kol kas tik teoriją. Phyton teks išmokti iki kitos vasaros, lygiai taip pat kaip teko mokytis C# praėjusį šių metų pavasarį. Kaip sakoma nuo reikalavimų nepabėgsi – jeigu jau kartą teko rašyti WWW tinklapį C#(.NET)’u ir tą padaryti pavyko sakyčiau, kaip pirmą kartą dirbus konkrečiai su C# (.NET), tai matyt turėtų pavykti ir Phyton’u.
Na, nors projekto su Python’u end-line’as dar už bene pusmečio, tačiau jau šiandien parašiau pirmąsias 70 eilučių Python kodu. Liko dar 9930. Aišku antrąjį skaičių primečiau kreivai iš akies, bet +-~ kažkas tokio
.
Tad skirtumas tarp studentų besimokančių Python’ą universitete ir darbe matyt tiktais vienas – čia tau dar ir sumoka už tai kad tai išmoktum :).
Apie universitetines elgetos dydžio stipendijas nekalbu. Nors, tiesa sakant, turbūt per gerai pasakiau – tiksliau būtų ‘Prienų bobutės pensijos dalis išskaičiavus pragyvenimo išlaidas’. Taip, galbūt ir atsiras smerkiančiųjų, tačiau manau 95 proc. studentų pasirinktų ‘darbas+studijos(5-8 pažym.)’, vietoje ‘tik studijos 9-10 balų pažymais+stipendija’… Svarbiausiai, kad pirmajam atvejui nereiktų pridėti prie sąrašo “-X dalykų kartojimas”
. Nes tada jau kuo toliau tuo labiau gaunasi ‘tas ant to’.