amagoのエンジニアブログ

IT関連のネタを中心に記事を書いてます。

【Flask入門】Python初心者がマインスイーパーを作ってみる① ~目標設定~

こんにちは、Amagoです。

タイトルは釣りです。私が入門しました。
今回は小ネタとかではなく雑記です。

最近、現場の言語以外にITのトレンドとかの記事をよく見ます。
ほかのエンジニアの方々がとてもレベルの高い内容の記事やつぶやきをしていたのでカルチャーショックを受けています。

『自分も負けてらんないなぁ』と思い、何か、Pythonを使って簡単なアプリを作ってみようと思いました。
気がついたことや進み具合をブログに書こうかと思います。
 

きっかけ

いろんなつぶやきやIT関連の記事をみて、Pythonに興味が沸いたので。画像解析とか機械学習とかライブラリが豊富だし。。。
まずは簡単なWebアプリケーションを作ってみようって思いました。書かないと覚えないし・・・それと、開発からリリースまで一人でやってみたかった。

マインスイーパーにした理由

 実装のボリュームはある程度ありそうで、データベースを使わなくても作れると思ったから。(今後、DBを使ってスコアとか記録できたらなぁとは思っている)

フレームワークをFlaskにした理由

フレームワークをFlaskにした理由は小規模の開発に向いていると書いてあったため。
次はDjangoとかにも挑戦したみたい。

 

筆者のレベル

他のウェブアプリ開発(C#, javascript, HTML/css, MVC5)の経験はありますがPythonはど素人(Web学習で基本構文を習った程度)、環境周りも少しLinuxを保守で触った程度。

最終目標

作成したマインスイーパーのソースをGit Hubに公開すること。どこかのレンタルサーバーに配置して動作確認もしてみたい。

 

次回目標

開発環境の整備、一旦は「Hello world」をローカル環境で確認するところまで。

【バッチファイル】バッチファイルを使って git にpushするツールを作ってみた②

こんちは、Amagoです。

今回は、前回記事にしたgitへのpushツールを任意のコメントでコミットできるようにバージョンアップしたいと思います。
前回の記事をまだ読んでいない方はこちらから
hamaguchi-amago.hatenablog.com


目次

前回のおさらい

前回作ったバッチファイルはこちらになります。
単純にファイルをクリックすると『update』というコメントで修正ファイルをgitへpushしてくれます。

@echo off
cd ”ローカルリポジトリ” && ^
git add . && ^
git commit -m "update" && ^
git push origin master
exit /b 0

追加機能の洗い出し

今回追加したい機能は、以下の二点


・コメントを入力させる。
・入力された内容をコミットのコメントに設定する。


それでは順番に見ていきましょう。
今回もこちらのサイトを参考に作りました。
qiita.com

試しにかいてみた

こんな感じでサンプルのバッチファイルを書いてみました。

@echo off
set /p comment="コメントを入力してください:"
echo %comment%
pause
exit /b 0

f:id:hamaguchi_amago:20190520003208p:plain
図1

実行してみると、コメントの入力を促されます、とりあえず『テスト』と入力します。

f:id:hamaguchi_amago:20190520003232p:plain
図2

入力してEnterキーを押すと入力した内容が出力されています。

解説
2行目の『set /p 変数="メッセージ"』でコマンドプロンプトを起動しメッセージを出力して入力されるまで待機します。入力されたメッセージはcomment変数に格納されています。
そして、3行目でcomment格納さた内容が出力されています。
ちなみに、『pause』は何かキーを入力するまで待機してくれるコマンドです。
これがないと実行し終わったあとに勝手にコマンドプロンプトが閉じてしまうので入れておきました。

これを前回のバッチファイルに当てはめて修正するとこんな感じになります。

@echo off
setlocal
set /p comment="コメントを入力してください:"
cd ”ローカルリポジトリ” && ^
git add . && ^
git commit -m %comment% && ^
git push origin master
pause
exit /b 0

それではテストをしてみます。

【実行前のgit】

f:id:hamaguchi_amago:20190520010049j:plain
図4
【コマンド】
f:id:hamaguchi_amago:20190520010120j:plain
図5
バッチファイルを実行します、コメントは『2019/05/20 amago update』です。コメントはダブルクォーテーションでくくります。
これバッチのほうに入れておけばよかったな。。。

【実行後のgit】

f:id:hamaguchi_amago:20190520010440j:plain
図6
一番上に入力した内容が出力されました。

最後に

最後まで見てくださってありがとうございました。
この記事をみて自分もやってみよう真似してみようと思える人が少しでもいたらうれしいです。

今後も役に立ちそうな小ネタをどんどん書いていきたいと思います。
リクエストがございましたら連絡お願いします。

 

にほんブログ村 IT技術ブログへにほんブログ村

ブログランキング・にほんブログ村へにほんブログ村

【バッチファイル】バッチファイルを使って git にpushするツールを作ってみた①

こんにちはAmagoです。

先日、『【C#】Genericsで型変換を使ってみた - amagoのエンジニアブログ』を書いているときに調べたことを取り上げようと思います。

新しいことを始めると、次から次へと分からないことが出てくるから大変です。記事のネタになるから別にいいんですけどね。

さて、皆さんGitにpushするときはどうしてますか?
おそらく、大人数のプロジェクトだと専用のGUIツールを使っているかと思います。
私の場合は、個人単位で管理しているリポジトリなのでわざわざGUIを使わなくてもいいかなぁと思ってコマンドで直接Pushしています。
GUIは重たかったり起動するのに時間がかかりますからね。。。

initさえしてしまえば、GitにPushするときは、以下のコマンドを叩けばよいのです。
(本当は、差分を確認したほうがよいのですが、自分しか使っていないリポジトリなので自己責任ってことで)

 ①ローカルリポジトリへ移動する。
 ②add
 ③commit
 ④push

$ cd ローカルリポジトリ
$ git add .
$ git commit -m "コメント"
$ git push origin master

このコマンドも何回も叩いているとだんだんこんなことを思うようになってきました。

コメントの内容が違うだけで毎回同じコマンド叩いてるなぁ~
いちいちコマンドプロンプト立ち上げるのめんどくさいな
あれ?Pathどこだっけ?

そこで、バッチファイルでも作ってみるかと思ったわけです。

目次

バッチファイルとは

コマンドプロンプトで使っているコマンドを実行するファイルです。
拡張子が『.bat』になっているファイルです。

実際に書いてみた

参考サイト
バッチファイルで長い1行の処理を改行を入れて複数行に分けて書きたい - みちしるべ
バッチファイルでよく使う書き方まとめ - Qiita

参考サイトを見ながら作ってみました。

①ファイルを作る

作る場所はどこでも大丈夫です。
私は何も考えずにデスクトップに配置しました。

まず、『push.txt』というファイルを作ります。

f:id:hamaguchi_amago:20190519161636j:plain
図1

②コマンドを記述

その次にコマンドを書いていきます。
コメントは『update』固定ですが、一旦こんな感じで書いてみました。

@echo off
cd ”ローカルリポジトリ” && ^
git add . && ^
git commit -m "update" && ^
git push origin master
exit /b 0

cd の後ろはローカルリポジトリを指定します。

『@echo off』はバッチファイルを書く時のお約束みたいなもです。
コマンドを実行結果を出さないようにしています。実行結果を出したい場合はonにしてください。

『exit /b 0』もお約束です。
戻り値を渡しているのですが、今回は1ファイルしか使っていないのであまり意味がありません。

複数のコマンドを使うので『&&』を使います。
『&&』は前回のコマンドが正常終了したら次のコマンドを実行します。

改行したほうが見やすかったので改行します。
単純に改行するとコマンドを正しく認識してくれなくなるので『^』を行の最後に入れます。『^』はバッチファイルでのエスケープ文字です。

③拡張子を変更

コマンドを書き終わったら拡張を『bat』変更します。
途中で警告が出ますが気にせず変更してください。

f:id:hamaguchi_amago:20190519163959j:plain
図2

『はい』を選択するとbatファイルとして使えるようになります。

f:id:hamaguchi_amago:20190519164118j:plain
図3

あとは『push.bat』をクリックするだけです。

最後に

最後まで見てくださってありがとうございました。
この記事をみて自分もやってみよう真似してみようと思える人が少しでもいたらうれしいです。

今回はコメントを『update』固定でpushする方法でしたが、次回はコメントも指定してpushするバッチファイルを作ってみたいと思います。

hamaguchi-amago.hatenablog.com

 

にほんブログ村 IT技術ブログへにほんブログ村

ブログランキング・にほんブログ村へにほんブログ村

【C#】Genericsで型変換を使ってみた

こんにちはAmagoです。

 

C#のコードを書き始めて1年くらい経ちます。最近になって、Genericsの使い方について理解できたので、記事にしようかと思います。

私がプログラムを書くときに心がけていることがいくつかあります。

 
見やすく、保守し易いことです。

 

チーム開発ではこれに当てはまらないソースをよく見かけます。

同じような条件分岐が至る所に散りばめられており、仕様変更のたびに全部に修正を加えたりと・・・

それをそのままコピーペーストして無駄な処理が倍々とかね・・・

 

今回は自分が担当してた機能でジェネリクスを使ったらソースがかなりコンパクトになったので、こんな使い方もあるんだぞというご紹介です。

 

ジェネリクスとは

Generics(ジェネリクス)とは、処理内容は同じで型だけ違う場合に使います。(他にも色々あると思いますが、自分はそう認識してます)

ジェネリック - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

ジェネリクスを使ってみよう

今回はint、long、Decimalのnull許容型の変数を別の数値型に変換するプログラムを作ってみよう思います。
今回作成したサンプルソースGitHubで公開してあります。よかったら見てください。
GitHub - hamaguchi-amago/GenericsSample: ジェネリクス サンプルソース ブログの記事で作りました。

intのnull許容型からintに変換してみる(ジェネリクスは使っていません。)

まずは、intのnull許容型からintに変換してみましょう、この場合はわざわざメソッドを作る必要はなく。Convert.ToInt32を使えばいいと思います。
[Sample1.cs]

using System;

namespace GenericsSample {
    class Sample1 {
        public void Main() {

            int? data = null;
            var result = Convert.ToInt32(data);

            Console.WriteLine("Type : " + result.GetType());
            Console.WriteLine("Value: " + result.ToString());
        }
    }
}

実行結果

Type : System.Int32
Value: 0

実行結果を見ると、nullを渡しても0が返ってきますね。

intとlongも変換してみる(こちらも、ジェネリクスを使っていません)

次は、intとlongを戻り値として受け取りたい場合です。
こちらも、専用のメソッドがあるのでわざわざ独自のメソッドを作る必要はなさそうですね。

[Sample2.cs]

using System;

namespace GenericsSample {
    class Sample2 {
        public void Main() {

            int? data1 = null;
            long? data2 = null;

            var result1 = Convert.ToInt32(data1);
            var result2 = Convert.ToInt64(data2);

            WriteData(result1);
            WriteData(result2);
        }

        private void WriteData(object data) {
            Console.WriteLine("Type : " + data.GetType());
            Console.WriteLine("Value: " + data.ToString());
            Console.WriteLine();
        }
    }
}

実行結果

Type : System.Int32
Value: 0

Type : System.Int64
Value: 0

結果も前回と同様に、両方ともnullを渡して0が返ってきますね。

戻り値も引数も指定したい場合は?

ここでとうとうジェネリクスの出番です。よくよく考えると今回の例はジェネリクスを使わなくてもConvertを使えば
良かったかもなぁと執筆中に気が付いてしまいましたが・・・

nullを受け取ったら1を返すとか100をかえす仕様だったり。
メソッド内でほかのメソッドを呼ぶ必要がある場合は無駄ではないよね?
と自分を慰めつつ続きを紹介していきます。

ジェネリックを使って作ったメソッドがこちらです。
[Sample3.cs]

        private T2 Convert<T1, T2>(T1 data) {
            if (data == null) {
                return (T2)(dynamic)(0);
            } else {
                return (T2)(dynamic)data;
            }
        }

メソッドの仕様は、T1型で受け取ったデータをT2型に変換して返し、nullの場合は0を返します。

ジェネリックの便利さがいまいちピンときていないかもしれないので、具体的に例を出します。
例えば、引数に『int?、long?、Decimal?』の3パターンの型のデータを受け取り、それぞれ『int、long、Decimal』の3パターンの型を返すメソッドを作る場合について考えてみます。
ジェネリックを使わずに型を指定すると3×3で9個、ここにもう一つ型が増えたら4×4で16個も同じようなメソッドを作らないといけませんよね。

そんなめんどくさいことをやらなくても型を指定して呼び出してあげれば、たった数ステップで仕様を満たすことが出来るのです。

次は呼び出し方についてみてみましょう。呼び出し方はこちらになります。
[Sample3.cs]

       private void Pattern1() {
            Int = null;
            Long = null;
            Decimal = null;

            var result_1_1 = Convert<int?, int>(Int);
            var result_1_2 = Convert<long?, long>(Long);
            var result_1_3 = Convert<Decimal?, Decimal>(Decimal);

            WriteData(result_1_1);
            WriteData(result_1_2);
            WriteData(result_1_3);
        }

        private void WriteData(object data) {
            Console.WriteLine("Type : " + data.GetType());
            Console.WriteLine("Value: " + data.ToString());
            Console.WriteLine();
        }

『T1』に該当する部分に渡したい型、『T2』に受け取りたい方を指定してあげればOKです。実行結果はこちらになります。

実行結果

Type : System.Int32
Value: 0

Type : System.Int64
Value: 0

Type : System.Decimal
Value: 0

3パターンともnullを受け取って0を返していますね。次は別の型に変換できているか見てみましょう。

[Sample3.cs]

        private void Pattern2() {
            Int = null;
            Long = null;
            Decimal = null;

            var result_2_1 = Convert<int?, Decimal>(Int);
            var result_2_2 = Convert<long?, int>(Long);
            var result_2_3 = Convert<Decimal?, int>(Decimal);

            WriteData(result_2_1);
            WriteData(result_2_2);
            WriteData(result_2_3);
        }

実行結果

Type : System.Decimal
Value: 0

Type : System.Int32
Value: 0

Type : System.Int32
Value: 0

result_2_1 はint?からDecimalに、result_2_2 はlong?からintに、result_2_3 はDecimal?からintに型が変換されて、nullを受け取ってるので0を返しています。
もちろん、null以外に数値が設定されている場合も正しく動きます。ちなみに変数Intに設定されている値の2,147,483,647はintの最大値です。
[Sample3.cs]

        private void Pattern3() {
            Int = 2147483647;
            Long = 2147483648;
            Decimal = 1000;

            var result_3_1 = Convert<int?, int>(Int);
            var result_3_2 = Convert<long?, long>(Long);
            var result_3_3 = Convert<Decimal?, Decimal>(Decimal);

            WriteData(result_3_1);
            WriteData(result_3_2);
            WriteData(result_3_3);
        }

実行結果

Type : System.Int32
Value: 2147483647

Type : System.Int64
Value: 2147483648

Type : System.Decimal
Value: 1000

  

最後に

最後まで読んでくださってありがとうございます。
ジェネリクスについて少しでも理解して、今度使ってみようと思った方がいれば幸いです。
今後も、知ってると少し楽ができるような開発ネタを紹介できればなと思います。

 

にほんブログ村 IT技術ブログへにほんブログ村

ブログランキング・にほんブログ村へにほんブログ村

悲しみ、GitHub Pages ってphpつかえないの?

こんにちはAmagoです。

 

失敗談というか、次回やるときに参考になりそうなサイトをまとめておこうと思います。

 

結論から言うとやりたいと思ったりことができなかったのです。思いつきであれこれ機能を追加するのはよくあることなのですが、もう少し調べておけばよかったなぁと反省・・・

 

先日、ポートフォリオサイトを記事をブログに投稿しました。

hamaguchi-amago.hatenablog.com

 

作ったサイトはこちら

https://hamaguchi-amago.github.io/Portfolio/

 

まず初めに、ブログを始めて数日のアクセス数がこちら  、

ポートフォリオサイトをいじっているときに自分がアクセスしているだけで、

自分以外誰も見てないじゃん!!と思いながらも挫けずブログを書こうと思います。

f:id:hamaguchi_amago:20190516000149j:plain

 

早くアクセス件数が伸びてほしいと思い。アクセス件数の伸びそうなアイデアを考えました。

 

Webスクレイピングを使ってポートフォリオサイトに自分の記事リンクを載せてみよう!!と思ったわけです。

 

Webスクレイピングとは?

Webスクレイピングとは、WEBサイトからWEBページのHTMLデータを収集して、特定のデータを抽出して整形する処理です。

自分の場合では、下の図の赤い部分を取り出して自分のサイトに埋め込こんで、

自分のブログの注目記事を他のサイトでも見てもらえるようにしようと 思いました。

 

f:id:hamaguchi_amago:20190516002436j:plain

 

どうやってWebスクレイピングをするか?

Webスクレイピングってpythonのイメージが強かったのですが、どうやらphpでもライブラリさえインストールしてしまえば簡単に出来ることがわかりました。

qiita.com

 

phpが使える環境なのか?

あとは、実現化のなのかどうかというところですが、GitHub Pagesでは、静的なhtmlしか使えず、phpはつかえないそうな。。。

Github Pages について整理しておきます | そんなこと覚えてない

 

 せっかく思いついたのにやらないのは、もったいないのでもう少し勉強をして

チャレンジしてみたいと思います。

 

 

にほんブログ村 IT技術ブログへにほんブログ村

ブログランキング・にほんブログ村へにほんブログ村