понедельник, 10 февраля 2014 г.

Импорт существующих git-репозиториев в gerrit

Если вам понадобилось перенести существующие репозитории в gerrit то делается это так:

  1. В gerrit создается новый проект, например  myProject.
  2. В уже имеющийся репозиторий добавляется remote MyProject.
  3. Заливаем набор изменений в MyProject.


  • git remote add gerrit_MyProject /path/to/gerrit/repo/MyProject.git
  • git push --mirror gerrit_MyProject

пятница, 27 декабря 2013 г.

Обновление Apache с версии 2.2 на версию 2.4

Если при обновлении Apache с версии 2.2 на версию 2.4 у вас вдруг перестал работать Reverse Proxy на внутренний домен по https у которого есть самоподписанный сертификат, и выдается сообщение типа:

[proxy:error] [pid 21402] (502)Unknown error 502: [client 127.0.0.1:44485] AH01084: pass request body failed to 127.0.0.1:8081 (127.0.0.1)

То скорее всего дело в следующих опциях, которые в версии 2.2 по умолчанию были выставлены в off, а в 2.4 по умолчанию on:

SSLProxyCheckPeerCN off
SSLProxyCheckPeerExpire off

Новый Apache теперь по умолчанию не доверяет самоподписанным сертификатам.

вторник, 3 декабря 2013 г.

Средства для CodeReview

Народ, подскажите кто какими средствами пользуется для CodeReview?
Мы пытались использовать Crucible - но оно нам не понравилось.
Сейчас мы выбираем между ReviewBoard и Gerrit.

И вообще, расскажите как этот процесс поставлен у вас?

понедельник, 1 июля 2013 г.

Немного про volatile

В языках C и C++ есть такое замечательно ключевое слово volatile.
Согласно стандарту языка C, переменная обозначенная типом с квалификатором volatile может быть изменена каким-то неизвестным способом (may be modified in ways, unknown to the implementation).

Допустим у нас есть вот такой код:

int a = 0;


int main (void) {

   while (*(int*)&a == 0)

      /* do smth. */ ;

   return 0;

}


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

00008294<main>:

   8294:   eafffff    b    8294 <main>

Очевидно, что для того, чтобы заставить компилятор сгенерировать код, который бы проверял каждый раз значение переменной a, нужно использовать ключевое слово volatile при объявлении a
volatile int a = 0;


int main (void) {

   while (*(int*)&a == 0)

      /* do smth. */ ;

   return 0;

}


Но если скомпилировать эту программу мы увидим все тот же бесконечный цикл:
00008294<main>:

   8294:   eafffff    b    8294 <main>


Это все происходит из-за того, что при преобразовании в теле цикла к указателю на int, снимается квалификатор типа volatile, и когда мы разыменовываем указатель, то уже имеем переменную типа int, которая и сравнивается с 0.

Поэтому, чтобы добиться желаемого эффекта volatile нужно употребить сразу в двух местах:


volatile int a = 0;


int main (void) {

   while (*(volatile int*)&a == 0)

      /* do smth. */ ;

   return 0;

}


И тогда наконец-то мы получим то, что хотели:

00008294<main>:

         8294:   e59f2010   ldr     r2, [pc, #16]   ; 82ac
      <main+0x18>
         8298:   e5923000        ldr     r3, [r2]
         829c:   e3530000        cmp     r3, #0
         82a0:   0afffffc        beq     8298 <main+0x4>
         82a4:   e3a00000        mov     r0, #0
         82a8:   e12fff1e        bx      lr
         82ac:   000104f4        .word   0x000104f4

понедельник, 23 июля 2012 г.

не работает ptrace в Ubuntu

Обнаружили тут, что системный вызов ptrace не работает в Ubuntu 
и вываливается с ошибкой 'operation not permitted'.
 
Оказывается такое поведение по умолчанию включено в Ubuntu начиная с версии 10.10

Чтобы изменить поведение по умолчанию нужно немного поправить настройки ядра:
echo 0 > /proc/sys/kernel/yama/ptrace_scope

Или поправить файлик: 
/etc/sysctl.d/10-ptrace.conf