mizzsugar’s blog

日々感じていることや学んだことを書きます。エンジニアリング以外にも書くかもしれません。

【Java入門】データベースの情報を取得する

今回は、この生徒一覧表テーブルから、情報を取得します。

f:id:mizzsugar:20180608083541p:plain

SQL文にすると

CREATE TABLE `students` (
    `id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    `name`  TEXT NOT NULL,
    `grade` INTEGER NOT NULL
);

Studentクラス

public class Student {

    private int id;
    private String name;
    private int grade;

//コンストラクタ
    public Student(int id, String name, int grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getGrade() {
        return grade;
    }

//データベースに接続するメソッド
    private static String getSqlite3Path(){
        return System.getProperty("user.dir") + File.separator + "sql" + File.separator + "juku.sqlite3";
    }

    
//テーブル全体を取得するメソッド
    public static List<Student> fetchStudents() {

        List<Student> rows = new ArrayList<Student>();

        try {
            Connection connection = DriverManager.getConnection("jdbc:sqlite:" + getSqlite3Path());
            Statement createStatement = connection.createStatement();
            ResultSet resultSet = createStatement.executeQuery("SELECT * FROM students;");

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int grade = resultSet.getInt("grade");
                Student row = new Student(id, name, grade);
                rows.add(row);

            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return rows;
    }

//生徒IDを指定して、該当する生徒IDのレコードのみ取得するメソッド
    public static Student getById(int studentId) {

        try {
            Connection connection = DriverManager.getConnection("jdbc:sqlite:" + getSqlite3Path());
            PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM students WHERE id = ?;");
            prepareStatement.setInt(1, studentId);
            ResultSet executeQuery = prepareStatement.executeQuery();

            if (executeQuery.next()) {
                int id = executeQuery.getInt("id");
                String name = executeQuery.getString("name");
                int grade = executeQuery.getInt("grade");
                Student row = new Student(id, name, schoolId, grade);
                return row;
            } else {
                return null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

}

【Java入門・Python入門】if文とswitch文

If文は条件が決まっている時、条件が範囲指定の時に利用します。

例えば、 18歳未満なら運転できず、18歳以上なら運転できるという条件のもと、 誰が運転できて誰が運転できないかの文章を表示するクラスは以下のようになります。

Java】 Personクラス

public class Person {

    private int age = 0;
    private String name = "";

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void judge() {
        if (this.age < 18) {
            System.out.println(this.name + "は、運転できません。");
        } else {
            System.out.println(this.name + "は、運転できます。");
        }
    }

}

Mainクラス

public class Main {

    public static void main(String[] args) {
        Person ayumi = new Person(17, "Ayumi");
        Person bob = new Person(19, "Bob");

        ayumi.judge();
        bob.judge();
    }

}

Python】 Personクラス

class Person:
    def __init__(self, age, name):
        self.age = age
        self.name = name

    def judge(self):
        if age < 18:
            print(self.name + "は、運転できません。")
        else:
            print(self.name + "は、運転できます。")


ayumi = Person(17, "Ayumi")
bob = Person(19, "Bob")

ayumi.judge()
bob.judge()

Switch文は1つの変数の値に対して条件分岐を行います。

例えばサイコロ占いで 1が出たら大吉 2が出たら中吉 3が出たら吉 4が出たら小吉 それ以外が出たら凶 というクラスを作成します。

Java】Fortuneクラス

public class Fortune {

    public static void main(String[] args) {
        int random = (int) (Math.random() * 6 + 1);
        switch (random) {
        case 1:
            System.out.println("大吉");
            break;
        case 2:
            System.out.println("中吉");
            break;
        case 3:
            System.out.println("吉");
            break;
        case 4:
            System.out.println("末吉");
            break;
        case 5:
            System.out.println("凶");
            break;
        case 6:
            System.out.println("大凶");
            break;
     default:
            break;
        }
    }
}

Pythonには、Switch文はありません。 ここでは代わりに、if文を使ってSwitch文のようなことをします。

Python】Fortuneクラス

class Fortune:
    def dice(n):
            if n  == 1:
            return "大吉"
            elif n == 2:
            return "中吉"
            elif n == 3:
            return "吉"
            elif n == 4:
            return "小吉"
            else:
            return "凶"


for n in range(5):
    print(dice(random.choice([1, 2, 3, 4, 5, 6])))

【Mac】ローカルのリポジトリをBitBucketにコミットする方法(コマンド使用、vi使用)

1.ブランチを作成

git checkout -b ブランチ名

でブランチを作成。 そうしないと、マスターに直接変更が入ってしまう。

git status

変更されたものが何かを見れる

2.コミット対象を選択する

git add コミット対象とするファイル

git addで変更をコミットしたいものを選択。 ちなみに、

git add .

で全部選択。

git status

でコミットしたいファイルがコミット対象になっているか確認 (stageに上がっているか確認、とも言う)

3.git addで選択したコミット対象をコミットする

git commit

git commitを実行すると、コミットのメッセージを書く画面になる

一行目にコミットの内容を簡単に説明(サマリー) 2行目を空行にして 3行目から詳細な説明を書く。

INSERTモード(実際にEditorに入力するモード)を抜けるために escapeキーを押す。

INSERTモードを抜けたら、「:s」でコミットメッセージで保存して 「:q」でviを終了してgitに戻る。

git status

git statusで実際にコミットされているか確認する。 先ほどの処理でコミット対象としたものがなかったら、コミットされた証拠。

*確認用のコマンドなので不要*

git log

git logでコミットしたものの履歴を見れる。

4.ローカルのリポジトリをBitBucketのリポジトリに反映させる

この段階ではまだローカルにある状態。

git push

でリモートにプッシュする

Bitbucketにログインし、 該当するリポジトリのプルリクエストに移動。

「プルリクエストを作成」をクリック。

「Close branch」にはチェックを入れといた方がいい。 なぜなら、いらないブランチがリモートに残るから。

「プルリクエストを作成」を押す。

レビューしてもらったら、「マージ」を押して リモートのリポジトリに変更を加える。

マスターを再読み込みすると、反映されている。

マージしたら、ローカルのブランチをmasterに戻して、 git pullを実行する

git checkout master
git pull

BitBucketののリポジトリをローカルにクローンする方法(コマンド使用)

※本記事は、公開鍵と秘密鍵のペアを作成した前提で書いています。 鍵のペアの作成方法につきましては、こちらの記事がわかりやすいです↓

Linux

Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru

Mac

秘密鍵・公開鍵を作成する(Mac)

Windows

WindowsでSSHの鍵を作る

1.コマンドラインを開く

cat ~/.ssh/id_rsa.pub

rsa.pubは公開鍵です。 catはファイルの中身を表示します。

上記コマンドを打ったら、長い文字列が表示されます。 こちらが、公開鍵の内容です。

表示された内容をコピーします。

2.BitBucketに公開鍵を登録する

BitBucketにログインし、アカウントページに移動します。

「セキュリティ」の「SSH鍵」に移動し、「鍵の追加」を押します。

f:id:mizzsugar:20180530212130p:plain

ローカルの公開鍵がBitBucketに登録されました。

3.BitBucketのリポジトリをクローンする

BitBucketのリポジトリのページに移動します。 「ソース」に移動します。

SSHを指定して、GitのURLをコピーします。

f:id:mizzsugar:20180530212832p:plain

コマンドラインに移動します。

*テスト用のコマンドなので不要*

cd /tmp

tmpは一時保存するためのフォルダです。

git clone “先ほどコピーしたURL”

「Done」と表示されたら、きちんとクローンされた証拠ですので、 実際に利用するフォルダにクローンします。

cd

cdで、そのユーザーのホームディレクトリに移動します

cd eclipse-workspace(リポジトリを利用する場所)
git clone “先ほどコピーしたURL“

「Done」っと表示されたらクローン終了。

おまけ.Eclipseでクローンしたリポジトリを編集できるようにする

Eclipseを開き、クローンしたリポジトリを入れるためのプロジェクトを作成します。

左クリックし、「Import」を選択します。

「File Systems」を選択し、 クローンしたリポジトリがあるディレクトリに移動し、指定します。

f:id:mizzsugar:20180530214212p:plain

f:id:mizzsugar:20180530214358p:plain

f:id:mizzsugar:20180530214801p:plain

「Finish」を押したら、クローンしたリポジトリの内容を 指定したフォルダから見れます。

【HTML入門】GETとPOSTの違い

htmlファイルのformに利用する、GETとPOSTの違いについて、 自分用メモとしても、書きます。

POSTとGETの違いは、formのmethodによって、状態の変化があるかどうかです。

ツイッターを例にすれば ツイートしたら、ツイッターのDBに変化が起きます。 (この変化のことを「○○(忘れた)」と言います。)

ツイートしたときに変更が起こるので、methodはPOSTになります。

タイムラインの読み込みなどは、変更が起きないので、GETになります。

【読書レビュー】人工知能×ビッグデータが「人事」を変える

評価・選考の基準があいまいな日本の人事

人事の最大の課題は労働力の確保、労働力の品質の維持です。 バブル時代は、労働力の確保のために大量のリクルーターを使って内定者を確保していましたが、 バブル崩壊後は利益を産まない管理部門に人員を割くわけにはいきません。

そのため、少ない人数で労働力を見極めなくてはなりません。

インターネットの普及につれて、採用サイトの利用も始まりました。

エントリーシートの内容だけで就職活動をする学生のことがわかるはずもなく、 企業と社員のミスマッチが起こっています。

人事は、哲学的な面が大きな鍵となっているため、コンピュータによって人事が決まることが恐れられてきた節があります。 しかし、「この人は活躍しそうだ」と採用者の経験と主観に頼った採用活動では たくさんいる応募者から本当に活躍しそうな人を見つけることは難しいです。

この本では、判断基準をより明確にするために、 AI×ビッグデータを利用した人事制度を提案しています。

4つの日本のアナログな問題点

1.制度主義

日本の人事は、人事制度企画が花形とされています。 複雑な制度設計の知識が必要だし、机上の業務としても面白いからです。

しかし、そのような企画系の戦略業務が花形になるについれて、人自体を扱う側面は減っています。

このような個人人事は、 現場に出て、組織の病巣が手遅れになる前に部長に相談して取り除いたり、 いい人材が干されていたら次にチャンスを与えるなど、 制度ではカバーしきれない現場の問題を調整する役割を果たします。

このような個別人事は、主観的かつ属人的であり、ナレッジが保管されないため、 グローバルに戦線が広がるにつれて、物理的に対応しきれなくなってきました。

そうして、ますます人事評価は現場主義になり、現場から遊離した存在になっていました。

2.組織と個人の意思のバランス

高度成長期に培った、「会社のために組織が一丸となって働く」という価値観のもと、 人事の業務は、以下に集団の和を保ち、ベクトルを一定の方法に向かわせることでした。

そのための、年功序列や終身雇用でした。

しかし、バブル崩壊後、年功序列と終身雇用による労務費を削減することを目的とした 成果主義が導入されることになりました。

しかし、組織の冗長性を糧とした集団主義でやってきた日本企業では、 バブル崩壊から二十数年たつが、個々人の頑張りが報われ、年功にとらわれずに思う存分挑戦できるという風土は未だに形成されていません。

3.暗黙知経営とダイバーシティの相克

日本の経営は暗黙知主導型です。 人事マネジメント面での暗黙知ベースの運用は、密室人事や声の大きさっで決まる政治的な異動や評価に帰結します。

ダイバーシティが進行すると、暗黙の前提が共有されていない社員同士にいかに共通認識をもたせ、ベクトルを合わせるか努力しなくてはいけなくなります。 そこで、説明責任が重要になりますが、暗黙知でやってきたので説明ができず、現場からの不信感につながってしまいます。

4.短期思考な評価制度

年功序列をベースにした総合判断・微調整型成果主義から、超短期的な目の前のKPI重視の成果主義にとってかわられたため、 結果を導くための先行投資や自組織が目指すビジョンや目的が後回しなりました。

プロセスにおけるイノベーションを起こさないと達成できないような数値目標をかかげても、プロセス評価の指標がルーティン作業の側面だけ評価しているため、 個人の成長にも、組織地の集積にも結びつかない評価が横行しています。

イノベーションを起こし続けるために

それまでは、「自社の競争優位をいかに確率するか」がテーマでしたが、 これからの時代、絶えずイノベーションを起こし続けないと生き残れなくなってきました。

スローな暗黙知経営ではなく、客観的な指標に基づいたマネジメントが必要です。 データに基づいた、明るくオープンな人事戦略が期待されます。

社内政治やしがらみにとらわれることなく、仕事に没頭できる基盤を想像するのが、AIとビッグデータに基づいた人事システムだと言えます。

AIとビッグデータを用いた知の共創の仕掛け

1.人事戦略:グローバル基準の戦略立案

自社の戦略から来る必要人材の要件や、グローバルな講師絵などがシミュレーションからはじきだされ、もっとも効率的な組織構成にするための方向性が明らかになる。 また、世界中のイノベーション企業の最先端の人事のベストプラクティスが手に入る

2.採用:求める人材像の基準化

採用面談でのやり取りの記録から徐々にデータが整備され、面接官の質問ややり取りの訓練が行われる。また、企業の採用基準が公開されることになれば、 企業のコンピテンシーアップを目指して学生もがんばることができる。 コンピテンシーを判断するのに、自己評価だけでなく多面評価をする仕組みができた上で、えこひいきをAIで排除しつつ、企業に対して学生の正しいコンピテンシーの情報を提供できる。

3.評価:「評判」の重要性 企業内に、社員だけのLinkedInのようなビジネスに特化したSNSの仕組みを構築し、そこにAIをかませることで、360度から見られた的確な評判情報を入手できる。

4.異動・配置:職場やメンバーとのマッチング

それぞれの役割の適任者を瞬時にデータベースから割り出すことが可能になる。

5.戦略から合理的に落とし込まれた教育・キャリアパス

AIが個々人のキャリアパスも考慮にいれて、教育受講をリコメンドしてくれる。

6.企業文化はビッグデータの宝庫

みなが共有するデータや口コミ情報、特定の行動情報をAIによって分析する仕組みが作成され、組織文化の形成に活用される。 常時、自社の社員の意識がいろいろな行動パターンを通して、センサーで感知するなどして集計され、「今、どの職場のモチベーションが高いか」となどをリアルタイムで集計し、表示し、共有できるようになる。

思ったこと

AIとビッグデータを用いて客観的かつリアルタイムな情報を入手し、 人事戦略をオープンなものにすることは、 風通しのよい職場に必要不可欠だと思いました。

一方、AIを採用に活用しようとしたところ、 AIの判断基準が人間にとってはブラックボックスであり、 やはり活用をやめたという例もあります。

企業間競争で生き残るために ブラックボックスであってもAIを利用する またはAIに判断を委ねる時代が来るのだろうか、 とぼんやり考えてしまいました。

また、モチベーションが高い低いを客観的に判断できることは良いけれども モチベーションをあげる方法がわからないままだと より窮屈になってしまうのではないかとも感じました。

【Java入門】データベースにアクセスする(SQLiteをEclipseに接続)

f:id:mizzsugar:20180502125153p:plain#データベースに保存している車の情報を出力する

目標:データベースにアクセスすることができる

f:id:mizzsugar:20180430121812p:plain

1 jdbcドライバーのダウンロード

今回は、SQLite用のドライバーをインストールします。

そもそも、なぜドライバーをインストールする必要ががあるのか

インターフェースからSQLに指示をするのに、以下のような指示系統を辿っています。 JDBCインターフェース ー> SQLドライバー ー> SQL

SQLは、PostgresSQLやMySQLなど、様々な種類があり、 それぞれ実行結果が同じでも、その方法が異なります。

それに対し、インターフェースは同じ方法で指示をするため、 それぞれのSQLに適した指示に変換する必要があります。

指示をSQL用のものに変換する役割を果たすのが、jdbcドライバーです。

ドライバーをインストールする方法 こちらのページがわかりやすいので、記載されている手順にそってダウンロードしてください。

https://www.kunihikokaneko.com/free/db/sqlitejava.html

2 クラスパスをセット

1.先程ダウンロードしたjarファイルをセットするためのフォルダを作成する。 (今回はlibといフォルダを作成します) f:id:mizzsugar:20180502124148p:plain

2.1で作成したフォルダにjarファイルをいれる

3.jarファイルのパスを通す

「プロジェクト」を右クリックし「ビルド・パス」>「ビルド・パスの構成」をクリックする。 f:id:mizzsugar:20180502124856p:plain

「ライブラリー」>「クラスパス」>「外部Jarの追加」をクリックし、ダウンロードしたjarファイルを選択する f:id:mizzsugar:20180502125050p:plain f:id:mizzsugar:20180502125143p:plain

3 ゲットパスのメソッドを作成

private static String getSqlite3Path() {
    return System.getProperty("user.dir") + File.separator + "sql" + File.separator + "juku.sqlite3";
}

System.getPropertyで、実行環境のプロパティを取得します。 user.dirは、アプリケーションを実行したパスを取得します。

OSによって、ファイルの区切り方が異なるので、File.separatorを指定します。

4 実装

SQLへの接続およびオブジェクトの取得を行います。

public class Car {
    private int id;
    private String name;
    private String color;
    private int fuel;
    private int distance;

    public Car(int id, String name, String color, int fuel, int distance) {
        this.id = id;
        this.name = name;
        this.color = color;
        this.fuel = 100;
        this.distance = 0;
    }

    private static String getSqlite3Path() {
        return System.getProperty("user.dir") + File.separator + "sql" + File.separator + "juku.sqlite3";
    }

    public static List<Car> fetchCars() {
        List<Car> rows = new ArrayList<Car>();

        try {
        //SQLに接続します。
            Connection connection = DriverManager.getConnection("jdbc:sqlite:" + getSqlite3Path());

        //SQL 文をデータベースに送るための Statement オブジェクトを生成します
            Statement createStatement = connection.createStatement();

         //ステートメントを作成したらSQL文を作成しデータベースに問い合わせを行います。
            ResultSet resultSet = createStatement.executeQuery("SELECT * FROM carTable;");

                       
                        //ResultSetインターフェースのオブジェクトにある各要素を配列に追加していきます。
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String color = resultSet.getString("color");
                int fuel = resultSet.getInt("fuel");
                int distance = resultSet.getInt("distance");
                CarTable row = new CarTable(id, name, color, fuel, distance);
                rows.add(row);

            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return rows;
    }

}