George Pashev

Website of George Pashev (Jidai Mirai)

Scientist, Programmer, Data Scientist, Enterpreneur

Python за Fintech разработка

Нова Избираема дисциплина:

Python за Fintech разработка

Автор

д-р Георги Пашев

Професионален профил | georgepashev@uni-plovdiv.bg

Направление: 4.6 Информатика

Основна информация

  • Хорариум: 20 часа лекции + 20 часа упражнения
  • Кредити: 4 ECTS
  • Семестър: 6-ти семестър (3-та година)
  • Предварителни изисквания: Програмиране с Python (базово ниво), Бази данни, Структури от данни и алгоритми

Анотация

Дисциплината "Python за Fintech разработка" подготвя студентите за работа като Python разработчици във финансово-технологичния сектор. Курсът комбинира задълбочено изучаване на Python екосистемата за анализ на данни с практически умения за back-end разработка и количествени методи за финансови приложения.

Учебно съдържание

Модул 1: Advanced Python и Data Science (8 часа лекции, 8 часа упражнения)

  • Работа с NumPy, Pandas и SciPy за анализ на финансови данни
  • Асинхронно програмиране с asyncio за high-frequency trading
  • Паралелна обработка на данни и оптимизация
  • Python best practices и clean code в контекста на fintech приложения

Модул 2: Бази данни и съхранение (6 часа лекции, 6 часа упражнения)

  • Работа с Oracle Database за финансови транзакции
  • MongoDB и NoSQL решения за big data анализ
  • Оптимизация на заявки и индексиране
  • Интеграция на различни storage решения

Модул 3: Количествени методи и финанси (6 часа лекции, 6 часа упражнения)

  • Анализ на времеви редове и финансово моделиране
  • Risk management и portfolio optimization
  • Machine learning за предсказване на пазарни тенденции
  • Автоматизирана търговия и алгоритмични стратегии

Методи на преподаване

  • Интерактивни лекции с практически примери от реалния финтех сектор
  • Лабораторни упражнения с актуални технологии
  • Работа по проекти, симулиращи реални финтех решения
  • Гост-лектори от водещи fintech компании

Форми на оценяване

Финален проект: 40%
Практически задачи: 30%
Теоретичен тест: 20%
Активност: 10%

Очаквани резултати

  • Професионално ниво на Python програмиране за fintech приложения
  • Практически опит с анализ на финансови данни и количествени методи
  • Умения за работа с различни бази данни и системи за съхранение
  • Разбиране на финансовите концепции и алгоритмична търговия
  • Готовност за работа в международен екип

Литература

  • McKinney, W. (2022). Python for Data Analysis, 3rd Edition. O'Reilly Media
  • Hilpisch, Y. (2021). Python for Algorithmic Trading. O'Reilly Media
  • Yves Hilpisch. (2020). Artificial Intelligence in Finance. O'Reilly Media
  • Hull, J. C. (2020). Machine Learning in Business: An Introduction to the World of Data Science. Cambridge University Press
  • Избрани научни статии и технически документации

Техническо осигуряване

  • Модерна компютърна лаборатория с необходимия софтуер и хардуер
  • Високоскоростна интернет връзка
  • Достъп до специализирани финансови APIs и данни
  • Cloud инфраструктура за обработка на големи обеми данни

Софтуерни инструменти

  • Python 3.x и специализирани библиотеки (NumPy, Pandas, SciPy)
  • Oracle Database Enterprise Edition
  • MongoDB Enterprise
  • Jupyter Notebooks/Lab
  • Git и системи за контрол на версиите
  • PyCharm Professional Edition или Visual Studio Code

Голямото море от крипто валути: Типове крипто валути и примери

Голямото море от крипто валути:
Типове крипто валути и примери

Автор: Георги Пашев

Януари 2025

Съдържание

  1. Въведение
  2. История на криптовалутите
  3. Технически аспекти
    • Блокчейн технология
    • Механизми за консенсус
    • Криптография
  4. Типове криптовалути
    • Платежни криптовалути
    • Платформени токени
    • Utility токени
    • Стейбълкойни
    • DeFi токени
    • NFT токени
    • Governance токени
  5. Икономически аспекти
  6. Трейдинг перспектива
  7. Сравнителен анализ
  8. Бъдещи перспективи

1. Въведение

Криптовалутите представляват революционна форма на дигитални активи, базирани на блокчейн технологията. Те въвеждат нов модел на финансови взаимоотношения, който елиминира необходимостта от централизирани посредници и създава възможности за директни peer-to-peer транзакции. От създаването на Bitcoin през 2009 г., пазарът на криптовалути се е развил експоненциално, като днес включва хиляди различни проекти с разнообразни приложения.

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

2. История на криптовалутите

Историята на криптовалутите започва със създаването на Bitcoin от мистериозната личност или група, известна като Сатоши Накамото. Публикуването на Bitcoin whitepaper през 2008 г. и пускането на първия блок (Genesis block) през януари 2009 г. бележи началото на нова ера във финансовия свят.

Ключови моменти в историята на криптовалутите:

Година Събитие Значение
2009 Създаване на Bitcoin Първата децентрализирана криптовалута
2011 Появава се Litecoin Първият успешен алткойн
2015 Създаване на Ethereum Въвеждане на смарт контракти
2017 Първи ICO бум Масова поява на нови токени
2020 DeFi лято Експлозия на децентрализирани финанси
2021 NFT революция Масово навлизане на дигитално изкуство

3. Технически аспекти

3.1 Блокчейн технология

Блокчейнът е разпределена база данни, която съхранява информация в блокове, свързани криптографски помежду си. Всеки блок съдържа:

  • Транзакции
  • Времеви печат
  • Криптографски хеш на предишния блок
  • Nonce (число, използвано в процеса на майнинг)

3.2 Layer архитектура

Блокчейн архитектурата се разделя на различни слоеве (layers), всеки със специфична роля:

Слой Описание Примери Предназначение
Layer 0 Базова инфраструктура Polkadot, Cosmos Осигурява хардуерна и мрежова инфраструктура за блокчейн мрежите
Layer 1 Основен блокчейн Bitcoin, Ethereum, Solana Базов протокол, консенсус механизъм, сигурност на мрежата
Layer 2 Решения за скалируемост Lightning Network, Optimism, Arbitrum Подобрява производителността чрез обработка на транзакции извън основната верига
Layer 3 Приложен слой dApps, DeFi протоколи Потребителски интерфейси и приложения

Особености на различните слоеве:

  • Layer 0: Фокусира се върху интероперабилността между различни блокчейни и осигурява базова инфраструктура.
  • Layer 1: Отговаря за основните функции като валидация на транзакции, сигурност и консенсус. Това е фундаменталният слой на всяка блокчейн мрежа.
  • Layer 2: Решава проблемите със скалируемостта чрез различни подходи:
    • State channels (Lightning Network)
    • Странични вериги (Sidechains)
    • Rollups (Optimistic и Zero-Knowledge)
    • Плазма решения
  • Layer 3: Предоставя интерфейс между крайните потребители и блокчейн технологията, включвайки:
    • Потребителски интерфейси
    • APIs и SDK инструменти
    • Междуплатформена интеграция

3.3 Механизми за консенсус

Механизъм Описание Предимства Недостатъци
Proof of Work (PoW) Изисква изчислителна мощност за решаване на криптографски пъзели Висока сигурност Висока консумация на енергия
Proof of Stake (PoS) Валидаторите залагат криптовалута Енергийна ефективност Риск от централизация
Delegated Proof of Stake (DPoS) Делегиране на права за валидация Висока скалируемост По-малка децентрализация

3.3 Криптография

Криптовалутите използват различни криптографски методи за осигуряване на сигурност и анонимност:

  • Публични и частни ключове
  • Хеш функции (SHA-256, Keccak-256)
  • Цифрови подписи
  • Zero-knowledge proofs

4. Типове криптовалути

4.1 Платежни криптовалути

Това са първите и най-базови форми на криптовалути, създадени за извършване на финансови транзакции.

Валута Особености Предимства Използване
Bitcoin (BTC) Първата криптовалута Висока сигурност, ограничено предлагане Съхранение на стойност, плащания
Litecoin (LTC) По-бърз от Bitcoin Бързи транзакции, ниски такси Ежедневни плащания
Monero (XMR) Фокус върху поверителност Анонимни транзакции Поверителни плащания

4.2 Платформени токени

Тези токени са свързани с блокчейн платформи, които позволяват създаването на децентрализирани приложения (dApps).

Платформа Токен Особености Приложения
Ethereum ETH Смарт контракти, DeFi екосистема dApps, DeFi, NFT
Solana SOL Висока скорост, ниски такси DeFi, NFT пазари
Cardano ADA Научен подход, PoS DeFi, образование

4.3 Utility токени

Utility токените предоставят достъп до специфични услуги или функционалности в рамките на дадена платформа.

Токен Платформа Функционалност
BNB Binance Намаление на такси, участие в IEO
LINK Chainlink Достъп до oracle услуги
FIL Filecoin Децентрализирано съхранение

4.4 Стейбълкойни

Стейбълкойните са криптовалути, чиято стойност е обвързана с традиционни активи.

Стейбълкойн Обезпечение Механизъм Приложение
USDT USD Фиатно обезпечение Търговия, съхранение
DAI Крипто Свръхобезпечение DeFi операции
USDC USD Регулирано обезпечение Институционални плащания

5. Икономически аспекти

5.1 Монетарна политика

Криптовалутите използват различни подходи към паричното предлагане, всеки със свои предимства и недостатъци:

Тип политика Описание Примери Цели и ефекти
Фиксирано предлагане Предварително определен максимален брой монети, който никога няма да бъде надвишен - Bitcoin (21 млн.)
- Litecoin (84 млн.)
- YFI (30,000)
- Защита от инфлация
- Предвидимост на предлагането
- Дефлационен характер
Намаляващо предлагане чрез халвинг Периодично намаляване на наградите за валидаторите/майнърите наполовина - Bitcoin (на всеки 210,000 блока)
- Litecoin (на всеки 840,000 блока)
- Bitcoin Cash
- Постепенно намаляване на инфлацията
- Стимулиране на дългосрочно държане
- Балансиране на предлагането
Инфлационен модел с фиксиран процент Постоянно увеличаване на предлагането с фиксиран процент годишно - Dogecoin (5.256 млрд. годишно)
- Стария Ethereum (преди The Merge)
- Cosmos (7-20% годишно)
- Стимулиране на използването
- Компенсиране на изгубени монети
- Финансиране на валидаторите
Динамично предлагане Автоматично адаптиране на предлагането според различни параметри на мрежата - Новия Ethereum (след The Merge)
- LUNA Classic (преди колапса)
- Algorithmic стейбълкойни
- Ценова стабилност
- Балансиране на стимулите
- Адаптивност към пазарни условия

Допълнителни аспекти на монетарната политика:

  • Burn механизми: Някои криптовалути (BNB, LUNA) използват изгаряне на токени за намаляване на предлагането:
    • Автоматично изгаряне на част от таксите за транзакции
    • Периодично изгаряне на токени от екипа
    • Buy-back и burn програми
  • Vesting периоди: Постепенно освобождаване на токени за:
    • Екипа и съветниците
    • Инвеститори от ранни етапи
    • Развитие на екосистемата
  • Емисионни събития: Специални случаи на създаване на нови токени:
    • Награди за стейкинг
    • Ликвидни стимули
    • Общностни награди

5.2 Икономически модели

Модел Описание Примери
Дефлационен Намаляващо предлагане във времето Bitcoin, BNB
Инфлационен Постоянно увеличаване на предлагането Dogecoin, ETH (преди The Merge)
Хибриден Комбинация от различни механизми Ethereum (след The Merge)

5.3 Икономически индикатори

  • Пазарна капитализация
  • Обем на търговия
  • Ликвидност
  • Съотношение на стейкнати токени
  • Общ обем в DeFi протоколи (TVL)

6. Трейдинг перспектива

6.1 Трейдинг стратегии

Стратегия Описание Предимства Рискове
HODL Дългосрочно държане Минимален риск от тайминг Волатилност на пазара
Скалпинг Множество малки сделки Чести печалби Високи такси
Суинг трейдинг Търговия на по-големи времеви рамки По-добър риск/награда Изисква повече капитал

6.2 Технически анализ

Техническият анализ използва различни индикатори за прогнозиране на пазарните движения. Ето най-важните от тях:

Индикатор Описание Изчисление Приложение
Moving Averages (MA, EMA) Усреднена цена за определен период, помага за определяне на тренда - SMA: средно аритметично за N периода
- EMA: експоненциално претеглена средна с по-голяма тежест на последните данни
- Определяне на тренд
- Подкрепа/съпротива
- MA кръстосвания като сигнали
Relative Strength Index (RSI) Измерва силата на движението на цената и определя свръхкупени/свръхпродадени нива RSI = 100 - [100/(1 + RS)]
RS = средни печалби/средни загуби за N периода
Стандартен период: 14
- Свръхкупено над 70
- Свръхпродадено под 30
- Дивергенции
Fibonacci нива Базирани на числата на Fibonacci (0.236, 0.382, 0.618, etc.) Изчисляват се като процент от вълната:
- От връх до дъно за корекции
- От дъно до връх за екстензии
- Нива на корекция
- Ценови таргети
- Зони на подкрепа/съпротива
Bollinger Bands Три ленти, показващи волатилността и възможни екстремуми - Средна линия: 20-дневна SMA
- Горна лента: SMA + (2 × StdDev)
- Долна лента: SMA - (2 × StdDev)
- Волатилност
- Ценови канали
- Пробиви
MACD Moving Average Convergence Divergence - показва промени в тренда и момента - MACD линия: 12-EMA минус 26-EMA
- Сигнална линия: 9-EMA на MACD
- Хистограма: MACD минус сигнална линия
- Смяна на тренда
- Импулс на движението
- Дивергенции

Допълнителни важни индикатори:

  • Momentum индикатори:
    • Stochastic Oscillator: Сравнява текущата цена със ценовия диапазон за определен период
    • CCI (Commodity Channel Index): Измерва отклонението от средната цена
    • Williams %R: Подобен на Stochastic, но с различна скала
  • Volume индикатори:
    • On-Balance Volume (OBV): Кумулативна сума на обема, показваща натиска на купувачи/продавачи
    • Volume Profile: Показва нивата с най-голяма активност
    • Money Flow Index: Комбинира цена и обем
  • Трендови индикатори:
    • ADX (Average Directional Index): Измерва силата на тренда
    • Parabolic SAR: Определя точки на обрат в тренда
    • Ichimoku Cloud: Комплексен индикатор за тренд и подкрепа/съпротива

Приложение в крипто пазарите:

  • Криптовалутните пазари са по-волатилни от традиционните, което изисква:
    • По-широки стоп-лос нива
    • Адаптиране на периодите на индикаторите
    • Комбиниране на множество времеви рамки
  • Специфични за крипто индикатори:
    • MVRV (Market Value to Realized Value)
    • NVT (Network Value to Transactions)
    • Funding Rate за фючърси

6.3 Фундаментален анализ

Ключови метрики за оценка:

  • Развитие на мрежата
  • Брой активни адреси
  • Транзакционен обем
  • Разработка на протокола
  • Партньорства и интеграции

7. Сравнителен анализ

7.1 Сравнение на основните блокчейн платформи

Платформа TPS Консенсус Смарт контракти Екосистема
Bitcoin 7 PoW Ограничени Платежи
Ethereum 15-30 PoS Пълни Много голяма
Solana 65,000 PoS + PoH Пълни Растяща
Cardano 250 PoS Пълни Развиваща се

7.2 DeFi екосистеми

Показател Ethereum BSC Solana
TVL (млрд. $) 40+ 5+ 2+
Брой протоколи 200+ 100+ 50+
Средни такси Високи Ниски Много ниски

8. Бъдещи перспективи

8.1 Технологични тенденции

Тенденция Текущо състояние Очаквано развитие Водещи проекти
Layer 2 решения - Optimistic Rollups
- ZK Rollups
- Странични вериги
- Повишена скалируемост (100k+ TPS)
- Намалени такси
- По-добра интеграция с L1
- Optimism
- Arbitrum
- zkSync
- Polygon
Интероперабилност - Мостове между блокчейни
- Cross-chain протоколи
- Атомарни суапове
- Универсални стандарти
- Безопасни мостове
- Единна ликвидност
- Polkadot
- Cosmos
- Chainlink CCIP
- LayerZero
Подобрена поверителност - Zero-Knowledge Proofs
- Хомоморфно криптиране
- MPC технологии
- Селективна прозрачност
- Институционално възприемане
- Регулаторен баланс
- Monero
- Zcash
- Aztec Protocol
- Secret Network
Квантова устойчивост - Пост-квантова криптография
- Квантово-устойчиви алгоритми
- Хибридни решения
- Нови криптографски стандарти
- Защита от квантови атаки
- Обновяване на протоколите
- QRL
- IOTA
- Quantum Resistant Ledger

Детайлен анализ на технологичните тенденции:

Layer 2 решения за скалируемост

  • Optimistic Rollups:
    • Обработват транзакции извън основната верига
    • Използват fraud proofs за сигурност
    • По-ниски такси и по-висока пропускателна способност
    • Предизвикателство: период на изчакване за тегления
  • ZK Rollups:
    • Използват математически доказателства за валидност
    • Незабавна финалност на транзакциите
    • По-сложна имплементация
    • По-високи изчислителни изисквания
  • Странични вериги:
    • Независими блокчейни с мостове към основната верига
    • Собствени механизми за консенсус
    • Гъвкавост в дизайна и приложението

Интероперабилност между блокчейни

  • Междуверижни протоколи:
    • Стандартизирани протоколи за комуникация
    • Сигурен обмен на данни и активи
    • Унифицирани стандарти за съобщения
  • Мостове:
    • Централизирани vs. децентрализирани
    • Механизми за защита на активите
    • Автоматизирана ликвидност
  • Междуверижни приложения:
    • DeFi протоколи работещи на множество вериги
    • Обединени ликвидни пулове
    • Оптимизация на газ таксите

Подобрена поверителност

  • Zero-Knowledge технологии:
    • ZK-SNARKs и ZK-STARKs
    • Приватни смарт контракти
    • Верифицируеми изчисления
  • Хомоморфно криптиране:
    • Изчисления върху криптирани данни
    • Защита на чувствителна информация
    • Интеграция с DeFi протоколи
  • MPC (Multi-Party Computation):
    • Разпределено управление на ключове
    • Институционални решения
    • Подобрена сигурност на портфейли

Квантова устойчивост

  • Пост-квантови алгоритми:
    • Решетъчна криптография
    • Хеш-базирани подписи
    • Суперсингуларни изогении
  • Мигриране на съществуващи системи:
    • Постепенно обновяване на протоколите
    • Хибридни криптографски схеми
    • Обратна съвместимост
  • Нови защитни механизми:
    • Квантово-устойчиви хеш функции
    • Адаптивни криптографски схеми
    • Динамично обновяване на сигурността

8.2 Регулаторна среда

Основни аспекти на регулацията:

  • Класификация на криптоактивите
  • AML/KYC изисквания
  • Данъчно третиране
  • Институционално участие

8.3 Потенциални приложения

Област Приложение Очаквано въздействие
Финанси DeFi 2.0, институционални услуги Високо
Игри GameFi, метавселени Средно към високо
Идентичност Децентрализирана идентичност Много високо
IoT M2M плащания, автоматизация Високо

Заключение:

Криптовалутите представляват динамично развиваща се технология с потенциал да трансформира множество индустрии. Разбирането на техническите, икономическите и търговските аспекти е ключово за успешното навигиране в тази нова финансова екосистема. Бъдещето на криптовалутите ще зависи от развитието на технологиите, регулаторната рамка и степента на масово възприемане.

Монте Карло симулация за оценка на проектен бюджет

Монте Карло симулация за оценка на проектен бюджет

1. Въведение и значимост

Монте Карло симулацията е мощен инструмент за оценка на риска и несигурността в проектното управление. При управлението на софтуерни проекти, точното определяне на бюджета е критично за успеха на проекта.

Защо е важна тази задача?

  • Помага за по-точна оценка на необходимия бюджет
  • Позволява количествена оценка на рисковете
  • Дава възможност за определяне на реалистични буфери
  • Подпомага вземането на информирани решения

2. Методология

Монте Карло симулацията за бюджетно планиране се базира на принципа на многократното случайно семплиране. Вместо да разчитаме на единични точкови оценки, които често се оказват неточни, методът генерира хиляди възможни сценарии, вземайки предвид вероятностните разпределения на различните компоненти на бюджета. Това ни позволява да получим не просто една прогнозна стойност, а цяло разпределение на възможните резултати, което много по-добре отразява реалната несигурност в проектното планиране.

Особено важен аспект на методологията е интегрирането на рисковите фактори. За разлика от традиционното бюджетно планиране, където рисковете често се отчитат чрез фиксиран процент буфер, Монте Карло симулацията позволява моделиране на сложни взаимодействия между различните рискове. Всеки рисков фактор се характеризира с вероятност на възникване и потенциално въздействие, като в симулацията тези рискове могат да се материализират независимо един от друг, създавайки множество различни комбинации от сценарии. Това води до много по-реалистична оценка на необходимия буфер, базирана на действителната рискова експозиция на проекта.

2.1. Основни компоненти

  • Идентификация на ключови променливи разходи
  • Определяне на разпределения на вероятностите
  • Интегриране на рискови фактори
  • Многократно симулиране на сценарии
  • Статистически анализ на резултатите

2.2. PERT разпределение

Използваме PERT (Program Evaluation and Review Technique) разпределение със следните оценки:

  • Оптимистична (O): Базова сума
  • Най-вероятна (M): Базова сума + 50% от буфера
  • Песимистична (P): Максимална сума с отчитане на рискове

Formula: Expected Value = (O + 4M + P) / 6

3. Псевдокод на решението

ФУНКЦИЯ monte_carlo_simulation(iterations, activities, risks):
    резултати = празен_масив()
    
    ЗА ВСЯКО i ОТ 1 ДО iterations:
        общ_бюджет = 0
        
        ЗА ВСЯКА дейност В activities:
            // Генериране на случайна стойност по PERT разпределение
            стойност = pert_random(
                дейност.оптимистична,
                дейност.най_вероятна,
                дейност.песимистична
            )
            
            // Прилагане на рискови фактори
            ЗА ВСЕКИ риск В risks:
                АКО random() < риск.вероятност:
                    стойност *= (1 + риск.въздействие)
                    
            общ_бюджет += стойност
        
        // Добавяне на допълнителни разходи
        общ_бюджет *= 1.3  // 30% за технологии и обучения
        
        добави(резултати, общ_бюджет)
    
    ВЪРНИ резултати

ФУНКЦИЯ анализирай_резултати(резултати, планиран_бюджет):
    средна_стойност = изчисли_средно(резултати)
    стандартно_отклонение = изчисли_std(резултати)
    персентил_90 = изчисли_персентил(резултати, 90)
    вероятност_превишаване = изчисли_вероятност_превишаване(резултати, планиран_бюджет)
    
    ВЪРНИ {
        средна_стойност,
        стандартно_отклонение,
        персентил_90,
        вероятност_превишаване
    }
        

Обяснение на псевдокода

Основна функция monte_carlo_simulation

Функцията приема три параметра:

  • iterations - брой повторения на симулацията (обикновено 10000)
  • activities - списък с дейностите и техните оценки
  • risks - списък с рисковите фактори

За всяка итерация функцията:

  1. Инициализира нов общ бюджет за текущата итерация
  2. Преминава през всяка дейност и генерира случайна стойност според PERT разпределението
  3. За всяка генерирана стойност прилага рисковите фактори според техните вероятности
  4. Добавя допълнителните разходи (30% за технологии и обучения)
  5. Запазва крайния резултат за тази итерация

PERT разпределение

Функцията pert_random реализира PERT разпределението чрез:

  • Използване на Beta разпределение за апроксимация
  • Изчисляване на средна стойност по формулата (O + 4M + P) / 6
  • Трансформиране на генерираните стойности в желания интервал

Функция за анализ

Функцията анализирай_резултати извършва статистически анализ чрез:

  • Изчисляване на средната стойност на всички симулации
  • Определяне на стандартното отклонение за оценка на волатилността
  • Изчисляване на 90-ти персентил за определяне на препоръчителния буфер
  • Определяне на вероятността за превишаване на планирания бюджет

Тези метрики дават цялостна картина на риска и необходимия буфер.

Ключови аспекти на имплементацията

  • Използване на вероятностно разпределение вместо фиксирани стойности
  • Независимо прилагане на рискови фактори за по-реалистично моделиране
  • Отчитане на допълнителни разходи като процент от основния бюджет
  • Статистически анализ за извличане на значими заключения

4. Python имплементация

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

# Define project activities and their estimates
activities = {
    'Project Manager': {
        'optimistic': 6460.48,
        'most_likely': 6945.02,
        'pessimistic': 7429.55 * 1.2
    },
    'Senior Dev 1': {
        'optimistic': 26103.69,
        'most_likely': 28061.47,
        'pessimistic': 30019.24 * 1.3
    },
    'Senior Dev 2': {
        'optimistic': 24886.95,
        'most_likely': 26753.47,
        'pessimistic': 28619.99 * 1.3
    },
    'Junior Dev 1': {
        'optimistic': 6797.73,
        'most_likely': 7307.56,
        'pessimistic': 7817.39 * 1.15
    },
    'Junior Dev 2': {
        'optimistic': 6244.19,
        'most_likely': 6712.51,
        'pessimistic': 7180.82 * 1.15
    },
    'QA Engineer': {
        'optimistic': 5532.38,
        'most_likely': 5947.31,
        'pessimistic': 6362.24 * 1.25
    }
}

# Risk factors from risk register
risk_factors = {
    'integration_issues': {'probability': 0.8, 'impact': 0.25},
    'performance_issues': {'probability': 0.8, 'impact': 0.20},
    'requirement_changes': {'probability': 0.8, 'impact': 0.15},
    'technical_challenges': {'probability': 0.6, 'impact': 0.20}
}

def pert_random(opt, likely, pess, size=1):
    """Generate random values using PERT distribution"""
    alpha = 4
    mean = (opt + alpha * likely + pess) / (alpha + 2)
    variance = ((pess - opt) ** 2) / 36
    a = ((mean - opt) * (2 * pess - opt - mean)) / variance
    b = (a * (pess - mean)) / (mean - opt)
    return np.random.beta(a, b, size=size) * (pess - opt) + opt

def run_simulation(n_iterations=10000):
    """Run Monte Carlo simulation"""
    results = []
    
    for _ in range(n_iterations):
        iteration_total = 0
        
        for activity, estimates in activities.items():
            cost = pert_random(
                estimates['optimistic'],
                estimates['most_likely'],
                estimates['pessimistic']
            )[0]
            
            for risk in risk_factors.values():
                if np.random.random() < risk['probability']:
                    cost *= (1 + risk['impact'])
            
            iteration_total += cost
        
        iteration_total *= 1.3
        results.append(iteration_total)
    
    return np.array(results)

def analyze_results(simulation_results):
    """Analyze simulation results"""
    planned_budget = 126772.39
    
    mean_cost = np.mean(simulation_results)
    std_dev = np.std(simulation_results)
    percentile_90 = np.percentile(simulation_results, 90)
    overrun_prob = np.mean(simulation_results > planned_budget)
    recommended_buffer = percentile_90 - planned_budget
    
    print(f"\nSimulation Analysis Results:")
    print(f"Mean Expected Cost: {mean_cost:,.2f} лв.")
    print(f"Standard Deviation: {std_dev:,.2f} лв.")
    print(f"90th Percentile Cost: {percentile_90:,.2f} лв.")
    print(f"Probability of Budget Overrun: {overrun_prob:.1%}")
    print(f"Recommended Additional Buffer: {max(0, recommended_buffer):,.2f} лв.")
    
    plt.figure(figsize=(10, 6))
    plt.hist(simulation_results, bins=50, density=True, alpha=0.7)
    plt.axvline(planned_budget, color='r', linestyle='dashed', label='Planned Budget')
    plt.axvline(mean_cost, color='g', linestyle='dashed', label='Mean Simulated Cost')
    plt.axvline(percentile_90, color='y', linestyle='dashed', label='90th Percentile')
    plt.title('Monte Carlo Simulation Results')
    plt.xlabel('Total Project Cost (лв.)')
    plt.ylabel('Probability Density')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.show()

# Run simulation and analyze results
results = run_simulation(10000)
analyze_results(results)
        

5. Заключение

Тази симулация предоставя ценна информация за:

  • Очакваната средна стойност на проектния бюджет
  • Вероятността за превишаване на планирания бюджет
  • Препоръчителния размер на буфера
  • Разпределението на възможните крайни стойности

Важно е да се отбележи, че симулацията е толкова добра, колкото са входните данни. Редовното актуализиране на оценките и рисковите фактори е ключово за поддържане на точността на модела.

Въведение в Блокчейн програмирането и Solidity

Въведение в Блокчейн програмирането и Solidity

гл. ас. д-р Георги Пашев http://gpashev.com

Лекция 1: Основи на Блокчейн технологията

1.1 Какво е блокчейн?

Блокчейн е разпределена база данни, която се споделя между възлите на компютърна мрежа. Като база данни, блокчейнът съхранява информация електронно в цифров формат. Блокчейните са най-известни с тяхната ключова роля в криптовалутните системи като Bitcoin за поддържане на сигурен и децентрализиран запис на транзакциите.

1.2 Основни характеристики

  • Децентрализация: Няма централен орган, който контролира мрежата
  • Прозрачност: Всички транзакции са публично видими
  • Неизменност: Веднъж записани, данните не могат да бъдат променени
  • Сигурност: Използва криптография за защита на транзакциите

1.3 Как работи блокчейн?

  • Транзакциите се групират в блокове
  • Всеки блок съдържа:
    • Транзакции
    • Timestamp
    • Hash на предишния блок
    • Nonce (използва се за mining)

Лекция 2: Въведение в Smart Contracts

2.1 Какво са Smart Contracts?

Smart Contracts са самоизпълняващи се договори, където условията на споразумението между купувач и продавач са директно записани в програмен код. Кодът и споразуменията съществуват в разпределена, децентрализирана блокчейн мрежа.

2.2 Характеристики на Smart Contracts

  • Автоматично изпълнение
  • Прозрачност
  • Неизменност
  • Точност
  • Бързина
  • Сигурност

Лекция 3: Въведение в Solidity

3.1 Какво е Solidity?

Solidity е обектно-ориентиран програмен език за писане на smart contracts. Той е разработен специално за Ethereum платформата и е основният език за разработка на smart contracts.

3.2 Основна структура на Solidity contract

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MyFirstContract {
    // Декларация на променливи
    uint public myNumber;
    
    // Конструктор
    constructor() {
        myNumber = 0;
    }
    
    // Функция за промяна на стойността
    function setNumber(uint _newNumber) public {
        myNumber = _newNumber;
    }
    
    // Функция за четене на стойността
    function getNumber() public view returns (uint) {
        return myNumber;
    }
}

3.3 Основи на Solidity

3.3.1 Променливи и типове данни

Стойностни типове (Value Types)
// Булеви
bool isActive = true;

// Цели числа
uint256 maxAmount = 1000;    // Без знак, 256 бита
int8 temperature = -10;      // Със знак, 8 бита
uint8 small = 255;          // 8 бита
uint16 medium = 65535;      // 16 бита

// Адреси
address owner = msg.sender;
address payable recipient;   // Може да получава ETH

// Изброявания
enum Status { Pending, Active, Closed }
Status current = Status.Pending;

// Fixed-point числа
fixed256x18 price = 3.14;   // 256 бита с 18 десетични позиции
Референтни типове (Reference Types)
// Масиви
uint[] numbers;              // Динамичен масив
uint[5] fixedNumbers;        // Фиксиран масив
bytes32 hash;               // Фиксиран bytes масив
bytes data;                 // Динамичен bytes масив

// Структури
struct Person {
    string name;
    uint age;
    address wallet;
}

// Mapping (асоциативни масиви)
mapping(address => uint) public balances;
mapping(uint => mapping(address => bool)) public complexMapping;

3.3.2 Оператори

Аритметични оператори
uint a = 10;
uint b = 5;

uint sum = a + b;        // Събиране
uint diff = a - b;       // Изваждане
uint prod = a * b;       // Умножение
uint quot = a / b;       // Деление
uint rem = a % b;        // Остатък
uint inc = a++;         // Инкрементиране
uint dec = b--;         // Декрементиране
Оператори за сравнение
bool isEqual = a == b;         // Равенство
bool notEqual = a != b;        // Неравенство
bool greater = a > b;          // По-голямо
bool less = a < b;            // По-малко
bool greaterEq = a >= b;      // По-голямо или равно
bool lessEq = a <= b;         // По-малко или равно
Логически оператори
bool result1 = true && false;  // Логическо И
bool result2 = true || false;  // Логическо ИЛИ
bool result3 = !true;          // Логическо НЕ
Побитови оператори
uint c = a & b;    // Побитово И
uint d = a | b;    // Побитово ИЛИ
uint e = a ^ b;    // Побитово изключващо ИЛИ
uint f = ~a;       // Побитово НЕ
uint g = a << 1;   // Побитово изместване наляво
uint h = a >> 1;   // Побитово изместване надясно

3.3.3 Константи и Имутабилни променливи

// Константи - стойността се определя по време на компилация
uint256 constant MAX_UINT = 2**256 - 1;
string constant VERSION = "1.0.0";

// Имутабилни променливи - стойността се определя в конструктора
address immutable owner;
uint256 immutable creationTime;

constructor() {
    owner = msg.sender;
    creationTime = block.timestamp;
}

3.3.4 Специални променливи и функции

Глобални променливи
address sender = msg.sender;          // Адрес на изпращача
uint value = msg.value;               // Изпратени ETH
bytes data = msg.data;                // Данни на съобщението
uint timestamp = block.timestamp;      // Timestamp на блока
uint blockNumber = block.number;       // Номер на блока
address coinbase = block.coinbase;     // Адрес на майнъра
uint difficulty = block.difficulty;    // Трудност на блока
uint gasLimit = block.gaslimit;        // Gas лимит на блока

3.3.5 Видимост на променливите

contract VisibilityExample {
    uint private privateVar;     // Достъпна само в текущия contract
    uint internal internalVar;   // Достъпна в текущия contract и наследниците
    uint public publicVar;       // Достъпна отвсякъде, създава getter
    
    // External не се прилага за променливи
}

3.3.6 Функции

Декларация и видимост
contract FunctionExample {
    // Public функция - достъпна отвсякъде
    function publicFunction() public {
        // код
    }
    
    // Private функция - достъпна само в текущия contract
    function privateFunction() private {
        // код
    }
    
    // Internal функция - достъпна в текущия contract и наследниците
    function internalFunction() internal {
        // код
    }
    
    // External функция - достъпна само отвън
    function externalFunction() external {
        // код
    }
}
Модификатори на функции
contract ModifierExample {
    // View - не променя състоянието
    function viewFunction() public view returns (uint) {
        return someValue;
    }
    
    // Pure - не чете и не променя състоянието
    function pureFunction(uint x) public pure returns (uint) {
        return x * 2;
    }
    
    // Payable - може да получава ETH
    function payableFunction() public payable {
        // код
    }
    
    // Виртуална функция - може да бъде презаписана
    function virtualFunction() public virtual {
        // код
    }
    
    // Презаписана функция
    function overriddenFunction() public override {
        // код
    }
}
Модификатори (Function Modifiers)
contract ModifierPatterns {
    address public owner;
    bool public locked;
    
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }
    
    modifier noReentrant() {
        require(!locked, "No reentrancy");
        locked = true;
        _;
        locked = false;
    }
    
    // Използване на модификатори
    function sensitiveFunction() 
        public 
        onlyOwner 
        noReentrant 
    {
        // код
    }
}
Events
contract EventExample {
    // Деклариране на event
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    
    function transfer(address to, uint256 amount) public {
        // Емитиране на event
        emit Transfer(msg.sender, to, amount);
    }
}

Лекция 4: Разработка на Smart Contracts

4.1 Развойна среда

  • Remix IDE: Онлайн среда за разработка
  • Truffle: Развойна рамка
  • Hardhat: Модерна развойна среда
  • Web3.js/Ethers.js: Библиотеки за взаимодействие с блокчейн

4.2 Основни концепции

  • Gas: Такса за изпълнение на транзакции
  • State Variables: Променливи, съхранявани в блокчейна
  • Functions: Видове функции (public, private, internal, external)
  • Events: Механизъм за logging
  • Modifiers: За промяна поведението на функции

4.3 Пример за по-сложен Smart Contract

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Token {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    
    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
        decimals = 18;
        totalSupply = 1000000 * (10 ** uint256(decimals));
        balanceOf[msg.sender] = totalSupply;
    }
    
    function transfer(address to, uint256 value) public returns (bool success) {
        require(balanceOf[msg.sender] >= value, "Insufficient balance");
        balanceOf[msg.sender] -= value;
        balanceOf[to] += value;
        emit Transfer(msg.sender, to, value);
        return true;
    }
}

Лекция 5: Добри практики и сигурност

5.1 Добри практики

  • Използване на последна версия на Solidity
  • Правилно управление на достъпа
  • Оптимизация на gas
  • Документиране на кода
  • Използване на утвърдени библиотеки (OpenZeppelin)

5.2 Сигурност

  • Reentrancy атаки
  • Integer overflow/underflow
  • Timestamp dependence
  • Front-running
  • Denial of Service (DoS)

5.3 Примери за защита

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SecureContract {
    mapping(address => uint) public balances;
    bool private locked;
    
    modifier noReentrant() {
        require(!locked, "No reentrancy");
        locked = true;
        _;
        locked = false;
    }
    
    function withdraw() public noReentrant {
        uint balance = balances[msg.sender];
        require(balance > 0, "No balance");
        balances[msg.sender] = 0;
        (bool success, ) = msg.sender.call{value: balance}("");
        require(success, "Transfer failed");
    }
}

Заключение

Това въведение в блокчейн програмирането и Solidity покрива основните концепции и практики, необходими за започване на разработка на smart contracts. За да станете успешен блокчейн разработчик, е важно да:

  1. Разбирате основните концепции на блокчейн технологията
  2. Овладеете синтаксиса и особеностите на Solidity
  3. Следвате добрите практики за сигурност
  4. Практикувате чрез създаване на различни проекти
  5. Следите развитието на технологията и новите стандарти

Лекция 6: Интеграция на Python с Smart Contracts

6.1 Настройка на развойната среда

Инсталиране на необходимите инструменти

# Инсталиране на Python пакети
pip install web3
pip install python-dotenv
pip install eth-account

# Инсталиране на Ganache за локална blockchain мрежа
npm install -g ganache-cli

Структура на проекта

my_blockchain_project/
├── contracts/
│   └── MyContract.sol
├── build/
│   └── contracts/
├── scripts/
│   └── deploy.py
│   └── interact.py
├── .env
└── requirements.txt

6.2 Компилиране и деплойване на Smart Contract

Пример за deploy скрипт (deploy.py)

from web3 import Web3
from eth_account import Account
import json
import os
from dotenv import load_dotenv

# Зареждане на environment променливи
load_dotenv()

# Конфигурация
INFURA_URL = os.getenv("INFURA_URL")  # или локален URL за тестване
PRIVATE_KEY = os.getenv("PRIVATE_KEY")

# Свързване към blockchain
w3 = Web3(Web3.HTTPProvider(INFURA_URL))

# Създаване на акаунт от private key
account = Account.from_key(PRIVATE_KEY)

def deploy_contract():
    # Зареждане на компилирания contract
    with open("build/contracts/MyContract.json") as f:
        contract_json = json.load(f)
    
    # Извличане на contract ABI и bytecode
    contract_abi = contract_json['abi']
    contract_bytecode = contract_json['bytecode']
    
    # Създаване на contract обект
    Contract = w3.eth.contract(abi=contract_abi, bytecode=contract_bytecode)
    
    # Изграждане на транзакция
    transaction = Contract.constructor().build_transaction({
        'from': account.address,
        'nonce': w3.eth.get_transaction_count(account.address),
        'gas': 2000000,
        'gasPrice': w3.eth.gas_price
    })
    
    # Подписване на транзакцията
    signed_txn = w3.eth.account.sign_transaction(transaction, PRIVATE_KEY)
    
    # Изпращане на транзакцията
    tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
    
    # Чакане за потвърждение
    tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
    
    return tx_receipt.contractAddress

if __name__ == "__main__":
    contract_address = deploy_contract()
    print(f"Contract deployed at: {contract_address}")

6.3 Взаимодействие със Smart Contract

Пример за interaction скрипт (interact.py)

from web3 import Web3
from eth_account import Account
import json
import os
from dotenv import load_dotenv

load_dotenv()

# Конфигурация
INFURA_URL = os.getenv("INFURA_URL")
PRIVATE_KEY = os.getenv("PRIVATE_KEY")
CONTRACT_ADDRESS = os.getenv("CONTRACT_ADDRESS")

# Свързване към blockchain
w3 = Web3(Web3.HTTPProvider(INFURA_URL))

# Създаване на акаунт
account = Account.from_key(PRIVATE_KEY)

def load_contract():
    # Зареждане на contract ABI
    with open("build/contracts/MyContract.json") as f:
        contract_json = json.load(f)
    contract_abi = contract_json['abi']
    
    # Създаване на contract обект
    contract = w3.eth.contract(
        address=CONTRACT_ADDRESS,
        abi=contract_abi
    )
    return contract

def read_contract_data():
    contract = load_contract()
    
    # Извикване на view функция
    result = contract.functions.getNumber().call()
    return result

def send_transaction():
    contract = load_contract()
    
    # Изграждане на транзакция
    transaction = contract.functions.setNumber(42).build_transaction({
        'from': account.address,
        'nonce': w3.eth.get_transaction_count(account.address),
        'gas': 100000,
        'gasPrice': w3.eth.gas_price
    })
    
    # Подписване и изпращане на транзакцията
    signed_txn = w3.eth.account.sign_transaction(transaction, PRIVATE_KEY)
    tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
    
    # Чакане за потвърждение
    tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
    return tx_receipt

def handle_event(event):
    print(f"New event: {event}")

def listen_for_events():
    contract = load_contract()
    
    # Дефиниране на event filter
    event_filter = contract.events.MyEvent.create_filter(fromBlock='latest')
    
    # Безкраен цикъл за следене на събития
    while True:
        for event in event_filter.get_new_entries():
            handle_event(event)

if __name__ == "__main__":
    # Пример за използване
    current_value = read_contract_data()
    print(f"Current value: {current_value}")
    
    # Изпращане на транзакция
    tx_receipt = send_transaction()
    print(f"Transaction successful: {tx_receipt.transactionHash.hex()}")

6.4 Конфигурационен файл (.env)

# .env file
INFURA_URL=https://mainnet.infura.io/v3/your-project-id
PRIVATE_KEY=your-private-key
CONTRACT_ADDRESS=deployed-contract-address

6.5 Добри практики при Python интеграция

  1. Управление на грешки
from web3.exceptions import ContractLogicError

def safe_contract_call():
    try:
        result = contract.functions.myFunction().call()
        return result
    except ContractLogicError as e:
        print(f"Contract error: {e}")
        return None
    except Exception as e:
        print(f"Unexpected error: {e}")
        return None
  1. Gas оптимизация
def estimate_gas_and_send():
    # Оценка на gas
    gas_estimate = contract.functions.myFunction().estimate_gas()
    
    # Добавяне на buffer
    gas_limit = int(gas_estimate * 1.2)
    
    # Изграждане на транзакция с оптимизиран gas
    transaction = contract.functions.myFunction().build_transaction({
        'from': account.address,
        'gas': gas_limit,
        'gasPrice': w3.eth.gas_price,
        'nonce': w3.eth.get_transaction_count(account.address)
    })
  1. Async операции
import asyncio
from web3.auto import w3

async def async_contract_interaction():
    async for event in contract.events.MyEvent.create_filter(fromBlock='latest').get_all_entries():
        print(f"New event: {event}")

async def main():
    await async_contract_interaction()

if __name__ == "__main__":
    asyncio.run(main())

6.6 Тестване

Пример за unit test с pytest

import pytest
from web3 import Web3
from eth_tester import EthereumTester
from web3.providers.eth_tester import EthereumTesterProvider

@pytest.fixture
def web3_test():
    return Web3(EthereumTesterProvider(EthereumTester()))

@pytest.fixture
def contract(web3_test):
    with open("build/contracts/MyContract.json") as f:
        contract_json = json.load(f)
    
    contract = web3_test.eth.contract(
        abi=contract_json['abi'],
        bytecode=contract_json['bytecode']
    )
    
    tx_hash = contract.constructor().transact()
    tx_receipt = web3_test.eth.wait_for_transaction_receipt(tx_hash)
    
    return web3_test.eth.contract(
        address=tx_receipt.contractAddress,
        abi=contract_json['abi']
    )

def test_contract_function(contract, web3_test):
    # Arrange
    account = web3_test.eth.accounts[0]
    
    # Act
    tx_hash = contract.functions.setNumber(42).transact({'from': account})
    web3_test.eth.wait_for_transaction_receipt(tx_hash)
    
    # Assert
    result = contract.functions.getNumber().call()
    assert result == 42

Полезни ресурси

  • Официална документация на Solidity
  • Web3.py документация
  • OpenZeppelin документация
  • Ethereum Stack Exchange
  • GitHub repositories с примери
  • Online курсове и туториали

Дисциплина: Компютърна Лингвистика в Областта на Биоинформатиката

Компютърна Лингвистика в Областта на Биоинформатиката

гл. ас. д-р Георги Петров Пашев

http://gpashev.com § georgepashev@uni-plovdiv.bg

Кратко описание на дисциплината:

Този курс се фокусира върху приложението на компютърна лингвистика в областта на биоинформатиката, като се разглеждат техники за обработка на естествен език и машинно обучение, приложими в анализа на биологични данни. Курсът съчетава теоретични знания с практически умения в програмиране на Python и Rust, като изследва интеграцията на тези езици в биоинформатични приложения.

Списък с теми за лекциите (7 седмици):

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).

Списък с Упражнения за Всяка Седмица

Седмица 1: Въведение в Компютърната Лингвистика и Биоинформатика

· Упражнение: Анализиране и обработка на текстови данни с Python. Студентите трябва да напишат скрипт за извличане на информация от научни публикации, свързани с биоинформатиката.

Седмица 2: Машинно Обучение в Биоинформатиката

· Упражнение: Създаване на базов класификатор в Python за разпознаване на видове ДНК последователности. Студентите използват предоставени данни за трениране на модела.

Седмица 3: Естествен Езиков Обработка (NLP) и Геномни Данни

· Упражнение: Имплементиране на NLP алгоритми в Rust за анализ на геномни последователности. Студентите трябва да адаптират традиционни NLP методи за работа с генетичен код.

Седмица 4: Биоинформатични Бази Данни и Тяхната Интеграция

· Упражнение: Интегриране на биологични бази данни в Python програма. Студентите създават интерфейс за достъп и анализ на данни от биоинформатични бази данни.

Седмица 5: Използване на GPT-4 и LLAMA2 за Анализ на Биологични Данни

· Упражнение: Работа с GPT-4 API или LLAMA2 за генериране на предсказания или анализи въз основа на биологични данни. Студентите разработват прототип на приложение, използващо тези модели.

Седмица 6: Развитие на Уеб и Десктоп Интерфейси за Биоинформатични Приложения

· Упражнение: Създаване на прост уеб или десктоп базиран UI в Rust, който да показва резултати от биоинформатични анализи. Студентите трябва да интегрират своя код в потребителски интерфейс.

Седмица 7: Проектна Работа и Научно Писане

· Упражнение: Начална разработка на проекта и написване на научен обзор за избраната тема. Студентите трябва да определят обхвата на своя проект и да изготвят план за научна публикация.

Тези упражнения са насочени към развитие на практически умения и подготовка за финалния проект, като същевременно се засилва теоретичната основа на дисциплината.

Литература:

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>
...

Писмото ми до Слави Трифонов

До Станислав Трифонов,
в качеството му на
идеолог и председател на ПП «Има такъв народ»
Отворено писмо
Привет,
г-н Станислав (Слави) Трифонов,
Правя това обръщение към Вас, защото по едно стечение на обстоятелства, къде случайни, къде неслучайни, вие сте единствения със шанс да направите правителство. Във връзка с това, бих ви посъветвал да направите следното:
  1. Да се извините на хората, че преди години сте станал медиен двигател за популяризирането на Бойко Борисов (Боко), който сега (уж) сте тръгнал да «изчегъртвате»;
  2. Да хвърлите повече светлина върху ваши евентуално минали взаимовръзки с подземния и сенчест свят и приятелски връзки с мафиоти, които вече не са между живите, или такива, които са още живи;
  3. Да хвърлите светлина върху личния ви живот, включително и това коя ви е текущата любовница. Вие отсега нататък сте не просто публична, но и обществена личност с политическо влияние и власт и трябва покрай вас всичко да е публично и осветено и изкоментирано от Вас самия (ако не искате да го коментират недоброжелателите); Също така, споделете с аудиторията дали ползвате услуги на «леки жени» и колко често и дали те биха могли да изкопчат нежелани компромати за Вас, както «Мата Хари» направи с Боко;
  4. Да направите «кръгла маса» с всички партии в парламента и да създадете приоритетен списък от национални цели, които да преследвате и изпълнявате в рамките на следващ мандат и това да стане възможно най-бързо, за да не губите време;
  5. Да направите управленска коалиция с всички партии, които са в парламента и не са ГЕРБ, ДПС;
  6. Да направите работещ Закон за референдумите по Швейцарски модел, ако е необходимо и с конституционни кръпки, за да се даде реална власт в ръцете на хората;
  7. Да уволните всички назначения на ГЕРБ в държавната администрация и да назначите свои след публично предавани конкурси в социалните мрежи и/или във вашата телевизия и/или по БНТ;
  8. Да намалите броя министерства, чрез сливане. Например, социално и здравно могат да се слеят под общо име Министерство на Милосърдието или Министерство на Разходите за хората (сам изберете кое име е по-подходящо, а можете да изберете и друго); Военното и МВР и ДАНС и др. служби могат да се слеят под общо име Министерство на Държавната Репресия или нещо подобно; Идеята е тук да се постигне Швейцарския модел с малко министри и намалена администрация до санитарния минимум;​​​​​​​
  9. Да изпълните нещата от вашия си референдум като де факто успешно проведен референдум и то в условията на закон за референдумите, който реално е репресивен, спрямо тях;
  10. Подобно на Швейцария, да предлагате на референдуми 2 пъти в годината важни въпроси за управлението;
  11. Да създадете най-после Закон за личния фалит и опрощаване на дългове и тяхната наследственост на де факто фалирали физически лица;
  12. Да подложите на референдум евентуално узаконяване на проституцията (бизнес за милиарди, който може да вкара свежи пари в Бюджета и винаги е добра идея да е официално регулиран); както и леката дрога за консумация в лицензирани Кофи шопове (по Холандски модел);
  13. Също така ви представям и други мои идеи, които съм развил още през далечната 2012г. в този онлайн документ, който през 2013 година е привлекъл вниманието на българи в Чикаго и са го препечатали в техен сайт: https://www.eurochicago.com/2013/06/scriptura-voluntatis-nostrae/https://antikomunisti.blogspot.com/2013/03/scriptura-voluntatis-nostrae.html

    Братята британци имат ценна поговорка — «Отчаяните времена изискват отчаяни мерки». Време е за отчаяни мерки и за кардинални реформи. Дано Вие да сте на необходимата висота, за да ги направите.
--
Георги Пашев

Жребий за партия за гласуване

Здравейте,

Предполагам, че много от вас сте се сблъсквали с добре познатия проблем - за кого да гласувате. Ако не можете да изберете, понеже мразите всички участници и не намирате достоен кандидат или тези, които харесвате "нямат реален шанс", според социолозите, можете да приложите стратегия "теглене на жребий чрез отчитане на коефициент на омраза за всеки от кандидатите.

Тук представям имплементация на алгоритъм на 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)


Направих онлайн формуляр, в който ще предавате курсовите си проекти по ППМУ. Линка му е тук (https://uroci.online/mod/url/view.php?id=93)
За да го достъпите, трябва да имате профил в платформата uroci.online и при регистрацията да сте избрали клас "ПУ - 3 курс".
В онлайн курса се намира цялата информация, която ви е необходима: от видеоуроци през програмен код за заданията до примерни теми за задания за КП по ППМУ. Там са указани и минималните изисквания за КП, а именно: 1) поне 2 активитита; 2) работа с локална БД sqlite3.

За Чучхе и разликата с Диалектическия материализъм

Привет,Почти на 100% е ясно, че другарят Ким: вожд и учител на Северна Корея е или пукясал или тежко болен, толкова, че не може да ходи и да стои изправен. Тази новина засили любопитството ми към севернокорейската "демокрация". Посетих сайта на официалното им радио "Гласът на Корея" (http://www.vok.rep.kp/index.php?CHANNEL=6&lang=). Ето тук например с гордост заявяват, че мобилизират хора да им работят за пътища (http://www.vok.rep.kp/index.php?CHANNEL=6&lang=).  Това са техните "бригади". Ееей, няма ги вече при нас тия времена: да те емнат политкомисарите да правиш нещо съвсем различно от професията си в името на вожда и учителя и държавата

Избираема дисциплина "Програмиране с Node.JS"

Избираема дисциплина "Програмиране с Node.JS"

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

http://gpashev.com

 

Упражнения СТ2

Материали за упражненията по СТ-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

(Изходния код се предоставя по време на упражненията).


Помощен файл за упражненията свалете от тук

download

 

Save

Подготовка за контролна работа номер 2 по ОС

Задачи за подготовка за Контролна работа № 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) Cobault, Paul, Linux Fundamentals

2) Ryans Tutorials, BASH Scripting Tutorial

Учебни материали за Контролна 1 по ОС

 

Учебни материали за Контролна 1 по ОС при ас. д-р инж. Георги Пашев:


  1. Ръководство за работа с Линукс: Linux Fundamentals, Paul Cobbault (до 203 стр. за 1. контролна)
  2. За документация за команди: команда man <команда> или Linux Manual Pages.


Примерни задачи за контролната:

Задача 1:

Да се напише команден ред, който:

  • Създава папка с име one, влиза в нея и;
  • Създава файл 1.txt, който съдържа имената на всички файлове и/или папки в директорията ~, сортирани по азбучен ред.
  • Създава файл 2.txt, който е symlink към 1.txt

Решение:

mkdir one

cd one

ls ~ | sort > 1.txt

ln -s 1.txt 2.txt


Задача 2:

Да се напише команден ред, който:

  1. Създава папка с име two, влиза в нея и;
  2. Създава файл 1.txt, който съдържа пътищата до всички .conf файлове в /etc, сортирани по азбучен ред;
  3. Създава файл 2.txt, който е символичен линк към 1.txt;
  4. Създава папка 1/, която съдържа копия на всички файлове от 1.
  5. За всички файлове от 4. добавя право за изпълнение за user group, която е собственик на файловете.

Решение:

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:

2021-2022 ППМУ СТД 3к. зад.
Базов курс (с най-много учебни материали):
ПУ ФМИ 2021 ППМУ упр. - СТД 3к. ред.

 


 

Обща информация по отношение на оценяването:

За специалност СТД (редовни и задочни), оценяването става чрез:

Курсови проекти (отделни) за двете дисциплини ДПМУ, ППМУ. Темите за КП по ППМУ се избират от списък тук. Темите за КП по ДПМУ могат да бъдат избрани от тук.

Минимални изисквания за КП:

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 или виртуална реалност като цяло.

Упражненя по ОС - Серия Задачи 1: BASH

Задачи:

Да се напише bash shell script, който:

1) Приема име на файл и му добавя право за изпълнение. Ако няма такъв файл да изпише съобщение за грешка "No such file."

 

#!/bin/bash
if [ -e $1 ]; then
    chmod +x $1
else
  echo No such file $1.
fi

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

Резюме: Този доклад описва някои разширения на авторската Система за Управление на Граф Бази Данни и приложение върху нея. Целта на приложението е да се поддържа процесен граф на образователен процес, общ за множество от студенти, поддържане на крайни автомати върху процесния граф за всеки един от тези студенти и да прави прогнози и предложения на студентите, кой от пътищата в процесния граф да изберат, на базата на обучителните примери на вече завършилите студенти, които са най-подобни на текущия студент.

Ключови думи: образователен, процесен, граф, предсказване, адаптивно, обучение, машинно обучение