Kategorien
Computer PHP

Prüfziffer der ISIN in PHP

Die ISIN (International Securities Identification Number) ist eine Kennung für Wertpapiere. Wie viele andere solcher Kennungen, beinhaltet auch die ISIN ein Prüfziffer-Verfahren. Wie das in Theorie funktioniert, hat jemand richtig gut bei Wikipedia beschrieben.

Hiermit zeige ich eine kleine Klasse, wie man das in PHP machen kann (use with care and at own risk!). Ursprünglich hatte ich diesen Code in 2010 veröffentlicht, in 2018 arbeitete ich die Hinweise einiger Nutzer ein und aktualisierte die Routinen zu PHP7.

[php]
declare(strict_types=1);

/**
* Validierung einer ISIN (double at double-method)
* 2010-2018 von Björn A. Dietz
*/
class isin_validate{
public $isin;
private $cvok;

function __construct($isin = false) {
if ($isin) $this->isin = $isin;
}

public function isin_check() {
$isin = strtoupper($this->isin);
$s=""; $cv = 0;
$this->cvok = false;

for ($i=0;$i<=10; $i++) {
$b = substr($isin,$i,1);
if (ord($b)>=65 && ord($b)<=90) $b = ord($b)-55;
$s .= $b;
}

$s = strrev($s);

for ($i= 0;$i<=strlen($s);$i++) {
$b = (int) substr($s,$i,1);
if (!bcmod((string) $i, "2")) $b = $this->quersumme($b * 2);
$cv += $b;
}

$cv = 10 – bcmod((string) $cv, "10");
$cv = bcmod ((string) $cv, "10");

if ($cv == substr($isin,-1,1)) $this->cvok = true;
return $this->cvok;
}

private function quersumme($zahl) {
$strZahl = (string) $zahl;
for( $intQS = $i = 0; $i < strlen ($strZahl); $i++ ) {
$intQS += (int) $strZahl{$i};
}
return (int) $intQS;
}
}
[/php]

…und so kann man die Klasse verwenden:

[php]
/* Anwendungsbeispiel */
$cv_test = new isin_validate("DE000BAY0017");
echo $cv_test->isin_check();
[/php]

Ich weiß, das geht immer noch besser… so ist es aber schön übersichtlich!

Kategorien
Aktuelles Computer PHP

50 Shades of Grey

[:de]
Naja, jeder redet doch darüber, oder? 🙂

[php]
header("Content-type: image/png");
$head = "50 Shades of Grey";
$im = imagecreate(500,280);
$background_color = imagecolorallocate($im, 0, 0, 0);

$orange = imagecolorallocate($im, 220, 210, 60);
$px = (imagesx($im) – 7.5 * strlen($head)) / 2;
imagestring($im, 3, $px, 9, $head, $orange);

$colc = 5;

for ($i = 0; $i < 500; $i = $i + 50) {
for ($j = 29; $j < 250; $j = $j + 50) {
$col = imagecolorallocate($im, $colc, $colc, $colc);
imagefilledrectangle($im, $i+1, $j+1, $i+49, $j+49, $col);

$coln = str_pad(dechex($colc), 2, "0", STR_PAD_LEFT);
imagestring($im, 2, $i+2, $j+2, "#".$coln.$coln.$coln, $orange);
$colc += 5;
}
}

imagepng($im);
imagedestroy($im);
[/php]

[:en]
Well, everybody’s talking about it, don’t they? 🙂

[php]
header("Content-type: image/png");
$head = "50 Shades of Grey";
$im = imagecreate(500,280);
$background_color = imagecolorallocate($im, 0, 0, 0);

$orange = imagecolorallocate($im, 220, 210, 60);
$px = (imagesx($im) – 7.5 * strlen($head)) / 2;
imagestring($im, 3, $px, 9, $head, $orange);

$colc = 5;

for ($i = 0; $i < 500; $i = $i + 50) {
for ($j = 29; $j < 250; $j = $j + 50) {
$col = imagecolorallocate($im, $colc, $colc, $colc);
imagefilledrectangle($im, $i+1, $j+1, $i+49, $j+49, $col);

$coln = str_pad(dechex($colc), 2, "0", STR_PAD_LEFT);
imagestring($im, 2, $i+2, $j+2, "#".$coln.$coln.$coln, $orange);
$colc += 5;
}
}

imagepng($im);
imagedestroy($im);
[/php]

Kategorien
Computer

Bash + Ping: [:en]Output with Timestamp[:de]Ausgabe mit einem Zeitstempel

[:en]One of the many things bash is so great to work with, is the flexibility to combinate the hardened tools at hand to create your desired output.

For example, I wanted to ping a host frequently (lets say every two minutes), and just add a readable timestamp to the output. Usually I’d use a network monitoring tool like Nagios for this task, but in this case it was just to discover when a host comes back alive and pop it onto my screen.

After a few minutes of putting pieces of bash commands together, I solved it this way:

[bash]ping -i 120 www.google.com | while read x; do echo "$(date +%T) $x"; done[/bash]

Result:

08:10:24 PING www.google.com (73.94.35.76) 56(84) bytes of data.
05:10:24 64 bytes from 73.94.35.76: icmp_seq=1 ttl=57 time=9.82 ms
05:12:24 64 bytes from 73.94.35.76: icmp_seq=2 ttl=57 time=9.25 ms
05:14:24 64 bytes from 73.94.35.76: icmp_seq=3 ttl=57 time=24.4 ms
05:16:24 64 bytes from 73.94.35.76: icmp_seq=4 ttl=57 time=9.81 ms
05:18:24 64 bytes from 73.94.35.76: icmp_seq=5 ttl=57 time=60.4 ms

Mission accomplished!

[:de]Eine der vielen tollen Annehmlichkeiten von bash ist die Flexibilität, verschiedene gute Werkzeuge miteinander zu kombinieren, um die gewünschte Ausgabe zu erreichen.

Vor ein paar Tagen wollte ich einen Host regelmäßig (p.e. alle zwei Minuten) pingen, und dabei einen Zeitstempel mitführen. Normalerweise verwende ich dafür geeignete Netzwerktools für diese Aufgabe wie z.B. Nagios, aber in diesem Fall wollte ich nur auf dem Bildschirm sehen, wann ein Host wieder online geht.

Nach ein paar Minuten löste ich die Aufgabe mit dieser Kombination:

[bash]ping -i 120 www.google.com | while read x; do echo "$(date +%T) $x"; done[/bash]

Resultat:

08:10:24 PING www.google.com (73.94.35.76) 56(84) bytes of data.
05:10:24 64 bytes from 73.94.35.76: icmp_seq=1 ttl=57 time=9.82 ms
05:12:24 64 bytes from 73.94.35.76: icmp_seq=2 ttl=57 time=9.25 ms
05:14:24 64 bytes from 73.94.35.76: icmp_seq=3 ttl=57 time=24.4 ms
05:16:24 64 bytes from 73.94.35.76: icmp_seq=4 ttl=57 time=9.81 ms
05:18:24 64 bytes from 73.94.35.76: icmp_seq=5 ttl=57 time=60.4 ms

Mission erfolgreich!

Kategorien
Computer MySQL Tutorials

[:en]Profiling with MySQL[:de]Profiling mit MySQL

[:en]Whenever you encounter a query slower than you expected, and you’re sure you’ve done everything in your power to ensure your tables are properly optimized and indexed, you might want to profile it. MySQL has an inbuild profiler, which allows you to see very detailed for what part of the query how much time has been spend.

To use it, follow these steps:

(1) Activate the profiler.

Since the profiler is deactivated by default we first have to start it.

[sql]SET profiling = 1;[/sql]

(2) Execute your query.

(3) Find out the query id for profiling.

[sql]SHOW PROFILES;[/sql]

It will return you something like this:

[sql]
Query_ID | Duration | Query
———+———–+———————–
… | … | …
29 | 0.0006200 | SHOW STATUS
30 | 0.3600000 | SELECT (your query here)
… | … | …
[/sql]

Now you know the query id is 30.

(4) Profile the query.

[sql]SHOW PROFILE FOR QUERY 30; // example [/sql]

This will return you the details, which might look like this:

[sql]
Status | Duration
——————————–+——————-
starting | 0.000010
checking query cache for query | 0.000078
Opening tables | 0.000051
System lock | 0.000003
Table lock | 0.000008
init | 0.000036
optimizing | 0.000020
statistics | 0.000013
preparing | 0.000015
Creating tmp table | 0.000028
executing | 0.000602
Copying to tmp table | 0.000176
Sorting result | 0.000043
Sending data | 0.080032
end | 0.000004
removing tmp table | 0.000024
end | 0.000006
query end | 0.000003
freeing items | 0.000148
removing tmp table | 0.000019
closing tables | 0.000005
logging slow query | 0.000003
cleaning up | 0.000004
[/sql]

In this example, most of the time was actually spend sending the data from the server back to the client. Maybe try narrowing down the amount of data you get from the query. Maybe raise your query cache. Maybe do something different – its entirely up to your database, server and needs what to make of this result. But now you know where to look!

[:de]Manchmal begegnet man einer SQL-Abfrage, welche langsamer ist als erwartet. Man weiß genau, alles wurde getan, dass die Tabellen optimiert und sauber indexiert sind. Und dennoch ist die Abfrage zu langsam.

Hier hilft Profiling.

MySQL verfügt über einen eingebauten Profiler, der es ermöglicht, sehr detailliert zu tracen, für welchen Bestandteil einer Abfrage die Datenbank wie lange genau gebraucht hat.

Um den Profiler zu verwenden, geht man wie folgt vor:

(1) Einschalten des Profilers.

Per Default ist der Profiler deaktiviert, daher muss man ihn erst starten.

[sql]SET profiling = 1;[/sql]

(2) Ausführen der eigentlichen Abfrage.

(3) Identifizieren der Abfrage-ID.

[sql]SHOW PROFILES;[/sql]

Dieses Kommando wird in etwa folgendes zeigen:

[sql]
Query_ID | Duration | Query
———+———–+———————–
… | … | …
29 | 0.0006200 | SHOW STATUS
30 | 0.3600000 | SELECT (your query here)
… | … | …
[/sql]

Jetzt weiß man, die Abfrage-ID ist 30.

(4) Profiling der Abfrage.

[sql]SHOW PROFILE FOR QUERY 30; // example [/sql]

Dies zeigt die Details der Abfrage.

[sql]
Status | Duration
——————————–+——————-
starting | 0.000010
checking query cache for query | 0.000078
Opening tables | 0.000051
System lock | 0.000003
Table lock | 0.000008
init | 0.000036
optimizing | 0.000020
statistics | 0.000013
preparing | 0.000015
Creating tmp table | 0.000028
executing | 0.000602
Copying to tmp table | 0.000176
Sorting result | 0.000043
Sending data | 0.080032
end | 0.000004
removing tmp table | 0.000024
end | 0.000006
query end | 0.000003
freeing items | 0.000148
removing tmp table | 0.000019
closing tables | 0.000005
logging slow query | 0.000003
cleaning up | 0.000004
[/sql]

In diesem Beispiel wurde die meiste Zeit der Abfrage damit verbracht, das Ergebnis an den Client zurückzusenden. Vielleicht sollte man die Ergebnismenge reduzieren, oder ggf. den Query Cache erhöhen. Vielleicht geht man aber auch ganz anders vor, hier sollte man von Fall zu Fall prüfen, was sinnvoll und möglich ist.

Aber dank dem Profiling weiß man nun, wo man suchen muß!

Kategorien
Computer Tutorials

[:en]Firebug: logging features[:de]Firebug: Logfunktionen

[:en]Many developers think of Firebug as the mother of all web tools. There’s a reason for it, because Firebug contains sophisticated tools to do nearly everything you need being a web developer, starting with little css experiments, debugging complex jscript-applications, profiling of web pages and many more.

Not commonly known is how to create your own logs using JScript.

For example, …
[javascript]
console.log(‚Hello World!‘);
[/javascript]
prints exactly this in your Firebug console.

You can refine this, since most of you distinguish informations, warnings, errors and debug output.

[javascript]
console.debug(‚Debug‘);
console.info(‚Information‘);
console.warn(‚Warning‘);
console.error(‚Error‘);
[/javascript]

Debugging variables can be helped, too.

[javascript]
var banana = 1.234;
var orange = "Test";
console.log("my %a has the value %d", orange, banana);
[/javascript]

If you have the need to group log output, just do it like this:

[javascript]
console.group(‚myGroup‘);
console.info(‚Info1‘);
console.debug(‚What did I want to know?‘);
console.groupEnd();
[/javascript]

Even more features, p.e. timing values, stacks and so on, are documented here.

By the way:
Most of these features have already found their way into the debugger used by Google Chrome!

[:de]Viele Entwickler betrachten Firebug als die Mutter aller Web-Tools. Diese Ansicht ist durchaus begründet, denn Firebug umfassst mächtige Werkzeuge, mit welchen man so ziemlich alles machen kann, was man als Webentwickler so täglich braucht, angefangen von kleineren CSS-Experimenten bishin zum Debuggen von komplexen JScript-Anwendungen sowie dem Profiling von Webseiten.

Was nicht ganz so bekannt ist, man kann sogar über den Firebug aus JScript heraus Debug-Logs generieren.

Beispielsweise gibt…
[javascript]
console.log(‚Hallo Welt!‘);
[/javascript]
…genau diesen Text in der Konsole aus.

Das kann man noch etwas verfeinern, denn schließlich unterscheidet man Infos, Warnings, Errors und Debugs!
[javascript]
console.debug(‚Debug‘);
console.info(‚Information‘);
console.warn(‚Warnung‘);
console.error(‚Fehler‘);
[/javascript]

Und auch die Ausgabe von Variablen kommt nicht zu kurz:
[javascript]
var banane = 1.234;
var orange = "Test";
console.log("Mein %a hat den Wert %d", orange, banane);
[/javascript]

Ästheten können auch Gruppen bilden, welche in der Konsole sauber dargestellt werden:
[javascript]
console.group(‚meine Gruppe‘);
console.info(‚Info1‘);
console.debug(‚Was ich wissen wollte…‘);
console.groupEnd();
[/javascript]
Über noch mehr Möglichkeiten dieser Funktionen, wie z.B. Zeitwerte, Stacks u.s.w kann man sich hier auf der Seite von Firebug informieren.

Übrigens:
Die meisten dieser Funktionen sind mittlerweile auch im Debugger des Google Chrome verfügbar!