2017/08/20
PyQ
今日は3単元
- クラスの基本
- 関数の詳細
- 正規表現
#今更だけど「単元」じゃなくて「クエスト」って呼び方があってるのか?
ようやくクラスまで来たけど、メソッドの定義の第一仮引数にselfを入れなきゃいけないのが不便だなぁ。普通にselfは予約語にしておいてくれればいいのに…(self入れ忘れで何度かエラー出した)
正規表現だと$を使った後方一致。厳密には後方一致じゃないんだろうけど、今までの正規表現と挙動が違っていて戸惑った。
>>> print(re.match('0$', '1000'))
None
>>> print(re.match('.+0$', '1000'))
<_sre.SRE_Match object; span=(0, 4), match='1000'>
PHPだとうまくいく。
C:\WINDOWS\system32>php -r "preg_match('/0$/', '1000', $match);var_dump($match);"
array(1) {
[0]=>
string(1) "0"
}
JSでもマッチしてくれる
'1000'.match(/0$/)
["0", index: 3, input: "1000"]
どちらが期待通りかといわれると後者で育った人間としては後者になるけど、言語としてそういうことならそういうこととして慣れるしかない。あとはpypiで入れられるregexモジュールも試してみよう。
あと、PyQのテストデータ大丈夫か心配になった。
「店舗名、商品名、価格」(、が区切り文字)のフォーマットで記載されたデータから正規表現でデータを引っこ抜いて「価格が1200円以上なら出力」のような条件を付けて処理を行う問題が出てきた。
この単元の最初に写経した際、「ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円」のように「、」が余分に入っているような不正なデータは無視すると記載があったため、「m = re.match('[^、]*、([^、]*)、(\d+)円$', data)」のような正規表現ではじいていたのだが、途中の問題で「不正なデータをはじく」要件が消えていた。
ということは、「ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円」のようなデータも無視せずに処理を行うよう正規表現を変更する必要があるはず。
とりあえず商品名に「、」が複数入っていても大丈夫なように「m = re.match('[^、]*、(.+)、(\d+)円$', data)」に変更したけど、問題がたまたま「1200円以上なら出力」という条件だったために、処理すべき「ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円」は処理されずに終わった。
どちらの正規表現で書いても最終的にこのデータは出力されないため、弾かれた体で合格になっていた。
実際に試してみたけどやっぱり写経した正規表現ではNG、新しい正規表現はOKになる。
>>> print(re.match('([^、]*)、([^、]*)、(\d+)円$', 'ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円').groups())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> print(re.match('([^、]*)、(.+)、(\d+)円$', 'ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円').groups())
('ほげほげ', 'グリルドチキン、マッシュポテトを添えて', '1000')
問題作成者は「ほげほげ、グリルドチキン、マッシュポテトを添えて、1300円」のような条件式には当てはまりそうだけどフォーマットがNGなデータも作っておくべきだったということ。
まぁそこは学習の本質部分ではないと思うし、テストデータの抜け漏れは実務でもよくあるんだけど、こういう細かいところまでチェックできていないとなると実務レベルの単元ではどんなもんなのか不安になる。
すごい細かいことなんだけど、有料サービスだからこそ目に付いてしまう…。
サービス自体は続くといいなと思ってるし、なんなら他の言語バージョンも作ってほしいので、サービスの質が上がっていくことを願いつつ今日はこれにて終了。
---
白猫プロジェクトが捗りすぎて本全然読めていない…。
2017/08/18
2人月の使い道
部下「プロジェクトで○○という商用ライブラリを使いたいのですか…」
— ゆきうさぎ@フリーのシステム屋 (@__snow_rabbit__) 2017年8月18日
上司「価格は?」
部下「50万くらいですね」
上司「稟議通らないから自作して」
部下「はい…」
こうして…2人月もの人件費をかけてライブラリの「一部機能」を作り上司は満足顔で言いました。
「ほら、無料で出来た」
無能プロパーに囲まれて仕事している方のこのツイートに対する反応が興味深かった。
反応を眺めていた限りではざっくり、
8割が「上司は無能」(内製否定)
1割が「そういう選択もあるよね」(内製肯定)
もう1割が「なんとも言えない・状況次第」(客観的)
という反応だった。
「上司は無能」の声が多くて違和感を覚えたので、本当に上司は無能なのかを自分なりに考えてみた。
前提として、それぞれの仕事は以下のようになると仮定。
部下:上司へ判断材料を提供する
- 購入の必要性を根拠
- 購入費用と維持費用
- 内製時にかかる開発費用と維持費用
- 各方法のメリット、デメリット
上司:判断材料をもとに検討、必要に応じて経営陣へ交渉する
- 判断材料の正当性のチェック
- 製品や会社の方針に沿ってメリット・デメリットの勘案
- お財布の確認
- (購入すべきと判断したら)経営陣へメリットを提示し稟議を上げる
(こんなところ?上司になったことないのでわかりません><)
ツイートの要点を振り返って仕事ができているか確認する。
部下「50万でアレ買って」
上司「稟議通らないから内製」
部下「わかりました…」
二か月後…
上司「無料でできたろ?ドヤ」
…あれ?なんかいい感じに結論でるかと思ったけど、これだけでは二人とも仕事してない無能な感じになっちゃう(仮定が悪い?)。
まぁいいや。細かいことは無視して続けるとして、二人の関係性は知らないけど、部下は判断材料を提示したのか、上司のたった一言で諦めたのか、上司は判断材料を見て決断したのか、部下に稟議が通らない理由を説明したのか、その他の要因として考えらえるのは費用はお客さん持ちだったのか、スケジュールに余裕があったのか、会社の戦略的に内製メリットが大きかったのか、とかツイートには無い背景・前提が多そう。(感想を書いてる人の境遇や想像している雰囲気も考慮すべき背景)
そんで、こんなに判断材料が少ない中で上司を無能の罪にしてしまってよいのだろうか?部下に落ち度はなかったのだろうか?
そんなことを考えていた。可能性の話しかできないので答えは無い。
ただ、氏の日々のツイートを見る限り現場に不満を募らせていて、ただ愚痴りたかっただけなんだろう。
そもそも140字しか書けないチラ裏で議論なんかできないし、こんな場所で前提を一から説明する必要もないし、そこに無い無限の可能性を追求する必要もないと思う。もちろん、それぞれの感想を否定するわけでもない。
ただ、背景の共有ってとても大事なんだなと思ったので長々とポエったのでした。
本当に具体的な話とかは無い。以上。
天竺鼠単独ライブ「レベル2」
新宿ルミネにて観覧。
瀬下さんの登場はインパクト強すぎた。長すぎw
他のネタでもしつこいくらいやることが多い上に、観客が飽きてそろそろ終わるだろうという期待を裏切ってまで突っ走るのがよい。やりすぎるとほんとつまらなくなるけど、(少なくとも自分にとっては)いいバランスで終わるので裏切りの天才なんだろう。
ネタはシュールなものが多くて当たりはずれはあるけど、ライブだとちゃんと決めてくれることが多くてよい。
===
無理矢理朝型にした反動で昨日19時~22時まで寝てしまい、再度寝たのが4時。起きたのが10時。やれやれだぜ。
2017/08/17
6時半に起きて仕事。
滞留していた3タスクの前提タスクが終わったためサクサク進んだ感じするけど、スケジュールが先方都合で半月以上遅れてるのに上は調整かけてくれないのでもっと急がないとだ…。
お客様の方を向くのもいいけど、パートナーさんをないがしろにするのやめてほしい。
この前も無理やりデザインをお願いしておいて、やっぱり自分でやるとか言い出してパートナーの時間をドブに捨ててた。あれ?これ完全にやばい会社じゃん。
---
今日は仕事メインだったので時間がとれず1単元のみ。
- for文の詳細
enumerate, zip, range, リスト内包表記を駆使する単元。
わかりやすさを優先したのか、問題を考えるのが面倒なのかはわからないけど、ほぼ同じコードを何回も書くだけで意識して関数を使ってる感じは無かった。公式ドキュメントを読みつつ自分のターミナルで色々試してなかったら理解できなかったかもしれない。
問題自体ピンと来ない内容だったので思考停止してしまったのかもしれない。家庭教師とか塾講師をしていたらサクッと理解できたのかもしれない。(自分が問題作る側だったらいい具合の問題を作れる自信は無いけど)
ただ、知らない知識と対峙したときに自分の中でどう紐解いて理解していくかを練習しておかないと上流工程(特に要件定義)は務まらないので、問題に限らず、もうちょっと歩み寄りの精神を身に付けたい。
リスト内包表記のネストとかforを2つとか、コードは美しいしPythonistなら理解できて当然なんだろうけど、脳がメモリ不足起こすから拒否反応出ちゃう。
脳のメモリ増設したい(修行しろ)
2017/08/16
今日から朝型へ矯正。
朝7時に起きて流しのPyQは中級編に突入。今日の単元は
- ソート(sorted(), list.sort())
- 集合(set)
の二つ。
PHPだと配列は+で結合できるけど、同じような挙動のarray_merge()との違いを理解せずに使われて鼻血出そうになったことがある。
そもそもPHPは数学的な処理をさせるような言語じゃ無いのはわかっているけど、今まで便利そうなものを手当たり次第取り入れてきてるんだから、集合関連の演算子が採用されてもよいとは思う。
しかし、Python中級のセクションに入ってから、エラーの頻度が上がっている。
問題文を読み飛ばしていたり、for inをfor = と書いてしまったり(よくやる)、単純にTYPOしていたり、いつものようにコロンを忘れていたりと色々やらかしてるけども、根本的な原因としては集中力が切れてるというところ。
公式ドキュメント見ながらインプットしてるので時間がかかる。1日1単元にして理解を深める方向でやってみよう。
WordPress 4.9の改善点が公表、気になるGutenbergは? - Capital P
REST APIの整備ってことは、将来的に管理画面はPHPである必要がなくなるということでは?
マイクロサービス化でWPaaSみたいなサービスがでてきて、別言語の開発者にもアプローチかけられてますますシェアを拡大していくのでは?
開発者が増えるということは、セキュリティリスクも下がると言うことでは?
シェアNo1のCMSがセキュリティ強化されるということは、ほぼイコールでWordPressが世界を救うということでは?
10年後「WordPressのコアってPHPで作られてるみたいだぜ」って興味もたれてPHPerが増えるのでは?
PHPerの平均年収が1,000万円くらいになるのでは?
あーもうこれはPHP極めるしかない。
---
今日から仕事再開だったけど、全然頭が働かない。
あと二ヶ月くらい休みたい。
2017/08/15
何もやる気が起きない自堕落な1日だった。
元記事読んだけど、それっぽいことを並べていてこの指摘記事無しに読んでいたら記事にある豆腐は避けていたかもしれない。
すべての人が情報の正確性を検証するなんてできないので、専門家にうまくサポートしてもらえるような仕組みができるといいな。監修の太鼓判をもらって記事に表記するとか。(太鼓判商売が生まれそうだけど)
以前はてブでITのクソ記事が量産されることを嘆く記事が話題になっていたけど、それも本質は同じよな。品質の低い情報が生まれるのは防ぎようが無いから、品質の低い情報が人々の目に留まらないように水際でなんとかできたらよいなぁ。
---
朝型に矯正するためPAVLOK SHOCK CLOCK買った。
一ヶ月くらい使ったらレビューしよう。
しかし、日本の正規代理店を名乗っている会社のサイトがFacebookページのキャプチャとか本家ブログと思われるページのキャプチャを貼っていたりしてて、不安になってしまった。ちゃんと届くとよいなぁ。
2017/08/14
昨日に引き続き、PyQ日和のためPython初級のセクション(6単元)を一気に進めた。
(14時〜19時)
今日はPython初級を終わらせ。 #PyQ pic.twitter.com/pfIjElG4B5
— ひざまくら (@hizatama) 2017年8月14日
関数やosモジュールの単元で一気にコード量と難易度が上がったので、デフォルトで入っているコードを読むのに今までよりちょっと時間がかかった。
単元内で同じようなコードを何度も書くのが面倒になって前のクエストからコピペを試みたけど、写経と同じで意識して書かなかったコードが全然頭に入らなかったので結局愚直にタイピングしたのでした。
あと、今日もどこかで誤植を見つけたけど重要じゃなさそうなところだったので忘れてしまった。
いやーしかしまだPythonになれない。(まだ二日目ですし…)
Pythonのif文とかfor文のコロン忘れがち。
— ひざまくら (@hizatama) 2017年8月14日
インデントでブロック表現してるんだからコロンいらない気がするけど、この辺りはおいおいわかるのかな。
とりあえず、Ruby使いが「PHPのセミコロン滅べ」って言ってた気持ちはちょっとわかった。
===
私も値切るクライアントとは付き合わない方針なのでそういうクライアントはやんわりお断りする。そういうところ切っちゃって困ったことは今まで一度もない。 <RT
— えとみほ (@etomiho) 2017年8月14日
金額の桁数とか経営状況とか値引き額とかそういう諸々は置いといて、良好な関係が築けているクライアントなら「次回の案件ではお願いしますよ〜」なんて言ったりしてトータルで帳尻合わせしてたりするけど、新規さんでの値引きは政治的なしがらみが無い限りはお断りだし、しがらみ有りならその分ちゃんと要件を削ってもらうよう"しがらみの元"へ相談するかな。
100万円かかるって言ってるんだから100万円かかるわけです。
それを70万円にしろというのは「あなたたちが30万円払ってよ」と言うのと同義。よくそれが通ると思うよ。
コンビニで100円の商品をレジに持っていって「70円にしてくれ」とは言いませんよね?
100万円の車が欲しくても手元に70万円しかなければ70万円の車を買うか100万円貯まるまで我慢しますよね?
それと同じです。
経営戦略的にどうしても必要な計画なら借金してでも100万円用意してください。話はそれからです。
もしくは、おすすめはしませんが、70万円で受けてくれる"効率化によって大幅なコスト削減に成功した会社"へご連絡ください。
厳しい言い方になるけど「あなたたちの計画が間違っているのをこちらのせいにしないでください。」ということです。
---
発注側になったときの心構えはこれくらいにしておいた方がよいというベンダー視点の一方的な話。決してクライアントの方が立場が上だなんて思わないようにという戒め。
このあたりの理想と現実の間で苦悩する青二才の話は、書きたいことがありすぎて考えがまとまらないので、ちゃんと整理してからアウトプットしよう。
---
ちょっと前は「クライアントに喜んでもらいたい」という思いから自分を犠牲にしてやっていたけど、クライアントしか見ないビジネス無視の対応を業界の当たり前だと思わせてしまったら戦犯認定されちゃうから、最近はちゃんと残業無し+カレンダー通りの休日(を装いつつもゴリ押しされたら雑務をやっちゃう)で進められるように改善をしてるつもり。
業界なんて大きい話しなくても、土日を潰して家族にしわ寄せがいくことが多々あり、申し訳ない気持ちでいっぱいになってるから、自分と身近な人だけでも幸福度を上げるためにもちゃんと頭使っていこうと思う。
2017/08/13
Pythonやってみようと思いつながらただ時間が過ぎ去ること川の如しだったけど、今日「長年のノウハウを学びたい - PyQが「設計」のノウハウを学べるコンテンツを追加 - PyQオフィシャルブログ」を見て、他の言語の糧にもなるだろうと勢いで登録(一番安いプラン2,980円/月)。
とりあえず基本構文の習得のためのセクション、「Pythonはじめの一歩」(9単元)は修了。
基本の構文ではさすがに躓くことはなかったけど、穴埋めコーディングでは無いのでコーディング量が多いし、同じような処理を何度も書かされる。
だから覚えられるのだろうけど、久々に数時間ぶっ続けでタイピングしていたのでめちゃくちゃ疲れた。
Pythonの基本構文レベルで魅力に感じたのは
- 切り捨て除算の演算子「//」
- 辞書のget(key, default)
このくらい。
切り捨て除算の演算子は、PHPだとコメントアウトになっちゃうから採用できないのか、floor(x / y)でやってる(はずだったけど、改めて公式ドキュメントを見てみたらintdivとかいう関数がPHP7で追加されてた。floorでよくないか…?パフォーマンス的に有利?)。
辞書のgetメソッドはPHP7以降ならNull合体演算子($hoge ?? 'fuga')があるけど、オブジェクト指向的な書き方が出来た方が自分は(JSもやってるから統一できると)わかりやすくてよい。
でもPHPで配列(連想配列)はオブジェクトでなくプリミティブ型扱いだからarray.get('key', 'default')なんて書けるようにはならないだろうな。ただでさえ言語内での統一感無いのにこれ以上業を背負ってどうすんだって話だもんなぁ。
逆にちょっと辛かったのはキャスト。PHPの自動キャストに慣れてるから「str( value )」のキャストが煩わしく感じるし、たまに忘れてエラーになることがあった。型のありがたみは大規模になればなるほど高まってくので慣れるしかあるまい。
ただ、「"{}".format(var)」とすると自動的にキャストしてくれるのかな?単元内では説明なかった(と思う)けど、他の人の解答で使われていたので使ってみようかな。
今後もちゃちゃっと進める予定だけど、実践的なWebAPI、データ集計処理、メール一括送信、スクレイピングはまだ準備中。短期間で終わらせる予定なので、残念だけど準備中の単元は受けられそうにないかな。
---
ついでに「はじめの総合演習 > 自動販売機の売上げ集計」の二問目、問題文に誤植があった。集計するのは個数じゃなくて金額だった。出力例に書かれた値が100倍くらい離れてたからわかったけど、同じような値だったら3万時間は悩んでた。
まぁ、間違えて何かペナルティがあるわけでもないから積極的には連絡しないけど、もしPyQの中の人が見てたら修正お願いします。
最近は無料で質の高いサービスもあるから、有料サービスでちょっとしたミスに遭遇すると「なんでお金払ってまでテスト作業してるんだ?」って気分になってしまう。
無料サービスが増えれば増えるほど有料のハードルが上がるから、サービス提供者はつらいだろうなぁ…。日本のお客様様体質だとなおさら。
===
夏季休業が終わったらがっつり出来ないから、日々コツコツ積み上げていこう。