家里使用了HP Gen8作为NAS服务器,对于iLO/BIOS来说,可以直接通过控制台升级。但是网卡/磁盘阵列的固件升级需要使用HP Service Pack for ProLiant(HP SSP)来升级。具体升级过程如下:
继续阅读使用HP Service Pack for ProLiant Gen8.1升级HP ProLiant MicroServer Gen8固件
家里使用了HP Gen8作为NAS服务器,对于iLO/BIOS来说,可以直接通过控制台升级。但是网卡/磁盘阵列的固件升级需要使用HP Service Pack for ProLiant(HP SSP)来升级。具体升级过程如下:
继续阅读使用HP Service Pack for ProLiant Gen8.1升级HP ProLiant MicroServer Gen8固件
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
bash切换到zsh后,发现原先bash下的bashrc文件配置都失效了(显示zsh: command not found字样,当然如果手动通过source FileName加载是可以的),macOS Catalina(10.15.5) 已经默认切换到zsh,那么如何实现不用每次加载.bashrc文件就实现alias等便捷功能呢?/etc/zshrc或/etc/zprofile~/[X]bashrc或~/[X]profile/etc/zshrc里有较多zsh特性配置,而且默认全局加载,因此这里通过编辑用户级的profile并加载原先的bashrc(即Bash Shell下用户文件)来实现我们的需求|
1 2 3 4 5 6 7 8 9 |
mu@xiaomudeMacBook-Pro ~ % cp /etc/zprofile ~/.zprofile mu@xiaomudeMacBook-Pro ~ % ll ~/.zprofile -r--r--r-- 1 mu staff 255 9 6 09:35 /Users/mu/.zprofile mu@xiaomudeMacBook-Pro ~ % chmod u+w ~/.zprofile #要实现自定义必须添加写权限,否则只有只读权限 mu@xiaomudeMacBook-Pro ~ % ll ~/.zprofile -rw-r--r-- 1 mu staff 255 9 6 09:35 /Users/mu/.zprofile |
Bash Shell的.bashrc文件|
1 2 3 4 |
mu@xiaomudeMacBook-Pro ~ % cat .bashrc alias ll='ls -l' mu@xiaomudeMacBook-Pro ~ % echo "source ~/.bashrc" >> .zprofile |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
mu@xiaomudeMacBook-Pro ~ % ll #配置暂未生效 zsh: command not found: ll mu@xiaomudeMacBook-Pro ~ % source .zprofile #加载配置文件,使其立即生效;下一次打开终端Shell会话,将自动加载 mu@xiaomudeMacBook-Pro ~ % ll total 16 drwx------ 5 mu staff 160 8 23 14:38 Applications drwx------@ 4 mu staff 128 1 2 2019 Applications (Parallels) drwx------@ 4 mu staff 128 9 1 15:23 Desktop drwx------+ 20 mu staff 640 8 29 12:14 Documents drwx------@ 35 mu staff 1120 9 6 09:29 Downloads drwx------@ 85 mu staff 2720 8 30 11:05 Library drwx------+ 4 mu staff 128 8 20 20:17 Movies drwx------+ 8 mu staff 256 8 20 20:17 Music drwx------ 26 mu staff 832 9 6 09:28 Nextcloud drwx------ 3 mu staff 96 1 2 2019 Parallels drwx------+ 6 mu staff 192 8 20 20:01 Pictures drwxr-xr-x+ 4 mu staff 128 11 28 2018 Public drwxr-xr-x 4 mu staff 128 12 9 2018 PycharmProjects -rw-r--r-- 1 mu staff 811 12 15 2018 Untitled.ipynb -rw-r--r-- 1 mu staff 1578 12 29 2018 Untitled1.ipynb drwxr-xr-x 3 mu staff 96 8 25 16:08 VirtualBox VMs drwxr-xr-x 2 mu staff 64 1 25 2019 WeChatProjects |
下载并安装目前最新的Android Studio 4.0,然后通过Android Studio 4.0安装Android SDK。
下载目前最新的flutter
|
1 2 3 4 5 6 7 |
$ cd ~ $ mkdir Android $ cd Android $ git clone -b stable https://github.com/flutter/flutter.git |
配置环境变量
|
1 2 3 4 5 6 7 8 9 10 11 12 |
$ export PATH=/Users/`whoami`/Android/flutter/bin:$PATH # android sdk目录,替换为你自己的即可,下面是Android Studio安装SDK的默认目录 $ export ANDROID_HOME="/Users/`whoami`/Library/Android/sdk" $ export PATH=${PATH}:${ANDROID_HOME}/tools $ export PATH=${PATH}:${ANDROID_HOME}/platform-tools $ export PUB_HOSTED_URL=https://pub.flutter-io.cn $ export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn |
上述环境变量,全部追加到 .bashrc 尾部
|
1 2 3 4 5 6 7 |
export PATH=/Users/`whoami`/Android/flutter/bin:$PATH # android sdk目录,替换为你自己的即可,下面是Android Studio安装SDK的默认目录 export ANDROID_HOME="/Users/`whoami`/Library/Android/sdk" export PATH=${PATH}:${ANDROID_HOME}/tools export PATH=${PATH}:${ANDROID_HOME}/platform-tools export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn |
如果不增加到.bashrc 尾部,则在 Android Studio 4.0 创建项目的时候,会非常慢,主要是网络问题。
必要的环境配置,依赖下载
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#对于 macOS Catalina 10.15.5 来说,由于Shell被替换成了ZSH,因此环境变量需要重新配置一下 $ cp /etc/zprofile ~/.zprofile $ chmod u+w ~/.zprofile $ echo "source ~/.bashrc" >> .zprofile $ flutter doctor $ flutter doctor --android-licenses $ sudo gem install cocoapods # 杀掉全部的dart进程,否则可能导致长时间无法创建项目的问题 # 任何时候,flutter相关卡住,貌似都可以这样操作 $ killall -9 dart |
今天有需要共享上网进行抓包分析报文的情况。
研究了一下MacBook Pro(macOS Catalina(10.15.5))如何通过蓝牙PAN(Bluetooth PAN)来共享笔记本连接的Wi-Fi网络出来,让手机通过共享出来的蓝牙热点来上网的方法。
由于蓝牙PAN(Bluetooth PAN)本质属于局域网转发,起到一个简单网关的作用。因此我们需要设置蓝牙设备的IP地址跟需要共享的Wi-Fi网卡相同。
具体操作如下:
如果 Synology NAS 出现故障,则可以使用计算机和 Ubuntu live CD 轻松恢复其硬盘上存储的数据。确保 Synology NAS 硬盘上运行的文件系统是 EXT4 或 Btrfs,然后按照以下步骤恢复数据。此处我们以 Ubuntu 18.04 版本为例。
如果单位能自己管理档案,并且要求转入,则在手机的 浙里办 上搜索 流动任意人事档案转出, 如下图:
在Android开发的时候,又是需要检查窗口布局层次,观察布局是否显示正确。
早期版本是使用Hierarchy Viewer ,最新的Android Studio 4.X下,我们使用 Layout Inspector,具体操作参考下图:
继续阅读在Android Studio 4.X下查看窗口布局层次Hierarchy Viewer/Layout Inspector
在手机APP开发的时候,一般默认会适配竖屏,游戏开发除外。但是在Android平板电脑开发中,屏幕旋转的问题比较退出,可以这样说,平板电脑的最初用意就是横屏使用的,比较方便,用户会经常旋转我们的屏幕。
这里主要针对平板开发中的一些问题做一些总结。
为了适配屏幕,Activity默认在屏幕旋转之后会销毁并且重建,但是这种情况会造成用户输入数据的丢失(需要开发者手动去保存和恢复,会带来一定的工作量),Activity毕竟是重量级的组件,它的销毁和重建会使得性能的下降,因此我们需要防止Activity的销毁和重建。
在清单文件中为Activity添加一些配置,configChanges属性添加orientation|screenSize:
|
1 2 3 4 5 |
<activity android:name=".ui.activity.MainActivity" android:configChanges="orientation|screenSize" android:launchMode="singleTask" android:windowSoftInputMode="stateAlwaysHidden"> |
通过上述的配置可以防止Activity的销毁和重建。
注意:这里的 screenSize 经常被我们遗漏。一般我们都是设置 orientation , 当屏幕方向改变的时候不要重新创建。那么 screenSize 什么时候发生呢? 目前最常见的就是 系统导航方式 变化的时候,目前Android手机支持 手势导航 / 屏幕内三键导航 两种模式。这两种模式的不同就是在屏幕底部是否出现 Back/ Home / Menu。这样导致应用的显示高度发生变化,从而触发 screenSize。
注意,辅助功能 里的 无障碍 模式下 导航模式 会被切换到 屏幕内三键导航 模式,从而引起窗口的重新绘制。
除了制作横屏和竖屏两份布局文件的方法之外,如果我们的View是动态添加到Window的,屏幕旋转之后,我们的界面以及View需要做一些变动以适应屏幕。
我们可以复写Activity的onConfigurationChanged方法,并且在里面修改一些东西。
|
1 2 3 4 5 6 |
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //一些适配操作 } |
这里举个例子,如说我们的ListView右边有一个字母索引控件,这个控件是直接new出来并且是直接覆盖在ListView上面的。当屏幕旋转之后,这个字母索引控件的位置需要刷新(重新布局以及绘制)。因为这个控件是在我们的ListView的右侧,并且竖直方向居中。这时候我们就需要动态获取屏幕上的ListView的宽高,然后才能计算出字母控件应该布局的位置。
直接通过View的getWidth方法或者先measure然后通过getMeasuredWidth方法获取到的宽都是错误的,获取到的是屏幕旋转之前的值,如下面的代码所示。但是我需要的是ListView实时的宽高值,这时候我们只能手动去计算。例如我们要获取ListView的高度,那么我们可以先拿到Window的总高度,然后减去状态栏、Toolbar的高度来获取(这里只是一个例子,具体做法需要具体分析)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //一些适配操作 WindowManager wm = getWindowManager();//Activity可以直接获取WindowManager // WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); final int windowWidth = wm.getDefaultDisplay().getWidth(); final int windowHeight = wm.getDefaultDisplay().getHeight(); //手动去计算ListView的宽高 final int mListViewWidth = windowWidth; final int mListViewHeight = windowHeight - statusbarHeight - toolbarHeight; //下面获取ListView的宽高是有问题的 // mListView.measure(0, 0); // mListView.getMeasuredWidth(); // mListView.getMeasuredHeight(); // mListView.getWidth(); // mListView.getHeight(); // 。。。其他适配操作 } |
最近又遇到屏幕旋转相关的新的问题,因此记录下来。我们知道,在Activity、View、Fragment等旋转的时候,如果你在清单文件中配置不重新创建的话,就会调用onConfigurationChanged方法。
但是问题来了,这个问题有一些不确定性因素,比如说当你的页面或者View被遮挡住(Stop)的时候就不会回调onConfigurationChanged这个方法。这比较略坑,会带来一些UI的偶发性问题。
解决办法就是我们自定义一个广播接受者专门用来接受onConfigurationChanged这个广播,这样子就可以确保,无论什么情况下,系统ConfigurationChanged的时候你的代码都会被执行。
自定义的ConfigurationChangeReceiver如下,这里提供一个静态方法方便注册。
|
1 2 3 4 5 6 7 8 9 10 |
public abstract class ConfigurationChangeReceiver extends BroadcastReceiver { private static final String TAG = ConfigurationChangeReceiver.class.getSimpleName(); public static IntentFilter getIntentFilter() { IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.CONFIGURATION_CHANGED"); return filter; } } |
接下类在Activity或者Fragment中的正确位置注册(onAttachedToWindow、onDetachedFromWindow):
|
1 2 3 4 5 6 7 8 9 |
private void initConfigurationChangeReceiver() { mConfigurationChangeReceiver = new ConfigurationChangeReceiver() { @Override public void onReceive(Context context, Intent intent) { //你的屏幕适配代码 } }; this.registerReceiver(mConfigurationChangeReceiver, ConfigurationChangeReceiver.getIntentFilter()); } |
记得反注册,防止内存泄漏哦。
|
1 2 3 4 5 |
private void unRegisterConfigurationChangeReceiver() { if (mConfigurationChangeReceiver != null) { this.unregisterReceiver(mConfigurationChangeReceiver); } } |
deb 与 rpm 是GNU/Linux 流行的软件包格式。我们“alien”可以在rpm\dpkg\slackware tgz\deb\slp 格式见进行转换。
Debian/Ubuntu 可使用下面命令安装alien:
|
1 |
$ sudo apt-get install alien |
举例:假设在目录/tmp 有myprogram.rpm 文件,使用下面命令转换:
|
1 2 3 |
$ sudo alien /tmp/myprogram-1.10-2.i386.rpm myprogram-1.10-3.i386.deb generated |
这时,在/tmp 目录下就会发现有 myprogram.deb ,这时就可以使用dpkg安装:
|
1 |
$ sudo dpkg -i /tmp/miprogramma.deb |