Создание собственного проекта с открытым исходным кодом на портале CodePlex
Курсовая работа, 18 Марта 2013, автор: пользователь скрыл имя
Краткое описание
Цель работы – создание собственного проекта с открытым исходным кодом на портале CodePlex.
Объектом исследования данной работы является язык программирования C#, системы управления версиями, а также порта codeplex.com.
В ходе работы проводились:
создание проекта на C# с дальнейшей публикацией на CodePlex;
изучение аспектов системы управления версиями CodePlex.
Вложенные файлы: 1 файл
ПЗ Создание собственного проекта с открытым исходным кодом на портале CodePlex.doc
— 674.00 Кб (Скачать файл)Блокировка файла или группы файлов (для хранения признака блокировки нужен общедоступный и постоянно находящийся в онлайне центральный сервер). Это вынуждает применять специальные административные меры, если приходится работать с бинарными файлами, непригодными для автоматического слияния.
Слежение за определённым файлом или группой файлов (изменения файлов происходят на разных серверах, слияния и выделения ветвей происходят локально, об изменениях становится известно только при синхронизации, причём не всем разработчикам, а только тем, кто в данной синхронизации участвует).
Единая сквозная нумерация версий
системы и/или файлов, в которой
номер версии монотонно возрастает
(такая нумерация также
Периодическая синхронизация нескольких компьютеров под управлением одного разработчика (рабочего компьютера, домашнего компьютера, ноутбука и так далее). Использование распределённой системы избавляет от необходимости выделять один из компьютеров в качестве сервера, а синхронизация выполняется по необходимости, обычно при «пересадке» разработчика с одного устройства на другое.
Совместная работа над проектом небольшой территориально распределённой группы разработчиков без выделения общих ресурсов. Как и в предыдущем случае, реализуется схема работы без главного сервера, а актуальность репозиториев поддерживается периодическими синхронизациями по схеме «каждый с каждым».
Крупный распределённый проект, участники которого могут долгое время работать каждый над своей частью, при этом не имеют постоянного подключения к сети. Такой проект может использовать централизованный сервер, с которым синхронизируются копии всех его участников. Возможны и более сложные варианты — например, с созданием групп для работы по отдельным направлениям внутри более крупного проекта. При этом могут быть выделены отдельные «групповые» серверы для синхронизации работы групп, тогда процесс окончательного слияния изменения становится древовидным: сначала отдельные разработчики синхронизируют изменения на групповых серверах, затем обновлённые репозитории групп синхронизируются с главным сервером. Возможна работа и без «групповых» серверов, тогда разработчики одной группы синхронизируют изменения между собой, после чего любой из них (например, руководитель группы) передаёт изменения на центральный сервер.
В традиционной «офисной» разработке проектов, когда группа разработчиков относительно невелика и целиком находится на одной территории, в пределах единой локальной компьютерной сети, с постоянно доступными серверами, централизованная система может оказаться лучшим выбором из-за своей более жёсткой структуры и наличия функциональности, отсутствующей в распределённых системах (например, уже упомянутой блокировки). Возможность фиксировать изменения без их слияния в центральную ветвь в таких условиях легко реализуется путём выделения незавершённых работ в отдельные ветви разработки.
3 Руководство по созданию собственного проекта с открытым исходным кодом на портале CodePlex
Одним из самых удобных способов
создания проекта на CodePlex осуществляется
через использования программного продукта
Mercurial он же Hg —кроссплатформенная распределё
Наряду с традиционными
Утилита hg обладает компактным интерфейсом, и Mercurial считается более простой в освоении системой.
Ниже будут приведена
Шаг 1. Установка Mercurial (TortoiseHg). Данный
программный продукт можно скачать с официального
сайта разработчика http://tortoisehg.bitbucket.
Либо скачать данный программный
продукт с сайта, предоставляемого системой
CodePlex http://tortoisehg.codeplex.
Шаг 2. Создайте новый проект CodePlex.В мастере по созданию проекта вы увидите следующее (см. рисунок 1). Выберите Mercurial.
Рисунок 1 – Выбор источника контроля
Шаг 3. Клонирование репозитории.
Теперь необходимо создать клон репозитория. Этот
шаг обязателен, в противном случае продолжение
будет невозможно. Во-первых, создайте
новую папку на вашем локальном компьютере,
куда вы хотите загрузить клон репозитория.
Затем с помощью TortoiseHg
Рисунок 2 – Контекстное меню, пункт Clone
TortoiseHg будет предлагать выбор исходного пути. Для продолжения операции клонирования нам нужно получить URL из CodePlex (см. рисунок 3).
Рисунок 3 – Онлайн-меню Mercurial на портале CodePlex, указание URL для клонирования
Данный URL вставляем в диалоговое окно TortoiseHg в путь источника, как показано на рисунке 4.
Рисунок 4 – Диалоговое окно TortoiseHg, путь источника
Нажимаем на кнопку клонировать. После
того, как операция клонирования будет
завершена, диалог закроется,
и вы увидите зеленую
галочку, которая указывает синхронизацию Mercur
Рисунок 5 – Папка проекта на рабочем столе
Шаг 4. Добавление файлов в папку. Теперь вы можете просто добавить файлы проекта в эту папку. После добавления файлов в папку щёлкаем правой кнопкой мыши по данной папке для вызова контекста Windows Explorer меню, выбираем HG Commit. Команда HG Commit совершит передачу проекта в локальное хранилище TortoiseHg (см. рисунок 6).
Рисунок 6 – Контекстное меню, пункт Hg Commit
В диалоговом окне HG Commit, нужно прокомментировать, описать фиксацию (опять же это только для локального репозитория). Убедитесь в том, чтобы все файлы проекта прошли фиксацию, как показано на рисунке 7.
Рисунок 7 – Меню программы TortoiseHg, кнопка фиксации
Шаг 5. Проталкивание кода на CodePlex (см. рисунок 8).
Рисунок 8 – Меню программы TortoiseHg, кнопка проталкивания исходящих изменений на выбранный URL
Нажимаем на кнопку протолкнуть исходящие изменения на выбранный URL, вводим логин и пароль, который был использован при регистрации на CodePlex.
Теперь можно пройти на сайт и увидеть в личном кабинете созданный проект.
Заключение
В результате проделанной работы была написана программа на C#, которая строит график по заданным точкам, проекции к точкам (узлам) графика, а также делает прогнозы: неточный прогноз (график регрессии), прогноз методом аппроксимации. Данный проект создавался под системой управления проектами CodePlex, который является хостингом для проектов с открытым исходным кодом от Microsoft.
Было выявлено, что CodePlex позволяет совместно вести развитие программного обеспечения с открытым исходным кодом. В его состав входят wiki-страницы, контроль версий, основанный на Team Foundation Server, но доступный также через Subversion, форум, поддержка RSS.
В итоге можно сказать, что системы управления версиями облегчают работы с изменяющейся информацией. А также становится удобно хранить проекты с той гарантией, что они не будут потеряны с течением времени, то есть система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.
Список использованных источников
- Агуров, П.В. Разработка компонентов в MS Visual Studio 2008 / П.В. Агуров. – СПб.: Издательство БХВ-Петербург, 2008. –480с.: ил.
- Астахова, И. Ф. SQL в примерах и задачах: Учебное Пособие / И.Ф. Астахова, А.П. Толстобров, В.М. Мельников. – Мн.: Издательство Новое знание, 2002. –176 с.
- Моисеенко, С.И. SQL. Задачи и решения / С.И. Моисеенко – СПб.: Издательство Питер, 2006. – 256с.
- Павловская, Т.А. C#. Программирование на языке высокого уровня. Учебник для вузов. / Т.А. Павловская – СПб.: Издательство Питер, 2007 – 432с.
- Lucasward.net : научный электронный
блог [Электронный ресурс]. – М.:
Интра-Плюс, 1997. – Режим доступа http://www.lucasward.net/2010/
02/maturity-model-for-source- control-scmm.html., свободный. – Загл. с экрана.
Приложение А
(обязательное)
Техническое задание
Министерство образования и науки Российской Федерации
ФГБОУ ВПО «Омский государственный технический университет»
Кафедра «Прикладная математика и фундаментальная информатика»
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
1. Введение
Программное изделие: Программа строит график по заданным точкам, проекции к точкам (узлам) графика, а также делает прогнозы: неточный прогноз (график регрессии), прогноз методом аппроксимации.
2. Функциональные требования
Данная программа будет
Данная программа будет иметь 3 способа определения летальной дозы ЛД100:
- по заданным значениям;
- линейная аппроксимация по двум точкам;
- регрессия (неточный прогноз).
Данный проект должен быть создан под управлением системы контроля, то есть под системой управления версиями CodePlex.
3. Программная совместимость.
Гарантируется совместимость на уровне исходного кода со следующими операционными системами:
- Windows 7.
Заказчик (куратор) ______________________________
(подпись, дата)
Исполнитель: студент гр. ИТ-319 ______________________________ Д.В. Ковалев
(подпись, дата)
Приложение Б
(обязательное)
Исходный код
1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.ComponentModel; |
4 |
using System.Data; |
5 |
using System.Drawing; |
6 |
using System.Drawing.Imaging; |
7 |
using System.Linq; |
8 |
using System.Text; |
9 |
using System.Windows.Forms; |
10 |
|
11 |
namespace ZedGraph |
12 |
{ |
13 |
public partial class MainForm : Form |
14 |
{ |
15 |
private GraphPane myPane = new GraphPane(); |
16 |
private int listCount; |
17 |
private PointPairList list1 = new PointPairList(); |
18 |
public MainForm() |
19 |
{ |
20 |
InitializeComponent(); |
21 |
zedGraphControl1. |
22 |
} |
23 |
void zedGraphControl1_ |
24 |
{ |
25 |
// Переименуем (переведем на русский язык) некоторые пункты контекстного меню |
26 |
menuStrip.Items[0].Text = "Копировать"; |
27 |
menuStrip.Items[1].Text = "Сохранить как картинку…"; |
28 |
menuStrip.Items[2].Text = "Параметры страницы…"; |
29 |
menuStrip.Items[3].Text = "Печать…"; |
30 |
menuStrip.Items[4].Text = "Показывать значения в точках…"; |
31 |
menuStrip.Items[7].Text = "Установить масштаб по умолчанию…"; |
32 |
// Некоторые пункты удалим |
33 |
menuStrip.Items.RemoveAt(5); |
34 |
menuStrip.Items.RemoveAt(5); |
35 |
} |
36 |
private void GraphCreate_Click(object sender, EventArgs e) |
37 |
{ |
38 |
CreateGraph(zedGraphControl1,n |
39 |
SetSize(); // и устанавливаем его положение и размер |
40 |
zedGraphControl1.Refresh(); |
41 |
} |
42 |
private void Form1_Resize(object sender, EventArgs e) |
43 |
{ |
44 |
SetSize(); |
45 |
} |
46 |
private void SetSize() |
47 |
{ |
48 |
zedGraphControl1.Location = new Point(15, 15); // задаем положение графика |
49 |
zedGraphControl1.Size = new Size(ClientRectangle.Width - 375, ClientRectangle.Height - 75); // размеры графика |
50 |
} |
51 |
private void CreateGraph(ZedGraphControl zgc, PointF mousePoint) |
52 |
{ |
53 |
GraphPane myPane = zgc.GraphPane; |
54 |
myPane.CurveList.Clear(); |
55 |
list1.Clear(); |
56 |
// Задаем название графика и сторон |
57 |
myPane.Title.Text = "График"; |
58 |
myPane.XAxis.Title.Text = "Доза"; |
59 |
myPane.YAxis.Title.Text = "Число погибших животных"; |
60 |
// ------------------------------ |
61 |
// строим график |
62 |
double x, y; |
63 |
List<LineItem> curves = new List<LineItem>(); |
64 |
foreach (DataGridViewRow row in dataGridView1.Rows) |
65 |
{ |
66 |
x = Convert.ToDouble(row.Cells[0]. |
67 |
y = Convert.ToDouble(row.Cells[1]. |
68 |
list1.Add(x, y); |
69 |
} |
70 |
curves.Add(new LineItem("График", list1, Color.Red, SymbolType.Diamond)); |
71 |
foreach (DataGridViewRow row in dataGridView1.Rows) |
72 |
{ |
73 |
var cell = row.Cells[2] as DataGridViewCheckBoxCell; |
74 |
if (Convert.ToBoolean(cell.Value) == true) |
75 |
{ |
76 |
PointPairList listx = new PointPairList(); |
77 |
x = Convert.ToDouble(row.Cells[0]. |
78 |
y = Convert.ToDouble(row.Cells[1]. |
79 |
listx.Add(0,y); |
80 |
listx.Add(x, y); |
81 |
listx.Add(x, 0); |
82 |
curves.Add(new LineItem("", listx, Color.Blue, SymbolType.Diamond)); |
83 |
} |
84 |
} |
85 |
PointPairList listProections = new PointPairList(); |
86 |
// Пересчитываем пиксели в координаты на графике |
87 |
// У ZedGraph есть несколько перегруженных методов ReverseTransform. |
88 |
listProections.Add(0, mousePoint.Y); |
89 |
listProections.Add(mousePoint. |
90 |
listProections.Add(mousePoint. |
91 |
curves.Add(new LineItem("График проекции", listProections, Color.Blue, SymbolType.Diamond)); |
92 |
// Выводим результат |
93 |
listCount = list1.Count; |
94 |
PointPairList list2 = new PointPairList(); |
95 |
list2.Add(list1[listCount - 1].X, list1[listCount - 1].Y); |
96 |
if (radioButton1.Checked && listCount>=2) |
97 |
{ |
98 |
x = (-(list1[listCount - 1].X - list1[listCount - 2].X) * Convert.ToInt32( |
99 |
(list1[listCount - 2].X * list1[listCount - 1].Y - list1[listCount - 1].X * list1[listCount - 2].Y)) / |
100 |
(list1[listCount - 2].Y - list1[listCount - 1].Y); |
101 |
list2.Add(x, Convert.ToInt32( |
102 |
curves.Add(new LineItem("График линейной аппроксимации", list2, Color.DarkGreen, SymbolType.Diamond, 2)); |
103 |
} |
104 |
if (radioButton2.Checked ) |
105 |
{ |
106 |
CreateGraphregress( zgc, mousePoint); |
107 |
} |
108 |
bool isGraphLabelVisible = true; |
109 |
int i = 0; |
110 |
foreach (LineItem u in curves) |
111 |
{ |
112 |
u.Label.IsVisible = isGraphLabelVisible; |
113 |
myPane.CurveList.Add(u); |
114 |
i++; |
115 |
} |
116 |
double bdl; |
117 |
bdl = list1[listCount - 2].X; |
118 |
listCount = list1.Count; |
119 |
SafeLine.Text = "0 -" + list1[0].X+" мг"; |
120 |
BitDeadyLine.Text = list1[0].X + "-" + bdl+ " мг"; |
121 |
DedyLine.Text = bdl+ "-" + list1[listCount-1].X + " мг"; |
122 |
zgc.AxisChange(); |
123 |
} |
124 |
private void xyAxis(ZedGraphControl zgc) |
125 |
{ |
126 |
myPane = zgc.GraphPane; |
127 |
myPane.XAxis.MajorGrid. |
128 |
myPane.XAxis.MajorGrid.DashOn = 10; |
129 |
myPane.XAxis.MajorGrid.DashOff = 5; |
130 |
myPane.YAxis.MajorGrid. |
131 |
myPane.YAxis.MajorGrid.DashOn = 10; |
132 |
myPane.YAxis.MajorGrid.DashOff = 5; |
133 |
myPane.YAxis.MinorGrid. |
134 |
myPane.YAxis.MinorGrid.DashOn = 1; |
135 |
myPane.YAxis.MinorGrid.DashOff = 2; |
136 |
myPane.XAxis.MinorGrid. |
137 |
myPane.XAxis.MinorGrid.DashOn = 1; |
138 |
myPane.XAxis.MinorGrid.DashOff = 2; |
139 |
} |
140 |
private void numericUpDown1_ValueChanged(ob |
141 |
{ |
142 |
GraphCreate.Enabled = false; |
143 |
int colCount = Convert.ToInt32( |
144 |
dataGridView1.RowCount = colCount; |
145 |
DataGridViewRow row = dataGridView1.Rows[colCount - 1]; |
146 |
row.Cells[0].Value = 0.0; |
147 |
row.Cells[1].Value = 0.0; |
148 |
if (numericUpDown1.Value != 1) |
149 |
{ |
150 |
GraphCreate.Enabled = true; |
151 |
} |
152 |
} |
153 |
private void Form1_Load(object sender, EventArgs e) |
154 |
{ |
155 |
GraphCreate.Enabled = false; |
156 |
numericUpDown1_ValueChanged(nu |
157 |
xyAxis(zedGraphControl1); |
158 |
} |
159 |
private void dataGridView1_CellValidating(o |
160 |
{ |
161 |
int newInteger; |
162 |
if(dataGridView1.CurrentCell. |
163 |
{ |
164 |
if (int.TryParse(e. |
165 |
{ |
166 |
e.Cancel = true; |
167 |
MessageBox.Show("Неверные данные, количество животных не должно превышать их максимального значения"); |
168 |
} |
169 |
} |
170 |
dataGridView1.Rows[e.RowIndex] |
171 |
double newDouble; |
172 |
if (dataGridView1.Columns[e. |
173 |
{ |
174 |
return; |
175 |
} |
176 |
if (dataGridView1.Rows[e. |
177 |
if (!double.TryParse(e. |
178 |
out newDouble) || newDouble < 0) |
179 |
{ |
180 |
e.Cancel = true; |
181 |
MessageBox.Show("the value must be a non-negative integer"); |
182 |
} |
183 |
} |
184 |
private void сохранитьКартинкуКакToolStripM |
185 |
{ |
186 |
zedGraphControl1.SaveAsBitmap( |
187 |
} |
188 |
private void выходToolStripMenuItem_Click(o |
189 |
{ |
190 |
Application.Exit(); |
191 |
} |
192 |
private void копироватьРисунокToolStripMenu |
193 |
{ |
194 |
bool isShowmessage = false; |
195 |
zedGraphControl1.Copy( |
196 |
} |
197 |
private void параметрыСтраницыToolStripMenu |
198 |
{ |
199 |
zedGraphControl1.DoPageSetup() |
200 |
} |
201 |
private void установитьМасштабПоУмолчаниюTo |
202 |
{ |
203 |
zedGraphControl1.ZoomOutAll( |
204 |
} |
205 |
private void печатьToolStripMenuItem_Click( |
206 |
{ |
207 |
zedGraphControl1.DoPrint(); |
208 |
} |
209 |
private void оПрограммеToolStripMenuItem_ |
210 |
{ |
211 |
aboutForm AboutForm = new aboutForm(); |
212 |
AboutForm.ShowDialog(); |
213 |
} |
214 |
private bool zedGraphControl1_ |
215 |
{ |
216 |
// Сюда будут записаны координаты в системе координат графика |
217 |
if (myPane.CurveList.Count > 0 || (myPane.CurveList.Count
== 2 && myPane.CurveList[0].Points[0]. |
218 |
{ |
219 |
double x, y; |
220 |
DataGridViewRow row = null; |
221 |
zedGraphControl1.GraphPane. |
222 |
|
223 |
CreateGraph(zedGraphControl1,n |
224 |
string text = string.Format("Доза препарата: {0} мг/кг; Число погибших животных: {1}", Math.Round(x,3) , (int)y); |
225 |
coardlabel.Text = text; |
226 |
zedGraphControl1.Invalidate(); |
227 |
} |
228 |
return true; |
229 |
} |
230 |
private void CreateGraphregress(ZedGraphCon |
231 |
{ |
232 |
double YS, XS, St, Sb, b0, b1; |
233 |
double x, y; |
234 |
GraphPane myPane = zgc.GraphPane; |
235 |
List<LineItem> curves = new List<LineItem>(); |
236 |
PointPairList regress = new PointPairList(); |
237 |
regress.Clear(); |
238 |
list1.Clear(); |
239 |
// myPane.CurveList.Clear(); |
240 |
// Задаем название графика и сторон |
241 |
myPane.Title.Text = "График"; |
242 |
myPane.XAxis.Title.Text = "Доза"; |
243 |
myPane.YAxis.Title.Text = "Число погибших животных"; |
244 |
// ------------------------------ |
245 |
// строим график |
246 |
foreach (DataGridViewRow row in dataGridView1.Rows) |
247 |
{ |
248 |
x = Convert.ToDouble(row.Cells[0]. |
249 |
y = Convert.ToDouble(row.Cells[1]. |
250 |
list1.Add(x, y); |
251 |
} |
252 |
listCount = list1.Count; |
253 |
double[] YR = new double[listCount]; |
254 |
YS = 0; |
255 |
XS = 0; |
256 |
for (int i = 0; i < listCount; i++) |
257 |
{ |
258 |
YS += list1[i].Y; |
259 |
XS += list1[i].X; |
260 |
} |
261 |
YS = YS / listCount; |
262 |
XS = XS / listCount; |
263 |
St = 0; |
264 |
Sb = 0; |
265 |
for (int i = 0; i < listCount; i++) |
266 |
{ |
267 |
St += (list1[i].X - XS) * (list1[i].Y - YS); |
268 |
Sb += (list1[i].X - XS) * (list1[i].X - XS); |
269 |
} |
270 |
b1 = St / Sb; |
271 |
b0 = YS - b1 * XS; |
272 |
for (int i = 0; i < listCount; i++) |
273 |
{ |
274 |
YR[i] = b0 + b1 * list1[i].X; |
275 |
} |
276 |
for (int i = 0; i < listCount; i++) |
277 |
{ |
278 |
regress.Add(list1[i].X, YR[i]); |
279 |
} |
280 |
curves.Add(new LineItem("График регрессии", regress, Color.DarkMagenta, SymbolType.Diamond,2)); |
281 |
bool isGraphLabelVisible = true; |
282 |
int t = 0; |
283 |
foreach (LineItem u in curves) |
284 |
{ |
285 |
u.Label.IsVisible = isGraphLabelVisible; |
286 |
myPane.CurveList.Add(u); |
287 |
t++; |
288 |
} |
289 |
zgc.AxisChange(); |
290 |
} |
291 |
private void button1_Click(object sender, EventArgs e) |
292 |
{ |
293 |
CreateGraphregress( |
294 |
SetSize(); // и устанавливаем его положение и размер |
295 |
zedGraphControl1.Refresh(); |
296 |
} |
297 |
} |
298 |
} |
1 Программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.
2 Извлечение документа из хранилища и создание рабочей копии.
3 Синхронизация рабочей копии до некоторого заданного состояния хранилища. Чаще всего это действие означает обновление рабочей копии до самого свежего состояния хранилища. Однако при необходимости можно синхронизировать рабочую копию и к более старому состоянию, чем текущее.
4 Создание новой версии, фиксация изменений. Распространение изменений, сделанных в рабочей копии, на хранилище документов. При этом в хранилище создаётся новая версия изменённых документов.
5 Откладывание изменений. Предоставляемая некоторыми системами возможность создать набор изменений (changeset) и сохранить его на сервере без фиксации (commit’а). Отложенный набор изменений доступен на чтение другим участникам проекта, но до специальной команды не входит в основную ветвь. Поддержка откладывания изменений даёт возможность пользователям сохранять незавершённые работы на сервере, не создавая для этого отдельных ветвей.
6 Ветвь — направление разработки, независимое от других. Ветвь представляет собой копию части (как правило, одного каталога) хранилища, в которую можно вносить свои изменения, не влияющие на другие ветви. Документы в разных ветвях имеют одинаковую историю до точки ветвления и разные — после неё.
7 Слияние — объединение независимых изменений в единую версию документа. Осуществляется, когда два человека изменили один и тот же файл или при переносе изменений из одной ветки в другую.