Контакты

Достижения

Все достижения (19)

Наибольший вклад в теги

Все теги (58)

Лучшие ответы пользователя

Все ответы (34)
  • Какой мессенджер с открытом кодом взять?

    unclechu
    @unclechu
    Покроет всё перечисленное - https://riot.im/
    Это клиент к протоколу Matrix.

    1. Открытый децентрализованный сервер (федеративный, т.е. возможно свободное общение между серверами)
    2. Открытый клиент
    3. Хранение истории на сервере
    4. Обмен файлами
    5. Групповые чаты
    6. Аудио/видео звонки (в т.ч. групповые)
    7. Демонстрация экрана (в Riot зажать Shift при клике на видеозвонок)
    8. e2e шифрование
    9. Поддержка Markdown для сообщений
    10. Веб-версия клиента
    11. Десктоп-версия клиента (gnu/linux, os x, windows)
    12. Мобильные версии клиентов (anroid, iphone)
    13. Есть русскоязычная локализация
    14. etc.


    Из недостатков можно отметить, что десктопная версия Riot сделана на Electron-е.

    P.S. Можно задать интересующие вопросы тут: https://riot.im/app/#/room/#ru.matrix:matrix.org
    Ответ написан
    3 комментария
  • Хочу научиться создавать плагины JQuery - с чего начать?

    unclechu
    @unclechu
    Я считаю, что начать стоит с освоения UMD (по ссылке также имеются примеры jQuery-плагинов), т.к. на сегодняшний день сколько-нибудь сложный фронт-енд как правило не обходится без AMD или CommonJS. Хорошим живым примером будет jQuery UI.
    Ответ написан
    4 комментария
  • Как работать с асихнронным кодом в C++ модуле для Node.JS?

    unclechu
    @unclechu Автор вопроса
    Решилось, правда не совсем так как хотелось. Теперь вызов коллбека асинхронен, но мне нужно получить результат внутри «process», хотябы просто дождаться завершения «after».
    uv_work_t *baton;
    
    void work(uv_work_t* task) {}
    
    void after(uv_work_t* task, int status) {
        HandleScope scope;
    
        int n = *((int*)(&task->data));
        const unsigned argc = 1;
        Local<Value> argv[argc] = { Local<Value>::New( Number::New(n) ) };
        processCallback->Call(Context::GetCurrent()->Global(), argc, argv);
    
        scope.Close(Undefined());
        delete task;
    }
    
    int process()
    {
        baton = new uv_work_t();
        baton->data = (void*)123;
        uv_queue_work(uv_default_loop(), baton, work, after);
        return 0;
    }
    Ответ написан
    Комментировать
  • Как правильно верстать некоторые вещи?

    unclechu
    @unclechu
    1. Всегда px;
    2. По идее нужно использовать line-height, но когда столкнулся с багом фичей отрисовски шрифтов на яблооси (ни на одной другой ОСи это не повторялось, шрифт смещён относительно центра), то стал использовать box-sizing: border-box; и выравнивание через padding-top;
    3. В фуррифоксе-то как раз со шрифтами всё хорошо, а вот хромоногий и его производные имеют с этим проблемы на шindows-ах, многие light-версии шрифтов в относительно небольшом кегле превращаются вообще не пойми во что, контуры частично исчезают. Делаю .otf, .woff, .svg (для старых IE .eot), вот пример с less миксином объявления шрифтов:

      @revision: 4;
      @tplPath: '/';
      @fontsPrefix: '@{tplPath}fonts/';

      .font-face(@fontname, @fontfile, @fontweight:normal, @fontstyle:normal) {
      font-family: "@{fontname}";
      src: url("@{fontsPrefix}@{fontfile}.eot?v=@{revision}");
      src: url("@{fontsPrefix}@{fontfile}.eot?v=@{revision}#iefix") format("embedded-opentype"),
      url("@{fontsPrefix}@{fontfile}.woff?v=@{revision}") format("woff"),
      url("@{fontsPrefix}@{fontfile}.otf?v=@{revision}") format("opentype"),
      url("@{fontsPrefix}@{fontfile}.svg?v=@{revision}#@{fontfile}") format("svg");
      font-weight: @fontweight;
      font-style: @fontstyle;
      }

      @font-face { .font-face('Roboto', 'Roboto-Regular'); }
      @font-face { .font-face('Roboto', 'Roboto-Bold', bold); }
      @font-face { .font-face('Roboto-Light', 'Roboto-Light'); }
      @font-face { .font-face('Roboto-Medium', 'Roboto-Medium'); }
      @font-face { .font-face('Roboto-Thin', 'Roboto-Thin'); }
      @font-face { .font-face('Roboto Condensed', 'RobotoCondensed-Regular'); }
      ;
    4. Чтобы скролл не появлялся, — для родительского элемента ставится overflow: hidden;
    5. Используйте Modernizr, делайте изначально бордюр через outline, а при наличии поддержки теней (html.boxshadow ...) убирайте outline и делайте нормальный box-shadow, а в Safari пусть правят баги, это не ваша проблема;
    6. Возможно у вас JPEG, если дизайнер присылает рендеры не в PNG (или другом lossless), — бейте током;
    7. От спрайтов отказался в пользу SVG файлов, все элементы сайта, как правило — векторные, в условиях торжества мобильных платформ, — использовать для этого растр — неразумно, в редких случаях PNG (когда это имеет какой-то смысл или безисходность), JPEG только для фотографий;
    Ответ написан
    Комментировать
  • Как создать и вывести такой PHP массив?

    unclechu
    @unclechu
    <a href="<?=$arr['big']?>">
      <img src="<?=$arr['mini']?>">
    </a>

    С помощью foreach вы проходитесь по этому ассоциативному массиву, где на каждой итерации $k — это ключ ('mini', 'big'), и $val значение по ключу ('thumbs/'.$photo, 'full/'.$photo).

    То-есть foreach попросту не нужен.

    UPD: но судя по первому куску кода (вкл. режим телепатии), вы похоже хотите наполнить массив $arr другими ассоциативными массивами, тогда:

    <?
    $arr = array();
    
    foreach ($photo_arr as $photo) {
      $arr[] = array(
        'mini' => 'thumbs/'.$photo, // адрес к миниатюрке фото
        'big' => 'full/'.$photo //адрес к полноразмерному изображению
      );
    }
    ?>
    
    <? foreach ($arr as $item) { ?>
      <a href="<?=$item['big']?>">
        <img src="<?=$item['mini']?>">
      </a>
    <? } ?>
    Ответ написан
    1 комментарий

Лучшие вопросы пользователя

Все вопросы (30)