• Правильно составить .htaccess?

    Tyranron
    @Tyranron
    Исключить реально существующие папки и файлы можно добавив для правила 2 условия:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([_a-zA-Z0-9]+)$ /system/page/profile.php?username=$1 [L,QSA]
    Ответ написан
    Комментировать
  • Что такое и как исполнять команды начинающиеся с $?

    Tyranron
    @Tyranron
    $ всего лишь обозначает приглашение командной строки для ввода.
    В Windows, например, оно > вместо $, в *nix'ах $.
    Вам не надо эту часть набирать, Вам нужно набирать все, что после нее.
    Ответ написан
    Комментировать
  • Как заставить задеплоится maven-модуль?

    Tyranron
    @Tyranron
    Возможно, Вы перепутали deploy c install. На моем опыте, установка в локальный репозиторий производится именно посредством install, а deploy, это уже выгрузка на сервер после сборки или в удаленный репозиторий. На что оно и ругается, мол, у Вас для этого никаких "реквизитов" не указано.
    Ответ написан
    Комментировать
  • Как избежать пропусков а autoincrement при добавлении записи в MySQL?

    Tyranron
    @Tyranron
    @VitaZheltyakov и @Playmore все правильно Вам сказали.
    Вы, похоже, реально недооцениваете рост экспоненты.
    Допустим у Вас 1 000 000 INSERT'ов в таблицу за секунду. Тогда за 30 лет непрерывной работы в таком режиме, значение вашего инкремента поднимется примерно до 1 000 000 * 86400 * 365 * 30 = 946080000000000 что на 5 десятичных разрядов меньше максимального числа unsigned bigint, а именно 18446744073709551615.
    Так что я боюсь, что до Вашего "оттянутого" дня Х не доживете ни Вы, ни Ваши внуки, ни железо на Ваших серверах.
    Потому не заморачивайтесь и оставьте в покое autoincrement как есть. В противном случае Вы создаете только лишнюю, но совершенно бесполезную, нагрузку на базу и приложение.
    Ответ написан
    2 комментария
  • Почему PhpStorm автоматически не заливает файлы на сервер после выполнения git pull?

    Tyranron
    @Tyranron
    Убедитесь, что у Вас чекнут чекбокс "Upload external changes" сразу после после выпадающего списка где Вы выбрали Always.
    Ответ написан
    Комментировать
  • Golang. Вызвать функцию из другого файла

    Tyranron
    @Tyranron
    Если файлы лежат в одной директории и оба в package main, то никаких проблемы быть не должно, даже если именуете с маленькой буквы.
    Подозрвеаю что проблема в способе запуска программы. Для go run такое не прокатит, он умеет цеплять только одиночные файлы. Нужно скомпилить директорию и должно быть все в порядке.
    Ответ написан
    1 комментарий
  • SSH Connection timed out

    Tyranron
    @Tyranron
    Вероятно заблокирован порт 22 на выход в кофехаусе.
    Или у Вас ssh разрешен только определенным IP на сервере.
    Ответ написан
    Комментировать
  • Go + Nginx: научите использовать правильно

    Tyranron
    @Tyranron
    как лучше обращаться к Go, через Proxy или FastCGI?

    И так и так хорошо. Я все же предпочитаю вариант проксировать запросы на Go.

    Не могу проверить вообще, так как на рабочей машине Windows.

    Это не проблема, поставьте виртуалку и вперед. В конце-концов: личный опыт лучше любых объяснений.

    И ещё очень странный вопрос: нужно-ли при таком подходе компилировать Go? Просто где-то видел пример кода, когда обращаются к исходному файлу с расширением .go.

    Компилировать нужно, особенно в случае большого приложения.
    Да, можно сделать:
    go run file.go
    Но, во-первых, код все равно компилируется в бинарник и выполняется при таком подходе, просто это происходит в папке с временными файлами и как бы скрыто от Вас.
    Во-вторых, этот подход не катит, если в папке с проектом больше файлов нежели file.go (имеется в виду на уровне package main).
    В-третьих, это обязует Вас иметь установленный Go соответственной версии на production серверах, когда обычный бинарник этого не требует.
    В-четвертых, а как быть в таком случае с демонизацией и zero downtime reloads? Да, можно, но неудобно, учитывая что каждый раз нужно будет перекомпиливать.
    Лучше скомпилировать один раз и не заморачиваться.
    Команда go run больше подходит для небольших файлов аля скрипт для выполнения одноразовой работы и тому подобное.

    Прошу не кидать камнями, я только учусь правильному написанию веб-сайтов на Go.

    Учиться - всегда полезно, никто камнями кидать не будет.
    Ответ написан
    5 комментариев
  • Выборка данных из mysql

    Tyranron
    @Tyranron
    Ну так добавьте условие WHERE zz.`id` IS NULL

    Ну и знаменитая ссылка в подобных вопросах:
    blog.codinghorror.com/a-visual-explanation-of-sql-joins
    Ответ написан
  • InnoDB - Транзакции уменьшают скорость выполнения запросов

    Tyranron
    @Tyranron
    Транзакции в InnoDB происходят в любом случае, просто когда Вы явно их не указываете, то запрос автоматически оборачивается в транзакцию (если установлен AUTOCOMMIT = 1, по умолчанию он обычно установлен).
    Так что быстрее: 50 000 отдельных транзакций или одна?

    Чтиво:
    Про autocommit
    Про InnoDB
    Ответ написан
    2 комментария
  • Как решить проблему с jquery UI datepicker?

    Tyranron
    @Tyranron
    Ответ написан
    Комментировать
  • Как написать условие?

    Tyranron
    @Tyranron
    Вероятно, тут более разумно, проще и производительнее будет пойти от обратного.
    var num = 5,
        all = true,
        arr = [1, 5, 7, 9];
    
    for(var i = 0; i < a.length; i++) {
        if(arr[i] != num) {
            all = false;
            break;
        }
    }
    Ответ написан
    7 комментариев
  • Автоматическое форматирование отступов в ассоциативных массивах в PHPStorm

    Tyranron
    @Tyranron
    PHPStorm 7
    Preferences (или Settings) > Секция Project Settings > Пункт Code Style > Подпункт PHP > Вкладка Other > Чекбокс Align key-value pairs
    Ответ написан
    1 комментарий
  • Как сделать выборку одной случайной записи MySQL?

    Tyranron
    @Tyranron
    Если выбрать одну, то вполне можно:
    SELECT * FROM `ex4` WHERE %условие% ORDER BY RAND() LIMIT 1

    Если нужно несколько, то такой подход не рекомендуется ибо RAND() сильно садит производительность запроса.
    Ответ написан
  • Golang: как работает тип func?

    Tyranron
    @Tyranron
    Во втором варианте вроде как так. Чтобы объявить тело функции, нужно использовать ключевое слово func и никак иначе, что разумно по своим причинам. Как минимум, Вам не нужно помнить и держать в голове какая сигнатура кроется за каким типом, когда Вы смотрите на тело функции, то есть для каждого тела функции видно явно что оно должно принимать и возвращать. К тому же, дополнительная гибкость (в данном случае: объявление функции через алиасы типов, а не ключевое слово func) - это всегда удар по производительности, в данном случае - вероятное повышении времени компиляции, а для разработчиков языка это один из главных факторов, потому они очень и очень придирчиво относятся ко всем введениям и возможностям компилятора. Вон, от них даже дженериков никак допроситься не могут. Более того, выгода от возможности объявлять тело функции через алиасы типов (type aliases), а не ключевое слово func, крайне сомнительна, Вам так не кажется? К тому же не стоит путать объявление типа и объявление функции. Логично, что всегда сначала должен быть объявлен тип, а потом уже сама функция/переменная/структура, просто синтаксис языка позволяет сократить писанину. А Вы в данной ситуации хотите обойтись только созданием типа. А как тогда будете именовать входные параметры функции при её объявлении, если таковы имеются?

    Выгода же абсолютно такая же, как и при других вариантах применения алиасов типов. В первую очередь - это возможность дополнительного контроля типов.
    Например: Вы разрабатываете библиотеку (свой package) и Вам нужно, чтобы какая-то функция получала на вход только те функции, которые определены у Вас в библиотеке и никакие другие. Тогда Вы создаете алиас типа на сигнатуру функции и делаете его невидимым для внешних потребителей (объявляете с маленькой буквы).
    package mylib
    
    type someFunc func() bool
    
    var (
    	Apple someFunc = func() bool {
    		return true
    	}
    	Dog someFunc = func() bool {
    		return false
    	}
    )
    
    func Consume(f someFunc) {
    	f()
    }

    После этого внешний потребитель не сможет вызвать функцию Consume() передав туда какую угодно функцию, а только те функции, которые Вы ему приоткрыли.
    package main
    
    import "mylib"
    
    func main() {
    	externalFunc := func() bool {
    		return true
    	}
    	
    	mylib.Consume(externalFunc) 	// fail
    	var extF mylib.someFunc		// fail
    	
    	mylib.Consume(mylib.Apple)	// success
    }

    Таким образом, обвязав свою библиотеку дополнительным контролем типов, Вы добились желаемого результата.
    Во вторую очередь - это возможность сделать код более читаемым. Например, у Вас где-то есть достаточно громоздкая сигнатура и её нужно использовать во многих местах, чтобы не писать одно и то же много раз, Вы пишете сигнатуру только при объявлении функции и создании алиаса, а потом жонглируете алиасом.
    Ответ написан
    1 комментарий
  • Как лучше изменить структуру массива в php?

    Tyranron
    @Tyranron
    function zip($tuple_of_lists)
    {
        $list_of_tuples = array();
        foreach($tuple_of_lists as $key => $list) {
            foreach($list as $i => $value) {
                $list_of_tuples[$i][$key] = $value;
            }
        }
        return $list_of_tuples;
    }
    
    $data = array_map('zip', $data);

    Try here
    Ответ написан
  • Какая технология лучше для comet-сервера: tcp sockets, websockets или long polling?

    Tyranron
    @Tyranron
    Если клиент на flash, то не вижу проблем использовать стандартные tcp sockets, это ведь не js в браузере и никто не запрещает.
    Сервер, как на меня, лучше сделать на node.js, чем на php, так как у последнего изначально иная природа (хоть и есть всякие php-daemon). Если будут какие-то тяжелые вычисления на сервере, то с node.js можно их пробрасывать на тот же php, дабы не грузить node.js (она однопоточная, не забываем об этом).
    В качестве альтернативы также могу посоветовать использовать Go. Сервер на нём пишется не медленнее, чем на node.js, он может работать не только в одном потоке, потому тяжелые вычисления, в принципе, можно и не выносить за пределы. Компилируется. А также гораздо богаче инструмент для асинхронных взаимодействий прямо на уровне языка, а не библиотек.
    Ответ написан
  • Как удалить Nginx, собранный из исходников на CentOS 6.5?

    Tyranron
    @Tyranron
    Попробуйте запустить make uninstall с папки установки, не сорцов в системе.
    На крайний случай:
    kill `cat /usr/local/nginx/logs/nginx.pid`
    find / -name nginx

    И чистим ручками ненужные файлы.
    Ответ написан
  • Как реализовать ленту новостей для социальной сети?

    Tyranron
    @Tyranron
    Ну, join'ить это дело можно (подозреваю что там ещё и union'ом прийдётся заливать), но так обычно не делают, потому что это решение потом невозможно будет отмасштабировать. Запрос тяжелый, кеширование поможет плохо, так как активность большая и кеш часто сбрасываться будет и база будет дергаться не многим меньше, ну и если базу надо распилить на 2 и больше серверов, то останемся лапу сосать с join'ами.

    Для начала можно сделать так - для конкретного `user_id` (владелец новостной ленты):
    1) Первым запросом стягиваем айди всех друзей
    2) Вторым запросом стягиваем айди всех групп, в которых состоит
    3) Третьим запросом стягиваем из comments все записи WHERE `user_id` IN (группы + друзья) ORDER BY/LIMIT по вкусу.

    Преимущества:
    Меньшая нагрузка на базу, она будет делать меньше дорогостоящих операций с временными таблицами. По индексам быстрее будет отдавать результат.
    Первые 2 запроса можно спокойно закешировать, так как добавляются/удаляются друзья гораздо реже, чем сами посты. Потому по сути сводится всё к одному запросу на сами посты без join'ов.

    Минусы:
    Больше кода на обработку 3х запросов. Чуть более длительное выполнения скрипта, что, в принципе, не будет ощущаться пользователем, и вообще будет не справедливо, если первые 2 запроса кешировать.

    Но если стоит задача масштабироваться, то и такого подхода к делу недостаточно. Там уже надо будет скорее всего жертвовать лишним местом, чтобы сократить расходы на собирание размазанных данных по всем серверам баз, например, вести отдельную таблицу ленты новостей для каждого пользователя, которая будет агрегировать все необходимые айдишники.
    UPD: ...как и указал @jarvis
    Ответ написан
    4 комментария