Работа с популярната OS 3
- Никога не е била POSIX съвместима по рождение и без допълнителни библиотеки
- Никога не е идвала с някакъв вид shell или нормален език за скриптово програмиране
- Потрбителските и системните файлове живеят на разни подобни странни места:
C:\PROGRA~1\INTERN~1\ C:\DOCUME~1\Administrator\MYDOCU~1\
- Във файловата система никога не е имало поддръжка за hard или soft links
- Изпълнимите файлове се заключват, когато има работещ процес
- Две програми не могат да пишат в един и същи файл
- Процесите нямат нормален stderr
- Стандартен набор от команди за вършене на каквато и да било работа липсва
- Нормален терминал няма и никога няма да има
- Линкера си търси библиотеките на най-невероятни места и по никакъв повод не се оправя с различни версии
- Всеки софтуер си ходи със собствени “динамични” библиотеки, които са хаотично разхвърляни по цялата файлова система.
Често пъти потребителите на популярната операционна система минават курс по “компютърна неграмотност”, където биват обучавани как да преудоляват особеностите на системата (изброените и един куп други). Там се обяснява и защо никога, ама никога да не “пипат” файлове, като:
naked_pics.zip .exe
Естествено първата част от името на файла прави по-голямо впечатление на компютърно неграмотните хора от втората (която често не се вижда). По тази причина гледането на “голи снимки” има дълготрайни ефекти върху функционалността на популярната операционна система.
И така, в тези условия трябваше да се инсталира моя софтуер, по възможност без да получа трайни психически увреждания. Ситуацията беше отчайваща и изискваше мощни средства. Тогава, за пореден път, на помощ дойде NSIS. Както пише най-отгоре в документацията му – “NSIS е свободен, скриптов win32 инсталатор, който не мирише и не е огромен”. Идеята на инсталаторите за популярната операционна система е много стара, почти колкото самата система. Поради ограничени ресурси, незнание, неможене и неразбиране, преди много години някой се е сетил следното нещо. Може, използвайки някакъв прост компилатор и скриптов език, да произведе PE изпълним файл, в който да се съдържат всички файлове за инсталиране. По този начин, директно се използват разни странни API интерфейси на системата и се обикалят по-горе изброените особености. Естествено този метод за инсталиране на софтуер е безумие от гледна точка на сигурността, но това не му пречи да се ползва до ден днешен. Първата част от задачата реших лесно. Правил съм го и преди, а NSIS има много готини примерни скриптове за инсталатор, които показват на потребителя това, което той е свикнал да вижда. След няколко абсолютно безмислени натискания на бутона “Next” или “Напред” инсталатора си копира файловете някъде в C:\PROGRA~1\XXX, дори показва абсолютно излишен “термометър” за да се радва потребителя, докато чака. До тук добре, обаче трябваше да сглобя конфигурационен файл от два реда, който да запиша в директорията с програмата:[Paths] Prefix = C:/Program Files/XXXТова се налага, защото поради глупостта на линкера на системата, моят софтуер си ходи със собствен, който трябва да знае от къде да си изчете библиотеките. Той си има особености, понеже текстов файл с backslashes вътре се чете трудно, хората които са го писали са решили да сложат slashes. Всъщност всички нормални хора, във всички по-малко популярни операционни системи използват backslash само и единствено за escape на низове. Най-просто ми се стори да запиша файла с backslashes и после да направя find/replace със slashes. Подобни прости операции в популярната операционна система изискват нечовешки усилия. За щастие NSIS се справи чудесно със следните няколко функции, които намерих на сайта им:
Function WriteToFile
Exch $0 ;file to write to
Exch
Exch $1 ;text to write
FileOpen $0 $0 a #open file
FileSeek $0 0 END #go to end
FileWrite $0 $1 #write to file
FileClose $0
Pop $1
Pop $0
FunctionEnd
; StrReplace
; Replaces all ocurrences of a given needle within a haystack with another string
; Written by dandaman32
Var STR_REPLACE_VAR_0
Var STR_REPLACE_VAR_1
Var STR_REPLACE_VAR_2
Var STR_REPLACE_VAR_3
Var STR_REPLACE_VAR_4
Var STR_REPLACE_VAR_5
Var STR_REPLACE_VAR_6
Var STR_REPLACE_VAR_7
Var STR_REPLACE_VAR_8
Function StrReplace
Exch $STR_REPLACE_VAR_2
Exch 1
Exch $STR_REPLACE_VAR_1
Exch 2
Exch $STR_REPLACE_VAR_0
StrCpy $STR_REPLACE_VAR_3 -1
StrLen $STR_REPLACE_VAR_4 $STR_REPLACE_VAR_1
StrLen $STR_REPLACE_VAR_6 $STR_REPLACE_VAR_0
loop:
IntOp $STR_REPLACE_VAR_3 $STR_REPLACE_VAR_3 + 1
StrCpy $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_4 $STR_REPLACE_VAR_3
StrCmp $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_1 found
StrCmp $STR_REPLACE_VAR_3 $STR_REPLACE_VAR_6 done
Goto loop
found:
StrCpy $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_3
IntOp $STR_REPLACE_VAR_8 $STR_REPLACE_VAR_3 + $STR_REPLACE_VAR_4
StrCpy $STR_REPLACE_VAR_7 $STR_REPLACE_VAR_0 "" $STR_REPLACE_VAR_8
StrCpy $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_5$STR_REPLACE_VAR_2$STR_REPLACE_VAR_7
StrLen $STR_REPLACE_VAR_6 $STR_REPLACE_VAR_0
Goto loop
done:
Pop $STR_REPLACE_VAR_1 ; Prevent "invalid opcode" errors and keep the
Pop $STR_REPLACE_VAR_1 ; stack as it was before the function was called
Exch $STR_REPLACE_VAR_0
FunctionEnd
Function RIF
ClearErrors ; want to be a newborn
Exch $0 ; REPLACEMENT
Exch
Exch $1 ; SEARCH_TEXT
Exch 2
Exch $2 ; SOURCE_FILE
Push $R0 ; SOURCE_FILE file handle
Push $R1 ; temporary file handle
Push $R2 ; unique temporary file name
Push $R3 ; a line to sar/save
Push $R4 ; shift puffer
IfFileExists $2 +1 RIF_error ; knock-knock
FileOpen $R0 $2 "r" ; open the door
GetTempFileName $R2 ; who's new?
FileOpen $R1 $R2 "w" ; the escape, please!
RIF_loop: ; round'n'round we go
FileRead $R0 $R3 ; read one line
IfErrors RIF_leaveloop ; enough is enough
RIF_sar: ; sar - search and replace
Push "$R3" ; (hair)stack
Push "$1" ; needle
Push "$0" ; blood
Call StrReplace ; do the bartwalk
StrCpy $R4 "$R3" ; remember previous state
Pop $R3 ; gimme s.th. back in return!
StrCmp "$R3" "$R4" +1 RIF_sar ; loop, might change again!
FileWrite $R1 "$R3" ; save the newbie
Goto RIF_loop ; gimme more
RIF_leaveloop: ; over'n'out, Sir!
FileClose $R1 ; S'rry, Ma'am - clos'n now
FileClose $R0 ; me 2
Delete "$2.old" ; go away, Sire
Rename "$2" "$2.old" ; step aside, Ma'am
Rename "$R2" "$2" ; hi, baby!
ClearErrors ; now i AM a newborn
Goto RIF_out ; out'n'away
RIF_error: ; ups - s.th. went wrong...
SetErrors ; ...so cry, boy!
RIF_out: ; your wardrobe?
Pop $R4
Pop $R3
Pop $R2
Pop $R1
Pop $R0
Pop $2
Pop $0
Pop $1
FunctionEndThose who do not understand UNIX are condemned to reinvent it – badly
—Henry Spencer
Trackbacks
Use the following link to trackback from your own site:
http://blog.kirov.be/trackbacks?article_id=147

Нито съм привърженик на популярната ОС, нито твърдя че съм голям специалист с нея, но все пак държа на обективност доколкото е възможно.
Докато една част от твърденията ти имат може би някакъв шанс за правдоподобност, друга са доста неясни и според мен необосновани.
“Никога не е идвала с някакъв вид shell или нормален език за скриптово програмиране”
Какво значи това? Shell-a в популярната ОС е Windows Explorer, а ако говориш за команден интерпретор в текстов режим, cmd.exe търпи промени във възможностите си със всяка следваща версия на Windows, която излиза като се започне от първите NT-та. Предполагам че имаш малко идея какви чудеса от храброст могат да се правят.
Второ, основния скриптов език, изключая .cmd/.bat-ch файловете, е Windows Scripting Host (пише се на vbscript ili jscript) и той позволява автоматизиране и работа в доста случаи в много по-голяма степен от който и да е от “стандартните” UNIX shell-ове.
Няма да споменавам в детайли и свободните продукти, като AutoIT script (www.autoitscript.com), които по свой начин имплементират подобна и подобрена функционалност, по още по прост начин от Windows Scripting Host.
Знам че в следващата версия на Windows, т.е. Windows 7, ще е инсталиран по подразбиране така наречениа Powershell, който и в момента е достъпен като add-on.
“Потрбителските и системните файлове живеят на разни подобни странни места:
C:\PROGRA1\INTERN1\ C:\DOCUME1\Administrator\MYDOCU1\”
Относно тази функционалност на всички е ясно, че е напрвена за обратна съвместимост с програми от времето, когато Windows (1,2,3,9х) беше надстройка на ДОС и там имаше такова ограничение. В последствие след 2000 и смесването на NT и 9x клоновете тази съвместимост трябваше да се запази.
“Във файловата система никога не е имало поддръжка за hard или soft links”
Поддръжка за hard links има, намери на сайта на популярната ОС подробности. Shortcut-ите пък са някаква орязана версия на soft links, естествено несравнима директно, но съществува.
“Изпълнимите файлове се заключват, когато има работещ процес”
Това твърдение за мен е спорно, мисля че е според зависи :-)
“Процесите нямат нормален stderr”
Какво е “нормален” пак е неясно?
“Стандартен набор от команди за вършене на каквато и да било работа липсва”
И това не е ясно….
“Нормален терминал няма и никога няма да има”
А тук за какво точно става въпрос?
Относно последните две твърдения, програмирането не ми е част от текущата професионална практика, но..
” Линкера си търси библиотеките на най-невероятни места и по никакъв повод не се оправя с различни версии “
За кой линкер става въпрос и кои са тези най-невероятни места?
” Всеки софтуер си ходи със собствени “динамични” библиотеки, които са хаотично разхвърляни по цялата файлова система. “
Това не е задължително проблем, и е отговорност за този който предоставя софтуера.
Нищо против тебе, като човек Любо, но говориш пълни глупости. Защо не ти е отговорил собственика на на дневника, вече 5-ти ден, не знам. Може би не му се влиза в безсмислени спорове, но аз държа да не остане сянка от съмнение М$ Вкиста ОС ли е изобщо.
Отначало започни с това, което е написал последно. Прочети го, осмисли го защото, го правиш. За помощник в осмислянето си вземи първите няколко страници от учебник по основи на Юникс. Виж файловата организация, принципите, които следва, връзките с езика Ц и защо са такива.
А аз започвам междувременно да те ям.
Експлодера бил шел. Друг път. Нещо не такова, само защото М$ са го кръстили така. Те и ядрото са кръстили „микроядро“, но е такова само по тяхната номенклатура, в реалния свят не е. В четенето прибави и следващата страница, що е команден интерпретатор и за що служи. Cmd.exe е само един емулатор, при това лош. Досбокс е по-добър даже. Киров се оплаква, точно, защото му се налагат „чудеса от храброст“.
Може да си пропуснал тази информация, но WSH е официално погребан от М$ и няма да се подържа вече, отдавна не се подържа по-точно. Нещо повече, той никога не е бил развиван и налаган. Възможността да пишеш на бъзик- моля те, Киров имаше предвид да пишеш на езици за програмиране, а не на измишльотина, която и за обучение не става.
AutoIT е единственото що-годе свястно средство за програмиране на малки проекти под боза. Но не виждам причина да се учи при наличие на Питон и Руби, не по-малко лесни езици, за сметка на това много по- мощни. Едничкото изключение, не прави картинката с „програмирането“ под „ОС“ по-розово.
В Powershell, няма нищо „пауър“. Той и сега си присъства в „сърварната“ версия редом с ИЕ. Това е набор от команди, които ги има в Юникс от 40 години, при това изпълнени лошо. Тъй като „дос“ никога не е било команден интерпретатор, то с новия „пауър“ пак не могат да се правят нещата, които са нормални за shell програмиране. Могат да се наподобят отчасти, но това е просто едно мъчение, а не истинско комбиниране, свързване, подаване на вход-изход и т.н. от нормалните командни интерпретатори.
Начина на изписване на местоположенията е най-малкия проблем на автора. ДОС стила дори може донякъде да се преглътне и заобиколи. Проблема са самите безумни местоположения. Помниш, че трябва да четеш и за организация на файлови системи нали?
О да има твърди връзки. Но за създаването им се ползва сложно и трудно API, което просто не си заслужава труда, за минималното, което осигурява. А да се сравнява „къс път“ с еластичните връзки е просто безумие- сравняваш круши и ябълки, напълно различни неща.
„Нормален stderr” ще разбереш какво е, когато прочетеш за него. Едва после почни да се съмняваш. Същото се отнася за „стандартен набор от команди“. Малко по-горе показа, че не знаеш що е shell, следователно за пореден път те подканям да научиш, а не да ползваш готовите фрази на М$, че заприличваш на Цветелин Павлов ( http://cpavlov.spaces.live.com/ ). Толкова смешно звучат тезите ти.
„За кой линкер става въпрос и кои са тези най-невероятни места?“ също изисква научаване, що е това „линкер“, за какво служи и как се ползва. Но след като не си програмист или дори админ, нищо няма да загубиш, ако не знаеш, поне в този случай.
За динамичните библиотеки. Ами точно това е проблема. Няма стандартно място в ФС, където да се търсят, както и да се следят версиите им. Този факт ги прави на практика, точно обратното на споделени библиотеки. Те не ползват нищо от преимуществата на технологията. А това, че не са статично свързани в самия изпълним файл, по нищо не ги отделя от статичните библиотеки на ДОС. Сиреч бозата е назад в развитието си с 50 години.
Отговорността за всичко това е само на една компания- М$, тя доставя „софтуера“, ама май не можа да се сетиш сам. Всички останали са като Киров- поставени пред свършен факт, да си бият главата, как да им тръгнат приложенията.
Хайде със здраве през новата година и не се мешай във въпроси над твоята компетенция и знание.
Добре бее, мене защо ме забърка сега… :@ Ша са мачкаме, така ли? И как въобще попаднах на това тъмно място, където се говорят тъмни неистини! :)
Язък за хубавата статията, щото тоя последния коментар я оака…
Готови ми били фразите, ха!?
Както не веднъж съм казвал, според мен всяка операционна система трябва да съществува и да се ползва от хората, на които им харесва. Останалото е равносилно на комунизъм. В тоя ред на мисли, go_fire, ти си тоя дето говориш пълни глупости. Доказва го… доказва го най-очеизвадноито възможно нещо – коя е най-популярната система? Коя се полва на всякъде? Това не става, щото е дърво, а защото създателите и са постъпили с подход към пазара, нещо което линуксите никога няма да направят кадърно! И факта си е факт…
ЕКСПЛОРЕРА Е ШЕЛ! Това че ти си свикнал под шел да разбираш “нещо на което пиша със зелени букви” не значи че не съществува друга форма на шел, която очевидно скованото ти от конзолата съзнание не може да проумее…!
WSH е погребан, защото PowerShell го наследи…
Това, че езика не изобилства от криви скоби, безмислени редове с по един диез на тях не значи, че не е мощно средство… Мисля, че това може да го каже само човек, който не е работил с VS на VB…
PowerShell-а няма нищо общо с DOS, готин.. Освен може би известна прилика във външния вид, която няма как да я няма! За командите не знам, може и да си прав, но не ме интересува, това което ме интересува е да е достатъчно мощен, за да ми помогне да си свърша работата и достатъчно разширяем, за да мога да си я автоматизирам…
Не разбрах за какъв чеп ти е организацията на фаловите системи?
От NTFS насам има твъри и меки връзки, това че не ти се побира впредставите не е проблем, който ще накара мултинационален гигант да го промени… А и за какво са ти върху “популярната система” – и без това за всичко се ползват шорткъти… Единствения път, когато съм чувствал необходимост от някакви връзки върху джамец е когато исках да ипляскам нещо в web root-а на апача, нещо за което апача е виновен, не джамеца (на IIS такава необходимост няма, тъй като сървръа осигурява необходимата функционалност).. Така или иначе – съществуващата имплементация на връзките ми помогна да си свърша работата…
Популярната операционна система е потребтелска операционна система. Тя с няма линкер! За кой линкер говорите, наистина? За Visual C? Или нещо друго…
Точно щото е дадена свобода на девелопърите, точно затова джаамеца е на върха… Какво става при вас, когато една дистрибуция просто реши нещо различно за тези толкова хубави точно определени директории… Това със статичното свързване беше смешно, признавам… :)
На края – go_fire, не се сещам кой си и как съм ти направил впечатление, ама ми звучиш като тийнейджърче, което иска да е cool… Ако искаш да си cool, опознай противника си, разбери приемуществата довели тази популярна операционна система до върха, разбери защо вашият линукс не ще и не ще да се котира и когато осъзнаеш и собствените си недостатъци, влез в спор със солидни и професионално обосновани аргументи… В противен случай – ти обиждаш, аз обиждам и никой не е cool….
Отново повтарям – всяка ОС има място на света, всяка има преимущества и недостатъци. Ние винаги можем да изберем системата, която отговаря на нашите нужди и ни помага да си свършим работата най-добре… След като вие сте намерили, това което търсите в *никс света, ок, никой няма да ви дърпа да правите нещата както ви е неудобно. Това на което аз (и очевидно и Любо) държим е да запазим мненията обетквини и да признаем предимставата и недостатъците и на двата свята.
А и операционната система е продукт, не религия, фанатик такъв! :)
Към автора: това с имената може да ти се случи, само ако работиш неправилно… Твърд път, особено в инсталатор не бива да ти се налага да зададеш… Ти си знаеш де…. Работил съм веднъж с NSIS, намирам скриптовете за отвратително усложнени и утежнени, но това си е моето мнение и ако на теб са ти помогнали е хубаво… С “популярният” инсталатор е много по-леко да се работи и инсталатора става буквално за минутки, за секунди, ако е част от цялостен проект… Поздравления за изказа – хареса ми! :)