<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hammer (hammer)</title>
    <link>https://ruby-china.org/hammer</link>
    <description>别后相思空一水 重来回首已三生</description>
    <language>en-us</language>
    <item>
      <title>更好用的 Web 服务器：Caddy</title>
      <description>&lt;h2 id="What is Caddy"&gt;What is Caddy&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://caddyserver.com/" rel="nofollow" target="_blank" title=""&gt;Caddy&lt;/a&gt; 是一个用 Go 实现的 Web Server。&lt;/p&gt;

&lt;p&gt;在追求性能的道路上，nginx 已经一骑绝尘。这种情况下诞生的 Caddy 有什么特性呢？&lt;/p&gt;

&lt;p&gt;Caddy 的作者 Matt Holt 有这样的理念：其他 Web Server 为 Web 而设计，Caddy 为 human 设计。一句话就是 Caddy 主打易用性，使用配置简单。&lt;/p&gt;

&lt;p&gt;Caddy 有下面这些开箱即用的特性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;全自动支持 HTTP/2 协议，无需任何配置。&lt;/li&gt;
&lt;li&gt;Caddy 使用 Let’s Encrypt 让你的站点全自动变成 HTTPS，无需任何配置。&lt;/li&gt;
&lt;li&gt;合理使用多核多核 得益于 go 的特性&lt;/li&gt;
&lt;li&gt;完全支持 IPv6 环境&lt;/li&gt;
&lt;li&gt;Caddy 对 WebSockets 有很好的支持&lt;/li&gt;
&lt;li&gt;自动把 Markdown 转成 HTML&lt;/li&gt;
&lt;li&gt;Caddy 对 log 格式的定义很容易&lt;/li&gt;
&lt;li&gt;易于部署 得益于 go 的特性，caddy 只是一个小小的二进制文件，没有依赖，很好部署&lt;/li&gt;
&lt;li&gt;得益于 Go 的跨平台特性，Caddy 很容易的支持了三大主流系统：Windows、Linux、Mac&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“几乎所有的功能在 Caddy 里的都是插件，HTTP 服务器是插件，高级的 TLS 特性也是插件，每一行命令实现的功能都是一个插件”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="一键安装 Caddy"&gt;一键安装 Caddy&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;CADDY_TELEMETRY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on curl https://getcaddy.com | bash &lt;span class="nt"&gt;-s&lt;/span&gt; personal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示如下内容 caddy 已经安装成功&lt;/p&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7380  100  7380    0     0   6897      0  0:00:01  0:00:01 --:--:--  6897

Downloading Caddy for linux/amd64 (personal license)...

Download verification OK
Extracting...
Putting caddy in /usr/local/bin (may require password)
Caddy v1.0.3 (h1:i9gRhBgvc5ifchwWtSe7pDpsdS9+Q0Rw9oYQmYUTw1w=)
Successfully installed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="配置 Caddy"&gt;配置 Caddy&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/caddy &lt;span class="c"&gt;# 配置文件夹&lt;/span&gt;
&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Caddyfile&lt;/code&gt;写入以下内容，格式还是比较简单的&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example.com:80
gzip
log /var/log/caddy/access.log
root /var/www
tls tls@outlook.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;首先第一行必须是网站的地址&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;第 2 行的 &lt;code&gt;gzip&lt;/code&gt; 是一个指令，表示打开 gzip 压缩功能，这样网站在传输网页时降低流量&lt;/p&gt;

&lt;p&gt;第 3 行的 &lt;code&gt;log&lt;/code&gt; 指令会为网站开启 log 功能，log 后的参数是 log 文件的存放位置&lt;/p&gt;

&lt;p&gt;第 4 行的 &lt;code&gt;root&lt;/code&gt; 是指定网站的根目录&lt;/p&gt;

&lt;p&gt;第 5 行的 &lt;code&gt;tls&lt;/code&gt; 指令告诉 caddy 为网站开启 https 并自动申请证书，后面的 email 参数是告知 CA 申请人的邮箱。caddy 会默认使用 let's encrypt 申请证书并续约。
tls 也可以使用路径给出的证书 &lt;code&gt;tls /etc/ssl/cert.pem /etc/ssl/key.pem&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如何设置多站点访问呢？&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example.com:80 {
  gzip
  log /var/log/caddy/access.log
  root /var/www
  tls /etc/ssl/cert.pem /etc/ssl/key.pem
}
example2.com:3000{
  gzip
  log /var/log/caddy/example2/access.log
  root /var/www/example2
  tls /etc/ssl/example2/cert.pem /etc/ssl/example2/key.pem
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;基本的 caddy 配置就这些，详细的内容可以去官网上&lt;a href="https://caddyserver.com/docs" rel="nofollow" target="_blank" title=""&gt;看文档&lt;/a&gt;学习&lt;/p&gt;
&lt;h2 id="反向代理"&gt;反向代理&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://www.example.com {
  ## HTTP 代理配置
  ### 此时访问 example.com，实际访问的是 127.0.0.1:8080/app/ 的内容
  proxy / 127.0.0.1:8080/app/

  ## WebSocket 代理配置
  ### 客户端请求的 wss://example.com/app/websocket, 实际为 wss://127.0.0.1:8080/app/websocket
  proxy /app/websocket 127.0.0.1:8080 {
    websocket
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="负载均衡简单配置"&gt;负载均衡简单配置&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proxy / web1.local:80 web2.local:90 web3.local:100 {
  policy round_robin
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用反向代理命令&lt;code&gt;proxy&lt;/code&gt; 将请求循环转发到 80、90、100 三个后端服务，通过 policy 命令控制策略为 &lt;code&gt;round_robin&lt;/code&gt;，以循环方式选择后端服务。&lt;/p&gt;
&lt;h2 id="已守护进程的方式启动 daemon"&gt;已守护进程的方式启动 daemon&lt;/h2&gt;
&lt;p&gt;有 3 种&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;nohup caddy &amp;amp;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;下载 &lt;a href="https://caddyserver.com/v1/docs/hook.service" rel="nofollow" target="_blank" title=""&gt;hook.service&lt;/a&gt; 插件&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemd&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;使用的是官方提供的脚本&amp;nbsp;&lt;a href="https://github.com/mholt/caddy/blob/master/dist/init/linux-systemd/caddy.service" rel="nofollow" target="_blank" title=""&gt;caddy.service&lt;/a&gt;，其他系统也可以在&lt;a href="https://github.com/mholt/caddy/tree/master/dist/init" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;找到相应的脚本。&lt;/p&gt;

&lt;p&gt;把这个文件下载到&amp;nbsp;&lt;code&gt;/etc/systemd/system/&lt;/code&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt;  https://raw.githubusercontent.com/caddyserver/caddy/v1.0.3/dist/init/linux-systemd/caddy.service &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/systemd/system/caddy.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要重新加载 systemd daemon，让配置生效， &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;设置 Caddy 开机启动
&lt;code&gt;sudo systemctl enable caddy.service&lt;/code&gt;&lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Mon, 12 Aug 2024 13:13:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/43844</link>
      <guid>https://ruby-china.org/topics/43844</guid>
    </item>
    <item>
      <title>PostgreSQL 神器之 PostgREST</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/22afd1ae-3421-157f-cf26-e66746585d38.png" title="" alt=""&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="What is PostgREST"&gt;What is PostgREST&lt;/h3&gt;
&lt;p&gt;从字面上看 PostgREST 是 PostgreSQL+ RESTful 的组合体。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/PostgREST/postgrest" rel="nofollow" target="_blank" title=""&gt;PostgREST&lt;/a&gt; 是 haskell 写的，以 postgres 数据库为基础，替你自动生成 REST API。你只需要通过 sql 定义好数据库的 table 等，postgrest 就能生成 REST API。PostgREST 效率非常高，而且它连 json 的 render 都在 postgres 中处理，性能还不错。&lt;/p&gt;

&lt;p&gt;有这样的一张数据表结构&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;todos&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;serial&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="nb"&gt;boolean&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;due&lt;/span&gt; &lt;span class="n"&gt;timestamptz&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;todos&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;values&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'finish tutorial 0'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'pat self on back'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行 PostgREST，你可以通过 http 访问数据库数据了&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    "id":1,
    "done":false,
    "task":"finish tutorial 0",
    "due":null
  },
  {
    "id":2,
    "done":false,
    "task":"pat self on back",
    "due":null
  }
]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="安装"&gt;安装&lt;/h2&gt;
&lt;p&gt;下载 PostgREST 打包好的&lt;a href="https://github.com/PostgREST/postgrest/releases" rel="nofollow" target="_blank" title=""&gt;releases&lt;/a&gt;版本就好&lt;/p&gt;
&lt;h2 id="配置文件 db.conf"&gt;配置文件 &lt;code&gt;db.conf&lt;/code&gt;
&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# db.conf

db-uri = "postgres://postgres:postgres@localhost:5432/eth"
db-schema = "public" # postgre default schema public
db-anon-role = "postgres" #用户
server-host = "0.0.0.0"
server-port = 4000 # 端口
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="设置 PostgreSQL 访问权限"&gt;设置 PostgreSQL 访问权限&lt;/h2&gt;
&lt;p&gt;在&lt;code&gt;pg_hba.conf&lt;/code&gt;中配置服务端允许的认证方式&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#/etc/postgresql/9.x/main/pg_hba.conf
# TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD

host all all 127.0.0.1/0 md5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启数据库 &lt;code&gt;sudo service postgresql restart&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="启动 PostgREST"&gt;启动 PostgREST&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;postgrest db.conf&lt;/code&gt; 根据配置文件中设定的端口启动 http 服务&lt;/p&gt;
&lt;h2 id="请求数据"&gt;请求数据&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl http://localhost:4000/blocks # 直接请求数据表 blocks

[
  {
    "id":1,
    "height":10,
    "timestamp":1516894509,
    "txs_num":500,
    "hash":"0x40b8e073a6196d330a35c4b41f8ec9e7a00aa4898d580ee360a703119517d986",
    "parent_hash":"0x53d898401c6c7900cc0b14da33c2d25b1d4a83db36e7faefc998f597682ea708",
    "uncle_hash":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
    "coinbase":"0x5a0b54d5dc17e0aadc383d2db43b0a0d3e029c4c",
    "difficulty":236596,
    "size":29216,
    "gas_used":7965081,
    "gas_limit":7988374,
    "nonce":61634,
    "reward":5193,
    "extra_data":"sparkpool-cn-node-2",
  }
]

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查询条件可以灵活组合，&lt;strong&gt;生产力暴棚&lt;/strong&gt;，更复杂的查询请看 &lt;a href="http://postgrest.org/en/latest/api.html#operators" rel="nofollow" target="_blank" title=""&gt;PostgREST 的 API 文档&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:4000/blocks?limit=10 #获取前 10 条数据
http://localhost:4000/blocks?limit=10&amp;amp;offset=30 #分页
http://localhost:4000/blocks?limit=10&amp;amp;order=height.desc #倒序
http://localhost:4000/blocks?limit=10&amp;amp;select=height #只获取 height 字段
http://localhost:4000/blocks?limit=10&amp;amp;select=height,hash&amp;amp;id.gte.99999 # 获取 id&amp;gt;99999 的数据
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="新工具 pREST"&gt;新工具 pREST&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/prest/prest" rel="nofollow" target="_blank" title=""&gt;pREST&lt;/a&gt; 跟 PostgREST 功能类似。PostgREST 用 Haskell 写的，pREST 用 go 写的，文档也更全面。&lt;/p&gt;

&lt;p&gt;pREST 例子
&lt;code&gt;http://&amp;lt;url&amp;gt;/&amp;lt;db&amp;gt;/public/&amp;lt;tabel&amp;gt;?tokens=$notnull&amp;amp;balance=$gt.0&amp;amp;_page_size=20&amp;amp;_page=2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;查询 tabel 中 tokens 不为空 &lt;code&gt;balance&amp;gt;0&lt;/code&gt;的数据，也支持分页，太棒了。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;prest.toml&lt;/code&gt; 配置文件内容：&lt;/p&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# migrations = "./migrations"&lt;/span&gt;

&lt;span class="c"&gt;# debug = true&lt;/span&gt;
&lt;span class="c"&gt;# enabling debug mode will disable JWT authorization&lt;/span&gt;

&lt;span class="nn"&gt;[http]&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9000&lt;/span&gt;
&lt;span class="c"&gt;# Port 6000 is blocked on windows. You must change to 8080 or any unblocked port&lt;/span&gt;

&lt;span class="nn"&gt;[jwt]&lt;/span&gt;
&lt;span class="py"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="nn"&gt;[pg]&lt;/span&gt;
&lt;span class="py"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"127.0.0.1"&lt;/span&gt;
&lt;span class="py"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"postgres"&lt;/span&gt;
&lt;span class="py"&gt;pass&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"postgres"&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;
&lt;span class="py"&gt;database&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"zqw"&lt;/span&gt;
&lt;span class="c"&gt;## or used cloud factor&lt;/span&gt;
&lt;span class="c"&gt;# URL = "postgresql://user:pass@localhost/mydatabase/?sslmode=disable"&lt;/span&gt;

&lt;span class="nn"&gt;[access]&lt;/span&gt;
&lt;span class="py"&gt;restrict&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;  &lt;span class="c"&gt;# can access only the tables listed below&lt;/span&gt;

    &lt;span class="nn"&gt;[[access.tables]]&lt;/span&gt;
    &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"block"&lt;/span&gt;
    &lt;span class="py"&gt;permissions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="py"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>hammer</author>
      <pubDate>Tue, 21 May 2024 16:00:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/43696</link>
      <guid>https://ruby-china.org/topics/43696</guid>
    </item>
    <item>
      <title>使用 Mac cli xattr 删除隔离扩展属性</title>
      <description>&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 当我们查看文件的时候，看到属性后面有一个 @ 符号&lt;/span&gt;
&lt;span class="c"&gt;# 这是文件的扩展属性&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-ll&lt;/span&gt;
drwx------@  5 user  staff   170B  2 23 00:47 Applications
&lt;span class="nt"&gt;-rwx------&lt;/span&gt;+  4 user  staff   136B  4  1 17:11 Desktop


&lt;span class="c"&gt;# 使用以下命令就能显示文件的扩展属性&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;@
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="xattr"&gt;xattr&lt;/h2&gt;
&lt;p&gt;这时候 xattr 会更方便&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xattr file.jpg

xattr -l file.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="xattr 常用命令"&gt;xattr 常用命令&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 删除某个属性
xattr -d com.apple.metadata:kMDItemWhereFroms file.jpg

# 删除所有属性
xattr -cfile.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="删除安全提示"&gt;删除安全提示&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/hammer/cea35cc1-068d-4ab7-bc49-dd1b20d824e8.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我们从网上下载执行文件，安装的时候，总会提示有安全风险，用以下的命令可以直接删除 &lt;code&gt;quarantine&lt;/code&gt;，然后直接运行软件。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xattr -rd com.apple.quarantine file.dmg
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>hammer</author>
      <pubDate>Thu, 16 May 2024 00:54:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/43690</link>
      <guid>https://ruby-china.org/topics/43690</guid>
    </item>
    <item>
      <title>[北京] 3月24日，第 6 次 BCD 线下活动：零基础教你开发 DAPP</title>
      <description>&lt;p&gt;3 月 24 日 (本周末) 北京第 6 次 BCD 线下活动开始啦，有想参加的朋友可以报名了。&lt;/p&gt;

&lt;p&gt;我们希望通过 coding 这种最硬核的方式让你深入了解一个区块链应用——DAPP 长得是什么样，是如何工作的，以此来为你打开通往区块链世界的另一扇大门，为你提供一个有力的工具撬动加密经济的巨大引擎。&lt;strong&gt;我们的教程经过多次打磨和现场实践反馈，做到对于编程零基础的小白也能实现一个 DAPP。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;地点：北京昌平回龙观东大街 3 号楼珠峰培训&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://talk.citahub.com/uploads/default/original/1X/e07bafed04dc8cc0b44f02e846ccd627b57afd69.png" title="" alt=""&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="如何参与"&gt;如何参与&lt;/h3&gt;
&lt;p&gt;提交个人信息并报名。成功后，请添加我们的管理员， &lt;strong&gt;并微信转账 20 元给管理员&lt;/strong&gt; ，管理员会拉你入群。此次活动为免费活动，但为了保证参与质量与人数，此次报名费用为押金， &lt;strong&gt;当天参加活动的报名者将退还押金&lt;/strong&gt; 。如未参与活动，押金不予以退还。&lt;/p&gt;

&lt;p&gt;管理员微信：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://talk.citahub.com/uploads/default/original/1X/2cca2466bddfdbd2545c842578268ea3cfed1bac.jpeg" title="" alt="1|497x500"&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="活动流程"&gt;活动流程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;12:30 - 13:00 报到&lt;/li&gt;
&lt;li&gt;13:00-13:30 区块链基础知识讲解&lt;/li&gt;
&lt;li&gt;13:30 - 13:40 教练 &amp;amp; 学员分组&lt;/li&gt;
&lt;li&gt;13:40 - 17:00 coding together&lt;/li&gt;
&lt;li&gt;17:00 - 17:40 成果展示 &amp;amp; 分享&lt;/li&gt;
&lt;li&gt;17:40 - 18:00 合影 &amp;amp; 自由交流&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="注意事项"&gt;注意事项&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;活动需要每个人自己准备电脑。&lt;/li&gt;
&lt;li&gt;需要对区块链有基础认知。&lt;/li&gt;
&lt;li&gt;为了节省当天时间，我们会在群里指导预先安装开发环境。所以缴费的小伙伴一定要加管理员入群，不要空降。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我们会在现场给所有人分组，并为每组配备一个教练，现场遇到任何问题，都可以随时和同组的人交流，当然，也随时可以找教练帮忙解决问题。&lt;/p&gt;

&lt;p&gt;结束后会得到一个自己的 DAPP：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;可以在区块链上发布内容&lt;/li&gt;
&lt;li&gt;可以展示所发布的内容&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="你的收获"&gt;你的收获&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;学会如何使用 Solidity 开发智能合约&lt;/li&gt;
&lt;li&gt;学到如何调试，编译和部署智能合约&lt;/li&gt;
&lt;li&gt;学到如何使用 React 开发前端页面&lt;/li&gt;
&lt;li&gt;熟悉整个的 DAPP 开发流程&lt;/li&gt;
&lt;li&gt;认识一群和你一样热爱区块链的朋友&lt;/li&gt;
&lt;li&gt;有机会成为教练为社区做更多贡献&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;感谢关注我们的公众号，内有教程案例： &lt;a href="https://mp.weixin.qq.com/s/3O5oBVFO0Pi0UhulMwGxpA" rel="nofollow" target="_blank"&gt;https://mp.weixin.qq.com/s/3O5oBVFO0Pi0UhulMwGxpA&lt;/a&gt;&lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Thu, 21 Mar 2019 12:01:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/38265</link>
      <guid>https://ruby-china.org/topics/38265</guid>
    </item>
    <item>
      <title>[北京] 2018.11.25 Blockchain Coding Day: 招募教练志愿者 </title>
      <description>&lt;p&gt;Hi，大家好，我们是 &lt;strong&gt;Nervos 北京&lt;/strong&gt;的组织者，最近在举办一场 workshop——Blockchain Coding Day。&lt;/p&gt;
&lt;h3 id="Blockchain Coding Day"&gt;Blockchain Coding Day&lt;/h3&gt;
&lt;p&gt;我们的目标是通过编程学习，动手做一款 Dapp，让你更了解区块链技术，
相信这也是对区块链初学者一次很好的体验机会。 
我们将以小组的形式，由教练带领学员完成 DAPP 开发。每位学员在指导下完成 Dapp 的开发任务。
俗话说的好 &lt;strong&gt;Talk is cheap, show me the code&lt;/strong&gt;，自己动手才来的真切。&lt;/p&gt;
&lt;h3 id="活动时间地点"&gt;活动时间地点&lt;/h3&gt;
&lt;p&gt;北京西城区黄寺大街甲 23 号院 1 号楼 星群加速器&lt;/p&gt;

&lt;p&gt;2018 年 11 月 25 日 星期天 9:30 -- 17:00 &lt;/p&gt;
&lt;h3 id="活动流程"&gt;活动流程&lt;/h3&gt;
&lt;p&gt;我们使用 &lt;a href="/happypeter" class="user-mention" title="@happypeter"&gt;&lt;i&gt;@&lt;/i&gt;happypeter&lt;/a&gt; 的教程 &lt;a href="https://learning.nervos.org/nerv-first" rel="nofollow" target="_blank" title=""&gt;基于 Nervos AppChain 的 DApp 开发&lt;/a&gt;做一款 Dapp，peter 也会作为嘉宾参加活动。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/2f991daa-bb1b-4013-9148-4b532ab2df65.jpeg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;9:30 - 10:00 报到
10:10 - 10:40 教练 &amp;amp; 学员分组
10:00 - 16:00 coding together
16:00 - 16:40 成果展示 &amp;amp; 分享&lt;/p&gt;
&lt;h3 id="教练报名入口"&gt;教练报名入口&lt;/h3&gt;
&lt;p&gt;有对 Dapp 开发有经验的小伙伴么，我们大概需要 10 人左右的教练团队
想报名教练的人请加微信，备注为 BCD，嘤嘤 ~
&lt;img src="https://l.ruby-china.com/photo/2018/c96dd0ba-2059-4e54-8ad8-2c9894c87e24.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="学员报名入口"&gt;学员报名入口&lt;/h3&gt;
&lt;p&gt;我们会收取 20 元的押金，当天参加活动的报名者将退还押金&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.huodongxing.com/event/6467045718100" rel="nofollow" target="_blank"&gt;http://www.huodongxing.com/event/6467045718100&lt;/a&gt;&lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Sun, 18 Nov 2018 14:45:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/37787</link>
      <guid>https://ruby-china.org/topics/37787</guid>
    </item>
    <item>
      <title>写 Android 的伙伴们有用过 JetBrains 的 kotlin 的么</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/9adad212ab843a2d6f9551e1934f46b9.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://realm.io/cn/news/droidcon-michael-pardo-kotlin/" rel="nofollow" target="_blank" title=""&gt;kotlin 介绍&lt;/a&gt;, 在今年 (2016-02) 发布了 1.0 版本。&lt;/p&gt;

&lt;p&gt;如果一定要写 android, 想试试 kotlin, 不知受众如何，希望有经验的大神给分享下经验。万分感谢&lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Wed, 25 May 2016 18:01:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/30127</link>
      <guid>https://ruby-china.org/topics/30127</guid>
    </item>
    <item>
      <title>一直嫌 npm 安装太慢, 没想到 Progress bar 也拖慢安装速度</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/d5fc6ac325bb07ead30ea1658873b088.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/npm/npm/issues/11283" rel="nofollow" target="_blank" title=""&gt;Progress bar noticeably slows down npm install&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;从 &lt;strong&gt;阮一峰&lt;/strong&gt; 的 blog 上看到的，好 tmd 坑啊。&lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Wed, 11 May 2016 14:40:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/29981</link>
      <guid>https://ruby-china.org/topics/29981</guid>
    </item>
    <item>
      <title> Google 产品全面撤销 CNNIC 根证书</title>
      <description>&lt;p&gt;&lt;a href="http://www.solidot.org/story?sid=43556" rel="nofollow" target="_blank"&gt;http://www.solidot.org/story?sid=43556&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;来的好突然 &lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Thu, 02 Apr 2015 10:54:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/24957</link>
      <guid>https://ruby-china.org/topics/24957</guid>
    </item>
    <item>
      <title>elasticsearch 如何 正确滴全文搜索的</title>
      <description>&lt;p&gt;先引用&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别尝试了 2 种查询方式，根据 topics 的 title 与 body 的内容 全文搜索&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;query: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="ss"&gt;multi_match: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="ss"&gt;query: &lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:q&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;fields: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'body'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;records&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;more_like_this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;Topic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="ss"&gt;query: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="ss"&gt;more_like_this: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="ss"&gt;fields: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'body'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="ss"&gt;like_text: &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt; &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对 elasticsearch 不太熟悉，这 2 种形式 查询的都不太准确，时有时无&lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Tue, 25 Nov 2014 01:08:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/22841</link>
      <guid>https://ruby-china.org/topics/22841</guid>
    </item>
    <item>
      <title>[已出] Air MD711 想二手出</title>
      <description>&lt;p&gt;&lt;a href="http://item.taobao.com/item.htm?id=40927556511" rel="nofollow" target="_blank"&gt;http://item.taobao.com/item.htm?id=40927556511&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;用了一个月多，当做开发机，就是 11 寸感觉有点小&lt;/p&gt;

&lt;p&gt;产品型号 MacBook Air (11-inch Early 2014)
产品序列号 (SN) C02MK4MBG083
出厂日期 (参考) 2014-04-23 ~ 2014-04-29&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/fce18d2351502777e1dfe7aa42d80e65.jpeg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.appletuan.com/t/9371" rel="nofollow" target="_blank"&gt;http://www.appletuan.com/t/9371&lt;/a&gt;&lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Sat, 30 Aug 2014 00:46:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/21297</link>
      <guid>https://ruby-china.org/topics/21297</guid>
    </item>
    <item>
      <title>耗子叔叔的编程游戏   蛮拼的</title>
      <description>&lt;p&gt;&lt;a href="http://fun.coolshell.cn/" rel="nofollow" target="_blank"&gt;http://fun.coolshell.cn/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;虽然活动早就结束了，不过很有意思，就是太耗费脑细胞了 &lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Fri, 15 Aug 2014 17:20:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/21044</link>
      <guid>https://ruby-china.org/topics/21044</guid>
    </item>
    <item>
      <title> sinaapp.com 今日最佳 </title>
      <description>&lt;p&gt;我浪 真的好穷 好心疼 &lt;/p&gt;

&lt;p&gt;有多少人中招了呢  &lt;/p&gt;</description>
      <author>hammer</author>
      <pubDate>Tue, 29 Jul 2014 13:37:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/20731</link>
      <guid>https://ruby-china.org/topics/20731</guid>
    </item>
  </channel>
</rss>
