• SQL-запрос на PHP (Версия 0.2)
    0
    Ну вот, судя по комментариям мне просто необходимо изредка вываливать свой «неформат» ибо про PSR-2 не слышал, пойду почитаю. А на счёт else if — так короче, строк меньше, больше строк вмещается на экран — мне удобнее читать (только мне, ибо в команде не работаю, кодом обычно не делюсь)

    И не надо ругаться что не слышал про это соглашение, вроде мониторю хабр регулярно, про php читаю всё…
  • SQL-запрос на PHP (Версия 0.2)
    –3
    Автора уже дважды за такие посты закидывали минусами…
    При этом ему по второму кругу задают одни и те же вопросы…
    Мне же понятно что ему просто интересно собрать свой (хоть и сомнительный) велосипед…
    На самом деле я тоже люблю велосипеды, но не готов их публиковать на хабре.
    Как пример приведу один php файл который использую для sql запросов (тут не весь функционал а лишь тот который мне нужен для определенного проекта):
    200 строк кода на php (не для слабонервных)
    <?php
    class SQLCONFIG {
    	private $config = [
    		["host" => "localhost", "username" => "root", "password" => "24022017", "database" => "bd1", "charset" => "utf8"],
    		["host" => "localhost", "username" => "root", "password" => "24022017", "database" => "bd2", "charset" => "utf8"]
    	];
    	function getConfig($def = 0){
    		if (isset($this->config[$def])) return (object)$this->config[$def];
    	}
    }
    class SQL extends SQLCONFIG{
    	private $columns, $rows, $table, $output, $operation, $where, $group, $order, $limit, $join = '', $query;
    	public $sql;
    
    	function __construct($def = 0){
    		$config = $this->getConfig($def);
    		if (empty($config)) {
    			$this->error("Отсутствуют настройки для подключения.");
    		}else{
    			$this->sql = mysqli_connect($config->host, $config->username, $config->password) OR $this->error();
    			mysqli_select_db($this->sql, $config->database) OR $this->error();
    			mysqli_set_charset ($this->sql, $config->charset) OR $this->error();
    		}
    	}
    
    	function __destruct(){
    		@mysqli_close($this->sql);
    	}
    
    	public function close(){
    		$this->clear();
    		mysqli_close($this->sql);
    		return;
    	}
    
    	public function select($table, $columns = "*", $output = "arr"){
    		$this->operation = __FUNCTION__;
    		$this->table = $this->columns = ""; $this->output = $output;
    		$this->table = "`{$table}`";
    		if (!is_array($columns)) $columns = explode(",", $columns);
    		foreach ($columns as $key => $value) $this->columns .= "{$this->table}.`".str_replace(".", "`.`", $this->check($value))."`,";
    		$this->columns = rtrim($this->columns, ",");
    		return $this;
    	}
    
    	public function where($where = ""){
    		$this->where = (!empty($where)) ? " WHERE {$where}": "";
    		return $this;
    	}
    
    	public function group($group = ""){
    		$this->group = "";
    		if (!is_array($group)) $group = explode(",", $group);
    		foreach ($group as $key => $value) $this->group .= "`".str_replace(".", "`.`", $this->check($value))."`,";
    		$this->group = rtrim($this->group, ",");
    		$this->group = (!empty($group)) ? " GROUP BY {$this->group}" : "";
    		return $this;
    	}
    
    	public function order($order = "", $sort = "DESC"){
    		$this->order = "";
    		$sort = strtoupper($sort);
    		$sort = ($sort == "DESC" || $sort == "ASC" || $sort == "RAND()") ? $sort : "";
    		if (!is_array($order)) $order = explode(",", $order);
    		foreach ($order as $key => $value) $this->order .= "`".str_replace(".", "`.`", $this->check($value))."`,";
    		$this->order = rtrim($this->order, ",");
    		$this->order = (!empty($order)) ? " ORDER BY {$this->order} {$sort}" : "";
    		return $this;
    	}
    
    	public function limit($start = 0, $count = 0){
    		$this->limit = ($count > 0) ? " LIMIT {$start},{$count}" : "LIMIT {$start}";
    		return $this;
    	}
    
    	public function join($table, $columns, $on, $prefix = ""){
    		if (!is_array($columns)) $columns = explode(",", $columns);
    		foreach ($columns as $key => $value){ 
    			$dop = (!empty($prefix)) ? " as {$prefix}_{$value}" : "";
    			$this->columns .= ",`".$this->check($table)."`.`".str_replace(".", "`.`", $this->check($value))."`{$dop}";
    		}
    		$this->join .= " INNER JOIN `".$this->check($table)."` ON {$on}";
    		return $this;
    	}
    
    	public function insert($table, $data = array()){
    		$this->operation = __FUNCTION__;
    		$this->columns = $this->rows = ""; $this->table = "`{$table}`";
    		if (isset($data[0])) {
    			foreach ($data[0] as $key => $value) $this->columns .= "`".$this->check($key)."`,";
    			foreach ($data as $key => $value) {
    				$this->rows .= "(";
    				foreach ($value as $values) $this->rows .= "'".$this->check($values)."',";
    				$this->rows = rtrim($this->rows, ",")."),";
    			}
    		}else{
    			foreach ($data as $key => $value) {
    				$this->columns .= "`".$this->check($key)."`,";
    				$this->rows .= "'".$this->check($value)."',";
    			}
    			$this->rows = "(".rtrim($this->rows, ",")."),";
    		}
    		$this->columns = rtrim($this->columns, ",");
    		$this->rows = rtrim($this->rows, ",");
    		return $this;
    	}
    
    	public function update($table, $data = array()){
    		$this->operation = __FUNCTION__;
    		$this->rows = ""; $this->table = "`{$table}`";
    		foreach ($data as $key => $value) $this->rows .= "`".$this->check($key)."` = '".$this->check($value)."',";
    		$this->rows = rtrim($this->rows, ",");
    		return $this;
    	}
    
    	public function delete($table){
    		$this->operation = __FUNCTION__;
    		$this->table = $this->table = "`{$table}`";
    		return $this;
    	}
    
    	public function count($table, $columns="*"){
    		$this->precounter($table, $columns, __FUNCTION__); return $this;
    	}
    	public function sum($table, $columns){
    		$this->precounter($table, $columns, __FUNCTION__); return $this;
    	}
    	public function min($table, $columns){
    		$this->precounter($table, $columns, __FUNCTION__); return $this;
    	}
    	public function max($table, $columns){
    		$this->precounter($table, $columns, __FUNCTION__); return $this;
    	}
    	public function avg($table, $columns){
    		$this->precounter($table, $columns, __FUNCTION__); return $this;
    	}
    	private function precounter($table, $columns, $operation = "count"){
    		$this->operation = $operation; $this->table = "`{$table}`";
    		$this->columns = ($columns != "*") ? strtoupper($operation)."(`".$this->check($columns)."`) as ".strtolower($operation) : strtoupper($operation)."(*) as ".strtolower($operation);
    		return;
    	}
    
    	public function query(){
    		if ($this->operation == "select") {
    			if ($this->output == "only") $this->limit = " LIMIT 0,1";
    			$query = "SELECT {$this->columns} FROM {$this->table}{$this->join}{$this->where}{$this->group}{$this->order}{$this->limit};";
    		}
    		if ($this->operation == "insert") {
    			$query = "INSERT INTO {$this->table} ({$this->columns}) VALUES {$this->rows};";
    		}
    		if ($this->operation == "update") {
    			$query = "UPDATE {$this->table} SET {$this->rows}{$this->where}{$this->group}{$this->order}{$this->limit};";
    		}
    		if ($this->operation == "delete") {
    			$query = "DELETE FROM {$this->table}{$this->where}{$this->group}{$this->order}{$this->limit};";
    		}
    		if ($this->operation == "count" || $this->operation == "sum" || $this->operation == "min" || $this->operation == "max" || $this->operation == "avg") {
    			$this->rows = (!empty($this->group)) ? ",".str_replace(" GROUP BY ", "", $this->group) : "";
    			$query = "SELECT {$this->columns}{$this->rows} FROM {$this->table}{$this->join}{$this->where}{$this->group}{$this->order}{$this->limit};";
    		}
    		return $query;
    	}
    
    	public function send($query = ""){
    		$this->query = (empty($query)) ? $this->query() : $query;
    		$res = mysqli_query($this->sql, $this->query) OR $this->error();
    		if ($this->operation == "select" || $this->operation == "count" || $this->operation == "sum" || $this->operation == "min" || $this->operation == "max" || $this->operation == "avg") {
    			$result = array();
    			if ($this->output == "arr") while ($row = mysqli_fetch_assoc($res)) $result[] = $row;
    			elseif ($this->output == "full") while ($row = mysqli_fetch_array($res)) $result[] = $row;
    			elseif ($this->output == "only") $result = mysqli_fetch_assoc($res);
    			elseif ($this->output == "object") while ($row = mysqli_fetch_object($res)) $result[] = $row;
    			else{
    				if ($res->field_count == 1 && $res->num_rows == 1)	{ 
    					$result = mysqli_fetch_assoc($res);
    					if (isset($result[$this->operation])) $result = (float)$result[$this->operation];
    				}
    			}
    		}else if($this->operation == "insert"){
    			$result = (int)mysqli_insert_id($this->sql);
    		}else if($this->operation == "update"){
    			$result = $res OR $this->error();
    		}else if($this->operation == "delete"){
    			$result = $res OR $this->error();
    		}else{
    			$result = true;
    		}
    		$this->clear();
    		return $result;
    	}
    
    	public function operation($operation){
    		$this->operation = $operation;
    		return $this;
    	}
    	public function output($output){
    		$this->output = $output;
    		return $this;
    	}
    
    	private function error($error = ""){
    		$error = (empty($error)) ? mysqli_error($this->sql) : $error;
    		die("<div style='background-color:#e95656;color:#fff;font-size:16px;padding:20px;margin:20px;font-family:Consolas,monaco,monospace;'>{$error}</div>");
    	}
    
    	private function check($value){
    		$value = mysqli_real_escape_string($this->sql, $value);
    		return $value;
    	}
    
    	function clear(){
    		$this->where = $this->group = $this->order = $this->limit = $this->join = "";
    		$this->columns = $this->rows = $this->table = $this->output = $this->operation = $this->query = "";
    	}
    
    }
    
    ?>
    


    И пару примеров:

    <?php
    
    include "sql.php";
    $sql = new SQL(0); // 0 - первый конфиг подключения.
    print_r($sql->select("temp")->send());
    // Вернет все строки из таблицы temp
    print_r($sql->select("temp", "id,name")->where("`id` > 0")->order("date")->limit(0,100)->send());
    
    // а так же всякие там $sql->insert("temp", ["name" => "test"])->send();
    // $sql->update("temp", ["name" => "test1"])->send();
    // ещё join можно использовать... есть count, SUM, MIN, MAX, AVG...
    ?>
    


  • Создание однопользовательской игры: от идеи до прототипа
    0
    В полноэкранном режиме не работает мышь, в оконном режиме работает.

    Psychosynthesis видимо у тебя с виндой что-то, у меня даже видеокарты нет, и лагов практически нет.

    Конфиг на котором тестил: AMD A10-7890K, 16Гб ОЗУ видеокарта интегрированная в проц Radeon R7 (OS Ubuntu 16.04)

    видео

  • Создание однопользовательской игры: от идеи до прототипа
    0
    Для показа у меня был стол, стул и старый ноутбук с Linux.

    С релизом не забудьте про Linux, опубликуетесь в стим — я даже рублём помогу, очень нравятся подобные жанры.

    P.S лет 20 назад играл в игру вроде хищника, так там игрок тоже по стенам бегал (без изменения глобальной гравитации) очень понравилось.
  • Не находите ли вы неудачной кнопку перехода на страницу номер 100?
    0
    Согласен с автором, довольно непродуманная кнопка… что бы попасть на 9ю страницу нужно сперва пойти на 8ю…
    В своей реализации я сделал модуль который на входе получает кол-во страниц и текущую страницу, затем просто в цикле генерирует ссылки и помещает их в блок, добраться до нужной страницы становится проще… выглядит это примерно так:

    тут видео


    (ссылки внутри так же прокручиваются колесом мыши)
  • $PHP не нужен*
    0
    А в PHP ещё хуже:


    Ну вот обычно php ругают те кто в нём не разбирается…
  • PostCSS Hamster Framework — инструмент, который облегчит вашу жизнь при вёрстке. Типографика. Вертикальный ритм
    0
    Ну может человек букву «Р» не выговаривает =)

    Вот если бы живые примеры применения этого фрэймворка в статью добавили — совсем здорово было бы.
  • Как я бросил университет ради разработки собственной игры. Часть 1
    0
    Конец разработки запланирован на осень 2015 года.


    image

    узнаю в авторе себя… тоже 5 лет работаю над проектом и каждый раз переписываю его с нуля…
  • Круглый график на Canvas
    +1
    выглядит не эстетично, нужно бы добиться плавных линий…
    image
  • Проектирование анимации или как я в дизайнерскую авантюру ввязался
    0
    и такая байда со всей анимацией… предлагаю вам смотреть в сторону css свойства animation, transition и т.д
  • Проектирование анимации или как я в дизайнерскую авантюру ввязался
    0
    пример

  • Проектирование анимации или как я в дизайнерскую авантюру ввязался
    0
    Сходил на страницу Preview, у вас там при наведении на строку поиска меняется цвет фона… при этом нет остановки анимации $(element).stop().animate({...}); из-за чего анимация зацикливается (если несколько раз водить по элементу) и продолжает воспроизводиться тогда когда это уже не требуется.

    P.S тоже недавно скилл повышал по css3:

    и даже почти кроссбраузерно…
  • Анимационная пасхалка, или дань уважения студии при увольнении из нее
    0
    Кликнул на колокольчик, ничего не произошло…
    кликнул ещё раз… ещё, ещё, ещё, ещё, ещё, ещё, ещё, ещё, ещё, ещё…
    потом отвёл мышь от колокольчика и…
    анимация пошла но с жуткими лагами, FPS 5-10… видимо засчитались все ~20 кликов…
    (последний хром, linux (KDE))

    Потом один раз нажал и сразу отвёл мышь от колокольчика — анимация пошла плавно, очень красиво…
    Захотелось сделать что-то похожее…
  • Telegram-бот, webhook и 50 строк кода
    0
    что бы писать команду в любом месте строки можно и strpos или substr_count использовать. И опять же команды все удобно держать в одном месте, отделив его от кода. Поэтому и такое странное решение с ключами массива…
  • Telegram-бот, webhook и 50 строк кода
    0
    прошу простить, я с утра не совсем уловил суть вашего вопроса…
    что же, действительно тут вы правы:

    for ($i=1; $i < strlen($text_lower); $i++) { 
      $text_lower_new = substr($text_lower, 0, $i);
      if (isset($commands[$text_lower_new])) {
          $text_lower = $text_lower_new;
          break;
      }
    }
    


    — так мы из "/save очень длинный текст" будем двигаться от 1го символа до последнего (предварительно ограничив длину до 200 символов)

    /
    /s
    /sa
    /sav
    /save — бинго, ключ найден. И вместо того что бы проверять ключ 21 раз, мы проверили его 5 раз… Что в 4 раза быстрее на данном примере.

    Но если целиться на расширение команд на будущее то может произойти так что команда будет содержать в себе первым словом другую команду, на примере:
    статистика — покажет общую статистику
    статистика вчера — показывает статистику за вчерашний день

    пример конечно с потолка, но если мне нужно будет выполнить команду "статистика вчера" — то перебирая символы с начала строки выполнится команда "статистика", именно поэтому я и решил перебирать символы с конца. Пока у меня в командах нет подобного противоречия, но кто знает… когда их будет за пару сотен, могут появиться.

    P.S
    if (strpos($text_lower, "/save") == 0) {
    // действие
    }
    


    всё же условие, занимает значительно больше места нежели ключ в массиве… А вот то что я вместо strpos использую substr этому нет объяснения, видимо сонный был и затупил…

    P.P.S вот за что люблю хабр, что тут люди всегда посоветуют то что лучше, сейчас заменю substr на strpos и временно переключу перебор строки с первого символа, а когда появятся противоречия в командах, верну обратно перебор с конца. Grogina, вам спасибо.
  • Telegram-бот, webhook и 50 строк кода
    0
    ну тут просто не очевидно на примере для чего это…
    ну вот в @jReminderBot я пишу "/save очень длинный текст" и вместо того что бы поставить условие:

    if (strlen($message['text']) >= 5 && substr($message['text'], 0, 5) == '/save') {
    // выполняем запись текста после "/save" в бд
    }
    

    — я ищу этот ключ в массиве перебирая строку с конца до начала:
    /save очень длинный текст
    /save очень длинный текс
    /save очень длинный тек
    /save очень длинный те

    /save оч
    /save о
    /save
    /save — бинго! этот ключ есть и дальше идёт перебрасывание на функцию.

    Таким способом после самой команды может быть любой длинны текст… Тот же FatherBot в телеграмм запрашивает параметр для команды отдельно — пишешь /setname, после он просит придумать новое имя и отправить следующим сообщением, в моём примере это бы выглядело следующим образом: "/setname Новое имя"

    При этом имя функции я так же вписываю в сам массив, примерно так это выглядит:

    $cmd = new Commands($message); // тут все функции
    
    $commands = array(
      "всем привет" => "Дратути",
      "/save" => "fun_saveText"
    );
    
    // проверки тут разные, в цикле перебор строки и т.д всё копипастить не буду.. в предыдущем комментарии это есть.
    
    if (strlen($commands[$text_lower]) > 3 && substr($commands[$text_lower], 0, 4) == 'fun_') {
      $fun_name = substr($commands[$text_lower], 4);
      if (method_exists($cmd, $fun_name)) {
        $answer = call_user_func(array($cmd, $fun_name));
      }else{
        $answer = "Функция {$fun_name} не найдена =(";
      }
    }else{
      $answer = $commands[$text_lower];
    }
    


    ну и согласитесь писать ключи в массиве гораздо удобнее и компактнее нежели всегда писать условие под каждую команду… Видимо нужно было сразу написать что не ставил цели писать обычный ехо-бот… Ну а сам массив у меня уже перекочевал в json формат, вынесенный отдельно в файл и там уже более 40 функций по мониторингу основного сайта и ещё пару шуточных функций и ответов…

    Я даже думал на хабре пост написать как на php этот бот пишется закрытыми глазами, но такие статьи уже не встречают восторгом тут…
  • Telegram-бот, webhook и 50 строк кода
    +1
    Мой пример на php (чтобы разобраться в апи телеграмм потратил 5 минут):
    $api = "https://api.telegram.org/bot111111111:AAHKeYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    // получаем данные
    $update = json_decode(file_get_contents("php://input"), TRUE);
    $message = $update["message"];
    // все команды
    $commands = array(
      "всем привет"    => "Дратути",
      "кто самый"    => "Без сомнения {$message['from']['first_name']} {$message['from']['last_name']}",
    );
    // не учитываем регистр
    $text_lower = mb_convert_case($message["text"], MB_CASE_LOWER);
    // искать команду будем по первым 200 символам.
    if (strlen($text_lower) > 200) $text_lower = substr($text_lower, 0, 200);
    // крутим текст сообщения от конца до 1го символа в поисках существующего ключа в $commands
    for ($i=0; $i < strlen($text_lower); $i++) { 
      $text_lower_new = substr($text_lower, 0, strlen($text_lower)-$i);
      if (isset($commands[$text_lower_new])) {
          $text_lower = $text_lower_new;
          break;
      }
    }
    // сам ответ
    if (isset($commands[$text_lower])) $answer = $commands[$text_lower];
    // отправляем ответ в чат
    if (!empty($answer)) file_get_contents("{$api}/sendmessage?chat_id={$message["chat"]["id"]}&text={$answer}");
    


    — при желании этот код можно сократить до 5 строк, но тогда его будет совсем сложно читать, поэтому не пойму тех кто хвастается кол-вом строк в коде.

    image

    На основе этого кода собрал бота который сидит у меня в рабочем чате и делает заметки, посмотреть на его работу можно добавив его: @jReminderBot
  • Vysor — удобный инструмент для тестирования
    0
    Я пользуюсь халявой от гугла:
    image

  • SQL-запрос на PHP
    0
    Тоже делал подобный QueryBuilder у меня это выглядит так:

    echo $sql->insert("table", array("id"=> "1", "name"=>"habr"))->send();
    // получаем mysqli_insert_id
    


    вместо array можно скормить и json
    Но я вот не стал свой велосипед на хабр тащить…
  • Как Skype уязвимости чинил
    +2
    На Linux Skype и вовсе последнюю неделю черти что вытворяет… Где же это ныне популярное Microsoft ♡ Linux????

    Сопли
    Официальное приложение с начала этого года перестало показывать некоторые групповые чаты, перешел на web-версию скайпа (даже скачал SkypeForLinux Alpha которая по сути тот же браузер только с иконкой в трее.) То что там нет демонстрации экрана и не работают видеозвонки — это тоже всё очень печально, а 2 дня назад и вовсе веб версия перестала работать и не работала целые сутки, я конечно сразу написал в тех. поддержку на что мне ответили: «ничего не ответили»
    Через день скайп снова заработал, только теперь спустя некоторое время он перестаёт принимать и отправлять сообщения, при этом вы и не знаете что скайп выключился, пишете сообщения как обычно, только вам ничего не отвечают. И только после перезапуска — вас ругают что в середине рабочего дня куда-то пропал…

  • Как Skype уязвимости чинил
    +1
    При этом версия для Linux на сайте в разделе «скачать» значится как «уже скоро», скачать то я конечно скачал, но выходит что это бета версия…

    Вот решил со скайпом сравнить (скайп бета, и дискорд бета — всё честно):

    image

    AMD Athlon II x2 (+ 8 гигов оперативки)
  • Перенос редактора Unity на Linux: вещи, которые стоило бы сделать заранее
    0
    Пожалуй добавлю ссылку на скачивание (скорее всего она будет активна в течении пару месяцев), потом можно будет найти актуальную ссылку тут: https://forum.unity3d.com/threads/unity-on-linux-release-notes-and-known-issues.350256/
  • Слайд-шоу без JS
    +15
    Мне было бы стыдно такое писать на хабр…

    A теперь сюрприз для php-программистов


    Очень надеюсь что это был сарказм…
  • KDE4 Plasma Desktop. Создание плазмоида
    0
    7 лет эволюции:

    image

    P.S да, я не любитель виджетов image
  • Разработка Vivaldi: работа над ошибками
    0
    Хорошо, буду ждать.
  • Разработка Vivaldi: работа над ошибками
    0
    Честное слово, несколько раз пытался перейти на Vivaldi. но каждый раз не задерживаюсь на ней более суток… то пароли из хрома нельзя все вытянуть, то вместо настроек у меня черный экран, то внезапно пропадающие шрифты… но это ладно, на этот раз просидел на вашем замечательном браузере 2 часа, верстал спокойно страничку, жму F12 и в DevTools не нахожу привычной кнопочки переключения Toggle Device Toolbar (хотя она есть в хроме)
    image
    на крайний случай панель DevTools в хроме можно закрепить справа и таким образом масштабировать ширину окна примеряя верстку под разные экраны (у вас же окно DevTools вынесено отдельным окном)…

    Все замечания отправлял куда нужно. Ещё в начале этого года, но ничего не меняется, подожду ещё год, может дойдут руки до этих незначительных правок…

    P.S на этот раз меня ещё заманила иконка почты на скриншотах вашего браузера:
    image

    думал что будет как в старенькой imageпере — встроенный почтовик, ан-нет обознался. ну или сходу не разобрался как установить сие в браузер…

    P.P.S хром зараза с каждым днём всё прожорливее и прожорливее… подсасывает порой 700 МБ оперативной памяти для одной вкладки…
  • Любой сайт может получить информацию о том, в каких популярных сервисах вы авторизированы
    +1
    Пока тут все видят уязвимость, я уже придумываю как я сортирую кнопочки авторизации у себя на сайте через социалки — используя сервисы где пользователь уже авторизован…

    Т.е заходит пользователь на мой сайт, я ему предлагаю авторизоваться на сайте через VK|facebook|google+ и т.д — при этом на верх списка высовываю те кнопочки в которых пользователь уже авторизован… удобно же =)

    Но… пока у меня дойдут до этого руки — возможно эту фишку уже пофиксят…
  • Новая программа способна восстанавливать информацию, скрытую с помощью пикселизации
    +1
    wow эффекта не вышло, на их примере верхняя строка входное изображение, вторая строка результат, а третья — оригинал:

    image

    Но достаточно просто прищурить глаза глядя на верхнюю строку и получаем тот же результат…

    Для движущихся же объектов задача вполне имеет решение — многокадровое суперразрешение.

    Достаточно быстро моргать глядя на видео, тогда лицо человека скрытого с помощью пикселизации — будет видно более разборчиво.
  • Каково оно учить JavaScript в 2016
    0
    А я только в этом году начал использовать SVG и работаю с jQuery…
    Я видимо уже совсем безнадёжен =( Не успеваю следить за всем… Даже html5 боюсь в проектах использовать…
  • Что такое на самом деле VPS-хостинг и как выбрать надежного провайдера VPS
    –1
    Самый дешевый тариф стоит 180 рублей, 65 рублей тариф стоит на момент публикации этого поста, для переманивании аудитории с виртуальных хостингов…
  • Что такое на самом деле VPS-хостинг и как выбрать надежного провайдера VPS
    –2
    А ещё один маркетинговый трюк заключается в том что они заявляют о стоимости 65 рублей за бюджетный план, но не говорят о том что действия акции ограничены, и если я допустим сейчас перееду с jino где VPS стоит 99 рублей в погоне за VPS за 65 рублей, то через месяц я останусь в дураках и буду платить уже 180 рублей…
  • UltraVDS: любой сервер со скидкой 50% только 1 сентября
    0
    Какое заманчивое предложение…

    и это без скидок....
    image
  • Табы или пробелы? Анализ 400 тысяч репозиториев GitHub, миллиарда файлов, 14 ТБ кода
    0
    Либо на хабре много сиплюсплюшников, либо выборка оказалась не совсем корректной, т.к голоса сместились в сторону табов…

    php (Sublime) — как это здорово выделить несколько строк кода нажать tab и он весь сместится…
    с пробелами такое не прокатит…
    VB.NET — (Visual Studio) — там IDE сама табы расставляет…
    Java (IntelliJ idea) тоже табы…

    в общем-то тут скорее не от языка зависит а от редактора где код набирается…

    исключение
    мне как-то приходилось код редактировать на вокзале, через коммуникатор который был подключен по SSH к серверу (редактор nano) — это был единственный случай когда пользовался пробелами вместо табов
  • Как сохранить здоровые отношения, будучи разработчиком
    0
    После прочтения этого поста, решил позвонить другу и пообщаться, но был грубо послан image

    Просто некоторые разработчики, выбирают ночное время для работы, что бы исключить множество отвлекающих факторов… Вот и я сейчас допишу пару сотен строк кода и к утру лягу спать…
    Гулять ночью в моём районе тоже не самое безопасное занятие…
    и вот как быть…
  • Начинать программировать никогда не рано: взгляд девятилетнего
    0
    вёрстка != дизайн
  • SMS и новые технологии: как работает «хорошо забытое старое»
    +2
    Начинал работать с смс, когда отправка одной SMS стоила 20 коп. image И компаний которые давали инструменты для СМС-рассылок можно было по пальцам пересчитать…

    Сегодня куда не плюнь все занимаются смс-рассылками, а отправка смс переваливает за 1.20 руб/шт. Хотя по логике конкуренция должна была обвалить стоимость этой услуги…

    P.S сейчас использую коммуникатор для рассылки и собственный софт к нему. (Если интересно подготовлю статью об этом)
  • Осторожно, редизайн: «глас народа» vs «глаз дизайнера»
    0
    Какие вы тут все серьёзные =)
    А ведь всего-то хотел минималистично выразить отношение «большинства» к редизайнам…

    К примеру тот же кинопоиск — на мой взгляд дизайн был хорош, да, совершенно не привычно, но за пару минут можно было разобраться. Большинство же дизайн не оценило (P.S кинопоиск мог бы этот дизайн пустить на новый дочерний сайт, что уж деньги зря тратить)

    Затем вконтакт, сейчас большая часть сидит на vk.com, меньшинство (в т.ч и я) на new.vk.com спустя несколько месяцев — возвращаться на старый дизайн НЕТ никакого желания… Вконтакт видимо хочет потихоньку переманить большую часть на свежий дизайй, а затем принудить остальных и будет как с Дуров! Верни стену!

    И… я иногда посиживаю на сайте яплакалъ, как-то заикнулся там что пора бы этот дизайн аля 2000-е сменить на более современный + поменять древний форум на что-то более современное… и мягко говоря, поддержки не получил…

    Я всё это к тому что у человека наступает такой момент когда его пугает всё новое и не привычное…
    Решить эту проблему можно — разрабатывая сайт с прицелом на будущее, используя самое новое...

  • 5 способов быстро победить ступор программиста
    0
    Я с вами согласен…
    Вот мой результат «осязаемого» творчества:

    image
  • Фотографии от Варламова. Честный бизнес или неверно трактованный закон
    0
    У вас какое-то свое толкование слова «лицемерие»

    Лицеме́рие — несоответствие слов, действий человека его истинным чувствам, убеждениям, намерениям.


    Он действует точно так же как и те кого он считает ворами image

    не суть...
    зря Мегамозг вновь вернули на хабр…
  • Nest Admin — панель управления для сайтов (landing page)
    0
    Всё верно… сказали…

    Вот я год назад хотел опубликовать пример своего «убийцы вордпресса» (несколько тысяч строк кода, несколько интересных решений), часа 4 сочинял описание, а когда уже всё было готово — перечитал текст, посмотрел ещё раз примеры исходного кода и понял что не готово моё творение для хабра… Сейчас тот код почти полностью переписан под 7ю версию php и на нём уже работают пару сайтов, но я всё же не решаюсь пока хвастаться…

    Быть может на новый год напьюсь и наберусь смелости =)

    P.S я даже вместо CKeditor свой собственный WYSIWYG-редактор запилил… image

    image