読者です 読者をやめる 読者になる 読者になる

プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

プレミアム会員にならなくてもヤフオクに出品できた

以前、ヤフオク!と楽オクを比較したんですが、

taka-2.hatenablog.jp

楽天オークション終了のお知らせだそうですね。

auction.rakuten.co.jp

やっぱり時代はネットフリマかーと思い、色々ググってたんですが、なんかヤフオク!がフリマアプリとして出てくるんですよね。で、iOSヤフオク!アプリの出品ボタン押してみたら、即決価格での出品はプレミアム会員にならなくてもできるようになってるみたいです。

新出品機能「ワンプライス出品」リリースのお知らせ -お知らせ - ヤフオク!

この記事にはプレミアム会員じゃなくもよいっていう重要なことが書いてないですけどね・・

 

というわけで、早速いらなくなった初代iPadを出してみたら、一瞬で売れてびっくり。ヤフオク!はすごいですね。プレミアム会員じゃないと、10%の手数料を取られるそうですが(プレミアム会員は8.64%)、便利なのでちょくちょく利用させてもらおうと思います。

パソコンを交換

IT

電源ボタンの接触部が物理的に壊れてしまい、やむなく交換となりました。
たまたま義母が最近パソコンを買ったので、使わなくなったものをもらいました。
まあ、これは自分が選んだやつなので、スペックもそこそこで普通に使えそうです。


■マシンのスペック比較

- 壊れたやつ 交換したやつ
CPU Core i5-2400 Core i5-3470
メモリ 8GB 4GB→8GB(メモリを入れ替え)
ディスク SSD120GB+HDD500GB SSD120GB+HDD500GB
OS Windows10 Pro Windows10 Pro(ライセンスをコピー)


若干立ち上がりが遅いような気がしますが、気のせいでしょうか。
あと、壊れたPCについてたSSD+HDDのデータは、すぐには使わないのですが、
一応読み出せるよう、ハードディスクケースってのを買ってみました。



最近動画編集とか、ハイスペックを要求する作業をしていないので、
またこれで2〜3年は使えそうです。


ちなみにWindows7からWindows10に無償アップグレードしたクチなんですが、
Windows 10 のダウンロード
からツールを入手して、ISOイメージを作ると、クリーンインストールするDVDが作れます。
無線LANつないで、Chromeインストールしたら、大体普段のことは出来ちゃいますから、
クリーンインストールでも問題なかったです。

さくらのクラウド使ってみた

IT

昨日、
【eLV勉強会】 Dockerを触ってみよう ~初心者向けDockerハンズオン~ - ~ITエンジニア勉強会~ engineer's Learning・Vesper | Doorkeeper
の勉強会にお伺いした際、さくらのクラウドの2万円分のクーポンをいただきましたので、上のsshの検証するのにお試しで使ってみました。


EC2と比較しての感想は、、

  1. コンソールのGUIが見やすい気がする
  2. マシン止めてもディスクに課金されていることがわかりやすい
  3. 公開鍵認証必須じゃないので、敷居は低いと思う
  4. サーバの起動が遅いと思う
  5. REST APIの表示いらんでしょ
  6. マシンの起動・停止するのに3クリックはいまいち
  7. ちょっとお高いのでは(まだ無料で使えてるので、文句言う筋合いではないが)
  8. 課金情報がリアルタイムに表示されないようですが

というところでした。
もっと色々複雑なことをやると違いが見えてくるのかも知れませんが、しょせんコマンドの検証レベルだと、わりとプリミティブなところに目が行きますね。そしてやっぱりAmazonはすごいなということかと思います。

ProxyCommandによるsftpの多段接続をコマンドライン引数でやる

IT

これはここのサイトに載ってました。
linux - Must I sftp to an intermediate server? - Super User

実行結果


[user@host01 ~]$ sftp -i .ssh/id_rsa_host03 -o "ProxyCommand=ssh -e none hoge@host02 exec /usr/bin/nc %h %p 2>/dev/null" moge@host03
Connected to host03.
sftp> ls
aaa bbb
sftp> bye
[user@host01 ~]$

これを、ssh -Wでやりたいのですが、、

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

IT

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を使って、自動的に監査証跡を保存する

Java

業務アプリケーションを作っていると、監査証跡ということで、作成者、作成日時、更新者、更新日時を保存するということがあると思います。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+購入

Life

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

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

装着感

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

音質

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

値段

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

その他

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