Spring boot 笔记

Spring aims to make developer challenges easy, like creating web applications, working with databases, securing applications, and microservices.

Spring Boot builds on top of Spring to make Spring even easier with simplified dependency management, automatic configuration, and runtime insights.

笔记

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication()        // 开启组件扫描和自动配置
public class Application {
    public static void main(String[] args) {
        try {
            SpringApplication.run(Application.class, args); // 负责启动引导程序
        } catch (Throwable ex) {
            ex.printStackTrace();
        }
    }
}

@SpringBootApplication 将三个有用的注解组合在了一起

  • Spring 的 @Configuration : 标明该类使用 Spring 基于 Java 的配置。
  • Spring 的 @ComponentScan : 启用组件扫描,这样你写的 Web 控制器类和其他组件才能被自动发现并注册为 Spring 应用程序上下文里的 Bean。
  • Spring Boot 的 @EnableAutoConfiguration 开启了 Spring Boot 自动配置

配置

application.properties

只要它存在就会被加载,Spring 和应用程序代码都能获取其中的属性

maven plugin

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <mainClass>com.einverne.api.Application</mainClass>
  </configuration>
</plugin>

构建插件的主要功能是把项目打包成一个可执行的超级 JAR (uber-JAR), 包括把应用程序的所有依赖打入 JAR 文件内,并为 JAR 添加一个描述文件,其中的内容能让你用 java -jar target.jar 来运行应用程序。


2018-07-06 spring-boot , spring , java , web

phpMyAdmin 登录无反应问题记录

今天遇到一个神奇的错误,登录 phpMyAdmin 无论如何都登录不进去,开始还以为密码记错了,但是再输入错误密码时,会显示错误的提示

#1045 - Access denied for user 'root'@'localhost' (using password: YES)

而在在我确认密码没有问题时,phpMyAdmin 的表现就像是登录成功过了,但是却没有跳转。

然后为了解决这个问题,修改过 php.ini 中的 session.save_path ,修改了 session 文件的 权限 chmod 777 /path/to/session ,重启了 apache,尝试了所有的可能,直到看到一个解决方法是,因为浏览器的问题,换别的浏览器就能登录,我果断用 Vivaldi 试了一下,果然可以。

于是这个奇怪的问题就解决了,然后我清理了一下 Chrome 的 Cookie ,Session 然后就好了。至于是 phpMyAdmin 的问题还是 Chrome 的问题我也就无从得知了。奇怪了。


2018-07-03 php , phpmyadmin , mysql , root , password , browser

Java 查漏补缺:线程间通信

wait notify

方法 wait() 是让当前执行代码的线程等待,wait() 是 Object 类的方法。在调用 wait() 方法前,线程需要获得对象级别锁,只能在同步方法或者同步块中调用,执行 wait() 方法后,当前线程释放锁。如果调用时没有持有适当锁,会抛出 IllegalMonitorStateException 异常。

方法 notify() 也需要在同步方法或者同步块中调用,同样调用前也需要获取对象锁。如果调用没有持有适当的锁,也会抛出 IllegalMonitorStateException 异常。notify() 方法永安里通知可能处于等待该对象锁的其他线程,如果有多个线程等待,由线程规划器随机挑选一个呈现 wait 状态的线程,发出 notify 通知,并使它获得该对象的对象锁。notify() 方法执行后,当前线程不会马上释放该对象锁,wait 状态的线程也不能马上获取该对象锁,需要等执行 notify() 方法的线程将程序执行完,也就是退出 synchronized 代码块之后,当前线程才会被释放锁。

如果发出 notify() 操作时没有处于阻塞状态的线程,命令会被忽视。

wait() 方法使线程停止运行,而 notify() 使停止的线程继续运行。

join

如果主线程要等待子线程执行完成之后结束,可以使用 join() 方法。

join(long) 在内部使用 wait(long) 方法实现,所以会释放锁。而 Thread.sleep(long) 方法不会释放锁。

ThreadLocal

ThreadLocal 类主要解决的就是每个线程绑定自己的值,每个线程都有自己的私有数据。

公平锁 vs 非公平锁

公平锁线程在获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得 FIFO ,而非公平锁就是获取锁的抢占机制,随机获的锁。

ReentrantReadWriteLock

类 [[ReentrantLock]] 是完全互斥排他,同一时间只有一个线程能够执行 ReentrantLock 后任务,这样的方式保证了实例变量的线程安全,但是效率低下。所以 JDK 中提供了另外一个读写锁 ReentrantReadWriteLock ,在某些不需要操作实例变量的方法中,可以使用读写锁 ReentrantReadWriteLock 来提升方法的效率。

读写锁表示有两个锁,一个读相关锁,也成为共享锁,另一个是写相关的锁,也叫排它锁。读锁之间不排斥,写锁与其他锁互相排斥。多个线程可以同时读操作,但是同一时刻只允许有一个线程写操作。


2018-07-02 java , linux , thread , synchronized

通过 WebDAV 连接 NextCloud

NextCloud 支持 WebDAV 协议,用户可以完全通过 WebDAV 来连接并同步文件。虽然官方还是推荐 使用客户端来同步文件,不过如果要临时访问 NextCloud 上的文件,使用 WebDAV 方式还是很便捷的。

假设 NextCloud 的地址是 example.com 这个,那么在 Linux 下,一般文件管理器中有连接到服务器的选项在其中,填入服务器 IP 地址,访问端口,然后访问地址填写 /remote.php/dav/files/[USERNAME] 输入该用户的用户名和密码即可访问该用户的所有文件列表。

如果要直接在文件管理器中访问,可以尝试使用如下的协议地址:

dav://[USERNAME]@[SERVER_IP]:[PORT]/remote.php/dav/files/[USERNAME]

在 Linux 下还能通过命令行访问,具体可参考下面的链接。

NextCloud 通过 webdav 同步 Joplin

同步地址,其中 ip, port, username,需要替换:

http://ip:port/remote.php/dav/files/username/JoplinSync

reference


2018-07-01 nextcloud , webdav , dav , sync , files , linux

每天学习一个命令:使用 jpegoptim 和 optipng 优化压缩图片

今天突然遇到一个问题,使用手机拍摄的照片 5+M 体积巨大,但是网易要求的图片大小需要小于 1M,所以就有了压缩图片的需求。记得很久以前使用过 TinyPNG 这个服务,但是唯一一点不好的就是无法脱离他在线的服务,需要把照片上传到他的网站上才能进行压缩。虽然有 tinypng-cli 这个命令行的工具,但其实也是依赖在线服务的。所以就找了一下,然后发现了 jpegoptimoptipng 这两个工具。

jpegoptim

安装

apt-get install jpegoptim

使用

jpegoptim file.jpg

然后使用 du -h file.jpg 查看文件大小。使用这种方式 jpegoptim 会尽量使用无损失的压缩方式,所以几乎看不出区别。而如果想要指定大小,比如想要压缩到 500k 大小,可以

jpegoptim --size=500k file.jpg

而如果要批量压缩,在目录中 jpegoptim *.jpg 即可。

如果要将 EXIF 信息移走可以添加参数

jpegoptim --strip-exif file.jpg

结合 find

find images_folder/ *.{jpeg,jpg} -exec jpegoptim {} \;

optipng

安装

apt-get install optipng

使用

optipng file.png

结合 find

find images_folder/ *.png -exec optipng {} \;

mozjpeg

优化 jpeg 压缩算法

命令行版本

安装方式:

npm install -g mozjpeg

mozjpeg --help

在 macOS 下优化压缩图片

macOS 下有一个不错的工具叫做 imageOptim

安装:

brew install imageoptim-cli

优化当前目录中的 PNG:

imageoptim --imagealpha '**/*.png'

优化 JPG:

imageoptim --jpegmini '**/*.jpg' '**/*.jpeg'

reference


2018-06-30 compress , optimize , linux , command , jpeg , png

Java 查漏补缺之位运算符

今天在看 Kafka 源码 LongSerializer 时看到将 Long 型转 byte 数组的实现,感觉需要补习一下位运算符 (bitwise operator),所以有了这篇。

Java 提供的位运算符有:

  • 左移 ( << )、右移 ( >> )
  • 无符号左移 ( <<<)、无符号右移 ( >>> )
  • 位与 ( & )
  • 位或 ( | )
  • 位非 ( ~ )
  • 位异或 ( ^ )

除了位非 ( ~ ) 是一元操作符外,其它的都是二元操作符。

与或非,亦或 就不说了。

左移

左移 1 位 (<<1) ,值乘 2,以后依次乘 2.

右移

右移 1 位 (>>1),值除以 2。

无符号右移

对于负数,二进制高位为 1,所以一个 int 类型的 -5 二进制表示是

1111 1111 1111 1111 1111 1111 1111 1011

对于负数,使用右移 >> 时,则高位补 1,而对于无符号右移,则高位补 0 。

延伸

由位运算操作符衍生而来的有:

  • &= 按位与赋值
  • |= 按位或赋值
  • ^= 按位非赋值
  • >>= 右移赋值 a »= 1 就是 a = a » 1
  • <<= 赋值左移
  • >>>= 无符号右移赋值

+= 一样,理解为 a += 1 也就是 a = a + 1。


2018-06-26 java , bit , operator , notes

Python Linux 系统管理与自动化运维读书笔记

小工具

HTTP Server

python -m SimpleHTTPServer

python -m http.server

JSON 格式化

echo '<json string>' | python -m json.tool

验证第三方库安装

python -c "import paramiko"

pip 用法

源码安装

python setup.py install

pip 子命令

子命令 说明
search 搜索 pip search flask
install 安装 pip install flask==0.8 , pip install -r requirements.txt
uninstall 卸载
show 查看包详情
check pip 9.0.1 之后提供,检查包是否完整
list 列出已安装
freeze 导出已安装包列表 pip freeze > requirements.txt
completion 生成命令补全配置 pip completion -z >> ~/.zshrc && source ~/.zshrc

加速 pip 安装

下载时指定

pip install -i https://pypi.douban.com/simple/ flask

或者创建 ~/.pip/pip.conf ,写入

[global]
index-url = https://pypi.douban.com/simple/

2018-06-24 python , linux , notes , deploy

威联通折腾篇七:定时任务

威联通的机器本来就是基于 Linux 定义的,所以想要定时任务就会想到 crontab,在威联通中使用 crontab 必须使用 SSH 登录。

然后基本使用 crontab -l 查看当前 qnap 中已经存在的定时任务。

在大多数桌面版 Linux 中会使用 crontab -e 来编辑 crontab 配置,但是注意不要在威联通中使用这种方法,威联通在重启的时候会覆盖使用这种方式写入的配置。如果想要永久的保存配置,应该使用

vi /etc/config/crontab

然后写入配置,比如

0 4 * * * /share/custom/scripts/custom1.sh

这行配置表示在 凌晨 4 点执行后面的脚本。

或者直接使用 echo,将命令放到双引号中

echo "1 4 * * * /share/custom/scripts/custom1.sh" >> /etc/config/crontab

另外需要注意可执行文件一定需要可执行权限 chmod +x filename.sh

重启 crontab

crontab /etc/config/crontab && /etc/init.d/crond.sh restart

标准的 crontab 任务

定时任务 解释
0 3 * * 0 /etc/init.d/idmap.sh dump  
10 15 * * * /usr/bin/power_clean -c 2>/dev/null  
0 4 * * * /sbin/hwclock -s http://linux.die.net/man/8/hwclock
0 3 * * * /sbin/vs_refresh  
0 3 * * * /sbin/clean_reset_pwd  
0-59/15 * * * * /etc/init.d/nss2_dusg.sh  
30 7 * * * /sbin/clean_upload_file  
0-59/10 * * * * /etc/init.d/storage_usage.sh  
30 3 * * * /sbin/notice_log_tool -v -R  
*/10 * * * * /sbin/config_cache_util 0  
0-59/20 3 * * * /sbin/adjust_time  
0 8 * * * /usr/local/medialibrary/bin/mymediadbcmd buildall 1>/dev/null 2>/dev/null  
55 9,21 * * * /sbin/notify_update -s -p 1>/dev/null 2>&1  
0 23 */1 * * /sbin/qpkg_cli -U 1>/dev/null 2>/dev/null  
0 0 * * * /share/CACHEDEV1_DATA/.qpkg/Qcenter/qnap-cms/bin/log_retention.sh > /dev/null  
0 0 * * * /share/CACHEDEV1_DATA/.qpkg/Qcenter/qnap-cms/bin/nasconfig_retention.sh > /dev/null  
0 2 * * * /sbin/qfstrim  
0 0 * * 0 /sbin/storage_util –data_scrubbing raid_id=-1 >/dev/null 2>&1  
51 * * * * /sbin/qddns_check 2>/dev/null  
* * * * * /var/cache/netmgr/lock_timer.sh  
* * * * * /var/cache/netmgr/detect_defaultgw_internet.sh  
0 4 * * * /etc/init.d/wsd.sh restart  
4 3 * * 3 /etc/init.d/backup_conf.sh  
0 0 * * * /etc/init.d/antivirus.sh archive_log  
56 0 */1 * * /etc/init.d/antivirus.sh update_db  
20 08 * * * /mnt/ext/opt/QcloudSSLCertificate/bin/ssl_agent_cli  
35 7 * * * /sbin/qsyncsrv_util -c > /dev/null 2>/dev/null  
0 0 * * * /sbin/qsyncsrv_tool –fix > /dev/null 2>/dev/null  

reference


2018-06-23 qnap , qnap-tutorial , linux , crontab

douban 小组接口研究

豆瓣

curl -X GET \
  'https://frodo.douban.com/api/v2/group/622198/topics?count=30&sortby=new&os_rom=android&apikey=0dad551ec0f84ed02907ff5c42e8ec70&channel=Google_Market&udid=5e4159565b89f86cccda&_sig=YWtLhd6UEq%2Bh7xDWs%3D&_ts=1529656502' \
  -H 'Cache-Control: no-cache' \
  -H 'Host: frodo.douban.com' \
  -H 'User-Agent: api-client/1 com.douban.frodo/5.26.0(134) Android/23 product/OnePlus3 vendor/One model/ONE rom/android  network/wifi'

python

import requests

url = "https://frodo.douban.com/api/v2/group/622198/topics"

querystring = {"count":"30","sortby":"new","os_rom":"android","apikey":"0dad2907ff5c42e8ec70","channel":"Google_Market","udid":"5e3fff058b89f86cccda","_sig":"YWtLhDWs%3D","_ts":"1529656502"}

headers = {
    'User-Agent': "api-client/1 com.douban.frodo/5.26.0(134) Android/23 product/OnePlus3 vendor/One model/ rom/android  network/wifi",
    'Host': "frodo.douban.com",
    'Cache-Control': "no-cache",
    'Postman-Token': "1c40a79a-90ba-6d85aeb074e8"
    }

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.text)

2018-06-22 douban , api , app

修复 NextCloud 消失的托盘图标

NextCloud 算是很重度 的使用起来了,VPS 上安了,NAS 上也有。各个平台使用体验非常不错,不过唯一一点缺憾是有些时候 Ubuntu/Mint 上 NextCloud 随机启动之后托盘消失,导致看不到同步进度,老是让我感觉没有启动。

所以为了修复这个问题,需要完成以下两个步骤。第一个步骤就是在 startup applications 中将 NextCloud 设定延迟 10s 启动。

nextcloud-startup-applications

第二步就是需要卸载 appmenu-qt5 这个 bug 可以参考这个 issue

sudo apt remove appmenu-qt5

2018-06-21 nextcloud , dropbox , ubuntu , linux

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。