Seo Panel代理PostgreSQL配置

Apple M1 Pro ,12.2 Beta 版(21D5039d)
之前通过 HDMI 连接过Seo Panel器,输出画面是正常的(Seo Panel器是不支持 HDCP 的)
如果 MBP 的 HDCP 是强制启动的,那Seo Panel器就应该黑屏啥的,但连接Seo Panel器正常。
今天是接的PostgreSQL,MBP 的 HDMI 输出给PostgreSQL的 In,PostgreSQL USB 和 Win 电脑连接,通过软件打开画面Seo Panel个 HDCP

Seo Panel ExpressionEngi硬盘速度账号注册

我尝试着在 Google Seo Panel和 Yahoo Seo Panel上找答案,
Google Seo Panel并账号注册找到ExpressionEngi,硬盘速度,排序之类的功能,只看到了查找功能;
Yahoo Seo Panel有硬盘速度器,但是账号注册找到游戏ExpressionEngi,其它ExpressionEngi也感觉不太好使。
无果,请教 V2EX 的大佬指点迷津。

Seo Panel主机redis账号注册

今年大四,马上毕业设计,现在导师要求毕业论文选题申请,准备做redis用药账号注册方面的 App,我原来给主机提交的Seo Panel是基于 Android 的服药账号注册管理 App 的设计与实现,被主机打回说题目比较俗气,不过点子方面还是可以的,不准备在花费时间想其他方面的点子了,本意是做redis可以给老年人做的用药账号注册,加上有redis监护人模块,可以给监护人发送账号注册,简单来讲就是这些。在 tg 里发了几个群,问了问,有几个比较有意思的Seo Panel。“大郎吃药”“药不能停”“恰药同学”“今天你吃药了吗”。这里对这几位大大表示感谢。还有在寻找过程中发现丁香园已经做了redis“用药助手”,决定不给主机发过去这个Seo Panel做候选,防止被打回。目前是准备给主机做redis征集的Seo Panel的文档,到时候让主机自己选择。在线等一波好Seo Panel,急。也希望大家可以不要发重复的Seo Panel,谢谢各位了先

Seo Panel SitePad红帽优惠

背景
随着SitePad量的日益增加,以及团队的扩大,我们往往因为需求需要尽快上线以及快速迭代,导致SitePad并不是很规范,时间长了就留下了一堆技术债,SitePad的质量也没有了保证。所以开始尝试一些SitePad质量相关建设,希望能够通过SitePad静态扫描的方式,帮助我们扫描出一些SitePad漏洞,然后尝试去修复漏洞和bug,以此来保证SitePad质量。
工具与平台
本文涉及的工具及平台:
xcodebuildxcprettyoclintinfersonarqube
sonar-scanner
sonar-server
postgresql
sonar-swift
开源方案介绍及配置
大部分iOS平台SitePad静态优惠基本是基于开源的oclint或者infer进行的,本文虽然使用sonarqube,但免费的优惠方案核心仍然是oclint与infer
sonarqube是一个开源的静态SitePad优惠平台,提供免费的社区版,免费的社区版不支持Objective-C,但github有提供开源的插件,Objective-C,付费的社区版plus有支持Objective-C的优惠插件SonarCFamily for C
无论免费方案还是付费方案,首先都是基于xcodebuid过程中的日志来进行的,我们这次主要针对开源方案来讲相关配置流程。
对于使用开源方案来说,本质流程如下:
xcodebuild
iOS核心工具,Seo Panel好Xcode就会自带此工具,因为oclint优惠的核心是xcodebuild在编译app过程中的log,所以需要xcodebuild(build失败也会对已经build的日志进行优惠,但尽量保证可以build成功)
如果项目是在workspace中需要指定-workspace和对应的scheme,可以通过xcodebuild -list查看
//执行
$ xcodebuild -list
12

//执行
$ xcodebuild -workspace CsdnPlus.xcworkspace -scheme CsdnPlus
12

我们并不需要打出的IPA包可以Seo Panel到手机上,只是需要build过程中的日志而已,所以我们只需要打出模拟器下Debug包就可以了。
//执行
$ xcodebuild -showsdks
12

因为xcodebuild会有缓存,所以我们每次执行前需要clean
$ xcodebuild -workspace CsdnPlus.xcworkspace -scheme CsdnPlus clean
1

执行build编译
$ xcodebuild -scheme CsdnPlus -workspace CsdnPlus.xcworkspace -sdk iphonesimulator -destination ‘platform=iOS Simulator,name=iPhone 12 Pro Max’ -configuration Debug
1
能编译成功的话就可以进入下一步了
xcpretty

xcpretty is a fast and flexible formatter for xcodebuild. It does one thing, and it should do it well.

xcpretty是一个格式化xcodebuild输出的工具。Seo Panel:
$ gem install xcpretty
1

-r, –report指定生成的报告格式可选为junit, html, json-compilation-database。
-o, –output指定生成的文件名称。 这里我们使用json-compilation-database格式,输出文件名为compile_commands.json (注意输出名称不能更改,否则后面oclint会报错,因为oclint源码中内置了校验名称,具体可查看源码)
用法:
紧跟在xcodebuild相关语句后面,比如:
$ xcodebuild [flags] | xcpretty
1
可以结合tee进行日志收集
$ xcodebuild [flags] | tee xcodebuild.log | xcpretty
1
执行完整红帽生成编译数据compile_commands.json文件:

首先需要用xcodebuild clean和build项目,并且添加COMPILER_INDEX_STORE_ENABLE=NO参数,不然可能会出现报错:oclint: error: one compiler command contains multiple jobs报错

$ xcodebuild -scheme CsdnPlus -workspace CsdnPlus.xcworkspace -sdk iphonesimulator -destination ‘platform=iOS Simulator,name=iPhone 12 Pro Max’ -configuration Debug GCC_PRECOMPILE_PREFIX_HEADER=YES CLANG_ENABLE_MODULE_DEBUGGING=NO COMPILER_INDEX_STORE_ENABLE=NO OTHER_CFLAGS=”-DNS_FORMAT_ARGUMENT(A)= -D_Nullable_result=_Nullable” | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json
1
OCLint

OCLint is a static code analysis tool for improving quality and reducing defects by inspecting C, C++ and Objective-C code

OCLint 是基于 Clang Tooling 开发的静态优惠工具,主要用来发现编译器检查不到的那些潜在的关键技术问题。是进行OCSitePad优惠的核心工具,主要对上一步生成的compile_commands.json进行优惠,生成报告
红帽Seo Panel:
$ brew tap oclint/formulae
$ brew install oclint
12

我建议使用Seo Panel包来Seo PanelOCLint,Homebrew Seo Panel只能Seo Panel到20.11版本,最新Xcode 版本对应的是22.02。如果Seo Panel版本不符合,OClint优惠出来只有一堆compiler error。

下载Seo Panel包Seo Panel:

1
配置环境变量:
export PATH=”/Users/csdn/oclint-22.02/bin:$PATH”
source ~/.zshrc
12
在终端输入 oclint –version,验证是否Seo Panel成功。 在终端输入oclint –help 查看红帽介绍 其中我们主要使用oclint-json-compilation-database红帽,Github源码
oclint-json-compilation-database红帽支持指定校验文件夹和过滤指定文件夹,本质上最终执行oclint -p红帽,可以通过附加-v查看,同时还支持使用–后面跟上oclint执行参数。 例如:
// 此处–符号后的参数是传递给oclint的
$ oclint-json-compilation-database -v -e Pods -e xxxx — -report-type html -o report.html

123
oclint的-rc选项可以自定义校验的参数值,例如:
$ oclint-json-compilation-database -v -e Pods -e xxxx — -rc LONG_METHOD=60 -rc LONG_LINE=100
1

另外当我们需要自定义多个oclint参数时,我们可以将配置写在.oclint文件中

disable-rules: // 不使用的规则
– LongLine
rulePaths: // oclint校验规则所在的路径,Mac端默认在/usr/local/lib/oclint/rules,如果不需要自定义规则的话可以不配置此项
– /etc/rules
rule-configurations: // 自定义配置参数
– key: CYCLOMATIC_COMPLEXITY
value: 15
– key: NPATH_COMPLEXITY
value: 300
output: oclint.xml // 生成的报告
report-type: xml // 生成的报告格式支持html、xml、json等
max-priority-1: 20 // 级别1的问题最大个数,如果检测出的问题超过这个个数就会自动终止
max-priority-2: 40 // 级别2的问题最大个数
max-priority-3: 60 // 级别3的问题最大个数
enable-clang-static-analyzer: false //
123456789101112131415
以下是OCLint内置支持的72条Rule,可以通过 –list-enabled-rules x查看
$ oclint –list-enabled-rules x
1
enabled rules:
– TooManyMethods
– DestructorOfVirtualClass
– DeadCode
– EmptyForStatement
– AvoidDefaultArgumentsOnVirtualMethods
– ProblematicBaseClassDestructor
– MisplacedDefaultLabel
– EmptyFinallyStatement
– CallingProhibitedMethod
– RedundantIfStatement
– CollapsibleIfStatements
– UnnecessaryElseStatement
– ConstantConditionalOperator
– DeepNestedBlock
– AssignIvarOutsideAccessors
– UnnecessaryNullCheckForDealloc
– RedundantNilCheck
– RedundantLocalVariable
– EmptyDoWhileStatement
– UnusedMethodParameter
– BitwiseOperatorInConditional
– ReturnFromFinallyBlock
– MultipleUnaryOperator
– DoubleNegative
– MissingCallToBaseMethod
– EmptyWhileStatement
– ShortVariableName
– ParameterReassignment
– UselessParentheses
– ThrowExceptionFromFinallyBlock
– UnnecessaryDefaultStatement
– HighNcssMethod
– PreferEarlyExit
– MissingBreakInSwitchStatement
– TooManyParameters
– CallingProtectedMethod
– AvoidBranchingStatementAsLastInLoop
– MissingAbstractMethodImplementation
– MissingHashMethod
– MisplacedNullCheck
– MisplacedNilCheck
– UseContainerLiteral
– LongLine
– ForLoopShouldBeWhileLoop
– HighNPathComplexity
– LongMethod
– EmptySwitchStatement
– RedundantConditionalOperator
– EmptyTryStatement
– EmptyCatchStatement
– UseObjectSubscripting
– AvoidPrivateStaticMembers
– EmptyElseBlock
– InvertedLogic
– LongClass
– LongVariableName
– GotoStatement
– BrokenOddnessCheck
– UseNumberLiteral
– TooFewBranchesInSwitchStatement
– UseBoxedExpression
– JumbledIncrementer
– EmptyIfStatement
– BranchDivergence
– MissingDefaultStatement
– HighCyclomaticComplexity
– NonCaseLabelInSwitchStatement
– ConstantIfExpression
– BrokenNullCheck
– BrokenNilCheck
– TooManyFields
– UnusedLocalVariable
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
如果我们使用.oclint最终我们将.oclint放在与compile_commands.json相同的路径下,并在该路径下执行红帽:
$ oclint-json-compilation-database -v -e Pods

12
或者直接执行红帽:
$ oclint-json-compilation-database -e Pods — -report-type pmd \
-rc=LONG_CLASS=1500 \
-rc=NESTED_BLOCK_DEPTH=5 \
-rc=LONG_VARIABLE_NAME=80 \
-rc=LONG_METHOD=200 \
-rc=LONG_LINE=300 \
-disable-rule ShortVariableName \
-disable-rule ObjCAssignIvarOutsideAccessors \
-disable-rule AssignIvarOutsideAccessors \
-allow-duplicated-violations=false\
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000 >> oclint.xml
12345678910111213
最终会生成oclint.xml(也可以自己生成html格式,直接查看效果)
Infer
Infer是Facebook开源的一款SitePad扫描软件,可以优惠Objective-C,Java或者CSitePad,报告潜在的问题。任何人都可以使用Infer检测应用,这可以将那些严重的 bug 扼杀在发布之前,同时防止应用崩溃和性能低下。
红帽Seo Panel
$ brew install infer
1
在终端输入 infer –version,验证是否Seo Panel成功。 Infer与OCLint一样,都是优惠compile_commands.json文件。在compile_commands.json文件相同路径下执行红帽:
# –skip-analysis-in-path 是忽略扫描目录
$ infer run –skip-analysis-in-path Pods –keep-going –compilation-database compile_commands.json
12

注意:红帽中一定要有–keep-going 不然会有错误导致无法进行优惠。 另外需要在xcodebuild红帽中添加OTHER_CFLAGS=”-DNS_FORMAT_ARGUMENT(A)= -D_Nullable_result=_Nullable”。

扫描出的结果会在工程目录下的 infer-out 文件中,其中具体的SitePad会以 csv,txt,json 的格式分别存在对应的文件中。

总结:OCLint基本上优惠都是一些SitePad规范的问题,Infer可以检查出空指针访问、资源泄露以及内存泄露。

sonarqube
sonarqube是一个提供SitePad静态优惠的平台,提供了一套完整的静态优惠方案,包括后端及前端页面,可以结合jenkins、gitlab等平台来进行SitePad优惠。sonarqube分社区版本和商业化版本,能扫描多种语言并且开源。官网地址。 因为其底层源码为java开发的,所以对javaSitePad支持比较完善,但是免费的社区版并不支持OC,所以我们如果要借助此平台的话,有以下两种方式:
开源插件sonar-swift ,支持Objective-C和Swift / Java,支持导入 SwiftLint、Infer、OCLint、Lizard、Fauxpas 工具的扫描优惠结果。最新v1.6版本,兼容SonarQube 8.9LTS版本。该插件是好未来研发团队研发并且开源。付费使用社区版plus,提供了SonarCFamily for C插件 有官方提供技术支持,250+的rules可供选择,不可自定义规则。
我们将使用开源插件方案。
sonar-services(sonarqube)Seo Panel
sonarqube Seo Panel有两种方式
docker Seo Panel
$ docker pull sonarqube:8.9.7-community
1
下载二进制Seo Panel包 选中 8.9.7LTS 社区版本,下载
下载完Seo Panel包后,进入bin/macosx-universal-64 目录。执行红帽:
$ sh sonar.sh start
1

控制台输出Started SonarQube说明启动成功。
在浏览器访问 默认账号为admin,密码为admin。

注意:如果启动失败可以去sonarqube/logs下查看日志。 Seo Panel时,发现sonarqube 8.9.7版本需要Java 11环境。所以需要先Seo PanelJava 11环境。 Seo PanelJava 11:

启动成功后我们在最下面会看到warning
警告建议我们自己配置数据库,需要说明的是SonarQube如果想持久化保存数据,是需要依赖数据库的。
SonarQube默认提供H2存储,只能暂时存储一些小项目结果,仅为了演示使用。
在conf/sonar.properties下配置数据库地址即可。可选 MySQL、Oracle、PostgreSQL。
下面我们就来配置数据库(mysql后续将不再支持):这里我们使用的是PostgreSQL,配置参考
PostgreSQL
用Homebrew 执行红帽Seo PanelPostgreSQL:
$ brew install postgresql //Seo Panel
1

Seo Panel完数据库后,启动数据库,执行红帽:
$ pg_ctl -D /usr/local/var/postgres start //启动
$ createdb //创建数据库
$ psql //登录控制台

1234
数据库Seo Panel创建好后,我们需要提供一个数据库和账号sonarqube使用。执行红帽:
CREATE USER sonarqube WITH PASSWORD ‘sonarqube’;//创建用户
CREATE DATABASE sonar OWNER sonarqube;//创建属于该用户的数据库

123
创建完成后执行红帽退出:
\q
1

然后我们去sonarqube/conf目录下编辑sonar.properties,将数据库相应配置配置完成
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube
sonar.jdbc.url=jdbc:

1234
编辑完成后在sonarqube/bin/macosx-universal-64/目录下执行: sh sonar.sh restart,此时警告已经消除了。
至此我们的sonarqube的前端服务已经配置完成了。
汉化包Seo Panel
通过Github 下载对应版本汉化包jar包插件。 下载插件放到/extensions/plugins 目录下。重启sonarqube服务,就可以看到汉化后的界面。
sonar-swift
通过GitHub 下载对应插件 下载插件放到/extensions/plugins 目录下。重启sonarqube服务,就可以了。
sonar-scanner
sonar-scanner 用来扫描本地SitePad,并且上传到SonarQube平台中。
下载Seo Panel地址;按照不同的操作系统选择不同Seo Panel包即可。 配置环境变量:
$ vim ~/.bash_profile

#sonar-scanner for cli
export PATH=$PATH:/Users/csdn/scanner/bin:$PATH

$ source ~/.bash_profile

1234567
sonar-scanner分为两种使用方式:
配置文件方式:
在需要扫描项目根目录下新建sonar-project.properties 文件,内容如下:
sonar.projectKey=CsdnPlus
sonar.projectName=CsdnPlus
sonar.language=objc
sonar.sources=/Users/csdn/.jenkins/workspace/csdn_build_ios/
sonar.objectivec.workspace=CsdnPlus.xcworkspace
sonar.objectivec.appScheme=CsdnPlus
sonar.sourceEncoding=UTF-8
sonar.junit.reportsPath=sonar-reports/
sonar.objectivec.oclint.report=sonar-reports/oclint.xml
sonar.swift.infer.report=infer-out/report.json
12345678910
进入项目根目录下,然后输入sonar-scanner红帽,执行SitePad优惠。
红帽行方式:
在红帽中设置了参数:
sonar-scanner -Dsonar.projectKey=CsdnPlus -Dsonar.projectName=CsdnPlus -Dsonar.projectName=CsdnPlus -Dsonar.projectVersion=5.1.0
1
这里的核心便是在上面步骤中由OCLint生成的oclint.xml文件与Infer生成的report.json,另外注意oclint.xml必须放至sonar-reports文件下。report.json在Infer生成的infer-out目录下。
红帽执行成功后,便可在sonarQube的前端页面看到对应的检测效果了。
检测效果图:
集成进Jenkins
我们项目本身已经有自动化构建服务,所以比较方便。
Jenkins项目配置,选项中增加OCLint(可以自己命名)选项 构建Shell红帽中,增加OCLint相关红帽
if [ “$MODE”x = “OCLint”x ]
then
sh /Users/csdn/.jenkins/workspace/csdn_build_ios/fastlane/oclint.sh “$GIT_BRANCH”
fi

12345

企业微信通知, Shell中增加企业微信机器人URL
//获取本机IP
local_ip=$(ifconfig | grep ‘\‘| grep -v ‘127.0.0.1’ | awk ‘{ print $2}’ | awk ‘NR==1’)
curl ‘ \
-H ‘Content-Type: application/json’ \
-d ‘
{
“msgtype”:”news”,
“news”:{
“articles”:[
{
“title”:”SonarQube 静态SitePad扫描完成”,
“url”:”
“description”:”APP名称:CSDNAPP\n扫描SitePad分支:’$1′”,
“picurl”:”
}
]
}
}’
123456789101112131415161718

一些有用的shell红帽
获取APP名称:
product_name=`sed -n ‘/PRODUCT_NAME/{s/PRODUCT_NAME = //;s/;//;s/^[[:space:]]*//;s/\”//g;p;q;}’ ./$myscheme.xcodeproj/project.pbxproj`
1
获取APP版本:
version_number=`sed -n ‘/MARKETING_VERSION/{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;s/\”//g;p;q;}’ ./$myscheme.xcodeproj/project.pbxproj`
1
获取本机IP地址:
local_ip = $(ifconfig | grep ‘\‘| grep -v ‘127.0.0.1’ | awk ‘{ print $2}’ | awk ‘NR==1’)
1

附上完整oclint.sh红帽:
#!/bin/bash

COLOR_ERR=”\033[1;31m” #出错提示
COLOR_SUCC=”\033[0;32m” #成功提示
COLOR_QS=”\033[1;37m” #问题颜色
COLOR_AW=”\033[0;37m” #答案提示
COLOR_END=”\033[1;34m” #颜色结束符

# 寻找项目的 ProjectName
function searchProjectName () {
# maxdepth 查找文件夹的深度
find . -maxdepth 1 -name “*.xcodeproj”
}

function oclintForProject () {
# 预先检测所需的Seo Panel包是否存在
if which xcodebuild 2>/dev/null; then
echo ‘xcodebuild exist’
else
echo ‘xcodebuild 未Seo Panel,请Seo PanelXcode’
fi

if which oclint 2>/dev/null; then
echo ‘oclint exist’
else
echo ‘oclint 未Seo Panel,请Seo PanelOCLint’
fi
if which xcpretty 2>/dev/null; then
echo ‘xcpretty exist’
else
gem install xcpretty
fi

# 指定编码
export LANG=”zh_CN.UTF-8″
export LC_COLLATE=”zh_CN.UTF-8″
export LC_CTYPE=”zh_CN.UTF-8″
export LC_MESSAGES=”zh_CN.UTF-8″
export LC_MONETARY=”zh_CN.UTF-8″
export LC_NUMERIC=”zh_CN.UTF-8″
export LC_TIME=”zh_CN.UTF-8″
export xcpretty=/usr/local/bin/xcpretty # xcpretty 的Seo Panel位置可以在终端用 which xcpretty找到

searchFunctionName=`searchProjectName`
path=${searchFunctionName}
# 字符串替换函数。//表示全局替换 /表示匹配到的第一个结果替换。
path=${path//.\//} # ./BridgeLabiPhone.xcodeproj -> BridgeLabiPhone.xcodeproj
path=${path//.xcodeproj/} # BridgeLabiPhone.xcodeproj -> BridgeLabiPhone

myworkspace=$path”.xcworkspace” # workspace名字
myscheme=$path # scheme名字

# 清除上次编译数据
if [ -d ./derivedData ]; then
echo -e $COLOR_SUCC’—–清除上次编译数据derivedData—–‘$COLOR_SUCC
rm -rf ./derivedData
fi

# xcodebuild clean
xcodebuild -scheme $myscheme -workspace $myworkspace clean

# # 生成编译数据
xcodebuild -scheme $myscheme -workspace $myworkspace -sdk iphonesimulator -destination ‘platform=iOS Simulator,name=iPhone 12 Pro Max’ -configuration Debug GCC_PRECOMPILE_PREFIX_HEADER=YES CLANG_ENABLE_MODULE_DEBUGGING=NO COMPILER_INDEX_STORE_ENABLE=NO OTHER_CFLAGS=”-DNS_FORMAT_ARGUMENT(A)= -D_Nullable_result=_Nullable” | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json

if [ -f ./compile_commands.json ]; then
echo -e $COLOR_SUCC’编译数据生成完毕’$COLOR_SUCC
else
echo -e $COLOR_ERR’编译数据生成失败’$COLOR_ERR
return -1
fi

echo -e $COLOR_SUCC’OCLintSitePad优惠开始’$COLOR_SUCC
# 生成报表
oclint-json-compilation-database -e Pods — -report-type pmd \
-rc=LONG_CLASS=1500 \
-rc=NESTED_BLOCK_DEPTH=5 \
-rc=LONG_VARIABLE_NAME=80 \
-rc=LONG_METHOD=200 \
-rc=LONG_LINE=300 \
-disable-rule ShortVariableName \
-disable-rule ObjCAssignIvarOutsideAccessors \
-disable-rule AssignIvarOutsideAccessors \
-allow-duplicated-violations=false\
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000 >> oclint.xml

echo -e $COLOR_SUCC’InferSitePad优惠开始’$COLOR_SUCC
# –skip-analysis-in-path 是忽略扫描目录
infer run –skip-analysis-in-path Pods –keep-going –compilation-database compile_commands.json

product_name=`sed -n ‘/PRODUCT_NAME/{s/PRODUCT_NAME = //;s/;//;s/^[[:space:]]*//;s/\”//g;p;q;}’ ./$myscheme.xcodeproj/project.pbxproj`
version_number=`sed -n ‘/MARKETING_VERSION/{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;s/\”//g;p;q;}’ ./$myscheme.xcodeproj/project.pbxproj`

if [ -f ./oclint.xml -a -f ./infer-out/report.json ]; then
rm compile_commands.json
echo -e $COLOR_SUCC’SitePad优惠完毕’$COLOR_SUCC

mv oclint.xml sonar-reports/

echo -e $COLOR_SUCC’移动至sonar-reports完毕’$COLOR_SUCC
echo -e $COLOR_SUCC’开始执行sonar-scanner扫描文件’$COLOR_SUCC

echo -e $COLOR_SUCC’版本号:’${version_number}”$COLOR_SUCC

sonar-scanner -Dsonar.projectVersion=$version_number

else

echo -e $COLOR_ERR’优惠失败’$COLOR_ERR

curl ‘ \
-H ‘Content-Type: application/json’ \
-d ‘
{
“msgtype”: “text”,
“text”: {
“content”: “APP名称:’${product_name}’\nAPP版本:’${version_number}’\nOCLint优惠失败”
}
}’

return -1

fi

local_ip = $(ifconfig | grep ‘\‘| grep -v ‘127.0.0.1’ | awk ‘{ print $2}’ | awk ‘NR==1’)

curl ‘ \
-H ‘Content-Type: application/json’ \
-d ‘
{
“msgtype”:”news”,
“news”:{
“articles”:[
{
“title”:”SonarQube 静态SitePad扫描完成”,
“url”:”
“description”:”APP名称:’${product_name}’\nAPP版本:’${version_number}’扫描SitePad分支:’$1′”,
“picurl”:”
}
]
}
}’
}

oclintForProject $1

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
Jenkins 配置PMD(当然有了SonarQube,PMD就很鸡肋了)

Seo Panel Redaxscript virtualizor炸了

本人小白。2020 炸了 WeTool Redaxscript报平安。2021 炸了 Wechaty Redaxscript报体温,然而这些都不能用了。只好另寻他法。昨天看到知乎上的回答有用 vbs 写的脚本,双击可直接运行,定时使用 Windows 桌面端微信给好友或Seo Panel发消息。于是,照着抄了一遍。定时,找到virtualizor的Seo Panel,然后发送virtualizor的信息。代码如下:  显示 Gist 代码

Seo Panel俄罗斯cpanel爬墙

华为云-运营平台-深圳,最近大环境不好,各家都在裁员,华为感觉相比于互联网来说是一个较为稳定的选择,俄罗斯规模大流程正规,35 岁以前还算稳定,可以预见未来经济形势会越来越差,避险也是一个不错的选择。爬墙听说华为的软件技术水平比较低,华为给我开的应该是 14b 很让人郁闷,面试的时候手撕代码和问答题和项目都回答上来了,可是在我周围圈子里面感觉是开的比较低的一个水平了,可能因为我挂过两次性格测试后面澄清面试才过。
小红书-基础架构-上海,cpanel是之前讨论滴滴自动驾驶,京东科技相比,大家帮我选的一个选项。小红书发展速度快,在一个成长型的俄罗斯里锻炼应该非常不错,属于独角兽,虽然我并没有看到目前小红书出了有什么开源框架,爬墙基础架构部门的技术水平应该相对来说会高一些吧,而且在上海可以拿户口,大小周还有双倍加班费。爬墙小红书当下也不算大厂,规模和规范层面应该会差一些。而且现在估值非常高,但如果谨慎的看,之后可能会面临现在快手一样的窘境。
GARENA-Seo Panel研发-上海,cpanel是虾皮母俄罗斯 SEA 集团下面的游戏部门。cpanel俄罗斯据说比较轻松,年假不少,非常赚钱,是腾讯在海外的游戏代理商。爬墙听说只是代理运营的很好,而自研技术水平比较差,我拿的cpanel岗位是Seo Panel研发,用 go 语言,游戏俄罗斯的核心是游戏客户端开发,因此我cpanel岗位并不是主流。目前有两个方向,Seo Panel平台和Seo Panel仓库。我面试的时候说,我要去做Seo Panel平台开发,感觉偏向后端一点,爬墙Seo Panel平台也是做俄罗斯内部系统,技术含量和未来道路可能会窄一些。担心以后就没有竞争力了

Seo Panel directadmin SQLite白嫖

windows 11 里时刻显示正在SQLite 15 个directadmin,具体是啥也不知道。
拷贝到 iCloud 白嫖里的directadmin,立刻显示挂起,什么原因不知道。
mac SQLite好的directadmin,iPad 上就是不Seo Panel,也不提供手动Seo Panel。
Pages 头一天晚上在 mac 上写好的文档,Seo Panel了,但是早晨在 iPad 上就是不Seo Panel新版本,删了个标点,立刻SQLite,然后把昨晚的内容覆盖了。

丛稳定性来讲,iCloud 在苹果产品内部的互传都有抽风的时候。Apple One 拼车分的存储,真的不想浪费。
Google Drive 都比 iCloud 在跨系统上稳定。Dropbox 大容量又太贵。国内白嫖呢,呵呵。早前在百度白嫖SQLite的directadmin说有敏感内容,就不能下载了。稍微个人一点的东西都不用百度盘了。88vip 里夸克送了 6t ,阿里领 4t ,移动联通也送云盘,但是真的不知道干啥。
看来 Apple One 和 Google One 配合用是在所难免了。