Skip to content

Mehrere Unterprozesse killen

Manchmal, aber nur manchmal ... wenn die Load des Servers zu hoch ist und sich der Prozess (zum Beispiel apache2) nicht beenden lässt, kann diese Zeile Wunder vollbringen oder einfach nur hilfreich sein:

ps ax | grep apache2 | awk '{print $1}' | xargs kill

Gefällt mir

Da die Menschen heutzutage kaum noch Zeit haben zu kommentieren, hat Facebook einen "Gefällt mir" Button erfunden ... ein Klick und schon weiß jeder das der Beitrag echt dufte ist. Doch das reichte Mark Zuckerberg und Co. noch nicht, denn für die Weltherrschaft wird das ganze Internet benötigt. Deswegen gibt es diesen Button nun auch als praktischen IFrame für die eigene Webseite. Da ich immer für einen Spaß zu haben bin, musste dieser Blog für das Experiment "Gefällt mir" herhalten.

Damit dieser Eintrag auch einen gewissen Mehrwert hat, hier mal eine verdammt kurze Anleitung wie dieser Button auf den Blog kommt.

Editieren der entries.tpl und an der gewünschten Stelle den Facebook IFrame einfügen:
<iframe src="http://www.facebook.com/plugins/like.php?href=http://www.wetterling.org{$entry.link}&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px; margin-top:5px;"></iframe>

Das war es dann eigentlich schon. Wie das Ganze aussieht, seht ihr direkt am Ende dieses Eintrags ... also ziemlich genau jetzt.

Russisch Roulette

Und zwar für die Kommandozeile ...

[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo *Click*

Na, wer traut sich? Freiwillige vor! Unerfahrenen Usern sei an dieser Stelle gesagt, das es durchaus zu größeren Problemen kommen kann, wenn man die obige Zeile auf seinem Linuxsystems ausführt.

Serendipity: Kommentare linear darstellen

Kein Problem, wird so mancher sagen. Einfach per Mausklick auf linear und gut ist. Absolut korrekt, aber meine Idee war es, dieses Feature dauerhaft zu verwenden.

Template: Bulletproof

Editieren der entries.tpl und diesen Abschnitt entfernen:
<div class="serendipity_center">{$CONST.DISPLAY_COMMENTS_AS}
{if $entry.viewmode eq $CONST.VIEWMODE_LINEAR}
                        ({$CONST.COMMENTS_VIEWMODE_LINEAR} | <a href="{$entry.link_viewmode_threaded}#comments" rel="nofollow">{$CONST.COMMENTS_VIEWMODE_THREADED}</a>)
                    {else}
                        (<a rel="nofollow" href="{$entry.link_viewmode_linear}#comments">{$CONST.COMMENTS_VIEWMODE_LINEAR}</a> | {$CONST.COMMENTS_VIEWMODE_THREADED})
                    {/if}
</div>

anschließend diese Zeile:
<div id="serendipity_commentlist">{serendipity_printComments entry=$entry.id mode=$entry.viewmode}</div>

ändern in:
<div id="serendipity_commentlist">{serendipity_printComments entry=$entry.id mode=$CONST.VIEWMODE_LINEAR}</div>

Und wer es jetzt ganz perfekt machen möchte, sollte im Kommentar Bereich das "Antworten" deaktivieren. Dazu öffnet man die comments.tpl und sucht nach dieser Zeile:
(<a class="comment_reply" href="#serendipity_CommentForm" id="serendipity_reply_{$comment.id}" onclick="document.getElementById('serendipity_replyTo').value='{$comment.id}'; {$comment_onchange}">{$CONST.REPLY}</a>)

Diese nun einfach löschen. Fertig.

Hinweis: Änderungen an *.tpl Dateien sind nicht update sicher. Soll heißen, das bei einem Update des Templates bzw. von Serendipity die Änderungen überschrieben werden. Also, oberste Regel - BACKUP!

CPG: Download kompletter Alben

Ich suche schon seit einiger Zeit nach DER Lösung, um den Usern ein Zip Download eines kompletten Albums anbieten zu können. Nach einer kleiner Unterhaltung (sehr einseitig) mit dem CPG Forum bin ich dann fündig geworden - hier das Ganze jetzt auf deutsch.

Zunächst einmal erstellt man eine Datei namens zip.php im Root Verzeichnis der Galerie mit folgendem Inhalt:
<?php
include "include/config.inc.php";

/ Write here the name of the folder  where the zip will be created /
$sFolderZip = "zipfiles/";

/ Connecting to the server /
$db = @mysql_connect($CONFIG['dbserver'], $CONFIG['dbuser'], $CONFIG['dbpass'])
   or die (mysql_error());

/ Selecting the database /
$db_check = @mysql_select_db($CONFIG['dbname']);

/ Retrieving pictures list /
$sql = 'SELECT FROM `'.$CONFIG['TABLE_PREFIX'].'pictures` where `aid` = ' . $aid;
$result = mysql_query($sql) OR die(mysql_error());
$bilder = "";
while ($row = mysql_fetch_assoc($result))
   $bilder .= "albums/" . $row['filepath'].$row['filename'].",";

/
Retrieving album name /
$sql = 'SELECT
FROM `'.$CONFIG['TABLE_PREFIX'].'albums` where `aid` = ' . $aid;
$result = mysql_query($sql) OR die(mysql_error());
$o_AlbumName = mysql_fetch_object($result);
$sDesiredZipName = urlencode($o_AlbumName->title);

/ Creating the zip file /
include_once('pclzip.lib.php');
$archive = new PclZip($sFolderZip.$sDesiredZipName . '.zip');
$v_list = $archive->create($bilder);
if ($v_list == 0)
        die("Error : ".$archive->errorInfo(true));

$file = $sFolderZip.$sDesiredZipName.".zip";
$filename = basename($file);
$size = filesize($file);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Length:".$size);
readfile($file);
?>
Anschließend lädt man sich die aktuelle PclZip library herunter und kopiert sie ebenfalls in das Root Verzeichnis seiner Galerie.

Wo wir gerade im Rootverzeichnis sind, schnell noch ein Ordner namens zipfiles angelegt und per chmod 777 die richtigen Rechte verpassen.

Als letzter Schritt muss jetzt nur noch das eigene Theme ein wenig angepasst werden. Öffne hierzu folgende Datei /Pfad_zu_Deiner_Galerie/themes/Dein_Theme/theme.php und füge vor dem abschließende PHP Tag - ?> diesen Code ein:
function theme_display_thumbnails(&$thumb_list, $nbThumb, $album_name, $aid, $cat, $page, $total_pages, $sort_options, $display_tabs, $mode = 'thumb')
{
    global $CONFIG;
    global $template_thumb_view_title_row,$template_fav_thumb_view_title_row, $lang_thumb_view, $template_tab_display, $template_thumbnail_view, $lang_album_list;

    static $header = '';
    static $thumb_cell = '';
    static $empty_cell = '';
    static $row_separator = '';
    static $footer = '';
    static $tabs = '';
    static $spacer = '';

    if ($header == '') {
        $thumb_cell = template_extract_block($template_thumbnail_view, 'thumb_cell');
        $tabs = template_extract_block($template_thumbnail_view, 'tabs');
        $header = template_extract_block($template_thumbnail_view, 'header');
        $empty_cell = template_extract_block($template_thumbnail_view, 'empty_cell');
        $row_separator = template_extract_block($template_thumbnail_view, 'row_separator');
        $footer = template_extract_block($template_thumbnail_view, 'footer');
        $spacer = template_extract_block($template_thumbnail_view, 'spacer');
    }

    $cat_link = is_numeric($aid) ? '' : '&amp;cat=' . $cat;
    $uid_link = (isset($_GET['uid']) && is_numeric($_GET['uid'])) ? '&amp;uid=' . $_GET['uid'] : '';

    $theme_thumb_tab_tmpl = $template_tab_display;

    if ($mode == 'thumb') {
        $theme_thumb_tab_tmpl['left_text'] = strtr($theme_thumb_tab_tmpl['left_text'], array('{LEFT_TEXT}' => $aid == 'lastalb' ? $lang_album_list['album_on_page'] : $lang_thumb_view['pic_on_page']));
        $theme_thumb_tab_tmpl['inactive_tab'] = strtr($theme_thumb_tab_tmpl['inactive_tab'], array('{LINK}' => 'thumbnails.php?album=' . $aid . $cat_link . $uid_link . '&amp;page=%d'));
        $theme_thumb_tab_tmpl['inactive_next_tab'] = strtr($theme_thumb_tab_tmpl['inactive_next_tab'], array('{LINK}' => 'thumbnails.php?album=' . $aid . $cat_link . $uid_link . '&amp;page=%d'));
        $theme_thumb_tab_tmpl['inactive_prev_tab'] = strtr($theme_thumb_tab_tmpl['inactive_prev_tab'], array('{LINK}' => 'thumbnails.php?album=' . $aid . $cat_link . $uid_link . '&amp;page=%d'));
    } else {
        $theme_thumb_tab_tmpl['left_text'] = strtr($theme_thumb_tab_tmpl['left_text'], array('{LEFT_TEXT}' => $lang_thumb_view['user_on_page']));
        $theme_thumb_tab_tmpl['inactive_tab'] = strtr($theme_thumb_tab_tmpl['inactive_tab'], array('{LINK}' => 'index.php?cat=' . $cat . '&amp;page=%d'));
        $theme_thumb_tab_tmpl['inactive_next_tab'] = strtr($theme_thumb_tab_tmpl['inactive_next_tab'], array('{LINK}' => 'index.php?cat=' . $cat . '&amp;page=%d'));
        $theme_thumb_tab_tmpl['inactive_prev_tab'] = strtr($theme_thumb_tab_tmpl['inactive_prev_tab'], array('{LINK}' => 'index.php?cat=' . $cat . '&amp;page=%d'));
    }

    $thumbcols = $CONFIG['thumbcols'];
    $cell_width = ceil(100 / $CONFIG['thumbcols']) . '%';

    $tabs_html = $display_tabs ? create_tabs($nbThumb, $page, $total_pages, $theme_thumb_tab_tmpl) : '';
    // The sort order options are not available for meta albums
    if ($sort_options) {
        $param = array('{ALBUM_NAME}' => $album_name,
            '{AID}' => $aid,
            '{PAGE}' => $page,
            '{NAME}' => $lang_thumb_view['name'],
            '{TITLE}' => $lang_thumb_view['title'],
            '{DATE}' => $lang_thumb_view['date'],
            '{SORT_TA}' => $lang_thumb_view['sort_ta'],
            '{SORT_TD}' => $lang_thumb_view['sort_td'],
            '{SORT_NA}' => $lang_thumb_view['sort_na'],
            '{SORT_ND}' => $lang_thumb_view['sort_nd'],
            '{SORT_DA}' => $lang_thumb_view['sort_da'],
            '{SORT_DD}' => $lang_thumb_view['sort_dd'],
            '{POSITION}' => $lang_thumb_view['position'],
            '{SORT_PA}' => $lang_thumb_view['sort_pa'],
            '{SORT_PD}' => $lang_thumb_view['sort_pd'],
            );
        // MOD - begin
        $param['{ALBUM_NAME}'] .= '&nbsp;<a href="zip.php?aid=' . $aid . '" title="Download album as *zip archive">[ Download Album ]</a>';
        // MOD - end
        $title = template_eval($template_thumb_view_title_row, $param);
    } else if ($aid == 'favpics' && $CONFIG['enable_zipdownload'] == 1) { //Lots of stuff can be added here later
       $param = array('{ALBUM_NAME}' => $album_name,
                             '{DOWNLOAD_ZIP}'=>$lang_thumb_view['download_zip']
                               );
       $title = template_eval($template_fav_thumb_view_title_row, $param);
    }else{
        $title = $album_name;
    }


    if ($mode == 'thumb') {
        starttable('100%', $title, $thumbcols);
    } else {
        starttable('100%');
    }

    echo $header;

    $i = 0;
    foreach($thumb_list as $thumb) {
        $i++;
        if ($mode == 'thumb') {
            if ($aid == 'lastalb') {
                $params = array('{CELL_WIDTH}' => $cell_width,
                    '{LINK_TGT}' => "thumbnails.php?album={$thumb['aid']}",
                    '{THUMB}' => $thumb['image'],
                    '{CAPTION}' => $thumb['caption'],
                    '{ADMIN_MENU}' => $thumb['admin_menu']
                    );
            } else {
                $params = array('{CELL_WIDTH}' => $cell_width,
                    '{LINK_TGT}' => "displayimage.php?album=$aid$cat_link&amp;pos={$thumb['pos']}$uid_link",
                    '{THUMB}' => $thumb['image'],
                    '{CAPTION}' => $thumb['caption'],
                    '{ADMIN_MENU}' => $thumb['admin_menu']
                    );
            }
        } else {
            $params = array('{CELL_WIDTH}' => $cell_width,
                '{LINK_TGT}' => "index.php?cat={$thumb['cat']}",
                '{THUMB}' => $thumb['image'],
                '{CAPTION}' => $thumb['caption'],
                '{ADMIN_MENU}' => ''
                );
        }
        echo template_eval($thumb_cell, $params);

        if ((($i % $thumbcols) == 0) && ($i < count($thumb_list))) {
            echo $row_separator;
        }
    }
    for (;($i % $thumbcols); $i++) {
        echo $empty_cell;
    }
    echo $footer;

    if ($display_tabs) {
        $params = array('{THUMB_COLS}' => $thumbcols,
            '{TABS}' => $tabs_html
            );
        echo template_eval($tabs, $params);
    }

    endtable();
    echo $spacer;
}

Fertig.

Serendipity: Einbinden von Google Adsense

Nachdem ich mich vor ein paar Tagen bei Google Adsense angemeldet hatte, stand jetzt natürlich die Frage im Raum - Wohin mit der Werbung?

Möglichkeit 1:
Seitenleisten-Plugins - HTML Nugget / Klotz
Der Nachteil dabei ist, das dies die Seitenleiste nur unnötig verlängert und der Besucher es nicht immer im Blickfeld hat!

Möglichkeit 2:
Ereignis-Plugins - HTML Nugget on Page
Der Nachteil ist, das die Werbung unter jedem einzelnen Eintrag angezeigt wird!

Möglichkeit 3:
Editieren der entries.tpl in dem verwendeten Template (in meinem Beispiel Andreas08). Hierbei hat man die Möglichkeit die Werbung nur im ersten oder zweiten Eintrag anzeigen zu lassen.

Suche:
{foreach from=$entries item="dategroup"}
Ersetze:
{foreach name=baseloop from=$entries item="dategroup"}

Suche:
{foreach from=$dategroup.entries item="entry"}
Ersetze:
{foreach name=entryloop from=$dategroup.entries item="entry"}

Suche eine Position in der entries.tpl, wo du das Google Adsense Werbefeld angezeigt haben möchtest und füge folgenden Code (Konfiguriert für jeden 1. Eintrag) dort ein:
{if ($smarty.foreach.baseloop.index == 0 AND $smarty.foreach.entryloop.index == 0) OR $smarty.foreach.baseloop.index == 0 AND $smarty.foreach.entryloop.index == 0}
            <p />
            <div align="center">
                    <!-- Google Adsense Code -->
            </div>
{/if}

Simple Machines Forum - Login / Logout

Wer ein Simple Machines Forum betreibt und gerne auf einer externen Seite ein Login / Logout anbieten möchte, sollte sich mal den nachfolgenden Code anschauen! ;-)

<?
require("/<Pfad_zum_Forum>/forum/SSI.php");

$current_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
?>

Hier noch ein kleines Beispiel, wie man die Login / Logout eingebettet im HTML Code verwenden könnte:
<? if ($context['user']['name'])
{
  ?><div align="center"><?ssi_logout($current_url);?></div><?
}
  else
{
  ssi_login2($current_url);
} ?>

Eine wahre Fundgrube

Als überzeugter Nutzer der Google Services bin ich heute über Google Code gestolpert! Herrlich, wie man sich da "verklicken" kann! So, bin jetzt erst einmal für ein paar Stunden beschäftigt! :-P