mac: "tar: Ignoring unknown extended header keyword" 错误解决办法

遇到问题

在Mac上使用tar打包,scp到ubuntu上再解压报错。

➜  blog tar -zxf data.tar.gz
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.quarantine'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.TextEncoding'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.quarantine'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.TextEncoding'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.quarantine'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.TextEncoding'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.quarantine'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.TextEncoding'

产生的原因

产生这个报错的原因是,这个tar文件是在MAC OS X中建立的,Mac OS X 使用的是BSD tar,它会产生一些GNU tar无法识别的额外的信息,常见的linux发行版用的是GNU tar。都是tar居然还不兼容。

解决办法

处理办法是使用gtar去压缩,使用brew安装gtar

# 安装
brew install gnu-tar
#使用
gtar -zcvf data.tar.gz ./Category/*

# 上传到linux服务器后使用tar解压

tar -zxvf data.tar.gz

记录一下,方便下次使用。

2022/09/05 posted in  笔记

ubuntu 关闭用户图形界面

1. 关闭用户图形界面 关闭桌面

sudo systemctl set-default multi-user.target
sudo reboot 

2. 开启用户图形界面 开启桌面

sudo systemctl set-default graphical.target
sudo reboot
2022/09/05 posted in  笔记

裂缝的瓶

枯萎了插着的马鞭草,
扇子一下碰伤了花瓶;
只不过刚好轻轻触着,
并没有响出一点声音。

但那条细微的裂痕,
每天都在蚀着玻瓶,
虽不现形迹,而是准定
慢慢地在逐渐延伸。

清水流出一点一滴,
鲜花的生命便枯竭;
再也没有谁会怀疑,
不要触动,玻瓶已发裂。

往住也是相爱的手,
轻轻一触便伤着了心;
裂开了缝隙在心头,
爱情的花儿便凋零。

眼里看不出什么损伤,
可感觉它细而深的缝,
暗暗在低泣,在增长,
心儿已发裂,不要触动。

---- 普吕多姆(Sully Prudhomme)诗选

2021/05/18 posted in  碎碎念

手绘

abc

2021/05/11 posted in  手绘

nginx控制浏览器不缓存文件(文件过期时间)

Nginx 缓存配置 expires 和 add_header Cache-Control 的总结

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
expires 30d;
access_log off; //配置不记录到日志
}
location ~ .*\.(js|css)?$ {
add_header Cache-Control no-cache;
add_header Cache-Control private;
expires -1;

如果expires 和 add_header 同时开启的情况下,则add_header优于expires生效;

所以使用过期时间属性一定要确认你的Web服务器时间设置正确,一个途径是通过网络时间同步协议(Network Time Protocol NTP)。
Expires/Cache-Control Header是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只是Cache-Control比Expires可以控制的多一些, 而且Cache-Control会重写Expires的规则。
Last-Modified/If-Modified-Since和ETag/If-None-Match是浏览器发送请求到服务器后判断文件是否 已经修改过,如果没有修改过就只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器。

我这里一直没有成功,因为我们的js文件通过资源域名调用,我一直在访问域名配置。
最后切换成资源域名,配置成功。

2021/05/11 posted in  碎碎念

ThreadPoolExecutor常见方法用法和区别

主要理解ThreadPoolExecutor中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别

Java并发编程中在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown()、shutdownNow()、awaitTermination())的异同点如下:

shutdown()

将线程池状态置为SHUTDOWN,并不会立即停止:

  • 停止接收外部submit的任务
  • 内部正在跑的任务和队列里等待的任务,会执行完
  • 等到第二步完成后,才真正停止

shutdownNow()

将线程池状态置为STOP。企图立即停止,事实上不一定:

  • 跟shutdown()一样,先停止接收外部提交的任务
  • 忽略队列里等待的任务
  • 尝试将正在跑的任务interrupt中断
  • 返回未执行的任务列表

它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。
但是大多数时候是能立即退出的

awaitTermination(long timeOut, TimeUnit unit)

当前线程阻塞,直到

  • 等所有已提交的任务(包括正在跑的和队列中等待的)执行完
  • 或者等超时时间到
  • 或者线程被中断,抛出InterruptedException
  • 然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)

shuntdown()和awaitTermination()效果差不多,方法执行之后,都要等到提交的任务全部执行完才停。

shutdown() 和 shutdownNow()的区别

从字面意思就能理解,shutdownNow()能立即停止线程池,正在跑的和正在等待的任务都停下了。这样做立即生效,但是风险也比较大;
shutdown()只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。

Between client threads and thread pool there is a queue of tasks. When your application shuts down, you must take care of two things: what is happening with queued tasks and how already running tasks are behaving (more on that later). Surprisingly many developers are not shutting down thread pool properly or consciously. There are two techniques: either let all queued tasks to execute (shutdown()) or drop them (shutdownNow()) - it totally depends on your use case.

shutdown()和awaitTermination()的区别

  • shutdown()后,不能再提交新的任务进去;但是awaitTermination()后,可以继续提交。
  • awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()不阻塞。

总结

  • 优雅的关闭,用shutdown()
  • 想立马关闭,并得到未执行任务列表,用shutdownNow()
  • 优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination()

ps:关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()
awaitTermination并不是用来关闭线程池,它只是用来检测timeout时间后线程池是否关闭。
一般在调用shutdown()方法后调用

awaitTermination并不是用来关闭线程池,它只是用来检测timeout时间后线程池是否关闭。
一般在调用shutdown()方法后调用

2021/04/17