Prokumaの雑記

限りなく日記帳に近いブログ

目撃者として書いてみる韓国の高校生活と大学入試 / 第二編

I. 高校一年

6. 赤点、再試験が存在しない世界

日本の高校には赤点という制度があることを聞きました。韓国の高校にはそういう制度はありません。 出席日数が足りなくて留年になる場合はありますが、基本出席日数だけ足りれば卒業はできます。 高校生になっても割り算ができない、長文を書くことができない、そういう人も再試験なしに生活記録簿に悪い成績だったことが記録されるだけです。 もちろん頭のいい高校は違うかもしれませんが、自分の出身高校は第一編で紹介した一般高校だったので、学力の低い高校ではなく平均的な高校だと思います。

国民の学力低下をそのまま放置するにはいけないので、 政府機関が学力評価を実施し、成績の悪いには補習をさせるなど、赤点と再試験のような趣旨の制度が存在しないわけではありませんが、 これでいくら悪い成績を取ったとしても、結論からいうと卒業できます。

7. 生徒会

当たり前かもしれませんが、生徒会は存在します。 僕は当時生徒会を「無報酬で働く教員の雑用係」と評価し、「お前はやっぱりひねくれたやつ」とか言われましたが、 顧みると無報酬ではありませんでした。賃金をもらうわけではありませんが、生徒会の履歴は有利になります。

8. 夜間自律学習(略してヤジャ)

夜に学校に残って自習することを意味します。今は参加自由に変わった学校が多いらしいですが、僕の場合参加が強いられていました。 「自律」と書いてあるものの、参加が強いられたため、生徒の間では「夜間他律学習」とも言われます。 僕の母校の学校の場合、一・二年生は21時まで、三年生は22時まででした。 僕は一ヶ月間この夜間自立学習を経験し、 担任の先生に「僕は国内の大学を受けるつもりはありません。先生たちの管理は不要です」と言い、両親の許可を得て夜間自立学習に参加しないことになりました。

9. 放課後授業

8限目に行われる授業を意味します。7限で学校は終わりますが、放課後授業という名で8限目の授業が存在しました。 主に国語、数学、英語の授業が行われ、クラスによっては日本語や中国語の授業が行われる場合もありました。 これも参加が強いられていました。放課後の定義は実質「7限終了後」でした。 この放課後授業は夜間自立学習とは違い、お金を払わないとなりませんでした。

講義「オブジェクト指向プログラミング」特集/3. コンストラクタ

九州工業大学飯塚キャンパスの講義「オブジェクト指向プログラミング」特集三番目の記事です。今回の記事で説明するのはコンストラクタというものです。実は前回の記事でもコンストラクタは登場しておりますが、ざっくりとした説明しかしてないので今回は詳しい説明をしてみようと思います。

1. コンストラクタとは

簡単にいうと、インスタンスを生成するとき呼び出されるものです。コンストラクタはnew クラス名(引数);で呼び出します。コンストラクタが呼び出されると左の変数に新しく生成されたインスタンスが格納されます。

1.1 実はコンストラクタを定義しなくてもいい場合がある

実はコンストラクタは必ずしもクラス内で定義する必要があるものではありません。コンストラクタを作成しなくてもインスタンスの生成自体は問題ありません。前回の記事で作成したScoreクラスがその一例です。Scoreクラスはコンストラクタを定義しなかったのにもかかわらず、new Score()インスタンスの生成ができました。これは、基本的にインスタンス生成時に渡す引数がない、かつ生成時にする動作が特に存在しない場合、基本的に何もせずインスタンスを生成するだけのコンストラクタがあるとみなされ、定義しなくても動くわけです。

1.2 コンストラクタの定義の仕方

コンストラクタは次のように定義します。

class Name {
    Name(Type p1, Type p2,...) {
        // 何らかの生成時の動作
    }
}

コンストラクタの名前は、クラスの名前と同じ名前を使う必要があります。引数は必須ではありません。

1.3 コンストラクタの重複定義

実はコンストラクタは引数の種類が異なれば重複して定義できます。

class Name{
    Name() {
        //
    }

   // Stringは文字列の格納ができる型です
    Name(String a, String b) {
        //
    }
}

また、当然な話ですが、それぞれ違う動作を定義するのも可能です。重複定義したコンストラクタは、引数の種類と個数によって区別されます。例えば、new Name();の場合はName()コンストラクタが呼び出されます。new Name("名前", "あだ名");の場合、Name(String a, String b);コンストラクタが呼び出されます。

1.3.1 実はメソッドも重複定義は可能

実はコンストラクタだけではなく、メソッドでも同様のことができます。コンストラクタと同様、引数の種類と個数によって区別されます。

public class Add {
    public int add(int a, int b){
        return a + b;
    }
    public double add(double a, double b){
        return a + b;
    }
}

このように、同じaddという名前でint型の変数同士の足し算とdouble型の変数同士の足し算を行うメソッドを定義することができます。同様の処理を行いたいが入力、つまり受け取るメッセージが違う場合、このような機能を使います。

次回は、継承について紹介したいと思います。今回はここまでです。お疲れ様でした。

講義「オブジェクト指向プログラミング」特集/2. クラスとメソッド

講義「オブジェクト指向プログラミング」特集、二番目の記事です。

今回は、クラスとメソッド、そしてJavaでの定義の仕方について説明します。この特集は、みなさんが講義でC言語の基礎的な文法を習ったという前提で作成したものなので、条件分岐・繰り返し等の説明はしません。もしその基礎的な文法がわからないという方は(条件分岐もわからないのに単位が取れたこと自体が不思議ですが、、、)、きちんと基礎的な文法を身に付けましょう。

1. クラスとメソッド

クラスとメソッドは、Javaという言語を説明することにあたって欠かせない存在です。クラスとメソッド、一体どういうものなのか、今から説明します。

1.1 クラス

クラス(Class)は学級、種類、階級等の意味を持ちますが、ここでは「インスタンスを生成する機械」として考えましょう。インスタンスは、クラスという機械から生成された「モノ」として考えましょう。そうするとクラスが如何にオブジェクト指向で重要な部分であるかわかるはずです。

クラスは「モノ」を定義する構文です。下のコードのように「モノ」を定義します。

public class Score {
    int math;
    int english;
    int science;
}

このコードは、「成績表」という「モノ」を定義しています。クラスの中には、math``english``scienceというint型変数が宣言されていますが、これは「成績表」の要素、つまり各科目の成績を定義しているのです。C言語での構造体と差がなさそうに見えますが、クラスは構造体にはない機能を持っています。構造体にはない機能については、下で説明することにします。

1.2 メソッド

メソッド(method)は方法、方式の意味を持ちます。単語から推測できると思いますが、「モノ」を動かす方法、つまり「モノ」の動作を定義する構文です。サブルーチンということは関数と同じですが、生成したインスタンスでそのインスタンスの操作に使うのが異なる点です。(インスタンスを生成せず使えるstaticメソッドというものもありますが、あとで説明します)

先ほど定義した「成績表」に相応しい動作を定義してみましょう。

public class Score {
    int math;
    int english;
    int science;
    
    public void setScore(int m, int e, int s) {
        this.math = m;
        this.english = e;
        this.science = s;
    }

    public void printScore() {
        System.out.println(this.math);
        System.out.println(this.english);
        System.out.println(this.science);
    }
}

成績を設定するsetScoreメソッドと成績を出力するprintScoreメソッドを定義しました。ちなみにthisはメソッド内部の局所変数ではないクラスの要素として定義された変数を明示的に示すものです。

1.3 カプセル化

カプセル化は、クラスを使用してインスタンスを生成し、利用する時、操作に必要のない内部でしか使われない変数、メソッドを隠蔽することを意味します。Javaでは、その隠蔽度の調整ができるアクセス修飾子というものを用いてカプセル化を行います。アクセス修飾子は、public、private、protected、指定なしがあります。ここでは、publicとprivateについて説明します。

publicは自分のクラスだけではなく、外部のどのクラスからもアクセスできるようにするものです。外部からアクセスできるようにする必要のある変数・メソッドはpublicにしましょう。

privateはそのクラス内でしかアクセスできないようにするアクセス修飾子です。外部から操作する必要のない変数・メソッドはprivateにしましょう。

その他は後ほど説明します。

先ほど定義したScoreクラスは、setScoreというメソッドがあるため、外部からmath``english``scienceへのアクセスは不要です。privateにしましょう。

public class Score {
    private int math;
    private int english;
    private int science;
    
    public void setScore(int m, int e, int s) {
        this.math = m;
        this.english = e;
        this.science = s;
    }

    public void printScore() {
        System.out.println(this.math);
        System.out.println(this.english);
        System.out.println(this.science);
    }
}

2. インスタンスの生成方法

成績表というモノを定義しましたので、成績表というモノを生成し、成績情報を入れ、成績を出力してみましょう。

// Program2.java
// 実はProgram2クラスとScoreクラスは別ファイルとして作成しても良いですが、授業では扱っていないため、一つのファイルにまとめました
// publicクラスは一つのファイルに一つしか定義できないため、Scoreクラスは指定なしにしています
public class Program2 {
    public static void main(String[] args){
        Score chino = new Score();
        chino.setScore(90, 90, 90);
        chino.printScore();

        Score cocoa = new Score();
        cocoa.setScore(100, 40, 100);
        cocoa.printScore();
    }
}
class Score {
    private int math;
    private int english;
    private int science;
    
    public void setScore(int m, int e, int s) {
        this.math = m;
        this.english = e;
        this.science = s;
    }

    public void printScore() {
        System.out.println(this.math);
        System.out.println(this.english);
        System.out.println(this.science);
    }
}

Scoreが型のように書かれていることがわかると思います。Score型の変数を定義し、new Score();インスタンスを生成し、変数に代入することができます。生成されたインスタンスは、操作によって違う情報や状態になります。上のプログラムを実行してみるとわかると思いますが、chinococoaprintScore()メソッドの実行結果が異なります。

3. static変数・メソッド

最後に、static修飾子について説明したいと思います。static修飾子は、インスタンスを生成しなくてもその変数・メソッドが使えるようにします。mainメソッドがその例の一つです。System.out.printlnメソッドもstaticメソッドです。Cの関数、全域変数のような使い方ができるようにするので、そのような操作をする必要があるときに使います。

講義「オブジェクト指向プログラミング」特集/1. オブジェクト指向とは/Javaについて

お久しぶりです。Prokumaです。九州工業大学飯塚キャンパスの講義「オブジェクト指向プログラミング」の内容を自分なりにまとめる特集、講義「オブジェクト指向プログラミング」特集記事を書こうと思います。

この授業はJavaを使ってオブジェクト指向プログラミングについて理解し、オブジェクト指向でプログラムの作成ができるようにをすることを目標としています。Java以外にもオブジェクト指向プログラミング言語はたくさんありますが、この特集ではJavaについて書こうと思います。

I. オブジェクト指向とは?

アラン・ケイオブジェクト指向のコンセプトを

  • すべてはオブジェクトである。
  • オブジェクトはメッセージの受け答えによってコミュニケーションする。
  • オブジェクトは自身のメモリーを持つ。
  • どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
  • クラスはその全インスタンスの為の共有動作を持つ。インスタンスはプログラムにおけるオブジェクトの形態である。
  • プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。

- Wikipedia日本語版「オブジェクト指向」より -

と定義していますが、すべてを「オブジェクト(Object)」つまり「モノ」として扱うのがオブジェクト指向の中心となる考え方です。「モノ」を定義し、その「モノ」の動作や構成要素を定義し、「モノ」のように扱えるようにする、これがオブジェクト指向です。

「モノ」の定義の仕方、「モノ」の動作や構成要素の定義の仕方については、後続の記事で説明することにします。

2. Java

Javaプログラミング言語の一つで、オブジェクト指向プログラミング言語として知られています。オブジェクト指向の概念を取り入れた言語であり、オブジェクト指向プログラミングをすることにあたって必要な文法的要素を持っています。

2.1 文法的特徴

オブジェクト指向プログラミングをすることにあたって必要な文法の具体的な説明は後続の記事でしますが、条件分岐、繰り返し、変数の型等においてはCに似ています。

if (s1) {
   // if s1 is true
} else if (s2) {
  // if s1 is false but s2 is true
} else {
  // etc...
}

for(i = 0; i < n; i++){
  // loop n times
}

Cと似通っている部分の説明はこの特集では省略します。

2.2 Java Virtual Machine(JVM)

JavaはCのようにコンパイラがコードを読み込み、バイナリを出力するような構造になっていますが、Cと違うのは、CPUですぐ処理ができるようなバイトコードを出力するわけではないということです。Javaコンパイラは、Java Virtual Machine(JVM)で処理できるバイナリファイルを出力します。つまり、Javaのバイナリファイルを実行するためには、JVMというものが必要となります。このJavaバイナリコードは、x86ARMアーキテクチャー等のCPU上で直接処理することはできません。

JVMJavaバイナリファイルを実行する際には、javaコマンドを用います。もちろんJVMがインストールされていないと実行できないので、各自インストールしてください。(JavaコンパイラもいるのでJDK(Java Development Kit)をインストールしましょう)

3. Java版「Hello World!」

3.1 プログラム作成

Javaで「Hello World!」を出力するプログラムを作成して見ましょう。

// HelloWorld.java
public class HelloWorld {
  public static void main(String[] args){
    System.out.println("Hello World!");
  }
}

public class HelloWorld {の部分はクラスを定義しています。クラスに関しては後続の記事で説明するので、今回は形式として覚えましょう。public class HelloWorldのHelloWorldの部分は、ファイルの名前から.javaを除いた部分と等しくなければなりません。注意しましょう。

public static vod main(String[] args){の部分はC言語でのmain関数と同様の役割を果たします。最初に実行された時の動作を定義します。

System.out.printlnC言語のprintf関数と似たような存在です。printfと違うところは、改行文字\nを入れなくても改行されるところです。

3.2 コンパイル

コンパイルJavaコンパイラであるjavacを用います。もちろんインストールされていないと使用できませんので、事前にJDKをインストールしましょう。

javac HelloWorld.java

を実行するとHelloWorld.classという名前のファイルが生成されます。実行は

java HelloWorld

コマンドラインで叩くことでできます。ちゃんと「Hello World!」と出力されるはずです。

4. 統合開発環境(IDE)

Javaを使用してプログラムを作成する時、多くの人は統合開発環境を用います。統合開発環境は開発のためのほとんどのものが揃っている環境を意味します。ここでは、いくつかの統合開発環境の名前を挙げてみます。

4.1 Eclipse

自分と同じ大学同じ学部同じ学科の人なら授業で馴染みのある統合開発環境だと思います。

4.2 IntelliJ IDEA

Jetbrains社が開発した統合開発環境です。有料版と無料版が存在しますが、無料版でも必要な機能は揃っているので無料版でいいと思います。

4.3 Netbeans

Oracleを中心としたコミュニティーにより開発された統合開発環境です。現在はApache財団によって開発されています。

個人的にはIntelliJ IDEAがオススメですが、人によって自分に合うIDEはそれぞれだと思うのでいろいろ使ってみて決定した方がいいと思います。IDEのインストールの仕方や設定方法についてはここでは説明しません。

次回は、クラスとメソッドについて書く予定です。今回はここまでです。

目撃者として書いてみる韓国の高校生活と大学入試 / 第一編

ひさしぶりです。Prokumaです。 韓国の高校出身であったため、韓国の入試制度に関して訊かれることが多かったので、その答えのまとめを記事として時系列に沿って書こうと思います。

I. 高校一年

1. 高校入学

僕は仁川広域市所在の某高校に通っていました。仁川がどういうところか知らない方の為に簡単に説明すると、ソウルの西側にある都市です。横浜市千葉市さいたま市みたいなところですね。 仁川等の韓国首都圏では、一部の進学校を除くほとんどの進学校には、高校入試がありません。第一志望から第n志望まで書いて、抽選で進学する高校が決まります。 ごく一部の進学校や工業高校等では高校入試が存在しますが、この記事では大学入試に関して語りたいので、詳しい説明は省略します。 上で説明したほとんどの進学校は「一般高校」、ごく一部の進学校は「特殊目的高校、自律型私立・公立高校」、工業高校等は「特性化高校」と呼ばれています。本記事では、このような用語を使うため、予め説明しておきます。 「特殊目的高校」「自律型私立・公立高校」は違うものですが、詳しい説明は本記事で目的としていないため、省略します。「頭のいい高校」という理解だけで十分だと思います。 僕は有能な学生ではなかったため、家から徒歩10分程度の距離にある普通の進学校に進学することを決めました。

僕が住んでいる福岡県では、朝課外を行う学校が存在し、辛かった朝課外の経験を語る周りの人が存在したのですが、僕が住んでいた仁川では朝課外はありませんでした。 僕が入学する前に廃止されたそうです。ですが、「夜間自律学習」というものは相変わらず存在しました。 「夜間自律学習」とは、夜に学校で自習を行うことを意味します。隣のソウル市では、学校側が「夜間自律学習」を強制するのは禁止されたらしいですが、仁川では(少なくとも僕の出身高校では)強制されました。 入学した翌日からこのような夜の自習が強要されました。これが僕の高校に対する初印象でした。

2. 当事者から観察者へ、立場の変化

僕と少しでも絡んでいた方には既知のことかもしれませんが、日本のアニメが好きなアニヲタで、アニメやラノベ等から日本語を習い、ある程度の日本語力を持っていました。 高校一年に出会った日本語の先生から、「ある程度の日本語力を持っているなら日本への留学はどう?」と言われ、三週間ぐらい考えてそうすることに決めました。 今顧みるとそれが正解だった気がします。 もちろん受験勉強を頑張らなくていいわけではなかったのですが、これで韓国国内の入試に何の関係もない人になったので、当事者からただの観察者へ、僕の立場は変化しました。

3. 英語の教科書

日本も一緒だと思っていますが、授業で使われる教科書は、教科書として認められる書籍が存在し、その書籍の中で学校側から採用されたものであるはずです。 ですが、少なくとも韓国の高校の英語の授業では違います。もちろん、そういう教科書も存在しますが、実際の授業は所謂副教材で行われることが多いです。 EBSという、日本に喩えるとNHK Eテレのようなところで出しているスヌン(大学修学能力試験、大学入試試験のこと)対策向けの参考書がこの副教材として使われました。 教科書として採用された本は中学の教科書だけで勉強してきた自分も読みやすかったのですが、副教材の方は全く文章のいうことがわかりませんでした。 でも授業は主に副教材で行われます。「主たる教材が副教材」という、皮肉な状況でした。

4. 生活記録簿という存在

韓国の小学校、中学校、高等学校には「生活記録簿」というものが存在します。言葉通り、生徒の学校生活を観察し、教員が書いた記録です。 生徒を特定する個人情報、校内コンテストの受賞履歴、出欠、部活、読書履歴、各科目担当教員からの記録、担任からの記録等が入っています。 高校にだけ存在するものではありませんが、韓国の大学ではこのような「生活記録簿」の記録に基づいて評価を行う入試が存在します。 日本でいう「推薦入試」「AO入試」のようなものですが、日本とは違いこの入試が主な入試方法になっています。 生徒は、記録されるすべてに対して気にしなければいけません。大学合格に響きます。

学校側もなるべく多くの生徒をいわゆる名門大学に合格させたいわけなので、校内コンテストをできる限り開催したり、 教員が定期テスト以外の定性的な評価を行い、記録に残したりして成績だけではなく多方面で優秀な学生であることを見せつけるために努力します。 具体的な事例は二年生のところで述べたいと思いますので、ここでは省略します。

5. 内申点

韓国の小学校、中学校では絶対評価で成績評価を行いますが、高校では相対評価で成績評価を行います。 成績順に並べ、成績の高い方から一等級から九等級まで、n等級という形で成績がつけられます。 詳しい評価方法はこちらを参考して下さい。順序は逆ですが、ほとんど同じ方法で成績がつけられます。 このような評価方法は、「隣の友達と互いに助け合って入試という難関を突破する意識を薄くし、周りの競争者を沢山生み出す」という批判を受けていますし、 僕もそういうことを目撃しました。その事例は後編で述べたいと思います。

サーバーのホストOSをArch Linuxに変更+Dockerでサーバー構築

自分がConohaから借りているサーバーのホストOSをArch Linuxに変更したので、サーバーの再構築を行うことになりました。この記事では、再構築をどうやってしたのかについて書きたいと思います。

I. ConohaのコントロールパネルからOSを再インストール

これは簡単なので説明は省略します。コントロールパネルで簡単にArchLinuxを入れることができます。サーバーを停止させ、ArchLinuxを選択して再インストールを行いました。

2. DockerとDocker-Composeのインストール

dockerはpacmanで簡単に入手できます。

pacman -S docker

インストールしても自動的に起動しないのでsystemctlで起動しましょう。

systemctl start docker
systemctl enable docker

docker-composeをレポジトリーからダウンロードします。 

curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

docker-composeが使えない場合、PATHに/usr/local/binを追加しましょう。 これでインストールは終わりです、。

3. mailuでメールサーバー構築

mailuは、Webメール、Antispam、基本的なメールサーバーの構成要素(SMTP, POP3, IMAPなど)を合わせて構築できるようにしたものです。 僕はこの記事を参考にして構築しましたが、versionを1.5.1にしても動作しなかったのでversionを1.5にします。1.6が最新版でありますが、設定方法が1.5と大幅に違うため、ここでは1.5を使うことにします。

4. pritunlでOpenVPNサーバー構築

pritunlは、OpenVPNサーバーをWebページで立ち上げて、ユーザーの管理もできるようにするツールです。 構築はこの記事を参考にしました。

3, 4共通事項

あとでReverse Proxyの設定を行うため、Webページと関係がある部分のホストのポート設定を80, 443ではなく8888, 3333など、違うポートに設定し、BIND_ADDRESSを127.0.0.1にします。これは、直接該当ポートを入力してアクセスすることを防止し、Reverse Proxyで80と443ポートが使えるようにするためです。

5. 自作Twitter botのDockerfile作成

自分が作成したTwitter botがありますが、これもDockerfileを作成して環境構築を自動化したいと思いました。Dockerfileは下記に示しています。

FROM python:3.6
COPY .ssh /root/.ssh
RUN pip install tensorflow pillow keras opencv-python python-twitter wget
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y ssh
WORKDIR /root
RUN git clone #省略します
WORKDIR /root/yurucamp_twitter_bot
COPY information.json information.json
CMD python app.py

privateのレポジトリーを使っているため、認証のためにレポジトリーに登録している公開鍵と公開鍵に対応する秘密鍵をコンテナーの中に入れる必要があります。python:3.6のイメージを用いることにして、pipで必要なライブラリをインストールします。あまりよろしくないライブラリの管理の仕方かもしれませんが、面倒いのでpipでインストールします。

そしてdocker-compose.ymlファイルを作成します。

version: '2'
services:
  yurucamp_twitter_bot:
    container_name: yurucamp_twitter_bot
    restart: always
    build: ./
    privileged: true
    tty: true

このdocker-composeファイルを作成することによって、docker-compose up -d --buildだけでTwitter botを立ち上げることができるようになります。

6. Reverse-Proxy構築

実はこれもdocker-composeで構築したかったですが、なぜかリダイレクトが上手くいかなかったのでこれはホストにインストールことにします。nginxも簡単にpacmanでインストールすることができます。

pacman -S nginx

apt, yumの同様に使えるので、みなさん是非Arch Linuxを使うことに躊躇せず使ってみてください!nginxがインストールされたら、/etc/nginx.confを修正し、Reverse Proxyの設定を行います。

worker_processes  2;

events {
    worker_connections  256;
}

http {
    include           mime.types;
    default_type      application/octet-stream;
    sendfile          on;
    keepalive_timeout 65;

    server {
        listen 80;
        server_name domain1;
        
        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          http://localhost:設定したポート domain1;
            proxy_pass              http://localhost:設定したポート;
        }
    }

    server {
        listen 80;
        server_name domain2;
        
        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          http://localhost:設定したポート http://domain2;
            proxy_pass              http://localhost:設定したポート;
        }

        #return 301 https://$host$request_uri;
    }

    server {
        listen       443 ssl;
        server_name  domain1;

        ssl_certificate /etc/letsencrypt/live/domain1/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/domain1/privkey.pem; # managed by Certbot

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          https://localhost:設定したポート https://domain;
            proxy_pass              https://localhost:設定したポート;
        }
    }

    server {
        listen       443 ssl;
        server_name  domain2;

        ssl_certificate /etc/letsencrypt/live/domain2/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/domain2/privkey.pem; # managed by Certbot

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          https://localhost:設定したポート https://domain2;
            proxy_pass              https://localhost:設定したポート;
        }
    }
}

7. 感想

初めてdockerを使ってサーバーを構築してみました。残念ながら、Reverse Proxyはホストで設定しましたが、それでも相当環境構築を自動的に行えるようになったので手間を省けることができました。

terraform-provider-datadogのuserでaccess_roleを使う方法

ぷろくまです。試験が終わり、春休みになりました。今日はちょっとまともな記事を書こうと思っています。

1. TerraformとDatadog

Terraformは、コードでリソースの管理ができるツールです。AWS, AzureなどのAPIを使い、リソースの生成や削除をより楽にできるようにする便利なツールです。下記に紹介するDatadogもリソースとしてTerraformで管理することができます。現在、数多くのサービスに対応しています。Terraform Providersに上がっているPlug-Inを用いることによって使用可能になれます。UCloudなどが上がってることを見てちょっと驚きました。

Datadogは、サーバーなどのリソースからログを取り、そのリソースの状況がWebで見れるようにしてくれるサービスです。無料版も提供されていますが、実際企業で使うなら無料版では足りないでしょう。TerraformではDatadogをリソースとして扱う機能をPlug-Inとして提供しています。

2. 今Terraformでできないこと

DatadogはユーザーのアクセスロールをStandard User, Admin User, Read-Only Userとして分類していますが、この前にはAdminとAdminでないとユーザーだけが存在してたらしいです。DatadogのAPIはこれを反映していますが、Terraformは対応していません。過去のユーザー分類はis_adminを使い、今のユーザー分類はaccess_roleを使います。Terraformはこのaccess_roleに対応していません。

3. できないから解決したい!

このコードを見ればわかりますが、access_roleさえ定義されていません。このコードで使っているDatadogのAPIソースコードでは、access_roleに対応していることを確認しました。結局思いついた解決方法は、

access_roleだけ追加すればいいのでは

その通りやってみました。

    Deprecated: "This parameter will be replaced by `access_role` and will be removed from the next Major version",
},
//この部分を追加
"access_role": {
    Type:     schema.TypeString,
    Optional: true,
    Required: false,
},
//
"name": {
    Type:     schema.TypeString,
    Required: true,
d.Set("is_admin", u.GetIsAdmin())
d.Set("name", u.GetName())
d.Set("verified", u.GetVerified())
//この部分を追加
d.Set("access_role", u.GetAccessRole())
u.SetHandle(d.Id())
u.SetIsAdmin(d.Get("is_admin").(bool))
u.SetName(d.Get("name").(string))
//この部分を追加
u.SetAccessRole(d.Get("access_role").(string))

やってみた結果は問題なく成功。今はPull Requestの送った状態です。