tonglin0325的个人主页

Java数据结构——队列

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class Queue{
private int maxSize; //队列的长度
private long[] queueArray; //创建队列的数组的引用
private int front; //创建队头的引用
private int rear; //创建队尾的引用
private int curNum; //创建当前元素的个数

public Queue(int s) { //构造函数
this.maxSize = s;
queueArray = new long[maxSize]; //创建对象
front = 0; //队头等于0
rear = -1; //队尾等于-1
curNum = 0; //当前的元素的个数是0
}

public void insert(long j){
if(rear == maxSize-1){ //如果队尾是队列的最大值-1,则队尾等于-1
rear = -1;
}
queueArray[++rear] = j; //先自加为0,然后给队尾的元素赋值
curNum++; //当前的元素的个数加1
}

public long remove(){
long temp = queueArray[front++]; //取得队头的元素,然后自加
if(front == maxSize){
front =0;
}
curNum--; //当前的元素的个数减1
return temp;
}

public long peekFront(){
return queueArray[front];
}

public boolean isEmpty(){
return (curNum==0);
}

public boolean isFull(){
return (curNum==maxSize);
}

public int Size(){ //返回当前队列元素的个数
return curNum;
}

}

public class Queue_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Queue queue_demo = new Queue(5);
queue_demo.insert(50);
queue_demo.insert(60);
queue_demo.insert(70);
queue_demo.insert(80);
queue_demo.remove();
queue_demo.insert(50);

while( !queue_demo.isEmpty()){
long value = queue_demo.remove();
System.out.print(value+"、");
}
}
}

全文 >>

SpringBoot学习笔记——filter和interceptor

Servlet API中提供了一个Filter接口,Filter接口在javax.servlet.Filter包下面。开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter

通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。

例如实现URL级别的权限访问控制、乱码问题过滤敏感词汇压缩响应信息等一些高级功能。

filter在开发中的常见应用:

全文 >>

广告系统当中的ID

在广告系统当中,ID是标识用户比较重要的手段,

1.安卓端

AdID:又称为Google advertising ID,海外安卓平台常用的设备标识符,每一台 Android设备都会被分配一个唯一的标识符,海外安卓平台的广告投放归因也主要依赖AdID。在国内,因google play在大陆地区无法使用,故google推动的adid也无法使用。且在android12开始,所有在设备设置中选择退出个性化广告的用户,其广告 ID 会变为一串零 (0),这将会影响android广告的归因。参考:移动广告流量中那些ID的坑Google 宣布移除限制广告跟踪用户的安卓广告 ID

IMEI(International Mobile EquipmentIdentity,移动设备国际识别码,又称为国际移动设备标识),即手机的卡槽号ID,可见这种ID是用户无法关闭或重置的,严格意义上来说在个人信息隐私保护方面存在不合规的高风险,所以采集时要经过用户的授权同意,存储使用时也一定要进行加密处理(MD5摘要加密),匿名化处理。也正是IMEI对个人信息隐私保护方面存在不合规性的高风险,所以从Android Q 开始,IMEI等ID的获取将受到非常大的安全限制,需用户每次授权。故国产手机纷纷开始推广OAID体系。参考:穿山甲——如何获取设备ID

OAID:OAID全称是Open Anonymous Device Identifier,中文名是匿名设备标识符。 OAID是一种非永久性设备标识符,最长64位,在系统首次启动的时候生成。 因此OAID可在保护用户个人数据隐私安全的前提下,用于向用户提供个性化广告,用户统计,同时三方监测平台也可以向广告主提供转化归因分析。支持OAID的条件:1)安卓设备系统版本10及以上; 2)设备品牌:HUAWEI/OPPO/VIVO/XIAOMI

ANID:ANDROID_ID android设备的唯一识别码,在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。

2.IOS端

IDFA:IOS系统下的广告流量主ID相对于Android的情况要好很多了,基本统一使用IDFA(Identifier For Advertising)

全文 >>

Hive学习笔记——UDF开发

实现一个UDF函数可以继承 org.apache.hadoop.hive.ql.exec.UDF,也可以继承 org.apache.hadoop.hive.ql.udf.generic.GenericUDF

1.继承UDF,参考

1
2
https://docs.microsoft.com/en-us/azure/hdinsight/hadoop/apache-hadoop-hive-java-udf

引入依赖

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.1.0-cdh5.16.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0-cdh5.16.2</version>
</dependency>

代码

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
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Description(
name = "hello",
value = "_FUNC_(str) - from the input string"
+ "returns the value that is \"Hello $str\" ",
extended = "Example:\n"
+ " > SELECT _FUNC_(str) FROM src;"
)
public class MyUDF extends UDF {

private static final Logger logger = LoggerFactory.getLogger(MyUDF.class);

public String evaluate(String str){
try {
return "Hello " + str;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "ERROR";
}
}

}

打包的时候需要注意,需要把所以依赖的jar都打进去,然后将jar包上传到HDFS上或者s3上

1
2
3
4
5
6
7
8
9
10
11
12
hive> add jar hdfs:///user/hive/udf/bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar;
converting to local hdfs:///user/hive/udf/bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar
Added [/tmp/5aa66ab6-35ab-45d5-bef1-5acc79d16b23_resources/bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar] to class path
Added resources: [hdfs:///user/hive/udf/bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar]
hive> create temporary function my_lower as "com.bigdata.hive.MyUDF";
OK
Time taken: 0.073 seconds
hive> select my_lower("123");
OK
Hello 123
Time taken: 0.253 seconds, Fetched: 1 row(s)

查看jar包

1
2
3
hive> list jar;
/tmp/5aa66ab6-35ab-45d5-bef1-5acc79d16b23_resources/bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar

删除jar包

1
2
hive> delete jar /tmp/5aa66ab6-35ab-45d5-bef1-5acc79d16b23_resources/bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar;

查看function

1
2
3
4
5
hive> show functions like '*lower';
OK
lower
Time taken: 0.016 seconds, Fetched: 1 row(s)

删除function

1
2
hive> drop function if exists my_lower;

全文 >>