LINUX.ORG.RU

Сообщения pseudo-cat

 

Кто-нибудь читает статьи про IT на жд на английском?

Подскажите какую-нибудь статью в которой есть и айти и железные дороги. Хочу что-нибудь почитать не старше 2013 года. На самом деле в аспирантуре сказали что-нибудь им перевести. Может тут есть кто-нибудь кто читает такой направленности статьи?

 

pseudo-cat
()

Авторизация на каком-то сайте про линуксы

Подскажите, у кого-нибудь получается залогиниться программно на ЛОРе? Пытаюсь сделать уведомлялку себе на телефон, но на все попытки залогиниться получаю 403. Вот код на всякий случай(Android если это важно) -

final HttpsURLConnection cn = (HttpsURLConnection) new URL("https://www.linux.org.ru//login_process").openConnection();
cn.setRequestMethod("POST");
String charset = "UTF-8";
String query = "csrf=" + URLEncoder.encode("myMS4KQMs9rc40AXyaKG1w==", charset) + "&user=pseudo-cat" + "&passwd=areukidding";
cn.setRequestProperty("Accept-Charset", charset);
cn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
cn.setRequestProperty("Content-Length", "" + Integer.toString(query.getBytes().length));
cn.setRequestProperty("Content-Language", "en-US");
cn.setRequestProperty("USER-AGENT", "Mozilla/5.0");
OutputStream os = cn.getOutputStream();
byte[] bdata = query.getBytes(charset);
os.write(bdata);

cn.connect();
int responseCode= cn.getResponseCode();

Сейчас бы в 2017 когда у сайтов не было открытых API)

 , , ,

pseudo-cat
()

Почемучка. F# и области видимости.

Добрый день, кто подскажет что происходит с base, когда мы оборачиваем код в тело функции?

type A(a) = 
    let _value = (a + 2) / 3
    member x.value = _value

type B(a) = 
    inherit A(a)
    base.value * a // OK
    let _c =  |> (fun a -> base.value * a) // ERROR
    let rrr = base // ERROR
    member x.c = _c

 

pseudo-cat
()

Common Lisp CLOS подтипы в defmethod

Можно ли при объявлении defmethod указать, что у объекта должны быть наследованы несколько типов? По смыслу что-то типа -

(defmethod m ((o (and type1 type2))) ...)

 ,

pseudo-cat
()

SDL -> SDL2

Перевожу один свой проект на SDL2, раньше использовал SDL. Была такая логика - главное окно делилось на несколько зон, в каждой из которых рисовался свой surface. Приведу код:

  (loop with plot-n = 3 with plot-h = (round (/ height plot-n))
        for i from 0 below plot-n
        for name in (list
                     "Температура охлаждающей жидкости (°С)"
                     "Положение дроссельной заслонки (%)"
                     "Скорость вращения двигателя на холостом ходу (об/мин)")
        for s = (sdl:create-surface width plot-h) 
        do (progn
             (sdl:fill-surface sdl:*white* :surface s)
             (draw-plot name s)
             (sdl:draw-surface-at s
                                  (point :x 0 :y (* i (/ height plot-n)))
                                  :surface sdl:*default-surface*))))

В SDL2 всё по-другому и у меня не получается увязать вместе render и surface, да и, скорее всего, неправильный подход я пытаюсь использовать. Пробовал по-разному, к примеру так -

(let* ((s (sdl2:create-rgb-surface 100 100 1))
       (r (sdl2:create-software-renderer s)))
  (sdl2:set-render-draw-color r 0 0 255 255)
  (sdl2:render-draw-line r 0 0 100 100)
  (sdl2:render-copy render (sdl2:create-texture-from-surface r s)
                    :source-rect (make-rect 0 0 100 100)
                    :dest-rect (make-rect 10 10 110 110)))

Доки почитал, но что-то не разобрался. Спасибо.

РЕШЕНИЕ:

(defun start-plot ()
  (sdl2:make-this-thread-main
   (lambda ()
     (sdl2:with-init (:everything)
       (sdl2:with-window (win :title "prostolog" :w *width* :h *height*)
         (sdl2:with-renderer (render win)
           (sdl2:with-gl-context (gl-context win)
             (init-scene)
             (sdl2:with-event-loop (:method :poll)
               (:keyup
                (:keysym keysym)
                (when
                    (sdl2:scancode= (sdl2:scancode-value keysym) :scancode-escape)
                  (sdl2:push-event :quit)))
               (:idle
                ()
                (let ((foreground-textures '()))
                  
                  (dotimes (i 30)

                    ;; texture
                    (let ((texture
                            (sdl2:create-texture render 373694468 :target 100 50)))
                      ;; clear texture background
                      (sdl2:set-render-target render texture)
                      (sdl2:set-render-draw-color render 200 200 200 255)
                      (sdl2:render-clear render)
                      ;; drawing at texture
                      (sdl2:set-render-draw-color render 0 0 0 255)
                      (sdl2:render-draw-line render 0 0 100 50)
                      (sdl2:render-draw-line render 100 0 0 50)
                      ;; return render 
                      (sdl2:set-render-target render nil)
                      (push texture foreground-textures))

                    ;; anouther texture
                    (let ((texture
                            (sdl2:create-texture render 373694468 :target 200 30)))
                      ;; clear texture background
                      (sdl2:set-render-target render texture)
                      (sdl2:set-render-draw-color render 100 100 100 255)
                      (sdl2:render-clear render)
                      
                      ;; drawing at texture
                      (sdl2:set-render-draw-color render 255 0 0 255)
                      (sdl2:render-draw-line render 0 0 200 30)
                      (sdl2:render-draw-line render 0 30 200 0)
                      
                      ;; return render 
                      (sdl2:set-render-target render nil)
                      (push texture foreground-textures)))

                  ;; draw window background graphics
                  (sdl2:set-render-draw-color render 255 255 255 255)
                  (sdl2:render-clear render)
                  (sdl2:set-render-draw-color render 255 0 0 255)
                  (sdl2:render-draw-line render 0 0 *width* *height*)
                  (sdl2:set-render-draw-color render 0 0 255 50)
                  (sdl2:render-draw-line render *width* 0 0 *height*)
                  
                  ;; draw textures at window surface
                  (loop for ft in foreground-textures
                        for w = (texture-width ft) for h = (texture-height ft)
                        with offset = 0
                        while (< (+ offset h) *height*)
                        do
                           (progn
                             (sdl2:render-copy
                              render ft
                              :dest-rect (sdl2:make-rect
                                          (- (/ *width* 2) (/ w 2))
                                          offset w h))
                             (incf offset h))))

                ;; present all stuff at window surface
                (sdl2:render-present render))
                
               (:quit () t)))))))))

 ,

pseudo-cat
()

F# hash structured data

На поиск бага, вызванного фичей ниже, я потратил целый день, а теперь, пожалуйста, просто объясните мне эту магию:

> hash (1.0, 2.0);;
val it : int = 2112880640
> hash (2.0, 1.0);;
val it : int = 2146435072
> hash (1.0, 0.0);;
val it : int = 1039138816
> hash (0.0, 1.0);;
val it : int = 1072693248
> hash (2.0, 0.0);;
val it : int = 1073741824
> hash (0.0, 2.0);;
val it : int = 1073741824

 

pseudo-cat
()

F# проверка списка на оригинальность и т.п. без хэшей

Добрый день. Я опять возвращаюсь к вопросу, которой уже поднимал около 3х лет назад. Оптимизация поиска _наличия_ общего элемента 2х списков. Это опять оказалось слабым местом в производительности моей программы.

let original eq l =
    l 
    |> List.fold 
        (fun acc el ->
            if (acc |> List.exists (fun elLater -> eq el elLater))
            then acc else el :: acc)
        []
    |> List.rev

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

let original (eq : 'a -> 'a -> bool when 'a : equality) l =
    let hs = new HashSet<'a>(l, Comparer<'a>(eq))
    hs.ToList().AsEnumerable() |> Seq.toList     

Производительность разумеется выросла, но программа стала работать неправильно. Учитывая, что я поменял только код этой функции, я написал на неё несколько тестов и они все отработали верно, но программа целиком работала не правильно. Причина этого кроется в реализации Comparer:

type Comparer<'a>(f) =
    interface System.Collections.Generic.IEqualityComparer<'a> with
        member x.Equals(a, b) =
            f a b
        member x.GetHashCode(a) = hash(a.ToString())
метод .ToString() у многих объектов просто не переопределён и возвращает имя класса. То есть такая реализация путь к множеству ошибок логики. Она, как мне кажется, куда опаснее ошибок типов, так как программа не падает, а просто работает неправильно. Я понимаю, что можно сделать специальный интерфейс и требовать его реализации у всех типов объектов, вызываемых в качестве аргументов. Или заставлять их явно реализовывать IEqualityComparer. Но так теряется выразительность вызова функции List.original и подобных. По сути приходится или частично разделять логику сравнения или полностью переносить её в реализацию типа(и отказаться от сравнения составных данных, к примеру 'a * 'a). Теперь вопрос, как получить производительность аналогичную хэш талбицам, не используя хэш функцию. Или это просто невозможно? В языках, дающих явный доступ к ссылке на объект можно воспользоваться таким сравнением, считая объекты не изменяемыми во время вызова функции. В языках, имеющих функцию сравнения объектов по расположению в памяти, такое тоже можно реализовать довольно просто как мне кажется, но логика немного изменится.

 

pseudo-cat
()

Очередь и обработка

Подскажите, как в функциональных ЯП описывается следующая схема:

for e in seq 
    do if(test(e)) then seq.addInRest(next(e))
вопрос возник когда я увидел, что в F# нельзя добавлять элементы в итерируемую коллекцию. Да, конечно, можно реализовать это привычными итераторами на объектах, но почему-то вспомнились монады и прочая ересь, которую мне пытались объяснять пьяные функциональщики на салфетке и вроде как идея очень похожа на их описание. Может кто-нибудь прояснить как это называется и реализуется на практике в ФП? Спасибо.

В частности интересует F#, именно с ним единственным я знаком.

 

pseudo-cat
()

Генератор на функциях в F#

Можно ли сделать чтобы функция возвращала результат и функцию, которая возвращает следующий результат и функцию, которая ... ммм? спасибо.

Примерчик.

        let clos = ref [1]        
        let rec continuation () =
            match !clos with
            | [] -> None
            | _ ->                
                if worldChanged then clos := [] 
                Some(!clos, continuation)

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

 

pseudo-cat
()

Вопрос разработчикам всякого физического про книгу.

Кто-нибудь читал - http://mitpress.mit.edu/books/structure-and-interpretation-classical-mechanics-2 ? Какой уровень сложности? Понятно для обычного программиста с неглубоким знанием описываемых там вещей?

п.с. пожалуйста, не перемещайте в толкс, мне интересно мнение девелоперов, поэтому написал в этот раздел, спасибо.

 , ,

pseudo-cat
()

Посоветуйте алгоритм кластеризации.

Основное требование - заранее не известно количество кластеров. Входные данные - одномерный список целых чисел. Вот пример входных данных - (5 1 3 5 7 3 50 30 45 32 1000 800 300 10000 8000) Желаемый результат(| - разделитель кластеров) - (5 1 3 5 7 3 | 50 30 45 32 | 1000 800 | 300 | 10000 8000). Простота, в плане понимания и реализации, приветствуется. Основная сложность, как мне кажется, в том, что есть большая разница в сосредоточенности точек различных(желаемых) кластерах. Спасибо.

 ,

pseudo-cat
()

Кривые Безье по точкам

Добрый день, пытаюсь понять аппроксимацию набора точек на плоскости кривыми Безье. Нашёл вот такую тему - Кривые Безье - математический ликбез., где человек предлагает использовать первые производные для нахождения прямых, на которых лежат задающие точки P2 и P3 кубической кривой, т.к. геометрический смысл первых производных - касательные к кривой в точках P1 и P4. Дальше он спрашивает как найти найти расстояние, на котором лежат точки P1 и P2. Ему говорят про вторые производные и он понимает, а я нет. Вот отрывок -

B(t) = (1-t)^3 P1 + 3t(1-t)^2 P2 + 3t^2(1-t) P3 + t^3 P4.

B'(0) = -3 P1 + 3 P2 — это производная на одном конце, то же на другом конце. Остаются два свободных параметра.

Можешь их подогнать так чтобы например вторые производные на концах тоже совпадали с твоим гребаным графиком:

B"(0) = 6 P1 - 12 P2 + 6 P3 B"(1) = 6 P4 - 12 P3 + 6 P2

эти два вектора значит должны быть параллельны (1, f"(x) и (1, f"(x[i+1])) соответственно.

Помогите понять что имел в виду анонимус в том сообщении, используя вторые производные?

 ,

pseudo-cat
()

опрос. результаты распознования

(("V(1)->V(5), used fragments: (1 2 3 4), recognized: М(0.7058823)")
 ("V(1)->V(3), used fragments: (1 2), recognized: h(0.77272725)"
  "V(3)->V(5), used fragments: (3 4), recognized: Л(0.7083334)")
 ("V(1)->V(3), used fragments: (1 2), recognized: h(0.77272725)"
  "V(3)->V(4), used fragments: (3), recognized: f(0.7692308)"
  "V(4)->V(5), used fragments: (4), recognized: J(0.7692308)")
 ("V(1)->V(2), used fragments: (1), recognized: t(1.0)"))

Выше приведены результаты распознавания области содержащей несколько символов или один символ. В этой области содержится 4 фрагмента(они могли сами по себе быть разделены или с помощью алгоритма сегментации). Каждый подсписок (...) содержит ветви графа перехода, участвующие в распознавании, каждая ветвь содержит объединение фрагментов области и результат их распознавания. Если в списке несколько ветвей, то это означает последовательность распознанных символов. К примеру, 2ой список - «hЛ». Всего в области 4 фрагмента. Они соответствуют по индексам вершинам графа. Кроме 5ой, которая является вершиной конца строки.

Какому результату вы больше верите и почему?

 ,

pseudo-cat
()

Баг?

Весь код нет смысла приводить, но суть в том, что с такой функцией работает нормально -

(defun rgraph-edges (graph)
  (iter (for v in (rgraph-verticles graph))
    (appending (rgraph-v-out v))))
а с такой

(defun rgraph-edges (graph)
  (let ((vs (rgraph-verticles graph)))
    (mapcan (lambda (v) (rgraph-v-out v)) vs)))

висит, не выводя ничего в *standard-output* или точнее выводя, потому что при принудительном «Interrupt from Emacs» вывод печатается, но пока висит ничего не печатается. Причём вывод в *standard-output* производится до вызова этой функции. Не знаю как там устроена печать, но по ощущениям что-то типа flush делается только при выбрасывание ошибки. Всё это происходит при 2х вызовах rgraph-edges. То есть, если в коде rgraph-edges вызывается 1 раз, то всё нормально и печатается и работает. Если вызвать rgraph-edges 2 раза, то происходит то, что описано выше.

 , ,

pseudo-cat
()

Сравнение кривых Безье

У меня есть кривые Безье. Только 2 и 3 порядка. Надо их как-то сравнивать. Заданны они всегда опорными точками. Думаю квадратичные приводить к кубическим и дальше сравнивать через область, описанную опорными точками. Это что-то типо проверки на bounding box. Если проверка прошла, то искать промежуточные точки одной кривой и искать ближайшие промежуточные другой. Разницу считать той самой «степенью похожести».

Мб кто-то может что-то дельное посоветовать? Пока занимаюсь другими тасками, решил пообсуждать эту тут)

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

 , , , ,

pseudo-cat
()

Почему скобки удобны

Пишу вот я код на F# и приходится мне помнить порядок вычисления, когда он не важен мне совершенно, поэтому беру я и указываю явно, чтобы другие не утруждались, кто код мой будет потом читать, смотрю, а получается как на лиспе. Вот пример, когда скобки удобнее, помнить надо меньше.

        (stage1 
            @ (free |> List.map (fun l -> l, [l]))) //причинное место
        |> List.groupBy 
            (fun (mline1, lines1) (mline2, lines2) ->
                Math.Abs(mline1.x-mline2.x) < 0.1 
                && Math.Abs(mline1.y-mline2.y) < 0.1)
       (List.groupBy 
	(lambda (mline1 lines1 mline2 lines2)
	  (and (< (Math.Abs (- mline1.x mline2.x) 0.1))
	       (< (Math.Abs (- mline1.y mline2.y) 0.1))))
	(@ stage1 
	   (List.map (lambda (l) (list l (list l))) 
		     free)))))

 , ,

pseudo-cat
()

OCR, один странный алгоритм

Наткнулся я как-то на один алгоритм, вот статья - An expert system for general symbol recognition. Зацепило что идея простая и, казалось бы, рабочая. Вот простой пример работы - имеем уже подверженный максимальному утончению символу, где 1-чёрный пиксель, 0-белый(фон) -

100000001
100000010
010000100
001000100
000101000
000010000
разбиваем его на m x n зон -
100|000|001
100|000|010
010|000|100
---|---|---
001|000|100
000|101|000
000|010|000
для наглядности точки вместо нулей -

1..|...|..1
1..|...|.1.
.1.|...|1..
---|---|---
..1|...|1..
...|1.1|...
...|.1.|...
и аппроксимируем последовательность единиц в каждой зоне в прямые линии -
\..|...|../
.\.|...|./.
..\|...|/..
---|---|---
...|...|...
...|___|...
...|...|...
Получилось 3 линии в 3 зонах. Пусть это шаблон. Если на входе будет похожий символ, в котором несколько пикселей будут отличаться, то он, возможно, аппроксимируется в идентичный шаблон и распознается на 100%. На примерах линии строятся максимум из 3 пикселей, что не даёт должной аппроксимации, но на реальных примерах количество пикселей больше и там это работает, по идее.

Но не очень понятно что делать с граничными пикселями и возможным сдвигом символов по зонам. К примеру -


001|000|100
000|101|000
001|010|000
-----------
000|100|000
001|011|000
001|000|100

..1|...|1..
...|1.1|...
..1|.1.|...
-----------
...|1..|...
..1|.11|...
..1|...|1..

...|...|...
...|___|...
...|...|...
-----------
..I|\..|...
..I|.\.|...
..I|..\|...
видно что в верхней левой зоне пикселей недостаточно чтобы аппроксимировать их в прямую линию, т.к. один лежит в другой зоне. Пример игрушечный, но на реальных входных данных пиксели могут быть серьёзно разбросаны по зонам и определить их в какую-то конкретную становится сложно. Таким образом теряется часть информации и шаблон становится не рабочим или ошибочным.

Сверка с шаблоном происходит позонно. Для большей точности в статье предлагается разбивать символ на большее количество зон, но тогда два похожих символа, отличающихся сдвигом на 1 пиксель вправо, к примеру, могут попасть в разные зоны и шаблоны будут совершенно не похожи. Вся аппроксимация коту под хвост.

Меня подкупила простота этого алгоритма и мне интересно, насколько он реально работает, как решаются описанные проблемы, применялся ли он где-нибудь реально и может кто-то слышал о нём? Я написал его реализацию и получил довольно плачевные результаты, распознаётся примерно 70% верно и 10% с ошибкой, примерно, на игрушечных примерах.

 

pseudo-cat
()

простые вопросы про работу с сетью

Ситуация такая - есть сервер с очень большой базой. Максимально даёт сделать несколько сотен запросов в день, после чего банит по ip на месяц. Что бы стянуть всю базу необходимо сделать сотни тысяч запросов + сервер ежедневно пополняется на те самые несколько сотен запросов. Какие есть варианты?

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

ппс пишу в этот раздел, так как решение нужно в виде кода.

 

pseudo-cat
()

Символы

Интересненькое прошло и наступило время создавать набор для обучения. Дальше оттягивать уже некуда, теперь всё упирается в этот чертов набор) Вопрос следующий - неужели нет какой-нибудь открытой базы и каждый разраб составляет базу сам? Если есть хотя бы для английских символов, то это уже сильно упростит работу, желательно конечно для русских ещё.

 ,

pseudo-cat
()

Распознование символов

Кто в теме, подскажите, какие алгоритмы стоит посмотреть для выделения символа из слова и слова из изображения. С учетом того, что символы могут иметь разную высоту/ширину, быть расположены чуть ниже/выше друг друга, слово может иметь форму дуги.

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

 

pseudo-cat
()

RSS подписка на новые темы