やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubアップローダを書いてきての反省点

コードを書いてて感じたこと。

感じたこと

実装したい本質的なコードを書くより、他のことに時間を奪われていることが多いと感じた。

  1. コード全体の見通しを事前につけられない
  2. 実装時に迷ったり調べることが多い
  3. エディタによる自動化サポートがない
  4. 秀丸がない(grep検索、grep置換、テキスト操作などに手間取る)
  5. システム不安定により作業成果消失
  6. ReadMe, ブログの書き出し

また、ディレクトリやファイル構成が大きく変化するせいでGitHubで管理できない(別リポジトリにしてしまったほうが楽)。同一リポジトリで管理し続ける方法も調査する必要がある。その前に、コード全体の見通しを立てられるようになる必要があると感じた。

A. コード全体の見通しを事前につけられない

  • どんなディレクトリ構成、ファイル構成にするか
  • どんなpakage, module, class, method, 変数が必要か
    • 継承関係
    • アクセス修飾子(private, public)

頻繁に構成ファイル、module名、メソッド、引数などが変わるため、その修正に追われて本質的な実装の妨げになった。

原因

  1. 言語仕様を把握していない
    • 全体像のインタフェースをイメージできない
  2. 修正する手続きがわからない
  3. 規模が大きくなるに連れて適切なインタフェースが変化する
    • 最初から大掛かりなフレームワークを作ると逆にわかりにくくなるし実装も遅れる
      • 最初は密結合の単純な構成にする
    • 規模が大きくなるに連れてフレームワークがないと理解しづらくなる
      • コードの規模に応じてフレームワークの抽象度も上げていくのが好ましい
        • 必ずインタフェースの変更が生じる

A,Bは私の技術的な問題だが、Cは改善のしようがない。

現状

  • 全体像のインタフェースをイメージできない
    • 書きながら、失敗しながらでないと実装に辿りつけなかった
      • 今後も当分はそうなりそう
    • デザインパターン
      • オブジェクトを引数で渡す密結合な状態
      • 疎結合な実装をどうすれば実現できるのか不明

対策案

  • 言語仕様を把握していない
    • 全体像のインタフェースをイメージできない
      • テンプレートを作る
        • 「こういうときは、こう実装する」というコードをまとめて書いておき参照して書く
  • 修正する手続きがわからない

B. 実装時に迷ったり調べることが多い

各文脈における定義や知識がなかったり、忘れたりして調査することが多い。

  • Python言語
  • HTTP規格
    • GitHubAPI仕様
  • データ構造や型
  • Linux
    • ファイルの一括置換ができない

Python

  • if __name__ == "__main__":による実行
  • ファイル操作
    • ディレクトリの絶対パス取得os.path.abspath(os.path.dirname(__file__))
    • 指定ファイルの絶対パス取得os.path.join(os.path.abspath(os.path.dirname(__file__)), 'config.ini')
    • 存在確認os.path.isfile(path), os.path.isdir(path), os.path.exists(path)
  • class
    • 継承
    • アクセス修飾子
      • protectedはない
    • property
      • 実装方法を調べる
  • 文字列操作
    • format
      • “{0}”.format(var)
      • “{name}”.format(name=var)
    • 置換
      • ‘ab34’.replace(‘34’, ‘cd’) # ‘abcd’
    • トリム(前後の空白文字削除)
      • ‘ ab cd ’.strip() # ‘ab cd’
    • 前方一致、後方一致
      • 'abcd'.startswith('cd')
      • 'abcd'.endswith('cd')
    • 正規表現
  • dictに含まれているか確認
    • if value in dict:
  • 三項演算子
    • (変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
  • ライブラリ
    • requests
      • requests.post(url, headers=headers, data=data, auth=(username, password))
    • dataset
      • table.update(dict, [‘Id’])

HTTP

  • 通信Method(GET,POST,DELETE,PATCH,…)
  • Header
    • Content-Type
      • Mime-Type
        • top-level-type/sub-type
      • mimetype/subtype charset=utf-8; key=val; ...
    • Link

REST

RESTなWebAPIを自動化、共通化したかったができない。仕様が明確に定義されているわけではないから。

GitHubAPI, GoogleAPIなど提供者側によって使い方や実装方法が異なる。認証も独自ヘッダを使うとか、APIごとに異なる認証方法が必要などの仕様により共通化が難しい。

OAuth

GitHubAPI, GoogleAPIなど提供者側によって使い方や実装方法が異なる。

データ構造や型

WebAPIの戻り値はJSONXML。それをPythonの型に変換し、DB保存するときはRDBMSで扱えるような形式に変換する必要がある。

  • WebAPIによる取得、SQL文(ライブラリAPI関数)による取得
  • 真偽値True/False←→1/0
  • 配列の要素←→カンマ区切りの文字列

C. エディタによる自動化サポートがない

現状のPythonコーディングには以下の問題がある。

  • エディタの補助機能が貧弱すぎる
  • コンパイルエラーが貧弱すぎる

自動化できるであろうことを手動でやらねばならないせいで時間を浪費している。

  • プログラム実行
    • ターミナルから実行しているがエディタのF5キーで即実行したい
  • コメントアウトのON/OFF
    • 手動でしているがショートカットキーでしたい
  • 実行時エラー
    • self
    • (), {}, '閉じ, "閉じ
    • 未定義変数の警告
  • コンパイルエラー
    • :
      • if文, for文, 関数などの構文の末尾に書き忘れる
  • 自動リネームできない

D. 秀丸がない

Windows秀丸では簡単にできていたことが、Linuxでは難しい。

ファイル操作

  • shell

  • コマンドを覚えられない

  • ググる
  • コマンドを考える
  • コマンドを打つ

コマンド構文だけでなく正規表現やエスケープなども考慮せねばならない。予備知識が豊富でなければ使いこなせない。とてもコードを修正することに集中などできない。毎回こんなことをやっていられない。秀丸のようなGUIが欲しい。

ファイラ

cajaがデフォルトだが、nemoをインストールするとそれが標準になってしまった。削除しようにも、削除できなくなってしまった。

  • 再帰的にファイル検索できない
    • find . -name "*.html"のようにコマンドで実行するが、作成日時順にソートできない
  • 前回終了した状態を復元しない
    • 前回の状態がリマインダの役割も兼ねていた。思い出しが必要になる
    • 次回、また同じ状態を手で復元せねばならない

テキストエディタ

  • pluma秀丸と違い、ファイルの拡張子ごとに設定を保存できない。

    • .pyファイルだけはタブをスペース4つにしてほしい。しかしできない。設定の変更や戻すのを忘れてハードタブが入力され、エラーになることがある。そのたびにファイルを探し、置換する作業が必要になる。
  • 前回終了した状態を復元しない

    • 前回の状態がリマインダの役割も兼ねていた。思い出しが必要になる
    • 次回、また同じ状態を手で復元せねばならない
  • 単語の選択範囲が不便

    • 秀丸なら都合のよい単語を選択できた

対策

E. システム不安定により作業成果消失

  • LinuxMint 17.3 MATE 32bit

Linuxは環境を変更すると元に戻せなかったり、壊れたりすることが多い。その契機がインストールやアップデートである。いちいちインストールするたびに環境破壊されて作業が進まない。

フリーズする

作業データが飛んで最初からやり直すことが頻発している。原因は以下のうちのどれかだと思う。

  • メモリ不足のせい
    • スワップ領域がないせいもあるがHDD劣化を防ぐためメモリで対応したい
  • OSをUSBメモリにインストールしているせい
    • USB通信が不安定

F. ReadMe, ブログの書き出し

  • テキストを書くだけで時間がかかる
    • テンプレのコピペを自動化したい
  • リポジトリとその対応記事をさがすのが面倒
  • はてなブログの応答が遅い
  • ReadMeでライセンス情報を書くのが面倒
    • ライセンス調査する必要がある

所感

すべて私の未熟のせい。問題はこれらを改善していくだけで、本題のコードを書いている場合ではなくなってしまうこと。

サクっと本題に入りたい。ただそれだけ。そのための環境を自分で作っていかねばならない。その実力があればいいのだが、ないから困る。やるしかない。

どうやってコードを書く以外の作業を自動化するかが重要になる。GitHubアップロード作業もそのうちのひとつ。今度はそのためのプログラミングを行うための作業を自動化したくなる。Windowsならできていたのに…。