キャスレーコンサルティング 技術ブログ
  • HOME>
  • キャスレーコンサルティング 技術ブログ

CGIからMastodon APIを実行

Posted on 05月 24, 2017

こんにちは。
キャスレーコンサルティング システムインテグレーション部の田中(雅)です。

今まさに話題となっているMastodonと、まだまだ現役で動いているCGIを組み合わせてみました!

CGIでMastodon APIを実行、
そしてMastodonへトゥートし、タイムラインを見るWebアプリを実際に作っていきます。

Mastodon APIから情報を取得する部分は非常に簡単にできるので、
こちらを参考にどんどんMastodonを使っていただき、
コミュニケーションを活性化していただければ幸いです。

Mastodonとは

twitterによく似た短文投稿型のSNSです。

twitterと異なる部分の特徴として、
1つのインスタンスに趣味・嗜好が同じ人たちがあつまり、
その中でトゥート(twitterでいうツイート)を行うことで
検索せずともインスタンス内のすべてのトゥートを見ることができます。

また、サーバーを用意すればそれぞれでインスタンスを作ることも可能なため、
プライベートなコミュニケーションツールにもなります。 (続きを読む…)


こんにちは、キャスレーコンサルティング SI(システム・インテグレーション)部の清水(皓)です。

私はこれまで、業務システムSEとしてキャリアを積んできましたが、
フロントエンドアプリやプロトタイプ言語に携わることは殆どありませんでした。

そのため、フロントエンドの言語も使えるようになっておこうということで、
オブジェクト指向でJavaScriptを書くようなことができるTypeScriptを覚えようと思い、
学習したことを書いていきたいと思います。

今回は、TypeScriptを始めるための入門編です。

TypeScriptとは

TypeScriptは、大規模なJavaScriptアプリケーション開発のためにMicrosoftによって作成された言語です。

詳細はTypeScriptの公式HPに記載されていますが、英語のため、読めない方もいらっしゃると思います。
私も英語は読めませんが、以下のようなことが書いてあることが調べたところ分かりました。

JavaScriptで始まり、JavaScirptで終わる

TypeScriptは、JavaScriptと同様の構文が使えます。

既存のJavaScriptコードが利用でき、ポピュラーなJavaScriptのライブラリが組み込まれていて、
TypeScriptコードをJavaScriptコードから呼び出すこともできます。
シンプルできれいなJavaScritpコードがコンパイルされ、様々なブラウザ、Node.jsやJavaScriptエンジンで実行できます。

大規模アプリのための強力なツール

JavaScriptアプリを開発する際に、
静的チェックやコードリファクタリングのようなこともできるため、生産性が高くなります。
型推論では、型アノテーションによりコードの静的検証に大きな影響を与えます。
コンポーネント間のインターフェイスを定義し、既存のJavaScriptライブラリの動作を把握することもできます。

最先端のJavaScript

JavaScriptの最新機能や今後提供予定の機能をサポートし(サポートする予定)、
堅牢なコンポーネントをつくることができます。
これらの特徴は信頼性の高いアプリ開発に利用可能で、
コンパイル時にはECMAScript3以降に準拠したシンプルなJavaScriptが出力されます。

開発環境(VS Code)の準備

TypeScriptの開発環境としては、IDEとしてVisual StudioやEclipseなど、
エディタとしてはVisual Studio Code、AtomやSublime Textなどがあります。
今回は、TypeScriptはMicrosoftが作った言語であることと、
無料でクロスプラットフォームで利用可能なMicrosoftのVisual Studio Codeを使っていきたいと思います。

インストール

Visual Studio Codeは、http://code.visualstudio.com/からインストーラをダウンロードして実行します。
Node.jsは、http://nodejs.org/en/からインストーラをダウンロードして実行します。
TypeScriptは以下のコマンドを実行することでインストールできます。
npm install -g typescript

VS CodeでのTypeScriptの書き方(トランスパイル&デバッグ実行)

TypeScriptの開発環境がインストールできたと思います。これから、TypeScriptを書いて実行していきます。

Visual Studio Codeの設定

まずは、setting.jsonの編集方法です。お好みに合わせて設定を編集してください。
ファイル(F)→基本設定(P)→設定(S)を選択すると、setting.jsonが開き、編集できます。

setting.jsonの開き方

setting.json編集画面

プロジェクトフォルダの作成

ファイル(F)→フォルダを開く(Ctrl⁺K Ctrl⁺O)からプロジェクトフォルダを選択できます。
プロジェクトフォルダを作成していない場合は、新規作成して選択します。

プロジェクトフォルダを開く

プロジェクトフォルダの選択

tsconfig.jsonの作成

TypeScriptコードのコンパイル設定ファイルである、tsconfig.jsonを作成します。
新しいファイルのアイコンをクリックしてtsconfig.jsonを作成し、コンパイラオプションを設定します。
補完機能が働いてくれるので、どのような設定があるか確認することも可能です。
tsconfig.jsonはプロジェクトルートに一つ作成しておきます。

tsconfig.jsonの作成

tsconfig.jsonの編集

{
    "compilerOptions":{
        "target":"es5",
        "sourceMap":true,
        "module":"commonjs"
    }
}

今回のtsconfig.jsonは、詳細な設定は行っていません。
アプリケーションやテスト環境の構成などに合わせて設定を行うことで、
コンパイル時に細やかな制御が可能です。(今回は割愛します)

簡単なプログラムの作成

おなじみのHello,Worldを表示するプログラムを作成しましょう。
さきほどと同じ要領で新規ファイルを作成し、HelloWorld.tsとして保存します。
HelloWorld.tsの作成

function main()
{
    console.log("Hello,World.");
}

main();

ビルド

F1キーを押下してコマンドパレットが表示されたら、configure taskと入力してEnterキーを押下し、
「TypeScriptプロジェクトをコンパイル」をクリックします。

configure_taskの実行

.vscodeフォルダとtasks.jsonファイルが生成されたら、Ctrl⁺Shift⁺Bを押下し、ビルドタスクを実行します。

tasks.jsonの生成

これで、HelloWorld.jsとHelloWorld.js.mapが生成され、実行・デバッグの準備ができました。

ビルドタスク実行

デバッグ

Debugビューを表示し、F5キーを押下すると、環境の選択を求められますので、Node.jsを選択します。

デバッグの準備

Launch.jsonが表示されますので、
今回の構成に合わせて”program”:”${workspaceRoot}/HelloWorld.js”に書き換えて保存します。
最後に、F5キーを押下するとデバッグ実行が開始されます。デバッグコンソールに「Hello,World.」が表示されます。

デバッグ実行

TypeScriptの特徴

最後に、TypeScriptの特徴を紹介します。
言語の特徴を把握することで、どのようにコードを書いていくとよいのかがわかってくると思います。

既存のJavaScriptがそのままTypeScriptになる

例外がいくつかありますが、TypeScriptファイルにJavaScriptのコードをコピペしても問題ありません。
そのため、既存のJavaScriptコードという資産を活用することができ、
JavaScriptからTypeScriptへの移行も容易になると思います。

例外としては、変数へ代入する値の型と変数の型が合わない場合、TypeScriptではエラーとなります。
また、strictモードで許可されていない、一般的に危険とされている、などの理由により、with文が使用できません。

型チェック
with文使用不可

変数の宣言と型指定

JavaScriptでは、varキーワードを使用せずに変数を宣言するとグローバル変数を作成できます。
しかし、TypeScriptではvarキーワードを使用せずに変数を宣言するとエラーになります。
これにより、グローバル変数を不注意で作成してしまうリスクを減らせます。

varキーワードなし

また、TypeScriptでは必要に応じて型を明示的に指定する場合、型アノテーションを使用します。
これにより、無効な値が代入されないよう、型の自動チェックが可能になります。
また、開発環境によるオートコンプリート機能が提供されることも大きなメリットです。

// 変数の型指定
// var 変数名 = 値;
var name = "清水";

// var 変数名:型アノテーション;
var isTruth:boolean;

// var 変数名:型アノテーション = 値;
var highestTemp:number = 28.2;

もし、TypeScriptで動的な変数が必要になった場合には、動的な型を表すany型の変数を宣言することができます。

動的な変数

クラスとインターフェース

TypeScriptはクラスベース・オブジェクト指向言語として作成されているため、
JavaやC#に近い考え方でクラスを定義して利用できます。
メンバー変数やメンバー関数、アクセッサを定義することもできますし、アクセス修飾子も利用できます。

さらに、継承やインターフェースなどの機能もあり、
オブジェクト指向に馴染みのある業務システムSEには使いやすい言語になっていると思います。

interface vehicle
{
    // プロパティ
    speed:number;

    // メソッド
    accelarator(accelarateSpeed:number);
}

class car implements vehicle
{
    // プロパティ
    // インタフェースで定義されたプロパティやメソッドはアクセス修飾子がpublicになります
    speed:number;
    private _ownerName:string;

    // メソッド
    accelarator(accelarateSpeed:number)
    {
        this.speed = this.speed + accelarateSpeed;
    }

    // アクセッサ
    public get ownerName():string {
        return this._ownerName
    }
    public set ownerName(name : string) {
        this._ownerName = name;
    }

}

下の図は、上記のコードをコンパイルして生成されたjavascriptコードです。
インタフェースはjavascriptコードとして生成されず、オートコンプリート機能や型チェック機能のために利用されます。
そのため、クラス部分のみをjavascriptコードとして生成するとこのようになります。

インタフェースとクラスをコンパイルした結果

まとめ

以上、TypeScriptの入門編を紹介させていただきました。
TypeScriptには他にも多くの機能があり、今回だけでは紹介しきれていません。
しかし、とりあえずTypeScriptを始めてみるための入門編として、お役に立てれば幸いです。


こんにちは。 キャスレーコンサルティング SI(システム・インテグレーション)部の満石です。

今年の7月にJava SE 9のリリースが迫っていますが、ちょっとここでJava SE 8の新機能を思い出してみましょう。

Lambda式、Stream API、Date and Time API。

これらは、有名なので実際に使ってみたことがある人は多いと思います。

でも、インタフェースにデフォルト実装とstaticメソッドが書けるようになった、というのは忘れている人や
知っていても使い所が分からないという人は多いのではないでしょうか?

今回は、そんなインタフェースのデフォルト実装とstaticメソッドについて、コード定義Enum用インタフェースの作成を
通して実用的な例を紹介したいと思います。

Java SE 7まで

アプリケーションを作成する場合、必ずと言っていいほど「コード値」に対する「名称」の組み合わせ、
所謂コード定義を扱うことになると思います。

コード定義はDBに保存したり、Enumを作成することがほとんどではないでしょうか。

コード定義用Enumを用意する場合、Java SE 7までだとどんな実装になるかやってみます。

コード定義用Enumからコード値と名称を取得したいのでまず以下のようなインタフェースを作成することにします。

public interface CodeEnum {
    String getCode();
    String getName();
}

このインタフェースを実装したEnumとして、今回は個人的な趣味で今年のF1のコンストラクターを
題材にしたEnumを作成しました。
アルファベット順にコード値を振り、カタカナの名称を持たせました。

public enum F1Constructor implements CodeEnum {
    FERRARI("01", "フェラーリ"),
    FORCE_INDIA("02", "フォース・インディア"),
    HAAS("03", "ハース"),
    MCLAREN("04", "マクラーレン"),
    MERCEDES("05", "メルセデス"),
    RED_BULL("06", "レッドブル"),
    RENAULT("07", "ルノー"),
    SAUBER("08", "ザウバー"),
    TORO_ROSSO("09", "トロ・ロッソ"),
    WILLIAMS("10", "ウィリアムズ");

    private String code;

    private String name;

    F1Constructor(String code, String name) {
        this.code = code;
        this.name = name;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getName() {
        return name;
    }
}

このようなコード定義用Enumを作成すると、例えばコード値を元に指定したEnumの列挙子を作成するような
共通処理をするメソッドを親クラスに実装して継承したくなります。

しかし、Enumは特殊なクラスなので、上記のようにインタフェースを実装することは出来ても、
親クラスを継承することは出来ません。

かと言って、個別のEnumにほとんど同じ実装のメソッドを書くのは得策ではありません。

そのため、コード定義Enum専用のユーティリティクラスを作成し、コード定義Enum用の共通処理は
そのユーティリティクラスに実装したりすることが多かったのではないかと思います。

Java SE 8から

Java SE 8からはインタフェースにデフォルト実装やstaticメソッドが書けるため、
独自のユーティリティクラスで実現していたことを、すべてEnum用のインタフェースだけで実現できます。

Enumは特殊なクラスと言いましたが、Enum自身の型宣言はEnum<E extends Enum<E>>となっていて、
再帰的ジェネリクスが使われています。今回作成するEnum用インタフェースはこれも活用します。

コード定義用Enumのインタフェースとして実用的なメソッドを考慮した結果、以下の実装になりました。
Lambda式、Stream API、メソッド参照もフル活用しています。

public interface CodeEnum<E extends Enum<E>> {

    /** コード値を返却する */
    String getCode();

    /** 名称を返却する */
    String getName();

    /** [デフォルト実装] 表示の順番を返却する */
    default int getOrder() {
        return Integer.parseInt(getCode());
    }

    /** [デフォルト実装] Enumに変換する */
    @SuppressWarnings("unchecked")
    default E toEnum() {
        return (E) this;
    }

    /** [デフォルト実装] コード値が同一かどうかをチェックする */
    default boolean equalsByCode(String code) {
        return getCode().equals(code);
    }

    /** [staticメソッド] 指定されたCodeEnumを実装したEnumを表示順にソートしたリストを返却する */
    static <E extends Enum<E>> List<E> getOrderedList(Class<? extends CodeEnum<E>> clazz) {
        return Arrays.stream(clazz.getEnumConstants())
                .sorted(Comparator.comparing(CodeEnum::getOrder))
                .map(CodeEnum::toEnum)
                .collect(Collectors.toList());
    }

    /** [staticメソッド] 指定されたCodeEnumを実装したEnumの、指定されたコード値の列挙子を返却する */
    static <E extends Enum<E>> E getEnum(Class<? extends CodeEnum<E>> clazz, String code) {
        return Arrays.stream(clazz.getEnumConstants())
                .filter(e -> e.equalsByCode(code))
                .map(CodeEnum::toEnum)
                .findFirst()
                .orElse(null);
    }

    /** [staticメソッド] 指定されたCodeEnumのコード値をキー、コード値に該当するCodeEnumを値に持つMapを返却する */
    static <E extends Enum<E>> Map<String, E> getMap(Class<? extends CodeEnum<E>> clazz) {
        return Arrays.stream(clazz.getEnumConstants())
                .collect(Collectors.toMap(CodeEnum::getCode, CodeEnum::toEnum));
    }

    /** [staticメソッド] 指定されたCodeEnumに、指定されたコード値を持つ列挙子が存在するかチェックする */
    static <E extends Enum<E>> boolean hasCode(Class<? extends CodeEnum<E>> clazz, String code) {
        return Arrays.stream(clazz.getEnumConstants())
                .anyMatch(e -> e.equalsByCode(code));
    }
}

再帰的ジェネリクスを、シンプルな形で活用しているのはtoEnum()メソッドです。
再帰的ジェネリクスはこのメソッドのように、サブクラス(※ここではEnum)の型を扱いたい場合に使うと便利です。

もっと深く知りたい人は、「再帰的ジェネリクス」で検索してみてください。
toEnum()メソッドになぜ@SuppressWarnings("unchecked")が必要なのか、きっと分かるはずです。

このインタフェースを実装すると、F1Constructorはこうなります。

public enum F1Constructor implements CodeEnum<F1Constructor> {
    FERRARI("01", "フェラーリ"),
    FORCE_INDIA("02", "フォース・インディア"),
    HAAS("03", "ハース"),
    MCLAREN("04", "マクラーレン"),
    MERCEDES("05", "メルセデス"),
    RED_BULL("06", "レッドブル"),
    RENAULT("07", "ルノー"),
    SAUBER("08", "ザウバー"),
    TORO_ROSSO("09", "トロ・ロッソ"),
    WILLIAMS("10", "ウィリアムズ");

    private String code;

    private String name;

    F1Constructor(String code, String name) {
        this.code = code;
        this.name = name;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getName() {
        return name;
    }
}

違いは、再帰的ジェネリクス特有の記述となっている<F1Constructor>の部分だけなので、活用するのはとても簡単です。

サンプルコードと実行結果

ここからは、F1Constructorを使ったサンプルコードと、その実行結果から動作を確認してみます。
デフォルト実装しているメソッドのgetOrder()toEnum()は、CodeEnumインタフェース内のstaticメソッドで
使うことが主目的なので、ここではequalsByCode()と4つのstaticメソッドについて確認していきます。

equalsByCodeメソッド

コード定義のEnumを作成した場合、特定のEnumの列挙子のコード値と指定したコード値が一致するか
確認したいことが良くあると思います。そのような場合、このメソッドだと簡潔に記述することが出来ます。

public class Main {
    public static void main(String[] args) {
        System.out.println(F1Constructor.FERRARI.equalsByCode("01"));
    }
}

実行結果は

true

になります。

getOrderedListメソッド

コード定義の全種類をコード値順にプルダウンリストとして表示したい場合、
その対象データを作成する目的で作成しました。

public class Main {
    public static void main(String[] args) {
        CodeEnum.getOrderedList(F1Constructor.class)
                .forEach(e -> System.out.println("code:" + e.getCode() + ",name:" + e.getName()));
    }
}

実行結果は

code:01,name:フェラーリ
code:02,name:フォース・インディア
code:03,name:ハース
code:04,name:マクラーレン
code:05,name:メルセデス
code:06,name:レッドブル
code:07,name:ルノー
code:08,name:ザウバー
code:09,name:トロ・ロッソ
code:10,name:ウィリアムズ

になります。

ここで遊び心を入れて、2017年第4戦終了時のコンストラクターズポイントランキング順を持つようにしてみました。

public enum F1Constructor implements CodeEnum<F1Constructor> {
    FERRARI("01", "フェラーリ", 2),
    FORCE_INDIA("02", "フォース・インディア", 4),
    HAAS("03", "ハース", 7),
    MCLAREN("04", "マクラーレン", 10),
    MERCEDES("05", "メルセデス", 1),
    RED_BULL("06", "レッドブル", 3),
    RENAULT("07", "ルノー", 8),
    SAUBER("08", "ザウバー", 9),
    TORO_ROSSO("09", "トロ・ロッソ", 6),
    WILLIAMS("10", "ウィリアムズ", 5);

    private String code;

    private String name;

    private int order;

    F1Constructor(String code, String name, int order) {
        this.code = code;
        this.name = name;
        this.order = order;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getOrder() {
        return order;
    }
}

orderのフィールドを追加して順位が入るようにし、デフォルト実装のgetOrder()メソッドをオーバーライドし、
orderの値を返却するようにしたのが変更点です。

再度サンプルコードを実行すると、結果は以下のとおりに変わります。

code:05,name:メルセデス
code:01,name:フェラーリ
code:06,name:レッドブル
code:02,name:フォース・インディア
code:10,name:ウィリアムズ
code:09,name:トロ・ロッソ
code:03,name:ハース
code:07,name:ルノー
code:08,name:ザウバー
code:04,name:マクラーレン

このように、必要に応じて表示順を変更することも出来ます。もしコード値にアルファベットが混じっているなら、
デフォルト実装では実行時にエラーとなるため、この方法で表示順を指定することでエラーを回避できます。

getMapメソッド

コード定義用Enumを作る場合、コード定義用Enumのコード値をキー、
対応するコード定義用Enumの列挙子を値に持つMapを使いたくなるシチュエーションがあると思います。
このメソッドなら、簡単にそのようなMapを取得することが出来ます。

public class Main {
    public static void main(String[] args) {
        CodeEnum.getMap(F1Constructor.class)
                .entrySet()
                .forEach(e -> System.out.println("code:" + e.getKey() + ",Enum:" + e.getValue()));
    }
}

実行結果は

code:01,Enum:FERRARI
code:02,Enum:FORCE_INDIA
code:03,Enum:HAAS
code:04,Enum:MCLAREN
code:05,Enum:MERCEDES
code:06,Enum:RED_BULL
code:07,Enum:RENAULT
code:08,Enum:SAUBER
code:09,Enum:TORO_ROSSO
code:10,Enum:WILLIAMS

となります。

hasCodeメソッド

入力されたコード値がコード定義として存在する値なのか、チェックしたい場合に使うことを想定して作りました。

public class Main {
    public static void main(String[] args) {
        System.out.println(CodeEnum.hasCode(F1Constructor.class, "10"));
    }
}

実行結果は

true

になります。

終わりに

インタフェースのデフォルト実装を使うことで、これまで不可能だったEnum自身に機能を追加することが
可能になったのは新鮮な驚きでした。
それなら自分はこんなメソッドを実装したい、と考えた人もいらっしゃるのではないでしょうか。

そして、インタフェースにstaticメソッドを実装できるようになったため、
今回はコード定義用Enumに対する実装を、1つのクラスに集約することができました。
ちょっとしたことですが、「1つのクラスに必要な処理が全て揃っている」というのは、
使い方を説明する側・される側双方にメリットになると思います。

それから、再帰的ジェネリクス。実際に活用してみたのは初めてでしたが、
ジェネリクスに対する理解がさらに深まりました。

今回紹介したコード定義Enum用インタフェースを、
皆さんが作成するアプリケーションでも応用していただけたら幸いです。


はじめに

こんにちは、キャスレーコンサルティングSD(システム・デザイン)部の青木です。

今回はログの収集・可視化ツールとして名前をよく聞くElasticsearch,Logstash,Kibanaを使用して
知りたい情報を可視化してみようと思います。

目次

・構成図と準備物とインストール方法
・明らかにしたい情報とログのサンプル
・Filebeatの設定(ログデータの転送)
・Logstashの設定(ログデータの整形とElasticsearchへの登録)
・Elasticsearchの設定(ログデータのストア)
・Kibanaの設定(ログデータの可視化)
・Elasticsearchに登録されるデータの確認
・Kibanaで可視化されたログデータの確認
・おわりに (続きを読む…)

こんにちは。
キャスレーコンサルティングのCC部(CSVクリエーション部)の久保田です。

私はシステム開発プロジェクトのリーダーをしております。
今回は以前から興味があった、Googleの感情解析APIに関してブログに記述してみようと思います。
業務にどのように使えるかを考えていきたいと思います。 (続きを読む…)


こんにちは。 キャスレーコンサルティングのSI(システム・インテグレーション)部のkanemakiと申します。

皆さん、GoogleAppsScriptは好きですか?

これまでも技術ブログでは
Google Apps Script入門
Google Apps Scriptで、心温まる年賀状を作ろう!
Google Apps Scriptとラベルで実現する業務効率化のすゝめ

と過去に取り扱っていますが、今回はGoogleAppsScript(以下GAS)とGoogleCalendarの連携術をご紹介します。

(続きを読む…)


DB2の起動スクリプト

Posted on 04月 12, 2017

こんにちは、キャスレーコンサルティング SI(システム・インテグレーション)部 石田です。

私はサーバのインフラ設計構築をしており、主にDBの設計構築がメインとなります。
以前、DB2に触れる機会があり、その時に学んだ知識をブログに記載しようと思います。 (続きを読む…)


こんにちは。
キャスレーコンサルティングのSI(システム・インテグレーション)部の佐藤です。

今回「ElectronとAngular2でHello World」をテーマにElectronとAngular2 についての紹介をさせていただきます。

今回使用するものは次の通りです。
・Electron
・node.js
・Angular2

環境はUbuntu 14.04 LTSを使用します。 (続きを読む…)


こんにちは。
キャスレーコンサルティングのSI(システム・インテグレーション)部の杉光です。

今回はAWS Athenaの機能と特徴、性能検証結果について紹介させて頂きます。 (続きを読む…)


こんにちは。
キャスレーコンサルティングSI(システム・インテグレーション)部の瀧下です。

電卓にメモリストが付いたAndroidアプリ開発で、
GUIコンポーネントの一つであるListViewを使ってみたので、説明していきたいと思います。 (続きを読む…)


12345...10...

  • Profile
    キャスレーコンサルティングの技術ブログです。
    当社エンジニアが技術面でのTips、技術系イベント等についてご紹介いたします。
  • CSV社長ブログ
  • チーム・キャスレーブログ