2020年10月29日 星期四

Laravel & Google BigQuery

 

因為最近要從Firebase Cloud Message發出訊息通知,並要將發送的結果撈出,所以做了點筆記。免得以後忘記。

安裝官方版套件:
  • 安裝:
            在Laravel 安裝 官方版BigQuery套件 composer require google/cloud-bigquery
    
  • 認證方式: 
      有兩種方式可以設定認證方式
      use Google\Cloud\BigQuery\BigQueryClient;

      // Authenticating with keyfile data.
        $bigquery= new BigQueryClient([
        'keyFile' => json_decode(file_get_contents('/path/to/keyfile.json'), true)
        ]);

        // Authenticating with a keyfile path.
        $bigquery= new BigQueryClient([
        'keyFilePath' => '/path/to/keyfile.json'
        ]);

        另外還需要提供Google Cloud project ID才能往下做下去.
        // Providing the Google Cloud project ID.
        $bigquery= new BigQueryClient([
        'projectId' => 'myProject'
        ]);
    
  • 範例:
         public function run_query(){
            $bigQuery = new BigQueryClient([
                'keyFilePath' => "../".env('GOOGLE_APPLICATION_CREDENTIALS'),
                'projectId' => "project_id",
            ]);
        
            // 统计消息指向的非重复应用实例(instance)的数量
            $query = "SELECT COUNT(DISTINCT instance_id)
            FROM `project_id.firebase_messaging.data`
            WHERE
            _PARTITIONTIME = TIMESTAMP('2020-10-27')
            AND event = 'MESSAGE_ACCEPTED';";
        
            $queryJobConfig = $bigQuery->query($query);
            
            $queryResults = $bigQuery->runQuery($queryJobConfig);
        
            foreach ($queryResults as $row) {
                print_r($row);
            }
        }

將內容抓出後可能會看到一些欄位與相關的單詞,可以參考下面的表格內容:
_PARTITIONTIME时间戳此伪代码列包含数据加载当天的起始的时间戳(采用世界协调时间 (UTC))。对于 YYYYMMDD 分区的情况,此伪代码列包含值 TIMESTAMP('YYYY-MM-DD')。
event_timestamp时间戳服务器记录的事件时间戳
project_numberINTEGER发送消息的项目的唯一编号
message_idSTRING消息 ID 用于标识消息。消息 ID 根据应用 ID 和时间戳生成,在某些情况下可能不是全局唯一的。
instance_idSTRING消息发送到的应用的实例 ID(如有)
message_typeSTRING消息的类型。可以是通知消息或数据消息。主题用于标识主题或广告系列发送的原始消息;后续消息则为通知消息或数据消息。
sdk_platformSTRING接收消息的应用所在的平台
app_nameSTRINGAndroid 应用的软件包名称或 iOS 应用的软件包 ID
collapse_keySTRING标识一组可折叠消息的折叠键。若未连接设备,则仅具有给定折叠键的最后一条消息将排队等待最终传送。
优先级INTEGER消息的优先级。有效值包括“normal”(普通)和“high”(高)。在 iOS 中,这些值相当于 APNs 优先级中的 5 和 10
ttlINTEGER此参数指定设备离线后消息在 FCM 存储中保留的时长(以秒为单位)
topicSTRING消息发送到主题的名称(如适用)
bulk_idINTEGER标识一组相关消息(例如向某个特定主题发送的一组消息)的批量 ID
事件STRING事件的类型。可能的值包括:MESSAGE_ACCEPTED:FCM 服务器收到消息,且请求有效;
MESSAGE_DELIVERED:消息已发送到设备上的应用的 FCM SDK。默认情况下,此字段不会被传播。要启用此功能,请按照 [`setDeliveryMetricsExportToBigQuery(boolean)`](https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessaging#public-void-setdeliverymetricsexporttobigquery-boolean-enable)) 中的说明进行操作。

MISSING_REGISTRATIONS:由于注册缺失,请求被拒绝;
UNAUTHORIZED_REGISTRATION:消息被拒绝,因为发送者无权向注册发送消息;
MESSAGE_RECEIVED_INTERNAL_ERROR:处理消息请求时发生不明错误;
MISMATCH_SENDER_ID:由于发送消息的发送者 ID 与声明的端点 ID 消息不匹配,发送消息的请求被拒绝;
QUOTA_EXCEEDED:由于配额不足,发送消息的请求被拒绝;
INVALID_REGISTRATION:由于注册无效,发送消息的请求被拒绝;
INVALID_PACKAGE_NAME:由于软件包的名称无效,发送消息的请求被拒绝;
INVALID_APNS_CREDENTIAL:由于 APNS 证书无效,发送消息的请求被拒绝;
INVALID_PARAMETERS:由于参数无效,发送消息的请求被拒绝;
PAYLOAD_TOO_LARGE:由于负载超出限制,发送消息的请求被拒绝;
AUTHENTICATION_ERROR:由于出现身份验证错误,发送消息的请求被拒绝(请检查用于发送消息的 API 密钥);
INVALID_TTL:由于 TTL 无效,发送消息的请求被拒绝。
analytics_label字符串借助 HTTP v1 API 时,可以在发送消息时设置分析标签,以便标记消息以供分析之用
  • 參考網址:

2017年6月1日 星期四

composer install or update package in the Bitbucket

修改會用到此package的專案下的composer.json
1.在"require"或是"require-dev"裡新增一筆要安裝的套件資訊.其中如果這個套件還在開發中的話請填寫bitbucket對應的branch.branch如果是master的話請在前面加上『dev-』變成dev-master。
例如:
"require" : {
        "php" : ">=5.6.4",
        "bitbucket_account/packagename": "dev-master"
    },

2.如果這套件沒有註冊到Packagist上所示私有套件,我們需要在下方多加一段repositories資訊
例如:
"repositories": [
        {
            "type": "package",
            "package": {
                "name": "bitbucket_accoun/packagename",
                "version": "master",
                "source": {
                    "type": "git",
                    "url": "https://bitbucket_account@bitbucket.org/bitbucket_account/packagename.git",
                    "reference": "master"
                },
                "autoload": {
                    "psr-4": {
                        "package_namespace" : "src/"
                    }
                }
            }
        }
    ],

上面的version與reference皆是對應到bitbucket對應的branch.
psr-4下的package_namespace 裡的斜線要寫成\\。如"psr-4":{"Ace\\King\\":src/"}


composer.json的說明可以看這裡(官方說明文件)

2017年5月23日 星期二

Laravel5+Docker Windows開發環境安裝

開發環境:WINDOWS 10 ,Ecplise(Neon.3 Release 4.6.3),PHP 5.6,Laravel 5.3
執行環境:WAMP,Docker, AWS EC2,AWS RDS


1.先在windows下載安裝composer(可以參考這裡)

2.接著安裝Laravel5

composer global require "laravel/installer"
安裝完後要記得確定把 ~/.composer/vendor/bin 路徑放置於你的 PATH 或是 開發專案 裡,這樣 laravel 執行檔就會存在於你的系統之中。

3.開啟一個新專案
     3.1 進入命令提示字元( 開始→執行  cmd )
     3.2 進入專案上層路徑( 例如 cd  c:/wamp64/www )
     3.3 輸入 composer create-project laravel/laravel laravel_test 按下enter 系統就會去建立專案所需的檔案。最後看到Application key [base64:~~~~~~~~~~~] set successfully.就表示專案已經建立完成了!

      
     3.4 測試一下local 連結http://localhost/laravel_test/public/ 會出現下圖


     
4.將此開發環境放到Docker裡去
   因為公司之後要上線的環境會以Docker的方式在AWS ECS上執行,所以就先將此專案開發環境變成一個Docker Container。
   4.1 進入Windows PowerShell只要下這個指令:
       docker run -idt --name 專案名稱 -p 8100:80 -v /你的.aws位置/.aws/:/root/.aws/ -v /你的local專案路徑/:/var/www/html/專案名稱/資料卷名稱
如 docker run -idt --name laravel_test -p 8080:80 -v C:\Users\Asus\.aws:/root/.aws/ -v  c:/wamp64/www/laravel_test/:/var/www/html/laravel_test php:5.6.30-apache
就會將此環境對應到docker container裡去。
    
     4.2 測試一下輸入local docker網址:http://localhost:8100/laravel_test/public/ 會出現跟之前一樣的畫面


     
這樣就完成了Laravel5環境的安裝了!!!

2017年5月4日 星期四

簡易Docker指令

    最近公司使用AWS ECS+Docker來開發專案.所以在這裡把一些會用到的Docker指令記錄下來。



  • 要直接在Local端Docker可以這樣下
$ docker run -idt --name container名稱 -p 7000:80 -v /你的.aws位置/.aws/:/root/.aws/ -v /你的開發專案路徑/:/var/www/html/專案名稱  要使用的資料卷名稱

資料卷可以使用自己之前就建立好的docker image或是去https://hub.docker.com/下載自己喜歡的image

  • 察看有多少container:

docker ps

  • 進入Docker操作

docker exec -ti [CONTAINER ID] bash

  • 查看有多少container image

docker image ls

  • 啟動docker container

docker start <container id>

  • 停止docker container

docker stop <container id>

  • 刪除docker container

docker rm <container id>

  • build docker container image
1.先cd到專案下有Dockerfile的路徑下
2.執行 docker build .
3.成功後會有一個image id

如果你要做出可以識別的container image的話你可以這樣改下這樣的指令
docker build . -t name:tag

name:通常是倉庫名稱 username/repository
tag:想要識別的標籤

  • 將docker container image放到一個可執行的container的環境裡

docker run -idt --name <container name> -p 7788:80 <docker container image  id>
例:docker run -idt --name Exhibition2 -p 7788:80 362cf48f3511

  • 從docker 檔案出來到local環境

docker cp <container id>:<path in container> <local file path >

  • 從local環境copy檔案到docker container裡去

docker cp <local file path>  <container id>:<path in container> 



  • 將Container Image轉存到本機端檔案
docker save container image repository >  xxxxxxx.tar





2017年2月6日 星期一

隱私權保護政策

隱私權保護政策的內容

本隱私權政策說明 WuHome Studio (以下說明將以"我們"或"我們的"簡稱)通過我們的應用程式(APP)及網站收集到的資訊,以及我們將如何使用這些資訊。我們非常重視您的隱私權。請您閱讀以下有關隱私權保護政策的更多內容。

我們使用您個人資料的方式

本政策涵蓋的內容包括:WuHome Studio 如何處理蒐集或收到的個人資料 。個人資料是指得以識別您的身分且未公開的資料,如姓名、地址、電子郵件地址或電話號碼。
本隱私權保護政策只適用於 WuHome Studio。

資料蒐集及使用原則

我們收集資訊是為了向所有使用者提供更優質的服務;這些資訊可協助我們判斷基本設定 (例如您使用的語言),甚至分析更複雜的內容 (例如對您最實用的廣告),蒐集您與我們或我們的商業夥伴交易的資料,包括您使用我們所提供服務的相關資料,這些資料將提供內部及外部客戶不載有個人資料之市場分析或業務報告。若需使用個人資料我們只會在徵得您的同意時,才與WuHome Studio以外的其他公司、機構或個人分享個人資訊。分享任何敏感的個人資訊前,我們都會先徵求您的同意。

我們會審查收集、儲存、處理資訊的做法 (包括採取實體安全措施),保護系統不致發生未經授權的存取,我們僅允許為了代表我們處理個人資訊而需要知悉該等資訊的WuHome Studio員工、承包商和代理人存取資訊。且相關人員均須遵守嚴格的契約保密義務,一旦未遵守義務便將受到懲戒或解約處分。

其他技術收集資訊細節

➤ 軟硬體相關資訊
我們會收集裝置專屬資訊 (例如您的硬體型號、作業系統版本、裝置唯一的識別碼,以及包括電話號碼在內的行動網路資訊)。
➤ 地理位置資訊
當您使用APP服務時,我們會收集並處理您實際所在位置的相關資訊。我們會使用各種技術判斷您的所在位置,包括 IP 位址、GPS 和其他感應器 (例如能夠為APP提供附近裝置、Wi-Fi 存取點和手機基地台相關資訊的感應器)。
➤ 專屬應用程式編號
某些服務所附的專屬應用程式編號;當您安裝或解除安裝這類服務,或是這類服務定期與我們的伺服器連線 (例如進行自動更新) 時,系統就會將這個編號以及安裝資訊 (例如作業系統類型和應用程式版本號碼) 傳送給WuHome Studio。
➤ 本機存放區
我們會運用瀏覽器網路存放區 (包括 HTML 5) 和應用程式資料快取等機制,收集資訊 (包括個人資訊) 並將其儲存在您的裝置本機中。
➤ Cookie 和匿名識別碼
當您使用我們的服務時,我們以及我們的合作夥伴會使用各種技術收集並儲存某些特定的資訊,包括將一個或多個 Cookie 或匿名識別碼傳送至您的裝置。此外,當您與我們為合作夥伴提供的服務 (例如其他網站顯示的廣告服務或功能) 產生互動時,我們也會使用 Cookie 和匿名識別碼。我們會使用 Google Analytics (分析) 產品收集您的使用資訊及應用程式的流量。搭配廣告服務 (例如採用 DoubleClick Cookie 的服務) 使用時,系統會藉由相關技術,將 Google Analytics (分析) 的資料與多個網站的瀏覽數據相互連結。

兒童線上隱私保護法案

我們的所有兒童類APP及網站產品皆遵守兒童線上隱私保護條款the Children’s Online Privacy Protection Act (“COPPA”),我們不會收集任何未滿13歲兒童的個人資訊,如檢測到年齡小於13歲的相關資訊,我們將及時刪除,不會予以保留或儲存。

隱私政策修改與主管機關的配合

我們會與當地的資料保護機構等適當主管機關合作,並且定期自我審查是否遵守"隱私權政策"。我們也會恪守幾項自律架構。我們收到正式的書面申訴後,會與申訴人聯絡,處理後續事宜。
我們的"隱私權政策"會不時變更。我們不會在未經您明確同意的情況下,即縮減本"隱私權政策"賦予您的權利。隱私權政策變更時一律會在本頁發佈。

第三方網站連結

我們可能會提供從我們網站連結或連結到第三方網站的服務,但對第三方網站的隱私權做法或內容,我們不予以干涉及負責。另外誠懇的提醒使用者在使用第三方服務時一定確認自己的隱私權相關訊息。

2015年11月11日 星期三

Drupal 上傳檔案到AWS S3上的方法(Upload File to AWS S3 From Drupal)

1.先在Drupal 安裝兩個Modules

     1.S3 File System (https://www.drupal.org/project/s3fs)
     2.Libraries API (https://www.drupal.org/project/libraries)

2.安裝AWS SDK for PHP 2.x library

     1.下載AWS SDK for PHP 2.x library的zip檔 (不能下載3.x版本會有問題)
     下載參考網址:https://github.com/aws/aws-sdk-php/releases
     目前是下載Version 2.8.23版的zip檔(aws.zip)

     2.解壓縮aws.zip檔到drupal的sites/all/libraries/awssdk2的路徑下。
          *可以先在local環境解壓縮再上傳。也可以將zip檔上傳後用命令模式(如ssh)去解壓縮(使用tar) 。例如 tar xvf filename.tar

3.設定S3 File System


     1.到「設定(setting)」/ 「媒體(media)」/ S3 File System來設定與AWS S3連線的設定。如圖:


    2.進入S3 File System後先設定 「S3 Bucket Name」與「S3 Region」。然後展開「 顯示AMAZON WEB SERVICES CREDENTIALS」來設定 「Amazon Web Services Access Key」,「Amazon Web Services Secret Key」。如圖:


4.設定drupal內容類型的圖片或是檔案欄位 上載目的地為s3 file system

如下圖所示
















設定完後就可以測試啦!!!

測試結果:





* Drupal版本:7.37

2015年7月16日 星期四

當Drupal時出現Mysql has gone away的問題時怎麼處理

這兩天Drupal出現問題剛開始時是想要新增Content type時出現這樣的畫面
  
不知道該如何解決時都執行幾次後,整個Drupal竟然沒法進入了。會出現下面這個畫面:


上網爬了很久幾乎都是說要增加mysql的max_allowed_packet到16M以上及加大php的memory limit size。

那就把AWS EC2上的設定改一下囉(我的Drupal 是裝在EC2上)。
先來修改mysql的設定吧。
sudo vim /etc/my.cnf

按 i 輸入以下文字

[mysqld]
max_allowed_packet = 64M

然後按下esc後輸入:wq存檔離開
重新啟動 mysql

sudo service mysqld stop
sudo service mysqld start

但是發現drupal 可以進入了不會出現Additional uncaught exception thrown while handling exception的錯誤但是還是不能新增Content type。
只好改 max_allowed_packet =256M

並一起修改php memory limit
sudo vim /etc/php.ini
找到memory_limit按i輸入修改為
memory_limit = 256M
然後按下esc後輸入:wq存檔離開

重新啟動apache跟mysql
sudo service httpd stop
sudo service httpd start
sudo service mysqld stop
sudo service mysqld start

終於可以成功進入drupal 並新增content type了。
進入後終於找到元兇了.......
因為我之前有安裝過token這個module。

token module 是個需要很大memory的一個模組如果沒有需要的話就關閉好了。


註:後來發現網路上也有一篇再說這個問題的討論,裡面說是auto_nodetitle 這個module照成上述問題的,內有提供兩個patch檔,用來配合修改一下auto_nodetitlle.module後,這個問題應該算是解決了。

https://www.drupal.org/node/1391706