Mac端idea试用过期后无法打开并使用重置插件解决办法

IntelliJIdea

步骤:

打开目录

/Users/**/Library/Application\ Support/JetBrains/IntelliJIdea2021.2/eval

删除文件

rm -f idea212.evaluation.key

同理:

PyCharm

/Users/**/Library/Application\ Support/JetBrains/PyCharm2021.2/eval

删除文件:

rm -f PyCharm212.evaluation.key

也可以添加插件进行自动重置:

https://plugins.zhile.io

Link:

setContentCompressionResistancePriority和setContentHuggingPriority的使用

需求

两个label并排显示,label宽度以文字内容自适应,当两个label的宽度加到一起小于屏幕宽度时,让左label拉伸,右label宽度以文字内容为准。当两个label宽度之和大于屏幕宽度时,让左label压缩,右label文字完全显示。

代码实现

//以SnapKit为例
let leftLabel = UILabel()
leftLabel.text = "hellohellohehellhellohellohehell"
leftLabel.backgroundColor = .red
leftLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
leftLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)

let rightLabel = UILabel()
rightLabel.text = "worldworldworldorldworldworld"
rightLabel.backgroundColor = .blue

view.addSubview(leftLabel)
view.addSubview(rightLabel)

leftLabel.snp.makeConstraints { (maker) in
    maker.top.equalToSuperview().offset(200)
    maker.left.equalToSuperview()
    maker.right.equalTo(rightLabel.snp.left)
}

rightLabel.snp.makeConstraints { (maker) in
    maker.top.equalTo(leftLabel)
    maker.right.equalToSuperview()
}

代码解析

UIView有两个方法如下

//设置控件的抗拉伸优先级
//控件的抗拉伸优先级数值默认是250,数值越大,抗拉伸能力越强,越不易被拉伸
setContentHuggingPriority(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis)
//设置控件的抗压缩优先级
//控件的抗压缩优先级数值默认是750,数值越大,抗压缩能力越强,越不易被压缩
setContentCompressionResistancePriority(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis)

因此,为了实现需求,我们可以设置左label的抗拉伸优先级<默认值,抗压缩优先级<默认值,这样,当两个label文字都不足时,就会拉伸左边的label,当两个label文字都充足时,就会压缩左边的label。

Link: setContentCompressionResistancePriority和setContentHuggingPriority的使用

CocoaPods 使用整理

CocoaPods 使用整理

指定源

CocoaPods支持私有 Spec 仓库的,我们可以建立自己的源,也可以使用非官方的源,只要是符合规定的都可以指定。

source 'https://github.com/artsy/Specs.git'  
source 'https://github.com/CocoaPods/Specs.git'

抑制警告

inhibit_warnings参数能够有效的抑制CocoaPods引入的第三方代码库产生的warning。

可以全部指定。

inhibit_all_warnings!

也可以针对指定。

pod 'ReactiveCocoa', '~> 2.4', :inhibit_warnings => true

使用git的HEAD指向的分支

pod 'ISO8601DateFormatter', :head

使用 master 分支

pod 'ARAnalytics/Mixpanel', :git => 'https://github.com/orta/ARAnalytics.git'

指定branch

pod 'Reachability', :git => 'https://github.com/ashfurrow/Reachability.git', :branch => 'frameworks'

指定tag

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'

指定commit

pod 'ARTiledImageView', :git => 'https://github.com/dblockARTiledImageView', :commit => '1a31b864d1d56b1aaed0816c10bb55cf2e078bb8'

使用子库

可以这样

pod 'QueryKit/Attribute'

也可以这样指定多个子库

pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']

使用本地代码

通过:path可以指定本地代码,不过需要确保目录包含podspec文件。

pod 'AFNetworking', :path => '~/Documents/AFNetworking'

指定target的依赖库

target :ZipApp do  
  pod 'SSZipArchive'
end

排除taget

target 'Artsy Tests', :exclusive => true do  
  pod 'FBSnapshotTestCase', '1.4'
end

指定xcodeproj

默认会使用Podfile文件同级目录下第一个xcodeproj,但也可以指定

xcodeproj 'MyProject'
target :test do  
  # This Pods library links with a target in another project.
  xcodeproj 'TestProject'
end

指定连接的target

如果不显式指定连接的target,Pods会默认连接project的第一个target。如果需要,可以使用link_with指定连接一个或多个target

link_with 'MyApp', 'MyOtherApp'

指定依赖库的配置文件

pod 'PonyDebugger', :configuration => ['Release']

指定target的配置文件

xcodeproj 'TestProject', 'Mac App Store' => :release, 'Test' => :debug

使用Dynamic Frameworks代替Static Libraries

通过标志use_frameworks!就可知开启这个功能。如果需要使用Swift的库,就必须加上这个标志了。

加快pod install/update 速度

使用CocoaPods来添加第三方类库,无论是执行pod install还是pod updat很多时候都卡在了Analyzing dependencies不动,这是更新本地的pod spec所以文件导致的。通过–no-repo-update标志可以不更新本地pod spec索引。当然首次install不应该添加这个标志,后续修改Podfile的时候可以适当使用,加快pod速度。

pod install --no-repo-update  
pod update --no-repo-update

输出详细日志

pod update --verbose

Link:

Flutter GestureDetector 点击空白区域无反应解决办法

在flutter中只用GestureDetector添加点击事件,发现在空白区域点击无效,事件不响应。解决办法:

GestureDetector(
    behavior: HitTestBehavior.opaque,
)

说明:

/// How to behave during hit tests.
enum HitTestBehavior {
  /// Targets that defer to their children receive events within their bounds
  /// only if one of their children is hit by the hit test.
  deferToChild,

  /// Opaque targets can be hit by hit tests, causing them to both receive
  /// events within their bounds and prevent targets visually behind them from
  /// also receiving events.
  opaque,

  /// Translucent targets both receive events within their bounds and permit
  /// targets visually behind them to also receive events.
  translucent,
}

翻译一下就是:

当behavior选择 deferToChild 时,只有当前容器中的child被点击时才会响应点击事件

当behavior选择 opaque 时,点击整个区域都会响应点击事件,但是点击事件不可穿透向下传递,注释翻译:阻止视觉上位于其后方的目标接收事件,所以我需要的这种效果直接将behavior设置为HitTestBehavior.opaque就可以了;

当behavior选择 translucent 时,同样是点击整个区域都会响应点击事件,和opaque的区别是点击事件是否可以向下传递,注释翻译:半透明目标既可以在其范围内接受事件,也可以允许视觉上位于其后方的目标接收事件

Link:

无法拉取 gcr.io 镜像?用魔法来打败魔法

目前常用的 Docker Registry 公开服务有:

  • docker.io :Docker Hub 官方镜像仓库,也是 Docker 默认的仓库
  • gcr.iok8s.gcr.io :谷歌镜像仓库
  • quay.io :Red Hat 镜像仓库
  • ghcr.io :GitHub 镜像仓库

当使用 docker pull 仓库地址/用户名/仓库名:标签 时,会前往对应的仓库地址拉取镜像,标签无声明时默认为 latest, 仓库地址无声明时默认为 docker.io

图片

众所周知的原因,在国内访问这些服务异常的慢,甚至 gcr.ioquay.io 根本无法访问。

图片

解决方案:镜像加速器

针对 Docker Hub ,Docker 官方和国内各大云服务商均提供了 Docker 镜像加速服务。

你只需要简单配置一下(以 Linux 为例):

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["镜像加速器"]
}
EOF

sudo systemctl daemon-reload
sudo service docker restart

便可以通过访问国内镜像加速器来加速 Docker Hub 的镜像下载。

图片

不过这种办法也只能针对 docker.io ,其它的仓库地址并没有真正实际可用的加速器(至少我目前没找到)。

解决方案:用魔法打败魔法

既然无法治本,那治治标还是可以的吧。

若我们使用一台魔法机器从 gcr.ioquay.io 等仓库先把我们无法下载的镜像拉取下来,然后重新上传到 docker.io ,是不是就可以使用 Docker Hub 的镜像加速器来下载了。

图片

镜像仓库迁移的功能,我这里采用了 Go Docker SDK ,整体实现也比较简单。

图片

以需要转换的 gcr.io/google-samples/microservices-demo/emailservice:v0.3.5 为例,使用方式:

图片

功能实现了,剩下的就是找台带有魔法的机器了。

GitHub Actions 就是个好选择,我们可以利用提交 issues 来触发镜像仓库迁移的功能。

workflow 的实现如下:

图片

实际的使用效果:

图片

只要执行最终输出的命令,就可以飞快的使用 Docker Hub 的加速器下载 gcr.ioquay.io 等镜像了。

最后

本篇的实现已放在 GitHub :https://github.com/togettoyou/hub-mirror

完~

Link:

设置UIButton上的文字居左显示

button.titleLabel.textAlignment = NSTextAlignmentLeft;

这行代码是没有效果的,这只是让标签中的文本左对齐,但并没有改变标签在按钮中的对齐方式。
所以,我们首先要使用

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

这行代码,把按钮的内容(控件)的对齐方式修改为水平左对齐,但是这会紧紧靠着左边,不好看,
所以我们还可以修改属性:

button.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);

这行代码可以让按钮的内容(控件)距离左边10个像素,这样就好看多了。

Link:

UITextView上下左右留有边距的处理办法

UITextView的文字显示区域是由textContainer决定的,所以要解决这个问题需要从textContainer或相关的属性入手。

1.上下不留边距

UITextView有一个textContainerInset属性,默认为UIEdgeInsetsMake(8, 0, 8, 0),这就是UITextView顶部和底部留有间隙的原因,解决办法很简单,设置

textView.textContainerInset = UIEdgeInsetsZero;

2.左右不留边距

UITextView的左右边距是由textContainer属性的lineFragmentPadding控制的,其默认值为5.0,解决办法是设置

textView.textContainer.lineFragmentPadding = 0;

Link:

CSDN未登录禁止复制解决办法

不知道何时开始CSDN的内容需要登录后才能复制,这对我这种面相搜索引擎编程的人十分不友好。不过网页上根本禁止不了,懂的都懂,基本上都是靠JS来实现的,只需禁用JS即可破解,下面是网友提供的两种解决CSDN未登录禁止复制的办法。

方法一

打开一个CSDN网站,按下F12进入开发者模式。注意此模式在IE内核中无效。然后在开发者模式中选择Console面板,复制如下命令粘贴并回车执行。

javascript:document.body.contentEditable='true';document.designMode='on';

方法二

打开一个CSDN网站,按下F12进入开发者模式。注意此模式在IE内核中无效。然后在开发者模式中选择Elements面板,找到 id="content_views" 这句,将其中的 content_views 删除或者重命名即可。双击即可修改。

Link:

App判断系统是否开启代理(防抓包)

iOS 端:

- (void)checkHTTPEnable {
    NSDictionary * ref = (__bridge NSDictionary *)CFNetworkCopySystemProxySettings();
    BOOL enable = [[ref objectForKey:@"HTTPEnable"] boolValue];
    if (enable) {
        NSLog(@"开启了代理");
    }else {
        NSLog(@"没开代理");
    }
}

Android 端:

/*
 * 判断设备 是否使用代理上网
 */
private boolean isWifiProxy(Context context) {
    final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
    String proxyAddress;
    int proxyPort;
    if (IS_ICS_OR_LATER) {
        proxyAddress = System.getProperty("http.proxyHost");
        String portStr = System.getProperty("http.proxyPort");
        proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
    } else {
        proxyAddress = android.net.Proxy.getHost(context);
        proxyPort = android.net.Proxy.getPort(context);
    }
    return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}

在网络数据请求之前,进行代理是否设置的判断。如果监听到手机系统打开了代理,我们就停止后面的数据请求操作,这样可以解决我们用户的数据不被其他不法手段获取。

Link: