PhpSpreadsheet各種疑難排解

筆記一下。

問題1:Error: Call to undefined function PhpOffice\PhpSpreadsheet\Shared\mb_strlen()

安裝php-mbstring並啟用即可解決。

問題2:輸出檔案至php://output,卻遇到404 not found找不到檔案

安裝以下PHP Plugin即可解決:

php-zip, php-xml, php-md

使用之前要安裝的東西很多呢,這玩意兒。之後說不定還會繼續更新這篇文章的。

在專案裡局部運行Webpack的方法

webpack-cli是個好文明,但有時侯我們不想把它裝在系統裡,或者想要多個專案用不同版本的Webpack,這種時侯就需要讓它局部運行了。

方法非常簡單,只要直接呼叫webpack-cli的bin檔案即可。路徑如下:
./node_modules/webpack-cli/bin/cli.js

如果想方便一點,可以直接寫進scripts裡:

  "scripts": {
    "dev": "./node_modules/webpack-cli/bin/cli.js --mode development --env.NODE_ENV=development",
    "build": "./node_modules/webpack-cli/bin/cli.js --mode production --env.NODE_ENV=PRODUCTION"
  }```
  
  搞定。package.json萬歲。

Instgram API PHP Curl 出現SSL23 Error解決方法

其實再過沒多久Instgram API就不能再像現在這樣使用了,不過考慮到可能還會有些人像我這樣因為工作原因非用不可,分享一下這個的解決方法:

在用Setopt設定Curl的時侯,將CURLOPT_SSL_VERIFYPEER設定為FALSE:

    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_RETURNTRANSFER => 1,
      CURLOPT_URL => $api_url,
      CURLOPT_POST => 1,
      CURLOPT_SSL_VERIFYPEER => FALSE,
      CURLOPT_POSTFIELDS => $query,
    ));
    
    $result = curl_exec($curl);

如此一來,問題就應該解決了。意外地簡單,也意想不到啊……

IE 11下Fetch API無法使用的解決方法

不多說,總之就是Fuxx you IE 11.

首先透過NPM安裝以下套件:

npm install isomorphic-fetch
//或者
yarn add isomorphic-fetch

npm install isomorphic-fetch
//或者
yarn add isomorphic-fetch

再Import已經安裝的套件:

require('es6-promise').polyfill();
require('isomorphic-fetch');
//或者
import 'es6-promise/auto';
import 'isomorphic-fetch';
	
require('es6-promise').polyfill();
require('isomorphic-fetch');
//或者
import 'es6-promise/auto';
import 'isomorphic-fetch';

如果需要在Vue或者React,甚至搭配Babel使用,建議請使用Webpack.

備註:本篇文章曾發佈於舊網誌上。

免去管理伺服器的煩惱,Heroku一鍵安裝Mastodon

從Facebook搬家到Mastodon,已經差不多一個月的時間了。在這段期間,我發現很多人因為擔心自己的私隱而不知道應該選擇相信哪個伺服器,或者只待在mastodon.soical就算了。
但事實上保護私隱最好的方法,那就是自己建一個伺服器了!

但是對於不熟悉伺服器架設的人來說,使用甚至是管理VPS肯定是一件非常困難的事。如果選擇坊間的Mastodon架設服務,也少了一份自己架設伺服器帶來的安全感。
這種時侯,選用Heroku可能就是比較好的方法了。

使用Heroku有以下優缺點:

優點:

  1. Mastodon本身已經提供了一鍵Deploy功能,只要申請Heroku帳號後跟著指示進行設定即可。
  2. 省去管理伺服器的麻煩,駭客入侵的機會也大幅降低
  3. 可免費試用

缺點:

  1. 只有英文介面
  2. 價格偏貴,要架設正式的Mastodon最少需要每個月25美元
  3. 免費版試用限制很大
  4. 部份功能在Heroku可能會出現問題

但整體來說還是相當好用的。

以下是使用Heroku架設Mastodon的簡單教學:

首先點擊以下連結前往Heroku的Dashboard(建立Mastodon):
https://dashboard.heroku.com/new?button-url=https://github.com/tootsuite/mastodon&template=https://github.com/tootsuite/mastodon

然後Heroku會要求你先進行登入。如果沒有帳號的話,先點擊Sign up進行登記。
-----2018-04-22---10.42.32

註冊後回到剛才的頁面,你就會看到一個表格,只要填寫好所有的資料即可。
-----2018-04-22---11.08.19

App name:
你的Mastodon在Heroku上的名字。Heroku會為你提供一個專屬網址,例如如果你的APP NAME為mastodon,網址則會是mastodon-herokuapp.com。不可與其他人重覆。

HEROKU:
預設值為TRUE。不需要修改

LOCAL_HTTPS:
預設值為FALSE,如果你有個人網址,請設定為TRUE。

SINGLE_USER_MODE:
如果你的Mastodon只供個人使用,請設定為TRUE。

S3_ENABLED:
設定是否使用Amazon S3儲存圖片等檔案。由於Heroku沒有永久性的儲存空間,所以建議設定為TRUE。
關於如何使用S3,請參考以下文章:
新手也能輕鬆學會Amazon S3(http://streamer-forest.com/amazon-s3-tutorial-p1.html)

S3_BUCKET:
S3儲存桶名稱。請參考上面的文章。

S3_REGION:
S3儲存桶所在地區。同樣請參考上面的文章。

AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY:
Mastodon連接到S3需要帳號的ACCESS KEY及ACCESS SECRET,在進入AWS Dashboard後選擇Account,Security Credentials裡的Access Key即可取得。注意要小心保管,不然其他人便可以隨意取用你的S3了!

要使用Mastodon,一般會需要經過SMTP Server發送確認郵件以供註冊。
這邊推薦使用Mailgun,一個好用又簡單的SMTP服務。

註冊後將SMTP_SERVER,SMTP_PORT,SMTP_LOGIN,SMTP_PASSWORD 按照Mailgun提供的資料填寫即可。詳情請參考:
Mailgun免費10000封大量發送郵件主機申請與cURL教學

SMTP_DOMAIN:
設定你的SMTP伺服器網址。不需要修改。

SMTP_FROM_ADDRESS:
設定網站郵件信箱地址,例如admin@你的域名。

SMTP_AUTH_METHOD,SMTP_OPENSSL_VERIFY_MODE,SMTP_ENABLE_STARTTLS_AUTO
設定SMTP加密。如果使用Mailgun,可以不用理會這些設定。否則請根據SMTP伺服器服務商提供的資料進行設定。

以上全部資料都填好之後,按下Deploy App就會開始自動部署Mastodon了。趁著這個時間你可以做別的事,不過在這之前Heroku可能會要求你輸入信用卡資料進行確認,要注意喔。

完成後輸入你的Mastodon網址,大公告成!記得要註冊你的帳號,並設定為Admin喔。
-----2018-04-22---11.08.50

祝你在Mastodon上過得愉快!

解決Mac OSX 上安裝cld3-ruby時出現”Failed to locate protobuf “的問題

如果各位嘗試在開發時安裝cld3-ruby,可能都會遇過Failed to locate protobuf這個問題。這是因為……
OSX本身並沒有pkg-config和protobuf!

知道問題出處就很容易解決了。首先,請先確認你的電腦有安裝Brew:

brew -v

如果沒有的話,執行以下指令進行安裝:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

之後就可以安裝pkg-config和protobuf了。

brew install pkg-config
brew install protobuf

再執行一次gem install cld3,完成。

我當初到底為了什麼浪費了一整晚時間的…..

Ubuntu 16.04 Mastodon Docker安裝教學

本教學只適用於v2.x以上版本。

網絡上有很多架設Mastodon的教學,但大部份都是1.x時期的版本,偏偏到了2.x版本後很多東西都已經不適用了,還是重新寫一篇吧。

SMTP,Swap等設定請參考以下網址,本文章只提供最基本的Mastodon架設教學:
https://github.com/ummjackson/mastodon-guide/blob/master/up-and-running.md

  1. 安裝Docker及Docker Compose
sudo apt-get install docker.io
sudo apt-get install pip
pip install docker-compose

2.安裝Nginx(作者不建議使用Apache)

apt-get install nginx

3.安裝Certbot(Mastodon 2.x 版本後強制要求使用SSL)

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

4.下載Mastodon到你的伺服器上

git clone https://github.com/tootsuite/mastodon.git

5.複製Mastodon設定檔範例:

cp .env.production.sample .env.production

5.在Nginx上新增Mastdon網站的設定檔

vi /etc/nginx/sites-enabled/example.com.conf
  1. 複製以下設定檔內容並修改
    需要修改的部份有root, server_name以及ssl_certificate和ssl_certificate_key。
    請將root改成你的mastodon資料夾裡的public資料夾,server_name為網站域名,ssl_certificate和ssl_certificate_key域名的部份同樣改成你的網站域名。
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /home/mastodon/public;
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;

  ssl_protocols TLSv1.2;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 0;

  root /home/mastodon/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security "max-age=31536000";

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    try_files $uri @proxy;
  }
  
  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    try_files $uri @proxy;
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://127.0.0.1:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

7.重啟Nginx

sudo service nginx restart

8.利用Certbot產生你的網站SSL證書:
certbot -d example.com

  1. 回到Mastodon資料夾,修改.env.production
LOCAL_DOMAIN=example.com #修改為你的網站域名
SAFETY_ASSURED=1 
SECRET_KEY_BASE=  
OTP_SECRET= #

運行以下指令兩次,將產生的兩段Key分別填入SECRET_KEY_BASE及OTP_SECRET兩個位置

docker-compose run --rm web rake secret
  1. 回到Mastodon資料夾,修改public資料夾權限後運行Setup指令
chown -R 991:991 public
docker-compose run --rm web rake mastodon:setup

這個版本的Setup不能幫你修改設定檔,對應的部份仍需在.env.production進行設定。
運行自動設定的原因是它可以幫你設定好Database並編譯網站所需的檔案,
除了”Do you want to send test email now”外全部填y就好。

  1. 修改docker-compose.yml,Uncomment 所有volumes的部份,否則database的資料有可能會因為重啟等因素消失

Setup完畢後,最後只需要運行

docker compose up -d

起動所有的Container,稍侯片刻即可。
理論上用Docker架設Mastodon只要設定無誤就能正常運作,但不排除還會有其他問題,歡迎各位詢問或分享經驗。

Mastodon