0%

反馈请联系hertz@hertzwang.com,谢谢

未找到ARM框架的Ubuntu桌面系统,查找资料中在知乎看找到一篇文章醍醐灌顶,以下为个人记录,建议参考原文 Parallels Desktop 19 安装Ubuntu桌面版(m芯片arm架构)

按照原文的思路,先安装适用于ARM的Ubuntu Server,再安装桌面环境和应用商店

笔记:

1
2
3
4
5
6
$ sudo apt update
$ sudo apt install ubuntu-desktop
$ sudo snap install snap-store
$ sudo snap install flutter --classic
$ sudo apt install openjdk-17-jdk
$ sudo apt install openjdk-17-jre

反馈请联系hertz@hertzwang.com,谢谢

  1. 打开网站 https://ping.eu/ping
  2. IP address or host name: 中输入 github.com ,输入 Enter code 并点击 Go 之后可以得到一个IP
  3. 打开终端执行 $ sudo vi /etc/hosts,在底部添加 xxx.xx.xxx.xx github.com,保存退出(ESC - Shift + ; - wq - 回车)
  4. 打开浏览器访问Github

ping.eu ping

反馈请联系hertz@hertzwang.com,谢谢

概述

WebViewJavascriptBridge可用于iOS原生(以下简称原生)与JavaScript(以下简称JS)交互,集成和使用参考README.md

Bridge通过WebView初始化后加载网页,html首次加载时新建一个隐藏的iframe,通过设置scr来触发原生URL拦截从而达到注入JS的目的

原生注册方法供JS调用:JS调用时先将方法名和传参缓存(至sendMessageQueue),再更新iframe.scr触发原生URL拦截(-webView:decidePolicyForNavigationAction:decisionHandler:),原生调用JS方法(WebViewJavascriptBridge._fetchQueue();)获取方法名和传参,解析后从bridge.base.messageHandlers取出对应的Block然后执行

JS注册方法供原生调用:原生通过bridge可直接调用JS方法

文件目录

  • WebViewJavascriptBridge:适用于UIWebView的Bridge,操作系统在MAC_10_9以上或设备为IPHONE_7_1及上中,使用WebViewJavascriptBridgeBase对象做为Bridge
  • WKWebViewJavascriptBridge:适用于WKWebView的Bridge
  • WebViewJavascriptBridgeBase:Bridge的基于组件,用于存储原生注册的方法、封装JS方法的调用等
  • WebViewJavascriptBridge_JS:声名的C方法,内部有注入WebView中的JS代码
阅读全文 »

反馈请联系hertz@hertzwang.com,谢谢

选择区域

  1. 打开AWS官网,点击右上角的登录控制台
  2. 登录成功点击右上角-Account进入到账号主页
  3. 向下滑动到AWS 区域部分,确认目标区域状态已开启
  4. 点击页面左上角的Services,选择计算-EC2
  5. 点击右上角的“地区名”切换服务器地区

创建EC2实例

Windows Server 2012 R2

创建实例:

  1. 按照以上操作选择好EC2的区域,例如:Services-计算-EC2,右上角地区选择香港
  2. 点击左侧菜单的实例-实例
  3. 点击右上角的启动新实例
  4. 快速启动中选择Windows - Microsoft Windows Server 2012 R2 Base
  5. 确认有明显的“支持免费套餐”字样后并点击右侧的启动实例
  6. 创建密钥对,选择创建新密钥对并输入名称,模式使用默认的.pem,然后点击创建密钥对自动下载(获取Administer密码时需要)
  7. 最后再次点击启动实例

调整安全组:

  1. Services-计算-EC2,右上角地区选择香港
  2. 点击左边菜单实例-实例,并点击实例ID,如: i-01ab02cd03ef04gh
  3. 实例摘要中切换至安全标签,并点击安全组ID,如:sg-00cd03ef04gh(launch-xxxx-x)
  4. 安全组详细信息页面点击入站规则-编辑入站规则
  5. 添加规则:
    类型 协议 端口范围
    RDP TCP 3389 0.0.0.0/0
    HTTPS TCP 443 0.0.0.0/0
    自定义TCP TCP 80 0.0.0.0/0
    自定义TCP TCP 6612 0.0.0.0/0
    自定义TCP TCP 8000 0.0.0.0/0
    自定义TCP TCP 8191 0.0.0.0/0
    自定义TCP TCP 8192 0.0.0.0/0
    自定义TCP TCP 8388 0.0.0.0/0
    自定义TCP TCP 9000 0.0.0.0/0
阅读全文 »

反馈请联系hertz@hertzwang.com,谢谢

用Python脚本来检查Mac联网状态,在达到条件后重启Mac

Python 脚本

# -*- coding: utf-8 -*-
import os
import asyncio
import time
from enum import Enum

# 策略enum:1-重启电脑 2-启动网卡
class RunActionType(Enum):
    reboot = 1
    restart_net = 2
    

# root密码
root_pwd = ''
# 策略
run_action_type = RunActionType.restart_net.value

# 退出循环标记
allow_loop = True
# 时间间隔
tiem_sleep_interval = 3
# 失败次数
failed_count = 0
# 失败最大次数
failed_max_count = 2
# 终端命令
command_reboot = 'echo %s | sudo -S reboot' % root_pwd
command_network_down = 'echo %s | sudo -S ifconfig en0 down' % root_pwd
command_network_up = 'echo %s | sudo -S ifconfig en0 up' % root_pwd


# 检查网络状态
async def loop_ping():
    global allow_loop, failed_count
    
    while allow_loop:
        result = os.system('curl baidu.com')
        if result:
            failed_count += 1
            print(result)
        else:
            failed_count = 0
            
        if failed_count >= failed_max_count:
            allow_loop = False
            failed_count = 0
            run_action()
        else:
            time.sleep(tiem_sleep_interval)
        

# 策略
def run_action():
    if run_action_type == RunActionType.reboot.value:
        reboot_action()
    elif run_action_type == RunActionType.restart_net.value:
        restart_net_action()

# 启动电脑
def reboot_action():
    print("启动电脑")
    os.system(command_reboot)
    
# 启动网卡
def restart_net_action():
    print("重启网卡")
    os.system(command_network_down)
    time.sleep(5)
    os.system(command_network_up)
    print("网卡重启结束")

if __name__ == '__main__':
    print("开始监听网络连接")
    loop = asyncio.get_event_loop()
    loop.run_until_complete(loop_ping())

部署

  1. 将整个文件夹放到当前用户目录下,即cd ~目录下
  2. 制作启动程序,参考链接https://jingyan.baidu.com/article/9c69d48fe7a2c913c9024eb6.html
    1. 打开 自动操作.app->新建文稿->应用程序->选取,或者文件->新建->应用程序->选取
    2. 搜索shell,将运行Shell脚本拖动到右边的
    3. 运行Shell脚本的Shell路径选择/bin/bash
    4. 内容输入 pythonBinPath pyFilePath,例如:/usr/bin/python3 ~/Script/reboot.py
      • pythonBinPath:python命令路径,终端执行which python查看
      • pyFilePath:python脚本路径
    5. 执行文件->存储保存应用程序
  3. 添加启动项
    1. 打开系统偏好设置->用户与群组
    2. 选择当前用户->登录项-> + ,选择制作的启动程序
  4. 配置参数
    1. 打开reboot.py
    2. 修改root_pwd
    3. 修改run_action_type
    4. 修改其它参数
  5. 双击制作的启动程序,启动成功后会在Mac上的菜单栏中显示图标(旋转的⚙️)

反馈请联系hertz@hertzwang.com,谢谢

Apple官方文档Model-View-Controller

Apple官方DemoMVCNetworking

概述

MVC即Model-View-Controller,是一个复合设计模式,由于一些基本的设计模式组成,这些基本模式一直工作,定义功能分离和通信路径,将整体分为了三个角色Model、View、Controller各司其职

  • Model:数据模型,并具有基本行为能力,例如数据解析
  • View:视图,用于展示和编辑Model中的数据
  • Controller:控制器,将Model绑定到View

组合角色,例如Model ControllerView Controller

  • Model Controller:模型控制器,主要关注Model层控制,“拥有”该Model,主要职责是管理Model并与View通信,例如NSDocument自动处理与保存文件相关的操作
  • View Controller:视图控制器,主要关注View层的控制,”拥有”该View,主要职责是管理界面并与Model通信,实现根据Model显示View的相关处理,例如NSWindowController

传统的MVC

在最初的概念(Smalltalk)中,由于组合模式、策略模式和观察者模式组成,View与Model有通信

  • 组合模式:View实际上是一组嵌套View的组合,按照设定的层次结构显示,这些View可以是组合视图(UITableView)也可以是单个视图(UIButton),任意View都可以被用户编辑和显示
  • 策略模式:Controller为一个或多个View实现策略,View只管展示(视角方面),并委托Controller去决策所有View特定的接口行为,例如Controller通过UITableViewdata sourcedelegate来控制数据及处理响应事件
  • 观察者模式:View观察Model的状态变化,收到通知后更新外观

用户在View上操作生成事件,Controller接收事件并根据策略处理事件,这个策略可以是更新Model或者更新View,当Model状态变化时通知View更新外观

Traditional version of MVC as a compound pattern

阅读全文 »

反馈请联系hertz@hertzwang.com,谢谢

记录使用Xcode 13新建项目,Deployment iOS 13以下无法运行的处理方案

删除 Scene 相关

  1. SceneDelegate.swift、SceneDelegate.h/SceneDelegate.m
  2. AppDelegate.swift/AppDelegate.m中的configurationForConnectingdidDiscardSceneSessions方法
  3. Info.plist中删除 Application Scene Manifest

反馈请联系hertz@hertzwang.com,谢谢

官方网址:http://appium.io

参考文章:

iOS自动化测试之Appium的安装和使用
Appium XCUITest 驱动在真机上的设置
Appium 遇到 Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65 的解决方法

安装 Appium Server

  1. 打开链接 https://github.com/appium/appium-desktop/releases 下载最新版本 Appium-Server-GUI-mac-x.xx.x.dmg
  2. 下载之后终端执行 xattr -cr Appium-Server-GUI-mac-x.xx.x.dmg 来处理无效文件问题
  3. 打开 Appium-Server-GUI-mac-x.xx.x.dmg 之后将内容拖动至 Applications中
  4. 最后执行 codesign --deep --sign - /Applications/Appium\ Server\ GUI.app 来处理签名导致的js问题

安装 Appium Client

  1. 打开链接 https://github.com/appium/appium-inspector/releases 下载最新版本 Appium-Inspector-mac-xxxx.x.x.dmg
  2. 下载之后终端执行 xattr -cr Appium-Inspector-mac-xxxx.x.x.dmg 来处理无效文件问题
  3. 打开 Appium-Server-GUI-mac-x.xx.x.dmg 之后将内容拖动至 Applications中
阅读全文 »

反馈请联系hertz@hertzwang.com,谢谢

源于 qcloud-sdk-ios 上的代码块描述,应用实例 Fast Code

文件内容

.codesnippet结尾的xml文件,存放在~/Library/Developer/Xcode/UserData/CodeSnippets文件夹,完整示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDECodeSnippetCompletionPrefix</key>
<string>代码块前缀</string>
<key>IDECodeSnippetCompletionScopes</key>
<array>
<string>代码块作用域</string>
</array>
<key>IDECodeSnippetContents</key>
<string>代码块内容</string>
<key>IDECodeSnippetIdentifier</key>
<string>代码块唯一标识符</string>
<key>IDECodeSnippetLanguage</key>
<string>Xcode.SourceCodeLanguage.Objective-C</string>
<key>IDECodeSnippetSummary</key>
<string>代码块概要</string>
<key>IDECodeSnippetTitle</key>
<string>代码块标题</string>
<key>IDECodeSnippetUserSnippet</key>
<true/>
<key>IDECodeSnippetVersion</key>
<integer>2</integer>
</dict>
</plist>

分析

总结

Xcode中可修改条目有七项,分别是Title、Summary、Content、Language、Platform、Completion和Availability,下载后文件与Xcode生成的文件做对比差异如下:

  1. 代码块前缀 IDECodeSnippetCompletionPrefix 对应的 string
  2. 代码块作用域 IDECodeSnippetCompletionScopes 对应的 array,目前已知有 All、CodeBlock
  3. 代码块内容 IDECodeSnippetContents 对应的 string,其中填充部份以 <# 开头并以 #> 结尾,Xcode中是 <#填充部分#>
  4. 代码块唯一标识符 IDECodeSnippetIdentifier 对应的 string,格式为 8位-4位-4位-4位-12位 的16进制,如:FF167DB4-0C2D-4F6D-9A2B-0C0785239FFB
  5. 代码块概要 IDECodeSnippetSummary 对应的string,无内容可为空字符串
  6. 代码块标题 IDECodeSnippetTitle 对应的 string
阅读全文 »