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の個別のインスタンスを生成することはありません)。
- 外部からの人々のためにVTshniy redmineを改良するために(SFDは、現時点ではVTの唯一の公開/オープンソースプロジェクトである
「暗黒の王国の光線」になっています) - 潜在的な新人の注意をECに引き付ける
- このイベントの組織への展示センターの所属を強調する
その結果、主催者は多くの問題に直面しました。
- Redmineは、プロジェクトごとに異なるスタイルをサポートしていません
- Redmineには、参加のためのアプリケーション(ステータス、優先度、割り当てなど)を追加するときに平均的なスピーカーが必要としない多くのフィールドがあります。
- RedmineはテーマでのJavaScriptの使用をサポートしていません(実際、テーマは1つのCSSです)
これらの問題は、Redmineのプラグインを開発することで解決されました(Redmineのソースコードに変更はありません)
将来的には、リファクタリング(機能ごとに個別のプラグインに分割)して、オープンソースに入れる予定です。 コードの一部を次に示します。
CSSの追加、非プロジェクト参加者の不要なフィールドの削除、JSの追加:
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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自体の機能の置換(プロジェクトごとのテーマ):
- require_dependency 'redmine /テーマ'
- モジュール CSSPatch
- def self .included(base) #:nodoc:
- base.send(: include 、InstanceMethods)
- base.class_eval do
- alias_method_chain:path_to_stylesheet ,: perproject
- 終わり
- 終わり
- モジュール InstanceMethods
- #ユーザー管理ページに料金タブを追加します
- def path_to_stylesheet_with_perproject (ソース)
- th = 文字列 。 新規 (Setting.ui_theme)
- @projectでない場合。 ゼロ ?
- projecttheme = "#{RAILS_ROOT►/public/themes/#{@project.identifier}"
- if File .exists?(projecttheme)
- th = @ project.identifier
- 終わり
- 終わり
- @current_theme || = Redmine :: Themes.theme(th)
- stylesheet_path ((@current_theme && @ current_theme.stylesheets。include?(ソース))?
- 「/themes/#{@current_theme.dirasket/stylesheets/#{source}」 :ソース)
- 終わり
- 終わり
- 終わり
- 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
はサラトフ州立大学も
開催しています。 彼らが歓迎するように!