Roger 2024-12-21T06:55:51+00:00 kejinlu@gmail.com iOS溯本求源一-将OC代码转写成C++代码 2024-04-13T00:00:00+00:00 Roger https://tjroger.github.io/2024/04/iOS溯本求源一-将OC代码转写成C++代码 bash xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp

##内容


]]>
一张图教你玩转平均数(平方平均,算数平均,几何平均,调和平均) 2024-03-26T00:00:00+00:00 Roger https://tjroger.github.io/2024/03/一张图教你玩转平均数(平方平均,算数平均,几何平均,调和平均) 起源

最近在了解电话机器人项目AIBoost时,接触到一个F1参数,培训师介绍到这个值是精准率和召回率的调和平均,不太明白它的计算方式,于是去搜索了一番,发现平均数还有这么多种类,在这里记录一下。

概念

平均数常用的,主要有平方平均(root mean square或quadratic mean )、算术平均(arithmetic mean)、几何平均(geometric mean)、调和平均(Harmonic mean),大小顺序依次递减,对于不相等的a,b,均比min(a,b)大,比max(a,b)小
图片来源于维基百科

如果AC = a, BC = b 则有OC = (a + b)/2 GM = sqrt(OC^2 - OG^2) = sqrt(ab) QM = sqrt(OQ^2 + OC^2) = sqrt((a^2 + b^2)/2)

GC/OC = OC/QC, \sqrt(ab) / (a+b) * 2 = hm / \sqrt(ab) HM = 2ab/(a+b)

调和平均数靠近最小值,有那种决定团体效能的取决于最慢/最小的个体的感觉。计算公式为 \(H(x_1, ..., x_n) = n/sigma\)


]]>
一篇文章教你学会如何区分准确率、精准率、召回率,F1分值以及它们的含义 2024-03-19T00:00:00+00:00 Roger https://tjroger.github.io/2024/03/一篇文章教你学会如何区分准确率、精准率、召回率,以及它们的含义 ##内容
准确率(Accuracy),精准率(Precision)和召回率(Recall)是分类问题中常用的三个评估指标。

准确率:指分类正确的样本数占总样本数的比例,包括真正例(TP)和真负例(TN)。准确率适用于类别平衡的情况,即正例和负例数量相当。

精准率:指预测为正例的样本中真正的正例比例,即真正例(TP)占所有预测为正例(TP+FP)的比例。精准率关注的是预测为正例的准确性。

召回率:指实际正例中被预测为正例的比例,即真正例(TP)占所有实际正例(TP+FN)的比例。召回率关注的是预测正例的覆盖度。

这三个指标之间存在一定的关系:提高精准率可能会降低召回率,反之亦然。因此,在实际应用中,需要根据具体需求来权衡这三个指标,以达到最佳的分类效果。

F1 Score/F-Measure是一个统计学中用来衡量二分类模型精确度的指标,同时兼顾了分类模型的准确率和召回率。

TP(True Positive, 真阳性):算法预测为正例(P),实际上也是正例(P)的个数,即算法预测对了(True)。
TN(True Negtive,真阴性):算法预测为负例(N),实际上也是负例(N)的个数,即算法预测对了(True)。
FP(False Positive,假阳性):算法预测为正例(P),实际上是负例(N)的个数,即算法预测错了(False)这里指的是:实际为负例但被分类器划分为正例的实例数。
FN(False Negtive,假阴性):算法预测为负例(N),实际上是正例(P)的个数,即算法预测错了(False)这里指的是:即实际为正例但被分类器划分为负例的实例数
Accuracy = (TP+TN)/(TP+FP+TN+FN)
Precision = TP / (TP+FP)
Recall = TP / (TP + FN)
F1 = 2 * (precision * recall) / (precision + recall)


]]>
一篇文章告诉你怎么使用Shell执行Python脚本内的某个函数(附定时任务攻略) 2024-03-14T00:00:00+00:00 Roger https://tjroger.github.io/2024/03/一篇文章告诉你怎么使用Shell执行Python脚本内的某个函数(附定时任务攻略) 问题

在自建汇率监控工具箱时遇到一个问题,定时任务要怎么根据不同场景调用同一个Python脚本不同的方法

解决过程

分成两步,如果能在Shell调用Python脚本的指定方法,那不就简单了么

第一步、于是在万能的互联网上先搜索,怎么在Shell调用Python

找到了shell执行python某个函数 这篇文章,它详细地介绍了使用inspect和importlib来实现调用某个方法的方法

import inspect
import importlib

def is_valid_function(module, function_name):
    if not hasattr(module, function_name):
        return False
    func = getattr(module, function_name)
    return inspect.isfunction(func)

def import_module(module_name):
    return importlib.import_module(module_name)

def call_function(module, function_name):
    func = getattr(module, function_name)
    return func()

def print_result(result):
    print(result)

if __name__ == "__main__":
    # 步骤1:输入函数名
    function_name = input("请输入要执行的函数名: ")

    # 步骤2:检查函数名的有效性
    module = import_module("your_module")  # 替换为你的模块名
    if not is_valid_function(module, function_name):
        print("函数名无效,请重新输入。")
        exit(1)

    # 步骤4:调用相应的函数
    result = call_function(module, function_name)

    # 步骤5:输出结果
    print_result(result)

上面是原实现,call_function可以再优化一下添加参数

def call_function(module, function_name, *args, **kwargs):
    func = getattr(module, function_name)
    return func(*args, **kwargs)

使用shell脚本直接调用上述脚本就可以间接实现调用Python脚本内某个函数了 #####终极方法 上述解决方案还需要额外写一个脚本,感觉一点不geek,于是继续寻找,最后找到了python -c 这个命令,它可以直接运行Python命令,于是

python -c "from your_module import your_function; your_function()"

完美实现shell运行Python脚本内的某个方法。 ####第二步定时任务调度crontab 大名鼎鼎的crontab大家应该都知道吧

30 * * * * cd /home/work/Liana/monitor && /usr/bin/python3 money.py 1 >> ~/.crontab.log 2>&1
30 08 * * * cd /home/work/Liana/monitor && /usr/bin/python3 -c 'from money import get_jpy_cny_rate; get_jpy_cny_rate(True)' 1 >> ~/.crontab.log 2>&1

这是我的生产环境部署的两条命令,就不详细介绍了。 完结,撒花


]]>
如何根据UUID确定dSYM文件 2021-07-12T00:00:00+00:00 Roger https://tjroger.github.io/2021/07/如何根据UUID确定DSYM文件 如何根据UUID确定dSYM文件

何为dSYM

dSYM是一个ELF(Executable and Linkable Format)文件,它包含了应用的DWARF(debugging with attributed record formats)调试信息。

  • 使用dSYM可以为崩溃分析提供源代码级别查阅。包含行号和源文件名等信息
  • dSYM必须和app一致,每次打包生成的都不一样。
  • 符号和app分离,增加逆向难度,减小app大小

计算dSYM的UUID

使用命令dwarfdump -u **.dSYM可以将UUID计算出来,将对应的dSYM上传到Crashlytics或者Bugly就可以还原出崩溃现场,轻松定位bug


]]>
如何给Swift Package Manager项目添加资源 2021-07-10T00:00:00+00:00 Roger https://tjroger.github.io/2021/07/如何给SPM添加资源 起因

在学习Image and Video Processing课程过程中,第一周的课程附加练习是实现一些图片的基础处理。 课程中推荐使用Matlab来实现,作为半个iOS开发者想使用Swift来实现,正好之前有了解到GPUImage和SPM,于是产生了借用GPUImage来在SPM中实现课程挑战的目标。

过程

背景

swift 5.3中引入了resource bundle概念,在target中添加resources可以引入。

创建项目

swift package init --type executable创建项目后始终无法引入资源

添加资源

.executableTarget(
            name: "gpuimageDemo",
            dependencies: [
            "GPUImage"
            ],
            resources: [
            .copy("Resources/Images/WID-small.jpg"),
            ]),

在参考了How to Add Resources in Swift Package Manager后仍然无法导入 最后在查看官网说明时发现需要没有将文件放入target目录下

引用资源

let imageUrl = Bundle.module.url(forResource: "WID-small", withExtension: "jpg")

最终目录结构

.
├── Package.resolved
├── Package.swift
├── README.md
├── Sources
│   └── gpuimageDemo
│       ├── NSImage.swift
│       ├── Resources
│       │   └── Images
│       │       └── WID-small.jpg
│       └── main.swift
└── Tests
    └── gpuimageTests
        └── gpuimageTests.swift

小结

  1. 资源必须放到target所在目录下
  2. 资源处理方式有.copy和.process。copy会直接拷贝,保存目录结构;process可能会对资源进行优化,优先使用

参考项目

@TJRoger/ImageProcessing

参考链接

  1. How to Add Resources in Swift Package Manager
  2. Bundling Resources with a Swift Package

扩展


]]>
thinkPHP在lnmp环境中的open_basedir问题解决 2021-06-30T00:00:00+00:00 Roger https://tjroger.github.io/2021/06/thinkphp_with_lnmp 问题描述

在部署php项目时报错,环境lnmp1.8, php7.4.19 require(): open_basedir restriction in effect. File(<path>/thinkphp/base.php) is not within the allowed path(s)

解决

查阅文档得知open_basedir是用来对PHP可以访问的目录进行限制的选项,默认php.ini设置为空。lnmp会开启跨目录保护的选项,设置在fastcgi.cnf中fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 通常在thinkPHP项目中会设置document_root为项目的public子目录,这样就导致上一级目录thinkphp中的base.php无法访问了。

方法一

最直接简单粗暴的方法就是将open_basedir注释掉,但这么操作太粗糙了,不值得记录。

方法二

我们可以将$document_root上一级的权限开放,配置改成 fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/../:/tmp/:/proc/"; 这是安全性中性的一种做法。

方法三

将public下的index.php移动到上级目录, 然后在nginx配置将root指向这个项目的根目录即可。下面给出一个index.php的范例

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

// [ 应用入口文件 ]
define('APP_DEBUG', true);
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
//定义配置文件目录
define('CONF_PATH', __DIR__ . '/conf/');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';

这是最安全的做法,推荐 —-

]]>
Go sFTP 2020-11-05T00:00:00+00:00 Roger https://tjroger.github.io/2020/11/go-sftp Go sFTP is an efficient tool for you to access your sFTP servers.

It’s small, fast, stable with a low price. You can easily upload and download files with it.

  • Full sFTP protocol support
  • RSA key auth support
  • Upload/Download/Delete
  • Securely stored connections
  • Simple UI, easy use, full functions
  • Super-fast transfer

And much more to find out, enjoy yourself!


]]>
国内使用Homebrew加速 2020-05-05T00:00:00+00:00 Roger https://tjroger.github.io/2020/05/speedup_brew brew

brew全称homebrew,可以说是目前MacOS上最好用的包管理工具,没有之一。类似于apt-getyum。由于种种原因在国内使用原版源速度会较慢,这是一个痛点,今天我们就来干掉它。

前言

请在运行 brew 前设置环境变量 HOMEBREW_BOTTLE_DOMAIN ,值为 https://mirrors.ustc.edu.cn/homebrew-bottles

对于 bash 用户:

echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile

对于 zsh 用户:

echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc

替换brew.git

替换USTC镜像:

cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

重置为官方地址:

cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git

替换homebrew-core.git

cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

替换homebrew-cask.git

cd "$(brew --repo)/Library/Taps/homebrew/homebrew-cask"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

参考

  1. mirrors
  2. bottles

]]>
Go Morse 2020-04-15T00:00:00+00:00 Roger https://tjroger.github.io/2020/04/Go_Morse
Go Morse is a small tool for turnning your ideas into morse, and speak it loudly.

Version history


v1.0, at 2020-04-14

  • text to morse translation
  • morse audio playing
  • dark mode optimized

About me


]]>