import torch
from sklearn.metrics import f1_score
from utils import load_data, EarlyStopping
from model import HGSAGE
import pandas as pd

def score(logits, labels):
    _, indices = torch.max(logits, dim=1)
    prediction = indices.long().cpu().numpy()
    labels = labels.cpu().numpy()

    accuracy = (prediction == labels).sum() / len(prediction)
    micro_f1 = f1_score(labels, prediction, average='micro')
    macro_f1 = f1_score(labels, prediction, average='macro')

    return accuracy, micro_f1, macro_f1

def evaluate(model, g, features, labels, mask, loss_func, args, movie_nodes=None):
    model.eval()
    with torch.no_grad():
        logits = model(g, features, args)
    if movie_nodes is not None:
        logits = torch.index_select(logits, 0, movie_nodes)
        loss = loss_func(logits[mask], labels[mask])
    else:
        loss = loss_func(logits[mask], labels[mask])
    accuracy, micro_f1, macro_f1 = score(logits[mask], labels[mask])

    return loss, accuracy, micro_f1, macro_f1

def main(args):
    if args['dataset'] == 'IMDB':
        g, features, labels, num_classes, train_idx, val_idx, test_idx, train_mask, \
        val_mask, test_mask, movie_nodes = load_data(args['dataset'])
        movie_nodes = movie_nodes.to(args['device'])
    else:
        g, features, labels, num_classes, train_idx, val_idx, test_idx, train_mask, \
        val_mask, test_mask = load_data(args['dataset'])

    if hasattr(torch, 'BoolTensor'):
        train_mask = train_mask.bool()  # 布尔类型转换
        val_mask = val_mask.bool()
        test_mask = test_mask.bool()

    features = features.to(args['device'])
    labels = labels.to(args['device'])
    train_mask = train_mask.to(args['device'])
    val_mask = val_mask.to(args['device'])
    test_mask = test_mask.to(args['device'])

    model = HGSAGE(meta_paths=[['ma', 'am'], ['md', 'dm']],    # 之前构建的边: pa, ap,组合成meta-path: PAP
                   in_size=features.shape[1],
                   hidden_size=args['hidden_units'],
                   out_size=num_classes,
                   dropout=args['dropout'],
                   aggregator_type=args['aggregator_type']).to(args['device'])
    g = g.to(args['device'])

    stopper = EarlyStopping(patience=args['patience'])
    loss_fcn = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=args['lr'], weight_decay=args['weight_decay'])

    for epoch in range(args['num_epochs']):
        model.train()
        logits = model(g, features, args)
        if args['dataset'] == 'IMDB':
            logits = torch.index_select(logits, 0, movie_nodes)
            loss = loss_fcn(logits[train_mask], labels[train_mask])
        else:
            loss = loss_fcn(logits[train_mask], labels[train_mask])

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        train_acc, train_micro_f1, train_macro_f1 = score(logits[train_mask], labels[train_mask])
        if args['dataset'] == 'IMDB':
            val_loss, val_acc, val_micro_f1, val_macro_f1 = evaluate(model, g, features, labels, val_mask, loss_fcn,
                                                                     args, movie_nodes)
        else:
            val_loss, val_acc, val_micro_f1, val_macro_f1 = evaluate(model, g, features, labels, val_mask, loss_fcn,
                                                                     args)
        early_stop = stopper.step(val_loss.data.item(), val_acc, model)

        print('Epoch {:d} | Train Loss {:.4f} | Train Micro f1 {:.4f} | Train Macro f1 {:.4f} | '
              'Val Loss {:.4f} | Val Micro f1 {:.4f} | Val Macro f1 {:.4f}'.format(
            epoch + 1, loss.item(), train_micro_f1, train_macro_f1, val_loss.item(), val_micro_f1, val_macro_f1))

        if early_stop:
            break

    stopper.load_checkpoint(model)
    if args['dataset'] == 'IMDB':
        test_loss, test_acc, test_micro_f1, test_macro_f1 = evaluate(model, g, features, labels, test_mask, loss_fcn,
                                                                     args, movie_nodes)
    else:
        test_loss, test_acc, test_micro_f1, test_macro_f1 = evaluate(model, g, features, labels, test_mask, loss_fcn,
                                                                     args)
    embeddings = pd.read_csv(f"{args['dataset']}_embeddings_{args['aggregator_type']}+g.csv", header=None)

    if args['dataset'] == 'IMDB':
        embeddings = embeddings.iloc[movie_nodes.cpu(), :]
    embeddings.insert(loc=len(embeddings.columns), column=len(embeddings.columns), value=labels.cpu().numpy())
    embeddings.to_csv(f"{args['dataset']}_embeddings_{args['aggregator_type']}+g.csv", index=False, header=False)
    print('Test loss {:.4f} | Test Micro f1 {:.4f} | Test Macro f1 {:.4f}'.format(
        test_loss.item(), test_micro_f1, test_macro_f1))

if __name__ == '__main__':
    import argparse

    from utils import setup

    parser = argparse.ArgumentParser(description='HGSAGE')
    parser.add_argument('-s', '--seed', type=int, default=1, help='Random seed')
    parser.add_argument('-ld', '--log-dir', type=str, default='results',
                        help='Dir for saving training results')

    args = parser.parse_args().__dict__
    args = setup(args)

    main(args)


import re

def exportToCSV(path, projectList):
    f = open(path, "a+")
    list = removeUsers(projectList)
    for link in list:
        f.write(link + "\n")
    f.close()

def cleanupCSV(path):
    topicsList = []
    f = open(path, "r")
    line = f.readline()
    while line:
        topicsList.append(line)
        line = f.readline()
    topicsList = list(dict.fromkeys(topicsList))
    f.close()
    f = open(path, "w")
    for url in topicsList:
        # print(url)
        f.write(url)
    f.close()

def removeUsers(projectList):
    pList2 = []
    reg = re.compile("https://github.com/user/")
    for project in projectList:
        if reg.match(project) is None:
            pList2.append(project)
    return pList2


import win32com.client
def textToSpeech(text):
    speaker = win32com.client.Dispatch("SAPI.SpVoice")
    speaker.Speak(text)

from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
def responce(df, predict):
    vectorizer = CountVectorizer()
    x = vectorizer.fit_transform(df["quest"])
    y = df["ans"]
    classifier = LogisticRegression(random_state=0, solver="liblinear", multi_class="auto")
    classifier.fit(x,y)
    predict = vectorizer.transform([predict])
    prediction = classifier.predict(predict)
    print(prediction[0])
    textToSpeech(prediction[0])

import sys
def processing(chatbot, products, conversation):
    if chatbot["quest"].str.contains(conversation).any():
        responce(chatbot, conversation)
    elif products["PRODUCT NAME"].str.contains(conversation).any():
        options = list(products[products["PRODUCT NAME"].str.contains(conversation)]["PRODUCT NAME"].head(10))
        if(len(options) > 1):
            print(options)
            textToSpeech("would you like to have")
            textToSpeech(options)
        else:
            print("Okey, "+conversation+" is added to your cart...")
            textToSpeech("Okey,"+conversation+"is added to your cart...")
    elif conversation == "bye" or  conversation == "thank you":
        textToSpeech("Thank You Have a great Day")
        sys.exit("Thank You Have a great Day")
    else:
        print("I didnot get that can you please repeate")
        textToSpeech("I didnot get that can you please repeate")

import speech_recognition as sr
def speechToText(chatbot, products):
    r = sr.Recognizer()
    try:
        with sr.Microphone() as source2:
            r.adjust_for_ambient_noise(source2, duration=0.2)
            print("How may I assist you?")
            audio2 = r.listen(source2)
            print("Your Request is been processed...")
            textToSpeech("Your Request is been processed...")
            global conversation
            conversation = r.recognize_google(audio2)
            conversation = conversation.lower()
            print(conversation)
    except sr.RequestError as e:
        print("Could not request results; {0}".format(e))
        conversation = input("please type Your Request: ")
    except sr.UnknownValueError:
        print("unknown error occured")
        conversation = input("please type Your Request: ")
    processing(chatbot, products, conversation)

import numpy as np
import pandas as pd
#int main(void)
# Driver Code
if __name__ == '__main__':
    chatbot = pd.read_csv("chat.csv")
    #print(chatbot)
    products = pd.read_csv("product_dataset.csv")
    products = products.sort_values('PRODUCT NAME')
    col1 = products["SALES"].astype(str)
    col2 = products["RATING"].astype(str)
    products['Rank'] = (col1+col2).astype(int).rank(method='dense', ascending=False).astype(int)
    products = products.sort_values('Rank')
    #print(products.head(20))
    print("Welcome to Search Assistent. Your finding is just one voice away")
    textToSpeech("Welcome to Search Assistent.")
    textToSpeech("How may I help you?")
    while(True):
        speechToText(chatbot,products)


#!/bin/env python3
# -*- coding:utf-8 -*-

import requests

# get(url)
# return response object
response = requests.get("http://www.baidu.com")
print(response.text)
print(response.status_code)
# 从header中猜测的响应的内容编码方式
print(response.encoding)
# 从内容中分析的编码方式（慢）
print(response.apparent_encoding)
print(response.content)

# get(url,headers=)
# 自定义headers
hd = {'User-agent': '123'}
r = requests.get('http://www.baidu.com', headers=hd)
print(r.request.headers)

# get(url,proxies=)
pxs = {'http': 'http://user:pass@10.10.10.1:1234',
       'https': 'https://10.10.10.1:4321'}
r = requests.get('http://www.baidu.com', proxies=pxs)

# request()
# get()
'''
    kwargs: dict、tuple、true、false；
'''

# head()
# post()
# put()
# path()
# delete()

# common getHtmlText

def getHtmlText(url):
    try:
        r = requests.get(url, timeout=80)
        # 如果状态码不是200 则应发HTTOError异常
        r.raise_for_status()
        # 设置正确的编码方式
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "Something Wrong"


#!/usr/bin/env python3
"""
@ Desc:
@ Author: Byron
@ Date:
"""
from collections import Counter

def find_top_n_recurring_words(string, n):
    counter = Counter()
    for word in string.split():
        counter[word] += 1
    return counter.most_common(n)

def find_top_n_recurring_words2(string, n):
    counter = {}
    for word in string.split():
        if word in counter.keys():
            counter[word] += 1
        else:
            counter[word] = 1
    return sorted(counter.items(), key=lambda x: x[1], reverse=True)[:n]


a_file = open(" credits.txt", "r")

list_of_lines = a_file.readlines()

version = list_of_lines[1].strip('\n').split('.')
separator = '.'
version[2] = (int(version[2]) + 1)
for count, item in enumerate(version):
    version[count] = str(item)
update = (separator.join(version))

list_of_lines[1] = f"{update}\n"
print(update)

a_file = open(" credits.txt", "w")

a_file.writelines(list_of_lines)

a_file.close()


# Greg Attra
# 01/22/2022

# An agent which interacts in the four room simulation to learn a policy

from lib.four_room.policy import Policy
from lib.four_room.simulate import Simulation, State, Transition

class Agent:
    def __init__(
            self,
            init_state: State,
            policy: Policy,
            sim: Simulation) -> None:
        self.policy: Policy = policy
        self.sim: Simulation = sim
        self.state: State = init_state
        self.reward: int = 0

    def step(self) -> Transition:
        """
        Choose an action given the current state using a policy
        and run that action through the simulator to get the next
        state and reward
        """
        action = self.policy.map(self.state)
        transition = self.sim.simulate(self.state, action)

        return transition

    def update(self, transition: Transition) -> None:
        """
        Set the new state and add to the reward
        """
        self.state = transition.state
        self.reward += transition.reward


from src.window_magic.objects.customer import Customer
from src.window_magic.objects.evaluator import Evaluation
from src.window_magic.objects.job import Job
import src.window_magic._resources as r
import csv
import copy
import math
import os

# ====================================================================================
# Output results as desired
# ====================================================================================

_evals_file = "completed_evaluations.csv"
_jh_file    = "analyzed_data_points.csv"

row_obj = {
    "id"                : None,
    "name"              : None,
    "address"           : None,
    "service"           : None,
    "price"             : None,
    "employees"         : None,
    "duration"          : None,
    "rate"              : None,
    "points"            : None,
    "price_variation"   : None
}

job_history_row = {
    "job_id"            : None,
    "customer_id"       : None,
    "customer_name"     : None,
    "services"          : None,
    "job_date"          : None,
    "price"             : None,
    "duration"          : None,
    "employee"          : None
}

def round_up_to_nearest_5(num):
    # Round up to the nearest integer
    rounded_num = math.ceil(num)
    # Divide by 5 and round up to the nearest integer
    rounded_num = math.ceil(rounded_num / 5.0) * 5
    # Return the rounded number
    return rounded_num

class Outputer:
    def __init__(self, evaluations) -> None:
        self.customer_and_services = evaluations

    def output_to_console(self, customer_id = None, include_empties = False):
        """
        Purpose: Print customer information to the console

        Input:
            - customer_id (optional): The ID of the customer to print information for. Default is None.
            - include_empties (optional): Whether to include empty values in the output. Default is False.

        """
        a_string = ""
        if customer_id:
            return self.__basics_to_console(customer_id, include_empties)
        else:
            for customer in self.customer_and_services:
                if self.customer_and_services[customer].values():
                    output = self.__basics_to_console(customer.id, include_empties)
                    if output:
                        a_string = a_string + output + "\n"

            return a_string

    def output_history_to_csv(self):
        with open(os.path.join(r.csv_location, _jh_file), mode='w', newline='') as file:
            writer = csv.writer(file)

            writer.writerow(job_history_row.keys())
            for customer in self.customer_and_services:
                printRow = copy.deepcopy(job_history_row)

                for services, eval in self.customer_and_services[customer].items():

                    eval: Evaluation = eval

                    if eval and eval.job_list:
                        for job in eval.job_list:
                            printRow = copy.deepcopy(job_history_row)
                            job: Job = job

                            printRow["job_id"]          = job.get_id()
                            printRow["customer_id"]     = customer.id
                            printRow["customer_name"]   = customer.name
                            printRow["services"]        = services
                            printRow["job_date"]        = job.date
                            printRow["price"]           = job.price
                            printRow["duration"]        = job.duration
                            printRow["employee"]        = job.employee

                            writer.writerow(printRow.values())

    def output_to_csv(self):
        with open(os.path.join(r.csv_location,_evals_file) , mode='w', newline='') as file:
            writer = csv.writer(file)

            writer.writerow(row_obj.keys())
            for customer in self.customer_and_services:
                if self.customer_and_services[customer].values():
                    self.__add_to_csv(customer.id, writer)

    def __add_to_csv(self, customer_id, writer):
        rows = self.__convert_to_row(customer_id)

        for row in rows:
            writer.writerow(row.values())

    def __convert_to_row(self, customer_id):
        rows = []

        data = self.__retrieve_info(customer_id)

        customer: Customer = data[0]
        evals = data[1]

        for service_titles, evaluation in evals.items():
            evaluation :Evaluation = evaluation
            row = copy.deepcopy(row_obj)
            row["service"] = service_titles

            row["id"] = customer.id
            row["name"] = customer.name
            row["address"] = customer.address

            if evaluation:
                row["price"]          = evaluation.price
                row["rate"]           = evaluation.get_rate()
                row["duration"]       = round(evaluation.average_duration, 0)
                row["employees"]      = evaluation.get_employees()
                row["points"]         = evaluation.get_data_point_qty()

                if evaluation.flagged:
                    row["flagged"] = evaluation.flagged

            rows.append(row)

        return rows

    def __basics_to_console(self, customer_id, include_empties = False):
        print_string = ""
        # Retrieves the Customer and the Evalution to print
        data = self.__retrieve_info(customer_id)
        customer: Customer = data[0]
        services_evals = data[1]

        header_string = f"{customer.id} - {customer.name} ({customer.address}): \n"
        header_string = header_string + f"https://www.thecustomerfactor.com/customers_profile.php?id={customer.id}\n\n"

        for service_titles, evaluation in services_evals.items():
            if evaluation:
                price          = evaluation.price
                rate           = evaluation.get_rate()
                duration       = evaluation.average_duration
                employees      = evaluation.get_employees()
                data_points    = evaluation.get_data_point_qty()

                print_string   = print_string + f"\t{service_titles} for ${price}\n"
                print_string   = print_string + f"\t\tAccording to {employees}, this takes an average of {round(duration,0)} mins.\n"
                print_string   = print_string + f"\t\tThat is ${rate}/hr :: {data_points} points\n"

                print_string   = print_string + "\n"

            elif include_empties:
                print_string = print_string + f"\t{service_titles} - HAS INSUFFICIENT DATA\n"

        if print_string:
            return header_string+print_string

    def __retrieve_info(self, customer_id):
        for customer, services_evals in self.customer_and_services.items():
            if customer.id == customer_id:
                return [customer, services_evals]

        return None


print("Welcome to tip calculator.")
total_bill = input("What was the total bill? $")
total_bill1 = int(total_bill)
tip_per = input("What percentage of the tip would you like to give?\n10, 12 or 15")
tip_per1 = int(tip_per)
total_people = input("How many people to split the bill?")
total_people1 = int(total_people)
tip_percentage = tip_per1/100
tip_percentage1 = total_bill1*tip_percentage
payment = (total_bill1+tip_percentage1)/total_people1
print(f"Each person should pay: ${payment}")


import json
import sys
import os
import django
import pathlib

from drugs.models import Drug, Disease

def load_data():
    pass

    path = pathlib.Path(__file__).parent.resolve()

    sys.path.append(str(path.parent))
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings')

    django.setup()

    json_file = path/'dataset.json'

    try:
        with open(json_file, 'r') as file:
            data = json.load(file)

        drugs_data = data.get('drugs', [])

        for drug_data in drugs_data:
            diseases_data = drug_data.get('diseases', [])
            diseases = [Disease.objects.get_or_create(name=disease)[0] for disease in diseases_data]
            drug = Drug(
                id=drug_data['id'],
                description=drug_data['description'],
                name=drug_data['name'],
                released=drug_data['released']
            )
            drug.save()

            drug.diseases.add(*diseases)

        print(f"Successfully loaded {len(drugs_data)} drugs into the database.")

    except Exception as e:
        print(f"An error occurred: {str(e)}")

if __name__ == "__main__":
    load_data()


import pulsar

client = pulsar.Client("pulsar://localhost:6650")
topic_to_listen_to = "results" # Results from flink
# topic_to_listen_to = "my-topic" # From pulsar

# https://pulsar.apache.org/docs/client-libraries-python/
class User(pulsar.schema.Record):
    id = pulsar.schema.Integer()
    name = pulsar.schema.String()
    last_name = pulsar.schema.String()

class UserEnriched(pulsar.schema.Record):
    id = pulsar.schema.Integer()
    full_name = pulsar.schema.String()

consumer = client.subscribe(
    topic=topic_to_listen_to,
    schema=pulsar.schema.schema_avro.AvroSchema(UserEnriched),
    subscription_name="my-pulsar-sub",
)
# Avro consumer
try:
    while True:
        msg = consumer.receive()
        print(msg.value())
        consumer.acknowledge(msg)
except KeyboardInterrupt:
    print("interrupted...")

client.close()

# Plain text consumer
# consumer = client.subscribe(topic_to_listen_to,
#                             subscription_name='my-sub')

# try:
#     while True:
#         msg = consumer.receive()
#         print(f"Received message from topic '{topic_to_listen_to}': '{msg.data()}'" )
#         consumer.acknowledge(msg)
# except KeyboardInterrupt:
#     print("interrupted...")
#     client.close()


from django.test import Client as TestClient

from thesis.models import Client, Order
from thesis.tests.base import BaseTestCase

class CreateOrderViewTestCase(BaseTestCase):
    def setUp(self) -> None:
        self.client = TestClient()

    def test_ok(self):
        response = self.client.post("/order/", HTTP_REFERER="http://domain.ru/")
        self.assertEqual(200, response.status_code)
        self.assertTrue(Client.objects.exists())
        self.assertTrue(Order.objects.exists())

    def test_with_utm_labels(self):
        response = self.client.post("/order/", HTTP_REFERER="http://domain.ru/?utm_source=abc")
        self.assertEqual(200, response.status_code)
        self.assertTrue(Client.objects.exists())
        client = Client.objects.first()
        self.assertEqual("abc", client.utm_source)


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/9/14 17:05
# @Author  : zzx
# @File    : simple_read.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
import logging
import os
import sys

import codecs
from datetime import datetime
import platform
import re

import pandas as pd

"""
一个txt文件存储所有章节
根据 第x章 去划分文本
"""

def generate_onlyTXT():
    # 设置文件夹路径
    folder_path = "./contents"

    # 获取文件夹下所有的 TXT 文件名
    txt_files = [file for file in os.listdir(folder_path) if file.endswith(".txt")]

    # 遍历每个 TXT 文件并修改文件名
    for index, file_name in enumerate(txt_files):
        if not re.search(r'第.章', file_name):
            # 获取旧文件名的完整路径
            old_file_path = os.path.join(folder_path, file_name)

            # 修改文件名
            number = "第{}章".format(index + 1)
            new_file_name = file_name.replace(file_name, number + ' ' + file_name)  # 根据需要修改文件名的规则
            new_file_path = os.path.join(folder_path, new_file_name)

            # 重命名文件
            os.rename(old_file_path, new_file_path)

    # 获取文件夹下所有的 TXT 文件名
    txt_files = [file for file in os.listdir(folder_path) if file.endswith(".txt")]
    # 创建一个用于保存所有文件内容的新 TXT 文件
    output_file_path = "SkyrimV.txt"
    with open(output_file_path, "w", encoding="utf-8") as output_file:
        # 遍历每个 TXT 文件并将内容写入新文件
        for file in txt_files:
            file_path = os.path.join(folder_path, file)
            with open(file_path, "r", encoding="utf-8") as input_file:
                output_file.write(file)
                output_file.write(input_file.read())

    print("文件处理完成！")

class Reader:
    def __init__(self, book_name, txt_path):
        self.book_name = book_name
        self.txt_path = txt_path
        self.contents = []  # 章节名称
        self.book = self.split_book_chapter()

    def split_book_chapter(self):
        """
        读取文本文件，并将文本按章节划分
        :param txt_path:
        :return:
        """
        book_content = {}

        with codecs.open(self.txt_path, "r", encoding="utf-8") as f:
            text = f.read().strip()

            chapters = re.split("\n===第.{1,6}章===", text)
            i = 1

            for chapter in chapters:
                title = "第{}章".format(i)
                text = chapter.split("\n")
                text = "\n".join(text)
                book_content[title] = text
                i += 1

        self.contents = list(book_content.keys())
        return book_content

    def get_index(self, key_name):
        """
        根据书的章节名称，获取前一章与后一章
        :param key_name:
        :return:
        """
        this_index = self.contents.index(key_name)
        last_chapter = self.contents[this_index - 1]
        next_chapter = self.contents[this_index + 1]
        return last_chapter, next_chapter

    def start_read(self, chapter_name="第1章"):
        """
        开始阅读, 章节名称为空，且数据库中没有历史记录时，从第一章开始
        :param chapter_name: 章节名称
        :return:
        """
        chapter_name = chapter_name[0] if isinstance(chapter_name, tuple) else chapter_name

        read_content = "".join(self.book.get(chapter_name, "当前章节不存在"))
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        print("chapter_name", chapter_name)
        text_list = read_content.split('\n')
        for text in text_list:
            limitation = 100
            if len(text) > limitation:
                text = '\n'.join([text[i:i + limitation] for i in range(0, len(text), limitation)])
            print(text)
            print("last_chapter = self.contents[this_index - 1]"
                  "next_chapter = self.contents[this_index + 1]"
                  "if platform.system().lower() == 'linux':os.system('clear')\n")
            print(
                "==== AUTHENTICATION FAILED ===\n"
                "Failed to start docker.service: Access denied\n"
                "See system logs and 'systemctl status docker.service' for details.")

        forward = ""
        while forward not in ["n", "b", "q"]:
            forward = input("""n、下一章\nb、上一章\nq、退出""")

        last_chapter_name, next_chapter_name = self.get_index(chapter_name)
        if forward == "q":
            sys.exit(0)
        # 根据命令选择上一章或者下一章，并更新历史记录
        if forward == "n":
            return next_chapter_name
        if forward == "b":
            return last_chapter_name

def start_read():
    mybook = Reader("415", "aaa.txt")
    chapter_name = "第51章"
    while True:
        if platform.system().lower() == "windows":
            os.system('cls')
        if platform.system().lower() == "linux":
            os.system('clear')
        chapter_name = mybook.start_read(chapter_name)

def more_simple_read(path="./contents/第287章 费福根卷1.txt"):
    with open(path, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()  # 去除行末尾的换行符和空白字符
            limitation = 80
            if len(line) > limitation:
                line = '\n'.join([line[i:i + limitation] for i in range(0, len(line), limitation)])
            print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
            print(line)
            print("last_chapter = self.contents[this_index - 1]"
                  "next_chapter = self.contents[this_index + 1]"
                  "if platform.system().lower() == 'linux':os.system('clear')"
                  "mybook.start_read(chapter_name)")

def print_lines(path='aaaa.txt', current_chapter=60):
    with open(path, 'r', encoding="utf-8") as file:
        lines = file.readlines()
        lines_per_batch = 500
        total_line = len(lines)
        current_line = current_chapter * lines_per_batch

        while current_line < total_line:
            print("======{},{}======".format(current_chapter, current_line))
            batch = lines[current_line:current_line + lines_per_batch]
            for line in batch:
                line = line.strip()  # 去除行末尾的换行符和空白字符
                limitation = 80
                if len(line) > limitation:
                    line = "\n[[0.4781, 0.4168, 0.6548, 0.4341, 0.4870, 0.3478, 0.7284, 0.5700, 0.4740],\n" \
                           "[0.6982, 0.5589, 0.6166, 0.6952, 0.4532, 0.5158, 0.2362, 0.3328, 0.5992]]\n\n" \
                           "last_chapter = self.contents[this_index - 1];" \
                           "next_chapter = self.contents[this_index + 1]\n" \
                           "if platform.system().lower() == 'linux':os.system('clear')\n\n" \
                           "<class 'numpy.ndarray'>\n<class 'numpy.ndarray'>\n\n" \
                           "precision: 89.81%,recall: 95.20%,F1:91.65% | precision: 96.16%,recall: 98.06%,F1:96.77%\n" \
                           "%Y-%m-%d %H:%M:%S next_chapter = self.contents[this_index + 1]\n\n"\
                        .join([line[i:i + limitation] for i in range(0, len(line), limitation)])
                print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
                print(line)
                print("last_chapter = self.contents[this_index - 1]"
                      "next_chapter = self.contents[this_index + 1]"
                      "if platform.system().lower() == 'linux':os.system('clear')"
                      "mybook.start_read(chapter_name)")

            user_input = input("按下字母键 'n' 并回车")
            if user_input.lower() == 'n':
                current_chapter += 1
                current_line += lines_per_batch
            elif user_input.lower() == 'b':
                current_chapter -= 1
                current_line -= lines_per_batch
                if current_chapter < 0:
                    current_chapter = 0
                    current_line = 0
            else:
                break

if __name__ == '__main__':
    # generate_onlyTXT()
    # more_simple_read()

    # start_read()

    print_lines()


from setuptools import setup

with open("README.md", 'r') as f:
    long_description = f.read()

setup(
    name='flask_session_mysql',
    version='0.0.1',
    description='flask_session_mysql adds server side session manager making applications for flask more secure and efficient in mysql',
    long_description=long_description,
    long_description_content_type='text/markdown',
    url='https://github.com/Fabioblyk/flask-session-mysql',
    author='Fabioblyk',
    author_email='fabioblyk12@gmail.com',
    license='MIT',
    packages=['flask_session_mysql'],
    install_requires=['flask', 'mysql-connector-python'],

    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires=">=3.9"
)


import json
import telebot
from telebot import types
import os
from datetime import datetime, date
bot = telebot.TeleBot('TOKEN')

current_dir = os.path.dirname(__file__)
#относительные пути для текстовых файлов
file_path_budget = os.path.join(current_dir, 'files', 'budget.png')
file_path_commercial = os.path.join(current_dir, 'files', 'commercial.png')
file_path_ege = os.path.join(current_dir, 'files', 'ege.txt')
file_path_vi1 = os.path.join(current_dir, 'files', 'vi1.txt')
file_path_vi2 = os.path.join(current_dir, 'files', 'vi2.txt')
file_path_to_log = os.path.join (current_dir, "log.log")
file_path_to_log1 = os.path.join (current_dir, "log.json")

@bot.message_handler(commands=['start']) #стартовая команда
def start(message):

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("ВО")
    btn2 = types.KeyboardButton('СПО')
    markup.add(btn1, btn2)
    bot.send_message(message.from_user.id, "Вас приветствует бот *Приёмной комиссии ЧИ БГУ*👋 \n\nУ меня вы можете узнать интересующую вас информацию о поступлении в наш институт. \n\n Выберите интересующий вас уровень образования с помощью клавиатуры⌨\n(_квадратная кнопка на поле для ввода сообщений_)", reply_markup=markup, parse_mode='Markdown')

@bot.message_handler(content_types=['text'])
def get_text_messages(message):

    now = datetime.now()
    current_time = str(date.today()) + " " + now.strftime("%H:%M:%S")

    text =  current_time+" @" +message.from_user.username + " ("+str(message.from_user.id) +") : " +message.text
    json_log = {"time" : current_time, "username":message.from_user.username, "userid": message.from_user.id, "text":message.text }
    with open(file_path_to_log, "a",encoding="utf-8") as file:
        file.write("\n"+text)
    # with open(file_path_to_log1, "a",encoding="utf-8") as file:
    #     json.dump(json_log, file, ensure_ascii=False)
    #     file.write(', \n')
    bot.send_message(575078092, text)

    #ВО
    if message.text == 'ВО':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("📚Направления подготовки")
        btn2 = types.KeyboardButton('📰Способы подачи документов')
        btn3 = types.KeyboardButton('✍План приёма')
        btn4 = types.KeyboardButton('📊Мин. баллы ЕГЭ')
        btn5 = types.KeyboardButton('🔎ВИ')
        btn6 = types.KeyboardButton('💳 Стоимость обучения')
        btn7 = types.KeyboardButton('💻 Образцы документов')
        btn8 = types.KeyboardButton('📋 Списки абитуриентов')
        btn9 = types.KeyboardButton('📱 Контакты')
        btn10 = types.KeyboardButton('🔙 Вернуться к выбору уровня образования')
        btn11 = types.KeyboardButton('Связаться с тех.секретарём')
        markup.add(btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10,btn11)
        bot.send_message(message.from_user.id, "👋 ВО - программы Высшего образования", reply_markup=markup)
        bot.send_message(message.from_user.id, '👀 Выберите интересующий вас раздел \n\nЕсли бот не сможет ответить на интересующие вас вопросы нажмите кнопку `Связаться с тех.секретарём` и мы ответим на все ваши вопросы!',reply_markup=markup, parse_mode='Markdown')

    elif message.text == '🔙 Вернуться к выбору уровня образования':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("ВО")
        btn2 = types.KeyboardButton('СПО')
        markup.add(btn1, btn2)
        bot.send_message(message.from_user.id, "✔Выберите уровень образования", reply_markup=markup)

    elif message.text == '📚Направления подготовки':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('Юриспруденция')
        btn2 = types.KeyboardButton('ЭПиПД')
        btn3 = types.KeyboardButton('ВЭД')
        btn4 = types.KeyboardButton('ФК')
        btn5 = types.KeyboardButton('УП')
        btn6 = types.KeyboardButton('ГМУ')
        btn7 = types.KeyboardButton('ИСТУ')
        btn8 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8)
        bot.send_message(message.from_user.id, '⬇ Выберите интересующее вас направление подготовки', reply_markup=markup)

    elif message.text == 'Юриспруденция':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📚Направления подготовки')
        btn2 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "Юриспруденция" в ВУЗах предназначено для обучения студентов основам права и юридической деятельности.'
                        'В ходе обучения студенты изучают такие дисциплины, как гражданское право, уголовное право, административное право, конституционное право и другие отрасли права. \n\nПодробнее об направлении подготовки "Юриспруденция" можно прочитать по [ссылке](https://abit.bgu-chita.ru/abiturient/134-40-03-01-yurisprudentsiya)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ЭПиПД':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📚Направления подготовки')
        btn2 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "Экономика предприятия и предпринимательская деятельность" в ВУЗах предназначено для обучения студентов основам экономической науки, а также формирования навыков и знаний, необходимых для организации и управления предприятиями и ведения предпринимательской деятельности.'
                        '\n\nПодробнее об направлении подготовки "Экономика предприятия и предпринимательская деятельность" можно прочитать по [ссылке](https://abit.bgu-chita.ru/abiturient/106-38-03-01-ekonomika-po-profilyu-ekonomika-predpriyatiya-i-predprinimatelskaya-deyatelnost)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ВЭД':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📚Направления подготовки')
        btn2 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "Внешнеэкономическая деятельность" в ВУЗах предназначено для обучения студентов основам международных экономических отношений и внешней торговли. Оно призвано развить у студентов навыки и знания, необходимые для работы в области международного бизнеса, внешнеэкономических отношений и торговли.'
                        '\n\nПодробнее об направлении подготовки "Внешнеэкономическая деятельность" можно прочитать по [ссылке](https://abit.bgu-chita.ru/abiturient/90-38-03-01-ekonomika-po-profilyu-mirovaya-ekonomika)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ФК':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📚Направления подготовки')
        btn2 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "Финансы и кредит" в ВУЗах предназначено для обучения студентов основам финансовой науки, понятиям и принципам, связанным с финансовой системой и кредитной деятельностью. Оно направлено на развитие навыков и знаний, необходимых для работы в банковской сфере, финансовых учреждениях, финансовых отделах предприятий и организациях.'
                        '\n\nПодробнее об направлении подготовки "Финансы и кредит" можно прочитать по [ссылке](https://abit.bgu-chita.ru/abiturient/111-38-03-01-ekonomika-po-profilyu-finansy-i-kredit)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'УП':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📚Направления подготовки')
        btn2 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "Управление персоналом" в ВУЗах предназначено для обучения студентов основам управления персоналом, развитию навыков и знаний, необходимых для эффективной работы с сотрудниками в организациях различного типа.'
                        '\n\nПодробнее об направлении подготовки "Управление персоналом" можно прочитать по [ссылке](https://abit.bgu-chita.ru/abiturient/116-38-03-03-upravlenie-personalom)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ГМУ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📚Направления подготовки')
        btn2 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "Государственное и муниципальное управление" в ВУЗах направлено на обучение студентов основам государственного аппарата и муниципального управления. Цель такого обучения - развитие навыков и знаний, необходимых для работы в государственных и муниципальных органах, а также в организациях, связанных с государственным и муниципальным сектором.'
                        '\n\nПодробнее об направлении подготовки "Государственное и муниципальное управление" можно прочитать по [ссылке](https://abit.bgu-chita.ru/abiturient/120-38-03-04-gosudarstvennoe-i-munitsipalnoe-upravlenie)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ИСТУ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📚Направления подготовки')
        btn2 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "Информационные системы и технологии в управлении" в ВУЗах предназначено для студентов, которые интересуются применением информационных технологий в сфере управления и бизнеса. Курс обучения включает изучение основных принципов информационных систем, разработку программного обеспечения, анализ данных, управление проектами, электронную коммерцию и другие смежные темы.'
                        '\n\nПодробнее об направлении подготовки "Информационные системы и технологии в управлении" можно прочитать по [ссылке](https://abit.bgu-chita.ru/abiturient/104-09-03-03-prikladnaya-informatika-po-profilyu-informatsionnye-sistemy-i-tekhnologii-v-upravlenii)', reply_markup=markup, parse_mode='Markdown')

    #общая кнопка для ВО и СПО
    elif message.text == 'Связаться с тех.секретарём':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)

        bot.send_message(message.from_user.id, 'Напишите свой вопрос техническому секретарю. Для того чтобы связаться с ним нажмите на ссылку - @chita_baikaluniversity\nЧасы работы: пн-пт:9:00-17:00,сб:9:00-13:00 ', reply_markup=markup )

    elif message.text == '🔙 Главное меню':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("📚Направления подготовки")
        btn2 = types.KeyboardButton('📰Способы подачи документов')
        btn3 = types.KeyboardButton('✍План приёма')
        btn4 = types.KeyboardButton('📊Мин. баллы ЕГЭ')
        btn5 = types.KeyboardButton('🔎ВИ')
        btn6 = types.KeyboardButton('💳 Стоимость обучения')
        btn7 = types.KeyboardButton('💻 Образцы документов')
        btn8 = types.KeyboardButton('📋 Списки абитуриентов')
        btn9 = types.KeyboardButton('📱 Контакты')
        btn10 = types.KeyboardButton('🔙 Вернуться к выбору уровня образования')
        btn11 = types.KeyboardButton('Связаться с тех.секретарём')
        markup.add(btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10,btn11)
        bot.send_message(message.from_user.id, "👋 ВО - программы Высшего образования", reply_markup=markup)
        bot.send_message(message.from_user.id, '👀 Выберите интересующий вас раздел \n\nЕсли бот не сможет ответить на интересующие вас вопросы нажмите кнопку `Связаться с тех.секретарём` и мы ответим на все ваши вопросы!',reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📰Способы подачи документов':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, '*Способы подачи документов:*\n\
🚩Лично в приемную комиссию по адресу _г.Чита, ул.Анохина 56_\n\
🚩Через сайт онлайн-приёма ЧИ БГУ https://priem.bgu-chita.ru/\n\
🚩Через единый портал государственных услуг https://www.gosuslugi.ru/vuzonline\ ', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '✍План приёма':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('Бюджет')
        btn2 = types.KeyboardButton('Коммерция')
        btn3 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2,btn3)
        bot.send_message(message.from_user.id, "Выберите источник финансирования", reply_markup=markup)
    elif message.text =='Бюджет':
        bot.send_photo(message.from_user.id, open(file_path_budget, 'rb'))
    elif message.text=='Коммерция':
        bot.send_photo(message.from_user.id, open(file_path_commercial, 'rb'))

    elif message.text == '📊Мин. баллы ЕГЭ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1)
        with open(file_path_ege, 'r',encoding='utf-8') as file:
            text = file.read()
        bot.send_message(message.from_user.id,text=text, reply_markup=markup, parse_mode='Markdown')

    elif message.text == '🔎ВИ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('📃Перечень ВИ для всех направлений подготовки')
        btn2 = types.KeyboardButton('📧 Форма проведения ВИ')
        btn3 = types.KeyboardButton('📉Мин.баллы по ВИ')
        btn4 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1,btn2,btn3,btn4)
        bot.send_message(message.from_user.id, 'Выберите интересующую вас информацию по вступительным испытаниям ' , reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📃Перечень ВИ для всех направлений подготовки':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        with open(file_path_vi1, 'r',encoding='utf-8') as file:
            text = file.read()
        bot.send_message(message.from_user.id,text=text, reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📧 Форма проведения ВИ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        bot.send_message(message.from_user.id, 'У вступительных испытаний есть две формы проведения:очно и дистанционно. Заполняя заявление, вы должны отразить в каком формате вам будет удобнее пройти ВИ. Если вы поступаете на бюджет, вы можете сдавать их только очно.\n\
Очно вам нужно будет придти в установленную [расписанием ВИ](https://abit.bgu-chita.ru/priem/wpo/13-priem/43-examtime) очно в институт. При выборе дистанционной формы сдачи ВИ необходимо наличие камеры,т.к потребуется показать своё лицо и фотографию из документа подтвержающего личность и весь экзамен писать под камерой\n\
Допускается сдача нескольких вступительных испытаний в один день.' ,reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📉Мин.баллы по ВИ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        with open(file_path_vi2, 'r',encoding='utf-8') as file:
            text = file.read()
        bot.send_message(message.from_user.id,text=text, reply_markup=markup, parse_mode='Markdown')

    elif message.text == '💳 Стоимость обучения':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, 'Ознакомиться со стоимостью обучения вы можете на нашем [сайте](https://abit.bgu-chita.ru/stoimost)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '💻 Образцы документов':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, 'Ознакомиться с образцами документов и бланков вы можете на нашем [сайте](https://abit.bgu-chita.ru/index.php/priem/wpo/18-priem/40) ', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📋 Списки абитуриентов':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, "Ознакомиться со списками абитуриентов вы можете по следующей [ссылке](https://abit.bgu-chita.ru/priem/wpo/13-priem/57-ablist).\nВыставите интересующий вас источник финансирования,организацию(ЧИ БГУ/Колледж),форму обучения и направление подготовки и нажмите кнопку *Показать*.\
                         \nНа сайте в таблице отразится перечень абитуриентов по заданным критериям.Абитуриенты отражаются по номеру *СНИЛС*", reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📱 Контакты':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🔙 Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, '*Контакты:*\nтел. (3022) 32-34-21\
        \nтел. 8-914-145-18-88(_Telegram,WhatsApp,Viber_)\n*e-mail*: `priem@bgu-chita.ru`\n*Мы в ВКонтакте*: https://vk.com/4itnarhoz\
        \n*Адрес*: г.Чита, ул. Анохина,56, каб. 70\n*Часы работы*:пн-пт:_9:00-17:00_,сб:_9:00-13:00_', reply_markup=markup, parse_mode='Markdown')

    #Small talk
    elif message.text == 'Привет' or message.text == 'привет':
        bot.send_message(message.from_user.id, 'Привет!')

    elif message.text == 'как дела?' or message.text == "Как дела?":
        bot.send_message(message.from_user.id, 'Хорошо!')

    elif message.text == 'Что делаешь?' or message.text == 'что делаешь?':
        bot.send_message(message.from_user.id, 'Консультирую абитуриентов!')

    elif message.text == 'Здравствуйте' or message.text == 'здравствуйте':
        bot.send_message(message.from_user.id, 'Здравствуйте,уважаемый абитуриент')

    #СПО
    if message.text == 'СПО':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("🗒Специальности")
        btn2 = types.KeyboardButton('📰Подача документов')
        btn3 = types.KeyboardButton('📮План приёма')
        btn4 = types.KeyboardButton('💳 Стоимость обучения')
        btn5 = types.KeyboardButton('💻 Образцы документов')
        btn6 = types.KeyboardButton('📋 Списки абитуриентов')
        btn7 = types.KeyboardButton('☎Контакты')
        btn8 = types.KeyboardButton('🔙 Вернуться к выбору уровня образования')
        btn9 = types.KeyboardButton('Связаться с тех.секретарём')
        markup.add(btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9)
        bot.send_message(message.from_user.id, "👋 СПО - программы среднего профессионального образования", reply_markup=markup)
        bot.send_message(message.from_user.id, '👀 Выберите интересующий вас раздел \n\nЕсли бот не сможет ответить на интересующие вас вопросы нажмите кнопку `Связаться с тех.секретарём` и мы ответим на все ваши вопросы!',reply_markup=markup, parse_mode='Markdown')

    elif message.text == '🗒Специальности':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('ПСО')
        btn2 = types.KeyboardButton('ДОУ')
        btn3 = types.KeyboardButton('БД')
        btn4 = types.KeyboardButton('ЭиБУ')
        btn5 = types.KeyboardButton('Коммерция(по отраслям)')
        btn6 = types.KeyboardButton('Товароведение')
        btn7 = types.KeyboardButton('ИСиП')
        btn8 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8)
        bot.send_message(message.from_user.id, '⬇ Выберите интересующую вас специальность', reply_markup=markup)

    elif message.text == 'ПСО':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🗒Специальности')
        btn2 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "*Право и организация социального обеспечения*" в колледжах предназначено для студентов, которые заинтересованы в изучении правовых аспектов, связанных с организацией и управлением социальным обеспечением.\
                            \n\nПодробнее об направлении подготовки "*Право и организация социального обеспечения*" можно прочитать по [ссылке](https://college.bgu-chita.ru/specialnosti/specialnost-40-02-01-pravo-i-organizaciya-socialnogo-obespecheniya/)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ДОУ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🗒Специальности')
        btn2 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "*Документационное обеспечение управления и архивоведение*" в колледжах предназначено для студентов, которые интересуются организацией и управлением документацией в организациях, а также изучением архивоведения.\
                            \n\nПодробнее об направлении подготовки "*Документационное обеспечение управления и архивоведение*" можно прочитать по [ссылке](https://college.bgu-chita.ru/specialnosti/specialnost-46-02-01-dokumentacionnoe-obespechenie-upravleniya-i-arkhivovedenie/)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'БД':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🗒Специальности')
        btn2 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки "*Банковское дело*" в колледжах предназначено для студентов, желающих приобрести профессиональные навыки и знания, необходимые для работы в сфере банковской деятельности. Курс обучения включает изучение основных принципов и функций банков, правовых аспектов финансовых операций, анализа финансовой деятельности, управления рисками и др.\
                         Студенты также ознакамливаются с практическими аспектами работы в банке, включая клиентское обслуживание, операции с денежными средствами и кредитование. После завершения обучения выпускники могут претендовать на работу в коммерческих банках, кредитных учреждениях, финансовых компаниях и других смежных секторах экономики.\
                            \n\nПодробнее об направлении подготовки "*Банковское дело*" можно прочитать по [ссылке](https://college.bgu-chita.ru/specialnosti/specialnost-38-02-07-bankovskoe-delo/)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ЭиБУ':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🗒Специальности')
        btn2 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки в колледжах "*Экономика и бухгалтерский учет*" предназначено для студентов, желающих получить знания и навыки в области экономики, финансов, бухгалтерии и аналитики, необходимые для работы в сфере бизнеса и учета. Курс обучения включает изучение основных экономических теорий, методов бухгалтерии, анализа финансовой отчетности, налогообложения, управленческого учета и других финансово-экономических дисциплин.\
                          Студенты также осваивают принципы планирования, оценки и анализа экономической деятельности предприятий, а также нормативно-правовые аспекты бухгалтерии и налогообложения. После окончания обучения выпускники могут работать в финансовых и бухгалтерских службах компаний, аудиторских фирмах, банках, налоговых органах и в других сферах, связанных с финансово-экономической деятельностью.\
                            \n\nПодробнее об направлении подготовки "*Экономика и бухгалтерский учет *" можно прочитать по [ссылке](https://college.bgu-chita.ru/specialnosti/specialnost-38-02-01-ehkonomika-i-bukhgalterskijj-uchet/)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'Коммерция(по отраслям)':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🗒Специальности')
        btn2 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки в колледжах "*Коммерция*" предназначено для студентов, желающих получить знания и навыки в области коммерческой деятельности и бизнеса. Курсы обучения включают изучение основных принципов и методов ведения коммерческой деятельности, торговли, маркетинга, логистики, управления персоналом и других коммерческих дисциплин. Студенты также ознакамливаются с принципами организации и управления предприятиями, планированием продаж, международным бизнесом и договорными отношениями.\
                         В процессе обучения студенты получают практические навыки в области продаж, презентаций, управления проектами и командой, а также разрабатывают бизнес-планы и стратегии развития. После окончания обучения выпускники могут работать в коммерческих организациях, торговых сетях, розничной и оптовой торговле, маркетинговых и рекламных агентствах и в других сферах связанных с коммерцией.\
                            \n\nПодробнее об направлении подготовки "*Коммерция*" можно прочитать по [ссылке](https://college.bgu-chita.ru/specialnosti/specialnost-38-02-04-kommerciya-po-otraslyam/)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'Товароведение':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🗒Специальности')
        btn2 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки в колледжах "*Товароведение и экспертиза качества потребительских товаров*" предназначено для студентов, желающих приобрести знания и навыки в области исследования и оценки качества товаров, а также различных аспектов товароведения. Курс обучения включает изучение основных принципов товароведения, стандартов качества, методов оценки, контроля и сертификации товаров.\
                         Студенты также осваивают понятия и практики товарной экспертизы, которые включают анализ состава и свойств товаров, их безопасности, соответствия требованиям нормативных документов и стандартов. В процессе обучения студенты ознакамливаются с основами маркетинга, логистики, закупок и снабжения, а также изучают основы управления качеством товаров. После завершения обучения выпускники могут работать в сфере товароведения и экспертизы качества в компаниях, занимающихся производством, реализацией и контролем качества потребительских товаров, а также в органах по сертификации и стандартизации.\
                            \n\nПодробнее об направлении подготовки "*Товароведение и экспертиза качества потребительских товаров*" можно прочитать по [ссылке](https://college.bgu-chita.ru/specialnosti/specialnost-38-02-05-tovarovedenie-i-ehkspertiza-kachestva-potrebitelskikh-tovarov/)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == 'ИСиП':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('🗒Специальности')
        btn2 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2)
        bot.send_message(message.from_user.id, 'Направление подготовки в колледжах "*Информационные системы и программирование*" предназначено для студентов, желающих получить глубокие знания и навыки в области информационных технологий, программирования и разработки программного обеспечения. Курс обучения включает изучение основных языков программирования, структур данных, алгоритмов, баз данных, компьютерных сетей и других компьютерно-технических дисциплин.', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📰Подача документов':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, '*Способы подачи документов:*\n\
🚩Лично в приемную комиссию по адресу _г.Чита, ул.Анохина 56_\n\
🚩Через сайт онлайн-приёма ЧИ БГУ https://priem.bgu-chita.ru/', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📮План приёма':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('Бюджетный')
        btn2 = types.KeyboardButton('Коммерческий')
        btn3 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1,btn2,btn3)
        bot.send_message(message.from_user.id, "Выберите источник финансирования", reply_markup=markup)

    elif message.text =='Бюджетный':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        bot.send_message(message.from_user.id, 'Бюджетный набор в этом году на программы СПО не запланирован ' , reply_markup=markup)
    elif message.text=='Коммерческий':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        bot.send_message(message.from_user.id, 'Ограничений по количеству заявлений на коммерческую основу нет. Вам требуется подать заявление, заключить договор и оплатить 10% суммы в установленный срок для того чтобы быть зачисленными.' , reply_markup=markup)

    elif message.text == '💸 Стоимость обучения':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, 'Ознакомиться со стоимостью обучения вы можете на нашем [сайте](https://abit.bgu-chita.ru/stoimost)', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '🗃 Образцы документов':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, 'Ознакомиться с образцами документов и бланков вы можете на нашем [сайте](https://abit.bgu-chita.ru/index.php/priem/wpo/18-priem/40) ', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '📝 Списки абитуриентов':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, "Ознакомиться со списками абитуриентов вы можете по следующей [ссылке](https://abit.bgu-chita.ru/priem/wpo/13-priem/57-ablist).\nВыставите интересующий вас источник финансирования,организацию(ЧИ БГУ/Колледж),форму обучения и направление подготовки и нажмите кнопку *Показать*.\
                         \nНа сайте в таблице отразится перечень абитуриентов по заданным критериям.Абитуриенты отражаются по номеру *СНИЛС*", reply_markup=markup, parse_mode='Markdown')

    elif message.text == '☎Контакты':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton('⏪ Главное меню')
        markup.add(btn1)
        bot.send_message(message.from_user.id, '*Контакты:*\nтел. (3022) 32-34-21\
        \nтел. 8-914-145-18-88(_Telegram,WhatsApp,Viber_)\n*e-mail*: `priem@bgu-chita.ru`\n*Мы в ВКонтакте*: https://vk.com/4itnarhoz\
        \n*Адрес*: г.Чита, ул. Анохина,56, каб. 70\n*Часы работы*:пн-пт:_9:00-17:00_,сб:_9:00-13:00_', reply_markup=markup, parse_mode='Markdown')

    elif message.text == '⏪ Главное меню':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("🗒Специальности")
        btn2 = types.KeyboardButton('📰Подача документов')
        btn3 = types.KeyboardButton('📮План приёма')
        btn4 = types.KeyboardButton('💸 Стоимость обучения')
        btn5 = types.KeyboardButton('🗃 Образцы документов')
        btn6 = types.KeyboardButton('📝 Списки абитуриентов')
        btn7 = types.KeyboardButton('☎Контакты')
        btn8 = types.KeyboardButton('🔙 Вернуться к выбору уровня образования')
        btn9 = types.KeyboardButton('Связаться с тех.секретарём')
        markup.add(btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9)
        bot.send_message(message.from_user.id, "👋 СПО - программы среднего профессионального образования", reply_markup=markup)
        bot.send_message(message.from_user.id, '👀 Выберите интересующий вас раздел \n\nЕсли бот не сможет ответить на интересующие вас вопросы нажмите кнопку `Связаться с тех.секретарём` и мы ответим на все ваши вопросы!',reply_markup=markup, parse_mode='Markdown')

bot.polling(none_stop=True, interval=0)


"""
     Example with 'formlayout' - A tiny Python module for creating form dialogs/widgets
     to edit various type of parameters with having to write any GUI code.
"""

# a little hack as have install PyQt5
# but formlayout searches the  PyQt4/ PyQt5 version from this environment variable
#  and if not set just set it here temporary
# import os
# os.environ.setdefault('QT_API', 'pyqt5')

from formlayout import fedit

datalist = [('Name', 'Paul'),
            (None, None),
            (None, 'Information:'),
            ('Age', 30),
            ('Sex', [0, 'Male', 'Female']),
            ('Size', 12.1),
            ('Eyes', 'green'),
            ('Married', True),
           ]

fedit(datalist, title="Describe yourself",
      comment="This is just an <b>example</b>.")


# """ input: array
#     function: duplicate zeros and keep array length the same
#     output: none

#     test case: [1, 0, 2, 0, 3]
#     result: [1, 0, 0, 2, 0]
# """
def dup_zeros(nums):
    original_length = len(nums)
    print(original_length)

    i=0
    while i < original_length:
        if(nums[i] == 0):
            i+=1
            nums.insert(i, 0)
            print(i)
        i+=1

    nums[:] = nums[:original_length]
    print(nums)

""" input: array of strings that represents a poker hand
    output: boolean if hand contains an straight

    test: ["3S", "5D", "2C", "6S", "4H"] => true
        [1, 5, 6, 8, 9]=> false
        [2H, 2D, 2C, 2S, 3C]
        [AS, KS, QS, JS, 10S]

    loop through list
    create a separate list of just values of the cards in the hand
    start at the min value and loop to 5
        check if each increment exists within separate list of just values
        return false if it doesn't
    return true

"""
# hand: [AS, KS, QS, JS, 10S]

# values: [A, K, Q, J, 10]
def has_straight(hand):
    deck = [ "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
    values = []

    for card in hand:
        if(card[1] == "0"):
            values.append(card[0:2])
        else:
            values.append(card[0])

    starting = 12

    for card_val in values:
        if deck.index(card_val) < starting:
            starting = deck.index(card_val) #starting: 9

    for i in range(starting, starting+5): #9-14
        if deck[i] not in values:
            return False

    return True

""" input: 1st array of positive ints, int
    output: array of boolean on if the value after 2nd int is added to each index is greater than max

    test case: ([3,7,2,8], 5) => [false, true, false, true]

    find and store the max of the arr
    initialize a new array for boolean values
    iterate through the first array and apply the following:
        initialize current value which is the sum of the value at index and the int input
        compare that with the max of the array
        boolean arr push(current > max_candies)

    return boolean array

"""

# ([3,7,2,8], 5)
def more_candies_than_max(candies, increase):
    max_candies = max(candies) #8
    boolean_arr = []

    for candy in candies: #8
        current = candy + increase #13
        boolean_arr.append(current>max_candies)

# [False, True, False, True]
    return boolean_arr


''' Date: 3/12/2019
    Developer: Dhruvik Mevada <cyb3rsky@gmail.com>

    Description: This program takes input as of what you want to search and opens it directy in browser. More updates comming soon.
'''

import webbrowser

def playvideo(search_query):  # Function for youtube search

    url = 'https://www.youtube.com/search?q=' + search_query
    webbrowser.open(url)

def search_content(search_query):  # Function for google search

    url = 'https://www.google.com/search?q=' + search_query
    webbrowser.open(url)

def search_game(search_query):  # Function for steam search
    url = 'https://store.steampowered.com/search/?term=' + search_query
    webbrowser.open(url)

if __name__ == "__main__":

    ask_to_search = input('What do you want to search fo? \n1) Youtube \n2) Google \n3) Steam\n...')

    if ask_to_search == '1':
        title = input('Enter the title: ')
        playvideo(title)

    elif ask_to_search == '2':
        title = input('Enter the title: ')
        search_content(title)

    elif ask_to_search == '3':
        title = input('Enter the title: ')
        search_content(title)

    else:
        print('Wrong Input')


import os
import ox

root_dir = os.path.normpath(os.path.abspath(os.path.dirname(__file__)))
os.chdir(root_dir)

path = '../js/'
files = sorted([
    file for file in os.listdir(path)
    if not file.startswith('.')
    and not file.startswith('oml.')
])
ox.file.write_json('../json/js.json', files, indent=4)
ox.file.write_file(
    '%soml.min.js' % path,
    '\n'.join([
        ox.js.minify(ox.file.read_file('%s%s' % (path, file)).decode('utf-8'))
        for file in files
    ])
)


import importlib.util
import timeit
import tempfile
from textwrap import dedent

# apt-get install jsonschema json-spec validictory
import fastjsonschema
import jsonschema
import validictory
from jsonspec.validators import load

NUMBER = 1000

JSON_SCHEMA = {
    '$schema': 'http://json-schema.org/draft-04/schema#',
    'type': 'array',
    'items': [
        {
            'type': 'number',
            'maximum': 10,
            'exclusiveMaximum': True,
        },
        {
            'type': 'string',
            'enum': ['hello', 'world'],
        },
        {
            'type': 'array',
            'minItems': 1,
            'maxItems': 3,
            'items': [
                {'type': 'number'},
                {'type': 'string'},
                {'type': 'boolean'},
            ],
        },
        {
            'type': 'object',
            'required': ['a', 'b'],
            'minProperties': 3,
            'properties': {
                'a': {'type': ['null', 'string']},
                'b': {'type': ['null', 'string']},
                'c': {'type': ['null', 'string'], 'default': 'abc'}
            },
            'additionalProperties': {'type': 'string'},
        },
        {'not': {'type': ['null']}},
        {'oneOf': [
            {'type': 'number', 'multipleOf': 3},
            {'type': 'number', 'multipleOf': 5},
        ]},
    ],
}

VALUES_OK = (
    [9, 'hello', [1, 'a', True], {'a': 'a', 'b': 'b', 'd': 'd'}, 42, 3],
    [9, 'world', [1, 'a', True], {'a': 'a', 'b': 'b', 'd': 'd'}, 42, 3],
    [9, 'world', [1, 'a', True], {'a': 'a', 'b': 'b', 'c': 'xy'}, 42, 3],
    [9, 'world', [1, 'a', True], {'a': 'a', 'b': 'b', 'c': 'xy'}, 'str', 5],
)

VALUES_BAD = (
    [10, 'world', [1, 'a', True], {'a': 'a', 'b': 'b', 'c': 'xy'}, 'str', 5],
    [9, 'xxx', [1, 'a', True], {'a': 'a', 'b': 'b', 'c': 'xy'}, 'str', 5],
    [9, 'hello', [], {'a': 'a', 'b': 'b', 'c': 'xy'}, 'str', 5],
    [9, 'hello', [1, 2, 3], {'a': 'a', 'b': 'b', 'c': 'xy'}, 'str', 5],
    [9, 'hello', [1, 'a', True], {'a': 'a', 'x': 'x', 'y': 'y'}, 'str', 5],
    [9, 'hello', [1, 'a', True], {}, 'str', 5],
    [9, 'hello', [1, 'a', True], {'a': 'a', 'b': 'b', 'x': 'x'}, None, 5],
    [9, 'hello', [1, 'a', True], {'a': 'a', 'b': 'b', 'x': 'x'}, 42, 15],
)

fastjsonschema_validate = fastjsonschema.compile(JSON_SCHEMA)

def fast_compiled(value, _):
    fastjsonschema_validate(value)

def fast_not_compiled(value, json_schema):
    fastjsonschema.compile(json_schema)(value)

validator_class = jsonschema.validators.validator_for(JSON_SCHEMA)
validator = validator_class(JSON_SCHEMA)

def jsonschema_compiled(value, _):
    validator.validate(value)

with tempfile.NamedTemporaryFile('w', suffix='.py') as tmp_file:
    tmp_file.write(fastjsonschema.compile_to_code(JSON_SCHEMA))
    tmp_file.flush()
    spec = importlib.util.spec_from_file_location("temp.performance", tmp_file.name)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)

def fast_file(value, _):
    module.validate(value)

jsonspec = load(JSON_SCHEMA)

def t(func, valid_values=True):
    module = func.split('.')[0]

    setup = """from __main__ import (
        JSON_SCHEMA,
        VALUES_OK,
        VALUES_BAD,
        validictory,
        jsonschema,
        jsonspec,
        fast_compiled,
        fast_file,
        fast_not_compiled,
        jsonschema_compiled,
    )
    """

    if valid_values:
        code = dedent("""
        for value in VALUES_OK:
            {}(value, JSON_SCHEMA)
        """.format(func))
    else:
        code = dedent("""
        try:
            for value in VALUES_BAD:
                {}(value, JSON_SCHEMA)
        except:
            pass
        """.format(func))

    res = timeit.timeit(code, setup, number=NUMBER)
    print('{:<20} {:<10} ==> {:10.7f}'.format(module, 'valid' if valid_values else 'invalid', res))

print('Number: {}'.format(NUMBER))

t('fast_compiled')
t('fast_compiled', valid_values=False)

t('fast_file')
t('fast_file', valid_values=False)

t('fast_not_compiled')
t('fast_not_compiled', valid_values=False)

t('jsonschema.validate')
t('jsonschema.validate', valid_values=False)

t('jsonschema_compiled')
t('jsonschema_compiled', valid_values=False)

t('jsonspec.validate')
t('jsonspec.validate', valid_values=False)

t('validictory.validate')
t('validictory.validate', valid_values=False)


# -*- coding: utf-8 -*-
"""
Created on Thu Jul 26 23:50:33 2018

@author: jikang

leetcode206
题目描述
翻转一个单链表。

进一步： 能否同时给出迭代算法和递归算法？

样例
输入：1->2->3->4->5->NULL
输出：5->4->3->2->1->NULL

"""

# Definition for singly-linked list.
class ListNode:
     def __init__(self, x):
         self.val = x
         self.next = None

class Solution: #迭代的方法
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next: #如果链表只包括0个或者1个头节点，不需要反转
            return head
        # 否则，需要反转
        second = head
        first = head.next  #first也是一个合法节点。
        while first: #迭代终止的条件
            tmp = first
            first = first.next
            tmp.next = second
            second = tmp #这里千万不要写成 second = second.next
        head.next = None
        return second

# 自定义生成链表的函数：
def generate_linked_list(myval):
    mydummy = ListNode(-1)
    activenode = mydummy
    for val in myval:
        activenode.next = ListNode(val)
        activenode = activenode.next
    myhead = mydummy.next
    return myhead

#自定义打印链表的函数：
def print_linked_list(head):
    active_node = head
    while active_node:
        print(active_node.val)
        active_node = active_node.next

if __name__ == "__main__":
    myval = [1,2,3,4,5]
    head = generate_linked_list(myval)
    print('输入的链表如下：')
    print_linked_list(head)

    mysol = Solution()
    myhead = mysol.reverseList(head)
    print('输出的链表如下,反转之后的链表是：')
    print_linked_list(myhead)


import backtrader as bt

class BuyAndHold(bt.Strategy):
  def next(self):
    if self.position.size == 0:
      size = int(self.broker.getcash() / self.data)

      print(f'=== 購買 {size} 股 > 價格 {self.data.close[0]} ===')

      self.buy(size=size)


# Licensed under a 3-clause BSD style license - see LICENSE.rst

import logging
from os.path import basename

from cotede.qc import ProfileQC

from . import fCNV
from .exceptions import CNVError

module_logger = logging.getLogger("seabird.qc")

class fProfileQC(ProfileQC):
    """Apply ProfileQC from CoTeDe straight from a file."""

    def __init__(
        self, inputfile, cfg=None, saveauxiliary=True, verbose=True, logger=None
    ):
        """ """
        self.logger = logging.getLogger(logger or "seabird.qc.fProfileQC")
        self.name = "fProfileQC"

        try:
            # Not the best way, but will work for now. I should pass
            #   the reference for the logger being used.
            profile = fCNV(inputfile)
        except CNVError as e:
            self.attributes["filename"] = basename(inputfile)
            logging.error(e.msg)
            raise

        super().__init__(profile, cfg=cfg, saveauxiliary=saveauxiliary, verbose=verbose)


import requests
import json

def request_url(url):
    request = requests.get(url)
    data = request.json()#Json open

    country_list = []

    for i in data:
        x = i.get('name')
        country = x.get('common','-')

        #print(y)
        x = i.get('capital','-')
        capital = x[0]
        #print(y)
        area = i.get('area','-')
        #print(x)
        x = i.get('currencies','-')
        if(x != '-'):
            #currencies = str(list(x.keys())).strip('[]')
            currencies = ', '.join((list(x.keys())))#convert the dict type in list type
        else:
            currencies = '-'
        dicionario = {'Name': country, 'Capital': capital, 'Area': area, 'Currencies': currencies}
        country_list.append(dicionario)#Add object in list, on format {Name, Capital, Area, Currencies}

    return country_list #Return  Json objects by name, capital, area and currencies in list of  dictionary python format


from app import app, db, mail
from flask_mail import Message
from flask import render_template, request, abort, jsonify, flash, redirect, url_for
from app.models import MainMenu, Post, Lesson, Course, MenuAdmin, Teacher, Signup, FeedBack
from app.forms import SignUpCourse, ShowSignUp, ContactForm
from sqlalchemy.exc import DBAPIError

def convert(text):
    lines = text.split('\n')
    new_lines = []
    for line in lines:
        if line.endswith('\r'):
            new = line.replace('\r', '
')
            new_lines.append(new)
        else:
            new = line + '
'
            new_lines.append(new)
    return ''.join(new_lines)

@app.route('/')
def index():
    try:
        menu = MainMenu.query.all()
        content = Post.query.filter(Post.id == 1).first()
    except Exception:
        print("Ошибка чтения из БД")

    return render_template('index.html', menu=menu, title='Главная страница', content=content)

@app.route('/listpost')
def posts():
    try:
        menu = MainMenu.query.all()
        content = Post.query.filter(Post.id != 1).all()
    except Exception:
        print("Ошибка чтения из БД")

    return render_template('listposts.html', menu=menu, title='Посты', content=content)

@app.route('/listpost/<posturl>')
def showpost(posturl):
    try:
        menu = MainMenu.query.all()
        content = Post.query.filter(Post.url == posturl).first()
    except:
        print("Ошибка чтения из БД")

    if posturl not in [post.url for post in Post.query.all()]:
        abort(404)

    return render_template('post.html', menu=menu, title=content.title, content=content)

@app.route('/listcourse')
def courses():
    try:
        menu = MainMenu.query.all()
        content = Course.query.all()
    except Exception:
        print("Ошибка чтения из БД")

    return render_template('listcourses.html', menu=menu, title='Курсы', content=content)

@app.route('/listcourse/<courseurl>')
def showcourse(courseurl):
    try:
        menu = MainMenu.query.all()
        content = Course.query.filter(Course.url == courseurl).first()
    except Exception:
        print ("Ошибка чтения из БД")

    if courseurl not in [course.url for course in Course.query.all()]:
        abort(404)

    return render_template('course.html', menu=menu, title=content.title, content=content)

@app.route('/listcourse/<courseurl>/<lessonurl>', methods=["GET", "POST"])
def showlesson(courseurl, lessonurl):
    try:
        menu = MainMenu.query.all()
        content = Lesson.query.filter(Lesson.url == lessonurl).first()
    except Exception:
        print("ошибка чтения из БД")

    if lessonurl not in [lesson.url for lesson in Lesson.query.all()] or content.course.url != courseurl:
        '''если url подкурса нет в БД или в курсе с url courseurl нет подкурса (например, если url подкурса из одного курса
        скопировать и вставить в окно браузера, где courseurl другой'''
        abort(404)

    return render_template('lesson.html', menu=menu, title=content.title, content=content)

@app.route('/teachers')
def teachers():
    try:
        menu = MainMenu.query.all()
        result = Teacher.query.all()
    except Exception:
        print("Ошибка чтения из БД")

    return render_template('teachers.html', menu=menu, result=result, title='Наши учителя')

@app.route('/signup', methods = ['GET','POST'])
def signups():
    try:
        menu = MainMenu.query.all()
    except Exception:
        print("Ошибка чтения из БД")
    show_form = ShowSignUp()
    signup_form = SignUpCourse()
    signup_form.course.choices = [(course.id, course.title) for course in Course.query.all()]
    signup_form.lesson.choices = [(lesson.id, lesson.title) for lesson in Lesson.query.filter_by(course_id=1).all()]
    signup_form.teacher.choices = [(teacher.id, teacher.name) for teacher in Teacher.query.all()]
    flag = False

    if show_form.show.data and show_form.validate():  # проверка,есть ли у кнопки (show.data) данные для
        # отправки методом "POST"
        result = Signup.query.filter_by(email=show_form.email.data).first()
        if not result:
            flash('Вы не записывались', category='error')
        else:
            return redirect(url_for('showsignup', signupemail=result.email))

    if signup_form.insert.data and signup_form.validate():  # проверка,есть ли у кнопки (insert.data) данные
        # для отправки методом "POST"
        sign_up = Signup.query.filter_by(email=signup_form.email.data).all()
        if sign_up:
            for s in sign_up:
                if s.lesson.course_id == int(signup_form.course.data) and s.lesson_id == int(signup_form.lesson.data) \
                        and s.name_child.lower() == signup_form.name_c.data.lower():
                    flag = True
            if flag:
                flash("Вы уже записывались на эти занятия", category='error')
            else:
                try:
                    result = Signup(name=signup_form.name.data, surname=signup_form.surname.data,
                                    email=signup_form.email.data,
                                    tel=signup_form.tel.data, age_child=signup_form.age.data,
                                    name_child=signup_form.name_c.data,
                                    teacher_id=signup_form.teacher.data, lesson_id=signup_form.lesson.data)
                    db.session.add(result)
                    db.session.commit()
                    msg = Message("Запись на курс", recipients=[signup_form.email.data])
                    msg.body = f'Ваш ребенок {signup_form.name_c.data} записан на занятия ' \
                               f'{Lesson.query.filter_by(id=signup_form.lesson.data).first().title} ' \
                               f'по курсу {Lesson.query.filter_by(id=signup_form.lesson.data).first().course.title}'
                    msg2 = Message("Новая запись", recipients=['aa@mail.ru'])
                    msg2.body = 'Новая запись, проверьте список записей!'
                    mail.send(msg)
                    mail.send(msg2)
                    flash("Поздравляем, вы записались на курс! На вашу почту отправлено письмо с информацией",
                          category='success')
                    return redirect(url_for('index'))
                except DBAPIError as error:
                    # print(error.orig.pgcode)  #Код ошибки
                    db.session.rollback()
                    print("Ошибка добавления в БД " + str(error))
                    flash("Ошибка добавления в БД", category='error')
        else:
            try:
                result = Signup(name=signup_form.name.data, surname=signup_form.surname.data,
                                email=signup_form.email.data,
                                tel=signup_form.tel.data, name_child=signup_form.name_c.data,
                                age_child=signup_form.age.data, teacher_id=signup_form.teacher.data,
                                lesson_id=signup_form.lesson.data)
                db.session.add(result)
                db.session.commit()
                msg = Message("Запись на курс", recipients=[signup_form.email.data])
                msg.body = f'Ваш ребенок {signup_form.name_c.data} записан на занятия ' \
                           f'{Lesson.query.filter_by(id=signup_form.lesson.data).first().title} ' \
                           f'по курсу {Lesson.query.filter_by(id=signup_form.lesson.data).first().course.title}'
                msg2 = Message("Новая запись", recipients=['aa@mail.ru'])
                msg2.body = 'Новая запись, проверьте список записей!'
                mail.send(msg)
                mail.send(msg2)
                flash("Поздравляем, вы записались на курс! На вашу почту отправлено письмо с информацией",
                      category='success')
                return redirect(url_for('index'))
            except DBAPIError as error:
                # print(error.orig.pgcode)  #Код ошибки
                db.session.rollback()
                print("Ошибка добавления в БД " + str(error))
                flash("Ошибка добавления в БД", category='error')

    return render_template('signup.html', menu=menu, title='Запись на курс', form1=show_form, form2=signup_form)

# функция создает json со всеми подкурсами по id курса
@app.route('/lesson/<int:course>')
def lesson(course):
    lessons = Lesson.query.filter_by(course_id=course).all()
    lessonsarray = []
    for lesson in lessons:
        lessonobj = dict()
        lessonobj['id'] = lesson.id
        lessonobj['title'] = lesson.title
        lessonsarray.append(lessonobj)
    return jsonify({'lessons': lessonsarray})

@app.route('/watchsignup/<signupemail>', methods=['GET', 'POST'])
def showsignup(signupemail):
    data = dict()
    try:
        menu = MainMenu.query.all()
        content = Signup.query.filter_by(email=signupemail).all()
    except:
        print("Ошибка чтения из БД")

    if signupemail not in [signup.email for signup in Signup.query.all()]:
        abort(404)

    data['name'] = content[0].name
    data['tel'] = content[0].tel
    data['email'] = content[0].email

    return render_template('showsignup.html', menu=menu, title='Просмотр записей', content=content, data=data)

@app.route('/contact', methods = ['GET','POST'])
def contact():
    try:
        menu = MainMenu.query.all()
    except Exception:
        print("Ошибка чтения из БД")
    form = ContactForm()
    if form.validate_on_submit():
        try:
            result = FeedBack (name=form.name.data, tel=form.tel.data, text=convert(form.text.data))
            db.session.add(result)
            db.session.commit()
            flash("Спасибо за обращение! Мы свяжимся с Вами в ближайшее время!", category='success')
            msg = Message("Новое обращение", recipients=['aa@mail.ru'])
            msg.body = f'Новое обращение от {form.name.data}.\nТелефон для связи: {form.tel.data}.\n' \
                       f'Текст обращения: {form.text.data}!'
            mail.send(msg)
        except DBAPIError as error:
            db.session.rollback()
            print("Ошибка добавления в БД " + str(error))
            flash("Ошибка добавления в БД", category='error')
        return redirect(url_for('index'))

    return render_template('contact.html', menu=menu, form=form)

@app.errorhandler(404)
def pageNotFound(error):
    if request.path.startswith('/admin/'):
        '''если путь начинается на админ, мы возвращаем 404 admin
        #метод request.path возвращает часть url адреса после request.root_path, starwith - возвращает True, если строка начинается
        с указанного префикса (строки)'''
        try:
            menu = MenuAdmin.query.all()
        except Exception:
            print("Ошибка чтения из БД")
        for m in menu:
            m.url = 'admin'+m.url  # прибавляем к адресу admin для маршрутизации внутри blueprint

        return render_template("admin/page404.html", title="Страница не найдена", menu=menu), 404
    else:
        try:
            menu = MainMenu.query.all()
        except Exception:
            print("Ошибка чтения из БД")

        return render_template("page404.html", title="Страница не найдена", menu=menu), 404


from data_preparation.dataloader import DataSetOCR
from utills.dataloader_services import *
from torch.utils.data import DataLoader
import parameters
from models import crnn
from models.mobilent_rnn import MobilenetRNN
import torch.optim as optim
from torch.autograd import Variable
from torch.nn import CTCLoss
from utills.string_label_converter import averager, StrLabelConverter
import torch.nn.functional as F
import nltk

test_dataset = DataSetOCR(
    csv_file_path='/home/aulipriya/Desktop/fake_sythetic/fake_synthetic.csv',
    root_directory='/home/aulipriya/Desktop/fake_sythetic/top_hat_5_5/')
assert test_dataset
batch = 2
dataloader_params = {
    'batch_size': batch,
    'shuffle': True,
    'collate_fn': old_collate,
    'drop_last': True

}

test_loader = DataLoader(test_dataset, **dataloader_params)

PATH = '../weights/hand_print_mobilenet_v2_24.pth'

# crnn = crnn.CRNN(parameters.max_image_height, 3, parameters.number_of_classes, 256)
crnn = MobilenetRNN(parameters.input_channels, parameters.number_of_classes, 256)
crnn = torch.nn.DataParallel(crnn)
crnn.load_state_dict(torch.load(PATH, map_location=torch.device('cpu')))
crnn.eval()

image = torch.FloatTensor(dataloader_params['batch_size'], 3, parameters.max_image_width, parameters.max_image_height)
text = torch.IntTensor(dataloader_params['batch_size'] * 5)
length = torch.IntTensor(dataloader_params['batch_size'])

with torch.no_grad():
    string_converter = StrLabelConverter()
    loss_function = CTCLoss(zero_infinity=True)
    total_cost = 0
    if torch.cuda.is_available():
        crnn.cuda()
        crnn = torch.nn.DataParallel(crnn, device_ids=range(1))
        image = image.cuda()
        text = text.cuda()
        length = length.cuda()

    counter = 0
    n_correct = 0
    for images, labels in test_loader:
        counter = counter + 1
        batch_size = images.size(0)
        loadData(image, images)
        integer_labels, label_lengths = string_converter.convert_string_to_integer(labels, [])
        loadData(text, integer_labels)
        loadData(length, label_lengths)

        output = crnn(image)
        output = F.log_softmax(output, 2)
        output_size = Variable(torch.IntTensor([output.size(0)] * batch_size))
        cost = loss_function(output, text, output_size, length) / batch_size
        total_cost = total_cost + cost.item()
        _, output = output.max(2)
        output = output.transpose(1, 0).contiguous().view(-1)
        predicted_texts = string_converter.convert_integer_to_string(output.data, output_size.data)
        ground_truth_texts = string_converter.convert_integer_to_string(text.data, length.data)
        for pred, target in zip(predicted_texts, ground_truth_texts):
            if pred == target:
                n_correct += 1
            print('Prediction : {}   GT : {}'.format(pred, target))

    average_cost = total_cost / float(counter)
    accuracy = n_correct / (batch * counter) * 100

    print('Loss {}'.format(average_cost))
    print('Accuracy {}'.format(accuracy))


"""
Kaggle 练习 -- Titanic
author: 王建坤
date: 2018-7-28
"""
import pandas as pd

# 导入数据集
train = pd.read_csv('Titanic_dataset/train.csv')
test = pd.read_csv('Titanic_dataset/test.csv')

# 查看数据集的信息
# print(train.info())
# print(test.info())

# 选择特征
selected_features = ['Pclass', 'Sex', 'Age', 'Embarked', 'SibSp', 'Parch', 'Fare']
X_train = train[selected_features]
X_test = test[selected_features]
y_train = train['Survived']

# 查看具体特征的所有值
# print(X_train['Embarked'].value_counts())
# print(X_test['Embarked'].value_counts())

# 填充缺失值，Embarked 用出现频率最高的特征值
X_train['Embarked'].fillna('S', inplace=True)
X_test['Embarked'].fillna('S', inplace=True)

# 填充缺失值，Age 和 Fare 用特征值的平均值
X_train['Age'].fillna(X_train['Age'].mean(), inplace=True)
X_test['Age'].fillna(X_test['Age'].mean(), inplace=True)
X_test['Fare'].fillna(X_test['Fare'].mean(), inplace=True)

# 查看数据集的信息
# X_train.info()

# 特征向量化
from sklearn.feature_extraction import DictVectorizer
dict_vec = DictVectorizer(sparse=False)
X_train = dict_vec.fit_transform(X_train.to_dict(orient='record'))
# 查看特征向量的特征名称
# dict_vec.feature_names_
X_test = dict_vec.transform(X_test.to_dict(orient='record'))

# 创建随机森林模型分类器
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()

# 交叉验证的精度
from sklearn.model_selection import cross_val_score
print(cross_val_score(rfc, X_train, y_train, cv=5))

# 分类器拟合数据集
rfc.fit(X_train, y_train)
rfc_y_predict = rfc.predict(X_test)

# 保存对测试集的预测结果，以便提交
rfc_submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': rfc_y_predict})
rfc_submission.to_csv('titanic_submission.csv', index=False)


suma=0

opcion=1

while(opcion<=20):
    #acumulando
    suma=suma+100
    opcion=opcion+1
print(f'el contador quedo en: {opcion}')
print(f'El acumulador quedo en : {suma}')

'''
se pregunta en programacion con una condicion
while(contador<=5):
    numero=int(input('Ingrese un numero:'))
    if(numero < 0):
        sumatoria +=1
    contador +=1
print(f'La cantidad de numero negativos ingresados fue: {sumatoria}')
'''


"""
Practical - 3
Name: Mohit Marvania
ID: 20CS033
CE259 PIP

Que: Find Captain Room Number
"""

# Taking the number for matching the rooms.
K = int(input())

# Creating and array of total number of rooms entered by the user.
rooms = [int(i) for i in input().split(' ')]

# storing the sorted and set array of rooms in the new array.
# and comparing each value of sorted_array with each value of rooms.
sorted_array = list(set(sorted(rooms)))
captions_room = None

# A loop which takes value from sorted_array and
# then compares with each value from rooms.
for item in sorted_array:
    yes = 0
    no = 0
    for i in rooms:
        if item == i:
            yes += 1
        else:
            no += 1
    if yes == K:
        continue
    else:
        captions_room = item

# Prints the result which is the captions room no.
print(captions_room)


from typing import Any, Optional

from more_itertools import consume

from .app_worker import AppWorker
from .build_jobs import (
    BaseBuildJob,
    EPUB2BuildJob,
    EPUB3BuildJob,
    EPUBType,
    PaginatedImagesBuildJob
)
from app.settings import Settings
from core.runner import pool_run

class Builder(AppWorker):
    def build_projects(
        self,
        projects: list[str],
        project_type: str,
        bundles: list[str]
    ) -> None:
        args_collection: list[tuple[Settings, str, EPUBType, list[str]]] = []
        kwargs_collection: list[dict[str, Any]] = []
        for project in projects:
            args_collection.append(
                (self.settings, project, EPUBType(project_type), bundles)
            )
            kwargs_collection.append({})
        consume(
            pool_run(
                build_epub,
                args_collection,
                kwargs_collection,
                "process",
                show_progress=True
            )
        )

def build_epub(
    settings: Settings,
    project: str,
    epub_type: EPUBType,
    bundles: list[str]
) -> None:
    build_job_types: list[type[BaseBuildJob]] = [
        EPUB2BuildJob,
        EPUB3BuildJob,
        PaginatedImagesBuildJob
    ]
    build_job: Optional[BaseBuildJob] = None
    for build_job_type in build_job_types:
        if build_job_type.epub_type is epub_type:
            build_job = build_job_type(settings, project, bundles)
    assert build_job is not None
    build_job.run()


# Link: https://www.hackerrank.com/challenges/class-2-find-the-torsional-angle/problem

Input = '''
0 4 5
1 7 6
0 5 9
1 7 2
'''
Output = '8.19'

import math

class Points(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __sub__(self, no):
        result_x = self.x - no.x
        result_y = self.y - no.y
        result_z = self.z - no.z
        return Points(result_x, result_y, result_z)

    def dot(self, no):
        result = self.x*no.x + self.y*no.y + self.z*no.z
        return result

    def cross(self, no):
        result_x = self.y * no.z - no.y * self.z
        result_y = -(self.x * no.z - no.x * self.z)
        result_z = self.x * no.y - no.x * self.y
        return Points(result_x, result_y, result_z)

    def absolute(self):
        return pow((self.x ** 2 + self.y ** 2 + self.z ** 2), 0.5)

if __name__ == '__main__':
    points = list()
    for i in range(4):
        a = list(map(float, input().split()))
        points.append(a)

    a, b, c, d = Points(*points[0]), Points(*points[1]), Points(*points[2]), Points(*points[3])
    # *points[0] means assign every element in the list [0, 4, 5] to the class.
    # Without the *, the Points class will take the whole list [0, 4, 5] as 1 parameter only.
    x = (b - a).cross(c - b)
    y = (c - b).cross(d - c)
    angle = math.acos(x.dot(y) / (x.absolute() * y.absolute()))

    print("%.2f" % math.degrees(angle))


### source ~/pfis/venv/bin/activate

from ROOT import TFile
from root_numpy import root2array, tree2array
import numpy as np

f = TFile("ACTAA.e-s.400keV_10atm.root") # ACTAA.gammas.40keV_10atm.root
array = tree2array(f.ACTAATree)

q = np.zeros(f.ACTAATree.GetEntries())

for i in range(f.ACTAATree.GetEntries()):
    q[i] = array[i]["sdq"].sum()

import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt

plt.plot(array[0]["sdx"],array[0]["sdy"])
plt.axis([-65,+65,-65,+65]) # 13 cm (130 mm) radius
plt.title('x-y trajectories')
plt.plot(array[1]["sdx"],array[1]["sdy"])
plt.plot(array[2]["sdx"],array[2]["sdy"])
plt.plot(array[3]["sdx"],array[3]["sdy"])
plt.plot(array[4]["sdx"],array[4]["sdy"])
plt.savefig("xy-e400keV10atm-trajectories.pdf")
plt.close()

n, bins, patches = plt.hist(q, 50)
plt.title('energysum')
plt.savefig("energysum-e400keV10atm-trajectory.pdf")