Классический интерфейс в веб-приложении
Есть ли какая нибудь легкая библиотека с готовыми виджетами, что бы были menu bar'ы, контекстные меню, treeview, split pane, и все другие привычные вещи? Желательно что бы была под это компактная тема.
Есть ли какая нибудь легкая библиотека с готовыми виджетами, что бы были menu bar'ы, контекстные меню, treeview, split pane, и все другие привычные вещи? Желательно что бы была под это компактная тема.
Краткая памятка тем, кому понадобится openssl с ГОСТом на CentOS 6 (мне он понадобился для выгрузки реестра). Т. к. нужда узкая и специфичная, заменять системный не стал, на быстрогугленых советах была описана конфигурация для 1.0.1c, на которой openssl ныл «GOST engine already loaded» и т. д. Итак, скачиваем http://www.openssl.org/source/openssl-1.0.1f.tar.gz и распаковываем. Ставится он, в принципе, куда угодно, я решил его запихать в /usr/local/openssl-1.0.1f, поэтому <PREFIX> везде заменяем на реальный:
cd openssl-1.0.1f
./config shared zlib enable-rfc3779 --prefix=<PREFIX>
make depend
make
make install
openssl_conf = openssl_def
[openssl_def]
engines = engine_section
[engine_section]
gost = gost_section
[gost_section]
soft_load=1
default_algorithms = ALL
В общем, всё, теперь всё подписывается.
Кому-то эти нюансы, вероятно известны, а кому-то будут интересны. Коротко: помните о существовании Set, each_value, find. - производительность от этого может вырасти в разы. Так же, удобная штука - использование скобок в параметрах блоков.
require 'set'
a = []
s = Set.new
h = {}
n = 10000
Benchmark.bm(3) do |b|
puts 'add'
b.report("array:"){ 200.times{|i| a << i } }
b.report("set :"){ 200.times{|i| s << i } }
b.report("hash :"){ 200.times{|i| h[:"#{i}"] = i } }
puts 'include?'
b.report("array:"){ 200.times{|i| a.include? i } }
b.report("set :"){ 200.times{|i| s.include? i } }
puts 'inject'
b.report("array:"){ n.times{|i| a.inject(0){|s, v| s + v } } }
b.report("set :"){ n.times{|i| s.inject(0){|s, v| s + v } } }
b.report("hash :"){ n.times{|i| h.inject(0){|s, ( k, v )| s + v } } }
b.report("hash :"){ n.times{|i| h.each_value.inject(0){|s, v| s + v } } }
b.report("hash :"){ n.times{|i| h.inject(0){|s, v| s + v.last } } }
puts 'find'
b.report("array:"){ n.times{|i| a.find{|el| el == 150 } } }
b.report("set :"){ n.times{|i| s.find{|el| el == 150 } } }
b.report("hash :"){ n.times{|i| h[:"150"] } }
puts 'each'
b.report("array:"){ n.times{|i| a.each &:to_s } }
b.report("set :"){ n.times{|i| s.each &:to_s } }
b.report("hash :"){ n.times{|i| h.each_value &:to_s } }
b.report("hash :"){ n.times{|i| h.each{|k,v| v.to_s } } }
puts 'map'
b.report("array:"){ n.times{|i| a.map &:to_s } }
b.report("set :"){ n.times{|i| s.map &:to_s } }
b.report("hash :"){ n.times{|i| h.each_value.map &:to_s } }
b.report("hash :"){ n.times{|i| h.map{|k,v| v.to_s } } }
end
результат на mri
user system total real add array: 0.000000 0.000000 0.000000 ( 0.000043) set : 0.000000 0.000000 0.000000 ( 0.000103) hash : 0.000000 0.000000 0.000000 ( 0.000344) include? array: 0.000000 0.000000 0.000000 ( 0.000877) set : 0.000000 0.000000 0.000000 ( 0.000060) inject array: 0.230000 0.000000 0.230000 ( 0.226024) set : 0.290000 0.010000 0.300000 ( 0.298473) hash : 0.490000 0.000000 0.490000 ( 0.487521) hash : 0.270000 0.000000 0.270000 ( 0.287539) hash : 0.490000 0.000000 0.490000 ( 0.497619) find array: 0.140000 0.000000 0.140000 ( 0.142135) set : 0.200000 0.000000 0.200000 ( 0.198234) hash : 0.000000 0.000000 0.000000 ( 0.000974) each array: 0.380000 0.000000 0.380000 ( 0.384158) set : 0.460000 0.000000 0.460000 ( 0.453658) hash : 0.450000 0.010000 0.460000 ( 0.457729) hash : 0.670000 0.000000 0.670000 ( 0.672617) map array: 0.430000 0.000000 0.430000 ( 0.430366) set : 0.570000 0.000000 0.570000 ( 0.572334) hash : 0.550000 0.000000 0.550000 ( 0.558118) hash : 0.800000 0.010000 0.810000 ( 0.796961)
(cлайды)
Общая ссылка: видео-файлы и торренты
>>> Подробности
Magic Lantern — альтернативная прошивка для зеркальных фотокамер Canon. Первоначально разрабатываемая для получения большего контроля над процессом съёмки видео, сегодня она содержит ряд возможностей, интересных и фотографам.
Новая версия несёт массу улучшений в функционале и стабильности. По словам разработчиков, проект вырос из категории «хака» и теперь может считаться полноценным профессиональным инструментом. Основные изменения (и отличия от стандартной Canon'овской прошивки):
Поддерживаются следующие модели камер: 5Dmk2, 50D, 60D, 500D, 550D, 600D. Ведётся работа по портированию на 5D Mark III и 650D.
В процессе подготовки версии 2.3 разработчики применили несколько необычный подход к распространению своего продукта: финальная версия является бесплатной, в то время как доступ к релиз-кандидатам и финальной версии в течение первых трёх недель после релиза предоставляется только спонсорам, сделавшим пожертвование. Доступ к новой версии для всех желающих будет открыт 13 августа. Исходный код распространяется на условиях GPLv3.
Видеообзор от Clint из Everything Studios
>>> Подробности