もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

openpyxl(python)とphpSpreadsheet(php)はどっちが使いやすい?

はじめに

こんにちは。

python勉強中の僕です。

pythonでエクセルを操作するのに使用するツールに openpyxlというのがあるらしいです。

読み方はなんていうんですかね? おーぷんぱいくる?

phpでは、自分はよくPHPExcelを使用していたのですが、これって一体どっちが使いやすいんだろうなー?と、興味が湧いたので、確認してみました。

ちなみに、現在PHPExcelはDEPRECATEDになっているため後継版のPHPSpreadsheetで試してみます。

サンプルのエクセルは、自分が先程まで読んでた、退屈なことはPythonにやらせようで紹介されていたサンプルエクセルを使います。

サンプルエクセル

環境

php

$ php -v
PHP 7.1.5 (cli) (built: May 22 2017 00:14:43) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.5, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.3, Copyright (c) 2002-2017, by Derick Rethans

python

$ python --version
Python 3.6.0 :: Anaconda 4.3.1 (x86_64)

事前準備

全体

$ mkdir excel_test
$ mkdir excel_test/php
$ mkdir excel_test/python

php

$ cd excel_test/php
$ composer require phpoffice/phpspreadsheet 

python

$ pip install openpyxl

読み込みのチェック

以下のサンプルデータを使います。

f:id:kojirooooocks:20180227011410p:plain

php

プログラム

<?php
require("vendor/autoload.php");

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;

// ファイル読み込み
$reader      = new Reader();
$spreadsheet = $reader->load('./excel/example.xlsx');

// アクティブなシートから全データを取得
$data = $spreadsheet->getActiveSheet()->toArray();

// 表示
foreach ($data as $val) {
    echo $val[0] . "\t" . $val[1] . "\t" . $val[2] . "\n";
}

実行

$ php php/read.php 
4/5/2015 13:34 Apples  73
4/5/2015 3:41  Cherries    85
4/6/2015 12:46 Pears   14
4/8/2015 8:59  Oranges 52
4/10/2015 2:07 Apples  152
4/10/2015 18:10    Bananas 23
4/10/2015 2:40 Strawberries    98

python

プログラム

import openpyxl

# ファイル読み込み
workbook = openpyxl.load_workbook('./excel/example.xlsx')

# データを表示
for row in workbook.active:
    print(row[0].value, row[1].value, row[2].value, sep="\t")

実行

$ python python/read.py 
2015-04-05 13:34:02 Apples  73
2015-04-05 03:41:23 Cherries    85
2015-04-06 12:46:51 Pears   14
2015-04-08 08:59:43 Oranges 52
2015-04-10 02:07:00 Apples  152
2015-04-10 18:10:37 Bananas 23
2015-04-10 02:40:46 Strawberries    98

コード量は当然pythonのほうが短いですが、処理速度はphpの圧勝でした(体感ぜんぜん違う)

php7ではなくphp5系でやるとどうなるかもチェックしてみます。

$ phpenv install 5.6.9
...
..
.
[Success]: Built 5.6.9 successfully.

$ phpenv local 5.6.9
$ php -v
PHP 5.6.9 (cli) (built: Feb 27 2018 00:47:13) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.5.3, Copyright (c) 2002-2017, by Derick Rethans
    
$ php php/read.php 
4/5/2015 13:34 Apples  73
4/5/2015 3:41  Cherries    85
4/6/2015 12:46 Pears   14
4/8/2015 8:59  Oranges 52
4/10/2015 2:07 Apples  152
4/10/2015 18:10    Bananas 23
4/10/2015 2:40 Strawberries    98

実行してみるとやっぱり早いです。phpexcelはすごく遅い印象だったので、phpSpreadsheetの性能がいいのかな?

書き込みチェック

サンプルのエクセルと同じものを作成して、最後の行に、sumで合計値を追加したいと思います。

php

プログラム

<?php
require("vendor/autoload.php");

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;

// 新規スプレットシートとしてnew
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// サンプルのエクセル通りにデータを作る
$sheet->setCellValue('A1', '2015/4/5 13:34');
$sheet->setCellValue('A2', '2015/4/5 3:41');
$sheet->setCellValue('A3', '2015/4/6 12:46');
$sheet->setCellValue('A4', '2015/4/8 8:59');
$sheet->setCellValue('A5', '2015/4/10 2:07');
$sheet->setCellValue('A6', '2015/4/10 18:10');
$sheet->setCellValue('A7', '2015/4/10 2:40');
$sheet->setCellValue('B1', 'Apples');
$sheet->setCellValue('B2', 'Cherries');
$sheet->setCellValue('B3', 'Pears');
$sheet->setCellValue('B4', 'Oranges');
$sheet->setCellValue('B5', 'Apples');
$sheet->setCellValue('B6', 'Bananas');
$sheet->setCellValue('B7', 'Strawberries');
$sheet->setCellValue('C1', 73);
$sheet->setCellValue('C2', 85);
$sheet->setCellValue('C3', 14);
$sheet->setCellValue('C4', 52);
$sheet->setCellValue('C5', 152);
$sheet->setCellValue('C6', 23);
$sheet->setCellValue('C7', 98);

// 最後の行にC列のSUM情報を追加する
$sheet->setCellValue('C8', '=SUM(C1:C7)');

// 保存
$writer = new Writer($spreadsheet);
$writer->save('./excel/php_write.xlsx');

実行

$ php php/write.php

f:id:kojirooooocks:20180227011457p:plain

f:id:kojirooooocks:20180227011510p:plain

問題なし!

python

プログラム

import openpyxl

# 新規スプレットシートとして取得
workbook = openpyxl.Workbook()
sheet    = workbook.active

# サンプルのエクセル通りにデータを作る
sheet['A1'] = '2015/4/5 13:34'
sheet['A2'] = '2015/4/5 3:41'
sheet['A3'] = '2015/4/6 12:46'
sheet['A4'] = '2015/4/8 8:59'
sheet['A5'] = '2015/4/10 2:07'
sheet['A6'] = '2015/4/10 18:10'
sheet['A7'] = '2015/4/10 2:40'
sheet['B1'] = 'Apples'
sheet['B2'] = 'Cherries'
sheet['B3'] = 'Pears'
sheet['B4'] = 'Oranges'
sheet['B5'] = 'Apples'
sheet['B6'] = 'Bananas'
sheet['B7'] = 'Strawberries'
sheet['C1'] = 73
sheet['C2'] = 85
sheet['C3'] = 14
sheet['C4'] = 52
sheet['C5'] = 152
sheet['C6'] = 23
sheet['C7'] = 98

# 最後の行にC列のSUM情報を追加する
sheet['C8'] = '=SUM(C1:C7)'

# 保存
workbook.save('./excel/python_write.xlsx')

実行

$ python python/write.py

f:id:kojirooooocks:20180227011532p:plain

f:id:kojirooooocks:20180227011545p:plain

こっちも問題なし。

書き込みに関しては、そこまで速度の違いはなかったようでした。

終わりに

所感としては、やっぱりpythonのほうがスッキリ書けます。この辺は言語の違いですよね。

まぁこんな簡単なエクセルだと、はっきりとどっちが使いやすいっていうのは、いいにくいですよね。。。

でも、今回はopenpyxlもphpSpreadsheetもどちらも触れたので、とても勉強になりました。

しょうもないですが、これもgithubあげときますー。

yudaifujita0121/excel_tool_check_php_python_sample

ではでは。

退屈なことはPythonにやらせようを読んでpython勉強した(パート2 python基礎編続き)

こんにちは。

結構間があいちゃいましたが、ちゃんと諦めず読んどります。

今回は、正規表現やファイルの読み書き、ファイル操作あたりの基礎編でした。

普段自分が使用しているphpとほぼほぼ変わりない動きをするものだらけでしたので、パラパラと読み進めていきましたが、その中でも、勉強になったなー、おもしろいなーと思ったところを、記事として残しておこうとお思います。

勉強になったところ

os.path.join()

windwosでもmac/linuxでもディレクトリセパレータを気にせず書けるためのものです。

import os
path = os.path.join('', 'Users', 'kojirock', 'project')
print(path)

>>> Users/kojirock/project

頭に/をつけたい場合はどうせばよいのかなーと思って調べてたんですが、os.path.sep を使えば良いみたいです。

import os
path = os.path.sep + os.path.join('Users', 'kojirock', 'project')
print(path)

>>> /Users/kojirock/project

shelveモジュール

shelveは、データをバイナリファイルで保存したり、取り出したりできるものです。

# 保存
import shelve
shelf_file = shelve.open('data')
movie_title = ['アニマルプラネット', '海底鬼岩城']
shelf_file['movie_titles'] = movie_title
shelf_file.close()


# 呼び出し
shelf_file = shelve.open('data')
print(shelf_file['movie_titles'])

>>> ['アニマルプラネット', '海底鬼岩城']

↑の例だとカレントディレクトリにdata.dbというファイルでバイナリファイルが保存されます。

webサービスだと、RDB的なのに保存すると思うのですが、これはライブラリ的ものを作った時に使用するのかな?

shutil.rmtree()

引数に指定したパス以下のディレクトリ・ファイルを再帰的に削除します。

# ディレクトリとファイル作成
import os
os.mkdir('test')
for i in range(5):
    open('test/' + str(i + 1) + '.txt', 'w')
print(os.path.exists('test'))
print(os.listdir('test'))

>>> True
>>> ['5.txt', '4.txt', '3.txt', '2.txt', '1.txt']

# ファイル削除
import shutil
shutil.rmtree('test')
print(os.path.exists('test'))

>>> False

強制的に消すので rm -rf 的な感じですかね。

phpではrmtreeと同義の標準関数はないと思うので、exec('rm -rf /path/to') できな感じでやるしかないと思います。

怖いけど面白い機能でした。

raise

pythonで例外を起こす命令文です。phpのthrow的なノリだと思います。

name = 'ドラえもん'

if not name == 'のび太くん':
  raise Exception('のび太くんじゃないじゃない!')
  
>>> Exception: のび太くんじゃないじゃない!

終わりに

今回はパラパラーと読み進めてしまったのですが、正規表現・ファイルの読み書きあたりでこれはpython独自だぜ!っていうのがあればぜひ教えてください。

次回からは、応用 ではでは。

自主勉強しない『社員』に対して会社は何をしてあげられるのか。(答えはでてない)

こんばんは。

クレイジージャーニーのDVD全5巻を一気に見て、今週全く勉強しなかった僕です。

勉強できてないので、とりあえず今日は気になったことをブログにしてみようと思いました。

僕の中でもまとまってないんで、とっちらかっちゃう内容になること必死です。ご了承ください。

blog.tinect.jp

今週↑の記事を見つけました。

(内容は記事を見て確認してもらいたいです)

記事を読んだ瞬間の僕の感想は、

(こんなのは甘えだな。疲れているとかいうのは言い訳で、ただ趣味のことに時間使ってるんだろうな。エンジニアなんだったら、家帰って勉強しろよ!言ってくれる会社はすごくいいところだ!)

という感想でした。

まぁ、今回僕はクレイジージャーニー観まくってて勉強しなかったわけですが。。。

フリーランスとして働いている状況である僕からいうと、日々の勉強ってとても大事なことなので、こんな感想になったのかもしれません。

そして、この記事を奥さんに共有して、

「これどう思う?やっぱ勉強しないとダメだよね!この上司の人が言ってる事めっちゃ分かるわー」

と、鼻息荒くしながら話しました。すると、

「業務外に勉強を強いてくる会社ってブラックだよね」

と言われました。

なるほど。。。と納得してしまいました。

確かに、エンジニアやデザイナーなど、クリエイティブな仕事をしている人にとって、自己研鑽はとても大事な時間です。

自己研鑽の積み上げが自分の給料に直結しているともいえます。

この記事の言い方では、勉強しろ!と強要しているわけではないですが、会社が業務外使って勉強しないとダメだぞ!と細かくいってくるのは、確かに違うなと気付かされました。

明らかに足を引っ張っているという現実はあるものの、業務後の活動は個人の自由であり、企業は強制できない。

ただ、web開発であれなんであれ、チームで仕事している以上、個人の自由だからとバッサリ切ってしまう訳にも行きません。

そうなると、会社はそういった人たちに対してなにをすべきなんでしょうか。

やる気のない当人を救いつつ、かつ、やる気のある人たちに不公平感を出させないやり方。

うーーーん。

思いつかない。

やる気のない人をやる気にさせる方法って難しいですね。

リーダーって大変。

と、思った今日この頃でした。

Pythonで縦書き文字を画像合成してみた

参考サイト

PIL 1.1.7 で日本語縦書き描画を頑張る

前書き

こんにちは。

最近phpよりpython触ってる僕です。

php案件もそうですが、python案件やってみたい今日このごろです。

今回は仕事で、縦書きの文字の画像合成を携わったので記事にしておきます。

正直参考サイトに乗せていることをやっただけなので、参考サイトの記事を拝見すれば全てわかってしまいますが、とりあえず自分のために乗せておきます。

ちなみに参考サイトの記事は非常に分かりやすい内容でした。

自分の拙い文章で伝わらない場合は是非参考サイトの記事をご覧ください。

縦書きフォント作成

参考サイトで紹介されているサブセットフォントメーカーShift JIS に含まれる文字の一覧を使用して、縦書きフォントを作成します。

1. サブセットフォントメーカを起動

コチラからダウンロードして、起動します。

f:id:kojirooooocks:20180219224316p:plain

2. 作成元フォントファイルを指定

今回は「インストール済みフォントを参照」を選択します。

f:id:kojirooooocks:20180219224352p:plain

選択すると以下のような選択できる表示になります。

今回はこの中から凸版文久明朝 Regulerを選択します。

f:id:kojirooooocks:20180219224435p:plain

3. 作成後フォントファイルを指定

保存先ファイルのパスを指定します。

4. フォントに格納する文字を指定

以下のように、指定フィールドに、コチラの「Shift JIS に含まれる文字の一覧」の中身をコピペします。

f:id:kojirooooocks:20180219224646p:plain

5. 文字組方向を選択

縦書きで指定します。

6. 作成開始

作成開始ボタンを実行すると、すぐに作成されます。

f:id:kojirooooocks:20180219224714p:plain

縦書き用スクリプト作成

下準備としてpythonの画像処理ライブラリであるPillow(PIL)をインストールします。

$ pip install pillow

で、スクリプトは以下の感じです。

function.py

# coding: utf-8
from PIL import ImageFont, ImageDraw

def draw_text(frame_image, font_size, font_file_path, target_string, draw_start_x, draw_start_y, font_color='#ffffff'):
    """
    テキストの縦書き描画
    :param frame_image        Image:  フレームのImageオブジェクト
    :param font_size          int:    フォントサイズ
    :param font_file_path     string: OTFファイルまでのパス
    :param target_string      string: 対象の文字列
    :param draw_start_x       int:    描画開始位置_X
    :param draw_start_y       int:    描画開始位置_Y
    :param font_color         string: 描画する文字の色 (デフォルト: "#000000")
    """

    # 描画用データを取得
    draw = ImageDraw.Draw(frame_image)

    # フォントデータを取得
    image_font = ImageFont.truetype(font_file_path, font_size)

    # 各文字の描画管理変数
    ix, iy = 0, 0

    for c in target_string:
        x = draw_start_x - ix * font_size
        y = draw_start_y + (iy * font_size)

        # 今回描画する1文字の詳細なX, Yを設定
        char_width, char_height = image_font.getsize(c)
        x += (font_size - char_width) / 2
        y += draw_start_y

        # 指定の場所へ文字を描画
        draw.text((x, y), c, font=image_font, fill=font_color)

        # 次の文字へ
        iy += 1

    return True

main.py

# coding: utf-8
from PIL import Image
from function import draw_text
import sys

############################ Strat 各変数の宣言

# 引数から文字を受け取る
TARGET_STRING = sys.argv[1]

# otfファイルまでのパス
OTF_FILE_PATH = 'font.otf'

# 出力用ファイルまでのパス
OUTPUT_FILE_PATH = 'tmp/' + 'output.jpg'

# 元画像ファイルまでのパス
FRAME_FILE_PATH  = 'image.jpg'

############################ End 各変数の宣言

# 元画像データを取得
image_data = Image.open(FRAME_FILE_PATH)

# 文字合成
font_size          = 80
draw_start_x       = 60
draw_start_y       = 20
draw_text(image_data, font_size, OTF_FILE_PATH, TARGET_STRING, draw_start_x, draw_start_y)

# 合成した画像の書き出し
image_data.save(OUTPUT_FILE_PATH)
image_data.show();

本来は指定文字で改行とか、文字間・行間も指定できるようにしていたのですが、今回はテストということで簡素にしました。

以下で実行します。

$ python main.py "餌をください"

出来上がった画像が以下です。

f:id:kojirooooocks:20180219224743j:plain

 終わりに

おもしろかったー。

PHPのGDやImageMagickとかを使うより速度早い感じがあるのですが、どうなんですかね?

その辺も今度比べてみたいな。。

あ、簡単なものですが、今回のものはgithubにあげときます。

pillow_draw_text_sample

とりあえず今日はこれまで。

お疲れ様でした。

追記

以下の記事で、このプログラムをクラス化しました。

それにともない、githubの内容も変わっています。

kojirooooocks.hatenablog.com

確定申告終わった

お疲れ様です。

今年も大変な時期が来ましたのでお仕事一日休んで作りました。

僕はFreeeを使用しているので、正直そこまで手間ではないのですが、控除や経費など合っているかどうかを見返さないとダメなので、やはり時間かかりますね。。。

せっかくなので自分がやっている節税につながるものを少しまとめてみます。

1. 生命保険・医療保険

結婚して子供も生まれたので、去年初めて保険に加入しました。

複数登録しているので、その分の控除も大きかったです。

2. 年金基金

厚生年金でないので、追加分として年金基金に加入しています。

こちらは100%控除になるのでとても助かります。

3. 青色事業専従者

奥さんを従業員的な立ち位置にしているので、奥さんに払っている給与を経費にできます。

実際に資料作成、来客対応など手伝っていただいてとても助かってます。

4. 扶養控除

自分は離れた場所に母親が一人暮らししていて、毎月仕送りをしているのですが、こちらも扶養としてみなされます。

もちろんそれなりの仕送り額(自分の仕送りで生活が成り立っているくらい)をしないといけませんが。

それでも控除額は大きいので助かります。

5. 医療費(今年は特別)

今年は子供が生まれたということもあり、年間でかなりの医療費になりました。

奥さんも俺も体弱いので病院のお世話になりやすいということもあり、医療費は膨らみがちだったので、今回は出産費用合わせてすごいことになりましたw

終わりに

...意外と色々あったな。

今年は更にiDecoや小規模企業共済なども考えてみようと思っています。

どちらも貯蓄につながり、かつ控除になるのでお得です。

あとはふるさと納税ですか。やってみたいです。

ところで他のフリーランスの方は節税対策はどんなことをしているのでしょうか。

そのあたり聞いてみたいです。

あ。そろそろ寝ないと。

おやすみなさいー。

PythonでSelenium動かしてみた。

参考サイト

前書き

こんばんは。僕です。

pythonが楽しくて色々と触ってます。

今回は前々から触りたかったSeleniumpythonで動かしてみたいと思います。

下準備

seleniumのinstall

$ pip install selenium
Collecting selenium
  Downloading selenium-3.9.0-py2.py3-none-any.whl (942kB)
    100% |████████████████████████████████| 952kB 694kB/s 
Installing collected packages: selenium
Successfully installed selenium-3.9.0

ChromeDriverのinstall

$ brew install chromedriver
==> Downloading https://chromedriver.storage.googleapis.com/2.35/chromedriver_mac64.zip
######################################################################## 100.0%
==> Caveats
To have launchd start chromedriver now and restart at login:
  brew services start chromedriver
Or, if you don't want/need a background service you can just run:
  chromedriver
==> Summary
🍺  /usr/local/Cellar/chromedriver/2.35: 4 files, 11.3MB, built in 4 seconds

実行

サンプルコード書いてみる

以下サンプルコードでmain.pyとして保存します。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://twitter.com')
driver.save_screenshot('sample.png')
driver.quit()

python main.pyで実行すると、スクリーンショットsample.pngとして保存されます。

f:id:kojirooooocks:20180216041239p:plain

こんな簡単にできるんですね。 これは楽しい。

次はフォームの入力とSubmitを試してみます。 Twitterログインしてみます。

from selenium import webdriver
driver = webdriver.Chrome()

driver.get('https://twitter.com')
mail_form = driver.find_element_by_name('session[username_or_email]')
pass_form = driver.find_element_by_name('session[password]')
mail_form.send_keys('Twitterのメールアドレス')
pass_form.send_keys('Twitterのパスワード')
driver.find_element_by_class_name('js-submit').click()
driver.save_screenshot('sample.png')

python main.pyで実行すると、スクリーンショットsample.pngとして保存されます。

f:id:kojirooooocks:20180216041715p:plain

ログインできました!

2段階認証を設定している意識高い人には通用しないですが、、、

面白いですね。

もう少し使えるように。

指定のページを開くことと、フォームのログイン、submitは出来るようになったので、もっと実践的に、JS制御が効いているようなフォームで、ここのフォームの値がこれの場合は、このフォームは入力できなくなるみたいなところで使えるかやってみたいです。

そこで、本来入力できないはずなのに、入力できちゃってたら、スクリーンショットとって終了とか。テストっぽいことをやってみます。

ざっと簡単にこんなHTML作ってみました。

JSに疎い僕はバリバリjQueryとか使っちゃいます。

<!DOCTYPE html>
<html>
<head>
    <title>test</title>
</head>
<body>
    <div class="movice_rental">
        <label>映画を借りる?</label>
        <select name="movie_rental_select">
            <option value="0">選択してください</option>
            <option value="1">借りる</option>
            <option value="2">借りない</option>
        </select>
    </div>

    <div class="movie_title">
        <label>映画一覧</label>
        <select name="movie_title_select">
            <option value="0">選択してください</option>
            <option value="1">アニマルプラネット</option>
            <option value="2">海底鬼岩城</option>
            <option value="3">のび太と恐竜</option>
            <option value="4">ワンニャン時空伝</option>
        </select>
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
        $("select[name='movie_rental_select']").change(function() {
            if ($(this).val() == 2) {
                $(".movie_title").hide();
            } else {
                $(".movie_title").show();
            }
        });
    </script>
</body>
</html>

このHTML自体は正常に動いちゃうのですが、今回やりたいはエラーのテストなので、指定の値の場合には、指定のフォームが消えるJSを書いたと思ってたけど、書いてなかったという状況を作るため、JS部分を変更します。

        $("select[name='movie_rental_select']").change(function() {
            if ($(this).val() == 2) {
                // 要素のスペルミス
                $(".movieeeeeee_title").hide();
            }
        });

次はseleniumpythonコードの記述です。

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome()

driver.get('HTMLファイルへのパス')
movie_rental_select_form = driver.find_element_by_name('movie_rental_select')
movie_rental_select      = Select(movie_rental_select_form)
movie_title_select_form = driver.find_element_by_name('movie_title_select')
movie_title_select      = Select(movie_title_select_form)

# 一度映画リストのフォームをdisabledにする
movie_rental_select.select_by_value('2')

# 本来はフォームが出てないのでセットできないはずだけどセットしてみる
movie_title_select.select_by_value('3')
if movie_title_select.first_selected_option.get_attribute("value") == '3':
    # valueがセットできているということは、本来意図しない動きのためスクリーンショットを取って終了
    print("[ERROR]movie_title_selectに値をセットできてしまいました!!")
    driver.save_screenshot('sample.png')
    driver.close()

実行すると以下のようなエラーが出ました。

$ python main.py 
[ERROR]movie_title_selectに値をセットできてしまいました!!

f:id:kojirooooocks:20180216041834p:plain

スクリーンショットも取れてました。

すばらしい!!

あとがき

いや。こんなおもしろいものだとは思わなかったです。

現状お仕事を頂いている会社さんではJenkinsが導入されており、Jenkins上からBeanStalkコマンドライン(ebコマンド)でデプロイしています。

運用しているサービスの性質上JSがふんだんに使われている箇所もあるのですが、昔から運用しているサービスなので巷で流行りのJSのテストなどは入っていません。

せめて新たに作成するページや更新するページは、簡単にでもUIテストを自動化させたいなと思っています。

それに、まだまだjQueryとは離れらないサイトなので、こういった昔からあるツールも相性良いかなと。

まぁ、そのためにはEC2上にChromeDriverとか入れないとダメなんですが、コチラに大変参考になる記事を上げてくれている方がいましたので、近々やりたいなと思います。

ではでは。

pythonのスライスはこんな機能もあったのかと驚いた

参考サイト

Python-izm

はじめに

こんばんは。

最近pythonにお熱の僕です。

初心者ですが・・・

先日退屈なことはPythonにやらせようを読んでpython勉強した(パート1 python基礎編)pythonの基礎編を勉強してたのですが、そのなかにスライスという機能がありました。

items = ['ドラえもん', 'のび太くん', 'しずかちゃん', 'ジャイアン', 'スネ夫', 'ドラミちゃん', '出来杉君']
print(items[2:4]);

>> ['しずかちゃん', 'ジャイアン']

リストやタプル・文字列から、範囲を指定してデータを取得できる感じかと勝手に思ってたのですが、他にも使い方あるようでした。

参考サイトを見ると、そもそも :を挟んで左側が開始位置、右側は終了位置という2つではなく

sequence[<開始位置>:<終了位置>:<ステップ幅>]

という、3つめの指定があるようでした。

ほーなるほど。とおもい色々と調べてみました。

こんな使い方ある

1つ飛ばしで取得する

items = ['ドラえもん', 'のび太くん', 'しずかちゃん', 'ジャイアン', 'スネ夫', 'ドラミちゃん', '出来杉君', 'のび太ママ', 'のび太パパ', '先生', 'ジャイ子']
print(items[::2]);

>>> ['ドラえもん', 'しずかちゃん', 'スネ夫', '出来杉君', 'のび太パパ', 'ジャイ子']

逆順で取得する

items = ['ドラえもん', 'のび太くん', 'しずかちゃん', 'ジャイアン', 'スネ夫', 'ドラミちゃん', '出来杉君', 'のび太ママ', 'のび太パパ', '先生', 'ジャイ子']
print(items[::-1]);

>>> ['ジャイ子', '先生', 'のび太パパ', 'のび太ママ', '出来杉君', 'ドラミちゃん', 'スネ夫', 'ジャイアン', 'しずかちゃん', 'のび太くん', 'ドラえもん']


message = u'ぼくドラえもん!'
print(message[::-1])

>>> !んもえラドくぼ

最初と最後だけ取得する

items = ['ドラえもん', 'のび太くん', 'しずかちゃん', 'ジャイアン', 'スネ夫', 'ドラミちゃん', '出来杉君', 'のび太ママ', 'のび太パパ', '先生', 'ジャイ子']
print(items[::len(items) - 1]);

>>> ['ドラえもん', 'ジャイ子']


message = u'ぼくドラえもん!'
print(message[::len(message) - 1])

>>> ぼ!

pythonおもしろいYO!

なんか他にも使えるやり方あれば教えてください。