Notes about Python SMTPlib/Email

I followed the instruction which is written in Chinese to learn how to send emails by Python, here some tips from my own practice:
1.Attachment is shown as ‘ATT00002’

The attachment in the receiver mailbox is shown in the format ‘ATT0000X‘ by the code:
att1["Content-Disposition"] = 'attachment; filename="runoob.txt"'
test

The issue can be fixed by using .addheader() function:
att1.add_header('Content-Disposition', 'attachment', filename="1.cpp")

Here is my code.

Advertisements

Running ASA9.1 on EVE

This blog discusses ASA, not ASAv. Refer to
http://missingsmth.com/gns-asa-9-15-with-asdm/
http://www.fixedbyvonnie.com/2015/05/how-to-setup-an-5520-asa-5-2-in-gns-3-version-1-3/#.WnwYwZNuYWo
I found it’s possible to run ASA9.1 on EVE-NG (UNL, unified network lab), so I did a try.

1.Image preparation

No, I can’t provide the image for you, and I won’t respond to any question about image.
Please Refer to
http://missingsmth.com/gns-asa-9-15-with-asdm/
http://binarynature.blogspot.com/2014/01/create-cisco-asa-vmware-fusion.html
https://github.com/nccgroup/asafw

Refer to http://www.eve-ng.net/index.php/documentation/images-table , EVE only support hda.qcow2 format disk. Covert your image to qcow2 format before next step.
2. Copy the ASA Harddisk file to EVE
WX20180209-175745@2x
and execute command: ‘/opt/unetlab/wrappers/unl_wrapper -a fixpermissions’
3. Start the VM
Here is my EVE version: 2.0.3-86
Before starting the VM, I have made following changes:
1. RAM which should be 1,024MB
2. Qemu binary: 2.9 and the x86_64 version
3. make sure the adapter type is default value: tpl(i82559er)
Note: The options which start with E1000 doesn’t work
4. Qemu parameters: -machine type=pc-1.0,accel=tcg -icount auto -hdachs 980,16,32 -nographic
WX20180209-175745@2x
WX20180209-175745@2x
Here are some errors I met when I implementing #3:
Error1:

with qemu options: i386 platform, parameter: -machine type=pc-1.0,accel=tcg
It froze at
CPU: Intel QEMU Virtual CPU version 1.0 stepping 03
Checking ‘hlt’ instruction…

 

Error2:

Change Qemu binary to version2.9 to resolve the issue:It froze at
ide: forcing hda as a disk (980/16/32)
Clocksource tsc unstable (delta = 37885541749 ns)

30分钟上手Python网络爬虫

原文链接: https://hackernoon.com/30-minute-python-web-scraper-39d6d038e5da
此翻译已经获得作者许可。对原文、本文任何形式的转载、引用,必须知会作者

我想用Python和Selenium做网络爬虫有一会了,但是一直没有实施。几天之前,我决定小试一下。看起来令人望而却步,但实现代码从Unsplash抓取一些漂亮的图片却是相当容易的。

简易图片爬虫的食材

*译者注:
1.我是在MAC OS使用VS Code + Python extension.MAC OS自带了Python2,一定要在VS Code中将Python解释器关联为你安装的Python3.
2.与windows不同,geckodriver在MAC OS上没有.exe的后缀
3.参考selenium文档,安装geckodriver,即将下载的geckodriver复制到 /usr/bin 或 /usr/local/bin

简易图片爬虫的食谱

一切安装就绪了?好!在循序渐进深入代码的同时,我会解释每道食材的用途。

首先要做的是绑定 selenium webdriver 和 geckodriver 打开一个为我们工作的浏览器窗口。开始之前,在Pycharm中新建一个工程,下载与你系统对应的最新版本的geckodriver,打开压缩文件并将geckodriver拖拽至你的工程目录中。简单地讲,geckodriver使Selenium获取Firefox控制,所以我们需要它在我们的工程目录中来使用浏览器。

我们要做的下一件事是从Selenium中引入webdriver插入到我们的代码中并连接至我们想连接的URL。所以我们这样做:
github

1

很简单,哈?如果你已经正确地做了每件事,你已经过了难的部分,并且你应该看到一个和上面图片相似的浏览器窗口。

接下来,我们应该向下滚动窗口这样在下载前有更多的图片可以被加载。我们还想等几秒钟以防连接速度慢以及图片未能完全加载。因为Unsplash是用React构建的,等5秒好像足够了,所以我们只这样做,使用time包。我们还想使用一些Javascript代码来滚动页面 — 我们将会用 window.scrollTo() 来实现这个。将这些放到一块,你最终应该得到类似这样的代码:
code1.png

在测试上述代码后,你应该看到浏览器将页面向下滑动了一点。接下来需要做的事情是从这个网站查找我们想要下载的图片。在研究Ract生成的代码后,我发现我们可以使用一个CSS选择器明确的指向页面上相册的图片。这个页面的特定排版和代码将来可能会变,但在我写作的时候我可以使用 #gridMulti img 选择器获取所有显示在我屏幕上的 元素。

我们可以使用 find_elements_by_css_selector() 获取那些元素的一个列表,但我们想要每个元素的 src 属性。所以,我们可以通过迭代这个列表,并抓取它们:
code1

现在,真的要开始获取我们找到的图片了。为了这个,我们将使用 requests 和部分 PIL 库,Image 。我们还想使用从 io 使用 BytesIO 将图片写至我们将在工程目录中创建的 ./images/ 目录。这样,将这些放到一起,我们需要发送一个HTTP GET request 去获取每个图片的URL,使用 Image 和 BytesIO, 我们会保存从响应中获取的图片。这是实现的一种方式:
code1

译者注:

  • MAC OS + VS Code + Python Extension执行脚本时,默认路径是 /Users/user folder
  • 请注意创建保存图片的 images 目录,附上我自己使用的脚本

你只是下载一些免费图片,这些已经足够了。明显地,除非你想原型化一个设计并且你只需要随机的图片,这个小爬虫不够好。所以,我花了时间通过添加一些其它特性来优化它:

  • 命令行参数,允许用户指定一个搜索参数,同样还有滚动的数值,能够使页面为下载加载更多的图片
  • 可定义的CSS选择器
  • 可定义的保存目录,基于搜索查询
  • 通过 移动缩略图URL  全高清图片
  • 基于URL命名图片
  • 过程结束后关闭浏览器窗口

你可以(并且应该)尝试自己根据自己的需要去实现部分特性。这个完整特性的网络爬虫在。记得分别下载 geckodriver 并将它连接至你的工程,如文章开始中的指导。

限制,考虑及优化

整个工程是一个非常简单的概念验证以了解网络爬虫如何完成的,意味着有很多事情可以基于这个小工具优化:

  • 不感谢图片的原上传者是个坏主意。Selenium明显有能力实现这个,所以每个图片都有作者的名字。
  • Geckodriver 不应该放在项目目录,而应该全局安装并 PATH 系统变更
  • 搜索功能能够轻易扩展以包含多个查询,这样下载多个图片的过程可以简化。
  • 默认浏览器可以由Firefox换成Chrome或者甚至PhantomJs, 对这类工程会更好。

Running Palo Alto emulator on EVE (UNL, Virtualbox, MAC OS)

I tried to run Palo Alto on EVE (EVE suggests its user use VMware, I have to use VirtualBox because I don’t have a VMware license).

Then I found I can’t start the Palo Alto Firewall and trying to find the root cause.

1st, I go through EVE logs 1st. System -> System logs -> unl_wrapper.txt

WX20180125-131739@2x

Jan 25 05:18:13 INFO: starting /opt/unetlab/wrappers/qemu_wrapper -T 0 -D 3 -t "PaloAlto" -F /opt/qemu/bin/qemu-system-x86_64 -d 0 -- -nographic -device e1000,netdev=net0,mac=50:00:00:03:00:00 -netdev tap,id=net0,ifname=vunl0_3_0,script=no -device e1000,netdev=net1,mac=50:00:00:03:00:01 -netdev tap,id=net1,ifname=vunl0_3_1,script=no -device e1000,netdev=net2,mac=50:00:00:03:00:02 -netdev tap,id=net2,ifname=vunl0_3_2,script=no -device e1000,netdev=net3,mac=50:00:00:03:00:03 -netdev tap,id=net3,ifname=vunl0_3_3,script=no -smp 2 -m 4096 -name PaloAlto -uuid 934e653f-accd-4ce0-a243-369f853b4add -drive file=virtioa.qcow2,if=virtio,bus=0,unit=0,cache=none -machine type=pc-1.0,accel=kvm -nographic -rtc base=utc > /opt/unetlab/tmp/0/a0fab94b-9b39-4226-884b-894ff4942d65/3/wrapper.txt 2>&1 &
Jan 25 05:18:13 INFO: CWD is /opt/unetlab/tmp/0/a0fab94b-9b39-4226-884b-894ff4942d65/3
Jan 25 05:18:13 ERROR: QEMU Arch is not set (80015).

  1. Start Palo Alto manually

From the log, you can find the qemu command, so I copied it and run it from the console and got the error

Could not access KVM kernel module

I followed the link about KVM kernel module and find the CPU doesn’t support KVM.

also found VirtualBox Ticket #4032.

  1. make it work

depends on #2, edit Palo Alto VM and remove ‘,accel=kvm’ option:

WX20180125-131739@2x

it works.

自造轮子,15分钟完成正则5天的任务

文章译自:Vikash Singhhttps://dev.to/vi3k6i5/regex-was-taking-5-days-to-run-so-i-built-a-tool-that-did-it-in-15-minutes-c98
我之前的工作多是文本数据相关的,处理工具使用Python和正则,故拜读并翻译,分享。

正文

程序员处理文本时,通常需要先对数据进行清洗。有时是替换关键字,如以’JavaScript’替换’Javascript’。其它的时候,只是想找出文档中是否有提到过‘JavaScript’

这样的数据清理工作是大部分数据科学项目处理文本的的标准。

数据科学从数据清洗开始

我最近有一项很相似任务要处理。我在Belong.co任职数据科学家,我有一半的时间在处理自然语言。

当我用我们的文档合集训练一个Word2Vec模型时,这个模型提供同义词作为相似条目,”Javascripting”会作为”JavaScript”的相似条目。

为解决这个问题,我写了正则表达式(Regex)用标准名称替换所有已知同义词。这个正则用’JavaScript’替换’Javascripting’,解决了一个问题,却引入了另一个。

有些人,遇到问题时,想“我知道,我会使用正则表达式。”现在,他们有两个问题了。

以上引用来自于stack-exchange问题,我也遇到了这种情况。

事实证明,搜索和替换关键字的数量在100以内,正则的处理速度快。但我的合集有数以千计的关键词和数百万文档

我对我的正则代码执行基准测试,发现完成一次任务需要5天。我的反应是:

12agpnmd7fbtrh4tvvzrglfng

很明显,有些事情需要搞定。

[更新]

我从尝试优化在使用的正则表达式着手,我了解到编译的表达式更快,所以转而使用它。为了一次替换多个条目,有一个group选项,我也使用了它。但那些包含特殊字符的关键字还是有问题,如’C++’‘.Net’链接

在表达式加载时对关键字进行排序也能优化性能。

我从这个Link受益匪浅,基于字典树(Trie的正则更快Link在项目开始时,我不知道这个库,但我深入的方向和使用字典树(Tire是相同的。

我不是说正则都不好,只是真的很难理解那么多不同的实现形式。我使用的是Python版本,RUST有一个编译版本运行起来会更快,另外,C++的版本会更快一些。

如果只是是关心速度,你可以试其中一个。我需要的是更容易控制和更易理解,所以我打造了一个工具。这帮我将细节简化以确保任何了解一点正则的人就能使用。

[更新结束]

我在办公室和Stack-overflow到处询问,得到了一些建议。VinaySureshStack Overflow都指出这个优雅的算法叫Aho-Corasick算法和Trie字典方法。我查找了下现有方案,但没什么收获 。

所以我编写了自己的实现方法,FlashText腾空出世。

在探究FlashText之前,让我们先看一下它运行得效果如何

FlashText查找条目与正则的时间开销的比较

xruf50n6z1r37ti8rd89

上图是编译后的正则与FlashText处理同一文档的对比。当关键字增加时,正则的处理时间几乎是线性增加的,而FlashText却不受影响。

FlashText将我之前的工作由5天缩减到15分钟!!

12azfrhhgtxhbeb0ds-3bhoaw

FlashText和正则替换条目时间开销的比较

k44ghwp8o712dm58debj

以上基准测试用到的代码的链接A和链接B

那么,FlashText是啥?

FlashText是我在GitHub开源的Python库,它能高效的查找和替换关键字。

使用FlashText需要先将关键字的列表传给它。这个列表将会在内部使用用以构建Trie字典。然后你将一个字符串传给FlashText以声明你想执行替换还是查找

替换模式,会将替换关键字保新的字段串中。查找模式则是返回在字符找到的关键字的列表. This will all happen in one pass over the input string.

这是一个兴奋的用户:

Radmin Rehurek是Gensim的作者。

为什么FlashText这么快?

举个栗子,一个包含3个单词的句子 ‘I like Python’ 和一个包含4个单词的集合 {Python, Java, J2ee, Ruby}.

如果我们从集合遍历每个单词,并判断它是不是在句子中,会进行4次尝试.

'Python'是否在句子中?

'Java'是否在句子中?

…

如果集合中有n个单词将会执行n次循环。同样,每次搜索的步长:<单词>是否在句子中?会适情况而定。这就是正则匹配的处理方式。

另一种方法就是将第一种方法翻过来。遍历句子里中的每一个词,判断它们是否在集合中。

'I'是否在集合中?

'like'是否在集合中?

'python'是否在集合中?

如果句子中有m个单词,它会执行m次循环。在这种用例中,时间开销只依赖于句子中单词的数量。在这一步中,单词是否在集合中? 可以通过使用字典查询变快。

FlashText算法基于第二种方法。是受Aho-Corasick算法和Trie数据结构启发

它的工作方法是:以集合创建一个Trie字典。它的结构如下:

12an09y_xeqfhfmxvpgeeqexq

Start 和 EOT (End of Term) 表示单词分隔如空格,-(period)和换行符。如果一个关键字只会在在两端都有单词分界时才会匹配。这样能够避免从pineapple中匹配到apple.

然后,我们将以 ‘I like Python’为输入字符并逐字符搜索。

第一步: I 是否在字典中? 没有

第二步: like 是否在字典中? 没有

第三步: Python是否在字典中? 是的

12anowwci3fcrbcbrj40b4uaa

因为这是逐字符匹配的,我们能容易在在l跳过 like因为 l和start没有关联。 这将使跳过不匹配的词很快。

FlashText算法只浏览输入字符串’I Like Python’。这个字典可以很好的处理百万的关键字,并不影响执行时间。这是FlashText算法的厉害之处。

通过构建基于Trie的正则获取相似的速度 链接

所以,什么时候应该使用FlashText?

简单来说,当关键字的数量大于500时:

kzg3ol40sfuzpodazspp

详细答案:正则可以基于正则表达式特殊字符搜索条目,如^, $, *, \d, . 所有这引进FlashText都不支持。FlashText只知道条目的开始和结束。简而言之就是 \w, \b. 所以如果你想匹配你 word\dvec的部分单词不是很好。但它在提取像word2vec这样的完整词时是很不错的。

如何使用FlashText

查找条目

# pip install flashtext
from flashtext.keyword import KeywordProcessor
keyword_processor = KeywordProcessor()
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
keywords_found = keyword_processor.extract_keywords('I love Big Apple and Bay Area.')
keywords_found
# ['New York', 'Bay Area']

替换条目

# pip install flashtext
from flashtext.keyword import KeywordProcessor
keyword_processor = KeywordProcessor()
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
keywords_found = keyword_processor.extract_keywords('I love Big Apple and Bay Area.')
keywords_found
# ['New York', 'Bay Area']

Linux tc-how to work on different IPs


#!/bin/bash

interface=eth0
ip1=192.168.1.1
ip2=172.16.1.1
delay1=100ms
delay2=200ms

tc qdisc add dev $interface root handle 1: prio
tc qdisc add dev $interface parent 1:1 netem delay $delay1 10ms 25%
tc filter add dev $interface parent 1: protocol ip prio 1 u32 match ip dst $ip1 flowid 1:1
tc qdisc add dev $interface parent 1:2 netem delay $delay2 10ms 25%
tc filter add dev $interface parent 1: protocol ip prio 2 u32 match ip dst $ip2 flowid 1:2

Python: OverflowError: signed char is greater than maximum

Here the pseudo code about the flow:

from array import array
c = array('b')
with open(file, mode = 'rb') as f:
    for character in f:
        res = func(character)
        c.append(res)

It runs into the error:

OverflowError: signed char is greater than maximum

with a special character ‘À’  which its binary value is 192

QQ

My way to resolve this error is to update typecode of the array from ‘b’ (signed char) to ‘B’ (unsigned char).

from array import array
c = array('B')

Reason: Data from the file should not in a range which from -127 to -1.