エンジニアもどきの雑記

メモ帳です。きっと。macアプリ配信windowsでもできるようになるまで絶対にメイン機にしないマン。特筆しない限り環境は【win10home,i5-7200u,8g,64bit,巨乳が好き】

【python】python初心者が練習がてらlinterモドキを作る



adventar.org
の14日目用の記事です。
が、何も準備してなかったので昨日アップした記事の説明的なことをしていきます。
今日に限って帰りが遅かったんだ。しかたない。

簡単に自己紹介
エンジニアになって一年半と少し。多分。次の五月で二年。多分
普段はphp,js(es6)あたりを書いて某アプリのサーバー担当してます。
読むだけならpython,ruby,javaも仕事で使ったしperlphpに書き換えたりもしてました。

巨乳が好きです

話は変わるけどStar Ocean Anamnesisの今回のシーズナブルキャラのイブリーシュさん超いい。
100連したけどロリペタプリシスしか出てこなかった。
分かる人にしかわからないだろうけど投票券はすべてブルネリ殿に突っ込みました。100連の重みをあのバインバインに。課金額は三万いかないくらいでした
しかも二体。

f:id:dddpga1:20171215001926j:plain

さて、本題です。
昨日の記事は以下

dddpga1.hateblo.jp
f:id:dddpga1:20171214021649g:plain

最終的な目標は以下
・オプションでそれぞれのlinterに変化
・内部的には該当箇所、理由を取得するが、特定条件でしか表示させない
・彼が画面上に出てきてとにかく煽る
・パスの関係をどうにかしたい。
・全角スラッシュでフィーバーモード
・一定の確率でキクリンが出てくる
・いやがらせのごとく特定箇所を勝手に書き換える
・なんなら権限もかきかえる


です。
滅茶苦茶なのはわかってるけどそういった好奇心こそが技術力の向上につながると俺は思ってる。

今日は遅いので続きをかけませんでしたが、
昨日テストでいろいろやってみたのでそれが以下

import re
import sys
import os

if len(sys.argv) <= 1:
    print("文字入力もできないんですかぁ?")
    sys.exit(0)

fileName = sys.argv[1]
print(fileName)

if os.path.exists(fileName) == False:
    print("ファイル名もわからないんですかぁ")
    sys.exit(0)

pattern = r"^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9、。]+$"

with open("./" + str(fileName), encoding="utf-8") as fi:
    for i, line in enumerate(fi):
        if re.search(pattern, line):
            print(i + 1, "行目に、全角ですかぁ→", line)
        elif re.search(pattern, line) == None:
            continue
        else:
            print("( ゚Д゚)ハァ?")


何度もいいますがpython初心者なのでこれからちゃんと作ってもっと形にしたらgithubに上げて、
先人達に少しずつ教えてもらいたい。


では、簡単に何をしたか。
それが以下

・linterなのでとりあえずコマンドラインアプリ
・引数を受け取る
・引数からカレントディレクトリでファイルを検索
・ファイルを一行ずつ回して正規表現と一致する箇所を確認
・それぞれの結果をとりあえず出力


画像の出力まで昨日のうちにしたかったけど、素材が手元にない、そもそも出し方がわからない、であっという間に諦めました。
それもこれからおいおい調べながらやってく。


解説

・なぜpython
 試しに書いてみたら面白かったから。以前の記事を参考

pythonでできること
 なんでも。いや本当に。javascriptと比べて手段が少ないだけで全然なんでもできる。多分。
 ゲームも作れるし、ウェブにもなるし、最近だとRとpythonといえば機械学習

・コンソールアプリならc#でもよくね?
 いろいろあってもう最近ここの記事以外で書いてない。

・そもそも解説できなくね?
 わかってるけどアウトプットすることは超重要。
 自分と同じ程度かそれ以下のpython知らない人間に向けて書いてる。

以上を頭に入れた上でお読みください。

まずこれ

import re
import sys
import os

みてわかるだろうけど、モジュールをimportしてる。
他ファイルをこのファイル内で使えるようにしている、で間違いない。
import自体はphpでもesでもあるだろうし割愛。
reは正規表現
sysとosはファイル操作とか検索とか用


次にこれ

if len(sys.argv) <= 1:
    print("文字入力もできないんですかぁ?")
    sys.exit(0)

fileName = sys.argv[1]
print(fileName)


sys,argvというsysモジュールのargvに対してコマンドラインから実行した引数が入ってくる。
それを取得して、入ってなかった場合は煽り文を出力させ、そこで終了させる。させない場合はおかしくなる。

引数(今回ではkiatagawa_test.py)を取得してfileName変数にぶち込む。
変数の代入は大体どの言語でも同じ。
念のためにそれを出力。



if os.path.exists(fileName) == False:
    print("ファイル名もわからないんですかぁ")
    sys.exit(0)


【os.path.exists()】でカレントディレクトリ内に与えた引数のファイルがあるか検索。返り値はTrue or False
pythonのbooleanはどうやら先頭が大文字らしい。
ファイル名を入力したのにも関わらずミスをした場合に備えて煽る。
そして終了させる。


pattern = r"^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9、。]+$"


正規表現をpattern変数に代入。
今回は全角文字を【、】と【。】と数字も含む。
ここは今後それぞれのlinter用正規表現ファイルを作成して読み込むようにしたい。
ここで""の手前にあるrがimport re。python正規表現エスケープ文字が邪魔になってしまうため、
こうやって書くのだとか。まだそこまでたどり着いてない。

with open("./" + str(fileName), encoding="utf-8") as fi:
    for i, line in enumerate(fi):
        if re.search(pattern, line):
            print(i + 1, "行目に、全角ですかぁ→", line)
        elif re.search(pattern, line) == None:
            continue
        else:
            print("( ゚Д゚)ハァ?")

今回のメイン部分?

とりあえず処理させましょう!
で書いてみました。

with open()にてfileName変数に入ったものと同じものを開く。
それをas fiでfiという名前で扱えるようにする。
esのimport name from hogehogeみたいな感じかな。MySqlのasの方がわかりやすいか。


for文でそのfiを回す。
enumerateとは、これだけでインデックスと要素(のタプル)を取得できる便利ちゃん。
他でいう

$arrMap = [
    'hoge' => 1,
    'foo' => 2
];

foreach ($arrMap as $key => $value) {
    // key value
}


みたいなことをこれだけで取得する。
それぞれの書き方の違いなのだろうけど、なんとなく便利に感じた。

そしてそれぞれがiとlineに入る
残りはif文。

if re.search(正規表現, 対象)

正規表現と一致するかチェック。
今回は全角文字があるか検索する。

入ってれば煽る。
入ってなければ舌打ち。


以上が今回作ったもの。

これを実行すればわかるのですが、
pythonc#とかと同様、コマンドラインツールとしても初心者な私がここまでできる超便利言語。
ここから改造に改造していくので、一緒に作れりたい人は声かけて。


最初の三行を見ればわかるけど、
importできるモジュールが豊富。

それらの一覧が以下

Python 標準ライブラリ — Python 3.6.3 ドキュメント
ちなみに上のリンクはあくまでも標準モジュールだけです。
それ以外にpip(パイプ、jsでいうnpmみたいな)でいろんな人が作ったモジュールをガンガンdlしてこれます。
それらもimportしてしまえばimportだけで使うことができるようになる。



importの書き方も豊富で、特定の関数だけ使う、みたいなことも当たり前にできる。

from hogehoge import hugahuga
hogehoge,hugahuga()

といった具合。
esの

import { hoge } from fuga

みたいな感じ。
当然速度なり重さなりにかかわってくる。けどそこまではわからない。


以上、python初心者がやってみた、の解説だよ。
絶対に穴をあけないマンだけどネタは用意してないからその時ある時間でできるだけのことをこれからもする。
けど、これ書いちゃったのでこれの続きを作ってこうかな。次回があれば。


で、以上までだけだと面白くもないから以下にアドバイスを書くよ。
これをわざわざ読むのは俺より稼いでない後輩か俺よりまだ経験日数が浅い後輩だろうからね。


今現状、【俺達】が技術力を高めるのは超重要だよ。
俺たちが、だよ。
なぜかってそれはエンジニアだからだよ。
そういう会社にいて規模が上がってきたこのタイミングで、規模がそこそこの
サークルでそのサークルが技術目的ではない。
この現状が超重要。

だからこそガンガンアウトプットしてほしい。
だから初心者向けの、俺も初心者としてのpythonを今回ちょうどよく選んだ。

まぁうるさい奴らを実力で黙らせたいだけなんだ。
ぜひ協力してくれ。

これは俺の先輩の言葉だし、俺もたまに誰かに言ってるけど、

お前らがジムに行ったり、ゲームしたり、寝たり、好きなことをしている間も俺は勉強してる。

これ、超重要。
エンジニアになって一年半と少し。
俺たちくらいの初心者にはこの言葉が超重要なんだ。それ以上の人には関係ないけどね。
gizumoのとあるエンジニアや前いたお偉いさんも言ってたけど、
三年は本気出せば三年で差が付くんだ。javaしか書けない死にかけのおっさんとかみかけるとわかるよ
とりあえず俺たちの中では単価狙ってるであろう俺からのアドバイスだよ。

頭に入ってるだけで違うと思うし、
先ほどの言葉を人に言えるだけでいいと思うよ。

上の言葉の意味がなくなるまではまだまだ時間がかかると思う。
けど意味がなくなるくらいまでを目指して頑張るで。


普段と違う感じだし説教臭くなったけど、以上。
巨乳の彼女が欲しい