Erlang Tutorial Windows
Für die professionelle Entwicklung mit Erlang stehen verschiedene Editoren und IDEs zur Verfügung: Übersicht siehe Punkt 7.7. Leider konnte mich das Eclipse Plugin nicht überzeugen und das Netbeans Plugin lies sich nicht installieren und Netbeans 7, weswegen ich Notepad++ benutze zum Entwickeln (siehe unten).
Die Vorteile der funktionalen Programmiersprache Erlang
- mathematische Korrektheitsbeweise sind einfach möglich
- sehr kurzer Quelltext
- für verteilte Anwendungen sehr geeignet
- der Datentyp INT ist nicht beschränkt, keine numerischen Effekte (Runden)
- keine Seiteneffekte
Bsp. Anwendungen in Erlang geschrieben:
- CouchDB
- SimpleDB
- Yaws – Webserver
Wenn man Makros geschrieben hat, die nicht nur in einer Arbeitsmappe zur Verfügung stehen sollen, bietet Excel 2010 für PCunter Windows 7 folgenden Funktion an:
Man legt eine Datei namens PERSONAL.XLSB.
C:\Users\IhrWindowsName\AppData\Roaming\Microsoft\Excel\XLSTART
an und bringt dort seine Makros unter, die bei jedem Excel Start geladen werden sollen. Es öffnet sich dann immer gleichzeitig zwei Dateien beim öffnen von Excel: die eigentliche Datei und die PERSONAL.XLSB. (Die Datei kann auch anders genannt werden unter Excel 2010, es werden alle Excel Datein in diesem Ordner automatisch geöffnet beim Start von Excel).
In der PERSONAL.XLSB sollte der Code wie gewohnt in ein Makro gelegt werden. Wenn gewünscht wird, dass ein Makro automatisch beim Start von Excel ausgeführt wird, um z.B. eigene Menüs zur Verfügung zu stellen, kann die Methode
Private Sub Workbook_Open()
genutzt werden unter DieseArbeitsmappe.
Excel 2011 für MAC
Geht leider nicht, nur über Addins.
Addins in Excel für Mac und PC
Mit Addins lassen sich eigene Menüs einbauen in Excel, die dann auch in jeder Arbeitsmappe verfügbar sind. Diese müssen in unter „DieseArbeitsmappe“ gespeichert und die Arbeitsmappe danach neu geöffnet werden, damit der Beispiel Code ausgeführt wird.
Private Sub Workbook_Open()
Dim cbMainMenuBar As CommandBar
Dim cbcCutomMenu As CommandBarControl
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("&Mein Menupunkt").Delete
On Error GoTo 0
Set cbMainMenuBar = _
Application.CommandBars("Worksheet Menu Bar")
Set cbcCutomMenu = _
cbMainMenuBar.Controls.Add(Type:=msoControlPopup)
cbcCutomMenu.Caption = "&Mein Menupunkt"
With cbcCutomMenu.Controls.Add(Type:=msoControlButton)
.Caption = "Absätze entfernen"
.OnAction = "AbsaetzeEntfernen"
End With
With cbcCutomMenu.Controls.Add(Type:=msoControlButton)
.Caption = "csv Dateien zusammenfügen"
.OnAction = "csvMerge"
End With
With cbcCutomMenu.Controls.Add(Type:=msoControlButton)
.Caption = "Export einzelner .txt Dateien"
.OnAction = "transponierenUndSpeichern"
End With
End Sub
Mit Phonegap lässt sich nativer Code triggern aus Javascript heraus mit folgendem Code:
//onDeviceReady
cordova.exec( success, fail, "UploadImage", "nativeAction", ["success"]);
function success (result) {
alert("SUCCESS: \r\n"+result );
}
function fail (error) {
alert("ERROR: \r\n"+error );
}
Dieser Code ruft die Klasse UploadImage die Funktion execute mit Parameter action=’nativeAction‘ und einem JsonString(!) data = „[’success‘]“ auf. Data kann dafür verwendet werden Daten nach Java zu übergeben:
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
public class UploadImage extends Plugin {
public static final String NATIVE_ACTION_STRING="nativeAction";
public static final String SUCCESS_PARAMETER="success";
@Override
public PluginResult execute(String action, JSONArray data, String callbackId) {
Log.d("HelloPlugin", "Hello, this is a native function called from PhoneGap/Cordova!");
//only perform the action if it is the one that should be invoked
if (NATIVE_ACTION_STRING.equals(action)) {
String resultType = null;
try {
resultType = data.getString(0); }
catch (Exception ex) {
Log.d("HelloPlugin", ex.toString()); }
if (resultType.equals(SUCCESS_PARAMETER)) {
return new PluginResult(PluginResult.Status.OK, "Yay, Success!!!");
}
else {
return new PluginResult(PluginResult.Status.ERROR, "Oops, Error :(");
}
}
return null;
}
}
Außerdem muss das Plugin in die res/xml/config.xml eingetragen werden:
<plugin name="UploadImage" value="de.sv.foo.plugin.UploadImage"/>
Die Ausgabe sollte sein:
"SUCCESS: Yay, Success!!!"
Mantis als PM Tool versendet bei konfigurierbaren Events an bestimmte User Benachrichtigungs E-Mails, die sehr viele Informationen beinhalten und schnell lang werden können.
Um nicht immer die gesamte History in der E-Mail zu sehen, kann man folgenden Code ändern:
core/bugnote_api.php l.372:
$t_bugnote_count = 1;// vorher: count( $t_all_bugnotes );
Damit wird nur die letzte Note versendet.
Oder man konfiguriert diesen Wert bei jedem User einzeln: My Account->Preferences->E-mail Notes Limit = 1
Ticket Informationen kürzen
Hier gibt es eine sehr gut Abbildung der möglichen Animation (Tweens) in Three.js:
http://www.grasshopper3d.com/profiles/blogs/port-of-robert-penner-s-easing-equations?xg_source=activity (siehe sehr gute Abbildung in den Kommentaren)
Zum Einbinden ist das sehr hilfreich: Tutorial Tween three.js
Ein kleines Beispiel für einen Tween:
new TWEEN.Tween( cube.rotation )
.to( { y: (cube.rotation.y + Math.PI/2)}, 1500 )
.easing( TWEEN.Easing.Back.EaseInOut).start();
Um Text sicher zu Filtern kann man mit dem Zend Framwork 2 Validator und einem HTML-Filter wie HTML Purifier eine Validierung des Inhaltes durchführen:
Mit Zend_Validator lässt sich eine sehr anspruchsvolle und sichere E-Mail Validierung durchführen, die man mit passenden Fehlermeldungen für den User bei Bedarf versehen kann:
<?php
use Zend\Form\Element;
use Zend\InputFilter\InputProviderInterface;
use Zend\Validator;
class EmailElement extends Element implements InputProviderInterface
{
protected $attributes = array(
'type' => 'email',
);
private $wrongEmailMessage = 'Bitte geben Sie eine gültige E-Mail-Adresse an.';
public function getInputSpecification()
{
return array(
'name' => $this->getName(),
'filters' => array(
array('name' => 'Zend\Filter\StringTrim'),
),
'attributes' => array(
'type' => 'email'
),
'validators' => array(
array(
'name' => 'NotEmpty',
'options' => array(
'messages' => array(
\Zend\Validator\NotEmpty::IS_EMPTY => $this->wrongEmailMessage
),
),
),
array(
'name' => 'EmailAddress',
'options' => array(
'hostnameValidator' => null,
'messages' => array(
\Zend\Validator\EmailAddress::INVALID => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::INVALID_FORMAT => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::INVALID_HOSTNAME => $this->wrongEmailMessage,
\Zend\Validator\Hostname::CANNOT_DECODE_PUNYCODE => $this->wrongEmailMessag,
\Zend\Validator\Hostname::INVALID => $this->wrongEmailMessage,
\Zend\Validator\Hostname::INVALID_DASH => $this->wrongEmailMessage,
\Zend\Validator\Hostname::INVALID_HOSTNAME => $this->wrongEmailMessage,
\Zend\Validator\Hostname::INVALID_HOSTNAME_SCHEMA => $this->wrongEmailMessage,
\Zend\Validator\Hostname::INVALID_LOCAL_NAME => $this->wrongEmailMessage,
\Zend\Validator\Hostname::INVALID_URI => $this->wrongEmailMessage,
\Zend\Validator\Hostname::IP_ADDRESS_NOT_ALLOWED => $this->wrongEmailMessage,
\Zend\Validator\Hostname::UNDECIPHERABLE_TLD => $this->wrongEmailMessage,
\Zend\Validator\Hostname::UNKNOWN_TLD => $this->wrongEmailMessage,
\Zend\Validator\Hostname::LOCAL_NAME_NOT_ALLOWED => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::INVALID_LOCAL_PART => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::INVALID_MX_RECORD => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::INVALID_SEGMENT => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::DOT_ATOM => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::QUOTED_STRING => $this->wrongEmailMessage,
\Zend\Validator\EmailAddress::INVALID_LOCAL_PART => $this->wrongEmailMessage,
)
)
)
)
);
}
}
Entfernt führende und beendende Leerzeichen
function trim (str)
{
return str.replace (/^\s+/, '').replace (/\s+$/, '');
}
Check, ob ein String leer ist, findet auch z.B. “ “
function isBlank(str)
{
return str.replace(/\s/g,"") == "" ;
}
Checkt, ob ein String enthalten z.B. ob script in javascript enthalten ist – true.
function stringContains(str, needle )
{
return str.indexOf(needle) != -1
}
Ich habe ein kleines Script geschrieben, welches seitenweise die Paragraphen ausliest und den Text sowie den ParagraphStyle in eine csv-Datei schreibt, die in Excel geöffnet werden kann, um so den Text dorthin zu exportieren und später zu übersetzen und zu reimportieren mittels InDesign’s DataMerge. Es wird für jede Seite des Dokuments eine csv-Datei angelegt:
#target InDesign
$.writeln ("extract Paragraph Text");
var allPages= app.activeDocument.pages;
for (i=0; i<allPages.length; i++)
{
$.writeln (allPages[i].name);
var allPageTextframes= allPages[i].textFrames;
var csvPath = app.activeDocument.filePath + "/page" + i + ".csv";
$.writeln (csvPath);
var csv = File (csvPath);
csv.encoding = "CP1252"; //Encoding for Windows/Excel
csv.open ("w");
for (j=0; j<allPageTextframes.length; j++)
{
var allPageTextframeParagraphs= allPageTextframes[j].paragraphs;
for (k=0; k<allPageTextframeParagraphs.length; k++)
{
var text = allPageTextframeParagraphs[k].contents;
var paragraphStyleName = allPageTextframeParagraphs[k].appliedParagraphStyle.name;
$.writeln (text);
$.writeln (paragraphStyleName);
if(text != "")
{
var zeile = paragraphStyleName + " " + j + k + ";" + text;
csv.writeln (zeile);
}
}
}
}

