ことさら−古都プログラマーの更級日記

京都でお寺を回りながら御朱印集めをしていたエンジニアのブログ。おもに技術的なはなしとか日常的なはなし。たまにカメラの話や競馬の話も書きます。

python 2 で pip を使ってのの PIL(Pillow)のインストール方法とimportの仕方

環境

pillow(PIL)インストール後

$ python --version
Python 2.7.6

$ pip list
...
Pillow (5.0.0)
...

pipによりPILのインストール

$ sudo pip install pil                                                                                                                                                                                  [master]
Password:
The directory '/Users/yoshiyuki_sakamoto/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/yoshiyuki_sakamoto/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pil
/Library/Python/2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/Library/Python/2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Could not find a version that satisfies the requirement pil (from versions: )
No matching distribution found for pil
/Library/Python/2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning

Pillow(PIL)の使い方例

from PIL import Image

...

プログラミングコンテストとかアルゴリズムとかを学びたい人向けの本3選

僕の古いブログの記事を引用していた以下の記事を見たら、こういうことが書いてあった。

任意の整数を扱う問題が出たら基本的にDP使うんか?

syuntoku14.hatenablog.com

確かにDP(動的計画法: Dymanic Programming)をどのような問題に対して使えばいいかは難しい。

この方はアルゴリズムというよりかは、Pythonの練習をしているようだったが、「アルゴリズムの勉強したいが何していいかよーわからん」という人もいるだろうなーと思った。そこで、僕が読んだことあるアルゴリズムプログラミングコンテストに関する以下の本の簡単な内容と難易度を紹介する。

プログラミングコンテストチャレンジブック

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテスト」と聞いて一番有名な本がこれだろう。表紙が蟻の柄なので「蟻本」と呼ばれていたりする。特徴としては

どちらかというと、本気でプログラミングコンテストで勝ちたい人向けの本で難易度は高めである。アルゴリズムにあまり触れたことがない人は、後述の「最強最速アルゴリズマー養成講座」のほうをオススメする。

最強最速アルゴリズマー養成講座

高橋直大さんという、AtCoder社の社長さんが書かれた本である。表紙がヒョウ柄(チーター柄?)なので「チーター本」などと呼ばれている。

難易度が易しいので、初心者にはまずこの本をオススメしたいのだが、練習問題にtopcoderというところの問題を使っているのが(個人的には)ちょっとマイナス。AOJ(Aizu Online Judge: http://judge.u-aizu.ac.jp/onlinejudge/)に比べるとtopcoderはちょっと使いづらい印象があるので、個人的にはAOJの方が好きだ。*1

注意点としては、難易度はそこまで高くないので、本気で勉強したい人はこちらより「プログラミングコンテストチャレンジブック」をオススメする。

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

これら3冊の本の中では一番新しい本で、AOJ(Aizu Online Judge: http://judge.u-aizu.ac.jp/onlinejudge/)にも関わっている会津大学の渡辺先生が執筆した本である。秋葉さん(プログラミングコンテストチャレンジブックの著者)も参加している。

  • Aizu Online Judge の問題と対応しているため実践しやすい
  • サンプルコードはCまたはC++
  • 難易度もそこまで高くない。

なんといっても、AOJを使う前提の本なので、本を読んでAOJで実践できるし、AOJの使い方が乗っているのもありがたい。新しい本なだけあって、図も多く内容も分かりやすい。「最強最速アルゴリズマー養成講座」だとどうしてもtopcoderのUIなどに慣れるところから始まってしまうが、こちらはそういう面倒臭さもない。難易度も平易なので、ガチの人向けの本ではないが、アルゴリズムを学びたい人にはぴったりだろう。サンプルコードがCまたはC++しかない点だけがちょっとデメリットか。

まとめ

アルゴリズムの勉強を実践的に(実際にコードを書きながら)したいなら、この3冊のどれかになると思う。

かなと思う。一番のオススメは「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」である。是非参考にして欲しい。

番外編

番外編で「世界で闘うプログラミング力を鍛える150問」というのも読んだことあるがあまり内容を覚えていないので紹介だけにしておく。この本はサンプルコードとかは豊富ではないので、やはり上記3冊の方が僕は好きかな。

世界で闘うプログラミング力を鍛える150問 ~トップIT企業のプログラマになるための本~

世界で闘うプログラミング力を鍛える150問 ~トップIT企業のプログラマになるための本~

*1:ちなみに、この本はなにかの連載をそのまま本に落としただけなので、高橋直大先生は「書籍用に書き直して第二版を書きたい」という願望があるらしい。ただ、彼は凄く忙しいのでしばらく第二版は出ないきがしている

中山金杯・京都金杯・フェアリーS・シンザン記念は馬連の払い戻しが5%上乗せ

JRAプレミアムについて

JRAプレミアムというキャンペーンがあります。特定のレースの特定の馬券の払い戻しが増えるとぷキャンペーンです。

2018年 JRAプレミアム 対象レース一覧 JRA

金杯馬連に売上の5%相当を上乗せ

まず、中山金杯京都金杯馬連の払い戻しに、売上の5%相当が上乗せされます。

2018年「金杯馬連」 JRA

通常、馬連は払戻率は77.5%です(参考: 勝馬投票法ごとの払戻率)。つまり、1000円分馬券を勝ったら平均775円返ってくるということです。売上の5%相当が上乗せされるということは、この腹戻し率が5%増えるのとほぼ同じです。つまり、払戻率が82.5%になるということです。通常、払戻率が一番よい単勝でも80%ですので、ここは馬連を買いたいです。

中山金杯京都金杯は是非馬連を狙いたいですね。

春の3歳重賞の馬連に売上の5%相当を上乗せ

これも先程の金杯と同じです。2018年1月7日から5月26日の間に開催される3歳重賞の馬連に5%が上乗せされます。対象レースは下記サイトを御覧ください。

2018年「春の3歳重賞馬連」 JRA

桜花賞皐月賞NHKマイル、オークスなどのG1に加えて、1月7日のフェアリーステークス、1月8日のシンザン記念も対象です。フェアリーステークスシンザン記念もぜひ馬連を狙っていきましょう。

f:id:yoshiki_utakata:20180102195856j:plain

noteをはじめました

試しに、noteというブログのようなサービスをはじめました。しばらくは競馬の予想はこちらで公開していく予定です。

note.mu

ニンテンドーeショップの初売りセールとニンテンドープリペイドカードのセール

ニンテンドーeショップで初売りセールをしているのと、セブンイレブンニンテンドープリペイドカードを買うとポイントが追加で貰えるキャンペーンをやっているので、欲しいソフトをまとめておきます。

topics.nintendo.co.jp

ニンテンドーeショップ

ニンテンドーeショップでソフトが20%〜50%オフで販売しています。2018年1月14日までです。

www.nintendo.co.jp

ただし、普通にAmazonの方が安いソフトもあるっていう...まあ、パッケージがあると邪魔なので、ダウンロード版を買痛いって人向けかもしれません。

個人的に欲しいソフト

タイトル 価格 Amazonでの価格
ファイアーエムブレム Echos 5,378円→3764円(30%OFF) 2,997円(パッケージ版)
ドラゴンクエストIII 1,620円→1,296円(20%OFF) なし

ファイアーエムブレム Echos欲しかったけどAmazonでパッケージ版を買ったほうが安く...。タイトルも55タイトルとそこまで多くはありません。

セブンイレブンプリペイドカード

セブンイレブンニンテンドープリペイドカードを買うと、以下のポイントが追加でもら得ます。

  • 3000円→追加100円
  • 4000円→追加300円
  • 5000円→追加500円

初売りで何か買うならセブンイレブンで買うと良いでしょう。初売りでかわなくてもとりあえずチャージしておくのもいいかもしれません。

PHP5.6からPHP7系にするときに修正した点まとめ

背景

あるプロダクトをPHP5.6からPHP7にアップデートする対応をしたので、その時に修正した点まとめです。あくまでもその時に修正した点をまとめたもので、PHP7での変更点を全てまとめたわけではありません。

また、mysql系関数が廃止される件については、長くなりそうなので機会があれば別でまとめたいと思います。

f:id:yoshiki_utakata:20180101215400j:plain

php7ccを利用したチェック

まずは変更しなければいけない箇所を洗い出すために php7cc を利用します。

php7ccのインストール

composer を使ってphp7ccをインストールします。composerのインストール方法などについては割愛します。

php7ccをグローバルにインストールします。以下のコマンドです。

$ composer global require sstalle/php7cc

これで ~/.composer/vandor/ 以下にphp7ccがインストールされましたので、PATHを通します。僕はzshを使っているので、 ~/.zshrc に以下を追記しました。

export PATH=$PATH:~/.composer/vendor/bin

これでphp7ccコマンドが使えるようになると思います。設定ファイルを読み直します。

$ source ~/.zshrc

php7cc の使い方

以下のコマンドを叩くと、PHP7で使えなくなった箇所をリストアップしてくれます。

$ php7cc <ファイルorディレクトリ>

ファイルを指定するとそのファイルに含まれているPHP7非対応の文法を、ディレクトリを指定するとそのディレクトリの下にあるファイル全てを調べてPHP7非対応の文法をリストアップしてくれます。

> Line 1723: PHP 4 constructors are now deprecated
    function MarkdownExtra_Parser()
    {
    }

> Line 2353: Removed regular expression modifier "e" used
    preg_replace('#(.)#es', '"' . $boundary . '" . str_pad(dechex(ord(substr("\\1", -1))), 2, "0", STR_PAD_LEFT)', $fragment);

赤くなっているのがPHP7非対応の部分です。この部分を修正していく必要があります。

PHP7化にあたり修正が必要だった箇所

  • 古い形式のコンストラクタ
  • 参照渡しnewの削除
  • preg_replace 関数の e 修飾子が使えなくなった
  • String, Int という名前のクラスは定義できなくなった

古い形式のコンストラクタ

PHP4までは以下の形式のコンストラクタを使っていました。

class Human {
    private $age;

    public function Human($age) {
        $this->age = $age
    } 
}

$humane = new Human(25);

しかし、PHP5以降、コンストラクタメソッドは __construct に変更されました。

class Human {
    private $age;

    public function __construct($age) {
        $this->age = $age
    } 
}

PHP 5.6までは互換性のため、PHP4スタイルのコンストラクタが使えていましたが、PHP 7からは古いコンストラクタは使えなくなるため、すべて __construct に置き換える必要があります。

参照渡しnewの削除

参照渡しnewはPHP7から使えなくなりました。以下の様な書き方です。

$human =& new Human(25);

これは単純に&を消してあげるだけで動きます。

$human = new Human(25);

参照だとかポインタだとか面倒なことを考えなくてよくなりました。

preg_replace 関数の e 修飾子が使えなくなった

preg_replace には e 修飾子というものがありました。

<?php

$result = preg_replace('/[a-e]+/e', 'strtoupper("$0")', 'abcdefgHIJ102');
echo $result . "\n";

これの結果は ABCDEfgHIJ102 となります。e修飾子を使うと、第2引数がPHPプログラムとして解釈されます。

  1. 正規表現 [a-e]+abcde がマッチ
  2. abcde の部分が strtoupper("abcde") の結果に置き換えられる
  3. つまり、abcdeABCDE に置き換えられる
  4. ABCDEfgHIJ102 となる

しかしこれは見るからに脆弱性を生みそうなコードです。PHP 5からこの文法は非推奨になる、7で削除されることになりました。PHP 7にバージョンアップするに当たり、preg_replace_callback を利用して書き換える必要があります。

<?php

$result = preg_replace_callback(
    '/[a-e]+/',
    function ($matches) {
        return strtoupper($matches[0]);
    },
    'abcdefgHIJ102'
);
echo $result . "\n";

これで安全にもなります。

参考

String, Int という名前のクラスは定義できなくなった

今までは class Stringclass Int というクラスが定義可能でしたが、PHP7からは定義できなくなりました。クラスとして定義できなくなった名前は以下の通りです。(大文字小文字区別なく定義できなくなりました)

  • bool
  • int
  • float
  • string
  • null
  • true
  • false

また、以下の文字列も将来的に定義できなくなる可能性があるので定義しないほうが無難です。

  • resource
  • object
  • mixed
  • numeric

今回StringやIntといったクラスが定義できなくなったのは、おそらく、stringやintのタイプヒントが可能になった関係だと思います。StringやIntのような名前のクラスを定義している場合はクラス名を変えてやる必要があります。

まとめ

今回は、php7ccのインストール方法と、PHP 7になって使えなくなる機能について一部をまとめました。

PHP 7では、intやstringといったプリミティブ型のタイプヒントを始めとして有用な機能が多数追加されています。また、PHP 5.6も2018年末でサポートが切れますので、以下に上げるマニュアルを参考にしてPHP 7へのバージョンアップの準備を進めていきましょう。

参考