Profruit banner

Умен звънец в openHAB

16 декември 2023

Телефонът е винаги с мен и сега, където и да се намирам получавам известие от openHAB, че някой е позвънил и чака пред вратата. А ако ме няма вкъщи става ясно часа и датата на последното позвъняване.

Tasmota Multipress

30 септември 2023

Идеята е Sonoff Touch T1 US 2 в салона, да управлява освен своето осветление и това в кухнята, а още вентилатора.

DIY 12V 1A WiFi Router UPS

22 април 2023

При поредно прекъсване на захранването вкъщи, батерията на нoтбука и двата UPS автоматично превключват на аварийно захранване и едновременно полита съобщение за конфуза

Zigbee2MQTT клониране

21 януари 2023

... как да клонираме съществуваща настройка на Zigbee2MQTT без да се налага последвало интервю на zigbee-устройствата.

LD2410 - бюджетен датчик присъствие в openHAB

11 февруари 2023

Цената на HLK-LD2410 зададе име на поредната тема в моя блог. С негова помощ се постига "народен" датчик присъствие в домашната автоматизация. . ...

Stop


PHP 5.5 предлага нов начин за хеширане на пароли с сол. Тази техника се използва отдавна, но за получаване на желан резултат се изискваше много действия или прибягване до допълнителни библиотеки. Разработчиците идват на помощ, като въвеждат две нови функции в PHP 5.5 за целта.
  • password_hash
  • password_verify
Нека разгледаме как работят.

Действията се свеждат до създаване на лаконична база данни и подобен php-код.


Създаване на база данни и таблица

-- изтриване на test, ако съществува
-- DROP DATABASE `test`;

-- създаване на test
CREATE DATABASE IF NOT EXISTS `test` 
CHARACTER SET utf8 
COLLATE utf8_general_ci;

-- създаване на таблица users
CREATE TABLE IF NOT EXISTS `test`.`users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `password` varchar(60) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

-- въвеждане на инфо
INSERT INTO `test`.`users` (`id`, `username`, `password`) 
VALUES (1, 'profruit', 'butterfly');

-- заявка
SELECT * FROM `test`.`users` LIMIT 1;
В резултат на поредицата команди получаваме това.

таблица users

Ясно, че съхранението на пароли в открит вид в базата данни е глупаво. Ела кумчо изяж ме!

Това остава без труд злоумишленик, докопал се до съдържанието на базата. На свой ред ще направим така, че дори паролите да попаднат в ръцете на хакер, те да останат неотключени, като хешираме паролите и добавим към тях ключ с произволен комплект символи.

Създаване на тестови сайт

Копирайте всеки един файл, посочен долу и създайте подобна структура на вашия сървър.

Съдържанието на сайта за придобиване на представа.

сайт отвътре

Файл config.php съдържа константи, а те пък нужните имена и пароли за съединение към конкретната база данни.

config.php
<?php
 // конфигурация на база данни
 define("DB_SERVER", "localhost");
 define("DB_USER", "johnsmith");
 define("DB_PASS", "hackerpassword");
 define("DB_NAME", "test");

Файл convert.php хешира паролата.
Той ще извлече паролата от базата данни. Ще я отпечата в браузъра, след което хешира с помощта на функция password_hash() и отново отпечата в браузъра за съпоставка преди-после. На края ще обнови паролата в хеширан вид в базата данни.

хеширана парола

Солта (YoKo%jOhn&*;!*1234<butt$>?) е произволен набор от символи, не по-малко от 22 на брой. Тя е поместена в константа SALT и е плод на вашето въобръжение. Солта остава в php-файл, далеч от базата данни и това усложнява задача на злоумишленика. А при повишена параноя може да се изнесе в файл зад пределите на root-директорията на сървъра.

PDO e използвано в качеството на пример и всякакви коментари около него се приветсват. За простота на кода се налага ограничение от изпълнение на този файл само веднъж, иначе ще хеширате отново.

Най-отдолу има хиперлинк, който ще ви отведе към файла за сравнение на паролите. Преминете по него.

convert.php
<?php include ('pdo.inc.php'); ?>

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
    <title>конвертитане на паролата</title>
</head>
<body>

 <p>Парола в чист вид: <?= $password?></p>
    <p>Парола с сол: 
  <?php
   // СОЛ - 22 произволни символа
   DEFINE("SALT", "YoKo%jOhn&*;!*1234<butt$>?");
   
   // хеширане на паролата
   echo $hashPassword = password_hash($password, PASSWORD_BCRYPT, ['salt' => SALT]);
  ?>
    </p>
 <?php
  // чист вид
  // UPDATE `test`.`users` SET `password` = 'butterfly' WHERE `users`.`id` =1;
  
  // обновена с сол
  $sql = "UPDATE users SET password = :password WHERE id = :id";
  $istmt = $db->prepare($sql);
  $istmt->execute([':password' => $hashPassword, ':id' => $id]);
 ?>
 
 <a href="./verify.php?password=">сравнение на паролите</a>
</body>
</html>

За елегантност и по-удобна читаемост отделяме файл pdo.inc.php, като самостоятелен. Той се включва в началото на convert.php. Коментарите следва да ви ориентират.

pdo.inc.php
<?php
 // съединение с база данни
 require ('config.php');
 $db = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME, DB_USER, DB_PASS);
 
 // заявка и подготовка
 $sql = "SELECT * FROM users LIMIT 1";
 $stmt = $db->prepare($sql);
 
 // изпълнение
 $stmt->execute();
 
 // подстановка на полетата в променливи
 $stmt->bindColumn('id', $id);
 $stmt->bindColumn('username', $username);
 $stmt->bindColumn('password', $password);

 $stmt->fetch()
?>
Резултат от действието на convert.php.

хеширане на паролата

Забележете адреса в статус бара, към когото ще бъдете пренасочени, а там ви очаква следния прозорец на вид.

сравняване на паролата

Този прозорец се изрисува от файл verify.php.

verify.php

<?php include ('mysqli.inc.php'); ?>

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
    <title>сравнение</title>
</head>
<body>
  <?php if(empty($pass_from_url)): ?>
        <p>въведете парола</p>  
    <?php elseif (password_verify($pass_from_url, $pass_from_db)): ?>
        <i>вярна парола</i>
    <?php else: ?>
        <i>невярна парола</i>
    <?php endif; ?>
</body>
</html>

Файлът съпоставя значенията на хешираната парола от базата данни с въведената в адресното поле на браузъра. Работейки по този начин отпада нужда от форма за въвеждане.

mysqli-драйверът е ползван в качеството на пример, в стил процедурен код. А изяществото налага разделяне на php-кода от html в отделен файл mysqli.inc.php. Коментарите по кода ще ви въведат в обстановката.


mysqli.inc.php
<?php 
 // URL заявка
 $url = @rtrim($_GET['password']);
 $pass_from_url = isset($_REQUEST['password']) ? $url : '';
 
 if(!empty($pass_from_url)){
  
  // съединение с база данни
  require ('config.php');
  $connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
 
  // успех на съединението
  if(mysqli_connect_errno()) {
   die("Database connection kaput.");
  }
 
  // DB заявка
  $sql = "SELECT password FROM users LIMIT 1";
  $query = mysqli_query($connection, $sql);
 
  // обработка на резултата
  $result = mysqli_fetch_assoc($query);
  $pass_from_db = $result['password'];
 
  // освобождаване на ресурси
  mysqli_free_result($query);
  mysqli_close($connection);
  
  // въведена парола
  echo "{$url} е: ";
 }
?>

И нека пробваме с произволна парола hacker92. Резултат.

невярна на паролата

А сега въведем вярната парола butterfly.

вярна на паролата

Bingo!

извор:
Password Hashing
Salted Password Hashing





до нови срещи   ^.^
19.10.2013 profruit 
| |

Все още няма комплект под Windows 7, предлагащ PHP 5.5 и Apache 2.4 към датата на публикация. Визирам XAMPP, Denwer 3 и прочие подобия. Затова реших да покажа на Windows - потребителите как всеки един от вас може да инсталира PHP 5.5 с минимум усилия и време.

Обещавам ви, че в края на публикацията вие ще забравите изброените пакети и моя показ ще ви лепне на сърцето. Така че, ако вие подобно на мене се изкушавате от новостите в PHP 5.5 нека извървим пътя до край.

Подготовка

Налична система Windows 7 Home Premium Edition 64bit SP1, лицензирана, на иврит.
Моля, обърнете внимание, че системата ми е 64 разрядна, а това определя изтеглянето на съответните по разряд приложения. Ако вие сте на 32-битов Windows, то изтеглете приложенията за този тип.

Първа спирка е
http://windows.php.net/download/

На този ресурс под бутон Download се намира падащ списък, изброяващ версия PHP съобразно разряда. Аз избрах VC11 x64 Thread Safe (2013-Sep-18 23:44:20), като изтеглих zip архив на име php-5.5.4-Win32-VC11-x64.zip.

Не случайно написах името, което съдържа VC11 в частта си. Това ще бъде жокер за версията на Apache, която ще изтеглим за Windows.

Втора спирка
http://www.apachelounge.com/

Преминаваме в раздел Downloads и търсим раздел VC11, след което попадаме в Apache 2.4 binaries VC11 и под надпис Apache 2.4.6 Win64 изтегляме архив httpd-2.4.6-win64-VC11.zip.

Тук следва да се уверите в следната препоръка:
Be sure that you have installed Visual C++ Redistributable for Visual Studio 2012 : VC11 vcredist_x64/86.exe

VC11 vcredist_x64/86.exe
ще даде възможност Apache, да стартира при зареждане на Windows и ще включи сървъра в администрацията на службите. Отново подбираме вариант за 64 битова система и изтегляме VSU3\vcredist_x64.exe.

При успех на обичайната за Windows инсталация изплува подобен прозорец.

Visual C++ Redistributable for Visual Studio 2012

Инсталация на PHP 5.5 и Apache 2.4

Разопаковаме архива на Apache (httpd-2.4.6-win64-VC11.zip). Папка Apache24 включително съдържанието й местим на работното място. За себе си реших да бъде на системния диск - C:/.

Разопаковаме архива на PHP (php-5.5.4-Win32-VC11-x64.zip), Получената папка на име php-5.5.4-Win32-VC11-x64 преименуваме в краткото php. Тази папка също местим в C:/.

Инсталация на PHP 5.5 и  Apache 2.4

Следва да научим Apache, че към него ще бъде включен модул PHP. В папка C:\Apache24\conf отваряме файл httpd и добавяме в самия край на файла следните три реда:
LoadModule php5_module "C:/php/php5apache2_4.dll"

AddHandler application/x-httpd-php .php

PHPIniDir "C:/php"
Първият новодобавен ред указва на Apache, да зарежда модул php5. Втори ред указва как да обработва файлове с разширение *.php. А трети ред указва къде лежи конфигурационен файл php.ini. Съхраняваме измененията и преминаваме в папка php. Търсим файл php.ini-development, когото преименуваме в php.ini. По този начин активираме PHP.

Създаване на служба на Apache 2.4

Стъпка от последните ни действия е създаване на служба на Apache, която ще стартира с зареждане на Windows.

Стартираме командния ред cmd с администраторски права. Преминаваме в каталог C:\Apache23\bin и създаваме служба, чрез следната команда
httpd -k install

създаваме служба

Ще изскочи прозорец предупреждение, когото ще позволим,

прозорец предупреждение

а след него конзолата ще рапортува за успех.

успешно създадена служба

Отлично. Преминаваме в контролния панел и отваряме администрацията на службите. Трябва да видите служба на Apache.

служба Apache

Вижда се, че при мен е налична с автоматичен старт, но не е пусната. Типично за windows са нарисувани бутони старт/стоп и съответно щракаме по тях за желано действие.
И ако отворим браузър на адрес localhost ще прочетем радостното съобщение It Works.

It Works

Остана да проверим работоспособността на PHP. В папка C:\Apache24\htdocs добавяме файл index.php с съдържание echo phpinfo(); и стискаме палци.

PHP Works

Бинго! И съответно GAME OVER!





до нови срещи   ^.^
11.10.2013 profruit 

PHP порасна до версия 5.5 и това ме изкуши (към дата на публикацията) да го инсталирам на поредна моя машина.

PHP 5.5 изисква Apache 2.4.

До този момент разполагах с Apache 2.2.14 и модул PHP 5.4.17. Те бяха инсталирани по начин описан в тази публикация. Реших да премахна всичко и да започна начисто. Нещата се свеждат до същите команди, като израза install се замества с израза remove -y --purge.

Деинсталация на стара версия

спиране на Apache демона.
sudo service apache2 stop

изтриване на phpMyAdmin
sudo apt-get remove -y --purge libapache2-mod-auth-mysql phpmyadmin

изтриване на PHP 5.4.17
sudo apt-get remove -y --purge libapache2-mod-php5

изтриване на Apache 2.2.14
sudo apt-get remove -y --purge apache2

профилактика на пакетите
sudo apt-get autoremove
sudo apt-get autoclean

Инсталация на PHP 5.5 и Apache 2.4

Все още (към дата на публикацията) хранилищата на Ubuntu/Debian не предлагат въпросните версии и нещата ще бъдат инсталирани от нашите ръчички, благодарение на Ondřej Surý. Начинът описан тук е един от многото споделени в интернет. Считам го за лаконичен и при мен той работи. Както се казва, ползвайте на ваш риск и страх.

добавяне на lauchpad - хранилището към работната система
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ondrej/php5

обновяване на системата
sudo apt-get update

инсталация на Apache 2.4
sudo apt-get install apache2

инсталация на PHP 5.5
sudo apt-get install php5

Това е всичко. Проверяваме резултата.

PHP 5.5 и  Apache 2.4 в Ubuntu

Инсталация на phpMyAdmin

инсталация на phpMyAdmin
sudo apt-get install phpmyadmin

проверяваме
http://localhost/phpmyadmin

Apache 2.4 идва с редица различия от версия 2.х.х и първоначално phpMyAdmin не изгря (дори след принудителни рестарти на сървъра. Лечението се свежда до добавяне в края на файл:
/etc/apache2/apache2.conf

следния запис
Include /etc/phpmyadmin/apache.conf

рестарт на Apache 2.4
sudo /etc/init.d/apache2 restart

и се любуваме на следната картина.

phpMyAdmin 3.4.11

този маньовър ме надари с по-нова версия на phpMyAdmin.




до нови срещи   ^.^
11.10.2013 profruit 
| |

Публикация Ubuntu LAMP инсталация показва как се инсталира MySQL сървър в Ubuntu 10.04. Същата идея показва публикация Инсталация на Apache, PHP, MySQL и phpMyAdmin в Lubuntu 12.04_64, с лека уговорка, че системата в последствие бе подменена на LinuxMint 14 (Ubuntu 12.10). Подробности тук.

Нека погледнем отблизо нещата по-добре. Първата уловима разлика показва различни версии на MySQL сървър спрямо другата система.
Команда

mysql --version

изпълнена в терминала, съобщава, че под Ubuntu 10.04 разполагам с версия 5.1.70.

MySQL версия

Същата команда изпълнена в LinuxMint 14 отговаря 5.5.32.

MySQL версия

Пълният списък от опции на MySQL - монитор дава команда

mysql --help

На практика редица опции са дублирани от кратък и пълен начин за изпълнение на команда. Например,

mysql --version

може да се сведе до лаконичното

mysql -V

Забележете, с главна буква, докато с малка

mysql -v

отговаря за Write more. (-v -v -v gives the table output format).

В един прекрасен ден аз се събудих от чуруликане на птички и се заех с MySQL версия под LinuxMint 14. Още сънен вместо голяма буква V напечатах малка v и за мое учудване сървъра изплющя приветствие. Това не ми хареса и набрах начисто отново само

mysql

Ново 20 и отново добре дошъл.

MySQL access enable

Повторих действията си под Ubuntu 10.04 и тук всичко бе по местата си. Ясно се вижда, как MySQL ме реже.

MySQL access denied

ОК. Нека сведем нещата до общ вид и видим възможностите на този потребител. Отново набираме команда

mysql

в LinuxMint 14, а след нея

SHOW DATABASES;

SHOW DATABASES

Става ясно, че този потребител вижда само една база данни дошла от инсталацията на MySQL. Опит за създаване на нова база данни

CREATE DATABASE `db_name`

или пълния синтаксис на командата

CREATE DATABASE IF NOT EXISTS `db_name` CHARACTER SET utf8 COLLATE utf8_general_ci;

води до неуспех и следния отговор:
ERROR 1044 (42000):
Access denied for user ''@'localhost' to database 'db_name'
Отлично. Пипнахме го! Някакъв анонимен user ' ', комуто са дадени права само за информативно четене. Този потребител е създаден от инсталацията. Дадена му е възможност за връзка с MySQL, един вид тест, че сървъра работи. На свой ред е желателно да го изтрием, особено ако преминем в production режим.

От напомнените теми в началото знаем, че инсталацията на MySQL се проведе под системни администраторски права и за супер потребител ни бе посочен root, на когото назначихме парола.

Инсталация на MySQL

Да влезем под неговата регистрация в MySQL и свършим замисленото. Излизаме и отново влизаме с потребителско име root и парола му, след което преглеждаме списъка с база данни.
  1. exit
  2. mysql -u root -p -h localhost
  3. SHOW DATABASES;
SHOW DATABASES

Този път всичко лъсна като тиган на месечина. Няма скрито-покрито. Да килнем анонимното куче и направим нещата профи. Избираме база данни mysql и правим заявка.

USE mysql

Забележете, командата не изисква в края точка с запетая (диалект на MySQL).

Извеждаме списък с таблиците, съдържащи се в база данни mysql

SHOW TABLES;

За отговор получаваме това:
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.00 sec)
Най-отдолу се чете името на таблица user. С команди синоними може да прегледаме полета на таблицата.

SHOW FIELDS FROM user;

SHOW COLUMNS FROM user;

Това упражнение направете на вашата машина. По-интересно е съдържанието на таблицата.

SELECT * FROM user \G

Извадка от отговора показва, че в 5-ти и 6-ти row User-ът е анонимен.
*************************** 5. row ***************************
                  Host: localhost
                  User: 
              Password: 
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: 
 authentication_string: NULL
*************************** 6. row ***************************
                  Host: proacer
                  User: 
              Password: 
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: 
 authentication_string: NULL
Оха, пипнахме го по свалени гащи, за което го изтриваме.

DELETE FROM mysql.user WHERE User=' ';
Query OK, 2 rows affected (0.00 sec)
Отлично! Ние сме победители. За финал.

FLUSH PRIVILEGES;

Пробваме отново да влезем с анонимния акаунт и получаваме отказ.

MySQL версия

Отлично! Свършихме половината работа. Нека свършим останалата до край.
Отново се логваме като root и създаваме тестова база данни на име db_test.

CREATE DATABASE db_test

Счита се за добър стил имена на бази, таблици и полета, да се пишат в апострофи (` `), но се разрешава техния пропуск.

Отново преглеждаме списъка с бази данни.

SHOW DATABASES;

И логично списъка е разширен с новодопълнението.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| editor             |
| mysql              |
| phpmyadmin         |
| test               |
| wordpress          |
+--------------------+
7 rows in set (0.00 sec)
Подобен начин на опериране крие риск за сигурността. Потребител root притежава супер права и неговата дискредитация може да доведе до фатални последствия. Узнавайки паролата му, злоумишленик може да напакости. Поради това много по-добре е да се създаде потребител с конкретни права за конкретна база данни и по този начин се ограничи периметъра му на действие из MySQL сървъра. Замисълът се свежда до проста команда.

GRANT ALL PRIVILEGES ON db_test.* TO 'username'@'localhost' IDENTIFIED BY 'password';

За случая ще използвам име johnsmith и парола butterflyman, а след изпълнение на заявката ще видя привилегиите му по следния начин.

SHOW GRANTS FOR 'johnsmith'@'localhost';

Резултат.
+------------------------------------------------------------------------------------------------------------------+
| Grants for johnsmith@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'johnsmith'@'localhost' IDENTIFIED BY PASSWORD '*3C295F2245E099B1FD99F137D352EA2CC7967865' |
| GRANT ALL PRIVILEGES ON `db_test`.* TO 'johnsmith'@'localhost'                                                   |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Отново преглеждаме списъка с бази данни.

johnsmith@localhost

Вижда се, че johnsmith може да бъзика само база данни db_test. Следва да се създадат таблици и добави съдържание, за съответния проект, което ще направим в бъдеща среща.

За тези, които не им стана ясно и не могат без GUI-приложение показвам снимки от phpMyAdmin.

johnsmith@localhost

johnsmith@localhost

И преди раздяла едно важно уточнение.
При логване в mysql, параметър -u уточнява името на потребителя. Няма значение дали ще напишете името слято с параметъра или чрез пробел.

mysql -u user_name

mysql -uuser_name

Нюансът настъпва при параметър -p. Той изисква парола на потребителя. Ако не желаете да бъде виждана от човек, стоящ зад гърба ви пропуснете въвеждането и на следващия ред мониторът ще я поиска, без да реагира на въведените символи. Дори звездички няма да се появят, за да скрие броя символи на вашата парола.

mysql -u user_name -p

Слято с параметъра, например, парола 123456 ще изглежда так.

mysql -u user_name -p123456

Но, има едно но, ако след параметър -p се въведе име, мониторът ще ги приеме за име на база данни и ще ви отведе при нея. Така постъпих при последния пример.

mysql -u johnsmith -p db_test

По този начин се съкращава команда USE име_на_база_данни и задължително ще ви поиска парола на следващия ред, която няма да се вижда. Въпрос на вкус и параноя как ще се ползвате монитора.






до нови срещи   ^.^
05.10.2013 profruit 
| |

Този блог е реинкарнация на първите ми опити за споделяне в нета. На времето започнах с къси разкази на преживяното. После се обезсмисли и превърнах блога си в системно радио. Пиша единствено неща, които карат душата ми да живее: openHAB, Ubuntu, Споделено и т.н. Това е моето системно радио, разбирате ли? Моята вълна и вие сте на нея сега.

Архив на блога