Tester gesucht – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Tester gesucht Sat, 29 Jul 17 09:06:33 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700367#m1700367 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700367#m1700367 <p>Hallo,</p> <p>hab einen neuen Serializer entwickelt, derzeit in Testphase für Sessiondateien. Wer Lust, Zeit und Interesse hat, möge mal den damit realisierten Login/Logout testen, siehe "Problematische Seite" Link. Also mal ein paarmal ein/ausloggen.</p> <p>Es soll nicht umsonst sein, Algorithmus und Source lege ich offen, siehe untenstehend.</p> <p>MfG</p> <pre><code class="block language-perl"><span class="token keyword">package</span> FreezeHash<span class="token punctuation">;</span> <span class="token comment"># Recursive serialize for hash of hashes</span> <span class="token comment"># ALGORITHMUS</span> <span class="token comment"># Die Datenstruktur wird als Baum aufgefasst und rekursiv durchlaufen</span> <span class="token comment"># Dabei wird jeder Eintrag erfasst und bekommt eine eigene Entity-ID</span> <span class="token comment"># als fortlaufende Nummer. Im Ergebnis dessen entsteht eine lineare</span> <span class="token comment"># Struktur: ein einfacher Hash of Hashes nach dem Muster </span> <span class="token comment"># Entity/Attribute/Value kurz EAV</span> <span class="token comment"># In der linearisierten Struktur ist für jeden Knoten der parent</span> <span class="token comment"># als Attribut hinzugefügt und damit kann die Original-</span> <span class="token comment"># Datenstruktur wiederhergestellt werden.</span> <span class="token keyword">use</span> strict<span class="token punctuation">;</span> <span class="token keyword">use</span> warnings<span class="token punctuation">;</span> <span class="token keyword">use</span> IO<span class="token punctuation">:</span><span class="token punctuation">:</span>File<span class="token punctuation">;</span> <span class="token keyword">use</span> Fcntl <span class="token string">qw(:flock)</span><span class="token punctuation">;</span> <span class="token keyword">use</span> Carp<span class="token punctuation">;</span> <span class="token keyword">use</span> bytes<span class="token punctuation">;</span> <span class="token comment">#use Data::Dumper;</span> <span class="token comment">#$Data::Dumper::Sortkeys = 1;</span> <span class="token keyword">sub</span> <span class="token function">new</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$class</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">%cfg</span> <span class="token operator">=</span> <span class="token punctuation">(</span> file <span class="token operator">=></span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token comment"># full qualified</span> lock <span class="token operator">=></span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token comment"># atomar read+write</span> auto <span class="token operator">=></span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token comment"># auto write to file</span> <span class="token variable">@_</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token keyword">eval</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$fh</span> <span class="token operator">=</span> IO<span class="token punctuation">:</span><span class="token punctuation">:</span>File<span class="token operator">-></span>new<span class="token punctuation">;</span> <span class="token variable">$fh</span><span class="token operator">-></span>open<span class="token punctuation">(</span> <span class="token variable">$cfg</span><span class="token punctuation">{</span>file<span class="token punctuation">}</span><span class="token punctuation">,</span> O_CREAT<span class="token operator">|</span>O_BINARY<span class="token operator">|</span>O_RDWR<span class="token punctuation">)</span> <span class="token operator">||</span> croak <span class="token string">"Error open file '$cfg{file}': $!"</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$cfg</span><span class="token punctuation">{</span>lock<span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> flock<span class="token punctuation">(</span><span class="token variable">$fh</span><span class="token punctuation">,</span> LOCK_EX<span class="token punctuation">)</span> <span class="token operator">||</span> carp <span class="token string">"Your system does'nt support flock!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> bless<span class="token punctuation">{</span> lfdnr <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token comment"># root entity</span> EAV <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> FH <span class="token operator">=></span> <span class="token variable">$fh</span> <span class="token punctuation">,</span> CFG <span class="token operator">=></span> <span class="token operator">\</span><span class="token variable">%cfg</span> <span class="token comment"># for debug</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token variable">$class</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment"># Linearisierung der geschachtelten Datenstruktur</span> <span class="token keyword">sub</span> <span class="token function">freeze</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$self</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$ds</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$parent</span> <span class="token operator">=</span> shift <span class="token operator">||</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>lfdnr<span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment"># Hash wird rekursiv durchlaufen und linearisiert</span> <span class="token comment"># Jeder Eintrag bekommt eine fortlaufende Nummer</span> <span class="token keyword">foreach</span> <span class="token keyword">my</span> <span class="token variable">$key</span><span class="token punctuation">(</span> keys <span class="token variable">%$ds</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span> ref <span class="token variable">$ds</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token variable">$key</span><span class="token punctuation">}</span> <span class="token operator">eq</span> <span class="token string">'HASH'</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$ent</span> <span class="token operator">=</span> <span class="token variable">$self</span><span class="token operator">-></span>_lfdnr<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$ent</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span> type <span class="token operator">=></span> <span class="token string">'HASH'</span><span class="token punctuation">,</span> att <span class="token operator">=></span> <span class="token variable">$key</span><span class="token punctuation">,</span> parent <span class="token operator">=></span> <span class="token variable">$parent</span><span class="token punctuation">,</span> ent <span class="token operator">=></span> <span class="token variable">$ent</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token variable">$self</span><span class="token operator">-></span>freeze<span class="token punctuation">(</span> <span class="token variable">$ds</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token variable">$key</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$ent</span> <span class="token operator">=</span> <span class="token variable">$self</span><span class="token operator">-></span>_lfdnr<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$ent</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span> parent <span class="token operator">=></span> <span class="token variable">$parent</span><span class="token punctuation">,</span> type <span class="token operator">=></span> <span class="token string">'STRING'</span><span class="token punctuation">,</span> att <span class="token operator">=></span> <span class="token variable">$key</span><span class="token punctuation">,</span> val <span class="token operator">=></span> <span class="token variable">$ds</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token variable">$key</span><span class="token punctuation">}</span><span class="token punctuation">,</span> ent <span class="token operator">=></span> <span class="token variable">$ent</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># ab hier kann serialisiert werden</span> <span class="token comment"># serialisiert wird beim write()-Aufruf</span> <span class="token punctuation">}</span> <span class="token comment"># Datenstruktur wiederherstellen</span> <span class="token keyword">sub</span> <span class="token function">thaw</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$self</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token comment"># aus Datei deserialisieren, Ergebnis ist</span> <span class="token comment"># eine linearisierte Datenstruktur</span> <span class="token variable">$self</span><span class="token operator">-></span>_read<span class="token punctuation">;</span> <span class="token comment"># die ursprüngliche Datenstruktur wiederherstellen</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>RESTORED<span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment"># Knoten direkt unterhalb der Wurzel haben entity 1</span> <span class="token keyword">foreach</span> <span class="token keyword">my</span> <span class="token variable">$root</span><span class="token punctuation">(</span> <span class="token variable">@</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>CHILDREN<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$root</span><span class="token punctuation">}</span><span class="token punctuation">{</span>type<span class="token punctuation">}</span> <span class="token operator">eq</span> <span class="token string">'STRING'</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>RESTORED<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$root</span><span class="token punctuation">}</span><span class="token punctuation">{</span>att<span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$root</span><span class="token punctuation">}</span><span class="token punctuation">{</span>val<span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>RESTORED<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$root</span><span class="token punctuation">}</span><span class="token punctuation">{</span>att<span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token keyword">my</span> <span class="token variable">$child</span> <span class="token punctuation">(</span> <span class="token variable">@</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>CHILDREN<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$root</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$self</span><span class="token operator">-></span>_restore<span class="token punctuation">(</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>RESTORED<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$root</span><span class="token punctuation">}</span><span class="token punctuation">{</span>att<span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$child</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>RESTORED<span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment"># Daten in das Handle serialisieren</span> <span class="token keyword">sub</span> <span class="token function">write</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$self</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token comment"># STRING kann undef sein, hierzu wird ein byte vergeben 0|1</span> <span class="token comment"># zur Kennzeichnung undef oder String</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token operator">-></span>seek<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token operator">-></span>truncate<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token keyword">my</span> <span class="token variable">$ent</span><span class="token punctuation">(</span> keys <span class="token variable">%</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token keyword">my</span> <span class="token variable">$att</span><span class="token punctuation">(</span> keys <span class="token variable">%</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$ent</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$def</span> <span class="token operator">=</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$ent</span><span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$att</span><span class="token punctuation">}</span> <span class="token operator">?</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$val</span> <span class="token operator">=</span> <span class="token variable">$def</span> <span class="token operator">?</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$ent</span><span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$att</span><span class="token punctuation">}</span> <span class="token punctuation">:</span> <span class="token string">''</span><span class="token punctuation">;</span> <span class="token comment"># pack with little endians</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token operator">-></span><span class="token keyword">print</span><span class="token punctuation">(</span> pack<span class="token punctuation">(</span><span class="token string">'VVV'</span><span class="token punctuation">,</span> length <span class="token variable">$ent</span><span class="token punctuation">,</span> length <span class="token variable">$att</span><span class="token punctuation">,</span> length <span class="token variable">$val</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token variable">$def</span><span class="token operator">.</span><span class="token variable">$ent</span><span class="token operator">.</span><span class="token variable">$att</span><span class="token operator">.</span><span class="token variable">$val</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">sub</span> <span class="token function">DESTROY</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$self</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>CFG<span class="token punctuation">}</span><span class="token punctuation">{</span>auto<span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$self</span><span class="token operator">-></span>write <span class="token punctuation">}</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token operator">-></span>close<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">#################################### Private ##############################</span> <span class="token comment"># wird rekursiv aufgerufen, aus der linearen EAV Struktur</span> <span class="token comment"># das Original wiederherstellen</span> <span class="token keyword">sub</span> <span class="token function">_restore</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$self</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$href</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token comment"># aktueller stub</span> <span class="token keyword">my</span> <span class="token variable">$hunt</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token comment"># hash der angefügt werden soll</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$hunt</span><span class="token operator">-></span><span class="token punctuation">{</span>type<span class="token punctuation">}</span> <span class="token operator">eq</span> <span class="token string">'STRING'</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$href</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token variable">$hunt</span><span class="token operator">-></span><span class="token punctuation">{</span>att<span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token variable">$hunt</span><span class="token operator">-></span><span class="token punctuation">{</span>val<span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token comment"># hier der rekursive Aufruf</span> <span class="token variable">$href</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token variable">$hunt</span><span class="token operator">-></span><span class="token punctuation">{</span>att<span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token keyword">my</span> <span class="token variable">$child</span><span class="token punctuation">(</span> <span class="token variable">@</span><span class="token punctuation">{</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>CHILDREN<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$hunt</span><span class="token operator">-></span><span class="token punctuation">{</span>ent<span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$self</span><span class="token operator">-></span>_restore<span class="token punctuation">(</span><span class="token variable">$href</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token variable">$hunt</span><span class="token operator">-></span><span class="token punctuation">{</span>att<span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$child</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># Lese Dateihandle und deserialize</span> <span class="token keyword">sub</span> <span class="token function">_read</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$self</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token operator">-></span>seek<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">%CHLD</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># parent-children relation</span> <span class="token keyword">while</span><span class="token punctuation">(</span> read<span class="token punctuation">(</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">my</span> <span class="token variable">$buffer</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">my</span><span class="token punctuation">(</span><span class="token variable">$elen</span><span class="token punctuation">,</span><span class="token variable">$alen</span><span class="token punctuation">,</span><span class="token variable">$vlen</span><span class="token punctuation">)</span> <span class="token operator">=</span> unpack <span class="token string">'VVV'</span><span class="token punctuation">,</span> <span class="token variable">$buffer</span><span class="token punctuation">;</span> read<span class="token punctuation">(</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">my</span> <span class="token variable">$def</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> read<span class="token punctuation">(</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">my</span> <span class="token variable">$ent</span><span class="token punctuation">,</span> <span class="token variable">$elen</span><span class="token punctuation">)</span><span class="token punctuation">;</span> read<span class="token punctuation">(</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">my</span> <span class="token variable">$att</span><span class="token punctuation">,</span> <span class="token variable">$alen</span><span class="token punctuation">)</span><span class="token punctuation">;</span> read<span class="token punctuation">(</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>FH<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">my</span> <span class="token variable">$val</span><span class="token punctuation">,</span> <span class="token variable">$vlen</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Korrektur wenn value = undef</span> <span class="token variable">$val</span> <span class="token operator">=</span> <span class="token keyword">undef</span> <span class="token keyword">if</span> <span class="token variable">$def</span> <span class="token operator">eq</span> <span class="token string">'0'</span> <span class="token operator">&&</span> <span class="token variable">$att</span> <span class="token operator">eq</span> <span class="token string">'val'</span><span class="token punctuation">;</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>EAV<span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$ent</span><span class="token punctuation">}</span><span class="token punctuation">{</span><span class="token variable">$att</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token variable">$val</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$att</span> <span class="token operator">eq</span> <span class="token string">'parent'</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> push <span class="token variable">@</span><span class="token punctuation">{</span><span class="token variable">$CHLD</span><span class="token punctuation">{</span><span class="token variable">$val</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token variable">$ent</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>CHILDREN<span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token operator">\</span><span class="token variable">%CHLD</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment"># Laufende Nummer zur Verwaltung der eigenen Entities</span> <span class="token keyword">sub</span> <span class="token function">_lfdnr</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$self</span> <span class="token operator">=</span> shift<span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$countup</span> <span class="token operator">=</span> shift <span class="token operator">||</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$countup</span> <span class="token operator">?</span> <span class="token operator">++</span><span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>lfdnr<span class="token punctuation">}</span> <span class="token punctuation">:</span> <span class="token variable">$self</span><span class="token operator">-></span><span class="token punctuation">{</span>lfdnr<span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">#########################################################################</span> __END__ <span class="token keyword">use</span> strict<span class="token punctuation">;</span> <span class="token keyword">use</span> warnings<span class="token punctuation">;</span> <span class="token keyword">use</span> Data<span class="token punctuation">:</span><span class="token punctuation">:</span>Dumper<span class="token punctuation">;</span> <span class="token variable">$Data::Dumper::Sortkeys</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment"># data struct</span> <span class="token keyword">my</span> <span class="token variable">$ds</span> <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token operator">=></span> <span class="token string">'boo'</span><span class="token punctuation">,</span> nixdef <span class="token operator">=></span> <span class="token keyword">undef</span><span class="token punctuation">,</span> addr <span class="token operator">=></span> <span class="token punctuation">{</span> addr_name <span class="token operator">=></span> <span class="token string">'foo'</span><span class="token punctuation">,</span> addr_vname <span class="token operator">=></span> <span class="token string">'bar'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> base <span class="token operator">=></span> <span class="token punctuation">{</span> base_addr <span class="token operator">=></span> <span class="token punctuation">{</span> base_addr_name <span class="token operator">=></span> <span class="token string">'foo'</span><span class="token punctuation">,</span> base_addr_vname <span class="token operator">=></span> <span class="token string">'bar'</span><span class="token punctuation">,</span> base_addr_undef <span class="token operator">=></span> <span class="token keyword">undef</span><span class="token punctuation">,</span> base_addr_hash <span class="token operator">=></span> <span class="token punctuation">{</span> base_addr_hash_name <span class="token operator">=></span> <span class="token string">'otto'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">#env => \%ENV</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$fr</span> <span class="token operator">=</span> FreezeHash<span class="token operator">-></span>new<span class="token punctuation">(</span> file <span class="token operator">=></span> <span class="token string">'freeze.bin'</span> <span class="token punctuation">)</span> <span class="token operator">or</span> <span class="token keyword">die</span> <span class="token variable">$@</span><span class="token punctuation">;</span> <span class="token variable">$fr</span><span class="token operator">-></span>freeze<span class="token punctuation">(</span> <span class="token variable">$ds</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$fr</span><span class="token operator">-></span>write <span class="token operator">or</span> <span class="token keyword">die</span> <span class="token variable">$@</span><span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$res</span> <span class="token operator">=</span> <span class="token variable">$fr</span><span class="token operator">-></span>thaw<span class="token punctuation">;</span> <span class="token keyword">print</span> Dumper <span class="token variable">$res</span><span class="token punctuation">,</span><span class="token variable">$ds</span><span class="token punctuation">;</span> </code></pre> Tester gesucht Sat, 29 Jul 17 11:10:52 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700369#m1700369 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700369#m1700369 <p>Hallo Rolf,</p> <p>mir ist der Anwendungsfall nicht klar.</p> <p>Für mich ist es nichts Besonderes, verschiedenen Usern unterschiedliche Inhalte unter gleicher URL anzubieten.</p> <p>User A darf den Lagerbestand sehen, User B auch den Einkaufspreis. Aber das ist wohl nicht gemeint?</p> <p>Gruß, Linuchs</p> Tester gesucht Sat, 29 Jul 17 12:06:37 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700372#m1700372 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700372#m1700372 <blockquote> <p>hab einen neuen Serializer entwickelt, derzeit in Testphase für Sessiondateien. Wer Lust, Zeit und Interesse hat, möge mal den damit realisierten Login/Logout testen</p> </blockquote> <p>Habe Deinen Code gerade 1:1 kopiert und getestet, allerdings mit einem deutlich größeren Hash:</p> <pre><code class="block language-perl"><span class="token keyword">my</span> <span class="token variable">$ds</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">my</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">10000</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ds</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token string">'name'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token string">'xyz'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$ds</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token string">'foo'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token string">'bar'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">my</span> <span class="token variable">$fr</span> <span class="token operator">=</span> FreezeHash<span class="token operator">-></span>new<span class="token punctuation">(</span> file <span class="token operator">=></span> <span class="token string">'freeze.bin'</span> <span class="token punctuation">)</span> <span class="token operator">or</span> <span class="token keyword">die</span> <span class="token variable">$@</span><span class="token punctuation">;</span> <span class="token variable">$fr</span><span class="token operator">-></span>freeze<span class="token punctuation">(</span> <span class="token variable">$ds</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$fr</span><span class="token operator">-></span>write <span class="token operator">or</span> <span class="token keyword">die</span> <span class="token variable">$@</span><span class="token punctuation">;</span> </code></pre> <p>Ergebnis auf meinem Testsystem: ca. 600ms Laufzeit, freeze.bin ist ca. 3000KB groß.</p> <p>Gegenvergleich mit derselben Datenstruktur, aber mittles JSON umgesetzt:</p> <pre><code class="block language-perl"><span class="token keyword">use</span> JSON <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$ds</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">my</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">10000</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ds</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token string">'name'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token string">'xyz'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$ds</span><span class="token operator">-></span><span class="token punctuation">{</span><span class="token string">'foo'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token string">'bar'</span> <span class="token operator">.</span> rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> open <span class="token punctuation">(</span>OUTFILE<span class="token punctuation">,</span> <span class="token string">'>:utf8'</span><span class="token punctuation">,</span> <span class="token string">'freeze.json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">print</span> OUTFILE JSON<span class="token operator">-></span>new<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span>encode<span class="token punctuation">(</span><span class="token variable">$ds</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">;</span> close OUTFILE<span class="token punctuation">;</span> </code></pre> <p>Ergebnis auf meinem Testsystem: ca. 70ms Laufzeit, freeze.json ist ca. 900KB groß.</p> <p>Fazit: Dein Serializer braucht beinahe 10x so lange wie JSON und erzeugt dabei ca. 3x so große Dateien. Wenn Du schon was proprietäres baust, sollte es sich zumindest auf irgendeine Weise lohnen?!</p> Testphase abgeschlossen Wed, 09 Aug 17 18:02:42 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1701343#m1701343 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1701343#m1701343 <p>Hi,</p> <p>die Testphase ist nun im Wesentlichen abgeschlossen. Der neue Serializer bewährt sich hervorragend gegenüber meiner bisherigen Lösung mit <code>Storable::freeze</code>, insbesondere in Sachen Performanze. Den Data Access Layer hab ich komplett ausgetauscht und bei der Gelegenheit den Cleanup so geändert dass nicht mehr automatisch gespeichert wird sondern nur noch dann, wenn tatsächlich Daten für die Session anfallen (beispielsweise bei einem Login). Ansonsten haben die Sessiondateien eine Länge von 0 und gelöscht wird automatisch nach 24 Stunden.</p> <p>Und so ganz nebenbei hat sich noch ein anderes Problem in Luft aufgelöst, was ich im Nachhinein nur auf einen Bug in <code>Storable::freeze</code> zurückführen konnte weil es bei gleichem SessionManagement mit einem anderen Serializer nunmehr nicht mehr auftritt, Schwamm drüber </p> <p>Ausschlaggebend ist immer der produktive Server, bei mehr als tausend Requests die täglich über das Framework laufen muss schon alles stimmen. MfG</p> Tester gesucht Sat, 29 Jul 17 13:08:20 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700377#m1700377 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700377#m1700377 <blockquote> <p>Für mich ist es nichts Besonderes, verschiedenen Usern unterschiedliche Inhalte unter gleicher URL anzubieten.</p> </blockquote> <p>Wie machst Du das?</p> <blockquote> <p>Aber das ist wohl nicht gemeint?</p> </blockquote> <p>Ursprünglich nicht aber wenn wir schon einmal dabei sind, erzähl mal bitte wie Du das machst.</p> <p>MfG</p> Tester gesucht Sat, 29 Jul 17 12:27:17 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700373#m1700373 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700373#m1700373 <p>Hallo,</p> <blockquote> <p>Wenn Du schon was proprietäres baust, sollte es sich zumindest auf irgendeine Weise lohnen?!</p> </blockquote> <p>Manchmal ist der Lohn einfach der, dass mans selbst gebaut hat!</p> <p>Gruß<br> Kalk</p> Tester gesucht Sat, 29 Jul 17 13:05:07 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700376#m1700376 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700376#m1700376 <p>Danke für den Hinweis!</p> <blockquote> <p>Wenn Du schon was proprietäres baust, sollte es sich zumindest auf irgendeine Weise lohnen?!</p> </blockquote> <p>Mein Algorithmus ist binary safe, das ist JSON nicht.</p> <p>MfG</p> Mein Vergleich mit JSON Sat, 29 Jul 17 18:29:21 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700386#m1700386 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700386#m1700386 <p>Dein heute morgen hier propagierter Vergleich ist ohne Belang.</p> <p>Mein Vergleich: JSON braucht doppelt so lange wie mein hier vorgestellter Algorithmus. Das habe ich soeben auf meinem System festgestellt und habe auch nichts anderes erwartet.</p> <p>Ich danke Dir aber trotzdem für Dein Interesse. MfG</p> Beweisführung, JSON ist ca. 10x so schnell wie Deine propietäre Lösung Sun, 30 Jul 17 10:35:19 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700414#m1700414 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700414#m1700414 <p>Ergänzend zum vorigen Post, der den fraglichen Code beinhaltet, anbei noch ein Screenshot meiner Messung.</p> <blockquote> <p>Habe Deinen Code gerade 1:1 kopiert und getestet, allerdings mit einem deutlich größeren Hash: Ergebnis auf meinem Testsystem: ca. 600ms Laufzeit</p> </blockquote> <p>"pl.pl" aus dem anhängendem Screenshot</p> <blockquote> <p>Gegenvergleich mit derselben Datenstruktur, aber mittles JSON umgesetzt: Ergebnis auf meinem Testsystem: ca. 70ms Laufzeit</p> </blockquote> <p>"pl_json.pl" aus dem anhängendem Screenshot</p> <p><a href="/images/b22ba036-952d-45df-add4-ccd531dcbb32.jpg" rel="noopener noreferrer"><img src="/images/b22ba036-952d-45df-add4-ccd531dcbb32.jpg?size=medium" alt="" loading="lazy"></a></p> Tester gesucht Sat, 29 Jul 17 12:29:03 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700374#m1700374 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700374#m1700374 <blockquote> <p>Manchmal ist der Lohn einfach der, dass mans selbst gebaut hat!</p> </blockquote> <p>Totschlagargument. Spielverderber!</p> Tester gesucht Sat, 29 Jul 17 13:26:52 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700378#m1700378 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700378#m1700378 <blockquote> <p>Mein Algorithmus ist binary safe, das ist JSON nicht.</p> </blockquote> <p>Das ist nativ in JSON nicht vorgesehen, stimmt. Ich bin bei Binärdaten in solchen Geschichten grundsätzlich eher skeptisch, aber wenn man es den braucht: Base64. Ja, das hat seinen eigenen Overhead.</p> Tester gesucht Sat, 29 Jul 17 13:58:18 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700379#m1700379 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700379#m1700379 <blockquote> <p>... aber wenn wir schon einmal dabei sind, erzähl mal bitte wie Du das machst.</p> </blockquote> <p>User mit Kennwort A loggt sich ein. Programm liest den User-Stammsatz, prüft, ob das Passwort stimmt und weiss, dass User A die Daten des Mandanten 1 mit der Berechtigungsstufe 9 (1..9) sehen darf. Stammsatz bekommt einen Timestamp, der nun von Programm zu Programm mit dem Kennwort weitergereicht wird.</p> <p>Es gibt nur ein (Haupt)Programm: index.php - dem muss mitgeteilt werden, welches (Ziel)Programm zp aufzurufen ist (per include). Ebenso wird das Kennwort kw und das Timestamp ll (last-login) mitgegeben. Dann werden noch Parameter für das Zielprogramm angehängt:</p> <p>http://example.com/?kw=A&ll=1493860611&zp=p101&adr_kz=1</p> <p>index.php liest bei jedem einzelnen Aufruf den User-Stammsatz und prüft das last-login. Wenn es nicht (mehr) gültig ist, wird das Login-Programm included, ansonsten das gewünschte Zielprogramm.</p> <p>Jeder Datenzugriff bezieht sich auf den für User A festgelegten Mandanten, in der DB owner_id genannt:</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">FROM</span> artikel <span class="token keyword">WHERE</span> owner_id <span class="token operator">=</span> $row_user<span class="token punctuation">[</span><span class="token string">'owner_id'</span><span class="token punctuation">]</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> </code></pre> <p>So hat also User A total andere Daten als User B, der Mandant 2 bearbeitet.</p> <p>Das Zielprogramm kann nun noch Felder anzeigen, abhängig von der Berechtigung 9 (hoch) des Users A. User C möge auch Mandant 1 bearbeiten, aber nur die Berechtigung 4 (niedrig) haben.</p> <p>Rest ist doch einfach, sinngemäß so:</p> <pre><code class="block language-php"><span class="token keyword">echo</span> <span class="token variable">$row_artikel</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'lagermenge'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$row_user</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'berechtigung'</span><span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token variable">$row_artikel</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'ek_preis'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> </code></pre> <p>Das Konzept mit dem zentralen Programm index.php kann genutzt werden, um die URL extrem klein zu halten: http://remso.eu/?ORT=6817</p> <p>Eine Dateiangabe fehlt, also wird Programm index.php genommen. Das checkt die mitgegebenen Parameter und weiss, dass für einen ORT das Zielprogramm p591b aufzurufen ist. Dieses wiederum wertet die ort_id 6817 aus und zeigt die Termine an.</p> <p>Wenn ich nicht die Termine anzeigen, sondern den Orts-Stammsatz bearbeiten möchte, muss ich das Zielprogramm nennen: http://remso.eu/?zp=p152&kw=A&ll=1485935384&ORT=6817</p> <p>Das Ganze ist ein Baukasten-System für Software-Kunden, an dem ich seit 1985 arbeite, damals noch mit Turbo-Pascal, in 2001 überarbeitet und übertragen nach PHP.</p> <p>Linuchs</p> Tester gesucht Sat, 29 Jul 17 14:03:54 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700380#m1700380 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700380#m1700380 <p>Mein bisheriger Serializer für die Sessions ist <code>Storable::freeze</code> und <code>Storable::thaw</code>. Der Storable-Algorithmus ist in c implementiert und daher sehr performant. Für Sessiondateien die ohnehin nicht portable sein müssen, ist Storable der ideale Serializer und binsafe ist Storable auch.</p> <p>Mit Storable erzeugte Binaries sind jedoch alles andere als kompatibel über unterschiedliche Plattformen und auch Perlversionen hinweg. Ein eigener Algorithmus ist da unumgänglich und so habe ich für EAV Datenstrukturen einen Algorithmus entwickelt den ich auch in c, Perl, PHP und JavaScript implementiert habe. D.h., damit erzeugte Dateien sind allesamt mit og. Programmier- bzw. Scriptsprachen lesbar.</p> <p>EAV Structs sind linear aufgebaut und lassen sich auch in einer ganz normalen MySQL Tabelle einfrieren wobei die Daten sogar durchsuchbar sind. Damit lassen sich Data Access Layer realisieren wo nur noch die Anwendung über die Daten bestimmt und nur der DAL über den Speicherort.</p> <p>Das sind die Vorteile eigener Serializer und wie wir sehen kommt da Einiges mehr zusammen als nur die Freude übers Selbstgemachte.</p> <p>Die Idee hinter dem hier vorgestellten Serializer ist die Linearisierung geschachtelter Datenstrukturen. Wenn ich das in c implementiere wird das genauso schnell wie JSON, davon bin ich überzeugt, auch wenn die Sequenzen länger sind.</p> <p>MfG</p> Tester gesucht Sat, 29 Jul 17 14:13:43 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700381#m1700381 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700381#m1700381 <blockquote> <p>Das Ganze ist ein Baukasten-System für Software-Kunden, an dem ich seit 1985 arbeite, damals noch mit Turbo-Pascal, in 2001 überarbeitet und übertragen nach PHP.</p> </blockquote> <p>Klasse! Ja, die Idee ist gut, danke für Deine ausführlichen Ausführungen.</p> <p>VlG, Rolf</p> <div class="signature">-- <br> Wer Bart hat heißt Horst. </div> Tester gesucht Sat, 29 Jul 17 18:41:19 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700387#m1700387 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700387#m1700387 <p>Hi,</p> <p>aber unabhängig davon, ob das ganze über <em>eine</em> index.php läuft, funktioniert doch im Prinzop jedes Berechtigungssystem so.</p> <p>Ich kann bei mir z.b. nicht nur Berechtigungsstufen (Admin, User, usw.) festlegen, sondern darüber hinaus auch für bestimmte Usernamen noch Berechtigungen festlegen.</p> <p>Und das, selbstredend auch ohne, dass es über <em>eine</em> index.php läuft, sondern auch über ganz normale scriptnamen.php.</p> <p>Beppo</p> Tester gesucht Sun, 30 Jul 17 06:18:02 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700395#m1700395 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700395#m1700395 <blockquote> <p>[...] Ein eigener Algorithmus ist da unumgänglich</p> </blockquote> <p>Why? Das einzig schlüssige Argument bislang von Dir lautet: binsafe. Base64 existiert.</p> <blockquote> <p>Die Idee hinter dem hier vorgestellten Serializer ist die Linearisierung geschachtelter Datenstrukturen.</p> </blockquote> <p>JSON</p> <blockquote> <p>Wenn ich das in c implementiere wird das genauso schnell wie JSON, davon bin ich überzeugt, auch wenn die Sequenzen länger sind.</p> </blockquote> <p>Traue ich Dir absolut zu! Nur: warum nimmst Du nicht einfach JSON?</p> Tester gesucht Sun, 30 Jul 17 07:19:55 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700402#m1700402 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700402#m1700402 <p>Dir ist schon bewusst, dass Du dir in bereits in einem Post selber widersprichst?</p> <blockquote> <p>Ein eigener Algorithmus ist da unumgänglich und so habe ich für EAV Datenstrukturen einen Algorithmus entwickelt den ich auch in c, Perl, PHP und JavaScript implementiert habe.</p> </blockquote> <p>Du hast das Dingen also auch bereits in C geschrieben. Klare Aussage.</p> <blockquote> <p>Wenn ich das in c implementiere wird das genauso schnell wie JSON, davon bin ich überzeugt, auch wenn die Sequenzen länger sind.</p> </blockquote> <p>"wenn Du das in C implementierst." Was denn nun?</p> Mein Vergleich mit JSON Sun, 30 Jul 17 06:12:17 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700394#m1700394 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700394#m1700394 <blockquote> <p>Dein heute morgen hier propagierter Vergleich ist ohne Belang.</p> </blockquote> <p>Nun ja, wenn Du meinst. Zumindest ist er mess- und nachvollviehbar.</p> <blockquote> <p>Mein Vergleich: JSON braucht doppelt so lange wie mein hier vorgestellter Algorithmus. Das habe ich soeben auf meinem System festgestellt und habe auch nichts anderes erwartet.</p> </blockquote> <p>Glaube ich Dir sogar! Vielleicht... Aber es ist leider nicht nachvollziehbar.</p> <blockquote> <p>Ich danke Dir aber trotzdem für Dein Interesse. MfG</p> </blockquote> <p>Klar! Gerne!</p> Tester gesucht Sat, 29 Jul 17 18:55:50 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700389#m1700389 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700389#m1700389 <blockquote> <p>aber unabhängig davon, ob das ganze über eine index.php läuft, funktioniert doch im Prinzop jedes Berechtigungssystem so.</p> </blockquote> <p>Nein. Meins funktioniert komplett anders, nämlich nach dem Prinzip der Content-Negotiation die bereits unter der Konfiguration des gesamten Webauftritts ansetzt. Damit ist die ganze Policy komplett vom Code getrennt, meine Anwendungsklassen haben mit Berechtigungen gar nichts mehr zu tun.</p> <p>MfG</p> Tester gesucht Sat, 29 Jul 17 19:02:46 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700390#m1700390 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700390#m1700390 <blockquote> <blockquote> <p>aber unabhängig davon, ob das ganze über eine index.php läuft, funktioniert doch im Prinzop jedes Berechtigungssystem so.</p> </blockquote> <p>Nein. Meins funktioniert komplett anders, nämlich nach dem Prinzip der Content-Negotiation die bereits unter der Konfiguration des gesamten Webauftritts ansetzt. Damit ist die ganze Policy komplett vom Code getrennt, meine Anwendungsklassen haben mit Berechtigungen gar nichts mehr zu tun.</p> <p>MfG</p> </blockquote> <p>Hi,</p> <p>wenn dem so ist, bringt Dir auch Linuchs Idee nicht so viel. Letztlich läufts dann eben doch auf Berechtigungen hinaus, egal, auf welcher Ebene Du ansetzt. Korrigiere mich, wenn ich falsch liege, aber das, was Linuchs erklärt, ist genau das, was ich meine. Beppo</p> Tester gesucht Sun, 30 Jul 17 06:19:23 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700396#m1700396 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700396#m1700396 <blockquote> <p>wenn dem so ist, bringt Dir auch Linuchs Idee nicht so viel.</p> </blockquote> <p>Ja. Stell Dir vor, Du hast ein Framework und möchtest da einen WebAppliaction-Server (WAS) integrieren der mandantenfähig sein soll. Da ist es gar nicht möglich, die Berechtigungen erst in der Anwendung zu prüfen. Vielmehr wird für den WAS eine Gruppe admitted und die Mandanten sind Benutzer dieser Gruppe. So wie für alle anderen Inhalte und Anwendungen auch. Fertig.</p> <p>Schönen Sonntag.</p> Mein Vergleich mit JSON Sun, 30 Jul 17 06:39:56 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700398#m1700398 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700398#m1700398 <p>Netter Versuch. Aber ich lasse mich von Dir nicht verunsichern. Das haben schon ganz andere Leute versucht. Weißt Du, ein Entwickler zeichnet sich durch 3 Dinge aus:</p> <ol> <li>Pioniergeist</li> <li>Kreativität</li> <li>Beharrlichkeit</li> </ol> <p>Sie also Punkt 3. Aber wahrscheinlich bist Du kein Entwickler. MfG</p> Tester gesucht Sun, 30 Jul 17 06:37:18 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700397#m1700397 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700397#m1700397 <blockquote> <p>Das einzig schlüssige Argument bislang von Dir lautet: binsafe.</p> </blockquote> <p>Nein es ist nicht das einzige Argument. Du hast die restlichen Argumente nur nicht verstanden!</p> <blockquote> <p>warum nimmst Du nicht einfach JSON?</p> </blockquote> <p>Weil mein Algorithmus performanter ist, ganz einfach. JSON arbeitet zeichenorientiert, mein Serializer hingegen arbeitet auf Byteebene mit Offset. Das ist grundsätzlich performanter als Algorithmen mit Charactersemantic. Das habe ich hier aber schon mehrfach erklärt, Du bist doch lange genug dabei oder?</p> <p>Im Übrigen: Base64 hat mit Serializer-Algorithmen gar nichts zu tun. Aber soweit wollte ich nun auch wieder nicht ausholen.</p> <p>MfG</p> Tester gesucht Sun, 30 Jul 17 06:43:56 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700399#m1700399 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700399#m1700399 <blockquote> <blockquote> <p>Das einzig schlüssige Argument bislang von Dir lautet: binsafe. Nein es ist nicht das einzige Argument. Du hast die restlichen Argumente nur nicht verstanden!</p> </blockquote> </blockquote> <p>Ah, ok. Danke für die schlüssige Erklärung!</p> <blockquote> <blockquote> <p>warum nimmst Du nicht einfach JSON? Weil mein Algorithmus performanter ist, ganz einfach.</p> </blockquote> </blockquote> <p>Ich habe den Beweis für das Gegenteil geliefert. Du nicht. Wird auch nicht kommen, wie immer.</p> Mein Vergleich mit JSON Sun, 30 Jul 17 06:50:47 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700400#m1700400 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700400#m1700400 <blockquote> <p>Netter Versuch. Aber ich lasse mich von Dir nicht verunsichern.</p> </blockquote> <p>Das war auch nie mein Ziel, <em>Du</em> siehst das persönlich, das ist Dein Hauptproblem.</p> <blockquote> <p>Weißt Du, ein Entwickler zeichnet sich durch 3 Dinge aus:</p> <ol> <li>Pioniergeist</li> <li>Kreativität</li> <li>Beharrlichkeit</li> </ol> </blockquote> <p>Ich finde diese Auflistung nicht besonders zielführend. Wenn, dann fehlt mir da aber mindestens noch "Punkt 4": Objektivität.</p> <blockquote> <p>Sie also Punkt 3. Aber wahrscheinlich bist Du kein Entwickler.</p> </blockquote> <p>Mag sein, das sollen andere beurteilen. Zum Beispiel Du ;-)</p> Mein Vergleich mit JSON Sun, 30 Jul 17 07:19:28 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700401#m1700401 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700401#m1700401 <blockquote> <p>Weißt Du, ein Entwickler zeichnet sich durch 3 Dinge aus:</p> <ol> <li>Pioniergeist</li> <li>Kreativität</li> <li>Beharrlichkeit</li> </ol> </blockquote> <p>4. <a href="https://de.wikipedia.org/wiki/Kritikkompetenz" rel="nofollow noopener noreferrer">Kritikkompetenz</a></p> <p>Insbesondere:</p> <p>„Der kompetente Kritiknehmer ist in der Lage, an ihn geäußerte Kritik konstruktiv zu verarbeiten. Da er den kreativen Konflikt nicht scheut, setzt er sich mit Kritik so auseinander, dass er einerseits die Kritik aus einer anderen Perspektive heraus akzeptiert, sich selbst also in Frage stellen kann, um gegebenenfalls das eigene Verhalten neu anzupassen und zu verbessern. Der kompetente Kritiknehmer prüft also Kritik anderer und erkennt gegebenenfalls seine eigenen Mängel in ihr wieder, um diese dann aufzuarbeiten. Zugleich legt er gegenüber der Kritik anderer Ernsthaftigkeit an den Tag. Er ist außerdem in der Lage, problematische Spannungen mit humorvoller Einstellung zu beantworten und so zu entschärfen. Andererseits ist dieser Typ nicht so eingestellt, dass er mit humorvoller Attitüde produktive kritische Situationen nivelliert. Der kompetente Kritiknehmer reflektiert seine kritischen Seiten und erkennt, dass Kritik zur Entwicklung seiner persönlichen Fähigkeiten beitragen kann.“</p> Falschmeldung aus niedrigen Beweggründen Sun, 30 Jul 17 07:42:19 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700403#m1700403 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700403#m1700403 <blockquote> <p>Ich habe den Beweis für das Gegenteil geliefert.</p> </blockquote> <p>Nein hast Du nicht. Ich habe es nämlich selbst kontrolliert und dabei festgestellt, dass es genau umgekehrt ist als das was Du da behauptest!</p> <p>Hinter Deiner Falschmeldung stecken niedrige Beweggründe die eines Entwicklers nicht würdig sind. Ich finde es nur allzu traurig dass sowas noch von diesem Forum unterstützt wird.</p> <p>MfG</p> Falschmeldung aus niedrigen Beweggründen Sun, 30 Jul 17 08:11:16 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700406#m1700406 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700406#m1700406 <blockquote> <blockquote> <p>Ich habe den Beweis für das Gegenteil geliefert.</p> </blockquote> <p>Nein hast Du nicht.</p> </blockquote> <p>Ich denke wohl. Allerdings hast Du insofern Recht, dass während meiner Messung kein öffentlich bestellter Gutachter zugegen war und insofern hier jetzt Aussage gegen Aussage steht. Dein/mein Code dazu steht hier im Thread zur Verfügung und jeder, wenn er denn möchte, kann seine eigene Messung vornehmen.</p> <blockquote> <p>Ich habe es nämlich selbst kontrolliert und dabei festgestellt, dass es genau umgekehrt ist als das was Du da behauptest!</p> </blockquote> <p>Glaube Dir jetzt einfach mal aus tiefstem, naivem Vertrauen heraus. Dann wird wohl Deine Perl-Installation kaputt sein.</p> Falschmeldung aus niedrigen Beweggründen Sun, 30 Jul 17 12:10:21 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700422#m1700422 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700422#m1700422 <blockquote> <blockquote> <p>Ich habe den Beweis für das Gegenteil geliefert.</p> </blockquote> <p>Nein hast Du nicht. Ich habe es nämlich selbst kontrolliert und dabei festgestellt, dass es genau umgekehrt ist als das was Du da behauptest!</p> </blockquote> <p>Mach mal einen <a href="https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700414#m1700414" rel="noopener noreferrer">Screenshot</a>, bitte.</p> <blockquote> <p>Hinter Deiner Falschmeldung stecken niedrige Beweggründe die eines Entwicklers nicht würdig sind.</p> </blockquote> <p>Du bist am Zug, meine <a href="https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700414#m1700414" rel="noopener noreferrer">Messungen</a> zu widerlegen. Bislang lesen wir von Dir nur Behauptungen, das musst Du wohl oder übel eingestehen.</p> use Benchmark! Sun, 30 Jul 17 16:12:33 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700427#m1700427 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700427#m1700427 <p>Wenn schon dann richtig:</p> <pre><code class="block language-perl"><span class="token keyword">use</span> strict<span class="token punctuation">;</span> <span class="token keyword">use</span> warnings<span class="token punctuation">;</span> <span class="token keyword">use</span> Benchmark <span class="token string">qw(cmpthese)</span><span class="token punctuation">;</span> <span class="token keyword">use</span> JSON<span class="token punctuation">;</span> <span class="token keyword">use</span> IO<span class="token punctuation">:</span><span class="token punctuation">:</span>File<span class="token punctuation">;</span> <span class="token comment"># data struct</span> <span class="token keyword">my</span> <span class="token variable">$ds</span> <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token operator">=></span> <span class="token string">'boo'</span><span class="token punctuation">,</span> nixdef <span class="token operator">=></span> <span class="token keyword">undef</span><span class="token punctuation">,</span> addr <span class="token operator">=></span> <span class="token punctuation">{</span> addr_name <span class="token operator">=></span> <span class="token string">'foo'</span><span class="token punctuation">,</span> addr_vname <span class="token operator">=></span> <span class="token string">'bar'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> base <span class="token operator">=></span> <span class="token punctuation">{</span> base_addr <span class="token operator">=></span> <span class="token punctuation">{</span> base_addr_name <span class="token operator">=></span> <span class="token string">'foo'</span><span class="token punctuation">,</span> base_addr_vname <span class="token operator">=></span> <span class="token string">'bar'</span><span class="token punctuation">,</span> base_addr_undef <span class="token operator">=></span> <span class="token keyword">undef</span><span class="token punctuation">,</span> base_addr_hash <span class="token operator">=></span> <span class="token punctuation">{</span> base_addr_hash_name <span class="token operator">=></span> <span class="token string">'otto'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">#env => \%ENV</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$freezer</span> <span class="token operator">=</span> <span class="token keyword">sub</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$fr</span> <span class="token operator">=</span> FreezeHash<span class="token operator">-></span>new<span class="token punctuation">(</span> file <span class="token operator">=></span> <span class="token string">'d:/tmp/freeze.bin'</span> <span class="token punctuation">)</span> <span class="token operator">or</span> <span class="token keyword">die</span> <span class="token variable">$@</span><span class="token punctuation">;</span> <span class="token variable">$fr</span><span class="token operator">-></span>freeze<span class="token punctuation">(</span> <span class="token variable">$ds</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$fr</span><span class="token operator">-></span>write<span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$res</span> <span class="token operator">=</span> <span class="token variable">$fr</span><span class="token operator">-></span>thaw<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$json</span> <span class="token operator">=</span> <span class="token keyword">sub</span><span class="token punctuation">{</span> <span class="token keyword">my</span> <span class="token variable">$js</span> <span class="token operator">=</span> JSON<span class="token operator">-></span>new<span class="token punctuation">;</span> <span class="token keyword">my</span> <span class="token variable">$FH</span> <span class="token operator">=</span> IO<span class="token punctuation">:</span><span class="token punctuation">:</span>File<span class="token operator">-></span>new<span class="token punctuation">;</span> <span class="token variable">$FH</span><span class="token operator">-></span>open<span class="token punctuation">(</span><span class="token string">"d:/tmp/json.asc"</span><span class="token punctuation">,</span> O_CREAT<span class="token operator">|</span>O_RDWR<span class="token punctuation">)</span> <span class="token operator">or</span> <span class="token keyword">die</span> <span class="token variable">$!</span><span class="token punctuation">;</span> <span class="token keyword">my</span> $<span class="token regex">s = $js->encode($ds); $FH->truncate(0); $FH->seek(0,0); $FH->print($s); $FH->seek(0,0); read($FH, my $content, -s $FH); my $res = $js->decode( $content ); }; cmpthese(1000, { 'freezer' =</span><span class="token operator">></span> <span class="token variable">$freezer</span><span class="token punctuation">,</span> <span class="token string">'json'</span> <span class="token operator">=></span> <span class="token variable">$json</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Rate freezer json freezer <span class="token number">577</span><span class="token operator">/</span><span class="token regex">s -- -</span><span class="token number">2</span><span class="token operator">%</span> json <span class="token number">587</span><span class="token operator">/</span>s <span class="token number">2</span><span class="token operator">%</span> <span class="token operator">--</span> </code></pre> <p>Das ergibt quasi einen Gleichstand aber in keinster Weise das was Du hier versuchst der Welt beizubringen: Dass mein Algorithmus 10x langsamer sein soll ist eine glatte Lüge!</p> <p>Wobei hierzu aber auch anzumerken ist, dass mit meinem Algorithmus die Datenstrukur tatsächlich zweimal durchlaufen wird, einmal beim Linearisieren und ein zweites Mal beim eigentlichen Serialisieren. Das Benchmark Modul ist jedoch nicht das allein entscheidende Kriterium, entscheidend ist das Verhalten auf dem produktiven System und das hat infolge meines neuen Serializer einen kleinen aber deutlichen Performanceschub bekommen -- gegenüber <code>Storable::freeze+thaw</code> und das obwohl Letzerer in c implementiert ist.</p> <p>Im Übrigen ist JSON für meine Zwecke völlig indiskutabel. MfG</p> <p>PS: Wenn ich %ENV mit reinnehme siehts so aus:</p> <pre><code class="block language-perl"> Rate json freezer json <span class="token number">108</span><span class="token operator">/</span><span class="token regex">s -- -</span><span class="token number">43</span><span class="token operator">%</span> freezer <span class="token number">189</span><span class="token operator">/</span>s <span class="token number">75</span><span class="token operator">%</span> <span class="token operator">--</span> </code></pre> <p>Also ist mein Serializer <strong>doppelt so schnell</strong> aber das schrieb ich ja gestern bereits.</p> Pioniergeist! Sun, 30 Jul 17 16:25:45 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700428#m1700428 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700428#m1700428 <blockquote> <p>Wobei hierzu aber auch anzumerken ist, dass mit meinem Algorithmus die Datenstrukur tatsächlich zweimal durchlaufen wird, einmal beim Linearisieren und ein zweites Mal beim eigentlichen Serialisieren.</p> </blockquote> <p>Wer hier ein bischen Pionierarbeit leisten möchte: Es gibt Möglichkeiten, auf den zweiten Durchlauf zu verzichten. Z.B. innerhalb der freeze() Methode, immer dann, wenn ein Tupel Entity/Attribute/Value erzeugt wurde, kann dieser sofort in das FileHandle geschrieben werden. Die Methode write() wird dann nicht mehr gebraucht und kann komplett entfallen.</p> <p>Über eine diesbezügliche Diskussion hätte ich mich richtig gefreut! MfG</p> use Benchmark! Mon, 31 Jul 17 06:31:53 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700444#m1700444 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700444#m1700444 <blockquote> <p>Wenn schon dann richtig: [...]</p> </blockquote> <p>Nun, ich bin da ob Deiner Definition von "richtig" nicht ganz sicher. Der von Dir gepostete Code ist in sich nicht komplett, also musste ich, um es auf diese Art zu testen, noch Dein "package FreezeHash;" hinzufügen, dann konnte ich den Test starten. Da ich unter Linux kein Laufwerk "d:" habe, musste ich allerdings noch die Pfade anpassen, dann lief es durch. Allerdings wird eine Warnung ausgegeben: "(warning: too few iterations for a reliable count)". Dennoch werden Ergebnisse ausgegen, die sich aber deutlich von Deinen unterscheiden.</p> <p>Erster Versuch, analog Deinem Code, ohne "%ENV":</p> <pre><code class="block language-perl"> Rate freezer json freezer <span class="token number">2439</span><span class="token operator">/</span><span class="token regex">s -- -</span><span class="token number">66</span><span class="token operator">%</span> json <span class="token number">7143</span><span class="token operator">/</span>s <span class="token number">193</span><span class="token operator">%</span> <span class="token operator">--</span> </code></pre> <p>JSON ist hier ca. doppelt so schnell wie Deine Implementation.</p> <p>Zweiter Versuch, analog Deinem Code, mit "%ENV":</p> <pre><code class="block language-perl"> Rate freezer json freezer <span class="token number">1099</span><span class="token operator">/</span><span class="token regex">s -- -</span><span class="token number">84</span><span class="token operator">%</span> json <span class="token number">6667</span><span class="token operator">/</span>s <span class="token number">507</span><span class="token operator">%</span> <span class="token operator">--</span> </code></pre> <p>JSON ist hier ca. 5x so schnell wie Deine Implementation. Je größer die Datenstruktur, umso mehr scheint der Unterschied ins Gewicht zu fallen.</p> <p>Glaube Dir allerdings, dass Deine Messung auf Deinem Testsystem so ausgefallen ist, wie Du schreibst. Deine Perl-Installation unter Deinem Windows wird für JSON vermutlich auf reinen Perl-Code zurückfallen, weil JSON:XS (das C-Kompilat) dort nicht verfügbar ist. Das könnte den Unterschied erklären.</p> <blockquote> <p>Im Übrigen ist JSON für meine Zwecke völlig indiskutabel.</p> </blockquote> <p>Wenn das so ist, dann ist das so! Für uns nachvollziehbar ist es allerdings nicht.</p> use Benchmark! Mon, 31 Jul 17 07:28:10 Z https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700445#m1700445 https://forum.selfhtml.org/self/2017/jul/29/tester-gesucht/1700445#m1700445 <blockquote> <p>JSON vermutlich auf reinen Perl-Code zurückfallen, weil JSON:XS (das C-Kompilat) dort nicht verfügbar ist. Das könnte den Unterschied erklären.</p> </blockquote> <p>Also wenn Du schon vergleichst dann richtig. Und "richtig" heißt dass der Algorithmus verglichen wird, d.h. beide Algorithmen sind in pure Perl.</p> <p>Aber das habe ich Dir bereits mehrfach erklärt und auch warum JSON grundsätzlich langsamer ist als ein low-Level Algorithmus.</p> <p>Im Übrigen habe ich meinen Algorithmus weiter optimiert, er ist jetzt 3x performanter als JSON. Was auch darauf zurückzuführen ist, das mein Algorithmus nun auch beim Linearisieren blockweise in das Handle schreibt. Somit entfällt ein zweiter Durchgang durch die linearisierte Datenstruktur, Linearisieren und Serialisieren ist nun ein Aufwasch. Stichwort: Streamfähigkeit.</p> <p>Und da sind sie wieder diese 3 Dinge</p> <ol> <li>Pioniergeist</li> <li>Kreativität</li> <li>Beharrlichkeit</li> </ol> <p>was einen Programmierer auszeichnet. In meinen 15 Jahren als Schichtleiter war das übigens auch nicht anders.</p> <p>MfG</p>