o-u-u

mac OS Catalina, Xcode 12.4 “Unsupported OS version” after iPhone iOS update 14.6, 老xcode如何支持新iphone os版本?

 ios, mac  mac OS Catalina, Xcode 12.4 “Unsupported OS version” after iPhone iOS update 14.6, 老xcode如何支持新iphone os版本?已关闭评论
7月 252021
 

老xcode如何支持新iphone os版本?(mac OS Catalina, Xcode 12.4 “Unsupported OS version” after iPhone iOS update 14.6 solved)

问题: iphone升级到了14.6, 但macOS还停留在Catalina 10.15.7, xcode只能升级到12.4,使用iphone调试app时提示 “Unsupported OS version” ,无法编译真机运行调试,难道只能升级mac OS并顺便升级Xcode,如果碰到老的mac,无法升级OS,难道就束以待毙,无法调试了吗??感谢万能的互联网和一群热心的网友!

解决方法:

  • . 打开Finder
    . 打开应用程序文件夹
    . 在里面找到Xcode应用
    . 点击Xcode,右键 -> 显示包内容
    . 在里面按下面目录层级找到支持的真机测试文件:Contents -> Developer -> Platforms -> iPhoneOS.platform -> DeviceSupport(/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport), 这个目录里面就是当前Xcode支持真机调试的真机iOS版本
    . 然后通过拷贝最新的DeviceSupport文件到这个目录里面就可以用最新的iOS设备真机调试了。可以通过哪些渠道获取DeviceSupport文件呢? https://github.com/iGhibli/iOS-DeviceSupport 这个网址收集了迄今为止所有支持的包,大家自行下载即可! 或者也可以到其它同学新的xcode下copy对应的目录过来也可以!

如:

IOS 14.5 (FromXcode_12.5)

IOS 14.6 (FromXcode_12.4)

下载DeviceSupport全集来源: https://github.com/iGhibli/iOS-DeviceSupport

 

DONE!

 

android studio 真机调试(vivo为例)

 android  android studio 真机调试(vivo为例)已关闭评论
7月 252021
 

开启开发者人员选项和USB调试步骤:

  1. 设置–》更多设置–》关于手机–》连续点击版本号即可打开开发者模式–》
  2. 返回设置–》系统和更新–》开发人员选项 –》打开开发人员选项 -》打开USB调试

然后在打开android studio, 数据线连接手机和电脑,android studio将自动检测手机,点三角按钮run。

 

可能问题(以vivo为例,因为比较特殊):

  1. 安装过程vivo要输入账号密码, 并允许开启未知来源安装。
  2. 安装过程一直提示 “安装失败”, 解决方法: 在工程的gradle.properties中加上 android.injected.testOnly=false

 

DONE!!

RelativeLayout/ 相对布局简介、使用、说明

 android  RelativeLayout/ 相对布局简介、使用、说明已关闭评论
7月 012021
 

网上找到的一篇对relativeLayout使用非常好的文章,分享下, 原文地址见文件末尾


在上一节中我们对LinearLayout进行了详细的解析,LinearLayout也是我们 用的比较多的一个布局,我们更多的时候更钟情于他的weight(权重)属性,等比例划分,对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题,就是当界面比较复杂的时候,需要嵌套多层的 LinearLayout,这样就会降低UI Render的效率(渲染速度),而且如果是listview或者GridView上的 item,效率会更低,另外太多层LinearLayout嵌套会占用更多的系统资源,还有可能引发stackoverflow; 但是如果我们使用RelativeLayout的话,可能仅仅需要一层就可以完成了,以父容器或者兄弟组件参考+margin +padding就可以设置组件的显示位置,是比较方便的!当然,也不是绝对的,具体问题具体分析吧! 总结就是:尽量使用RelativeLayout + LinearLayout的weight属性搭配使用吧!


1.核心属性图


2.父容器定位属性示意图


3.根据兄弟组件定位

恩,先说下什么是兄弟组件吧,所谓的兄弟组件就是处于同一层次容器的组件,如图

图中的组件1,2就是兄弟组件了,而组件3与组件1或组件2并不是兄弟组件,所以组件3不能通过 组件1或2来进行定位,比如layout_toleftof = “组件1″这样是会报错的!切记! 关于这个兄弟组件定位的最经典例子就是”梅花布局”了,下面代码实现下:

运行效果图:

实现代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"    
    android:id="@+id/RelativeLayout1"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent" >    
    
    <!-- 这个是在容器中央的 -->    
        
    <ImageView    
        android:id="@+id/img1"     
        android:layout_width="80dp"    
        android:layout_height="80dp"    
        android:layout_centerInParent="true"    
        android:src="@drawable/pic1"/>    
        
    <!-- 在中间图片的左边 -->    
    <ImageView    
        android:id="@+id/img2"     
        android:layout_width="80dp"    
        android:layout_height="80dp"    
        android:layout_toLeftOf="@id/img1"    
        android:layout_centerVertical="true"    
        android:src="@drawable/pic2"/>    
        
    <!-- 在中间图片的右边 -->    
    <ImageView    
        android:id="@+id/img3"     
        android:layout_width="80dp"    
        android:layout_height="80dp"    
        android:layout_toRightOf="@id/img1"    
        android:layout_centerVertical="true"    
        android:src="@drawable/pic3"/>    
        
    <!-- 在中间图片的上面-->    
    <ImageView    
        android:id="@+id/img4"     
        android:layout_width="80dp"    
        android:layout_height="80dp"    
        android:layout_above="@id/img1"    
        android:layout_centerHorizontal="true"    
        android:src="@drawable/pic4"/>    
        
    <!-- 在中间图片的下面 -->    
    <ImageView    
        android:id="@+id/img5"     
        android:layout_width="80dp"    
        android:layout_height="80dp"    
        android:layout_below="@id/img1"    
        android:layout_centerHorizontal="true"    
        android:src="@drawable/pic5"/>    
    
</RelativeLayout>

4.margin与padding的区别

初学者对于这两个属性可能会有一点混淆,这里区分下: 首先margin代表的是偏移,比如marginleft = “5dp”表示组件离容器左边缘偏移5dp; 而padding代表的则是填充,而填充的对象针对的是组件中的元素,比如TextView中的文字 比如为TextView设置paddingleft = “5dp”,则是在组件里的元素的左边填充5dp的空间! margin针对的是容器中的组件,而padding针对的是组件中的元素,要区分开来! 下面通过简单的代码演示两者的区别:

比较示例代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent"    
    android:paddingBottom="@dimen/activity_vertical_margin"    
    android:paddingLeft="@dimen/activity_horizontal_margin"    
    android:paddingRight="@dimen/activity_horizontal_margin"    
    android:paddingTop="@dimen/activity_vertical_margin"    
    tools:context=".MainActivity" >    
    
    <Button    
        android:id="@+id/btn1"     
        android:layout_height="wrap_content"    
        android:layout_width="wrap_content"    
        android:text="Button"/>    
    <Button    
        android:paddingLeft="100dp"     
        android:layout_height="wrap_content"    
        android:layout_width="wrap_content"    
        android:text="Button"    
        android:layout_toRightOf="@id/btn1"/>    
        
    <Button    
        android:id="@+id/btn2"     
        android:layout_height="wrap_content"    
        android:layout_width="wrap_content"    
        android:text="Button"    
        android:layout_alignParentBottom="true"/>    
    <Button    
        android:layout_marginLeft="100dp"     
        android:layout_height="wrap_content"    
        android:layout_width="wrap_content"    
        android:text="Button"    
        android:layout_toRightOf="@id/btn2"     
        android:layout_alignParentBottom="true"/>    
        
</RelativeLayout>

运行效果图比较:


5.很常用的一点:margin可以设置为负数

相信很多朋友都不知道一点吧,平时我们设置margin的时候都习惯了是正数的, 其实是可以用负数的,下面写个简单的程序演示下吧,模拟进入软件后,弹出广告 页面的,右上角的cancle按钮的margin则是使用负数的!

贴出的广告Activity的布局代码吧,当然,如果你对这个有兴趣的话可以下下demo, 因为仅仅是实现效果,所以代码会有些粗糙!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context="com.jay.example.relativelayoutdemo.MainActivity"   
    android:background="#00CCCCFF">  
  
    <ImageView  
        android:id="@+id/imgBack"  
        android:layout_width="200dp"  
        android:layout_height="200dp"  
        android:layout_centerInParent="true"  
        android:background="@drawable/myicon" />  
  
    <ImageView  
        android:id="@+id/imgCancle"  
        android:layout_width="28dp"  
        android:layout_height="28dp"  
        android:layout_alignRight="@id/imgBack"  
        android:layout_alignTop="@id/imgBack"  
        android:background="@drawable/cancel"  
        android:layout_marginTop="-15dp"  
        android:layout_marginRight="-10dp" />  
  
</RelativeLayout>

来自:https://www.runoob.com/w3cnote/android-tutorial-relativelayout.html

Connect to maven.google.com:443 [maven.google.com/172.217.27.142] failed: connect timed out 解决 [Solved]

 android  Connect to maven.google.com:443 [maven.google.com/172.217.27.142] failed: connect timed out 解决 [Solved]已关闭评论
6月 252021
 

android studio编译项目时一直卡在下面的提示:

“Connect to maven.google.com:443 [maven.google.com/172.217.27.142] failed: connect timed out ”, 可以使用下面的方式解决(Solved),

直接修改build.gradle文件中Google的maven地址(添加黑体字的行):

repositories {
    maven{ url 'https://maven.aliyun.com/repository/google'}
    maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}
    maven{ url 'https://maven.aliyun.com/repository/public'}
    maven{ url 'https://maven.aliyun.com/repository/jcenter'}
    maven {url 'https://dl.google.com/dl/android/maven2/'}
    jcenter() ...... 
} DONE!

 

python 2.7.x 安装 pip

 pip, python  python 2.7.x 安装 pip已关闭评论
6月 152021
 

一般Python 2 >=2.7.9的版本都自带了pip,但有些时候因为这样那样的原因卸载了pip模块,可以使用下面的方式安装(先下载get-pip.py文件,再安装):

1. 如果python是 2.7.x版本

[[email protected] o-u-u]# curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py & python get-pip.py

或:

python -m ensurepip –default-pip 

 

2. python >=3.6

[[email protected] o-u-u]# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py & python get-pip.py

 

使用相机拍照后显示在imageview 控件时出现 “ java.lang.RuntimeException: Canvas: trying to draw too large bitmap”问题解决

 android  使用相机拍照后显示在imageview 控件时出现 “ java.lang.RuntimeException: Canvas: trying to draw too large bitmap”问题解决已关闭评论
5月 072021
 

android下测试使用相机拍照,将照片显示在imageview 控件时出现 “ java.lang.RuntimeException: Canvas: trying to draw too large(xxxxxx) bitmap”问题,   试验了网上很多方法,我这里以下方法可行:

修改AndroidManifest.xml文件内容, 添加下面两个属性:

<application
    android:largeHeap="true"
    android:hardwareAccelerated="false"
........
</application>

 

Android Button设置Background背景图片无效的处理方法

 android  Android Button设置Background背景图片无效的处理方法已关闭评论
4月 262021
 

测试在 activity_main.xml给button加背景图片

<Button
    android:id="@+id/titleEdit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="5dp"
    android:background="@drawable/edit_bg"
    android:text="Edit"
    android:textColor="#fff" />

发现模拟器里不起作用,奇怪了, 后来查了网上资料,发现需要修改下面的文件才可以。
在res/values/themes.xml 中:
将 
<style name="Theme.UICustomViews" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
修改为:
<style name="Theme.UICustomViews" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">

Unable to convert string [${xxxx}] to class [java.util.Date] for attribute [value]: [Property Editor not registered with the PropertyEditorManager]

 java, tomcat  Unable to convert string [${xxxx}] to class [java.util.Date] for attribute [value]: [Property Editor not registered with the PropertyEditorManager]已关闭评论
4月 162021
 

使用intellj idea 启动tomcat测试一个简单war包,测试里面一个spring mvc 页面, 使用jstl方式时出现一个怪问题,记录下:

 

index.jsp页面内容如下:

<%@ page import="java.util.Date" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Index</title>
</head>
<body>
<p>
    Hello Spring MVC!!!
</p>
<p>
    <%
        Date now1 = new Date();
        %>
    服务器时间1: <fmt:formatDate value="<%=now1%>" pattern="yyyy-MM-dd HH:mm:ss" />
</p>
<p>
    服务器时间2: <fmt:formatDate value="${now2}" pattern="yyyy-MM-dd HH:mm:ss" />
</p>

</body>
</html>

IndexController内容:
@Controller
public class IndexController {

    @RequestMapping(value = {"", "/index"})
    public ModelAndView dicts() {
        ModelAndView mv = new ModelAndView("index");
        mv.addObject("now2", new Date());
        return mv;
    }
}
测试结果,出现错误:
Unable to convert string [${now2}] to class [java.util.Date] for attribute [value]: [Property Editor not registered with the PropertyEditorManager]

如果把jsp页面中  “服务器时间2xxxx”  这行注释掉又一切正常,这就奇怪了。

后来在网上找到解决方案:发现有由于web.xm声明的问题:

原来声明:
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

这样写有问题,修改为:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="true" version="3.0">
。。。。
</web-app>

便不会出现这个问题了。网上有说是因为Tomcat的支持web.xml的Servlet是2.5版本。

记录下!

DONE!


 

mybatis 懒加载无效问题(lazy invalid)

 mybatis  mybatis 懒加载无效问题(lazy invalid)已关闭评论
4月 122021
 

使用mybatis,mybatis-config配置文件已使用下面两行配置

<settings>
    <setting name="aggressiveLazyLoading" value="false" />
    <setting name="lazyLoadingEnabled" value="true" /> 
</settings>
但发现还是懒加载无效,其实可能在你的代码里有tostring,equal等默认方法触发了懒加载调用,可以通过添加一个配置项解决问题,使用下面的配置
<settings>
<setting name="aggressiveLazyLoading" value="false" />
<setting name="lazyLoadingEnabled" value="true" /> 
<setting name="lazyLoadTriggerMethods" value=""/>
</settings>

说明:
lazyLoadTriggerMethods : Specifies which Object's methods trigger a lazy load, 
指定触发懒加载的方法名,用逗号分隔, 默认值:equals,clone,hashCode,toString

 

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安装程序卷重新应用安装后补丁。如果您安装软件更新,但系统随后无法启动,则需要执行此操作。