Sourcetree 檔名大小寫偵測不到問題

前言

因為遇到第二次還需要估狗去找解法,還是紀錄一下這麼狀況和解法
而且最近太少更新筆記了

環境

  • OS : Windows 10
  • Sourcetree

情境

  1. 檔案已經 commit 過了
    • 先 commit 一個 test.txt 的檔案
  2. 更改檔名時,且只更改大小寫部分
    • 改為 Test.txt
  3. Sourcetree 切到 File status
    • 什麼改變都沒有
  4. 用指令檢查
    • cmd 輸入 git status
    • 發現偵測不到改動

解法

  • 先把檔名改回去 test.txt
  • 打開 cmd 輸入指令,用指令更改檔名
    • git mv test.txt Test.txt
  • 回到 Sourcetree 發現可以正常偵測到改動了

結語

  • 事不過三,這次一定記住

參考

Laravel 寄信夾帶 PDF 範例

前言

由於遇到需要夾帶訂單資訊的PDF的需求,順便紀錄一下產生PDF夾進信件的筆記
其實還有其他的套件可以產生PDF,但多數人都推薦 Snappy,尤其是包含中文的情境
不過 Snappy 不支援 windows ,所以接下來的筆記僅適用 linux

環境

  • OS : unubtu

前置安裝

  • 使用 Snappy PDF 套件
    • composer require barryvdh/laravel-snappy
  • 安裝必要相關檔案
    • 64 位元用 composer 下載 wkhtmltopdf 和 wkhtmltoimage
      • composer require h4cc/wkhtmltopdf-amd64 0.12.x
      • composer require h4cc/wkhtmltoimage-amd64 0.12.x
    • 複製檔案到指定位置
      1
      2
      sudo cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/
      sudo cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin/
    • 修改檔案權限
      1
      2
      sudo chmod +x /usr/local/bin/wkhtmltoimage-amd64 
      sudo chmod +x /usr/local/bin/wkhtmltopdf-amd64
    • sudo apt-get install -y openssl build-essential xorg libssl-dev
    • sudo apt install libssl1.0-dev

程式部分

  • 程式可以參考我的 laravel筆記
  • .env 中加入
    1
    2
    WKHTML_PDF_BINARY=/usr/local/bin/wkhtmltopdf-amd64
    WKHTML_IMG_BINARY=/usr/local/bin/wkhtmltoimage-amd64
  • 在 config/app.php 中加入 'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
  • 產生 PDF 可以參考 app/Mail/SamplePdfMail.php 中的寫法
  • 宣告 PDF 檔 PDF::loadView('email.sample_pdf', $this->requestData)
  • 產生 PDF 檔並夾帶進信件中 ->attachData($pdf->output(), 'pdf-sample.pdf')
  • 參考樣板

結語

  • 產生 PDF 就是這麼簡單

參考

Laravel 寄信範例

前言

近期工作替商品做了下訂的功能,寫了一堆寄信功能,像是下訂成功、下訂失敗、請求報價、信箱驗證信和優惠碼通知信等…
那就來記錄一下寄信的寫法吧

環境

  • OS : Windows 10

筆記說明

  • 程式可以參考我的 laravel筆記
  • 建立 Controller
    • php artisan make:controller MailController
  • 新增 app\Mail 來放建立信件的物件
  • 新增 resources\views\email 來放信件的 html template
    • 用 Blade Templates 去建立信件樣板
    • 可以用 @include 去匯入部分樣板
    • 我的筆記程式參考這個樣板
  • 在 MailService 用 Mail 去寄信
    1
    2
    3
    $sampleMail = new SampleMail($smapleData);
    Mail::to($receiverMail)
    ->send($sampleMail);
    • 可以傳入 $smapleData 信件需要的資料
      • 可以用雙層大括號顯示傳入變數
    • Mail::to 設定收件者信箱
  • 寄件者和寄件者名稱會吃 env
    1
    2
    MAIL_FROM_ADDRESS="sender@gmail.com"
    MAIL_FROM_NAME="寄件者"
  • 在 env 設定 smtp
    • 測試寄信結果我會用 Mailtrap
      1
      2
      3
      4
      5
      6
      MAIL_MAILER=smtp
      MAIL_HOST=smtp.mailtrap.io
      MAIL_PORT=2525
      MAIL_USERNAME=test_username
      MAIL_PASSWORD=test_password
      MAIL_ENCRYPTION=tls

結語

  • 寄信不難,只是麻煩

參考

Laravel migration 和 seed 筆記

前言

在接觸到 laravel 前我完全不知道有 migration 這樣的東西可以用,只會下 raw sql 去新增表格和調整欄位
有了 migration 可以快速 DB 環境,也算是可以對 DB table 做一個版控
再搭配 seed 可以把基礎資料也寫入 DB,對於搬移程式碼十分方便
簡直看見新大陸

環境

  • OS : Windows 10

安裝流程

  • 下載我的筆記用專案
    • git clone https://github.com/youmu257/laravel-note.git
  • composer install
  • php artisan key:generate
  • cp .env.example .env
  • 調整 .env
    • 寫入你的 DB 設定
      1
      2
      3
      4
      5
      6
      DB_CONNECTION=mysql
      DB_HOST=127.0.0.1
      DB_PORT=3306
      DB_DATABASE=laravel
      DB_USERNAME=user
      DB_PASSWORD=password

建立 migration 檔案

  • php artisan make:migration create_migration_example_table
    • create_order_table 表示建立一個產生 migration_example table 的 migration
    • 會依照當前時間生成這樣的檔案 2020_09_03_162217_create_migration_example_table.php

migration 寫法

執行 migration

  • php artisan migration
    • 會執行 databases/migrations 中的有 extends Illuminate\Database\Migrations\Migration 的 class
    • 會執行所有 class 中的 up function
      • 如建立 table 或更改欄位
      • 同時把每個更改紀錄寫入 migrations table (此為php artisan migration自動建立)
  • migrations table 中有一個欄位是 batch
    • 如果要做 rollback 可以用 batch 為單位做回朔
  • php artisan migration:rollback
    • 會執行所有 class 中的 down function
      • 所以如果 up 是新建 table,down 就是刪除這張 table

Seeder

  • 都提到 migration 就一起講 seeder
    • 基本上就是寫基本資料進資料庫
  • 建立 seeder 指令是 php artisan make:seeder UsersTableSeeder
    • UsersTableSeeder 是要建立的 seeder 檔名
  • 會發現預設就有一個 DatabaseSeeder,用途是控制要執行哪些 seeder
    • 在 migration 時帶 –seed 參數會執行 DatabaseSeeder
      • php artisan migration --seed
    • 單純執行 DatabaseSeeder 用 php artisan db:seed
  • 如果要執行特定的 seeder 帶 –class 參數
    • php artisan db:seed --class=UserTableSeeder

結語

  • DB schema 的版控機制
    • migration 除了在新環境可以快速建立起基本的 DB 外,同時也能做快速的 rollback
  • 寫得好還可以當一種文件看,寫不好一個 rollback 毀天滅地

參考

rethinkDB 筆記

前言

上一篇記錄 stf 的安裝流程,其中有使用到 rethinkdb
當時再用時看了老半天才發現他那看起來像 ORM 的寫法就是他的語法
害我看教學看好久,想說怎麼都沒有寫 raw sql 的語法

介紹

主要講 rethinkDB 的特色,他與傳統資料庫的差異在於適合用於實時的系統上
傳統資料在如果要確保資料是最新的必須一直下 SELECT 指令去檢查資料是否有變動
但 ReQL (rethinkDB 的查詢語法) 可以用 Changefeeds 去監聽資料是否變動,大幅降低不必要的 request

後台

  • 確定 rethinkDB 正常運作

    • sudo /etc/init.d/rethinkdb start
  • 打開瀏覽器輸入 http://localhost:8080

  • 切到 Data Explorer

  • 輸入指令即可操作 DB

指令

  • 新建資料庫
    • r.dbCreate("test")
    • 按下 run,成功會回傳資訊
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      {
      "config_changes": [
      {
      "new_val": {
      "id": "e55b79bb-32e8-44d6-9911-d3d44c5cfc5a" ,
      "name": "test"
      } ,
      "old_val": null
      }
      ] ,
      "dbs_created": 1
      }
  • 新建 table
    • r.db("test").tableCreate("test1")
    • 按下 run,成功會回傳資訊
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      {
      "config_changes": [
      {
      "new_val": {
      "db": "test" ,
      "durability": "hard" ,
      "id": "48be759d-7179-498d-be98-6bc45ab9ae46" ,
      "indexes": [ ],
      "name": "table1" ,
      "primary_key": "id" ,
      "shards": [
      {
      "nonvoting_replicas": [ ],
      "primary_replica": "debian_aav" ,
      "replicas": [
      "debian_aav"
      ]
      }
      ] ,
      "write_acks": "majority" ,
      "write_hook": null
      } ,
      "old_val": null
      }
      ] ,
      "tables_created": 1
      }
  • insert 資料
    • 寫入資料以 json 格式
      1
      2
      3
      4
      5
      r.db("test").table("table1").insert({
      id: 1,
      title: "test title",
      content: "test content"
      })
    • 按下 run,成功會回傳資訊
      1
      2
      3
      4
      5
      6
      7
      8
      {
      "deleted": 0 ,
      "errors": 0 ,
      "inserted": 1 ,
      "replaced": 0 ,
      "skipped": 0 ,
      "unchanged": 0
      }
  • 取得資料
    • get 只能用於主鍵
      • r.db("test").table("table1").get(1)
      • 按下 run,成功會回傳資訊
        1
        2
        3
        4
        5
        {
        "id": 1,
        "title": "test title",
        "content": "test content"
        }
    • filter 可以當成 where 條件
      • r.db("test").table("table1").filter({title: "test title"})
  • 更新資料
    • 先取得得資料才能更新,跟下 where 條件的概念一樣
    • r.db("test").table("table1").get(1).update({title: "new title"})

參考

openSTF 安裝筆記

前言

本來想先寫 laravel 的筆記,但工作上剛好碰到 openstf 就先來記錄一下安裝流程
畢竟這專案沒有繼續維護了,有些套件需要限定版本才能安裝,安裝起來一堆麻煩問題
簡單說一下,STF 是一套用 angular 和 nodejs 寫的手機控制系統
讓你可以遠端操作實體手機做任何操作,甚至安裝app
實現做法是透過 adb 對手機下指令,再搭配 rethinkdb 紀錄裝置資訊
我後續也會再寫一篇 rethinkdb 的簡易教學(用法太特別了,跟SQL完全不同)

環境

  • OS : Debian 10
  • VMware Workstation 15 Player

安裝流程

安裝 NVM

開始安裝和設定 NPM

  • mkdir ~/.npm-global
  • 安裝 npm 為 6.14.5 版本太新後續會有問題
  • npm config set prefix ‘~/.npm-global’
  • vi ~/.profile
    • 添加 PATH=~/.npm-global/bin:$PATH
  • nvm use –delete-prefix v8.8.1 –silent
  • source ~/.profile
  • NPM_CONFIG=~/.npm-global

安裝必要套件

  • nvm use –delete-prefix v8.8.1
  • npm install -g bower gulp
    • 確認安裝是否成功
      • bower -v
      • gulp -v
  • npm install -g node-sass
  • npm install -g gulp-sourcemaps/map-sources
  • sudo apt-get install -y yasm pkg-config

安裝 ADB

  • sudo mkdir -p /usr/local/android-sdk
  • cd /usr/local/android-sdk/
  • sudo curl -OL https://dl.google.com/android/repository/platform-tools-latest-linux.zip
  • sudo unzip platform-tools-latest-linux.zip
  • sudo rm -f platform-tools-latest-linux.zip
  • sudo ln -s /usr/local/android-sdk/platform-tools/adb /usr/bin/adb
  • export PATH=/usr/local/android-sdk/platform-tools:${PATH}
  • sudo echo “export PATH=/usr/local/android-sdk/platform-tools:${PATH}” >> /etc/profile
  • 檢查 ADB 是否安裝成功
    • adb version

安裝 rethinkDB

安裝 Protocol Buffers libaries

  • sudo apt-get install -y graphicsmagick libzmq3-dev
  • 裝 3.0.0 版,3.0.0 以下的不支援了
  • wget https://github.com/google/protobuf/releases/download/v3.0.0/protobuf-js-3.0.0.tar.gz
  • tar -zxvf protobuf-js-3.0.0.tar.gz
  • rm protobuf-js-3.0.0.tar.gz
  • cd protobuf-3.0.0
  • ./configure
    • 如果出現 configure: error: no acceptable C compiler found in $PATH
    • 安裝 gcc
      • sudo apt-get install -y build-essential manpages-dev
  • make;make check;make install
    • 這會跑 10 分鐘以上,可以放著先去做別的事
  • sudo /usr/sbin/ldconfig
  • 確認是否安裝成功
    • protoc –version

安裝 STF

  • npm install -g stf –unsafe-perm
  • 下載 OpenSTF 專案
  • cd stf
  • nvm use 8.8.1
  • npm install
  • bower install
  • gulp build
    • 如果出現錯誤刪掉 node_modules 資料夾再重新 npm install
  • npm link
    • 與 stf 連結,確保 stf 是執行當前專案
  • 確認 stf 相關套件都安裝完成
    • stf doctor
      1
      2
      3
      4
      5
      6
      7
      8
      9
      2020-08-30T17:14:48.535Z INF/cli:doctor 29931 [*] OS Arch: x64
      2020-08-30T17:14:48.537Z INF/cli:doctor 29931 [*] OS Platform: linux
      2020-08-30T17:14:48.537Z INF/cli:doctor 29931 [*] OS Platform: 4.19.0-10-amd64
      2020-08-30T17:14:48.537Z INF/cli:doctor 29931 [*] Using Node 8.8.1
      2020-08-30T17:14:48.554Z INF/cli:doctor 29931 [*] Using ZeroMQ 4.3.1
      2020-08-30T17:14:48.579Z INF/cli:doctor 29931 [*] Using ADB 1.0.41
      2020-08-30T17:14:48.588Z INF/cli:doctor 29931 [*] Using ProtoBuf 3.0.0
      2020-08-30T17:14:48.608Z INF/cli:doctor 29931 [*] Using GraphicsMagick 1.3.35
      2020-08-30T17:14:48.618Z INF/cli:doctor 29931 [*] Using RethinkDB 2.4.1~0buster
  • 執行 stf
    • stf local
    • 如果是要開放遠端連線
      • stf local --cleanup --public-ip 192.168.137.129 --group-timeout 900 --allow-remote
      • 把 192.168.137.129 改成你的 IP
  • 打開瀏覽器輸入 localhost:7100
    • 成功的話可以看這個畫面,任意輸入名稱跟信箱即可登入

參考

Nginx 相關筆記

前言

第一次碰到 nginx 是在使用 laradock 時,一個輕量設定又簡單的好東西
查了一下發現 nginx 在大流量的服務上比起 apache 可以更有效率的處理 request

好 nginx 不用嗎

環境

  • OS : Debian 10
  • VMware Workstation 15 Player

安裝 nginx

  • 安裝 nginx

    1
    apt-get install -y nginx
  • 確認是否成功啟用

    1
    systemctl status nginx
  • 前往本地IP位置

    • 確認當前VM IP

      1
      ip addr
    • 在瀏覽器打上 http://{你的VM IP}

    • 看到此畫面就表示 nginx 成功啟動

設定 nginx 以 larveal 為例

  • 先安裝 laravel 可以參考這篇
  • 把 laravel 專案放到 /var/www/html
  • /etc/nginx/site-available
    • 可以看到 default 檔案,這就是預設的設定檔
  • 打開 default 可以看到 server 的設定,先講常用的設定
    • root 是用來設定指向到的專案路徑
    • index 是指定入口檔案有哪些
    • server_name 可以設定特定 host 指向到當前設定的路徑
  • 複製一個新的設定檔
    • cp default laravel
    • 編輯設定檔
      • 先把 server 中的 default_server 移除
      • 把 root 指向到自己專案底下的 public
      • 調整 server_name 為自己的 host name
      • fastcgi_pass 指向到安裝的 php 版本
      • 最後設定檔如下
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html/laravel/public;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html index.php;

        server_name leo-laravel.com;

        location / {
        try_files $uri $uri/ /index.php?$query_string;
        }

        # pass PHP scripts to FastCGI server
        location ~ \.php$ {
        include snippets/fastcgi-php.conf;

        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        }
        }
  • 如果有調整設定檔,記得要要 reload 設定才會生效
    • sudo nginx -s reload
  • 這時打開瀏覽器輸入 http://leo-laravel.com/api/hello
    • 如果是找不到網頁,表示 host 沒有設定
      • vim /etc/hosts 加入 127.0.0.1 leo-laravel.com
    • 如果是出現 500 server error
      • 我在安裝時碰到這個問題時的解法是調整 storage 和 bootstrap 的權限
        1
        2
        3
        cd /var/www/html/laravel
        chmod -R 777 storage
        chmod -R 775 bootstrap
    • 然後就可以成功看到瀏覽器上印出 hello 了

      參考

  • 在Ubuntu 16.04 上架設Nginx + PHP 7
  • Fixing HTTP ERROR 500 (nginx) for every Laravel route

Laravel 安裝筆記

環境

  • OS : Debian 10

安裝前置環境

  • 安裝 php
    1
    apt-get install -y php php-mbstring php-cli php-xml
    • 確認 php 版本
      1
      2
      3
      4
      5
      6
      7
      php -v

      // 本次紀錄安裝版本為 7.3
      PHP 7.3.19-1~deb10u1 (cli) (built: Jul 5 2020 06:46:45) ( NTS )
      Copyright (c) 1997-2018 The PHP Group
      Zend Engine v3.3.19, Copyright (c) 1998-2018 Zend Technologies
      with Zend OPcache v7.3.19-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies
  • 安裝 Composer
    1
    2
    curl -s https://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer
  • 下載 laravel 專案
    1
    git clone https://github.com/laravel/laravel.git
  • 建置 laravel 專案
    • 會依照 composer.json 內的套件去做建置
    • 建置完成後會產生 composer.lock 紀錄當前所有套件的版本
    • 安裝的套件都會存放在 vender 的資料夾中
      1
      2
      cd laravel
      composer install

簡單測試

  • 在 route 新增一個 api,讓他回傳我們輸入的字串

    1
    2
    3
    4
    5
    vim routes/api.php
    // 新增一個 api
    Route::get('echo/{name}', function ($name) {
    return $name;
    });
  • 啟動內建伺服器

    1
    2
    3
    php artisan serve
    // 顯示以下訊息表示成功啟動
    Laravel development server started: http://127.0.0.1:8000
  • 打開瀏覽器前往 http://127.0.0.1:8000/api/echo/leo

    • 畫面顯示 leo 表示成功

參考

用 Xshell 連線進 VituralBox

前言:

最近工作公司電腦擋了一堆軟體安裝的權限,只好裝VM起來用,結果連在 VituralBox 上安裝 Guest Additions 也要申請權限。
看著超小的畫面也不能共享剪貼簿痛苦萬分之時,前輩對我說怎麼不用 Xshell,反正也只需要 terminal 操作。
那就來裝 Xshell 吧!

安裝 Xshell

  • 下載後並安裝

確認 VM IP

  • 打開 VituralBox
    • 本紀錄 OS 是用 Debian 10
  • 打開 terminal
  • 如果還沒有安裝 OpenSSH 的話,先安裝OpenSSH
    • apt-get install -y openssh-server
  • 輸入 ip addr確認目VM的IP位置

  • 如果看到的不是 192.168.X.X 的 IP 檢查一下網路設定

    • 本紀錄是用橋接介面卡

打開Xshell

  • 新增連線
  • 名稱 可以輸入自定義的名子
  • 主機 輸入VM的IP

  • 因為是本地VM 所以就用簡單的密碼登入

  • 最後按連線,一定因為是本機 VM 就按「接受及存檔」吧

  • 成功的話就會連上去了

題外話

  • 目前的 IP 其實不是固定的,所以重開 VM 後可能會改變就要重調連線設定
  • 那就設定成固定 IP 吧!
  • 編輯網路設定 vim /etc/network/interfaces
  • 輸入
    1
    2
    3
    4
    iface enp0s3 inet static
    address 192.168.1.103
    netmask 255.255.255.0
    gateway 192.168.1.254
  • 網路設定一樣看 ip addr
  • 這時馬上就能用 Xshell,邊看設定邊編輯

  • 最後記得要重啟網路
    • /etc/init.d/networking restart

參考