使用kcptun加速搬瓦工VPS

以下以搬瓦工contOS 64位系统为例:
假设你的shadowsock地址为: 23.106.147.91端口为:444

部署服务端

kcptun地址, 按需选择对应32或者64位版本.

mkdir /root/kcptun
cd /root/kcptun
wget https://github.com/xtaci/kcptun/releases/download/v20170221/kcptun-linux-amd64-20170221.tar.gz
tar -zxf kcptun-linux-amd64-20170221.tar.gz

创建 start.sh

vim /root/kcptun/start.sh

写入以下内容:

#!/bin/bash
cd /root/kcptun/
./server_linux_amd64 -c /root/kcptun/server-config.json 2>&1 &
echo "Kcptun started."

创建配置文件server-config.json

vi /root/kcptun/server-config.json

写入以下内容:

{
    "listen": ":29900",
    "target": "127.0.0.1:444",
    "key": "test",
    "crypt": "salsa20",
    "mode": "fast2",
    "mtu": 1350,
    "sndwnd": 1024,
    "rcvwnd": 1024,
    "datashard": 70,
    "parityshard": 30,
    "dscp": 46,
    "nocomp": false,
    "acknodelay": false,
    "nodelay": 0,
    "interval": 40,
    "resend": 0,
    "nc": 0,
    "sockbuf": 4194304,
    "keepalive": 10,
    "log": "/root/kcptun/kcptun.log"
}

“listen”: “:29900” 29900可以随便填写一个自己喜欢的
“target”: “127.0.0.1:444” 127.0.0.1是写死的, 444换成你的ss的端口

创建 stop.sh

vi /root/kcptun/stop.sh

写入以下内容

#!/bin/bash
echo "Stopping Kcptun..."
PID=`ps -ef | grep server_linux_amd64 | grep -v grep | awk '{print $2}'`
if [ "" !=  "$PID" ]; then
  echo "killing $PID"
  kill -9 $PID
fi
echo "Kcptun stoped."

创建 restart.sh

vi /root/kcptun/stop.sh

写入以下内容

#!/bin/bash
cd /root/kcptun/
sh stop.sh
echo "Restarting Kcptun..."
sh start.sh

启动服务端

/root/kcptun/start.sh

停止服务端

/root/kcptun/stop.sh

重启服务端

/root/kcptun/restart.sh

监听日志信息

tail -f /root/kcptun/kcptun.log

按 control + c 退出监听

添加开机启动

chmod +x /etc/rc.d/rc.local;echo "sh /root/kcptun/start.sh" >> /etc/rc.d/rc.local

配置客户端

首先下载 Kcptun 的客户端文件,最好单独放到一个文件夹中
Windows 和 Mac 按需下载.

darwin即代表Mac
版本要和服务端一致. 服务端为v20170221, 这里也要20170221

下面要进行客户端配置,我选择的是GUI的方式,图形界面比较清晰. 你也可以选择用命令配置.

参考这里:

小内存福音,Kcptun Shadowsocks加速方案
在openwrt上部署kcptun给搬瓦工加速
下载Mac GUI工具 或者 Windows GUI工具并安装

设置看图:

  1. 点击1添加一个客户端
  2. 点击2浏览,指定前面下载的Mac版客户端文件.
  3. 处随便填写一个端口.
  4. 处填写你的ss地址
  5. 处填写服务端配置文件server-config.json中的29900
  6. 画圈圈打星星的部分,必须按照server-config.json配置文件中的填写.

Shadowsocks 客户端配置

在客户端中新建服务器:

服务器 IP 填写本机:127.0.0.1 (此处写死,不要改😀)
服务器端口填写:8388 这个8388就是你上一步3处的本地侦听端口
正确填写你的 Shadowsocks 密码,加密方式,协议和混淆方式。

切换到该服务器上,测试是否正确运行。

全部OVER.

06/20/2022 12:21 下午 posted in  VPN

解决2019款macbookpro -16寸 外接显示器风扇不停的转,温度特别高

终极方案: 禁止独显 & 使用 Turbo_Boost_Switcher_Pro_2.10.2 。

禁止独显使用集成显卡

发热很久了,最后找到一个解决方法。禁止独显,使用集显即可。但设置仅使用集显后还需要在关闭系统设置/电源/自动切换显卡 选项,不然外接显示器没有反应。步骤:打开终端,输入:sudo pmset -a GPUSwitch 0
// 0: 强制使用核显; 1: 强制使用独显 2: 自动切换显卡

pmset -g //查看是否成功,会看到下图

后关闭系统设置 / 电源 / 自动切换显卡 选项

特别操作: 关闭系统设置 / 电源 / 自动切换显卡 选项

参考: https://www.zhihu.com/question/290208585

使用Turbo_Boost_Switcher_Pro


外接显示器的风扇会在4000rpm 左右, 风扇噪音明显减轻。

机器型号

06/16/2022 08:59 上午 posted in  apple

scp命令详解

一、示例

1、从本地复制到远程

在本地服务器上将/root/hello目录下所有的文件传输到服务器12.23.34.56的/home/hello/cpfile目录下,命令为:

scp -r -P 22 /root/hello root@12.23.34.56:/home/hello/cpfile

2、从远程复制到本地

在本地服务器上操作,将服务器12.23.34.56上/home/hello/目录下所有的文件全部复制到本地的/root目录下,命令为:

scp -r root@12.23.34.56:/home/hello /root

二、命令详解

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

1.命令格式:

scp [参数] [原路径] [目标路径]

2.命令功能:

scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。

3.命令参数:

-1 强制scp命令使用协议ssh1
-2 强制scp命令使用协议ssh2
-4 强制scp命令只使用IPv4寻址
-6 强制scp命令只使用IPv6寻址

-B 使用批处理模式(传输过程中不询问传输口令或短语)
-C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p 保留原文件的修改时间,访问时间和访问权限。
-q 不显示传输进度条。
-r 递归复制整个目录。
-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port 注意是大写的P, port是指定数据传输用到的端口号
-S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

4.使用实例:

scp命令的实际应用概述:

从本地服务器复制到远程服务器:

(1) 复制文件:

命令格式:

scp local_file remote_username@remote_ip:remote_folder

或者

scp local_file remote_username@remote_ip:remote_file

或者

scp local_file remote_ip:remote_folder

或者

scp local_file remote_ip:remote_file

第1,2个指定了用户名,命令执行后需要输入用户密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名
第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名

(2) 复制目录:

命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder

或者

scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要输入用户密码;
第2个没有指定用户名,命令执行后需要输入用户名和密码;

06/13/2022 10:40 上午 posted in  Linux

Flutter项目高德地图后台持续定位功能的实现(iOS)

首先高德本身就支持后台持续定位:实例文档.对于Flutter项目高德也提供了框架支持:文档

pubspec.yaml如下:

dependencies:
  flutter:
    sdk: flutter
  # 权限相关
  permission_handler: ^5.1.0+2
  # 定位功能
  amap_location_fluttify: ^0.20.0

实现逻辑我们以iOS项目为例:

iOS项目工程(ios/Runner)配置:

添加定位权限申请配置

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>申请Always权限以便应用在前台和后台(suspend 或 terminated)都可以获取到更新的位置数据</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>需要您的同意才能始终访问位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要您的同意,才能在使用期间访问位置</string>

以上权限会根据iOS 系统版本的不同有所不同

后台任务(Background Modes)模式配置

<key>UIBackgroundModes</key>
<array>
	<string>location</string>
	<string>remote-notification</string>
</array>

选择Location updates选项

Flutter项目实例

对于Flutter中的使用方法,具体实例如下:

  1. 首先要在main函数中进行高德地图组件的注册
  2. 视图中在调用定位之前必须进行权限申请
  3. 开启后台任务功能
  4. 执行持续定位

代码 main.dart:

import 'package:amap_location_fluttify/amap_location_fluttify.dart';

void main() {
  runApp(const MyApp());
  # 注册高德地图组件
  AmapLocation.instance.init(iosKey: 'xxxxxx');
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LocationPage(),
    );
  }
}

location_page.dart:

import 'package:amap_location_fluttify/amap_location_fluttify.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:permission_handler/permission_handler.dart';

class LocationPage extends StatefulWidget {
  LocationPage({Key? key}) : super(key: key);

  _LocationPageState createState() => _LocationPageState();
}

class _LocationPageState extends State<LocationPage> {
  //获取数据
  // Map<String, Object> _locationResult;
  String _latitude = ""; //纬度
  String _longitude = ""; //经度

  @override
  void initState() {
    super.initState();
    /// 动态申请定位权限
    requestPermission();
  }

  @override
  void dispose() {
    super.dispose();
  }

  /// 动态申请定位权限
  void requestPermission() async {
    // 申请权限
    bool hasLocationPermission = await requestLocationPermission();
    if (hasLocationPermission) {
      print("定位权限申请通过");
    } else {
      print("定位权限申请不通过");
    }
  }

  ///  申请定位权限  授予定位权限返回true, 否则返回false
  Future<bool> requestLocationPermission() async {
    //获取当前的权限

    var status = await Permission.locationAlways.status;
    if (status == PermissionStatus.granted) {
      //已经授权
      return true;
    } else {
      //未授权则发起一次申请
      status = await Permission.location.request();
      if (status == PermissionStatus.granted) {
        return true;
      } else {
        return false;
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("地理定位演示"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            //  latitude: 36.570091461155336, longitude: 109.5080830206976
            //
            Text("纬度:${this._latitude}"),
            Text("经度:${this._longitude}"),
            SizedBox(height: 20),
            ElevatedButton(
              child: Text('开始定位'),
              onPressed: () {
                this._startTheLocation();
              },
            ),
          ],
        ),
      ),
    );
  }

  Future _startTheLocation() async {
    if (await Permission.location.request().isGranted) {
    
        # 开启后台持续定位功能
      await AmapLocation.instance.enableBackgroundLocation(
        10,
        BackgroundNotification(
          contentTitle: 'contentTitle',
          channelId: 'channelId',
          contentText: 'contentText',
          channelName: 'channelName',
        ),
      );
      
      # 监听持续定位
      AmapLocation.instance.listenLocation().listen((location) {
        setState(() {
          _latitude = location.latLng.latitude.toString();
          _longitude = location.latLng.longitude.toString();
          print("监听定位: {$_latitude, $_longitude}");
        });
      });
    } else {
      openAppSettings();
    }
  }

}

总结

关于后台持续定位对于高德来说核心函数只有2个:

开启后台任务

AmapLocation.instance.enableBackgroundLocation(id, notification)

执行持续定位:

AmapLocation.instance.listenLocation().listen((location) {
    // do someting
});
06/10/2022 13:10 下午 posted in  Flutter

Flutter开发的一些知识点记录1

Error: Cannot run with sound null safety, because the following dependencies

don't support null safety:

flutter build ios --no-sound-null-safety

Flutter 升级到指定版本——版本升级与回退

相关命令:

查看版本: flutter --version
检查环境:flutter doctor
查看渠道:flutter channel
切换渠道(stable, beta, dev, master):flutter channel stable
升级到最新版本:flutter upgrade 
升级到指定版本:flutter upgrade v2.2.3
回退到指定版本:flutter downgrade v2.0.3

也可通过git回退版本:

  1. 进入 flutter github 找到要回退的版本


  1. cd进入到存放flutter sdk目录,运行回退指令 git reset --hard [commit_id]
    例如-> git reset --hard 4d7946a68d26794349189cf21b3f68cc6fe61dcb
  2. 查看flutter版本
    查看版本-> flutter doctor 或者 flutter --version
06/09/2022 16:26 下午 posted in  Flutter

vscode如何使⽤模拟器运⾏flutter项⽬

在vscode中,快捷键ctrl+shift+P,在顶部搜索框中输⼊ Flutter:Latrl+shift+P,在顶部搜索框中输⼊ Flutter:Launch Emulator,
它会弹出你设备上的虚拟机或者真机设备,你可以选择任意设备运⾏查看你的项⽬界⾯
使⽤ios模拟器⽰例:
1:xcode下载好之后,在终端执⾏以下命令打开模拟器

open -a Simulator 
06/04/2022 14:49 下午 posted in  Flutter

创建flutter项目命令

打开终端,cd 项目目录,然后输入以下命令

1、创建Flutter项目

flutter create 项目名字
flutter create --org com.example 项目名字
flutter create -i <objc或者swift> -a <kotlin或者java> 项目名字
flutter create -i <objc或者swift> -a <kotlin或者java> --org com.example 项目名字
flutter create --sample widgets.SliverFillRemaining.1  wigsfr1
flutter create --sample widgets.Navigator.1  wigsfr1
flutter create --sample widgets.SliverFillRemaining.2  wigsfr1
flutter create --sample widgets.SliverFillRemaining.3  wigsfr1
flutter create --sample widgets.SliverFillRemaining.4  wigsfr1

--org表示指定bundleId或者包名
-i 和 -a 表示设置语言(iOS默认是swift,android默认是kottlin)
--sample表示创建示例文档

2、创建Flutter组件包
如果要在项目的某个目录下创建一个模块,需要先进入这个目录

flutter create -t module --org com.example 组件名字
module表示要创建的是一个组件而不是完整的app

3、创建插件包

flutter create --template=plugin  --org com.example --platforms android,ios 插件名字
flutter create -i objc -a java  --template=plugin  --org com.example --platforms android,ios 插件名字

--template=plugin表示创建的是跟原生有交互的插件
--platforms表示指定平台

4、创建Dart包
flutter create --template=package 插件名字
--template=package表示创建的是纯dart语言的插件
注意:--template=package,等号两边不能有空格,纯Dart库是不会自动创建example项目的,但可以在库文件夹里自己创建一个example项目 然后在pubspec.yaml通过路径引用

06/04/2022 14:45 下午 posted in  Flutter

flask 数据库迁移 flask-migrate 的使用

Flask-Migrate是一个为Flask应用处理SQLAlchemy数据库迁移的扩展,使得可以通过Flask的命令行接口或者Flask-Scripts对数据库进行操作。

Read more   05/22/2022 12:33 下午 posted in  Python

iOS - CloudKit 基础

关于CloudKit开发的基础说明

Read more   04/29/2022 08:26 上午 posted in  apple

如何在Ubuntu 18.04上使用uWSGI和Nginx为Flask应用程序提供服务

说明:

在本指南中,您将使用Ubuntu 18.04上的Flask微框架构建Python应用程序。本文的大部分内容将涉及如何设置uWSGI应用程序服务器以及如何启动应用程序以及如何配置Nginx以充当前端反向代理。

Read more   12/02/2021 14:18 下午 posted in  Python