xujing 发布的文章

最近在使用甲骨文云的免费VPS进行搭建Web服务器,过程也是一波三折,有几个坑,记录一下,希望有遇到相同问题的朋友能避过;

  1. 如果操作系统选择的ubantu,请不要选择最新的22版本,因为22版本在连接的时候会报错,无法连接,请选择20.04,可以正常连接;
  2. 甲骨文云的免费VPS只提供密钥方式连接,所以在创建VPS时,如果本地没有密钥对可用,一定要记住下载他的公钥和私钥,否则以后连接会非常麻烦;
  3. 搭建Web服务器免不了要打开80,443端口,这里需要要VPS的管理界面找到 “主要 VNIC”--“子网:xxx”,点击连接,进入界面,点击“安全列表”,添加入站规则,把80,443都添加进去,如果你觉得到这一步就完事了,那可就错了,你会发现,你的网站依然无法打开,接下来,还需要在ubantu里打开端口,具体命令如下:

    sudo iptables -I INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -I OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
    sudo iptables -I INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -I OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
    这样才能打开端口,网站才能正确运行。

在项目编辑的时候,遇到一个问题,一直报错,

> Failed to apply plugin 'com.android.internal.application'.
> Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.

后来查阅了一下资料,原来可以针对不同项目设置不同的JDK,像以下这样设置,就可以了,记录一下。
2022-10-12T02:54:17.png

最近项目中接了一个第三方的SDK,SDK的提供方为了能让开发人员在xcode模拟器下也可以运行调试,所以在一些framework中包含了x86_64框架,可是如果打iOS包的话,这里可以通过把“Validate Workspace”设置为“YES”来解决打包报错的问题,可以正常出包了。(“Validate Workspace”的设置请参考下图)
2022-10-10T02:48:33.png

但是新的问题出现了,就是在苹果后台上传包里会报错,如下:

Asset validation failed (90087)
Unsupported Architectures. The executable for XXXX.app/Frameworks/AgoraRtcWrapper.framework contains unsupported architectures '[x86_64]'. (ID: 643f96cf-cd6b-4ad6-bc53-ebb77eab54dd)

说这个库里包含了不支持的框架,上传失败,此时我们需要做的是,把这个x86_64的框架从这个framework中删除,再重新打包;

在mac下,我们可以直接使用lipo -info 来查看framework包含哪些框架,例如上面这个

 lipo -info AgoraRtcWrapper.framework/AgoraRtcWrapper

会输出

AgoraRtcWrapper.framework/AgoraRtcWrapper are: armv7 x86_64 arm64 

可以看到确实包含了x86_64框架,那如何删除x86_64框架呢?还是用lipo命令,如下:

lipo -remove x86_64 AgoraRtcWrapper.framework/AipBase -o AgoraRtcWrapper.framework/AipBase

这样就可以把x86_64删除之后,再写回到原来的路径,最后我们再查看一下删除了x86_64的库,如下:

AgoraRtcWrapper.framework/AgoraRtcWrapper are: armv7 arm64

这里只剩下了armv7 arm64了。重新打包,这里已经不需要把“Validate Workspace”设置为“YES”了,打包后,上传,一次通过。

在要Unity Editor下查找一个资源,是否被其它预制(prefab)引用,AssetDatabase并没有给出现成的API,AssetDatabase只能查找一个游戏对象依赖了哪些资源,我们可以在启动的时候,使用AssetDatabase对每个资源建议反向索引,再进行查找,但是建议反向索引的过程还是比较耗时的,项目越大,资源越多,耗时越久。
这样的方式虽然能达到查找资源被依赖的目的,但是还不够高效,下面我们讲一下,在Mac系统下,使用系统索引的方式,快速进行资源被依赖的方法,可以在1秒内,找到资源的被依赖对象,因为Mac系统已经为文件建立好了索引,所以可以直接使用,以下是已经集成好的代码工具,可以拷贝到项目里直接使用,上代码:

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class FindProject
{
#if UNITY_EDITOR_OSX
    private static string _curFileName;
    private static readonly List<string> References = new List<string>();

    private static bool _canOutResult;
    private static string _selectedAssetPath;
    
    [MenuItem("Assets/Find References In Project", false, 2000)]
    private static void FindProjectReferences()
    {
        var appDataPath = Application.dataPath;
        _selectedAssetPath = AssetDatabase.GetAssetPath(Selection.activeObject);
        

        _curFileName = Path.GetFileName(_selectedAssetPath);

        var guid = AssetDatabase.AssetPathToGUID(_selectedAssetPath);

        var psi = new System.Diagnostics.ProcessStartInfo
        {
            WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized,
            FileName = "/usr/bin/mdfind",
            Arguments = "-onlyin " + Application.dataPath + " " + guid,
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        };
        
        EditorApplication.update += OnUpdate;

        var process = new System.Diagnostics.Process();
        process.StartInfo = psi;

        process.OutputDataReceived += (sender, e) =>
        {

            if (string.IsNullOrEmpty(e.Data))
            {
                _canOutResult = true;
            }
            else
            {
                var fileName = Path.GetFileName(e.Data);

                if (fileName.Contains(_curFileName))
                {
                    return;
                }

                var relativePath = "Assets" + e.Data.Replace(appDataPath, "");
                References.Add(relativePath);
            }

        };
        process.ErrorDataReceived += (sender, e) =>
        {
            if (string.IsNullOrEmpty(e.Data))
                return;

            // output += "Error: " + e.Data + "\n";
        };
        process.Start();
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();
    }
    
    private static void OnUpdate()
    {
        if (!_canOutResult) return;
        _canOutResult = false;
        
        var rawObj = AssetDatabase.LoadAssetAtPath<Object>(_selectedAssetPath);
        Debug.Log($"<color=aqua><b>{References.Count}</b></color> 个对象引用了 <color=fuchsia><b>{_curFileName}</b></color>", rawObj);
        
        foreach (var file in References)
        {
            var findObj = AssetDatabase.LoadAssetAtPath<Object>(file);
            Debug.Log( $"<color=lime>引用者:</color> <color=yellow>{file}</color>", findObj);
        }
    }

#endif
}

点击ESC进入“正常模式”,然后输入“:”,进入“命令模式”。此时屏幕的下方会出现一个冒号,你可以输入以下命令,并按“ENTER”执行:

:q ,退出(:quit的缩写)

:q!,退出且不保存(:quit!的缩写)

:wq,保存并退出

:wq!,保存并退出即使文件没有写入权限(强制保存退出)

:x,保存并退出(类似:wq,但是只有在有更改的情况下才保存)

:exit,保存并退出(和:x相同)

:qa,退出所有(:quitall的缩写)

:cq,退出且不保存(即便有错误)

你也可以直接在“正常模式”下输入“ZZ”来保存并退出Vim(和:x相同),或者“ZQ”不保存并退出(和:q!相同)注意此处ZZ大写和小写是完全不同的。

Vim还有一个帮助菜单,可以通过“:help”调出来,基本能够解决你的绝大多数问题。

Vim常用命令


1.移动光标

  • j:向下
  • 20j: 向下移动 20 行
  • k:向上
  • h:向左
  • l:向右
  • 0:到行首
  • ^:到行首第一个字符,如果前面有空格的话
  • $:到行尾
  • gg:快速到文件头
  • G:快速到文件尾
  • 50G:跳转到第 50 行

    请不要在插入模式进行光标移动,效率很低下。

2.复制

  • yy:复制一行
  • 8yy:向下复制8行
  • yw:复制光标开始的一个单词
  • y$:复制光标到行尾
  • yfA:复制光标到第一个大写A中间的内容
  • y2fA:复制光标到第二个大写A中间的内容

3.剪切

  • x:向后剪切一个一个字符,如果是在行尾,则为向前剪切
  • 4x:剪切4个
  • xp:非行尾交换两个字符,如从bs变成sb

4.删除

  • dd:删除一行
  • 100dd:删除100行
  • dw:删除一个单词
  • df":删除到出现的第一个双引号
  • d^:删除至行首
删除的内容会放到剪贴板,按p即可粘贴到其他地方。

5.粘贴

  • p:粘贴复制或剪切的内容
  • 5p:将复制或剪切的内容粘贴5次

6.替换和撤销

  • r+<待替换字母>:将游标所在字母替换为指定字母
  • R:连续替换,直到按下Esc
  • cc:替换整行,即删除游标所在行,并进入插入模式
  • cw:替换一个单词,即删除一个单词,并进入插入模式
  • u{n}:撤销一次或n次操作
  • U(大写):撤销当前行的所有修改
  • Ctrl+r:redo,即撤销undo的操作

7.退出编辑器

  • wq:保存当前文件并退出
  • wqa:保存所有文件并退出
  • q!: 不保存,强制退出
  • qa!: 有多个文件被打开,同时退出

以下命令请在命令模式下执行

在普通模式下,输入:即可进入。

调整文本

  • %s/$/sth/ :在行尾追加sth
  • %s/^M//g :替换掉dos换行符,^M使用ctrl+v + Enter即可输入
  • :g/^\s$/d* :删除空行以及只有空格的行
  • %s/#.*//g :删除#之后的字符
没错,这里使用的是正则。
  • ce:使本行文本内容居中
  • ri:使本行文本内容靠右
  • le:使本行文本内容靠左

查找字符串

在普通模式下,按下/直接进入查找,输入相应的字符串按确定即可

  • n:查找下一个匹配
  • N:查找上一个匹配
  • 2n:查找下面第二个匹配