четверг, 12 февраля 2015 г.

Emacs модуль для поиска лог-сообщения в исходном коде

Для анализа лога приходилось делать много движений в emacs при использовании функционала grep-find, чтобы определить участок кода, в котором происходит информационный вывод. Поэтому для ускорения поиска сделал небольшой модуль, позволяющий реализовать данный алгоритм поиска. Сам модуль можно найти на github .
    
Пока реализован следующий функционал:

  • Установка пути к исходному коду для поиска
  • Поиск по выделенной фразе или целой строке
Для данного модуля собираюсь добавить возможность поиска по файлам с определенным расширением, возможность быстрого удаления из лога ненужных "мусорных" повторений.

среда, 8 октября 2014 г.

uname в песочнице(sandbox)

Основная система у меня x86_64, а песочница 32 битная. Команда uname в ней возвращает значение x86_64. Некоторые конфигурационные скрипты завязаны на вывод этой команды, отсюда происходит ошибка при их исполнении. Как оказалось эту проблему может решить linux32(или setarch):

linux32 chroot /path


четверг, 16 января 2014 г.

Webclojure и android браузеры

При тестирования webclojure на различных браузерах платформы android, UI данного приложения лучше всего отображается в браузере Firefox, на втором месте Opera и хуже всего в Chrome. Основная проблема это маштабирование элементов при включении виртуальной клавиатуры. Вид приложения:
При использовании виртуальной клавиатуры:
Пока основное направление работы в этом проекте - добавление автоподсказок при написании кода, так как использование виртуальной клавиатуры не очень удобно, а так же работа с историей ввода команд в REPL.

понедельник, 23 сентября 2013 г.

Использование JNA в Clojure.

Разберем использование Java Native Access на простом примере в Clojure. Для начала необходимо скачать jna.jar с github.com и добавить в новый проект clojure, созданный через утилиту lein:

(defproject jna "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]]
  :plugins [[lein-swank "1.4.5"]]
  :resource-paths ["resources/jna-4.0.0.jar"])
После чего необходимо добавить импорт в ns:

(ns jna.core
  (:import (com.sun.jna Library Function)))
Следующий шаг это создание нативной библиотеки:

#ifndef FOO_H
#define FOO_H

extern int foo(int a, int b);

#endif

#include "foo.h"

int foo(int a, int b)
{
     return a + b;
}

gcc -c -Wall -Werror -fpic foo.c
gcc -shared -o libfoo.so foo.o
Один из вариантов вызова нативных функций это использование интерфейса:

(def foo-interface (gen-interface
                    :name foo-test
                    :extends [com.sun.jna.Library]
                    :methods [[foo [Integer Integer] Integer]]))
Второй этап этой процедуры это загрузка самой библиотеки:

(def native-lib (Native/loadLibrary "clib/libfoo.so" foo-interface))
И последний этап это определение самой функции:

(defn native-foo [a b]
  (.foo native-lib (Integer. a) (Integer. b)))
Преобразование входных переменных к типу Integer необходимо из-за того, что при вызове функции с целыми числами они являются типом Long. Еще одним вариантом вызова нативных функций - это использование класса Function. На просторах интернета я нашел достаточно интересный макрос:

(defmacro jna-call [lib func ret & args]
  `(let [library#  (name ~lib)
         function# (Function/getFunction library# ~func)]
          (.invoke function# ~ret (to-array [~@args]))))
Но опять же необходимо не забывать, что при передаче простых чисел они имеют тип Long.

Подключение локальных библиотек в Clojure

В качестве одного из вариантов подключения своих локальных jar-файлов в проект является использование опции resource-paths в project.clj . Таким образом файл проекта, сгенерированный утилитой lein, примет вид:

(defproject test-project "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]]
  :plugins [[lein-swank "1.4.5"]]
  :resource-paths ["path-to-resource"])
Причем можно указывать как отдельные файлы, так и полностью всю директорию, если использовать wildcards: :resource-paths ["path-to-resource1/example.jar" "path-to-resource2/*"] .

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

Модуль для работы с конфиг-файлом в clojure с помощью Properties

В Clojure 1.5 появилась возможность работы с конфигами в формате edn(extensible data notation), но я пока использую версию 1.4, поэтому для себя сделал модуль с использованием класса Properties. Модуль имеет вид:

(ns somens
  (:use [clojure.java.io])
  (:import (java.util Properties)
            (java.io  FileOutputStream FileInputStream)))

(defn load-properties [config-file]
  (with-open [f (java.io.FileInputStream. (file config-file))]
    (doto (Properties.)
      (.load f))))

(defn save-properties [#^Properties properties #^String config-file]
     (with-open [#^FileOutputStream f (FileOutputStream. (file config-file))]
       (.store properties f nil)))

(defn get-property [properties name]
  (.getProperty properties name ))

(defn set-property [properties name value]
  (.setProperty properties name (str value)))
Пример использования: конфигурационный файл имеет вид:

$cat conf.prop 
a=20
b="test"
Считаем данный файл и выведем параметры:

user> (def conf (load-properties "/home/home/conf.prop"))
#'user/conf                                                                                                                                
user> (get-property conf "a")
"20"                                                                                                                                                          
user> (get-property conf "b")
"test"
А теперь изменим параметры и сохраним:

user> (let [conf (load-properties "/home/home/conf.prop")]                                                                              
                              (set-property conf "a" "200")                                                                                                   
                              (set-property conf "b" "600")                                                                                                   
                              (save-properties conf "/home/home/conf.prop"))
nil       

$cat conf.prop 
#Mon Jun 23 11:18:25 UTC 2013
b=600
a=200
       

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

Исходники WebClojure

Появилось время продолжить заниматься веб-редактором для clojure и я выложил исходники прототипа на BitBucket.org. Большая часть кода написана на JavaScript и так как до этого я на нем не писал, то здравая критика приветствуется. Конечно можно было попробовать ClojureScript, но я решил изначально использовать JavaScript. В ближайшее время хотелось исправить возможность сохранять файл по любому пути, а так же неудобство прокрутки textarea.