ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

「ProxyCommandによるsshの多段接続について」をコマンドライン引数でやる

ProxyCommandによるsshの多段接続について -- ぺけみさお
ググりが足りない気もするけど、どこのブログも.ssh/configで設定するやり方ばかりだったので、コマンドライン引数でやる方法を試してみた。

ホストの役割とユーザ

_.host _.役割 ユーザ
host01 クライアント user
host02 踏み台サーバ hoge
host03 ターゲットサーバ moge

実行結果


[user@host01 ~]$ ssh -i .ssh/id_rsa_host03 -o "ProxyCommand=ssh hoge@host02 nc %h %p" -l moge host03
Last login: Thu Aug 11 19:10:39 2016 from host02
[moge@host03 ~]$

というわけで、host01からhost03に直接つながったように見えます。


この後exitすると、、


[moge@host03 ~]$ exit
logout
Connection to host03 closed.
[user@host01 ~]$ Killed by signal 1.

[user@host01 ~]$

なぞの"Killed by signal 1."が表示されますね。なぜでしょう。。

Spring Dataを使って、自動的に監査証跡を保存する

業務アプリケーションを作っていると、監査証跡ということで、作成者、作成日時、更新者、更新日時を保存するということがあると思います。Spring Dataのアノテーションを使うと、自動でセットしてくれるので、アプリケーションで決まりきったコードを書かなくて済むということみたいです。

Task.java(モデルクラス)

package sample.model;

import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Entity
@EntityListeners(value = AuditingEntityListener.class)
public class Task {

    @Id
    @GeneratedValue
    private Long id;

    private String taskName;

    @CreatedBy
    private String createdBy;

    @Temporal(TemporalType.TIMESTAMP)
    @CreatedDate
    private Date createdDate;

    @LastModifiedBy
    private String modifiedBy;

    @Temporal(TemporalType.TIMESTAMP)
    @LastModifiedDate
    private Date modifiedDate;

    public Task() {
    }

    @Override
    public String toString() {
        return "Task{" +
                "id=" + getId() +
                ", taskName='" + getTaskName() + '\'' +
                ", createdBy='" + getCreatedBy() + '\'' +
                ", createdDate=" + getCreatedDate() +
                ", modifiedBy='" + getModifiedBy() + '\'' +
                ", modifiedDate=" + getModifiedDate() +
                '}';
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTaskName() {
        return taskName;
    }

    public void setTaskName(String taskName) {
        this.taskName = taskName;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public String getModifiedBy() {
        return modifiedBy;
    }

    public void setModifiedBy(String modifiedBy) {
        this.modifiedBy = modifiedBy;
    }

    public Date getModifiedDate() {
        return modifiedDate;
    }

    public void setModifiedDate(Date modifiedDate) {
        this.modifiedDate = modifiedDate;
    }
}

StartupRunner.java(呼び側)

package sample;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import sample.jpa.TaskRepository;
import sample.model.Task;

public class StartupRunner implements CommandLineRunner {
    protected final Log logger = LogFactory.getLog(getClass());

    @Autowired
    private TaskRepository taskRepository;

    @Override
    public void run(String... args) throws Exception {
        // Generate a new record.
        Task task = new Task();
        task.setTaskName("task1");
        Task savedTask = taskRepository.save(task);
        System.out.println(savedTask);

        Thread.sleep(1000);

        // Update the record after 1sec.
        savedTask.setTaskName("task2");
        Task savedTask2 = taskRepository.save(savedTask);
        System.out.println(savedTask2);
    }
}

AuditingConfig(監査証跡の設定クラス)

package sample.jpa;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@Configuration
public class AuditingConfig {
    @Bean
    public AuditorAware<String> createAuditorProvider() {
        return new SecurityAuditor();
    }

    @Bean
    public AuditingEntityListener createAuditingListener() {
        return new AuditingEntityListener();
    }

    public static class SecurityAuditor implements AuditorAware<String> {
        @Override
        public String getCurrentAuditor() {
            return "taka2";
        }
    }
}

実行結果(抜粋)

Task{id=1, taskName='task1', createdBy='taka2', createdDate=Sat Jul 23 23:38:44 JST 2016, modifiedBy='taka2', modifiedDate=Sat Jul 23 23:38:44 JST 2016}
Task{id=1, taskName='task2', createdBy='taka2', createdDate=Sat Jul 23 23:38:44 JST 2016, modifiedBy='taka2', modifiedDate=Sat Jul 23 23:38:45 JST 2016}

呼び側ではtaskNameしかセットしていませんが、createdBy/createdDate/modifiedBy/modifiedDateの各フィールドがセットされていますね。サンプルなので、ユーザは固定の文字列返してますが、webアプリケーションなら、ログインユーザを返すところでしょうね。

SHURE カナル型イヤホン SE112m+購入

前使ってたイヤホンが断線か何かで片方聞こえなくなってしまったので、新たに購入。
つなぎで使ってたEarPodsのリモコンが便利で、

ていう条件でAmazonを探し、一番売れ筋のものを選んでみました。

装着感

大中小のイヤーチップが付属していますが、自分にはデフォルトで装着されている中のものが最もフィットしました。

音質

若干高音が強くシャリシャリしてる感じがしますが、エイジングということもあるそうなので、しばらく様子見かなと。
(7/14 追記)
数日使っていましたが、耳が慣れたのか、エイジング出来たのか、どっちなのか分かりませんが、気にならなくなりました。

値段

Amazonで\6,820でした。イヤホンにしてはやや高いといえるでしょう。コスパが良いのか悪いのかは、これからの判断になるかなと。

その他

EarPodsや前に使っていたSonyのものに比べてケーブルが太いので、ちょっと取り回しが不便です。慣れのような気もしますが、マイナスポイントです。

WAONポイントとWAON POINTの違い

WAONポイントがあるのに、WAON POINTというものを作ったようです。
読み方同じだし、さすがに分かりづらくないか?

私の理解

というわけで、ポイントの付与と電子マネーへの交換を図に整理してみました。


違いは下記でしょう。


というわけで、WAON POINTは、WAONポイントに比べて、かなりメリットが多いようです。
将来的には、WAONポイントなくして、WAON POINTに移行するかも知れませんね。

第210回TOEIC公開テスト【2016年05月29日(日)】の結果

Listening365点、Reading365点で、Total730点でした。
新形式の対策を何にもしなかった割には、特にスコアも落ちなかったので、
マグレかなんかでしょう。


>次回は半年後に730点くらい目標ですかね。

また、たまたま目標達成しました。
なんだろうこのちょうど感。
まあ、期間は半年以上経ってますが。


>特に、目下仕事で必要なReadingのスコアを伸ばしたいところ。

これも達成してますね。
仕事で英文メールが飛び交ってたりします。
自分はCcで流れてくるだけなので、会話には参加していないのですが、
読んでないと、「えっ?!なんで読んでないの??」
っていうリアクションされるので、困り者です。


まあ、ネイティブじゃない人たちのやりとりなんで、
文短いですし、あまり読解にも困らないレベルですが。


>ここより上のスコアは、シャドーイングなどの発音アウトプットを伴わないと厳しそうです。
>レアジョブとかやってみたいけど、なんとなく試せないでいる。。

英会話スクールに行っているので、発音アウトプット多少増えたかも知れません。
まあ、3週間に1度しか行ってないから、足しになっているのかどうか。
しかも、Listeningの点数は前回より落ちてるし。


とりあえず5の倍数で受けることにしたので、次回は215回に受けます。
次回は、750点くらい目標ですかね。
(だんだん目標のきざみが細かくなってきた。)

データベーススペシャリスト試験合格しました。


感想

2003年のテクニカルエンジニア(DB)合格者のリピーターとして、
試験対策なしで臨んでみたわけですが、ギリギリ合格してました。


ツイッターにも書いたんですが、これだけNoSQL色々あるご時世で、
リレーショナルデータベースしか出題されない試験で、
データベーススペシャリストっていうのは違和感あるなあと思います。
リレーショナルデータベーススペシャリストなら、しっくり来ますけどね。

使ったテキスト

なし

受験会場

厚木中央高等学校でした。
駅から歩いて行ったんですが、ちょっと遠かったですね。

今後

2016年秋: ITストラテジスト試験
2017年春: システム監査技術者試験


論文試験が続くので、またがんばっていきたいところです。

高度全制覇への道

ITストラテジスト試験 ST 2016年受験予定
システムアーキテクト試験 SA 合格 2014年合格
プロジェクトマネージャ試験 PM 合格 2014年合格
ネットワークスペシャリスト試験 NW 合格 2004年合格
データベーススペシャリスト試験 DB 合格 2003年、2016年合格
エンベデッドシステムスペシャリスト試験 ES やる気なし
情報セキュリティスペシャリスト試験 SC 春秋 合格 2015年春合格
ITサービスマネージャ試験 SM ITストラテジスト試験受かったらやるかも
システム監査技術者試験 AU 2017年受験予定

ITストラテジスト試験の勉強始めました。

というわけで、今月の始め辺りから着手しました。


一応、戦略的ITコンサルティング事業というのをやってる会社に勤めているので、
いわゆる、御社のビジネスは弊社のITを使うとこんなに

  • 売上があがる
  • コストが削減できる
  • 今後の成長が見込める
  • etc

とか言えないといけないわけです。


ITストラテジスト試験は、IPAによると
「〜 経営とITを結びつける戦略家 〜」
ってことらしいので、まさにそういう知識を身につける試験区分なのかなと理解してます。
IPA 独立行政法人 情報処理推進機構:制度の概要:ITストラテジスト試験
コンサルを名乗るなら、持ってれば少しは箔が付くのではと思います。


早速午後1対策からやっているんですが、
自分の作った回答と解答例を見比べると、
あー一歩考えが浅かったなと思うことがしばしば。
最近の仕事の詰めの甘さがそのまま出てる気がします。


とはいえ時間も限られている中、いかにそこにたどり着くか
というのは、試験も仕事も同じ。
良い思考の訓練になりそうな気がします。

使ってるテキスト

情報処理教科書 ITストラテジスト 2016年版

情報処理教科書 ITストラテジスト 2016年版

いつものシリーズですね。