ばか女の技術ブログ

大阪のばかすぎる女子プログラマーがばかな知識を載せていくばか向けばかブログです。

CakePHP利用 Google Spread Sheetsとの連携でSSLエラーになる問題が解決しました。

 

PHP と Sheets API を利用して Google Spread Sheets を操作する方法 — さめたすたすのお家

 

上記のサイトを参考にGoogle Spread Sheetsとの連携をCakePHPを利用してコーディングしていたところ、

実行時以下のようなエラーが発生しました。

 

cURL error 60: SSL certificate problem: unable to get local issuer certificate

 

 

 

google翻訳機にかけた↓

 

cURLエラー60:SSL証明書の問題:ローカル発行者証明書を取得できません

 

というエラーらしい。

ほんとむり。リスカしよ。と思ったけどバカなりに頑張りましてどうにかなりました。

 

 

 

調べてみてわかった原因

WindowsPHPではcurlを使って通信する際、CA証明書がないというエラーが起こることがあるらしい(PHP5.5以降がなるらしい?ちなみに今回使用していたのはPHP5.6でした)

Windows 上で cURL を使うと、SSL サイトで証明書の検証に失敗することがあるらしい

 

 

とりあえずwindowsphp側の問題のようですね。

 

 

いろいろ試行錯誤し一応解決はしたので載せておきます。

ローカルのテスト環境などで開発している方の参考になりますように。

 

 

※なぜ解決したのかは私がばかゆえによくわかっていません!

 

 

1.SSLの認証情報をインターネットから取得してきます。

http://curl.haxx.se/ca/cacert.pem

↑ここからダウンロードできます。

 

 

2.1でダウンロードしたファイルをphp\extras\ssl配下に格納します。

私の場合はC:\xampp\php\extras\sslでした。

 

 

3.php.iniに以下のソースを追加します。


[cURL]
curl.cainfo = "2で格納したファイルのパス"
openssl.cafile = "2で格納したファイルのパス"

 

私の場合

[cURL]
curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
openssl.cafile = "C:\xampp\php\extras\ssl\cacert.pem"

ですね。

 

 

4.処理を行うPHP側に以下文を追加します。

 

$client->setHttpClient(new GuzzleHttp\Client(array('verify' => false)));

 

私の場合は

$client = new Google_Client();

$service = new Google_Service_Sheets($client);

の間に今回は記述しました。

 

ClientがcURLを叩く際に証明書の検証はデフォルトでオンになっているので、

それを回避できる書き方だそうです。

これを書いたら回避できた時点でphp.iniの記述いらんかったんじゃないかって思ってる。

検証はしてない。

 

 

5.通常通り処理を実行します!

ぱらっぱっぱっぱー

動くはずです!

おめでとうございます❀

 

 

以下参考にしたサイト様たち…

 

頭が悪い人向け Google Spread Sheets と CakePHPの連携①

頭悪い人向けの記事がなさすぎてむかついたので書いとく。

ほんと一生HTMLとCSSで生きていきたいんですけど神様。。。

あとわかりたいのはjavascriptしかないです神様。。。

 

前提

以下がすでに行われているという前提でやっていきます。

CakePHPはインストールされている

・サーバー(Apache)やローカルDBなどは用意されている

・ネットつながーる

・ローカルでの操作である

 

 

全体的な流れ

1.Google側での前準備

  ①Google API Console にプロジェクト追加

  ②認証情報の作成

  ③スプレッドシートへの共有設定

  ④APIの有効化

2.コンポ―サーインストール

3.PHPGoogle API クライアントライブラリをComposer経由でインストール

4.CakePHP実装(Googleスプレッドシート連携コンポーネントの作成)

 

 

ここでまさかの決断ですが、1は飛ばして2から書きます。

この時点で公開する勇気を一旦持ってみることが大事だと思う。

 

 

2.コンポ―サーインストール

ローカル(Windows)の場合、コマンドプロンプトからコンポ―サーをCakePHPのapp配下にインストールする。

 

プロジェクトへのパス\app まで移動

cd C:\【任意のプロジェクトまでのパス】\app

 

以下のコマンドでcomposer.pharをインストール

php -r "readfile('https://getcomposer.org/installer');" | php

 

composer.pharがapp配下に作成されます。

 

3.PHPGoogle API クライアントライブラリをComposer経由でインストール

app配下に格納されているcomposer.jsonを書き換えます。

CakePHPをダウンロードしたときにapp配下には既にcomposer.jsonが作成されているはずです。

 

インストールしたいプラグインによってrequire部分を変更します。

インストールしたいプラグインが複数あるときは増やすだけ。

今回はgoogle-api-php-clientをインストールしたいのでこう書きます。

なんでこの書き方なんかはわからなかったけどこうらしい。


{
"require": {
"google/apiclient": "^2.0",
"他にインストールしたいのがあれば書く": "バージョンを書くとこ"
}
}


 

以下のコマンドをcomposer.pharを格納しているディレクトリ内で実行します。

インストールしたかったプラグインがインストールされます。よかった~。

(composer.jsonを実行するコマンド)

php composer.phar install

 

これでPHPファイルからgoogle-api-php-clientを呼び出せるようになりました。

なのでスプレッドシートを操作する準備は整ったといっても過言ではない!

 

 

次回以降 CakePHPの実装にすすみます。

 

 

任意のデータ型 T の要素ってのがよくわからん。

List クラスの新しいインスタンスを作成します。

リストには任意のデータ型 T の要素を保持できます。。。。

 

リストには任意のデータ型 T の要素を。。。

 

任意のデータ型 T の要素ってなんや。。。

 

データ型書いたらええんか。。。

 

わからぬ。。。

 

 

Salesforceを勉強する。5日目

 

1日目の次に急に5日目になる。

 

 

なぜなら

 

 

 

上司『APEXで外部アプリケーションとSalesforceを連携したいんだよね』

 

私『おめでとうございます。おつかれさまです。』

 

上司『つまりAPEXで外部アプリケーションとSalesforceを連携するところを作ってほしいんだよね。できるよね。』

 

私『できません。APEXってなんですかSalesforceってなん』

 

上司『よろしくね。それがお仕事だからね。』

 

 

 

で急にAPEXを使ってガリガリ書くことになったからです。

もういやです。

 

2日目~4日目はもっと基礎的なとこ書きたいので

後日書くという言い訳をして

 

 

さて、これがお仕事なのでやっていきましょう。

 

 

 

まずAPEXとは

salesforceの開発言語です。

ほぼjavaらしいです。

ワタシjavaアンマリツカッタコトナイCakePHPガスキスキスキ。。。

 

どうやって開発すんの??

まずsalesforceのソースをとってこよう

用意するのは

  • MavensMate
  • Sublime Text3(Package ControlでMavensMateot落としてきてね)

だよーん

 

上記2つのアプリを使って

自身のsalesforce環境を落としてきましょう。

 

本番環境じゃなくて

sandboxっていう本番環境コピーした開発環境がすぐ作れて便利!

だからそっちとまずつなげてねーーーー。

 

 

とりあえず書こう!

Apexの概要について参考になるサイトページ

developer.salesforce.com

 

ふむふむ拡張子は.clsで

classes フォルダにApexクラスを格納していくのね。

 

 

ではではさっそく簡単な処理を書いていこう。

 

お、こんなところにすごく便利なtrailheadはっけん。

trailhead.salesforce.com

 

これの最後にハンズオンのチャレンジがあるのでやってみました。

ちょっと理解した気になれるのでどうでしょうか。

 

でもなぜかハンズオンのチャレンジだけ英語のままだったので

日本語に訳してみたよ!↓

 

string型の('Test 0', 'Test 1', ...)が格納された配列を返却する

APEXクラスを作ってください。

配列内のデータ数は引数によって設定するようにしてください。

 

  1. StringArrayTestというpublicなAPEXクラスを作ってください。
  2. StringArrayTestにはpublicなstaticのgenerateStringArrayというメソッドをもたせてください。
  3. generateStringArrayメソッドはstring型の配列を返却するようにしてください。各文字列は、 'Test n'の形式で値を持たなければなりません。ここで、nは配列内の現在の文字列のインデックスです。返却される配列の文字列の数は、 generateStringArrayメソッドのinteger型引数によって指定されるようにしてください。

 

レッツチャレンジです!

 

 

本当にしたい機能を作っていこう

今回やりたいのは

外部アプリケーション→salesforce→外部アプリケーション

です。

 

詳しく書くと

 

外部アプリケーションでデータ取得のボタンをクリック

salesforceの処理呼び出し

salesforceの処理内でsalesforceで使用してるデータを取得

取得したデータを外部アプリケーションに返却

 

がしたい!

 

 

REST APIでやっていきます。

REST APIは調べたけどよくわかんなかった(ばかすぎ)

RESTの原則に沿ったAPIってなんや

とりあえずHTTPのGETやPOST使ってウェイって感じのやつと理解した

 

Apex REST アノテーション

ってのがsalesforceにはあるらしいぞな。

 

 

 この

を使っていくぜうぇい

 

 

やり方としては

 

 

①外部アプリケーションでsalesforceにhttpリクエストする

 

salesforceのソースに新しいファイル作る

 

③②に処理を書いていく。

 

④①のリクエストURLを②③の場所に合わせる

 

 

確認の方法は

 

ログを吐いて開発者コンソール

system.debug(なんたらかんたら);

 

 

ダオ作ってコントローラ作って

viewが外部アプリケーションないめーじ

 

DAOはDB関連の処理をまとめたものだよん。

 

 

ここで参考にしたページ

 

developer.salesforce.com

tyoshikawa1106.hatenablog.com


 

すごい!

めっちゃわかりやすい例がそのまま載ってやがるぜ!

ネットってめっちゃ便利やな!

 

 

ばかなので本当に1つずつ理解していきます。

 

@RestResource(urlMapping='/Account/*')

⇒RESTアノテーションの宣言

アノテーションは日本語で注釈、注記といった意味。

REST APIでこのクラスの処理は実行するんですよ~っていう注意書きをします。

REST APIで指定されるURLもここでわかるようになるね~便利ね~

 

@HttpDelete

@HttpGet

@HttpPost

⇒これもRESTアノテーションの宣言

削除要求かゲットかポストか呼び出し元がどうしてるかわかるように

注意書きしてるよん

 

global with sharing class

⇒global はアプリケーション外からもアクセスOKにするとき使う識別子みたいですね。通常はprivate / protected / publicで良いということかな。

とりあえず今回は外部アプリケーションから呼び出すのでglobalですね!

よしわかった!

 

…しかし、んん?with sharing??

 

この疑問を解決してくれているのがここ!

blog.flect.co.jp

 

なるほどwithだと権限がないユーザーがこのクラス読み込んでも

データ参照できないのね!!!

逆にwithoutだと権限関係なくデータもってこれるのね!!

(間違ってたらめっちゃごめんなさい)

 

もはや独り言と化してますが理解した

 

 

あとは普通に書き書きしてるだけかと思いきや謎のコンストラクタ発見

RestRequest

RestResponse

 

ちなみにコンストラクタとは・・・

http://wa3.i-3-i.info/word13646.html

このサイトが死ぬほど初心者むけだから自分のためにメモ

 

とりあえずリクエストデータは

RestRequest req = RestContext.request;

レスポンスデータは

RestResponse res = RestContext.response;

に入れてつかえばええんね!

 

 

 

次回!城乃内死す!

デュエルスタンバイ!!!!!

 (そして唐突におわる)

 

 

 

salesforce 認定admin取得に向けて①__権限

 

認定adminの取得を目標としているので

社内でもおべんきょーしております。

 

今日は一番重要な権限まわりのおべんきょしたので

頭の整理のためにつらつら書いていこうかと

おもうております。(こんなバカなまとめ誰も参考にしませんように)

 

-- ここでちょっとしたひとりごと --

権限と聞くと難しいこと考えちゃって

データベースにアクセスできるIPはこれだとか

ファイルにアクセスできるlinuxパーミッションとかchmodとか

あっち系の話かと思ってたばかなんですが違いました。

 

はじめに

まずSalesforceで権限を設定しましょう!というときすることは

 

・プロファイルを作る

 ・組織の共有設定を非公開にする

 

この2つ!

 

プロファイルとは

ユーザに対して1アカウントに1つひもづけられる権限のやーつです。

 

たとえば社員情報管理アプリをsalesforceで作ったとします。

この社員情報管理アプリを使用するユーザーは

人事部

 - Aさん Bさん

管理部

 - Cさん

 

の3人です。

 

ここで

人事部のAさんBさんは社員情報の参照のみできて

管理部のCさんは社員情報の参照も書き込みもできる

みたいな設定をしたいとします。

 

そんなときプロファイルはこの

人事部・管理部の名前で作ります。

 

そして

人事部プロファイルのカスタムオブジェクト権限設定から

社員情報の参照のみにチェック

管理部プロファイルのカスタムオブジェクト権限設定から

社員情報の参照・作成・編集・削除をチェック

 

これでやりたいことができるようになります!!

 

オブジェクトに対して色々権限設定したいときは

プロファイル作ればいいって考えればいいよ♪

 

って私のイケメン上司は言っていました。

ということで責任を上司に丸投げしていくスタイルで

このブログは書いていこうと思います。イケメンだし。

 

組織の共有設定とは

レコードに対して個別に設定できる権限のやーつです。

 

これ設定すると

大阪と東京のデータが混在しているとき

大阪の部署には大阪に所属している人のみのデータ

東京の部署には東京に所属している人のみのデータ

を参照できるようにする

 

的なことができるようになります。(できる×できる)

 

これ結構最初わけわからんやつでした。

 

百聞は一見にしかずでまず

設定→クイック検索で「共有設定」を探してみそみそ。

 

組織の共有設定から

まず対象のレコードを探します!

そして内部アクセス権も外部アクセス権も非公開に!

 

とりあえずsalesforceさんの権限設定は

公開を非公開にしていくんじゃなくて

非公開を公開にしていく方法が主と考えましょう。

 

 

さらにこまかく設定しようとすると

さらにこまかく設定していくこともできます。

 

  • 項目レベルセキュリティ
  • タブの表示・非表示
  • 権限セット
  • ログインのセキュリティ
  • チーム設定

…などなど

 

 

とりあえずはい、

書くの飽きてきたのでもう終わろうかと思います。

 

 

権限設定 自分流これだけは覚えておこう は以下3点

  • プロファイルと共有設定
  • オブジェクトに対して色々したいときはプロファイル
  • レコードに対して制限かけたいときは共有設定

 

唐突におわる

 

 

 

 

Salesforceを勉強する。1日目

 

Salesforceとかいう素晴らしいシステムを社内で扱うこととなりました。

 

ので

 

数日前からちょっとずつさわり

勉強しております。

 

まずSalesforceとは

 

SFA(Sales Force Automation) = 営業支援システムです。

SaaSです。

インターネットでsalesforceにつないだら、

ボタン操作やリンクのクリックだけで

社内の営業支援システムを構築できる素晴らしい世界No.1シェアサービスです。

機能や利用状況によってお金を払う仕組み。

 

間違えていたのですがただたんに顧客管理システムだとCRMっていうんですね。

バカすぎて3文字のアルファベットは全部同じに見えるからいやです。

 

SFACRMも含まれるって感じです。

だからsalesforceってごいすーーーです、たぶん。

 

 

 あとsaleseforceは正式には会社名というかひっくるめた名前で

いろいろな種類の製品があります~

  • Sales Cloud
  • Sales & Service
  • Service Cloud
  • Marketing Cloud
  • Salesforce Platform
  • Quip
  • Community Cloud
  • Einstein Analytics
  • Salesforce CPQ
  • Pardot
  • Success Plan
  • もう書きたくない

 

主にたぶん使ったりかかわったりするのは

かなと思います。私の会社は少なくともこの2つです。

 

2つとも同じことが大体できますけど

元から備わってるもの と 使用料金 が異なります。

 

カスタマイズせんで使えるのがSales Cloud

その分料金は高いし、

会社独自のシステムとしてカスタマイズするのは向いてないイメージ。

 

カスタマイズばりばりしたいんやったらSalesforce Platform

料金は安いしカスタマイズするのに向いてます。

 

でも使えるんやったらSales Cloudを使った方がいい

そんな感じ。

 

 

そして唐突におわる。

 

 

システムもPCもプログラムもキライですが技術ブログをはじめてみます。

はじめまして。

 

システムもPCもプログラムもキライですし

ITなんてニュースやネットで知って

 

わぁすごーい

みらーい

なんかすごいみらーい

 

って思うだけで満足だったのですが

なぜか今プログラマーしているし

色々バカすぎてついてけないし

何度も検索しててほんとバカだなって思うので

技術??ブログ??

はじめてみます。

 

よろしくお願いします。