禁用通知栏的下拉动作


import android.app.Activity; import android.content.Context; import android.graphics.PixelFormat; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.ViewGroup; import android.view.WindowManager; public class StatusBarUtil { public static void preventStatusBarExpansion(Context context) { WindowManager manager = ((WindowManager) context.getApplicationContext() .getSystemService(Context.WINDOW_SERVICE)); Activity activity = (Activity)context; WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(); localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; localLayoutParams.gravity = Gravity.TOP; localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| // this is to enable the notification to recieve touch events WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | // Draws over status bar WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; //https://stackoverflow.com/questions/1016896/get-screen-dimensions-in-pixels int resId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android"); int result = 0; if (resId > 0) { result = activity.getResources().getDimensionPixelSize(resId); } localLayoutParams.height = result; localLayoutParams.format = PixelFormat.TRANSPARENT; customViewGroup view = new customViewGroup(context); manager.addView(view, localLayoutParams); } public static class customViewGroup extends ViewGroup { public customViewGroup(Context context) { super(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.v("customViewGroup", "**********Intercepted"); return true; } } }

gogs修改git仓库的地址

当我们用docker部署后,仓库地址默认会用localhost地址。而我们实际访问的应该是个域名,需要手动修改。
1. 安装之前需要把gogs的data目录映射到宿主机,因为要修改配置文件。
2. 配置文件在 /conf/app.ini
3. 修改server标签下的ROOT_URL 为外网地址

gson代替jackson的converter地位

初衷

为什么会要用gson替代jackson原因如下:
– jackson的序列化依赖的是getter
– 首字母大写的属性在用getter序列化时会自动转换成小写,就和属性名本身不一致
– gson序列化直接依赖属性本身,名称不会变,即使加getter也不会按照getter方式序列化

步骤

  1. 增加gson依赖
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.2</version>
            </dependency>
  1. 增加配置文件

package com.example.demo; import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.GsonHttpMessageConverter; import java.util.ArrayList; import java.util.Collection; @Configuration public class GsonConfiguration { @Bean public HttpMessageConverters customConverters() { Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter(); messageConverters.add(gsonHttpMessageConverter); return new HttpMessageConverters(true, messageConverters); } }

附加

如果不想要jackson就加下面的依赖忽略,如果想2个共存可以不加 ,如果共存需注意转化顺序。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>jackson-databind</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
            </exclusions>
        </dependency>

nginx理解

可以写多个server监听同一个端口号,但是要求server_name不一样,就会达到虽然用的同一个主机访问不同的域名走不同的反代,达到访问不同网页的目的。
linux的nginx是一个.conf文件就是一个server,然后可以为每一个域名建一个这个配置文件,专门配置它的代理

nginx和frp共享80端口

一台主机的情况下共用80端口,这里要借助域名。
把80端口交给nginx,然后frp的http服务起其他端口比如8888。
nginx通过反代映射给frp。

server {
    listen       80;
    server_name  *.oxoxo.xyz;

    location / {
        proxy_pass      http://127.0.0.1:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这里需要注意的是frp只能用二级域名做透传,不支持一级域名。
而且一般一级域名也都是要留给自己对一些服务做介绍用,比如我可以在主页里介绍这个透传服务。
为了使自起服务和透传的服务共用80端口就需要再建一个nginx的配置文件,也监听80端口但是域名不一样,我们这里可以用主域名。

server {
    listen       80;
    server_name  www.oxoxo.xyz oxoxo.xyz;

    location / {
        proxy_pass      http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

8000就是我起的frps的http服务,用来描述内网透传服务用的。
这个2段代码可以分别建.conf文件,放在/nginx/conf/conf.d目录下,比如default.conf、default1.conf,然后运行nginx就会自动加载这2个配置文件,根据不同的域名走不同的代理配置。

安装docker版nginx

  1. 下载镜像

    docker pull nginx

  2. 运行镜像

    docker run -d -P --name nginx cd52

  3. 新建目录,并进入目录

    mkdir nginx
    cd nginx

  4. 拷贝配置到当前目录,.代表当前目录

docker cp nginx:/etc/nginx .

  1. 停止并删除nginx容器

    docker rm -f nginx

  2. 目录改名conf
    mv nginx conf

  3. 新建容器,把当前目录加卷
    docker run --name nginx -d -p 9012:80 -v /root/nginx/html:/usr/share/nginx/html -v /root/nginx/conf:/etc/nginx cd52

如果遇到/etc/nginx/nginx.conf权限问题打不开需要禁用selinux。

基于VMWare的集装箱化

vmware workstation可以导出vof格式的文件,该文件可以像docker一样,快速移植到其他装了vmware上机器上。通过简单的导入导出功能就能实现,导出时需要要求服务时开启的,并且需要导出的虚拟机处于关机状态。它会直接把所有的已经安装好的程序打包。换电脑部署时就不需要再装一遍这些软件和配置了,唯一的问题就是包会很大,因为包含的整个操作系统。导入就是打开ovf文件,后期还是建议改成docker的形式做。