Технология на програмирането 2017-2018

Кирил Митов

Съдържание

  1. Въведение
    1. Оценяване
    2. Теми на Курса
    3. Дневник оценяване
    4. План
  2. Теми
    1. Тема 1 – RoR, CSV
      1. Домашно 1 върху тема 1
      2. Предадени работи от Домашно 1 върху тема 1
      3. Домашно 2 върху Тема 1 – 16 октомври 2017
      4. Домашно 3 върху Тема 1 – 22 октомври 2017
    2. Тема 2 – RoR, RSpec, JSON, API, Web, XML
      1. Домашно 1 върху тема 2
      2. Домашно 2 върху тема 2
      3. Домашно 3 върху тема 2
    3. Тема 3 – Комуникация между процеси – Александър Спасов
      1. Домашно 1 по Тема 3

Въведение

Оценяване

Домашните за важни. Контролните също.

Теми на курса

Първоначалния план е да разделим курса на конкретни малки теми от по 4 -6 седмици всяка.

Дневник оценяване

Наличен тук –https://docs.google.com/spreadsheets/d/1YJ3g2VSMXagB047JMI5_5XC-5scYaCthjw7dX-HZSC0/edit#gid=0

План

Работим с много технологии, но общата цел на курс е разработка на качествен софтуер, следване на процеси, тестване.

  1. Запознаване с курса и изискванията към курса, както и с Ръководството за академична честност в ТУЕС.

Теми

Тема 1 – RoR, CSV

Обрабокта на финансови документи. Да се върви по ledger и да се намират приходи, разходи, баланс. Да се вадят статистики. Целта е да се усвои работата с CSV документи. Приложенията да бъдат web и да са качени на heroku.

  • Да се уточнят нужните понятия относно „пари“ и финансова обработка на документите
  1. Инсталиране на Ruby и няколко прости примера с Ruby
  2. Инсталиране на Rails  и няколко прости примера с Rails
  3. Да се мине през ресурсите за Ruby със следните задължителни
    1. Beginners guide Ruby
    2. Try Ruby
    3. Ruby in Twenty Minutes
    4. Програмиране с Руби
  4. Да се разработят за домашно и предадът програми за решавана на прости математически задачи с езика Руби. Програмата да приема аргументи от командния ред и да връща резултат.
  5. Да ре мине през ресурсите за Rails със следните задължителни
    1. http://guides.rubyonrails.org/getting_started.html
    2. https://scotch.io/tutorials/build-a-restful-json-api-with-rails-5-part-one
  6. Качване ан приложения върху Heroku.
  7. Да се реализират набор от задачи върху CSV документи
    1. Качват се CSV документът и се отговаря на въпросът
      1. каква е сумата в колона Х
      2. колко за записите в колана У отговарящи на условие в колона Z
      3. да се намери интервалът от 30 последователни дни в които нетният приход да е най-голям
      4. да се направи линейна регресия на данните и да се намерят съответните уравнения.

Домашно 1 върху тема 1

  1. Краен срок – 10 октомври 2017 23:59:59
  2. Формата за предаване е https://goo.gl/forms/i7FJzy2YtiHl0VkA3
  3. Да се разработи приложение, което да се качи на heroku и да е налично на даден url адрес
  4. Приложението трябва да е разработено с Ruby On Rails
  5. Приложението да се качи в github репо
  6. Да поддържа следните функционалности
    1. При изпращане на следната curl POST заявка с прикачен CSV документ трябва да се върне като резултат сумата в първата колона на документа. Резултатът е просто число до втория знак след запетаята. Ако резултатът е цяло число се връща като число с десетична запетая и две нули. Резултатът се закръглява със ceil. Прочете за метода protect_from_forgery with: :null_sessions
      1. curl -F „file=@/home/elsyser/file.csv“ http://yourherokuapp/sums
      2. curl –form „file=@/home/elsyser/file.csv“ http://yourherokuapp/sums
    2. При изпращане на следната curl POST заявка с прикачен CSV документ трябва да се върне като резултат сумата в колона на записите в колона 2 на документа, за които е вярно, стойността в колона 3 е нечетна. Резултатът е просто число до втория знак след запетаята. Ако резултатът е цяло число се връща като число с десетична запетая и две нули. Резултатът се закръглява със ceil.
      1. curl -F „file=@/home/elsyser/file.csv“ http://example.com/filters
      2. curl –form „file=@/home/elsyser/file.csv“ http://example.com/filters
    3. При изпращане на следната curl POST заявка с прикачен CSV документ трябва да се върне като резултат най-голяма сума от 30 последователни записа в колона 1. Резултатът е просто число до втория знак след запетаята. Ако резултатът е цяло число се връща като число с десетична запетая и две нули. Резултатът се закръглява със ceil.
      1. curl -F „file=@/home/elsyser/file.csv“ http://example.com/intervals
      2. curl –form „file=@/home/elsyser/file.csv“ http://example.com/intervals
    4. При изпращане на следната curl POST заявка с прикачен CSV документ трябва да се върнат като резултат стойностите на параметрите а и b, за линейно уравнение описващо данните в колона 1. Параметрите се получават, чрез линейна регресия. Двете числа са закръглени до 6 символа след запетаята и са разделени със запетая.
      1. curl -F „file=@/home/elsyser/file.csv“ http://example.com/lin_regressions
      2. curl –form „file=@/home/elsyser/file.csv“ http://example.com/lin_regressions

Предадени работи от Домашно 1 върху тема 1

https://docs.google.com/spreadsheets/d/178NEJq5Vh4UBxlokOrfK53MxTmMpS3bq-y4m1cryUVg/edit#gid=446685093

Домашно 2 върху Тема 1 – 16 октомври 2017

  1. Краен срок 17 октомври 2017 23:59:59
  2. Да се разработи програма на руби, която да проверява домашните предадени в домашно 1.
  3. Програмата на руби да се именова като Клас_Номер_ПървоИме_Фамилия.rb и да се качи в главната директория в хранилището software_engineering2017. Всички необходими за работата на програмата .csv файлове да се качат в същата директория и да са с име започващо с Клас_Номер_ПървоИме_Фамилия.
  4. Програмата трябва да може да се изпълнява чрез
    1. ruby mp.rb csv_file

    2. в който mp.rb е разработената програма
    3. csv_file е файлът съдържащ предадените линкове към работещи домашни – https://docs.google.com/spreadsheets/d/178NEJq5Vh4UBxlokOrfK53MxTmMpS3bq-y4m1cryUVg/edit#gid=446685093
  5. Приложението трябва да изкарва на екрана списък от редове. На всеки ред, разделени със запетаи, трябва да са изписани класът, номерът на ученика, неговите имена и резултатът от проверката на домашното. Резултатът е 0 или 1.
  6. Резултатът се сформира като се провери дали каченото приложение в домашно 1 отговаря правилно на 4-рите заявки, на които трябва да отговаря. Само и единствено ако приложението отговаря правилно на четирите заявки, се получава резултат 1.

Домашно 3 върху Тема 1 – 22 октомври 2017

  1. Краен срок 22 октомври 2017 23:59:59
  2. Да се промени разработената в домашно 2 програма така че да приема от комнадния ред като първи аргумент csv-то съдържащо връзките към приложенията и като втори аргумент csv-то, с което да се извърши проверката
  3. Програмата трябва да може да се изпълнява чрез
    1. ruby mp.rb csv_file fixture.csv

  4. Файлът fixture.csv съдържа хедър. Хедърът е от първия ред. В колоната с индекс 0 трябва да се съдържа резултатът, който очакваме да получим при изпълнението то точка 1 от домашно 1. В колоната с индекс 1 трябва да се съдържа резултатът, който очакваме да получим при изпълнението то точка 2 от домашно 1. Аналогична за колоните 2 и 3.
  5. Приложението трябва да изкарва на екрана списък от редове. На всеки ред, разделени със запетаи, трябва да са изписани класът, номерът на ученика, неговите имена и резултатът от проверката на домашното. Резултатът е 0 или 1.
  6. Резултатът се сформира като се провери дали каченото приложение в домашно 1 отговаря правилно на 4-рите заявки, на които трябва да отговаря. Само и единствено ако приложението отговаря правилно на четирите заявки, се получава резултат 1.

Тема 2 – RoR, RSpec, JSON, API, Web, XML

Да се разработи приложение за скрити, криптирани съобщения подобно на https://privnote.com/. Да се разработят тестове за него.

  1. Работа с модели, бази и съхранения.
  2. Разработка на RSpec тестове върху функционалността.
  3. Генериране на сигурно URL – криптиране, хеш, случайност. Съхранение на данните сигурно.
  4. Разработка на JSON API за приложението – възможност за създаване на съобщение чрез curl заявка. Работа с JSON документи.
  5. Да има възможност при плащане, човек да получи допълнителни функционалността от приложението. Плащането да е с PayPal.

Домашно 1 върху тема 2

  1. Краен срок 29 октомври 2017г, 23:59:59
  2. Да се разработи приложение качено на heroku и в хранилище в github
  3. Да се предаде връзка към приложението на heroku и връзка към хранилището в github. Двете връзка се изписват една след друга, всяка на нов ред във файл наречен Клас_Номер_ПървоИме_Фамилия.txt, където съответо клас, номер, първо име и фамилия са за конкретния ученик.
  4. Файлът да се предаде в хранилището software_engineering2017 в директорията chapter2/homework1/.
  5. Приложението да предоставя следната функционалност
    1. Отива се на началната страница на приложението, където има бутон и текстово поле.
    2. В текстовото поле се въвежда текст и се натиска бутонът.
    3. След натискане на бутона потребителят се пренасочва към страница на която е изписан един url адрес.
    4. Потребителят може да копира този url адрес и да отвори нова страница в браузъра. След като я отвори трябва да може да види съобщението написано в точка B.

Домашно 2 върху тема 2

  1. Краен срок 06 ноември 2017г, 02:00:00
  2. Към приложението от Домашно 1, тема 2 да се добави функционалност за приемане на пост заявки с данни предавани в JSON и XML формат. Приложението да се качин в същото хранилище и на същия heroku адрес както Домашно 1, Тема 2
  3. JSON функционалност
    1. приложението да може да пиема POST заявки на адрес
      1. за нечетните номера в класа адресът е /notes/api
      2. за четните номера в класа адресът е /messages/api
    2. Заявките са от вида
      curl -H "Content-Type: application/json" -X POST -d '{"message":"the value of the message"}' http://appdomainurl
    3. Като резултат от заявката да се върне url адресът на който може да се достъпи приложението в JSON формат с ключ url и стойност адресът на който да се достъпи приложението
      1. '{"url":"the url address of the message"}' 
  4. XML функционалност
    1. приложението да може да пиема POST заявки на адрес
      1. за нечетните номера в класа адресът е /notes/api
      2. за четните номера в класа адресът е /messages/api
    2. Заявките са от вида
      curl -H "Content-Type: text/xml" -X POST -d '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><message>the message value</message>' http://appdomain/api/login
    3. Като резултат от заявката да се върне резултат в ВАЛИДЕН XML формат. Резултатът да съдържа нод <url> със съдържание адресът, на който да може да се види създаденото съобщение. Пример <url>the url of the message</url>

Домашно 3 върху тема 2

Да се разработят rspec тестове за клас, конвертиращ римски от десетична в римска бройна система и обратно.

Сигнатурата на клас е следната

class RomeConverter

def to_rome int_arg

end

 

def to_dec string_arg

end

end

Да се разработи един RSpec, който да се казва RomeConverterSpec. Да се намира във файл spec/rome_converter_spec.rb. Да търси класът RomeConverter от ../lib

Всичко това да е в ново хранилище. Пътят към хранилището да се предаде тук до 02:00 на 06 декември. Ще бъде качена малко по-късно форма за предаване.

Целта на спековете е да проверят за правилното поведение на RomeConverter. Ако един RomeConverter не се държи правилно, трябва спекът да го покаже.

Форма за предаване https://goo.gl/forms/76wMDZ8XwzppipMS2

Домашно 4 върху тема 2

0. Краен срок – 13 декември 02:00. Формата е https://docs.google.com/forms/d/e/1FAIpQLSehsTCp-ZmRNvzSrhDRokPezywPzrIWAQisaDoKxScOPhRAog/viewform?usp=sf_link

  1. Да се разработи клас имплементираш RSA криптиране, следваща RSA алгоритъм. Класът трябва да има следната сигнатура и поведение
class RSA
   def initialize n, e, d
     #initializes this instance of RSA with a n,e and d variables of type int. 'n','e' are the public key and 'd' is the private one. This n,e,d should be used when encrypting and decrypting the message
   end
   
   def n
      #returns the value of 'n' passed in the initialize
   end
   
   def e
      #returns the value of 'e' passed in the initialize
   end
   
   def d
      #returns the value of 'd' passed in the initialize
   end
   
   def new_key
      #generates a new 'n','e' and 'd' values following the RSA algorithm. Returns a new array of three elements where the first element is 'n', the second is 'e' and the third is 'd'. Each time it is called a new key must be returned.
   end
   
   def encrypt message
      #encrypts the message passed. The message is of type string. Encrypts each symbol of this string by using its ASCII number representation and returns the encrypted message.
   end
   
   def decrypt message
      #decrypts the message passed. The message is of type string. Decrypts each symbol of this string Encrypts each symbol of this string by using its ASCII number representationand returns the decrypted message. 
   end 
end

2. Да се разработи spec с име RSA_spec.rb, който да проверява поведението на класа RSA

3. Да се предадът двата класа. Спекът е в директорията spec докато RSA.rb е в директорията lib.

Домашно 5 върху тема 2

  • Краен срок 20 Декември 2017 02:00
  • Да се изгради web приложение предоставящо възможност да се използва RSA класът.
  • Приложението да е качено на хероку.
  • Да се даде линк към приложението и линк към репото в тази форма – https://docs.google.com/forms/d/e/1FAIpQLScxYo6qXgjmYVQqMREKMVcD2ERdXxME_Dgc_iMG7BK7LS2npg/viewform?usp=sf_link
  • Приложението да отговаря на следните REST заявки
POST /rsas - създава нов ключ и връща id на този ключ

POST /rsas - създава нов ключ с конкретните стойности за n, e, d. Връзка id-то
    params: n, e, d

GET /rsas/:id - връща json представяне на ключа с идентификатор id. JSON-а съдържа три ключа n, e, d със стойности на съответните параметри

POST /rsas/:id/encrypt_messages/ - криптира съобщението подадено с параметъра и създава ново криптирано съобщение. Връща идентификатор
    params: message

GET /rsas/:id/encrypt_messages/:id - връща криптирано съобщение с дадения идентификатор. JSON съдържа един ключ message със стойност съобщението

POST /rsas/:id/decrypt_messages/ - декриптира съобщението подадено с параметър и създава ново дикриптирано съобщение на база параметъра.
    params: message

Домашно 6 върху тема 2

  • Краен срок 15 Януари 2017 02:00
  • Да се разработят тестове за контролерите на приложението написано в Домашно 5
  • Приложението да е качено на хероку.
  • Да се даде линк към приложението и линк към репото в тази форма – https://docs.google.com/forms/d/e/1FAIpQLScxYo6qXgjmYVQqMREKMVcD2ERdXxME_Dgc_iMG7BK7LS2npg/viewform?usp=sf_link

Упражениен тема 2, RSpec и Rails 10 Януари 2017

От б клас

1 – нов проект  rails _4.2.8_ new rsa_some
2 – добавяме rspec-rails към gemfile
3 – bundle install
4 – отиваме на https://github.com/rspec/rspec-rails
5 – rails generate rspec:install
6 – mkdir spec/models
7 – subl spec/models/rsa_spec.rb
8 – съдържане на rsa_spec.rb
RSpec.describe RSA do

it „does something“ do
expect(true).to eq true
end

end
9 – subl app/models/rsa.rb
class RSA

end
10 – rspec
11 – добавяме require_relative ‘../../app/models/rsa’, но не трябва

12 – в .rspec файл трябва да имаме ред –require rails_helper

13 – пускаме rake db:migrate защото имахме Warning

14 – добавяме rspec

it „encrypts“ do
r = RSA.new
expect(r.encrypt(„blabla“)).to eq „qwert“
end

15 – добавяме имплентация
class RSA

def encrypt message
„qwert“
end

end

16 – смятаме че имаме завършен RSA клас

17 – mkdir spec/controllers

18 – създаваме нов спек spec/controllers/rsas_controller_spec.rb
RSpec.describe RsasController do

it „gets by id“ do
get :show, id: 1
expect(response.body).to eq
„the content“
end

end

19 – създаваме нов контролер app/controllers/rsas_controller.rb

class RsasController < ApplicationController

end

20 – добавяме в config/routes resources :rsas, only: [:show]

21 – mkdir app/views/rsas/

 

От А клас

1 – rails new rsa1
2 – add to bunlder file of „rspec-rails“
3 – bundle install
4 – rails generate rspec:install
5 – mkdir spec/models
6 – subl spec/models/rsa_spec.rb
RSpec.describe Rsa do

it „encrypts“ do
expect(true).to eq true
end

end
7 – subl app/models/rsa.rb
class Rsa

end

8 – add –require rails_helper to .rspec

9 – rails db:migrate

10 – subl spec/models/rsa_spec.rb
RSpec.describe Rsa do

it „encrypts“ do
r = Rsa.new
expect(r.encrypt(„blabla“)).to eq „qwer“
end

end

11 – mkdir spec/conrollers
12 – subl spec/conrollers/rsas_controller_spec.rb

13 –
RSpec.describe RsasController do

it „shows an rsa“ do
get :show, params: {id: 1}
expect(response).to render_template :show
end

end

14 – subl app/controllers/rsas_controller.rb

class RsasController < ApplicationController

end

15 – add „type: :controller“ to RsasControllerSpec

16 – subl config/routes.rb
resources :rsas, only: [:show]

17 – mkdir app/views/rsas
18 – subl app/views/rsas/show.html.erb

19 – new spec

it „creates a new rsa“ do
post :create, params: {n: 5, e:7, d: 3}

expect(Rsa.count).to eq 1
end
20 – extend Rsa with < ActiveRecord::Base

21 -rails g migration create_rsas
db/migrate/20180110121127_create_rsas.rb

 

Тема 3 – Комуникация между процеси – Александър Спасов

Домашно 1 по Тема 3

Домашните са зададени от Александър Спасов. Предаването е по мейл към него до края на деня на 10 декември 2017.

Тема .. – JavaScript, Ajax, Angular 2, Jasmine

Да се разработи JavaScript интерфес, който работи с API-то предоставено Тема 2.

Тема ..- JavaScript, Canvas и векторна графика

Да се разработи прост редактор на векторна графика чрез Three.js, в който да се чертаят прости фигури. Да се разработи приложение за съхранение на тези прости фигури в SVG формат на сървър качен на Heroku.

Тема .. – node.js

Тема 4 JavaScript

canvas_experiment

some

Домашно 1 върху тема 4

По подобие на разработения в клас пример за ниво от JavaScript игра, да се разработи ново ниво. Да се качи в хранилището на предмета в директорията c5_javascript. Нивото да се реализира в един файл. Името на файла да е клас_номер_име_фамилия.js

Да се качи до 2018-01-24 02:00

Тема 4 JavaScript

Динамично добавяне на елементи към HTML

var newCanvas = document.createElement(„canvas“);
newCanvas.id = „heart1“;
newCanvas.width = „300“;
newCanvas.height = „300“;
document.body.appendChild(newCanvas);

var newCanvas = document.createElement(„canvas“);
newCanvas.id = „heart2“;
newCanvas.width = „300“;
newCanvas.height = „300“;
document.body.appendChild(newCanvas);

var newCanvas = document.createElement(„canvas“);
newCanvas.id = „heart3“;
newCanvas.width = „300“;
newCanvas.height = „300“;
document.body.appendChild(newCanvas);

var newCanvas = document.createElement(„canvas“);
newCanvas.id = „points“;
newCanvas.width = „80“;
newCanvas.height = „80“;
document.body.appendChild(newCanvas);

Дневник за оценяване, домашни и други неща

Матерали от занятията, които не са в github

Хранилище на целия код