• Вопрос про SSH ключ в Bitbucket?

    Lobotomist
    @Lobotomist
    Software Developer
    sim3x и Сергей в принципе правильно написали. Напишу более подробно.

    Для того, чтобы работать с репозиторием с авторизацией по ключу у вас должен быть приватный ключ, а на сервере, где вы авторизуетесь (в данном случае bitbucket) - публичная "пара" этого ключа.

    Вам нужно:
    1. В puttygen сгенерировать SSH-2 RSA (выбран по умолчанию). Сохранить его куда угодно, в том числе можно в папку `$HOME/.ssh/`. ($HOME - домашняя папка пользователя). Это приватный ключ, в формате putty.
    2. Нажать Conversions -> Export OpenSSH key и сохранить его в папке `$HOME/.ssh/` с именем `id_rsa`. Это важно сохранить его именно туда и с этим именем, так как это стандартное расположение и имя, которое ожидается многими программами. Его можно изменить, но для этого требуются дополнительные телодвижения.
    Это будет ваш приватный ключ в формате OpenSSH.

    В некоторых gui вам нужно будет выбирать ключ в первом формате, а в консоли используется ключ во втором формате.

    3. Нажимаете save Public key. Сохраняйте куда угодно. У меня все лежат в одной папке. Этот файл вы регистрируете в bitbucket.

    Все. Через git bash у вас должен быть доступ к вашему репозиторию. Обращаю внимание, что ваши приватные ключи никому не передавайте. А публичный можно раздавать сколько угодно.
    Ответ написан
    1 комментарий
  • Почему сессия завершается во время работы с сайтом?

    Lobotomist
    @Lobotomist
    Software Developer
    На первый взгляд - какие-то (или один) php скрипты запускаются со своим маленьким значением gc_maxlifetime. И чем больше людей тем чаще запускается этот скрипт и стираются файлы сессий, которые он считает устаревшими.
    Нужно каким-то образом проверить это предположение.
    1. Установить для сайта другую директорию для хранения сессий. Посмотреть - осталась ли проблема. Если она ушла - значит есть какие-то еще php скрипты, которые удаляют файлы сессий.
    2. Сначала глазами проверить нет ли переопределения gc_maxlifetime перед session_start() во всех скриптах сайта. Если ничего не найдется - можно вынести работу с сессиями в отдельный класс и поставить там временно логирование куда-то настроек сессии при работе с ней. Возможно - найдутся виновные скрипты, которые являются частью сайта.

    И, на всякий случай, укажите, какие значения у следующих настроек во время выполнения?
    var_dump(ini_get('session.cookie_lifetime'));
    var_dump(ini_get('session.gc_maxlifetime'));
    var_dump(ini_get('session.gc_divisor'));
    var_dump(ini_get('session.gc_probability'));
    Ответ написан
  • Как лучше реализовать базу для проекта с конфигурируемыми лентами новостей?

    Lobotomist
    @Lobotomist
    Software Developer
    Раз никто не отвечает напишу кратко свое мнение, хотя оно затрагивает не все вопросы.
    Думаю, что вполне можно попробовать mongodb. Теги, категории и т.п. хранить в самих постах в массивах. Для лент использовать отдельные коллекции, обновлять их в случае изменения пользователем настроек ленты.
    Насчет домашней страницы - я не совсем понял что там можно изменять, так что ничего не скажу.
    Несколько шардов можно сделать, если база будет не справляться. Тут надо будет смотреть узкие места и тогда решать, что именно и как разносить.
    Ответ написан
    Комментировать
  • Не работает скрипт?

    Lobotomist
    @Lobotomist
    Software Developer
    Получение svg у вас асинхронное, а console.log("root"+svgfont.length); вы выводите сразу после update();. В этот момент в массив svgfont еще ничего не помещено.
    Если проблема не только в этом - ставьте console.log во все функции и смотрите, что вызывается, в какой последовательности, с какими параметрами. Так вы увидите, что именно работает не так, как вы ожидаете.
    Ответ написан
    Комментировать
  • Будут ли удалены данные с branch если сделать git reset --hard?

    Lobotomist
    @Lobotomist
    Software Developer
    git reset влияет только на текущую ветку. Ветка это что? Указатель на какой-то коммит. git reset перемещает этот указатель. При этом, в зависимости от опций (--hard, --soft, --mixed) он по-разному работает с файлами в рабочей директории. Если используется --hard - переносится указатель и состояние рабочей директории тоже меняется и становится таким, какое оно в целевом коммите.

    То есть в вашем случае нужно:

    # Откат коммита слияния в мастере
    
    #перейти в мастер
    git checkout master
    # перенести указатель мастера на нужный коммит
    git reset --hard <первый коммит мастера>
    # запушить корректный мастер в origin
    git push -f origin master
    
    # Теперь откат ненужных коммитов в ветке task1
    
    # перейти в ветку task1
    git checkout task1
    # перенести указатель ветки на нужный коммит
    git reset --hard <good commit>


    Поскольку вы фактически удалили часть коммитов из мастера при пуше нужен ключ --forced (-f) для того, чтобы подтвердить, что вы сделали это осознанно.

    Для спокойствия - поставьте тег на коммите слияния. Так вы всегда сможете вернуться к нему, даже если что-то сделаете не так.
    Ответ написан
    Комментировать
  • Как держать одновременно две ветки в рабочей копии?

    Lobotomist
    @Lobotomist
    Software Developer
    Я вижу два варианта:

    1. Использовать два репозитория.

    Вы просто клонируете репозиторий еще в одно место и работаете с ним отдельно.
    - Весь репозиторий дублируется, но если он не очень большой по размеру - в этом нет ничего страшного
    - Переносить изменения между репозиториями надо будет через pull/push, просто commit-ов будет недостаточно. Например, в репозитории (а) делается коммит в ветку (1), в репозитории (б) делается fetch из репозитория (а) ветки (1) и дальше ее коммиты могут уже черри-пикаться или как-то еще переносится в ветку (2).

    2. Использовать дополнительную рабочую директорию (git 2.5+)

    В новой версии git 2.5 появилась команда для создания дополнительной рабочей директории: git worktree. Если есть возможность обновить git, это наиболее удобный вариант. Нужно иметь ввиду, что фича пока эксперементальная.
    Ответ написан
    Комментировать
  • Как настроить try_files в nginx?

    Lobotomist
    @Lobotomist
    Software Developer
    Вот как-то так:

    location ~ ^(/\d+)(\.html)?\/?$ {
        try_files $1.html =404
    }


    Вся суть в регэкспе: Начало строки - несколько цифр - 0 или 1 вхождение ".html" - 0 или 1 вхождение "/" - конец строки..
    Ответ написан
    Комментировать
  • Как копировать определенные ветки Git между репозиториями с изменением авторства?

    Lobotomist
    @Lobotomist
    Software Developer
    Я так понимаю, что эта операция у вас не единовременная, а должна происходить регулярно. То есть repo2 у вас все время должен содержать текущую версию ветки public с коммитами без указания авторства.

    Можно при пуше в repo1/public выполнять код, который все новые коммиты перенесет в ветку repo1/public-bot, изменив у них автора и запушит в repo2/public.
    Перед этим нужно руками эту ветку (repo1/public-bot) подготовить, то есть чтобы код в ней совпадал с текущим repo1/public и при переносе коммитов не было конфликтов. Тут можно воспользоваться ссылкой, которую дал vyachin.

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

    Реализация
    В репозитории repo1 вешаете хук post-receive. Документация по хукам
    Я не спец по bash, так что наверняка можно написать получше, вынести что-то в функции и т.п.

    #!bash
     
    while read oldrev newrev refname
    do
    	# выполняем код только при обновлении ветки public
    	if [ $refname = refs/heads/public]
    	then
    		git checkout public-bot
    		# получаем список новых коммитов
    		commits=$(git log --oneline --reverse test..master --format="%h")
    		for rev in $commits
    		do
    			git cherry-pick $rev
    			git commit --amend --no-edit --author="bot <bot@e.mail>"
    		done
    	fi
    done
    Ответ написан
    Комментировать
  • Как сделать commit начиная с HEAD в старую ветку, которая уже была объединена с master?

    Lobotomist
    @Lobotomist
    Software Developer
    Вы же все замечательно нарисовали: ответвляетесь от нужного коммита (HEAD) и делаете коммит =)
    Я так понимаю, проблема в переносе указателя ветки на другой коммит.

    Тогда вот наиболее простой вариант: Делаете чекаут ветки с перезаписью указателя, если она существует (опция -B) и коммитите в нее.
    git checkout -B mybranch
    git commit ...


    Можно еще так (не знаю только зачем, если есть первый вариант):
    git branch -D mybranch
    git checkout -b mybranch
    git commit ...


    Еще можно использовать reset --hard для ветки, но это, в данном случае, извращение.
    Ответ написан
    Комментировать
  • Рабочая среда: gulp + git + деплой на сервер. Как правильно работать с git?

    Lobotomist
    @Lobotomist
    Software Developer
    Могу предложить два варианта:
    1. Пишите как обычно, настраиваете синхронизацию папки с собранным кодом с вашим удаленным сервером через rsync или winscp
    2. Можно выкладывать ваш код на сервер только при пуше в репозиторий. Тогда настраиваете в репозитории хук, который соберет проект и отправит его на ваш сервер. Реализовывать можно по разному, в зависимости от того, где расположен основной git репозиторий, имеется ли оттуда ssh доступ на web сервер и т.п.
      Нfример, можно сделать так: На веб сервере поставить git, а при пуше в репозиторий на веб сервер по ssh будет отправляться команда на запуск скрипта развертывания. Он будет делать pull и собирать проект


    В любом случае, хранить билд в репозитории с кодом не считаю хорошей идеей. Это почти как хранить там скомпилированные бинарники =)
    Ответ написан
    3 комментария
  • Как правильно использовать комментарии к git commit?

    Lobotomist
    @Lobotomist
    Software Developer
    Есть пост на хабре на эту тему.
    Ответ написан
    Комментировать
  • Правильно ли я понимаю?

    Lobotomist
    @Lobotomist
    Software Developer
    Вариантов множество и выбрать можно только зная специфику конкретного проекта. Кроме того, нет предела совершенству и есть очеь много нюансов с которыми можно мириться в одних случаях и нельзя в других.
    Так что не зная проектов нельзя сказать правильно ли вы что-то поняли или нет. По этому я попробую ответить на озвученные вопросы, но полной картины не предоставлю.

    Разработка

    Разработчики могут проверять свой код либо, как вы сказали, на своих компьютерах - тогда нужно, чтобы разработчик мог запустить копию системы на своем компьютере.
    Могут, так же, использовать один тестовый сервер, с которым будут синхронизировать свой исходный код в процессе работы. Это можно делать с помощью rsync или winscp или чего-нибудь еще. Можно для каждого разработчика использовать отдельный поддомен vasya.develop.com, либо отдельную папку develop.com/vasya/

    Тестирование

    Поскольку в одном "билде" может быть несколько разных задач, то есть слито несколько веток - нужно протестировать их все вместе. Для этого нужно после слияния поместить этот код куда-то уже для тестирования (например, test.develop.com или develop.com/test/). Какие-то правки вносить нужно уже в ту ветку, в которую были слиты эти изменения. Тут уже все зависит от того, как вы это организовываете в git. Когда все протестировано можно деплоить код на продакшн.
    Заливать код можно как вы сказали, через ftp/sftp, либо можно при пуше в определенную ветку в центральном репозитории разворачивать копию на тестовом сервере. Например, при пуше в ветку test - на сервере develop.com делается fetch и в папку develop.com/test/ выгружается текущее состояние ветки test. Ну, это все в общих чертах - нужно еще решить, как и откуда будут переноситься настройки, специфичные для отдельного экземпляра системы, если они есть с какой БД этот экземпляр будет работать и т.п.

    БД

    Все зависит от того, как именно вы ее используете и как осуществляете деплой. Могу порекомендовать держать структуру базы и "системные" данные в каком-либо виде в репозитории. Чтобы можно было развернуть "пустую" базу данных только на основании данных в репозитории. Например, можно просто хранить там скрипты по созданию таблиц с нужной структурой и по заполнению какими-то системными данными. Когда вносятся какие-то изменения в структуру - нужно их, соответственно, сделать и в репозитории. Вообще, перенос изменений в базе данных это отдельный большой вопрос - погуглите "миграция базы данных".
    Ответ написан
    Комментировать
  • Какую посоветуете программу для моментальных скриншотов?

    Lobotomist
    @Lobotomist
    Software Developer
    HyperSnap-Dx
    Ответ написан
    Комментировать
  • Как определить высоту браузера по body и html?

    Lobotomist
    @Lobotomist
    Software Developer
    Тут написано. Добавить особо то и нечего =)

    И я бы немного изменил код:
    1. Не стоит высчитывать долю в каждой проверке, лучше сохранить ее в переменной и ею уже оперировать.
    2. Будет более читабельно, если использовать else if

    /**
     * Определяет позицию скролла по отношению к высоте полоски скролла.
     * @return {Number} 
     */
    function getScrollPosition() {
    	var scrollHeight = document.documentElement.scrollHeight;
    	var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
    
    	return Math.round(scrollTop/scrollHeight);
    };
    
    function scrollfunction() {
    	var body = document.body;
    	var scrollPosition = getScrollPosition();
    
    	if (scrollPosition < 0.07) {
    		body.className = "white";
    	} else if (scrollPosition < 0.20) {
    		body.className = "red";
    	} else if (scrollPosition < 0.30) {
    		body.className = "violet";
    	} else if (scrollPosition < 0.45) {
    		body.className = "blue";
    	} else if (scrollPosition < 0.60) {
    		body.className = "green";
    	} else if (scrollPosition < 0.75) {
    		body.className = "orange";
    	} else if (scrollPosition < 0.96) {
    		body.className = "asphalt";
    	};
    };
    Ответ написан
    Комментировать
  • PHP Simple HTML DOM Parser. Почему не могу получить элемент?

    Lobotomist
    @Lobotomist
    Software Developer
    Если посмотреть исходный код странички - станет ясно, почему отмеченный текст не попадает в выборку.
    Например, ты ищешь td с классом recommendation, но не все td в третьем столбце имеют этот класс. Например тут <td>Spirax S4 ATF HDX</td> этого класса нет. Так же ты вообще не берешь данные из столбца, в котором лежат заголовки <th class="tiername tiername">Standard</th>, откуда же им у тебя взяться? =)

    Я бы на твоем месте по какому-нибудь другому принципу парсил. Какую структуру ты в итоге хочешь получить?
    Ответ написан
    1 комментарий
  • В какую папку нужно положить проект git?

    Lobotomist
    @Lobotomist
    Software Developer
    Если я правильно понял ситуацию, проект нужно положить в папку /home/vallverk/.
    То есть папка .git должна находиться в корне папки проекта. Ну, это в случае, если это не bare репозиторий - тогда у него вообще не должно быть рабочей директории с файлами проекта.
    Ответ написан
    Комментировать
  • Странное поведение git при слиянии

    Lobotomist
    @Lobotomist
    Software Developer
    Наверное, уже не актуально, но так как вопрос в тостере есть и кто-то на него может наткнуться - думаю мой ответ не будет лишним.

    Не могу точно сказать, как сделать так, чтобы git учитывал факт вливания master в feature. Но конкретно эту проблему можно было бы решить с помощью rebase.

    Обозначим тегами следующие коммиты:
    beforeMerge1M - коммит в ветке master непосредственно перед коммитом первого merge.
    beforeMerge1F - коммит в ветке future непосредственно перед коммитом первого merge.

    Сначала нужно заменить первый merge на rebase.
    Для этого перебазируем последовательность коммитов с начала ветки future до вливания в нее мастера на тот коммит мастера, который предшествует вливанию:
    git checkout beforeMerge1F
    git branch tmpFeature
    git rebase beforeMerge1M


    Таким образом, в голове ветке tmpFeature будет как раз то же состояние, что и в результате первого слияния.

    Теперь перебазируем остальную часть ветки на этот коммит:
    git checkout feature
    git rebase tmpFeature


    Теперь состояние ветки feature осталось таким же как и было, но история изменилась - в ней нет коммита слияния и ответвляется от мастера она после коммита beforeMerge1M.

    Можно делать слияние в master, которое планировалось, но, возможно, имеет смысл ее еще раз перебазировать на мастер, чтобы в процессе этого разрешить возникающие конфликты, если они будут и потом без рпоблем сделать merge.
    git rebase master
    git checkout master
    git merge feature --squash


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

    Lobotomist
    @Lobotomist
    Software Developer
    Такое у меня есть ощущение, что уточнение вопроса автор не заметил.

    Если исходить из моего предположения - вам может подойти автосинхронизация в winSCP (можно по ftp, sftp).
    Для себя я на данный момент выбрал именно этот вариант, так как доступ на сервер есть только по ftp, а realSync работает только по ssh.

    upd:
    Можно сохранить различные настройки синхронизации (в т.ч. фильтры) в настройках: Preferences -> Transfer -> Presets
    Например, я исключил папку .git и другие файлы, которые не надо синхронизировать.
    Так же там можно настроить автоматическое применение пресета при определенных условиях, например, у меня он применяется, если я подключаюсь к рабочему ftp серверу.

    Может быть удобным запускать автосинхронизацию через bat файл. Например:
    файл sync.bat:
    start winSCP.exe /console /script=./keep_uptodate.txt /log=./log.txt

    файл keep_uptodate.txt:
    # Disable overwrite confirmations that conflict with the previous
    option confirm off
    # Коннект через логин и пароль
    open login:pass@host
    # Change remote directory
    cd /path_on_ftp
    lcd d:/local_path
    # Force binary mode transfer
    option transfer binary
    keepuptodate -filemask="| */unifont/*.php; */unifont/*.dat; .git/"
    Ответ написан
    Комментировать