Congratulations!

[Valid Atom 1.0] This is a valid Atom 1.0 feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: https://blog.gmifly.tw/feed.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <feed xmlns="http://www.w3.org/2005/Atom">
  3.  <title>Gmifly Blog</title>
  4.  <icon>https://blog.gmifly.tw/icon.png</icon>
  5.  
  6.  <link href="/feed.xml" rel="self"/>
  7.  
  8.  <link href="https://blog.gmifly.tw/"/>
  9.  <updated>2021-04-26T17:41:31.713Z</updated>
  10.  <id>https://blog.gmifly.tw/</id>
  11.  
  12.  <author>
  13.    <name>Gmifly</name>
  14.    
  15.  </author>
  16.  
  17.  <generator uri="https://hexo.io/">Hexo</generator>
  18.  
  19.  <entry>
  20.    <title>優化迴圈 Query DB,如何提前確保 generated token unique</title>
  21.    <link href="https://blog.gmifly.tw/2021/04/27/%E5%84%AA%E5%8C%96%E8%BF%B4%E5%9C%88-Query-DB%EF%BC%8C%E5%A6%82%E4%BD%95%E6%8F%90%E5%89%8D%E7%A2%BA%E4%BF%9D-generated-token-unique/"/>
  22.    <id>https://blog.gmifly.tw/2021/04/27/%E5%84%AA%E5%8C%96%E8%BF%B4%E5%9C%88-Query-DB%EF%BC%8C%E5%A6%82%E4%BD%95%E6%8F%90%E5%89%8D%E7%A2%BA%E4%BF%9D-generated-token-unique/</id>
  23.    <published>2021-04-26T17:30:44.000Z</published>
  24.    <updated>2021-04-26T17:41:31.713Z</updated>
  25.    
  26.    <summary type="html">
  27.    
  28.      &lt;p&gt;建立一筆訂單時,我們會給予一串 serial number,作為訂單唯一識別。我們會寫出如下的代碼:&lt;/p&gt;
  29. &lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-comment&quot;&gt;# app/models/model_name.rb&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-class&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;ModelName&lt;/span&gt; &amp;lt; ActiveRecord::Base&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;include&lt;/span&gt; Tokenable&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-comment&quot;&gt;# app/models/concerns/tokenable.rb&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-class&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;Tokenable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  extend ActiveSupport::Concern&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  included &lt;span class=&quot;hljs-keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    before_create &lt;span class=&quot;hljs-symbol&quot;&gt;:generate_token&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  protected&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;generate_token&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;hljs-keyword&quot;&gt;self&lt;/span&gt;.token = loop &lt;span class=&quot;hljs-keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      random_token = SecureRandom.urlsafe_base64(&lt;span class=&quot;hljs-literal&quot;&gt;nil&lt;/span&gt;, &lt;span class=&quot;hljs-literal&quot;&gt;false&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;hljs-keyword&quot;&gt;break&lt;/span&gt; random_token &lt;span class=&quot;hljs-keyword&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;hljs-keyword&quot;&gt;class&lt;/span&gt;.exists?(&lt;span class=&quot;hljs-symbol&quot;&gt;token:&lt;/span&gt; random_token)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  30.  
  31. &lt;p&gt;Query 是使用搜尋效益較高的 exists &lt;/p&gt;
  32.    
  33.    </summary>
  34.    
  35.    
  36.      <category term="Databases" scheme="https://blog.gmifly.tw/categories/Databases/"/>
  37.    
  38.      <category term="Redis" scheme="https://blog.gmifly.tw/categories/Databases/Redis/"/>
  39.    
  40.    
  41.      <category term="databases" scheme="https://blog.gmifly.tw/tags/databases/"/>
  42.    
  43.      <category term="redis" scheme="https://blog.gmifly.tw/tags/redis/"/>
  44.    
  45.      <category term="bloomfilter" scheme="https://blog.gmifly.tw/tags/bloomfilter/"/>
  46.    
  47.  </entry>
  48.  
  49.  <entry>
  50.    <title>[Mysql] Mysql Incorrect string value problem</title>
  51.    <link href="https://blog.gmifly.tw/2020/07/01/Mysql-Mysql-Incorrect-string-value-problem/"/>
  52.    <id>https://blog.gmifly.tw/2020/07/01/Mysql-Mysql-Incorrect-string-value-problem/</id>
  53.    <published>2020-07-01T14:08:12.000Z</published>
  54.    <updated>2020-10-06T17:35:04.000Z</updated>
  55.    
  56.    <summary type="html">
  57.    
  58.      &lt;figure class=&quot;highlight plain hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;Mysql Incorrect string value &amp;apos;\xE7\xA8\x8B\xE5\xBA\x8F...&amp;apos; for column &amp;apos;course&amp;apos; at row 1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  59.  
  60. &lt;p&gt;同:&lt;a href=&quot;https://blog.csdn.net/ch717828/article/details/41357431&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Mysql 插入中文错误:Incorrect string value: ‘\xE7\xA8\x8B\xE5\xBA\x8F…’ for column ‘course’ at row 1&lt;/a&gt;&lt;/p&gt;
  61. &lt;h2 id=&quot;解決方式&quot;&gt;&lt;a href=&quot;#解決方式&quot; class=&quot;headerlink&quot; title=&quot;解決方式&quot;&gt;&lt;/a&gt;解決方式&lt;/h2&gt;&lt;p&gt;如果資料庫已經創建,則先刪除。&lt;/p&gt;
  62. &lt;figure class=&quot;highlight plain hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;mysql&amp;gt; show databases;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;mysql&amp;gt; drop database wrong_database;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  63.  
  64. &lt;p&gt;再重新創建,並以 &lt;code&gt;utf8mb4&lt;/code&gt; 為預設&lt;/p&gt;
  65. &lt;figure class=&quot;highlight plain hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;mysql&amp;gt; CREATE DATABASE test_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  66.    
  67.    </summary>
  68.    
  69.    
  70.      <category term="Databases" scheme="https://blog.gmifly.tw/categories/Databases/"/>
  71.    
  72.      <category term="Mysql" scheme="https://blog.gmifly.tw/categories/Databases/Mysql/"/>
  73.    
  74.    
  75.      <category term="databases" scheme="https://blog.gmifly.tw/tags/databases/"/>
  76.    
  77.      <category term="mysql" scheme="https://blog.gmifly.tw/tags/mysql/"/>
  78.    
  79.      <category term="utf8mb4" scheme="https://blog.gmifly.tw/tags/utf8mb4/"/>
  80.    
  81.  </entry>
  82.  
  83.  <entry>
  84.    <title>[Mysql] 降版或使用 Mariadb</title>
  85.    <link href="https://blog.gmifly.tw/2020/06/30/Mysql-%E9%99%8D%E7%89%88%E6%88%96%E4%BD%BF%E7%94%A8-Mariadb/"/>
  86.    <id>https://blog.gmifly.tw/2020/06/30/Mysql-%E9%99%8D%E7%89%88%E6%88%96%E4%BD%BF%E7%94%A8-Mariadb/</id>
  87.    <published>2020-06-30T04:54:55.000Z</published>
  88.    <updated>2020-06-30T19:58:51.385Z</updated>
  89.    
  90.    <summary type="html">
  91.    
  92.      &lt;p&gt;&lt;img src=&quot;/media/15934195614596/15934519913701.jpg&quot; alt&gt;&lt;/p&gt;
  93. &lt;p&gt;當一開始使用 &lt;code&gt;brew install mysql&lt;/code&gt; 你就悲劇了&lt;br&gt;會下載最新版並開始安裝&lt;br&gt;以下指令得知當前下載哪一最新版本:&lt;/p&gt;
  94. &lt;figure class=&quot;highlight plain hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;$ brew info mysql&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;gt;&amp;gt; mysql: stable 8.0.19 (bottled)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;gt;&amp;gt; ....&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  95.  
  96. &lt;p&gt;降版的不歸路上有一種「壞路不能走的體悟」&lt;/p&gt;
  97.    
  98.    </summary>
  99.    
  100.    
  101.      <category term="Databases" scheme="https://blog.gmifly.tw/categories/Databases/"/>
  102.    
  103.      <category term="Mysql" scheme="https://blog.gmifly.tw/categories/Databases/Mysql/"/>
  104.    
  105.    
  106.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  107.    
  108.      <category term="version" scheme="https://blog.gmifly.tw/tags/version/"/>
  109.    
  110.      <category term="databases" scheme="https://blog.gmifly.tw/tags/databases/"/>
  111.    
  112.      <category term="mysql" scheme="https://blog.gmifly.tw/tags/mysql/"/>
  113.    
  114.      <category term="install" scheme="https://blog.gmifly.tw/tags/install/"/>
  115.    
  116.      <category term="mysql@5.7" scheme="https://blog.gmifly.tw/tags/mysql-5-7/"/>
  117.    
  118.      <category term="mariadb" scheme="https://blog.gmifly.tw/tags/mariadb/"/>
  119.    
  120.  </entry>
  121.  
  122.  <entry>
  123.    <title>從數十億垃圾郵件列表中,判斷某邮箱是否為垃圾邮箱</title>
  124.    <link href="https://blog.gmifly.tw/2020/05/08/%E5%BE%9E%E6%95%B8%E5%8D%81%E5%84%84%E5%9E%83%E5%9C%BE%E9%83%B5%E4%BB%B6%E5%88%97%E8%A1%A8%E4%B8%AD%EF%BC%8C%E5%88%A4%E6%96%B7%E6%9F%90%E9%82%AE%E7%AE%B1%E6%98%AF%E5%90%A6%E7%82%BA%E5%9E%83%E5%9C%BE%E9%82%AE%E7%AE%B1/"/>
  125.    <id>https://blog.gmifly.tw/2020/05/08/%E5%BE%9E%E6%95%B8%E5%8D%81%E5%84%84%E5%9E%83%E5%9C%BE%E9%83%B5%E4%BB%B6%E5%88%97%E8%A1%A8%E4%B8%AD%EF%BC%8C%E5%88%A4%E6%96%B7%E6%9F%90%E9%82%AE%E7%AE%B1%E6%98%AF%E5%90%A6%E7%82%BA%E5%9E%83%E5%9C%BE%E9%82%AE%E7%AE%B1/</id>
  126.    <published>2020-05-07T23:07:59.000Z</published>
  127.    <updated>2021-04-26T17:31:25.363Z</updated>
  128.    
  129.    <summary type="html">
  130.    
  131.      &lt;p&gt;在很多場景上,常需要判斷 A 是否在此集合裡面。&lt;/p&gt;
  132. &lt;p&gt;「某 A 郵箱,判斷是否在數十億垃圾郵箱列表中,來達到防止垃圾郵箱的訪問、註冊等等。」&lt;/p&gt;
  133. &lt;p&gt;如果我們在查找數據庫之前有做數據緩存,像是 redis 緩存之類的,假設黑客惡意大量訪問、發起大量請求。&lt;/p&gt;
  134. &lt;p&gt;&lt;strong&gt;不僅會造成緩存掛掉,還有數據庫掛掉&lt;/strong&gt;&lt;/p&gt;
  135. &lt;p&gt;那就是知名的穿庫、緩存穿透問題。&lt;/p&gt;
  136.    
  137.    </summary>
  138.    
  139.    
  140.      <category term="Databases" scheme="https://blog.gmifly.tw/categories/Databases/"/>
  141.    
  142.      <category term="Bloomfilter" scheme="https://blog.gmifly.tw/categories/Databases/Bloomfilter/"/>
  143.    
  144.    
  145.      <category term="databases" scheme="https://blog.gmifly.tw/tags/databases/"/>
  146.    
  147.      <category term="bloomfilter" scheme="https://blog.gmifly.tw/tags/bloomfilter/"/>
  148.    
  149.  </entry>
  150.  
  151.  <entry>
  152.    <title>什麼是建立索引?</title>
  153.    <link href="https://blog.gmifly.tw/2020/02/23/%E4%BB%80%E9%BA%BC%E6%98%AF%E5%BB%BA%E7%AB%8B%E7%B4%A2%E5%BC%95/"/>
  154.    <id>https://blog.gmifly.tw/2020/02/23/%E4%BB%80%E9%BA%BC%E6%98%AF%E5%BB%BA%E7%AB%8B%E7%B4%A2%E5%BC%95/</id>
  155.    <published>2020-02-22T19:04:28.000Z</published>
  156.    <updated>2020-02-22T19:46:10.000Z</updated>
  157.    
  158.    <summary type="html">
  159.    
  160.      &lt;p&gt;某次和朋友描述建立索引,覺得自己講得很模糊,決定做一份筆記。&lt;/p&gt;
  161. &lt;p&gt;在資料庫當中&lt;/p&gt;
  162. &lt;ul&gt;
  163. &lt;li&gt;為了改進查詢效率,在資料量大的時候,可以透過建立索引讓資料庫加速查詢效率。&lt;/li&gt;
  164. &lt;li&gt;如果沒有對資料表建立索引,將會使用 Full table scan (&lt;a href=&quot;https://en.wikipedia.org/wiki/Full_table_scan&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;sequential scans&lt;/a&gt;) 來查詢資料。&lt;/li&gt;
  165. &lt;/ul&gt;
  166. &lt;p&gt;建立索引&lt;/p&gt;
  167. &lt;ul&gt;
  168. &lt;li&gt;簡單來說:『 一個數據庫中的索引就是一本書的目錄。』&lt;/li&gt;
  169. &lt;li&gt;原理來說:『 額外在硬碟建立一張索引表,當作目錄,當進行資料庫查詢時,針對查詢條件在索引表尋找相對應的索引。再透過此索引指向實體資料。假如查詢條件不在索引表裡,就會對整個表做循序查詢。』&lt;/li&gt;
  170. &lt;/ul&gt;
  171.    
  172.    </summary>
  173.    
  174.    
  175.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  176.    
  177.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  178.    
  179.    
  180.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  181.    
  182.      <category term="performance" scheme="https://blog.gmifly.tw/tags/performance/"/>
  183.    
  184.      <category term="PostgreSQL" scheme="https://blog.gmifly.tw/tags/PostgreSQL/"/>
  185.    
  186.      <category term="index" scheme="https://blog.gmifly.tw/tags/index/"/>
  187.    
  188.  </entry>
  189.  
  190.  <entry>
  191.    <title>[Rails] 搞懂 ActiveRecord::Enum</title>
  192.    <link href="https://blog.gmifly.tw/2019/12/03/Rails-%E6%90%9E%E6%87%82-ActiveRecord-Enum/"/>
  193.    <id>https://blog.gmifly.tw/2019/12/03/Rails-%E6%90%9E%E6%87%82-ActiveRecord-Enum/</id>
  194.    <published>2019-12-03T04:24:08.000Z</published>
  195.    <updated>2019-12-03T07:10:09.000Z</updated>
  196.    
  197.    <summary type="html">
  198.    
  199.      &lt;h2 id=&quot;來自-Ruby-china-精華帖&quot;&gt;&lt;a href=&quot;#來自-Ruby-china-精華帖&quot; class=&quot;headerlink&quot; title=&quot;來自 Ruby china 精華帖&quot;&gt;&lt;/a&gt;來自 Ruby china 精華帖&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://ruby-china.org/topics/28654&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;关于在 Rails Model 中使用 Enum (枚举) 的若干总结&lt;/a&gt;&lt;br&gt;在我使用 enum 時東找西找,挖掘一些坑&lt;br&gt;裡面提到枚舉這個詞,就是指 enum&lt;br&gt;看到該篇內容很精闢,提到很多想整理的重點&lt;br&gt;所以也筆記一份,至於詳情大家可以去看該篇文章&lt;/p&gt;
  200. &lt;h2 id=&quot;Enum-就是-Rails-用來消滅魔鬼數字的工具。&quot;&gt;&lt;a href=&quot;#Enum-就是-Rails-用來消滅魔鬼數字的工具。&quot; class=&quot;headerlink&quot; title=&quot;Enum 就是 Rails 用來消滅魔鬼數字的工具。&quot;&gt;&lt;/a&gt;Enum 就是 Rails 用來消滅魔鬼數字的工具。&lt;/h2&gt;&lt;p&gt;代碼中,以數字方式去表示數據狀態,導致代碼可讀性被破壞,這樣的數字被稱為『 魔鬼數字 』。&lt;br&gt;官方說明 enum:&lt;/p&gt;
  201. &lt;blockquote&gt;
  202. &lt;p&gt;Declare an enum attribute where the values map to integers in the database, but can be queried by name.&lt;/p&gt;
  203. &lt;/blockquote&gt;
  204. &lt;blockquote&gt;
  205. &lt;p&gt;給數據庫中的整型字段聲明一個一一對應的 enum(枚舉) 屬性值,可以使用該字面作為查詢。字面&lt;/p&gt;
  206. &lt;/blockquote&gt;
  207.    
  208.    </summary>
  209.    
  210.    
  211.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  212.    
  213.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  214.    
  215.    
  216.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  217.    
  218.      <category term="enum" scheme="https://blog.gmifly.tw/tags/enum/"/>
  219.    
  220.  </entry>
  221.  
  222.  <entry>
  223.    <title>[Rails] 分辨 size vs length vs count</title>
  224.    <link href="https://blog.gmifly.tw/2019/11/19/Rails-%E5%88%86%E8%BE%A8-size-vs-length-vs-count/"/>
  225.    <id>https://blog.gmifly.tw/2019/11/19/Rails-%E5%88%86%E8%BE%A8-size-vs-length-vs-count/</id>
  226.    <published>2019-11-19T12:01:30.000Z</published>
  227.    <updated>2019-12-03T03:48:30.000Z</updated>
  228.    
  229.    <summary type="html">
  230.    
  231.      &lt;h2 id=&quot;搞懂-size-length-count-之間的差別&quot;&gt;&lt;a href=&quot;#搞懂-size-length-count-之間的差別&quot; class=&quot;headerlink&quot; title=&quot;搞懂 size / length / count 之間的差別&quot;&gt;&lt;/a&gt;搞懂 size / length / count 之間的差別&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;/media/15741521008672/15741521890955.jpg&quot; alt=&quot;stackoverflow&quot;&gt;&lt;/p&gt;
  232. &lt;p&gt;stackoverflow 上有這麼一段最佳留言&lt;br&gt;在每次遇到都很疑惑下,就實際測試並做個筆記&lt;/p&gt;
  233.    
  234.    </summary>
  235.    
  236.    
  237.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  238.    
  239.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  240.    
  241.    
  242.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  243.    
  244.      <category term="size" scheme="https://blog.gmifly.tw/tags/size/"/>
  245.    
  246.      <category term="length" scheme="https://blog.gmifly.tw/tags/length/"/>
  247.    
  248.      <category term="count" scheme="https://blog.gmifly.tw/tags/count/"/>
  249.    
  250.  </entry>
  251.  
  252.  <entry>
  253.    <title>[Rails] Benchmark to test ruby code performance</title>
  254.    <link href="https://blog.gmifly.tw/2019/10/10/Rails-Benchmark-to-test-ruby-code-performance/"/>
  255.    <id>https://blog.gmifly.tw/2019/10/10/Rails-Benchmark-to-test-ruby-code-performance/</id>
  256.    <published>2019-10-10T05:01:39.000Z</published>
  257.    <updated>2019-10-11T05:46:50.000Z</updated>
  258.    
  259.    <summary type="html">
  260.    
  261.      &lt;p&gt;當兩個相近的方法,該選擇哪一種效能比較好?&lt;br&gt;一般開發者在網路上查到結果就照著使用,沒有特別理解佐證的過程&lt;br&gt;所以來分享佐證的好工具:&lt;br&gt;&lt;code&gt;benchmark&lt;/code&gt; - 為 Ruby Standard Library&lt;/p&gt;
  262. &lt;h2 id=&quot;Benchmark-measure&quot;&gt;&lt;a href=&quot;#Benchmark-measure&quot; class=&quot;headerlink&quot; title=&quot;Benchmark.measure&quot;&gt;&lt;/a&gt;Benchmark.measure&lt;/h2&gt;&lt;p&gt;計算單獨的 ruby single block&lt;/p&gt;
  263. &lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;create_object&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(n)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  n.times &lt;span class=&quot;hljs-keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    Object.new&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  264.  
  265. &lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&#39;benchmark&#39;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;puts Benchmark.measure &amp;#123; create_object(&lt;span class=&quot;hljs-number&quot;&gt;10_000_000&lt;/span&gt;) &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  266.  
  267. &lt;p&gt;output:&lt;/p&gt;
  268. &lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;    user     system      total        real&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-number&quot;&gt;1.270000&lt;/span&gt;   &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;.&lt;span class=&quot;hljs-number&quot;&gt;010000&lt;/span&gt;   &lt;span class=&quot;hljs-number&quot;&gt;1.280000&lt;/span&gt; (  &lt;span class=&quot;hljs-number&quot;&gt;1.272028&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  269.    
  270.    </summary>
  271.    
  272.    
  273.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  274.    
  275.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  276.    
  277.    
  278.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  279.    
  280.      <category term="benchmark" scheme="https://blog.gmifly.tw/tags/benchmark/"/>
  281.    
  282.      <category term="performance" scheme="https://blog.gmifly.tw/tags/performance/"/>
  283.    
  284.  </entry>
  285.  
  286.  <entry>
  287.    <title>[Javascript] Check if value exists in Array</title>
  288.    <link href="https://blog.gmifly.tw/2019/10/10/Javascript-Check-if-value-exists-in-Array/"/>
  289.    <id>https://blog.gmifly.tw/2019/10/10/Javascript-Check-if-value-exists-in-Array/</id>
  290.    <published>2019-10-09T16:29:41.000Z</published>
  291.    <updated>2019-10-11T03:26:49.000Z</updated>
  292.    
  293.    <summary type="html">
  294.    
  295.      &lt;p&gt;一般常見的需求像是:&lt;/p&gt;
  296. &lt;ol&gt;
  297. &lt;li&gt;當 array 找到此 value 时,即停止輸入新的 value 到數組裡&lt;/li&gt;
  298. &lt;li&gt;當 array 包含特定 value 时,即執行某個 script&lt;/li&gt;
  299. &lt;li&gt;等等不勝凡舉&lt;/li&gt;
  300. &lt;/ol&gt;
  301. &lt;p&gt;rails 在處理 value 是否存在 array 裡很容易,運用 &lt;code&gt;include&lt;/code&gt; or &lt;code&gt;exists&lt;/code&gt;&lt;br&gt;而在 javascript 是怎麼檢查 value 是否存在 array 裡?&lt;/p&gt;
  302.    
  303.    </summary>
  304.    
  305.    
  306.      <category term="Javascript" scheme="https://blog.gmifly.tw/categories/Javascript/"/>
  307.    
  308.      <category term="Es5" scheme="https://blog.gmifly.tw/categories/Javascript/Es5/"/>
  309.    
  310.    
  311.      <category term="javascript" scheme="https://blog.gmifly.tw/tags/javascript/"/>
  312.    
  313.      <category term="es6" scheme="https://blog.gmifly.tw/tags/es6/"/>
  314.    
  315.      <category term="array" scheme="https://blog.gmifly.tw/tags/array/"/>
  316.    
  317.      <category term="exists" scheme="https://blog.gmifly.tw/tags/exists/"/>
  318.    
  319.      <category term="es5" scheme="https://blog.gmifly.tw/tags/es5/"/>
  320.    
  321.  </entry>
  322.  
  323.  <entry>
  324.    <title>[Shell Scripts] Write my first shell script</title>
  325.    <link href="https://blog.gmifly.tw/2019/10/06/Shell-Script-Write-my-first-shell-script/"/>
  326.    <id>https://blog.gmifly.tw/2019/10/06/Shell-Script-Write-my-first-shell-script/</id>
  327.    <published>2019-10-06T08:06:40.000Z</published>
  328.    <updated>2019-12-09T08:55:34.000Z</updated>
  329.    
  330.    <summary type="html">
  331.    
  332.      &lt;ol&gt;
  333. &lt;li&gt;建立第一個 shell script&lt;/li&gt;
  334. &lt;/ol&gt;
  335. &lt;figure class=&quot;highlight bash hljs&quot;&gt;&lt;figcaption&gt;&lt;span&gt;terminal&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;touch echo.sh&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  336.  
  337. &lt;ol start=&quot;2&quot;&gt;
  338. &lt;li&gt;修改 &lt;code&gt;echo.sh&lt;/code&gt;&lt;/li&gt;
  339. &lt;/ol&gt;
  340. &lt;figure class=&quot;highlight bash hljs&quot;&gt;&lt;figcaption&gt;&lt;span&gt;echo.sh&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-built_in&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;Gmifly Blog is great&quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  341.    
  342.    </summary>
  343.    
  344.    
  345.      <category term="Shell" scheme="https://blog.gmifly.tw/categories/Shell/"/>
  346.    
  347.    
  348.      <category term="aws" scheme="https://blog.gmifly.tw/tags/aws/"/>
  349.    
  350.      <category term="shell-script" scheme="https://blog.gmifly.tw/tags/shell-script/"/>
  351.    
  352.      <category term="hexo" scheme="https://blog.gmifly.tw/tags/hexo/"/>
  353.    
  354.  </entry>
  355.  
  356.  <entry>
  357.    <title>[Rails] 真得瞭解 Active Record Lazy loading 嗎?</title>
  358.    <link href="https://blog.gmifly.tw/2019/08/19/Rails-Active-Record-Lazy-loading/"/>
  359.    <id>https://blog.gmifly.tw/2019/08/19/Rails-Active-Record-Lazy-loading/</id>
  360.    <published>2019-08-19T05:01:32.000Z</published>
  361.    <updated>2019-11-19T11:49:26.000Z</updated>
  362.    
  363.    <summary type="html">
  364.    
  365.      &lt;blockquote&gt;
  366. &lt;p&gt;If inherit active record , use instance to catch value will has lazy loading&lt;/p&gt;
  367. &lt;/blockquote&gt;
  368. &lt;p&gt;所以在 Controller or Model 都會有效果&lt;br&gt;所以宣告 instance value 不會有 sql 查詢才是&lt;/p&gt;
  369. &lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;@account  = current_user.account&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  370.  
  371. &lt;p&gt;在 &lt;code&gt;@account&lt;/code&gt; 被頁面調用时,才會執行 &lt;code&gt;sql&lt;/code&gt; 去查 &lt;code&gt;Account table&lt;/code&gt;&lt;/p&gt;
  372. &lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;@account.balance&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  373.  
  374. &lt;p&gt;以上我們的認知是没有錯的,可以&lt;a href=&quot;https://rubyinrails.com/2014/01/08/what-is-lazy-loading-in-rails/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;参考這篇&lt;/a&gt;&lt;/p&gt;
  375.    
  376.    </summary>
  377.    
  378.    
  379.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  380.    
  381.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  382.    
  383.    
  384.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  385.    
  386.      <category term="ruby" scheme="https://blog.gmifly.tw/tags/ruby/"/>
  387.    
  388.      <category term="lazy-loading" scheme="https://blog.gmifly.tw/tags/lazy-loading/"/>
  389.    
  390.      <category term="instance" scheme="https://blog.gmifly.tw/tags/instance/"/>
  391.    
  392.  </entry>
  393.  
  394.  <entry>
  395.    <title>[Rails] rollback migration version</title>
  396.    <link href="https://blog.gmifly.tw/2019/05/10/Rails-rollback-migration-version/"/>
  397.    <id>https://blog.gmifly.tw/2019/05/10/Rails-rollback-migration-version/</id>
  398.    <published>2019-05-10T03:34:32.000Z</published>
  399.    <updated>2019-11-19T11:49:26.000Z</updated>
  400.    
  401.    <summary type="html">
  402.    
  403.      &lt;h2 id=&quot;遇到-migration-進退兩難&quot;&gt;&lt;a href=&quot;#遇到-migration-進退兩難&quot; class=&quot;headerlink&quot; title=&quot;遇到 migration 進退兩難&quot;&gt;&lt;/a&gt;遇到 migration 進退兩難&lt;/h2&gt;&lt;p&gt;在 localhost 或者 staging 已经部属完 migration&lt;br&gt;而當前处在错误的版本,爾後又继续建立 migrate file,中間存在很多的 migration versions&lt;br&gt;导致最後沒辦法前進 &lt;code&gt;rake db:migrate&lt;/code&gt; ,也沒辦法後退 &lt;code&gt;rollback:migrate&lt;/code&gt;&lt;/p&gt;
  404.    
  405.    </summary>
  406.    
  407.    
  408.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  409.    
  410.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  411.    
  412.    
  413.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  414.    
  415.      <category term="migration" scheme="https://blog.gmifly.tw/tags/migration/"/>
  416.    
  417.      <category term="rollback" scheme="https://blog.gmifly.tw/tags/rollback/"/>
  418.    
  419.      <category term="version" scheme="https://blog.gmifly.tw/tags/version/"/>
  420.    
  421.      <category term="psql" scheme="https://blog.gmifly.tw/tags/psql/"/>
  422.    
  423.      <category term="pq" scheme="https://blog.gmifly.tw/tags/pq/"/>
  424.    
  425.  </entry>
  426.  
  427.  <entry>
  428.    <title>[Rspec] FactoryGirl create vs build vs build_stubbed</title>
  429.    <link href="https://blog.gmifly.tw/2019/04/14/Rspec-FactoryGirl-vs-create-vs-build-vs-build-stubbed/"/>
  430.    <id>https://blog.gmifly.tw/2019/04/14/Rspec-FactoryGirl-vs-create-vs-build-vs-build-stubbed/</id>
  431.    <published>2019-04-13T16:02:24.000Z</published>
  432.    <updated>2019-11-19T11:49:26.000Z</updated>
  433.    
  434.    <summary type="html">
  435.    
  436.      &lt;p&gt;根據上一篇「&lt;a href=&quot;/2019/03/28/Rspec-Efficiently-Speed-Rspec-test/&quot;&gt;測試效能最佳化&lt;/a&gt;」裡提到的一個概念&lt;/p&gt;
  437. &lt;blockquote&gt;
  438. &lt;p&gt;減少不必要的 DB 操作來提高測試效率&lt;/p&gt;
  439. &lt;/blockquote&gt;
  440. &lt;p&gt;而其中做了以下幾件事&lt;/p&gt;
  441. &lt;ol&gt;
  442. &lt;li&gt;每支測試檔案,只做一次 clear DB 確保測試檔案之間不互相影響&lt;/li&gt;
  443. &lt;li&gt;可以使用一個數據進行測試,就不要每個 example 重複創建,減少 let and let! 大量使用實例變量&lt;/li&gt;
  444. &lt;li&gt;情境判斷,盡可能使用 mock 數據方式,達到你要的測試結果&lt;/li&gt;
  445. &lt;li&gt;使用 FactoryGirl.build orFactoryGirl.build_stubbed&lt;/li&gt;
  446. &lt;/ol&gt;
  447. &lt;p&gt;前 3 點,已經熟能生巧&lt;br&gt;第 4 點,是我一直抱著 try try 看去實做&lt;br&gt;而今天偶然發現這兩個差別,做筆記分享一下&lt;/p&gt;
  448.    
  449.    </summary>
  450.    
  451.    
  452.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  453.    
  454.      <category term="Rspec" scheme="https://blog.gmifly.tw/categories/Rails/Rspec/"/>
  455.    
  456.    
  457.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  458.    
  459.      <category term="test" scheme="https://blog.gmifly.tw/tags/test/"/>
  460.    
  461.      <category term="speed" scheme="https://blog.gmifly.tw/tags/speed/"/>
  462.    
  463.      <category term="spec" scheme="https://blog.gmifly.tw/tags/spec/"/>
  464.    
  465.      <category term="factorygirl" scheme="https://blog.gmifly.tw/tags/factorygirl/"/>
  466.    
  467.      <category term="factorybot" scheme="https://blog.gmifly.tw/tags/factorybot/"/>
  468.    
  469.      <category term="build" scheme="https://blog.gmifly.tw/tags/build/"/>
  470.    
  471.      <category term="build_stubbed" scheme="https://blog.gmifly.tw/tags/build-stubbed/"/>
  472.    
  473.  </entry>
  474.  
  475.  <entry>
  476.    <title>[Rspec] Efficiently Speed Rspec test</title>
  477.    <link href="https://blog.gmifly.tw/2019/03/28/Rspec-Efficiently-Speed-Rspec-test/"/>
  478.    <id>https://blog.gmifly.tw/2019/03/28/Rspec-Efficiently-Speed-Rspec-test/</id>
  479.    <published>2019-03-27T16:17:12.000Z</published>
  480.    <updated>2019-11-19T11:49:26.000Z</updated>
  481.    
  482.    <summary type="html">
  483.    
  484.      &lt;h2 id=&quot;參考第一篇文章&quot;&gt;&lt;a href=&quot;#參考第一篇文章&quot; class=&quot;headerlink&quot; title=&quot;參考第一篇文章&quot;&gt;&lt;/a&gt;參考第一篇文章&lt;/h2&gt;&lt;p&gt;author has deleted&lt;br&gt;&lt;del&gt;&lt;a href=&quot;https://medium.com/the-code-review/5-rspec-tips-to-speed-up-testing-ruby-on-rails-projects-db8759a20869&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/the-code-review/5-rspec-tips-to-speed-up-testing-ruby-on-rails-projects-db8759a20869&lt;/a&gt;&lt;/del&gt;&lt;/p&gt;
  485. &lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;前面 1 ~ 4 點,學習一些技巧和寫法,但是效能提升没特別提到&lt;br&gt;但文章的第 5 點 Efficiently load data records 得到几个方向&lt;/p&gt;
  486. &lt;ol&gt;
  487. &lt;li&gt;Use let, rather than let!&lt;/li&gt;
  488. &lt;li&gt;One is to use before_all instead of before_each in a test file&lt;/li&gt;
  489. &lt;li&gt;Another is to have a global variables file, which loads an instance of each record before all tests start&lt;/li&gt;
  490. &lt;li&gt;Another approach is to user FactoryBot’s build_stubbed method&lt;/li&gt;&lt;/ol&gt;
  491.    
  492.    </summary>
  493.    
  494.    
  495.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  496.    
  497.      <category term="Rspec" scheme="https://blog.gmifly.tw/categories/Rails/Rspec/"/>
  498.    
  499.    
  500.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  501.    
  502.      <category term="rspec" scheme="https://blog.gmifly.tw/tags/rspec/"/>
  503.    
  504.      <category term="test" scheme="https://blog.gmifly.tw/tags/test/"/>
  505.    
  506.      <category term="speed" scheme="https://blog.gmifly.tw/tags/speed/"/>
  507.    
  508.  </entry>
  509.  
  510.  <entry>
  511.    <title>北漂三個月的審核</title>
  512.    <link href="https://blog.gmifly.tw/2018/08/29/%E5%8C%97%E6%BC%82%E4%B8%89%E5%80%8B%E6%9C%88%E7%9A%84%E5%AF%A9%E6%A0%B8/"/>
  513.    <id>https://blog.gmifly.tw/2018/08/29/%E5%8C%97%E6%BC%82%E4%B8%89%E5%80%8B%E6%9C%88%E7%9A%84%E5%AF%A9%E6%A0%B8/</id>
  514.    <published>2018-08-28T17:00:56.000Z</published>
  515.    <updated>2019-10-11T03:26:49.000Z</updated>
  516.    
  517.    <summary type="html">
  518.    
  519.      &lt;h2 id=&quot;人生轉捩點&quot;&gt;&lt;a href=&quot;#人生轉捩點&quot; class=&quot;headerlink&quot; title=&quot;人生轉捩點&quot;&gt;&lt;/a&gt;人生轉捩點&lt;/h2&gt;&lt;p&gt;永遠記得那一天...&lt;br&gt;line接收著一堆訊息,而我手機震動起了個大早&lt;br&gt;那時也正是美國時間的晚上&lt;br&gt;朋友告訴我意外的機會向老闆引薦,獲得一個面試,要我先準備好履歷&lt;br&gt;這次是真的機會來臨,當天聊完後,心臟蹦蹦跳,無比興奮&lt;/p&gt;
  520. &lt;ul&gt;
  521. &lt;li&gt;很久沒有這麼期待上班,和接下來的人生&lt;/li&gt;
  522. &lt;li&gt;很久沒有刺激與活力,身體都不自主的打顫。&lt;/li&gt;
  523. &lt;li&gt;我可以獲得一個全新的機會踏進,高效成長團隊!&lt;/li&gt;&lt;/ul&gt;
  524.    
  525.    </summary>
  526.    
  527.    
  528.      <category term="人生感想" scheme="https://blog.gmifly.tw/categories/%E4%BA%BA%E7%94%9F%E6%84%9F%E6%83%B3/"/>
  529.    
  530.    
  531.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  532.    
  533.      <category term="hangzhou" scheme="https://blog.gmifly.tw/tags/hangzhou/"/>
  534.    
  535.      <category term="feeling" scheme="https://blog.gmifly.tw/tags/feeling/"/>
  536.    
  537.      <category term="share" scheme="https://blog.gmifly.tw/tags/share/"/>
  538.    
  539.      <category term="learn" scheme="https://blog.gmifly.tw/tags/learn/"/>
  540.    
  541.  </entry>
  542.  
  543.  <entry>
  544.    <title>[Rails] 掛載 AWS S3 圖床</title>
  545.    <link href="https://blog.gmifly.tw/2018/06/20/Rails-%E6%8E%9B%E8%BC%89-AWS-S3-%E5%9C%96%E5%BA%8A/"/>
  546.    <id>https://blog.gmifly.tw/2018/06/20/Rails-%E6%8E%9B%E8%BC%89-AWS-S3-%E5%9C%96%E5%BA%8A/</id>
  547.    <published>2018-06-20T10:37:23.000Z</published>
  548.    <updated>2019-10-11T03:26:49.000Z</updated>
  549.    
  550.    <summary type="html">
  551.    
  552.      &lt;p&gt;會建議先做好,密鑰安全的功能:&lt;br&gt;&lt;code&gt;figaro&lt;/code&gt; 安裝指南 參考這篇:&lt;a href=&quot;/2018/06/20/Rails-如何安裝-figaro&quot;&gt;[Rails] 如何安裝 figaro?&lt;/a&gt;&lt;/p&gt;
  553. &lt;p&gt;&lt;code&gt;以下會以純文字記錄步驟過程&lt;/code&gt;&lt;/p&gt;
  554. &lt;h2 id=&quot;步驟一,註冊帳號,需要綁定信用卡(完成請跳過)&quot;&gt;&lt;a href=&quot;#步驟一,註冊帳號,需要綁定信用卡(完成請跳過)&quot; class=&quot;headerlink&quot; title=&quot;步驟一,註冊帳號,需要綁定信用卡(完成請跳過)&quot;&gt;&lt;/a&gt;步驟一,註冊帳號,需要綁定信用卡(完成請跳過)&lt;/h2&gt;&lt;p&gt;註冊 AWS 的帳號(需要Visa或MasterCard)&lt;/p&gt;
  555. &lt;h2 id=&quot;步驟二,根據AWS安全審查指南,創見IAM用戶&quot;&gt;&lt;a href=&quot;#步驟二,根據AWS安全審查指南,創見IAM用戶&quot; class=&quot;headerlink&quot; title=&quot;步驟二,根據AWS安全審查指南,創見IAM用戶&quot;&gt;&lt;/a&gt;步驟二,根據AWS安全審查指南,創見IAM用戶&lt;/h2&gt;&lt;p&gt;登入後左下角有 lanuage 可以轉換簡體 or 繁體&lt;/p&gt;
  556.    
  557.    </summary>
  558.    
  559.    
  560.      <category term="AWS" scheme="https://blog.gmifly.tw/categories/AWS/"/>
  561.    
  562.    
  563.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  564.    
  565.      <category term="figaro" scheme="https://blog.gmifly.tw/tags/figaro/"/>
  566.    
  567.      <category term="heroku" scheme="https://blog.gmifly.tw/tags/heroku/"/>
  568.    
  569.      <category term="aws" scheme="https://blog.gmifly.tw/tags/aws/"/>
  570.    
  571.      <category term="s3" scheme="https://blog.gmifly.tw/tags/s3/"/>
  572.    
  573.      <category term="bucket" scheme="https://blog.gmifly.tw/tags/bucket/"/>
  574.    
  575.  </entry>
  576.  
  577.  <entry>
  578.    <title>[Rails] 如何安裝 figaro ?</title>
  579.    <link href="https://blog.gmifly.tw/2018/06/20/Rails-%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%9D-figaro/"/>
  580.    <id>https://blog.gmifly.tw/2018/06/20/Rails-%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%9D-figaro/</id>
  581.    <published>2018-06-20T09:35:07.000Z</published>
  582.    <updated>2019-10-11T03:26:49.000Z</updated>
  583.    
  584.    <summary type="html">
  585.    
  586.      &lt;p&gt;在 Rails 實做一個密鑰管理,簡單的不真實&lt;br&gt;使用 figaro 能一個指令就將機密信息同步到 heroku 上&lt;br&gt;如此一來密鑰也不會外洩。&lt;/p&gt;
  587. &lt;h1 id=&quot;步驟一,安裝Gem&quot;&gt;&lt;a href=&quot;#步驟一,安裝Gem&quot; class=&quot;headerlink&quot; title=&quot;步驟一,安裝Gem&quot;&gt;&lt;/a&gt;步驟一,安裝Gem&lt;/h1&gt;&lt;p&gt;建議開一個 branch 實做完,再 rebase 到 master&lt;br&gt;新開 branch 並切換到該branch :&lt;code&gt;git checkout -b aws&lt;/code&gt;&lt;br&gt;編輯 Gemfile&lt;/p&gt;
  588. &lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;figcaption&gt;&lt;span&gt;Gemfile&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;gem &lt;span class=&quot;hljs-string&quot;&gt;&#39;figaro&#39;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  589.  
  590. &lt;p&gt;執行掛載 :&lt;code&gt;bundle install&lt;/code&gt;&lt;/p&gt;
  591.    
  592.    </summary>
  593.    
  594.    
  595.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  596.    
  597.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  598.    
  599.    
  600.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  601.    
  602.      <category term="figaro" scheme="https://blog.gmifly.tw/tags/figaro/"/>
  603.    
  604.      <category term="heroku" scheme="https://blog.gmifly.tw/tags/heroku/"/>
  605.    
  606.  </entry>
  607.  
  608.  <entry>
  609.    <title>[Rails] 分辨 symbol 和 string</title>
  610.    <link href="https://blog.gmifly.tw/2018/06/18/Rails-%E5%88%86%E8%BE%A8-symbol-%E5%92%8C-string/"/>
  611.    <id>https://blog.gmifly.tw/2018/06/18/Rails-%E5%88%86%E8%BE%A8-symbol-%E5%92%8C-string/</id>
  612.    <published>2018-06-18T03:45:46.000Z</published>
  613.    <updated>2019-10-11T03:26:49.000Z</updated>
  614.    
  615.    <summary type="html">
  616.    
  617.      &lt;h2 id=&quot;遇到-Ruby-語法上,冒號-變數-?&quot;&gt;&lt;a href=&quot;#遇到-Ruby-語法上,冒號-變數-?&quot; class=&quot;headerlink&quot; title=&quot;遇到 Ruby 語法上,冒號 + 變數 ?&quot;&gt;&lt;/a&gt;遇到 &lt;code&gt;Ruby&lt;/code&gt; 語法上,&lt;code&gt;冒號&lt;/code&gt; + &lt;code&gt;變數&lt;/code&gt; ?&lt;/h2&gt;&lt;figure class=&quot;highlight ruby hljs&quot;&gt;&lt;figcaption&gt;&lt;span&gt;routes.rb&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;resources &lt;span class=&quot;hljs-symbol&quot;&gt;:products&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  member &lt;span class=&quot;hljs-keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    post &lt;span class=&quot;hljs-symbol&quot;&gt;:add_to_cart&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
  618.  
  619. &lt;p&gt;而&lt;code&gt;products&lt;/code&gt; 就叫做 &lt;code&gt;symbol&lt;/code&gt;&lt;/p&gt;
  620. &lt;h2 id=&quot;什麼是-Symbol&quot;&gt;&lt;a href=&quot;#什麼是-Symbol&quot; class=&quot;headerlink&quot; title=&quot;什麼是 Symbol?&quot;&gt;&lt;/a&gt;什麼是 Symbol?&lt;/h2&gt;&lt;p&gt;翻譯上,&lt;code&gt;符號象徵&lt;/code&gt;&lt;br&gt;可以直接說是,&lt;code&gt;不可改變的字串&lt;/code&gt;&lt;/p&gt;
  621.    
  622.    </summary>
  623.    
  624.    
  625.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  626.    
  627.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  628.    
  629.    
  630.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  631.    
  632.      <category term="symbol" scheme="https://blog.gmifly.tw/tags/symbol/"/>
  633.    
  634.      <category term="string" scheme="https://blog.gmifly.tw/tags/string/"/>
  635.    
  636.  </entry>
  637.  
  638.  <entry>
  639.    <title>[Rails] 分辨 collection do 和 member do</title>
  640.    <link href="https://blog.gmifly.tw/2018/06/17/Rails-%E5%88%86%E8%BE%A8-collection-do-%E5%92%8C-member-do/"/>
  641.    <id>https://blog.gmifly.tw/2018/06/17/Rails-%E5%88%86%E8%BE%A8-collection-do-%E5%92%8C-member-do/</id>
  642.    <published>2018-06-17T10:54:54.000Z</published>
  643.    <updated>2019-10-11T03:26:49.000Z</updated>
  644.    
  645.    <summary type="html">
  646.    
  647.      &lt;p&gt;在 rails 的路由世界裡,有著非常厲害的的管理方式&lt;br&gt;當用戶端 &lt;code&gt;client&lt;/code&gt; 做了什麼任何 http 請求 request,請求動作像是post&lt;br&gt;這樣的一個行為&lt;br&gt;會透過 rails 的 &lt;code&gt;routes.rb&lt;/code&gt; 做一個解析&lt;br&gt;然後丟給 controller 去做判讀,再幫助使用,得到特定的畫面&lt;/p&gt;
  648. &lt;h2 id=&quot;當你在-routes-裡面設定:&quot;&gt;&lt;a href=&quot;#當你在-routes-裡面設定:&quot; class=&quot;headerlink&quot; title=&quot;當你在 routes 裡面設定:&quot;&gt;&lt;/a&gt;當你在 routes 裡面設定:&lt;/h2&gt;&lt;ol&gt;
  649. &lt;li&gt;resources ,就會自動添加 7 個action ,也同時擁有 8 個 path&lt;/li&gt;
  650. &lt;li&gt;resource ,就會不會有 &lt;code&gt;#index&lt;/code&gt; 和 &lt;code&gt;#show&lt;/code&gt;&lt;/li&gt;
  651. &lt;li&gt;當我想要特殊路徑,或者一個特別操作處理?就得使用 &lt;code&gt;collection do&lt;/code&gt; , &lt;code&gt;member do&lt;/code&gt;&lt;/li&gt;
  652. &lt;li&gt;如果我想要創建一個,判別的後台路徑,那我可以用 &lt;code&gt;namespace&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;
  653.    
  654.    </summary>
  655.    
  656.    
  657.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  658.    
  659.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  660.    
  661.    
  662.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  663.    
  664.      <category term="routes" scheme="https://blog.gmifly.tw/tags/routes/"/>
  665.    
  666.      <category term="resource" scheme="https://blog.gmifly.tw/tags/resource/"/>
  667.    
  668.      <category term="collection" scheme="https://blog.gmifly.tw/tags/collection/"/>
  669.    
  670.      <category term="member" scheme="https://blog.gmifly.tw/tags/member/"/>
  671.    
  672.  </entry>
  673.  
  674.  <entry>
  675.    <title>[Rails] 分辨 cookie and session</title>
  676.    <link href="https://blog.gmifly.tw/2018/06/17/Rails-%E5%88%86%E8%BE%A8-cookie-and-session/"/>
  677.    <id>https://blog.gmifly.tw/2018/06/17/Rails-%E5%88%86%E8%BE%A8-cookie-and-session/</id>
  678.    <published>2018-06-17T09:36:44.000Z</published>
  679.    <updated>2019-10-11T03:26:49.000Z</updated>
  680.    
  681.    <summary type="html">
  682.    
  683.      &lt;p&gt;在技術面試上&lt;br&gt;常常被問到的問題之一,要你區分 Cookie 和 Session ?&lt;br&gt;一般只知道&lt;br&gt;Cookie 就是存在客戶端(Client)&lt;br&gt;Session 存在服務器端&lt;/p&gt;
  684. &lt;h2 id=&quot;什麼是-cookie&quot;&gt;&lt;a href=&quot;#什麼是-cookie&quot; class=&quot;headerlink&quot; title=&quot;什麼是 cookie ?&quot;&gt;&lt;/a&gt;什麼是 cookie ?&lt;/h2&gt;&lt;p&gt;每次發起 Http 請求時,客户端都會發送相應的 cookie 信息到服務端。&lt;br&gt;它的过期时间可以任意设置,如果你不主动清除它,大部分會一直保留著&lt;br&gt;即便你關閉了電腦&lt;/p&gt;
  685.    
  686.    </summary>
  687.    
  688.    
  689.      <category term="Rails" scheme="https://blog.gmifly.tw/categories/Rails/"/>
  690.    
  691.      <category term="Learn" scheme="https://blog.gmifly.tw/categories/Rails/Learn/"/>
  692.    
  693.    
  694.      <category term="rails" scheme="https://blog.gmifly.tw/tags/rails/"/>
  695.    
  696.      <category term="cookie" scheme="https://blog.gmifly.tw/tags/cookie/"/>
  697.    
  698.      <category term="session" scheme="https://blog.gmifly.tw/tags/session/"/>
  699.    
  700.  </entry>
  701.  
  702. </feed>
  703.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid Atom 1.0" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=https%3A//blog.gmifly.tw/feed.xml

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda