Saratov SFD'09のソフトウェア開発:方法

2009年、SSESU(サラトフ社会経済大学)で人事異動が行われ、その結果、サラトフソフトウェアの自由の日はそこでは不可能になりました。

サラトフのSFDの警棒は、SSUによって拾われました。

SSUのオーガナイザーは主に技術的な偏見を持つ人々であったため、今年はSaratov SFDが以前よりも大幅に技術的に進歩したことが判明しました。

SFD 2009の組織のために、SSUでいくつかのソフトウェア製品が開発されました(Linuxのドライバーまで!)



Saratov SFD 2009の開催時には、過去の経験が考慮されました。

このイベント専用の特別サイトがオープンしましたsfd.sgu.ru



サイトで作業する



このサイトは、実際には、SSU cc.sgu.ruのコンピューティングセンターで使用される無料のプロジェクト管理システムRedmine cc.sgu.ru/redmineのプロジェクトです。

RedmineはRuby on Railsで記述されており、現在、最高のオープンソースバグトラッカー/プロジェクト管理システムと見なされています。

次の目的で、VTshnoyプロジェクト管理システムでSFDプロジェクトを作成することが決定されました(たとえば、同じRedmineの個別のインスタンスを生成することはありません)。





その結果、主催者は多くの問題に直面しました。





これらの問題は、Redmineのプラグインを開発することで解決されました(Redmineのソースコードに変更はありません)

将来的には、リファクタリング(機能ごとに個別のプラグインに分割)して、オープンソースに入れる予定です。 コードの一部を次に示します。



CSSの追加、非プロジェクト参加者の不要なフィールドの削除、JSの追加:


  1. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  2. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  3. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  4. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  5. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  6. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  7. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  8. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  9. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  10. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  11. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  12. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  13. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  14. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  15. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end



  16. def view_layouts_base_html_head (context = { }) ret= '' project = context[:project] baseurl = url_for (:controller => 'wiki' , :action => 'index' , :id => project) + '/../../..' if not project. nil ? if not User.current.member_of?(project) if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/stylesheets/non_member.css" ) ret+= stylesheet_link_tag (baseurl + "/themes/#{project.identifier}/stylesheets/non_member.css" ) end end if File .exists?( "#{RAILS_ROOT}/public/themes/#{project.identifier}/js/project.js" ) ret+= javascript_include_tag (baseurl + "/themes/#{project.identifier}/js/project.js" ) end end return ret end







プラグインからのredmine自体の機能の置換(プロジェクトごとのテーマ):


  1. require_dependency 'redmine /テーマ'
  2. モジュール CSSPatch
  3. def self .included(base) #:nodoc:
  4. base.send(: include 、InstanceMethods)
  5. base.class_eval do
  6. alias_method_chain:path_to_stylesheet ,: perproject
  7. 終わり
  8. 終わり
  9. モジュール InstanceMethods
  10. #ユーザー管理ページに料金タブを追加します
  11. def path_to_stylesheet_with_perproject (ソース)
  12. th = 文字列新規 (Setting.ui_theme)
  13. @projectでない場合。 ゼロ
  14. projecttheme = "#{RAILS_ROOT►/public/themes/#{@project.identifier}"
  15. if File .exists?(projecttheme)
  16. th = @ project.identifier
  17. 終わり
  18. 終わり
  19. @current_theme || = Redmine :: Themes.theme(th)
  20. stylesheet_path ((@current_theme && @ current_theme.stylesheets。include?(ソース))?
  21. 「/themes/#{@current_theme.dirasket/stylesheets/#{source}」 :ソース)
  22. 終わり
  23. 終わり
  24. 終わり
  25. ApplicationHelper.send(: include 、CSSPatch)


電子キオスクのタッチスクリーン用ドライバー



オープンソースソフトウェアを普及させ、訪問者がこのソフトウェアと直接やり取りできるようにするため、またSSUでイベントを視覚的に宣伝できるようにするため、サラトフ市の機関の情報化プロジェクトの実施後にECに残された電子キオスクを使用することが決定されました。

画像



そしてもちろん、フリーソフトウェアはキオスクにあるはずでした。

しかし、判明したように、キオスクの鉄の詰め物はあまり自由ではありませんでした...

GeneralTouchタッチスクリーンの下には、最新のXorgと互換性のないXfree86グラフィックス用の非常に古い独自のドライバーがあり、愛好家linuxportal.ru/forums/index.php/m/81607/#msg_81607のようなワイルドバイクがまだありました (そこで、この感覚を他のものの下に偽装しました。これには、古いandとサードパーティのwoodもあります)、これも機能しませんでした...

普通のfireを自分で書いてみませんか? さらに、XorgにはGeneralTouchのようなCOMポートにも接続されたElotouchタッチスクリーン用のドライバーが含まれており、さらに「サイクリスト」からGeneralTouchが動作するプロトコルを取得しました。

xorg-x11-drv-elographicsのソースを開きましたが、メインのTouchパッケージの形式はまったく同じです(他のGeneralTouchパッケージの形式はありません)...

初期化およびその他の不要な部分が削除され、コンパイルされました...獲得しました!

その後、私たちのパッチがアップストリーム採用されました



結論...プログラムを恐れないでください...実用的で興味深いタスクを引き受けてください...

orgを書く前に、 xorg-x11-drv-elographicsのソースを見ると、TsOPa(SSUのオリンピアードトレーニングセンター)の元オリンピアードの一部でさえ次のように述べています。

" :(

- ."








PS。 今年のトピックですでに書いたように、サラトフSFD 2010 サラトフ州立大学も開催しています。 彼らが歓迎するように!



All Articles