Mizející data v listech u sdíleného excelovského sešitu



Zdravím, prosím o radu s následujícím. Jedná se o firemní síť.- Místo A (firemní pobočka A) – aplikační server, terminálový server, datové úložiště- Místo B (firemní pobočka B) – internet- Místo C (firemní pobočka C) – internet- Místo A a B jsou propojeny pomocí NanoBeam M5. Místo A využívá internet z místa B (skrze NanoBeam). - Místo A a C je propojeno přes VPN.V místě A se nachází sdílený excelovský sešit obsahující několik listů. Přístup k tomuto dokumentu mají pracovníci ze všech míst (A, B i C). A to buď přímo, nebo skrz terminál.Bohužel poslední dobou se stále častěji stává, že ve sdíleném excelovském sešitu dochází ke „zmizení“ obsahu některých listů. List zůstane v sešitu uložen, je zachován i jeho název, ale obsah úplně zmizí (list je prázdný) nebo dojde k částečnému odstranění dat z listu. Že by šlo o úmysl některého pracovníka, je vyloučeno.Napadlo mě, že by to mohlo být způsobeno např. krátkým výpadkem internetu, kdy uživatel soubor otevře, ale vzhledem k tomu, že došlo k výpadku internetu, se sešit nenačte celý, následně se připojení k inetu obnoví, a potom když uživatel sešit zavře a uloží, dojde k přepsání původního souboru nekompletním souborem a tím dojde ke zmizení dat v sešitu. Moc se mi to ale nezdá. Jednak si myslím, že by byl soubor poškozen víc a navíc jaká je pravděpodobnost, že by při otvírání sešitu (který se otevře během chvilky) zrovna dojde k výpadku inetu a to opakovaně?Ještě jedna věc – uživatelé zapisující do sešitu mají různé verze MS Office, ale používají i LibreOffice.Nevím jak zjistit, co to způsobuje. Nemáte nějaký nápad nebo vysvětlení?Díky.
No řekl bych, že všechno bude už XLSX. Nejsem si jistý, jestli se problém vyskytuje i u některého XLS. Ale na 100% to nevím. To bych ještě mohl zkusit. Díky za tip.![](/Client.Images/smileys/3.gif)
<p>to záleží na tom, zda máte obavy z odsouzení, nebo vyřizování pravděpodobné příčiny (v usa).</p><p>předpokládejme, že jste doma. spustíte vpn a připojíte se k poskytovateli vpn mimo lokalitu. pokud sleduji odchozí provoz (z vašeho domu), vím, že jste se právě připojili k určité ip adrese a že ip adresa je poskytovatel vpn. všechno uvnitř užitečného zatížení paketu je šifrováno.</p><p>poté se rozhodnete, když budete doma, zkontrolovat svůj e-mail. stává se, že sleduji odchozí provoz od poskytovatele vpn (který není šifrovaný). zaznamenávám to vše pomocí odfrknutí a spustím wireshark proti výstupu. vidím spojení s vaší e-mailovou adresou a napsaný e-mail. to může být chráněno ssl, pokud je to webmail. pokud se jedná o běžný e-mail, je to pravděpodobně prostý text. pokud to není prostý text, mohu se pokusit zachytit ho v přijímači. e-mail nemá žádný právní význam (tj. nepoužíváte jej k plánování něčeho nezákonného). všiml jsem si však skutečnosti, že zaměňujete použití jejich, tam a tam jsou. všimnu si také několika idiomů, které chcete použít.</p><p>během sledování odchozího provozu vidím, že váš účet psal několik e-mailů. zaznamenávám vzory překlepů a další postavy řeči. sbírám je po dobu jednoho měsíce nebo dvou.</p><p>potom jsem vložil položky, které si všimnu, do wireshark. přidávám několik věcí, o kterých je vám známo. pokaždé, když dojde k překlepu nebo použití idiomu (který používáte) najdete v obsahu jakéhokoli paketu, který vychází z vpn služby, kterou používáte, vidím to.</p><p>za další měsíc nebo dva mám spoustu datových bodů. některé jsou weby, na které jste šli, jiné ne. první věc, kterou udělám, je odstranění všech datových bodů, které opustily poskytovatele služeb vpn, když jste nebyli online (tj. neviděl jsem vás online z domova, nezapomeňte, že jsem začal sledováním tohoto připojení).</p><p>pak se podívám na zbývající provoz a uvidím, jestli mám nějaké body clusteru. spousta opakujících se témat. stejný předmět přes over. porovnávám to s vaším nešifrovaným provozem a vaším e-mailem.</p><p>neaplikoval jsem dostatek filtrů, abych tě izoloval od hluku (lidé, kteří používají stejné idiomy/pravopisné chyby jako ty), ale měl bych dobrý důvod pro pravděpodobnou příčinu. pokud mám dostatek referenčních bodů, je to jako otisk prstu.</p><p>v podstatě aplikuji bayesovskou analýzu na korpus práce, abych uvedl něco o pravděpodobnosti, že věřím, že příkladem bude člen souboru vytvořeného mým podezřelým. sbírka děl, která bych srovnávala, pochází z jakékoli práce, za kterou podezřelý veřejně uznal, že za ni odpovídá. tato analýza je dobře známa (a existuje i celá statistika stackexchange webu).</p><p>nechám tě odpovědět, s čím bych v tuto chvíli přišel?</p> Můžete zkopírovat seznam a vložit ho do jiného sešitu aplikace Excel. <p>příkaz <code>merge</code> má složitou syntaxi a ještě složitější implementaci, ale v zásadě jde o spojení dvou tabulek, filtrování dolů na řádky, které je třeba změnit (vložit, aktualizovat nebo smazat), a poté provést požadované změny. vzhledem k těmto vzorovým údajům:</p><pre><code>declare @categoryitem as table ( categoryid integer not null, itemid integer not null, primary key (categoryid, itemid), unique (itemid, categoryid) ); declare @datasource as table ( categoryid integer not null, itemid integer not null primary key (categoryid, itemid) ); insert @categoryitem (categoryid, itemid) values (1, 1), (1, 2), (1, 3), (2, 1), (2, 3), (3, 5), (3, 6), (4, 5); insert @datasource (categoryid, itemid) values (2, 2); </code></pre><p><strong> cíl </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 2 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 3 ║ ║ 3 ║ 5 ║ ║ 4 ║ 5 ║ ║ 3 ║ 6 ║ ╚════════════╩════════╝ </code></pre><p><strong> zdroj </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>požadovaným výsledkem je nahrazení dat v cíli daty ze zdroje, ale pouze pro <code>categoryid = 2</code>. po výše uvedeném popisu <code>merge</code> bychom měli napsat dotaz, který spojuje zdroj a cíl pouze na klíče, a filtrovat řádky pouze v klauzulích <code>when</code>:</p><pre><code>merge into @categoryitem as target using @datasource as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by source and target.categoryid = 2 then delete when not matched by target and source.categoryid = 2 then insert (categoryid, itemid) values (categoryid, itemid) output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>to dává následující výsledky:</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 2 ║ ║ 3 ║ 5 ║ ║ 3 ║ 6 ║ ║ 4 ║ 5 ║ ╚════════════╩════════╝ </code></pre><p>realizační plán je: <img src="https://i.stack.imgur.com/fovhu.jpg" alt="merge plan"></p><p>všimněte si, že jsou obě tabulky plně naskenovány. můžeme to považovat za neefektivní, protože pouze řádky, kde <code>categoryid = 2</code> bude ovlivněno v cílové tabulce. zde přicházejí varování v books online. jeden chybný pokus o optimalizaci, aby se dotkl pouze nezbytných řádků v cíli, je:</p><pre><code>merge into @categoryitem as target using ( select categoryid, itemid from @datasource as ds where categoryid = 2 ) as source on source.itemid = target.itemid and target.categoryid = 2 when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>logika v klauzuli <code>on</code> je použita jako součást spojení. v tomto případě je spojení úplným vnějším spojením (viz <a href="http://technet.microsoft.com/en-us/library/bb522522%28v=sql.105%29.aspx">tento záznam books online</a> proč). použití kontroly kategorie 2 na cílových řádcích jako součásti vnějšího spojení nakonec povede k odstranění řádků s jinou hodnotou (protože neodpovídají zdroji):</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 1 ║ 1 ║ ║ delete ║ 1 ║ 2 ║ ║ delete ║ 1 ║ 3 ║ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ║ delete ║ 3 ║ 5 ║ ║ delete ║ 3 ║ 6 ║ ║ delete ║ 4 ║ 5 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>kořenová příčina je ze stejného důvodu, proč se predikáty chovají v klauzuli vnější spojení <code>on</code> odlišně, než když jsou specifikovány v klauzuli <code>where</code>. syntaxe <code>merge</code> (a implementace spojení v závislosti na zadaných klauzulích) jen ztěžují vidět, že tomu tak je.</p><p> <a href="http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx">navádění v books online</a> (rozšířeno v položce <a href="http://technet.microsoft.com/en-us/library/cc879317%28v=sql.105%29.aspx">optimizing performance</a> ) nabízí navádění, které zajistí, že správná sémantika je vyjádřena pomocí syntaxe <code>merge</code>, aniž by uživatel nutně musel muset pochopit všechny podrobnosti implementace nebo zohlednit způsoby, kterými by optimalizátor mohl legitimně přeskupit věci z důvodů efektivnosti provádění.</p><p>dokumentace nabízí tři možné způsoby implementace časného filtrování:</p><p><strong> zadání podmínky filtrování v klauzuli <code>when</code> </strong> zaručuje správné výsledky, ale může znamenat, že více řádků je čteno a zpracováno ze zdroje a cíle tabulky, než je nezbytně nutné (viz první příklad).</p><p><strong> aktualizace prostřednictvím zobrazení </strong>, která obsahuje podmínku filtrování, také zaručuje správné výsledky (protože změněné řádky musí být přístupné pro aktualizaci prostřednictvím zobrazení), ale vyžaduje to vyhrazené zobrazení, které splňuje liché podmínky pro aktualizaci zobrazení.</p><p><strong> použití společného výrazu tabulky </strong> přináší podobné riziko při přidávání predikátů k klauzuli <code>on</code>, ale z poněkud odlišných důvodů. v mnoha případech to bude bezpečné, ale vyžaduje to odbornou analýzu prováděcího plánu, aby se to potvrdilo (a rozsáhlé praktické testování). například:</p><pre><code>with target as ( select * from @categoryitem where categoryid = 2 ) merge into target using ( select categoryid, itemid from @datasource where categoryid = 2 ) as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>výsledkem jsou správné výsledky (neopakované) s optimálnějším plánem:</p><p><img src="https://i.stack.imgur.com/tazmk.jpg" alt="merge plan 2"></p><p>plán čte pouze řádky pro kategorii 2 z cílové tabulky. to může být důležitým hlediskem výkonu, pokud je cílová tabulka velká, ale je příliš snadné tuto chybu získat pomocí syntaxe <code>merge</code>.</p><p>někdy je snazší zapsat <code>merge</code> jako samostatné operace dml. tento přístup může dokonce <strong> vést lépe </strong> než jediný <code>merge</code>, což je skutečnost, která lidi často překvapuje.</p><pre><code>delete ci from @categoryitem as ci where ci.categoryid = 2 and not exists ( select 1 from @datasource as ds where ds.itemid = ci.itemid and ds.categoryid = ci.categoryid ); insert @categoryitem select ds.categoryid, ds.itemid from @datasource as ds where ds.categoryid = 2; </code></pre> Je to rozbité, už několik měsíců. Nikdo neví, kdy to bude spravené.


Posílání na e-mail si můžete vypnout v nastavení, pokud vás to obtěžuje. protože používáte WinForms aplikaci, pokud je to v NET 2.0 je to vlastně systém uživatelských nastavení (tzv Properties), který je navržen pro tento účel. [Tento článek na webu MSDN](http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx) má docela dobrý úvod do této


Pokud jste stále obavy o výkonu pak se podívat na [SQL Compact Edition](http://www.microsoft.com/sql/editions/compact/default.mspx) , který je podobný SQLite, ale je dar společnosti Microsoft, který jsem našel hraje velmi pěkně s WinForms a je tu i možnost [, aby to fungovalo s LINQ](http://geekswithblogs.net/steveclements/archive/2007/11/13/LINQ-to-SQL.compact.aspx) Toto se mi stalo jednou, když jsem na mobilu měl slabý signál internetu (nebo alespoň si to tak vysvětluji). Později bylo vše v pořádku. <p>ach bože, myslím, že problém pramení ze smíchání schématu mysql různých verzí mysql. nejprve spusťte tento dotaz:</p><pre><code>desc mysql.user; </code></pre><p>pro mysql 5.6 získáte 43 sloupců</p><pre><code>mysql&gt; desc mysql.user; +++++++ | field | type | null | key | default | extra | +++++++ | host | char(60) | no | pri | | | | user | char(16) | no | pri | | | | password | char(41) | no | | | | | select\_priv | enum('n','y') | no | | n | | | insert\_priv | enum('n','y') | no | | n | | | update\_priv | enum('n','y') | no | | n | | | delete\_priv | enum('n','y') | no | | n | | | create\_priv | enum('n','y') | no | | n | | | drop\_priv | enum('n','y') | no | | n | | | reload\_priv | enum('n','y') | no | | n | | | shutdown\_priv | enum('n','y') | no | | n | | | process\_priv | enum('n','y') | no | | n | | | file\_priv | enum('n','y') | no | | n | | | grant\_priv | enum('n','y') | no | | n | | | references\_priv | enum('n','y') | no | | n | | | index\_priv | enum('n','y') | no | | n | | | alter\_priv | enum('n','y') | no | | n | | | show\_db\_priv | enum('n','y') | no | | n | | | super\_priv | enum('n','y') | no | | n | | | create\_tmp\_table\_priv | enum('n','y') | no | | n | | | lock\_tables\_priv | enum('n','y') | no | | n | | | execute\_priv | enum('n','y') | no | | n | | | repl\_slave\_priv | enum('n','y') | no | | n | | | repl\_client\_priv | enum('n','y') | no | | n | | | create\_view\_priv | enum('n','y') | no | | n | | | show\_view\_priv | enum('n','y') | no | | n | | | create\_routine\_priv | enum('n','y') | no | | n | | | alter\_routine\_priv | enum('n','y') | no | | n | | | create\_user\_priv | enum('n','y') | no | | n | | | event\_priv | enum('n','y') | no | | n | | | trigger\_priv | enum('n','y') | no | | n | | | create\_tablespace\_priv | enum('n','y') | no | | n | | | ssl\_type | enum('','any','x509','specified') | no | | | | | ssl\_cipher | blob | no | | null | | | x509\_issuer | blob | no | | null | | | x509\_subject | blob | no | | null | | | max\_questions | int(11) unsigned | no | | 0 | | | max\_updates | int(11) unsigned | no | | 0 | | | max\_connections | int(11) unsigned | no | | 0 | | | max\_user\_connections | int(11) unsigned | no | | 0 | | | plugin | char(64) | yes | | | | | authentication\_string | text | yes | | null | | | password\_expired | enum('n','y') | no | | n | | +++++++ 43 rows in set (0.15 sec) </code></pre><p>pro mysql 5.5 získáte 42 sloupců</p><pre><code>mysql&gt; desc mysql.user; +++++++ | field | type | null | key | default | extra | +++++++ | host | char(60) | no | pri | | | | user | char(16) | no | pri | | | | password | char(41) | no | | | | | select\_priv | enum('n','y') | no | | n | | | insert\_priv | enum('n','y') | no | | n | | | update\_priv | enum('n','y') | no | | n | | | delete\_priv | enum('n','y') | no | | n | | | create\_priv | enum('n','y') | no | | n | | | drop\_priv | enum('n','y') | no | | n | | | reload\_priv | enum('n','y') | no | | n | | | shutdown\_priv | enum('n','y') | no | | n | | | process\_priv | enum('n','y') | no | | n | | | file\_priv | enum('n','y') | no | | n | | | grant\_priv | enum('n','y') | no | | n | | | references\_priv | enum('n','y') | no | | n | | | index\_priv | enum('n','y') | no | | n | | | alter\_priv | enum('n','y') | no | | n | | | show\_db\_priv | enum('n','y') | no | | n | | | super\_priv | enum('n','y') | no | | n | | | create\_tmp\_table\_priv | enum('n','y') | no | | n | | | lock\_tables\_priv | enum('n','y') | no | | n | | | execute\_priv | enum('n','y') | no | | n | | | repl\_slave\_priv | enum('n','y') | no | | n | | | repl\_client\_priv | enum('n','y') | no | | n | | | create\_view\_priv | enum('n','y') | no | | n | | | show\_view\_priv | enum('n','y') | no | | n | | | create\_routine\_priv | enum('n','y') | no | | n | | | alter\_routine\_priv | enum('n','y') | no | | n | | | create\_user\_priv | enum('n','y') | no | | n | | | event\_priv | enum('n','y') | no | | n | | | trigger\_priv | enum('n','y') | no | | n | | | create\_tablespace\_priv | enum('n','y') | no | | n | | | ssl\_type | enum('','any','x509','specified') | no | | | | | ssl\_cipher | blob | no | | null | | | x509\_issuer | blob | no | | null | | | x509\_subject | blob | no | | null | | | max\_questions | int(11) unsigned | no | | 0 | | | max\_updates | int(11) unsigned | no | | 0 | | | max\_connections | int(11) unsigned | no | | 0 | | | max\_user\_connections | int(11) unsigned | no | | 0 | | | plugin | char(64) | yes | | | | | authentication\_string | text | yes | | null | | +++++++ 42 rows in set (0.01 sec) mysql&gt; </code></pre><p>pro mysql 5.1 získáte 39 sloupců</p><pre><code>mysql&gt; desc mysql.user; +++++++ | field | type | null | key | default | extra | +++++++ | host | char(60) | no | pri | | | | user | char(16) | no | pri | | | | password | char(41) | no | | | | | select\_priv | enum('n','y') | no | | n | | | insert\_priv | enum('n','y') | no | | n | | | update\_priv | enum('n','y') | no | | n | | | delete\_priv | enum('n','y') | no | | n | | | create\_priv | enum('n','y') | no | | n | | | drop\_priv | enum('n','y') | no | | n | | | reload\_priv | enum('n','y') | no | | n | | | shutdown\_priv | enum('n','y') | no | | n | | | process\_priv | enum('n','y') | no | | n | | | file\_priv | enum('n','y') | no | | n | | | grant\_priv | enum('n','y') | no | | n | | | references\_priv | enum('n','y') | no | | n | | | index\_priv | enum('n','y') | no | | n | | | alter\_priv | enum('n','y') | no | | n | | | show\_db\_priv | enum('n','y') | no | | n | | | super\_priv | enum('n','y') | no | | n | | | create\_tmp\_table\_priv | enum('n','y') | no | | n | | | lock\_tables\_priv | enum('n','y') | no | | n | | | execute\_priv | enum('n','y') | no | | n | | | repl\_slave\_priv | enum('n','y') | no | | n | | | repl\_client\_priv | enum('n','y') | no | | n | | | create\_view\_priv | enum('n','y') | no | | n | | | show\_view\_priv | enum('n','y') | no | | n | | | create\_routine\_priv | enum('n','y') | no | | n | | | alter\_routine\_priv | enum('n','y') | no | | n | | | create\_user\_priv | enum('n','y') | no | | n | | | event\_priv | enum('n','y') | no | | n | | | trigger\_priv | enum('n','y') | no | | n | | | ssl\_type | enum('','any','x509','specified') | no | | | | | ssl\_cipher | blob | no | | null | | | x509\_issuer | blob | no | | null | | | x509\_subject | blob | no | | null | | | max\_questions | int(11) unsigned | no | | 0 | | | max\_updates | int(11) unsigned | no | | 0 | | | max\_connections | int(11) unsigned | no | | 0 | | | max\_user\_connections | int(11) unsigned | no | | 0 | | +++++++ 39 rows in set (0.00 sec) mysql&gt; </code></pre><p>pro mysql 5.0 získáte 37 sloupců</p><pre><code>mysql&gt; desc mysql.user; +++++++ | field | type | null | key | default | extra | +++++++ | host | char(60) | no | pri | | | | user | char(16) | no | pri | | | | password | char(41) | no | | | | | select\_priv | enum('n','y') | no | | n | | | insert\_priv | enum('n','y') | no | | n | | | update\_priv | enum('n','y') | no | | n | | | delete\_priv | enum('n','y') | no | | n | | | create\_priv | enum('n','y') | no | | n | | | drop\_priv | enum('n','y') | no | | n | | | reload\_priv | enum('n','y') | no | | n | | | shutdown\_priv | enum('n','y') | no | | n | | | process\_priv | enum('n','y') | no | | n | | | file\_priv | enum('n','y') | no | | n | | | grant\_priv | enum('n','y') | no | | n | | | references\_priv | enum('n','y') | no | | n | | | index\_priv | enum('n','y') | no | | n | | | alter\_priv | enum('n','y') | no | | n | | | show\_db\_priv | enum('n','y') | no | | n | | | super\_priv | enum('n','y') | no | | n | | | create\_tmp\_table\_priv | enum('n','y') | no | | n | | | lock\_tables\_priv | enum('n','y') | no | | n | | | execute\_priv | enum('n','y') | no | | n | | | repl\_slave\_priv | enum('n','y') | no | | n | | | repl\_client\_priv | enum('n','y') | no | | n | | | create\_view\_priv | enum('n','y') | no | | n | | | show\_view\_priv | enum('n','y') | no | | n | | | create\_routine\_priv | enum('n','y') | no | | n | | | alter\_routine\_priv | enum('n','y') | no | | n | | | create\_user\_priv | enum('n','y') | no | | n | | | ssl\_type | enum('','any','x509','specified') | no | | | | | ssl\_cipher | blob | no | | null | | | x509\_issuer | blob | no | | null | | | x509\_subject | blob | no | | null | | | max\_questions | int(11) unsigned | no | | 0 | | | max\_updates | int(11) unsigned | no | | 0 | | | max\_connections | int(11) unsigned | no | | 0 | | | max\_user\_connections | int(11) unsigned | no | | 0 | | +++++++ 37 rows in set (0.01 sec) mysql&gt; </code></pre><p>pro mysql 4.x získáte 31 sloupců</p><pre><code>mysql&gt; desc mysql.user; +++++++ | field | type | null | key | default | extra | +++++++ | host | varchar(60) binary | | pri | | | | user | varchar(16) binary | | pri | | | | password | varchar(16) binary | | | | | | select\_priv | enum('n','y') | | | n | | | insert\_priv | enum('n','y') | | | n | | | update\_priv | enum('n','y') | | | n | | | delete\_priv | enum('n','y') | | | n | | | create\_priv | enum('n','y') | | | n | | | drop\_priv | enum('n','y') | | | n | | | reload\_priv | enum('n','y') | | | n | | | shutdown\_priv | enum('n','y') | | | n | | | process\_priv | enum('n','y') | | | n | | | file\_priv | enum('n','y') | | | n | | | grant\_priv | enum('n','y') | | | n | | | references\_priv | enum('n','y') | | | n | | | index\_priv | enum('n','y') | | | n | | | alter\_priv | enum('n','y') | | | n | | | show\_db\_priv | enum('n','y') | | | n | | | super\_priv | enum('n','y') | | | n | | | create\_tmp\_table\_priv | enum('n','y') | | | n | | | lock\_tables\_priv | enum('n','y') | | | n | | | execute\_priv | enum('n','y') | | | n | | | repl\_slave\_priv | enum('n','y') | | | n | | | repl\_client\_priv | enum('n','y') | | | n | | | ssl\_type | enum('','any','x509','specified') | | | | | | ssl\_cipher | blob | | | | | | x509\_issuer | blob | | | | | | x509\_subject | blob | | | | | | max\_questions | int(11) unsigned | | | 0 | | | max\_updates | int(11) unsigned | | | 0 | | | max\_connections | int(11) unsigned | | | 0 | | +++++++ 31 rows in set (0.01 sec) </code></pre><p>představte si tento scénář:</p><ul> <li>nainstalujete 5.0</li> <li>odinstalujete 5.0</li> <li>zapomněli jste se přesunout/var/lib/mysql z cesty</li> <li>nainstalujete 5.1</li> </ul><p>uživatelská oprávnění se začnou posouvat. kdykoli spustíte <code>show grants;</code>, je obtížné očekávat sloupce na specifických místech v mysql.user (vzhledem k tomu, že mysql.user je myisam a jeho row\_format je dynamic (výchozí)). je velmi snadné vidět, jak uživatel náhle ztratí oprávnění, když znovu načtete verzi mysql 5.0 mysql.user do instance mysql 5.1.</p><p>v budoucnu, pokud byste se někdy rozhodli znovu načíst uživatele do mysql, zkuste uživatele výpisem do textového souboru pomocí <a href="http://www.percona.com/doc/percona-toolkit/2.0/pt-show-grants.html"><strong> pt-show-grantů </strong></a> spíše než mysqldump.</p><p>vlastně jsem psal svou vlastní verzi pt-show-grantů takto:</p><pre><code>mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -a -e"select concat('show grants for ''',user,'''@''',host,''';') from mysql.user where user&lt;&gt;''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -a | sed 's/$/;/g' &gt; mysqlusergrants.sql </code></pre><p>tím vzniknou všechny uživatelské granty jako sql, což je mnohem přenosnější než standardní techniky mysql. jednoduše znovu načtěte skript sql a provedou se granty. samozřejmě, že takové překládky jsou kompatibilní pouze dopředu, nikdy zpět.</p> Takže jste se ptali, jak zvládnout práci na násobku „úkolů“ najednou, ne? S výjimkou větvení.


Můžete mít více checkouts ze zdroje na lokálním počítači, suffixing název adresáře s názvem lístku, na kterém pracujete. Jen se ujistěte, aby se změny ve správném adresáři, v závislosti na úkolu ...


Směšování více úkolů v jedné pracovní kopii / commit může být velmi matoucí, zvláště pokud někdo potřebuje, aby svou práci zkontrolovat později. <p>citovat jedno ze studií jakoba nielsona o <a href="http://www.useit.com/alertbox/scrolling-attention.html">rolovací chování</a> :</p><blockquote> <p>dnes se uživatelé budou posouvat. neměli byste však ignorovat záhyb a vytvářet nekonečné stránky ze dvou důvodů:</p> <ul> <li>dlouhé stránky jsou i nadále problematické kvůli omezenému rozsahu pozornosti uživatelů. lidé dávají přednost webům, které se dostanou k věci a nechají je, aby dělaly věci rychle. kromě základní neochoty číst více slov, rolování je práce navíc.</li> <li>nemovitost nad záhybem stránky je cennější než věci pod hranicí<br> násobek pro přilákání a udržení pozornosti uživatelů.</li> </ul> <p>takže, ano, můžete dát informace pod záhyb, spíše než se omezit na kousnutí stránek.</p> </blockquote><p>chcete-li přidat k tomu, co nielson napsal, uveďte své nejdůležitější informace a nejlepší nabídku. <strong> ponechte svou primární výzvu k akci nad záhybem. </strong> rozpětí pozornosti je na webu krátké a je nejlepší, abyste svůj bod upřesnili a učinili jej dříve než později.</p><p>pokud chcete, aby uživatelé pokračovali ve čtení, usnadněte jim to. rozdělte své stránky nadpisy, grafikou a odrážkami. <strong> usnadněte si pochopení klíčových bodů. </strong> někteří uživatelé mohou pouze skenovat, ale ujistěte se, že dokážou získat vše, co z vaší stránky potřebují, když si přečtou vaše titulky, vytáhněte uvozovky a tučné písmo, s možností jít hlouběji čtením každého slova. pomáhá také vložit do záhybu nějaký obsah, aby uživatel viděl jeho část, ale zbytek bude muset posouvat dolů.</p><p>kde je záhyb? <a href="http://www.boxesandarrows.com/view/blasting-the-myth-of">je to všude</a> a se zvýšeným využíváním mobilních zařízení se to bude jen rozšiřovat. budete muset <strong> velmi pečlivě zvážit své cílové publikum </strong> a provést úpravy na základě vlastní analýzy.</p> <p>rozhodně žijete ve smyslu falešné bezpečnosti! sociální inženýrství je dnes stále velmi rozšířené a pochybuji, že se to v průběhu desítek let změní, pokud vůbec.</p><p>zde je několik stručných vysvětlení, proč funguje sociální inženýrství. je těžké pokrýt vše, protože sociální inženýrství je opravdu široké pole.</p><p>některé důvody, proč funguje sociální inženýrství (z knihy citované dole):</p><ul> <li>většina lidí si přeje být zdvořilý, zejména k cizincům</li> <li>profesionálové chtějí vypadat dobře informovaní a inteligentní</li> <li>pokud jste chváleni, budete často mluvit více a prozradit více</li> <li>většina lidí by nelhala kvůli lhaní</li> <li>většina lidí laskavě reaguje na lidi, kteří se zdají být znepokojeni</li> </ul><p><strong> být užitečný </strong></p><p>lidé si obvykle chtějí navzájem pomáhat. rád děláme hezké věci!</p><ul> <li> <p>narazil jsem na recepci ve velké firemní kanceláři s papíry namočenými v kávě. mluvím s recepční a vysvětlím, že mám schůzku na pracovní pohovor za 5 minut, ale právě jsem rozlil kávu na všechny své papíry. pak se zeptám, jestli by recepční mohl být tak sladký, a vytisknout je znovu pro mě s touto usb pamětí, kterou mám.</p> <p>mohlo by to vést ke skutečné infekci pc recepční a mohlo by mi to získat oporu v síti.</p> </li> </ul><p><strong> používání strachu </strong></p><p>strach z neúspěchu nebo nedělání podle pokynů:</p><ul> <li> <p>facebooková stránka ředitele společnosti (john smith) (nebo jakýkoli jiný zdroj informací) ukazuje, že právě odjel na plavbu po dobu 3 týdnů. zavolám sekretářce a velícím hlasem říkám: „ahoj, volá chris. právě jsem opustil telefon s johnem smithem, má velmi dobrý čas na své plavbě se svou ženou carlou a dětmi. nicméně jsme v uprostřed integrace velmi důležitého obchodního systému, a řekl mi, abych vám zavolal, abyste nám mohli pomoci. nemohl volat sám sebe, protože jde o safari, ale to je opravdu naléhavé. vše, co musíte udělat, je vzít usb flash disk, který mu je zaslán v poště a zapojen, spusťte počítač a my jsme hotovi. projekt přežije!</p> <p>děkuji mnohokrát! byla jste skvělá pomoc! jsem si jistý, že vás john smith uzná za tento čin vstřícnosti. "</p> </li> </ul><p><strong> <a href="http://en.wikipedia.org/wiki/norm\_of\_reciprocity">hra na reciproci</a> </strong></p><ul> <li> <p>dveře zavazadlového prostoru. zadržuji pro vás vstupní dveře a rychle za tebou chodím. když otevřete další dveře, což je zabezpečené zabezpečení, zamířím stejným směrem a většina lidí se pokusí splácet užitečnou akci tím, že pro vás dveře opět podrží, čímž se dostanete na místo, kde byste neměli být. bojíte se, že vás chytí? ne. jen říkáš, že je ti líto a že jsi šel špatně.</p> <p>cíl by se téměř cítil povinen držet dveře za vás!</p> </li> </ul><p><strong> využití zvědavosti </strong></p><ul> <li> <p>zkuste hodit 10 usb flash disků na různá místa ve vaší organizaci. nemusíte je umisťovat na příliš zjevná místa. usb by mělo mít automaticky spuštěný domácí program telefonu, abyste viděli, kdy někdo připojí usb flash disk a měl by být teoreticky využit.</p> <p>další verzí tohoto je vyhodit usb flash disky s jediným dokumentem pdf, který se nazývá např. „john smith - norway.pdf“. dokument pdf obsahuje exploat adobe acrobat reader (existuje spousta a poté, co uživatel klikne na dokument, který bude vlastnit. samozřejmě jste se ujistili, že je zneužití přizpůsobeno konkrétní verzi adobe cílové organizace. bude pro většinu lidí přirozené otevřít dokument, aby mohli zkuste usb disk vrátit jeho vlastníkovi.</p> <ul> <li>dalším příkladem zvědavosti (možná jiný termín to vysvětluje lépe) jsou všechny tyto spam maily nebo špatné internetové reklamy, že jste něco vyhráli nebo nigerijský princ vám nabízí spoustu peněz, pokud mu můžete pomoci. jsem si jist, že jste s nimi již obeznámeni, ale jedná se také o útoky na sociální inženýrství a důvod, proč se nezastavili, je, že stále fungují!</li> </ul> </li> </ul><p>to je jen několik příkladů. samozřejmě existuje spousta tun!</p><p>můžeme se také podívat na historické události sociálního inženýrství:</p><p><strong> hbgary </strong></p><p>celý příběh si můžete přečíst <a href="http://arstechnica.com/tech-policy/news/2011/02/anonymous-speaks-the-inside-story-of-the-hbgary-hack.ars/">zde</a> (strana 3 obsahuje část sociálního inženýrství)</p><ul> <li> <p>v loňském roce byl hbgary hacknut. tento útok zahrnoval mnoho různých kroků, ale také aspekt sociálního inženýrství. hacker v krátkosti vyprávěl e-mailový účet společnosti vip) ve společnosti a poslal e-mail administrátorovi cílového systému, který řekl něco podobného: „ahoj johne, v současné době jsem v evropě a poskakuji mezi letišti. můžete mi otevřít ssh na vysoce číslovaném portu pocházejícím z jakékoli ip? potřebuji udělat nějakou práci. “když administrátor dostane tento e-mail, cítí, že je přirozené vyhovět tomuto, když e-mail pochází z důvěryhodného zdroje.</p> <p>ale to není ono! útočník měl heslo k účtu, ale přihlášení nefungovalo! takže pošle e-mailem zpět administrátorovi: „hej znovu, zdá se, že to nefunguje. heslo je stále správné? jaké bylo uživatelské jméno znovu?“. nyní také poskytl skutečné heslo pro systém (útočník to měl z dřívějšího kompromisu jiného systému ve stejném hacku), což útočníkovi poskytlo mnohem větší důvěru správce. správce samozřejmě souhlasí a sdělí útočníkovi své uživatelské jméno.</p> </li> </ul><p>seznam nahoře pochází z knihy " <a href="http://rads.stackoverflow.com/amzn/click/0470639539">sociální inženýrství: umění lidského hackování</a> " a mohu ho velmi doporučit!</p>