Mac OS 系统, 打开pycharm时右下角提示: xcrun: error: invalid active developer path, missing xcrun

 mac  Mac OS 系统, 打开pycharm时右下角提示: xcrun: error: invalid active developer path, missing xcrun已关闭评论
4月 092021
 

要解决此问题,请安装Xcode。如果您从事iOS App开发,则可以安装完整版本,它也将解决此问题。从Apple developers page下载Xcode .dmg文件。

如果你不使用xcode,则只需搜索Xcode的Command Line Tools(命令行工具包),然后下载.dmg文件并安装。

可以尝试下面的几个解决方案:

如果您不想下载任何内容,而只想在终端中运行一些命令来解决此问题,那么以下是适合您的命令:

xcode-select --install

这是可以在终端中运行的命令,它将为Xcode安装命令行工具。当您运行此命令时,系统将提示您接受许可证,同意条款和条件等。

 

也可以尝试下下面的命令后再使用上面的命令解决该问题:

xcode-select --reset

尽管这可以解决您的问题,但作为后续步骤,您可能需要设置命令行工具在不使用Xcode的情况下运行的路径。

xcode-select --switch /Library/Developer/CommandLineTools

如果在运行上述任何命令时遇到权限问题,请sudo与这些命令一起使用。例如,

sudo xcode-select --switch /Library/Developer/CommandLineTools

如果您已安装Xcode应用程序,请尝试运行以下命令:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

maven下产生一个包含依赖jar的可执行jar文件(create an executable JAR with dependencies using Maven)

 MAVEN  maven下产生一个包含依赖jar的可执行jar文件(create an executable JAR with dependencies using Maven)已关闭评论
4月 082021
 

想使用 java -jar xxx.jar 命令行直接执行一个可执行的jar包,而这个xxx.jar包是包含第三方的依赖包的,网上有许多文章描述如何修改pom.xml,但实际是没什么效果的,实验下来如下方法可以达到想要的效果:

 

  •  1.  pom.xml 的build下添加下列 plugin。
<build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.ouu.App</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>

    </plugins>
</build>
  • 2. 进入项目根目录, 在命令行下运行:

mvn clean compile assembly:single

这是在项目target目录下会产生一个xxxx-jar-with-dependencies.jar的可执行文件

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )(转)

 linux, shell  linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )(转)已关闭评论
4月 012021
 

网上看到的一篇关于shell下操作字符串的好文章,linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 ),原文地址见文末。

 

1.Linux shell 截取字符变量的前8位

实现方法有如下几种:

  1. expr substr “$a” 1 8
  2. echo $a|awk ‘{print substr(,1,8)}’
  3. echo $a|cut -c1-8
  4. echo $
  5. expr $a : ‘\(.\\).*’
  6. echo $a|dd bs=1 count=8 2>/dev/null

 

2.按指定的字符串截取

(1)第一种方法:

从左向右截取最后一个string后的字符串
${varible##*string}
从左向右截取第一个string后的字符串
${varible#*string}
从右向左截取最后一个string后的字符串
${varible%%string*}
从右向左截取第一个string后的字符串
${varible%string*}
“*”只是一个通配符可以不要

请看下面的例子:

$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

(2)第二种方法:

${varible:n1:n2}:截取变量varible从n1开始的n2个字符,组成一个子字符串。可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:

$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

3.按照指定要求分割:

比如获取后缀名

ls -al | cut -d “.” -f2

小结:shell对应字符串的处理方法很多,根据需求灵活选择。

 

在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

 

一、判断读取字符串值

表达式 含义

${var} 变量var的值, 与$var相同
${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${[email protected]} 匹配之前所有以varprefix开头进行声明的变量

加入了“*”  不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.

 

 

二、字符串操作(长度,读取,替换)

表达式 含义

${#string} $string的长度
${string:position} 在$string中, 从位置$position开始提取子串
${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

说明:”* $substring”可以是一个正则表达式.

 

实例:

 

读取:

Java代码  收藏代码
  1. $ echo ${abc-‘ok’}  
  2. ok
  3. $ echo $abc
  4. $ echo ${abc=‘ok’}  
  5. ok
  6. $ echo $abc
  7. ok
  8. #如果abc 没有声明“=” 还会给abc赋值。
  9. $ var1=11;var2=12;var3=  
  10. $ echo ${[email protected]}
  11. var1 var2 var3
  12. $ echo ${!v*}
  13. var1 var2 var3
  14. #${!varprefix*}与${[email protected]}相似,可以通过变量名前缀字符,搜索已经定义的变量,无论是否为空值。

 

1,取得字符串长度

C代码  收藏代码
  1. string=abc12342341          //等号二边不要有空格  
  2. echo ${#string}             //结果11  
  3. expr length $string         //结果11  
  4. expr “$string” : “.*”       //结果11 分号二边要有空格,这里的:根match的用法差不多  

2,字符串所在位置

C代码  收藏代码
  1. expr index $string ‘123’    //结果4 字符串对应的下标是从1开始的   
C代码  收藏代码
  1. str=“abc”  
  2. expr index $str “a”  # 1  
  3. expr index $str “b”  # 2  
  4. expr index $str “x”  # 0  
  5. expr index $str “”   # 0   

 

这个方法让我想起来了js的indexOf,各种语言对字符串的操作方法大方向都差不多,如果有语言基础的话,学习shell会很快的。

 

3,从字符串开头到子串的最大长度

C代码  收藏代码
  1. expr match $string ‘abc.*3’ //结果9    

个人觉得这个函数的用处不大,为什么要从开头开始呢。

 

4,字符串截取

C代码  收藏代码
  1. echo ${string:4}      //2342341  从第4位开始截取后面所有字符串    
  2. echo ${string:3:3}    //123      从第3位开始截取后面3位    
  3. echo ${string:3:6}    //123423   从第3位开始截取后面6位    
  4. echo ${string: -4}    //2341  :右边有空格   截取后4位    
  5. echo ${string:(-4)}   //2341  同上    
  6. expr substr $string 3 3   //123  从第3位开始截取后面3位    

 

C代码  收藏代码
  1. str=“abcdef”  
  2. expr substr “$str” 1 3  # 从第一个位置开始取3个字符, abc  
  3. expr substr “$str” 2 5  # 从第二个位置开始取5个字符, bcdef   
  4. expr substr “$str” 4 5  # 从第四个位置开始取5个字符, def  
  5. echo ${str:2}           # 从第二个位置开始提取字符串, bcdef
  6. echo ${str:2:3}         # 从第二个位置开始提取3个字符, bcd
  7. echo ${str:(-6):5}        # 从倒数第二个位置向左提取字符串, abcde
  8. echo ${str:(-4):3}      # 从倒数第二个位置向左提取6个字符, cde

 

上面的方法让我想起了,php的substr函数,后面截取的规则是一样的。

 

5,匹配显示内容

C代码  收藏代码
  1. //例3中也有match和这里的match不同,上面显示的是匹配字符的长度,而下面的是匹配的内容    
  2. expr match $string ‘\([a-c]*[0-9]*\)’  //abc12342341    
  3. expr $string : ‘\([a-c]*[0-9]\)’       //abc1    
  4. expr $string : ‘.*\([0-9][0-9][0-9]\)’ //341 显示括号中匹配的内容    

 

这里括号的用法,是不是根其他的括号用法有相似之处呢,

 

6,截取不匹配的内容

C代码  收藏代码
  1. echo ${string#a*3}     //42341  从$string左边开始,去掉最短匹配子串    
  2. echo ${string#c*3}     //abc12342341  这样什么也没有匹配到    
  3. echo ${string#*c1*3}   //42341  从$string左边开始,去掉最短匹配子串    
  4. echo ${string##a*3}    //41     从$string左边开始,去掉最长匹配子串    
  5. echo ${string%3*1}     //abc12342  从$string右边开始,去掉最短匹配子串    
  6. echo ${string%%3*1}    //abc12     从$string右边开始,去掉最长匹配子串    
C代码  收藏代码
  1. str=“abbc,def,ghi,abcjkl”  
  2. echo ${str#a*c}     # 输出,def,ghi,abcjkl  一个井号(#) 表示从左边截取掉最短的匹配 (这里把abbc字串去掉)
  3. echo ${str##a*c}    # 输出jkl,             两个井号(##) 表示从左边截取掉最长的匹配 (这里把abbc,def,ghi,abc字串去掉)
  4. echo ${str#“a*c”}   # 输出abbc,def,ghi,abcjkl 因为str中没有”a*c”子串  
  5. echo ${str##“a*c”}  # 输出abbc,def,ghi,abcjkl 同理  
  6. echo ${str#*a*c*}   # 空
  7. echo ${str##*a*c*}  # 空
  8. echo ${str#d*f)     # 输出abbc,def,ghi,abcjkl,
  9. echo ${str#*d*f}    # 输出,ghi,abcjkl
  10. echo ${str%a*l}     # abbc,def,ghi  一个百分号(%)表示从右边截取最短的匹配
  11. echo ${str%%b*l}    # a             两个百分号表示(%%)表示从右边截取最长的匹配
  12. echo ${str%a*c}     # abbc,def,ghi,abcjkl

这里要注意,必须从字符串的第一个字符开始,或者从最后一个开始,可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面)  。

 

7,匹配并且替换

C代码  收藏代码
  1. echo ${string/23/bb}   //abc1bb42341  替换一次    
  2. echo ${string//23/bb}  //abc1bb4bb41  双斜杠替换所有匹配    
  3. echo ${string/#abc/bb} //bb12342341   #以什么开头来匹配,根php中的^有点像    
  4. echo ${string/%41/bb}  //abc123423bb  %以什么结尾来匹配,根php中的$有点像   

 

C代码  收藏代码
  1. str=“apple, tree, apple tree”  
  2. echo ${str/apple/APPLE}   # 替换第一次出现的apple
  3. echo ${str//apple/APPLE}  # 替换所有apple  
  4. echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它
  5. echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它
C代码  收藏代码
  1. $ test=‘c:/windows/boot.ini’  
  2. $ echo ${test/\//\\}  
  3. c:\windows/boot.ini
  4. $ echo ${test//\//\\}  
  5. c:\windows\boot.ini
  6. #${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。  

8. 比较

C代码  收藏代码
  1. [[ “a.txt” == a* ]]        # 逻辑真 (pattern matching)  
  2. [[ “a.txt” =~ .*\.txt ]]   # 逻辑真 (regex matching)  
  3. [[ “abc” == “abc” ]]       # 逻辑真 (string comparision)   
  4. [[ “11” < “2” ]]           # 逻辑真 (string comparision), 按ascii值比较  

9. 连接

C代码  收藏代码
  1. s1=“hello”  
  2. s2=“world”  
  3. echo ${s1}${s2}   # 当然这样写 $s1$s2 也行,但最好加上大括号
10. 字符串删除

Java代码  收藏代码
  1. $ test=‘c:/windows/boot.ini’  
  2. $ echo ${test#/}
  3. c:/windows/boot.ini
  4. $ echo ${test#*/}
  5. windows/boot.ini
  6. $ echo ${test##*/}
  7. boot.ini
  8. $ echo ${test%/*} 
  9. c:/windows 
  10. $ echo ${test%%/*} 
  11. #${变量名#substring正则表达式}从字符串开头开始配备substring,删除匹配上的表达式。 
  12. #${变量名%substring正则表达式}从字符串结尾开始配备substring,删除匹配上的表达式。 
  13. #注意:${test##*/},${test%/*} 分别是得到文件名,或者目录地址最简单方法。   

转自:https://www.cnblogs.com/gaochsh/p/6901809.html

一次java war包在tomcat启动后服务乱码问题解决

 java, tomcat  一次java war包在tomcat启动后服务乱码问题解决已关闭评论
3月 312021
 

一个运行于tomcat下的war包,忽然服务出现了乱码,问题排查如下:

  • 检查点一:
  • 1. 检查tomcat 的config目录下server.xml 文件:

<Connector ……
redirectPort=”443″ URIEncoding=”UTF-8″ />, 发现问题不在这里

 

  • 检查点二:
  • 2.1. 命令行下执行: ps -ef | grep java  获取java运行所在的pid为6724

[[email protected]]# ps -ef | grep java
root 6724 1 3 14:30 pts/0 00:01:04 /usr/local/jdk/bin/java –

  • 2.2. 查看问题机器的jvm的编码格式

[[email protected]]# jinfo 6724 |grep enc
sun.jnu.encoding = ANSI_X3.4-1968
file.encoding.pkg = sun.io
sun.io.unicode.encoding = UnicodeLittle
file.encoding = ANSI_X3.4-1968

果然问题出在这里。 可以在tomcat的bin目录下的catalina.sh,添加给 JAVA_OPTS 的多添加两个参数

-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8

重启tomcat,DONE!

 

 

 

linux下取出两个文本文件中相同的行或不同的行,计算行数,排除重复行等

 linux  linux下取出两个文本文件中相同的行或不同的行,计算行数,排除重复行等已关闭评论
3月 302021
 

1.  两个文本文件,现在想取出其中的相同的行或不同的行,可以以下操作:(比如文件a.txt和文件b.txt)

grep -wf a.txt b.txt   (取出相同的行)

grep -wvf a.txt b.txt   (取出不相同的行)

 

2.  如果要计算取出的行一共多少行? 如下:

grep -wf a.txt b.txt  | wc -l   (相同的行一共有多少行)

 

3. 如果a.txt有重复行数据,可以使用下面命令过滤并产生新文件a1.txt,然后再用上面的方法比较

sort a.txt | uniq -c | sort -rn | cut -c 9-  > a1.txt  (sort先排序,uniq再计数,sort -rn再按重复数量倒序, cut再截取,后导出)

 

 

“此版本…不能安装在这台电脑上”问题解决,旧/老Mac如何安装通过patch包安装不兼容的High Sierra, Mojave,Catalina系统

 mac, macpro  “此版本…不能安装在这台电脑上”问题解决,旧/老Mac如何安装通过patch包安装不兼容的High Sierra, Mojave,Catalina系统已关闭评论
3月 282021
 

老版的macpro , 比如2011年的版本正常升级系统只能支持到High Sierra, 而无法安装Mojave,Catalina系统, 但实际老硬件支持这些系统毫无压力,如果还换过固态硬盘的话,运行新操作系统更是绰绰有余,那如何升级呢?

老外做了一些补丁包,可以从以下址http://dosdude1.com/software.html下载到对应的包。

 

我们以安装mojave patch为例,以下所有的内容都可以在它的网页上找到(http://dosdude1.com/mojave/),我只是翻译成了中文,便于大家阅读:

 

具体步骤如下:

一、前提条件:

  1. 下载好对应的 mojave patch.
  2. 准备一个U盘,最好16G以上,
  3. macOS Mojave安装程序应用程序的副本。可以使用支持Mojave的机器从Mac App Store获得此信息,也可以使用mojave patch该工具的内置下载功能获得该信息。在菜单栏中,只需选择“工具>下载macOS Mojave …”http://dosdude1.com/mojave/tutorialimages/downloadMacOS.png

 

二、使用方法:

重要说明: 如果您有一台本机支持High Sierra的计算机,则要从APFS卷启动,必须​​确保安装了系统的最新版本的BootROM。如果您以前未安装High Sierra,您可以下载并安装这个软件包以安装最新的BootROM版本。安装时,请确保系统已接通电源,否则将不会安装更新。

1.插入所需的USB驱动器,打开“磁盘工具”,然后将其格式化为OS X扩展(日志式)。

2.打开“ macOS Mojave Patcher”工具,然后浏览以找到macOS Mojave Installer应用程序的副本。

*确保该工具成功验证了应用程序。

3.接下来,在“目标卷”列表中选择您的USB驱动器,然后单击“开始操作”。

4.操作完成后,通过在打开计算机电源的同时按住Option键并选择驱动器,从刚创建的USB驱动器上启动目标不受支持的Mac。


注意:如果要进行全新安装,请仅执行步骤5和6。否则,您只需跳过这些步骤并安装到包含OS X早期版本的卷中,它将进行就地升级。

5.安装程序启动后,从“实用工具”菜单中打开“磁盘实用工具”,或者在屏幕左下角的“实用工具”窗口中双击它。

6.选择要安装在其上的磁盘或分区,然后将其擦除,以确保使用Mac OS Extended(日志式)或APFS作为文件系统类型。如果格式化整个驱动器,请确保已选择GUID。

重要的提示:  Mojave中要求使用APFS,以便通过常规软件更新方法接收系统更新。如果您选择继续使用macOS Extended(Journaled)作为文件系统类型,则不会通过系统偏好设置接收系统更新。

•在2009年末及以后的计算机上使用APFS的工作方式与High Sierra相同。
•如果您的机器本身不支持High Sierra(因此无法自然启动APFS卷),请注意以下几点:

—如果使用APFS,将没有可启动的恢复分区。
—如果您决定使用APFS,则安装后的工具将安装自定义启动方法,因为这些不受支持的计算机的固件本身不支持从APFS卷启动。它不像本机启动那样干净,但是在运行Mojave时不会引起任何问题。修改后的启动过程的演示可以在这里查看。

7.将macOS正常安装到所需的卷上。

8.安装完成后,重新引导回安装程序驱动器。这次,打开“ macOS Post Install”应用程序。

9.在应用程序中,选择您正在使用的Mac型号(如果不清楚型号的,可以点击mac左上角苹果图标,点击 “关于本机”  –> “概览” –> “系统报告……” –> “硬件”, 在“硬件概览”下的“型号标识符“就是我们要找的信息)。将根据您选择的模型为您选择最佳的补丁。您还可以选择其他补丁。

10.选择刚刚在其上安装了macOS Mojave的卷,然后单击“修补程序”。完成修补后,单击“重新启动”。在重新启动之前,它可能会坐在那里片刻来重建缓存。
•如果由于某种原因,系统在重新引导后无法正常运行,请重新引导至安装程序驱动器,再次运行安装后修补程序,然后在重新引导之前选择“强制缓存重建”。在大多数情况下,这不是必需的。

11.重新启动后,它现在应该启动到macOS Mojave的完全正常工作的副本中。

附加信息:

•如果在macOS后期安装工具中选择了Mojave,则您的Mojave安装将在/ Applications / Utilities文件夹中有一个名为“ Patch Updater”的程序。当您的计算机有可用的补丁程序新更新时,此程序将提醒您,并提示您安装它们。如果您没有安装补丁更新程序,但是想要安装它,则可以下载并运行此处找到的脚本。

•在系统更新期间,某些补丁可能会被覆盖。使用补丁更新程序工具,可以一键式重新安装这些补丁。为此,请打开Patch Updater应用程序,然后选择“查看已安装的更新”,或使用菜单栏中的“查看>显示已安装的更新”菜单。
•要重新安装补丁,只需在列表中右键单击它,然后选择“重新安装”。您也可以选择“全部重新安装”按钮,以立即重新安装所有当前已安装的修补程序。

更新

重要说明:

    • Mojave中要求使用APFS,以便通过常规软件更新方法接收系统更新。如果您选择继续使用macOS Extended(Journaled)作为文件系统类型,则不会通过系统偏好设置接收系统更新。如果您不使用APFS,则可以按照以下10.14.1的安装步骤进行操作。

 

  • 通过软件更新应用任何系统更新后,很有可能需要使用Mojave Patcher安装程序卷重新应用安装后补丁。如果您安装软件更新,但系统随后无法启动,则需要执行此操作。

 

macOS 10.15 系统任何来源已打开,软件显示损坏解决方案(转)

 mac  macOS 10.15 系统任何来源已打开,软件显示损坏解决方案(转)已关闭评论
3月 262021
 

更新 macOS 10.15 Catalina 系统后,许多在 10.14 上可以使用的 App 都会提示【 xxx 已损坏,无法打开,你应该将它移到废纸篓解决办法 】,哪怕你在【安全与隐私 > 通用】中已经开启了【任何来源】,但还是会出现这样提示,接下来小编为大家带来详细的修复的方法,感兴趣的朋友快跟着小编一起来看看吧!

准备工作:检查是否已开启【任何来源】,已开启的请忽略准备工作

先打开系统偏好设置,检查 【安全与隐私】 -> 【通用选项卡】下是否已经启用了任何来源选项:

如果没有打开【任何来源】选项,请参考教程:https://www.kkmac.com/help-mac-888.html

重要提示:首先你要先打开【任何来源】选项,再进行接下来的操作!

现在教程正式开始:

1、打开 「Launchpad」 – 「实用工具」 – 「终端」;

2.将下面这段代码复制,在终端窗口粘贴。

sudo xattr -d com.apple.quarantine 

注意 代码的 quarantine 后面有个空格,要一起复制进终端

打开 Finder(访达),点击左侧的应用程序,将应用拖进终端中按下回车

然后按键盘的回车键(return),输入密码,再按回车键,完成。

回车后会看见个 password 后面还有个钥匙图标,在钥匙图标后面输入你自己电脑解锁密码

输入的时候不显示你输入的密码,感觉就是输入不了东西一样,也不用管,凭感觉输入完正确解锁密码后按回车键。

好了再看一下是不是可以打开 APP 了!

最后补充

如果以上方法都不能解决,就只能关闭 SIP 系统完整性保护了!!!

详细请参考:https://www.kkmac.com/macos-gb-sip.html

 

转自: https://www.kkmac.com/mac-81112.html

nginx自定义变量与内置预定义变量(获取GET参数值,HEADER参数值等)

 nginx  nginx自定义变量与内置预定义变量(获取GET参数值,HEADER参数值等)已关闭评论
3月 242021
 

总览
nginx可以使用变量简化配置与提高配置的灵活性,所有的变量值都可以通过这种方式引用:

$变量名

而nginx中的变量分为两种,自定义变量与内置预定义变量

内置变量
声明
可以在sever,http,location等标签中使用set命令(非唯一)声明变量,语法如下

set $变量名 变量值

注意nginx中的变量必须都以$开头。

可见性
nginx的配置文件中所有使用的变量都必须是声明过的,否则nginx会无法启动并打印相关异常日志

nginx变量的一个有趣的特性就是nginx中没一个变量都是全局可见的,而他们又不是全局变量。比如下面这个例子

location a/ {
return 200 $a
}

location b/ {
set $a hello nginx
return 200 $a
}

由于变量是全局可见的所以nginx启动不会报错,而第一个location中并不知道$a的具体值因此返回的响应结果为一个空字符串。

在不同层级的标签中声明的变量性的可见性规则如下:

location标签中声明的变量中对这个location块可见
server标签中声明的变量对server块以及server块中的所有子块可见
http标签中声明的变量对http块以及http块中的所有子块可见
内置预定义变量
内置预定义变量即无需声明就可以使用的变量,通常包括一个http请求或响应中一部分内容的值,以下为一些常用的内置预定义变量

变量名 定义
$arg_PARAMETER GET请求中变量名PARAMETER参数的值。
$args 这个变量等于GET请求中的参数。例如,foo=123&bar=blahblah;这个变量只可以被修改
$binary_remote_addr 二进制码形式的客户端地址。
$body_bytes_sent 传送页面的字节数
$content_length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$cookie_COOKIE cookie COOKIE的值。
$document_root 当前请求在root指令中指定的值。
$document_uri 与$uri相同。
$host 请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值)。值为小写,不包含端口。
$hostname 机器名使用 gethostname系统调用的值
$http_HEADER HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值);
$sent_http_HEADER HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: $sent_http_cache_control, $sent_http_content_type…;
$is_args 如果$args设置,值为”?”,否则为””。
$limit_rate 这个变量可以限制连接速率。
$nginx_version 当前运行的nginx版本号。
$query_string 与$args相同。
$remote_addr 客户端的IP地址。
$remote_port 客户端的端口。
$remote_user 已经经过Auth Basic Module验证的用户名。
$request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。
$request_body 这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。
$request_body_file 客户端请求主体信息的临时文件名。
$request_completion 如果请求成功,设为”OK”;如果请求未完成或者不是一系列请求中最后一部分则设为空。
$request_method 这个变量是客户端请求的动作,通常为GET或POST。包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。
$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。
$scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
$server_name 服务器名称。
$server_port 请求到达服务器的端口号。
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$uri 请求中的当前URI(不带请求参数,参数位于a r g s ) , 不 同 于 浏 览 器 传 递 的 args),不同于浏览器传递的args),不同于浏览器传递的request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html

原文链接:https://blog.csdn.net/m0_37556444/article/details/84563520

sql server 分页sql高效写法(mysql limit替代写法)

 mysql, sqlserver  sql server 分页sql高效写法(mysql limit替代写法)已关闭评论
3月 182021
 

习惯了mysql, 切到sql server真TM不习惯,处处觉得sql server的使用太垃圾了, 完全是拉低开发人员效率的产品!

今天谈下sql server为人诟病的分页,OMG , 在mysql里使用 limit n,m就能解决的事情,在sql server里动作就大了,常见的使用 NOT in 语法(实在无法想象这样的查询效率),或者使用自己定义一个存储过程的方式(但这种方式条件又不够灵活), 推荐一个相对比较高效并且相对简单的写法如下

SELECT TOP 页大小 * FROM( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 )as A 
WHERE RowNumber > 页大小*(页数-1)

注解:

  • 首先利用Row_number()为table1表的每一行添加一个行号,给行号这一列取名’RowNumber’ ,在over()方法中将table1按’id’做了升序排列
  • 然后将’RowNumber’列 与table1表的所有列 形成一个表A
  • 重点在where条件。假如当前页(currentPage)是第2页,每页显示10个数据(pageSzie)。那么第一页的数据就是第11-20条

mysql的on duplicate key update语句在sql server中的替代写法

 sqlserver, 数据库  mysql的on duplicate key update语句在sql server中的替代写法已关闭评论
3月 162021
 

mysql在处理唯一主键记录时可以一个语句实现没有记录时插入有记录时更新, 只要使用“insert …… on duplicate key update …. ”,非常简洁高效,oracle 、 DB2 都有类似的语法可以实现相同的功能,但坑爹的是sql server没有对应的语句,但可以使用下面的语句实现相同的功能,但稍许复杂些:

  • 1. 对于sql server 2008及以后的版本,可以使用merge语法, 可以参考下面的实例用法:
CREATE TABLE #mytable(COL_A VARCHAR(10), COL_B VARCHAR(10), COL_C VARCHAR(10), COL_D VARCHAR(10))
INSERT INTO #mytable VALUES('1','0.1', '0.2', '0.3'); --<These are the values we'll be updating
SELECT * FROM #mytable --< Starting values (1 row)
--< 以上是测试数据,主要注意下面的MERGE语句用法
    MERGE #mytable AS target --< This is the target we want to merge into
    USING ( --< This is the source of your merge. Can me any select statement
        SELECT '1' AS VAL_A,'1.1' AS VAL_B, '1.2' AS VAL_C, '1.3' AS VAL_D --<These are the values we'll use for the update. (Assuming column COL_A = '1' = Primary Key)
        UNION
        SELECT '2' AS VAL_A,'2.1' AS VAL_B, '2.2' AS VAL_C, '2.3' AS VAL_D) --<These values will be inserted (cause no COL_A = '2' exists)
        AS source (VAL_A, VAL_B, VAL_C, VAL_D) --< Column Names of our virtual "Source" table
    ON (target.COL_A = source.VAL_A) --< This is what we'll use to find a match "JOIN source on Target" using the Primary Key
    WHEN MATCHED THEN --< This is what we'll do WHEN we find a match, in your example, UPDATE COL_D = VALUES(COL_D);
        UPDATE SET
            target.COL_B = source.VAL_B,
            target.COL_C = source.VAL_C,
            target.COL_D = source.VAL_D
    WHEN NOT MATCHED THEN --< This is what we'll do when we didn't find a match
    INSERT (COL_A, COL_B, COL_C, COL_D)
    VALUES (source.VAL_A, source.VAL_B, source.VAL_C, source.VAL_D)
    --OUTPUT deleted.*, $action, inserted.* --< Uncomment this if you want a summary of what was inserted on updated.
    --INTO #Output  --< Uncomment this if you want the results to be stored in another table. NOTE* The table must exists
    ;

--< MERGE后测试数据显示
SELECT * FROM #mytable --< Ending values (2 row, 1 new, 1 updated)
  • 2. 对于sql server 2008以前的版本可以参考下面语句的使用方法:
update mytable
  set col_d = 'val_d'
  where col_a = 'val_a'
    and col_b = 'val_b'
    and col_c = 'val_c';

insert into mytable (col_a, col_b, col_c, col_d)
  select 'val_a','val_b', 'val_c', 'val_d'
  where not exists (select * 
    from mytable with (serializable) 
    where col_a = 'val_a'
      and col_b = 'val_b'
      and col_c = 'val_c'
      );

参考:https://stackoverflow.com/questions/27076348/equivalent-of-mysql-on-duplicate-key-update-in-sql-server

excel查找某列里最长的行和行的值

 excel  excel查找某列里最长的行和行的值已关闭评论
3月 032021
 

需要查一个18万行excel文件里Y列哪行的列的值长度最长,有多长(第1行是列名,数据从第2行开始)? 如何查呢,可以使用下列方法:

  • 1. 查询这个Y中最长值所在行的这个Y列的值有多长?

选择一个空单元格, 输入=MAX(LEN(Y2:Y180000)) ,然后,输完公式后必须同时按下三个键(ctrl+shift+enter)结束输入

  • 2. 查询这个Y列最长值所在行在哪一行(索引)?

选择一个空单元格, 输入=MATCH(MAX(LEN(Y2:Y180000)),LEN(Y2:Y180000),0) ,然后,输完公式后必须同时按下三个键(ctrl+shift+enter)结束输入,此函数查找最大len在范围Y2:Y180000中的第一个单元格的索引

 

感谢万能的互联网,希望对需要的人有帮助!!

macOS安装过程中“应用副本已损坏,不能用来安装macOS….”的解决方案

 mac, macpro  macOS安装过程中“应用副本已损坏,不能用来安装macOS….”的解决方案已关闭评论
2月 262021
 

今天在给一个旧mac安装os时,使用u 盘启动安装时提示下面错误“应用副本已损坏,不能用来安装macOS….“ , 后来网上查到: 大部分原因是由于系统版本证书过期所致。我们可以这样操作,解决上述问题。

先点击“好”关闭窗口,我们先关闭网络,关闭网络,关闭网络(断开wifi,拔网线等),在准备安装界面中点击工具栏“实用工具”—“终端”,进入终端

进入终端后,我们输入以下命令行“date 062614102014.30”,注意,date后面是空格,输完之后按回车确定。(其他版本日期参照教程结尾)

命令行输完之后,关闭窗口,退出终端。

退出之后,我们点击“安装macOS”,看一下能否进下一步。

我们顺利得进入了安装界面。

其他事项

一、在桌面环境升级系统时,同样先关闭网络,打开“终端”,输入日期前加入”sudo”,例如“sudo date 062614102014.30”(不包括引号),按回车,关闭终端之后再执行升级操作。

二、如果上面的命令行不起作用。我们可以更改成其他日期再试一遍

date 0201010116(OS X El Capitan 10.11.6适用)

date 010514102017.30(macOS Sierra 10.12适用)

date 062614102014.30 (10.13、10.14适用)

date 121212122019 (10.15)

date 032208102015.20

date 112202022015

date 122014102015.30(10.10可用)

mac磁盘工具格式化时u盘时卡死问题解决方式

 mac, macpro  mac磁盘工具格式化时u盘时卡死问题解决方式已关闭评论
2月 262021
 

mac使用磁盘工具格式化u盘时出现卡死现象,apple官网建议使用以下各个方式尝试:

  1. 您的 Mac 已经更新至最新版本(重要:建议更新前备份您的 Mac。)(个人觉得这条是比较坑的,建议先使用后面的方式最后再尝试这条
  2. 前往“访达”>“应用程序”>“实用工具”>“磁盘工具”,尝试推出“外置”U 盘,并重新插拔您的 U 盘。(如果 Mac 有多个 USB 接口,尝试更换另一个接口。)
  3. 若仍然无法识别,建议重启您的 Mac,然后在“磁盘工具”中选择该外置存储设备,确保已经成功“装载”。
  4. 尝试重置非易失的随机访问存储器(NVRAM)
  5. 尝试重置 Mac 上的系统管理器(SMC)
  6. 尝试创建新的管理员帐户,使用新建的管理员帐户登录以便查看问题是否仍然存在。
  7. 建议将您的 U 盘连接其他 Mac,以确定问题是否局限于您的 Mac。
  8. 尝试将其他外置 USB 储存设备连接您的电脑,以查看问题是否局限于您的 U 盘。

如何重置 Mac 的 SMC系统管理器

 mac, macpro  如何重置 Mac 的 SMC系统管理器已关闭评论
2月 262021
 

如何重置 Mac 的 SMC系统管理器

重置系统管理控制器 (SMC) 可以解决某些与电源、电池、风扇和其他功能相关的问题。

在搭载 T2 芯片的电脑上重置 SMC

如果您的 Mac 配备 Apple T2 安全芯片,请按照以下步骤操作。如果您需要协助,请联系 Apple 支持

配备 T2 芯片的笔记本电脑

重置 SMC 之前,请尝试以下步骤:

  1. 将 Mac 关机。
  2. 按住电源按钮 10 秒钟,然后松开这个按钮。
  3. 等待几秒钟,然后按下电源按钮以将 Mac 开机。

如果问题仍然存在,请按照以下步骤重置 SMC:

  1. 将 Mac 关机。
  2. 在内建键盘上,按住以下所有按键。Mac 可能会开机。
    • 键盘左侧的 Control 
    • 键盘左侧的 Option (Alt) 
    • 键盘右侧的 Shift 
  3. 按住全部三个按键 7 秒钟,然后在不松开按键的情况下按住电源按钮。如果 Mac 处于开机状态,它将在您按住这些按键时关机。
  4. 继续按住全部四个按键 7 秒钟,然后松开这些按键。
  5. 等待几秒钟,然后按下电源按钮以将 Mac 开机。

配备 T2 芯片的台式电脑

  1. 将 Mac 关机,然后拔下电源线。
  2. 等待 15 秒钟,然后重新接回电源线。
  3. 等待 5 秒钟,然后按下电源按钮以将 Mac 开机。

 


在其他电脑上重置 SMC

如果您的 Mac 没有配备 Apple T2 安全芯片,请按照以下步骤操作。如果您需要协助,请联系 Apple 支持

装有不可拆卸电池的笔记本电脑

这类电脑包括 2009 年中至 2017 年推出的 MacBook Pro 机型、2017 年或之前推出的 MacBook Air 机型,以及所有 MacBook 机型,但 MacBook(13 英寸,2009 年中)除外。

  1. 将 Mac 关机。
  2. 在内建键盘上,按住以下所有按键:
    • 键盘左侧的 Shift 
    • 键盘左侧的 Control 
    • 键盘左侧的 Option (Alt) 
  3. 在按住全部三个按键的情况下,按住电源按钮
    全部 4 个按键已被按下的笔记本电脑键盘
  4. 按住全部四个按键 10 秒钟。
  5. 松开所有按键,然后按下电源按钮以将 Mac 开机。

装有可拆卸电池的笔记本电脑

这类电脑包括 2009 年初或之前推出的所有 MacBook Pro 和 MacBook 机型,以及 MacBook(13 英寸,2009 年中)。

  1. 将 Mac 关机。
  2. 拆下电池。(如果您需要拆卸电池方面的协助,请联系 Apple Store 商店或 Apple 授权服务提供商。)
  3. 按住电源按钮 5 秒钟。
  4. 重新安装电池。
  5. 按下电源按钮以将 Mac 开机。

台式电脑

  1. 将 Mac 关机,然后拔下电源线。
  2. 等待 15 秒钟,然后重新接回电源线。
  3. 等待 5 秒钟,然后按下电源按钮以将 Mac 开机。

 


关于 SMC

系统管理控制器 (SMC) 负责管理与以下功能相关的行为:

  • 电源,包括电源按钮和 USB 端口的电源
  • 电池和充电
  • 风扇和其他热能管理功能
  • 指示灯或感应器,例如状态指示灯(睡眠状态、电池充电状态等)、突发移动感应器、环境光传感器和键盘背光
  • 打开和合上笔记本电脑盖时的行为

重置 SMC 不会影响 NVRAM 或 PRAM 的内容。

重置 Mac 上的 NVRAM 或 PRAM

 mac, macpro  重置 Mac 上的 NVRAM 或 PRAM已关闭评论
2月 262021
 

如果 Mac 出现了与 NVRAM 或 PRAM 中储存的设置有关的问题,那么进行重置可能会有帮助。

NVRAM(非易失性随机访问存储器)是一小部分内存,Mac 使用这些内存来储存某些设置并对其进行快速访问。PRAM(参数 RAM)储存着类似的信息,且 NVRAM 和 PRAM 的重置步骤相同。

可储存在 NVRAM 中的设置包括音量、显示屏分辨率、启动磁盘选择、时区,以及最近的内核崩溃信息。储存在 NVRAM 中的设置取决于您的 Mac 以及与这台 Mac 搭配使用的设备。

如果您遇到与这些设置或其他设置有关的问题,那么重置 NVRAM 可能会有帮助。例如,如果 Mac 并非从“启动磁盘”偏好设置中选定的磁盘启动,或者在 Mac 启动前短暂地显示了一个问号图标,则可能需要重置 NVRAM。

如何重置 NVRAM

Option 键加Command 键加P 键加R 键

将 Mac 关机,然后开机并立即同时按住以下四个按键:Option、Command、P 和 R。您可以在大约 20 秒后松开这些按键,在此期间您的 Mac 可能看似在重新启动。

  • 如果 Mac 电脑发出启动声,您可以在第二次启动声过后松开这些按键。
  • 搭载 Apple T2 安全芯片的 Mac 电脑上,您可以在 Apple 标志第二次出现并消失后松开这些按键。

如果您的 Mac 使用了固件密码,这个组合键将不起任何作用或导致您的 Mac 从 macOS 恢复功能启动。要重置 NVRAM,请先关闭固件密码。

在您的 Mac 完成启动后,您可能需要打开“系统偏好设置”并调整已重置的任何设置,例如音量、显示屏分辨率、启动磁盘选择或时区。

进一步了解

  • 如果您使用的是 Mac 台式电脑而非笔记本电脑,并且每次关闭 Mac 并断开 Mac 电源时,音量或时区等设置均会重置,则您可能需要更换 Mac 中的电池。这个小电池位于电脑的主板上,用于在断开 Mac 电源连接时帮助 NVRAM 保存设置。您可以携 Mac 前往 Apple 服务提供商处来更换该电池。
  • 如果遇到了与睡眠、唤醒、电源、为 Mac 笔记本电脑电池充电有关的问题或其他与电源相关的症状,您可能需要重置 SMC(系统管理控制器)