Кът на програмиста...

За коментари и излияния от всякакъв род, число, спрежение и залог

Moderator: Moridin

User avatar
The Dragon
Elder God
Posts: 9062
Joined: Wed Jan 14, 2004 9:03 pm

Post by The Dragon » Tue Apr 22, 2008 1:24 pm

Трябва ми прост, елегантен и качествен механизъм за auto update на win32/mfc апликации.
The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.

User avatar
Roamer
Ascendent
Posts: 4895
Joined: Wed Jan 03, 2007 5:25 pm
Location: Hier ist hier und jetzt ist jetzt doch jetzt ist jetzt schon nicht mehr da...
Contact:

Post by Roamer » Tue Apr 22, 2008 3:43 pm

УууууууууууууууууууууууууууууЖАС!

Пиша си, значи, разни Perl-овски глупости, пиша си някакъв цикъл, слагам етикет пред него и в един момент се замислям дали трябва да фнимафам с името на този етикет - дали трябва да е уникално за функцията, за пакета, за модула, за файла или за Вселената като цяло. Почвам да чета докиментация, чета perlsyn, чета perldata, чета perldoc -f goto, perldoc -f next, perldoc -f last... и нийде нищо не пише за уникалност на етикети.

Ха сега де... тия наистина ли искат да ми кажат, че мога да имам етикети с едни и същи имена? Я да видим...
Spoiler: show

Code: Select all

#!/usr/bin/perl -wT

use strict;

print "First loop, first line:\n";
FOO:
while (<>) {
        if (/enough/) {
                print "Okay, leaving the first loop\n";
                last;
        } elsif (/furrfu/) {
                print "Furrfu\n";
                next FOO;
        }
        print "Foo!\n";
} continue {
        print "First loop, next line:\n";
}

print "Second loop, first line:\n";
FOO:
while (<>) {
        if (/enough/) {
                print "Okay, leaving the second loop\n";
                last;
        } elsif (/furrfu/) {
                print "BarFurrfu\n";
                next FOO;
        }
        print "Bar!\n";
} continue {
        print "Second loop, next line:\n";
}

print "Enough!\n";
Пускам го и... що да видя... да, наистина всеки next си next-ва неговия цикъл. Яяяяяя, прекрасно!

Коментар към колегите - "Мдам, то наистина няма смисъл да си пазиш глобална таблица за етикетите, достатъчно е да закачаш етикет за всеки блок и при next/last/whatever да вървиш навън по блоковете, докато намериш такъв с етикет. Хитро! Минават без глобална таблица за етикетите!"

...само че... я да видим... мдам, за next, last, continue и redo ще работи... само че има още една езикова конструкция, която ползва етикети... всъщност езиковата конструкция, заради която мноооого отдавна хората изобщо са *измислили* етикетите... езикова конструкция, която Perl също поддържа в някаква, макар и малко особена, форма... а за goto май ще трябва да има глобална таблица за етикетите... я да пробваме да заменим втория next с goto?
Spoiler: show

Code: Select all

#!/usr/bin/perl -wT

use strict;

print "First loop, first line:\n";
FOO:
while (<>) {
        if (/enough/) {
                print "Okay, leaving the first loop\n";
                last;
        } elsif (/furrfu/) {
                print "Furrfu\n";
                next FOO;
        }
        print "Foo!\n";
} continue {
        print "First loop, next line:\n";
}

print "Second loop, first line:\n";
FOO:
while (<>) {
        if (/enough/) {
                print "Okay, leaving the second loop\n";
                last;
        } elsif (/furrfu/) {
                print "BarFurrfu\n";
                print "(warning, moving on to the first loop, enter a line)\n";
                goto FOO;
        }
        print "Bar!\n";
} continue {
        print "Second loop, next line:\n";
}

print "Enough!\n";
И тук ни чака изненада :) Мдааа, както вероятно си личи от поясняващия коментар точно преди goto-то, това goto поглежда в глобалната таблица с етикети, вижда, че там е влязъл един етикет мнооого, много рано и... таковата... ми... скача към него!

Та... мдам... Perl поддържа повтаряне на имената на етикетите, ама next/last/continue/redo и goto ги разбират по два съвършено различни начина!

И с риск да се повторя...

УууууууууууууууууууууууууууууЖАС!
Eric: I use my sword to detect good on it.
Ed: It's not good, Eric. It's a gazebo.

User avatar
thunder
Forsaken
Posts: 3376
Joined: Wed Jan 21, 2004 2:18 pm
Location: София

Post by thunder » Tue Apr 22, 2008 3:49 pm

Да, ужасно е, т.е goto е ужасно :) не ползвай goto :lol:
Scalpel. Sponge. Magic Wand!

User avatar
Roamer
Ascendent
Posts: 4895
Joined: Wed Jan 03, 2007 5:25 pm
Location: Hier ist hier und jetzt ist jetzt doch jetzt ist jetzt schon nicht mehr da...
Contact:

Post by Roamer » Tue Apr 22, 2008 3:54 pm

Ммммм... щооооо? :) понякога - макар и много, *много* рядко - е полезно... а пък точно в Perl формата goto &sub е просто брилянтна в редките ситуации, в които можеш да се измъкнеш с нея :)
Eric: I use my sword to detect good on it.
Ed: It's not good, Eric. It's a gazebo.

User avatar
The Dragon
Elder God
Posts: 9062
Joined: Wed Jan 14, 2004 9:03 pm

Post by The Dragon » Wed Apr 23, 2008 8:48 pm

The Dark Side of C++ and Win API. Can be scary! Can be horrible!
The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.

User avatar
Marfa
Moderator
Posts: 11251
Joined: Sat Dec 20, 2003 10:12 pm
Contact:

Post by Marfa » Fri May 02, 2008 10:40 am

Странно нещо ми се случи... Не че е от програмистко естество, ма да си кажа. Тая сутрин клавиатурата ми беше настроена на Сръбска Кирилица!!!! :shock: :shock: :shock: А нормалната ми кирлица се беше трансформирала в БДС!!! Да не съм почнала да сомнамбуля по нощите, а?! :neutral:
This octopus! Let's give him boots, send him to North Korea!

Image<-Подробно описание на нещата, които ми образуват нерви :twisted:
Уук.

User avatar
Moridin
Global Moderator
Posts: 19290
Joined: Fri Dec 19, 2003 10:21 pm
Location: On the other side
Contact:

Post by Moridin » Fri May 02, 2008 10:42 am

Windows has that effect
This is it. Ground zero.

User avatar
Corwin
Archmage
Posts: 2002
Joined: Fri Mar 26, 2004 3:41 pm
Location: Land of Supidity

Post by Corwin » Fri May 02, 2008 11:00 am

Roamer wrote:УууууууууууууууууууууууууууууЖАС!

Пиша си, значи, разни Perl-овски глупости, пиша си някакъв цикъл, сл....
Абе има някаква логика. В крайна сметка прави това, което очакваш да прави.
Командите за цикъл гледат първият най-близък цикъл със същото име, предполат, че си имал предвид точно това и те запращат там.
Гоуту вече е друга бира - при него вече не е сигурно, че искаш най-близкия етикет и те препраща на първия намерен - най-вероятно е направено просто по различен начин търсенето на етикетите в двата случая.
Друг въпрос е, че на юз стрикт не гърми като копеле с грешка.
И разбира се, че са ебали мамата на консистентността в езика, за да се мъчат да ти четат мислите. Един подреден Си програмист би припаднал, ако го научи това...
I like rusty spoons....
I like to touch them...
It's almost orgasmic...

User avatar
dellusion
Warmage
Posts: 1248
Joined: Thu Dec 28, 2006 10:36 am
Location: София

Post by dellusion » Fri May 02, 2008 8:51 pm

Look at the darkness...
...around me.

User avatar
Roamer
Ascendent
Posts: 4895
Joined: Wed Jan 03, 2007 5:25 pm
Location: Hier ist hier und jetzt ist jetzt doch jetzt ist jetzt schon nicht mehr da...
Contact:

Post by Roamer » Fri May 02, 2008 10:32 pm

Мдааааа... друго си е човек да си подхване любимите религиозни войни :) Били те за модели компютри, модели операционни системи, дори модели редактори... :)

Corwin, мдам, то логика има - и за логиката и сам се сетих общо-взето - то това изобщо да пробвам с goto ми хрумна, след като разбрах колко леко и лесно са направили това със закачането на етикет към блок и търсенето на най-близкия по-външен блок с този етикет :) И, да, TIMTOWTDI[0] и DWIM[1] и друг път са водели до такива шашави особености на езиците, и не само в Perl :)

А ако това за подредения C програмист е било в някаква степен опит да си обясниш за себе си моето моментно ужасяване от ситуацията, мнье, ни съ мъчи :) Или поне не с този аргумент :) Виж, първият език, на който прописах (и то много по-успешно, отколкото сега ми се иска да е било, и с години), беше AppleSoft BASIC :)

[0] за тези, които още не са прегърнали религията на Perl - "There Is More Than One Way To Do It" - едно от основните мотота на езика

[1] за същите заблудени суеци, които още не са прегърнали религията на Perl - "Do What I Mean" - кратко название на куп особености в езика с общата идея, че синтактично леко неправилни и неясни конструкции правят понякога не твърде логични неща просто защото това е най-простият начин, по който човек би написал нещо, ако иска то да прави тези не твърде логични неща :)
Eric: I use my sword to detect good on it.
Ed: It's not good, Eric. It's a gazebo.

User avatar
Moridin
Global Moderator
Posts: 19290
Joined: Fri Dec 19, 2003 10:21 pm
Location: On the other side
Contact:

Post by Moridin » Fri May 02, 2008 11:30 pm

Roamer wrote: Виж, първият език, на който прописах (и то много по-успешно, отколкото сега ми се иска да е било, и с години), беше AppleSoft BASIC :)
А тъкмо когато си мислиш, че знаеш всичко за хората!!!
This is it. Ground zero.

User avatar
Moridin
Global Moderator
Posts: 19290
Joined: Fri Dec 19, 2003 10:21 pm
Location: On the other side
Contact:

Post by Moridin » Sat May 03, 2008 12:10 am

Покрай един от легендарните проблеми на този форум (е, легендарен е главно сред модераторите, но нз) се сблъсках с някаква непостижима идиотия на любимата на всинца ни базетка MySQL.

Когато използваш променлива от типа @a (user-defined variable) тя започва със стойност NULL, докато й зададеш някаква стойност, което става или със SET a = 5, или със a := 5. Принципно идеята на тия променливи е да ти предават някакво състояние между различните стейтмънти. На мен ми трябват за да си ъпдейтна няколко реда, придавайки нарастващи стойности на едното поле.

Е да, ама не. Следното нещо в phpMyAdmin и от php:

SET @a = 5;
SELECT @a as test;

дава резултат NULL

Седя аз и се пуля, но за всеки случай пробвам да ги събера на един ред и да ги пусна с една "заявка", доколкото това е праилният термин в случая. Бах мааму - работи??? (демек връща 5)
Ставам още по-удивен.
Опитвам се да приложа този полу-успех и в php, обаче дали от целия им mysqli или конкретно от ДБ класа, който трябва да ползвам, не ми дава да слагам повече от един стейтмънт в заявка. Значи не става.

Решавам да съм хитър и правя нещо от сорта на:

UPDATE tbl SET field = IFNULL(@a:=@a+1, @a:=5)

функцията се очаква да върне първия аргумент, ако той не е NULL, и втория, ако е.

Пак пишка - явно изразът се оценява само веднъж и никва инкрементация не става - всички са ми петички.

Решавам да се правя на още по-хитър и след известно количество нагласяванки успявам да бутна израза в WHERE клаузата, където БИ СЛЕДВАЛО да се оценява повече от веднъж (реално за всеки ред)

Е не и в MySQL!

Имам решение, което изобщо не използва user-defined variables, но то има известен дроубек и не ми се ще да прибягвам до него. Та някой да се е сблъсквал с нещо подобно? Идеи?

едит: Така де, поизнервих се и затова може би не става съвсем ясно - не казвам, че не е правилно решение да оценяват само веднъж и where клаузата по отношение на променливите. Вероятно иначе би било голям гърч. Но не ми се струва много коректно, а и остро ми вързва ръцете в този случай, след като по НЯКАКВА причина нормалният начин за работа с тия променливи (просто един предварителен SET) не работи.
This is it. Ground zero.

User avatar
The Dragon
Elder God
Posts: 9062
Joined: Wed Jan 14, 2004 9:03 pm

Post by The Dragon » Sat May 03, 2008 1:40 am

SET в MYSQL работи що годе правилно само в транзакции. Освен това работи само при една конеция - ако php поддържа някакъв пул или проство всеки път отваря конекция няма как да работят.

НИКОГА не слагай израз който изисква сложна евалюация в WHERE клауза - чупи се брутално индекса и не се ползва и имаш пълен table scan. И не го пише в документацията.

Неща от сотра на SELECT * FROM TBL where DATE<NOW() е лоша идея в MySQL :)
The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.

User avatar
Moridin
Global Moderator
Posts: 19290
Joined: Fri Dec 19, 2003 10:21 pm
Location: On the other side
Contact:

Post by Moridin » Sat May 03, 2008 7:16 pm

За първото изречение - да, ама при два последователни пхп стейтмънта в рамките на един скрипт??? Който е писал тоя ДБ клас, трябва да е абсолютен идиот за да отваря нова конекция за втория. По подразбиране конкецията се затваря на края на скрипта. Но по-тъжното е, че и в phpMyAdmin не работи, а ТАМ вече ако отварят нова конекция за всяка заявка, си е *** мамата от глупост.

За второто - ясно. То беше за пробата.
This is it. Ground zero.

User avatar
The Dragon
Elder God
Posts: 9062
Joined: Wed Jan 14, 2004 9:03 pm

Post by The Dragon » Sat May 03, 2008 8:09 pm

phpMyAdmin май отваряше. можеш да провериш като направиш temporary и след това пробваш да селектнеш от нея. Ако върне йебало си мамата - значи отваря.
The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.

Who is online

Users browsing this forum: No registered users and 4 guests