Jeszcze jeden blog o PHP

Radosne twórczości leniwego programisty PHP

Odtwarzanie tabeli InnoDB

leave a comment »

MySQL logoW kilku projektach zdarzyło mi się z bliżej nieokreślonych powodów podczas próby czyszczenia cache w Drupalu wystąpienie błędu MySQL w postaci:

mysql> show tables;
+--------------------------------------+
| Tables_in_drupal7demo                |
+--------------------------------------+
| ...                                  |
| cache_apachesolr                     |
| ...                                  |
+--------------------------------------+
108 rows in set (0.00 sec)
mysql> TRUNCATE `cache_apachesolr`;
ERROR 1146 (42S02): Table 'drupal7demo.cache_solr' doesn't exist

Mogło to być spowodowane wykonaniem polecenia TRUNCATE `cache_apachesolr` i sposobem w jaki w rzeczywistości wykonywane jest polecenie TRUNCATE.

Jednym z najprostszych rozwiązań jakie udało mi się znaleźć jest odtworzenie struktury tabeli, a ponieważ praktycznie każda próba odczytu/zapisu z/do tabeli zwróci komunikat błędu (np.: ERROR 1030 (HY000): Got error -1 from storage engine) musimy dodać jeszcze jedno polecenie w ostateczności wykonując poniższe polecenia:

ALTER TABLE `cache_apachesolr` DISCARD TABLESPACE;
DROP TABLE IF EXISTS `cache_apachesolr`;
CREATE TABLE `cache_apachesolr` (
`cid` varchar(255) NOT NULL DEFAULT '' COMMENT 'Primary Key: Unique cache ID.',
`data` longblob COMMENT 'A collection of data to cache.',
`expire` int(11) NOT NULL DEFAULT '0' COMMENT 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
`created` int(11) NOT NULL DEFAULT '0' COMMENT 'A Unix timestamp indicating when the cache entry was created.',
`serialized` smallint(6) NOT NULL DEFAULT '0' COMMENT 'A flag to indicate whether content is serialized (1) or not (0).',
PRIMARY KEY (`cid`),
KEY `expire` (`expire`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Cache table for apachesolr to store Luke data and...';

Potencjalne przyczyny problemu: http://dba.stackexchange.com/a/6269

Źródło rozwiązania: http://www.palominodb.com/blog/2011/11/02/how-recreate-innodb-table-after-tablespace-has-been-removed

Kilka innych pomysłów, które można wypróbować by odzyskać tabele: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file

Written by Filip Górczyński

2014.01.11 at 06:04:13

Chrome – problem z wczytywaniem zasobów (obrazków, CSS)

with one comment

Chrome IconKilka instalacji temu pojawiła się w Google Chrome dziwna przypadłość, że nie zawsze wczytuje zasoby, a pomaga dopiero kilkukrotne odświeżenie strony. Proponowane rozwiązania to m. in.: włączenie trybu incognito, czyszczenie cache całego Chrome’a, zmiany w konfiguracji związane z pobieraniem treści stron „na zapas” (przewidywanie?), wyłączanie rozszerzeń, wszelakie kombinacje z ustawieniami proxy, z ustawieniami firewall i antywirusa, ponowne uruchamianie komputera w „safe mode”, reinstalacje sterowników i wiele innych.

W chwili obecnej problem udało się rozwiązać w 2 przypadkach, a jedyne co trzeba było zrobić to:

1. Pobrać aktualną wersję pliku instalacyjnego Google Chrome: klikamy „Pobierz Chrome”.

chromefix_step_12. Udajemy, że akceptujemy klikając „Zaakceptuj i zainstaluj”.

chromefix_step_2

3. Następnie proces ten przerywamy i zamykamy okienko instalacji.

chromefix_step_34. Klikamy „kliknij  tutaj, by spróbować ponownie”.

chromefix_step_45. Będziemy mogli dzięki temu pobrać plik ChromeSetup.exe bezpośrednio – bez uruchamiania automagicznej instalacji.

chromefix_step_56. Gdy już pobierzemy plik na dysk, klikamy na niego prawym przyciskiem myszy, otwieramy okienko „Właściwości” i klikamy „Odblokuj” (prawdę mówiąc, nie wiem dokładnie jakie ma to znaczenie dla systemu operacyjnego :) ). Klikamy OK.

chromefix_step_67. Ostatni krok, prawym przyciskiem myszy klikamy na pliku i wybieramy opcję „Uruchom jako administrator”.

chromefix_step_78. Ostatni krok to najzwyklejsze klikanie dalej podczas instalacji.

Written by Filip Górczyński

2013.11.28 at 18:52:32

cd na sterydach – narzędzie do szybkiej zmiany katalogów w konsoli

leave a comment »

Przeglądając dziś RSSy natrafiłem na genialne w swej prostocie narzędzie – przydatne szczególnie dla osób spędzających dużo czasu w konsoli. Narzędzie to nosi prostą nazwę „go-tool” i dostępne jest pod adresem http://code.google.com/p/go-tool/, a jego jedynym zadaniem jest skrócić czas dostępu do najczęściej odwiedzanych katalogów poprzez tworzenie skrótów.

Instalacja narzędzia jest dość prosta – o ile posiadamy zainstalowanego Pythona:
1. Pobranie archiwum.
2. Rozpakowanie.
3. Przejście do rozpakowanego katalogu z poziomu konsoli.
4. Uruchomienie polecenia: python setup.py install.
5. Uruchomienie pliku go.py w nowo utworzonym katalogu: build/lib/go.py.
6. Wybranie lokalizacji umieszczenia pliku go.bat poprzez wybranie z listy ścieżek.
7. Konfiguracja skrótów już w trakcie korzystania z narzędzia.

Instrukcja obsługi dostępna jest po wywołaniu (http://code.google.com/p/go-tool/wiki/GettingStarted):

$ go --help
Quick directory changing.

Usage:
go <shortcut>[/sub/dir/path]    # change directories
# same as "go -c ..."
go -c|-o|-a|-d|-s ...           # cd, open, add, delete, set
go --list [<pattern>]           # list matching shortcuts

Options:
-h, --help                      print this help and exit
-V, --version                   print verion info and exit

-c, --cd <path>                 cd to shortcut path in shell
-s, --set <shortcut> <dir>      set a shortcut to <dir>
-a, --add-current <shortcut>    add shortcut to current directory
-d, --delete <shortcut>         delete the named shortcut
-o, --open <path>               open the given shortcut path in
explorer (Windows only)
-l, --list [<pattern>]          list current shortcuts

Ciekawą opcją – dostępną tylko w Windows – jest przełącznik -o, który w momencie użycia:

go -o <SKRÓT>

powoduje otwarcie okna w Eksplorerze Windows z katalogiem wskazywanym na <SKRÓT>.

Written by Filip Górczyński

2013.02.28 at 23:43:11

Eksport wszystkich baz z MySQL do plików SQL

with 5 comments

Eksport wszystkich baz danych z MySQL.

<?php
header('Content-type: text/html; charset=utf-8');
class Config {
   public static $host = '127.0.0.1';
   public static $username = 'root';
   public static $password = '';
   public static $port = 3306;
}

if (!file_exists('dbdumps') || !is_dir('dbdumps'))
   mkdir('dbdumps', 0700);

$dsn = 'mysql:host=' . Config::$host . ';port=' . Config::$port;
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
$dbh = new PDO($dsn, Config::$username, Config::$password, $options);

$result = $dbh->query('SHOW DATABASES;');
if ($result !== false)
   foreach ($result->fetchAll() as $row) {
      $cmd = 'mysqldump -u ' . Config::$username . ' -p' . Config::$password
         . ' ' . $row['Database'] . ' > dbdumps/' . $row['Database'] . '.sql';
      system($cmd);
      $fileSize = filesize('dbdumps/' . $row['Database'] . '.sql');
      echo 'File ' . $row['Database'] . '.sql saved [' . $fileSize . ' bytes] .<br />';
   }

Written by Filip Górczyński

2012.10.12 at 19:09:15

Drupal 6 – Własny blok zmiany języka

leave a comment »

Domyślny blok „Przełączanie języków” nie posiada zbyt ciekawych możliwości formatowania. Często tego typu elementy opisuje się w HTML na liście, co później znacznie ułatwia dla tej struktury określanie kaskadowych arkuszy stylów. Poniżej  sposób na zastosowanie swojego bloku bazujący na module locale domyślnie dostarczanym z Drupalem:

<?php
/**
* Implements hook_block();
*/
function hook_block($op = 'list', $delta = 0, $edit = array()) {
  if ($op == 'list') {
    $blocks['custom_language_switcher'] = array(
      'info' => t('Custom Language Switcher'),
    );
  return $blocks;
} else if ($op == 'view') {
  switch ($delta) {
    case 'custom_language_switcher':
      if (variable_get('language_count', 1) > 1
        && variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE) != LANGUAGE_NEGOTIATION_NONE) {
        $path = drupal_is_front_page() ? '<front>' : $_GET['q'];
        $languages = language_list('enabled');
        $links = array();
        foreach ($languages[1] as $language)
          $links[$language->language] = array(
            'href' => $path,
            'title' => $language->native,
            'language' => $language,
            'attributes' => array('class' => 'language-link'),
          );
        drupal_alter('translation_link', $links, $path);

        $block = array(
          'subject' => t('Custom Language Switcher'),
          'content' => _custom_get_language_switcher($links)
        );
      }
      break;
    }
    return $block;
  }
}

function _custom_get_language_switcher($links = array()) {
  global $language;
  $html = '';
  if (count($links)) {
    $html = '<ul class="language-switcher">';
    foreach ($links as $key => $value) {
    $active = '';
      if ($key == $language->language)
        $active = ' class="active"';
      $html .= "\t\t" . '<li' . $active . '><a href="' . url($value['href'], array('language' => $value['language'])) . '"' . $active . '>' . $value['title'] . '</a></li>' . "\n";
    }
    $html .= "\t" . '</ul>' . "\n";
  }
  return $html;
}

Written by Filip Górczyński

2012.10.12 at 18:56:26

Drupal 7 – instalacja w języku polskim

leave a comment »

System Drupal sprowadza proces instalacji do możliwie najprostszych kroków i instalacja w języku angielskim jest bardzo intuicyjna, jednak czasem może zaistnieć potrzeba wprowadzenia instalacji w języku ojczystym.

Podczas uruchomienia procesu instalacyjnego Drupala drugi krok prosi nas o wybranie języka instalacji.

Jeśli potrzebujemy innego języka niż angielski dostajemy link prowadzący do opisu jak zrealizować instalację we własnym języku (Learn how to install Drupal in other languages – Naucz się jak zainstalować Drupala w innych językach). Jeśli ktoś nie poradziłby sobie z instalacją Drupala w języku angielskim, to zapewne także niewiele zrozumie z tego opisu.

Zgodnie z tym opisem przechodzimy na stronę z tłumaczeniem projektu Drupal (http://localize.drupal.org/translate/downloads) i wyszukujemy interesujący nas język. W naszym przypadku pobieramy język Polski

a ponieważ instalujemy Drupala w wersji 7 pobieramy najaktualniejsze tłumaczenie – dla wersji 7.15.
Zgodnie z krokiem drugim poradnika pobrany plik musimy skopiować do katalogu w którym przechowujemy Drupala – dokładnie do katalogu /profiles/standard/translations/.

Ostatni krok to kliknięcie linka „Reload the language selection page after adding translations” lub najzwyklejsze odświeżenie strony co przeniesie nas do kroku drugiego naszej instalacji:

Wybieramy język Polski i cieszymy się instalacją w rodzimym języku.

Written by Filip Górczyński

2012.09.08 at 21:22:46

Przenoszenie linii lub zaznaczonego bloku w górę i w dół w Komodo Edit

leave a comment »

Komodo Edit jako jeden z ciekawszych edytorów pozwala pisać własne makra w językach JavaScript i Python. Mimo ogromnej ilości przydatnych funkcji nie posiada wbudowanego przenoszenia bloków oraz zaznaczenia w górę i w dół. Poniżej makra, które dodają takie działanie do Komodo Edit. Aby wszystko działało jak należy w Views | Tabs & Sidebars | Toolbox klikamy prawym przyciskiem myszy i wybieramy Add > New macro. Podajemy opisowe nazwy, np: Move Line or Move Selection Up, Move Line or Move Selection Down, jako język wybieramy JavaScript i w pole tekstowe wprowadzamy poniższe bloki kodu – otrzymujemy 2 makra. Aby korzystanie było wygodne podpinamy w drugiej zakładce (Key Bindings) skróty klawiaturowe, u mnie Ctrl+Shift+Up oraz Ctrl+Shift+Down.

Przenoszenie linii lub zaznaczonego bloku w dół:

komodo.assertMacroVersion(3);
if (komodo.view) { komodo.view.setFocus() };

var ke = komodo.editor;

if( ke.lineFromPosition( ke.currentPos ) == (ke.lineCount - 1) )
     return;

if (ke.selText){

     // Extend selection to beg of line at front and end of line at back
     var selStartLine     = ke.lineFromPosition(ke.selectionStart);
     var selEndLine       = ke.lineFromPosition(ke.selectionEnd);
     var numLinesSelected = selEndLine - selStartLine;

     var selStart = ke.positionFromLine(selStartLine);
     var selEnd   = ke.getLineEndPosition(selEndLine);

     ke.setSel(selStart, selEnd);

     // Copy the selected text and remove it
     var text =  komodo.interpolate('%s');
     komodo.doCommand('cmd_delete'); // This leaves a blank line in place of selection

     // Move our selection to a new place
     // First move our blank line up
     komodo.doCommand('cmd_lineNext')
     ke.lineTranspose();

     // Insert our text
     ke.insertText(ke.currentPos, text);

     // Restore selection
     var newSelStartLine = ke.lineFromPosition( ke.currentPos );
     var newSelEndLine   = newSelStartLine + numLinesSelected;

     var newSelStart = ke.currentPos;
     var newSelEnd   = ke.getLineEndPosition(newSelEndLine);

     ke.setSel(newSelStart, newSelEnd);

} else {

     komodo.doCommand( 'cmd_lineNext' );
     ke.lineTranspose();
}

Przenoszenie linii lub zaznaczonego bloku w górę

komodo.assertMacroVersion(3);
if (komodo.view) { komodo.view.setFocus() };

var ke = komodo.editor;

if( ke.lineFromPosition( ke.currentPos ) == 0 )
     return;

if (ke.selText){

     // Extend selection to beg of line at front and end of line at back
     var selStartLine     = ke.lineFromPosition(ke.selectionStart);
     var selEndLine       = ke.lineFromPosition(ke.selectionEnd);
     var numLinesSelected = selEndLine - selStartLine;

     var selStart = ke.positionFromLine(selStartLine);
     var selEnd   = ke.getLineEndPosition(selEndLine);

     ke.setSel(selStart, selEnd);

     // Copy the selected text and remove it
     var text =  komodo.interpolate('%s');
     komodo.doCommand('cmd_delete'); // This leaves a blank line in place of selection

     // Move our selection to a new place
     // First move our blank line up
     ke.lineTranspose();
     komodo.doCommand('cmd_linePrevious')

     // Insert our text
     ke.insertText(ke.currentPos, text);

     // Restore selection
     var newSelStartLine = ke.lineFromPosition( ke.currentPos );
     var newSelEndLine   = newSelStartLine + numLinesSelected;

     var newSelStart = ke.currentPos;
     var newSelEnd   = ke.getLineEndPosition(newSelEndLine);

     ke.setSel(newSelStart, newSelEnd);

} else {

     ke.lineTranspose();
     komodo.doCommand( 'cmd_linePrevious' );
}

Jeśli dobrze pamiętam to rozwiązanie pochodzi z forum ActiveState dotyczącego Komodo.

Written by Filip Górczyński

2012.09.08 at 21:01:22

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.

Join 153 other followers

%d bloggers like this: