<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>OUYANG.ME</title>
    <link>https://ouyang.me/</link>
    <description>Recent content on OUYANG.ME</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 20 Oct 2024 13:01:44 +0800</lastBuildDate>
    
        <atom:link href="https://ouyang.me/index.xml" rel="self" type="application/rss+xml" />
    
    
    
        <item>
        <title>Azure 节点速度测试</title>
        <link>https://ouyang.me/posts/azure-latency-test/</link>
        <pubDate>Sun, 20 Oct 2024 13:01:44 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/azure-latency-test/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/azure-latency-test/ -&lt;p&gt;测试工具网站: &lt;a href=&#34;https://www.azurespeed.com/Azure/Latency&#34;&gt;https://www.azurespeed.com/Azure/Latency&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从我家试了一下，新加坡(Southeast Asia)居然是延迟最低的，其次是东京(Japan East)。
美国的话华盛顿州(West US 2)比加州(West US)要快一点。
测试结果截图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;./azure-latency-test-result.png&#34; alt=&#34;azure-latency-test-result&#34;&gt;&lt;/p&gt;
- https://ouyang.me/posts/azure-latency-test/ - </description>
        </item>
    
    
    
        <item>
        <title>解决notion不支持URL scheme 链接的问题</title>
        <link>https://ouyang.me/posts/using-url-scheme-link-in-notion/</link>
        <pubDate>Sun, 18 Sep 2022 17:17:59 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/using-url-scheme-link-in-notion/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/using-url-scheme-link-in-notion/ -&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;写文档的时候，有时候想创建一个链接，指向obsidian文档(&lt;code&gt;obsidian://&lt;/code&gt;)，logseq文档(&lt;code&gt;logseq://&lt;/code&gt;)或者任意的本地的文件(&lt;code&gt;file:///&lt;/code&gt;)。&lt;/li&gt;
&lt;li&gt;某些软件支持这样的URL scheme 链接，但是有些软件只支持HTTP链接，不支持URL scheme，比如notion。所以一个变通的办法是把URL scheme链接转为HTTP链接，可以看看&lt;a href=&#34;https://kevinjalbert.com/using-url-scheme-links-in-notion/&#34;&gt;Using URL Scheme Links in Notion | Kevin Jalbert&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;上面这篇blog里的一个问题是它依赖 &lt;a href=&#34;https://tinyurl.com/&#34;&gt;tinyurl.com&lt;/a&gt;，而且生成链接的过程需要手动操作，比较麻烦。我做了两个改进
&lt;ul&gt;
&lt;li&gt;首先，去除对&lt;a href=&#34;https://tinyurl.com/&#34;&gt;tinyurl.com&lt;/a&gt;的依赖，用一个本地HTTP server来替代它。&lt;/li&gt;
&lt;li&gt;其次，更快速的根据URL scheme链接生成HTTP链接。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;原理&#34;&gt;原理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;我有一个URL scheme链接，比如
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;logseq://graph/logseq?page=XXX&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第一步，在把它粘贴到notion的时候，我会把它转换为一个HTTP链接
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http://127.0.0.1:10114/v1?l=logseq%3A%2F%2Fgraph%2Flogseq%3Fpage%3DXXX&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第二步，我用go写了一个非常简单的Local HTTP Server，监听10114端口。它收到请求后，会把上面的链接重定向到
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;logseq://graph/logseq?page=XXX&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这样在notion里点击如上的链接，就会先跳到浏览器，然后跳转到logseq打开对应的文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;实现说明&#34;&gt;实现说明&lt;/h2&gt;
&lt;h3 id=&#34;第一步用快捷键把url-scheme链接粘贴为http链接&#34;&gt;第一步，用快捷键把URL scheme链接粘贴为HTTP链接&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;实现效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我先从logseq里复制出文档的URL scheme链接。&lt;/li&gt;
&lt;li&gt;进入notion，按快捷键&lt;code&gt;alt+shift+0&lt;/code&gt;，自动粘贴出转换好的HTTP链接。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这一步我用AutoHotKey实现，代码如下&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;; 读取剪贴板内容，用url encode编码，生成一个本地http链接，并写回剪贴板，然后粘贴。
; 用来解决notion不支持url scheme的问题

; https://www.autohotkey.com/boards/viewtopic.php?t=86419
EncodeDecodeURI(str, encode := true, component := true) {
   static Doc, JS
   if !Doc {
      Doc := ComObjCreate(&amp;#34;htmlfile&amp;#34;)
      Doc.write(&amp;#34;&amp;lt;meta http-equiv=&amp;#34;&amp;#34;X-UA-Compatible&amp;#34;&amp;#34; content=&amp;#34;&amp;#34;IE=9&amp;#34;&amp;#34;&amp;gt;&amp;#34;)
      JS := Doc.parentWindow
      ( Doc.documentMode &amp;lt; 9 &amp;amp;&amp;amp; JS.execScript() )
   }
   Return JS[ (encode ? &amp;#34;en&amp;#34; : &amp;#34;de&amp;#34;) . &amp;#34;codeURI&amp;#34; . (component ? &amp;#34;Component&amp;#34; : &amp;#34;&amp;#34;) ](str)
}

+!0::
link := clipboard
; 这个url会交给一个local http server 来解析，转换回link
encodedLink := &amp;#34;http://127.0.0.1:10114/v1?l=&amp;#34; EncodeDecodeURI(link)
clipboard := encodedLink
Send, ^v
return
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;第二步解析http链接并重定向回url-scheme链接&#34;&gt;第二步，解析HTTP链接并重定向回URL scheme链接&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这一步，用Go写了一个非常简单的HTTP server，代码如下：&lt;/li&gt;
&lt;li&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package main

import (
    &amp;#34;fmt&amp;#34;
    &amp;#34;log&amp;#34;
    &amp;#34;net/http&amp;#34;
)

func myHandler(w http.ResponseWriter, r *http.Request) {
    l := r.URL.Query().Get(&amp;#34;l&amp;#34;)
    if l != &amp;#34;&amp;#34; {
        http.Redirect(w, r, l, http.StatusFound)
    } else {
        fmt.Fprintf(w, &amp;#34;need l query parameter as http://127.0.0.1:10114/v1?l=XXX\n&amp;#34;)
    }
}

func main() {
    http.HandleFunc(&amp;#34;/v1&amp;#34;, myHandler)
    log.Fatal(http.ListenAndServe(&amp;#34;127.0.0.1:10114&amp;#34;, nil))
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Windows用下面的命令编译，可以启动为后台进程，不显示命令行窗口：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;go build -ldflags -H=windowsgui&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;把生成好的exe文件放到开机自启动即可。&lt;/li&gt;
&lt;/ul&gt;
- https://ouyang.me/posts/using-url-scheme-link-in-notion/ - </description>
        </item>
    
    
    
        <item>
        <title>Windows命令行下类似于MacOS的Open命令</title>
        <link>https://ouyang.me/posts/open-command-for-windows-like-macos/</link>
        <pubDate>Wed, 08 Jun 2022 13:34:20 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/open-command-for-windows-like-macos/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/open-command-for-windows-like-macos/ -&lt;p&gt;习惯了在macOS的Terminal里使用open命令，想在windows下也找一个类似的命令。&lt;/p&gt;
&lt;p&gt;之前不记得在哪里找到了一个shell脚本，内容如下，把文件起名为&lt;code&gt;open&lt;/code&gt;，放到&lt;code&gt;PATH&lt;/code&gt;里就可以。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/sh
# open

EDITOR=&amp;#34;exec notepad.exe&amp;#34;
BROWSER=&amp;#34;/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe&amp;#34;

if [ -d &amp;#34;$1&amp;#34; ]; then
    exec explorer.exe $(cygpath -w &amp;#34;$1&amp;#34;)
elif [ -f &amp;#34;$1&amp;#34; ]; then
    path=$(cygpath --windows &amp;#34;$1&amp;#34;)
    case &amp;#34;$1&amp;#34; in
    *.xml) $EDITOR &amp;#34;$1&amp;#34;;;
    *.txt) $EDITOR &amp;#34;$1&amp;#34;;;
    *.html) &amp;#34;$BROWSER&amp;#34; &amp;#34;$path&amp;#34;;;
    file://*) &amp;#34;$BROWSER&amp;#34; &amp;#34;$path&amp;#34;;;
    http://*) &amp;#34;$BROWSER&amp;#34; &amp;#34;$path&amp;#34;;;
    https://*) &amp;#34;$BROWSER&amp;#34; &amp;#34;$path&amp;#34;;;
    esac
else
    # TODO non-existent file/dir
    echo &amp;#34;non existent file: $1&amp;#34;
    exit 1
fi

exit 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;但这个脚本有很大局限，只能用编辑器或者浏览器打开文件。&lt;/p&gt;
&lt;p&gt;今天找到一个开源项目&lt;a href=&#34;https://github.com/neosmart/open&#34;&gt;neosmart/open&lt;/a&gt;，更为通用，会根据文件类型找对应的程序打开。&lt;/p&gt;
- https://ouyang.me/posts/open-command-for-windows-like-macos/ - </description>
        </item>
    
    
    
        <item>
        <title>把Blog构建工具从Octopress换到Hugo</title>
        <link>https://ouyang.me/posts/migrate-from-octopress-to-hugo/</link>
        <pubDate>Sat, 27 Nov 2021 16:58:53 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/migrate-from-octopress-to-hugo/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/migrate-from-octopress-to-hugo/ -&lt;p&gt;把Blog构建工具从Octopress换到Hugo。&lt;/p&gt;
&lt;p&gt;选一个符合需求的theme。我的需求如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;简洁&lt;/li&gt;
&lt;li&gt;支持 Table Of Contents&lt;/li&gt;
&lt;li&gt;支持 mermaid&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后没有找到完全满意的，选了&lt;a href=&#34;https://themes.gohugo.io/themes/hugo-theme-diary/&#34;&gt;hugo-theme-diary&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;基于diary做了一些改造。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;把页面宽度调大一点。修改hugo theme的源文件&lt;code&gt;assets/scss/journal.scss&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $side-container-width: 25%;
 $extra-container-width: 25%;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; $side-container-width: 20%;
 $extra-container-width: 20%;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持mermaid。参考&lt;a href=&#34;https://clslaid.icu/add_mermaid_support_to_even_theme/#%E5%A6%82%E4%BD%95%E4%B8%BA%E4%BD%A0%E7%9A%84-hugo-%E5%8D%9A%E5%AE%A2%E5%BC%95%E5%85%A5-mermaid-%E6%94%AF%E6%8C%81&#34;&gt;如何为你的 Hugo 博客引入 mermaid 支持？&lt;/a&gt;。原理就是把Hugo生成的HTML片段从&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;#34;language-mermaid&amp;#34;&amp;gt;
    &amp;lt;!-- mermaid code --&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;转换为：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;div class=&amp;#34;mermaid&amp;#34;&amp;gt;
    &amp;lt;!-- mermaid code --&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在Blog仓库的路径下增加&lt;code&gt;layouts/partials/journal.html&lt;/code&gt;，内容如下：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;script language=&amp;#34;javascript&amp;#34;&amp;gt;
window.onload = function(e){ 
    const blocks = document.querySelectorAll(&amp;#34;pre code.language-mermaid&amp;#34;);
    for (let i = 0; i &amp;lt; blocks.length; i++) {
        const block = blocks[i];
        const rootElement = block.parentElement;
        var container = document.createElement(&amp;#34;div&amp;#34;);
        container.className = &amp;#34;align-center mermaid&amp;#34;;
        container.textContent = block.childNodes[0].textContent;
        rootElement.parentElement.replaceChild(container, rootElement);
    }
}
&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;#34;https://cdn.bootcdn.net/ajax/libs/mermaid/8.11.2/mermaid.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因为换构建工具，这次也想把生成的路径也去掉日期。所以之前Blog里一些内部引用的链接也会失效。&lt;/p&gt;
&lt;p&gt;参考&lt;a href=&#34;https://gohugo.io/content-management/cross-references/&#34;&gt;Links and Cross References&lt;/a&gt;，能搜出来的绝对引用链接，都在文章里替换为：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{&amp;lt; relref &amp;#34;document-name&amp;#34; &amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FIX disqus评论，修改&lt;code&gt;themes/diary/layouts/partials/comment.html&lt;/code&gt;中disqus的部分：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{ if .Site.Params.disqusShortname }}
&amp;lt;div id=&amp;#34;disqus_thread&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
    var disqus_config = function () {
    this.page.url = &amp;#34;{{.Permalink }}&amp;#34;;  // Replace PAGE_URL with your page&amp;#39;s canonical URL variable
    this.page.identifier = &amp;#34;{{.Slug}}&amp;#34;; // Replace PAGE_IDENTIFIER with your page&amp;#39;s unique identifier variable
    };

    (function() { // DON&amp;#39;T EDIT BELOW THIS LINE
    var d = document, s = d.createElement(&amp;#39;script&amp;#39;);
    s.src = &amp;#39;https://{{.Site.Params.disqusShortname}}.disqus.com/embed.js&amp;#39;;
    s.setAttribute(&amp;#39;data-timestamp&amp;#39;, +new Date());
    (d.head || d.body).appendChild(s);
    })();
&amp;lt;/script&amp;gt;
{{ end }}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;隐藏post。&lt;/p&gt;
&lt;p&gt;如果只隐藏单个post，不让它在首页或者posts页面出现，可以&lt;a href=&#34;https://gohugo.io/content-management/build-options/#list&#34;&gt;在文章源文件的front matter里加入&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; _build: {&amp;quot;list&amp;quot;:false }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要&lt;a href=&#34;https://discourse.gohugo.io/t/solved-disable-index-some-sections-pages/20675/2&#34;&gt;隐藏一个系列（section）的文章&lt;/a&gt;，那么要修改&lt;code&gt;themes/diary/layouts/index.html&lt;/code&gt;，把&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; {{range .Paginator.Pages}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; {{range (where .Paginator.Pages &amp;quot;Section&amp;quot; &amp;quot;not in&amp;quot; site.Params.invisibleSections)}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时在 &lt;code&gt;config.toml&lt;/code&gt; 里增加配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; [params]
 invisibleSections = [&amp;quot;this-is-a-hidden-section&amp;quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
- https://ouyang.me/posts/migrate-from-octopress-to-hugo/ - </description>
        </item>
    
    
    
        <item>
        <title>在macOS Sierra中使用 shift 键切换输入法</title>
        <link>https://ouyang.me/posts/use-shift-to-switch-input-method-in-macos-sierra/</link>
        <pubDate>Thu, 27 Oct 2016 17:57:07 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/use-shift-to-switch-input-method-in-macos-sierra/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/use-shift-to-switch-input-method-in-macos-sierra/ -&lt;p&gt;之前写过&lt;a href=&#34;https://ouyang.me/posts/use-shift-to-switch-input-method-in-os-x/&#34;&gt;《在OS X中使用 Shift 键切换输入法》&lt;/a&gt;，但是很遗憾，macOS Sierra底层键盘驱动有调整，Karabiner不能用了。Karabiner的作者Takayama Fumihiko新开了一个项目&lt;a href=&#34;https://github.com/tekezo/Karabiner-Elements&#34;&gt;Karabiner-Elements&lt;/a&gt;，计划在完善这个项目之后再去开发macOS Sierra下能用的新版本Karabiner。&lt;/p&gt;
&lt;p&gt;Karabiner-Elements目前只能解决单个key的映射，比如把CapsLock映射为LeftControl。不过今天看到&lt;a href=&#34;https://github.com/tekezo/Karabiner-Elements/issues/16#issuecomment-249506498&#34;&gt;一个方法&lt;/a&gt;，可以实现用right_shift切换输入法。&lt;/p&gt;
&lt;p&gt;具体如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装最新的Karabiner-Elements。&lt;/li&gt;
&lt;li&gt;在Karabiner-Elements里把right_shift映射为F19。&lt;/li&gt;
&lt;li&gt;在系统设置里，把F19设置为切换输入法的快捷键。&lt;/li&gt;
&lt;li&gt;此时，right_shift可以用来切换输入法了。但是如果同时想保留&lt;code&gt;⌘+Space&lt;/code&gt;切换输入法的功能，需要借助Alfred，使用一个&lt;a href=&#34;https://cloudup.com/cmTRJtOkj6N+&#34;&gt;Workflow&lt;/a&gt;，将&lt;code&gt;⌘+Space&lt;/code&gt;映射为F19。&lt;/li&gt;
&lt;/ol&gt;
- https://ouyang.me/posts/use-shift-to-switch-input-method-in-macos-sierra/ - </description>
        </item>
    
    
    
        <item>
        <title>GITLAB中如何使用自签名的SSL证书</title>
        <link>https://ouyang.me/posts/how-to-use-self-signed-certificate-in-gitlab/</link>
        <pubDate>Mon, 26 Sep 2016 11:39:00 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/how-to-use-self-signed-certificate-in-gitlab/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/how-to-use-self-signed-certificate-in-gitlab/ -&lt;p&gt;我搭建了一个gitlab，平时自己开发的一些小项目，会放到这上面。
想走https访问gitlab，这样安全一点，因为只有自己用，所以就没有必要去专门买个SSL证书，而是使用自签名的证书。配置步骤记录如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;生成CA私钥&lt;code&gt;ca.key&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl genrsa -out ca.key 2048
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;准备一个配置文件&lt;code&gt;openssl_ca.conf&lt;/code&gt;，内容如下，&lt;code&gt;req_distinguished_name&lt;/code&gt;中各个字段的取值根据实际情况进行修改。这个文件并不是必须的，如果没有这个文件，后一个步骤命令中不要带上&lt;code&gt;-config openssl_ca.conf&lt;/code&gt;参数就行，那样命令执行时会提示让你输入一些组织信息。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; RANDFILE               = $ENV::HOME/.rnd

 [ req ]
 string_mask = utf8only
 utf8        = yes
 default_bits           = 2048
 default_keyfile        = ca.key
 distinguished_name     = req_distinguished_name
 prompt                 = no

 [ req_distinguished_name ]
 C                      = CN
 ST                     = Beijing
 L                      = Beijing
 O                      = XXX Inc.
 OU                     = IT Dept.
 CN                     = Custom CA
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成CA根证书&lt;code&gt;ca.crt&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl req -config openssl_ca.conf -new -x509 -days 7305 -key ca.key -out ca.crt
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;或者可以把生成&lt;code&gt;ca.key&lt;/code&gt;和&lt;code&gt;ca.crt&lt;/code&gt;的步骤用一条命令搞定：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl req -config openssl_ca.conf -new -x509 -days 7305 -newkey rsa:2048 -nodes -keyout ca.key -out ca.crt
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;服务器server私钥&lt;code&gt;server.key&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl genrsa -out server.key 2048
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;准备一个配置文件&lt;code&gt;openssl_server.conf&lt;/code&gt;，内容如下，&lt;code&gt;req_distinguished_name&lt;/code&gt;中各个字段的取值根据实际情况进行修改，注意&lt;code&gt;CN&lt;/code&gt;字段（Common Name），取值需要和网站的域名相对应，比如为&lt;code&gt;blog.ouyang.me&lt;/code&gt;申请证书，那么这里就要填&lt;code&gt;blog.ouyang.me&lt;/code&gt;。不过我想给所有&lt;code&gt;ouyang.me&lt;/code&gt;的子域名都使用同样的证书，所以这里取值填的是&lt;code&gt;*.ouyang.me&lt;/code&gt;。同样，这个文件并不是必须的，如果没有这个文件，后一个步骤命令中不要带上&lt;code&gt;-config openssl_server.conf&lt;/code&gt;参数就行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; RANDFILE               = $ENV::HOME/.rnd

 [ req ]
 string_mask = utf8only
 utf8        = yes
 default_bits           = 2048
 default_keyfile        = server.key
 distinguished_name     = req_distinguished_name
 prompt                 = no

 [ req_distinguished_name ]
 C                      = CN
 ST                     = Beijing
 L                      = Beijing
 O                      = XXX Inc.
 OU                     = IT Dept.
 CN                     = *.ouyang.me
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从服务器server私钥生成签名请求CSR文件&lt;code&gt;server.csr&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl req -config openssl_server.conf -new -key server.key -out server.csr
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同样，生成&lt;code&gt;server.key&lt;/code&gt;和&lt;code&gt;server.csr&lt;/code&gt;也可以用一条命令来做&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl req -config openssl_server.conf -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;准备CA目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; demoCA/
 ├── index.txt
 ├── newcerts/
 ├── private/
 └── serial

 # index.txt为空白文件,serial文件中输入数字如：1234.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行以下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; rm -rf demoCA
 mkdir -p demoCA/newcerts demoCA/private
 rm -rf demoCA/index.txt &amp;amp;&amp;amp; touch demoCA/index.txt
 echo 1234 &amp;gt; demoCA/serial
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用CA生成服务器证书文件&lt;code&gt;server.crt&lt;/code&gt;，注意参数&lt;code&gt;-md sha256&lt;/code&gt;，现在生成消息摘要的算法，已经不建议用&lt;code&gt;sha1&lt;/code&gt;了，chrome浏览器遇到这样的证书会给出警告，所以下面的命令里使用&lt;code&gt;sha256&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -batch -md sha256
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置 gitlab&lt;/p&gt;
&lt;p&gt;将生成的私钥&lt;code&gt;server.key&lt;/code&gt;和证书&lt;code&gt;server.crt&lt;/code&gt;上传到gitlab服务器以下位置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; /etc/gitlab/ssl/server.key
 /etc/gitlab/ssl/server.crt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改&lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; nginx[&#39;ssl_certificate&#39;] = &amp;quot;/etc/gitlab/ssl/server.crt&amp;quot;
 nginx[&#39;ssl_certificate_key&#39;] = &amp;quot;/etc/gitlab/ssl/server.key&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; gitlab-ctl reconfigure
 gitlab-ctl restart
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置信任证书&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS： 把 server.crt 或者 ca.crt 拖到 keychain里，然后双击证书选“始终信任”。&lt;/li&gt;
&lt;li&gt;iOS：把 server.crt 或者 ca.crt 发送邮件给自己，然后使用iOS自带的邮件客户端收邮件，点附件即可安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其他相关命令&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;附上Root CA crt格式转换为der格式命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl x509 -in ca.crt -outform DER -out ca.der
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;der格式适用于移动设备导入根证书。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;私钥文件（*.key）的加解密&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl rsa -des3 -in plain.key -out encrypted.key
 openssl rsa -in encrypted.key -out plain.key
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看证书文件(*.crt)中的文本信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl x509 -in ca.crt -text -noout
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看证书申请文件(*.csr)中的文本信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl req -in server.csr -text -noout
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.cnblogs.com/guogangj/p/4118605.html&#34;&gt;那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.creke.net/736.html&#34;&gt;使用OpenSSL自签发服务器https证书&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
- https://ouyang.me/posts/how-to-use-self-signed-certificate-in-gitlab/ - </description>
        </item>
    
    
    
        <item>
        <title>从Google Chrome地址栏复制hostname时去除http:// 前缀</title>
        <link>https://ouyang.me/posts/remove-protocol-prefix-when-copy-hostname-from-address-bar-in-google-chrome/</link>
        <pubDate>Sat, 03 Sep 2016 10:06:04 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/remove-protocol-prefix-when-copy-hostname-from-address-bar-in-google-chrome/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/remove-protocol-prefix-when-copy-hostname-from-address-bar-in-google-chrome/ -&lt;p&gt;从很早之前的某个版本开始，Google Chrome的地址栏的URL不再显示&amp;quot;http://&amp;quot;，
但是当我想复制域名时，在地址栏选中域名部分，按Command+C复制，剪贴板里的内容会自动加上&amp;quot;http://&amp;quot;。&lt;/p&gt;
&lt;p&gt;于是我把域名贴到命令行里执行的时候，经常是这样的场景&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;oylbin@ouyangs-MacBook-Air:~ (Window: ) &amp;gt; 
&amp;gt; ping http://www.qq.com/
ping: cannot resolve http://www.qq.com/: Unknown host
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个困扰了我好多年啊，今天终于忍不住了，上网&lt;a href=&#34;https://www.google.com/#q=copy+domain+from+chrome+address+bar&#34;&gt;搜搜有没有解决方案&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;很多人受此困扰，&lt;a href=&#34;https://www.reddit.com/r/chrome/comments/1a9zth/copy_url_from_address_bar_without_http/&#34;&gt;reddit上有人说&lt;/a&gt;他每次复制域名时故意不选中第一个字符，这样复制时，就只有选中部分的文本内容了，然后贴到命令行时自己先手敲没有被复制的那一个字符，哈哈，这跟我平时操作一样嘛。。。&lt;/p&gt;
&lt;p&gt;搜了一下没有找到解决方案，倒是看到有人写了&lt;a href=&#34;https://chrome.google.com/webstore/detail/hostcopy/ebnjnkfienhcidbgmifkjkkidheihcpj&#34;&gt;一个Chrome extension&lt;/a&gt;来专门做这个事情。可惜网速不好，这个扩展半天没下载成功，看了一下扩展大小，2.66MB，就无语了，这么个鸟功能，怎么可能要这么大。&lt;/p&gt;
&lt;p&gt;这个需求也不复杂，javascript也能通过&lt;code&gt;window.location.hostname&lt;/code&gt;读到hostname，如果能通过javascript将文本复制到系统剪贴板，那做个Bookmarklet就搞定了啊。&lt;/p&gt;
&lt;p&gt;搜了一下，&lt;a href=&#34;http://stackoverflow.com/questions/25099409/copy-to-clipboard-as-plain-text&#34;&gt;Chrome里确实可以通过&lt;code&gt;document.execCommand(&#39;Copy&#39;);&lt;/code&gt;执行复制命令&lt;/a&gt;，所以有了如下的解决方案。&lt;/p&gt;
&lt;p&gt;在地址栏新建一个书签，取名为“GetHostname”，在URL部分粘贴如下javascript代码:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;javascript:(function(){
    function executeCopy(text) {
        var input = document.createElement(&#39;textarea&#39;);
        document.body.appendChild(input);
        input.value = text;
        input.focus();
        input.select();
        document.execCommand(&#39;Copy&#39;);
        input.remove();
    }
    executeCopy(window.location.hostname);
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后也去&lt;a href=&#34;http://superuser.com/a/1120485/20006&#34;&gt;superuser.com上分享&lt;/a&gt;了一下，希望能帮到同样有这个困扰的人。&lt;/p&gt;
- https://ouyang.me/posts/remove-protocol-prefix-when-copy-hostname-from-address-bar-in-google-chrome/ - </description>
        </item>
    
    
    
        <item>
        <title>在OS X中使用 shift 键切换输入法</title>
        <link>https://ouyang.me/posts/use-shift-to-switch-input-method-in-os-x/</link>
        <pubDate>Fri, 08 Apr 2016 09:54:29 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/use-shift-to-switch-input-method-in-os-x/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/use-shift-to-switch-input-method-in-os-x/ -&lt;p&gt;出于安全的考虑，最近弃用了搜狗输入法。开始使用OS X自带的输入法。
搜狗输入法有一个很实用的功能是使用&lt;code&gt;shift&lt;/code&gt;键切换中英文输入法，但是自带的输入法没有这个功能。这让我难受了一段时间。&lt;/p&gt;
&lt;p&gt;OS X中，切换输入法的快捷键只能设置为组合键（比如&lt;code&gt;⌘＋空格&lt;/code&gt;），无法设置为单个按键。通过正常的系统设置无法做到&lt;code&gt;shift&lt;/code&gt;切换输入法。&lt;/p&gt;
&lt;p&gt;后来想到&lt;a href=&#34;https://pqrs.org/osx/karabiner/index.html.en&#34;&gt;Karabiner&lt;/a&gt;这个软件可以做按键映射，也许能解决这个问题，所以尝试了一下，最终搞定，记录一下过程。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开Karabiner的设置界面，在&lt;code&gt;Misc &amp;amp; Uninstall&lt;/code&gt;项中点击&lt;code&gt;Open private.xml&lt;/code&gt;打开自定义设置的配置文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ouyang.me/images/open_private_xml.png&#34; alt=&#34;Alt text&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在配置文件&lt;code&gt;private.xml&lt;/code&gt;中的&lt;code&gt;root -&amp;gt; item&lt;/code&gt;节点下加入如下配置项，并保存文件。原理就是将左边的&lt;code&gt;shift&lt;/code&gt;按键，映射为&lt;code&gt;⌘＋空格&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;item&amp;gt;                                                                      
   &amp;lt;name&amp;gt;Change Input Source with left shift key.&amp;lt;/name&amp;gt;         
   &amp;lt;appendix&amp;gt;(Sending Command+Space when left shift key is pressed and released immediately)&amp;lt;/appendix&amp;gt;
   &amp;lt;identifier&amp;gt;remap.shift_language_switch&amp;lt;/identifier&amp;gt;
   &amp;lt;autogen&amp;gt;__KeyDownUpToKey__ KeyCode::SHIFT_L, KeyCode::SPACE, ModifierFlag::COMMAND_L, KeyCode::COMMAND_L
   &amp;lt;/autogen&amp;gt;
 &amp;lt;/item&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;private.xml 的说明文档在 &lt;a href=&#34;https://pqrs.org/osx/karabiner/xml.html.en&#34;&gt;https://pqrs.org/osx/karabiner/xml.html.en&lt;/a&gt;&lt;br&gt;
karabiner内置配置的样例文件在&lt;code&gt;/Applications/Karabiner.app/Contents/Resources/include/&lt;/code&gt;
注意我这里使用的是&lt;code&gt;__KeyDownUpToKey__&lt;/code&gt;，而不是&lt;code&gt;__KeyToKey__&lt;/code&gt;。它们的差别在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;__KeyToKey__&lt;/code&gt;映射时，只要&lt;code&gt;shift&lt;/code&gt;键被按下并释放，那么就会触发映射。比如，当我用&lt;code&gt;shift+u&lt;/code&gt;输入大写字母&lt;code&gt;U&lt;/code&gt;时，也会触发&lt;code&gt;⌘＋空格&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;__KeyDownUpToKey__&lt;/code&gt;映射时，仅当我按下并释放&lt;code&gt;shift&lt;/code&gt;按键，同时没有按下其他任何按键时，才会触发&lt;code&gt;⌘＋空格&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在Karabiner设置界面，&lt;code&gt;Change key&lt;/code&gt;页面中，点击&lt;code&gt;Reload XML&lt;/code&gt;。然后在页面下方的custom setting中，勾选上刚刚的配置项。配置就生效了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ouyang.me/images/reload_xml_and_select.png&#34; alt=&#34;Alt text&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
- https://ouyang.me/posts/use-shift-to-switch-input-method-in-os-x/ - </description>
        </item>
    
    
    
        <item>
        <title>在群辉NAS上写hfsplus</title>
        <link>https://ouyang.me/posts/2015-12-02-write-hfsplus-disk-on-synology-nas/</link>
        <pubDate>Wed, 02 Dec 2015 16:12:09 +0800</pubDate>
        
        <guid>https://ouyang.me/posts/2015-12-02-write-hfsplus-disk-on-synology-nas/</guid>
        <description>OUYANG.ME https://ouyang.me/posts/2015-12-02-write-hfsplus-disk-on-synology-nas/ -&lt;p&gt;之前买了一个&lt;a href=&#34;http://www.apple.com/cn/shop/product/HGD32ZM/B/lacie-2tb-rugged-thunderboltusb-30-%E7%A1%AC%E7%9B%98?fnode=5f&#34;&gt;LaCie硬盘&lt;/a&gt;, 挂载到群辉NAS上之后发现是只读的状态.&lt;/p&gt;
&lt;p&gt;如果需要改为可读写的状态, 需要先禁用 hfsplus 的 journaling, 然后通过命令行在NAS上mount&lt;/p&gt;
&lt;p&gt;步骤如下:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;先把硬盘接到Mac系统上.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行下面的命令, 第二个命令的报错貌似可以忽略&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;gt; diskutil unmount /dev/disk3s1 
 &amp;gt; diskutil disableJournal force /dev/disk3s1
 An error occurred journaling the file system: The underlying task reported failure on exit (-69860)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把硬盘挂载到NAS上&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ssh远程连到NAS上的root账号, 执行下面的命令:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;gt; umount /dev/sdq1
 &amp;gt; mount -t hfsplus /dev/sdq1 /volumeUSB1/usbshare1-1
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;参考文档:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://zarino.co.uk/post/write-hfs-synology-nas&#34;&gt;Write to an HFS+ (Mac formatted) USB drive from a Synology NAS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://discussions.apple.com/thread/7315586&#34;&gt;How can I disable journaling in El Capitan?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
- https://ouyang.me/posts/2015-12-02-write-hfsplus-disk-on-synology-nas/ - </description>
        </item>
    
    
  </channel>
</rss> 