0%

Bowenkei

很高兴认识大家,我是Bowenkei


欢迎关注我的公众号“奇奇怪怪小技巧

scrolltext

summary

Use ScrollText , you can simply scroll any text. It supports horizontal and vertical scrolling, and you can customize the text color, background color, scroll speed, font size, etc.

Usage

library

By adding the library to your project.

Maven center

Parameters

xml

1
2
3
4
5
6
<attr name="scrollColor" format="reference|color"/>
<attr name="scrollSize" format="integer"/>
<attr name="scrollSpeed" format="integer"/>
<attr name="scrollContent" format="string"/>
<attr name="scrollBackColor" format="reference|color"/>
<attr name="android:orientation">

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Getter
int color: getmColor();
int color: getBackColor();
String content: getScrollString();
boolean isScroll: getIsScroll();
// (0 horizontal , 1 is vertical )
int orientation: getOrientation();
int textSize: getScrollSize();
int speed: getSpeed();
// Setter
setmColor(int color);
setBackColor(int color);
setScrollString(String content);
setIsScroll(boolean isScroll);
setOrientation(int orientation);
setScrollSize(int textSize);
setSpeed(int spee);
// action
start();
pause();

Detail

Use in xml

1
2
3
4
5
6
7
8
9
10
<space.nianchu.scrolltext.ScrollTextView
android:id="@+id/text4"
app:scrollColor="#00FF00"
app:scrollSize="100"
app:scrollSpeed="5"
app:scrollContent="Nice to meet you."
app:scrollBackColor="#000000"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

Use by java

1
2
3
4
5
6
7
8
ScrollTextView horizontalText1 = new ScrollTextView(this);
scrollTextAddByJavaLayout.addView(horizontalText1);
LinearLayout.LayoutParams params1 = (LinearLayout.LayoutParams) horizontalText1.getLayoutParams();
params1.gravity = Gravity.CENTER_HORIZONTAL;
params1.width = LinearLayout.LayoutParams.WRAP_CONTENT;
params1.height = LinearLayout.LayoutParams.WRAP_CONTENT;
horizontalText1.setLayoutParams(params1);
horizontalText1.start();

Notice:

*No attribute is required. If there is no setting, the default is: *

Parameter Value
scrollColor 0xFF000000
scrollSize 100
scrollSpeed 5
scrollContent Nice to meet you.
scrollBackColor 0xFFFFFFFF
orientation 1(0 horizontal , 1 is vertical )

Screenshot of the effect

scrollText1

scrollText2

More info, please see demo.

Java注释规范

文件注释

Javadoc文档注释

文件注释

代码注释

学习笔记:

2-4译码器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
module decoder_2_4(a, en, y):
input [1:0] a;
input en;
output reg[3:0] y;

always @ *
begin
if (~en) // 不使能
begin
y = 4'b0000;
end
else
begin // enable
if(a==2'b00)
begin
y = 4'b0001;
end
else
begin
if (a==b'10)
end
else
begin
y=


end
endmodule
  • 1’b0中‘前面的数字表示位数,后面的b表示数据类型(进制),表示一位二进制数0
  • en == 1’b0可以用en来替代。
  • 5f31c6

java集合框架的层次结构

  • Set接口继承自Collection接口。Set的唯一新增要求就是不能有重复的东西。

  • 泛型不能实例化
  • 泛型不能用instancefp判定
  • 不能声明泛型数组
  • 不允许放置在静态代码中
  • 边界处不能使用基本类型,而且基本类型不能指明类型参数

使用selenium模块控制浏览器

selenium模块可以让Python直接控制浏览器,实际点击链接,填写登录信息。这就意味着Selenium与Requests和Beautiful Soup相比,它更高级但是它也更慢。

启动一个Chrome并打开百度首页

1
2
3
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
print(type(browser)) # 这是一个WebDriver对象。

在页面寻找元素

1
2
3
有两类方法可以用于寻找元素, 它们是findelements方法和findelement方法
findelement方法返回一个WebElement对象,也就是说它只返回页面中所匹配的第一个元素
findelements方法返回一个WebElement对象列表,它返回页面中所匹配的所有元素

selenium的WebDriver方法,用于寻找元素(只给出了findelement类型方法,findelements类型类似,是需要改动element为elements即可)

WebElement的属性与方法

image-20200824222536953

寻找元素Demo

1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
url = 'https://nianchu.space/' # 我的个人网站: nianchu.space
browser=webdriver.Chrome()
browser.get(url)
# try-except语句
try:
# 寻找类名为'site-title'的元素
elem=browser.find_element_by_class_name('site-title')
print('Found <%s> element with that classname!'%(elem.tag_name))
except:
print('Was not able to find an element with that name.') # Found <span> element with that classname!

点击页面

WebElement对象有一个click()方法,可以使用它模拟鼠标在元素上点击。这个方法可以用于跳转链接,选择单选按钮,点击提交按钮等等

1
2
3
4
5
6
7
8
9
10
from selenium import webdriver
browser = webdriver.Chrome()

browser.get("https://nianchu.space/")

linkElement = browser.find_element_by_link_text('个人网站')
print(type(linkElement))

# 打开"个人网站链接"
linkElement.click()

填写并提交表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from selenium import webdriver
"""
本来计划的是Google mail的登录演示,但是webdriver上无法完成,便改为了qq邮箱
"""
browser = webdriver.Chrome()
# 下面的url很长,它是手机版QQ邮箱登录界面的主页
browser.get('https://ui.ptlogin2.qq.com/cgi-bin/login?style=9&appid=522005705&daid=4&s_url=https%3A%2F%2Fw.mail.qq.com%2Fcgi-bin%2Flogin%3Fvt%3Dpassport%26vm%3Dwsk%26delegate_url%3D%26f%3Dxhtml%26target%3D&hln_css=http%3A%2F%2Fmail.qq.com%2Fzh_CN%2Fhtmledition%2Fimages%2Flogo%2Fqqmail%2Fqqmail_logo_default_200h.png&low_login=1&hln_autologin=%E8%AE%B0%E4%BD%8F%E7%99%BB%E5%BD%95%E7%8A%B6%E6%80%81&pt_no_onekey=1')

# 按找给定的id进行匹配
emailElem = browser.find_element_by_id('u')
# 传入qq账号
emailElem.send_keys('1234567')

# 输入邮箱账号后需要点击下一步进行
passWordElem = browser.find_element_by_id('p')
# 传入密码
passWordElem.send_keys('1234567')

# 点击确认登录
goElem = browser.find_element_by_id('go')
goElem.click()

*注意: 在任何元素上调用submit()方法,都等同于点击该元素所在表单的Submit按钮 *

发送特殊按键

在浏览网页的时候,我们经常需要使用键盘击键。selenium有一个模块,帮助我们实现了这个功能。

各种按键的值保存在selenium.webdriver.common.keys,在使用的时候向下面这样导入的话,会让后面的使用更加方便。

1
from selenium.webdriver.common.keys import Keys

selenium.webdriver.common.keys模块中常用的变量如下:

1
2
3
4
5
6
7

Keys.DOWN,Keys.UP,Keys.LEFT,Keys.RIGHT
Keys.ENTER,Keys.RETURN
Keys.HOME,Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP
Keys.ESCAPE,Keys.BACK_SPACE,Keys.DELETE
Keys.F1,Keys.F2,...,Keys.F12
Keys.TAB

示例: 发送特殊键时间网页界面在开头和结尾之间来回滚动3次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Chrome()

browser.get('https://nianchu.space/')
htmlElem = browser.find_element_by_tag_name('html')
for i in range(3):
# 防止页面还没有打开程序就已经停止
time.sleep(10)
# 发送End键
htmlElem.send_keys(Keys.END)
time.sleep(10)
# 发送Home键
htmlElem.send_keys(Keys.HOME)

点击浏览器按钮

selenium有一些方法,可以帮助我们模拟点击各种浏览器按钮,包括下面这些

1
2
3
4
browser.back(): 返回
browser.forward(): 前进
browser.refresh(): 刷新
browser.quit(): 关闭窗口

下面给大家演示其中的一个:refresh()

1
2
3
4
5
6
7
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://nianchu.space/')

# 刷新页面
browser.refresh()

关于selenium模块的简单介绍就到这里。我是奇奇怪怪,致力于分享有趣使用的奇奇怪怪小技巧。

推荐阅读


欢迎关注我的公众号“奇奇怪怪小技巧

XPath节点

节点

基本值:无父或无子的节点

项目: 基本值或者节点

节点关系:

  • 同胞: 拥有相同父节点的节点
  • 先辈: 某节点的父、父的父
  • 后代:

Xpath语法

路径表达式:

  • Nodename: 选取此节点的所有子节点
  • /:从根节点选取
  • //: 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
  • .:选取当前节点
  • ..: 选取当前节点的父节点
  • @: 选取属性

谓语

谓语用来查找某个特定的节点或者包含某个指定的值的节点

谓语被嵌在方括号中

选取未知节点:

1
2
3
*: 匹配任何元素节点
@*:匹配任何属性节点
node():匹配任何类型的节点

选取若干路径

使用|分割若干路径

Xpath轴(Axes)

轴可定义相对于当前节点的节点集

1
2
3
4
5
6
7
8
9
10
11
12
13
ancestor: 
ancestor-or-self:
attribute:
child:
descendant: 选取当前节点的所有后代节点
descendant-or-self:
following: 选取问文档中当前节点的结束标签之后的所有节点
following-sibling: 选取当前节点之后的所有兄弟节点
namespace: 选取当前节点的所有命名空间节点
parent:
preceding: 选取文档中当前节点的开始标签之前的所有节点
preceding-sibling: 选取当前节点之前的所有同级节点
self:

Xpath运算符

xpath表达式可返回节点集、字符串、逻辑值以及数字

1
2
div: 除法
mod: 计算除法的余数

1.1.1 什么是数据库(database)

数据库(database)是一个以某种有组织的方式存储的数据集合

1.1.2 表(table)

将资料放入文件柜,不是随意地扔进某个抽屉就完事,而是在文件柜中创建文件,然后将相关的资料放入特定的文件中。

这个文件就是表。

表是一种结构化的文件,可用来存储某种特定类型的数据。

存储在表中的数据是一种类型的数据或一个清单。绝不应该将顾客的清单与订单的清单存储在同一个数据库表中。

相同数据库中每一个表都有自己独一无二的名字。

表有自己的模式(这个模式是一组信息,定义了数据在表中如何存储,如可以存储什么样的数据,数据如何分解,各部分信息如何命名等等)

模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)

1.1.3 列(column)和数据类型(datatype)

表由列组成

列(column): 表中的字段。所有的表都是由一个或多个列组成的。

将数据库理解为一个网格,网格中的每一列存储同类型的信息。

正确分解数据是找到某个特定信息的前提。

数据库中每个列都有相应的数据类型。数据类型定义列可以存储的数据种类。

1.1.4 行(row)—— 表中的一个记录

表中的数据都是按行存储的。

行(row)和数据记录(record)在很大程度上,是可以相互替代的,但从技术上来说,行才是正确的术语

1.1.5 主键(primary key) - 一列(或一组列),其值能够唯一区分表中的每个行

唯一标识表中每行的这个列(或这组列)称为主键。逐渐用来表示一个特定的行。

应该总是定义主键

表中的任何列都可以作为主键,只要它满足以下条件:

  • 任意两行都不具有相同的主键值
  • 每个行都必须具有一个主键值(主键列不允许NULL值)

主键通常定义在表的一列上,但这并不是必需的,也可以一起使用多个列作为主键。使用多个列作为主键时,上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)

主键的最好习惯

  • 不更新主键列中的值
  • 不重用主键列的值
  • 不在主键列中使用可能会更改的值

1.2 什么是SQL

是一种专为用来与数据库通信的语言

设计SQL的目的是很好地完成一项任务,即提供一种从数据库中读写数据的简单有效的方法

SQL的优点:

  • SQL不是某个特定数据库供应商专有的语言。
  • 简单易学。
  • SQL看上去很简单,但是它其实是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。

第2章

2.1 什么是MySQL

2.1.1 客户机-服务器软件

与数据文件打交道的只有服务器软件。关于数据、数据添加、删除和数据更新的所有请求都由服务器软件完成。这些请求或更改来自运行客户机软件的计算机。

为进行所有数据库交互,客户机软件都要与服务器软件进行通信。

2.2.1 mysql命令行实用程序

  • 命令输入在mysql>之后
  • 命令;或\g结束。近按Enter不执行命令
  • 输入help或\h获得帮助
  • 输入quit或者exit退出命令行实用程序

3.2 选择数据库

执行任意数据库操作前,需要选择一个数据库。为此,可以使用USE关键字(key word)

第4章: 检索数据

使用SELECT语句从表中检索一个或多个数据列

4.1 SELECT语句

最经常使用的关键字就是SELECT语句了。它的用途是从一个或多个表中检索信息

使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择

1
2
SELECT COLUMNNAME
FROM TABLENAME;

*未排序数据: *

没有明确排序查询结果,则返回的数据的顺序没有特殊意义。

不区分大小写

SQL语句不区分大小写。许多SQL开发人员喜欢对所有的SQL关键字使用大写,而对所有列和表名使用小写。

忽略空格:在处理SQL语句时,其中的所有空格都被忽略。

4.3 检索多个列

1
2
SELECT prod_id, prod_name,  prod_price 
FROM products;

数据表示:

SQL语句一般返回原始的、无格式的数据。数据的格式化是一个显示问题,而不是一个检索问题。

4.4 检索所有列

使用通配符实现:

1
2
SELECT * 
FROM products;

使用通配符警示:

除非确实需要表中的每个列,否则最好别使用*通配符。因为检索不需要的列通常或降低检索和应用程序的性能。

*通配符优点: *

可以检索出未知列

4.5 检索不同的行

1
2
SELECT DISTINCT vend_id
FROM products;

其中DISTINCT是不同的意思,注意它必须放在列名的前面

不能部分使用DISTINCT:

DISTINCT关键字应用于所有列而不仅是前置它的列

(也就是说,如果检索的不仅仅是一个列,而是两个列,那么对于两个行来说,属于两个列中任何一列的数据不同,那么这两个行就算是不同的。)

4.6 限制结果

SELECT 语句返回所有匹配的行。为了返回第一行或前几行,可以使用LIMIT。

返回第一个5行:

1
2
3
SELECT prod_name
FROM products
LIMIT 5;

返回下一个5行:(前一个是开始的位置,后一个是要检索的行数):

1
2
3
SELECT prod_name
FROM products
LIMIT 5, 5;

行0:

检索出来额第一行为0而不是1

在行数不够时:

LIMIT中指定要检索的行数为检索的最大行数。如果没有足够的行(例如,给出LIMIT 10,5 但只有 13行),MySQL将只返回它能返回的那么多行

LIMIT 4 OFFSET 3==LIMIT 3 ,4**

4.7 使用完全限定的表名

1
2
SELECT tablename.columnname
FROM databasename.tablename;

第5章 —— 排序检索数据

使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。

常见命令

  • SHOW DATABASES; - 返回可用数据库的一个列表。
  • SHOW TABlES; - 返回当前选择的数据库内的可用表的列表。
  • SHOW COLUMN FROM 表名: 要求给出一个表名,它对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键类型、默认值以及其他信息
  • DISsCRIBE 表名——是SHOW COLUMNS FROM 表名的快捷键
  • SHOW STATUS:用于显示广泛的服务器状态信息
  • SHOW CREATE DATABASE和SHOW CREATE TABLE:分别用来显示创建特定数据库或表的MySQL语句。
  • SHOW GRANTS:用来显示授权用户(所有用户或特定用户)的安全权限;
  • SHOW ERRORS 和SHOW WARNINGS:用来显示服务器错误或警告信息。

数学建模与Matlab

数学建模是一个跨学科的竞赛,关乎生产生活中的实践问题

多项式拟合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
clc;
clear;
%准备数据
x=0:0.2:10;
y=0.25*x+20*sin(x);
% 5阶多项式拟合
p5=polyfit(x,y,5);
y5=polyval(p5,x);
% 8阶多项式拟合
p8=polyfit(x,y,8);
y8=polyval(p8,x);
% 60阶多项式拟合
p60=polyfit(x,y,60);
y60=polyval(p60,x);


figure
plot(x,y,'ro');
hold on;
plot(x,y5,'b--');
plot(x,y8,'b:');
plot(x,y60,'r-.');
xlabel('x');
ylabel('y');
legend('原始数据','5阶多项式','8阶多项式','60阶多项式');
% 小结:
% 使用pn=polyfit(x,y,n)获取拟合系数,其中x是原始x值,y是由原始x值计算出来的元素函数y值,其中n是你想进行的多项式拟合阶数
% 使用yn=polyval(p,x)可以获得拟合后的函数值