ivan.afonichev's blog

By ivan.afonichev, 15 years ago, In Russian

В 2009ом году в СГСЭУ(Саратовский Социально-Экономический Университет) произошла ротация кадров вследствие чего проведение там Saratov Software Freedom Day более не представлялось возможным.

Эстафету проведения SFD в Саратове подхватил СГУ.
Организаторами от СГУ были восновном люди с техническим уклоном и потому в этом году Saratov SFD получился существенно более технически продвинутым чем ранее.
Для организации SFD 2009 в СГУ было разработано несколько программных продуктов (вплоть до драйверов под Linux!)
При организации Saratov SFD 2009 был учтен опыт предыдущих лет.
Был открыт специальный сайт посвещенный данному мероприятию 

sfd.sgu.ru

Сайт на самом деле является проектом в свободной системе управления проектам Redmine http://cc.sgu.ru/redmine применяющейся в Вычислительном Центре СГУ http://cc.sgu.ru/ . 
Redmine написан на Ruby on Rails и на данный момент считается лучшим Open Source Багтрекером/Системой управления проектами.
Сделать SFD проектом в ВЦшной системе управления проектами(а не например поднимать отдельный инстанс того же Redmine) было решено чтобы:
  • облагородить ВЦшный редмайн для людей со стороны (SFD стал "лучом света в темном царстве"  на данный момент единственным общедоступным/Open Source проектом  ВЦ)
  • привлечь внимание потенциальных новых кадров к ВЦ
  • подчеркнуть принадлежность ВЦ к организации данного мероприятия
Вследствие этого организаторы столкнулись c рядом проблем:
  • Redmine из коробки не поддерживает различные стили для разных проектов
  • в Redmine есть много полей которые не нужны рядовому докладчику при добавлении заявки на участие(статус,приоритет,назначена и т.д.)
  • Redmine не поддерживает использование javascript в темах (фактически тема - это одна CSS)
Эти проблемы были решены разработкой плагина к redmine (никакого изменения исходников Redmine)
В дальнейшем планируется его отрефакторить (разделить на отдельные плагины по функциям) и выложить в opensource. Приведу тут только некоторые куски кода:

Добавление CSS, убирающую ненужные поля для неучасников проекта, и добавление JS:

 1   def view_layouts_base_html_head(context = { })
 2     ret=''
 3     project = context[:project]
 4     baseurl = url_for(:controller => 'wiki', :action => 'index', :id => project) + '/../../..'
 5     if not project.nil?
 6       if not User.current.member_of?(project)
 7         if File.exists?("#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css")
 8           ret+= stylesheet_link_tag(baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css")
 9         end
10       end
11       if File.exists?("#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js")
12         ret+=javascript_include_tag(baseurl + "/themes/#{project.identifier}/js/project.js")
13       end
14 
15     end
16     return ret
17   end

Подмена функций самого redmine из плагина (per-project themes):


 1 module CSSPatch
 2   def self.included(base) # :nodoc:
 3     base.send(:include, InstanceMethods)
 4 
 5     base.class_eval do
 6       alias_method_chain :path_to_stylesheet, :perproject
 7     end
 8   end
 9 
10   module InstanceMethods
11 
12     def path_to_stylesheet_with_perproject(source)
13 
14       th = String.new(Setting.ui_theme)
15       if not @project.nil?
16         projecttheme = "#{RAILS_ROOT}/public/themes/#{@project.identifier}" 
17         if File.exists?(projecttheme)
18           th = @project.identifier
19         end
20       end
21       @current_theme ||= Redmine::Themes.theme(th)
22       stylesheet_path((@current_theme && @current_theme.stylesheets.include?(source)) ?
23         "/themes/#{@current_theme.dir}/stylesheets/#{source}" : source)
24 
25     end
26 
27   end
28 end
29 
30 ApplicationHelper.send(:include, CSSPatch)



Драйвера для сенсорного экрана Электронного киоска

Для популяризации открытого ПО, осуществления возможности прямого взаимодействия посетителей с этим ПО а так же для наглядной рекламы мероприятия в СГУ было решено использовать электронный киоск оставшийся у ВЦ после реализации проекта информатизации муниципальных учреждений Саратова.


И конечно на киоске должно было стоять свободное ПО.
Но как оказалось железная начинка киоска была не очень то свободна...
под сенсорный экран GeneralTouch были очень старые проприетарные драйвера под графику Xfree86 не совместимые с современными Xorg  и был еще дикий велосипед от какого то энтузиаста http://linuxportal.ru/forums/index.php/m/81607/#msg_81607 (там какая то служба как то там маскировала этот сенсорный под какой то другой к которому тоже дрова старые и сторонние), который к тому же так и не заработал...
Мы решили а почему бы не попробовать самим написать нормальные дрова? Тем более что в состав Xorg входят драйвера для сенсорных экранов Elotouch тоже к COM порту подключаемых как наш GeneralTouch и кроме того от того "велосипедиста" нам достался протокол по которому работает GeneralTouch.
Открыли исходники xorg-x11-drv-elographics смотрим а формат то основного Touch пакета в точности совпадает!(формата других пакетов GeneralTouch у нас нет)... 
Убрали инициализацию и другие не нужные куски, скомпили... Заработало!

Вывод... не бойтесь программировать... беритесь за практически полезные и интересные задачи...
Перед написанием дров посмотрев на исходники xorg-x11-drv-elographics даже некоторые бывшие олимпиадники из ЦОПа говорили
"Почитал код драйвера и мне стало страшно :(
Думаю будет разумнее попытаться найти готовые дрова - низкоуровневое программирование это слишком тяжко на мой взгляд."


P.S. вопрос к разработчикам codeforces...
А тут встроенная подсветка синтаксиса планируется? А то код пришлось копипастить в тот же редмайн там делать предварительный просмотр и копипастить сюда уже подсвеченный...
  • Vote: I like it
  • 0
  • Vote: I do not like it