MacBook Air 2008: Gerät muss neugestartet werden

Vor Kurzem hatte ich bei einem MacBook Air von 2008 (das erste MacBook Air Modell) mit Mac OS X Snow Leopard das Problem, dass jedes Mal nach dem Starten die Meldung „Sie müssen den Computer neu starten. Halten Sie den Ein- Ausschalter gedrückt bis das Gerät ausgeschaltet ist und drücken Sie ihn dann erneut.“ kam. Diese Meldung kann man leider nicht wegklicken …

Es war komplett irrelevant, wie oft ich das Gerät neu gestartet, die Festplatte formatiert oder das Betriebssystem neu installiert habe – auch das Zurücksetzen von SMC und PRAM (SMC:
http://support.apple.com/kb/ht3964, PRAM: http://support.apple.com/kb/ht1379) hat nichts gebracht. Das Problem hatte ich solange, bis ich nach einem Neustart in die Details des Fehlerberichts geschaut hatte. Dort stand folgendes:

Invalid backlight duty cycle value"@/SourceCache/GraphicsDrivers/GraphicsDrivers-5.48.6/Common/GLKernel/Inte l/IntelIntegratedFramebuffer/IntelGMAX3100FB.cpp

Aha. Es hat also etwas mit der Hintergrundbeleuchtung zu tun. Nach einer kurzen Suche fand ich den folgenden Beitrag: https://discussions.apple.com/thread/4246550?tstart=0

In diesem Beitrag wird auf zwei Lösungen hingewiesen und das Problem beim Namen genannt – es ist eine „Kernel Panic“. Bei der einen Lösung muss eine Datei von einem älteren OS X Betriebssystem mit dem aktuellen Betriebssystem ausgetauscht werden, in der anderen Lösung wird ein Ordner (bzw. eine Kernel Erweiterung – KEXT steht für „Kernel Extension“) einfach gelöscht. Dadurch lässt sich zwar die Helligkeit des Bildschirms nicht mehr einstellen, das MacBook zeigt aber auch keine Fehlermeldungen mehr an und funktioniert. Diese Lösung möchte ich nun präsentieren.

Schritt 1:

Beim Starten des MacBooks die Tasten „cmd“ und „s“ gedrückt halten, bis weißer Text auf schwarzen Hintergrund angezeigt wird. Hierdurch kommt man in den „Singel-User-Mode“ (FreeBSD-Nutzer kennen das ^^)

Schritt 2:

Da wir Änderungen an Dateien machen wollen, geben wir folgendes ein:

Zuerst:

/sbin/fsck -fy

Anschließend:

/sbin/mount -uw /

Schritt 3:

Nun erstellen wir ein Backup-Verzeichnis zum Sichern des Ordners:

mkdir /oldext

Schritt 4:

Danach kopieren wir das Verzeichnis entweder mit

mv /System/Library/Extensions/com.apple.AppleBacklightExpert.kext /oldext

oder (bei mir) mit

mv /System/Library/Extensions/AppleBacklightExpert.kext /oldext

Schritt 5:

Wir haben den Ordner nun gesichert und können ihn löschen:

rm -rf /System/Library/Extensions/com.apple.AppleBacklightExpert.kext

oder

rm -rf /System/Library/Extensions/AppleBacklightExpert.kext

Schritt 6:

So. Mit

reboot

starten wir – danach sollte der Fehler verschwunden sein. (Wenn er nicht verschwunden ist, hilft evtl. ein Zurücksetzen des SMC und PRAM)

Linux: Acer Laptop mit Intel Prozessor hängt sich auf

Bei einem Acer Laptop von 2014 mit einem Intel® Pentium(R) CPU N3530 Prozessor hatte ich vor ein paar Wochen das Problem, dass sich der Laptop nach dem Hochfahren immer wieder aufgehängt hat und man nichts mehr machen konnte. Nur ein Ausschalten des Geräts behob das Problem.

Ich habe daraufhin verschiedene Linux Derivate wie Ubuntu 16.04, elementary OS Loki sowie FreeBSD ausprobiert. Bei allen Linux Betriebssystemen hatte ich das gleiche Problem. Bei FreeBSD hatte ich zwar dieses Problem nicht, allerdings konnte ich den Rechner nicht herunterfahren (nur bis zum „System has stopped“, kein Poweroff möglich) und mein Touchpad wurde nicht unterstützt.

Ab diesen Punkt habe ich einen Richtungswechsel gewagt und einfach die HDD durch eine SSD, die noch rumlag ersetzt. Das hat aber auch nichts gebracht. ^^

Lange Rede, kurzer Sinn: Das Problem liegt am Linux Kernel und kann ganz einfach mit einem Update auf einen Kernel über Version 4.8 behoben werden. Das Update kann man unter Debian ganz einfach mit dpkg -i durchführen, wenn man davor die Kernel-Dateien als .deb heruntergeladen hat. Ubuntu 16.10 verwendet schon den Kernel 4.8 – hiermit habe ich in meinem Fall keine Probleme.

Alternativ hat bei mir auch folgendes Workaround funktioniert:

  1. Editieren der
    /etc/default/grub
  2. Nun unter
    GRUB_CMDLINE_LINUX_DEFAULT

    das folgende innerhalb der Anführungszeichen („“) Einfügen:

    quiet splash intel_idle.max_cstate=1 modprobe.blacklist=dw_dmac,dw_dmac_core
  3. Sollte das auch nicht helfen, kann man noch versuchen, im Recovery Modus (kann man unter Grub beim Starten auswählen) die folgenden Befehle auszuführen: Erst
    X -configure

    danach die erstellte xorg.conf nach /etc/X11 kopieren und anschließend folgende Optionen setzen:

    Option     "NoAccel" "True"

    und

    Option     "DRI" "False"

    .

Ubuntu 16.04: phpMyAdmin zeigt PHP-Code an

Dieses Wochenende habe ich mir einen neuen Rechner zusammengebaut. Nach der Installation von phpMyAdmin zeigte dieses allerdings nur PHP-Code an.

Das Beheben des Problems ist eigentlich ganz einfach. Man muss nur mit dem folgenden Befehl ein fehlendes Paket installieren:

sudo apt-get install libapache2-mod-php7.0

Tutorial: Einen Debian Server absichern

In letzter Zeit werden immer wieder Server für Projekte von „Wronnay“ eingerichtet. Um das Ganze etwas bequemer zu machen, wurde von mir ein Bash-Script erstellt, dass die Grundeinrichtung etwas vereinfacht. Ich möchte jetzt eine kleine Anleitung veröffentlichen, die die Verwendung dieses Scripts erklärt.

Informationen über das Script:

  • Es steht unter der GNU General Public License
  • Es aktualisiert die installieren Pakete
  • Es installiert folgende Pakete: ufw rkhunter fail2ban nano sudo htop whois
  • Es setzt einen Cronjob für tägliche Paket-Updates
  • Es erstellt eine Grundkonfiguration für die Firewall „ufw“
  • Es erstellt einen neuen Benutzer
  • Der Standard-Port für SSH wird geändert und der Login mit dem „root“ – User verboten

Verwendung:

Bevor das Script heruntergeladen werden kann, müssen erst die nötigen Pakete zur Verwendung installiert werden:

Zuerst benötigen wir Root-Rechte:

su

Jetzt installieren wir die benötigten Pakete:

apt-get install nano git

Nun können wir das Script downloaden:

git clone https://github.com/CMiksche/DebianServerBasicConfig.git

Anschließend wechseln wir in das Verzeichnis:

cd DebianServerBasicConfig

Und geben in der config.sh – Datei unsere gewünschten Daten (Benutzername, Passwort, SSH-Port) ein:

nano config.sh

Nach dem Abspeichern der Datei geben wir der Install-Datei noch die passenden Rechte:

chmod 0777 install.sh
chown root install.sh

So. Jetzt können wir die Datei auch ausführen:

./install.sh

Danach müssen wir nur noch das Script löschen:

cd ..
rm -R DebianServerBasicConfig

Fertig. Bei dem nächsten Einloggen über SSH ist jetzt nur noch zu beachten, das man den neuen Port, Benutzer und das neue Passwort verwenden muss.

Tutorial: Benutzername und E-Mail Überprüfung

Ich habe ein Script gebastelt, dass alle Benutzernamen auf verbotene Usernamen und alle E-Mail-Adressen auf E-Mail-Adressen von Wegwerf-Email-Diensten überprüft.

Wer es verwenden will und nicht mehr als 25 Mal am Tag ausführt, kann es gerne nutzen:

<?php
/* Check for illegal Usernames and / or Emails
* Created: 15.02.2015 by Christoph Daniel Miksche (Wronnay)
* Uses the Wronnay Database for illegal Usernames and Emails
* More Informations: check.wronnay.net
*/
function wcms_namecheck($username, $email){
$username = str_replace(' ', '_', $username); // Wandelt Leerzeichen in _ um
$username = strtolower($username); // Wandelt alle Buchstaben in Kleinbuchstaben um
$email = str_replace(' ', '_', $email);
$email = strtolower($email);
// Nur die Domain wird benötigt
$email = substr(strrchr($email, "@"), 1);
// Wronnay E-Mail-Check API-URL
$locked_email = file_get_contents('http://check.wronnay.net/locked_email.php?domain='.$email);
// Leerzeichen raus!
$locked_email = str_replace(' ', '', $locked_email);
// Wronnay Username-Check API-URL
$locked_username = file_get_contents('http://check.wronnay.net/locked_username.php?username='.$username);
// Leerzeichen raus!
$locked_username = str_replace(' ', '', $locked_username);
// Default Wert für den Check setzen
$found = false;
// Username: Check
if($locked_username == 'true') {
$found = true;
}
// E-Mail-Check
elseif($locked_email == 'true') {
$found = true;
}
return $found;
}
?>

Tutorial: mod_rewrite auf Ubuntu-Rechner mit Apache2

Wer einen frischen Ubuntu-Rechner mit LAMP versorgen will, braucht oft auch mod_rewrite und htaccess, um, so wie ich, zum Beispiel die Urls schöner darstellen zu können. Da ich heute vor demselben Problem, wie vor vier Jahren stand (neuer Rechner, der mit mod_rewrite versorgt werden soll), will ich hier eine Anleitung schreiben.

Zuerst: mod_rewrite aktivieren

sudo a2enmod rewrite

Dann: Nötiges Verzeichnis anlegen:

sudo mkdir -p /var/run/apache2
sudo chown -R www-data /var/run/apache2 

Nun: Die Apache2-Config bearbeiten:

sudo gedit /etc/apache2/apache2.conf

Dort:

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

Das AllowOverride auf „All“ setzen:

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>

Anschließend: Neu laden:

sudo /etc/init.d/apache2 force-reload 

Zu beachten:

Anders als auf Debian-Servern, wird auf Ubuntu-Rechnern das aktuelle Verzeichnis anders darstellt:

# AUF UBUNTU-RECHNER:
Options -Indexes
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^([^/]*)$ ./index.php?site=$1 [L]
</IfModule>
# AUF DEBIAN VSERVER:
# Options -Indexes
# <IfModule mod_rewrite.c>
# RewriteEngine On
# RewriteRule ^([^/]*)$ /index.php?site=$1 [L]
# </IfModule>

(Auf Ubuntu: „./index.php“, auf Debian-Server: „/index.php“)

Spam unter WordPress ohne Plugins verhindern!

Ich habe bei einem meiner Projekte das Problem, dass ich WordPress verwende, allerdings keine Plugins oder Themes verwenden kann. Wie verhindert man also bei so einem Projekt Kommentar-Spam?

Es ist eigentlich ganz einfach: Man baut in die functions.php ein paar neue Funktionen gegen Spam ein:

1. Webseiten-Feld entfernen!

Spammer / Spam-Bots wollen ihre Webseite bekannter machen, gibt es kein -Webseiten-Feld ist das Risiko niedriger, dass Spam gepostet wird.

PHP-Code:

function remove_comment_fields($fields) {
    unset($fields['url']);
    return $fields;
}
add_filter('comment_form_default_fields','remove_comment_fields');
 
function rkv_url_spamcheck( $approved , $commentdata ) {
   return ( strlen( $commentdata['comment_author_url'] ) > 1 ) ? 'spam' : $approved;
}
 
add_filter( 'pre_comment_approved', 'rkv_url_spamcheck', 99, 2 );

Diese Funktion entfernt das Webseiten-Feld und markiert Kommentare mit Webseite automatisch als Spam. (Quelle: catswhocode.com)

2. Kommentare mit Links entfernen

Als Nächstes weist man die Besucher des Blogs darauf hin, dass Links in den Kommentaren verboten sind und baut die folgende von mir erstellte Funktion ein, die Kommentare mit Links erkennt.

PHP-Code:

// BBCodes und HTML-Links erkennen - Wronnay.net
function wy_link_on_comment() {
if(stristr($_POST['comment'],"[link=") || stristr($_POST['comment'],"[url=") || stristr($_POST['comment'],"a href=") || stristr($_POST['comment'],"http://")){
wp_die( __('Bitte keine Links posten!') );
}
}
add_action('pre_comment_on_post', 'wy_link_on_comment');

Die Funktion erkennt sogenannte BBCodes, die eigentlich gar nicht in WordPress verwendet werden und normale HTML-Links und weist den Autor darauf hin, dass Links nicht erlaubt sind.

Update (23.04): Ich habe jetzt „ || stristr($_POST[‚comment‘],“http://“)“ hinzugefügt. Der Code erkennt jetzt alle Links.

CSS Tutorial: Personalisierte Checkboxen

Wie ich bereits berichtet habe, nutze ich seit Kurzem personalisierte Checkboxen. In diesem Tutorial möchte ich zeigen, wie das funktioniert.

Zuerst der HTML-Teil:

<span>
  <input type="checkbox" name="channel[]" id="channel1" class="checkbox" value="wronnaysblog">
  <label id="lbl1" for="channel1"> Wronnays (B)log</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel2" class="checkbox" value="wronnaycms">
  <label id="lbl2" for="channel2"> WronnayCMS</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel3" class="checkbox" value="forenhosting">
  <label id="lbl3" for="channel3"> ForenHosting.net</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel4" class="checkbox" value="webpage4me">
  <label id="lbl4" for="channel4"> WebPage4.Me</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel5" class="checkbox" value="cdm">
  <label id="lbl5" for="channel5"> C D Ms Blog</label>
</span>

Nachfolgend der CSS-Teil:

span {
  margin-bottom:1em;
}
input[type="checkbox"],
label[for] {
  display:inline-block;
}
label[for] {
  margin-left:1em;
  cursor:pointer;
}
input[type="checkbox"] {
  visibility:hidden;
}
input[type="checkbox"] + label[for] {
  margin-left:-1em;
}
input[type="checkbox"] + label[for]:before {
  content:"\2713";
  color:white;
  background:white;
  border:1px solid grey;
}
input[type="checkbox"]:checked + label[for]:before {
  color:black;
}
input[type="checkbox"] + label[for]:hover:before,
input[type="checkbox"] + label[for]:focus:before {
  color:grey;
}

content:“\2713″; zeigt das eigentliche Checkbox-Symbol. Das verstecken wir mit „color:white;“ und „background:white;“. Da wir mit „input[type=“checkbox“]:checked“ definieren, wie die Checkbox angeklickt aussehen soll und da „color:black;“ angegeben wurde, wird das Checkbox-Symbol nach dem Anklicken schwarz. Mit „label[for]:hover:before“, „label[for]:focus:before“ und „color:grey;“ geben wir dann noch an, dass das Checkbox-Symbol bei einem Hover- und Focus-Effekt grau sein soll.

Mehrsprachige Webseiten und Suchmaschinenoptimierung

Eine mehrsprachige Webseite ist etwas Schönes. Durch die Vielfalt der Sprachen kann man meist mehr als doppelt so viele Nutzer ansprechen wie vergleichbare einsprachige Webseiten. Allerdings gibt es bei mehrsprachigen Webseiten auch einen Haken: Entweder muss der Nutzer selbst die Sprache auswählen oder die Webseite liest die Daten von dem Browser aus. Das Problem ist, dass Suchmaschinen keine Sprachdaten an die Webseite übermitteln. Also wird die Webseite bei Suchmaschinen mit der Standard-Sprache ausgeliefert (meist ist dies Englisch). So wird aus einer zweisprachigen Webseite bei Google ganz schnell eine einsprachige Webseite. Ich möchte nun meine Lösung zu diesem Problem präsentieren: zwei Domains (bzw.: Subdomains). Denn wenn man zwei Domains für eine Webseite hat, dann kann man die Sprachauswahl so einstellen, dass wenn keine Sprachdaten gefunden werden, einfach die eine Webseite auf Deutsch ausgeliefert wird und die andere auf Englisch. So findet Google statt einer mehrsprachigen Webseite zwei Webseiten mit jeweils einer anderen Sprache. Dies ist optimal für die Suchmaschinenoptimierung.

Hier noch ein Beispiel in PHP:

    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) // Sind Sprachdaten vorhanden?
    {
      $_SESSION['lang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
    }
	else // Keine Sprachdaten vorhanden!
    {
if($_SERVER['SERVER_NAME'] == 'homepage-versammlung.tk') {$_SESSION['lang'] = 'de';}
elseif($_SERVER['SERVER_NAME'] == 'homepage-meeting.tk') {$_SESSION['lang'] = 'en';}	
else {$_SESSION['lang'] = 'en';} 	
    }

Wie man ein Cover erstellt!

Hi, da ich selber gerade versuche von ein paar Cover zu erstellen, möchte ich heute zeigen, wie man ein Cover erstellt.

  1. Ein passendes Lied suchen
  2. Das Lied downloaden (Falls man es noch nicht hat)
  3. (Nur wenn man kein Instrumental-Teil erstellen will) nach den reinen Instrumental-Teil des Songs suchen (Auf YouTube z.B.: mit „Eminem – The Real Slim Shady – Instrumental„)
  4. Nach den Lyrics googeln (z.B.: „Eminem – The Real Slim Shady – Lyrics„)
  5. Die Lyrics ausdrucken
  6. Audacity herunterladen (Falls nicht vorhanden)
  7. Mikrofon (Es geht auch das vom Headset) anschließen
  8. In Audacity ein neues Projekt erstellen, die Instrumental-Datei importieren (evtl.: auch das ganze Lied importieren, falls man zusammen mit dem Songtext singen will)
  9. Aufnahme starten (Normalerweise sollte beim Aufnehmen die importierte Datei abgespielt werden, falls man das nicht mag, kann man es abstellen)
  10. Ergebnis anhören (evtl.: noch bearbeiten)

PS.: Vielleicht veröffentliche ich bald ein paar Lieder 😀