果酱 发布的文章

步骤

  • 下载MacOS系统镜像

    • 分离线安装包和在线安装包,Windows下只能制作在线安装包。
  • 系统镜像烧入U盘

  • 在线安装要装好WIFI驱动AirportItlwm.kext

Troubleshoot

  1. 可以先用DEBUG版OC,方便查错
  2. 无法进安装,报错:UnSupported while loading boot.efi 就是镜像问题
  3. WIFI安装时可用,装好进系统不能用:SecureBootMode要打开,Default

    AirportItlwm.kext install
    All steps from itlwm.kext + one of the following steps to load IO80211Family on macOS Catalina and >earlier (level of recommendation decreases):

    • Enable Apple Secure Boot (Please read OpenCore's official manual)
  4. 屏幕进系统亮度非常低,几分钟后才能恢复

    WhateverGreen 加起动参数-igfxblr
  5. 屏幕亮度调用快捷键 BrightnessKeys

    Fn+S 亮度减;Fn+B 亮度加
  6. HDMI输出调整
    参考教程:核显接口输出定制
    所需参数,在OpenCoreConfiger上格式:

    • AAPL,ig-platform-id = 00009B3E
    • device-id = 9B3E0000
    • enable-hdmi20 = 01000000
    • framebuffer-con1-alldata = 01010900 00080000 87010000
    • framebuffer-con1-enable = 01000000
    • framebuffer-fbmem = 00009000
    • framebuffer-patch-enable = 01000000
    • framebuffer-stolenmem = 00003001
    • fda-gfx = onboard-1
  7. 苹果挂载EFI分区,在里面删除了文件,只是放入垃圾桶里,并没有把空间腾出来,需要在垃圾桶里再清空才能
  8. 耳机输出

    • 需设置声卡的layoutid,可以在boot-arg或者在deviceProperties添加声卡属性设置;
    • layoutid=15
    • 11和16都有声但是静音快捷键无效
  9. Chrome全屏播放会闪屏,确认是Chrome硬件加速的问题。Safari是正常的。

BUG

  1. Fn+Insert会死机

    Fn+Insert 本来是睡眠快捷键
  2. Esc/F4/F5/F6按键无效,按不出来 ,大概率是硬件问题

我的成品仓库

教程:国光黑苹果教程

官方手册:Opencore


DLLWrapper

using System;
using System.Runtime.InteropServices;

namespace Myapp
{
    public class DLLWrapper
    {
        ///<summary>
        /// API LoadLibrary
        ///</summary>
        [DllImport("Kernel32")]
        public static extern int LoadLibrary(String funcname);

        ///<summary>
        /// API GetProcAddress
        ///</summary>
        [DllImport("Kernel32")]
        public static extern int GetProcAddress(int handle, String funcname);

        ///<summary>
        /// API FreeLibrary
        ///</summary>
        [DllImport("Kernel32")]
        public static extern int FreeLibrary(int handle);

        ///<summary>
        ///通过非托管函数名转换为对应的委托
        ///</summary>
        ///<param name="dllModule">通过LoadLibrary获得的DLL句柄</param>
        ///<param name="functionName">非托管函数名</param>
        ///<param name="t">对应的委托类型</param>
        ///<returns>委托实例,可强制转换为适当的委托类型</returns>
        public static Delegate GetFunctionAddress(int dllModule, string functionName, Type t)
        {
            int address = GetProcAddress(dllModule, functionName);
            if (address == 0)
            {
                return null;
            }
            else
            {
                //生成委托返回
                return Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);
            }
        }

        ///<summary>
        ///将表示函数地址的IntPtr实例转换成对应的委托
        ///</summary>
        public static Delegate GetDelegateFromIntPtr(IntPtr address, Type t)
        {
            if (address == IntPtr.Zero)
            {
                return null;
            }
            else
            {
                return Marshal.GetDelegateForFunctionPointer(address, t);
            }
        }

        ///<summary>
        ///将表示函数地址的int转换成对应的委托,by jingzhongrong
        ///</summary>
        public static Delegate GetDelegateFromIntPtr(int address, Type t)
        {
            if (address == 0)
            {
                return null;
            }
            else
            {
                return Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);
            }
        }
    }
}

使用

using System;
using System.Text;

namespace Myapp
{
    public class DesProvider
    {
        public delegate bool Merge_De(string stimeStr, string etimeStr, string macStr, string flg, StringBuilder mergedStr);

        private readonly string dllPath = string.Empty;
        private int cModule;

        public DesProvider(string _desPath)
        {
            this.dllPath = _desPath;
        }

        private void LoadDLL()
        {
            // string dllPath = HttpContext.Current.Server.MapPath("~");
            this.cModule = DLLWrapper.LoadLibrary(this.dllPath);
        }

        private void FreeModule()
        {
            DLLWrapper.FreeLibrary(this.cModule);
        }

        #region ---------- 公共方法 ------------

        public bool Merge(string sTimeStr, string eTimeStr, string macStr, string flg, StringBuilder mergedStr)
        {
            bool rtv = false;
            this.LoadDLL();
            try
            {
                //包装类返回委托
                Merge_De mg = (Merge_De)DLLWrapper.GetFunctionAddress(this.cModule, "Merge", typeof(Merge_De));
                rtv = mg(sTimeStr, eTimeStr, macStr, flg, mergedStr);
            }
            catch (Exception)
            {
            }
            finally
            {
                this.FreeModule();
            }
            return rtv;
        }
    }
}

前言
PL/pgSQL是Postgres的sql实现,借鉴了PL/SQL,后者是Oracle的sql实现

语法

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

例:

CREATE FUNCTION somefunc() RETURNS integer AS $$
<< outerblock >>
DECLARE
    quantity integer := 30;
BEGIN
    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 30
    quantity := 50;
    --
    -- 创建一个子块
    --
    DECLARE
        quantity integer := 80;
    BEGIN
        RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 80
        RAISE NOTICE 'Outer quantity here is %', outerblock.quantity;  -- Prints 50
    END;

    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 50

    RETURN quantity;
END;
$$ LANGUAGE plpgsql;

注意:

  1. $$ 或者 $xxx$ 是函数代码段的起止符
  2. :name 动态入参,运行时会求填参;(在Oracle里是&name)
  3. do $$ ... $$ 可以不定义直接运行函数段

实例:

DO $body$
declare
i integer;
K integer;
num integer;
t timestamp;
tablename varchar; 
t1 timestamp;
begin    
num :=3218101;
i := 1;
t:=:t;    
t1:=t;
<<goto_label>>
WHILE i<=17280 loop
INSERT INTO :tablename
("number", transducertype, siteid, value, "maxvalue", maxvaluetime, "minvalue", minvaluetime, changecount, lasttime)
VALUES(num, 1, 10, null, 0, null, 0, null, 0, t);
 i:=i+1;
t:=t+'5sec';
 IF i = 17280 then
 num:=num+1;
 IF num <= 3218151 then
 i := 1;
t:=t1;    
    CONTINUE goto_label;
     END IF;
  END IF;
END loop;
end;
$body$ LANGUAGE PLPGSQL;

手册:PL/pgSQL的结构


总览

在同一个upstream上配置多个server地址,配置权重等

upstream test {
    server localhost:1000 weight=2;
    server localhost:1001 weight=1;
}

示例

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    #负载均衡流,默认轮询
    upstream test {
        server localhost:1000;
        server localhost:1001;
    }
    #负载1入口
    server {
        listen 1000;
        server_name localhost;
        location / {
            root   html/1;
            index  index.html index.htm;
        }
    }
    #负载2入口
    server {
        listen 1001;
        server_name localhost;
        location / {
            root   html/2;
            index  index.html index.htm;            
        }
    }
    #总入口反向代理
    server {
        listen 80;
        server_name localhost;
        location / {
            #access_log logs/access.log main;
            proxy_pass http://test;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_redirect default;
            proxy_buffer_size 512k;
            proxy_buffers 6 512k;
            proxy_busy_buffers_size 512k;
            proxy_temp_file_write_size 512k;
            client_max_body_size 100m;
        }
    }
}

参考文章

Nginx负载均衡简单配置


配置https转发

localhost:80 => 433

433下分流,跟据Server_name转发

localhost:80 www.ppos.com ppos.com
localhost:8080 blog.ppos.com

#upstream weibo {
#    server http://node-server:3001;
#}
upstream blog {
    server 119.91.72.211:8080;
}
# 根据不同域名转发
server {
    listen       80;
    server_name  ppos.top www.ppos.top;
    return 301 https://ppos.top;
}
server {
    listen       80;
    server_name  blog.ppos.top;
    return 301 https://blog.ppos.top;
}

server {
    listen 443 ssl http2;
    server_name  blog.ppos.top;

    ssl                      on;
    ssl_certificate          /etc/nginx/certs/cert.pem;
    ssl_certificate_key      /etc/nginx/certs/privkey.pem;
    ssl_session_timeout  5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    # blog地址在upstream里定义
    location / {
     proxy_pass         http://blog;
    proxy_set_header     Host  $host;
    proxy_set_header     REMOTE-HOST $remote_addr;
    proxy_set_header     X-Real-IP  $remote_addr;
    proxy_set_header     X-Forwarded-For  $proxy_add_x_forwarded_for;
    #proxy_buffering      off;
    proxy_set_header     X-Forwarded-Proto $scheme; #没这个css不法转发
    }

}
server {
    listen 443 ssl http2;
    server_name  ppos.top www.ppos.top;

    ssl                      on;
    ssl_certificate          /etc/nginx/certs/cert.pem;
    ssl_certificate_key      /etc/nginx/certs/privkey.pem;

    ssl_session_timeout  5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    # 后端代理
    location ~ /api {
        proxy_pass http://node-server:3001; #docker 容器地址
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
    }
}