0%

云耀之旅

双十一购入一台HECS云耀云服务器玩一下

1
2
# 规格:1核2G 云耀服务器
# 系统:CentOS 7.6 64bit

安装配置nginx

1. 安装nginx

1
2
3
4
5
6
## 通过yum 直接安装nginx
yum -y install nginx
## 查看nginx版本
nginx -v
===显示===
nginx version: nginx/1.16.1

2. 配置nginx

阅读全文 »

海军系列

陆军系列

空军系列

特别篇

1
2
3
4
环境:
主机:Raspberry Pi B型(第一代国产红版)
系统:2018-11-13-raspbian-stretch
(RaspberryPi-9 9.4 armv6l)

由于试了几个新版本,发现我的 USB网卡驱动有点问题,而且我的板子老了,所以选个旧点的系统

apt-get 配置国内镜像

镜像列表: http://www.raspbian.org/RaspbianMirrors

清华大学镜像使用说明:https://mirrors.tuna.tsinghua.edu.cn/help/raspbian/

阿里云镜像使用说明:https://developer.aliyun.com/mirror/raspbian

1
2
3
4
5
# 修改“/etc/apt/sources.list”内容,将原内容注释掉,加入以下内容
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib rpi

# 这里以清华镜像为例,我在清华给出的内容上,加上‘rpi’,与原内容保存一致,而且清华的镜像有‘rpi’文件夹的
1
2
# 修改“/etc/apt/sources.list.d/raspi.list”内容,将原内容注释掉,并加入以下内容
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui

修改完/etc/apt/sources.list/etc/apt/sources.list.d/raspi.list后,执行sudo apt-get update命令,更新软件源列表

配置root密码

有时候可能需要用到root权限,进行一些操作,而新安装的系统root是默认密码的,需要配置了密码才能使用root

阅读全文 »

Flutter 命令行

当前Flutter版本

  • 注意--versionversion是有区别的
1
2
3
4
5
6
7
8
9
10
11
# 报告当前工具版本
flutter --version
#Flutter 1.12.13+hotfix.5 • channel stable •
#Tools • Dart 2.7.0

# 列出Flutter版本
flutter version

# 切换Flutter版本
flutter version v1.12.13+hotfix.3

检查编译环境

1
2
3
4
5
# 显示有关已安装工具的信息
flutter doctor

# 显示已安装工具的全部信息
flutter doctor -v

创建项目命令

1
2
# 在指定目录中创建一个新的Flutter项目
flutter create <output directory>

运行Flutter项目

1
2
# 在连接的设备或模拟器上运行Flutter App
flutter run [options]

升级Flutter

1
2
3
4
5
6
7
8
# 更新Flutter
flutter upgrade

# 升级flutter时,Channel unknown故障
### 在"flutter doctor"可能会出现"Channel unknown"字眼,要升级flutter需要执行"flutter channel stable"确定"Channel"再执行"flutter upgrade"

# 更新Flutter rpo里的软件包
flutter update-packages

在Flutter项目中的包管理

1
2
3
4
5
# 在Flutter项目中获取软件包
flutter pub get

# 在Flutter项目中升级软件包
flutter pub upgrade

抽取快捷键(Android Studio & mac OS)

包裹一个一层Widget

当你需要在一个Widget外包裹另一个Widget,选中要包裹的Widget,使用快捷键(option)alt + enter

阅读全文 »

ijkplayer之旅

ijkplayer编译armv7的问题

修改ijkplayer/ios/tools/do-compile-ffmpeg.sh 如下

1
2
3
4
5
6
7
8
9
10
# 在188行增加以下代码
if ["$FF_ARCH"="arm64"]
then
FF_AS="gas-preprocessor.pl -arch aarch64 -- $FF_XCRUN_CC"
else
FF_AS="gas-preprocessor.pl -- $FF_XCRUN_CC"
fi

# 在246行增加以下代码
--as="$FF_AS" \

参考ijkplayer的issues(https://github.com/bilibili/ijkplayer/issues/4494)

之前自己写了一个扫描二维码Demo,本来在iPhone上跑,最近用iPad也跑一下,发现了一点问题,毕竟自己没开发过iPad App,经过一番折腾,发现了原来摄像头的方向和屏幕的方向是分开的。

iPad上的方向配置

一般情况下,我们会在项目配置里勾选支持的方向,但是如果选择了Universal,就要留意一下info.plist文件里的配置,iPhoneiPad 是分开配置的

摄像头方向

由于自己不熟悉iPad配置,而且我的iPad锁定了横屏,导致我的扫描二维码Demo里摄像头方向不对,这时候我才发现,原来屏幕方向和摄像头方向其实是分开的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 /* 一般扫描二维码的代码 (iOS7之后的)*/

// 创建AVCaptureSession
AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
self.session = captureSession;
// 配置输入设备
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil];

[captureSession addInput:inputDevice];

// 配置输出模式
AVCaptureMetadataOutput *captureOutput = [[AVCaptureMetadataOutput alloc] init];
[captureOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[captureSession addOutput:captureOutput];
[captureOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

// 添加显示内容的layer
self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.previewLayer.frame = self.view.bounds;
[self.view.layer addSublayer:self.previewLayer];

弄好扫描代码后,就可以设置摄像头方向了

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
/* 该部分代码整理自互联网 */

AVCaptureConnection *previewLayerConnection = self.previewLayer.connection;

// 获得当前屏幕方向
UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
// 判断是否允许设置
if ([previewLayerConnection isVideoOrientationSupported]) {
// 根据当前屏幕方向来设置摄像头方向
switch (interfaceOrientation) {
case UIInterfaceOrientationPortrait:
[previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
//竖屏,Home键在底部
break;
case UIInterfaceOrientationLandscapeRight:
[previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight];
//横屏,Home键在右边
break;
case UIInterfaceOrientationLandscapeLeft:
[previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeLeft];
//横屏,Home键在左边
break;
default:
[previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
//其他方向都设置成竖屏
break;
}
}

经过一番配置,摄像头的方向终于和屏幕方向一致了。

参考

iphone - iOS: camera orientation - Stack Overflow

iOS 获取屏幕方向,和强制屏幕旋转

iOS学习杂记

在iOS路上不断学习,修修补补的自己的知识,随手记录一下

OC 点语法的本质

  • 点语法本质依然是方法调用,即消息发送的方式
  • 当使用点语法时,编译器其实会转换成,消息发送的方式
  • OC的点语法不过是一种语法糖,其本质没变
1
2
3
4
5
6
7
/*
Student 类声明了一个name属性和一个对象方法study
*/
Student * student = [[Student alloc] init];
student.name = @"Jack"; // 这句相当于[student setName:@"Jack"];
NSString * studentName = student.name; // 这句相当于 NSString * studentName = [student name];
student.study; // 相当于 [student study];
1
2
3
4
5
6
7
8
9
10
// 这是一个错误写法,会产生死循环
- (void)setName:(NSString *)name {
self.name = name; // 相当于[self setName:name];
// 所以就会一直递归调用setName:方法,导致死循环了
}

// 这也是一个错误写法,原因也是一样,会一直递归调用name方法,导致死循环
- (NSString *)name {
return self.name; // 相当于return [self name];
}

注意,如果是struct,那么点语法就是对成员变量的直接访问,编译器并不会转换成方法调用
struct访问成员变量的点语法,是C语言的点语法,和OC的点语法有所区别

阅读全文 »

之前写过一篇《搭建自己的直播服务器(nginx + RTMP)》,后来发现一个更简单的直播服务器SRS(Simple-RTMP-Server),还是国人开发维护的,了解一下之后发现,还支持在Raspberry Pi上跑起来。想起我那尘封的Raspberry Pi,我就打算用它做成一个内网的直播服务器,这样就不用经常在PC上开启一个CentOS 7 虚拟机。

1
2
3
4
5
6
搭建环境:
主机:Raspberry Pi B型(第一代国产红版)
系统:2015-05-05-raspbian-wheezy
直播服务器:SRS 2.0
直播软件(推流):OBS Studio
播放软件(拉流):VLC

附上raspbian各个版本的下载列表https://downloads.raspberrypi.org/raspbian/images/

注意:如果Raspberry Pi 硬件型号和我的是一样的,建议用wheezy,不要用最新版本的,之前心想既然打开尘封的Raspberry Pi,那就跑些新东西吧,装上最新系统后,结果折腾了两天SRS2.0 怎么也跑不起来,或许版本兼容问题。

阅读全文 »

心血来潮想尝试搭建一个直播服务器玩玩,想到买一个服务器没必要,毕竟自己尝试玩玩,不如先用虚拟机搭建一个内网的直播服务器试试,因为本身不是做后台服务器开发的,其实对于搭建服务器并不熟悉。在网上找了一些资料,一步步完成简单的直播服务器搭建(能推流能拉流)。

搭建环境:
虚拟机:VMware Workstations 14 Pro
系统:CentOS Linux release 7.4.1708 (Core)
CPU:双核
内存:2GB
硬盘:40GB
直播软件(推流):OBS Studio
播放软件(拉流):VLC
阅读全文 »