Wann setzt man do , does und did ein?
1. *do* als Vollverb


 **1.1. *do* als Vollverb im *Simple Present* *(do, does, don't, doesn't) -*** *GEGENWART*


Beispielsätze mit **do, does, don’t, doesn’t:**


I **do** my homework. (*Bejahrter Satz*)


I **do** **not** **do** my homework. (*Verneinter Satz*)


**Do** I **do** my homework? (*Frage)*


He **does** his homework. (*Bejahrter Satz*)


He **does not** **do** his homework. (*Verneinter Satz*)


**Does** he **do** his homework? (*Frage*)


 **1.2. *do* als Vollverb im Simple Past *(did, didn't) -*** *EINFACHE VERGANGENHEIT*


Beispielsätze mit **did, didn’t:**


She **did** her homework. (*Bejahrter Satz*)


She **did not** **do** her homework. (*Verneinter Satz*)


**Did** she **do** her homework? (*Frage*)


Ich hoffe ich konnte dir mit dieser vereinfachten Übersicht weiterhelfen.


Liebe Grüße 


Cadi 🌸
ja klar kann man das. 
hab ich auch gemacht. <h2>es kommt darauf an ™</h2><p>die fähigkeit, einen oder mehrere cursor zu umgehen, hängt davon ab, was in diesem cursor ausgeführt wird. ohne zu wissen, was darin vor sich geht, gibt es keine möglichkeit zu sagen. es kann sein, dass es keine problemumgehung gibt und sie eine zeilenweise verarbeitung durchführen müssen.</p><p>nachfolgend einige beispiele.</p><h2>funktioniert nicht in sets</h2><p>dieses beispiel ist das grundlegendste und ist einfach die tatsache, dass sie ihr gesamtes dataset oder teile ihres datasets auf einmal abfragen können, aber der cursor wurde erstellt und fragt die daten zeilenweise ab. übliche, durch die dies ersetzt werden kann, sind <code>join</code>, <code>cross apply</code>/<code>outer apply</code> und andere.</p><p><strong> betrachten sie den folgenden datensatz: </strong></p><pre><code>create table dbo.lotr(lotrid int, charactername varchar(255), val varchar(255)); create table dbo.lotrattributes(lotrattributeid int, lotrid int, attrval varchar(255)); insert into dbo.lotr(lotrid,charactername,val) values(1,'frodo','ring') ,(2,'gandalf','staff'); insert into dbo.lotrattributes(lotrid,lotrattributeid,attrval) values(1,1,'ringattribute1') ,(1,2,'ringattribute2') ,(1,3,'ringattribute3') ,(2,4,'staffattribute1') ,(2,5,'staffattribute2'); </code></pre><p>man könnte versuchen, jeden datensatz zu finden, und er stimmt separat überein, indem man die tabelle <code>lotr</code> durchläuft.</p><p><strong> cursor: </strong></p><pre><code>declare @lotrid int declare c cursor for select lotrid from dbo.lotr; open c fetch next from c into @lotrid; while @@fetch\_status = 0 begin select lotrattributeid from dbo.lotrattributes where lotrid = @lotrid; fetch next from c into @lotrid; end close c deallocate c </code></pre><p><strong> das ergebnis sind zwei ergebnismengen </strong></p><pre><code>lotrattributeid 1 2 3 lotrattributeid 4 5 </code></pre><p><strong> wenn dieses <code>inner join</code> verwendet wird, erhalten wir das gleiche ergebnis wie eine ergebnismenge. </strong></p><pre><code>select lotrattributeid from dbo.lotr l inner join dbo.lotrattributes la on l.lotrid = la.lotrid; lotrattributeid 1 2 3 4 5 </code></pre><hr><h2>string-manipulation</h2><p>häufig wird <code>for xml path('')</code> verwendet, um zeichenfolgenmanipulationen innerhalb von cursorn zu ersetzen.</p><p><strong> datensatz </strong></p><pre><code>create table dbo.lotr(lotrid int, charactername varchar(255), val varchar(255)); create table dbo.lotrattributes(lotrattributeid int, lotrid int, attrval varchar(255)); insert into dbo.lotr(lotrid,charactername,val) values(1,'frodo','ring'); insert into dbo.lotrattributes(lotrid,lotrattributeid,attrval) values(1,1,'ringattribute1') ,(1,2,'ringattribute2') ,(1,3,'ringattribute3'); </code></pre><p><strong> doppelcursor mit string-manipulation </strong></p><pre><code>declare @lotrid int, @charactername varchar(255), @val varchar(255) declare @lotrattributeid int, @attrval varchar(255) declare c cursor for select lotrid,charactername, val from dbo.lotr open c fetch next from c into @lotrid,@charactername,@val while @@fetch\_status = 0 begin set @charactername +='|'+ @val declare d cursor for select lotrattributeid, attrval from dbo.lotrattributes where lotrid = @lotrid open d fetch next from d into @lotrattributeid,@attrval while @@fetch\_status = 0 begin set @charactername +='['+@attrval+ '],' fetch next from d into @lotrattributeid,@attrval end close d deallocate d fetch next from c into @lotrid,@charactername,@val end close c deallocate c select left(@charactername,len(@charactername)-1); </code></pre><p><strong> ergebnis </strong></p><pre><code>(no column name) frodo|ring[ringattribute1],[ringattribute2],[ringattribute3], </code></pre><p><strong> entfernen der cursor mit for xml path ('') </strong></p><pre><code>select l.charactername +'|'+ l.val + (select stuff((select ','+quotename(attrval) from dbo.lotrattributes la where la.lotrid = l.lotrid for xml path('')), 1, 1, '')) from dbo.lotr l; </code></pre><h2>* *</h2><p>die eigentliche problemumgehung besteht darin, herauszufinden, warum die daten auf diese weise dargestellt werden, und die anwendung zu ändern, um sie nicht in diesem format zu benötigen, und sie irgendwo zu speichern.</p><p>wenn ihre hände gebunden sind, wäre dies das nächstbeste.</p><hr><h2>fügen sie die top-10-werte in eine temporäre tabelle ein, basierend auf den ids in einer anderen tabelle</h2><p><strong> daten </strong></p><p>create table dbo.sometable (inserttableid int, val varchar (255)); create table dbo.top10table (top10tableid int, inserttableid int, val varchar (255));</p><pre><code>insert into dbo.sometable(inserttableid,val) values(1,'bla') ,(2,'blabla'); insert into dbo.top10table(top10tableid,inserttableid,val) values(1,1,'wuw') ,(2,1,'wuw') ,(3,1,'wuw'); </code></pre><p><strong> cursor </strong></p><pre><code>create table #top10values(top10tableid int, inserttableid int, val varchar(255)) declare @inserttableid int; declare c cursor for select inserttableid from dbo.sometable; open c fetch next from c into @inserttableid; while @@fetch\_status =0 begin insert into #top10values(top10tableid,inserttableid,val) select top(10) top10tableid,inserttableid,val from dbo.top10table where inserttableid = @inserttableid order by top10tableid fetch next from c into @inserttableid; end close c deallocate c select * from #top10values; drop table #top10values; </code></pre><p><strong> ergebnis </strong></p><pre><code>top10tableid inserttableid val 1 1 wuw 2 1 wuw 3 1 wuw </code></pre><p><strong> ersetzen des cursors durch <code>cross apply</code> und ein <code>cte</code> </strong></p><pre><code>create table #top10values(top10tableid int, inserttableid int, val varchar(255)); ;with cte as ( select inserttableid from dbo.sometable ) insert into #top10values(top10tableid,inserttableid,val) select t1t.top10tableid,t1t.inserttableid,t1t.val from cte cross apply (select top (10) top10tableid,inserttableid,val from dbo.top10table t1t where t1t.inserttableid = cte.inserttableid ) t1t ; select * from #top10values; drop table #top10values; </code></pre><hr><h2>andere beispiele</h2><ul> <li>ein beispiel zum ersetzen eines cursors zur auswahl eines dynamischen satzes von artikeln pro lieferant mithilfe von <code>cross apply</code> <a href="https://dba.stackexchange.com/questions/100761/replacing-a-cursor-with-a-single-query-possible">hier</a> .</li> <li>ein beispiel für die verwendung von fensterfunktionen zum ersetzen eines cursors <a href="https://dba.stackexchange.com/questions/127083/improve-a-query-using-cursor-to-set-based-approach">hier</a> .</li> </ul><hr><p><strong> manchmal gibt es keine andere wahl </strong></p><p>wenn sie nicht in sätzen arbeiten können und zeilenweise arbeiten müssen, können sie den cursor trotzdem optimieren.</p><p>eine der größten änderungen bei der beschleunigung des cursors ist das hinzufügen von <code>local fast\_forward</code>.</p><pre><code>declare c cursor local fast\_forward for select lotrid from dbo.lotr </code></pre><p>schauen sie sich <a href="https://sqlperformance.com/2012/09/t-sql-queries/cursor-options">diesen blogpost</a> von @aaronbertrand an, wo er die möglichen leistungsunterschiede erklärt, wenn cursoreinstellungen wie <code>local</code> &amp; <code>fast\_forward</code> verwenden oder nicht.</p> Aloha :)


Ich hoffe, dass ich den Aufbau der Determinante richtig verstanden habe. Um die Idee zu verdeutlichen, schreibe ich die ersten 4 Fälle einfach mal auf:


Bei \(n=1\) ist nicht viel zu tun:$$D\_1=\left|\begin{array}{c}1\end{array}\right|=1$$


Bei \(n=2\) addiere ich Zeile 1 zu Zeile 2 und ziehe danach aus Zeile 2 den Faktor vor die Determinante:$$D\_2=\left|\begin{array}{c}1 & 1\\-1 & 1\end{array}\right|=\left|\begin{array}{c}1 & 1\\0 & 2\end{array}\right|=2\cdot\left|\begin{array}{c}1 & 1\\0 & 1\end{array}\right|=2$$
  



Bei \(n=3\) addiere ich Zeile 1 zu Zeile 2 und ziehe danach aus Zeile 2 den Faktor vor die Determinante:$$D\_3=\left|\begin{array}{c}1 & 1 & 0\\-1 & 1 & 4\\0 & -1 & 1\end{array}\right|=\left|\begin{array}{c}1 & 1 & 0\\0 & 2 & 4\\0 & -1 & 1\end{array}\right|=2\cdot\left|\begin{array}{c}1 & 1 & 0\\0 & 1 & 2\\0 & -1 & 1\end{array}\right|$$Jetzt addiere ich weiter Zeile 2 zu Zeile 3 und ziehe aus Zeile 3 den Faktor vor:$$\phantom{D\_3}=2\cdot\left|\begin{array}{c}1 & 1 & 0\\0 & 1 & 2\\0 & 0 & 3\end{array}\right|=2\cdot3\cdot\left|\begin{array}{c}1 & 1 & 0\\0 & 1 & 2\\0 & 0 & 1\end{array}\right|=6$$


Bei \(n=4\) wiederhole ich zunächst alle Schritte vom Fall \(n=3\):


$$D\_4=\left|\begin{array}{c}1 & 1 & 0 & 0\\-1 & 1 & 4 & 0\\0 & -1 & 1 & 9\\0 & 0 & -1 & 1\end{array}\right|=\left|\begin{array}{c}1 & 1 & 0 & 0\\0 & 2 & 4 & 0\\0 & -1 & 1 & 9\\0 & 0 & -1 & 1\end{array}\right|=2\cdot\left|\begin{array}{c}1 & 1 & 0 & 0\\0 & 1 & 2 & 0\\0 & -1 & 1 & 9\\0 & 0 & -1 & 1\end{array}\right|$$$$\phantom{D\_4}=2\cdot\left|\begin{array}{c}1 & 1 & 0 & 0\\0 & 1 & 2 & 0\\0 & 0 & 3 & 9\\0 & 0 & -1 & 1\end{array}\right|=2\cdot3\cdot\left|\begin{array}{c}\underline1 & \underline1 & \underline0 & 0\\\underline0 & \underline1 & \underline2 & 0\\\underline0 & \underline0 & \underline1 & 3\\0 & 0 & -1 & 1\end{array}\right|$$Man erkennt die letzte Determinante aus der Berechnung von \(D\_3\) wieder (unterstrichene Einträge), nur sind jetzt noch die 3 Elemente in der rechten unteren Ecke dazu gekommen, alle anderen zusätzlichen Einträge sind 0. Wir können daher noch einen weiteren Schritt (Addition der vorletzten Zeile zur letzten und Faktor herausziehen) durchführen:$$\phantom{D\_4}=2\cdot3\cdot\left|\begin{array}{c}1 & 1 & 0 & 0\\0 & 1 & 2 & 0\\0 & 0 & 1 & 3\\0 & 0 & 0 & 4\end{array}\right|=2\cdot3\cdot4\cdot\left|\begin{array}{c}1 & 1 & 0 & 0\\0 & 1 & 2 & 0\\0 & 0 & 1 & 3\\0 & 0 & 0 & 1\end{array}\right|=24$$


Damit ist klar, dass: \(D\_n=n!\)


Dieses Vorgehen kannst du, wenn verlangt, noch in einen sauberen Induktionsbeweis packen. Die Beweisidee sollte zumindest jetzt klar sein ;) Am besten einen Vergleich machen. <p><code>hook\_init()</code> wird von drupal nur einmal für jede angeforderte seite aufgerufen; dies ist der letzte schritt in <a href="http://api.drupal.org/api/drupal/includes!common.inc/function/\_drupal\_bootstrap\_full/7">\_ drupal\_bootstrap\_full ()</a> .</p><pre><code> // drupal 6 // // let all modules take action before menu system handles the request // we do not want this while running update.php. if (!defined('maintenance\_mode') || maintenance\_mode != 'update') { module\_invoke\_all('init'); } </code></pre><pre><code> // drupal 7 // // let all modules take action before the menu system handles the request. // we do not want this while running update.php. if (!defined('maintenance\_mode') || maintenance\_mode != 'update') { // prior to invoking hook\_init(), initialize the theme (potentially a custom // one for this page), so that: // - modules with hook\_init() implementations that call theme() or // theme\_get\_registry() don't initialize the incorrect theme. // - the theme can have hook\_*\_alter() implementations affect page building // (e.g., hook\_form\_alter(), hook\_node\_view\_alter(), hook\_page\_alter()), // ahead of when rendering starts. menu\_set\_custom\_theme(); drupal\_theme\_initialize(); module\_invoke\_all('init'); } </code></pre><p>wenn <code>hook\_init()</code> mehrmals ausgeführt wird, sollten sie herausfinden, warum dies geschieht. soweit ich sehen kann, überprüft keine der implementierungen von <code>hook\_init()</code> in drupal, dass sie zweimal ausgeführt wird (siehe zum beispiel <a href="http://api.drupal.org/api/drupal/modules!system!system.module/function/system\_init/7">system\_init ()</a> oder - <a href="http://api.drupal.org/api/drupal/modules!update!update.module/function/update\_init/7">pdate\_init ()</a> ). wenn dies normalerweise bei drupal der fall ist, prüft <code>update\_init()</code> zunächst, ob es bereits ausgeführt wurde.</p><p>wenn der zähler die anzahl der aufeinanderfolgenden tage ist, an denen sich ein benutzer angemeldet hat, würde ich lieber <code>hook\_init()</code> mit einem code implementieren, der dem folgenden ähnlich ist.</p><pre><code>// drupal 7 function mymodule\_init() { global $user; $result = mymodule\_increase\_counter($user-&gt;uid); if ($result[0]) { // increase the counter; set the other variables. } elseif ($result[1] &gt; 86400) { // the user didn't log in yesterday. } } function mymodule\_date($timestamp) { $date\_time = date\_create('@' . $timestamp); return date\_format($date\_time, 'ymd'); } function mymodule\_increase\_counter($uid) { $last\_timestamp = variable\_get("mymodule\_last\_timestamp\_$uid", 0); if ($last\_timestamp == request\_time) { return array(false, 0); } $result = array( mymodule\_date($last\_timestamp + 86400) == mymodule\_date(request\_time), request\_time - $last\_timestamp, ); variable\_set("mymodule\_last\_timestamp\_$uid", request\_time); return $result; } </code></pre><pre><code>// drupal 6 function mymodule\_init() { global $user; $result = mymodule\_increase\_counter($user-&gt;uid); if ($result[0]) { // increase the counter; set the other variables. } elseif ($result[1] &gt; 86400) { // the user didn't log in yesterday. } } function mymodule\_increase\_counter($uid) { $last\_timestamp = variable\_get("mymodule\_last\_timestamp\_$uid", 0); $result = array(false, time() - $last\_timestamp); if (time() - $last\_timestamp &lt; 20) { return $result; } $result[0] = (mymodule\_date($last\_timestamp + 86400) == mymodule\_date(request\_time)); variable\_set("mymodule\_last\_timestamp\_$uid", time()); return $result; } </code></pre><p>wenn <code>hook\_init()</code> während derselben seitenanforderung zweimal hintereinander aufgerufen wird, enthält <code>request\_time</code> diesen wert und die funktion würde <code>false</code> zurückgeben.</p><p>der code in <code>mymodule\_increase\_counter()</code> ist nicht optimiert; es soll nur ein beispiel zeigen. in einem realen modul würde ich lieber eine datenbanktabelle verwenden, in der der zähler und die anderen variablen gespeichert sind. der grund ist, dass drupal variablen alle in die globale variable <code>$conf</code> geladen werden, wenn drupal bootstraps (siehe <a href="http://api.drupal.org/api/drupal/includes!bootstrap.inc/function/\_drupal\_bootstrap\_variables/7">\_ drupal\_bootstrap\_variables ()</a> und - <a href="http://api.drupal.org/api/drupal/includes!bootstrap.inc/function/variable\_initialize/7">variable\_initialize ()</a> ); wenn sie dafür drupal -variablen verwenden, lädt drupal informationen über alle benutzer, für die sie informationen gespeichert haben, in den speicher, wenn für jede angeforderte seite nur ein benutzerkonto im gespeichert ist globale variable <code>$user</code>.</p><p>wenn sie die anzahl der von den benutzern an aufeinanderfolgenden tagen besuchten seiten zählen, würde ich den folgenden code implementieren.</p><pre><code>// drupal 7 function mymodule\_init() { global $user; $result = mymodule\_increase\_counter($user-&gt;uid); if ($result[0]) { // increase the counter; set the other variables. } elseif ($result[1] &gt; 86400) { // the user didn't log in yesterday. } } function mymodule\_date($timestamp) { $date\_time = date\_create('@' . $timestamp); return date\_format($date\_time, 'ymd'); } function mymodule\_increase\_counter($uid) { $last\_timestamp = variable\_get("mymodule\_last\_timestamp\_$uid", 0); if ($last\_timestamp == request\_time) { return array(false, 0); } $result = array( mymodule\_date($last\_timestamp + 86400) == mymodule\_date(request\_time), request\_time - $last\_timestamp, ); variable\_set("mymodule\_last\_timestamp\_$uid", request\_time); return $result; } </code></pre><pre><code>// drupal 6 function mymodule\_init() { global $user; $result = mymodule\_increase\_counter($user-&gt;uid); if ($result[0]) { // increase the counter; set the other variables. } elseif ($result[1] &gt; 86400) { // the user didn't log in yesterday. } } function mymodule\_increase\_counter($uid) { $last\_timestamp = variable\_get("mymodule\_last\_timestamp\_$uid", 0); $result = array(false, time() - $last\_timestamp); if (time() - $last\_timestamp &lt; 20) { return $result; } $result[0] = (mymodule\_date($last\_timestamp + 86400) == mymodule\_date(request\_time)); variable\_set("mymodule\_last\_timestamp\_$uid", time()); return $result; } </code></pre><p>sie werden feststellen, dass ich in meinem code nicht <code>$user-&gt;access</code> verwende. der grund ist, dass <code>$user-&gt;access</code> während des bootstraps drupal aktualisiert werden kann, bevor <code>hook\_init()</code> aufgerufen wird. der von drupal verwendete sitzungsschreibhandler enthält den folgenden code. (siehe <a href="http://api.drupal.org/api/drupal/includes!session.inc/function/\_drupal\_session\_write/7">\_ drupal\_session\_write ()</a> .)</p><pre><code>// likewise, do not update access time more than once per 180 seconds. if ($user-&gt;uid &amp;&amp; request\_time - $user-&gt;access &gt; variable\_get('session\_write\_interval', 180)) { db\_update('users') -&gt;fields(array( 'access' =&gt; request\_time, )) -&gt;condition('uid', $user-&gt;uid) -&gt;execute(); } </code></pre><p>für einen anderen hook, den sie verwenden können, können sie mit drupal 7 <a href="http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook\_page\_alter/7">hook\_page\_alter ()</a> verwenden; sie ändern nur nicht den inhalt von <code>$page</code>, sondern erhöhen ihren zähler und ändern ihre variablen.<br> auf drupal 6 können sie <a href="http://api.drupal.org/api/drupal/developer!hooks!core.php/function/hook\_footer/6">hook\_footer ()</a> verwenden, den hook, der von <a href="http://api.drupal.org/api/drupal/includes!theme.inc/function/template\_preprocess\_page/6">template\_preprocess\_page ()</a> aufgerufen wird. sie geben nichts zurück, sondern erhöhen ihren zähler und ändern ihre variablen.</p><p>auf drupal 6 und drupal 7 können sie <a href="http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook\_exit/7">hook\_exit ()</a> verwenden. beachten sie, dass der hook auch aufgerufen wird, wenn bootstrap nicht vollständig ist. der code konnte keinen zugriff auf funktionen haben, die von modulen oder anderen drupal -funktionen definiert wurden, und sie sollten zuerst überprüfen, ob diese funktionen verfügbar sind. einige funktionen sind immer über <code>hook\_exit()</code> verfügbar, z. b. die in <a href="http://api.drupal.org/api/drupal/includes!bootstrap.inc/7">bootstrap.inc</a> und <a href="http://api.drupal.org/api/drupal/includes!cache.inc/7">cache.inc</a> definierten. der unterschied besteht darin, dass <code>hook\_exit()</code> auch für zwischengespeicherte seiten aufgerufen wird, während <code>hook\_init()</code> für zwischengespeicherte seiten nicht aufgerufen wird.</p><p>als beispiel für code, der von einem drupal -modul verwendet wird, siehe <a href="http://api.drupal.org/api/drupal/modules!statistics!statistics.module/function/statistics\_exit/7">statistics\_exit ()</a> . das statistikmodul protokolliert zugriffsstatistiken für eine site und verwendet, wie sie sehen, <code>hook\_exit()</code> und nicht <code>hook\_init()</code>. um die erforderlichen funktionen aufrufen zu können, wird <a href="http://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal\_bootstrap/7">drupal\_bootstrap ()</a> aufgerufen, wobei der richtige parameter übergeben wird, wie im folgenden code.</p><pre><code> // when serving cached pages with the 'page\_cache\_without\_database' // configuration, system variables need to be loaded. this is a major // performance decrease for non-database page caches, but with statistics // module, it is likely to also have 'statistics\_enable\_access\_log' enabled, // in which case we need to bootstrap to the session phase anyway. drupal\_bootstrap(drupal\_bootstrap\_variables); </code></pre><pre><code> if (variable\_get('statistics\_enable\_access\_log', 0)) { drupal\_bootstrap(drupal\_bootstrap\_session); // for anonymous users unicode.inc will not have been loaded. include\_once drupal\_root . '/includes/unicode.inc'; // log this page access. db\_insert('accesslog') -&gt;fields(array( 'title' =&gt; truncate\_utf8(strip\_tags(drupal\_get\_title()), 255), 'path' =&gt; truncate\_utf8($\_get['q'], 255), 'url' =&gt; isset($\_server['http\_referer']) ? $\_server['http\_referer'] : '', 'hostname' =&gt; ip\_address(), 'uid' =&gt; $user-&gt;uid, 'sid' =&gt; session\_id(), 'timer' =&gt; (int) timer\_read('page'), 'timestamp' =&gt; request\_time, )) -&gt;execute(); } </code></pre><h3>aktualisieren</h3><p>möglicherweise gibt es einige verwirrung darüber, wann <code>hook\_init()</code> aufgerufen wird.</p><p><code>hook\_init()</code> wird für jede seitenanforderung aufgerufen, wenn die seite nicht zwischengespeichert ist. es wird nicht einmal für jede seitenanforderung aufgerufen, die vom selben benutzer stammt. wenn sie beispielsweise <a href="http://example.com/admin/appearance/update">http://example.com/admin/appearance/update</a> und dann <a href="http://example.com/admin/reports/status">http://example.com/admin/reports/status</a> besuchen , <code>hook\_init()</code> wird zweimal aufgerufen: eine für jede seite.<br> "der hook wird zweimal aufgerufen" bedeutet, dass es ein modul gibt, das den folgenden code ausführt, sobald drupal seinen bootstrap abgeschlossen hat.</p><pre><code>module\_invoke\_all('init'); </code></pre><p>wenn dies der fall ist, würde die folgende implementierung von <code>hook\_init()</code> zweimal denselben wert anzeigen.</p><pre><code>function mymodule\_init() { watchdog('mymodule', 'request time: !timestamp', array('!timestamp' =&gt; request\_time), watchdog\_debug); } </code></pre><p>wenn ihr code für <code>request\_time</code> zwei werte anzeigt, für die die differenz wie in ihrem fall 2 minuten beträgt, wird der hook nicht zweimal aufgerufen, sondern einmal für jede angeforderte seite, wie es passieren sollte.</p><p><code>request\_time</code> ist in <a href="http://api.drupal.org/api/drupal/includes!bootstrap.inc/7">bootstrap.inc</a> mit der folgenden zeile definiert.</p><pre><code>define('request\_time', (int) $\_server['request\_time']); </code></pre><p>bis die aktuell angeforderte seite nicht an den browser zurückgegeben wird, ändert sich der wert von <code>request\_time</code> nicht. wenn sie einen anderen wert sehen, beobachten sie den auf einer anderen anforderungsseite zugewiesenen wert.</p> <p>laut bash-manpage:</p><blockquote> <p>bash durchsucht jedes wort nach den zeichen *,? und [. wenn eines dieser zeichen angezeigt wird, wird das wort als muster angesehen und durch eine alphabetisch sortierte liste von dateinamen ersetzt, die mit dem muster übereinstimmen</p> </blockquote><p>und vom infoknoten für <strong>ls</strong></p><blockquote> <p>das ls-programm listet informationen zu dateien (jeglichen typs, einschließlich verzeichnissen) auf. optionen und dateiargumente können wie gewohnt beliebig gemischt werden.</p> <p>bei nicht-optionsbefehlszeilenargumenten, die verzeichnisse sind, listet 'ls' standardmäßig den inhalt von verzeichnissen auf, nicht rekursiv, und lässt dateien weg, deren namen mit '.' beginnen. bei anderen nichtoptionsargumenten wird standardmäßig nur der dateiname mit "ls" aufgelistet. wenn keine nichtoptionsargumente angegeben werden, listet 'ls' den inhalt des aktuellen verzeichnisses auf.</p> </blockquote><p>wenn sie also <code>ls d*</code> eingeben, wird <strong>d *</strong> zu einer sortierten liste aller datei-/verzeichnisnamen erweitert, die mit d beginnen. so wird dein befehl</p><pre><code>ls dump </code></pre><p>und da dump ein verzeichnisname ist, erhalten sie die auflistung aller dateien im verzeichnis "dump", aber wenn sie <code>ls d*</code> angeben, wird <strong>d *</strong> zu "<strong>desktop documents)" erweitert downloads dropbox</strong> ", so wird der befehl</p><pre><code>ls desktop documents downloads dropbox </code></pre><p>und da dies alles verzeichnisse sind, erhalten sie die auflistung der dateien in einzelnen verzeichnissen. wenn eine datei im aktuellen verzeichnis mit <strong>d</strong> begonnen hätte, wäre sie separat aufgeführt worden.</p> <p>der von drupal 7) verwendete javascript-code lautet wie folgt:</p><pre><code>drupal.attachbehaviors = function (context, settings) { context = context || document; settings = settings || drupal.settings; // execute all of them. $.each(drupal.behaviors, function () { if ($.isfunction(this.attach)) { this.attach(context, settings); } }); }; </code></pre><p>drupal 6 verwendet einen ähnlichen code:</p><pre><code>drupal.attachbehaviors = function(context) { context = context || document; if (drupal.jsenabled) { // execute all of them. jquery.each(drupal.behaviors, function() { this(context); }); } }; </code></pre><p>wenn javascript garantieren würde, dass objekt-/array-eigenschaften immer in derselben reihenfolge durchlaufen werden, in der sie hinzugefügt werden, werden die werte von <code>jquery.each()</code> an die funktion übergeben, die als zweiter parameter in derselben reihenfolge verwendet wird, in der sie eingefügt werden das array wurde als erster parameter übergeben.<br> dies würde bedeuten, dass das erste in <code>drupal.behaviors</code> eingefügte verhalten zuerst ausgeführt wird.<br> in diesem fall können sie ein geringeres gewicht verwenden, damit die von ihrem modul definierten verhaltensweisen zuerst ausgeführt werden können. wenn sie möchten, dass sie vor den anderen ausgeführt werden, sollte das modulgewicht auf -50 eingestellt werden. andere werte können auch funktionieren. wenn sie drupal 7, <a href="https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal\_add\_js/7.x">drupal\_add\_js ()</a> verwenden, können sie dem javascript-code eine gewichtung zuordnen. javascript-code mit einer geringeren gewichtung wird zuerst in der html-ausgabe angezeigt ist nicht möglich mit drupal 6, dachte.</p><p>javascript garantiert nicht, dass eigenschaften in derselben reihenfolge durchlaufen werden, in der sie hinzugefügt wurden. dies bedeutet, dass verschiedene javascript-implementierungen dieselben eigenschaften in einer anderen reihenfolge aufweisen. dies bedeutet auch, dass sich dieselbe reihenfolge in verschiedenen versionen desselben browsers ändern kann.</p> Hallo,

der Ansatz ist richtig. altes raus ziehen und neues reinstecken ,anschließen fertig. <p>möchten sie, dass es funktioniert, ohne einen zusätzlichen befehl einzugeben, z.</p><pre><code>$ rm file </code></pre><p>oder nur, wenn der benutzer so etwas eingibt</p><pre><code>$ confirm rm file </code></pre><p>oder nur, wenn der benutzer versucht, bestimmte befehle auszuführen, z.</p><pre><code>$ rm file </code></pre><p>aber nicht für</p><pre><code>$ echo "hello" </code></pre><p>bei option 1 kann dies mit dem preexec-hook in zsh oder der debug-trap in bash erfolgen.</p><p>fügen sie bei option 2 so etwas in <code>/etc/bash.bashrc</code> oder eine andere shell-startdatei ein.</p><pre><code>confirm() { echo -n "do you want to run $*? [n/y] " read -n 1 reply echo if test "$reply" = "y" -o "$reply" = "y"; then "$@" else echo "cancelled by user" fi } </code></pre><p>bei option 3 können sie das <code>confirm</code> -skript oben ändern, oder einige befehle haben eine option, die sie fragen können, bevor sie etwas tun, z. <code>rm -i</code>. sie könnten <code>alias rm='rm -i'</code> in <code>/etc/bash.bashrc</code> einfügen.</p>