20190301の新人プログラマ応援に関する記事は3件です。

シンプルなトランプ用Class(Python)

プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし

の記事を見かけ、自分も入門者から卒業目指してチャレンジしてみることに。
第一歩として、シンプルなトランプ用クラス作成。
(Deck=シャッフルされたトランプの山)

内部のデータは扱いやすいように整数、
表示は絵文字を使った形式に。

ソースコード: gist

import random


class Card:
    SUITS = '♤♡♢♧'
    RANKS = '0 A 2 3 4 5 6 7 8 9 10 J Q K'.split()

    def __init__(self, suit, rank): self.suit, self.rank = suit, rank

    def __repr__(self): return f'{Card.SUITS[self.suit]}{Card.RANKS[self.rank]}'


class Deck:

    def __init__(self):
        self.cards = [Card(suit, rank) for suit in range(4) for rank in range(1, 14)]
        random.shuffle(self.cards)

    @property
    def next_card(self): return self.cards.pop()

表示のテスト:

d=Deck()
print(d.next_card)
print(d.next_card)
print(d.next_card)
実行結果
♡Q
♢6
♢7
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

デザインパターン ~Abstract Factory~

1. はじめに

GoFのデザインパターンにおける、Abstract Factoryパターンについてまとめます。

2. Abstract Factoryパターンとは

  • Abstract Factoryは、抽象的な工場という意味になります。
  • 抽象的とは、具体的にどのように実装されているかについては考えず、インターフェースだけに注目している状態のことです。
  • Abstract Factoryパターンは、部品の具体的な実装には注目せず、インターフェースに注目します。そしてそのインターフェースだけを使って、部品を組み立て、製品にまとめる方式です。
  • GoFのデザインパターンでは、生成に関するデザインパターンに分類されます。

3. サンプルクラス図

AbstractFactory.PNG

4. サンプルコード

4-1. Factoryクラス

抽象的な工場を表すを行うクラスです。Link、Tray、Pageを作成します。

Factory.java
package factory;

public abstract class Factory {

    public abstract Link createLink(String caption, String url);
    public abstract Tray createTray(String caption);
    public abstract Page createPage(String title);

    public static Factory getFactory(String classname) {
        Factory factory = null;
        try {
            factory = (Factory) Class.forName(classname).newInstance();
        } catch (ClassNotFoundException e) {
            System.err.println("クラス " + classname + " が見つかりません。");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return factory;
    }
}

4-2. Itemクラス

LinkとTrayを統一的に扱うクラスです。

Item.java
package factory;

public abstract class Item {
    protected String caption;

    public Item(String caption) {
        this.caption = caption;
    }

    public abstract String makeHTML();
}

4-3. Linkクラス

抽象的な部品:HTMLリンクを表すクラスです。

Link.java
package factory;

public abstract class Link extends Item {
    protected String url;

    public Link(String caption, String url) {
        super(caption);
        this.url = url;
    }
}

4-4. Trayクラス

抽象的な部品:LinkやTrayを集めたクラスです。

Tray.java
package factory;

import java.util.ArrayList;

public abstract class Tray extends Item {
    protected ArrayList tray = new ArrayList();

    public Tray(String caption) {
        super(caption);
    }

    public void add(Item item) {
        tray.add(item);
    }
}

4-5. Pageクラス

抽象的な部品:HTMLページを表すクラスです。

Page.java
package factory;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;

public abstract class Page {
    protected String title;
    protected ArrayList content = new ArrayList();

    public Page(String title) {
        this.title = title;
    }

    public void add(Item item) {
        content.add(item);
    }

    public void output() {
        try {
            String filename = title + ".html";
            Writer writer = new FileWriter(filename);
            writer.write(this.makeHTML());
            writer.close();
            System.out.println(filename + " を作成しました。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public abstract String makeHTML();
}

4-6. ListFactoryクラス

具体的な工場を表すクラスです。ListLink、ListTray、ListPageを作成します。

ListFactory.java
package listfactory;

import factory.Factory;
import factory.Link;
import factory.Page;
import factory.Tray;

public class ListFactory extends Factory {
    public Link createLink(String caption, String url) {
        return new ListLink(caption, url);
    }

    public Tray createTray(String caption) {
        return new ListTray(caption);
    }

    public Page createPage(String title) {
        return new ListPage(title);
    }
}

4-7. ListLinkクラス

具体的な部品:HTMLリンクを表すクラスです。

ListLink.java
package listfactory;

import factory.Link;

public class ListLink extends Link {
    public ListLink(String caption, String url) {
        super(caption, url);
    }

    public String makeHTML() {
        return "  <li><a href=\"" + url + "\">" + caption + "</a></li>\n";
    }
}

4-8. ListTrayクラス

具体的な部品:LinkやTrayを集めたクラスです。

ListTray.java
package listfactory;

import java.util.Iterator;

import factory.Item;
import factory.Tray;

public class ListTray extends Tray {
    public ListTray(String caption) {
        super(caption);
    }

    public String makeHTML() {
        StringBuffer buffer = new StringBuffer();
        buffer.append("<li>\n");
        buffer.append(caption + "\n");
        buffer.append("<ul>\n");
        Iterator it = tray.iterator();
        while (it.hasNext()) {
            Item item = (Item) it.next();
            buffer.append(item.makeHTML());
        }
        buffer.append("</ul>\n");
        buffer.append("</li>\n");
        return buffer.toString();
    }
}

4-9. ListPageクラス

具体的な部品:HTMLページを表すクラスです。

ListPage.java
package listfactory;

import java.util.Iterator;

import factory.Item;
import factory.Page;

public class ListPage extends Page {
    public ListPage(String title) {
        super(title);
    }

    public String makeHTML() {
        StringBuffer buffer = new StringBuffer();
        buffer.append("<html><head><title>" + title + "</title></head>\n");
        buffer.append("<body>\n");
        buffer.append("<h1>" + title + "</h1>\n");
        buffer.append("<ul>\n");
        Iterator it = content.iterator();
        while (it.hasNext()) {
            Item item = (Item) it.next();
            buffer.append(item.makeHTML());
        }
        buffer.append("</ul>\n");
        buffer.append("</body></html>\n");
        return buffer.toString();
    }
}

4-10. Mainクラス

メイン処理を行うクラスです。

Main.java
import factory.Factory;
import factory.Link;
import factory.Page;
import factory.Tray;

public class Main {
    public static void main(String[] args) {

        Factory factory = Factory.getFactory("listfactory.ListFactory");

        Link qiita = factory.createLink("Qiita", "https://qiita.com//");
        Link dot = factory.createLink("ドットインストール", "https://dotinstall.com/");

        Link yahoo = factory.createLink("Yahoo!Japan", "http://www.yahoo.co.jp/");
        Link excite = factory.createLink("Excite", "http://www.excite.com/");
        Link google = factory.createLink("Google", "http://www.google.com/");

        Tray pgTray = factory.createTray("プログラミング");
        pgTray.add(qiita);
        pgTray.add(dot);

        Tray searchTray = factory.createTray("検索サイト");
        searchTray.add(yahoo);
        searchTray.add(excite);
        searchTray.add(google);

        Page page = factory.createPage("お気に入り");
        page.add(pgTray);
        page.add(searchTray);
        page.output();
    }
}

4-11. 実行結果

キャプチャ.PNG

5. メリット

例えば、サンプルプログラムに新たな具体的な工場を追加する場合、Factory、Link、Tray、Pageのサブクラス作り、それぞれの抽象メソッドを実装することになります。つまり、factoryパッケージのクラスが持っている抽象的な部分を具体化していくだけになります。このとき、いくら具体的な工場を追加しても、抽象的な工場を修正する必要がありません。

6. 参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

開発から運用に転身して一ヶ月で感じた違い

はじめに

業務アプリケーションの開発をやってきていたが、もっと色々できるようなれば将来食いっぱぐれることが無くなるかなと思い
この度、運用DBAにスキルチェンジした。
一ヶ月仕事をしていった中で今まで気にしていなかった部分で指摘されることが多く
開発側と運用側では見る目線が異なると強く感じた。
また異なる部分を知っていく中で開発でも活かせると思い、その違いを忘れないようにまとめた。

引き出しの多さ

開発ではロジックを新たに生み出す(考える)作業だったが
運用では公開されている情報に対してどれだけ引き出しがあるかが重要

と書いたが、運用開発など関係なく引き出しは多ければ多いほどいい。
ここでいう引き出しというのは自身の知識だけでなくネットや書籍、その分野に詳しい知人などから
欲しい情報を得る手段のこと。

マニュアル

製品マニュアルこそ正義

製品について調べたときにググって上位に出てきたブログなどの内容をそのまま鵜呑みにしてしまうのは厳禁。
記事の内容が古かったり、対象としているバージョンが異なったりと信憑性が低い。
コマンド1つ1つに対してもなぜこのオプションの設定が必要なのかを製品マニュアルを見て確認する。

例えばjavaで文字列の処理をしたいだとかライブラリのインストール方法など
そのマニュアル(またはドキュメント)を見るとより理解が深まる。

作業手順の作り方

実際に作業する人が手順書を上から下までみないと何をしているか分からないような記載では不親切。
・エクセルならば1セルのなかに1コマンドだけを記載する。
・コマンドの実行結果の判断を記載する。
・どの接続先で操作しているのかのサーバ名、ユーザ名を明記する。
・繰り返し部分は省略せず実際にコマンドを打つ回数分記載する。

フォルダ権限

リモート接続先にファイルを転送する際はフォルダ権限を確認する。
作業手順書を作成する際に権限部分で躓くことがないようにしておく。

ログの監視

作業する時にはtailコマンドを利用して常にログを監視している。
Apacheの落とし上げなどで問題が起きた時だけログを見ていたが
それだけではダメで動作しているけど何か問題が発生している可能性もある。
それを確認すべき。

表領域、ディスク容量の監視

「サーバ=高スペック高容量」と思っていて何も考えずにサーバにファイル転送を行っていたが
サーバはこのぐらいのスペック・容量が必要だと考えられて構築されているので無制限に使えるほどの容量はない。
そのため、データ転送が伴う作業には必ず容量あふれが発生しないか確認・監視する。

LV(論地ボリューム)の分け方

Linuxでは論地ボリュームを作成して物理ディスク容量を抽象化している。
バックアップファイルやログファイルなどデータが増大していく場所については
LVを別に割り当てて、物理ディスク拡張時の管理を容易にする。

「LVってレベルのことですか?」と聞いたら全然違っていた。
またこういった略称でのやり取りが非常に多い。

X Window

リモート接続先のGUI画面をローカルPCに表示する。
生まれて初めて聞いた用語だがLinuxを扱う人には一般的らしい

まとめ

実際に書いてみるとそんなの当たり前でしょと言われそうな事が多かったが、
今までそんなに深く考えていなかった。。

特に重要だと思うのがマニュアルを見ること!
マニュアルすべてに目を通せっていう話ではなく必要なことをその都度、マニュアルで調べたほうが理解が深まる。
いま考えるとプラモデル作るときは必ず説明書みて順番通りに作っているのに、Apacheインストールするときには説明書(マニュアルやドキュメント)を見ないとか
やっていることがおかしいかった。

これから新しいことを学ぶ上で思うこと

DBAになるためにオラクルシルバーを取って基礎知識を蓄えた気になっていたが、
実際に作業をすると何やってんのかよくわからない。
「あー試験でたなそれ」と思えるぐらいの浅い理解しかできていなかった。
やっぱり困らないと調べることはしないし、困ったことを調べて解決していかないと深い理解ができないと強く感じた。
まずは基礎を1から10覚えてから応用へ!!っよりはある程度やりたいことを決めて、その目的を進めていくうえで必要となった基礎を覚えていくほうがよい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む