Giter Site home page Giter Site logo

sunwu51 / notebook Goto Github PK

View Code? Open in Web Editor NEW
485.0 20.0 256.0 127.43 MB

my note

Home Page: https://xiaogenban1993.com

Shell 0.03% HTML 9.84% JavaScript 61.23% Groovy 0.01% PHP 0.01% Python 0.01% CSS 8.72% Java 3.05% Jupyter Notebook 5.19% Dockerfile 0.01% C 0.35% Go 0.31% TypeScript 1.28% SCSS 0.01% Vue 0.01% Rust 8.94% Lua 0.01% SWIG 0.97% Assembly 0.04%

notebook's Introduction

notebook's People

Contributors

dependabot[bot] avatar sunwu51 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

notebook's Issues

FC4: 如何快速启动一个http服务

有时候我们需要快速的启动一个http的服务器,将当前目录的文件放映射出去。

像nginx或者apache httpd等服务器,安装和配置都是很麻烦的,使用下面的几种方式则可以更快的启动服务。

1 借助编程语言

如果机器上刚好安装了python、php、ruby等,那么就可以一行指令搞定当前目录啦。

#  python 3.x(2.x的就不说了)
python3 -m http.server

# php
php -S localhost:8080

# ruby
ruby -run -e httpd . -p 8080

或者稍微麻烦一点,一些编程语言的库也能做到,例如nodejs

# 安装http-server
npm i -g http-server
# 运行
http-server -p 8080

2 使用二进制包

可以自己写一个提供http服务的程序,然后将程序打包为二进制文件,放到互联网上,这样要用到的时候,就去下载下来,直接运行二进制文件就可以啦,不需要安装任何语言环境了。我好久之前基于gin写了一个这样的小工具,如果是linux下就可以这样使用。

# 下载二进制文件(mac则将linux改成mac,win则改为win并加.exe后缀)
wget -O server  https://github.com/sunwu51/Tool/releases/download/2/server_linux_amd64

# 增加可执行权限
chmod +x server

# 运行
./server -port 8080 -assets .

FC3: 多线程处理未知个数的任务,全部完成后打印结果

例如这样场景:文件每一行是个url,记录有多少个返回结果是200成功,有多少是其他状态码。

注意:

  • 文件很大,还可能经常更换,不知道文件一共有多少行。
  • 需要尽快完成任务,单线程就很拉胯,需要用多线程。

一个重点是线程池该如何定制参数,另一个重点则是如何知道所有任务结束了。

线程池参数设定

newCacheThreadPool或者newFixedThreadPool都是不合适的,前者会一直创建新线程直到创建int最大值个线程,之后再有线程就会抛异常然后程序就炸了。后者可以创建固定的线程数,但是如果超过这个数就会扔到队列LinkedBlockingQueue,这个队列也是最大只能int最大值个,仍有上面的问题。

在当前场景下,我们可以对newCacheThreadPool或者newFixedThreadPool进行结合,模仿后者创建固定个数的线程,但是队列我们采用前者的空队列,这时候会在到达指定个数后reject,对于reject策略我们可以使用ThreadPoolExecutor.CallerRunsPolicy。这样在超出线程个数的时候,就会由创建线程的线程(我们这里就是主线程)来执行当前任务,因为"生产者"去帮忙"消费"了,所以生产任务就暂停了,这样起到一个负反馈的作用,使在工作的线程使用不超过101个,如下。

ThreadPoolExecutor threadPool =
 new ThreadPoolExecutor(100,100,0, TimeUnit.SECONDS,new SynchronousQueue<>(),new ThreadPoolExecutor.CallerRunsPolicy())

如何知道所有任务结束

即整个程序大概是这样:

// 用于记录200状态码,和其他状态码的数量
AtomicInteger okCount = new AtomicInteger();
AtomicInteger otherCount = new AtomicInteger();

String line = null;

while( (line = readLine(file)) !=null){
    String tmp = line;

    threadPool.execute(()->{
        // 对每一行进行处理
        process(tmp,okCount,otherCount );
    });
}

System.out.println("ok个数"+okCount.get()+" 不ok的个数"+otherCount);

但打印结果这一行可能有问题,例如最后100个url的请求时间超级长,这100个线程创建完之后,就到了打印这一行了但是还没执行完,这样结果就是错的。常规思路下,计数器CountDownLatch是最佳选择,但是当前题目无法获知文件大小,而计数器必须一开始就指定计数的大小。这怎么解决呢?

当然思路是很多的,例如最简单的能想到的,就是在打印前判断线程池中活跃线程>0,就sleep。

while(threadPool.getActiveCount()>0){
    Thread.sleep(1000);
}

这样做不是特别的好,首先是这个getActiveCount拿到的个数是个大约的值,不保证准确,其次sleep的时长如何设定是恰当的有待商榷。我比较喜欢的做法是利用相位器Phaser。代码如下,有注释,但是可能也不太好理解,建议看下相位器那期视频。

AtomicInteger okCount = new AtomicInteger();
AtomicInteger otherCount = new AtomicInteger();

String line = null;

// 创建数为1的相位器,不设置为0,是因为如果相位器总数从1减到0时,会导致阶段变为负数。1是个保护屏障。
Phaser phaser = new Phaser(1);

while( (line = readLine(file)) !=null){
    String tmp = line;
    // 每一行内容读出来时相位器总数+1
    phaser.register();
    threadPool.execute(()->{
        // 对每一行进行处理
        process(tmp,okCount,otherCount );
        // 处理完一行相位器总数-1
        phaser.arriveAndDeregister();
    });
}

// 因为初值设为1,所以最后需要arrive一次
phaser.arrive();
phaser.awaitAdvance(0);

System.out.println("ok个数"+okCount.get()+" 不ok的个数"+otherCount);

FC2: 简化java中令人头疼的判空、判等

java总遇到对象为null,此时不论是调用方法还是属性都会产生空指针异常。需要写if(obj != null)这样的判断。

我们写java的时候,经常遇到以下几个问题。

  • 1 对于字符串除了判null,还要判空串。

  • 2 对于集合对象例如list、set还要判断是否是0个元素的空集合。

  • 3 判断两个对象是否equals的时候,一定不为null的最好放在前面,例如不要写a.equals("字符串"),而要写"字符串".equals(a),但如果俩对象都不知道是不是null可能就需要这样

if(a != null && a.equals(b)){
  xxx
} 

使用apache commons包提供的工具,可以少写一些代码,这个工具包把很多常用的功能进行了封装。
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

例如

// 1 如果字符串str是null,或者空字符串,则返回true
StringUtils.isEmpty(str);

// 2 如果str是null,空字符串,或只含有空格的字符串,则返回true
StringUtils.isBlank(str);

// 3 如果list是null或者是空的则返回true,可以接收list set等集合类
CollectionUtils.isEmpty(list);

// 4 两个对象都不为null且equals,或者俩对象都是null,则返回true,否则是false。
// Objects不是第三方包,是java7之后引入到jdk中的,可以直接使用,java7之前也可以使用guava中的Objects,用法一样。
Objects.equals(obj1, obj2);

小结与拓展

我们可以使用工具类封好的判断方法,来简化变量的判断相等。当然仔细研究下这些工具库,就会发现除了判断相等还封装了很多常用的方法。

这样的工具包其实很多,就单说apache commons除了上面提到的langcollections还有IO,BeanUtils,loggingCSV等等参考,此外谷歌的guava也有很多类似的工具类的封装。

ibm cloud data save

1 使用ibm提供的nosqldb进行存储

2 使用消息队列方式将数据发出来

先说简单的:

  • 消息队列

左上角搜索websocket,拖出来连起来
image

分别双击这俩节点,修改配置为
image

然后将你的数据连过来,如最上面图中橘色线,数据格式最好是json

然后就可以在任意网页下接受数据了,方式是在F12,console中输入

var ws = new WebSocket('wss://【服务url】/ws/data')
ws.onmessage = function(data){console.log(data)}

更具体的可以去看我的websocket的科普视频

FC1: 透视浏览器隐藏的密码

如果浏览器中存储的密码忘记了,怎么办,只能看到***?
或者想偷看别人浏览器存储的密码?

直接在浏览器控制台输出document.querySelector('input[type=password]').value就可以啦 。

租房子光猫密码是默认记住在浏览器中的,我就是这样获取出来的,然后改成了桥接拨号:)
pwd

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.