教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
1
使用AI实现高精度钢琴曲转谱Piano Transcription简明使用教程
37,794 阅读
2
使用ESP8266Wifi模块制作Wifi杀手
37,467 阅读
3
unravel 让图片唱歌详细教程 Real Time Image Animation 项目
27,386 阅读
4
佳能相机刷Magic Lantern魔灯固件
23,503 阅读
5
战地3 正版账号免费分享!
16,213 阅读
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
标签搜索
python
前端
环境搭建
空镜素材
Ubuntu
markdown
神器
黑苹果
编码
技巧
Git
数据库
开发
下载工具
Youtube
CDN
PDF
OST
电影原声带
音乐
易小灯塔
累计撰写
176
篇文章
累计收到
44
条评论
首页
栏目
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
页面
搜索到
127
篇与
的结果
2018-07-14
F-Strings:超级好用的Python格式字符串!!
主要内容从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快!今天就开始使用f-string(后文称为F字符串) !首先, 我们要聊以下在F字符串出现之前我们怎么实现格式化字符的。旧时代的格式化字符串在Python 3.6之前,有两种将Python表达式嵌入到字符串文本中进行格式化的主要方法:%-formatting和str.format()。您即将看到如何使用它们以及它们的局限性。1: %-formatting这是Python格式化的OG(original generation),伴随着python语言的诞生。可以在Python文档中阅读更多内容。请记住,文档不建议使用%格式,其中包含以下注释:“The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly).Using the newer formatted string literals or the str.format() interface helps avoid these errors. These alternatives also provide more powerful, flexible and extensible approaches to formatting text.”怎样使用 %-formatting字符串对象具有使用%运算符的内置操作,可以使用它来格式化字符串。name = "Eric" "Hello, %s." % name # 输出 'Hello, Eric.' 为了插入多个变量,必须使用这些变量的元组。以name = "Eric" age = 74 "Hello, %s. You are %s." % (name, age) # 输出 'Hello, Eric. You are 74.' 为什么 %-formatting不好用上面的代码示例足够易读。但是,一旦你开始使用几个参数和更长的字符串,将很快变得不太容易阅读。first_name = "Eric" last_name = "Idle" age = 74 profession = "comedian" affiliation = "Monty Python" "Hello, %s %s. You are %s. You are a %s. You were a member of %s." %</div> (first_name, last_name, age, profession, affiliation) # 输出 'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.' 这种格式不是很好,因为它是冗长的,会导致错误,比如不能正确显示元组或字典。2: str.format()这种更新的工作方式是在Python 2.6中引入的。怎样使用Use str.format()str.format()是对%-formatting的改进。它使用正常的函数调用语法,并且可以通过对要转换为字符串的对象的__format __()方法进行扩展。使用str.format(),替换字段用大括号标记:"Hello, {}. You are {}.".format(name, age) # 输出 'Hello, Eric. You are 74.' 通过引用其索引来以任何顺序引用变量:"Hello, {1}. You are {0}-{0}.".format(age, name) # 输出 'Hello, Eric. You are 74-74.' 但是,如果插入变量名称,则会获得额外的能够传递对象的权限,然后在大括号之间引用参数和方法:person = {'name': 'Eric', 'age': 74} "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age']) # 输出 'Hello, Eric. You are 74.' 也可以使用**来用字典来完成这个巧妙的技巧:"Hello, {name}. You are {age}.".format(**person) # 输出 'Hello, Eric. You are 74.' 与f-string相比,str.format()绝对是一个升级版本,但它并非总是好的。为什么 str.format() 并不好使用str.format()的代码比使用%-formatting的代码更易读,但当处理多个参数和更长的字符串时,str.format()仍然可能非常冗长。first_name = "Eric" last_name = "Idle" age = 74 profession = "comedian" affiliation = "Monty Python" print(("Hello, {first_name} {last_name}. You are {age}. " + "You are a {profession}. You were a member of {affiliation}.") </div> .format(first_name=first_name, last_name=last_name, age=age, </div> profession=profession, affiliation=affiliation)) # 输出 Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python. 如果想要传递给字典中的.format()的变量,那么你可以用.format(** some_dict)解压缩它,并通过字符串中的键引用这些值,但是必须有更好的的方法f-Strings:一种改进Python格式字符串的新方法F字符串在这里可以节省很多的时间。他们确实使格式化更容易。他们自Python 3.6开始加入标准库。也称为“格式化字符串文字”,F字符串是开头有一个f的字符串文字,以及包含表达式的大括号将被其值替换。表达式在运行时进行渲染,然后使用__format__协议进行格式化。与以下是f-strings可以让编程更轻松的一些方法。简单例子语法与str.format()使用的语法类似,但较少细节啰嗦。name = "Eric" age = 74 f"Hello, {name}. You are {age}." # 输出 'Hello, Eric. You are 74.' 使用大写字母F也是有效的:F"Hello, {name}. You are {age}." # 输出 'Hello, Eric. You are 74.' 任意表达式由于f字符串是在运行时进行渲染的,因此可以将任何有效的Python表达式放入其中。可以做一些非常简单的事情,就像这样:f"{2 * 37}" # 输出 '74' 可以调用函数f"{name.lower()} is funny." # 输出 'eric is funny.' 甚至可以使用带有f字符串的类创建对象。class Comedian: def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age def __str__(self): return f"{self.first_name} {self.last_name} is {self.age}." def __repr__(self): return f"{self.first_name} {self.last_name} is {self.age}. Surprise!" new_comedian = Comedian("Eric", "Idle", "74") f"{new_comedian}" 'Eric Idle is 74.' __str __()和__repr __()方法处理对象如何呈现为字符串,因此您需要确保在类定义中包含至少一个这些方法。如果必须选择一个,请使用__repr __(),因为它可以代替__str __()。__str __()返回的字符串是对象的非正式字符串表示,应该可读。__repr __()返回的字符串是官方表示,应该是明确的。调用str()和repr()比直接使用__str __()和__repr __()更好。默认情况下,f字符串将使用__str __(),但如果包含转换标志!r,则可以确保它们使用__repr __():f"{new_comedian}" 'Eric Idle is 74.' f"{new_comedian!r}" 'Eric Idle is 74. Surprise!' 多行f-string多行字符串:message = (f"Hi {name}. " f"You are a {profession}. " f"You were in {affiliation}.") message # 输出 'Hi Eric. You are a comedian. You were in Monty Python.' 没必要将f放在多行字符串的每一行的前面。以下代码也能运行:message = (f"Hi {name}. " "You are a {profession}. " "You were in {affiliation}.") message # 输出 'Hi Eric. You are a {profession}. You were in {affiliation}.' 但是如果使用"""这将会发生什么:message = f""" Hi {name}. You are a {profession}. You were in {affiliation}. """ message # 输出 '\n Hi Eric. \n You are a comedian. \n You were in Monty Python.\n ' 性能f字符串中的f也可以代表“速度快”。f-字符串比%-formatting和str.format()都快。f-字符串是运行时渲染的表达式,而不是常量值。以下是文档摘录:“F-strings provide a way to embed expressions inside string literals, using a minimal syntax. It should be noted that an f-string is really an expression evaluated at run time, not a constant value. In Python source code, an f-string is a literal string, prefixed with f, which contains expressions inside braces. The expressions are replaced with their values.” (Source)在运行时,大括号内的表达式将在其自己的作用域中进行求值,然后将其与其余字符串组合在一起。以下是速度比较:%%timeit name = "Eric" age = 74 '%s is %s.' % (name, age) 202 ns ± 2.05 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) %%timeit name = "Eric" age = 74 '{} is {}.'.format(name, age) 244 ns ± 5.52 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) %%timeit name = "Eric" age = 74 '{name} is {age}.' 14.4 ns ± 0.0121 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) 可以看到, 速度最快的就是f字符串.Python f-Strings:Pesky细节为什么F字符串很好,开始使用它们但请记住一些细节。引号您可以在表达式中使用各种类型的引号。只要确保在表达式中使用的f-字符串外部没有使用相同类型的引号即可。以下写法都是正确的:f"{'Eric Idle'}" 'Eric Idle' f'{"Eric Idle"}' 'Eric Idle' f"""Eric Idle""" 'Eric Idle' f'''Eric Idle''' 'Eric Idle' f"The \"comedian<span class="string">" is {name}, aged {age}." 'The "comedian" is Eric, aged 74.' 字典说在使用字典的时候。如果要为字典的键使用单引号,请记住确保对包含键的f字符串使用双引号。以下代码是有效的:comedian = {'name': 'Eric Idle', 'age': 74} f"The comedian is {comedian['name']}, aged {comedian['age']}." # 输出 'The comedian is Eric Idle, aged 74.' 但是,以下代码就是一个语法错误:f'The comedian is {comedian['name']}, aged {comedian['age']}.' # 输出 File "<ipython-input-40-cd7d8a3db23b>", line 1 f'The comedian is {comedian['name']}, aged {comedian['age']}.' ^ SyntaxError: invalid syntax 字典键周围使用与在f字符串外部使用相同类型的引号,则第一个字典键开头的引号将被解释为字符串的结尾。大括号为了使字符串出现大括号,您必须使用双大括号:f"{{74}}" '{74}' 但是,如果使用三个以上的大括号,则可以获得更多大括号:f"{{{{74}}}}" '{{74}}' 反斜杠正如之前所看到的,可以在f字符串的字符串部分使用反斜杠转义符。但是,不能使用反斜杠在f字符串的表达式部分中进行转义:f"{<span class="string">"Eric Idle\"}" # 输出 File "<ipython-input-43-35cb9fe0ccc1>", line 1 f"{\"Eric Idle\"}" ^ SyntaxError: f-string expression part cannot include a backslash lambda表达式如果需要使用lambda表达式,解析f-字符串的方式会稍微复杂一些。如果!, :或}不在括号,大括号,括号或字符串中,则它将被解释为表达式的结尾。由于lambda使用:,这可能会导致一些问题:f"{lambda x: x * 37 (2)}" # 输出 File "<fstring>", line 1 (lambda x) ^ SyntaxError: unexpected EOF while parsing 可以通过将您的lambda嵌套在圆括号中来解决此问题:f"{(lambda x: x * 37) (2)}" # 输出 '74' 结束语虽然仍然可以使用格式化字符串的较旧方式,但使用F字符串时可以更简洁,更易读,更方便,既快速又不易出错。
2018年07月14日
1,903 阅读
2 评论
6 点赞
2018-07-02
Ubuntu软件操作的相关命令
Ubuntu软件操作的相关命令sudo apt-get update 更新源 sudo apt-get install package 安装包 sudo apt-get remove package 删除包 sudo apt-cache search package 搜索软件包 sudo apt-cache show package 获取包的相关信息,如说明、大小、版本等 sudo apt-get install package --reinstall 重新安装包 sudo apt-get -f install 修复安装 sudo apt-get remove package --purge 删除包,包括配置文件等 sudo apt-get build-dep package 安装相关的编译环境 sudo apt-get upgrade 更新已安装的包 sudo apt-get dist-upgrade 升级系统 sudo apt-cache depends package 了解使用该包依赖那些包 sudo apt-cache rdepends package 查看该包被哪些包依赖 sudo apt-get source package 下载该包的源代码 sudo apt-get clean && sudo apt-get autoclean 清理无用的包 sudo apt-get check 检查是否有损坏的依赖
2018年07月02日
3,577 阅读
0 评论
0 点赞
2018-06-28
解决VMware虚拟机桥接模式上不了网
前几天vmware升级到15版本, 发现突然桥接模式上不了网了, 但是nat模式就可以上, 很奇怪, 之前朋友也有碰到这样的问题的, 都是重装系统解决的. 我的笔记本用了很多年没重装过系统了, 没舍得重装, 就上网搜了下, 最后尝试解决了, 解决的方法如下首先右键点击网络状态那个图标点击更改适配器设置查看现在正在用的网卡, 我的是有线连接的然后打开vmware 点击编辑-虚拟网络编辑器点击更改设置桥接模式选择你刚才看到的网卡, 点击应用然后网络连接那断开再连接, 就可以成功联网了
2018年06月28日
3,793 阅读
0 评论
0 点赞
2018-06-28
virtualenvwrapper报错的解决办法
virtualenvwrapper 没配置好, 发现会报如下错误/usr/bin/python: No module named virtualenvwrapper virtualenvwrapper.sh: There was a problem running the initialization hooks. If Python could not import the module virtualenvwrapper.hook_loader, check that virtualenvwrapper has been installed for VIRTUALENVWRAPPER_PYTHON=/usr/bin/python and that PATH is set properly. 解决的办法编辑~/.bashrc文件的最下方加入下面语句:if [ -f ~/.local/bin/virtualenvwrapper.sh ]; then export WORKON_HOME=$HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 source ~/.local/bin/virtualenvwrapper.sh fi 保存后更新配置即可解决问题source ~/.bashrc
2018年06月28日
6,469 阅读
0 评论
0 点赞
2018-06-24
Ubuntu 添加root权限用户
$是普通管员,#是系统管理员,在Ubuntu下,root用户默认是没有密码的,因此也就无法使用(据说是为了安全)。想用root的话,得给root用户设置一个密码:sudo passwd root 然后会提示让你输入新的 UNIX 密码输入后再确认输入就可以完成root账号的设置了输入susu 输入密码后,就可以切换到root用户权限了, 此时我们发现命令行由$变成了#moin@moin:~$ root@moin:/home/moin#
2018年06月24日
3,050 阅读
0 评论
0 点赞
2018-06-18
了解 ShellShock(破壳漏洞)
在学习linux shell编程的时候, 看到资料上说bash版本过旧的话就可能受到破壳漏洞的攻击.下面就来了解一下什么是破壳漏洞什么是ShellShockShellShock是一个BashShell漏洞(据说不仅仅是Bash,其他shell也可能有这个漏洞).一般情况来说,系统里面的Shell是有严格的权限控制的,如果没有相应的权限,是根本看不到某些命令的存在,更不要说执行这些命令。但是,Bash在运行的过程中会调用操作系统的环境变量,并且会执行一些设置命令。通过ShellShock漏洞,入侵者可以把某些”本来没有权限执行的语句或者命令“,注入到环境变量里。当bash设置环境变量的时候,就会执行这些”被注入“命令。这样子便绕过用户权限的限制,把一些”没有权限执行的命令“,变成”具有执行权限的命令“了。从而可以在系统内任意执行Bash命令语句,胡作非为(相当于获得root超级用户权限)。漏洞成因bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“(){”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。核心的原因在于在输入的过滤中没有严格限制边界,没有做合法化的参数判断。漏洞范围:Bash 版本小于等于4.3防御办法Bash 升级到最新的版本
2018年06月18日
732 阅读
0 评论
0 点赞
2018-06-04
学习到了几个比较舒服的代码风格
学习到了几个比较舒服的代码风格 看了别人的写的代码, 学习到了几个比较舒服的代码风格自定义Log替换print使用自定义log()def log(*args, **kwargs): '''替代print''' print('log', *args, **kwargs) log() 写入到本地logimport time def log(*args, **kwargs): format = '%Y/%m/%d %H:%M:%S' value = time.localtime(int(time.time())) dt = time.strftime(format, value) with open('log.txt', 'a', encoding='utf-8') as f: print(dt, *args, file=f, **kwargs) 字典函数函数存到字典里, 方便以后调用func_list = { 'func1' = func1(), 'func2' = func2(), } func_list.get('func1') 字典传参if __name__ == '__main__': config = dict( debug=True, host='127.0.0.1', port=8000, # 这样写参数方便注释 ) app.run(**config) 多模块导入from flask import ( Flask, request, render_template, redirect, ) JavaScript自定义日志var log = function(){ console.log.apply(console, arguments) } log('代码')
2018年06月04日
925 阅读
0 评论
0 点赞
2018-05-25
使用you-get 批量下载视屏
使用 pyquery,requests,配合 you-get 写了一个小脚本来自动下载视频到指定的目录,需本机已安装you-get。代码import os import requests from pyquery import PyQuery as pq def get_urls(url): """ 解析网页数据,获得目标url """ response = requests.get(url) if response.status_code == 200: # print(response.text) html = response.text doc = pq(html) a_list = doc('li.video a.title') # print(a_list) print(type(a_list)) url_list = [a.attr('href').strip('//') for a in a_list.items()] print(url_list) return url_list return None def cmd_download(url): """ 逐条进行下载视频 """ try: info = os.system(r'you-get --debug -o C:\test {}'.format(url)) print(info) except Exception as e: print(e) cmd_download(url) def main(): """ 函数的主入口 """ for i in range(1, 3): url = 'https://search.bilibili.com/video?keyword=%E8%90%A7%E4%BA%95%E9%99%8C&order=totalrank&page=' + str(i) url_list = get_urls(url) if url_list is not None: [cmd_download(url) for url in url_list] if __name__ == '__main__': main()
2018年05月25日
2,129 阅读
0 评论
0 点赞
2018-05-23
ttyS、ttySAC、tty、ttyn的区别
ttyS串行端口终端(/dev/ttySn) 串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如, 在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。ttySACPC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC,如果你发觉串口不能用,可以看看你是不是用的调试串口或者你用的串口是不是内核启动时给初始化成其他用途了tty控制终端(/dev/tty) 如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它 具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。ttyn控制台终端(/dev/ttyn, /dev/console) 在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等 称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。目前只有在单用户模式下,才允许用户登录控制台。
2018年05月23日
7,070 阅读
0 评论
0 点赞
2018-05-22
使用You-Get下载视屏
使用You-Get下载视屏You-Get同样也是一个基于Python的下载工具,与youtube-dl齐名,可以下载国内外主流视频网站上的视频,另外还能下载图片和音频安装和You-Get和FFmpeg安装Python和FFmpeg $ pip3 install you-get #安装You-Get 在命令行输入you-get, 没报错就说明已经安装成功了 $ you-get 安装ffmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec1.进入FFmpeg官网,进入下载页面,根据自己的操作系统选择下载最新的32位或64位静态程序版本2.将程序添加到环境变量使用You-Get下载视频直接输入命令接下载(默认最高质量)$ you-get [url] #一般情况下用这一个命令就够了,使用最简单,而且下载的是最高质量 仅查看视频清晰度和格式$ you-get -i [url] 下载指定清晰度的视频各个视频网站的清晰度规则不同,具体的命令可以根据上面的-i来查看$ you-get --format=hd3 #这是优酷的1080p $ you-get --itag=137 #这是YouTube的1080p You-Get的其他用法自定义下载路径$ you-get -o [new_path] [url] 暂停下载与继续暂停下载:Windows的命令提示符可以按Ctrl+C中断命令,下载目录下会保存有一个以.download为扩展名的缓存文件。继续下载:重新执行下载任务,如果下载目录下有上次下载保存的缓存文件,则继续上次下载进度。 强制重新下载(即使下载完成也会重新写入):$ you-get -f [url] 批量下载视频列表You-Get支持批量下载,比如优酷个人空间里的所有视频,播放列表里的所有视频等等$ you-get [playlist_url] 下载字幕/弹幕下载Bilibili和YouTube等带有外挂字幕/弹幕的视频时,You-Get会自动下载相应的字幕/弹幕文件 注意:Bilibili的弹幕文件是.xml格式,本地播放器可能无法加载,可以使用Danmu2Ass将.xml格式转换为.ass格式使用代理下载这里以我用的SS为例(SS用户建议使用全局代理,就不必要使用本条命令)$ you-get -x 127.0.0.1:1080 [url] 使用You-Get自动搜索Google上的视频并自动匹配最佳结果下载$ you-get "Video_Name" 除了下载在线视频网站的视频,You-Get还可以下载图片、音乐等媒体文件,限于篇幅,这里不作具体介绍,感兴趣的可以自己查阅You-Get官网和GitHub项目上的说明You-Get官网:https://you-get.org/GitHub项目:https://github.com/soimort/you-get
2018年05月22日
3,145 阅读
0 评论
0 点赞
2018-05-20
Ubuntu18.04 安装 Postman 教程
开发的过程中经常使用Postman来发起网络请求,下面就来介绍Postman这个工具到安装方法直接用Snap命令安装sudo snap install vscode 如果不能安装, 可以使用下面办法手动安装下载wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz 解压sudo tar -xzf postman.tar.gz -C ~/Apps 删除压缩包rm postman.tar.gz 输入下面命令运行试试~/Apps/Postman/Postman 如果有报错就安装这个包sudo apt-get install libgconf-2-4 添加到全局变量, 以后可以直接在命令行输入postman启动sudo ln -s ~/Apps/Postman/app/Postman /usr/bin/postman 创建快捷方式vim ~/.local/share/applications/postman.desktop 然后固定到dock栏即可若搜狗输入法受到影响, 候选词显示不了中文到话, 输入下面命令即可解决cd ~/.config rm -rf SogouPY* sogou*
2018年05月20日
3,180 阅读
0 评论
0 点赞
2018-05-07
MongoDB 使用笔记
简介非关系型数据库, 对json有良好的支持应用场景: 监控日志, 格式不统一的数据, 内嵌的文档存储安装下载: https://www.mongodb.com/download-center#community图形化界面管理工具robo 3t安装在mangodb安装目录下创建配置文件mongo.cfg, 设置日志文件和数据库存储路径systemLog: destination: file path: D:\DevelopTools\mongodb\logs\mongodb.log storage: dbPath: D:\DevelopTools\mongodb\data安装 MongoDB服务通过执行mongod.exe,使用--install选项来安装服务,使用--config选项来指定之前创建的配置文件。mongod.exe --config "D:\DevelopTools\mongodb\mongo.cfg" --install启动MongoDB服务net start MongoDB关闭MongoDB服务net stop MongoDB移除 MongoDB 服务mongod.exe --remove启动mangodb客户端mongo默认端口为: 27017数据表和集合操作链接数据库 mongodb://admin:123456@localhost/data1显示数据库show dbs进入数据库use 指定数据库创建数据库: 没有newdata则创建, 有则进入use newdata删除数据库use newdata db.dropDatabase()查看当前集合show collections创建集合db.createCollection(name, options)参数说明:name: 要创建的集合名称options: 可选参数, 指定有关内存大小及索引的选项删除集合db.collection.drop()数据操作新增数据插入数据db.newdata.insert({"键":"值"})如果中文提示错误2018-03-19T11:46:07.875+0800 E QUERY [thread1] malformed UTF-8 character sequence at offset 24先设置cmd的编码chcp 65001插入文档db.COLLECTION_NAME.insert(document) 或 db.COLLECTION_NAME.save(document)save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:db.collection.insertOne( <document>, { writeConcern: <document> } )db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:db.collection.insertMany( [ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> } )参数说明:document:要写入的文档。writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。ordered:指定是否按顺序写入,默认 true,按顺序写入。可以为数据添加一个变量再插入> document=({title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by: 'insmoin', url: 'http://www.insmoin.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }); db.col.insert(document)查找数据查看数据db.newdata.find() show dbsdb.collection.find(query, projection)query :可选,使用查询操作符指定查询条件projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:操作格式范例RDBMS中的类似语句等于{<key>:<value>}db.col.find({"by":"菜鸟教程"}).pretty()where by = '菜鸟教程'小于{<key>:{$lt:<value>}}db.col.find({"likes":{$lt:50}}).pretty()where likes < 50小于或等于{<key>:{$lte:<value>}}db.col.find({"likes":{$lte:50}}).pretty()where likes <= 50大于{<key>:{$gt:<value>}}db.col.find({"likes":{$gt:50}}).pretty()where likes > 50大于或等于{<key>:{$gte:<value>}}db.col.find({"likes":{$gte:50}}).pretty()where likes >= 50不等于{<key>:{$ne:<value>}}db.col.find({"likes":{$ne:50}}).pretty()where likes != 50MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。语法格式如下:>db.col.find({key1:value1, key2:value2}).pretty()ongoDB OR 条件语句使用了关键字 $or,语法格式如下:>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()修改数据update() 方法用于更新已存在的文档。语法格式如下:db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )参数说明:query : update的查询条件,类似sql update查询内where后面的。update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选,抛出异常的级别。删除数据remove() 方法的基本语法格式如下所示:db.collection.remove( <query>, <justOne> )如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )参数说明:query :(可选)删除的文档的条件。justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。writeConcern :(可选)抛出异常的级别。如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)其他操作条件判断MongoDB中条件操作符有:(>) 大于 - $gt(<) 小于 - $lt(>=) 大于等于 - $gte(<= ) 小于等于 - $lte排序在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。>db.COLLECTION_NAME.find().sort({KEY:1})索引MongoDB使用 createIndex() 方法来创建索引。注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。语法createIndex()方法基本语法格式如下所示:>db.collection.createIndex(keys, options)Python使用MongoDB安装驱动 PyMongo pip3 install pymongo使用import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["skin"] mycol = mydb["skin"] mcol.find_one() for i in mcol.find(): print(i)插入数据mcol.insert_one(onedata) # mcol.insert_many(datas) #插入多个数据查询数据d = mcol.find({"id":"1545"}) for i in d: print(i)
2018年05月07日
1,186 阅读
0 评论
0 点赞
2018-05-03
Django项目部署简单记录
前几天买了阿里云的Linux服务器ubuntu16.04,一路搭建环境和部署过程搞了2天多,可以说是神坑无数,最有意思的网上的很多博客是叫踩坑记录,结果照着这些方式去搞出现了很多奇怪的问题,估计也和版本不同有关。这里为了避免少走一些弯路,我就来记录一下整个过程(这里都是默认root用户远程登录下进行操作,项目名为DjangoTest)。Python环境的配置因为Python环境都是Linux系统上面自带的,我这里项目用的设Python3.6,安装的过程就不多说了,这里基本没什么问题,安装好后只需把安装目录链接到系统自带的python3(系统自带的是Python3.5)即可。本来这里应该没什么问题的,但刚这个项目需要请求https的链接,因为在本地的时候会这里是不会出问题的,但是一旦放到服务器端,坑也就来了。请求时直接返回这么一句异常SSLError("Can`t connect to HTTTPS URL because the SSL module is not available")) 可以看到用到是python中的ssl模块不存在,直接去安装好相应的openssl模块后,还是抛出这个异常。于是不停的去Google和百度,过程中也是按照类似的答案,结果还是没能解决这个问题。最后我就卸载了Python3.6, 直接用3.5的环境去运行,这个问题才得以解决。 具体应该是因为系统默认的是加载已存在的ssl模块,用3.6版本的虽然也依赖了,但是并不会识别,发现不是来自默认Python环境中自带的,就无法加载。这里感觉也是能配置的,但事实就是我不知道多少次的卸载重装,按照各种方式去安装和依赖,还是出现同样的问题,好在3.6版本的项目在3.5上还是基本兼容的,虽然暴力,但不失为一种办法。(如果哪位有更好的解决办法,欢迎给我留言)这里完成后就是Python虚拟环境容器的安装和环境变量的配置$ pip install virtualenvwrapper 如果报本地不存在,就先更新下源$ apt-get update 安装完成后直接启动服务/etc/init.d/mysql start /etc/init.d/mysql stop /etc/init.d/mysql restart 然后直接输入mysql进入数据库后$ use mysql 更改mysql密码update user set Password = PASSWORD('你的密码') where User ='root'; 然后设置外部ip访问权限GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION; FLUSH PRIVILEGES; 这里完成后 重启一下 ,然后还需要修改一下配置文件中绑定的地址vim /etc/mysql/mariadb.conf.d/50-server.cnf 这样就能完成数据库的远程连接了。 注意: 如果Django项目中用到Mysql的话,需要在服务器端的Python虚拟环境下安装一下$ pip install mysqlclient 可能会安装出错,因为缺少一些依赖包,安装一下$ apt-get install libmysqlclient-dev 然后重新安装mysqlclient,这样配置就完成了。uwsgi的安装和配置uwsgi也是一种web服务器,这里就不多介绍了,直接开始安装$ pip install uwsgi 可以先来测试一下$ uwsgi --http 0:80 --module DjangoTest.wsgi 然后使用配置文件的方式来启动django项目,可以直接在项目的目录下新建一个uwsgi.ini文件# mysite_uwsgi.ini file [uwsgi] # Django-related settings # 项目根目录的路径 chdir = /你的路径/DjangoTest # Django's wsgi file module = DjangoTest.wsgi # the virtualenv (full path) # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = :8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true # 虚拟环境的目录 pythonpath = /你的虚拟环境的路径/lib/python3.6/site-packages/ 配置文件写好后,其实我们是可以直接用uwsgi就能完成部署的,使用命令$ uwsgi -i uwsgi.ini 如果端口号被占用,就直接使用命令查看占用情况$ lsof -i :8000 然后使用命令,销毁这些进程$ killall -9 uwsgi 但是为了提高扩展性,我们继续下面的步骤Nginx的安装与配置nginx是一个强大的中间件,我们直接把它作为对外的服务接口。 开始安装$ apt-get install nginx 然后看看启动、停止和重启命令/etc/init.d/nginx start /etc/init.d/nginx stop /etc/init.d/nginx reload 这里注意,其它配置文件不要乱改!如果安装完成不能正常启动的话可以重启服务器看看。没问题的话,我们可以在项目目录下新建一个nginx.conf文件,然后按照下面的方式配置# the upstream component nginx needs to connect to upstream django { #django项目的端口号 和uwsgi里面的端口号保存一致 server 0.0.0.0:8000; # for a web port socket (we'll use this first) } # configuration of the server server { # nginx服务的端口号 不用修改 listen 80; # the domain name it will serve for # 这里可以填写你的ip地址或者域名 server_name www.test.com; charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /你的路径/DjangoTest/media; # 指向django的media目录 } location /static { alias /你的路径/DjangoTest/static; # 指向django的static目录 } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include uwsgi_params; # the uwsgi_params file you installed } } 配置写好后,就需要把它链接到Nginx的启动配置文件中,$ ln -s /你的目录/DjangoTest/nginx.conf /etc/nginx/conf.d/ 配置完成后,再去加载一下uwsgi文件。总结配置好后,直接输入IP地址或者解析到该IP的域名就能成功访问到Django项目了,这样你也会发现,通过nginx我们可以轻松地配置和部署多个环境不同的站点,只需要把配置文件写好后放入nginx的启动文件中。 最后来整理一下整个访问的过程1.使用nginx作为外部接口,直接处理发送过来的请求,如果是静态请求,就直接根据配置的静态文件目录,返回相应的静态资源。 2.如果是动态请求,就通过配置文件将请求转移到uwsgi,uwsgi又会将接受到的请求传递给wsgi(Django项目默认通过wsgi启动服务的),wsgi就会根据请求来调用Django项目中的逻辑来处理请求。 3.处理完成后,又将结果返回给uwsgi,然后uwsgi又继续将结果返回给nginx 4.最后Nginx将处理后的结果返回给用户
2018年05月03日
6,329 阅读
0 评论
0 点赞
2018-05-02
跨站脚本攻击XSS的防范
漏洞概述XSS 是指攻击者在网页中嵌入客户端脚本,通常是 JavaScript 编写的恶意代码,当用户使 用浏览器浏览被嵌入恶意代码的网页时,恶意代码会在用户浏览器上执行。XSS 属于 Web 前端攻击,包括但不限于普通用户,网站管理员如果被攻击,攻击装可 以劫持管理员的身份度网站服务器端进行文件管理,数据管理等操作。漏洞原理XSS 攻击是在网页中嵌入客户端恶意脚本代码,这些恶意代码一般使用 JavaScript 编写 JS(JavaScript 简称)可以用 XSS 盗取用户 Cookie、改变网页内容、URL 跳转到恶意网站、监 控键盘记录、甚至 GetShell 等。漏洞利用xss 分为3种 反射性 ,存储型 ,DOM型反射性xss也称非持久性xss,是最容易出现的一种xss例子:攻击者使用 XSS 反射型漏洞盗取管理员 cookie 步骤。1:用户小 a 正在上 www.abc.com 论坛看帖子。2:攻击者发现 www.abc.com/xss.php 存在反射型漏洞,然后精心构造 JS 代码,此代码可以 盗取用户 cookie 发送到指定站点 www.hacker.com3:攻击者将带有反射型 XSS 漏洞的 URL 通过站内短信发给用户小 a,标题为引起小 a 好奇 心的内容,目的是为了让用户小 a 单击链接。4:假设用户小 a 单击了带有 xss 漏洞的 url,会把自己的 cookie 发送到网站 www.hacker.com5:攻击者接受到用户小 a 的 会话 cookie,利用 cookie 以小 a 的身份登录 www.abc.com 从 而劫持小 a 的登录网站凭据进行其它攻击。存储型 XSS 存储型 XSS 又被称为持久性 XSS,是最危险的一种跨站脚本。 允许用户存储数据的 Web 应用都可能出现存储型 XSS 漏洞,当攻击者提交一段 XSS 代码后,被服务端接受并存储,当攻击者再次访问某个页面时,这段 XSS 代码被程序输出到浏 览器造成 XSS 跨站代码攻击,这就是存储型 XSS。 存储型 XSS 与反射型 XSS、DOM 型 XSS 相比,具有更高隐蔽性,危害性也更大,它们最 大区别在于反射型 XSS 与 DOM 型 XSS 执行都必须依靠用户手动去触发,而存储型 XSS 不需 要。另外反射型 XSS 由于默认 IE 8 及以上浏览器,其它现代浏览器例如 chrome,firefox 等 默认已经开启拦截反射型 xss 漏洞,并且随着浏览器补丁不断升级,也修复了绝大多数绕过 代码。以下是 IE 浏览器防护反射型 XSS 漏洞选项: 以下是一个常见存储型 XSS 场景示例: 在测试是否存在 XSS 时,首选要确定输入点与输出点,例如,我们要在留言内容上测试 XSS 漏洞,首先要寻找留言内容输出(显示)的地方在标签内还是在标签属性内,或者其它 地方,如果输出的数据在属性内,那么 XSS 代码是不会被执行的。如:alert(1)” /> 以上 JS 代码虽然成功插入到了 HTML 中,但却无法执行,因为 XSS 代码出现在 Value 属 性中,被当做值来处理,最终浏览器解析 HTML 时,会把数据以文本的形式输出在网页中。 知道了输出点后,可以根据相应标签构造 HTML 代码来闭合,插入 XSS 代码为 “/>alert(1)”,最终在 HTML 文档中为:alert(1)” /> 这样就可以闭合 input 标签,使输出的内容不在 Value 属性中,从而造成 XSS 漏洞。 知道了最基本的测试原理后,下面看看具体的存储型漏洞 1:添加正常留言,昵称为 xxser,留言内容为“HelloWord”,查看前端源代码xxserHello World2016-10-11 11:27:38 2:如果现实区域不在 HTML 属性内,则可以直接用 XSS 代码注入。如果不能确定输出具体 位置,可以用模糊测试方案,代码如下:alert(/stored xss/)普通注入 "/>alert(/stored xss/)闭合标签注入 '">alert(/stored xss/)闭合标签注入 盗取 cookie 的 js 代码后,重新加载留言页面,XSS 代码被浏览器执行。 攻击者将带有 XSS 代码的留言提交到数据库,当用户查看这段留言时,浏览器会把代码认为 正常的 JavaScript 代码来执行。所以,存储型 XSS 具有更高的隐蔽性检测 XSS手工检测:① 可得知输出位置 输入一些敏感字符,例如“<、>、”、’、()”等,在提交后查看 HTML 源代码,看这些 输入的字符是否被转义。在输出这些敏感字符时,很有可能程序已经做了过滤,这样在寻找这些字符时就不 太容易,这时可以输入“AAA<>”’&”字符串,然后在查找源代码时直接查找 AAA 比较 方便。② 无法得知输出位置 很多 Web 程序源码是不公开的,这时在测试 XSS 时就可能无法得知输入数据到底在什 么地方显示,比如测试留言吧是否存在 XSS,在留言后,可能需要经过管理员审核才能显 示,这种情况无法知道数据在后台管理页面处于何种状态,例如: 在标签中:XSS Test在标签中:对这种情况通常会输入“”/> xss test”来测试。2:工具检测使用 Appscan,Burp Suite 或浏览器 Web 渗透插件 hackbar 等均可。工具的局限性在于如果提交测试代码输入框需要输入验证码或者短信,工具是无法识别 各类验证码而顺利提交攻击代码的。修复漏洞cookie 设置HTTPonlysetcookie($name, $value, $expire, $path, $domain, $secure, TRUE) //>=5.2 header ("Set-Cookie: hidden=value; httponly", false); / ≤ PHP 5.1 /第二种,一个函数搞定htmlspecialchars($html);
2018年05月02日
1,455 阅读
0 评论
0 点赞
2018-05-01
CentOS解决不能联网的问题
CentOS解决不能联网的问题 症状: CentOS不能联网进入目录cd /etc/sysconfig/network-scripts/ 输入ls查看文件列表, 找到网卡配置文件,我虚拟机的网卡名称为ens33 编辑vi 按i进入编辑模式, 编辑ifcfg-ens33文件的最后一行,将ONBOOT=no改为ONBOOT=yes,按esc退出编辑模式, 输入:wq保存退出 重启network:$ server network restart pingi下百度能不能ping通$ ping www.baidu.com 如果能ping通, 说明网络已经可以连接了
2018年05月01日
4,973 阅读
0 评论
0 点赞
1
...
3
4
5
...
9