V Tiraně proběhl letošní Linux App Summit (LAS) (Mastodon). Zatím nesestříhané videozáznamy přednášek jsou k dispozici na YouTube.
Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
Berkeley Humanoid Lite (Onshape, GitHub) je open source humanoidní robot. V amerických cenách jej lze sestavit do 5000 dolarů.
Jakub Jelínek oznámil vydání verze 15.1 (15.1.0) kolekce kompilátorů pro různé programovací jazyky GCC (GNU Compiler Collection). Jedná se o první stabilní verzi řady 15. Přehled změn, nových vlastností a oprav a aktualizovaná dokumentace na stránkách projektu. Některé zdrojové kódy, které bylo možné přeložit s předchozími verzemi GCC, bude nutné upravit.
Byly vyhlášeny výsledky letošní volby vedoucího projektu Debian (DPL, Wikipedie). Staronovým vedoucím zůstává Andreas Tille.
Jason Citron končí jako CEO Discordu. Od pondělí 28. dubna nastupuje nový CEO Humam Sakhnini, bývalý CSO Activision Blizzard.
Článek na Libre Arts představuje baskytarový multiefekt Anagram od společnosti Darkglass Electronics. S Linuxem uvnitř (licence, GitHub).
Městský soud v Praze vyhlásil rozsudek, který vyhověl žalobě novináře Jana Cibulky, který s podporou spolku IuRe (Iuridicum Remedium) požadoval omluvu od státu za to, že česká legislativa nařizuje operátorům uchovávat metadata o elektronické komunikaci. To je přitom v rozporu s právem. Stát se musí novináři omluvit a zaplatit náklady řízení. Především je ale součástí přelomové rozhodnutí o nelegálnosti shromažďování dat a o
… více »Americké technologické firmy Apple a Meta Platforms porušily pravidla na ochranu unijního trhu, uvedla včera Evropská komise (EK). Firmám proto vyměřila pokutu – Applu 500 milionů eur (12,5 miliardy Kč) a Metě 200 milionů eur (pět miliard Kč). Komise to oznámila v tiskové zprávě. Jde o první pokuty, které souvisejí s unijním nařízením o digitálních trzích (DMA). „Evropská komise zjistila, že Apple porušil povinnost vyplývající z nařízení
… více »Americká společnost OpenAI, která stojí za chatovacím robotem ChatGPT, by měla zájem o webový prohlížeč Chrome, pokud by jeho současný majitel, společnost Google, byl donucen ho prodat. Při slyšení u antimonopolního soudu ve Washingtonu to řekl šéf produktové divize ChatGPT Nick Turley.
Je to stejná otázka jako např. proč používat balíčkovací systémy v linuxu. Při distribuci sw je třeba zajistit nemálo věcí :
Ve firmě se vývíjel a vyvíjí sw ve VisualFoxPro a pro komunikaci s db se využívá ODBC a Oracle Client. Problém byl, že při nástupu do práce nebyl k dispozici žádný instalátor, jen instalátor na VFP knihovny + se musely další knihovny k projektu kopírovat ručně, ručně registrovat atd.
Kromě problémů distribuce runtime s podpůrnými knihovnami pro IS byl problém s distribucí Oracle Clienta. Plná verze je šíleně veliká, má java instalátor, který sice podporuje "response file", což je jakýsi soubor pro silent instalaci, ale odinstalace klienta byl vždy problém stejně jako konfigurace ODBC driverů a další věci s tím spojené. Instant verze klienta pro změnu nemá instalátor žádný a neřeší spoustu dalších věcí. To byl i důvod vytvořit si vlastní instalátor pro distribuci Oracle Instant Clienta.
Postupně se začala potřeba instalátoru navyšovat. Bylo potřeba zajistit rychlou distribuci klíčů třetím stranám, bylo potřeba nějak rozumně šířit autokonfigurační skripty pro FF, bylo potřeba nějak zjednodušit konfiguraci IKEv2 ve Windows (hlavně eliminovat překliky / přešlapy v zadávání adres atd., udělat z toho jen spustit, next a ok).
Instalátorů existuje spoustu, ale Inno Setup je OSS, viz github, je stále vyvíjen, má dobrou dokumentaci, širokou komunitu, podporu skriptování a pro neprogramátora je maximálně triviální stejně jako celý proces vytváření instalátoru.
Ze stránek projektu si stáhneme innosetup-X.X.X.exe, což je jen jakýsi textový editor s pár fcemi na hlídání nějaké syntaxe a vytváření balíčku. Základem je tedy textový soubor pojmenovaný "*.iss", který otevřeme v tomto studiu, kde ho upravujeme a generujeme z něj balíčky. Instalátor funguje pod wine, takže jednoduché věci lze buildovat pod linuchem.
Takto vypadá můj první instalátor, který jsem udělal pro VFP a pár knihoven našeho IS. V ukázce je vidět následující :
;InnoSetupVersion=5.5.9 ;Documentation : ;http://www.jrsoftware.org/ishelp/index.php #define AppName "0- Company a.s. IS " #define AppShortName "IS" #define AppPublisher "Company a.s." #define AppVersion "4.0.1" #define DefaultDirName "C:\company_is" [Setup] AppName={#AppName} AppVersion={#AppVersion} AppID={#AppName} VersionInfoDescription=IS Setup VersionInfoProductName=0- Company IS -0 ;CreateAppDir=false DefaultDirName={#DefaultDirName} ;DefaultDirName={pf}\My Program ; to stejne jako : "C:\Program Files\My Program" DefaultGroupName={#AppPublisher} OutputBaseFilename=Company-IS-{#AppVersion} Compression=lzma2 SolidCompression=yes ;PrivilegesRequired=none PrivilegesRequired=admin ;LicenseFile={#file AddBackslash(SourcePath) + "ISPPExample1License.txt"} ;UninstallDisplayIcon={app}\MyProg.exe WizardImageFile=IS_Library-logo2.bmp SetupIconFile=icons\install.ico UninstallIconFile=icons\uninstall.ico UninstallDisplayIcon={app}\icons\uninstall.ico ;DisableReadyMemo=yes ;DisableReadyPage=yes ;DisableWelcomePage=yes DisableDirPage=yes DisableProgramGroupPage=yes ;DisableFinishedPage=yes ;DisableStartupPrompt=yes ;EnableDirDoesntExistWarning=no ;Password=heslo ;Encryption=yes ;LanguageDetectionMethod=uilanguage ;ChangesEnvironment=yes [Code] function IsDotNetDetected(version: string; service: cardinal): boolean; // Indicates whether the specified version and service pack of the .NET Framework is installed. // // version -- Specify one of these strings for the required .NET Framework version: // 'v1.1' .NET Framework 1.1 // 'v2.0' .NET Framework 2.0 // 'v3.0' .NET Framework 3.0 // 'v3.5' .NET Framework 3.5 // 'v4\Client' .NET Framework 4.0 Client Profile // 'v4\Full' .NET Framework 4.0 Full Installation // 'v4.5' .NET Framework 4.5 // 'v4.5.1' .NET Framework 4.5.1 // 'v4.5.2' .NET Framework 4.5.2 // 'v4.6' .NET Framework 4.6 // 'v4.6.1' .NET Framework 4.6.1 // 'v4.6.2' .NET Framework 4.6.2 // 'v4.7' .NET Framework 4.7 // 'v4.7.1' .NET Framework 4.7.1 // 'v4.7.2' .NET Framework 4.7.2 // // service -- Specify any non-negative integer for the required service pack level: // 0 No service packs required // 1, 2, etc. Service pack 1, 2, etc. required var key, versionKey: string; install, release, serviceCount, versionRelease: cardinal; success: boolean; begin versionKey := version; versionRelease := 0; // .NET 1.1 and 2.0 embed release number in version key if version = 'v1.1' then begin versionKey := 'v1.1.4322'; end else if version = 'v2.0' then begin versionKey := 'v2.0.50727'; end // .NET 4.5 and newer install as update to .NET 4.0 Full else if Pos('v4.', version) = 1 then begin versionKey := 'v4\Full'; case version of 'v4.5': versionRelease := 378389; 'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older 'v4.5.2': versionRelease := 379893; 'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older 'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update 'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update 'v4.7': versionRelease := 460798; // 460805 before Win10 Creators Update 'v4.7.1': versionRelease := 461308; // 461310 before Win10 Fall Creators Update 'v4.7.2': versionRelease := 461808; // 461814 before Win10 April 2018 Update end; end; // installation key group for all .NET versions key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey; // .NET 3.0 uses value InstallSuccess in subkey Setup if Pos('v3.0', version) = 1 then begin success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); end else begin success := RegQueryDWordValue(HKLM, key, 'Install', install); end; // .NET 4.0 and newer use value Servicing instead of SP if Pos('v4', version) = 1 then begin success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); end else begin success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); end; // .NET 4.5 and newer use additional value Release if versionRelease > 0 then begin success := success and RegQueryDWordValue(HKLM, key, 'Release', release); success := success and (release >= versionRelease); end; result := success and (install = 1) and (serviceCount >= service); end; function InitializeSetup(): Boolean; begin if not IsDotNetDetected('v4.5', 0) then begin MsgBox('MyApp requires Microsoft .NET Framework 4.5.'#13#13 'Please use Windows Update to install this version,'#13 'and then re-run the MyApp setup program.', mbInformation, MB_OK); result := false; end else result := true; end; // Check previos version to uninstall function GetUninstallString(): String; var sUnInstPath: String; sUnInstPathOLD: String; sUnInstallString: String; begin sUnInstPathOLD := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\0- IS VFP by Max -0_is1'); sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); sUnInstallString := ''; if not RegQueryStringValue(HKLM, sUnInstPathOLD, 'UninstallString', sUnInstallString) then RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString); Result := sUnInstallString; end; function IsUpgrade(): Boolean; begin Result := (GetUninstallString() <> ''); end; function UnInstallOldVersion(): Integer; var sUnInstallString: String; iResultCode: Integer; begin // Return Values: // 1 - uninstall string is empty // 2 - error executing the UnInstallString // 3 - successfully executed the UnInstallString // default return value Result := 0; // get the uninstall string of the old app sUnInstallString := GetUninstallString(); if sUnInstallString <> '' then begin sUnInstallString := RemoveQuotes(sUnInstallString); if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then Result := 3 else Result := 2; end else Result := 1; end; procedure CurStepChanged(CurStep: TSetupStep); begin // Uninstall old version : if (CurStep=ssInstall) then begin if (IsUpgrade()) then begin UnInstallOldVersion(); end; end; end; [Dirs] Name: "C:\AUXILIAR"; Permissions: users-full; Flags: UninsNeverUninstall; Name: "C:\AUXILIAR2"; Permissions: users-full; Flags: UninsNeverUninstall; Name: "{#DefaultDirName}"; Permissions: users-full; Flags: UninsNeverUninstall; [Files] Source: "VFP\vfp8r.dll"; DestDir: "{sys}"; Flags: ignoreversion sharedfile regserver Source: "VFP\vfp8t.dll"; DestDir: "{sys}"; Flags: ignoreversion sharedfile regserver Source: "VFP\vfp8rcsy.dll"; DestDir: "{sys}"; Flags: ignoreversion sharedfile Source: "VFP\VFP8RENU.DLL"; DestDir: "{sys}"; Flags: ignoreversion sharedfile Source: "VFP\msvcr70.dll"; DestDir: "{sys}"; Flags: onlyifdoesntexist sharedfile Source: "VFP\msvcr71.dll"; DestDir: "{sys}"; Flags: onlyifdoesntexist sharedfile Source: "VFP\msvcp71.dll"; DestDir: "{sys}"; Flags: onlyifdoesntexist sharedfile Source: "VFP\gdiplus.dll"; DestDir: "{sys}"; Flags: ignoreversion sharedfile ; IS ocx library - calendar etc. Source: "IS\comctl32.ocx"; DestDir: "{#DefaultDirName}"; Flags: ignoreversion restartreplace sharedfile regserver Source: "IS\mscomctl.ocx"; DestDir: "{#DefaultDirName}"; Flags: ignoreversion restartreplace sharedfile regserver Source: "IS\mscomct2.ocx"; DestDir: "{#DefaultDirName}"; Flags: ignoreversion restartreplace sharedfile regserver Source: "IS\mscomm32.ocx"; DestDir: "{#DefaultDirName}"; Flags: ignoreversion restartreplace sharedfile regserver ; DMS NET Framework Library : Source: "IS\DMS\ClassLibraryDMS.dll"; DestDir: "{#DefaultDirName}\DMS"; Flags: ignoreversion sharedfile Source: "IS\DMS\reg_dll_plus_test.exe"; DestDir: "{#DefaultDirName}\DMS"; Flags: ignoreversion sharedfile Source: "IS\DMS\dms_dll_test.exe"; DestDir: "{#DefaultDirName}\DMS"; Flags: ignoreversion sharedfile Source: "IS\DMS\RegAsm.exe"; DestDir: "{#DefaultDirName}\DMS"; Flags: ignoreversion sharedfile Source: "IS\DMS\test.txt"; DestDir: "{#DefaultDirName}\DMS"; Flags: ignoreversion sharedfile Source: "IS\DMS\test_adresy.txt"; DestDir: "{#DefaultDirName}\DMS"; Flags: ignoreversion sharedfile ; Outlook library to communicate between outlook and vfp Source: "IS\Redemption\Redemption.dll"; DestDir: "{#DefaultDirName}\Redemption"; Flags: ignoreversion restartreplace sharedfile regserver Source: "IS\Redemption\Interop.Redemption.dll"; DestDir: "{#DefaultDirName}\Redemption"; Flags: ignoreversion restartreplace sharedfile Source: "IS\Redemption\Install.exe"; DestDir: "{#DefaultDirName}\Redemption"; Flags: ignoreversion sharedfile Source: "IS\Redemption\Customize.exe"; DestDir: "{#DefaultDirName}\Redemption"; Flags: ignoreversion sharedfile ;Source: "IS\Redemption\readme.txt"; DestDir: "{#DefaultDirName}\Redemption"; Flags: ignoreversion sharedfile Source: "IS\Redemption\ProfMan.dll"; DestDir: "{#DefaultDirName}\Redemption"; Flags: ignoreversion sharedfile Source: "IS\Redemption\Interop.ProfMan.dll"; DestDir: "{#DefaultDirName}\Redemption"; Flags: ignoreversion sharedfile ; Barcode fonts Source: "IS\Fonts\code_128.ttf"; DestDir: "{fonts}"; FontInstall: "Code-128"; Flags: onlyifdoesntexist Source: "IS\Fonts\PF_C39.ttf"; DestDir: "{fonts}"; FontInstall: "PF Barcode 39"; Flags: onlyifdoesntexist Source: "IS\Fonts\PF_C128.ttf"; DestDir: "{fonts}"; FontInstall: "PF Barcode 128"; Flags: onlyifdoesntexist Source: "icons\BadDog.ico"; DestDir: "{#DefaultDirName}\Icons\"; Flags: ignoreversion restartreplace sharedfile Source: "icons\install.ico"; DestDir: "{#DefaultDirName}\Icons\"; Flags: ignoreversion restartreplace sharedfile Source: "icons\uninstall.ico"; DestDir: "{#DefaultDirName}\Icons\"; Flags: ignoreversion restartreplace sharedfile [Messages] WelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications and disable any anti virus before continuing.%n%n- IS VFP Library%n- IS ocx library%n- Redemption DLL%n- DMS Net.Framework DLL%n- Fonts%n- IS Icon [Icons] Name: "{group}\{#AppShortName}\Uninstall"; Filename: "{uninstallexe}" Name: "{group}\{#AppShortName}\BadDog"; Filename: "{#DefaultDirName}\Icons\BadDog.ico" [Registry] Root: HKLM; Subkey: "Software\companyIS\ODBC_DRIVER"; Flags: uninsdeletekey Root: HKLM; Subkey: "Software\companyIS\ODBC_DRIVER"; ValueType: string; ValueName: "ODBC_DRIVER"; ValueData: "office1" Root: HKLM; Subkey: "Software\companyIS\ODBC_DRIVER_OFFICE1"; Flags: uninsdeletekey Root: HKLM; Subkey: "Software\companyIS\ODBC_DRIVER_OFFICE1"; ValueType: string; ValueName: "ODBC_DRIVER"; ValueData: "office2" Root: HKLM; Subkey: "Software\companyIS\ODBC_DRIVER_OFFICE2"; Flags: uninsdeletekey Root: HKLM; Subkey: "Software\companyIS\ODBC_DRIVER_OFFICE2"; ValueType: string; ValueName: "ODBC_DRIVER"; ValueData: "office3" [Run] Filename: "{dotnet40}\RegAsm.exe"; Parameters: /codebase {#DefaultDirName}\DMS\ClassLibraryDMS.dll; WorkingDir: {app}; StatusMsg: "Registering Controls..."; Flags: runminimized ;[Languages] ;Name: en; MessagesFile: "compiler:Default.isl" ;Name: nl; MessagesFile: "compiler:Languages\Dutch.isl" ;Name: de; MessagesFile: "compiler:Languages\German.isl" ;[Messages] ;en.BeveledLabel=English ;nl.BeveledLabel=Nederlands ;de.BeveledLabel=Deutsch ;[CustomMessages] ;en.MyDescription=My description ;en.MyAppName=My Program ;en.MyAppVerName=My Program %1 ;nl.MyDescription=Mijn omschrijving ;nl.MyAppName=Mijn programma ;nl.MyAppVerName=Mijn programma %1 ;de.MyDescription=Meine Beschreibung ;de.MyAppName=Meine Anwendung ;de.MyAppVerName=Meine Anwendung %1 [UninstallDelete] Type: files; Name: "{sys}\vfp8r.dll" Type: files; Name: "{sys}\vfp8t.dll" Type: files; Name: "{sys}\vfp8rcsy.dll" Type: files; Name: "{sys}\VFP8RENU.DLL" ;Type: files; Name: "{sys}\msvcr70.dll" ;Type: files; Name: "{sys}\gdiplus.dll" Type: files; Name: "{#DefaultDirName}\comctl32.ocx" Type: files; Name: "{#DefaultDirName}\mscomctl.ocx" Type: files; Name: "{#DefaultDirName}\mscomct2.ocx" Type: files; Name: "{#DefaultDirName}\mscomm32.ocx" Type: files; Name: "{#DefaultDirName}\Icons\BadDog.ico" Type: files; Name: "{#DefaultDirName}\Icons\install.ico" Type: files; Name: "{#DefaultDirName}\Icons\uninstall.ico"
Výše uvedné skripty jsem nepsal, vše již někdo napsal předemnou a tak stačilo vzít example a maximálně změnit verzi kontrolovaného sw atd.
Výsledkem buildovacího procesu je exe soubor podporující silent instalaci a další parametry, které inno setup podporuje.
Pokud je na někoho příklad moc složitý, zde je jednodušší varianta pro distribuci konfiguračního souboru pro Firefox :
;InnoSetupVersion=5.5.9 ;Documentation : ;http://www.jrsoftware.org/ishelp/index.php #define AppName "0- Company a.s. FF Policy " #define AppShortName "CompanyFFPolicy" #define AppPublisher "Company a.s." #define AppVersion "1.0.5" #define DefaultDirName "C:\company_ff" #define FFDirName "{code:GetDirName}" [Setup] AppName={#AppName} AppVersion={#AppVersion} AppID={#AppName} VersionInfoDescription=Company FF Policy Setup VersionInfoProductName=0- Company FF Policy -0 DefaultGroupName={#AppPublisher} DefaultDirName={#DefaultDirName} OutputBaseFilename=Company-FF-Policy-{#AppVersion} Compression=lzma2 SolidCompression=yes PrivilegesRequired=admin ; MinVersion 8.3 = Win 8.1, 6.1 = Win7, 6.0 = Vista MinVersion=6.0 SetupIconFile=icons\install.ico UninstallIconFile=icons\uninstall.ico UninstallDisplayIcon={app}\icons\uninstall.ico DisableDirPage=yes DisableProgramGroupPage=yes ;Password=heslo ;Encryption=yes [Code] // Check previos version to uninstall function GetUninstallString(): String; var sUnInstPath: String; sUnInstallString: String; begin sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); sUnInstallString := ''; if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); Result := sUnInstallString; end; function IsUpgrade(): Boolean; begin Result := (GetUninstallString() <> ''); end; function UnInstallOldVersion(): Integer; var sUnInstallString: String; iResultCode: Integer; begin // Return Values: // 1 - uninstall string is empty // 2 - error executing the UnInstallString // 3 - successfully executed the UnInstallString // default return value Result := 0; // get the uninstall string of the old app sUnInstallString := GetUninstallString(); if sUnInstallString <> '' then begin sUnInstallString := RemoveQuotes(sUnInstallString); if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then Result := 3 else Result := 2; end else Result := 1; end; procedure CurStepChanged(CurStep: TSetupStep); begin // Uninstall old version : if (CurStep=ssInstall) then begin if (IsUpgrade()) then begin UnInstallOldVersion(); end; end; end; // check if ff dir name exist and load this to variable var DirName: string; function TryPath(Path: string): Boolean; begin Result := DirExists(Path); if Result then begin Log(Format('Path %s exists', [Path])) DirName := Path; end else begin Result := False; exit; end; end; function GetDirName(Param: string): string; begin Result := DirName; end; function InitializeSetup(): Boolean; begin Result := TryPath('C:\Program Files (x86)\Mozilla Firefox') or TryPath('C:\Program Files\Mozilla Firefox'); if Result then begin Log(Format('Destination %s selected', [DirName])) end else begin Result := False; exit; //Log(Format('Destination %s selected', [mbError])) //MsgBox('No destination found, aborting installation', mbError, MB_OK); end; end; [Dirs] Name: "{#DefaultDirName}"; Permissions: users-readexec; Flags: UninsNeverUninstall; [Files] Source: "icons\install.ico"; DestDir: "{#DefaultDirName}\Icons\"; Flags: ignoreversion restartreplace Source: "icons\uninstall.ico"; DestDir: "{#DefaultDirName}\Icons\"; Flags: ignoreversion restartreplace Source: "certs\CompanyRootCA.cer"; DestDir: "{#FFDirName}\defaults\pref\"; Flags: ignoreversion restartreplace Source: "certs\CompanyRootCA-G2.crt"; DestDir: "{#FFDirName}\defaults\pref\"; Flags: ignoreversion restartreplace Source: "ffconfig\autoconfig.js"; DestDir: "{#FFDirName}\defaults\pref\"; Flags: ignoreversion restartreplace Source: "ffconfig\firefox.cfg"; DestDir: "{#FFDirName}"; Flags: ignoreversion restartreplace [Messages] WelcomeLabel2=This will install [name/ver] on your computer. [Icons] Name: "{group}\{#AppShortName}\Uninstall"; Filename: "{uninstallexe}" [UninstallDelete] Type: files; Name: "{#DefaultDirName}\Icons\install.ico" Type: files; Name: "{#DefaultDirName}\Icons\uninstall.ico"
Netvrdím, že Inno Setup umí všechno a všechno v něm jde a jde to lehce. Existují komerční instalátory, které mají určitě spoustu fcí a spoustu věcí integrovaných. Každopádně Inno Setup je jednoduchý a pro spoustu věcí plně dostatečný.
A co vy, řešili jste něco podobného pro win? A co jste případně použili?
Tiskni
Sdílej:
Pro GPXSee používám NSIS. Má sice "trochu" kryptickou syntaxi (dokonce i oproti tomu Pascalu z Inno Setupu ), ale prakticky všechno na co člověk může narazit už v NSISu někdo řešil a má opravdu minimální overhead. Což ale někoho, kdo balí takovou korporátní mrdku s "Dotnetem", "Oraclem" a "Já nevím čím vším ještě", asi úplně netankuje...
No nevim, mě teda "assemblerovský" konstrukty typu:
StrCmp $R0 "1" 0 +3
přijdou ve skriptovacim jazyku trochu moc...
Ve firmě se vývíjel a vyvíjí sw ve VisualFoxPro a pro komunikaci s db se využívá ODBC a Oracle Client.A vsiml si uz nekdo, ze to je uz pres deset let mrtva platforma?
My dokonce ani nejedeme VFP9, ale VFP8.Ja jsem skoncil u verze 7 a uz tehdy bylo jasne, ze to je slepa vetev vyvoje, protoze takto pojaty jazyk kombinujici xbase jazyk (protoze historie), objektove programovani (protoze moda) a SQL (protoze nutnost) je neco hodne spatneho i na tehdejsi pomery. Ze to odepsal i Microsoft bylo zjevne, uz nekdy kolem te verze 7, kdy Microsoft rozhodl, ze VFP nebude v .NETu a Visual Studiu. Velkou vyhodou a i nevyhodou (V)FP je, ze zpracovani dat a jejich prezentace jdou ruku v ruce. Coz umoznuje opravdu docela rychly vyvoj, ale je to na ukor udrzovatelnosti kodu. To je vec, kterou jsem v minulosti delal a opravdu bych se k tomu nerad vracel, proto me desi, ze to dneska jeste nekdo pouziva. Proste spaghetti code byl ve VFP de facto norma, protoze to ani lip neslo.
Stále ten stejný příběh. To je prostě odvislé od projektu, jestli dává smysl zůstat u té technologie i když je hypoteticky horší. Pokuď se to nezaplatí, nedává žádný smysl investovat do přepsání do něčeho "moderního". Ta firma očividně (už jenom podle těch technologií) není žádný hipsterský startup, kde se peníze investorů dají topit v "ideologicky správném TM" vývoji...
nedává žádný smysl investovat do přepsání do něčeho "moderního".VFP jako jazyk neodpovidal beznym standardum uz kolem toho roku 2000. AFAIK je to asi jediny jazyk, ktery se aktivne pouziva, kde je dynamicky rozsah platnosti jako vychozi. Vynikajici zdroj chyb, ktere se naramne hezky hledaji.
kde se peníze investorů dají topit v "ideologicky správném TM" vývoji...A porad, jako v te predchozi diskuzi, zapominas na druhou cast rovnice, a to jsou naklady udrzbu. Tvoje argumentace mne pripomnela prave jednu desivou historku z dob, kdy jsme delal bug fixy a drobne upravy na jednom mega projektu ve VFP. Ve vsech modulech se pravidelne vyskytovaly copy-paste sekvence identickeho kodu, napr. urcity typ dialogu. Jednou jsem dostal za ukol asi v 50 takovych dialozich neco upravit. Tak jsem to vzal a vypreparoval do dvou nebo tri samostatnych procedur a upravil to v nich, na jednom miste. Za coz jsem dostal od sefove pojeb, ze neco takoveho je zbytecne a mel jsem ten copy/paste kod tam nechat a jen to 50x upravit, ze to je zbytecne prace, ktera se nikdy nevrati. A za pul roku jsem dostal pojeb podruhe, ze jmeno a chovani jedne z tech procedur je stejne, jak neco, co ma VFP mit v dalsi verzi, a bude to asi problem, a ze to je dukaz toho, ze tam ten copy/paste kod mel zustat. Kratce na to jsem tam skoncil, protoze na to jsem opravdu nemel nervy.
Na náklady na údržbu samozřejmě nezapomínám, to se může zdát jenom někomu, kdo z věty:
Pokuď se to nezaplatí, nedává žádný smysl investovat do přepsání do něčeho "moderního".
vytrhne z kontextu jenom to:
nedává žádný smysl investovat do přepsání do něčeho "moderního"
A stejně tak jako věřím, že ví co a proč dělají vývojáři těch tisíců projektů, které nemají unit testy (a bez kterých by tu nikdo z nás na linuxu nemohl existovat už jenom proto, že je mezi nimi i samotné jádro), tak věřím, že ví co dělá ta firma a že si dobře spočítala, jestli se jí to vyplatí nebo ne. Protože lidi z tý firmy mají určitě lepší data pro rozhodování, než zkušenost "jednou jsem dostal pojeb za refaktoring VFP a nikdy více"...
vytrhne z kontextu jenom to: nedává žádný smysl investovat do přepsání do něčeho "moderního"Ja jsem si tam doplnil ten kontext odkazovane diskuze, ...
tak věřím, že ví co dělá ta firma a že si dobře spočítala, jestli se jí to vyplatí nebo ne.V rade firem se to opravdu nepocita. Rada firem, obzvlast tech malych (ale najdou se i ty velke), jede v rezimu, valime pred sebou tu kopu sracek, kterou pred deseti dvaceti lety nekdo vytvoril, vime, ze to je spatne, ale za ty roky se toho nabalilo tolik, ze se toho kazdy boji byt jen z dalky dotknout, aby se neco nerozbilo. Proto se nedivim, ze i v roce 2019 potkavam aplikace, ktere vyzaduji Flash, Silverlight a nedavno jsem na nejakem uradu (resp. jeho aplikaci) potkal pozadavek na Internet Explorer 8!
A stejně tak jako věřím, že ví co a proč dělají vývojáři těch tisíců projektů, které nemají unit testy (a bez kterých by tu nikdo z nás na linuxu nemohl existovat už jenom proto, že je mezi nimi i samotné jádro), tak věřím, že ví co dělá ta firma a že si dobře spočítala, jestli se jí to vyplatí nebo ne. Protože lidi z tý firmy mají určitě lepší data pro rozhodování, než zkušenost "jednou jsem dostal pojeb za refaktoring VFP a nikdy více"...To je rozumný názor, nicméně IMO přecenuješ racionalitu mnohých firem. Vím minimálě o několika firmách, které udržují legacy technologie zuby nehty až za hrob a spálí na tom násobně více prostředků, než co by stál přechod na non-obsolete technologii, protože prostě proto (většinou setrvačnost).
Úplně stejně se snaží Microsoft lidi donutit k přechodu na Windows 10. Tím, že třeba DirectX 12 nefunguje ve starších verzích. Tím, že pros tarší verze se uměle vyrábějí omezení.To je pohled z jedne z strany. Z te druhe strany je to proste tak, ze DX12 pro W7 znamena dvakrat vic prace s testovanim, s resenim problemu, atd. V tomhle uz jsem poucen, ve smyslu nepovolovat uzivatelum vic, nez je nutne, jen proto, ze to proste jde. Ano z druhe strany je to samozrejme "zbytecne omezovani". Ale realita je takova, ze nejde delat zarizeni s milonem features a zakaznikum vysvetlovat, ze support delame jen pro polovinu z nich.
Ono se na to na abckomunismu.cz zapomina, ale SW musi vydelavat. Takze kdyz se rozhodnes pro prepis, tak krom toho, ze treba rok, nebo klidne i nekolik let dal potlacis ten sileny zastaraly blob dal, tak vedle toho ti vznikne dlasi naklad, s nejistym vysledkem.Nejsem ten typ člověka, co by hurá hned přepsal všechno, a vim, že udržování legacy codebase má často smysl. Ale zároveň taky vim o příkladech, kdy i kdyby ten přepis selhal, furt by ta situace byla v konečném výsledku lepší, než udržovat nějakou šílenost. Když použitelný SW vydělává peníze, tak je to samozřejmě dobře (zejména pro prodejce toho SW
Pokud je program slušně napsanýNjn tady je jádro pudla
Třeba hlášky při chybách ve složitých C++ šablonách v gcc jsou na zblytí, a nedá se místo chyby rozumně najít. STL knihovna je u Microsoftu rozumně prodchnutá asserty, takže při případné chybě dostane message box, nikoli záhadnou chybu. Apod.Tohle zní, jako když jsi s gcc pracoval naposledy někdy před 10 nebo 20 lety. MSVC je s prominutím naprostá sračka. Standardní knihovna je sice "prodchnutá asserty", nicméně důsledek toho je, že nelze linkovat debug a release verze programu / knihoven, všechno musí být jak u blbečků na dvorečku zbuildováno dvakrát (případně vícekrát), přičemž třeba jména knihoven nemají žádný standardizovaný tvar pro odlišení build varianty, static / shared atd. Standardní knihovna MSVC je outsourcovaná od Dinkumware, podpora C++ standardů rozumně až v poslední verzi, ale i tak člověk narazí občas na corner casy, kde chybí třeba nějaká méně obvyklá funkce ve standardní knihovně apod. To samé třeba podpora Unicode/Utf-8 - donedávna se musely použit magické pragmy, pokud to tedy vůbce šlo, aby kompilátor nezrakvil stringy v programu v závislosti na lokálním kódování. Do toho, jaká šílenost je msbuild, se radši ani pouštět nebudu. To, že správa dependencí je řešená stylem "hahaha lol, dependence? Co to je? To si pořešte nějak sami" taky asi nemá smysl moc komentovat. MSVC jako prostředí startuje pomalu a operuje pomalu, což dává smysl, vzhledem k tomu, kolik kravin obsahuje. Instalace má několik gigabajtů, z čehož nemalá část se v systému zabydlí natrvalo a už se nedá odinstalovat. Instalačka se tváří, že umístění instalace jde customizovat, což ale ve skutečnosti nejde (nebo jen částečně)... resp. nové verze myslimže už ani tu možnost nenabízejí (teď nevím přesně) a instalační cesta je hardcoded, přesto je ale potřeba šílené startup batch skripty, které nastavují cestu k toolchainu, aby bylo možné vůbec kompilátor zavolat. Nové verze - tzn. ty, které už konečně mají rozumnou podporu C++ standardů, Unicode atd. - vyžadují (pokud vím) vytvoření účtu u Microsoftu a zalogování při používání IDE a pro aktualizace. Jako má to i svoje dobré stránky - přijde mi, že kompilátor je relativně rychlej, produkuje co vím celkem dobrý kód a třeba debugger taky relativně ujde - ale hrozně mě na tom celkově vysírá ten porod to všechno nainstalovat a uprosit, aby to samo se sebou spolupracovalo, a pak kolem toho chodit po špičkách, aby to náhodou neupadlo zpět do chaosu... /rant
Líbí se mi programy jako Inno Setup, které prostě fungují.S tím souhlasím, nicméně MSVC bych označil za pravý opak Inno Setupu.
Můžu posloužit mnoha historkami. Třeba když jsem chtěl napsal linker script pro gcc, abych vytvořil binárku, kterou bych mohl flešnout do ARMu. Dokumentace na houby, musel jsem projít zdroják gcc linkeru, abych skutečně zjistil vůbec co to umí a co ne.Zbývá dodat, že s MSVC bys tohle neudělal vůbec...
Offline instalace Visual Studio 2017 má přes 40GiBCrosstool-ng adresář s nabuildovaným ARMem má jen 20GB
Já nemám nic proti GCC, ani proti Linuxu, ani proti open source. Pragmaticky chci ale věci dělat, a nesrat se s tím.Hmm to souhlas, holt se ale očekává, že když je projekt vyvíjený zdarma, tak to na stříbrném podnose nedostaneš. Ale existují projekty, které i přesto mají velmi dobrou kvalitu na to, že jejich vývojáři nejsou obvykle placeni. Například kernel.
To není dobrý argument. MSVC je také zdarma s většinou funkcí.Vývojári jsou pořád microsoftem placení ne? Zdarma je tedy jen zdánlivě. Tipoval bych že podobně je zdarma v opensource zdánlivé v tom, že do toho musíš prostě investovat víc času.
To také není dobrý argument. Drtivá většina vývoje linux kernelu je placena.Samozřejmě někteří výrobci si je platí a přední vývojáři jsou placení asi LF, ale v případě driverů, kdy je po několika letech HW obsolete, tak už to není tak dobrý u HW, kde driver nevyvíjel výrobce a nebo byl driver vyvinutý reverse engineeringem je to vysoce nepravděpodobný. Myslím že třeba realtek moc do kernelu nepřispívá, vím, že pro ty usb wifiny mají vlastní, byť otevřený, driver. Ale není třeba brát obskurní drivery:
When can we expect a working driver ? It really is not easy to predict dates, as show-stoppers may appear any time. Very few, usually none, of the developers are paid to work on Nouveau, so progress depends on their free time and interests....
Mimochodem, ten Inno Setup je také zdarma. Jeho autor to přesto udělal jednoduše použitelné, a efektivní.No malé projekty asi nebude tak náročné vyvíjet zdarma a kvalitně (a rychle). Ale u něčeho jako třeba firefox to je IMO nemožné.
Já nevím o tom, že to nejde, a proto to bez problémů u MSVC dělám. Ale uznávám, že kdybyste mi včas řekl, že to nejde - tak bych se o to možná nepokoušel.Řeč byla o situaci se statickými knihovnami...![]()
O jakém C++ standardu mluvíte? V poslední době jich přišlo několik za sebou. Jen idiot by kritizoval kompilátor, že nedávné standardy podporuje až nedávná verze kompilátoru. Poslední verze C++ je z konce roku 2017. Předpokládám, že vývojáři kompilátoru potřebují nějaký čas na odladění.Platí to pro +/- kterýkoli standard od C++11 dále. MSVC má typicky zpoždění za GCC a clangem, a to až o několik let. Nejvíc je to vidět asi na
constexpr
, který gcc / clang podporovaly někdy od r. 2011/2012, zatímco MSVC přidalo prvotní podporu v roce 2015, která nicméně byla ještě loni nekompletní/zabugovaná. Nevim, jak letoší vydání, možná se to zlepšilo, třeba mají po 10 letech kompletní podporu Debug schopnosti MSVC jsou daleko vepředu za čímkoli, co máte v gcc a cokoli kolem něho.Nějak tohle "daleko vepředu" nepozoruju, přijde mi to +/- podobný. V něčem je MSVC lepší, ale že by to byla výrazná převaha... Možná to bude tím, že nejsem až takovým nadšencem do prostředí, které vyžadují práci s myší podobně intenzivní jako ve střílečce...
Ten rozdíl/problém ale vůbec není o tom, jestli je software open source nebo ne. Rozdíl v kvalitě dělá to, zda-li je vývoj placen, nebo ne. A velká část open source (především desktopového SW) je neplacená, tzn. jeho vývojáři z toho nemají ani korunu. A to se prostě na kvalitě/možnostech toho SW musí projevit - nikdo nemůže vložit do vývoje SW několik let života aniž by jedl nebo někde bydlel...
Open source software, který je vyvíjen komerčně bývá minimálně stejně tak kvalitní, jako ten komerční ne-open source. Z vámi zmiňovaných tak například Linux (jádro) má minimálně stejnou kvalitu jako Windows a clang minimálně stejnou kvalitu jako MSVC. V obou případech ale za vývojem toho SW stojí velké společnosti, které do jeho vývoje nasypaly srovnatelné množství financí jako Microsoft do Windows a MSVC.
"Spatlaný a zprasený" kód uživatele vůbec nezajímá. Ty zajímá zda SW dělá rychle a spolehlivě přesně to, co od něj vyžadují. Dokonce bych si dovolil tvrdit, že čím lepší SW, tím "hnusnější" kód, protože složitě řeší právě ty detaily, které jsou to co odlišuje dobrý SW od toho průměrného.
"Krása" kódu (stejně jako například testy) je prostředek, ne cíl, i když si to tady spousta programátorů odmítá připustit.
Tak se musí investovat víc prostředků do oprav těch chyb. Ale stále může (a běžně taky je) být mnohem výhodnější takový kód opravovat, než se rozhodnout to celé přepsat. Protože tím získáte zcela jistě novou sadu chyb ale rozhodně ne jistotu, že to bude po přepsání výrazně lepší. Nehledě na to, že po těch několika letech, který vám bude ten přepis trvat zjistíte, že váš SW už nikoho nezajímá, protože konkurence mezitím nespala (nepřepisovala)...
Já nikoli. Na Windows jsem se setkal veskrze s vyšší kvalitou software. A nejhorší kvalitu má většina open source programů. Protože pro jejich propagaci stačí, že jsou "open source", a dál už se autoři nemusejí snažit.No já nemusím ani chodit daleko, stačí samotnej windows, když jsem se snažil nainstalovat win7 na usb disk tak ho to ani nenašlo. Podzimní updaty win10 bylo peklo, ten nucený update z win7 na win10 jsem musel opravovat koupí novýho disku (teda nevím jestli ten disk nebyl poškozenej už před, ale dostal jsem ho s tím, že to chcíplo hnedka po updatu).
Například jeden z důvodů, proč i unixové programy ladím v Microsoft Visual Studiu je ten, že nic podobného na unixech není.No já ladil v eclipse, jeden externí driver pro wifinu do linuxu, něco napůl mezi opensource a closedsource, s extrémně obskurní kódem (takže bych to řadil spíš do closedsource). Ale třeba kernel v eclipse ani ladit nepotřebuju, protože vím kde co je. Ale já jsem hlavně C + embedded programátor, takže ty projekty nejsou moc velký.
Opakovaně v průběhu roků dávám výzvu, že budeme soutěžit v efektivitě práce s vektorovým editorem Inkscape. To je totiž asi s předstihem nejdebilnější ovládání programu, jaké jsem kdy zažil.No poster se v tom sestavit dal a jednoduchý vektory jsou OK. Ovládání by asi mohlo bejt lepší, to jde vždycky, ale mě trvá dýl vymyslet co nakreslit než jak to kreslit. Je fakt, že Inscape musím čas od času rekompilovat, když se změní verze c++ knihoven.
Zvítězím jen tehdy, pokud to bude mít alespoň třikrát rychleji než kolega s Inkscape. Dosud nikdo neměl odvahu do toho jít.Njn na to bych si netroufl, já v inskcape dělal naposled něco tak před půl rokem a to bylo jen pár čtverečků vykopírovanejch z pdfka, kam jsem dokresloval šipky :-/.
Já už jsem unaven drsnou nekvalitou programů, které jdou od open source, a hlavně jejich nedodělaností. A zejména toho, co jde z Linuxu.Ale pokud to je opensource tak si vždycky můžeš kód opravit
Můžu posloužit mnoha historkami. Třeba když jsem chtěl napsal linker script pro gcc, abych vytvořil binárku, kterou bych mohl flešnout do ARMu. Dokumentace na houby, musel jsem projít zdroják gcc linkeru, abych skutečně zjistil vůbec co to umí a co ne. A neřekl bych, že GCC je okrajový projekt.Divný já dělal linker skripty na standalone prográmky pro PIC32 (MIPS) a zdrojáky gcc jsem prolízat nemusel, stačilo si přečíst dokumentaci a prohlídnout pár návodů.
Dnes už je instalace Linuxu jednoduchá, ale že by tam jelo všechno bez problémů...Nejede, ve slackwaru 14.2 mě nešla nainstalovat experimentální podpora btrfs. Musel bych to instalovat ručně v konzoli. Jenže v tom windows jsem se prostě dál nedostal
Toto není kvalita, a takové "open source" a "kvalitní linuxové programy" já velice rád přenechám jiným lidem s masochistickými sklony.Tak kdybych se dokázal naklonovat, tak bych ti za cenu řekněme 30% ceny corel draw ten inkscape opravil, ale není čas no
A tam je těch vyfikundací, co po tom chcete trochu více.Tak pokud to ještě nikdo nikdy nepotřeboval, tak to tam holt ještě nebude no. To by chtělo ukázkový kód.
Nejede, ve slackwaru 14.2 mě nešla nainstalovat experimentální podpora btrfs. Musel bych to instalovat ručně v konzoli.P.S. A ještě bych dodal že slackware 14.2 je už skoro 3 roky starý a Patrik nejspíš časem vždycky opraví všechny chyby co mu komunita oznámí ...
Ale ono se dá vždycky. Ale já už jsem starej na to, abych všechno dělal pravou rukou přes levé ucho. Toto není kvalita, a takové "open source" a "kvalitní linuxové programy" já velice rád přenechám jiným lidem s masochistickými sklony. Když jsem se pokoušel Inkscape znásilnit, tak jsem byl v 80 % rychlejší, když jsem SVG grafiky napsal rovnou jako zdroják, než přes Inkscape. SVG je obyčejné XML. A to už je hodně špatná vizitka. Já raději program, ve kterém za hodinu udělám to, co v Inkscape za půl dne. Nevidím žádný bonus v tom, že to může patlal pomalu, déle a ještě se u toho nadřít.Ty to teda prožíváš. Naposledy jsem v Inkscape dělal křivku, kterou jsem pak řezal do dřevěné desky na laserovém plotteru. Respektive připravil jsem nějaký základ a vlastní tvar pak z většiny 'namalovala' manželka, která není žádná programátorka ani nedělá technickou práci. Nicméně to zvládla bez problému. Jediné, co jsem si musel najít, byl kártký návod, jak zařídit, aby se kresba automaticky 'naživo' kreslila osově symetricky, tzn. při úpravě křivky na jedné straně se symetricky upravuje i druhá strana (ne pouze symetrické nakopírování už nakresleného tvaru - to bych uměl i bez návodu). Inkscape mě překvapil tím, jak snadné to celé bylo, včetně toho, že jsem potřeboval tvar říznout dvakrát koncentricky s druhým řezen asi o milimetr větším ve směru normál křivky, tak, aby vznikla milimetrová mezera. Tohle Inkscape zařídil na jedno klinutí, funkce se jmenuje Dynamic offset. Celý proces byl hotový za chvíli, nebylo přitom potřeba číst manuály ani zdrojáky ani upravovat XML nebo podobné kraviny. Jestli to umí CorelDraw taky, to nevim a asi to ani vědět nepotřebuju. Popravdě mě trochu překvapuje, že ještě vycházejí nové verze, naposled jsem ten software viděl před mnoha lety... Podle mě s tím FOSS softwarem máš něco jako Self-fulfilling prophecy, kdy očekávání, že to půjde špatně, způsobí, že to skutečně pak jde špatně...
To dá odpověď, proč je to u Windows o mnoho řádů snadnější.A to da taky odpoved, proc neexistuje alternativni implementace Windows a clovek se musi nadobro uvazat u Microsoftu. Jinak machrovat s rozsahem API je ponekud ... Dobre API, protoze je to rozhrani, se pozna podle toho, ze je minimalni a umoznuje delat maximum veci. WinAPI, ktera ma vyssi desitky tisic volani (mozna to ted bude i pres sto) neni zrovna ukazkovym prikladem, jak delat rozhrani. Vlastne je to ukazkovy priklad, jak se to delat nema. Nejsmutnejsi na tom je, ze i kdyz ma WinAPI tolik volani a jeden by si rekl, ze to bude radost s takovym API programovat, tak ve skutecnosti psat proti cistemu WinAPI je neskutecne utrpeni.
Miloslav Ponkrác čas od času komentuje kvalitní posty, především programátorské.diky
Abclinuxu je z mého pohledu dnes asi nejkvalitnější rozšířenější web, co se týká sw a linuxu.s tim take absolutne souhlasim
Root už je dávno spíše politická korektnost a vzájemné plácání po ramenou. Není tam nic, co bych si tam přečetl. Články Tišnovského jsou pro mě zbytečné, protože pouze přepisují referenční příručky programovacích jazyků. Ty si mohu přečíst přímo, a mám to bez zkreslující omáčky pana Tišnovského.ano i ne. Jsem take toho nazoru, ze pan Tisnovsky vicemene prepisuje do cestiny 'aktualni stav techniky', ale ja to budto preletnu, nekdy si to vytisknu a ctu si to treba ve vlaku. Ty informace pak konfrontuji s jinymi zdroji. Podle mne to neni uplne zbytecna prace. Navic mam takovy pocit, ze pan Tisnovsky sleduje temi seriemi clanku nejaky vyssi cil - to bych se rad dovedel, zda za tim stoji RH, nebo v Brne na necem vyvijeji a pan Tisnovsky je takova 'hlasna trouba' <- to ted je mysleno pozitivne. Mam pocit, ze nejdrive se pripravovala puda temi redixy -> message brokery aby se ted konecne dostal k tem mikriservices, ktere to vsechno potrebuji. Ja tusim, ze pan Tisnovsky ma nejaky plan.
Na rootu byly nejzajímavější diskuse, kde se vždy někdo znalý objevil. To už zničili.s tim opet souhlas, navic to tak vidi rada lidi v te diskuzi na rootu. Proto jsem si rekl, ze kdyz budu mit cas, tak sem jako blog prepisu ty hlavni myslenky nejakeho aktualniho 'root-clanku' a pak je mozno o tom diskutovat zde. A dokonce si myslim, ze by se na tom mohlo podilet nas vice -> byla by to zajimava delba prace -> root by zaplatil autora a clanek by vydal a zde by se mohlo bez omezeni onem diskutovat
Ja tusim, ze pan Tisnovsky ma nejaky plan.A co vám brání se ho na to zeptat? Třeba by z toho bylo zajímavé interview. Fakt nechápu tu žabomyší averzi lidí kolem A versus B. Vypadá to jak dohady trosečníků, plující na jedné pidiloďce co mají strach aby se náhodou nezvrhli, když by si sedli k jednomu bortu. Protože na velkých lodích to vypadá úplně jinak.