如果不难,请解释一下 MySQL 存储过程安全定义器是如何工作的。
我将不胜感激有关该问题的详细独立研究的链接,但如果不难,那么简而言之:行为有何不同:
DEFINER='%'@'localhost'来自DEFINER='root'@'%'
或
INVOKER='%'@'localhost'来自INVOKER='root'@'%'
提前谢谢你。
Ole Lukøje's questions
问题出现在 auto.ru 上的个人帐户中的授权
最终任务是收集一段时间内的广告统计信息。
当只有一个账户时,一切都通过VBA解决,通过IE在auto.ru上授权
但是现在有几个帐户,我想自动化授权过程。整个授权过程由 ajax 脚本覆盖。为了通过这些脚本进行授权,我使用了 selenium-webdriver Firefox():
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
if __name__ == '__main__':
drv = Firefox()
drv.get('https://auth.auto.ru/login/')
try_count = 0
"""Авторизация через ajax скрипт"""
while try_count < 10: # Здесь ИНОГДА всплывает кнопка, которую нужно нажать что-бы продолжить
try:
try_count += 1
btn = drv.find_element('xpath', '//*[@id="confirm-button"]')
btn.click()
break
except NoSuchElementException:
try_count += 1
continue
while True:
try:
login = drv.find_element('xpath', '/html/body/div/div/div/div/form/div/div[2]/span/label/div/span/input')
login.send_keys('**********', Keys.RETURN)
break
except NoSuchElementException:
continue
while True:
try:
password = drv.find_element('xpath', '/html/body/div/div/div/div/form/div/div[3]/span/label/div/span/input')
password.send_keys('************', Keys.RETURN)
break
except NoSuchElementException:
continue
它有效,我去我的个人帐户。
然后不知何故,您需要将会话转移到 requests.session 以进行进一步的工作。在这里,据我了解,您需要将 cookie 传递给请求会话。
selenim 输出.get_cookies()如下所示:
[{'name': '_csrf_token', 'value': '62c6c12693832b221e370*****5744936e01c444d73d59', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False}, {'name': 'suid', 'value': '0c5da5698d907ef61f6ce776c0e95008.9109b8aa****b74b49d9f245095e466', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1604906256}, {'name': 'autoru_sid', 'value': 'a%3Ag5dc7b990*********32k7nllupd2npo.*************%7C1573370256112.604800.7jv-tw07xW7EdH***********51chKUv11gqj-vE6nwlcLv*********fiY6VM_E', 'path': '/', 'domain': '.auto.ru', 'secure': True, 'httpOnly': True, 'expiry': 1574579856}, {'name': 'autoruuid', 'value': 'g5dc7b990205vek9m432k7nllupd2npo.*********************', 'path': '/', 'domain': '.auto.ru', 'secure': True, 'httpOnly': True, 'expiry': 1574579856}, {'name': '_ym_wasSynced', 'value': '%7B%22time%22%*******%2C%22params%22%3A%7B%22eu%22%3A0%7D%2C%22bkParams%22%3A%7B%7D%7D', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573473937}, {'name': '_ym_uid', 'value': '1573370258208414976', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1604906257}, {'name': '_ym_d', 'value': '1573370258', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1604906257}, {'name': '_ym_isad', 'value': '2', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573442258}, {'name': '_ym_visorc_22*******', 'value': 'b', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573372058}, {'name': 'X-Vertis-DC', 'value': 'sas', 'path': '/', 'domain': '.auto.ru', 'secure': False, 'httpOnly': False, 'expiry': 1573373858}]
我不知道如何正确处理它,以便我可以requests拿起它并继续会话。
有一个带有城市电话代码的页面:
它有一个按城市名称搜索代码的表格:
<form method="get" action="/phones/ru/search"> <label for="city">Узнать код по городу:</label> <input type="text" id="city" name="city" style="width: 120px;"/> <label for="phonenumber">или номеру телефона:</label> <input type="text" id="phonenumber" name="phonenumber" style="width: 120px;" placeholder="+7 (___) ___-____" value=""/> <input type="submit" value="Найти" class="btn" style="width: 80px;"/> <input type="hidden" name="part" value="ru"/> </form>
使用“手动控制”,也就是从站点,在“城市”字段中输入城市名称,按下“查找”按钮,我们会得到一个带有该城市代码的页面。我尝试通过以下方式获取带有这个特定城市的代码的页面内容,但结果是一个页面相当于搜索错误页面。
Dim http As New WinHttp.WinHttpRequest
Dim txt As String
Dim timeout As Integer
Dim request As String
timeout = 5000
http.SetTimeouts timeout, timeout, timeout, timeout
request = "{ ""city"": """ & "Москва" & """ }" 'Ну это скорее всего от безнадеги чисто попытался.
http.Open "POST", "http://kodifikant.ru/phones/", False
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.send request
WriteToFile "C:\temp\phonecode.html", http.ResponseText
实际要求:
请告诉我我有什么问题。
是否可以创建一个类的多个实例,然后通过某些标识符来引用它们,而不是将这些实例添加到字典或列表中?
好吧,事情就是这样:
from csv import DictReader
sched_file = open('schedule.csv')
schedule = DictReader(sched_file)
class Day:
def __init__(self, w_day: dict):
self.week_day = w_day['week_day']
self.name = w_day['week_day_name']
days = {item['week_day']: Day(item) for item in schedule}
print(days['3'].name)
# Wednesday
有没有其他方法可以解决这个问题?原则上, “否”
的答案
适合我,我会冷静下来忘记这个话题))
schedule.csv
"week_day","week_day_name","week_day_alt_name","les1","les2","les3","les4","les5","les6","les7","les8"
"1","Monday","Понедельник","Геометрия","Физкультура","Немецкий язык","Физика","Биология","Основы здоровья","Зарубежная литература",""
"2","Tuesday","Вторник","Химия","Английский язык","Украинский язык","Алгебра","Украинская литература","Информатика","Труды",""
"3","Wednesday","Среда","Немецкий язык","Мистецтво","Алгебра","Физика","Правознавство","География","Всемирная история","Физкультура"
"4","Thursday","Четверг","Английский язык","Алгебра","Химия","Зарубежная литература","Информатика","Всемирная история","Биология",""
"5","Friday","Пятница","Геометрия","Физкультура","Физика","Английский язык","Украинский язык","География","Украинская литература","Виховна година"
"6","Saturday","Суббота","","","","","","","",""
"7","Sunday","Воскресенье","","","","","","","",""
最近跑了一个话题(作者后来因为某种原因删掉了),请求帮助在Python中实现俄语单词的断字。他们的条件是:
a ) 如果第一个元音前面有一个辅音,第二个后面至少有一个字母,则可以分隔两个连续的元音(字母 i 与前面的元音视为一个整体);
b ) 连续的两个辅音如果第一个辅音前面有一个元音,则可以分开,并且在第二个辅音后面的单词部分中,至少有一个元音(字母b,b被认为是a全与前面的辅音);
c ) 如果 (a) 和 (b) 段中规定的规则不能适用,那么你应该尝试断词,使第一部分包含多个字母并以元音结尾,第二部分至少包含一个元音。
我不确定我是否已经完全实现了所有条件的满足,所以如果有优化建议,我很乐意接受。
如果脚本的工作适合,如果有人需要,请使用它来保护您的健康。代码在答案中。
有条件的任务有限制Время: 1 сек. Память: 16 Мб。
任务链接
健康)状况:
你得到一个整数序列。数字按顺序编号,从一开始。
需要编写一个程序来求最大偶数和最小奇数之和 - max{a2, a4, ...} + min{a1, a3, ...} .
有 2 个代码选项可以解决这个问题(实际上还有更多,但这些比其他更接近满足要求):
时码:
in_file = open('INPUT.TXT')
num_set = in_file.read().split()
max_even, min_odd = int(max(tuple(num_set[i] for i in range(1, len(num_set), 2)), key=int)), \
int(min(tuple(num_set[i] for i in range(0, len(num_set), 2)), key=int))
open('OUTPUT.TXT', 'w').write(str(sum([max_even, min_odd])))
时间:0.093 - 内存:17 Mb
代码二:
in_file = open('INPUT.TXT')
num_set = in_file.read().split()
in_file.close()
evens = []
odds = []
while len(num_set) > 0:
odds.append(num_set.pop(0))
if len(num_set) > 0:
evens.append(num_set.pop(0))
open('OUTPUT.TXT', 'w').write(str(sum([max(map(int, evens)), min(map(int, odds))])))
时间:1.218 - 内存:8.3 MB
问题:
有什么方法可以优化资源使用?
站点验证系统不做决定,请告诉我错误在哪里。
实际任务:
1002. 电话号码
时间限制:2.0 秒
内存限制:64 MB
在当今世界,您面临着大量的电话号码,这些电话号码随着时间的推移越来越长。你必须记住这些数字。一种容易记住的方法是将字母与每个数字匹配,如下图所示:
1 ij 2 abc 3 def
4 gh 5 kl 6 mn
7 prs 8 tuv 9 wxy
0 oqz
通过这种方式,可以为每个单词或单词组分配一个唯一的编号,以便记住单词而不是电话号码。显然,在用于记住电话号码的单词和该号码的所有者之间找到简单的关系具有特殊的魅力。因此,您下棋的朋友的电话号码 941837296 可以读作 WHITEPAWN(白兵),而您最喜欢的老师的电话号码 2855304 可以读作 BULLDOG(斗牛犬)。
编写一个程序,找到与给定电话号码和给定单词列表匹配的最短单词序列(具有最少单词)。对应关系如上图所示。
初始数据
输入由一组测试组成。每个测试的第一行包含您要匹配助记符的电话号码。该号码由不超过 100 位数字组成。第二行包含字典中的单词总数(最多 50,000 个)。剩下的每一行都包含一个单词,由不超过 50 个小写拉丁字母组成。总输入大小不超过 300 KB。最后一个输入行包含数字 -1。
结果
每行输出必须包含程序找到的最短单词序列。单词必须用单个空格分隔。如果输入没有解决方案,则相应的输出行应包含 text No solution.。如果有多个单词数相同的解决方案,您可以选择其中任何一个。
作者的输入和输出数据,例如:
7325189087
5
it
your
reality
real
our
4294967296
5
it
your
reality
real
our
-1
# Ожидаемый результат
reality our
No solution.
我的测试输入:
2272583262772
11
ba
ra
ku
k
ss
u
ma
da
m
a
ssa
-1
从逻辑上讲,答案应该是
ba ra ku da ma ssa
但由于某种原因,此解决方案不在可能的解决方案列表中。
如果你把它放在ma之后,da那么这个解决方案就找到了。
以下是从中做出最佳选择的解决方案列表:
['ba', 'ra', 'ku', 'da', 'm', 'a', 'ss', 'a']
['a', 'a', 'ra', 'ku', 'da', 'm', 'a', 'ss', 'a']
因此,最佳代码考虑:
ba ra ku da m a ss a
好吧,因此验证者不接受这个决定。
请告诉我错误在哪里
我的决定:
keyboard = {'1': 'ij', '2': 'abc', '3': 'def',
'4': 'gh', '5': 'kl', '6': 'mn',
'7': 'prs', '8': 'tuv', '9': 'wxy',
'0': 'oqz'}
while True:
phone_num = input()
solutions = []
if phone_num == '-1':
break
phone_len = len(phone_num)
words = [input() for _ in range(int(input()))]
collector = []
for word in words:
if len(word) > phone_len:
continue
solution = []
for i in range(len(word)):
if word[i] not in keyboard[phone_num[i]]:
break
else:
solution.append(word)
test_solution = []
while test_solution != solution:
test_solution = solution.copy()
raw_solution = ''.join(solution)
len_solution = len(raw_solution)
new_words = [item for item in words if len(item) <= phone_len - len_solution]
if new_words:
for item in new_words:
raw_solution = ''.join(solution)
len_solution = len(raw_solution)
test_string = raw_solution + item
len_test_string = len(test_string)
if len_test_string > phone_len:
continue
for s in range(len_solution, len_test_string):
if test_string[s] not in keyboard[phone_num[s]]:
break
else:
solution.append(item)
solutions.append(solution)
if solutions:
solutions.sort(key=lambda g: len(g))
print(*solutions[0])
else:
print('No solution.')
在wireguard(以下简称服务器)上有一个vpn。这是服务器配置:wg0.conf
[Interface]
Address = 172.20.100.1/24
ListenPort = 9002
PrivateKey = uio77898hFT89UY=
SaveConfig = false
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 172.20.100.0/24 -o ens18 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 172.20.100.0/24 -o ens18 -j MASQUERADE
[Peer]
PublicKey = 4m7879878798098098
AllowedIPs = 172.20.100.50/32,172.16.100.0/24
有一台具有以下配置的机器连接到wireguard(以下简称客户端)。
[Interface]
Address = 172.20.100.50/32
PrivateKey = CC/Ti8RUTv8gCTrwixgCsRW9QK/A89Hb6cY0D6Xy3nI=
DNS = 208.67.222.222 208.67.220.220
PostUp = iptables -A FORWARD -i %i -j ACCEPT;iptables -t nat -A POSTROUTING -s 172.16.100.0/24 -o enp0s5 -j MASQUERADE
PostDown = iptables -A FORWARD -i %i -j ACCEPT;iptables -t nat -D POSTROUTING -s 172.16.100.0/24 -o enp0s5 -j MASQUERADE
[Peer]
AllowedIPs = 172.20.100.0/24
PublicKey = B24s34juy0HNp6jvztoLmoTudpmKhLag7Qh+f64EUUA=
Endpoint = wireguard-ip:9002
PersistentKeepalive = 25
需要将所有连接到wiregard的机器都放到客户端后面的网络172.16.100.0/24中。
使用此配置,我可以毫无问题地在其本地地址访问客户端。而到其lokalka 的其他地址将无法正常工作。ipv4.forward 无处不在 1
有一个名为“Pedigree: Ancestors and Descendants”的pythontutor作业。
条件:
给定树中的两个元素。确定其中一个是否是另一个的孩子。
输入数据包含一棵与上一个问题中格式相同的树接下来是请求数 K。接下来的 K 行中的每一行都包含树的两个元素的名称。
对于每个这样的查询,打印三个数字之一:如果第一个元素是第二个元素的祖先,则打印 1,如果第二个元素是第一个元素的祖先,则打印 2,或者如果它们都不是另一个元素的祖先,则打印 0。
它是介绍性的(src_data.txt):
9
Alexei Peter_I
Anna Peter_I
Elizabeth Peter_I
Peter_II Alexei
Peter_III Anna
Paul_I Peter_III
Alexander_I Paul_I
Nicholaus_I Paul_I
3
Anna Nicholaus_I
Peter_II Peter_I
Alexei Paul_I
有一个代码(嗯,就是一个解决方案的尝试):
def input():
return rows.pop(0)
rows = []
file = open('src_data.txt', 'r')
for line in file:
rows.append(line[:-1])
# ======== Досюда это имитация ввода на PythonTutor ===
names = set()
tree = []
for _ in range(int(input()), 1, -1):
child, parrent = input().split()
tree.append([child, parrent])
names.update([child, parrent])
for name in names:
for item in tree:
if name == item[0]:
for i in range(len(tree)):
if name == tree[i][-1]:
tree[i].append(item[1])
# === Собственно проблема вот этом блоке (который выше) ==
# === Он то формирует списки как нужно, то недовставляет элементы ==
res_row = []
for _ in range(int(input())):
pers_1, pers_2 = input().split()
res = '0'
for branch in tree:
if pers_1 in branch and pers_2 in branch:
if branch.index(pers_1) > branch.index(pers_2):
res = '1'
else:
res = '2'
res_row.append(res)
print(' '.join(res_row))
如果不是输出中的随机值,一切都会好起来的:
for i in {1..40}; do python3 first.py; sleep 1; done
0 2 0
0 2 0
0 2 0
1 2 0
0 2 0
1 2 0
1 2 0
0 2 0
1 2 0
1 2 0
1 2 0
1 2 0
1 2 0
0 2 0
请解释这是怎么回事,有什么问题?
有一个 systemd 单元:
[Unit]
Description=home storage folder
After=remote-fs-pre.target
After=network.target
After=network-online.target
Wants=network-online.target
BindsTo=network-online.target
Conflicts=umount.target
Before=umount.target
[Mount]
What=//172.16.100.1/storage
Where=/home/username/Shared/storage
Type=cifs
Options=noauto,x-systemd.automount,noexec,noperm,iocharset=utf8,uid=1000,gid=1000,credentials=/etc/share_creds/home_samba
[Install]
WantedBy=remote-fs.target
安装很棒。systemctl stop它通常在没有 narekariya的情况下通过卸载。
但是,如果您关闭或重新启动安装了球的计算机,它会在尝试卸载它时挂起一分半钟。
请告诉我选择哪种方式以在关闭时摆脱挂起。
UPD
一些澄清:
1. Kubuntu 18.04.1
2. 自然,NetworkManager 驱动网络
UUPD
怀着感激之情,我将决定如何在 WiFi 连接中断之前捕捉到这一时刻,以便将卸载命令推送到它前面。
到目前为止,它只能这样工作:
#!/bin/bash
while read -r line; do
[[ "$line" =~ deactivating ]] && {
/bin/systemctl stop home-username-Shared-storage.mount
}
done < <(LANG=en_US nmcli monitor)
但。再次。测试时它可以工作。也就是说,如果我手动运行这个脚本,通过启动
systemctl start home-username-Shared-storage.mount它来安装球,然后当 WiFi 关闭时,球将被很好地卸载。但是,如果您让机器重新启动,它会再次冻结一分半钟并试图卸下球。
UUUPD作为一个拐杖,到目前为止我一直在考虑添加到[Mount] TimeoutSec=5同时,5 秒后卸载简单地以错误结束,然后计算机安静地重新启动。但是如果有比仅仅扼杀 umount 过程更漂亮的方法,那么我将不胜感激。
我想以某种方式安排 Bashevsky 脚本,以便它在一个漂亮的框架中给出一个菜单。我在谷歌上搜索,抓挠我的萝卜,嗯,然后冲掉了几个小功能。结果,我很高兴地与 SO 参与者分享,突然间它会派上用场。
先生们,告诉我是否有人知道PLZ。
git config --global alias.com "commit -a -m \"$(date +\"%H:%M:%S_%d-%m-%Y\")\""
结果给出了在提交中创建别名的时间戳
git config --global alias.com "commit -a -m \"\$(date +\"%H:%M:%S_%d-%m-%Y\")\""
也
git config --global alias.com 'commit -a -m "$(date +"%H:%M:%S_%d-%m-%Y")"'
实际上在提交中给出"$(date +"%H:%M:%S_%d-%m-%Y")"。
bashevsky 别名工作正常
alias gcom='git commit -a -m "$(date +"%H:%M:%S_%d-%m-%Y")"'
但如果可以通过 git 别名来做到这一点,我想这样做。