Znam język programowania X, ale nie mam pomysłu na aplikację

Tym razem temat trochę bardziej na luzie. Na grupach dyskusyjnych pojawia się często pytanie od początkujących programistów o pomysły na aplikację: a to na prywatny projekt, a to na jakąś pracę inżynierską czy magisterską, itp. Pytania te są dziwne, ponieważ bardzo często przyczyną rozpoczęcia nauki programowania jest niezadowolenie z używanych aktualnie narzędzi albo potrzeba zautomatyzowania sobie pracy. Oczywiście, jest jeszcze druga grupa ludzi, którzy usłyszeli/przeczytali, że „programowania można się nauczyć przerabiając tutorial i wtedy co miesiąc dostaje się górę kasy” – ale to w sumie temat na inny wpis 🙂

No dobra, wybraliśmy język programowania. Oczywiście, mówię tutaj o języku programowania – jeśli ktoś przerobił kurs HTML i/lub CSS to można powiedzieć, że dopiero „liznął” temat jako, że wspomniane technologie nie są językami programowania 🙂 Jak to jednak mówią – Nawet najdalszą podróż zaczyna się od pierwszego kroku.
Więc odbębniliśmy już 15 kursów i 150 tutoriali w wybranej przez nas technologii (oczywiście jest ona najlepsza ze wszystkich dostępnych :)), dowiedzieliśmy się jak poskładać dostępne klocki, żeby napisać program "Witaj świecie!\n"  powtarzany dowolną ilość razy. Ale w sumie co teraz? Chyba z tego „Witaj świecie” nie uda się wyciągnąć 15k na miesiąc. Może jednak zostawić wszystko i wyjechać „w góry na Mazury”?
Oczywiście jako początkujący programista (tzw. junior) mamy szansę na zatrudnienie. Szanse są, ale jest to uzależnione od zbyt wielu innych kryteriów – to też byłby dobry temat na oddzielny wpis.

Zgaduję, że nie mamy się jeszcze za bardzo czym pochwalić potencjalnemu pracodawcy, więc jedną z najlepszych rzeczy jakie możemy zrobić gdy zaczynamy budować swoją przyszłość zawodową jako najlepszy developer w branży IT to zbudowanie swojego portfolio. Oczywiście, generalizuję w tej chwili. Przykładowo takich Panów jak Guido van Rossum czy Douglas Crockford nie zatrudnia się ze względu na ich bogate portfolio 🙂

Tu pojawia się pewnie w wielu głowach pytanie: Spoko, to co mam napisać?
Odpowiedzią na to pytanie niech będzie ta krótka lista – dłuższe listy z konkretnymi propozycjami projektów znaleźć można już pod dostępnymi linkami:

  1. Aplikacja na Androida z pomysłami podzielonymi na kategorie oraz stopnie trudności – Programming Ideas 2
  2. Lista niewielkich mini-programów do napisania o różnych stopniach trudności – Dailyprogrammer w serwisie Reddit
  3. What Should I Make? Beginner Programming Project Ideas
  4. Przytaczana w wielu miejscach lista: Martyr2’S Mega Project Ideas List!
  5. Kolejna lista z propozycjami projektów
  6. Krótka, pogrupowania lista Over 1,500 Coding Project Ideas z kilkoma różnymi źródłami
  7. Top 27 Programming Project Ideas For Beginners
  8. 5 Project Ideas To Help You Learn Programming Faster
  9. Ideas for Coding Projects
  10. 1000+ Beginner Programming Projects
  11. „I Need Practice Programming”: 49 Ideas for Game Clones to Code

Jak widać, pomysłów jest naprawdę całkiem sporo. Gdyby postawić sobie za cel wykonać nawet połowę z tych projektów – życia by nie starczyło. Oczywiście, nie polecam rzucać się od razu na jakiś ekstremalnie duży projekt, ponieważ istnieje ryzyko, że się szybko zniechęcisz.

Ponadto, jeśli już wciągnęło Cię programowanie i/lub potrzebujesz miejsca na „praktykowanie” swoich umiejętności, poniżej kilka dodatkowych zasobów do codziennych ćwiczeń:

  1. https://py.checkio.org/
  2. https://www.codewars.com/
  3. https://coderbyte.com/
  4. https://codefights.com/
  5. http://exercism.io/
  6. http://codekata.com/
  7. http://www.codeabbey.com/

Niewątpliwą zaletą tych stron jest możliwość konkurowania z innymi programistami i podglądanie często rewelacyjnych rozwiązań, które poszerzą naszą wiedzę na temat danego języka. Nawet do głowy by nam nie przyszło jak ładnie czy zwięźle można rozwiązywać niektóre problemy.

 

Django – zwracanie pustego zbioru

QuerySet to jedna z podstawowych klas, z którą będziemy pracować w trakcie pisania aplikacji w Django. Trafiłem ostatnio na problem, w którym należało zwrócić inne wyniki w zależności od tego, czy w żądaniu do serwera przesłana została zmienna w postaci pustego łańcucha znaków czy nie została wysłana w ogóle. Drobna różnica mająca ogromne znaczenie. Aby dokładniej zobrazować zaistniały problem postaram się to opisać z przykładami:

Żądany adres http://127.0.0.1/ skutkuje zwróceniem wszystkich wyników – brak jakiegokolwiek filtrowania

Żądany adres http://127.0.0.1/?q= skutkuje brakiem wyników – filtrowanie jest, ale wyszukiwanie po pustym łańcuchu – który de facto pasuje do każdego dowolnego łańcucha znaków też zwróciłoby wszystkie wyniki – a tutaj potrzebowałem zwrócić pusty zbiór.

Żądany adres http://127.0.0.1/q=abc skutkuje zwróceniem wszystkich wyników, które w swojej treści zawierają łańcuch znaków „abc” – tutaj sprawa jest oczywista.

Ponieważ zwrócić musiałem obiekt QuerySet sprawa się komplikowała – a rozwiązaniem okazał się taki prosty kawałek kodu:

Odtwarzanie tabeli InnoDB

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

Eksport wszystkich baz z MySQL do plików SQL

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 />';
   }

PhpMyAdmin – konfiguracja autologowania

Po ściągnięciu najnowszej wersji PhpMyAdmin praktycznie każda próba wejścia do panelu będzie wymagała od nas podania loginu i hasła. Na komputerach developerskich często jest to niewielkie utrudnienie. Aby logowanie następowało automatycznie należy:
1. Otwieramy plik PhpMyAdmin/libraries/config.default.php, gdzie PhpMyAdmin to lokalizacja panelu na serwerze.
2. Zmieniamy wartość:

$cfg['Servers'][$i]['host'] = 'localhost'; // lub odpowiednia nazwa hosta, o ile wcześniej nie była ustawiona

3. Zmieniamy wartość:

$cfg['Servers'][$i]['auth_type'] = 'config'; // wcześniej cookie

4. Zmieniamy wartość:

$cfg['Servers'][$i]['user'] = 'mysql_username'; // nazwa użytkownika, najczęściej root

5. Zmieniamy wartość:

$cfg['Servers'][$i]['password'] = 'mysql_password'; // hasło użytkownika, najczęściej użytkownika root

6. Wchodzimy na stronę PhpMyAdmin na naszym serwerze i powinniśmy automatycznie być zalogowani.