咸鱼

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

0%

VMWare中的Ubuntu虚拟机当初创建时只分配了20G硬盘,结果现在硬盘爆满了,记得VMWare可以加硬盘的,所以给它加了一块虚拟硬盘,记录一下过程。

  1. 添加虚拟硬盘

VM关机,在“编辑虚拟机设置” 中“硬件”给虚拟机实例添加一块硬盘。

  1. 开机进入Ubuntu(这里是root身份登录,所以命令没有加sudo)

查看所有的硬盘,其中 /dev/sdb 是我们的第二块硬盘。

阅读全文 »

很简单,将虚拟机关机,在菜单栏“启动”绿色按钮旁边的更多三角形按钮,可以看到最底下有一个选项“打开电源时进入固件”,点击就可以进入BIOS啦。

国内 git clone github上的仓库一直不快,但现在很慢,经常超时,发现一个镜像加速站点: github.com.cnpmjs.org

如:

1
2
3
4
5
$ git clone https://github.com/bilibili/ijkplayer.git

# 改为

$ git clone https://github.com.cnpmjs.org/bilibili/ijkplayer.git

速度体验符合预期!!!

而且 github.com.cnpmjs.org 也可以网页浏览,但不可以登录。

阅读全文 »

Ubuntu下安装配置Android命令行编译环境,用于Jenkins编译项目和NDK编译第三方so库。

安装命令行工具sdkmanager

  1. 【在下载页面】 下载
    【commandlinetools-linux】 至路径 /usr/local/androidsdk
  2. 解压到当前目录,命令行工具的目录是 cmdline-tools
  3. sdkmanager是可执行文件
1
2
3
4
5
6
7
8
9
10
11
12
$ cd cmdline-tools/
$ ls
bin lib NOTICE.txt source.properties
$ tree bin
bin
├── apkanalyzer
├── avdmanager
├── lint
├── screenshot2
└── sdkmanager

0 directories, 5 files

配置环境变量

阅读全文 »

https://github.com/latelee/H264BSAnalyzer 是一个Win程序,用于分享H264文件,已有打包好exe的文件。

打开一个H264文件,如图

可以看到这个软件已经把每一个Nal解析为一行一行的,H264文件就是以Nal为单位。

一个H264文件,开头的是SPS和PPS,SEI可有可无,然后就是I帧,再就P帧或者B帧。

每一帧都会有一个start code,H264BSAnalyzer 是将 00 00 00 01 + FNRIType(第一个字节) 作为 start code 。

阅读全文 »

这是两种常用的音视频推流协议,这里简单比较一下两种协议应用场景(本文适合Java、Android开发者)。

参考:

一、RTMP

Real Time Messaging Protocol(实时消息传输协议)是 Adobe 的私有协议,设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。

阅读全文 »

1. 二进制文件下载(推荐)

Ubuntu直接下载deb包 ,用 dpkg -i 安装。

注:Ubuntu或者其他版本的linux,也可以下载Linux Static Builds 可执行文件 , 放在 /usr/bin 目录下,修改权限为可执行(777)即可。

2. 命令安装

1
2
3
sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get install ffmpeg
阅读全文 »

在做Android 系统OTA升级App时,需要在 ‘/cache‘ 目录创建目录和脚本文件,App已经获取到system权限(安装到 /system/priv-app 目录),但是还是在/cache 目录下没有权限。

通过 adb 命令,用system身份执行命令都没有任何问题。

升级命令脚本是:

1
2
3
"mkdir /cache/recovery"
"echo \"--update_package=/data/update.zip\" > /cache/recovery/command"
reboot recovery

但建议调用Android的接口 RecoverySystem.installPackage(this,new File("/data/update.zip")); 执行(也是差不多这些命令)

阅读全文 »

1. 在应用商店安装Windows Terminal

安装完成之后,启动Windows Terminal,在Windows Terminal内完成一些软件安装。

2. 允许powershell执行脚本

1
$ Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

3. 安装posh-git和oh-my-posh

阅读全文 »

开发Android IOT平台应用要用到串口,但硬件往往慢一拍,我们为了快速调试,可以使用模拟串口来解决问题。

本文最终实现:PC端口串口和Genymotion模拟器串口进行通信。

安装模拟工具

在Windows平台下安装 串口模拟工具-VSP 新建一对串口模拟COM1和COM2。
创建
选择pair
命名串口
启动串口模拟

配置Genymotion模拟器

阅读全文 »

用Android Studio 3.5创建了JKS证书,提示以下警告:

1
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore D:\demo\project\app\key.jks -destkeystore D:\demo\project\app\key.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

按照上面的提示,执行命令:

1
2
3
4
5
6
7
8
$ keytool -importkeystore -srckeystore D:\\demo\\project\\app\\key.jks -destkeystore D:\\demo\\project\\app\\key.jks -deststoretype pkcs12

输入源密钥库口令:
已成功导入别名 myapp 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
Warning:
已将 "D:\demo\project\app\key.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "D:\demo\project\app\key.j
ks.old" 进行了备份。

/drawable/start.xml

1
2
3
4
5
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/img1" android:duration="200" />
<item android:drawable="@drawable/img2" android:duration="100" />
</animation-list>

android:oneshot=”false” 表示一直播放(循环)

设置为background

1
2
3
4
5
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/start" />
阅读全文 »

startActivityForResult过期

一直都是这样启动一个带返回结果的Activity

1
2
3
4
5
6
7
8
val intent = Intent(this, VideoPlaybackListPPCSActivity::class.java).apply {
this.putExtra("data",111)
}

// 此方法已过期
// Deprecated
// use registerForActivityResult(ActivityResultContract, ActivityResultCallback) passing in a androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult object for the ActivityResultContract.
startActivityForResult(intent,10090)

使用registerForActivityResult跳转

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
//初始化不能在按键事件等地方执行,建议在onCreate执行
val launcher = registerForActivityResult(object: ActivityResultContract<String,String>(){
override fun createIntent(context: Context, input: String?): Intent {

return Intent(this@VideoPlayerPPCSActivity, VideoPlaybackListPPCSActivity::class.java).apply{
intent.extras?.let { ext ->
ext.putInt("session",remoteCamera.getSession())
this.putExtras(ext)
}
}
}
override fun parseResult(resultCode: Int, intent: Intent?): String {

//解析Intent中的数据,返回给onActivityResult
//这里不需要数据
return "ok"
}
},object: ActivityResultCallback<String>{
override fun onActivityResult(result: String?) {

//拿到数据
}
})


// 需要跳转时,这样执行
val intent = Intent(this, VideoPlaybackListPPCSActivity::class.java).apply {
this.putExtra("data",111)
}
launcher.launch(intent)
阅读全文 »

请尽量使用:NotificationCompat 及其子类,以及 NotificationManagerCompat。
这样一来,您就无需编写条件代码来检查 API 级别,因为这些 API 会为您代劳。
但是要注意 NotificationManagerCompat 不能创建Android8.0以上所需要的Channel,创建Channel还是需要用NotificationManager。

简单的一个通知

1
2
3
4
5
6
7
8
9
10
11
String channelId = "news";
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(),
channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("测试Title")
.setContentText("一些简单的内容!!!");

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());

int notifyId = 123;
notificationManager.notify(notifyId, builder.build());

但这个通知在Android8.0不能发出去,因为8.0规定必须将单个通知放入特定Channel中。

阅读全文 »

2020年3月17日 JDK 14 发布,非 LTS 版本。

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

  • 305: Pattern Matching for instanceof (Preview)
  • 343: Packaging Tool (Incubator)
  • 345: NUMA-Aware Memory Allocation for G1
  • 349: JFR Event Streaming
  • 352: Non-Volatile Mapped Byte Buffers
  • 358: Helpful NullPointerExceptions
  • 359: Records (Preview)
  • 361: Switch Expressions (Standard)
  • 362: Deprecate the Solaris and SPARC Ports
  • 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
  • 364: ZGC on macOS
  • 365: ZGC on Windows
  • 366: Deprecate the ParallelScavenge + SerialOld GC Combination
  • 367: Remove the Pack200 Tools and API
  • 368: Text Blocks (Second Preview)
  • 370: Foreign-Memory Access API (Incubator)

中文

  • 305: instanceof的模式匹配 (预览)
  • 343: 打包工具 (Incubator)
  • 345: G1的NUMA内存分配优化
  • 349: JFR事件流
  • 352: 非原子性的字节缓冲区映射
  • 358: 友好的空指针异常
  • 359: Records (预览)
  • 361: Switch表达式扩展 (标准)
  • 362: 弃用Solaris和SPARC端口
  • 363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
  • 364: macOS系统上的ZGC
  • 365: Windows系统上的ZGC
  • 366: 弃用ParallelScavenge + SerialOld GC组合
  • 367: 移除Pack200 Tools和API
  • 368: 文本块 (第二个预览版)
  • 370: 外部存储器API (Incubator)
阅读全文 »

记录通过命令行备份和恢复的过程

本地备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
Welcome to the MongoDB shell.
> show dbs
admin 0.000GB
mshop 0.000GB
jeel 0.001GB
local 0.000GB
home 0.001GB
pymongo_test 0.000GB
> exit
bye
$ mongodump -h localhost -d mshop -o ./
$ mongodump -h localhost -d pymongo_test -o ./
$ ls
mshop pymongo_test

这里备份了两个数据库,分别在两个目录下。

这里是将两个目录迁移到另外一个服务器,执行以下操作:

阅读全文 »

忘记管理员密码对于创建数据库等操作会有影响,本文基于Mongo v3.4.10将做一次处理这个问题的示例,整体方向就是删除所有的管理员用户,重新创建。

  1. 关闭mongod的认证

    1
    2
    #security:
    # authorization: enabled
  2. 重启mongod

    1
    $ service mongod restart
  3. 登录mongo命令行,删除所有admim数据库中的账号

    1
    2
    3
    4
    $ mongo
    > use admin
    > db.system.users.find()
    > db.system.users.remove({})
  4. 创建超级管理员root

    1
    > db.createUser({user:'root',pwd:'123456',roles:[{"role":"root","db":"admin"}]})
  5. 验证root密码

    1
    > db.auth('root','123456')
  6. 创建一个示例数据库:testdb

    1
    > use testdb
  7. 为示例数据库:testdb 创建一个可读写的用户

    1
    > db.createUser({user:'testuser',pwd:'123456',roles:[{"role":"readWrite","db":"testdb"}]})
  8. 认证

    1
    > db.auth('testuser','123456')
  9. 在testdb的col(collection)插入一条数据(不然不会创建数据库)

    1
    > db.col.insert({'test':'123'})
  10. 开启认证
    去掉注释,重启mongod

    1
    security:authorization: enabled
  11. 与mongo同一台机器安装adminMongo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ git clone https://github.com/mrvautin/adminMongo.git
    $ cd adminMongo
    $ npm install
    $ vim /config/app.json
    {
    "app": {
    "host": "0.0.0.0",
    "port": 4321,
    "docs_per_page": 20,
    "password": "adm123",
    "locale": "en",
    "context": "dbApp",
    "monitoring": true
    }
    }
    $ npm start
  12. IP:port 访问adminMongo,密码是app.json中设置的密码

  13. adminMongo 用超级用户创建连接

    1
    mongodb://root:123456@127.0.0.1:27017
  14. 在adminMongo中试一下创建数据库,为数据库创建用户等操作,完成。

Android原版系统,连接的WiFi是正常的,但显示“不可访问互联网”,应该检查某个域名发现无法访问。
如果觉得看着别扭,可以通过以下命令修复,给它改一个域名来检查。

1
2
3
4
adb shell settings put global captive_portal_use_https 1
adb shell settings put global captive_portal_http_url http://204.ustclug.org
adb shell settings put global captive_portal_https_url https://204.ustclug.org
adb shell settings put global captive_portal_mode 0

最后重启手机就没有显示“不可访问互联网”啦!

fastboot常用命令

1
2
3
4
5
6
7
8
9
10
11
# 解锁
$ fastboot flashing unlock

# 重启
$ fastboot reboot

# 刷入recovery
$ fastboot flash recovery recovery.img

# 启动临时recovery
$ fastboot boot recovery.img

Pixel解Bootloader锁

想要刷ROM,解BL锁时第一步:

  1. 在Android系统设置选项的开发者中,打开调试模式,打开OEM解锁,连接数据线。
  2. 关机
  3. 长按 “音量-“ + “电源”按键,进入Bootloader
  4. fastboot flashing unlock命令解锁 (需要有platform-tools才能运行fastboot)
  5. 如果成功就重启 fastboot reboot
阅读全文 »

Genymotion模拟器下载的虚拟机默认是在C盘,如果要修改虚拟机的路径,在设置里修改即可,但是先存的虚拟机genymotion不会帮你移动。

我们手动移动虚拟机,比如移动到D盘,那这些的虚拟机都失效了,Genymotion并不支持导入。

修改 C:\Users\用户名.VirtualBox\VirtualBox.xml 文件 :

1
2
3
4
5
6
<MachineRegistry>
<MachineEntry uuid="{a9a20fe7-dc69-4869-8f8b-1feff2485745}" src="D:\GenymotionDevice\Google Pixel - 9.0\Google Pixel - 9.0.vbox"/>

<MachineEntry uuid="{a9a20fe7-dc69-4869-8f8b-1feff2485745}" src="D:\GenymotionDevice\Google Pixel - 8.0\Google Pixel - 8.0.vbox"/>

</MachineRegistry>

将路径改正确即可,如果不小心删掉了,也可以在xml里面增加一个item,按照他的格式来写,其中uuid在虚拟机的vbox文件里面可以找到。

阅读全文 »