0%

前提条件

你要有下面这些东西才能实现文章中的解决方案:

  1. 一台带公共ip的外网服务器
  2. 一个域名

1. 申请一个域名

域名可以在cloudflare或者onamae上申请,花不了几个钱。

2. 申请一个证书

证书可以通过acme这种工具来自动发行和更新。

2.1 先在自己的服务器上安装acme.sh

my@example.com替换为自己的邮件地址,执行下面的命令。

1
curl https://get.acme.sh | sh -s [email protected]
Read more »

买了Just Dance 2022的北美版,跳的上瘾,决定买Just Dance Unlimited。
买完之后又发现无法使用,刚开始以为是自己买的游戏北美版的原因,
经过一番折腾才发现是「いつもあそぶ本体」的设置问题。

只有把你现在玩的机器设置成「いつもあそぶ本体」,才能使用Just Dance Unlimited。
官方回答在这里

https://support.nintendo.co.jp/app/answers/detail/a_id/36096

Read more »

追记

从2022年10月开始,已打了3针疫苗的旅客赴日本已不需要核酸。

请时刻关注日本领事馆信息,注意政策变化。

前言

作者在日本工作,因为家里老二出生,请了3个月的假期回国,现在假期结束了,5月4号回到了日本。
记录一下回日本的过程,希望能对读者有用。

核酸

日本政府强烈推荐来日本的人用推荐格式的核酸报告,而青岛能提供这种格式的医院有四个

【青岛市】

  • 青岛市市立医院(东院区)国际门诊 0532-85937690
  • 山东大学齐鲁医院(青岛)0532-96599
  • 青岛大学附属医院西海岸院区 0532-82919303
  • 青岛海华医学检验实验室 0532-80981700

笔者的核酸检测是在齐鲁医院(青岛)做的。总共花费24元。
临来之前在小红书上查了很多教程,多是在市立医院做核酸的教程,选来选去决定在齐鲁医院做。
笔者选择齐鲁医院的原因有两个:

Read more »

前言

一个全栈的小项目,里面既有前端也有后端,在这里前端是vue, 后端是flask

前端的编译结果输出到flask/dist文件夹里。

后端的flask程序做成了模块,也就是说在flask/app/__init__.py里有一个create_app()的函数。

现在的问题是,怎样把它们一起部署到heroku上, 并在部署时完成自动编译?

1
2
3
4
5
6
7
8
9
10
11
12
your-app
├── flask
│ ├── app
│ ├── dist
│ └── test
└── vue
├── build
├── config
├── node_modules
├── src
├── static
└── test

最基础的flask部署方式

如果flask没有做模块化,部署方式也很简单
通常flask的主程序都是这么写的:

一个名为app.py的程序,内容如下

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return 'hello, world'

if __name__ == '__main__':
app.run()
Read more »

记录一下升级PandoraBox差点变砖,却成功挽救的经历。

起因

之前通过刷机把自家的小米路由器3Pro升级到了PandoraBox系统。
之后就一直放着没有用,后来偶然的机会发现PandoraBox升级了好几个版本,就想着把自己的路由器也升级一下。

第一次升级

本以为通过Pandorabox系统自带的升级功能,选择固件更新,再上传system upgrade文件就可以了,结果直接变半砖。
升级完之后无线不可用,指示灯闪烁。还想着再刷回R3P自带的系统,结果也不成功。
好像第一次升级成PandoraBox之后就无法回退到厂家自带的系统了。至于原理自己不了解,有懂的朋友请赐教。

第二次升级

就在一筹莫展的时候,想起来路由器可以通过网线连接,结果连上之后,ssh竟然连上了。
系统的密码是root/admin.

接下来跟着网上的教程照猫画虎,因为ssh可用,所以通过wscp软件将需要升级的系统文件上传到路由器的/tmp文件夹中。
接下来通过执行以下命令,顺利实现了升级!

mtd -r write /tmp/XXX.img Bootloader

Read more »

在Vue程序中,有时需要引入jQuery,比如你习惯了用$.ajax来进行网络请求,或者进行一些控件操作。
可以通过加载jQuery的module来实现:

1
npm install jquery --save
1
import $ from 'jquery'

但问题是这样编译出来的结果会更大,从而造成一些性能问题。

可以简单地通过在index.html中直接引入jQuery的链接来使用jQuery,但是编译的时候又会报错。

1
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

编译的错误如下:

1
Uncaught ReferenceError: jQuery is not defined

怎么解决这个错误呢,通过配置eslint来解决!

eslint在Vue中被用来检测程序是否有一些不规范的写法,通过让eslint来识别jQuery,就可以来规避编译时的报错了。

Read more »

OData的日期类型无法原样显示在SAPUI5的页面上,怎样解决这一问题。

  1. Date String Received from OData.
    Date string from OData Service is like below:

    1
    "SalesOrderDate": "/Date(1587945600000)/",

    这样的数据无法直接显示在SAPUI5的View里面。
    即便你设置data type为日期类型,也是无法直接识别的。

  2. Create your date formatter.

在View的Controller里创建自己的formatter,然后在View中进行相应的设置。
JS代码中用到了正规法则,识别一段字符串中的数字,然后将这一串数字作为timestamp来生成一个Date类型的变量,
再通过sap.ui.core.format.DateFormat来设置格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/core/format/DateFormat"
], function (Controller,DateFormat) {


formatJSONDate: function(sDate){
var oDateFormat = DateFormat.getDateTimeInstance({
style: "short"
});
var d = new Date(sDate.match(/\d+/)[0] * 1);
return oDateFormat.format(d,true); //true for UTC
}
  1. Use your formatter in your view.
    View中对UI控件设置formatter
    1
    2
    3
    4
    <Text text="{
    path: '/Date',
    formatter: '.formatJSONDate'
    }" />
Read more »

怎样在SCPI中引入Jar文件?

在SCPI里可以通过创建Groovy Script来对数据进行一些处理,比如解析csv文件并处理里面的数据。
当然我们可以自己写代码来解析csv文件,但通常是重复造轮子。

因为这个世界上已经存在着很多优秀程序员写好的类库,我们只需要在自己的程序中调用一下就可以了,没必要重复造轮子。

SCPI中也支持引入外部的jar文件,以CSV文件的解析为例,为了能在程序中使用groovycsv这个库,我们需要引入以下两个jar文件:

  • groovycsv-1.3
  • opencsv-3.8

步骤

下面解释一下怎样在SCPI的Flow里面引入jar文件

  1. 进入Flow的编辑模式。
  1. 编辑模式下,在Flow的Resources设置Tab添加Jar文件。
Read more »

背景

Spring Batch默认的JobLauncher执行Job的方式是同步的。
如果需要执行异步Job,则需要定义能执行异步Job的JobLauncher。

解决办法

  1. 在Configuration Class中定义SimpleJobLauncher, 设置其TaskExecutor为异步的SimpleAsyncTaskExecutor

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Configuration
    @EnableBatchProcessing
    public class BatchConfiguration {
    @Bean
    public SimpleJobLauncher simpleJobLauncher(JobRepository jobRepository){
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);
    jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
    return jobLauncher;
    }
    }
  2. 在调用Launcher的主程序中设置自动注入,就可以使用了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Autowired
    SimpleJobLauncher simpleJobLauncher;
    @Autowired
    Job job1;
    @Autowired
    Job job2;

    @Override
    public void run(ApplicationArguments args) throws Exception {
    logger.info("##### run async jobs #####");
    simpleJobLauncher.run(job1, jobParameters);
    simpleJobLauncher.run(job2, jobParameters);
    }
Read more »

背景

在往SAP Cloud Platform Neo上部署war文件后,有时会出现程序无法启动的错误。
通过排查错误日志,发现log中有类似下面的描述:

1
2
3
4
5
2019 05 28 09:31:00#+00#ERROR#org.slf4j.helpers.Util##anonymous#localhost-startStop-1#na#xxxx#sampleapp#web##na#na#na#na#SLF4J: Class path contains multiple SLF4J bindings. |
2019 05 28 09:31:00#+00#ERROR#org.slf4j.helpers.Util##anonymous#localhost-startStop-1#na#xxxx#sampleapp#web##na#na#na#na#SLF4J: Found binding in [jar:file:/usr/sap/ljs/bin/logback-classic.jar!/org/slf4j/impl/StaticLoggerBinder.class] |
2019 05 28 09:31:00#+00#ERROR#org.slf4j.helpers.Util##anonymous#localhost-startStop-1#na#xxxx#sampleapp#web##na#na#na#na#SLF4J: Found binding in [jar:file:/usr/sap/ljs/webapps/spring-boot-Olingo-oData-master/WEB-INF/lib/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] |
2019 05 28 09:31:00#+00#ERROR#org.slf4j.helpers.Util##anonymous#localhost-startStop-1#na#xxxx#sampleapp#web##na#na#na#na#SLF4J: See http://www.slf4j.org/codes.html\#multiple_bindings for an explanation. |
2019 05 28 09:31:00#+00#ERROR#org.slf4j.helpers.Util##anonymous#localhost-startStop-1#na#xxxx#sampleapp#web##na#na#na#na#SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

仔细观察发现该错误是slf4j和logback的依赖冲突导致的。

解决办法

通过参考gradle-exclude-dependencies这篇文章,尝试了如下解决办法:

Dependency局部排除

通过对spring boot的依赖添加exclude描述来排除特定依赖。

1
2
3
4
5
6
7
8
compile("org.springframework.boot:spring-boot-starter-web:${project.bootVersion}"){
exclude group: 'org.slf4j', module: 'slf4j-api'
exclude group: 'ch.qos.logback', module: 'logback-classic'
}
compile("org.springframework.boot:spring-boot-starter-actuator:${project.bootVersion}"){
exclude group: 'org.slf4j', module: 'slf4j-api'
exclude group: 'ch.qos.logback', module: 'logback-classic'
}

Configuration全局排除

Read more »