Разработка Compojure без перезапусков веб-сервера

Наиболее распространенная рекомендация состоит в том, чтобы сохранить DateTime. UtcNow и, когда Вы хотите показать локализованное время пользователю, преобразовывают в местное время, составляя переход на летнее время.

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

36
задан auramo 3 November 2009 в 08:40
поделиться

4 ответа

У меня есть сценарий оболочки, который выглядит так:

#!/bin/sh                                                                                                                                   
CLASSPATH=/home/me/install/compojure/compojure.jar
CLASSPATH=$CLASSPATH:/home/me/clojure/clojure.jar
CLASSPATH=$CLASSPATH:/home/me/clojure-contrib/clojure-contrib.jar
CLASSPATH=$CLASSPATH:/home/me/elisp/clojure/swank-clojure

for f in /home/me/install/compojure/deps/*.jar; do
    CLASSPATH=$CLASSPATH:$f
done

java -server -cp $CLASSPATH clojure.lang.Repl /home/me/code/web/web.clj

web.clj выглядит так

(use '[swank.swank])                                                                                                                        
(swank.swank/ignore-protocol-version "2009-03-09")                                                                                          
(start-server ".slime-socket" :port 4005 :encoding "utf-8")

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

Enclojure и Emacs (выполняющие SLIME + swank-clojure) могут подключаться к удаленному REPL.

4
ответ дан 27 November 2019 в 05:31
поделиться

Вот ответ, который я получил от Джеймса Ривза из группы Compojure Google (ответ здесь с его разрешения):

Вы можете перезагрузить пространство имен в Clojure, используя : перезагрузить ключ при использовании или требовать команд. Например, предположим, что у вас есть файл «demo.clj», содержащий ваши маршруты:

(ns demo 
  (:use compojure))

(defroutes demo-routes 
  (GET "/" 
    "Hello World") 
  (ANY "*" 
    [404 "Page not found"])) 

В REPL вы можете использовать этот файл и запустить сервер:

user=> (use 'demo) 
nil 
user=> (use 'compojure) 
nil 
user=> (run-server {:port 8080} "/*" (servlet demo-routes)) 
... 

Вы также можете поместить команду run-server в другой clojure файл. Однако вы не хотите помещать его в тот же файл, что и материал, который вы хотите перезагрузить.

Теперь внесите некоторые изменения в demo.clj. В типе REPL:

user=> (use 'demo :reload) 
nil 

И ваши изменения теперь должны отображаться на http: // localhost: 8080

22
ответ дан 27 November 2019 в 05:31
поделиться

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

  1. Поместите compojure.jar и jar-файлы в каталог compojure / deps в ваш путь к классам. Для этого я использую clojure-contrib / launchers / bash / clj-env-dir, все, что вам нужно сделать, это установить каталог в CLOJURE_EXT, и он найдет банки. CLOJURE_EXT Разделенный двоеточиями список путей к каталогам, чей верхний уровень содержимое (напрямую или в виде символических ссылок) jar файлы и / или каталоги, пути к которым будут в Clojure classpath.

  2. Запустить clojure REPL

  3. Вставить пример hello.clj из корневого каталога compojure

  4. Проверить localhost: 8080

  5. Повторно определить средство приветствия (отключает встречу (ПОЛУЧИТЬ "/" (html [: h1 "Goodbye World"])))

  6. Проверьте localhost: 8080

Существуют также методы для присоединения REPL к существующему процессу, или вы можете оставить REPL сокета встроенным в ваш сервер, или вы можете даже определите вызов POST, который будет оценивать на лету, чтобы вы могли переопределять функции из самого браузера! Есть много способов подойти к этому.

3
ответ дан 27 November 2019 в 05:31
поделиться

Если положение всех нижестоящих элементов статически предварительно вычисляется таким образом, то массив по существу представляет полностью полное, полностью сбалансированное двоичное дерево.

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

  • Если двоичное дерево, связанное с массивом, в основном пусто, большая часть пространства массива тратится впустую.

  • Если только некоторые ветви дерева достаточно глубоко, чтобы достичь «дна» массива, также много места тратится впустую.

  • Если дерево (или только одна ветвь) должно расти «глубже», чем позволяет размер массива, это потребует «роста» массива, который обычно реализуется как копирование в больший массив. Это дорогостоящая операция.

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

-121--3266133-

Я не знаю, что загрузчик, но я думаю, что вы должны использовать objcopy, как это, чтобы выгрузить ваши исполняемые данные в необработанный двоичный файл. Не переходите к заголовкам ELF, люди:)

objcopy -O binary ./a.out o.bin

Также попробуйте скомпилировать независимый код позиции и прочитать руководства ld и gcc.

-121--3665419-

После ссылки Тимоти на установку Джима Даунинга я недавно опубликовал критическое дополнение к тому базовому уровню, который, по моему мнению, был необходим для автоматического перераспределения приложений compojure во время разработки .

5
ответ дан 27 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: