tag:blogger.com,1999:blog-75428572930936726172024-02-24T10:03:18.622+08:00La Tech.There Is Nothing New Under the SunUnknownnoreply@blogger.comBlogger157125tag:blogger.com,1999:blog-7542857293093672617.post-53586640612907012012021-09-27T08:31:00.270+08:002022-05-11T11:33:46.959+08:00Loki vs Elasticsearch 之窮人也能擁有日誌系統<p></p><blockquote><div class="separator" style="clear: both; text-align: center;">把 ElasticSearch deploy 到客戶雲端機器,才知到資源有多珍貴。</div></blockquote><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhreo6MhrH48LhVzK7Ysl8ZG2SkHTuxB5U-26FYwZ0uBrO36lvpIYtqClXL9ak8tq96k3HM7OdAQiYa_WgFe-CwwKIeoa4IQYsHNjmNVXZZQxE68BCp4uyjmcWuZ5OHge4w2c5LqDX3tYwO/s1244/20201030154037.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="716" data-original-width="1244" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhreo6MhrH48LhVzK7Ysl8ZG2SkHTuxB5U-26FYwZ0uBrO36lvpIYtqClXL9ak8tq96k3HM7OdAQiYa_WgFe-CwwKIeoa4IQYsHNjmNVXZZQxE68BCp4uyjmcWuZ5OHge4w2c5LqDX3tYwO/s320/20201030154037.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><b><span style="font-size: x-large;">優缺點</span></b></div><div class="separator" style="clear: both; text-align: left;">ElasticSearch</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>優點</li><ul><li>部署方便、服務拓展成熟</li><li>各種現成套件可用</li><li>Documentation 完整</li><li>每個開發人員,熟到不能再熟的 kibana 介面</li></ul><li>缺點</li><ul><li>超吃資源,記憶體限他 2G,就給吃 4G,連自家 kibana 都能吃到 500mb</li><li>什麼都要錢,沒升到黃金會員($19),連 Alert slack notice 都不給用</li><li>跟 AWS 對幹中</li><li>超吃空間,原設計來做搜尋引擎使用,Log 產生的索引過大,優勢變缺點</li></ul></ul></div><div class="separator" style="clear: both; text-align: left;"><b>Loki</b></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>優點</li><ul><li>資源需求低</li><li>可用 S3、DynamicDB、GCS storage</li><li>免費</li></ul><li>缺點</li><ul><li>Documentation 精簡、細節不清楚</li><li>太過年輕,社群資源不多</li></ul></ul></div><div><br /></div><div><br /></div><b><span style="font-size: x-large;">記憶體</span></b><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLPAqEJti_Zm76_V7RKTUswG6fLPoOBITu1O-OzzhFpjUSq4wb3J3AZ8Hh7mY_ioJVchyLTfsr74Yvzzt8xBcR8muFhp_J5GgEGQkfjGN0kpmZu1YWMIej6DZ3dN6lZvesXGXGAZdtt0JL/s1080/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258A%25E5%258D%258810.46.21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="460" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLPAqEJti_Zm76_V7RKTUswG6fLPoOBITu1O-OzzhFpjUSq4wb3J3AZ8Hh7mY_ioJVchyLTfsr74Yvzzt8xBcR8muFhp_J5GgEGQkfjGN0kpmZu1YWMIej6DZ3dN6lZvesXGXGAZdtt0JL/s16000/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258A%25E5%258D%258810.46.21.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYlVKzuTVcNb6vdZcQVutdJ3spqfFAlY0X2kH4Jx-rUJkBLRe1LQ0b4yedOsVmsDgoEE1YvXmccqWMAcYSNQoLjyoV_-b78fsYzKjb4bfK2QtPBe77iakgT_FQhKTVOP8kq9jxzUnDpVHa/s1100/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258A%25E5%258D%258810.07.55.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="120" data-original-width="1100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYlVKzuTVcNb6vdZcQVutdJ3spqfFAlY0X2kH4Jx-rUJkBLRe1LQ0b4yedOsVmsDgoEE1YvXmccqWMAcYSNQoLjyoV_-b78fsYzKjb4bfK2QtPBe77iakgT_FQhKTVOP8kq9jxzUnDpVHa/s16000/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258A%25E5%258D%258810.07.55.png" /></a></div><br /><ul style="text-align: left;"><li><span style="color: red;">elasticsearch</span> vs loki</li><ul><li>5GiB vs 50MiB => 100倍</li></ul><li><span style="color: red;">kibana</span> vs grafana</li><ul><li>450MiB vs 25MiB => 18倍</li></ul><li>fluentbit vs <span style="color: red;">promtail</span></li><ul><li>5MiB vs 15MiB</li></ul></ul>從記憶體消耗,很明顯能感受出不同量級的差異。<div>另外,Loki 可搭配 fluentbit 使用,整套低消 80MiB<br /><div><br /><br /><br /><div><br /></div><b><span style="font-size: x-large;">Storage</span></b></div><div>儲存價格 USD/GB 每月</div><div><ul style="text-align: left;"><li>AWS RDS</li><ul><li>mariaDB $0.138 => 6倍</li><li><span style="color: #cccccc;">RDS instance $18.72</span></li></ul><li>AWS EBS (EC2 volume)</li><ul><li>SSD $0.096 => 4倍</li><li>HHD $0.054</li></ul><li>AWS S3</li><ul><li>standard $0.025</li><li>request - ListBucket $5/month (<span style="color: red;">2022/4/24 update!</span>)</li></ul><li>AWS CloudWatch</li><ul><li>存放 $0.033 (不含 收集 $0.76, 分析 $0.0076)</li></ul><li>Google GCS</li><ul><li>standard $0.02</li></ul><li>Local</li><ul><li>SSD $0.086 => (3年)月攤 $0.0023</li><li>HDD $0.023 => (3年)月攤 $0.00063</li><li><strike>電費 => 每月 $19.2 (約 t3.small 等級)</strike></li></ul></ul><div>如果資金有限,將 logger 存放在Local,是最佳的方案。</div><div>Local 電費等同於 ec2 instance,每個方案都必須付出,而 RDS 需再多支付 RDS 的機器費用。</div></div><div><br /></div><div>GCS、S3 為雲端最佳解法,只要是同個 region 的 instance 讀取,不需支付流量費用。</div><div>而放在 RDS 最浪費,且造成備份、移轉的麻煩。</div><div><br /></div><div>經過一段時間測試,放在 S3 似乎會造成一筆額外的費用,反而成為成本最高的選擇,可能要搭配 DynamoDB 使用,又或者直接存放在 EBS,再定期 docker volume backup to s3 (<span style="color: red;">2022/4/24 update!</span>)</div><div><a href="https://github.com/s3fs-fuse/s3fs-fuse/wiki/FAQ#q-why-does-my-aws-s3-bill-cost-a-lot-more-than-the-storage-fee" target="_blank">s3fs-fuse(cost-more-than)</a></div><div><br /></div><div><b><span style="font-size: x-large;">Loki 執行情況</span></b></div><div><div class="separator" style="clear: both; font-weight: bold; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7G1QQgLw-mJtWQ1rQcWCba7mVFnGjR-g-nsSw7MV7KNGjEjKrzsHjfhle1M4vKgoy1vKfoj_hfkZYRNLmGSfY7msnes0KnfUAUxzETDSJtnvKlCZvfvtFuf1uWrLypLmIBmyuG8yiwsWu/s822/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258B%25E5%258D%258812.54.37.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="152" data-original-width="822" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7G1QQgLw-mJtWQ1rQcWCba7mVFnGjR-g-nsSw7MV7KNGjEjKrzsHjfhle1M4vKgoy1vKfoj_hfkZYRNLmGSfY7msnes0KnfUAUxzETDSJtnvKlCZvfvtFuf1uWrLypLmIBmyuG8yiwsWu/s16000/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258B%25E5%258D%258812.54.37.png" /></a></div><div class="separator" style="clear: both; text-align: center;">使用 boltdb-shipper 後,volume 幾乎不消耗空間</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-jqjGCbvHufQ/YVFRQckmQtI/AAAAAAAAFBI/UZty8NMfuDUwMRtpaanRgYP0LyLxROx3gCNcBGAsYHQ/s3160/%25E6%2588%25AA%25E5%259C%2596%2B2021-09-27%2B%25E4%25B8%258B%25E5%258D%25881.03.21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="124" data-original-width="3160" src="https://1.bp.blogspot.com/-jqjGCbvHufQ/YVFRQckmQtI/AAAAAAAAFBI/UZty8NMfuDUwMRtpaanRgYP0LyLxROx3gCNcBGAsYHQ/s16000/%25E6%2588%25AA%25E5%259C%2596%2B2021-09-27%2B%25E4%25B8%258B%25E5%258D%25881.03.21.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;">Container 裡面也算乾淨,elasticSearch 飆到 300MB</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-1xmUxlSeySs/YVFRkvh184I/AAAAAAAAFBQ/YKq7Uuo522IB_MKbQKSOV9R8HpoZfFGiQCNcBGAsYHQ/s1426/%25E6%2588%25AA%25E5%259C%2596%2B2021-09-27%2B%25E4%25B8%258A%25E5%258D%258811.05.57.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1084" data-original-width="1426" src="https://1.bp.blogspot.com/-1xmUxlSeySs/YVFRkvh184I/AAAAAAAAFBQ/YKq7Uuo522IB_MKbQKSOV9R8HpoZfFGiQCNcBGAsYHQ/s16000/%25E6%2588%25AA%25E5%259C%2596%2B2021-09-27%2B%25E4%25B8%258A%25E5%258D%258811.05.57.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;">串 S3 成功後,會出現 1~2 個資料夾,照 Chunk_ 設定,可能 15m~1h<span style="font-family: Menlo;"> 才會看到資料</span></div><div class="separator" style="clear: both; text-align: center;"><span style="font-family: Menlo;"><br /></span></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxBKLGMzTsod1zVEYvGHpR_6xmdV4j58dW3bdHdNqydpD8vrjNubpeWQCxRc72yTMi3PcT-EZa33YjzXb_j6LgVt0iW8GIYtgqOUaFY3YIioHBlIOdUSUZQy_u0OvACv91-Yo_fkxRgAkC/s2048/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258A%25E5%258D%258811.06.12.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1298" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxBKLGMzTsod1zVEYvGHpR_6xmdV4j58dW3bdHdNqydpD8vrjNubpeWQCxRc72yTMi3PcT-EZa33YjzXb_j6LgVt0iW8GIYtgqOUaFY3YIioHBlIOdUSUZQy_u0OvACv91-Yo_fkxRgAkC/s16000/%25E6%2588%25AA%25E5%259C%2596+2021-09-27+%25E4%25B8%258A%25E5%258D%258811.06.12.png" /></a></div><br /><span style="font-family: Menlo;"><br /></span></div><div><br /></div><span style="font-size: xx-large; font-weight: 700;">config.yaml</span></div><div>
<pre><code class="bash"># 最遠查詢期限,必須小於等於 retention_period
chunk_store_config:
max_look_back_period: 1440h
#日誌保留期限
table_manager:
retention_deletes_enabled: true
retention_period: 1440h #2個月
</code></pre>
<code><div></div></code></div></div><br /><div><br /></div><div><span style="font-size: -webkit-xxx-large; font-weight: 700;">畫面參考</span></div><div>建議 push log 時,多標記一些 label,可多維度查詢<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJFMvLhQu32uoJ9DKwKPJUqfTrCPLREx3XxjZLJEmEm0J4KGufWt40havOywOfs95tZxS-lIrYkqFqiA-vOnC_aDAFO3GP_7GR0T90Tq5ymZlMQsOIfx8UTJD5SZY-29VNi_9lHJgXfR8b6ay2sdYyuL-Z4Uownh1--WV3fFP-GNOKf1AWioibzd6BGg/s1840/%E6%88%AA%E5%9C%96%202022-04-03%20%E4%B8%8B%E5%8D%883.23.18.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1084" data-original-width="1840" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJFMvLhQu32uoJ9DKwKPJUqfTrCPLREx3XxjZLJEmEm0J4KGufWt40havOywOfs95tZxS-lIrYkqFqiA-vOnC_aDAFO3GP_7GR0T90Tq5ymZlMQsOIfx8UTJD5SZY-29VNi_9lHJgXfR8b6ay2sdYyuL-Z4Uownh1--WV3fFP-GNOKf1AWioibzd6BGg/s16000/%E6%88%AA%E5%9C%96%202022-04-03%20%E4%B8%8B%E5%8D%883.23.18.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div><br /></div><div>將呼叫第三方 api 的時間、次數搜集起來,做成儀表板</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgFG9Hl1UAFaGqdLaEENADs9ieZw7oRzzUALXdDN-5cpHXyol7BGuA6qoiTgjBoNDfny6TUo_p-MJFvuHuPdreoykL37FA9UNOYArE0cv08w3L38Lg1WYoxVb0hwPnwtPdJ3VKaomNq5nWW0otJUWsK9XUnaaQCx9Rude_XxZMRAVfzfJ3tH4DSGtq9w/s1662/%E6%88%AA%E5%9C%96%202022-04-05%20%E4%B8%8B%E5%8D%885.54.11.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="1662" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgFG9Hl1UAFaGqdLaEENADs9ieZw7oRzzUALXdDN-5cpHXyol7BGuA6qoiTgjBoNDfny6TUo_p-MJFvuHuPdreoykL37FA9UNOYArE0cv08w3L38Lg1WYoxVb0hwPnwtPdJ3VKaomNq5nWW0otJUWsK9XUnaaQCx9Rude_XxZMRAVfzfJ3tH4DSGtq9w/s16000/%E6%88%AA%E5%9C%96%202022-04-05%20%E4%B8%8B%E5%8D%885.54.11.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div><br /></div><br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-91216254110267082732021-09-19T05:30:00.003+08:002021-09-19T05:31:42.919+08:00Drone CI 搭配 AWS Secrets Manager 疑難排解<blockquote><p>將機敏資料放在 .env 是危險的作法,通常會搭配 AWS Secrets Manager、Vault 等工具使用</p></blockquote><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKw27tKmAhvlu1ze4NGSbV4EKMpeBaYlxF5a1fV2kMXcM63F7i9ZjYoXsCSwU5Lx2GnFD4ubKRP3C57eTvegDi9wTHUGxcE0dE49m49dXqJpOLmbxeSGCHEQZU4MhZgHMEfOL_QtEbbKME/s1024/iam.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="512" data-original-width="1024" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKw27tKmAhvlu1ze4NGSbV4EKMpeBaYlxF5a1fV2kMXcM63F7i9ZjYoXsCSwU5Lx2GnFD4ubKRP3C57eTvegDi9wTHUGxcE0dE49m49dXqJpOLmbxeSGCHEQZU4MhZgHMEfOL_QtEbbKME/s320/iam.png" width="320" /></a></div><br /><p></p><p><br /></p><p>流程</p><p>DroneCI pull code -> 取得 secrets 資料 export 到 env -> build</p><p> </p><p><b>AWS Secrets Manager 價格</b></p><p></p><ul style="text-align: left;"><li>單一筆 secrets 每月 0.4USD</li><ul><li>一筆可存 N個 key-value</li></ul><li>每 10,000 次 API 呼叫 0.05 USD</li><li>複製到其他 region,需另計一份</li></ul><div><br /></div><div><br /></div><p></p>
<pre class="offset-1 head" code="docker-compose.yaml"><code class="yaml"> drone-server:
image: drone/drone:2
ports:
- 8888:80
- 443
restart: always
volumes:
- /home/my/droneci_docker:/data
environment:
- DRONE_AGENTS_ENABLED=true
- DRONE_BITBUCKET_CLIENT_ID=${DRONE_BITBUCKET_CLIENT_ID}
- DRONE_BITBUCKET_CLIENT_SECRET=${DRONE_BITBUCKET_CLIENT_SECRET}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_SERVER_HOST=${SERVER_HOST}
- DRONE_SERVER_PROTO=http
drone-runner:
image: drone/drone-runner-docker:1
ports:
- 3000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
DRONE_RPC_PROTO: http
DRONE_RPC_HOST: drone-server
DRONE_RPC_SECRET: ${DRONE_RPC_SECRET}
DRONE_RUNNER_CAPACITY: 3
DRONE_SECRET_PLUGIN_ENDPOINT: http://drone-aws-secret:3000
DRONE_SECRET_PLUGIN_TOKEN: xx1234
drone-aws-secret:
image: drone/amazon-secrets
ports:
- 3000
environment:
- DEBUG=true
- SECRET_KEY=xx1234
- AWS_ACCESS_KEY_ID=從IAM產
- AWS_SECRET_ACCESS_KEY=從IAM產
- AWS_REGION=secret所在region #官方文件沒說的重點
</code></pre>
<br />其餘細節請參考官方文件<div><a href="https://readme.drone.io/secret/external/aws/">https://readme.drone.io/secret/external/aws/</a></div><div><br /></div><div><br /></div><div><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-6841580287459403232021-05-11T11:45:00.009+08:002021-08-16T16:33:01.568+08:00Twilio SMS 快速入門(含轉正式帳號)<p> Twilio SMS 的測試帳號,新手常會遇到的兩個問題</p><p></p><ol style="text-align: left;"><li>簡訊收不到</li><li>如何切換正式帳號</li></ol><div>介面沒有提示的很完整,久沒用也常會卡到,筆記一下~</div><p></p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPqca8gwj1wFUXU3Cg6omhUvdFRxA4gnpYhkxifpimWt_QC1sSN51fRFhzcsDDVB2dPRJUs9wdvJ0uyMsydvi4KwgsFvkAHM4nwNsFMKEUJjau6mPkb16iLIfW9vmSPII5sAXVVTAcLk7k/s2048/featured_twilio.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2048" data-original-width="2048" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPqca8gwj1wFUXU3Cg6omhUvdFRxA4gnpYhkxifpimWt_QC1sSN51fRFhzcsDDVB2dPRJUs9wdvJ0uyMsydvi4KwgsFvkAHM4nwNsFMKEUJjau6mPkb16iLIfW9vmSPII5sAXVVTAcLk7k/s320/featured_twilio.png" /></a></div><br /><h4 style="text-align: left;"><b>簡訊收不到</b></h4><p></p><ul style="text-align: left;"><li>需先到 Phone Number -> Verified Caller IDs 加入並驗證電話號碼</li><li>每隻電話,第一次使用都要做這個動作</li></ul><div><br /></div><div></div><p></p><h4 style="text-align: left;"><b>如何切換正式帳號</b></h4><div><ul style="text-align: left;"><li>綁定信用卡,並「開啟自動付款」</li><li>Billing -> Overview -> AUTO RECHARGE -> Enable</li><li><a href="https://support.twilio.com/hc/en-us/articles/223183208-Upgrading-to-a-paid-Twilio-Account">https://support.twilio.com/hc/en-us/articles/223183208-Upgrading-to-a-paid-Twilio-Account</a></li></ul><p><br /></p><h4><b>價格</b></h4><div><ul style="text-align: left;"><li>0.015~0.075 USD / per</li></ul></div><p><br /></p><h4>遭遇狀況</h4><div><ul><li>+86 無法收到簡訊 (Ans: 到新的 UI 有介面可以改</li><li>+1 無法收到簡訊 (Ans: 到新的 UI 有介面可以改</li><li>遭盜用</li><li>會掉簡訊,+1 有些無法收到</li></ul></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-87454016643923433442020-12-17T18:00:00.006+08:002021-10-02T22:07:28.608+08:00AWS ECR login helper 保持永久登入<p>官方說明:<a href="https://docs.aws.amazon.com/zh_tw/AmazonECR/latest/userguide/Registries.html">https://docs.aws.amazon.com/zh_tw/AmazonECR/latest/userguide/Registries.html</a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM0MJCQXNB0nmTc4PomQhxITZgaKvmg5ad1Fc8__DVtErdk9MZvYFUP5BsKltAzP8kPUIXcQSbpLmi540NBtUjQP5zEMfl-E-vZrtrRjZe6wXEnH9jQEAoyjXc1tBufLQJK2aqFY6yJ5dE/s369/amazon-aws-ecr.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="136" data-original-width="369" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM0MJCQXNB0nmTc4PomQhxITZgaKvmg5ad1Fc8__DVtErdk9MZvYFUP5BsKltAzP8kPUIXcQSbpLmi540NBtUjQP5zEMfl-E-vZrtrRjZe6wXEnH9jQEAoyjXc1tBufLQJK2aqFY6yJ5dE/s320/amazon-aws-ecr.png" width="320" /></a></div><div><br /></div>官方提供三種登入方式<div><ol style="text-align: left;"><li>用 <a href="https://github.com/awslabs/amazon-ecr-credential-helper" target="_blank">credential-helper</a></li><li>用 Token + CLI</li><ol><li>新版 get-login-password</li><li>舊版 get-login</li></ol><li>用 Token + HTTP API</li></ol><div>新版登入流程</div><div><ol style="text-align: left;"><li>登入AWS,aws configure</li><li>取得 ECR 臨時密碼,aws ecr get-login-password</li><li>拿臨時密碼登入 Docker,docker login xxxx.dkr.ecr.ap-xxx-1.amazonaws.com (帳號為 AWS)</li><li>在你的 image 上,tag 對應的 repo 位置</li><li>Docker Push</li></ol></div><div>權限設定</div><div><ul style="text-align: left;"><li>IAM 必須要 掛 ecr.* 權限 (<a href="https://docs.aws.amazon.com/zh_tw/AmazonECR/latest/userguide/ecr_managed_policies.html" target="_blank">官方教學</a>)</li><li>Repo 本身權限要開,指到對應 iam user,並且開 CRUD 權限</li></ul></div><div><br /></div><div><br /></div><div><br /></div><div>docker login 後,該 token 只有「12h」時效,所以必須定時 renew,或者每次 push 都要先做一次 login</div><div><br /></div><div>最方便的方式,直接用 credential-helper 解決</div><div><br /></div><div><br /></div><div>MacOS</div><div><ol style="text-align: left;"><li>安裝
<pre><code class="bash line">$ brew install docker-credential-helper-ecr
</code></pre>
</li><li>修改 <span class="bg-gray">~/.docker/config.json</span></li><ol><li>docker 1.13.0 以上
<pre><code class="json">"credHelpers": {
"[aws_account_id].dkr.ecr.[region].amazonaws.com": "ecr-login"
}
</code></pre>
</li><li>docker 舊版
<pre><code class="json">"credsStore": "ecr-login"
</code></pre>
</li>
</ol><li>docker push</li><ul><li>若 aws 已經登入,會自動登入 ecr,做 push 的動作</li></ul></ol></div><p><br /></p><p>Docker</p><p></p><ol style="text-align: left;"><li>登出 ECR
<pre><code class="bash">docker logout [aws_account_id].dkr.ecr.[region].amazonaws.com
</code></pre></li></ol><p></p></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-88212557789517474082020-12-15T14:21:00.002+08:002020-12-15T14:23:18.479+08:00iMonitor 員工行為監控軟體<p>30秒截圖,且紀錄操作行為,開 app、開網頁 ...</p><p>並定時上傳至雲端</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-LGe5B7Dt0SQ8lr0wh0CuPmgLeCHju2mO-tAto6tRWPKqFgeQsBuouXMsb5JyewWZUyBio9Nhxmeo7gIXteuF7LYj1NT6cxBadJFIrzkguBcD04TknJqm0OF8fWJfsmxW9HkUQhnsKYSH/s382/%25E6%2588%25AA%25E5%259C%2596+2020-12-15+%25E4%25B8%258B%25E5%258D%25882.20.32.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="164" data-original-width="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-LGe5B7Dt0SQ8lr0wh0CuPmgLeCHju2mO-tAto6tRWPKqFgeQsBuouXMsb5JyewWZUyBio9Nhxmeo7gIXteuF7LYj1NT6cxBadJFIrzkguBcD04TknJqm0OF8fWJfsmxW9HkUQhnsKYSH/s16000/%25E6%2588%25AA%25E5%259C%2596+2020-12-15+%25E4%25B8%258B%25E5%258D%25882.20.32.png" /></a></div><br /><p><br /></p><p>如何確定是否有安裝</p><p></p><ol style="text-align: left;"><li>系統設定 -> 安全性與隱私權 -> 隱私權 -> 螢幕錄製,看是否有 imonitor</li><li>在 terminal 下 ps -ax | grep imonitor,看是否存在</li></ol><p></p><p>會在背景執行 service,來自 /Library/LaunchDaemons/com.imonitor.daemon.plist</p><p>資料 & .app 放在 /Library/imonitor,直接將此目錄砍掉,並重開機即可</p><p>隱私權的 imonitor 也將會消失</p><p>「前提是要有 admin 權限」</p><p><br /></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-89668343377864431592020-05-08T15:24:00.001+08:002022-11-04T02:04:50.072+08:00Mail 跑版解決方案遇到的狀況<br />
<br />
<ol>
<li>Windows10 Outlook</li>
<ol>
<li>svg 圖片無法顯示</li>
<li>排版幾乎失效</li>
<li>google font 字型失效</li>
</ol>
<li>手機</li>
<ol>
<li>3 columns 會跑版</li>
<li>非滿版的 button 會超過螢幕</li>
</ol>
<li>Mac dark Mode</li>
<ol>
<li>Mac</li>
<li>iPhone</li>
</ol>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1IJhiBoHJbnk37mZYdxoOqR8t2z7yBYDXfKlNzoTvP5Qzn8F-2pMd12IK934fDwo5R8Cz3WyaYE5OoTD0gYvjjBDFPUI0N2wVqpQk7qNhU_jb3dvbZ-bB195-Fk8S_VdQVclvQinEeuTO/s1600/file5c76396cf3e8b.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="707" data-original-width="965" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1IJhiBoHJbnk37mZYdxoOqR8t2z7yBYDXfKlNzoTvP5Qzn8F-2pMd12IK934fDwo5R8Cz3WyaYE5OoTD0gYvjjBDFPUI0N2wVqpQk7qNhU_jb3dvbZ-bB195-Fk8S_VdQVclvQinEeuTO/s320/file5c76396cf3e8b.jpg" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
工具</div>
<div>
<ul>
<li>MJML</li>
<ul>
<li>提供簡單的語法,開發出高相容性的 mail content</li>
<li>撰寫時,可 即時預覽 desktop/mobile 效果</li>
<li>撰寫後,可 export HTML、即時發送測試信件</li>
<li>由 Mailject 開發,使用 desktop app,可發送 100封/日 測試信</li>
<li>有現成 mail 樣板可套用</li>
<li>可使用 <a href="https://mjmlio.github.io/mjml-app/" target="_blank">desktop app</a>、<a href="https://mjml.io/try-it-live" target="_blank">web live editor</a>、<a href="https://github.com/mjmlio/mjml/tree/master/packages/mjml-cli" target="_blank">nodejs (miml-cli)</a></li>
<li>使用 nodejs 開發,提供 IDE plugin (Atom, sbulime, gulp)</li>
<li>語法查詢 (<a href="https://mjml.io/documentation/#mjml-guides" target="_blank">link</a>)</li>
<li>語法特性</li>
<ul>
<li>可針對某個 tag 撰寫預設 attributes</li>
<li>可宣告多個 class name,提供重複使用</li>
<li>有 Row/Col 概念的排版語法</li>
<li>有 Group 可在手機版,保持在同一行</li>
<li>有 include 概念,可以拆開共用元件</li>
<li>有 variable 概念,可以挖洞,從外部送資料進來套版</li>
</ul>
</ul>
<li>相容性查詢</li>
<ul>
<li>針對 desktop & phone 的主流 mailer app 測試</li>
<li><a href="https://mjml.io/compatibility/mj-image" target="_blank">MJML</a></li>
<ul>
<li>每個語法底下,有提供範例檔,可直接發信到信箱測試</li>
</ul>
<li><a href="https://www.caniemail.com/" target="_blank">Can I email</a></li>
<ul>
<li>可查詢各種 <b>html & css & image </b>支援度</li>
<li><a href="https://www.caniemail.com/scoreboard/" target="_blank">Mailer 評分</a></li>
<li><a href="https://www.caniemail.com/features/#title-image" target="_blank">Image 格式支援度</a></li>
</ul>
</ul>
</ul>
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-33341288802113126522019-11-14T10:49:00.000+08:002019-11-14T10:51:10.761+08:00台鐵站點、班次資料政府資料開放平臺<br />
<br />
<ul>
<li>鐵路時刻表 <a href="https://data.gov.tw/dataset/6138">https://data.gov.tw/dataset/6138</a></li>
<li>車站基本資料集 <a href="https://data.gov.tw/dataset/33425">https://data.gov.tw/dataset/33425</a></li>
<li>*網址為 hash,純粹作下載檔案用</li>
</ul>
<div>
<br /></div>
<div>
交通部</div>
<div>
<ul>
<li>MOTC<span style="color: red;">(建議)</span> <a href="https://ptx.transportdata.tw/MOTC?t=Rail&v=3#/">https://ptx.transportdata.tw/MOTC?t=Rail&v=3#/</a></li>
<ul>
<li>涵蓋全國尺度之公車、臺鐵、高鐵、捷運、航空、自行車等公共運輸旅運資料</li>
<li>swagger</li>
<li>API 使用說明 (<a href="https://ptxmotc.gitbooks.io/ptx-api-documentation/content/api-shi-yong/" target="_blank">link</a>)</li>
</ul>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcRXbvbWVYc_iMnkfzZ5RKruFnkmypggcKtXH6R9sK38MyeTCa0Wito3Li-i-wqo06I1ovBRnKHuFrFoFnyXh4Bzq4w65MluzDo5-aynUBf0P0g7j9E_6ZsI6fSEYopVfr2TxMDV9awfrK/s1600/logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="71" data-original-width="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcRXbvbWVYc_iMnkfzZ5RKruFnkmypggcKtXH6R9sK38MyeTCa0Wito3Li-i-wqo06I1ovBRnKHuFrFoFnyXh4Bzq4w65MluzDo5-aynUBf0P0g7j9E_6ZsI6fSEYopVfr2TxMDV9awfrK/s1600/logo.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-47725507288123630272019-11-04T16:33:00.001+08:002019-11-04T16:33:57.942+08:00TeamCity + Bitbucket + Vuejs + slack準備:<br />
<ol>
<li>bitbucket 帳號</li>
<li>docker hub 帳號</li>
</ol>
<br />
作法:<br />
<div>
<ol>
<li>在 docker 上跑 TeamCity</li>
<li>TeamCity 新增 project & connection</li>
<li>新增 Agent</li>
<li>開啟 auto-detect</li>
<li>在 Vuejs Project 加入 Dockerfile & docker-compose + 設定</li>
<li>先推上 dockerhub 再 deploy</li>
<li>tcWebHooks(Slack notification)</li>
</ol>
</div>
<a href="https://1.bp.blogspot.com/-6zLuWxk3WMI/Xb_iMiI2D0I/AAAAAAAAEWQ/n5mVd8v2ZjAEDRVKUSCnH00-Z6_uYBAtwCNcBGAsYHQ/s1600/be7833db9bddb4494d2a7c3dd659199a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="208" data-original-width="188" src="https://1.bp.blogspot.com/-6zLuWxk3WMI/Xb_iMiI2D0I/AAAAAAAAEWQ/n5mVd8v2ZjAEDRVKUSCnH00-Z6_uYBAtwCNcBGAsYHQ/s1600/be7833db9bddb4494d2a7c3dd659199a.png" /></a><br />
<h3>
1. 在 docker 上跑 TeamCity</h3>
<ol>
<li>到 <a href="https://hub.docker.com/r/jetbrains/teamcity-server">jetbrains/teamcity-server</a> 看說明</li>
<li>找一個地方,建立 2 個資料夾,用來儲存 TeamCity 的 data & logs </li>
<pre><code class="bash">docker run -itd --name teamcity-server-instance \
-v <你的data資料夾>:/data/teamcity_server/datadir \
-v <你的logs資料夾>:/opt/teamcity/logs \
-p <TeamCity對外Port>:8111 \
jetbrains/teamcity-server
</code></pre>
<li>選擇 internal HSQLDB</li>
<div class="alert-message alert">
注意 : 正式機請勿使用 internal,這種格式累積到 200MB 以上會`<a href="https://www.jetbrains.com/help/teamcity/setting-up-an-external-database.html#SettingupanExternalDatabase-DefaultInternalDatabase">異常緩慢、資料遺失</a>。<i class="fa fa-info-circle"></i></div>
<li>process -> Accept -> Create Account</li>
</ol>
<br />
<h3>
2. TeamCity 新增 project & connection</h3>
artifact paths:publishing 到 外部,可直接 Web 下載<br />
<br />
<h3>
3. 新增 Agent</h3>
Agent 是來處理 build 的服務,agent 越多,越能並行多個 build
<a href="https://hub.docker.com/r/jetbrains/teamcity-agent/">jetbrains/teamcity-agent</a>
<br />
<pre><code class="bash">docker run -itd -e SERVER_URL="http://你的Teamcity網址:Port" --privileged -e DOCKER_IN_DOCKER=start -v /var/run/docker.sock:/var/run/docker.sock -v 本地agent資料目錄:/data/teamcity_agent/conf jetbrains/teamcity-agent
</code></pre>
<br />
<br />
<h3>
4. 開啟 auto-detect & 設定</h3>
<ul>
<li>可選擇使用 auto-detect <span style="color: blue;">(但這邊不用此方式)</span></li>
</ul>
<br />
<br />
<h3>
5. 在 Vuejs Project 加入 Dockerfile & docker-compose + 設定</h3>
<ol>
<li>建立一個 vue 新專案 (已有專案請跳過)</li>
<pre><code class="bash">$ npm install -g @vue/cli #如果沒裝 vue-cli
$ vue create vue-citest
-> default
$ vue run serve
</code></pre>
<li>建立 bitbucket 並將 code 推上 repository (已有專案請跳過)</li>
<li>新增 Dockerfile (<a href="https://vuejs.org/v2/cookbook/dockerize-vuejs-app.html#Simple-Example" target="_blank">官方文件</a>)</li>
<pre class="offset-1 head" code="專案目錄/Dockerfile"><code class="docker"># build stage
FROM node:lts-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm i -S @vue/cli-service
RUN npm install --production
COPY . .
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
</code></pre>
<li>新增 docker-compose.yml</li>
<pre class="offset-1 head" code="專案目錄/docker-compose.yml"><code class="yaml">version: '3'
services:
vuecitest:
build:
context: .
restart: unless-stopped
ports:
- 80:80
</code></pre>
<li>Projects->Build->Edit Settings->Build Step:Command Line->Add build step->Command Line</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfveUtaUPjHcaC5NyY-SyOeAbqQ6EdkAp7QPQWsA9WraQ0Mya2lJLMNFKNBpM04JYdMddul0gGSzmYXIS2lFI2CvpxF1IJIpJpIEEGafnUISQl0rd2UudKD_EWH04gGDLcJADgAvduNRNA/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2019-10-31+%25E4%25B8%258B%25E5%258D%25886.11.16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="694" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfveUtaUPjHcaC5NyY-SyOeAbqQ6EdkAp7QPQWsA9WraQ0Mya2lJLMNFKNBpM04JYdMddul0gGSzmYXIS2lFI2CvpxF1IJIpJpIEEGafnUISQl0rd2UudKD_EWH04gGDLcJADgAvduNRNA/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2019-10-31+%25E4%25B8%258B%25E5%258D%25886.11.16.png" /></a></div>
</ol>
<br />
<br />
<h3>
6. 先推上 dockerhub 再 deploy</h3>
agent 端記得先用 docker login 登入。
<br />
<ul>
<li>作法一:可使用範本 Docker + Command Line</li>
<ul>
<li>Docker:選擇 push,並填寫 Image name:tag</li>
</ul>
<li> 作法二:直接用 Command Line</li>
<pre><code class="bash">docker build --tag myname/vue-citest .;
docker push myname/vue-citest;
docker rmi myname/vue-citest;
docker-compose up -d; //需準備 yaml檔</code></pre>
</ul>
<h3>
7. tcWebHooks(<span style="color: #a64d79;">Slack</span> notification)</h3>
<ul>
<li>Slack</li>
<ol>
<li>新增一個 Channel</li>
<li>內容區最上方,「+Add an app」,安裝 incoming-webhook</li>
<li>app 內 -> view -> Settings -> Webhook URL</li>
</ol>
<li>TeamCity</li>
<ol>
<li>administration -> Plugins List -> Browse plugins repository</li>
<li>查詢 web Hook,安裝</li>
<ul>
<li>Web Hooks (tcWebHooks)</li>
<li>Web Hooks REST API (tcWebHooks)</li>
</ul>
<li>看 WebHooks REST API 有無需要 fix plugin,點擊 & restart</li>
<li>Projects -> Project -> Build 選單 -> WebHooks -> Edit project WebHooks -> Click to create -> 貼上 Webhook URL<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigKOeFcfnJVIJUKyUKOUZYHUzbC0T3KeoPtm98JDMCVZEUOy0s636GqKgOkPr2zvEVs-atPEXspqDDBZoZdNVfGVwB-uaHQGFosJ2-S2LyNwJgIuNMoXxDQdKq_LEdYIjH2VDFnf4xf7d4/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2019-11-04+%25E4%25B8%258B%25E5%258D%25883.37.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="750" data-original-width="1316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigKOeFcfnJVIJUKyUKOUZYHUzbC0T3KeoPtm98JDMCVZEUOy0s636GqKgOkPr2zvEVs-atPEXspqDDBZoZdNVfGVwB-uaHQGFosJ2-S2LyNwJgIuNMoXxDQdKq_LEdYIjH2VDFnf4xf7d4/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2019-11-04+%25E4%25B8%258B%25E5%258D%25883.37.14.png" /></a></div>
</li>
</ol>
</ul>
<br />
<br />
<h2>
常見問題</h2>
<br />
<ul>
<li><span style="color: red;">teamcity Unmet requirements: docker.server.version exists</span></li>
<ul>
<li>重新安裝 docker</li>
</ul>
</ul>
<div>
<br /></div>
<h2>
參考文件</h2>
<ul>
<li><a href="https://dotblogs.com.tw/stanley14/2018/05/28/jenkins_slack">https://dotblogs.com.tw/stanley14/2018/05/28/jenkins_slack</a></li>
</ul>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-7280800482955310922019-10-24T16:44:00.001+08:002019-10-24T16:44:43.064+08:00Create a exFat image have partition<h4>
大致流程</h4>
<ol>
<li>建 image</li>
<li>fdisk 切割磁碟</li>
<li>格式化</li>
</ol>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrVt8dojwdYyiXJgBZDpyPpbcm1L250v0u4giGLAE4AckixguNzD6U63udrv2TU-NsXggXlwDH_InCq1vRvmyg9DLLxoPEyqdkmbJuqMQEiT5eDIcc3FnTOVIF9EO12jzmY3XJlQxbKBZi/s1600/hard-disk-drive-3-816x459.jpg" imageanchor="1"><img border="0" data-original-height="230" data-original-width="408" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrVt8dojwdYyiXJgBZDpyPpbcm1L250v0u4giGLAE4AckixguNzD6U63udrv2TU-NsXggXlwDH_InCq1vRvmyg9DLLxoPEyqdkmbJuqMQEiT5eDIcc3FnTOVIF9EO12jzmY3XJlQxbKBZi/s320/hard-disk-drive-3-816x459.jpg" width="320" /></a><br />
<br />
<br />
<h4>
實作</h4>
<ol>
<li>建 image</li>
<pre><code class="bash">$ dd if=/dev/zero of=/root/mydisk bs=1M count=2048</code></pre>
<li>指定檔案系統格式</li>
<pre><code class="bash">$ mkfs.exfat /root/mydisk</code></pre>
exFAT在Linux和Windows上都支援,且Microsoft積極對其進行維護。
<li>fdisk 分割磁碟</li>
<pre><code class="bash">$ fdisk /root/mydisk</code></pre>
<ol>
<li>先切主磁碟</li>
<pre><code class="bash">Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-4194303, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-4194303, default 4194303): +1G
Created a new partition 1 of type 'Linux' and of size 1 GiB.
</code></pre>
<li>再切延伸磁碟</li>
<pre><code class="bash">Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): e
Partition number (2-4, default 2):
First sector (2099200-4194303, default 2099200):
Last sector, +sectors or +size{K,M,G,T,P} (2099200-4194303, default 4194303):
Created a new partition 2 of type 'Extended' and of size 1023 MiB.
</code></pre>
<li>儲存變更</li>
<pre><code class="bash">Command (m for help): w
The partition table has been altered.
Syncing disks.
</code></pre>
</ol>
<li>檢查磁碟分割</li>
<pre><code class="bash">$ fdisk -l /root/mydisk
Command (m for help): p
Disk mydisk: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
mydisk1 2048 2099199 2097152 1G 83 Linux
mydisk2 2099200 4194303 2095104 1023M 5 Extended
</code></pre>
<li>掛載測試</li>
</ol>
<br />
<br />
<h2>
備註</h2>
<h4>
安裝 mkfs.exFat</h4>
<pre><code class="bash line">$ mkfs. //tab 按2次顯示目前支援的格式
$ sudo apt install exfat-fuse exfat-utils</code></pre>
<h4>
dd用法</h4>
<pre><code class="bash">$ dd
bs=BYTES block size,一次讀寫 BYTES 位元組的資料,此選項會覆蓋 ibs 與 obs 的設定。(def: 512)
會 ibs & obs 設定
cbs=BYTES 一次轉換 BYTES 位元組的資料。
conv=CONVS 指定資料的轉換選項,如果一次要指定多種轉換,則以逗點分隔。
count=N 只處理 N 個輸入區塊,每個區塊的大小為 ibs。
ibs=BYTES input block size,指定輸入區塊大小,一次讀取 BYTES 位元組的資料 (def: 512位元組)
if=FILE 指定輸入檔案名稱(input file)為 FILE
iflag=FLAGS read as per the comma separated symbol list
obs=BYTES output block size,指定輸出區塊大小,一次寫入 BYTES 位元組的資料 (def: 512位元組)
of=FILE 指定輸出檔案名稱(output file)為 FILE。
seek=N 在輸出時跳過輸出檔案的前 N 個區塊,每個區塊的大小為 obs。
skip=N 在輸入時跳過輸入檔案的前 N 個區塊,每個區塊的大小為 ibs。
</code></pre>
<br />
<h4>
fdisk用法</h4>
<pre><code class="bash">$ fdisk [disk/image path]
Command (m for help):
Generic
d 刪除指定分割
F 列出未分割空間
l 列出支援分割區的 System 型態
t 更改分割區 system id
n 新增分割
p 顯示分割表
Save & Exit
w 寫入變更&離開
q 不儲存&離開
</code></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-43646092909689061442019-04-16T17:03:00.000+08:002019-04-16T17:04:01.012+08:00Symfony Locale in Url幾種方法:<br />
<ol>
<li>i18n-routing-bundle (<a href="https://jmsyst.com/bundles/JMSI18nRoutingBundle" target="_blank">link</a>)</li>
<li>router prefix + override decorating_translator (<a href="https://stackoverflow.com/questions/39470596/replacing-the-translator-service-in-symfony-3" target="_blank">link</a>)</li>
</ol>
<br />
期望:<br />
<ul>
<li>使用 aaa.bbb.com/en 或 /tw 可跳到指定語系的頁面</li>
</ul>
<div>
<br />
狀況:</div>
<div>
<ul>
<li>給 routing prefix 即可達成</li>
<li>但只能給 zh_TW,只給 tw 會吃不到 語系檔,即使你更改語系檔名稱</li>
</ul>
<div>
<br />
作法:</div>
</div>
<div>
<ul>
<li>覆寫 tran key 找對應文字的那段</li>
</ul>
<div>
<br /></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYFLYMhzBLx7erh30gSj3G_mbeEy0qPMcX_G3PbNyaP3ifOh0moUuv-EnvKeWHHLj2o9m-NdK98CJBpsT9k-xo4fPzTHuN_hf-nmg3eMnrn_vGFWLiYj_MUS8gCpWu_G890iFxAx0wwPzW/s1600/igene%25E5%25B7%25A5%25E4%25BD%259C%25E5%258D%2580%25E5%259F%259F+1%25403x.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="198" data-original-width="780" height="81" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYFLYMhzBLx7erh30gSj3G_mbeEy0qPMcX_G3PbNyaP3ifOh0moUuv-EnvKeWHHLj2o9m-NdK98CJBpsT9k-xo4fPzTHuN_hf-nmg3eMnrn_vGFWLiYj_MUS8gCpWu_G890iFxAx0wwPzW/s320/igene%25E5%25B7%25A5%25E4%25BD%259C%25E5%258D%2580%25E5%259F%259F+1%25403x.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<br />
<br />
app/config/parameters.yaml
<br />
<pre><code class="yaml">parameters:
app_name: comismart
locale: en
app.locales: en|tw|cn
locale_mapping: { tw: zh_TW, cn: zh_CN }
</code></pre>
<br />
app/config/services.yaml
<br />
<pre><code class="yaml"> app.decorating_translator:
class: AppBundle\Translation\Translator
decorates: translator
arguments:
- '@app.decorating_translator.inner'
# passing custom parameters
- {'%%app_name%%': '%app_name%', '%%PRETTY_ERROR%%': 'This is not nice:'}
- "%locale_mapping%"
public: false
</code></pre>
<br />
Translation/Translator.php
<br />
<pre><code class="php">namespace AppBundle\Translation;
use Symfony\Component\Translation\TranslatorBagInterface;
use Symfony\Component\Translation\TranslatorInterface;
class Translator implements TranslatorInterface, TranslatorBagInterface
{
/** @var TranslatorBagInterface|TranslatorInterface */
protected $translator;
/** @var array */
private $parameters;
private $locale_mapping;
/**
* @param TranslatorInterface|TranslatorBagInterface $translator
* @param array $parameters
*/
public function __construct($translator, $parameters, $locale_mapping = array())
{
$this->translator = $translator;
$this->parameters = $parameters;
$this->locale_mapping = $locale_mapping;
}
/**
* @param string $id
* @param array $parameters
* @param null $domain
* @param null $locale
*
* @return string
*/
public function trans($id, array $parameters = [], $domain = null, $locale = null)
{
$parameters = $this->updateParameters($parameters);
return $this->translator->trans($id, $parameters, $domain, $locale);
}
/**
* @param string $id
* @param int $number
* @param array $parameters
* @param null $domain
* @param null $locale
*
* @return string
*/
public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
{
$parameters = $this->updateParameters($parameters);
return $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
}
/**
* @param string $locale
*/
public function setLocale($locale)
{
$locale = @$this->locale_mapping[$locale];
if(empty($locale)) {
$locale = 'en';
}
$this->translator->setLocale($locale);
}
/**
* @return string
*/
public function getLocale()
{
return $this->translator->getLocale();
}
/**
* @param string|null $locale
*
* @return \Symfony\Component\Translation\MessageCatalogueInterface
*/
public function getCatalogue($locale = null)
{
return $this->translator->getCatalogue($locale);
}
/**
* @param array $parameters
*
* @return array
*/
protected function updateParameters($parameters)
{
return array_merge($this->parameters, $parameters);
}
}
</code></pre>
<br />
app/config/routing.yml
<br />
<pre><code class="yaml">
cs_index:
path: /{_locale}/
defaults: { _controller: AppBundle:Default:index }
cs_about:
path: /{_locale}/about
defaults: { _controller: AppBundle:Default:about }
</code></pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-49567306164963964012018-11-24T15:39:00.002+08:002021-09-04T23:30:45.049+08:00Nginx upstream(Load Balance)<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaQzuIjXaiOmEHUo97yJshQwMhU-hRDXxE-M9mue9Zs8Nw7ia9iFBjSwtE42LdhEUAhyXorwKg1lsBsQXwkSU1hbyi8Kj91RLQIiAQd9Om1zp7koOPw3XaGrVbjGBxstawdecFObLouhul/s1600/nginx-plus-sizing-guide-topology.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="389" data-original-width="1024" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaQzuIjXaiOmEHUo97yJshQwMhU-hRDXxE-M9mue9Zs8Nw7ia9iFBjSwtE42LdhEUAhyXorwKg1lsBsQXwkSU1hbyi8Kj91RLQIiAQd9Om1zp7koOPw3XaGrVbjGBxstawdecFObLouhul/s400/nginx-plus-sizing-guide-topology.png" width="400" /></a></div>
<span><br /></span>
<span><br /></span>
<span>Load Balance 手段</span><br />
<ul>
<li><span>Nginx</span><span>可用來做正向(Forward)、反向(Reverse)代理</span></li>
<li><span>針對網址的流水號 or 特定參數,做切割分派</span></li>
<li><span>動靜態資料分流</span></li>
<li><span>HTTP 1.1 Long polling(長握手),改用 301 將 Connection keep 到目標 server 上,別綁在 proxy server 身上</span></li>
</ul>
</div>
<div>
<br />
<b>正向代理</b><br />
<pre><code>server {
listen 8080;
resolver 168.95.1.1;
access_log off;
location / {
proxy_pass http://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
}
}</code></pre>
<br />
<span><b>反向代理</b></span><br />
<ul>
<li><span><span face="sans-serif" style="background-color: white; line-height: 22.3999996185303px; text-align: justify;">round-robin</span>(Default) </span><span>照順序輪,會跳過 Down 掉的 server</span></li>
<pre><code>http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
}
server {
listen 80;
location / {
# 傳遞真實IP到後端
#proxy_set_header Host $http_host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://myapp1;
}
}
}</code></pre>
</ul>
</div>
<div>
<ul>
<li>Weight 權重</li>
<pre><code>upstream myapp1 {
server srv1.example.com weight=10;
server srv2.example.com;
}</code></pre>
</ul>
<br />
<ul>
<li>IP-Hash 用IP雜湊分配,可解決 session 問題</li>
<pre><code>upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
}</code></pre>
</ul>
<div>
<div>
<ul>
<li><span>Least Connect 最少連線數的 server 優先使用</span></li>
<pre><code>upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
}</code></pre>
</ul>
<div>
<ul>
<li>fair(第三方)按後端服務器的回應時間來分配,反映快的優先分配。</li>
<pre><code>upstream myapp1 {
server server1;
server server2;
fair;
}</code></pre>
</ul>
<div>
<ul>
<li><span>url_hash(第三方)</span></li>
<ul>
<li>按訪問url的hash結果來分配,同 hash 指向同一個服務器,後端服務器為緩存時比較有效。</li>
<li>例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數</li>
<pre><code>upstream myapp1 {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}</code></pre>
</ul>
</ul>
</div>
</div>
<div>
<ul>
<li>SSL 1 external port to N internal port (process)</li>
<ul>
<li>將同一個服務,在內部用不同的 port 分開</li>
</ul>
<pre><code>upstream upstream_1{
server 0.0.0.0:1338;
server 0.0.0.0:1339;
server 0.0.0.0:1340;
server 0.0.0.0:1341;
}
server {
listen 1337 ssl default_server;
server_name api.mydomain.com;
ssl_certificate /var/www/abc/ssl/apache.crt;
ssl_certificate_key /var/www/abc/ssl/mydomain.key;
ssl_client_certificate /var/www/abc/ssl/mydomain.chain.crt;
ssl_verify_client off;
location ~ / {
proxy_pass https://upstream_1;
}
}
</code></pre>
</ul>
<span><br /></span>
<span>server 設定</span><br />
<br />
<ul>
<li><span>down 暫時不參與負載</span></li>
<li><span>weight 數字越大,負載的權重就越大。</span></li>
<li><span>max_fails 允許失敗的預設次數,超過時,回傳 proxy_next_upstream 模組定義錯誤</span></li>
<li><span>fail_timeout 失敗N次失敗後,暫停的時間。</span></li>
<li><span>backup 備援機,在其他 server 忙碌或 down 才會動用</span></li>
</ul>
</div>
<div>
<br /></div>
<div>
<b>切割網址</b>
<br />
<pre><code>server {
listen 80;
server_name www.domain.com;
#ex. /profile/alice
location ~* /profile/[a-m] {
proxy_pass http://server0.domain.com;
}
#ex. /profile/nick
location ~* /profile/[n-z] {
proxy_pass http://server1.domain.com;
}
#ex. /profile/3002
location ~* /profile/[0-9]*[02468]$ {
proxy_read_timeout 10s;
proxy_pass http://server0.domain.com;
}
}</code></pre>
<br />
<b>動靜態分流</b><br />
<pre><code>location / {
# css, js 靜態文件設置有效期12小時天
location ~ .*\.(js|css)$ {
access_log off; #不記入 log
expires 12h;
}
#圖片設置有效期3天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
access_log off;
expires 3d;
}
}
location ~ \.php$ {
...
proxy_pass xxx;
}
location @proxy {
...
}</code></pre>
<b>Long Polling</b><br />
<pre><code>server {
listen 80;
server_name www.my-domain.com;
location ~* /profile/[a-m] {
rewrite ^(.*) http://server0.domain.com$1 permanent;
}
location ~* /profile/[n-z] {
rewrite ^(.*) http://server1.domain.com$1 permanent;
}
}</code></pre>
<br /></div>
</div>
<span>參考文獻:</span><br />
<span><a href="https://my.oschina.net/foreverich/blog/1517128">https://my.oschina.net/foreverich/blog/1517128</a></span><br />
<a href="http://blog.yslin.tw/2012/02/nginx.html"><span>http://blog.yslin.tw/2012/02/nginx.html</span></a><br />
<div>
<div>
<span><a href="http://blog.yslin.tw/2012/08/nginx-load-balance.html">http://blog.yslin.tw/2012/08/nginx-load-balance.html</a></span><br />
<div>
<span><a href="http://tech.ddvip.com/2009-07/1246936747125436.html">http://tech.ddvip.com/2009-07/1246936747125436.html</a></span><br />
<a href="http://www.ha97.com/5194.html"><span>http://www.ha97.com/5194.html</span></a><br />
<span><a href="https://www.huaweicloud.com/articles/12528794.html" target="_blank">https://www.huaweicloud.com/articles/12528794.html</a> (關於後面有無 / )</span></div><div><span><br /><br /></span>
<span>官方文獻:</span><br />
<span><a href="http://nginx.org/en/docs/http/load_balancing.html">http://nginx.org/en/docs/http/load_balancing.html</a></span></div><div><br /></div><div><br /></div>
</div>
</div>
</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-47285757013962093082018-10-20T01:37:00.001+08:002018-12-29T18:19:37.754+08:00Mac Chrome 69 性能低落<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM1VxfroXz75NOqA6G3PlfxY-SbFtCbLRbn_v3IYZfpgPYVdkJBxpBHG5ToKB5XKzjX1_jp3vvJ6mfZGSF586SJs61NBI6BiMgs3iHgHQpTW6Jk88J390heJ_vp6mD3dnuzmxaOeqY-UF3/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-10-20+%25E4%25B8%258A%25E5%258D%25881.38.37.png" imageanchor="1"><img border="0" data-original-height="606" data-original-width="1094" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM1VxfroXz75NOqA6G3PlfxY-SbFtCbLRbn_v3IYZfpgPYVdkJBxpBHG5ToKB5XKzjX1_jp3vvJ6mfZGSF586SJs61NBI6BiMgs3iHgHQpTW6Jk88J390heJ_vp6mD3dnuzmxaOeqY-UF3/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-10-20+%25E4%25B8%258A%25E5%258D%25881.38.37.png" /></a><br />
<br />
自從更新 Chrome 新主題的 69 版,開始出現滾動時整片空白,顯示緩慢的狀況..<br />
<div>
<br /></div>
<div>
災情:</div>
<div>
<a href="https://productforums.google.com/forum/#!topic/chrome/CxAm4BnBtlY">https://productforums.google.com/forum/#!topic/chrome/CxAm4BnBtlY</a></div>
<div>
<ul>
<li>看 youtube 掉了 10~15% fps</li>
<li>youtube 720p 會卡頓 2~3秒</li>
<li>開 tab 像是 low fps 的幻燈片,打字還會卡頓</li>
<li>發現有記憶體 leak 問題</li>
</ul>
</div>
<div class="alert-message success">
請立即更新到 70 版!目前似乎有比較順暢<i class="fa fa-check-circle"></i><br />
<br />
<span style="font-size: x-large;">2018/12</span><br />
Chrome 70 在 Mojave 上仍出現頁面載入過慢的問題,<br />
停用「硬體加速」後,似乎獲得改善<br />
<br />
參考:<a href="https://www.webnots.com/fix-slow-page-loading-issue-in-google-chrome/" target="_blank">Fix Google Chrome Slow Page Loading Issue (2018/10/07)</a><br />
<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-43554514426836395602018-09-26T14:33:00.003+08:002018-10-04T14:51:45.395+08:00macOS mojave 上線啦<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm9HC3nAw50MUAAS8Na8Egx8O18Cf29Yhw8NO3kAqhlByWBfeASF2pjc2T8LylLe9sqEAdW2zfn_Hi0I6ibmIjTQYsLNlht86awzWmY-SqqyqAmtotaLp_Pzq7Yi-xNq02y_VBWVNWIydo/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-09-26+%25E4%25B8%258B%25E5%258D%25882.14.12+%25E6%258B%25B7%25E8%25B2%259D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm9HC3nAw50MUAAS8Na8Egx8O18Cf29Yhw8NO3kAqhlByWBfeASF2pjc2T8LylLe9sqEAdW2zfn_Hi0I6ibmIjTQYsLNlht86awzWmY-SqqyqAmtotaLp_Pzq7Yi-xNq02y_VBWVNWIydo/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-09-26+%25E4%25B8%258B%25E5%258D%25882.14.12+%25E6%258B%25B7%25E8%25B2%259D.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHXO1uPrFYsGCuM3QQRwbtW_9d6SqtPstI7DAYiStt-LYwJQ9tRfBFHHBNnZTAb8lM80s9Wz8SXxudwNDyP9E8Nl6ZwD675sVkAJeseCdZ8x4SQqnwrnOxeOpB6Bjua5kv8Se-jzYuRYI0/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-09-26+%25E4%25B8%258B%25E5%258D%25884.51.50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="822" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHXO1uPrFYsGCuM3QQRwbtW_9d6SqtPstI7DAYiStt-LYwJQ9tRfBFHHBNnZTAb8lM80s9Wz8SXxudwNDyP9E8Nl6ZwD675sVkAJeseCdZ8x4SQqnwrnOxeOpB6Bjua5kv8Se-jzYuRYI0/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-09-26+%25E4%25B8%258B%25E5%258D%25884.51.50.png" /></a></div>
<br />
下載:<a href="https://itunes.apple.com/tw/app/macos-mojave/id1398502828?mt=12" target="_blank">https://itunes.apple.com/tw/app/macos-mojave/id1398502828?mt=12</a><br />
新增功能:<br />
<ol>
<li>桌面截圖可「自動收納」</li>
<li>新增 Command+Shift+5 可錄影</li>
<li>Split view 分割畫面,分界線變粗好移動</li>
<li>軟體更新 從 apple store 改到 設定內</li>
<li>Finder內直接編輯圖片、輸出 pdf</li>
<li>Finder、文書編輯器,直接連結 iphone 拍照、掃描</li>
<li>iOS app 可快速移植到 macOS</li>
<li>有 app 直接支援 apple homekit (IOT)</li>
</ol>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-50860713025769559742018-05-26T16:53:00.000+08:002018-05-26T16:55:34.664+08:00Chrome 63 強制 .dev 轉 https<blockquote class="tr_bq">
最近在維護舊 project,發現無論怎麼條整,*.dev 都會跳到 https,才知道去年12月, Chrome 改版將至 dev 使用 HSTS 所導致,其他瀏覽器仍正常</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKlM68XfCbvWqPtfFFDeUUDZHs9B0PmjZlnNQlamAmXZ_eFAhoSkWwQJIdY6ghmlT8-P1Kux-UrJtH3skb4eEEkdxZDoYl_VR8omg0Y7-9oiBKPFamsvDV1bP4YAlU0MqbFdUMcedtSCZk/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-05-26+%25E4%25B8%258B%25E5%258D%25884.52.08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="294" data-original-width="510" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKlM68XfCbvWqPtfFFDeUUDZHs9B0PmjZlnNQlamAmXZ_eFAhoSkWwQJIdY6ghmlT8-P1Kux-UrJtH3skb4eEEkdxZDoYl_VR8omg0Y7-9oiBKPFamsvDV1bP4YAlU0MqbFdUMcedtSCZk/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-05-26+%25E4%25B8%258B%25E5%258D%25884.52.08.png" width="320" /></a></div>
<br />
<br />
<h3>保留的域名(供測試/說明文件使用)</h3>
<ul>
<li>頂級</li>
<ul>
<li>.test</li>
<li>.example</li>
<li>.invalid</li>
<li>.localhost</li>
</ul>
<li>二級</li>
<ul>
<li>example.com</li>
<li>example.net</li>
<li>example.org</li>
</ul>
</ul>
<div>
<br />
<h3>建議</h3>
<ol>
<li>將 dev 改成 2級域名,dev.com 就能避免強制轉向</li>
<li>使用上方的保留域名</li>
<li>使用 xxx.localhost,無須到 /etc/hosts 定義,Chrome 會直接生效,Safari 不支援</li>
</ol>
<br />
<br />
<h3>參考資料</h3>
<ul>
<li><a href="https://iyware.com/dont-use-dev-for-development/">https://iyware.com/dont-use-dev-for-development/</a></li>
<li><a href="https://ma.ttias.be/chrome-force-dev-domains-https-via-preloaded-hsts/">https://ma.ttias.be/chrome-force-dev-domains-https-via-preloaded-hsts/</a></li>
</ul>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-54483433136082905992018-05-14T16:57:00.002+08:002018-05-14T16:57:26.349+08:00Symfony translation to javascript 翻譯檔動態生成 js, json<h3>
套件</h3>
<ul>
<li>github: <a href="https://github.com/willdurand/BazingaJsTranslationBundle" target="_blank">https://github.com/willdurand/BazingaJsTranslationBundle</a></li>
<li>composer: <span class="bg-gray">composer require willdurand/js-translation-bundle</span></li>
</ul>
<h3>
安裝</h3>
<ol>
<li>用上方 composer 安裝套件</li>
<li>到 app/AppKernel.php 註冊 bundle</li>
<li>在 app/config/routing.yml 註冊 routing</li>
<li>Publish assets,會將 vendor 內的 js link 到 asset 中</li>
</ol>
<div>
<br /></div>
<h4>
JS端使用方式</h4>
<ol>
<li>require translator.min.js</li>
<ol>
<li>若安裝流程正確,會在 web/bundles/ 底下看到</li>
<li>或者手動到 vendor/willdurand/js-translation-bundle/ 下,複製來使用</li>
</ol>
<pre><code class="html"><script src="{{ asset('web/bundles/bazingajstranslation/js/translator.min.js') }}"></script>
</code></pre>
<li>require 字典檔</li>
<pre><code class="html"><script src="{{ url('bazinga_jstranslation_js', { 'domain': 'messages', 'locales': 'zh_TW,en' }) }}"></script>
</code></pre>
<li>呼叫使用</li>
<pre><code class="javascript">console.log(Translator.trans('aaa.bbb'));
</code></pre>
<li>完整的範例</li>
<pre><code class="html">{% if app.request.locale == 'zh_TW' %}
{% set ln = 'zh-Hant' %}
{% elseif app.request.locale == "zh_CN" %}
{% set ln = 'zh-Hans' %}
{% else %}
{% set ln = 'en' %}
{% endif %}
<html lang="{{ ln }}">
<head>
<script src="{{ asset('web/bundles/bazingajstranslation/js/translator.min.js') }}"></script>
<script src="{{ url('bazinga_jstranslation_js', { 'domain': 'messages', 'locales': app.request.locale~',en' }) }}"></script>
<script>
Translator.locale = '{{ app.request.locale }}';
console.log(Translator.trans('aaa.bbb'));
<script>
</head>
</code></pre>
</ol>
<div>
<br /></div>
<div>
PHP端使用方式</div>
<div>
<ol>
<li>在 bundle folder 底下的 Resources/translations 新增 messages.en.yml</li>
<pre><code class="yaml">aaa:
bbb:哈囉
</code></pre>
<li>config.yml</li>
<pre><code class="twig">parameters:
locale: en
app.locales: en|zh_TW|zh_CN
locale_supported: ['en','zh_TW','zh_CN']
api_url: 'http://ems2.xmight.com/test/api/v1'
framework:
translator: { fallbacks: ['%locale%'] }
</code></pre>
<li>routing.yml</li>
<pre><code class="yaml">
change_lang:
path: /locale/{_locale}
defaults: { _controller: AppBundle:Default:changeLocale }
requirements:
_locale: '%app.locales%'
</code></pre>
<li>新增 EventListener/LocaleListener.php 到你的 bundle folder</li>
<pre><code class="php">defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
//get From session
$sessLang = $request->getSession()->get('_locale');
if(empty($sessLang)){
//get From cookie
$plang = $request->cookies->get('_locale');
//get From db
//exists set to session
//none use Per
if(empty($plang)){
$plang = $request->getPreferredLanguage();
if( ! in_array($plang, ['en','zh_TW','zh_CN'])){
$plang = 'en';
}
}
$request->getSession()->set('_locale', $plang);
}
// try to see if the locale has been set as a _locale routing parameter
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
public static function getSubscribedEvents()
{
return array(
// must be registered after the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 15)),
);
}
}
</code></pre>
<pre><code class="php"> //Controller
public function changeLocaleAction(Request $request, $_locale)
{
$request->attributes->set('_locale', null);
$request->getSession()->set('_locale', $_locale);
$response = new JsonResponse(['success' => true], Response::HTTP_OK);
$response->headers->setCookie(new Cookie('_locale', $_locale));
return $response;
}
</code></pre>
</ol>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhB9oOIr0u3qpYkPo-BJ4ReQ3GZHFQi77mlGjRkLxVGXNvGaCkrdgrFwFVnWXxnEAhcnwHotUCtxQnvCle116j6arO1UiXjLWPIzm0a9NFAHTdhixDX8lxlvQnduUpVtFguDbVrWS8P8ya/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-05-14+%25E4%25B8%258B%25E5%258D%25884.56.39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="722" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhB9oOIr0u3qpYkPo-BJ4ReQ3GZHFQi77mlGjRkLxVGXNvGaCkrdgrFwFVnWXxnEAhcnwHotUCtxQnvCle116j6arO1UiXjLWPIzm0a9NFAHTdhixDX8lxlvQnduUpVtFguDbVrWS8P8ya/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-05-14+%25E4%25B8%258B%25E5%258D%25884.56.39.png" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-41002445971552635272018-04-06T18:21:00.000+08:002018-04-06T18:22:06.985+08:00Mac 使用 2 台 Time Machine 備份 (Nas and HDD)<blockquote class="tr_bq">
有鑒於最近重灌 Hackintash時,手殘砍到第二顆硬碟(Time machine),就萌生了雙備份的想法</blockquote>
<br />
我的 Time Machine 配置<br />
<ul>
<li>本機加掛 750G硬碟 -- 高頻率備份</li>
<li>Nas 開 Time Machine -- 久久更新一版</li>
</ul>
<div>
所以須確認幾件事</div>
<div>
<ol>
<li>TM 可否 1 vs N 台備份? <span style="color: blue;">可</span></li>
<li>很久沒更新的 TM,是否會被洗掉,或只新增異動部分?<span style="color: blue;"> 似乎是補上異動</span></li>
<li>如果兩台 TM 同時運作,會有什麼狀況?<span style="color: blue;">兩台「輪流」備份,不會同時備份兩台(最後備份時間不會相同)</span></li>
</ol>
</div>
<br />
<br />
<h3>
Step-by-Step</h3>
<br />
1.目前已啟用第一台<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVEt5m1ezFpW3Gtw7AZDYc3sKE8ESpEjhXLrheWcr-rygWUgdAf_ULvMxJCJHZ8QEaMBG92gHN3W4jsJ2I1fiSGS_qQb61YtoG2csc8h7HhVWkTtktPc7S9Frr6MS_OvAHFx02UUpMDDep/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25885.42.28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="896" data-original-width="1346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVEt5m1ezFpW3Gtw7AZDYc3sKE8ESpEjhXLrheWcr-rygWUgdAf_ULvMxJCJHZ8QEaMBG92gHN3W4jsJ2I1fiSGS_qQb61YtoG2csc8h7HhVWkTtktPc7S9Frr6MS_OvAHFx02UUpMDDep/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25885.42.28.png" /></a></div>
<br />
2.選擇磁碟,增加第二台 Time Machine<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-qCDGaejShSA/WsdC8S3G3cI/AAAAAAAADmM/v_5o_CCzKCsEtlUTnRSFc65Pv8CWc5LtwCLcBGAs/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-04-06%2B%25E4%25B8%258B%25E5%258D%25885.42.39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="638" data-original-width="854" src="https://2.bp.blogspot.com/-qCDGaejShSA/WsdC8S3G3cI/AAAAAAAADmM/v_5o_CCzKCsEtlUTnRSFc65Pv8CWc5LtwCLcBGAs/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-04-06%2B%25E4%25B8%258B%25E5%258D%25885.42.39.png" /></a></div>
<br />
3.選擇並存<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-rzU2laIqkf8/WsdC6oX0xXI/AAAAAAAADmI/UuKMBWio0AwPAATO7ltLg7ehY4kAwB2DACEwYBhgL/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-04-06%2B%25E4%25B8%258B%25E5%258D%25885.42.48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="292" data-original-width="1068" src="https://3.bp.blogspot.com/-rzU2laIqkf8/WsdC6oX0xXI/AAAAAAAADmI/UuKMBWio0AwPAATO7ltLg7ehY4kAwB2DACEwYBhgL/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-04-06%2B%25E4%25B8%258B%25E5%258D%25885.42.48.png" /></a></div>
<br />
4.不管是第一次 or 已經存在備份,都會出現「等待完成第一次備份」,別理他。<br />
(*.如果要馬上備份,請勾選「在選單列中顯示」,並在右上角選擇「立即備份」)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6DRnrQ102Bxe71SyAhClJUkdKNecLWbACteUrXu2f3_iqQsZs7LQ7TH3YpuCZyS9zWRUSb4HxmK2X4HI05mKw-n2d4NVa_UD5bs-HDULXILILpio7ZXKmH3YW5AxaLwn6939xd5xbPOvw/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25885.43.54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="896" data-original-width="1350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6DRnrQ102Bxe71SyAhClJUkdKNecLWbACteUrXu2f3_iqQsZs7LQ7TH3YpuCZyS9zWRUSb4HxmK2X4HI05mKw-n2d4NVa_UD5bs-HDULXILILpio7ZXKmH3YW5AxaLwn6939xd5xbPOvw/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25885.43.54.png" /></a></div>
<br />
5.備份中,只會備份差異的部分<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjKaMTHHAsJJ3N-rRj-DeaKiRno94KjHEXa_UMoFkY6jdvo0weDwGt0FS3zlQeDTBmOLbSM4wZ7pKldoSx5phFGwntCK0XWrLxLmGZbYXL8QYor1g-ijtI4TERa4NDWsSQBgjtFjFglj8E/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25885.47.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="904" data-original-width="1354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjKaMTHHAsJJ3N-rRj-DeaKiRno94KjHEXa_UMoFkY6jdvo0weDwGt0FS3zlQeDTBmOLbSM4wZ7pKldoSx5phFGwntCK0XWrLxLmGZbYXL8QYor1g-ijtI4TERa4NDWsSQBgjtFjFglj8E/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25885.47.04.png" /></a></div>
<br />
6.完成後,會標示目前,兩台機器,備份的起訖日<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkbVWhQi2ZfGTQL-rCecKELevF2X-F7u5v0LRheI2PHbd0p2gmaQVSA9IIPVC1aWql499vOGLqaJ_2qq6Ph4r_wwp-MPCi7csE6M_BxgzFDguGsZZglKX29wkbRMcCIIxg4LKEPgcrmYMP/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25886.09.52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkbVWhQi2ZfGTQL-rCecKELevF2X-F7u5v0LRheI2PHbd0p2gmaQVSA9IIPVC1aWql499vOGLqaJ_2qq6Ph4r_wwp-MPCi7csE6M_BxgzFDguGsZZglKX29wkbRMcCIIxg4LKEPgcrmYMP/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25886.09.52.png" /></a></div>
<br />
7.查看第二台 Time Machine 的 bands 資料夾,可以看到增量備份的部分<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dRIC6z4jmaFEVIaVv4dt4jISDGTg0PgjqtkyVssSAsIdabfRWKsYLHHa7AjUgu6tuC2P2_Cfel8YNaLyqww3OtEdcyVcZYEB-NBsiRk5uSIS3On9ULeM_4bphlMkr9pnjt_P6oOKljYw/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25886.17.05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="935" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dRIC6z4jmaFEVIaVv4dt4jISDGTg0PgjqtkyVssSAsIdabfRWKsYLHHa7AjUgu6tuC2P2_Cfel8YNaLyqww3OtEdcyVcZYEB-NBsiRk5uSIS3On9ULeM_4bphlMkr9pnjt_P6oOKljYw/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25886.17.05.png" /></a></div>
<br />
8.完成後,可以選擇「加入或移除備份磁碟」,來將第二台離線<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg84JDeF-j6Y3D8rD2Djri8077EYB5fSFQ1_LIS5XKq9BbBAIfFBhzX-PY_4dbxPKOrNHNpTjFUfFnCRR3RpndhRlJI12T0qNszfAL4ffrMVy-QRUce8NseFtCXKtbXje5ShPjzOHOxu9Mk/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25886.10.11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="638" data-original-width="848" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg84JDeF-j6Y3D8rD2Djri8077EYB5fSFQ1_LIS5XKq9BbBAIfFBhzX-PY_4dbxPKOrNHNpTjFUfFnCRR3RpndhRlJI12T0qNszfAL4ffrMVy-QRUce8NseFtCXKtbXje5ShPjzOHOxu9Mk/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-06+%25E4%25B8%258B%25E5%258D%25886.10.11.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
9.Done!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-72815831850364722042018-04-05T23:33:00.002+08:002018-04-06T17:13:32.050+08:00阻擋 網頁挖礦機 No Coin No Miner<blockquote class="tr_bq">
最近看路邊的美劇時,可憐的筆電熱到可以煎蛋,感覺應該是搭上「免費礦機」的熱潮了...查了一下資料,果不其然</blockquote>
<br />
<h4>
如何知道「被挖礦」</h4>
<ul>
<li>使用 Chrome 工作管理員<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKjUJDkkbiNfXmOIZBjJJzHJxqy7_STpq3Z07eIe7_nQI35vGb-irODxP7WPI7WMPZnXpUF1sJjVsx4gxMSMU_FxnEI2gqNsUJyJxC1Xk-NOA4yVNsvo1MBdlcc_VnkUwHezMqx0wPcSej/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-05+%25E4%25B8%258B%25E5%258D%258810.40.44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="892" data-original-width="1026" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKjUJDkkbiNfXmOIZBjJJzHJxqy7_STpq3Z07eIe7_nQI35vGb-irODxP7WPI7WMPZnXpUF1sJjVsx4gxMSMU_FxnEI2gqNsUJyJxC1Xk-NOA4yVNsvo1MBdlcc_VnkUwHezMqx0wPcSej/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-05+%25E4%25B8%258B%25E5%258D%258810.40.44.png" /></a></li>
<li>系統的資源監控工具</li>
</ul>
<br />
<h4>
Chrome 擋挖礦的工具</h4>
<ul>
<li>No Coin</li>
<li>Block Coin Miner</li>
<ul>
<li>可自定義 阻擋清單、白名單</li>
</ul>
<li>Anti Miner</li>
<ul>
<li>可自定義 阻擋清單、白名單</li>
</ul>
</ul>
<br />
<h4>
盜版網站測試</h4>
<ul>
<li>17線上看 <a href="https://www.17wtv.com/">https://www.17wtv.com/</a></li>
<ul>
<li>礦機:網站本身</li>
<li>工具:O O O</li>
</ul>
<li>美劇線上看 MovieSun <a href="http://moviesunus01.com/">http://moviesunus01.com</a></li>
<ul>
<li>礦機:網站本身</li>
<li>工具:O X O</li>
</ul>
<li>美劇線上看 <a href="http://twmeiju.com/list/">http://twmeiju.com/list/</a></li>
<ul>
<li>礦機:網站沒有,某片源有</li>
<li>工具:X X X</li>
</ul>
<li>DRAMA time <a href="https://mydramatime.com/">https://mydramatime.com</a></li>
<ul>
<li>礦機:網站沒有,某片源有</li>
<li>工具:X X X</li>
</ul>
</ul>
<br />
<h4>
片源測試</h4>
<div>
<ul>
<li>thevideo.me (CPU:<span style="color: red;">388</span>) <img border="0" data-original-height="15" data-original-width="225" height="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhxH8qu0hf8QtCMsbO-WaR5D8Ri-AM8uD-Iy4TYtqkn3wQFOIP7KHBOwb8INU1PgH9TwzNbh3fuIj2est45M28Amb7UGQyKMQwCRTq-AMp1qs644fls4A-OzqhqYnwOIk4UHLYCS8sExma/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-04-05+%25E4%25B8%258B%25E5%258D%258811.22.45.png" />
</li>
<li>Vidoza (CPU:<span style="color: red;">180</span>)<img border="0" data-original-height="15" data-original-width="15" height="15" src="https://2.bp.blogspot.com/-a8-V48QdxQI/WsY5362lZWI/AAAAAAAADlk/h2l3kcnuxu4CukMg3iUTBBRV4pOR3ARfQCLcBGAs/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-04-05%2B%25E4%25B8%258B%25E5%258D%258810.59.14.png" width="15" />
</li>
<li>openload</li>
<li>Vidlox</li>
</ul>
</div>
<br />
<h4>
建議</h4>
<ol>
<li>Chrome 安裝 No Coin</li>
<li>避開某些片源</li>
<li>如果發覺機器過熱、風扇狂轉,快去查 CPU使用率,避開該網站</li>
</ol>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-30117391616468541772018-03-31T22:21:00.001+08:002018-04-04T15:00:02.281+08:00[Bug] UniBeast 8.2 安裝 High Seirra 10.13.4 找不到 external disk<blockquote class="tr_bq">
話說 10.13.3 安裝完後,十分不穩定,短短 2個月又炸裂了...</blockquote>
<br />
剛好 3/29 遇到 10.13.4 版 release,順便使用 UniBeast 8.2,製作玩的安裝碟卻找不到 external disk<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicg9JeNVkTsakV8udtxwoAJuioaOaqXeSNlmXmmdvSUewzheq_ETgTKU2BW8u9g_drh56H7LQmfEIlTHAS5v_JzGH_cv0gsXX8Nc_3J1pZ3Qz9Fg8DEHWJIsBoqwbPpPcwPhbhNmhZ1ede/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-31+%25E4%25B8%258B%25E5%258D%258810.15.29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="660" data-original-width="1044" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicg9JeNVkTsakV8udtxwoAJuioaOaqXeSNlmXmmdvSUewzheq_ETgTKU2BW8u9g_drh56H7LQmfEIlTHAS5v_JzGH_cv0gsXX8Nc_3J1pZ3Qz9Fg8DEHWJIsBoqwbPpPcwPhbhNmhZ1ede/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-31+%25E4%25B8%258B%25E5%258D%258810.15.29.png" width="320" /></a></div>
<br />
<br />
目前有兩種解法,「複製 boot.efi」或「砍掉 USB中的.IAPhysicalMedia」<br />
<br />
<ol>
<li>用 UniBeast 建立安裝碟</li>
<li>完成後,到 Launchpad->其他->終端機</li>
<li>方法ㄧ</li>
<pre><code class="bash line">$ mkdir /Volumes/Install\ macOS\ High\ Sierra/.IABootFiles/
$ cp /Volumes/Install\ macOS\ High\ Sierra/System/Library/CoreServices/boot.efi /Volumes/Install\ macOS\ High\ Sierra/.IABootFiles/</code></pre>
<li>方法二</li>
<pre><code class="bash line">$ rm -f /Volumes/Install\ macOS\ High\ Sierra/.IAPhysicalMedia</code></pre>
</ol>
<br />
<br />
<br />
<br />
參考文件<br />
<a href="https://www.tonymacx86.com/threads/unibeast-8-2-bug-with-10-13-4-installer-not-shown-in-clover-missing-iabootfiles.248994/">https://www.tonymacx86.com/threads/unibeast-8-2-bug-with-10-13-4-installer-not-shown-in-clover-missing-iabootfiles.248994/</a>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-7542857293093672617.post-66202683259612147762018-03-27T16:28:00.001+08:002018-03-27T16:30:10.909+08:00Excel utf8 CSV 亂碼<h3>
方法一</h3>
用文字編輯器,轉存 utf8 with BOM header,再開啟<br />
<br />
<h3>
方法二</h3>
在 CSV 前塞入 BOM 字串<br />
<br />
以 php 為例<br />
<pre><code class="php">$content = 'aaa,bbb,ccc';
file_put_contents('my.csv', "\xEF\xBB\xBF".$content);
</code></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL3fU4adxzw5biw45Q8k5Lvv4X5UvkeGQYDqR2y16RGlrCYQfax1Y9sMjtAeX1hojqO2MZiLGa0NJ9NNhq53SKUbS5NeY-83Z7a6ejbp-pz0sg81wqKYJXK0tfabzhHA7b8xjw7lBu4Muc/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-27+%25E4%25B8%258B%25E5%258D%25884.29.19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="253" data-original-width="370" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL3fU4adxzw5biw45Q8k5Lvv4X5UvkeGQYDqR2y16RGlrCYQfax1Y9sMjtAeX1hojqO2MZiLGa0NJ9NNhq53SKUbS5NeY-83Z7a6ejbp-pz0sg81wqKYJXK0tfabzhHA7b8xjw7lBu4Muc/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-27+%25E4%25B8%258B%25E5%258D%25884.29.19.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-36506533032099121562018-03-07T23:19:00.001+08:002018-03-08T11:05:44.549+08:00氣象局 OpenData 抓取「目前天氣」、「天氣預報」<h3>
資料介接方式</h3>
目前3種方式
<br />
<ol>
<li>直接從這邊下載(免驗證) <a href="https://opendata.cwb.gov.tw/f_index">https://opendata.cwb.gov.tw/f_index</a></li>
<li>單檔 xml 下載</li>
<pre><code class="bash line">http://opendata.cwb.gov.tw/opendataapi?dataid={dataid}&authorizationkey={apikey}</code></pre>
<li>REST API (json or xml)</li>
<pre><code class="bash line">https://opendata.cwb.gov.tw/api/v1/rest/datastore/{dataid}</code></pre>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxuFNYPMa-O7CUI0rWbXFMV-UTi5rF8r4g9xCHOKKJVU2CmuH_jZjtbyNyKu8W9CajcNV13FRuzNuSVmmuni0xkGTzx26FGd_geQue-TsEZtJh0UQJBe-wuUAd6P69gnFuetnagjNiok_f/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-07+%25E4%25B8%258B%25E5%258D%258811.18.49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="292" data-original-width="662" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxuFNYPMa-O7CUI0rWbXFMV-UTi5rF8r4g9xCHOKKJVU2CmuH_jZjtbyNyKu8W9CajcNV13FRuzNuSVmmuni0xkGTzx26FGd_geQue-TsEZtJh0UQJBe-wuUAd6P69gnFuetnagjNiok_f/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-07+%25E4%25B8%258B%25E5%258D%258811.18.49.png" width="320" /></a></div>
<br />
<h3>
大致流程</h3>
<ol>
<li>到氣象局首頁註冊一般會員 <a href="https://pweb.cwb.gov.tw/CWBMEMBER2/">https://pweb.cwb.gov.tw/CWBMEMBER2/</a></li>
<ol>
<li>不要用 facebook 登入,目前 OpenData 平台不支援</li>
</ol>
<li>到 OpenData 登入帳號 <a href="https://opendata.cwb.gov.tw/index">https://opendata.cwb.gov.tw/index</a></li>
<ol>
<li>兩邊共用同樣會員資料,但是分開登入</li>
</ol>
<li>取得 Token <a href="https://opendata.cwb.gov.tw/usages">https://opendata.cwb.gov.tw/usages</a></li>
<a href="https://1.bp.blogspot.com/-fnCWWe9vZHI/Wp_4xJDwr6I/AAAAAAAADhs/BVeddmeBreUZCRiTeAedJNFPD9zp5VD7ACLcBGAs/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-03-07%2B%25E4%25B8%258B%25E5%258D%258810.35.31.png" imageanchor="1"><img border="0" data-original-height="138" data-original-width="432" height="102" src="https://1.bp.blogspot.com/-fnCWWe9vZHI/Wp_4xJDwr6I/AAAAAAAADhs/BVeddmeBreUZCRiTeAedJNFPD9zp5VD7ACLcBGAs/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-03-07%2B%25E4%25B8%258B%25E5%258D%258810.35.31.png" width="320" /></a>
</ol>
<h3>
相關文件</h3>
<ul>
<li>氣象站清單 <a href="https://e-service.cwb.gov.tw/wdps/obs/state.htm">https://e-service.cwb.gov.tw/wdps/obs/state.htm</a></li>
<li>開放平臺 – 資料擷取使用說明 <a href="http://opendata.cwb.gov.tw/opendatadoc/CWB_Opendata_API_V1.2.pdf">http://opendata.cwb.gov.tw/opendatadoc/CWB_Opendata_API_V1.2.pdf</a></li>
</ul>
<br />
<h3>
REST API</h3>
<h4>
天氣預報</h4>
<ol>
<li>預報會包含最近幾期的預測,有可能比現在時間舊。</li>
<li>有分未來 2天 or 1週</li>
<li>F-D0047-089 (縣市等級) 2天預報,可直接填入「台北市」</li>
<li>F-D0047-093 (鄉鎮市區等級) 2天預報,需填入縣市API代號「F-D0047-XXX」、市區名稱「信義區」</li>
<li>F-D0047-001~F-D0047-087 (單一縣市) 2天/一週預報</li>
<li>O-A0001~O-A0003 基本天氣觀測資料</li>
</ol>
<h4>
氣象觀測</h4><ol>
<li>C-B0024-002 一年內,每日觀測資料</li>
<li>C-B0026-001 每月氣象-局屬地面測站資料</li>
<li>C-B0026-002 過去9年每月氣象</li>
</ol>
<h4>
<span style="font-weight: normal;"><br /></span>取得 各鄉鎮市區預報資料 範例</h4>
<div>
使用 GET method,</div>
<div>
Header 帶 Authorization:Token</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDimcGB5EjGvNtZM4uFtwRUKn6wVJrCvtkLsZLLI_8k0pbeHSMDoezrf_NlCy_eZYqTHcTbMqU4QVRUIyEdDRF9xV_YYNeopLlIH6lhkPnR3VZ5zoPDtw0I_9JHl_HbM8RHsj-03THWQbc/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-07+%25E4%25B8%258B%25E5%258D%258810.51.27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="430" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDimcGB5EjGvNtZM4uFtwRUKn6wVJrCvtkLsZLLI_8k0pbeHSMDoezrf_NlCy_eZYqTHcTbMqU4QVRUIyEdDRF9xV_YYNeopLlIH6lhkPnR3VZ5zoPDtw0I_9JHl_HbM8RHsj-03THWQbc/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-07+%25E4%25B8%258B%25E5%258D%258810.51.27.png" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
用 & 帶參數 locationId 為「宜蘭縣」的API代號<br />
,locationName 為「礁溪鄉」,API 文件附錄 A 有詳細對照表<br />
日期有4種條件,而這隻 API 資料間隔為 3 個小時 (0,3,6,9,12,15,18,21)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4blILbarpSGlSlpCJugdcGyekj1GawXPhT3WhyE2SdYoPScN3m398M4vQ_7jmvwOPO2y5HX1ZZouo4f1yzQRzQLktwtEQuZPKnJ6Q9lnXoP4BDGHrQtFSSV1pi5RKvFmVe0HBdHdeOjaZ/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-07+%25E4%25B8%258B%25E5%258D%258811.14.24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="291" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4blILbarpSGlSlpCJugdcGyekj1GawXPhT3WhyE2SdYoPScN3m398M4vQ_7jmvwOPO2y5HX1ZZouo4f1yzQRzQLktwtEQuZPKnJ6Q9lnXoP4BDGHrQtFSSV1pi5RKvFmVe0HBdHdeOjaZ/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-03-07+%25E4%25B8%258B%25E5%258D%258811.14.24.png" /></a></div>
<br />
<br />
得到以下資料<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Mdf-fjUM32w/WqAB8hmEiZI/AAAAAAAADiQ/RlpKxy4KpcYKih5AOdEo341aT97tE13CwCEwYBhgL/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-03-07%2B%25E4%25B8%258B%25E5%258D%258811.14.32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="964" data-original-width="1150" src="https://4.bp.blogspot.com/-Mdf-fjUM32w/WqAB8hmEiZI/AAAAAAAADiQ/RlpKxy4KpcYKih5AOdEo341aT97tE13CwCEwYBhgL/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-03-07%2B%25E4%25B8%258B%25E5%258D%258811.14.32.png" /></a></div>
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-7542857293093672617.post-79043847306409110222018-01-28T03:03:00.001+08:002018-09-26T14:42:01.397+08:00黑蘋果 Seirra 炸裂,重灌直升 High Seirra 10.13.3 教學<blockquote>
聽說黑蘋果很容易在某個「小更新」就搞掛系統,果然不到半年就遇到了...<br />
只好忍痛直上 High Seirra 啦!順便重寫安裝流程</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVoBBmpHADysJ_gzH0gfUfnZwsiOxiAIhCQBWTsHaYUv1MLv7P6uP-J-3WLywK2_kcz50EGJXJxn65viwYpZu-gTyKyX8uwvAjLM_1O_NEtGjYXEoJg-zEh-PCzTgpZwqUaEBSmKtMIbdC/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-01-28+%25E4%25B8%258A%25E5%258D%25882.57.49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="522" data-original-width="1130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVoBBmpHADysJ_gzH0gfUfnZwsiOxiAIhCQBWTsHaYUv1MLv7P6uP-J-3WLywK2_kcz50EGJXJxn65viwYpZu-gTyKyX8uwvAjLM_1O_NEtGjYXEoJg-zEh-PCzTgpZwqUaEBSmKtMIbdC/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-01-28+%25E4%25B8%258A%25E5%258D%25882.57.49.png" /></a></div>
<br />
<div class="alert-message error">
2018/03/31 注意!製作安裝 10.13.x 版,可能會遇到此問題<a href="https://www.latech.tw/2018/03/bug-unibeast-802-high-seirra-10134.html">link</a><i class="fa fa-check-circle"></i></div>
<div class="alert-message alert">
2018/09/25 Mojave 上線啦!!<a href="https://www.latech.tw/2018/09/macos-mojave.html">link</a><i class="fa fa-check-circle"></i></div>
<h3>
必備</h3>
<ul>
<li>一台 PC (若未組,強烈推薦參考<a href="https://www.tonymacx86.com/buyersguide/january/2018/" target="_blank"> tonymac86 2018 購買指南</a>)</li>
<ul>
<li>本次使用 NVMe SSD (M.2),詳細規格參考(<a href="https://www.latech.tw/2017/09/hackintosh-sierra-10126.html" target="_blank">此篇</a>)</li>
</ul>
<li>一隻 16G USB3.0隨身碟</li>
<li>一台 mac PC/NB</li>
</ul>
<br />
<h3>
大概流程</h3>
<ol>
<li><a goto="dlfile" href="http:/">下載工具</a></li>
<li><a goto="disk_cls" href="http:/">清空隨身碟 (尤其之前有用來灌舊版黑蘋果的)</a></li>
<li><a goto="usb" href="http:/">切成英語系 + 製作安裝碟</a></li>
<li><a goto="bios" href="http:/">調整 BIOS</a></li>
<li><a goto="removedisk" href="http:/">拔除其他硬碟</a></li>
<li><a goto="install" href="http:/">格式化 + 安裝</a></li>
<li><a goto="multibeast" href="http:/">使用 MultiBeast、更改 plist</a></li>
<li><a goto="restore" href="http:/">資料還原</a></li>
</ol>
<br />
<h3 id="dlfile">
下載工具</h3>
清空隨身碟
<br />
<ol>
<li>在 macbook 上開啟 App Store,並進入 macOS high Sierra 下載完成安裝檔</li>
<ol>
<li>完成後,會在 LaunchPad 中看到</li>
</ol>
<li>到 <a href="https://www.tonymacx86.com/" target="_blank">https://www.tonymacx86.com/</a> 申請帳號</li>
<li>在 tonymac <a href="https://www.tonymacx86.com/resources/categories/tonymacx86-downloads.3/" target="_blank">下載區</a>,下載最新版 uniBeast、MultiBeasts</li>
<li>到 <a href="http://mackie100projects.altervista.org/download-clover-configurator/" target="_blank">Clover Configurator</a> 下載最新版</li>
</ol>
<br />
<h3 id="disk_cls">
清空隨身碟</h3>
<ol>
<li>插入隨身碟</li>
<li>LaunchPad -> 其他 -> 磁碟工具程式</li>
<li>請務必看好,我們是要清空「<span style="color: red;">外部</span>」(external) 磁碟!!</li>
<li>點選隨身碟最外層->清除-> Mac OS 擴充格式 (日誌式) -> 主開機紀錄 -> 清除</li>
<li>點選隨身碟最外層->清除-> Mac OS 擴充格式 (日誌式) -> GUID 分割區配置表 -> 清除</li>
</ol>
<div>
會 linux 指令的,可使用官方推薦的方式格式化磁碟</div>
<pre><code class="bash line">$ sudo diskutil partitionDisk 磁碟路徑 GPT JHFS+ 新的磁碟名稱 R
#磁碟路徑像是 /dev/disk2,可先用磁碟工具程式來檢視
</code></pre>
<div>
怕沒清乾淨,可使用 windows 磁碟管理工具 + diskpart clean,將分割全部割除</div>
<div>
<br /></div>
<div>
<br />
<h3 id="usb">
切成英語系 + 製作安裝碟</h3>
<ol>
<li>改系統語系 (系統偏好設定->語言與地區-> 「+」 -> English -> 選為預設語系->重開機)</li>
<li>插入 USB,開啟 uniBeast</li>
<ol>
<li>一直下一步</li>
<li>選擇系統</li>
<li>選擇 UEFI</li>
<li>選擇顯卡廠商</li>
<li>下一步到開始製作</li>
</ol>
<li>下載 <a href="http://hackintosher.com/wp-content/uploads/2018/01/High-Sierra-10.13.2-17C88-Desktop-EFI.zip">Hackintosher.com’s High Sierra EFI</a></li>
<li>解壓縮後,將 EFI 內的資料,覆蓋到隨身碟的 EFI 磁碟</li>
<ol>
<li>如果你不小心移除磁碟,重新插入後,不會看到 EFI 磁碟</li>
<li>請開啟 Clover Configurator,進入 Mount EFI</li>
<li>看到你的隨身碟,點選 Mount Partition</li>
<li>再點選 Open Partition 就可進入 EFI,或者 Finder 現在也可以看到</li>
</ol>
<li>到 Finder 找隨身碟的 Install xxx 磁碟,將 MultiBeasts、 Clover Configurator 放入</li>
<li>到 Finder 卸載磁碟,選擇「全部卸載」 </li>
</ol>
</div>
<br />
<h3 id="bios">
<span style="font-weight: normal;">調整 BIOS</span></h3>
<div>
<ul>
<li>Virtualization : Enabled</li>
<li>VT-d : Disabled</li>
<li>XHCI Hand-Off : Enabled</li>
<li>Legacy USB Support: Auto/Enabled</li>
<li>IO SerialPort : Disabled</li>
<li>Network Stack : Disabled</li>
<li>XMP Profile : Auto / Profile 1/Enabled</li>
<li>UEFI Booting set to Enabled and set Priority over Legacy</li>
<li>Secure Boot : Disabled</li>
<li>Fast Boot : Disabled</li>
<li>OS Type: Other OS</li>
<li>Wake on LAN : Disabled</li>
<li>SATA mode:AHCI</li>
<li>顯卡部分</li>
<ul>
<li>有獨立顯卡</li>
<ul>
<li>Integrated Graphics(內顯) : Disabled </li>
<li>Graphics: PEG/PCIe Slot 1</li>
<li>Initial Display Output : PCIe 1 Slot</li>
</ul>
<li>Intel 內顯</li>
<ul>
<li>Integrated Graphics : Enabled</li>
<li>Graphics: IGD/Integrated/iGPU/CPU Graphics</li>
<li>DVMT Pre-Allocated : 128M</li>
</ul>
</ul>
<li>最後,設定隨身碟開機,儲存後離開</li>
</ul>
<br />
<h3 id="removedisk">
拔除其他硬碟</h3>
之前將 TimeMachine 放在第二顆硬碟,但卻誤刪導致資料 GG,所以還是建議拔除一些重要的資料碟
<br />
<h3 id="install">
格式化 + 安裝</h3>
</div>
<div>
<ol>
<li>進入 Clover EFI,選擇 External 磁碟</li>
<li>順利的話,會進入 GUI 安裝畫面</li>
<ol>
<li>不順利的話,則需開啟 debug mode 看卡在哪</li>
</ol>
<li>選完語系後,選擇「磁碟工具程式」,將「內部」磁碟格式化成</li>
<ol>
<li>Mac OS 擴充格式 (日誌式)、GUID 分割區配置表</li>
<li>如果遇到「磁碟被卸載」,請使用 win10 分割工具,先將磁碟砍到剩下一顆「為分割」磁碟,再換 mac 安裝</li>
</ol>
<li>格式化完成,選擇安裝 macOS</li>
<li>幾分鐘內會成功複製到「內部磁碟」,然後自動重開?</li>
<li>選擇 internal 磁碟,進入磁碟安裝模式</li>
<ol>
<li>如果遇到 遺失特定安裝程式,請重新執行步驟 5</li>
</ol>
<li>完成後重開,選擇 boot from high sierra 進入</li>
<li>進入mac初始化設定</li>
<ol>
<li><span style="color: red;">*.注意:</span>如果等毀會要還原資料,命名不要跟舊帳號一樣</li>
</ol>
<li>如果進入系統後為英語系,到語系內調整成繁體中文即可</li>
<ol>
<li>Lanchpad -> System Preferences -> Language & Region -> 「+」-> 繁體中文</li>
<li>上一頁</li>
<li>重開機</li>
</ol>
</ol>
</div>
<br />
<h3 id="multibeast">
使用 MultiBeast、更改 plist</h3>
<div>
</div>
目前內部磁碟需安裝 Bootloader 才能正常開機,否則都需藉助隨身碟的 Clover EFI<br />
<div>
<ol>
<li>複製 MultiBeasts 到桌面,並開啟</li>
<li>Quick Start 選 UEFI</li>
<li>Build -> Install -> Agree</li>
<li>開啟 Clover Configurator -> Mount EFI</li>
<li>先將 disk0s1 主硬碟 -> Mount Partition -> Open Partition,將整個 EFI 複製到桌面當備份</li>
<li>回到 Clover Configurator,將另外一個磁碟(隨身碟本人) Mount 並且 Open</li>
<li>將整個隨身碟的 EFI 蓋掉這台電腦的 EFI</li>
<ol>
<li>*若本機的 EFI 有 APPLE 資料夾,建議刪除,他會導致黑畫面</li>
</ol>
<li>卸載隨身碟後,重開測試看看</li>
</ol>
<div>
接下來要檢視硬體是否全部都抓到</div>
<div>
<ol>
<li>LaunchPad -> 其他 -> 系統資訊,看看資訊</li>
<li>有缺驅動,再 google 補 kexts 或 從 MultiBeasts 安裝</li>
<li>設定快速跳過 CloverEFI,進入 Clover Configurator -> boot -> fast,然後關閉並儲存</li>
</ol>
</div>
<div>
<br />
<h3 id="restore">
資料還原</h3>
</div>
<div>
其實這次升級是因為 Sierra 版,手氣不好,按到一個導致無限重開的「小更新」。<br />
好在有準備 3 倍大的 Time machine,新系統安裝好後,可以直接從 TM 還原資料<br />
<br />
還原方式<br />
<ol>
<li>LaunchPad -> 其他 -> 系統移轉輔助程式</li>
<li>自動登出後</li>
<li>選擇第一個,從 Time machine</li>
<li>接著照步驟還原</li>
</ol>
<br />
<h3>
狀況</h3>
<ul>
<li>2018/01/27 安裝完後</li>
<ol>
<li>畫面大卡頓、重疊閃爍 (shiki?)</li>
<ol>
<li>開啟 Clover Configurator,拖拉或下拉時</li>
<li>遠端 VNC</li>
<li><a href="https://www.tonymacx86.com/threads/enable-intel-quicksync-with-i7-7700k-hd-630-and-high-sierra-sierra.237784/">https://www.tonymacx86.com/threads/enable-intel-quicksync-with-i7-7700k-hd-630-and-high-sierra-sierra.237784/</a></li>
<li>改成 Mac 14,2 似乎正常了 (<a href="http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1760224">link</a>)</li>
<li>Boot 勾選 npci=0x3000, dart=0, nvda_drv=1 也會正常 (<a href="http://www.insanelymac.com/forum/topic/306281-screen-refreshingflickering-everytime-on-os-x-yosemite/" target="_blank">link</a>)</li>
<li>使用 skiki.kext實際用法,<a href="https://github.com/vit9696/Shiki">https://github.com/vit9696/Shiki</a></li>
<li>方案</li>
</ol>
</ol>
<ul><ul>
<li>對於HD630的閃爍問題有一個近乎完美的解決方案:</li>
<ul>
<li>Lilu.kext </li>
<li>IntelGraphicsFixup.kext </li>
<li>SMBIOS iMac17.1 </li>
<li>Inject Intel = YES </li>
<li>g-platform-id = 0x19120000</li>
</ul>
</ul>
</ul>
<ol>
<li>登入時,輸入密碼很卡</li>
<li>雙網卡,抓不到第二張「killer」</li>
<li>20mb/s 的 2.5" TimeMachine 碟,真的太慢</li>
<li>iTunes Local 沒有歌曲,播放 NAS iTunes 時,使用快捷鍵「下一首」會導致 Crash</li>
<ol>
<li>local 需放置一首歌,且播放清單最好有多首</li>
<li>似乎在特定 app 才會 Crash,或一開始啟用時</li>
<li><a href="https://github.com/vit9696/Lilu/issues/20">https://github.com/vit9696/Lilu/issues/20</a></li>
</ol>
<li>BIOS 已啟用,但仍無法再關機時,使用鍵盤滑鼠喚醒</li>
<ol>
<li>Clover Configurator -> Acpi -> FixShutdown 取消</li>
<li>現在不用關掉觸控板開關,也可正常關機</li>
</ol>
</ol>
<li>2018/03/30 重新製作安裝碟,遇到 <span style="color: red;">Copy of apfs.efi failed - please advise</span></li>
<ul>
<li><span style="color: red;"><a href="https://www.tonymacx86.com/threads/solved-copy-of-apfs-efi-failed-please-advise.240716/">https://www.tonymacx86.com/threads/solved-copy-of-apfs-efi-failed-please-advise.240716/</a></span></li>
<li>用指令去 format GPT,再製作一次</li>
</ul>
<li>2018/03/30 10.13.4 安裝過程,debug 出現 <span style="color: red;">still waiting for root device</span></li>
<ul>
<li>換插其他 usb 槽 or 降到 usb2.0</li>
</ul>
<li>uniBeast 出現 <span style="color: red;">make sure neither os x install esd .... are mounted on your drive</span></li>
<ul>
<li>去磁碟管理,將 OS X install 卸載,再到 UniBeast 操作一遍</li>
</ul>
<li>2018/7/24 送修 AData m2 ssd</li>
<ul>
<li>在4月反覆重灌下,SSD速度衰弱剩下 R80W30</li>
<li>送修主機板,技嘉人員現場測試 傳統 SSD & HD 速度皆正常</li>
<li>最後送修 SSD,花費 12個工作天</li>
<li>送修結果</li>
<ol>
<li>原先 OS 安裝需 2小時,現在恢復到 8分鐘完成</li>
<li>效能回到 R1500W200,與原本 R1600W1100 還是有很大差距</li>
<li>隔天,效能回復到 R1600W1100,<span style="color: blue;">推測是 TimeMachine 時,寫入過多小檔導致</span></li>
</ol>
<ul>
</ul>
</ul>
</ul>
<br />
<h3>
config.plist</h3>
<ul>
<li>2018/01/27 原始 EFI (<a href="https://drive.google.com/open?id=1RdnK-NHc4qpDBZ_qmTDSm96bz_qLo12Z" target="_blank">下載</a>)</li>
<li>2018/01/28 Hackintosher版 EFI (<a href="https://drive.google.com/open?id=17jFzmDyy3Aa9HbjnotgcOP0VTUJNFA71" target="_blank">下載</a>)</li>
<li>2018/01/28 拿掉 FixShutdown(修正無法喚醒)、調整 boot arguments(修正閃爍) (<a href="https://drive.google.com/open?id=1Iu4K00lhl7_JQYhY_jvJdGQ5qLg9AF5F" target="_blank">下載</a>)</li>
</ul>
</div>
<div>
<br /></div>
<h3>
參考資料</h3>
<div>
<ul>
<li>完整攻略,針對非 7th CPU、各主機板通病的對應解法</li>
<ul>
<li><a href="https://hackintosher.com/guides/high-sierra-install-full-guide/" target="_blank">https://hackintosher.com/guides/high-sierra-install-full-guide/</a></li>
</ul>
<li>黑果 <a href="https://blog.daliansky.net/">https://blog.daliansky.net/</a></li>
</ul>
</div>
</div>Unknownnoreply@blogger.com15tag:blogger.com,1999:blog-7542857293093672617.post-67804113891631763132018-01-05T12:51:00.001+08:002018-03-21T17:28:54.111+08:00Mongodb Shell 速查<blockquote>
Mongodb 指令快速查詢,實用筆記</blockquote>
<a href="https://1.bp.blogspot.com/-fsDKv53KX9w/Wk8E0sufPtI/AAAAAAAADX0/u9fDkTTZ3mIslh6KsQoN2nONSj2OpConQCLcBGAs/s1600/EPrK3ci2.jpg" imageanchor="1"><img border="0" data-original-height="512" data-original-width="512" height="320" src="https://1.bp.blogspot.com/-fsDKv53KX9w/Wk8E0sufPtI/AAAAAAAADX0/u9fDkTTZ3mIslh6KsQoN2nONSj2OpConQCLcBGAs/s320/EPrK3ci2.jpg" width="320" /></a>
<br />
<h3>
CURD、index</h3>
Insert
<br />
<pre><code class="common">db.myCol.insertOne(JsonObj)
db.myCol.insertMany([ JsonObj1, JsonObj2,... ])
db.myCol.insert() //One or Many 都可用
</code></pre>
Update
<br />
<pre><code class="common">db.myCol.updateOne(filter, update, options)
db.myCol.updateMany(filter, update, options)
db.myCol.update()
//新增or更新欄位 (也可用 aggregate $addFields)
db.myCol.update(filter, {$set:{field:'value'}});
db.myCol.replaceOne(filter, replacement, options)
db.myCol.findOneAndUpdate()
db.myCol.findOneAndReplace()
db.myCol.findAndModify()</code>
</pre>
<span style="font-variant-ligatures: normal; orphans: 2; widows: 2;">write concern:寫入等級設定 (<a href="https://docs.mongodb.com/manual/reference/write-concern/" target="_blank">link</a>)</span><br />
<br />
<ul>
<li>w:-1 (嚴謹性:非常低);發生資料庫寫入錯誤一慮不回傳</li>
<li>w:0 (嚴謹性:低);只可以偵測到網路錯誤</li>
<li>w:1 (嚴謹性:中, default)</li>
<li>w:1,j:1 (嚴謹性:高);在寫入日誌後才回傳處理過程</li>
<li>w:2 (嚴謹性:高 );這個級別只在replica set的部署模式下生效</li>
<li>w為設定寫入等級 ; j為日誌設定</li>
</ul>
<br />
Delete
<br />
<pre><code class="common">db.collection.deleteOne()
db.collection.deleteMany()
db.collection.remove()
db.collection.findOneAndDelete()
</code></pre>
Index操作
<br />
<pre><code class="common">db.collection.createIndex()
db.collection.getIndexes()
db.collection.dropIndex()
db.collection.dropIndexes()
db.collection.ensureIndex()
</code></pre>
Cursor<br />
<pre><code class="common">db.col.find().forEach( function(d) { print(d.name );});
</code></pre>
<br />
<h3>
Sql vs Mongo 對應語法(<a href="https://docs.mongodb.com/manual/reference/sql-comparison/">link</a>)</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfk0VKEX0r-9FpEcu4Xd3d7GiH2GAMOazxf3HTZwggsW07Cf04OSwxsWlmGddo-yJjjpfYM3NoSPt50XidDbCrT5sHzHUMamVBZyH0FAradbXcasE9qvtClMxccJflFeH9dFPn7ONf_l1d/s1600/crud-annotated-mongodb-find.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="245" data-original-width="1600" height="97" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfk0VKEX0r-9FpEcu4Xd3d7GiH2GAMOazxf3HTZwggsW07Cf04OSwxsWlmGddo-yJjjpfYM3NoSPt50XidDbCrT5sHzHUMamVBZyH0FAradbXcasE9qvtClMxccJflFeH9dFPn7ONf_l1d/s640/crud-annotated-mongodb-find.png" width="640" /></a></div>
<br />
簡易的查詢使用 db.collection.find(query,指定欄位)
<br />
<ul>
<li>select a,b,c</li>
<pre><code class="common">db.myCol.find({},
{ column1:1, column2:1, _id:0 } //_id預設都會撈出,給予 0 部顯示
)
</code></pre>
<li>equal/not equal</li>
<pre><code class="common">db.myCol.find({col1: "abc" }) //equal
db.myCol.find({col1: {$ne: "abc"} }) //not equal
db.myCol.find({col1: {$in:["A","D"]} }) //where in
db.myCol.find({col1: {$nin:["B","C"]} }) //where not in
</code></pre>
<li>like</li>
只需改關鍵字寫法,就是 like,差異是不用加 ""<br />
注意:若要在陣列中與其他參數使用,須完整寫成 $regex: //
<pre><code class="common">db.myCol.find({col1: /bc/ }) //like %bc%
db.myCol.find({col1: /^bc/ }) //like bc%
db.myCol.find({col1: /bc$/ }) //like %bc (結尾為 bc 者)
db.myCol.find({col1: {$not: "abc"} }) //not like
db.myCol.find({col1: {$in:[ /bc/ , /def/ ]} }) //where in
db.myCol.find({col1: {$in:[ /def/ , "abc" ]} }) //where in equal+like, array
db.myCol.find({col1: {$nin:[ /ab/ , /cde/ ]} }) //where not in
</code></pre>
<li>and</li>
<pre><code class="common">db.myCol.find({col1: "A", col2: 20 }) //2 columns
db.myCol.find({col1: {$regex: /bc/, $not:""} }) //same column
db.myCol.find({$and: [ query表達式1 , query表達式2 ]}) //2 columns in collection
//not union
</code></pre>
<li>or</li>
依序遇到寶達式為 true 就停止,詳細行為請見(<a href="https://docs.mongodb.com/manual/reference/operator/aggregation/or/">link</a>)
<pre><code class="common">db.myCol.find({ $or: [
{ query表達式1 },
{ query表達式2 }, ...
})
db.myCol.find({
$and: [
{$or : [{'a':1},{'b':2}]},
{$or : [{'a':2},{'b':3}]}
]
}) //multi or or
</code></pre>
<li>not empty/exists</li>
<pre><code class="common">db.myCol.find({col1: {$exists:true} }) //exists
db.myCol.find({col1: {$not: ""} }) //not empty
db.myCol.find({pic1: {$exists:true, $not:{$size:0}} }) //file exist
db.myCol.find({arr1: {$size: 0} }) //empty array
</code></pre>
<li><>=</li>
<pre><code class="common">db.myCol.find({ age:{$gt:20} }) //greate then
db.myCol.find({ age:{$gt:20, $lt:50} }) //greate then + less then
db.myCol.find({ age:{$gte:20} }) //greate then + equal
db.myCol.find({ age:{$lte:50} }) //less then + equal
</code></pre>
<li>orderby / limit / skip</li>
<pre><code class="common">db.myCol.find().sort( { col1: 1, col2:-1 } ) //1=ASC, -1=DESC
db.myCol.find().skip(10).limit(5) // limit 10,5
</code></pre>
<li>count()</li>
<pre><code class="common">db.myCol.count() //count(*)
db.myCol.find({col1: "abc"}).count() //count(col1)
db.myCol.count({col1: "abc"}) //count(col1),寫法2
//先 groupby 再 count,請用下方 Aggregate
</code></pre>
<li>union()</li>
<li>Explain SQL</li>
<li>建 index</li>
<li>hint()</li>
<li>$rename 改欄位名稱</li>
<pre><code class="common">db.getCollection("myTable").update({}, {$rename:{"oldName":"newName"}}, false, true)
</code></pre>
<li>$unset 刪除欄位</li>
<pre><code class="common">db.getCollection('myTable').update({}, { $unset: { columnName: "" } }, { multi: true })
</code></pre>
<li>full rext search 全文檢索</li>
<ul>
<li>$search</li>
</ul>
</ul>
<br />
<h3>
Aggregate</h3>
強大的 query method
<br />
<ul>
<li>groupby count</li>
<pre><code class="json">db.myCol.aggregate([
{$group : {_id : "$欄位名稱", total : {$sum : 1}}}
])
</code></pre>
<li>date range</li>
<pre><code class="json">db.myCol.aggregate([
{ $match: { "日期欄位名稱": { $gte: ISODate("2017-05-04 10:53:43.059Z"), $lt: ISODate("2017-05-09 10:53:53.059Z") } } }
])
</code></pre>
<ul>
<li>若要與 $group 合併使用,須放在前面</li>
<li>PHP下,時間使用 <span style="color: blue;">new MongoDate(time()) </span>來轉換,MongoDate 吃 timestamp、並轉成 UTC</li>
</ul>
<li>Join by column + groupby count</li>
<li>子查詢、orderby limit + orderby</li>
</ul>
<h4>
基礎method</h4>
<ul>
<li><span class="bg-gray orange">$project</span> </li>
<pre><code class="common">db.myCol.aggregate([
{ $project: {
mycol1: 1, //顯示欄位
mycol2: 0, //不顯示欄位(似乎不能1一起用)
"nn": "123" //動態新增欄位
}}
]);
</code></pre>
<li><span class="bg-gray orange">$lookup</span> JOIN by column</li>
<pre><code class="common">db.myCol.aggregate([
{ $lookup: {
"from": 要join的table,
"localField": 自己的欄位,
"foreignField": 對方的欄位,
"as": JOIN結果陣列的名稱
}},
]);
</code></pre>
<li><span class="bg-gray orange">$addFields</span> 動態新增欄位</li>
<pre><code class="common">db.myCol.aggregate([
{ "$addFields": {
"nn": "123"
}}
]);
</code></pre>
<li><span class="bg-gray orange">$size 計算某Array內數量</span></li>
<pre><code class="common">"newCol": { $size: "$要計算的欄位" }
</code></pre>
<li><span class="bg-gray orange">$match</span> </li>
<li><span class="bg-gray orange">$filter</span> 用條件過濾子查詢(array)</li>
<li><span class="bg-gray orange">$group</span> </li>
<li><span class="bg-gray orange">$setUnion</span> 合併陣列</li>
<li><span class="bg-gray orange">$out 將結果輸出(新增)成新 collection</span></li>
<li><span class="bg-gray orange">$geoNear</span> </li>
<li><span class="bg-gray orange">$unwind</span> 陣列拆成 rows</li>
<li><span class="bg-gray orange">$sample</span> </li>
<li><span class="bg-gray orange">$sort</span> </li>
<li><span class="bg-gray orange">$skip 略過筆數(分頁用)</span></li>
<ul>
<li><span class="bg-gray orange">aggregate 不能用 modifier 寫法</span></li>
</ul>
<li><span class="bg-gray orange">$limit 取幾筆($skip要先使用)</span></li>
<li><span class="bg-gray orange">$redact</span> </li>
<li>字串處理(<a href="https://docs.mongodb.com/manual/reference/operator/aggregation-string/">完整文件</a>)</li>
<ul>
<li><span class="bg-gray orange">$concat 合併文字</span></li>
<pre><code class="common">mycol1 : { $concat: [ "$col2", " - ", "$col3" ] }
</code></pre>
<li><span class="bg-gray orange">$substr 剪裁文字</span></li>
</ul>
</ul>
<pre><code class="common">db.myCol.aggregate([
{ "$match": { "rating": "important" } },
{ "$sort": { "date": -1 } },
{ "$limit": 20 },
{ "$lookup": {
"from": "user",
"localField": "user_id",
"foreignField": "_id",
"as": "userinfo"
} },
{ "$unwind": "$userinfo" },
{ "$project": {
"text": 1,
"date": 1,
"userinfo.name": 1,
"userinfo.country": 1
} }
]);
</code></pre>
<h3>
Map-Reduce</h3>
在集合 orders 中查找 status:"A" 的資料,並根據 cust_id 來分組,並計算 amount 的總和。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2yp_lfFn0eTtTu8YaoY9fbRaop5WhHh9x8BnkvcXM7GZbNtS77-EbznxKIjruT9Rmr2QjDqkpuSvi6gCHEoko6JQc6jxDG2NJZomm-DBLextMqwkLlylFx9Zk25NjZpBN6uFM2hwqu7kH/s1600/mapreduce%25404x.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1361" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2yp_lfFn0eTtTu8YaoY9fbRaop5WhHh9x8BnkvcXM7GZbNtS77-EbznxKIjruT9Rmr2QjDqkpuSvi6gCHEoko6JQc6jxDG2NJZomm-DBLextMqwkLlylFx9Zk25NjZpBN6uFM2hwqu7kH/s1600/mapreduce%25404x.png" /></a></div>
<div>
<br />
<div>
<div>
<br /></div>
<h3>
GridFS</h3>
file list<br />
<br />
<pre><code class="bash">mongofiles -d 資料庫 list -u 帳號 -p 密碼 --authenticationDatabase admin
</code></pre>
<div>
get / delete / put file</div>
<pre><code class="bash">mongofiles -d 資料庫 list -u 帳號 -p 密碼 --authenticationDatabase admin 方法 檔名.副檔名
</code></pre>
<div>
search file</div>
<pre><code class="bash">mongofiles -d 資料庫 list -u 帳號 -p 密碼 --authenticationDatabase admin search 字串
</code></pre>
<div>
連續匯出</div>
<pre><code class="bash">#!/bin/bash
while read -r line; do
file=$(echo "$line" | awk -F'\t' '{ print $1 }')
[[ $file == 'connected to'* ]] && continue
mongofiles -d 資料庫 list -u 帳號 -p 密碼 --authenticationDatabase admin get "$file"
done < <(mongofiles list -d 資料庫 list -u 帳號 -p 密碼 --authenticationDatabase admin)
</code></pre>
<div>
<br /></div>
<br />
<h3>
Explain</h3>
<h3>
mongo shell - eval(<a href="https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell/#differences-between-interactive-and-scripted-mongo">link</a>)</h3>
有時候需要寫自動化 shell script,就會派上用場
<br />
<pre><code class="bash">#!/bin/bash
#刪除 db
mongo "localhost:27017/mydb" -u 帳號 -p 密碼 --authenticationDatabase admin --eval "printjson(db.dropDatabase())"
</code></pre>
<h3>
狀況</h3>
<ul>
<li>exceeds maximum document size code 4568</li>
<ul>
<li>超過 1個 document 16MB</li>
</ul>
</ul>
<div>
<h3>
備援</h3>
<ul>
<li>db1.collection 複製到 db2.collection</li>
<pre><code class="bash line">MONGO> use db1;
MONGO> db.myCol.find().forEach(function(d){ db.getSiblingDB('db2')['myCol'].insert(d); });</code></pre>
<li>匯出</li>
<li>匯入</li>
<li>跨 host 複製 collection</li>
<pre><code class="bash line">$ rm -f /tmp/copy_collection.json
$ mongoexport --ssl --host fromhost.com -d mydb -u myuser -p mypw --authenticationDatabase admin --collection $fromCollection --out /tmp/copy_collection.json
$ mongoimport --ssl --host tohost.com -d mydb -u myuser -p mypw --authenticationDatabase admin --collection $toCollection --file /tmp/copy_collection.json</code></pre>
</ul>
<h3>
產出</h3>
<ul>
<li>產出 json (pretty)</li>
<pre><code class="bash line">$ mongoexport --ssl --host abc.com -d mydb -u myuser -p mypw --authenticationDatabase admin --collection mycollection --out abc.json --jsonArray --pretty
#用col1遞增排序 --sort "{col1: 1}"
</code></pre>
</ul>
<h3>
權限</h3>
<ul>
Role 總覽 (<a href="https://docs.mongodb.com/manual/core/security-built-in-roles">link</a>)
<li>建立 SuperUser</li>
<pre><code class="bash">> use admin
> db.createUser( { user: "root", pwd: "root", roles: [ { role: "root", db: "admin" } ] } )
</code></pre>
daemon 啟用權限驗證
<pre class="height-1"><code class="bash height-1">$ sudo -s
$ service mongod stop
#或者 mongod --config /etc/mongod.conf --shutdown
$ rm /var/lib/mongodb/mongod.lock
$ nano /etc/mongod.conf
#加上
security:
authorization: enabled
$ service mongod start
#若沒正常啟動,請查詢 tail /var/log/mongodb/mongod.log
$ mongo
#權限若有生效, show dbs 會出現 "not authorized" 訊息
$ shutdown -r now 看看是否正常運作
</code></pre>
<li>建立 DB owner</li>
*.須先啟用 admin
<pre><code class="bash">> use mydb
> db.createUser( { user: "user", pwd: "password", roles: [ { role: "dbOwner", db: "mydb" } ] } )
</code></pre>
<li>登入</li>
<pre><code class="bash">$ mongo -u user -p password --authenticationDatabase admin
#或
$ mongo
> use admin
> db.auth('user','password');
</code></pre>
<li>URI 寫法</li>
<pre><code class="bash line">mongodb://user:password@localhost:27017/collection<span style="color: red;">?authSource=admin</span></code></pre>
</ul>
<h3>
實用指令</h3>
每筆資料,複製指定欄位
<pre><code class="bash">db.getCollection(table).find().forEach(function(d){
db.getCollection(table).update(
{id: d._id},
{$set: {
newcol: d.email
}}
);
});
</code></pre>
每筆資料,某欄位全部小寫
<pre><code class="bash">db.getCollection(table).find().forEach(function(d){
if(d.email) d.email = d.email.toLowerCase();
db.getCollection(table).update(
{id: d._id},
{$set: {
email: d.email
}}
);
});
</code></pre>
<br />
<h3>
常見狀況</h3>
<ul>
<li><b>Server啟動時,mongod 沒起來</b></li>
Ubuntu 16.04 改用 systemd 後,mongod service 需手動去啟用
<pre><code class="bash line">#執行一次
$ sudo systemctl enable mongod.service
$ sudo systemctl daemon-reload
</code></pre>
若沒 run 起來,可能是 service file 不存在,則須自行撰寫 (參考<a href="https://stackoverflow.com/questions/37014186/running-mongodb-on-ubuntu-16-04-lts">這篇</a>) <br />
急的話,可先使用 <span class="bg-gray">/usr/bin/mongod --quiet --config /etc/mongod.conf &</span>
<li><b>Failed: error connecting to db server: no reachable servers</b></li>
執行 mongo 會正常,但其他 tool 會出錯,不要使用 ubuntu apt 原本的 mongodb<br />
<div class="alert-message warning">
改成用官方建議的安裝方式 (<a href="https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/">link</a>)<i class="fa fa-exclamation-triangle"></i></div>
<li>Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
<br />/mongo/shell/mongo.js:251:13</li>
檢查 log,若是連線 lock 住
<pre><code class="bash line">$ sudo rm /var/lib/mongodb/mongod.lock
$ sudo mongod --repair
$ sudo service mongod start
</code></pre>
</ul>
<h3>
延伸閱讀</h3>
</div>
<ul>
<li>MongoDB的使用中的一些問題 (<a href="http://blog.leanote.com/post/498269987@qq.com/MongoDB%E4%BD%BF%E7%94%A8%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98" target="_blank">link</a>)</li>
<li>MongoDB Schema 設計指南 (<a href="https://blog.toright.com/posts/4483/mongodb-schema-%E8%A8%AD%E8%A8%88%E6%8C%87%E5%8D%97.html" target="_blank">link</a>)</li>
<li>CAP & BASE 理論看 MongoDB (<a href="http://garyliutw.blogspot.tw/2014/05/mongodb-nosql.html" target="_blank">link</a>)</li>
<li>30天之你好MongoDB(<a href="http://ithelp.ithome.com.tw/users/20089358/ironman/1064" target="_blank">link</a>)</li>
<li>SQL 到彙總(Aggregation)對應表(<a href="http://calvert.logdown.com/posts/159915-sql-to-aggregation-mapping-chart" target="_blank">link</a>)</li>
</ul>
</div>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-46827870817393825332018-01-04T15:40:00.000+08:002018-01-04T15:47:21.220+08:00Systemd 操作<div>
<blockquote class="tr_bq">
Ubuntu 16.04 淘汰使用 rc.local,改用 systemd 達成開機啟動服務</blockquote>
</div>
<div>
<br /></div>
<h3>
基本範例</h3>
<pre><code class="bash line">$ nano /etc/systemd/system/my.service</code></pre>
<pre><code class="ini">[Unit]
[Service]
ExecStart=/path/script.sh
[Install]
WantedBy=default.target
</code></pre>
<pre><code class="bash line">$ chmod +x /path/script.sh
$ systemctl daemon-reload
$ systemctl start my.service
$ systemctl enable my.service
</code></pre>
如有問題,用 status 查詢後,重新 daemon-reload
<br />
<pre><code class="bash line">$ systemctl status my.service
$ systemctl daemon-reload
</code></pre>
重開機,檢查服務是否有啟動成功
<br />
<br />
<br />
<h3>
.Service Unit 詳解</h3>
結構<br />
<ul>
<li>[Unit] 敘述、服務執行相依性</li>
<li>[Service]..:實際執行內容 (不同的 Type 會有不同的項目)</li>
<li>[Install]:soft link 到哪個 target</li>
</ul>
<pre><code class="ini">[Unit]
Description= 服務說明,list-units 時可看到
Documentation= 服務說明檔
After= 在什麼服務後才啟動,非強制
Before= 在什麼服務前就啟動,非強制
Requires= 將 After、Before 變成強制
Wants= 希望清單,希望後面繼續執行甚麼服務
Conflicts= 衝突清單,此服務後面不可以執行甚麼服務
[Service]
Type= daemon 啟動的方式
=simple 啟動後常駐於記憶體中(default)
=forking 子程序的方式 (simple 方式,父程序在啟動結束後就會終止運作)
=oneshot 類似 simple,但完成後不常駐
=dbus 類似 simple,須取 D-Bus 的名稱後,才會繼續運作 (必要參數 BusName)
=notify 類似 simple,透過 inotify 發送啟動服務的通知
=idle 類似 simple,所有的工作都順利執行完畢後才會執行。(通常是給開機完成後才執行的服務)
Environment= 環境參數
EnvironmentFile= 環境檔
ExecStartPre= 在 start 之前執行的指令
ExecStart= 腳本程式、指令
ExecStartPost= 在 start 之後執行的指令
ExecStop= 執行 systemctl stop 的執行的指令
ExecReload= 執行 systemctl reload 的執行的指令
Restart= 如果為 always,會不斷重生
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-6y_I4P694Ow/Wk3btId_g3I/AAAAAAAADXg/hwFAqi4DCJYzMGtE5VvFe4zVL7jMBH6XQCLcBGAs/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-01-04%2B%25E4%25B8%258B%25E5%258D%25883.45.19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="438" data-original-width="1514" src="https://3.bp.blogspot.com/-6y_I4P694Ow/Wk3btId_g3I/AAAAAAAADXg/hwFAqi4DCJYzMGtE5VvFe4zVL7jMBH6XQCLcBGAs/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-01-04%2B%25E4%25B8%258B%25E5%258D%25883.45.19.png" /></a></div>
RestartSec= 重生所需耗費時間(秒)
RemainAfterExit= 如果為 1,所屬的所有程序都終止之後,此服務會再嘗試啟動。(for Type=oneshot)
TimeoutSec= 幾秒後,強制結束
PrivateTmp= 如果為 true,會分配獨立的臨時空間給服務
KillMode= daemon 終止時,
=process 只終止主要的程序(ExecStart那串)
=control-group 主程序產生的其他 control-group 的程序一起關閉
=none 則沒有程序會被關閉
User= 指定執行的身份(預設root)
Group= 指定執行的群組(預設root)
UMask=0027
PermissionsStartOnly= 允許使用 User,yes 表示只對 ExecStart 有效,no 表示全部 Exec* 都不可用
[Install]
WantedBy=default.target
WantedBy= 要掛在哪一個 target unit 底下
Also= 服務 enable 時,要連帶 enable 的其他服務
Alias= 別名,呼叫此名稱等同呼叫這個服務
</code></pre>
<br />
<h3>
相關指令</h3>
查詢執行 log
<br />
<pre><code class="bash line">$ journalctl -u xxxx.service</code></pre>
列出全部target
<br />
<pre><code class="bash line">$ systemctl list-units --type=target --all</code></pre>
列出清單(<a href="https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units">link</a>)
<br />
<pre><code class="bash line">$ systemctl list-unit-files --all</code></pre>
列出相依
<br />
<pre><code class="bash line">$ systemctl list-dependencies parse.service</code></pre>
查詢 default.target
<br />
<pre><code class="bash line">$ systemctl get-default</code></pre>
設定 default.target
<br />
<pre><code class="bash line">$ systemctl set-default multi-user.target</code></pre>
<h3>
target unit</h3>
graphical.target:文字+圖形界面,已包含 multi-user.target
multi-user.target:純文字模式
shutdown.target:關機的流程
...
最常用到 multi-user.target、graphical.target,全部的 target 可看到上面指令查詢
<br />
<br />
<h3>
參考文獻</h3>
<ul>
<li><a href="http://linux.vbird.org/linux_basic/0560daemons.php#systemd_cfg_dir">鳥哥-認識系統服務</a></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ9mXXlTfzFA1OFBATgud_WE1cIb22htD4FxudLmvS2-cfjqMqjzOH7jc3ecYDXwzp7CIXEyS2vXZnjoUXam8KHbGLrgMaFTTPE2p6qKcf58JTf6iZER8kZnY1Wh8JQENnR_oqgxlEkW_w/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-01-04+%25E4%25B8%258B%25E5%258D%25883.39.11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="438" data-original-width="816" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ9mXXlTfzFA1OFBATgud_WE1cIb22htD4FxudLmvS2-cfjqMqjzOH7jc3ecYDXwzp7CIXEyS2vXZnjoUXam8KHbGLrgMaFTTPE2p6qKcf58JTf6iZER8kZnY1Wh8JQENnR_oqgxlEkW_w/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2018-01-04+%25E4%25B8%258B%25E5%258D%25883.39.11.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-16881352372503283972017-12-13T15:47:00.000+08:002017-12-13T15:48:59.010+08:00Facebook Meta<h3>
基本用法</h3>
預設 type 為 website,若為部落格形式則改用 article,這邊先以 website 作範本<br />
<a href="https://developers.facebook.com/docs/sharing/webmasters">基本標籤指南</a><br />
<a href="https://developers.facebook.com/docs/reference/opengraph/object-type/website/">Website type 的 Head & Meta 參考文件</a><br />
<a href="https://developers.facebook.com/docs/reference/opengraph/object-type/article/">Article type 的 Head & Meta 參考文件</a><br />
<pre><code class="html"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# website: http://ogp.me/ns/website#">
<meta property="fb:app_id" content="app編號" />
<meta property="og:type" content="website" />
<meta property="og:url" content="內容" />
<meta property="og:title" content="Sample Website" />
<meta property="og:image" content="https://s-static.ak.fbcdn.net/images/devsite/pic1.jpg" />
<meta property="og:image" content="https://s-static.ak.fbcdn.net/images/devsite/pic2.png" />
<meta property="og:image" content="https://s-static.ak.fbcdn.net/images/devsite/pic3.png" />
</code></pre>
<h3>
開發 Debug</h3>
<ol>
<li>進入 <a href="https://developers.facebook.com/tools/debug/sharing/">分享偵錯工具</a></li>
<li>「分享偵錯工具」可以顯示所有取得的 fb meta 資料</li>
<li>「批次失效工具」可清除被 cache 住的 meta 資料</li>
</ol>
<br />
<h3>
狀況</h3>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlqXhzL9Mi7SVKIB6Wv7Xh905oW6crlCirQ1JRiMC0awPzH-m4NUMv5ba9bCZskonwbjO4X9rZOtaJnnLi7Q1Ub0xeHIOgoZ_VhkvOahfCHUWxOjdV1HmsqPm8H2PFEZhZzRnUeNarw0gS/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2017-12-13+%25E4%25B8%258B%25E5%258D%258812.57.07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlqXhzL9Mi7SVKIB6Wv7Xh905oW6crlCirQ1JRiMC0awPzH-m4NUMv5ba9bCZskonwbjO4X9rZOtaJnnLi7Q1Ub0xeHIOgoZ_VhkvOahfCHUWxOjdV1HmsqPm8H2PFEZhZzRnUeNarw0gS/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2017-12-13+%25E4%25B8%258B%25E5%258D%258812.57.07.png" /></a></div>
<ul>
<li>出現 SSL 憑證錯誤,導致 meta 讀取失敗。<br />Can’t validate SSL Certificate. Either it is self-signed (which will cause browser warnings) or it is invalid.</li>
<ol>
<li>檢查 apache/nginx 的 SSL 設定,是否有加掛 ChainFile</li>
<li>產生 Chain 檔 (<a href="https://whatsmychaincert.com/">tool</a>)</li>
<li>apache2 掛載</li>
<pre><code class="config">SSLEngine On
SSLCertificateFile /path/mydomain.crt
SSLCertificateKeyFile /path/mydomain.key
SSLCertificateChainFile /path/mydomain.chain.crt
</code></pre>
<li>nginx 掛載</li>
<pre><code class="config">//ssl_certificate /path/mydomain.crt;
ssl_certificate /path/mydomain.chain.crt;
ssl_certificate_key /path/mydomain.key;
</code></pre>
</ol>
</ul>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7542857293093672617.post-6977873031830077022017-12-12T21:16:00.000+08:002017-12-12T21:16:06.543+08:00Python 環境切割<h3>
簡介、安裝</h3>
<ul>
<li>virtualenv</li>
<ul>
<li>在 project folder 建立,可將 system 裝的 python 整包複製到資料夾內,形成區隔</li>
<li>所有操作虛擬環境下</li>
<pre><code class="bash line">pip install virtualenv</code></pre>
</ul>
<li>pyenv</li>
<ul>
<li>從雲端拉 python</li>
<li>無需在虛擬環境操作</li>
<li>裝 pyenv-virtualenv,可與 virtualenv 搭配使用</li>
<li>python3 預設就會安裝</li>
<pre><code class="bash line">#for Mac, 須先安裝最新的 Xcode (到 appstore 內)
$ xcode-select --install
$ brew install pyenv
$ brew install pyenv-virtualenv
$ echo 'export PATH="~/.pyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
#重開 shell
</code></pre>
<li>執行過程有問題,請看 <a href="https://github.com/pyenv/pyenv/wiki/Common-build-problems">Common-build-problems</a></li>
<ul>
<li><span style="color: red;">missing openssl</span></li>
<pre><code class="bash line">CFLAGS="-I$(brew --prefix openssl)/include" \
LDFLAGS="-L$(brew --prefix openssl)/lib" \
pyenv install -v 3.4.3
</code></pre>
</ul>
</ul>
</ul>
<div>
<br /></div>
<div>
<h3>
操作</h3>
<pre><code class="bash line">$ pyenv install -l #查看可安裝的版本
#安裝到 ~/.pyenv/versions/2.7
$ pyenv install 2.7 #如不能用,請看上面 missing openssl
#在專案下,使用指定環境
$ cd my-project
$ python -V #查看版本
$ pyenv local 2.7 #指定使用 2.7 虛擬環境,python&pip 直接下指令即可
$ pyenv local --unset #取消虛擬環境
#使用 2.7 版,再建一個叫做 qoo 的虛擬環境
$ pyenv virtualenv 2.7 qoo
#專案下,使用 qoo 環境
$ cd my-project
$ python -V #查看版本
$ pyenv local qoo #會在目錄下產生 .python-version 檔
$ python -V #查看版本
#其他指令
pyenv version #看目前專案使用的版本
pyenv versions #看系統中目前所有版本
pyenv global x.x #套到整個系統
pyenv which python qoo #版本路徑
pyenv activate qoo #手動啟用 virtualenv
pyenv deactivate qoo #手動停用 virtualenv
pyenv uninstall qoo #刪除 virtualenv
</code></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSKoeb47pwkEgwryR2oIy20k0Gd_AwpMSGhVBuzuiFtIxdwH4nsmtJuoEZHkvx4ojPopkBnTl7m-mIafbUoyzhtwbPXS4DzdiNPFAohRmN1-RW2l9OZnBgbUrFarpEJOrtko6npChMoYvQ/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2017-12-12+%25E4%25B8%258B%25E5%258D%25889.14.16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="410" data-original-width="992" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSKoeb47pwkEgwryR2oIy20k0Gd_AwpMSGhVBuzuiFtIxdwH4nsmtJuoEZHkvx4ojPopkBnTl7m-mIafbUoyzhtwbPXS4DzdiNPFAohRmN1-RW2l9OZnBgbUrFarpEJOrtko6npChMoYvQ/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2017-12-12+%25E4%25B8%258B%25E5%258D%25889.14.16.png" width="0" /></a></div>
<br />
<br />
參考資料<br />
<ul>
<li>VIRTUALENV, PYTHONBREW 和 PYENV有什麼不同, 該選哪一個? (<a href="http://missions5.blogspot.tw/2014/06/pre-surveyvirtualenv-pythonbrew-pyenv.html" target="_blank">link</a>)</li>
</ul>
</div>
<div>
<ul>
</ul>
</div>
Unknownnoreply@blogger.com0