tag:blogger.com,1999:blog-118533131414990092017-08-01T08:56:48.295+08:00MoA's 糟糕生活關於電腦技術的一些筆記MoAnoreply@blogger.comBlogger112125tag:blogger.com,1999:blog-11853313141499009.post-59617238973623963982017-08-01T08:56:00.002+08:002017-08-01T08:56:48.302+08:00取得EC2 instance的instance id<br /><br />由於使用的 Amazon CloudWatch Monitoring Scripts for Linux 在建置新環境後會有 cache 在 `/var/tmp/aws-mon` 下<br /><br />如果 instance id 改了會造成 aws-mon 回報錯的 id 回去導致新機器沒有資料<br /><br />解決辦法可以刪除 `/var/tmp/aws-mon/instance-id` 這個檔案或是透過以下指令取代為新的<br /><br /><pre class="bash"><code><br />$ wget -q -O - http://169.254.169.254/latest/meta-data/instance-id > /var/tmp/aws-mon<br /></code><br /></pre><br />除此之外 http://169.254.169.254 裡面還藏了很多資訊<br /><br />可以參考 <a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html">http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html</a>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-58065049590062045462017-06-01T14:45:00.001+08:002017-06-01T15:16:05.875+08:00在 ubuntu 中建置 kamailio 伺服器<br />kamailio 是一款 sip server 可以用來做 voip 網路語音通話<br /><br />他們前身是 OpenSER, 也有分支 Opensips<br /><br />在這邊介紹如何在 ubuntu 14.04 建置 kamailio<br /><!- more -><br /><br />由於個人比較偏好直接用別人打包好的套件做安裝,剛好官網也有提供 http://deb.kamailio.org/<br /><br />安裝 kamailio<br /><pre class="shell"><code><br /># 使用 apt-get 安裝<br />echo "deb http://deb.kamailio.org/kamailio trusty main" >> /etc/apt/sources.list<br />echo "deb-src http://deb.kamailio.org/kamailio trusty main" >> /etc/apt/sources.list<br />sudo apt-get update<br />sudo apt-get install kamailio<br /></code></pre><br />記得安裝 mysql modules<br /><pre class="shell"><code><br />sudo apt-get install kamailio-mysql-modules kamailio-tls-modules<br /></code></pre><br /><br />編輯 /etc/kamailio/kamailio.cfg<br /><pre class="shell"><code><br /><br /># #!開頭的會是 kamailio 的 script 語法, 在這邊定義啟用 mysql 跟用 db 做認證<br />#!define WITH_MYSQL<br />#!define WITH_AUTH<br /><br /># 把機器自己的 public ip 設成一個 alias<br />alias="aws public ip"<br /></code></pre><br /><br />設定 db<br /><pre class="shell"><code><br /># 編輯 /etc/kamailio/kamctlrc<br /><br />SIP_DOMAIN=aws public ip<br />DBENGINE=MYSQL<br />DBHOST=localhost<br />DBNAME=kamailio<br />DBRWUSER="kamailio"<br />DBRWPW="kamailiorw"<br />DBROUSER="kamailioro"<br />DBROPW="kamailioro"<br />DBROOTUSER="root"<br />USERCOL="username"<br /></code></pre><br />初始化 db<br /><pre class="shell"><code><br />kamdbctl create<br /></code></pre><br />新增帳號<br /><pre class="shell"><code><br />kamctl add 1000 1000 #kamctl add 帳號 密碼<br /></code></pre><br />全部設完記得重啟<br /><pre class="shell"><code><br />sudo /etc/init.d/kamailio restart<br /></code></pre><br />sip客戶端:<br /><br />android 5: linphone、ECOA Sip<br />android 6: linphone、sipdroid<br />iOS: linphone<br />macOS: YateClientMoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-84515523416297954162017-05-22T09:41:00.000+08:002017-05-22T09:42:29.726+08:00在 ubuntu 中建立 swap<br />1. 建立 swap 檔<br /><pre class="shell"><code><br />sudo fallocate -l 1G /data/swap<br />sudo chmod 600 /data/swap<br />sudo mkswap /data/swap<br /></code><br /></pre><br />2. 編輯 /etc/fstab 加入系統啟動自動掛載<br /><pre class="shell"><code><br />/data/swap none swap defaults 0 0<br /></code><br /></pre><br />3. 自動掛載 fstab 設定的 swap<br /><pre class="shell"><code><br />sudo swapon -a<br /></code><br /></pre><br />4. 查詢 swap<br /><pre class="shell"><code><br />swapon -s<br /># 或<br />free<br /></code><br /></pre>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-71324510876507486482017-04-19T13:55:00.001+08:002017-04-19T13:58:37.780+08:00手動編譯 php *.so 檔<br />由於在同一環境中有不同版本的 php 同時運作<br /><br />所以舊版 php 的 shared object 套件無法使用 pecl/pear 安裝<br /><br />那就自己 build 吧<br /><a name='more'></a><br />以下以 mongo 為例:<br /><br />https://pecl.php.net/package/mongo<br /><br /><pre class="shell"><code># 下載 source code<br />$ wget https://pecl.php.net/get/mongo-1.6.14.tgz<br /><br /># 解壓縮<br />$ tar zxvf mongo-1.6.14.tgz && cd mongo-1.6.14<br /><br />$ phpize<br /><br /># 設定並指定 php 環境<br />$ ./configure --with-php-config=/usr/bin/php-config5<br /><br /># 開始編譯<br />$ make<br /><br /># 把編好的 so 放到特定的位置<br />$ cp modules/mongo.so /usr/lib/php5/20xxxxxx+lfs/<br /></code></pre><br />記得安裝 php devel 套件先啊<br /><pre class="shell"><code># php5.4<br />$ apt-get install php5-dev<br /><br /># php5.6<br />$ apt-get install php-dev <br /></code></pre>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-43877301624812735462016-11-29T11:49:00.002+08:002016-11-29T11:53:18.003+08:00解決 redmine 在創建/更新 issue 時很慢的方法<br /><br />公司內部的 redmine 一直以來都有一個很令人詬病的問題 --速度很慢,導致大家興趣缺缺<br /><a name='more'></a><br />這幾天終於拿到了登入的權限,有空就來檢查一下<br /><br />因為是用 bitnami 安裝的所以有一大堆 built-in 的套件<br /><br />apache2, php-fpm 等的一一檢查過了還是無法解決<br /><br /><br />最終發現是卡在送 email 時<br /><br />由於當初設定是用 :smtp 方式<br /><br />所以在創建/更新 issue 時<br /><br />會以同步方式等到 email 傳送完成網頁才會回應<br /><br />導致每次都會 delay 約 3 秒<br /><br /><br />解決辦法修改 config/configuration.yml 把它改成 :async_smtp 如下:<br /><pre class="shell"><code><br />email_delivery:<br /> delivery_method: :async_smtp<br /> async_smtp_settings:<br /> enable_starttls_auto: true<br /> address: "xxxxxxxx"<br /> port: '25'<br /> domain: "xxxxxx"<br /> authentication: :plain<br /> user_name: "xxxx"<br /> password: ""<br /></code></pre><br /><br />參考:<br />http://www.redmine.org/projects/redmine/wiki/FAQ#17<br />http://www.redmine.org/projects/redmine/wiki/EmailConfiguration<br />http://www.redmine.org/issues/12649MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-57990097967975472072016-09-26T09:41:00.001+08:002016-09-26T09:41:38.523+08:00docker nginx reload<br /><br />根據<a href="https://blog.docker.com/2015/04/tips-for-deploying-nginx-official-image-with-docker/">官方blog</a><br /><br />當 nginx 設定檔更動時, 你不能直接執行 nginx reload, 但幸好 nginx 支援特定 signal 去做 reload<br /><br />/etc/init.d/nginx reload<br /><pre class="shell"><code><br />sudo docker kill -s HUP <container_name><br /></code><br /></pre><br /><br />/etc/init.d/nginx restart<br /><pre class="shell"><code><br />sudo docker restart <container_name><br /></code><br /></pre><br />MoAnoreply@blogger.com1tag:blogger.com,1999:blog-11853313141499009.post-70130510704499690642016-08-22T09:32:00.001+08:002016-08-22T09:32:30.469+08:00將虛擬機器映像檔 匯入AWS EC2<br /><br />由於必須必須把映像檔上傳至 S3 上才能建立 EC2 的 AMI<br /><br />所以我們先在S3上建立一個 bucket<br /><br /><pre class="shell"><code><br />aws s3api create-bucket --bucket vm-image<br /></code><br /></pre><br />將映像檔上傳至 S3<br /><pre class="shell"><code><br />aws s3 cp ~/ubuntu.ova s3://vm-image/<br /></code><br /></pre><br />建立一個名為 vmimport 的 role<br /><br /><pre class="shell"><code><br />aws iam create-role --role-name vmimport<br /></code><br /></pre><br />condition 要改為<br /><code><br />"sts:Externalid":"vmimport"<br /></code><br /><br />開始匯入囉<br /><pre class="shell"><code><br />aws ec2 import-image --cli-input-json "{ \"Description\": \"Ubuntu\", \"Format\": \"ova\", \"UserBucket\": { \"S3Bucket\": \"vm-image\", \"S3Key\": \"Ubuntu.ova\" } }"<br /></code><br /></pre><br />之後就是等等等, 當然可以查進度<br /><pre class="shell"><code><br />aws ec2 describe-import-image-tasks --import-task-ids import-ami-xxxxxxxxxx<br /></code><br /></pre><br />完成後就會在你的EC2的AMIs看到image囉<br /><br /><br />Reference:<br />http://docs.aws.amazon.com/vm-import/latest/userguide/import-vm-image.html#import-vm<br />http://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.htmlMoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-42239924514471148792016-07-18T08:49:00.001+08:002016-07-18T08:49:23.665+08:00docker 解決 container mount檔案<br /><br />目前在操作 docker 上會遇到一個問題:<br />mount 某個檔案或某的目錄到 container 上後修改 host 上的擋案後 container 對應的擋案不會跟著變動<br /><a name='more'></a><br />首先我們先stat一下這個奇怪的檔案<br /><pre class="shell"><code><br />$ stat /data/ssl.conf; sudo docker exec -it yw stat /etc/nginx/conf.d/default.conf<br /> File: ‘/data/xxxxxx.conf’<br /> Size: 2138 Blocks: 8 IO Block: 4096 regular file<br />Device: ca01h/51713d Inode: 795457 Links: 1<br />Access: (0664/-rw-rw-r--) Uid: ( 1000/ ubuntu) Gid: ( 1000/ ubuntu)<br />Access: 2016-07-15 03:40:45.503636999 +0000<br />Modify: 2016-07-15 03:39:40.031636999 +0000<br />Change: 2016-07-15 03:39:40.035636999 +0000<br /> Birth: -<br /> File: '/etc/nginx/xxxxxx.conf'<br /> Size: 2137 Blocks: 8 IO Block: 4096 regular file<br />Device: ca01h/51713d Inode: 795460 Links: 0<br />Access: (0664/-rw-rw-r--) Uid: ( 1000/ UNKNOWN) Gid: ( 1000/ UNKNOWN)<br />Access: 2016-07-15 03:40:45.503636999 +0000<br />Modify: 2016-07-15 03:39:40.031636999 +0000<br />Change: 2016-07-15 03:39:40.035636999 +0000<br /> Birth: -<br /></code><br /></pre><br />可以看到 Size, Inode, Links 都不一樣<br /><br />解決辦法有兩個步驟<br /><br />1. 重新啟動docker<br /><pre class="shell"><code><br />$ docker restart lol_server<br /></code><br /></pre><br />2. 修改你的 .vimrc 設定, 加入以下一行<br /><pre class="vim"><code><br />set backupcopy=yes<br /></code><br /></pre>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-35571133046907872642016-07-18T08:41:00.000+08:002016-07-18T08:41:13.547+08:00docker container 預設加入 host 至 /etc/hosts<br /><br /><br />從 docker v1.3.1 起<br />docker支援了 --add-host 的參數可以再啟動時加入私有主機別名設定 (/etc/hosts)<br />可參考 <a href="https://docs.docker.com/v1.8/reference/run/#network-settings">https://docs.docker.com/v1.8/reference/run/#network-settings</a><br /><br />我們只要再docker啟動時加入 --add-host $NAME:$IP<br />例如:<br /><pre class="shell"><code><br />docker run -itd --restart=always --name lol_backend -p 80:80 -p $22:22 --add-host db:10.10.10.1 lol_backend<br /></code><br /></pre><br />有多筆就加多個囉<br /><pre class="shell"><code><br />docker run -itd --restart=always --name lol_backend -p 80:80 -p $22:22 --add-host db:10.10.10.1 --add-host db2:10.10.10.2 lol_backend<br /></code><br /></pre>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-47472727417734306742016-07-01T09:40:00.003+08:002016-07-01T09:42:52.907+08:00docker 如何修改 container 中的 RestartPolicy<br /><br />如何修改 running 狀態的 container 的 RestartPolicy 呢<br /><br />docker 在 1.11 版中可以透過 update 去更新了<br /><a name='more'></a><br /><br />看一下我們現在的版本<br /><pre class="shell"><code><br />docker -v<br />Docker version 1.10.3, build 20f81dd<br /></code><br /></pre>看來有點舊<br /><br />更新一下docker<br /><pre class="shell"><code><br />$ sudo apt-get update<br />$ sudo apt-get install docker-engine<br />$ docker -v<br />Docker version 1.11.2, build b9f10c9<br /></code><br /></pre>很好, 變成 1.11.2 版了<br /><br />再來看一下現在的 RestartPolicy 設定是什麼<br /><pre class="shell"><code><br />$ docker inspect -f "{{.HostConfig.RestartPolicy.Name}}" containerName<br />no<br /></code><br /></pre><br />我想要設定為 always<br /><pre class="shell"><code><br />$ docker update --restart=always containerName<br />containerName<br /></code><br /></pre><br />再看一下設定是否有更改成功<br /><pre class="shell"><code><br />$ docker inspect -f "{{.HostConfig.RestartPolicy.Name}}" containerName<br />always<br /></code><br /></pre><br />水啦~可以安心睡覺了MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-69970709418660449752016-06-29T14:17:00.000+08:002016-06-29T14:18:10.723+08:00非管理員權限在透過 homebrew 安裝 iterm2<br /><br />homebrew 又來拯救工程師啦~<br /><br />homebrew caskroom的安裝記得先參考以下兩篇:<br /><br /><a href="http://blog.moa.tw/2016/05/sublime-text-2-homebrew.html">非管理員權限在 macOS 安裝 homebrew</a><br /><a href="http://blog.moa.tw/2016/05/homebrew-robomongo.html">非管理員權限在透過 homebrew 安裝 robomongo</a><br /><br />安裝 iterm2 指令<br /><pre><code><br />brew cask install iterm2<br /></code><br /></pre><br />這樣就完成了!!<br /><br />對了, 記得改成將主題改成 monokai<br /><br /><a href="https://github.com/honomoa/monokai.terminal">https://github.com/honomoa/monokai.terminal</a>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-43164037253272103202016-06-21T09:19:00.000+08:002016-06-22T18:57:55.441+08:00vim 游標背景<br /><br />老了...看東西常常看不清楚...<br /><br />常常 vim 後找不到游標在哪一行<br /><br />這時候就該開啟 set cursorline 的功能<br /><br /><br />你可以在命令列模式直接打上<br /><pre class="vim"><code><br />:set cursorline<br /></code><br /></pre><br />或是編輯 .vimrc 加上一行<br /><pre class="vim"><code><br />set cursorline<br /></code><br /></pre>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-12862982104555069692016-06-18T10:54:00.001+08:002016-06-22T18:57:42.387+08:00如何讓你 macOS 的 terminal 連 SSH 不會自動斷線<br /><br />這個問題困擾我一陣子了<br /><br />常常 ssh 看東西一陣子不動它後就會斷線<br /><br />以前在 windows 用的軟體有內建送出防 idle 的字元出去<br /><br />不過 macOS 的 terminal 似乎沒這麼聰明啊~<br /><br />今天找了3個解決方法<br /><br />這三個方法意思相同, 都是透過 ssh 軟體做設定, 只不過是在不同地方而已<br /><a name='more'></a><br />1. 在 ssh 時加上參數<br /><pre class="shell"><code><br />ssh -o ServerAliveInterval=10 yourssh.server<br /></code><br /></pre><br />2. 修改 ~/.ssh/config<br /><pre class="shell"><code><br />ServerAliveInterval 10<br /></code><br /></pre><br />3. 修改 /etc/ssh/ssh_config<br /><pre class="shell"><code><br />ServerAliveInterval 10<br /></code><br /></pre><br />在沒有系統管理員權限時採用第2種方法是最方便的!MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-32255409891018376612016-06-16T10:16:00.000+08:002016-06-22T18:59:18.688+08:00利用 cloudwatch 監控 ec2 instance 的 記憶體/磁碟使用率<br /><br />環境: Ubuntu 14.04<br /><br />1. 安裝相依套件<br /><pre class="shell"><code><br />sudo apt-get install unzip libwww-perl libdatetime-perl<br /></code><br /></pre><br /><a name='more'></a><br />2. 下載 script<br /><pre class="shell"><code><br />cd ~/<br />curl http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -O<br />unzip CloudWatchMonitoringScripts-1.2.1.zip<br />rm CloudWatchMonitoringScripts-1.2.1.zip<br />cd aws-scripts-mon<br /></code><br /></pre><br />3. 把 script 加到 cronjob 定期執行<br /><br /><pre class="shell"><code><br />*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-util --disk-space-util --disk-path=/ --from-cron<br /></code><br /></pre><br /><br />記得請先建立以下權限的 policy<br />cloudwatch:GetMetricStatistics<br />cloudwatch:ListMetrics<br />cloudwatch:PutMetricData<br />ec2:DescribeTags<br /><br />4. AWS 建立一個 IAM policy<br /><br /><pre class="json"><code><br />{<br /> "Version": "2012-10-17",<br /> "Statement": [<br /> {<br /> "Sid": "AwsScriptsMonCW",<br /> "Effect": "Allow",<br /> "Action": [<br /> "cloudwatch:GetMetricStatistics",<br /> "cloudwatch:ListMetrics",<br /> "cloudwatch:PutMetricData"<br /> ],<br /> "Resource": [<br /> "*"<br /> ]<br /> },<br /> {<br /> "Sid": "AwsScriptsMonEC2",<br /> "Effect": "Allow",<br /> "Action": [<br /> "ec2:DescribeTags"<br /> ],<br /> "Resource": [<br /> "*"<br /> ]<br /> }<br /> ]<br />}<br /></code><br /></pre><br />在這邊因為我們 ubuntu 是一個 ec2 instance 所以不用設定 AWSAccessKeyId 、 AWSSecretKey<br /><br />你可以在 <a href="https://console.aws.amazon.com/cloudwatch/">CloudWatch</a> 的 Linux System Metrics 找到剛剛的 log 了<br /><br />記得設定 Alarm 阿MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-88593656500680877212016-06-15T14:18:00.001+08:002016-06-27T17:25:58.579+08:00解決 macOS 的 screen 無法垂直分割問題<br /><br />這個原因是因為我的 screen 版本是 4.00.04 貌似不支援 split -v<br /><br /><pre class="shell"><code><br />$ /usr/bin/screen -v<br />Screen version 4.00.03 (FAU) 23-Oct-06<br /></code><br /></pre><br />在 mac 下什麼事情用 homebrew 解決就對了<br /><br />安裝 screen<br /><pre class="shell"><code><br />$ brew install homebrew/dupes/screen<br /></code><br /></pre><br />如果你的 homebrew 是用非管理員權限安裝的<br /><br />那麼記得把 homebrew 的 bin path 加在原本 $PATH 的前面<br /><br />這樣在下 screen 的時候才不會找到系統下的喔<br /><br /><pre class="shell"><code><br />$ screen -v<br />Screen version 4.03.01 (GNU) 28-Jun-15<br /></code><br /></pre>MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-56818884584335956902016-05-05T08:29:00.000+08:002016-06-22T19:02:19.380+08:00在 macOS 中中文輸入時暫時切換英文<br /><br />最近才開始使用 mac 系統,有很多地方都不熟悉<br /><br />今天心血來潮查了我心中的疑問 --為什麼我輸入中文穿插英文時都會是全形字型<br /><br />上網查了查 有!有方法<br /><br />原來輸入中想要穿插英數字時可以按 caps lock 就可以暫時輸入半形英數字囉<br /><br />再按一次 caps lock 就可以繼續輸入中文!!MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-64938750340658318122016-05-04T17:32:00.002+08:002016-06-22T19:01:43.890+08:00mongoose 的 populate 用法一直都有看過 populate 這個東西<br /><br />今天終於有時間研究<br /><br />首先我們有兩個 collection<br /><a name='more'></a><br /><b>User</b><br /><pre class="js"><code><br />var schema = new Schema({<br /> name: {type: String},<br /> gender: {type: String},<br /> old: {type: Number},<br /> books: [{<br /> bookId: {type: ObjectId, ref: 'Book'}<br /> }],<br /> modified: {type: Date, default: Date.now}<br />});<br /></code><br /></pre><br /><b>Book</b><br /><pre class="js"><code><br />var schema = new Schema({<br /> name: {type: String},<br /> year: {type: Number},<br /> ISDN: {type: String},<br /> price: {type: Number},<br /> // ownerUserId: [{type: ObjectId, ref: 'User'}],<br /> modified: {type: Date, default: Date.now}<br />});<br /></code><br /></pre><br /><br />使用方法:<br /><pre class="js"><code><br />db.User.findOne({}).populate({<br /> path: 'books.bookId',<br /> model: 'Book',<br /> select: 'name price',<br /> options: {limit: 2}<br /> }).lean().exec();<br /></code><br /></pre><br />不知道這指令跟 mongodb 的 aggregate 有沒有關係...<br /><br />等我心血來潮的時候再來研究一下囉!!MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-5878219836507883202016-05-03T09:48:00.001+08:002016-06-27T17:25:49.272+08:00非管理員權限在透過 homebrew 安裝 robomongo<br /><br />沒有管理員權限真的是非常的 sucks<br /><br />還好這世界上還是有優秀的工程師可以繞過去(ex: yoyodiy)<br /><br />由於 homebrew 沒有 robomongo 的安裝腳本<br /><a name='more'></a><br />所以我們該利用 <a href="https://github.com/caskroom/homebrew-cask">homebrew-cask</a> 才能安裝<br /><br />步驟如下:<br /><br />1. 設定環境變數,不然安裝到一半會要你輸入管理員密碼啊~~~~~<br /><pre class="shell"><code><br />export HOMEBREW_CASK_OPTS="--appdir=${HOME}/Applications --caskroom=${HOME}/.cask"<br /></code><br /></pre><br />2. 安裝<br /><pre class="shell"><code><br />brew cask install robomongo<br /></code><br /></pre><br />3. 連結到文件以便開啟<br /><pre class="shell"><code><br />ln -s ${HOME}/.cask/robomongo/0.9.0-rc7,2b7a8ca/Robomongo.app ${HOME}/Documents/<br /></code><br /></pre><br />這樣就可以在文件中看到 Robomongo 就可以執行它了MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-80387899493890967842016-05-02T10:06:00.001+08:002016-06-22T19:04:00.026+08:00sublime 安裝 Package Control<br /><br />其實這篇蠻廢的<br /><br />不過常常換個新環境就會忘記 Sublime 的 Package Control 是要另外安裝的XD<br /><br />1. 到官網依據你的 Sublime Text 選擇適合的腳本<br />https://packagecontrol.io/installation<br /><br />2. 按下 ctrl+` 並把剛剛複製的東西貼上執行<br /><br />3. 重新啟動 Sublime 後, 按下command+shift+p 就可以找到 Package Control 了MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-61770049830840588692016-05-02T10:01:00.004+08:002016-06-27T17:26:41.694+08:00非管理員權限在 sublime text 2 安裝 ctags<br /><br />首先請先參考 <a href="http://blog.moa.tw/2016/05/sublime-text-2-homebrew.html">非管理員權限在 macOS 安裝 homebrew</a> 與 <a href="http://blog.moa.tw/2016/05/sublime-package-control.html">sublime 安裝 Package Control</a><br /><br />將你的 homebrew 安裝起來<br /><br />接下來就可以利用 brew 安裝 ctags<br /><a name='more'></a><br />1. 安裝 ctags<br /><pre class="shell"><code><br />brew install ctags<br /></code><br /></pre><br />2. 新增環境變數<br /><pre class="shell"><code><br />export CTAGS_PATH=${HOME}/usr/local/Cellar/ctags/5.8_1<br />export PATH=${PATH}:${HOMEBREW_PREFIX}/bin:${CTAGS_PATH}/bin<br /></code><br /></pre><br />3. 在 sublime 安裝 ctags<br />Preferences -> Package Control -> Install Package<br />輸入 ctags<br /><br />4. 編輯 ctags settings<br />Preferences -> Package Settings -> CTags -> Settings - User<br />內容為<br /><pre class="js"><code><br />{<br /> "command": "~/usr/local/Cellar/ctags/5.8_1/bin/ctags", <br /> "autocomplete": true <br />}<br /></code><br /></pre><br />5. 新增 ctags 的 js 設定檔<br />參考 https://gist.github.com/tim-smart/199338<br />儲存至 ~/.ctags<br /><pre class="text"><code><br />--langdef=js<br />--langmap=js:.js<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*\{/\5/,object/<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*function[ \t]*\(/\5/,function/<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*\[/\5/,array/<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*[^"]'[^']*/\5/,string/<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*(true|false)/\5/,boolean/<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*[0-9]+/\5/,number/<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*=[ \t]*.+([,;=]|$)/\5/,variable/<br />--regex-js=/(,|(;|^)[ \t]*(var|let|([A-Za-z_$][A-Za-z0-9_$.]+\.)*))[ \t]*([A-Za-z0-9_$]+)[ \t]*[ \t]*([,;]|$)/\5/,variable/<br />--regex-js=/function[ \t]+([A-Za-z0-9_$]+)[ \t]*\([^)]*\)/\1/,function/<br /><br />--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*\{/\2/,object/<br />--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*function[ \t]*\(/\2/,function/<br />--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*\[/\2/,array/<br />--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*[^"]'[^']*/\2/,string/<br />--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*(true|false)/\2/,boolean/<br />--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*[0-9]+/\2/,number/<br />--regex-js=/(,|^)[ \t]*([A-Za-z_$][A-Za-z0-9_$]+)[ \t]*:[ \t]*[^=]+([,;]|$)/\2/,variable/<br /></code><br /></pre><br />6. 產生 Tags<br />在 sublime 左方找你 js 的根目錄 在上方按滑鼠右鍵選 CTags: Rebuild Tags<br /><br />這樣就完成了<br /><br />你可以透過以下快速鍵快速切換到代碼定義處<br /><br />Go to Defenation: ctrl+shift+.<br />Return: ctrl+shift+,MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-41350298872568943292016-05-02T09:43:00.001+08:002016-06-22T19:04:42.514+08:00非管理員權限在 macOS 安裝 homebrew<br /><br />因為沒有那該死的管理員密碼<br /><br />所以就要想辦法把所有東西都安裝在家目錄下<br /><br />1. 首先先<a href="https://gist.github.com/skyl/36563a5be809e54dc139">下載</a> 別人處理好的安裝腳本存成 install.rb<br /><br />2. 修改第1步驟中的 `YOUR_HOME` 變數改成你自己的家目錄<br /><br />3. 預先建立目錄<br /><pre class="shell">mkdir -p ~/usr/local<br /></code><br /></pre><br />4. 執行腳本<br /><pre class="ruby">ruby install.rb<br /></code><br /></pre><br />5. 新增環境變數 ~/.bash_profile<br /><pre class="shell"><code><br />export HOMEBREW_PREFIX=${HOME}/usr/local<br />export PATH=${PATH}:${HOMEBREW_PREFIX}/bin<br /></code><br /></pre><br />6. source ~/.bash_profile<br /><br />這樣你就可以透過 brew 安裝套件了<br /><br /><br />參考來源:http://superuser.com/questions/619498/can-i-install-homebrew-without-sudo-privilegesMoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-42604822075031146972016-04-29T10:22:00.002+08:002016-06-22T21:45:59.439+08:00git 如何移除本地端中 remote 已不存在的 branch <br /><br />常常我們合併了一個 branch 出去之後必須把該 branch 關掉<br /><br />通常 git server 都可以在網頁上操作關閉該 branch<br /><br />可是你的 local 並不會自動移除該 remote branch,所以你下 git remote -a 時就會有一堆你曾經 checkout 過的 branch<br /><br />可以下<br /><pre><code><br />git remote prune "你要同步的 remote"<br /></code><br /></pre>他就會把 remote 上不存在的分支從你的本地端移除囉MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-85602778590260881262016-04-28T14:01:00.000+08:002016-06-22T21:45:33.625+08:00如何 uglify 你的 RequireJS<br /><br />應該有三種方法<br /><br />1. gulp-requirejs-optimize<br />2. gulp-shell + r.js<br />3. requirejs<br /><a name='more'></a><br />首先先準備好你的 build.js<br /><br />內容類似這樣<br /><pre class="js"><code><br />({<br /> baseUrl: "public", // site root path<br /> paths: {<br /> "angularRoute": "empty:",<br /> "angularLocalStorage": "empty:",<br /> "angularUiBootstrap": "empty:",<br /> "angularUiRouter": "empty:",<br /> "angularFileUploadShim": "empty:",<br /> "angularFileUpload": "empty:",<br /> "angularLoadingBar": "empty:",<br /> "angularDialog": "empty:",<br /> "underscore": "empty:",<br /> "restangular": "empty:",<br /> // use local file to prevent requireJS optimizer error<br /> "text": "js/module/text.min",<br /> "angularLocale": "empty:"<br /> },<br /> exclude: [<br /> "angular",<br /> "angularRoute",<br /> "angularLocalStorage",<br /> "angularUiBootstrap",<br /> "angularUiRouter",<br /> "angularFileUploadShim",<br /> "angularFileUpload",<br /> "angularLoadingBar",<br /> "angularDialog",<br /> "underscore",<br /> "restangular",<br /> "text"<br /> ],<br /> name: "js/config",<br /> out: "./_public/js/main-built.min.js",<br /> generateSourceMaps: false,<br /> preserveLicenseComments: false<br />})<br /></code><br /></pre><br /><br />第一種方法:<br /><br />由於我的 mba 記憶體只有 4G 在安裝套件時會 out of memory...所以無法確認東西是否正確<br /><br /><br /><br />第二種方法:<br /><br />首先先將 r.js 下載下來 <a href="http://requirejs.org/docs/release/2.2.0/r.js" target="_blank">v2.2.0載點</a><br />安裝 gulp-shell<br /><pre class="shell"><code><br />npm install gulp-shell --save-dev<br /></code><br /></pre><br />在 gulpfile.js 新增一個專門的 task<br /><pre class="js"><code><br />gulp.task('rjs', shell.task(['node r.js -o build.js']));<br /></code><br /></pre>這樣就會把專案用到的所有 js 檔放到 build.js 中的 out 路徑,如果你不想要 uglify 的話 可以改用<br /><pre class="js"><code><br />gulp.task('rjs', shell.task(['node r.js -o build.js optimize=none']));<br /></code><br /></pre><br /><br /><br /><br />第三種方法:<br /><br />這種方法更簡單了你只要安裝 reuqirejs<br /><pre class="shell"><code><br />npm install reuqirejs --save-dev<br /></code><br /></pre><br />build.js 改成下面這種格式<br /><pre><code><br />module.exports = {<br /> ...<br />};<br /></code><br /></pre><br />新增 gulp 的 task 就完成了<br /><pre class="js"><code><br />gulp.task('rjs', function(cb) {<br /> var config = require('./build.js');<br /> rjs.optimize(config, function(buildResponse){<br /> // console.log('build response', buildResponse);<br /> cb();<br /> }, cb);<br />});<br /></code><br /></pre><br /><br />如果在 optimize 途中遇到類似<br /><pre class="shell"><code><br />Error: TypeError: Cannot read property 'normalize' of undefined<br /></code><br /></pre>請記得把你的 text 套件改由 local 端載入,就可以解決這個問題了MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-40893916273094919712016-04-27T15:04:00.000+08:002016-11-28T14:35:59.607+08:00git 好用的 alias<br />紀錄一下 git 好用的 alias <strike>以避免公司鎖 evernote 讓我又找不到了</strike><br /><br />[alias]<br />co = checkout<br />ci = commit<br />di = diff --ignore-space-change --ignore-space-at-eol<br />st = status -sb<br />br = branch -v<br />rt = reset --hard<br />unstage = reset HEAD<br />uncommit = reset --soft HEAD^<br />l = log --pretty=oneline --abbrev-commit --graph --decorate<br />lg = "log --color --graph --oneline --decorate --pretty=format:'%C(auto)%h%Creset%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"<br />amend = commit --amend<br />who = shortlog -n -s --no-merges<br />g = grep -n --color -E<br />cp = cherry-pick -x<br />nb = checkout -b<br /><br /># 'git add -u' handles deleted files, but not new files<br /># 'git add .' handles any current and new files, but not deleted<br /># 'git addall' now handles all changes<br />addall = !sh -c 'git add . && git add -u'<br /><br /># Handy shortcuts for rebasing<br />rc = rebase --continue<br />rs = rebase --skip<br />ra = rebase --abort<br /><br />logf = log --follow<br />purge = clean -d -f -x<br />head = !sh -c 'git clean -d -f -x && git reset --hard HEAD'MoAnoreply@blogger.com0tag:blogger.com,1999:blog-11853313141499009.post-92011249061547105332016-04-27T14:48:00.001+08:002016-11-28T10:01:57.504+08:00nvm 一套 nodejs 版本管理程式<br />沒有管理員權限,照樣安裝nodejs<br /><br />幸好有了 nvm 這玩意,可以把 nodejs 裝在自己目錄下<br /><br />在安裝 global 套件時也沒問題<br /><br /><b><br /><strike>nvm 被系統鎖權限時好用的 nodejs 安裝程式</strike><br />nvm 一套 nodejs 版本管理程式<br /></b><br /><br />非常好<br /><br />首先我們只要執行 readme 提供的指令就可以了<br /><br />我的 mac 沒有 wget 所以選擇 curl 安裝<br /><br /><pre class="shell"><code><br />curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash<br /></code><br /></pre><br />安裝前記得先產生 ~/.bashrc 或是 ~/.bash_profile<br /><br />不然你的 terminal 不會每次開啟都可以直接設定好喔<br /><br />結束...MoAnoreply@blogger.com0