読者です 読者をやめる 読者になる 読者になる

Code Day's Night

ichikawayのブログ

ZOHO APIからデータを更新する方法

ZOHO APIからデータを更新する方法の紹介です。
今回は、PotentialsというZOHO CRMの種類のレコードを更新します。

まずはじめに、APIを使うためのチケットを発行します。
下記のURLに必要なEmail IDとPasswordを入れてブラウザでアクセスすればチケットとよばれる認証キーが発行されます。

    https://accounts.zoho.com/apiauthtoken/nb/create?SCOPE=ZohoCRM/crmapi&EMAIL_ID=hoge@example.com&PASSWORD=xxxxxx&DISPLAY_NAME="testmode1"
    

レコード情報の取得

認証キーが発行されたら、更新の前にまずはレコードが取得できるか試してみましょう。

https://crm.zoho.com/crm/private/xml/Potentials/getRecords?authtoken=aaaaaaaaaaaaaaaaaaaaaaaaaaaaa&scope=crmapi

このauthtokenに先ほど発行されたキーをセットすると、Potentialsのレコードが取得できます。Potentialsを使ってない場合は、使っているLeadsやContacts、Productsなどに変更してください。


レコードの更新

最後に、レコードを更新します。更新するキーと値をxml形式で送ります。(なぜかGETリクエストで送って更新・・)

https://crm.zoho.com/crm/private/xml/Potentials/updateRecords?newFormat=1&authtoken=aaaaaaaaaaaaaaaaa&scope=crmapi&id=123456789&xmlData=<Potentials><row no="1"><FL val="キー">更新したい値</FL></row></Potentials>

updateRecordsというAPIを使って更新します。セットするパラメータは、

  • authtoken: 認証キー
  • id: レコードのID
  • xmlData: 更新用のXML

xmlDataにセットしているのは、

<Potentials>
  <row no="1">
    <FL val="キー">更新したい値</FL>
  </row>
</Potentials>

というようなXMLです。Potentialsの情報でval="キー"というカラムの値を更新します。

更新は差分で更新されるので、該当レコードの他のカラムには影響しません。

重要なのは、idで該当レコードIDを指定して、更新XMLを送ることです。

ZOHO APIマニュアルに詳しいことは書いてありますが、サンプルURLの幾つかにidパラメータが入っていない記述ミスがありますのでご注意ください。

www.zoho.com

 

PHPに関するHTTPOXY脆弱性の問題と対応方法

外部から簡単にHTTP_PROXYという環境変数がセットでき、サーバ間通信や外部サイトと連携している場合に影響があるかもしれない脆弱性です。(HTTPoxy. CVE-2016-5385)

PHPの場合はphp-fpm, mod_php, Guzzle4以上やいくつかのライブラリで影響あります。

対応方法は簡単です。


Apache側で対応する場合は、mod_headerを使える状況であれば、confファイルに下記の1行を追加。

RequestHeader unset Proxy


FastCGIの場合は下記の1行を追加。

fastcgi_param HTTP_PROXY "";


Guzzleは6.2.1で対応されたようです。
Release 6.2.1 release · guzzle/guzzle · GitHub
コミットログを見ると、CLIの時のみ、getenv('HTTP_PROXY')を利用するように変更されてますね。
Addressing HTTP_PROXY security vulnerability, CVE-2016-5385 · guzzle/guzzle@9d521b2 · GitHub



問題の原因や、対応方法、再現方法などは下記のサイトが詳しいのでご覧ください。 

httpoxy.org

www.nginx.com

例えば、Guzzle4以上を使っていて外部サイトに裏で通信して何かしようとするときに、HTTP_PROXY環境変数が上書きされてしまうと、そのProxy経由で通信が行われるため、任意のサイトにアクセスさせられたり、中間者攻撃が可能になります。(PHPからの接続先がhttpsで証明書を検証していれば問題ないですが)
この攻撃は簡単にできてしまうため、影響がありそうならすぐに対応しておいたほうが良いです。

 残念ながら、unset($_SERVER['HTTP_PROXY']) putenv('HTTP_PROXY=');としてもgetenv()に影響しないため回避できません。

 

追記1

httpoxyのサイトで示されたように

RequestHeader unset Proxy early

としていましたが、earlyがなくても手元のapacheでは問題なくHTTP_PROXY環境変数がセットされませんでした。earlyは開発者向けのテスト・デバッグ用の設計のようなので、無くしたほうがよいかもしれません。

mod_headers - Apache HTTP サーバ バージョン 2.2

検証方法は、curlコマンドで

curl -H 'Proxy: 127.0.0.1:12345' "http://localhost"

のようにして、Proxyヘッダをセットしてlocalhostのwebサーバに送信。PHP側は、

var_dump($_SERVER['HTTP_PROXY']);
putenv('HTTP_PROXY=');
var_dump(getenv('HTTP_PROXY'));
exit;


のようにして、ヘッダにセットしたProxyが環境変数にセットされているか表示して確認。

MacでPHPをコンパイルする時にzlibがnot foundエラーとなる問題

MacOSX El CapitanでPHPをコンパイルしようとすると、zlib not found(libz not found)のエラーが出てしまいました。

検索すると、xcodeのCommand line toolsをインストールする必要があって、

xcode-select --install

とすればダイアログが立ち上がってインストールできるとありました。

しかし、何度やってもダウンロードしてインストールが進行したところで、ダウンロードエラーが出て止まってしまいます。

そこで

sudo xcode-select --install

としたところインストールが無事完了しました。めでたし。

sudoを付けたのが影響したのか、何度かインストールにトライして偶然いけたのかは不明です。

Unix考古学を読んで遠い昔に思いを馳せる

書籍

3年ほど前に「Unixという考え方」という本を読んで感銘を受けたので、最近話題になってたUnix考古学も読んでみました。これは非常に面白く、早く先を読みたいと思う本でした。

1960年から1990年ぐらいまでのUnixの歴史が、数多くの参考文献やメモを掘り起こし、整理して、たまに著者の推測も入りながら書かれている本です。 当時の政治などの時代背景も書いてあるのが良いです。

Unixの初期はAT&Tが独占禁止法で通信分野以外の商売をしてはいけない状態で、AT&Tのベル研究所から研究成果としてUnixが出てきて、開発者の草の根活動なども手伝って普及していく過程、その後BSDなどに派生したり、AT&Tが解体されてUnixを商売として力を入れられるようになっていく過程、ARPAやDARPAによるインターネットの後押しなどなど、今の私たちを支えるUnixやインターネットがたどった道が詳細に書かれていて興奮します。

中に出てくる開発者達が、研究成果を元にどんどん起業していくのは、この当時からアメリカという国はこうなんだなと感じました。


印象に残った箇所

面白かった箇所は多いのですが、印象に残ったものは

「AT&Tで使われているアプリケーションの複雑さを考えれば、アプリケーションを新しいOSに移植するよりも、OSを新しいマシンに移植するほうがより簡単だろう」P.86

当時はマシンベンダーごとに異なるCPUであったり互換性がなかったのでUnixが普及する過程ではポーティング作業が多かったようですが、その結果、様々な環境でUnixが動くようになり、このポータビリティがUnix普及を後押ししました。

アプリケーションを移植するよりもOSを移植するほうが簡単というのはすごいですね。

 

それ以外にも、リントストラップというコマンド名にしたかったが当時は4文字しかコマンド名につかえず、lintというコマンド名になったとか、シェルの中で他のコマンドを呼び出してプロセスフォークすると、当時の非力なマシンを複数人で共有している環境ではフォーク処理時間が問題になり、testコマンドなどはシェルのビルトインコマンドにしたとか。

testコマンドは今でも which test すると、「test: shell built-in command」となっていてビルトインコマンドになってますよね。

 

Unixのソースコード

この本を読んでると、当時のUnixのソースコードはどんなものだったか気になります。下記のサイトでは、過去のUnixのソースコードが可能な限り公開されています。

http://minnie.tuhs.org/cgi-bin/utree.pl

たとえば、4.3BSDのTCPに関するコードはここ。

http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD/usr/src/sys/netinet

 

読みたくなった参考文献

この本は参考文献が非常に多いのも特徴的で、後で読んでみようと思うものありました。

一つが、デニスリッチーとケントンプソンが書いたUnixに関する初めての論文
The UNIX time-sharing system」 です。

もう一つが、ヴィントサーフとロバートカーンが書いたインターネットの構想を書いた論文「A Protocol for Packet Network Communication (May 5, 1974) 」です。

あと、当時の人たちの生態を描いたスティーブンレヴィの小説、ハッカーズも読んでみたいと思います。

 

余談

私が初めて自分のPCにUnixを入れたのは1999年ごろ、FreeBSD 2系を486のPCに入れてネットワークカードもない状態でいじってました。たしかFreeBSDのムック本がCD-ROM付きで出てて、興奮しながら買ってインストールしたのを覚えてます。
ちなみに、私が生まれた年に出たUnixは、「Seventh Edition Unix」でした。どうでもいいですけど。。

そういえば、2009年ぐらいにアメリカのComputer History Museumに行ったのですが、偶然にもPDP-1の実機デモを見せてもらいました。当時のエンジニアがボランティアでPDP-1のメンテナンスをしてて、楽しそうにコンピューターのことを語ってたのが印象的でした。ちなみにPDP-1は動く状態で存在しているのはここにしかないとか。 

 

Unix考古学 Truth of the Legend

Unix考古学 Truth of the Legend

 
UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

 

 

ハッカーズ

ハッカーズ

 

 

 

Gitコマンドで行単位ではなく文字単位の差分表示を手に入れる

git

f:id:ichikaway:20160614182511p:plain

Githubを使っていると、diff表示が行単位ではなく文字単位になってて便利かと思います。手元の端末でも同じようにdiffを文字単位に表示したい時は、diff-highlightというスクリプトを使えばできます。表示は上の画像のようになります。

diff-highlightは、gitの公式リポジトリのcontribディレクトリの中にあって、perlのスクリプトファイルです。

https://github.com/git/git/tree/master/contrib/diff-highlight


一番簡単な設置は、/usr/local/binなどの場所にダウンロードして実行権限を与えればOK。

wget https://raw.githubusercontent.com/git/git/master/contrib/diff-highlight/diff-highlight

chmod 755 diff-highlight

 

軽く試したい時は、

git log -p --color | diff-highlight


すると文字単位のdiff表示になります。

 

diff-highlightにパイプで渡すのが面倒なので、.gitconfigに

    [pager]
	log = diff-highlight | less
	show = diff-highlight | less
	diff = diff-highlight | less

と書いておくと、git log, show ,diffの差分表示でdiff-highlightが適用された形になります。

 

もしgitのバージョンが古くて上記のgitconfigの記載でエラーになる場合は、

[core]
    pager = diff-highlight | less -r

と書いておくと良いかもしれません。