Monkey-X: AdMob für iOS und Android Apps

Monkey X DokumentationNach längerer Zeit wollte ich meine in Monkey X entwickelte App BuChao mit dem neuen iOS 7 SDK auf den aktuellen Stand bringen. Damals musste ich AdMob noch von Hand in das Xcode Projekt integrieren.

Natürlich sollte auch eine aktualisierte AdMob Version Verwendung finden. Die aktuelle Version war schon runter geladen und ich war mitten drin dieses wieder manuell einzubinden.

Doch irgendwo im Hinterstübchen konnte ich mich daran erinnern dass in Monkey X AdMob integriert wurde. Also ab ins Forum und die Suche bemüht und nichts gefunden? Auch Google lieferte irgendwie kein befriedigendes Ergebnis ;-( Unter „Monkey X AdMob Tutorial“, weder unter „Monkey X AdMob Example“ war irgend etwas zu finden…?

In solchen Fällen ist man immer am Zweifeln, ob man selbst zu blöd ist etwas zu finden oder ob andere so schlau sind dass keine Fragen aufkommen und deswegen nirgends etwas zu finden ist.

Die Lösung war aber so einfach und trivial das man sich auf die Stirn klatschen könnte. Der gute alte Ted (der Editor von Monkey) bietet eine Suchfunktion in der Monkey X Dokumentation und in Sekundenschnelle war die Doku samt Beispiel gefunden.

So, und jetzt habe ich extra einen Blogpost samt Sourcecode geschrieben damit Google auch was zum indizieren findet, damit der nächste Monkey X Entwickler schneller fündig wird als ich ;-)

#If TARGET<>"android" And TARGET<>"ios"
#Error "Admob is only supported on Android and iOS targets"
#End

#ADMOB_PUBLISHER_ID="abcdabcdabcdabc"                           'from your admob account
#ADMOB_ANDROID_TEST_DEVICE1="TEST_EMULATOR"
#ADMOB_ANDROID_TEST_DEVICE2="ABCDABCDABCDABCDABCDABCDABCDABCD"  'your device's admob ID for test mode

Import mojo
Import brl.admob

Class MyApp Extends App

    Field admob:Admob
    Field layout:=1
    Field enabled:=True

    Method OnCreate()
        admob=Admob.GetAdmob()
        admob.ShowAdView 1,layout
        SetUpdateRate 60
    End

    Method OnUpdate()
        If MouseHit( 0 )
            If enabled
                admob.HideAdView
                enabled=False
            Else
                layout+=1
                If layout=7 layout=1
                admob.ShowAdView 1,layout
                enabled=True
            Endif
        End
    End

    Method OnRender()
        Cls
        DrawText "Click to toggle ads!",DeviceWidth/2,DeviceHeight/2,.5,.5
    End

End

Function Main()
    New MyApp
End

 

TYPO3: MySQL strict modes und TYPO3

TYPO3 Version 6.2 LTS ist gerade frisch raus und ich wollte dieses lokal auf meinen Rechner ausprobieren. Die Installation war schnell erledigt. Doch beim ersten einfügen eines Contentelements kam die Fehlermeldung „SQL error: ‚Field ‚filelink_sorting‘ doesn’t have a default value‘ (tt_content:NEW……..)“ im BE?

WTF, was ist das… bei einer gerade eben frisch eingerichteten TYPO3 Installation. Google war gnädig und hat mich dann doch gleich zum richtigen Ergebnis geleitet:

Document that TYPO3 CMS is not compatible with MySQL strict modes

Anscheinend gibt es Probleme mit der MySql Datenbank wenn diese mit Mode „STRICT_TRANS_TABLES“ oder „STRICT_ALL_TABLES“ konfiguriert ist.

# Dieser lässt sich  mit entsprechenden Rechten in der Datenbank ändern.
SET @@global.sql_mode=''

Der Vollständigkeit halber noch unten wie man diesen Modus setzt.

#As priv'd user, 

SET @@global.sql_mode='STRICT_TRANS_TABLES';
SET @@global.sql_mode='STRICT_ALL_TABLES';

Weiterführende Links:
http://forge.typo3.org/issues/54883
http://forge.typo3.org/issues/52206
https://www.netbrothers.de/typo3-projekte/typo3-tipps/typo3-mysql-strict-mode/

 

Extbase / Fluid: Image ViewHelper erweitern für Lazyloading

Mobile ist im kommen. Vielleicht kann es auch auf umfangreichen Seiten mit vielen Bilder nötig sein, Bilder erst zu laden wenn diese im sichtbaren Bereich erscheinen um Ladezeiten zu verkürzen bzw. aufzuteilen. Twitter und Facebook nutzen diese Technik und bei der Bildersuche in Suchmaschinen dürfte dieses Feature schon mal aufgefallen sein.

Im jQuery Plugin Fundus gibt es eine Lösung: Lazy Load Plugin for jQuery . Weitere Argumente für Lazy Loading sind auf dieser Homepage zu finden ;-)

Und zu guter letzt auch noch ein LazyImage ViewHelper für Fluid. Dieser erweitert den Standard ViewHelper und tauscht das „src“-Attribut gegen das „data-original“-Attribut für das jQuery Plugin.

<?php
namespace YourVendor\YourExtKey\ViewHelpers;

/***************************************************************
 *  Copyright notice
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

class LazyImageViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\ImageViewHelper {

	/**
	 * Initialize arguments.
	 *
	 * @return void
	 */
	public function initializeArguments() {
		parent::initializeArguments();
		$this->registerTagAttribute('data-original', 'string', 'original image for lazy loading', FALSE);
	}

	/**
	 * Resizes a given image (if required) and renders the respective img tag
	 *
	 * @see http://typo3.org/documentation/document-library/references/doc_core_tsref/4.2.0/view/1/5/#id4164427
	 * @param string $src a path to a file, a combined FAL identifier or an uid (integer). If $treatIdAsReference is set, the integer is considered the uid of the sys_file_reference record. If you already got a FAL object, consider using the $image parameter instead
	 * @param string $width width of the image. This can be a numeric value representing the fixed width of the image in pixels. But you can also perform simple calculations by adding "m" or "c" to the value. See imgResource.width for possible options.
	 * @param string $height height of the image. This can be a numeric value representing the fixed height of the image in pixels. But you can also perform simple calculations by adding "m" or "c" to the value. See imgResource.width for possible options.
	 * @param integer $minWidth minimum width of the image
	 * @param integer $minHeight minimum height of the image
	 * @param integer $maxWidth maximum width of the image
	 * @param integer $maxHeight maximum height of the image
	 * @param boolean $treatIdAsReference given src argument is a sys_file_reference record
	 * @param FileInterface|AbstractFileFolder $image a FAL object
	 *
	 * @throws \TYPO3\CMS\Fluid\Core\ViewHelper\Exception
	 * @return string Rendered tag
	 */
	public function render($src = NULL, $width = NULL, $height = NULL, $minWidth = NULL, $minHeight = NULL, $maxWidth = NULL, $maxHeight = NULL, $treatIdAsReference = FALSE, $image = NULL) {
		if (is_null($src) && is_null($image) || !is_null($src) && !is_null($image)) {
			throw new \TYPO3\CMS\Fluid\Core\ViewHelper\Exception('You must either specify a string src or a File object.', 1382284106);
		}
		$image = $this->imageService->getImage($src, $image, $treatIdAsReference);
		$processingInstructions = array(
			'width' => $width,
			'height' => $height,
			'minWidth' => $minWidth,
			'minHeight' => $minHeight,
			'maxWidth' => $maxWidth,
			'maxHeight' => $maxHeight,
		);
		$processedImage = $this->imageService->applyProcessingInstructions($image, $processingInstructions);
		$imageUri = $this->imageService->getImageUri($processedImage);

		$this->tag->addAttribute('data-original', $imageUri);
		$this->tag->addAttribute('width', $processedImage->getProperty('width'));
		$this->tag->addAttribute('height', $processedImage->getProperty('height'));

		$alt = $image->getProperty('alternative');
		$title = $image->getProperty('title');

		// The alt-attribute is mandatory to have valid html-code, therefore add it even if it is empty
		if (empty($this->arguments['alt'])) {
			$this->tag->addAttribute('alt', $alt);
		}
		if (empty($this->arguments['title']) && $title) {
			$this->tag->addAttribute('title', $title);
		}

		return $this->tag->render();
	}
}

?>

 

OS X installieren ohne optisches Laufwerk und ohne Medium und dann? => Liondiskmaker

Ich hatte mir schon seit Ewigkeiten keine Gedanken mehr über eine Neuinstallation gemacht. Seit Mac OS X 10.x wird von dem einen Rechner auf den anderen migriert bzw. ein Time Machine Backup verwendet.

Nach diversen Rechnern bei denen Apple so nach und nach das optische Laufwerk weg gelassen hat, und auch durch die Tatsache dass neuere OS X Versionen nur noch über den App Store geladen werden können, kann es unter Umständen schwierig werden seinen Rechner neu aufzusetzen.

So sitze ich nun da mit einem Mac mini ohne optisches Laufwerk und die letzte OS X Version, wie soll es auch anders sein, existiert nur noch als Download. Wie sollte man in so einem Fall den Mac neu installieren? Ganz ehrlich gesagt mein Mac mini schnurrt wie eine Katze, aber was ist wenn doch mal die SSD ihren Geist aufgeben sollte? Verwöhnte Zeiten sage ich nur…

Um es kurz zu machen, hierfür gibt das geniale Tool Liondiskmaker dass den OS X Installer auf ein bootbares Medium kopiert. Wahlweise kann das eine DVD sein, eine externe Festplatte, ein USB Stick oder sogar eine SD Karte!

Einfach nur Top! Kann ich nur weiter empfehlen.