http://gpashev.com § georgepashev@uni-plovdiv.bg
Този курс се фокусира върху приложението на компютърна лингвистика в областта на биоинформатиката, като се разглеждат техники за обработка на естествен език и машинно обучение, приложими в анализа на биологични данни. Курсът съчетава теоретични знания с практически умения в програмиране на Python и Rust, като изследва интеграцията на тези езици в биоинформатични приложения.
00001. Въведение в Компютърната Лингвистика и Биоинформатика
· Основни понятия и приложения
· Примерен код: Обработка на текстови данни с Python
00002. Машинно Обучение в Биоинформатиката
· Основи на машинното обучение
· Примерен код: Създаване на базов класификатор в Python
00003. Естествен Езиков Обработка (NLP) и Геномни Данни
· NLP техники за анализ на геномни последователности
· Примерен код: NLP алгоритми в Rust
00004. Биоинформатични Бази Данни и Тяхната Интеграция
· Работа с биологични бази данни
· Примерен код: Интегриране на бази данни в Python
00005. Използване на GPT-4 и LLAMA2 за Анализ на Биологични Данни
· Приложения на модели за естествен език в биоинформатиката
· Примерен код: Интегриране на GPT-4 API в Python
00006. Развитие на Уеб и Десктоп Интерфейси за Биоинформатични Приложения
· Основи на уеб и десктоп програмирането
· Примерен код: Създаване на прост UI в Rust
00007. Проектна Работа и Научно Писане
· Техники и методи за разработване на научни публикации
· Разработване на проектни идеи и начало на проектната работа
Студентите работят в малки групи, разработвайки проект, който включва създаване на чат бот, използващ GPT-4 API, LLAMA2, или машинно обучение с Python и sklearn. Всеки проект включва научна публикация и разработка на потребителски интерфейс.
Възможно е студентите да изберат да разработват само обзорно-научната част на проекта, без практическата, ако не се чувстват достатъчно силни в областта на разработката на приложения. В такъв случай, максималната оценка, която могат да получат, е Много Добър (5).
· Упражнение: Анализиране и обработка на текстови данни с Python. Студентите трябва да напишат скрипт за извличане на информация от научни публикации, свързани с биоинформатиката.
· Упражнение: Създаване на базов класификатор в Python за разпознаване на видове ДНК последователности. Студентите използват предоставени данни за трениране на модела.
· Упражнение: Имплементиране на NLP алгоритми в Rust за анализ на геномни последователности. Студентите трябва да адаптират традиционни NLP методи за работа с генетичен код.
· Упражнение: Интегриране на биологични бази данни в Python програма. Студентите създават интерфейс за достъп и анализ на данни от биоинформатични бази данни.
· Упражнение: Работа с GPT-4 API или LLAMA2 за генериране на предсказания или анализи въз основа на биологични данни. Студентите разработват прототип на приложение, използващо тези модели.
· Упражнение: Създаване на прост уеб или десктоп базиран UI в Rust, който да показва резултати от биоинформатични анализи. Студентите трябва да интегрират своя код в потребителски интерфейс.
· Упражнение: Начална разработка на проекта и написване на научен обзор за избраната тема. Студентите трябва да определят обхвата на своя проект и да изготвят план за научна публикация.
Тези упражнения са насочени към развитие на практически умения и подготовка за финалния проект, като същевременно се засилва теоретичната основа на дисциплината.
Литература:
1. Mount, D. W. (2004). Bioinformatics: Sequence and Genome Analysis. Cold Spring Harbor Laboratory Press.
2. Pevsner, J. (2015). Bioinformatics and Functional Genomics. Wiley-Blackwell.
3. Bird, S., Klein, E., & Loper, E. (2009). Natural Language Processing with Python. O’Reilly Media.
4. Klabnik, S., & Nichols, C. (2019). The Rust Programming Language. No Starch Press.
5. McKinney, W. (2018). Python for Data Analysis. O’Reilly Media.
6. Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow. O’Reilly Media.
Георги Пашев се включва в инициативата за разпространяване на типично българското начертание на кирилски шрифтове.
Повече за това какво наричаме българска кирилица можете да прочетете в сайта на инициативата "За Българска Кирилица" или в следната статия от Списание 8.
Накратко кирилски шрифтове с типично българско начертание се използват най-масово и са типични за България. Отличават се със по-ръкописен тип начертание на малките букви и някои от големите, за разлика от кирилските шрифтове които са типични за Русия, където малките букви са умалено копие на големите.
Поради по-голямото разнообразие на форми, българската кирилица е по-лесна и приятна за четене.
В последно време, тя става все по-често използвана и предпочитана.
Вмъкнете следното във секцията <header> на вашата уеб страница:
...<header> <style> @font-face { font-family: bgcyrillic; src: url('https://bgkalendar.com/fonts/notoserif-regular.php'); } * { font-family: bgcyrillic; } </style> </header> ... |
Здравейте,
Предполагам, че много от вас сте се сблъсквали с добре познатия проблем - за кого да гласувате. Ако не можете да изберете, понеже мразите всички участници и не намирате достоен кандидат или тези, които харесвате "нямат реален шанс", според социолозите, можете да приложите стратегия "теглене на жребий чрез отчитане на коефициент на омраза за всеки от кандидатите.
Тук представям имплементация на алгоритъм на Python, която отчита коефициентите на омраза към отделни кандидати в списъка и "стреля" по мишени в "стрелбище", с изтеглени случайни числа. Вероятността за попадане в мишена на дадена партия, е обратно пропорционална на "омразата" към нея.
Можете да си "поиграете" с коефициентите и кода тук: https://onlinegdb.com/HJhDkA3X_
Ето го алгоритъма (коефициентите на омраза отразяват моето мнение). При максимален коефициент на омраза 1000, съответната партия се изключва от избора и не участва изобщо в него. При мен, това е партия ГЕРБ.
import random
import operator
from random import randint
from random import seed
# списък на партиите и коефициентите на омраза на всяка
parties = (
{"name": "BSP", "hate": 95},
{"name": "GERB", "hate": 1000},
{"name": "DPS", "hate": 900},
{"name": "Slavy Trifonov", "hate": 150},
{"name": "DB", "hate": 40},
{"name": "Vazrazhdane", "hate": 40},
{"name": "Volya - NFSB", "hate": 455},
{"name": "VMRO", "hate": 455},
{"name": "ATAKA", "hate": 55},
{"name": "MUTRI VYN", "hate": 43},
{"name": "REPUBLIKANCI", "hate": 570},
{"name": "KOD", "hate": 300},
{"name": "ABV - MANGAROV", "hate": 30},
{"name": "Pryaka demokraciq - Klissarov", "hate": 20},
{"name": "BG LYATO - Cherepa", "hate": 400},
)
# списъците, използвани от алгоритъма за реализиране на "стрелбище"
strelbishte = []
partii_v_strelbishte = []
# речник с ключове - име на партия и стойност - попадения, в който ще се пазят попаденията след приключване на алгоритъма
akumulirani_brojki = {}
seed(a=None, version=2) # правене на псевдослучайния избор "наистина случаен" с избор на seed - текущо системно време
# инициализация на стрелбището и речника
for party in parties:
count = 1000 - party["hate"]
if count == 0:
continue
akumulirani_brojki[party["name"]] = 0
partii_v_strelbishte += [party["name"]] * count
strelbishte += [0] * count
# разбъркване на секторите и фрагментация на партийните зони в стрелбището и инициализация на броя мишени в него
random.shuffle(partii_v_strelbishte)
broj_v_strelbishte = len(partii_v_strelbishte)
# извършване на случайния избор (стрелбата в стрелбището)
seed(a=None, version=2)
for i in range(0, 3000):
izteglenoChislo = randint(0, broj_v_strelbishte)
strelbishte[izteglenoChislo] += 1
akumulirani_brojki[partii_v_strelbishte[izteglenoChislo]] += 1
#сортиране на партиите в речника по брой попадения в низходящ ред
sorted_akumulirani_brojki = sorted(akumulirani_brojki.items(), key=operator.itemgetter(1), reverse=True)
# отпечатване на попаденията за всяка партия, вече сортирано
print(sorted_akumulirani_brojki)
Насоки за провеждане на упражненията по ППМУ за задочни студенти
Здравейте, колеги,
Онлайн курса за упражненията ви по дисциплината ППМУ е достъпен тук: (https://uroci.online/course/view.php?id=12)
PDF ръководство за упражненията:
Portable версия на програмна среда:
1. Упражнение: Сървър Express Калкулатор
var express=require('express');
var app=express();
app.get('/', function(req, res){
res.send('Hello World!');
});
app.get('/delete/', function(req, res){
//console.log(result);
res.setHeader('Access-Control-Allow-Origin', '*');
try{
var sqlite3=require("sqlite3").verbose();
var db=new sqlite3.Database("EMSG.db");
db.serialize(function(){
console.log("17");
db.run("DELETE FROM LOG;", function(){
console.log("19");
db.close();
res.send(JSON.stringify({status: "OK"}));
});
});
//db.close();
}catch(error){
console.log({error : error});
}
});
var logResult=function(result, request){
//console.log(result);
try{
var sqlite3=require("sqlite3").verbose();
var db=new sqlite3.Database("EMSG.db");
db.serialize(function(){
db.run("CREATE TABLE "+
" if not exists "+
" LOG("+
"ID INTEGER PRIMARY KEY AUTOINCREMENT, "+
" txt text not null, "+
" request text not null,"+
" time datetime default current_timestamp"+
" );"
);
var stmt=db.prepare("INSERT INTO LOG(txt, request) VALUES(?, ?)");
stmt.run(JSON.stringify(result), JSON.stringify(request));
stmt.finalize();
});
db.close();
}catch(error){
console.log({error : error});
}
}
app.get('/one/', function(req, res){
var result={};
try{
res.setHeader('Content-Type', 'application/json');
res.setHeader('Access-Control-Allow-Origin', '*');
var a=parseInt(req.param("a"));
var b=parseInt(req.param("b"));
console.log(typeof a);
console.log(typeof b);
if(typeof a !=='number' || typeof b !=='number' ){
result={error: "Wrong format"};
res.send(JSON.stringify(result));
return;
}
var dejstvie=req.param("dejstvie");
switch(dejstvie){
case 'add':
result={dejstvie: 'plus', res: a+b};
break;
case 'sub':
result={dejstvie: 'minus', res: a-b};
break;
case 'mul':
result={dejstvie: 'po', res: a*b};
break;
case 'div':
result={dejstvie: 'deleno', res: a/b};
break;
default:
result={error: "No such action."};
break;
}
}catch(e){
result={error: e};
}
logResult(result, {a: a, b: b, dejstvie: dejstvie});
res.send("{\"result\": "+JSON.stringify(result)+"}");
});
app.get('/log/', function(req, res){
//res.setHeader('Content-Type', 'application/json');
res.setHeader('Access-Control-Allow-Origin', '*');
response=[];
try{
var sqlite3=require("sqlite3").verbose();
var db=new sqlite3.Database("EMSG.db");
db.serialize(/*function(){
db.run("CREATE TABLE "+
" if not exists "+
" LOG("+
"ID INTEGER PRIMARY KEY AUTOINCREMENT, "+
" txt text not null, "+
" request text not null,"+
" time datetime default current_timestamp"+
" );"
);
},*/
function(){
console.log("116");
db.each("SELECT * from LOG;",
function(err, row){
console.log(typeof err);
console.log(err);
if(err!= null){
console.log("119");
//console.log("problem: "+err);
response={error: err};
//console.log(res);
//res.send(JSON.stringify(response));
return;
}
//console.log(err);
console.log("131");
response.push(row);
}
,
function(){
console.log("136");
console.log(response);
console.log("before send");
res.send(JSON.stringify(response));
db.close();
}
);
//res.send(JSON.stringify(response));
}
);
}catch(error){
console.log({error : error});
res.send(JSON.stringify({error : error}));
}
});
var server=app.listen(8087, function(){
var host=server.address().address;
var port=server.address().port;
console.log("Listening at http://%s:%s", host, port);
});
2. Клиентско приложение.
<html>
<head>
<title>Елка</title>
<meta charset="utf-8">
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<style>
input[type="number"] {
max-width:30%;
min-width:20%;
}
.label-a{
min-width:10%;
max-width:15%;
}
</style>
</head>
<body>
<div class="panel panel-primary">
<div class="panel-heading">
Супер яка елка
</div>
<div class="panel-body">
<table class="table table-hover">
<tr>
<td ><div class="label-a">a</div></td><td><input type="number" class="form-control" id="input_a" name="input_a"></td>
<td ><div class="label-a">b</div></td><td><input type="number" class="form-control" id="input_b" name="input_b"></td>
</tr>
<tr>
<td colspan="2">
<select class="form-control" id="dejstvie" name="dejstvie">
<option value="add">събиране</option>
<option value="sub">изваждане</option>
<option value="div">деление</option>
<option value="mul">умножение</option>
</select>
</td>
<td colspan="2">
<input class="btn btn-primary" type="button" id="buton4e" name="buton4e" value="Калкулирай">
<input class="btn btn-primary" type="button" id="delete" name="delete" value="Изтрий">
</td>
</table>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading">
Лог на действията
</div>
<div class="panel-body" id="logDiv">
</div>
<div class="panel-footer" id="logResult">
</div>
</div>
<script>
function aaaa(){
///console.log("Hello.");
var val_a=$("#input_a").val();
var val_b=$("#input_b").val();
var d=$("#dejstvie").val();
//console.log({a: val_a, b: val_b, d: d});
var url="http://localhost:8087/one/?a="+val_a+"&b="+val_b+"&dejstvie="+d;
//alert(url);
$.ajax({
url: "http://localhost:8087/one/?a="+val_a+"&b="+val_b+"&dejstvie="+d,
dataType: "text",
//jsonpCallback: "logResults",
error: function (request, error) {
alert("AJAX Call Error: " + error);
},
success: function (response) {
var resp = JSON.parse(response);
//alert(response);
//alert(resp.result.res);
$("#logResult").html("Result: "+resp.result.res);
},
});
///log results
$.ajax({
url: "http://localhost:8087/log/",
dataType: "text",
//jsonpCallback: "logResults",
error: function (request, error) {
alert("AJAX Call Error: " + error);
},
success: function (response) {
//$("#logResult").text("");
var resp = JSON.parse(response);
var new_text="";
for(i=0; i<resp.length; i++){
new_text+="<div>";
new_text+="request: "+resp[i].request+"<br/>";
new_text+="time: "+resp[i].time+"<br/>";
new_text+="</div>";
}
$("#logDiv").html(new_text);
//$("#logResult").text($("#logResult").text()+new_text);
},
});
};
function logResults(data){
//console.log(data);
alert(data);
};
$(document).ready(function(){
aaaa();
$("#delete").on('click', function(){
$.ajax({
url: "http://localhost:8087/delete/",
dataType: "text",
error: function (request, error) {
alert("AJAX Call Error: " + error);
},
success: function (response) {
$("#logResult").text("");
var res=JSON.parse(response);
if(typeof res.status == "undefined"){
$("#logDiv").html("Кофти");
}else if(res.status=="OK"){
$("#logDiv").html("OK");
}else{
$("#logDiv").html("Проблеми с базата данни");
}
//$("#logResult").text($("#logResult").text()+new_text);
},
});
});
$("#buton4e").on('click', function(){ aaaa();} );
});
</script>
</body>
</html>
За контакти:
ас. д-р инж. Георги Пашев
e-mail: georgepashev@uni-plovdiv.bg
Материали за упражненията по СТ-2 за спец. СТД - задочни (3.к.) можете да изтеглите от тук:
https://drive.google.com/drive/folders/1p09rzMizh62_6ikYnaN_qP6nnNAVilyB?usp=sharing
Линк за сваляне на Netbeans Portable:
https://www.softpedia.com/get/PORTABLE-SOFTWARE/Programming/NetBeans-IDE-Portable.shtml
гл. ас. д-р инж. Г. Пашев
Упражнения по Компютърна лингвистика за специалност Информатика 4. курс, задочна и редовна форма на обучение.
при гл. ас. д-р инж. Георги Пашев
e-mail: georgepashev@uni-plovdiv.bg
Линк към Google Classroom на дисциплината: ( https://classroom.google.com/c/MTY4OTIzMzU0Njk0?cjc=rwht7yj )
Линк към теми за проекти от упражнения: (https://docs.google.com/document/d/1uEz3dke1fuo55sFK2Dp0hwc-MTDnt5lHjJaoo5ZdFwU/edit?usp=sharing)
Упражнения, теми:
Упражнение 1: Крайни автомати
1. Създайте парсър на удобен за вас програмен език (на упр. ще бъде показан пример с езика PHP), който да имплементира краен автомат, който се подава като параметър на парсващата функция/процедура, заедно с текст за парсване и връща информация дали текстът е парснат успешно (отговаря на крайния автомат), или не.
2. Използвайки 1, създайте краен автомат, който да парсва изречения от този тип:
ab, aabb, abbb, aaaab, .... (променлив брой a...b...)
3. Използвайки 1, създайте парсър на дата във формат "DD.MM.YYг.".
Упражнение 2: Регулярни изрази
1. Като използвате помощния файл за упражненията и др. материали онлайн, запознайте се със синтаксиса на регулярните изрази.
2. Запознайте се с PHP функции preg_match, preg_match_all, preg_replace.
3. Като използвате preg_match_all, напишете PHP скрипт, който намира в текст всички дати във формат DD.MM.YYYY, като отделя дните, месеците и годините в подходящи подмасиви и генерира изходящ текст от рода:
Намерена е дата 15.01.2018г, денят е 15 подред на месец 01 от година 2018г.
4. Като използвате някои от функциите, напишете PHP скрипт, който намира в текст всички дати във формат DD.MM.YYYY, и генерира подобен на този текст, в който датите са в американски формат MM/DD/YYYY.
Например, текста:
На 24.09.2018г. се проведе упражнение по Компютърна лингвистика
да се превежда като
На 09/24/2018г. се проведе упражнение по Компютърна лингвистика
5. Напишете PHP скрипт, който намира в текст всички URL адреси по http/https/ftp адресна схема и ги показва в списък.
Задача: крос транслиране на командни компютърни езици с регулярни изрази. Примерен крос транслатор може да свалите от тук:
https://www.dropbox.com/s/znhxozltwq30kxe/translator.php?dl=0
Упражнение 3. Контекстно независими граматики
Използва се инструмента Grammophone, линк към който може да намерите в помощния файл за упражненията по-долу.
1. Решете задачите от темата за Контекстно независими граматики в помощния файл.
2. Допълнителни задачи:
2.1. Напишете контекстно независима граматика, която да парсва успешно програмен текст на "мини програмен език" (който за целта на упражненията ще бъде наречен PeUScript), на който е написан следния пример:
def A=0 as Int
def B=12.0 as Float
def I=0 as Int
while I<100 or not A>7000 do
print "Stojnostta na I e "+I+"\n"
A=I+B
I=I+1
print "Stojnostta na B e"+B+"\n"
if B <> 12.0 then
break
endif
done
2.2. Напишете с помощта на езици PHP и Javascript (или други удобни за вас) кространслатор и среда на изпълнение на PeUScript , като първо преведете програмния текст на Javascript и стартирайте така получения JavaScript код в браузъра.
Примерен проект за Bison & Flex (инсталирани в Линукс/Убунту програмна среда): Свали от тук
Виртуална машина за VirtualBox с готови инсталирани пакети за работа свалете от тук:
https://www.dropbox.com/s/ipki0tirv9qn2z1/xubuntu.rar?dl=0
Компилацията се извършва с последователно извикване на командите:
flex -o calc.flex.cc calc.lex
bison calc.yy
cc -fpermissive calc.tab.cc calc.flex.cc -Wall -lm -o rpccalc
Еквиваленти на BISON и FLEX за други езици и програмни среди:
1. Parsimonious за Python
За употреба на пакета се изисква Python конзола. Портативен (portable) вариант за Windows на такава с предварително инсталиран пакет на Parsimonious може да изтеглите от тук:
(https://www.dropbox.com/s/v96u1wpgi8q4p3g/Portable%20Python%203.7.0%20x64.rar?dl=0)
Работещ пример на елементарна граматика за инструмента:
from parsimonious.grammar import Grammar
grammar = Grammar(
"""
bold_text = bold_open text bold_close
text = ~"[A-Z 0-9]*"i
bold_open = "(("
bold_close = "))"
""")
print(grammar.parse('((bold stuff))'))
Конзолата на Python се стартира от разархивирания архив от папката: App\Python и файла е python.exe
При нужда от инсталация на допълнителен пакет в папката App\Python се стартира Windows конзола и се изпълнява командата:
python -m pip install <package name>
Пример, парсващ елементарен израз:
from parsimonious.grammar import Grammar
grammar = Grammar(
"""
exps = exp op exp
exp = num / expparen
expparen = lparen num rparen
op = ~"[\+\-]"i
lparen = "("
rparen = ")"
num = ~"[0-9]+"i
""")
print(grammar.parse('12+23'))
2. PLY за Python (напълно функционален заместител на bison/flex)
2.1. Инсталирайте PLY в конзолата с изпълнение на командата в командната конзола:
python -m pip install ply
2.2. Създайте в директорията App\Python файл calclex.py, със следното съдържание:
# ------------------------------------------------------------
# calclex.py
#
# tokenizer for a simple expression evaluator for
# numbers and +,-,*,/
# ------------------------------------------------------------
import ply.lex as lex
# List of token names. This is always required
tokens = (
'NUMBER',
'PLUS',
'MINUS',
'TIMES',
'DIVIDE',
'LPAREN',
'RPAREN',
)
# Regular expression rules for simple tokens
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_LPAREN = r'\('
t_RPAREN = r'\)'
# A regular expression rule with some action code
def t_NUMBER(t):
r'\d+'
t.value = int(t.value)
return t
# Define a rule so we can track line numbers
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
# A string containing ignored characters (spaces and tabs)
t_ignore = ' \t'
# Error handling rule
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
# Build the lexer
lexer = lex.lex()
2.3 Създайте в директорията App\Python файл yacc.py, със следното съдържание:
# Yacc example
import ply.yacc as yacc
# Get the token map from the lexer. This is required.
from calclex import tokens
def p_expression_plus(p):
'expression : expression PLUS term'
p[0] = p[1] + p[3]
def p_expression_minus(p):
'expression : expression MINUS term'
p[0] = p[1] - p[3]
def p_expression_term(p):
'expression : term'
p[0] = p[1]
def p_term_times(p):
'term : term TIMES factor'
p[0] = p[1] * p[3]
def p_term_div(p):
'term : term DIVIDE factor'
p[0] = p[1] / p[3]
def p_term_factor(p):
'term : factor'
p[0] = p[1]
def p_factor_num(p):
'factor : NUMBER'
p[0] = p[1]
def p_factor_expr(p):
'factor : LPAREN expression RPAREN'
p[0] = p[2]
# Error rule for syntax errors
def p_error(p):
print("Syntax error in input!")
# Build the parser
parser = yacc.yacc()
while True:
try:
s = input('calc > ')
except EOFError:
break
if not s: continue
result = parser.parse(s)
print(result)
2.4. Стартирайте парсъра с изпълнение на Windows конзолната команда:
python yacc.py
4. Търсене на отношение в текст
Да се състави алгоритъм (и да се имплементира на PHP), който автоматизирано намира отношения на пишещия към търсени термини в текста, като се създадат примерни речници:
Алгоритъмът да е достатъчно съобразителен, за да открива инвесии (напр. чрез откриване на ключова дума "не").
Примерно решение тук: [https://www.dropbox.com/s/uw5hoaxmepnoztp/analizator_otnoshenie.php?dl=0]
5. Чат ботове
Примерен чат бот, разработван по време на упражненията, който умее да прави изводи спрямо PROLOG базирана база знания:
http://gp.gpashev.com:93/CrossTranslatorWeb/indexPrologBot.php
(Изходния код се предоставя по време на упражненията).
Помощен файл за упражненията свалете от тук
Задачи за подготовка за Контролна работа № 2
при ас. д-р инж. Георги Пашев
контакти: georgepashev@gmail.com; http://gpashev.com
Зад. 1. Да се напише BASH скрипт, който изписва на потребителя "Моля, въведете 0 за кръг и 1 за елипса" и в зависимост от въведеното от потребителя число стартира подпрограма (функция) съответно за въвеждане на необходимите променливи и изчисляване и извеждане на лицето. С допълнителна команда (напр. php или awk) да се подсигури изчисление на дробни числа (понеже стандартната команда let в BASH поддържа работа само с цели числа).
#!/bin/bash
function calc_circle()
{
echo "Vyvedete r"
read r
echo $( awk "BEGIN {print 3.14*$r*$r}" )
}
function calc_elipse()
{
echo "Vyvedete a"; read a; echo "Vyvedete b"; read b;
echo $( awk "BEGIN {print 3.14*$a*$b}" )
}
echo "Molya, vyvedete 0 za kryg ili 1 za elipsa"
read Case
case $Case in
0)
calc_circle
;;
1)
calc_elipse
;;
*)
echo "Obyrkal si, brat"; exit 1;
;;
esac
Зад. 2. Да се напише BASH скрипт, който в директорията /etc намира всички *.sh файлове и копира в нова директория shells всички от тях, които са собственост на юзър root.
#!/bin/bash
LIST=$( find /etc -name "*.sh" -type f )
if [ -e shells ]
then
rm -rf shells
fi
mkdir shells
for i in $LIST
do
OWNER=$( ls -l $i | awk '{print $3}' )
if [ "$OWNER" == "root" ]
then
cp $i shells/
fi
done
Зад. 3. Да се напише BASH скрипт, който реализира функция за сумиране на числа, функция за намиране на произведение на числа и от командния ред, в зависимост от входните параметри да извиква едната или другата функция.
#!/bin/bash
function sum()
{
let S=0
for i in $*
do
let S+=i
done
echo $S
}
function mul()
{
let S=1
for i in $*
do
let S*=i
done
echo $S
}
echo "Result: $( $* )"
Зад. 4. Да се напише BASH скрипт, който реализира функция killps, която убива процеси с име name, които са собтвеност на потребител user и се извиква така: killps name user и пише в out.log редове с ID, name на убития процес и дата и час на убиването.
#!/bin/bash
function killps()
{
name=$1
user=$2
PSs=$( ps aux | grep $name | grep ^$user | grep -v zad4.sh | grep -v grep | awk '{print $2}' )
for i in $PSs
do
curPSName=$( ps aux | grep $i | awk '{print $11}' )
kill $i
if [ $? -eq 0 ]
then
curDate=$( date )
echo "$i $curPSName $curDate" >> out.log
fi
done
}
killps $*
Литература:
Учебни материали за Контролна 1 по ОС при ас. д-р инж. Георги Пашев:
Задача 1:
Да се напише команден ред, който:
Решение:
mkdir one
cd one
ls ~ | sort > 1.txt
ln -s 1.txt 2.txt
Да се напише команден ред, който:
Решение:
mkdir two
cd two
find /etc -name "*.conf" -type f | sort > 1.txt
ln -s 1.txt 2.txt
mkdir 1
cd 1
find /etc -name "*.conf" -type f -exec cp {} . \;
find . -name "*.conf" -type f -exec chmod g+x {} \;
Примерни тестови въпроси:
От така дадения команден ред по-долу определете:
giorgio@giorgio-VirtualBox:~$ ls -l
total 248
drwxr-xr-x 7 giorgio giorgio 4096 мар 6 13:37 Desktop
drwxr-xr-x 2 giorgio giorgio 4096 дек 7 2015 Documents
drwxr-xr-x 4 giorgio giorgio 4096 мар 17 14:37 Downloads
-rw-r--r-- 1 giorgio giorgio 8980 дек 7 2015 examples.desktop
drwxr-xr-x 2 giorgio giorgio 4096 дек 7 2015 Music
-rw------- 1 root root 201377 яну 18 2016 nohup.out
drwxr-xr-x 2 giorgio giorgio 4096 дек 7 2015 Pictures
drwxr-xr-x 2 giorgio giorgio 4096 дек 7 2015 Public
drwxr-xr-x 2 giorgio giorgio 4096 дек 7 2015 Templates
drwxr-xr-x 2 giorgio giorgio 4096 дек 7 2015 Videos
giorgio@giorgio-VirtualBox:~$
1. Кои са файловете, които нямат никакви права за изпълнение: examples.desktop; nohup.out;
2. Кои файлове не са от тип директория: examples.desktop; nohup.out;
3. Как се казва потребителят, който е собственик на файла nohup.out: root;
4. Как може да се добавят права за изпълнение за всички юзъри за nohup.out: chmod a+x nohup.out;
5. Напишете команда за изтриване на всички .out файлове в текущата директория: rm -f *.out
За въпроси:
д-р инж. Георги Пашев: georgepashev (at) gmail.com; georgepashev (at) uni-plovdiv.bg
Бързи връзки: Оценяване |
||
Достъп до онлайн материали чрез платформата Google Classroom:
Обща информация по отношение на оценяването:
За специалност СТД (редовни и задочни), оценяването става чрез:
Курсови проекти (отделни) за двете дисциплини ДПМУ, ППМУ. Темите за КП по ППМУ се избират от списък тук. Темите за КП по ДПМУ могат да бъдат избрани от тук.
Минимални изисквания за КП:
1. Работа с БД sqlite3;
2. Минимум 2 activities;
Бонус точки се дават за:
1. Работа с мрежови заявки, многонишкова работа;
2. Работа със специфичен хардуер на мобилното устройство: bluetooth, gsm modem (sms, data call);
3. Работа с asyncTask, Map, ConcurrentMap, List, ArrayList, ConcurrentArrayList, др.
4. GPS и Google Maps компонента;
Оценките от упражнения се поставят по време на последните часове от триместъра или по време на изпита от ас./гл.ас. Крайните оценки по съответната дисциплина се поставят от титуляра на дисциплината по време на изпита.
За специалност СИ (задочни), оценяването става чрез:
1) Курсови задачи, изпълнени по време на третата част от 5 у.ч. упражнения; ИЛИ
2) Решаване на тест по време на третата част от 5 у. ч. упражнения;
Оценките се поставят по време на третата част от 5 у.ч. упражнения и могат да бъдат коригирани от титуляр на дисциплината.
За специалност СИ (редовни), оценяването става чрез:
Курсови проекти по МП. Темите за КП по МП се избират от списък тук.
Оценките се поставят по време на последната седмица на триместъра и могат да бъдат коригирани от титуляр на дисциплината.
Списък с теми за курсофи проекти:
Списък: https://1drv.ms/w/s!ArI6oidlkCxomX5L9joU9XloqK1k
Разработвани курсови проекти по време на упражненията (Примерни курсови проекти):
https://drive.google.com/drive/folders/0B2Sg-oFX9K4NYW9XSUFnSGdRZGM?usp=sharing
Подготовка за провеждане на упражненията:
1) Андроид студио (Сваляне на архив и разархивиране):
https://drive.google.com/file/d/1QuYudYdE6_D29q779fOU60SArgsajEIj/view?usp=sharing
След сваляне и изтегляне се стартира bin/studio64.exe
2) Андроид SDK (Сваляне на архив и разархивиране в отделна директория):
Конфигурирано SDK може да изтеглите от тук: https://drive.google.com/open?id=1l8v8ADIblCO2xXCtjVofhS9rzYgkVp4r
3) Настройване на Андроид студио за локацията на Android SDK.
File -> Sync Project with Gradle Files
Ако няма настроена папка за локация на Android SDK, ще поиска посочването на пътя до Android SDK. За вече инсталирани среди чрез стандартен инсталатор, най-често SDK се намира в "C:\Users\fmi\AppData\Local\Android\sdk".
Промяна на локацията на SDK става в Tools -> SDK Manager -> Android SDK Location: Edit и новата папка се задава в отворилия се диалогов прозорец.
4) Настройване на виртуално устройство
Tools -> AVD Manager -> + Create Virtual Device. Избира се Phone, Pixel 2XL. При нужда се изтегля API (29, 28 напр.). Емулаторът се инсталира в SDK папката; При изтегляне на SDK от линка по-горе, той вече е в нея и няма нужда от инсталация на емулатор.
Учебна литература и полезни връзки
Най-актуална версия на Android Studio за разработка можете да свалите от тук.
Проекти, работени по време на упражненията, можете да видите тук: https://drive.google.com/drive/folders/0B2Sg-oFX9K4NYW9XSUFnSGdRZGM?usp=sharing
С цел подпомагане на работата за упражненията е създаден базов проект за Android Studio, който можете да свалите от тук.
Книга за самоподготовка: "Практическо програмиране за Android" Денис Колисниченко, второ преработено и допълнено издание, изд. "Асеневци", ISBN 978-954-8898-76-8;
Всеки студент задължително прави Курсов проект.Следва списък с примерни курсови проекти, от които студентите могат да избират, а биха могли да предлагат други теми с подобна трудност и при преценка на преподавателя, да бъдат одобрени.
№ |
Разпределен на |
Проект |
1 |
|
Да се създаде част от дизайн за мобилно приложение за електронен магазин за оръжия. Да се състои от следните activities: Главно Activity, което реализира главно меню със следните менюта: Категории, Артикули, Склад; като тези подменюта имат следните елементи: Категории -> Преглед, Изтриване, Добавяне; Артикули -> Преглед, Изтриване, Добавяне; Склад -> Доставка, Бракуване, Продажба. Да се създаде Activity, което да дава интерфейс за реализация на Преглед по категории с филтър по написано от потребител име на категория, както и написано от потребител име на артикул. Да има подходящ бутон с 2 състояния с текст “Артикули, които не са на склад“, както и табличен изглед със самите артикули с колони „Номер“, „Име артикул“ „Категория“ „Единична цена“. |
2 |
|
Да се създаде част от дизайн за мобилно приложение за електронен магазин за оръжия. Да се състои от следните activities: Изтриване нa артикул. Да има подходящ бутон с 2 състояния с текст “Артикули, които не са на склад“, както и табличен изглед със самите артикули с колони „Номер“, „Име артикул“ „Категория“ „Единична цена“. На всеки от редовете да има предвиден CheckBox, който ако е избран при натискане на бутон „Изтрий“ да изтрива съответния артикул. Да има и Activity, което да може да се ползва за добавяне/редакция на един артикул, реализиращо форма с подходящи входни widgets за „Номер“, „Име артикул“, „Категория“, „Единична цена“. |
3 |
|
Да се създаде част от дизайн за мобилно приложение за електронен магазин за оръжия. Да се състои от следните activities: Бракуване, в което да има подходящ интерфейс за потребителя да бракува даден артикул в определени количества в склада. Да има вид на форма, в която в TableLayout с възможност за страниране или да могат да се скролват и избират чрез кликване на CheckBox във всеки ред на TableLayout-то артикули (може избраните да са повече от един), както и да може да се задава брой на артикулите, които ще се бракуват. Второто Activity да реализира „Изглед на склад“ , в което да има TableLayout, което да е със следните колони „Име артикул“, „Категория артикули“, „Наличност“. За удобство на потребителя в същото Activity по-долу да има форма за бързо добавяне/премахване на артикули в склада, като има текстово поле, което при избран ред от TableLayout да се попълва с името на избрания артикул, както и текстово поле за въвеждане на числа, както и два бутона, съответно: „Добавяне“ и „Премахване“. |
4 |
|
Да се създаде част от дизайн за мобилно приложение за електронен магазин за оръжия. Да се състои от следните activities: Главно Activity, което да реализира подходящ интерфейс за потребителско вписване с Username и Password. Да има подходящ бутон с 2 състояния, който ако е кликнат, отдолу да се появяват допълнителни елементи във формата, които да позволяват възстановяване на забравена парола, като e-mail с който е регистриран и името на потребителя, с което е регистриран. Второто Activity да позволява добавяне/редакция на категория, като има форма, подходяща за това. Във формата трябва да има текстово поле с името на категорията, както и изображение отдясно на него, което в последствие ще се показва, ако името на тази категория е вече заето. Над формата да има TableLayout с възможност за страниране, което да показва вече наличните категории. |
5 |
|
Да се създаде част от дизайн за приложение „Активни потребители“, което да има за цел докладване на нередности в търговската мрежа. Главно Activity, което да реализира подходящ интерфейс за потребителско вписване с Username и Password. Да има подходящ бутон с 2 състояния, който ако е кликнат, отдолу да се появяват допълнителни елементи във формата, които да позволяват възстановяване на забравена парола, като e-mail с който е регистриран и името на потребителя, с което е регистриран. Това Activity да предвижда възможност за вписване през Facebook, Google Account, LinkedIn и др. Второ Activity, което да реализира списък с подадени от текущия потребител сигнали дотук, както и с бутон за подаване на нов сигнал. Списъкът с подадените вече сигнали да се реализира с TableLayout, отдолу да има бутони за страниране на елементите в TableLayout-a или скролер (по избор). Всеки ред от таблицата да има CheckBox, който при избиране и кликване на бутон „Delete”да позволява изтриване на подадения сигнал. |
6 |
|
Да се създаде част от дизайн за приложение „Активни потребители“, което да има за цел докладване на нередности в търговската мрежа. Да се създаде Activity, в което да има подходяща форма за добавяне на нов сигнал. Един сигнал има Заглавие, Дата и час на добавяне (това поле ще се попълва автоматично и трябва да е забранено за редакция), скрито поле, което да съдържа GPS координатите, където е потребителят в момента на подаването на сигнала, дата в която потребителят е забелязал за първи път нарушение от такъв характер (с DatePicker), SurfaceView, което ще се ползва за показване на заснет от камерата образ на самото нарушение, за което се отнася сигнала, Бутон за изпращане на нарушението и ProgressBar, който ще уведомява потребителя за забавянето при предаване на нарушението към сървиса. |
7 |
|
Да се създаде част от дизайн за приложение „Светците на деня“, което да реализира следните Activities: Главно Activity, което да показва TableLayout с възможност за скролване с наличните светци за текущия ден съгласно църковния календар. При кликване на конкретен светец ще се зарежда Activity с информация за конкретния светец в следния вид: Име, година на раждане, година на смърт, дата на канонизация, икона, кратко житие на светеца. Да има бутони за споделяне на информацията за светеца в социални мрежи (Facebook, Twitter, LinkedIn, Google+ и др.). |
8 |
|
Да се създаде част от дизайн за приложение „Шах“ със следните Activities: Главно Activity, което да реализира меню за работата с игрите на шах, вкл. „Нова игра“, „Продължи стара игра“, „Запази текущата игра“. Да има Activity с TableLayout, който графично да наподобява шахматното поле с белите и черни квадрати. Да има отгоре бутон „Undo”, който ще се използва за връщане играта с един ход назад, както и бутон Menu, който ще връща към главното activity. |
9 |
|
Да се създаде част от дизайн за приложение „Новинарски портал“. В главното Activity да има бутон, показващ меню с категориите новини, бутон „лупичка“, който при кликване да показва Activity „Търсене“, както и бутон „Refresh” за обновяване на текущата страница. Отдолу да има скролируемо TableView с новините в текущо избраната категория. В антетката на таблицата ще има името на категорията. Менюто с категориите ще съдържа следните категории „Начало“, „Новини“, „Региони“. Аналогично да се създаде дизайн за Activity „Региони“, което да съдържа списък с региони, като при кликване на регион да показва новини от там. |
10 |
|
Да се създаде част от дизайн за мобилно приложение „Портал за продажби“. Да реализира с подходящ интерфейс, разпределен по Activities по избор на студента, който да има най-малко следните елементи: бутони с изображения за: „Всички категории“, „Запитване към магазина“, „Най-популярни“, „Най-ново за този месец“, „Продукти в промоция“. В ScrollView да показва първите 3 подкатегории от категории „Мобилни телефони“, „Компютърна техника“, „Аксесоари за мобилни телефони“. Да има TableLayout, показващ най-продавани артикули. |
11 |
|
Да се създаде част от дизайн за мобилно приложение „Месинджър“. Главното Activity да има отгоре бутони с 2 състояния: Скорошни, Контакти, Заявки за свързване. Ако е натиснат бутон, отдолу в TableLayout, който е скролируем се показват кратки изгледи на съобщенията. Да има Activity за преглед на съобщение. Едно съобщение може да има следните елементи: Заглавие, текст, Прикрепени снимки, прикрепени файлове. Да се създаде и Activity за ново съобщение. |
12 |
|
Да се създаде част от дизайн за приложение „Дама“ със следните Activities: Главно Activity, което да реализира меню за работата с игрите на дама, вкл. „Нова игра“, „Продължи стара игра“, „Запази текущата игра“. Да има Activity с TableLayout, който графично да наподобява игралното поле на „Дама“. Да има отгоре бутон „Undo”, който ще се използва за връщане играта с един ход назад, както и бутон Menu, който ще връща към главното activity. |
13 |
|
Да се създаде дизайн за приложение, подобно на mapstr. Да използва MapFragment. В такова приложение, потребителят може да добавя списък с локации на конкретна позиция в картата. Всяка локация се характеризира с GPS координати, Име на локацията, Категория на локацията. Да се създадат Activities, както и подходящо меню за: Добавяне/редакция/изтриване на локация/категория на локация. Да има бутони за споделяне в социални мрежи на текуща локация. |
14 |
|
Да се създаде дизайн за приложение „Организатор на задачи“. В главното Activity да има отгоре: бутон за преглед на всички незавършени задачи, бутон за добавяне на нова задача, бутон, водещ към Activity, което да позволява закупуване на платена версия на същото приложение, с премахнати реклами. Отдолу да има CalendarView с възможност за избор на ден. При избран ден и при кликване на бутон за добавяне на нова задача да се зарежда Activity за добавяне на задача със следните атрибути: Име, начален час, краен час, приоритет (без приоритет, нисък, среден, висок), Нотификации (да/не) (показва дали да са включени нотификациите за тази задача), Описание на задачата. В главното Activity да има ImageView, което да представлява реклама, с опция да се скрива след 30 секунди след зареждане на Activity-то. |
15 |
|
Да се създаде част от дизайн за приложение „Съвестни шофьори“, което да има за цел докладване на нередности в пътната мрежа. Да се създаде Activity, в което да има подходяща форма за добавяне на нов сигнал. Един сигнал има Заглавие, Дата и час на добавяне (това поле ще се попълва автоматично и трябва да е забранено за редакция), скрито поле, което да съдържа GPS координатите, където е потребителят в момента на подаването на сигнала, дата в която потребителят е забелязал за първи път нарушение от такъв характер (с DatePicker), SurfaceView, което ще се ползва за показване на заснет от камерата образ на самата пътна нередност (например, дупка, липсваща мантинела, др.), за която се отнася сигнала, Бутон за изпращане на нарушението и ProgressBar, който ще уведомява потребителя за забавянето при предаване на нарушението към сървиса. |
16 |
|
Да се създаде част от дизайн за приложение за провеждане на анкети. Да има Главно Activity, което със скролируемо TableLayout да предлага списък от категории на анкетите и при кликване на конкретна категория по аналогичен начин да се зарежда списък с активните анкети в конкретна категория. При кликване на конкретна анкета, ще се зарежда Activity за отговор на анкетата. Всяка анкета има заглавие, описание, опции (като потребител избира валидната за него опция с кликване на CheckBox). Да има бутон за съхраняване на отговора и ProgressBar, който да показва забавянето при изпращане на отговора към Service. Да има Activity, което да показва резултатите от конкретна анкета със заглавие и подходящ Chart. Може да се използва библиотека като MPAndroidChart. |
17 |
|
Да се създаде дизайн за приложение на туристическа агенция, предлагаща организирани екскурзии. Главното Activity предоставя филтри за търсене на екскурзии по следните категории: дата от; дата до; Континент; регион в континент; минимален брой оставащи места в екскурзията; Брой дни; минимална категория на хотелите в екскурзията, както и скролируем TableLayout, който показва самите екскурзии, отговарящи на зададените филтри. При кликване на конкретна екскурзия, излиза Activity показващо повече информация за екскурзия като Заглавие, галерия със снимки, брой дни, информация за всеки ден, информация за допълнителни екстри (напр. разходка в музей Лувър с предплатени билети). В това Activity има бутон Резервирай, при кликването на който, ще се отваря Activity за резервация на избраната екскурзия, която включва: брой възрастни над 7г. възраст, брой деца, е-mail за контакт, адрес за контакт с (Държава, Град, П.К., Улица ред 1, Улица ред 2), телефон за контакт. |
18 |
|
Да се създаде дизайн за приложение „Съветник за тренировки“. Главното Activity да съдържа меню с любими тренировки, бутон с картинка, при кликването на който да се показва текущ потребителски профил със снимка на потребител, Име на потребител, брой изгорени калории. Да има подходящ скролируем Layout, който да показва списък с тренировки, като списъкът се състои от главна снимка, продължителност в минути, ниво на интензивност (високо, средно, ниско), ниво на трениращ (начинаещ, среден, напреднал). При кликване на бутон „Тренировки“, да се зарежда списък с категории на тренировки (например: за сила, за устойчивост, за бързина, др.). При кликване на категория тренировки, ще се зарежда Activity с TableLayout със съответните тренировки в категория. При кликване на конкретна тренировка се зарежда Activity за провеждане на тренировка, което се състои от брояч: колко секунди са преминали, заглавие на тренировката и VideoView, което зарежда и пуска видеото на тренировката. |
19 |
|
Да се създаде част от дизайн за приложение „Моите часове за деня“, което да подпомага студент да проследява по-лесно дневната си учебна програма , което да реализира следните Activities: Главно Activity, което да показва TableLayout с възможност за скролване с наличните часове за текущия ден съгласно учебна програма. При кликване на конкретен час, ще се зарежда Activity с информация за конкретния час в следния вид: Име дисциплина, име преподавател, номер на текуща седмица, съгласно академичния календар. Да има бутони за споделяне на информацията за часа в социални мрежи (Facebook, Twitter, LinkedIn, Google+ и др.). |
20 |
|
Да се създаде част от дизайн за приложение „Корупционни сигнали“, което да има за цел докладване на корумпирани служители в държавната администрация. Главно Activity, което да реализира подходящ интерфейс за потребителско вписване с Username и Password. Да има подходящ бутон с 2 състояния, който ако е кликнат, отдолу да се появяват допълнителни елементи във формата, които да позволяват възстановяване на забравена парола, като e-mail с който е регистриран и името на потребителя, с което е регистриран. Това Activity да предвижда възможност за вписване през Facebook, Google Account, LinkedIn и др. Второ Activity, което да реализира списък с подадени от текущия потребител сигнали дотук, както и с бутон за подаване на нов сигнал. Списъкът с подадените вече сигнали да се реализира с TableLayout, отдолу да има бутони за страниране на елементите в TableLayout-a или скролер (по избор). Всеки ред от таблицата да има CheckBox, който при избиране и кликване на бутон „Delete”да позволява изтриване на подадения сигнал. Да има Activity за добавяне на сигнал, като всеки сигнал съдържа: Заглавие; Име на служител, за който се отнася; Име на отдел; Име на агенция, Име на министерство; Описание на сигнала. |
21 |
|
Да се създаде дизайн за приложение „Видео уроци за програмисти“. Главното Activity да съдържа меню с любими уроци, бутон с картинка, при кликването на който да се показва текущ потребителски профил със снимка на потребител, Име на потребител, изгледани уроци. Да има подходящ скролируем Layout, който да показва списък с уроци, като списъкът се състои от главна снимка, продължителност в минути, ниво на трудност (високо, средно, ниско), ниво на обучаван (начинаещ, среден, напреднал). При кликване на бутон „Уроци“, да се зарежда списък с категории на уроци (например: за уеб приложения, за декстоп приложения, др.). При кликване на категория уроци, ще се зарежда Activity с TableLayout със съответните уроци в категория. При кликване на конкретен урок се зарежда Activity за провеждане на урок, което се състои от брояч: колко секунди са преминали, заглавие на урока и VideoView, което зарежда и пуска видеото на тренировката с възможност за пауза. |
22 |
|
Да се създаде част от дизайн за мобилно приложение „Онлайн аптека“. Да реализира с подходящ интерфейс, разпределен по Activities по избор на студента, който да има най-малко следните елементи: бутони с изображения за: „Всички категории“, „Запитване към магазина“, „Най-популярни“, „Най-ново за този месец“, „Продукти в промоция“. В ScrollView да показва първите 3 подкатегории от категории „Козметика“, „Антивирусни препарати“, „Ваксини“. Да има TableLayout, показващ най-продавани артикули. |
23 |
|
Да се създаде част от дизайн за мобилно приложение „Каталог на ресторанти“. Главното Activity ще показва скролируем TableLayout с най-близките до потребителя ресторанти, подредени по намаляващ ред на тяхната категория. Всеки ресторант в Layout-а ще е представен с главна снимка, име на ресторанта, оценка, получена по каталог. При кликване на конкретен ресторант, ще се зарежда Activity с информация за съответния ресторант: Главна снимка, Име, Оценка, Достойнства, Недостатъци, Адрес, Телефон за поръчка, MapFragment със заредена карта с точка в координатите, където е адреса на ресторанта. Да има бутони за споделяне на конкретен ресторант в социални мрежи. |
24 |
|
Да се създаде част от дизайн за мобилно приложение, подпомагащо работата на мрежови администратори при поставяне на Wireless Access Points из сграда. Да има Activity с TableLayout, което да предоставя списък с имена на налични мрежи и колко dB е силата на сигнала на конкретната мрежа от списъка. При кликване на конкретна мрежа, да се показва инфо за нея в отделно Activity, което да съдържа името на мрежата, начина на кодиране на сигнала в мрежата, колко dB e измерената сила в тази точка за тази мрежа. |
25 |
|
Да се създаде част от дизайн за мобилно приложение PriorityFeed, работещо с Facebook Graph API, което да предоставя функционалност за приоритизиране на постингите в News Feed-а на потребителя. Всяка една новина от NewsFeed-а излиза в главното Activity, заедно с число: изчислен коефициент на важност на новината, на базата на зададените лични критерии за приоритизиране. При кликване на конкретна новина, да се зарежда в Activity самата новина в WebView. Задаването на правилата на приоритизиране да става в отделни Activity, в което се задават тези приятели на потребителя, които са по-важни, както и думи, които трябва да съдържат важните постове, както и думи, които не трябва да съдържат важните постове. |
26 |
|
Да се създаде дизайн за приложение „Каталог книги“. Главното Activity да съдържа меню с любими книги, бутон с картинка, при кликването на който да се показва текущ потребителски профил със снимка на потребител, Име на потребител, брой свалени книги. Да има подходящ скролируем Layout, който да показва списък с книги, като списъкът се състои от главна снимка, брой страници, Жанр. При кликване на бутон „Книги“, да се зарежда списък с жанр на книги (например: фантастика, IT и др.). При кликване на категория книги, ще се зарежда Activity с TableLayout със съответните книги в категория. При кликване на конкретна книга, се зарежда Activity за четене, което се състои от брояч: колко секунди са преминали, заглавие на книгата и WebView, което зарежда самата книга. |
27 |
|
Да се създаде дизайн за мобилно приложение „Игра Тетрис“. Да се създаде TableLayout с квадратите, които по време на изпълнение на програмата динамично ще стават светли или тъмни, в зависимост от “падащите” фигури. Да има бутони за преминаване наляво, надясно, завъртане наляво, завъртане надясно на падащата фигура. Да има подходящ изглед за нивото на играта и за спечелените точки. |
28 |
|
Да се създаде дизайн за мобилно приложение за ресторант, в който поръчките вместо с викане на сервитьор/ка, стават с мобилното приложение. В главното Activity има текстово поле, в който потребителя въвежда номера на масата си и при натискане на бутон влиза в Activity за поръчка. Това Activity съдържа филтър по име на артикула и група от радио бутони на категории атрикули (напр. безалкохолни, алкохолни коктейли и т.н.). Съдържа и TableLayout с възможност за страниране, който показва намерените артикули, отговарящи на зададения филтър. При кликване на конкретен артикул ще излиза Activity за поръчка на артикула, в което има снимка, име, допълнителна информация за него, текстово поле, в което да въведе брой и бутон за добавяне към поръчката с връщане към главното Activity. В главното Activity да има подходящ бутон за финализиране на поръчката, който да показва сметката дотук. |
29 |
|
Да се създаде дизайн за мобилно приложение „Умен градски транспорт“. Да има необходимите Activities за потребителски логин, възстановяване на забравена парола и логин през акаунти на социални мрежи. Да има Activity с MapFragment, което да показва най-близките спирки до потребителя на картата и при кликване на конкретна спирка, да зарежда Activity, в което се показва разширена информация за тази спирка: Име, кои линии минават през нея, кои са най-скорошните линии, които ще минават и до колко минути ще дойдат. Информацията да се зарежда в подходящи скролируеми TableLayouts или ListViews. |
30 |
|
Да се създаде дизайн за мобилно приложение „Агенция за недвижими имоти“. Да има необходимите Activities за потребителски логин, възстановяване на забравена парола и логин през акаунти на социални мрежи. Да има Activity с MapFragment, което да показва най-близките недвижими имоти за продан до потребителя на картата и при кликване на конкретен имот, да зарежда Activity, в което се показва разширена информация за този имот: Име, метри до най-близката спирка на градския транспорт, колко квадрата, цена на квадрат, обща цена, снимки от имота (галерия със следните елементи: ImageView, бутон за Next и Previous ). Да има бутон „поръчай оглед“, за да може клиента да поръча оглед на този имот. Да има бутони за споделяне на конкретен имот в социални мрежи. |
Обявления за извънредни занятия
За допълнителна информация и въпроси:
гл. ас. д-р инж. Георги Пашев;
e-mail: georgepashev (at) uni-plovdiv.bg;
Здравейте, колеги. Тук си направих труда да извадя линк към учебни материали, които можете да сваляте свободно и безплатно и легално по дисциплината: Въведение в компютърните науки.
Те съдържат:
- решени задачи на упражнения
- записки от лекции, презентации
-други учебни материали
Можете да свалите учебните материали от тук.
Списък с учебници, които можете да търсите допълнително:
Тодорова М, Програмиране на C++, част 1., Сиела
Davis Stephen, C++ for Dummies
Wang Wallace, Beginning Programming for Dummies
Lajole Hose, C++ Primer
Различни учебници за 10. клас
за напреднали:
Тодорова М, Програмиране на C++, част 2., Сиела
Майерс Скот, По-ефективен C++: 35 нови начина да подобрите своите програми и проекти
Willemer Arnold, Coding for Fun mit C++ (Galileo Computing) (само на немски език)
Наков Преслав, Програмиране = ++ Алгоритми
За въпроси:
инж. Г. Пашев, e-mail: georgepashev@gmail.com
Бъдещето на браузърите.
За да бъде новият браузър смислен, трябва в него да има нещо уникално и ново, та да може да отмъкне дял от другите. Chrome е уникален в бързината си на работа и поради факта, че за доста неща разчита на огромния гръбнак от сървъри на Google, понеже така или иначе е тяхна собственост. Значи, трябва ти и огромен гръбнак от сървъри, но понеже туй няма как да стане, затуй може да се мисли за техна алтернатива: някакъв p2p протокол, подобен на торентите, чиято цел е да замести работата, която многото сървъри на google биха свършили: например кеширане на сайтове, кеширане на история на търсене, определяне на близост между потребители и персонализиране на резултати за търсене, подсказки за търсене и т.н. Според мен, обаче, все повече ще се засилва клауд елемента: т.е: тенденцията вече ще бъде операционната ти система да не бъде на локалния компютър, а на виртуален компютър в клауда, а локалната ти станция само ще съдържа съвсем олекотен линукс, чиято основна цел е да зареди основната операционна система от виртуалния компютър в клауда. Тогава има голяма вероятност да има голяма необходимост от браузъри, които са оптимизирани за отдалечено зареждане на уеб базирани операционни системи. Така, че според мен, който работи в тая насока, може и да направи удар при браузърите, независимо в коя държава се намира. Използване на браузър като входна точка към твоя операционна система в клауда: това е част от бъдещето на браузърите. Другото, което ще бъде тенденция, според мен е и появата на т.нар. мулти-браузъри: т.е такива браузъри, които да поддържат не само стандартни протоколи като http, ftp, но и такива протоколи, които засега са били смятани за не - уеб съвместими: например: скайп, торенти, winamp и документни поддръжки. Последното и сега се поддържа с инсталиране на плъгини, с които можеш да разглеждаш pdf, docx и др. файлове директно в браузъра, но в бъдещите браузъри това ще бъде вградено и няма да има нужда да се слагат плъгини. Дори може да се интегрира в http протокола. Представете си да имаш браузър, в който в единия таб ти е пуснат скайпа, в другия таб киснеш във фейсбук, в третия таб си пуснал winamp канал (например Venice Classic Radio), в четвъртия таб теглиш торенти, а ако си програмист, в петия таб си пуснал някаква интегрирана с браузъра среда за разработка на c++ приложение, а на шестия таб даже си стартирал една отдалечена конзола, с която управляваш нещо в ОСто ти в клауда. Ето за такова нещо говоря: браузъра да започне да върши работа едва ли не за всичко. Вариантите за това са два: или различни системи предлагат своя версия за сегашния уеб, или уеб да се пригоди за тях чрез браузър, който да ги поддържа. Кой да има тази инициатива? Според мен е по-логично браузърът да има инициативата да се развива и да предлага по-голямо разнообразие от разширения на http за комуникация. Другата тенденция, която определено ще я има е и вграждането в http и използването на периферни устройства за виртуална реалност като google glass например. Дори вече се говори за разработване на javascript api-та за това. В един момент сайтовете ще се считат за остаряли, ако не поддържат някои неща за google glass или виртуална реалност като цяло.
Задачи:
Да се напише bash shell script, който:
1) Приема име на файл и му добавя право за изпълнение. Ако няма такъв файл да изпише съобщение за грешка "No such file."
2) Приема от командния ред 2 числа, а ако не са подадени 2 числа като входни параметри, предлага на потребителя да ги въведе. Тези 2 числа са първите 2 числа на ред на Фибоначи, който скрипта трябва да генерира. Редът да е с размер 20 елемента. Генерираният ред да се запазва във файл: fib.txt.
#!/bin/bash
num_vh=$#
declare -i num1
declare -i num2
declare -a nums
#echo $num_vh
if [ $num_vh -le 1 ]; then
echo "enter first number";
read num1
echo "enter second number";
read num2
else
num1=$1
num2=$2
fi
nums[0]=$num1
nums[1]=$num2
echo "Fibonacci" > fib.txt
echo nums[0]=${nums[0]} >> fib.txt
echo nums[1]=${nums[1]} >> fib.txt
declare -i i=2
while [ $i -lt 20 ]; do
nums[$i]=$(( ${nums[(( $i - 1 ))]} + ${nums[(( $i - 2 ))]} ))
echo nums[$i]=${nums[$i]} >> fib.txt
i=$i+1
done
3) Приема от командния ред цяло число и проверява дали е четно или не. Ако е четно, изписва "1", ако е нечетно "0".
#!/bin/bash
if [ $(( $1 % 2 )) -eq 0 ]; then
echo "1"
else
echo "0"
fi
4) Приема от командния ред променлив брой числа и връща сумата им.
#!/bin/bash
declare -i sum=0
for num in $@
do
sum=$(( $sum + $num ))
done
echo $sum
5) Приема от командния ред имена на 2 файла. Проверява дали по съдържание са еднакви. Ако са еднакви, да изтрие втория.
#!/bin/bash
fc1=""
fc2=""
if [ $# -lt 2 ]; then
echo "not enough parameters"
exit 1
fi
if [ -e $1 ] && [ -e $2 ]; then
fc1=$( cat $1 )
fc2=$( cat $2 )
if [ $fc1 = $fc2 ]; then
echo '1'
rm $2
else
echo '0'
fi
else
echo "one of the files do not exist"
exit 2
fi
6) Приема от командния ред цяло число и връща неговия факториел.
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Not enough input parameters"
exit 1
fi
re='^[0-9]+$'
if ! [[ $1 =~ $re ]] ; then
echo "error: Not a number" >&2; exit 2
fi
declare -i fac=1
if [ $1 -eq 1 ]; then
echo $fac
exit 0
fi
for (( nnum=1; nnum <= $1 ; nnum=$(( $nnum+1 )) ))
do
fac=$(( $fac * $nnum ))
done
echo $fac
7) Генерира файл variations.txt, който съдържа всички пермутации с повторения на числата 1, 2, 3.
#!/bin/bash
for i in 1 2 3; do
for j in 1 2 3; do
for k in 1 2 3; do
echo [i, j, k]=[$i, $j, $k] >> variations.txt
done
done
done
Прогностично групиране на е-обучавани студенти чрез извличане на знания в съществуваща база данни за електронно обучение и динамично предсказване на най-добрият път в образователен процесен граф
Георги Пашев
ПУ „Паисий Хилендарски“, georgepashev@gmail.com
Резюме: Този доклад описва някои разширения на авторската Система за Управление на Граф Бази Данни и приложение върху нея. Целта на приложението е да се поддържа процесен граф на образователен процес, общ за множество от студенти, поддържане на крайни автомати върху процесния граф за всеки един от тези студенти и да прави прогнози и предложения на студентите, кой от пътищата в процесния граф да изберат, на базата на обучителните примери на вече завършилите студенти, които са най-подобни на текущия студент.
Ключови думи: образователен, процесен, граф, предсказване, адаптивно, обучение, машинно обучение
Условие:
Да се създаде Bash Shell Script, който приема име на файл, вижда текущите активни процеси, създава XML файл с това име със следното примерно съдържание:
<processes>
<ps num='1' id='3171'>gnome-terminal</ps>
<ps num='2' id='3178'>gnome-pty-helpe</ps>
<ps num='3' id='3179'>bash</ps>
<ps num='4' id='3241'>primer.sh</ps>
<ps num='5' id='3242'>ps</ps>
</processes>
където атрибута num е автоматично зададен текущ номер на процес, атрибута id съдържа PID на процеса а съдържанието на тага ps съдържа име на процеса. След като създаде файла, да го отвори с текстов редактор.
Примерно решение:
#!/bin/bash
out=$(ps -A)
echo $out
declare -i i=1
echo "<processes>" > $1
for a in $out ; do
if [ $i -gt 4 ] && [ $(( ($i+3) % 4 )) -eq 0 ]; then
tt=$a
fi
if [ $i -gt 4 ] && [ $(( $i % 4 )) -eq 0 ]; then
echo "<ps num='$((($i-1)/4))' id='$tt'>$a</ps>" >> $1
fi
i=$(($i+1))
done
echo "</processes>" >> $1
kate $1
Относно изказването на Светлин Наков пред economy.bg, което можете да прочетете тук: http://www.economy.bg/science/view/10780/Svetlin-Nakov-za-Softuerniya-universitet---
Открих противоречие... Ако догодина излезе езика Минчо Пенчо, и научиш студентите на него, а по-догодина излезе езика Баба Пена: какво правим; ще връщаме вече произведените студенти за доработка, ли? И защо си мисли, че ми трябва уни, за да уча езици или диалекти... Тех така или иначе ги уча в движение... Уни е за друго: да ти шлифова начина на мислене, а това не става със зубрене: как се пише оператор foreach на Минчо Пенчо... Все пак, в нашата приложна сфера, технологиите могат да се сменят за 1-3 години и е тъпо да учиш нещо, което след 3 години няма да е баш така...
По-ценното е дали изобщо езикът или средата предлагат работа с качествено нова МАТЕМАТИЧЕСКА ПАРАДИГМА или технология, която досега отсъства в досегашните предлагани езици/програмни среди, но това не е свързано толкова със самия език, колкото със самата парадигма. Затова си има дисциплини, които се наричат: компонентно програмиране, обектно програмиране, процедурно програмиране, функционално програмиране и т.н.
Това, за което г-н Наков говори, е по-подходящо да се нарича академия, work-shops, курсове или каквото и да е друго, но не и УНИВЕРСИТЕТ.
Във връзка с горенаписаното, очевидно биха имали и акредитационни проблеми, които искат да избегнат, с издаване на дипломите от други ВУЗове. Така и не споменаха, КОИ са точно другите ВУЗове, които биха издали дипломи, както и срещу какви ПРИРАВНИТЕЛНИ ИЗПИТИ... Мирише на класическата мода: дай да оплюем висшето образование, че за нищо не става, като същевременно прехвърлим вината за СОБСТВЕНИЯ СИ МЪРЗЕЛ върху него, а не върху себе си; както и да вземем СЕРИОЗНИ ТАКСИ на студентите и да си ги приберем у джоба...
Тези дни се наслушах на глупави дебати, свързани с едно не толкова важно нещо. Това, че по инициатива на Сидеров и компания, требвало да се удължи мораториума за продажба на българска земя на чужденци. Във връзка с това, по медиите се изговориха някои лъжи и измами. Нека ги изброим една по една:
Лъжа 1: Като се разреши на чужденците да купуват, ще се изсипят много купувачи и ще вдигнат цената на земята... Пълна лъжа... Истината е, че и сега чужденците могат да си открият фирма с капитал 2лв. и чрез нея да купуват земя, ако преценят, че ще имат финансова изгода. Липсата на митично голяма бройка платежоспособни чужденци се дължи на факта, че просто не искат да идват и да си заравят парите в българската псевдо-икономика и това ще продължи да бъде факт и при по-либералния пазар.
Лъжа 2: Като се разреши на чужди физически лица да купуват земя, сме щели да знаем повече за чужденците, които купуват... Това, май беше издрънкано от министърката Златанова... Пълна лъжа... Всъщност точно обратното: когато накараме чужденецът да регистрира фирма в Български съд по Българският търговски закон е по-вероятно да разберем повече за него... А това, че според действаща министърка, българската държава не може да разбере кой стои зад българска фирма, хич не е успокоително... А ако не можем да разберем кой стои зад българска фирма, как ще разберем кой стои зад чужда?!? Даже е много по-вероятно някоя нашенска мутра да си регистрира хубава кипърска офшорка и чрез нея да си закупи наша земя. Така дори няма да има нужда да си препира парите... Направо с мръсните пари ще я купи...
Лъжа 3: Като удължим мораториума, ще си защитим земята от алчните западняци, които ще я изкупят на безценица. Както вече споменах, нищо не им пречи на алчните западняци да си регистрират фирма с капитал 2лв. и да изкупят земята...
Ами това е... Както винаги и по тази тема се упражняват всички да приказват, без много много да разбират от нея. Не казвам, че и аз съм от най-разбиращите, но все пак това са едни очевидни неща, които би требвало да правят впечатление на всеки МИСЛЕЩ човек...
Някой ще каже: добре, какво е твоето мнение по въпроса. Моето мнение е, че това решение е МОРАЛНО добро, поради причини, споменати в опровергаването на лъжа 2, но е СТРАТЕГИЧЕСКИ лошо, поради факта, че ще предизвика много въпросителни относно еврочленството ни. Но, от друга страна, вероятно няма да се стигне и дотам, защото конституционният съд, доминиран от комунисти, ще го отмени, и по причини, посочени в опровергаването на лъжа 2 (нашите комунистически мутри няма да изпуснат възможността да купуват анонимно българска земя чрез кипърска офшорка...)...