DOSプロンプトのTips

Windows Terminalがきちんと使えるのがもう少し先っぽい感じがするので、なんやかんやでWindowsユーザーであれば良く使わざるを得ないDOS窓についてもう少し楽に扱えんか調べてみた。

【入力時の便利なショートカットキー(※1)】

機能 ショートカットキー
行頭・行末移動(※2) Home or End
前方・後方削除(※3) Ctrl + Home or End
入力一括削除(※3) Esc
文字の選択 Shift + 矢印キー or Home or End(Ctrl押しながらであれば全体)
文字のコピー Ctrl + Insert or C(※4)
コマンド履歴一覧表示 F7
コマンド履歴一覧削除 Alt + F7
コマンド履歴から入力補完 ある程度入力したタイミングでF8
範囲指定の開始(※5) Ctrl + M
コンソール内の入力文字検索 Ctrl + F
フルスクリーンモード Ctrl + Enter
コンソールの透過率上昇 Ctrl + Shift + +
コンソールの透過率減少 Ctrl + Shitt + -

※1 レガシーコンソールモードになっていないこと(自分でわざわざ設定してなければOK)
※2 LinuxでいうCtrl + a, Ctrl + eに該当
※3 LinuxでいうCtrl + u, Ctrl + kに該当
※3 公式には、Ctrl + Insertはコピー、Ctrl + Cはコピー & send BREAKと記載あるが、実際使うと挙動は同じに見える…。
※4 公式にはマークモードと記載されている。基本このモードはコピーする対象のテキストを任意の場所から選択したい場合に利用するモードと理解している。

【既定値の設定】
Win + R → cmdと入力してDOS窓を立ち上げ、タイトルバーらへんで右クリック → 既定値を選択
以下の値を事前に変更しておいた方がいいかも

[オプションタブ]
・コマンドの履歴の値を拡張(自身はどちらも999に設定)
・編集オプションは全てチェック
・レガシーコンソールを使用するのチェックが外れていることの確認

[フォント]
・MSゴシックにしておくと日本語表示の際に有利な場合がある

[レイアウト/画面の色/ターミナル]
・ここは完全にお好み

【知っておくと便利なコマンド】

機能 コマンド名
画面のクリア cls
ドライブ移動 d:とドライブレターのみ入力(dirコマンドは不要)
開いているエクスプローラディレクトリパス起点のDOS窓を起動 エクスプローラ上でAlt + D → cmd → Enter

【参考サイト】
そろそろ日本語版が欲しい。(そもそもTechnical Previewのままメンテが…)
docs.microsoft.com
対比してLinux側も覚えておくと便利
qiita.com

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

  • 作者:山近 慶一
  • 発売日: 2016/03/04
  • メディア: 単行本(ソフトカバー)

eclipseでiPythonを使いたい

コンソールより、PyDevコンソールを選択すればよい。
すると利用するPythonを選べと言われるので、Console for currently active editorを選択する。
すると現在eclipseに設定しているPythonインタープリターを選択する様に問われるので、お好きなインタープリターを選択すれば良い。
なお、仮想環境を操作したい場合は、以下のリンク記事を参考に事前に設定しておけば、その仮想環境を用いたiPython実行が可能になる。
yoneyore.hatenablog.com

このコンソールを開く事で、eclipseでわざわざPythonを実行しなくても、インタラクティブPython実行が可能となる。
なお、補完機能なども充実しており、非常に便利である。

f:id:yoneyore:20200731222345p:plain
仮想環境を指定する事も当然可能

eclipseでPythonの仮想環境を使いたい

設定方法

1.事前にcondaコマンドやvenvなどで仮想環境を作成しておく(一つ目の肝)
2.[ウインドウ] - [設定] - [PyDev] - [インタープリター] - [Python インタープリター]を選択
3.Browse for python/pypy exeを選択

このボタン押下すると急にディレクト選択画面が出現するので注意

4.パスを選択迫られるので、ここで1.で作成した仮想環境配下にあるpython.exeを選択
5.インタープリター名を任意の名前(自分の仮想環境に付けた名前がベスト)に書き換え、OKボタンを押下
6.適用して閉じるボタンを押下

利用方法

Djangoの開発を行いたい場合

1.Pydevパッケージエクスプローラで右クリックをし、[新規] - [プロジェクト]を選択
2.[PyDev] - [PyDev Django プロジェクト]を選択
3.プロジェクト名を設定し、インタープリターの箇所を先ほど設定したものを設定(二つ目の肝)し、次へボタンを押下する。(他は基本そのままでOKとしてよい)
4.参照ページは分からなければそのままにし、次へボタンを押下する。
5.Django Settingsも分からなければそのままにし、完了ボタンを押下する。

仮想環境利用方法

別のコンソールで操作する(三つめの肝)
eclipseの設定で行う内容ではなく、condaやpipコマンドで操作するものだと割り切る。
そのため、condaやvenvなどを実行するためのコンソール画面が必要になる。
コマンドプロンプト立ち上げてもいいが、eclipseで操作するコンソール画面を表示する方法を説明する。
1.[ウインドウ] - [ビューの表示] - [コンソール] を選択する。
2.コンソールを開くアイコンをクリックし、3.Command Shell Consoleを選択する。

3.接続タイプをlocal、接続名をローカル、エンコードUTF-8を選択し、OKボタンを押下する。

4.condaコマンドを実行してあれこれする(※1)

※1
事前にPATHを通しておく必要がある。
なお、Anacondaをインストールする際に通してなかった場合は、以下のパスを通しておけば良いと思われる。(※2)

C:\ProgramData\Anaconda3
C:\ProgramData\Anaconda3\Library\mingw-w64\bin
C:\ProgramData\Anaconda3\Library\usr\bin
C:\ProgramData\Anaconda3\Library\bin
C:\ProgramData\Anaconda3\Scripts
C:\ProgramData\Anaconda3\bin
C:\ProgramData\Anaconda3\condabin
(C:\ProgramData\Anaconda3までのパスは適宜読み替えて下さい)

なお、eclipse 2020-06では残念な事に、日本語がもれなく酷い表示のされかたをしてしまう。。

※2
Anacondaプロンプトでecho %PATH%した内容と、通常のコマンドプロンプトでecho %PATH%した内容の差異から導出した。

Java屋からみたPythonの仮想環境に関する理解促進方法

仮想環境に対してpipコマンドで仮想環境に対してモジュールをインストールしたり、activateという概念をIDEを用いて開発する時にどうやって操作するのか?というのがずっと理解に苦しんでいた。
しかし、仮想環境は、例えばconda activate!って詠唱したコンソールのみ有効に働き、そのコンソール以外では仮想環境は全くシステムに作用しないことが最近ようやく理解できた。(※3)
また、IDEの設定で何かするのではなく、別途コンソールで操作する必要があるという発想をなかなか持てなかったのも理解疎外要因であった。
結果、以下の様に置き換えて理解すれば良いのかと考える。

  • 仮想環境の構築(ex. conda create):JDKをOSにインストールする感じ(Corretto8をインストールするのか、OpenJDK15をインストールするのか)
  • 仮想環境の切り替え(ex. conda activate):操作するJDKを選ぶ感じ(Corretto8に対して操作するのか、OpenJDK15に対して操作をするのか)
  • モジュールのインストール(ex. conda install):操作するJDKのパスにjarを配置する感じ
  • 仮想環境を使わない場合は、OSでデフォルトでインストールされているJDKをそのまま利用する感じ

Java屋は、基本TomcatなどのAPサーバーの起動スクリプト内のシェル変数などでJAVA_HOMEの指定を行う事でどのJDKを利用するかを選択するのが一般的かと思われる。
そのため、私は仮想環境という内容が長年分かっている様で理解できていなかった。
(一番の理解の重しになっていたのは、create/activateという部分が何をして、どこまで作用するのかを正しく理解できていなかったからと自己分析)

※3
というより、Jupyter NotebookやColaboratoryでほにゃらら動かしたいだけだったので、仮想環境使う場面に直面しなかったからわざわざ理解せんでええかーと思ってた。

Tips

Java屋がPythonを使いたい場合は、面倒だけどワークスペースはいちいち切り替えた方がいいかもしれない。(別途workspace_pythonみたいなのを用意して)
 ただ、JavaしながらPython動かしたい場合はその限りではないが。
・仮想環境の場所と、ワークスペースの位置は一緒にしなくてもいいかもしれない。
 いろんなサンプルでは仮想環境配下にワークスペースを置くのを見かけるが、別のとこ置いていても特に問題なく動いているっぽい。
・Spyder試したけど、なんか補完いけてないし、vimキーマップ使えないので使うのやめた。Pycharm無料版いけてなさそうなので使う事すらしなかった。VSCode何故か自身の環境ではeclipseよりもさく動くので使わんことにした。なんやかんやでメモリとCPUが潤沢にあるPCでは、まだまだeclipse強々かと思った。なお、eclipse cheはまだ人類には早い気がする。。

その他

java屋さんな頭の理解なので、Pythonistからすれば、「この人恥ずかしい…」という事書いてある可能性あるかも。。。
とはいえ、今のところ想定通りな動きはしていそう。

P215 DPU[Data Processing Unit]

Glueジョブに割り当てる処理能力の単位のこと。

aws.amazon.com

上記にDPUという記載や料金は書かれているが、実態としては4vCPU16Bメモリのインスタンスである。

P136 AWS IAM

IAMには4つのエンティティが存在する。

  • IAMユーザー:AWSを操作する人やサービス
  • IAMグループ:IAMユーザーの集合
  • IAMポリシー:AWSへのアクセス許可/拒否権
  • IAMロール:IAMユーザーやコンポーネントに対する権限を委譲するための器

許可の設定パターン

  • IAMユーザーにIAMポリシーを付与
  • IAMグループにIAMポリシーを付与
  • IAMロールにIAMポリシーを付与し、IAMロールをIAMユーザー/IAMグループ/コンポーネントに付与

P105 データリネージ(データ経路の追跡)

データリネージ[Data Lineage]とは、データがどこから発生し(出自)、どのような変換や加工を経て、現在の形になったかという流れを追跡可能にすることである。
バックトラックと呼ばれる場合もある。
この追跡により、例えば分析の根拠となっているデータを確認したり、異常時(不整合や改竄)を発見した際の原因追跡、監査を実現可能とする。

データリネージの基本はデータ処理の流れを記録することにある。
データレイクにあるこのデータは、データ収集層がどこのデータソースから、いつ取得してきたデータなのか、もしくはいつ、どのETL処理が、どのデータソースを元に変形したものなのか、そのデータがいつデータウェアハウスのどの表にロードされたのか、といったことを記録していきます。

これを実現するには、例えば、データを操作するためのワークフロー環境を統制し(限定し)、そのワークフローの中で実行したジョブプログラム、ETLプログラム等とアクセスされたデータについて記録するという方法が考えられる。但し、この方法はこのワークフローの外で行われた操作についてはリネージできないことになる。
そのため、「完全な」リネージ環境を作るということは、その操作方法を統制する(限定する)ことに直結し、自由度を下げるというトレードオフ関係が発生する。
よって、リネージが本当に必要なのかどうか、もしくはどこの部分だけ確実に記録すべきかを考えた上で、データリネージの実現方法を検討する必要がある。

P55 1.5.1 データ活用のための変換処理

テキストデータにおける変換処理の例

  • 日付処理:西暦/和暦変換、JST/UTCなどのタイムゾーン変換
  • 不正な値処理変換:Null値や空文字の取扱い
  • 文字列や値の統一:大文字小文字の統一(半角/全角もか)、整数/小数の統一、表記揺れの統一
  • テーブルの結合処理:取引ログテーブルと取引先テーブルを取引先IDで結合
  • ファイルサイズの変換:大量の細かい数KB程度のファイルを数百MBのファイルに集約
  • ファイルフォーマットの変換:Parques/ORCへの変換

[自己メモ]
他にもデータ変換を行う際には、格納先がRDBのテーブルに格納する際には以下の様な事が配慮必要である

  • コード値変換:男性/女性といった値や、ON/OFFなどのフラグ値の変換、そもそもマッピング関係があるかどうか
  • 桁合わせ:ゼロパディング(0埋め)、ゼロサプレス(0削り)、コメントなどの文字の桁不一致時の処理
  • 時刻処理:秒/ミリ秒格納、年・日付含みかどうか

また、値の中身に関して以下の様な配慮が必要である(※1)

  • 文字コードUTF-8SJISか、漢字は第三水準以上も含まれるかどうか、昔のデータだとある項目値だけEBCIDICとかいう落とし穴もあるので注意
  • 改行コード:CRLFかLFか、別の置換文字として送られてくるかどうか
  • 記号:シングルクオーテーション/ダブルクオーテーション、カンマ、括弧【(), {}, []】、アスタリスククエスチョンマーク、アンパーサントなどが含まれているかどうか
  • アスキー/バイナリ:対象の値がアスキー文字で想定していたら実はバイナリデータだったとか、その逆もしかり(項目値名だけで判断しない)
  • 文字数/バイト数:Nバイトの文字送ると記載されているのに実際の値見るとN文字のこと指していているなど
  • 項目の前後関係:ある項目の値がある時だけこの項目が存在、ある項目の値によって別の項目の値の意味が変わる、ある項目とある項目の値をつなぎ合わせて一つの値など
  • 項目による値の意味合い:項目毎にデリミタが異なる、ある項目では更にcsvの値が格納されている、ある項目では文字コードの値やパーセントエンコーディングの値が入っているなど
  • 暗号化されている範囲:項目によっては最近は暗号化されている値が存在するが、それの適応範囲など
  • 値だけで意味があるかどうか:値を解読するためのアルゴリズムが必要、またはハッシュ値が入っていてそれを連動してもらってもそもそも意味が無いなど
  • 必要なNull値、空文字:値受信時には送られてこないのに、値送信時には値をNull文字や空文字で送ってこいみたいな場合の受信側の管理方法など
  • 繰り返し項目の取り扱い:レコードみたいな場合にどの様なルールに基づいて構造化されているかどうか、繰り返し項目中に繰り返し項目が存在する場合とかも

※1
こんな複雑な闇が沢山あるから、日本ではETLツールが流行らずスクラッチで無いとと言われるゆえんかと考える。。。