咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

2021年03月16 JDK 16 发布,非 LTS 版本。

新特性: http://openjdk.java.net/projects/jdk/16/

  • 338: Vector API (Incubator)
  • 347: Enable C++14 Language Features
  • 357: Migrate from Mercurial to Git
  • 369: Migrate to GitHub
  • 376: ZGC: Concurrent Thread-Stack Processing
  • 380: Unix-Domain Socket Channels
  • 386: Alpine Linux Port
  • 387: Elastic Metaspace
  • 388: Windows/AArch64 Port
  • 389: Foreign Linker API (Incubator)
  • 390: Warnings for Value-Based Classes
  • 392: Packaging Tool
  • 393: Foreign-Memory Access API (Third Incubator)
  • 394: Pattern Matching for instanceof
  • 395: Records
  • 396: Strongly Encapsulate JDK Internals by Default
  • 397: Sealed Classes (Second Preview)

中文

  • 338: 提供了Vector API (jdk.incubator.vector)来用于矢量计算
  • 347: 在JDK C++的源码中允许使用C++14的语言特性
  • 357: OpenJDK源码的版本控制从Mercurial (hg) 迁移到git
  • 369: 将OpenJDK源码的版本控制迁移到 GitHub
  • 376: ZGC: 实现了并发thread-stack处理来降低GC safepoints的负担
  • 380: 对 Socket Channels 及 Server ocket Channels的api提供对unix domain socket的支持
  • 386: 将glibc的jdk移植到使用musl的alpine linux上
  • 387: 支持不再使用的class metadata归还内存给操作系统,降低内存占用
  • 388: 移植JDK到Windows/AArch64
  • 389: 提供jdk.incubator.foreign来简化native code的调用
  • 390: 提供 @jdk.internal.ValueBased 来用于标注作为value-based的类
  • 392: jpackage在JDK14引入,JDK15作为incubating工具,在JDK16转正
  • 393: Foreign-Memory Access API在JDK14首次引入作为incubating API,在JDK15处于第二轮incubating,在JDK16处于第三轮incubating
  • 394: instanceof的模式匹配在JDK14作为preview,在JDK15作为第二轮的preview,在JDK16转正
  • 395: Record类型在JDK14作为preview,在JDK15处于第二轮preview,在JDK16转正
  • 396: 对内部的api进行更多的封装,鼓励开发者从使用内部的方法迁移到标准的API
  • 397: Sealed Classes在JDK15作为preview引入,在JDK16作为第二轮preview
阅读全文 »

Android 的 MediaCodec 可以编/解码音频视频,支持同步和异步两种使用方式。

异步

参考官网的文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
MediaCodec codec = MediaCodec.createByCodecName(name);
MediaFormat mOutputFormat; // member variable
codec.setCallback(new MediaCodec.Callback() {
@Override
void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
// fill inputBuffer with valid data

codec.queueInputBuffer(inputBufferId, …);
}

@Override
void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, …) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A
// bufferFormat is equivalent to mOutputFormat
// outputBuffer is ready to be processed or rendered.

codec.releaseOutputBuffer(outputBufferId, …);
}

@Override
void onOutputFormatChanged(MediaCodec mc, MediaFormat format) {
// Subsequent data will conform to new format.
// Can ignore if using getOutputFormat(outputBufferId)
mOutputFormat = format; // option B
}

@Override
void onError(…) {

}
});
codec.configure(format, …);
mOutputFormat = codec.getOutputFormat(); // option B
codec.start();
// wait for processing to complete
codec.stop();
codec.release();

音频和视频的用法差不多,差异在于配置上,编码和解码也是。

阅读全文 »

想在Android下实现PCM编码为AAC,已经用Android硬编码实现过AAC编码,但想了解一下FAAC这个库,比较一下两者的差异。

FAAC是开源的C语言库,查了一下网络上的文章,在Linux上编译FAAC,大多数都是编写一个脚本build_android.sh ,脚本里是用make编译,最终只有一个平台的共享库so或者静态库a文件。如:【AAC在Linux下编译】

而Android上使用共享库一般会有如下几个平台:

1
2
3
4
5
6
7
8
9
10
├── arm64-v8a
│   └── libxx.so
├── armeabi
│   └── libxx.so
├── armeabi-v7a
│   └── libxx.so
├── x86
│   └── libxx.so
└── x86_64
└── libxx.so

所以借着FAAC,记录一下Android如何通过NDK使用开源C/C++库。

阅读全文 »

1
requestPermissions(new String[]{"android.permission.RECORD_AUDIO"},1009);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class RecordAudioThread extends Thread{

AudioRecord recorder;

@Override
public void run() {
super.run();
int minBufferSize = AudioRecord.getMinBufferSize(
8000,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(
MediaRecorder.AudioSource.MIC,
8000,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minBufferSize);
recorder.startRecording();

byte[] audio = new byte[1024];

int readLength = 0;
while (!isInterrupted()){
readLength = recorder.read(audio,0,audio.length);

if(readLength > 0){
Log.d(TAG, "录音长度:" + readLength);
}
}
recorder.stop();
recorder.release();
Log.i(Thread.currentThread().getName() , "录音结束");
}
}

问题

在Windows10上家庭版安装完 Illustrator x64 ,在启动时崩溃并显示 CANT 错误的问题。

经过查资料,定位到是 Microsoft Visual C++ Redistributable 这个库的问题。

转到 控制面板 > 程序 > 程序和功能,发现我的系统中, Microsoft Visual C++ Redistributable 2012 这个库只有x86的,没有x64的,而安装的Illustrator是x64的。

找到问题了,那就好办了。

阅读全文 »

记录






缺少VC++错误

无法下载

这是网络原因,目前实测家庭网络可以下载,速度非常快,都是直接从官方的CDN下载。
网络错误

零售版Office2019增强版是一个iso安装包,安装的时候不可以自定义安装组件,默认直接全部组件都安装上,我们一般只用到三大组件:Word、Excel、PPT,其他多余的:Sky,Access,Pusher,Outlook等组件想删掉又删不掉。

所以网上找了一下方法,可以自定义安装组件,而且是可以直接从微软的官网CDN直接下载安装,下载速度也不错。

安装

  1. 下载【officedeploymenttool.exe】
  2. 运行 【officedeploymenttool.exe】 导出 【setup.exe】,其他xml文件不要,可以删除。
  3. 在线 Office 自定义工具
    这个网页可以生成一个配置文件,可以选择版本、组件等,我们也可以根据模板手动修改。
    • 情况一(推荐):配置在线CDN下载(cdn_config.xml);
  • 情况二:如果已经下载了Vol安装包(只支持Vol批量授权版,零售版不支持),所以选择本地源,选择你的Vol安装包路径(F:\)。
    配置导出为local_config.xml文件。
阅读全文 »

将阿里云的ECS从Ubuntu16.04升级到18.04后,DNS失效。

解决办法如下:

1.临时

1
2
3
$ vim /etc/resolv.conf
nameserver 223.5.5.5
nameserver 223.6.6.6

重启失效。

阅读全文 »

依赖

1
implementation("com.google.zxing:core:3.4.1")

调用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import android.graphics.Bitmap;
import android.graphics.Color;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

import java.util.Map;

public class Test {

public Bitmap createBitmap(String contents, int width, int height)throws WriterException {

BitMatrix matrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height);
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = matrix.get(x, y) ? Color.BLACK : Color.WHITE;
}
}

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
}

上面这样创建的是默认样式的二维码,白色边框会比较大,这是个小问题。
更多的自定义参数在 Map<EncodeHintType,?> hints 这个参数设置,看以下示例:

阅读全文 »

MobaXterm

官网:https://mobaxterm.mobatek.net/

有收费的,但开源免费版足够使用:
https://download.mobatek.net/2052020102712115/MobaXterm_Portable_v20.5.zip

支持SSH,FTP,串口,VNC,X server和标签。

  • 优点:
    占用内存小,开一个标签时就30MB左右,支持同时输入多台机器。内置的远程目录非常方便,可以随时上传/下载文件。
  • 缺点:
    进后台一段时间会触发屏保(企鹅),鼠标点击一下可以关闭屏保(收费版可以永久关闭),但关闭之后使用会有一点点卡的感觉,可能就是台省着用内存的原因(Tabby一上来就用了250MB内存)。
阅读全文 »

备忘一下这个底部输入框的效果:
效果

用DialogFragment实现挺方便的,大致的方法就是创建一个底部DialogFragment,布局内EditText聚焦,用代码主动弹出软键盘来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class BottomInputFragment : DialogFragment(){

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.BottomInputDialog)
}
override fun onStart() {
super.onStart()
val window = dialog!!.window
dialog!!.setCanceledOnTouchOutside(true)
val params = window!!.attributes
params.gravity = Gravity.BOTTOM
params.width = WindowManager.LayoutParams.MATCH_PARENT
window.attributes = params
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.dialog_edittext, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val editText = view.findViewById<EditText>(R.id.editText)
showSoftInputFromWindow(editText)
}

fun showSoftInputFromWindow(editText: EditText) {
editText.isFocusable = true
editText.isFocusableInTouchMode = true
editText.requestFocus()
val inputManager: InputMethodManager = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.showSoftInput(editText, 0)
}
}

弹框的Style R.style.BottomInputDialog

1
2
3
4
5
6
7
 <style name="BottomInputDialog" parent="AppTheme">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowSoftInputMode">stateAlwaysVisible</item>
</style>
阅读全文 »

利用IDE内置的创建Android机器人默认路径如下

1
2
3
<path
android:pathData="M17.6,11.48 L19.44,8.3a0.63,0.63 0,0 0,-1.09 -0.63l-1.88,3.24a11.43,11.43 0,0 0,-8.94 0L5.65,7.67a0.63,0.63 0,0 0,-1.09 0.63L6.4,11.48A10.81,10.81 0,0 0,1 20L23,20A10.81,10.81 0,0 0,17.6 11.48ZM7,17.25A1.25,1.25 0,1 1,8.25 16,1.25 1.25,0 0,1 7,17.25ZM17,17.25A1.25,1.25 0,1 1,18.25 16,1.25 1.25,0 0,1 17,17.25Z"
android:fillColor="#FF000000"/>

填充色 fillColor 改为 线条 strokeColor,设置一下宽度为1,效果如下:

1
2
3
4
<path
android:pathData="M17.6,11.48 L19.44,8.3a0.63,0.63 0,0 0,-1.09 -0.63l-1.88,3.24a11.43,11.43 0,0 0,-8.94 0L5.65,7.67a0.63,0.63 0,0 0,-1.09 0.63L6.4,11.48A10.81,10.81 0,0 0,1 20L23,20A10.81,10.81 0,0 0,17.6 11.48ZM7,17.25A1.25,1.25 0,1 1,8.25 16,1.25 1.25,0 0,1 7,17.25ZM17,17.25A1.25,1.25 0,1 1,18.25 16,1.25 1.25,0 0,1 17,17.25Z"
android:strokeWidth="1"
android:strokeColor="#FF000000"/>
阅读全文 »

2020年9月15日 JDK 15 发布,非 LTS 版本。

新特性: http://openjdk.java.net/projects/jdk/15/

  • 339: Edwards-Curve Digital Signature Algorithm (EdDSA)
  • 360: Sealed Classes (Preview)
  • 371: Hidden Classes
  • 372: Remove the Nashorn JavaScript Engine
  • 373: Reimplement the Legacy DatagramSocket API
  • 374: Disable and Deprecate Biased Locking
  • 375: Pattern Matching for instanceof (Second Preview)
  • 377: ZGC: A Scalable Low-Latency Garbage Collector
  • 378: Text Blocks
  • 379: Shenandoah: A Low-Pause-Time Garbage Collector
  • 381: Remove the Solaris and SPARC Ports
  • 383: Foreign-Memory Access API (Second Incubator)
  • 384: Records (Second Preview)
  • 385: Deprecate RMI Activation for Removal

中文

  • 339: 使用Edwards-Curve数字签名算法(EdDSA)实现加密签名
  • 360: 密封类 Sealed Classes (Preview)
  • 371: 隐藏类 Hidden Classes
  • 372: 删除Nashorn JavaScript脚本引擎和API,以及jjs工具
  • 373: 重新实现旧版DatagramSocket API,代替java.net.DatagramSocket和java.net.MulticastSocketAPI的基础实现
  • 374: 默认情况下禁用偏向锁,并弃用所有相关的命令行选项。
  • 375: 通过对instanceof运算符进行模式匹配来增强Java编程语言(Second Preview)
  • 377: 将ZGC垃圾收集器从实验功能更改为产品功能。
  • 378: 将文本块添加到Java语言
  • 379: Shenandoah垃圾回收从实验特性变为产品特性。
  • 381: 删除源代码并构建对Solaris/SPARC,Solaris/x64和Linux/SPARC端口的支持
  • 383: 引入一个API,以允许Java程序安全有效地访问Java堆之外的外部内存。
  • 384: Records提供了一种紧凑的语法来声明类,以帮助开发者写出更简洁的代码(Second Preview)
  • 385: 弃用RMI激活机制以便将来删除
阅读全文 »