Обсуждают в коллекции

Фильм «Фонтан» 81


Тёрка в тагах


Друзья

Его(2) Общие(0) Хотят дружить(0)


  • Atrinax

  • Blackoff

  • login

  • login

  • login

  • login

Враги

Его(0) Общие(0) Обиженные(1)

На странице: 24 48 96

Большая Тёрка / Мысли /

Личная лента

фото

olegchir

ыыыть!
Портрет жителя
Исусья тряпка, оказывается есть возможность обойти проблему с densitydpi!
http://stackoverflow.com/questions/11592015/support‑for‑target‑densitydpi‑is‑removed‑from‑webkit
Надо с утра попробовать...
Перенес Идею и всё жава‑окружение на SSD.
Без этого в Винде вообще невозможно что‑то делать, Идея грузится по нескольку минут.
А вот в линуксе оно и без SSD грузится с нормальной скоростью.

Возможно это потому, что Винда постоянно пишет какие‑то кэши на свой системный диск и сим убивает его производительность в ноль, даже будучи в одиночестве. Идея со старта читает с диска со скоростью 20 Mb/s, и если там еще винда выпендривается с кэшами, диск не вывозит.

Как перенести на ссд Sbt еще не понял. Оно продолжает упорно писать в ~/.sbt.
По тому моему коммиту в Yii2 очнулись и закрыли как решенное другим способом :)

https://github.com/yiisoft/yii2/issues/1350

Gitlab

Установил на Убунту гитлаб, по инструкции вот по этой ссылке:

https://gitlab.com/gitlab‑org/gitlab‑ce/blob/master/doc/install/installation.md

Действительно работает.

Радуюсь отсутствию необходимости юзать гитхаб и битбукет.
Сделать из сиквенции картинок анимированную пнг на маке
http://apple.stackexchange.com/questions/30549/are‑there‑any‑app‑store‑quality‑apps‑for‑creating‑animated‑gifs‑from‑a-series

Похоже, имеджик — самое простое и хорошее решение.
Интересно, что при установке nginx из портов, оно добавляется в демоны. Т.е. можно пойти в .bash_profile и сделать что‑то типа:

alias nginx_start='sudo launchctl load -w /Library/LaunchDaemons/org.macports.nginx.plist'
alias nginx_stop='sudo launchctl unload -w /Library/LaunchDaemons/org.macports.nginx.plist'
alias nginx_restart='nginx_stop; nginx_start;'

То же и про FPM:

alias fpm_start=’sudo launchctl load -w /Library/LaunchDaemons/org.macports.php54-fpm.plist’
alias fpm_stop=’sudo launchctl unload -w /Library/LaunchDaemons/org.macports.php54-fpm.plist’
alias fpm_restart=’fpm_stop; fpm_start’

(случайно узнал отсюда: http://florianjensen.com/2012/12/21/installing‑nginx‑and‑php‑fpm‑on‑mac‑osx‑10–8-using‑ports/)
Привет. Сейчас у меня два проекта, поэтому мне некогда общаться и куда‑то ездить. Буду более свободен в конце февраля.

Node.js server automatic reloading without nodemon (grunt + watch task + grunt-shell-spawn)

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

Теперь решение.

Вначале npm install grunt-shell-spawn --save-dev.
Это форк grunt-shell, умеющий запускать фоновые процессы.
Всё то же самое, но появляется опция async: true.

Теперь нам есть чем запускать Ноду, но убить ее так не получится: т.к. запуск асинхронный, watch запускает новый рестарт до того, как отработал старый. failOnError: false в данном случае не помогает. Неважно как запускается: или через встроенную возможность последовательного выполнения, или через "killall node || node ./app.js || true".

Поэтому для killall node будем юзать просто grunt.util.spawn.
Внимание на окончание: fallback: 0 }, function (error, result, code) {return 0}.
Эта строчка проглатывает ошибки и позволяет процессу продолжаться, даже если с killall'ом что-то случилось.

Под катом важные части Gruntfile:
Читать далее


module.exports = function (grunt) {

...

    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-shell-spawn');

...

    grunt.registerTask('stopNode', function() {
        grunt.util.spawn({
            cmd: 'killall',
            args: ['node'],
            fallback: 0
        }, function (error, result, code) {return 0});
    });
    grunt.registerTask('startNode', ['shell:startNode']);
    grunt.registerTask('restartNode', ['stopNode','startNode']);

...

        watch: {
            options: {
                livereload: true,
                nospawn: true
            },
            coffee: {
                files: ["./*.coffee", 'routes/*.coffee'],
                tasks: [
                    "coffee",
             "restartNode"
                ]
            }
        },
        shell: {
            startNode: {
                command: ["node ./app.js"],
                options: {
                    async: true,
                    execOptions: {
                        cwd: './',
                        detached: true
                    }
                }
            },
            options: {
                stdout: true,
                stderr: true,
                failOnError: false
            }
        }

...

    });
};




Прячем говнокод

Познал всю офигительность генерации HTML вместо написания руками.

Короче, из-за хлама в HTML код быстро становится нечитаемым.
Так как устранить нечитаемую часть невозможно, хочется ее куда-нибудь спрятать с глаз долой.
Из-за чего я сегодня попробовал конвертнуть всё в JADE.
Это оказалось совсем не так легко, как вначале представлялось.
Но зато сразу стало действительно понятно, что происходит!

Читать далее
Например, вот пустая страница, у которой есть заголовок с логотипом компании и адресом/телефоном, и прибитый к низу футер:

alt

Замечаем, что адрес/телефон сцентрированы по вертикали и горизонтали.

(По вертикали - по высоте заголовка, по горизонтали - внутри некоей ячейки шириной 300 пикселей, которая стремится быть как можно правее. Почему 300 пикселей? Потому что нужна фиксированная ширина, а для мелкой ширины нужно ориентироваться на 630 и 750 пикселей. Откуда взялось это, особенно 630 - отдельный разговор :)

Вот как это выглядит в JADE->HTML:

extends layout
include whcenter

block content

    body
        div#sticky_footer_body_wrap: div#adjust_width_to_device
            nav#top-navbar
                div#top-navbar-brand
                    img#brand-img(src="/public/images/logo.png")
                div#top-navbar-phone: +fwhcenter("300px")
                    div г. Новосибирск, ул. Большевистская, 109к1
                    div тел/факс:
                        b (383) 251-01-18

        div#sticky_footer: div#adjust_width_to_device
            div footer content




И замечаем, что тут нету никакого мусора, обеспечивающего центрирование.

Внимание на +fwhcenter("300px"), выделенный жирным шрифтом. Оно как раз и делает центрирование по ширине ячейки 300 пикселей.

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

В определении fwhcenter эта особенность писать много тэгов по горизонтали очень помогает:

mixin fwhcenter(inner_width, outer_width)
    if block
            if outer_width
                div.whouter(style="width:#{outer_width};"): div.whmiddle: div.whinner(style="width:#{inner_width};")
                    block
            else
                div.whouter(style="width:#{inner_width};"): div.whmiddle: div.whinner(style="width:#{inner_width};")
                    block
        else



В одну строчку написан весь мусор по созданию центрированного блока.

Как видим, JADE умеет параметрические миксины, включая переменное количество параметров и проверку на их наличие, а также интерполяцию строк.

Ну и кому интересно, что же такое стили whouter, whmiddle, whcenter. Есть два файла с их определениями, один относится ко старым браузерам, другой к новым.

Я решил не генерить LESS'ом несколько вариантов проекта для разных браузеров, т.к. код в основном кроссплатформенный. Поэтому центрирование подключаются динамически, втупую вот так:

link(rel="stylesheet", type="text/css", href="/public/stylesheets/src/fwvh-centerer-modern.css")
| <!--[if lte IE 7]>
| <link rel="stylesheet" type="text/css" href="/public/stylesheets/src/fwvh-centerer-compat.css"></link>
| <![endif]-->



В варианте для современных браузеров это выглядит так:

.whouter {
  display: table;
  position: absolute;
  height: 100%;
  width: 100%;
}

.whmiddle {
  display: table-cell;
  vertical-align: middle;
}

.whinner {
  margin-left: auto;
  margin-right: auto;
}



В варианте для устаревших браузеров это выглядит так:

.whouter {
  display: inline-block;
  top: 0;
}

.whmiddle {
  display: inline-block;
  top: 50%;
  position: relative;
}

.whinner {
  display: inline-block;
  top: -50%;
  position: relative;
}



Зачем вообще старые браузеры, если Twitter Bootstrap не умеет браузеры до IE10? Мы побеспокоились об этом заранее и на старых бразуерах кое-что отображается.

| <!--[if lt IE 9]>
| <script type="text/javascript" src="/public/javascripts/vendor/other/html5shiv.js" ></script>
| <script type="text/javascript" src="/public/javascripts/vendor/other/es5shim.js" ></script>
| <script type="text/javascript" src="/public/javascripts/vendor/other/respond.min.js" ></script>
| <![endif]-->


В результате видим что код стал более прозрачным, писать его быстрее и удобней.

Недостатком JADE/LESS/итп является время на декомпиляцию в случае ошибки, но в данном случае это время незначительно по сравнению с возможностью активной генерации тонн говнокода с помощью параметрических миксинов.
Го, я создал: http://youtrack.jetbrains.com/issue/IDEA‑119854

Очень настойчивая бага. Оно утверждает, что 

meta(http‑equiv=«Content‑Type», content="text/html; charset=UTF‑8")

Неправильная строчка потому, что кодировки UTF‑8 не существует.

Т.е. коммит приходится запускать дважды. В первый раз чтобы удостовериться, что найденные ошибки — это целая 1 ошибка про UTF‑8. Второй раз — чтобы закоммитать. Неудобно.

Или это не бага? Я могу писать meta‑тэг с charset=UTF‑8, или это «плохой стиль» и сейчас небоходимо использовать meta(charset="utf‑8")?

Неприятно признаваться в неграмотности, но лучше быть неграмотным, чем долбоёбом.
Шаблоны для настройки nginx для проксирования nodejs+express

Вот тут показывают нужность этого дела: http://stackoverflow.com/questions/9967887/node-js-itself-or-nginx-frontend-for-serving-static-files

alt

Читать далее
Настройка nginx показалась даже почти удобной

Эти два файла работают поверх дефолтного убунтового конфига

Симлинк на этот файл в /etc/nginx/hosts-enabled

Можно раскомментить static_fallback и отдать, например, в какой-нибудь другой инстанс ноды

upstream new.asterelectro.my {
    server 127.0.0.1:3000;
}

server {
    server_name new.asterelectro.my;

    root /my/sites/asterel3;

    location ~ ^/(public/) {
        root /my/sites/asterel3;
        access_log off;
        expires max;
        #try_files $uri @rw_static_fallback;
    }

    #location @rw_static_fallback {
    #   rewrite ^(.*)$ /static-fallback$1 last;
    #}


    location / {
        proxy_pass http://new.asterelectro.my/;
        proxy_redirect off;
        proxy_set_header   X-Real-IP          $remote_addr;
        proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto  $scheme;
        proxy_set_header   Host               $http_host;
        proxy_set_header   X-NginX-Proxy      true;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_cache one;
        proxy_cache_key asterel3$request_uri$scheme;
    }

    error_log /var/log/nginx/asterel3.log;
    access_log /var/log/nginx/asterel3.log;

}


Симлинк на этот файл в /etc/nginx/conf.d

Раскомменчивать по мере необходимости, наблюдая в tail -f /var/log/nginx/error.log ошибки типа duplicated option

proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=300;
proxy_temp_path /var/tmp;

#default_type  application/octet-stream;
#sendfile        on;
#keepalive_timeout  65;

#gzip on;
gzip_comp_level 6;
gzip_vary on;
gzip_min_length  1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript
gzip_buffers 16 8k;
«Двоемыслие означает способность одновременно держаться двух противоречащих друг другу убеждений. Партийный интеллигент знает, в какую сторону менять свои воспоминания; следовательно, сознаёт, что мошенничает с действительностью; однако при помощи двоемыслия он уверяет себя, что действительность осталась неприкосновенна. Этот процесс должен быть сознательным, иначе его не осуществишь аккуратно, но должен быть и бессознательным, иначе возникнет ощущение лжи, а значит, и вины. Двоемыслие — душа ангсоца, поскольку партия пользуется намеренным обманом, твёрдо держа курс к своей цели, а это требует полной честности. Говорить заведомую ложь и одновременно в неё верить, забыть любой факт, ставший неудобным, и извлечь его из забвения, едва он опять понадобился, отрицать существование объективной действительности и учитывать действительность, которую отрицаешь, — всё это абсолютно необходимо. Даже пользуясь словом „двоемыслие“, необходимо прибегать к двоемыслию. Ибо, пользуясь этим словом, ты признаёшь, что мошенничаешь с действительностью; ещё один акт двоемыслия — и ты стёр это в памяти; и так до бесконечности, причём ложь всё время на шаг впереди истины. В конечном счёте именно благодаря двоемыслию партии удалось (и кто знает, ещё тысячи лет может удаваться) остановить ход истории.»

(часть вторая, IX: книга Голдстейна «Теория и практика олигархического коллективизма», глава 1)
Artificial Intelligence: A Modern Approach
(Third edition) by Stuart Russell and Peter Norvig

http://aima.cs.berkeley.edu/
http://rutracker.org/forum/viewtopic.php?t=3781667

Установка Gnome3 и как потом от него избавиться

Установил Убунту и после Арчи разнежился и перестал делать снапшоты перед установкой обновлений. А зря.

И тут такое... Нужен был на недолгое время Gnome3, т.к. в нем работает unity-режим VMWare. (такой вот каламбур).

Устанавливал Gnome3 по так:

sudo add-apt-repository ppa:gnome3-team/gnome3
sudo add-apt-repository ppa:gnome3-team/gnome3-next
sudo add-apt-repository ppa:gnome3-team/gnome3-staging
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install gnome-shell gnome-shell-extensions
sudo apt-get install gdm
sudo apt-get remove overlay-scrollbar


В общем, этот способ сработал. Гном встал.

Попробовал пользоваться - не получилось. Абсолютно не готов ни для чего. В том числе не готов для unity-режима VMWare, т.к. десктоп там рендерится как отдельное окно и соответственно перекрывает собой все остальные окна в Windows. (В KDE с этим всё в порядке).

Попрбовал переключиться в Юнити, а там страх и ужость, какие-то кривые градиенты, и самое главное - нету курсора мыши! Много гуглил, пытался вернуть курсор и приличный вид, ничего не помогло.

Начал удалять гном.

Вот как выглядит удаление Гнома:

sudo apt-get install ppa-purge
sudo ppa-purge ppa:gnome3-team/gnome3-next
sudo ppa-purge ppa:gnome3-team/gnome3-staging
sudo ppa-purge ppa:gnome3-team/gnome3
sudo apt-get remove gnome-shell gnome-shell-extensions ubuntu-gnome-desktop
sudo apt-get install overlay-scrollbar


Аптитуда предлагает офигительнейший список зависимостей, которые предлагается бросить, но там вроде все recommends и вообще ничего криминального на первый взгляд...

Ну и ппа gnome3-next оказывается что имеет файл Packages в 0 байт, от чего ppa-purge долго-долго тупит и вылетает с критической ошибкой «не могу получить список пакетов». И не удаляет его из списка репозиториев, не доходит до этого места. Пришлось удалять ручками.

Тут замечаю, что вся система (применительно к Убунту-Десктоп это Unity) куда-то исчезла вместе с удаленным Гномом. Даже ярлычка в lightdm не осталось. А lightdm сам остался и даже запускается ОК.

Пришлось установить Юнити заново:

sudo apt-get update
sudo apt-get install --reinstall ubuntu-desktop
sudo apt-get install unity
sudo dpkg-reconfigure lightdm


Зашлифовал контрольным в глаз:

sudo apt-get update
sudo apt-get dist-upgrade


Вопрос, что еще я забыл сделать чтобы всё стало нормально?

Самые острые симптомы типа "на экране каша" и "нету курсора" оно починило, но возможно стоит переустановить Убунту заново. Убунта сама не переустановится!

У мну сейчас острый параноидальный психоз, боюсь нажимать на кнопки, вижу кучу косяков интерфейса и всё боюсь что это из-за Гнома, хотя наверняка эти косяки были всегда, просто я их не замечал. Например, долго пытался понять, запущен unity3d или unity2d (выхлоп "/usr/lib/nux/unity_support_test -p" меня не убедил), пока не вспомнил что в 13.10 untiy2d искаропки и нет вообще.

Ну и в заключение, тот самый ролик.

[видео]
В VMWare в Untity(3d) не работает Unity Mode (такой вот каламбур)

Попробовал юзать Gnome3. Это же полный кошмар, трындец!

И из него нельзя сбежать — нет кнопки logout! Даже правка реестра и перезагрузка не помогает! ( gsettings set org.gnome.shell always‑show‑log‑out true)

Вот спасительная команда, читать в консоли: gnome‑session‑quit

Помогите придумать кошерный алгоритм поиска пути?

Помогите придумать кошерный алгоритм поиска пути?

Сначала уточнение, потом на примере, потом четкая форумлировка.

Уточнение.

Надо в первую очередь решить задачу, т.е. если есть уже готовые либы или языки программирования, которые искаропки решают задачу, и которые можно заюзать без особых накладных расходов из JavaVM или накрайняк C++ — было бы очень кстати. Литература по теме тоже бы пригодилась.

На примере.

Я пишу небольшой пакетный менеджер, который накатывает патчи. В данный момент система находится в состоянии A. Нужно узнать, возможно ли с помощью накатывания патчей (из готового набора) перевести ее в состояние B, и если да — то по какому именно пути.

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

Четкая формулировка.

Есть структура из следующих переменных START(x1...xn)

Есть набор патчей вида: Patch1(x1+10, x2–20), Patch2(x1*2, x2/2), Patch3(x1/x2, x3*x4). Т.е. каждый патч указывает, на сколько изменились исходные переменные, используя операции +,-,*,/.

Есть набор условий на конечное состояние: FINISH(x1=10, x2>=25), т.е. с помощью простых операций сравнения (=,!=,>,>=,<,<=) описывающих финальное состояние объекта.

Нужно определить, возможно ли из START получить состояние, удовлетоворяющее набору сравнений FINISH применением набора патчей. И какой будет этот набор — т.е. какие патчи, в какой последовательности. Один и тот же патч можно применять безграничное количество раз. В качестве ответа приоритет имеет самая короткая цепочка.

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

Например, здорово помогло бы поле‑ограничение типа Patch1(ADD_ONLY,x1+1,x2+1) указывающее что данный патч может только увеличивать значения исходного сосотяния. Если весь набор доступных патчей состоит из ADD_ONLY, то для него юзается гораздо более простой алгоритм.

===

Как‑то так. Есть идеи?

Yii2 1970

Забавные чуваки попросили сделать коммит в Yii2.

Пул‑риквест: https://github.com/yiisoft/yii2/pull/1970
По багу: https://github.com/yiisoft/yii2/issues/1350

Если коротко, то пока не существует AjaxSubmitButton, а человек хочет отправлять форму аяксом, обрабатывать post‑send хуки и прикладывать дополнительные данные. Я взял готовый .ajaxSubmit (http://jquery.malsup.com/form, там реально дочерта кода, с кучей грязных хаков для разных случаев) и вставил в механику обработки формы.

Проблема в том, что я увидел yii2 буквально вчера, и с вероятостью 99% мой коммит — полная чушь =)
Шерлок‑3 — хорошо
А в VMWare, оказывается, можно делать виртуальные COM‑порты.
Вывод будет через текстовый файл, named pipe или local socket.
В винде можно дебажить соединение через windbg.
https://www.vmware.com/support/ws3/doc/ws32_devices3.html

Люди едят кактус. Не шутка. Колятся, плачут, но едят.

Если тут есть юристы...

... или другие интересующиеся, зацените плз договор заказа на сайт:

https://drive.google.com/file/d/0B5LosTxtF4Kab1BodFlvaEY5aDg/edit?usp=sharing

Утреннее-обеденное

alt
Шерлок 0 — отлично
Шерлок 1 — хм
Шерлок 2 — хмм...

Плюсы: появление продолжения.
Неоднозначно: пародия на самих себя из 1–2 сезонов. Девочка из HouseMD очень бесит (возможно так и надо).
Минусы: сильная нереалистичность, отсутсвие цепляющего сквозного сюжета, обрывочность даже внутри эпизода, политота.
Установка веб‑сервера в убунту:

sudo tasksel install lamp‑server

sudo add‑apt‑repository ppa:ondrej/php5
sudo apt‑get update
sudo apt‑get install python‑software‑properties
sudo apt‑get install php5

B Всё Работает. Таааак непривычно.

Впрочем, его потом всё равно настраивать надо)