Other ways to install Scala
,选择Download the Scala binaries for windows
,因为我是Windows 10环境,安装scala-2.12.8.msi
在电脑硬盘根目录创建文件夹almond
,比如我的是G:\almond
,进入文件夹。
按住shift
单击鼠标右键,选择在此处打开Powershell窗口
。
在命令行中依次执行如下命令
1 | set SCALA_VERSION=2.12.8 |
上述命令会在文件夹中下载这样几个文件:
1 | almond |
最后提示scala-kernel成功就可以。
打开Anaconda Prompt,输入jupyter kernelspec list
,看到已经出现scala内核了。
1 | (base) C:\Users\Administrator>jupyter kernelspec list |
Atom中,进入设置界面,在安装插件界面中搜索scala
,选择安装language-scala
.
创建scala为扩展名的文件,在每一行代码上按shift+回车
键执行代码,可以看到代码后面有运行结果了。
如果打开Jupyter Notebook,可以看到新建中出现Scala选项。
在Notebook中就可以像写Python一样进行交互运行代码了。
如果使用nteract,也是可以执行的,类Jupyter notebook编辑器桌面版nteract
本例用到的组件:生成随机数,增加常量,计算器,过滤记录,分组,记录关联,Excel输出。
随机生成100个随机数,随机数取值于[0,100)之间,计算小于等于50的随机数个数和大于50的随机数个数。并把这两个统计数字放在数据库表的一行的两列中,即输出的结果有一行,一行包括两列,每列是一个统计值。
我使用的PDI版本为7.1.
打开PDI中的Spoon.bat
进入转换设计器。文件->新建->转换
新建空白的抓换任务。Ctrl+s
先保存名为test.ktr
的文件。
步骤->输入
中拖入生成随机数
组件,双击组件,添加一行,名称为rand_num
,类型为随机数字
。
在组件上右键,选择改变开始复制的数量
,因为生成100个随机数,所以输入100,但是没看到确定之类的按钮(坑爹),直接回车就可以了。之后在组件左上角出现x100
的标志。
步骤->转换
中拖入增加常量
组件,双击组件,增加两个常量。multi值设置为100,因为生成的随机数是0-1范围的,后面会将随机数x100得到一个0-100的随机整数。standard设置为50,我们将随机数分开计数是以50为分界点。
鼠标放在随机数
组件上,按住Shift
键,按下鼠标左键拉出一根连线到增加常量
组件上。
步骤->转换
中拖入计算器
组件,双击组件,增加一个新字段,计算方式为A * B
,分别用生成的随机数乘上multi值。
步骤->流程
中拖入过滤记录
组件,步骤->统计
中拖入两个分组
组件,过滤记录连接到分组上,连接的时候回弹出Result is true
和Result is false
选项。
双击过滤记录组件,添加条件。
双击设置第一个分组,计算大于等于50的个数。
双击设置第二个分组,计算小于50的个数。
步骤->连接
中拖入记录关联(笛卡尔输出)
组件,因为我们直接将分组结果放在一行输出,直接笛卡尔连接即可。
步骤->输出
中拖入Excel输出
组件,记录关联组件指向Excel输出。双击Excel输出
组件,文件名中设置为${output_dir}/result
,其中,${output_dir}
是个变量,稍后设置。result是输出文件名。
字段页中可以获取要输出的字段,也可以不设置,默认输出所有字段。
Spoon设计器中编辑->设置环境变量
,会出现我们在Excel中用到的变量,值设置为../mywork
,因为默认的输出目录是Spoon.bat所在目录,我们在上层目录中新建一个mywork文件夹。
再拖入一个Excel输出
组件,从计算器
组件指向该组件,添加连线时会弹出选项,选择复制
。这步的目的是将计算器计算出的结果保存一个。
双击该组件,文件名中设置为${output_dir}/data
.
至此,所有步骤已完成。
点击上部按钮中第一个运行这个转换
,弹出执行转换对话框,直接点击启动,可以看到下部面板中的运行日志,运行完成后查看结果Excel中已经输出相应结果。
假设我们要将时间表示成毫秒数,比方说1000000毫秒,那有一个问题必须解决,这个1000000毫秒的起点是什么时间,也就是我们的时间基准点是什么时间?好比我说你身高1.8米,那这个身高是指相对于你站立的地面说的。这个时间基准点就是epoch,在Unix系统中,这个基准点就是1970年1月1日0点整那个时间点。
上面我们说epoch表示1970年的起始点,那这个1970年又是相对于哪个基准时间呢?一般来说,就是相对于格林尼治时间,也叫做GMT(Greenwich Mean Time)时间,还叫做UTC(Coordinated Universal Time),为啥一个时间基准有两个名字?历史上,先有的GMT,后有的UTC.UTC是我们现在用的时间标准,GMT是老的时间计量标准。UTC是根据原子钟来计算时间,而GMT是根据地球的自转和公转来计算时间。所以,可以认为UTC是真正的基准时间,GMT相对UTC的偏差为0。在实际中,我们的计算机中有一个硬件模块RCT,里面会实时记录UTC 时间,该模块有单独的电池供电,即使关机也不影响。有了epoch这个时间基准,又有了UTC这个基准的基准,我们就可以精确地表示一个时间了。
尽管我们已经可以精确地表示一个时间,很多情况下,我们还是要根据地区实际情况对时间进行一个调整,最常见的就是时区,tzone,相信大家都比较熟悉。此时,当我们说5点5分这个时间时,还需加上是哪个时区的5点5分才能精确说明一个时间。另外一个对时间做出调整的就是DST.DST 全称是Daylight Saving Time,是说,为了充分利用日光,减少用电,人为地对时间做出一个调整,这取决于不同国家和地区的政策法规。比如说,假设你冬天7点天亮起床,但夏天6点天亮,那么在夏天到来时人为将时间加1个小时,这样就可以让你还是觉得7点起床,但实际上是提前一个小时了。
time()
方法获取当前时间距离epoch的秒数,用的是UTC时间,这个函数没有参数。
1 | import time |
将上面的秒数转换为年月日时分秒的形式,可以用time. gmtime()
,time.localtime()
方法。两个函数返回的都是struct_time类的实例。
1 | time.gmtime() |
如果要将上述元组形式的时间转换成秒数,可以用time.mktime()
方法。
1 | now_struct = time.localtime() |
将时间的元组转换为字符串形式,可以用time.strftime()
,将特定格式的时间转成时间元组格式用time.strptime()
方法。
1 | time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) |
time.asctime()
、time.ctime()
方法则会将时间转换为标准24字符的字符串,前者参数是时间元组,后者参数是秒数。
1 | now_struct = time.localtime() |
下图可以比较清楚的描述时间秒数、时间元组、字符串之间的转换关系。
time
模块解决了时间的获取和表示,datetime
模块则进一步解决了快速获取并操作时间中的年月日时分秒信息的能力。
简单说,该模块核心的类就三个,date类表示年月日,time类表示时分秒毫秒,这里不要和time模块搞混淆了。请记住一点,date中是没有时区信息的。
常用datetime.today()
、datetime.now()
方法创建当前时区的对象。datetime.fromtimestamp()
方法接收秒数参数。如果要获得utc的datetime对象,使用datetime. utcfromtimestamp()、datetime. utcnow()方法。
1 | import datetime |
以特定格式字符串创建,使用datetime.strptime()
方法。给定时间元组也可以创建datetime对象。
1 | datetime.datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%S') |
datetime对象转换为时间戳。
1 | dt = datetime.datetime.now() |
datetime对象转换为字符串。
1 | dt = datetime.datetime.now() |
datetime对象转换为time时间元组。
1 | dt = datetime.datetime.now() |
基于某日期,向前或向后计算某段时间后的日期。
1 | dt = datetime.datetime.now() #当前日期 |
计算两个日期的时间差
1 | start = datetime.datetime.strptime('2015-6-1 18:19:59','%Y-%m-%d %H:%M:%S') |
以下函数实现计算自从某一时间到当前时间经过了多少年,多少天,多少秒。
1 | def cal_time_past(start_time = '2016-08-12 05:10:45'): |
1 | dict1 = {} #创建空字典 |
1 | dict3 = dict() #创建空字典 |
1 | import operator |
1 | print(sorted(test.items())) #升序 |
1 | print(sorted(test.items(),key=operator.itemgetter(0))) #升序 |
1 | print(sorted(test.items(),key=lambda x : x[0])) #升序 |
1 | print(sorted(test.items(),key=operator.itemgetter(1))) #升序 |
1 | print(sorted(test.items(),key=lambda x : x[1])) #升序 |
** 注意,如果值的数据类型不一样,以上根据值排序会报错,例如一下字典,值有int和str类型,lambda中要进行类型转换 **
1 | test2 = {'a':1,'c':2,'b':7,'f':'5'} |
1 | dictA = {'a':3,'b':7,'c':'2'} |
** 高版本python中可用 **
1 | dictC = {**dictA,**dictB} |
.ipynb
的。似乎在其他编辑器工具中打不开这种格式。有没有不想在网页中的Jupyter notebook编写代码,也可以直接编辑.ipynb
格式的文件的方法呢?有这样一个软件似乎可以:nteract,这个软件我理解为桌面版的Jupyter notebook,下面是nteract的官网.
官网上可以下载安装文件,支持跨平台,有windows,linux,mac版本,免费的。软件安装好后,启动进入,界面比较简洁。
可以看到,系统中.ipynb
格式的文件打开方式变成了nteract,直接双击文件就能打开进行编辑,保存,跟在Jupyter notebook一样。
软件安装前确保本机有Python执行环境,推荐安装Anaconda,nteract需要连接Jupyter内核才能执行代码,如果已安装有Anaconda,打开nteract后可以看到左下角连接的Jupyter内核名称。
如果需要切换python虚拟环境,就需要安装多个python内核,如何安装参考Atom编辑器中使用Hydrogen切换Python虚拟环境,安装好后在nteract中切换方法如下
和在Jupyter notebook一样,执行单元格的代码可用Shift+Enter
等快捷键,或者单元格靠右侧有个执行程序的小按钮。
敲代码时可以看到是支持代码自动提示与补全的。
如果不小心写了死循环或者想临时终止代码的运行,可以在Runtime
菜单下进行操作。
单元格右侧下拉菜单中可以切换单元格内容是Markdown文本还是代码,如果是MD文本,双击单元格即可显示原始内容。其他单元格操作及相关快捷键看下Edit
或者Cell
菜单就明白了。
软件可以切换亮色与暗色主题。
如果是直接启动软件,第一次保存文件按Ctrl+s
保存会报错,得用另存为。
相比于Jupyter notebook,nteract显得简洁很多,平时开发作为替代也是可以的。单元格操作上,nteract没有Jupyter notebook那么丰富。Jupyter notebook可以额外安装插件进行功能扩展,虽然nteract也可以安装插件,官网上有介绍,但功能似乎没那么强大。
]]>该方法可以扩展数组,会改变原始数组。
1 | a = [1,2,3,4,7,5,6] |
用+
将各数组连接起来。
1 | a = [1,2,3,4,7,5,6] |
flatten()
方法是numpy中array数组的方法,使用时要导入包和类型转换。
1 | from numpy import array |
值得注意的是该方法不适用各数组中元素个数不同的情况。
1 | a = [1,2,3,4] #元素个数不同 |
使用前得把多个数组放在一个数组中,应用在一个二维数组上。
1 | a = [1,2,3,4] |
autocomplete-python traceback output:
的提示,提示信息还是乱码。解决方式是设置Python Executable Paths
进入Atom设置Packages
,找到该插件,进入Settings
在Python Executable Paths
中设置python的执行路径,因为本机是安装的Anaconda,环境变量中没有python执行路径。
重启Atom后就可以了。
]]>配置前先确认电脑上安装了Anaconda,代码编辑器Atom,Atom中安装了Hydrogen插件.
开始菜单中打开Anaconda Prompt
命令行窗口。
查看当前可用的kernel
jupyter kernelspec list
1 | (base) C:\Windows\system32>jupyter kernelspec list |
默认只有第一个,第二个是后加的,在Atom中运行Python启动kernel默认只有第一个。
python -m venv E:\PythonProject\test\pyvenv
创建后文件夹下出现这些文件目录
激活新的虚拟环境
E:\PythonProject\test\pyvenv\Scripts\activate
安装python kernel (ipykernel)到虚拟环境里
python -m pip install ipykernel
安装python kernel到可用的kernel列表中,--name
是自定义名称参数。
python -m ipykernel install --name pyvenv
重启Atom编辑器,启动python内核时多出了一个选项,就是刚刚我们配置的虚拟环境内核。
删除python keernel
remove后指定要删除的kernel名称
jupyter kernelspec remove pyvenv
这里以Postgresql数据库为例,Mysql数据库差不多,其他的自行改造。
先封装一个查询类,查询返回的结果是一个字典,head
是表列名,data
是表数据,再用DataFrame构造数据结构。
1 | import psycopg2 |
运行示例
例如我有以上的两个图,节点b
的前置节点是a
,节点c
的前置节点是b
和d
,以此类推。给出一个节点,需要找出以此节点为前置节点的所有链条节点。比如给出a
,那出来的结果就是a,b,c,d,e
,给出f
,那出来的结果就是f,g,h,i,j,k
。
创建表以及插入数据,多个前置节点用,
隔开,注意,使用的是PostgreSQL数据库。
1 | -- ---------------------------- |
方法有多种,用函数或者存储过程也可以,这里使用WITH
递归,相关信息可以百度:postgresql 递归
。第一个select
语句中要给出起始节点。
1 | WITH RECURSIVE graph_depds AS ( |
向前
查找呢上面的查找相当于找出一个节点所有影响
到的节点,其实就是向下递归,如果给出一个节点,想从这个节点往前追溯有关的节点呢?例如给出c
节点,结果是a,b,c,d
,其实就是向上递归,可以像下面这样写。
1 | WITH RECURSIVE graph_depds AS ( |
如果像Sql Server
等支持WITH
语法的数据,以上写法可以移植,稍作修改就好。但是mysql
等数据库中的实现方式不一样,百度mysql 递归相关的内容都能找到方法。
localhost:5000
可以访问Web服务,但是使用如192.168.1.10
这类本机IP地址却访问不了。 启动Falsk服务后信息如下,
1 | * Serving Flask app "app" (lazy loading) |
除本机外是不能访问的,需要在run
参数中设置,端口自定,主机为0.0.0.0
1 | app.run(host='0.0.0.0', port=5000) |
再次启动后就可以了。
1 | * Serving Flask app "app" (lazy loading) |
aligner
插件是不能错过的。atom-aligner是干什么的呢,就是用来对齐的,比如我们写这样一段变量赋值的程序:
1 | var_a =1 #我是变量1 |
虽然也没问题,但是如果能按=
对齐就更强迫症一些。安装插件后,选中要对齐的行,按快捷键:
Mac: ctrl-cmd-/
Linux/Windows: ctrl-alt-/
就会变为这样
1 | var_a = 1 #我是变量1 |
需要注意是,只安装一个atom-aligner
插件是不够的,得配合不同语言的另一些插件,比如我写python代码,得另外装一个aligner-python
插件才可以。
如果是JSON格式的对象,也是可以按冒号:对齐的
1 | obj = {'aaa': 11, |
要注意的是,如果连同=
,{}
一起选中,按快捷键对齐是不起作用的,得写成这样:
1 | obj = { |
对齐后是这样的
1 | obj = { |
所以:
左边是不会对齐的,我们在编辑器写代码的时候一般都会左对齐了,像这样
1 | obj = { |
有个问题是,官方的说明里说是可以冒号对齐的,对齐成这样
1 | obj = { |
插件设置中没有找到相关设置,官方说明看了半天也没找到怎么设置,最后无奈改了插件的源码。
进入插件设置
找到插件包配置,修改默认为left
重启编辑器就可以了。
]]>403 Forbidden
Access to this resource on the server is denied!
Powered By LiteSpeed Web Server
LiteSpeed Technologies is not responsible for administration and contents of this web site!
403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限不当。
下面看一些有意思的403页面设计,撇开实不实用,能看见几回等等等,,,专注于设计。
闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是它能访问定义体之外定义的非全局变量。
1 | def make_averager(): |
上面定义了一个嵌套函数,作用是计算移动平均值。
调用make_averager
时,返回一个averager
函数对象。每次调用averager
时,会把一个新的参数值添加到列表中,然后计算列表的平均值。series
是make_averager
函数的局部变量,但是调用avg(10)
时,make_averager()
函数已经返回了,所以它的本地作用域也没有了。
在averager()
函数中,series
变成了自由变量,就是没在本地作用域中绑定的变量。
所以闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,在调用函数时,虽然定义作用域不可用了但是还可以使用绑定的变量。注意,只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量
虽然上面函数可以实现计算移动平均,但是效率不高,因为把所有历史数据都保留在列表中。如果只存储总和以及元素个数,再求平均值更好些。
1 | def make_averager(): |
上述函数在调用averager()
时是有问题的,原因是count
初始定义是数字,是不可变类型。在执行count = count + 1
时,count
变成了局部变量,不是自由变量,所以解析器认为count
在averager()
里没有定义。total
变量也是这样的问题。
问题显然出现在变量是否是可变类型上,在用列表计算的时候,采用的series
是可变的列表类型。但是对于数字、字符串、元祖等不可变类型,嵌套函数内只能读取,不能更新,如果尝试重新绑定,比如count = count + 1
,就会隐式创建局部变量,不会成为自由变量保存在闭包里。
python3下解决方式是引入nonlocal
声明。作用就是把变量标记为自由变量。
1 | def make_averager(): |
在函数内嵌套的函数如果引用了外层函数定义的变量,外部调用嵌套的函数时,可以认为这时候函数变量的作用域延伸了,存在自由变量。主意自由变量如果是不可变类型,需要使用nonlocal
声明。那么闭包有什么用呢?如果要了解Python装饰器,或许会有所帮助。
参考Luciano Ramalho-《Fluent Python》
]]>;
结束的,运行没问题,但是到了Aqua里就报错了:1 | >[Error] Script lines: 1-1 -------------------------- |
Aqua Data Studio是一套完整IDE的数据库开发工具,拥有数据库查询、管理、比对和源码控制等功能,可用于创建、编辑和执行SQL的管理工具脚本编写,以及浏览和修改数据库内容,支持大多数常见的数据库,如Oracle,MySQL,MSSQL,Vertica,Hadoop,Impala等,为所有数据库提供了一个统一界面的平台,让使用者或开发者在一个应用程序中能同时处理多个任务。
问题解决比较简单,菜单File->Options
,在弹出的设置窗口总的搜索里搜索Hive
,结果中的Scripts
下的Apache Hive
里面,勾选;Statement Separator
即可。
其实如果不设置这个选项,默认情况下如何在查询窗口执行多条语句而不报错呢?每条语句用GO
隔开就可以了,例如:
1 | select * from tb1 |
DbVisualizer 也是一个不错的工具,可以试用下。
]]>