2017年7月18日火曜日

Emacsでバックアップファイルを作らないようにする

(2017/07/18)
毎回検索するのも面倒なので自分のブログにメモ。
.emacsに下記を記載する。

(setq make-backup-files nil)
(setq auto-save-default nil)

2017年7月15日土曜日

やめましょう歩きスマホの消し方(htc u11)

auのhtc u11で歩きながら操作するといきなりバイブがなって画面全体に出る「やめましょう歩きスマホ」。
わかるけど邪魔ですよね。
というわけで消し方。

【設定】→【au設定メニュー】→【歩きスマホ注意アプリ】
と進んで、ONになっているトグルをOFFにして下さい。

2017年7月12日水曜日

Laravel5でSQLのログを出力する

(2017/07/12)
LaravelでSQLをログに出力したい時ありますよね。
そんな時はこんな感じで書きます。
 
DB::enableQueryLog();
$table1 = DB::table('table1')->where('id', $no)->first();
// $results = DB::select('select * from table1 where id = ?', [1]);
logger()->debug(DB::getQueryLog());


storage/logs/laravel.logに以下のように出力されています。
[2017-07-12 03:01:50] local.DEBUG: array (
  0 =>
  array (
    'query' => '        
        select
            *
        from
            table1
        where
            value like \'%\' || \'?\' || \'%\';',
    'bindings' =>
    array (
      0 => '1',
    ),
    'time' => 1,
  ),
) 

ちなみにdebugログ出すためにconfig/app.phpの下記の部分を変更する必要があります。
 
'log_level' => env('APP_LOG_LEVEL', 'debug')

Atomのスクロールバーのサイズ設定

(2017/07/12)
Atomは素晴らしいテキストエディタですよね。エンジニアで使ってる方は多いと思います。
ただ、Atomのスクロールバーってデフォルトだと細すぎませんか?
タッチパッドだとあまり問題ないのですが、デスクトップなんかでマウスを使っていると
つまんで動かしたいのに細すぎて捕まえられないことが多かったので
サイズ(幅、高さ、丸み)の調整方法をメモしておきます。

File(ファイル)→Settings(環境設定)→Theme(テーマ)と選んで
青いリンク(your style sheet)を選んでCSSファイルの最後に
下記のような感じで追記してみてください。

.scrollbars-visible-always {
  /deep/ ::-webkit-scrollbar {
    width: 15px;
    height: 15px;
 
    &-track {
      border: 10px;
      border-radius: 10px;
      background-color: rgba(100, 100, 100, 1) !important;
    }
 
    &-thumb {
      background-color: rgba(200, 200, 200, 0.7) !important;
      border: 10px;
      border-radius: 10px;
    }
  }
}

するとこんな感じで太くて丸くなりました!

2017年7月7日金曜日

Laravel5.4でAjax

(2017/07/07)
Laravel5.4でAjaxのサンプル

■web.php
<?php
Route::get('/', function () {
    return view('welcome');
});

// Viewを指定するパターン
Route::get('test', function () {
    //return view('test');
              return view('test', ['name' => 'Viewを指定']);
});

// 直接文字列を返すパターン
Route::get('helloworld', function () {
    return 'HelloWorld';
});

// Controller使用するパターン
Route::get('user/{id}', 'TestController@show');

// Ajax(とりあえず簡単なGetでお試し)
Route::get('ajaxTest', 'TestController@ajax');


■コントローラ
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use DB;


class TestController extends Controller
{

    /**
     * 指定ユーザのプロフィール表示
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        // 下記はMariaDBへの接続サンプル
        //$table1 = DB::table('table1')->where('id', 2)->first();
        //$result = $this->addText($id) . $table1->value;

        return view('test', ['name' => $id]);
    }

    /**
     * Ajax通信のサンプル
     * @return [type] [description]
     */
    public function ajax()
    {

        // 簡単にやるなら配列返すのでもOK
        // return ["data" => "Ajax success"];

        return response()->json(
                    ['data' => 'Ajax success'],
                    200,[],
                    JSON_UNESCAPED_UNICODE
                );
    }

    /**
     * ローカルメソッドのサンプル
     * @param [type] $val [description]
     */
    private function addText($val)
    {
        $val2 = '';
        return $val . '-add string-';
    }


}


■blade(マスター。親。)
<!DOCTYPE HTML>
<html lang="ja">
<html>
    <head>
        <meta charset="UTF-8">
        <title>アプリ名 - @yield('title')</title>
        <!-- CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
        <style type="text/css">
        <!--
            hr {
                border: 0;
                border-bottom: 1px dashed #ccc;
                background: #999;
            }
            @yield('css')
        -->
        </style>
        <!-- Scripts -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
        <script type="text/javascript">
        <!--
            @yield('js')
        -->
        </script>
    </head>
    <body>
        @section('header')
            <hr>
            ここがメインのヘッダ
            <hr>
        @show
 
        <div class="container">
            @yield('content')
        </div>
 
        @section('footer')
            <hr>
            ここがメインのフッター
        @show
    </body>
</html>

■継承したコンテンツ用blade
@extends('layouts.app')

@section('title', 'これがサブのタイトルになります')

@section('css')
@endsection

@section('js')
$(function() {
    $("#button_a").on("click", function() {
        alert("aaaaaaaaa");
    });

    $("#button_b").on("click", function() {
        $.ajax(
            '../ajaxTest',
            {
                type: 'get',
                data: { 'no': 'aaaaaaaa' },
                dataType: 'json'
            }
        )
        // 検索成功時にはページに結果を反映
        .done(function(data) {
            alert(data.data);
        })
        // 検索失敗時には、その旨をダイアログ表示
        .fail(function() {
            window.alert('正しい結果を得られませんでした。');
        });
    });
});
@endsection

@section('header')
    @parent
    <p>ここはサブのヘッダ</p>
    <hr>
@endsection

@section('content')
    <p>ここが本文のコンテンツ</p>
    @for($i = 1; $i <= 10; $i++)
        <p>Hello, {{$name}}</p>
    @endfor
    <p>
        <a id="button_a" class="btn btn-lg btn-success" href="#" role="button">Push</a>
        <a id="button_b" class="btn btn-lg btn-info" href="#" role="button">Push</a>
    </p>

@endsection

@section('footer')
    @parent
@endsection

2017年7月6日木曜日

LaravelのためにApacheのVirtualHostの設定例をメモ

(2017/07/06)
LaravelちゃんはDocumentRootを欲しがるので
ApacheのVirtualHostの設定例をメモしておきます。

<VirtualHost "laravel.local:80">

        #ServerName laravel.local

        #ServerAdmin webmaster@localhost

        DocumentRoot "C:/xampp/htdocs/app_laravel/public"
        ErrorLog "logs/dummy-host2.example.com-error.log"
        CustomLog "logs/dummy-host2.example.com-access.log" common


        <Directory "C:/xampp/htdocs/app_laravel/public">
                AllowOverride All
        </Directory>

</VirtualHost>

2017年7月4日火曜日

味と価格のバランスが最高な白ワイン「コノスル ヴェラエタル シャルドネ」

(2017/07/04)
今回もチリ産の白ワインの紹介です。
本当にチリワインは価格からするとその味の良さに驚きますね。

中でも1000円以下で買える白ワインでは最高の味だと思っているのがこのワイン。
「コノスル ヴェラエタル シャルドネ」
白葡萄品種、人気No.1のシャルドネ。
爽やかなシトラスの香りにトロピカルな果実味が感じられる、
豊かでバランスのよい白ワイン。
外観は黄金がかったきれいなイエローで、若々しい印象です。溌剌とした中に、複雑さも感じさせます。フレッシュなシトラスのアロマ、白桃を思わせる果実香に、ミネラルのヒント。ミネラルを感じさせる複雑な果実香が口内に広がります。ヴァラエタル・シリーズのシャルドネは若々しくフレッシュ。バランス良く、きれいな酸が感じられます。
コノスル日本語公式サイトより

 近くのスーパーだとだいたい800円~900円くらいの価格帯です。

アルパカやフロンテラと比較すると少し高めの価格ですが
充分満足できる味だと思います。
私は普段はだいたいこの3種類のうちどれかを選んでいます。
飲みやすさで言うと「アルパカ>コノスル>フロンテラ」
香りの良さは「コノスル>フロンテラ>アルパカ」
だと思います。

普段はアルパカ、フロンテラで週末はコノスルとかどうでしょうか?
ステーキにも合いますよ。






OracleDBで現在実行中のSQLを確認する

(2017/07/04)
OracleDBで現在実行中のSQLを確認するためのSQLです。

select
    a.SID,
    b.PIECE,
    a.SQL_ID,
    b.SQL_TEXT
from
    v$session a, v$sqltext b
where
    a.SQL_ID = b.SQL_ID
    and a.TYPE = 'USER'
order by
    3,2

2017年6月30日金曜日

コスパ最高のワイン「アルパカ」

(2017/06/30)
前回はコスパの良い白ワインとしてフロンテラのシャルドネを紹介しました。
が、今回はさらにコスパが良い、というかコスパはおそらく
最強のワイン「アルパカ(Alpaca)」を紹介します。

今回も同じくチリワインで白、シャルドネです。
やはりチリのシャルドネはハズレが少ないんです。

トロピカルフルーツやピーチを想わせる豊かな果実味とコクのある味わいが特徴の、なめらかな飲み口の辛口白ワインです。

アサヒワインコムより

アルパカはなんといっても価格が魅力です。
スーパーだと500円を超えることはいままでなかったです。

(証拠写真)

味はフロンテラに比べると渋みが少なくスッキリしています。
飲みやすさで言えば辛口の中では最強ではないでしょうか。
高級感はないですが普段気軽に飲めるおいしい白ワインと言えると思います。

また、アルパカもスクリューキャップなのでオープナーがなくても
開けられますし余っても保存しやすいですね。

地中海料理と相性バッチリです!









2017年6月29日木曜日

コスパのいい白ワイン「フロンテラ」

(2017/06/29)
最近糖質制限ダイエットとかロカボダイエットとか流行っていますよね。
かくいう私もやっているのですが、ダイエットはやる気あっても
なかなかお酒をやめるのは難しいですよね。

そこでダイエット中でも飲んで大丈夫とされるお酒を挙げていきます。
基本的には蒸留酒ですが一部そうでないものも。
・ウイスキー
・泡盛
・ワイン(辛口)
・糖質0のビール系飲料、サワーなど

この中だとウイスキー(ハイボール)がいいと言う方も多いでしょうけど
ワインがいいかな、と思う人も多いかと思います。

そこでメインのお酒が白ワインの私がオススメのワインを紹介します。
今回紹介したいのは「フロンテラ(FRONTERA) シャルドネ」というチリワインです。


こちらのワインの実売価格は498円~698円というあたりが多いです。

熟したグレープフルーツ、アプリコット、トロピカルフルーツ、パイナップル、ナッツ、白桃、クルミ、ミネラル香と若干のスモーク香など、複雑で芳醇なアロマ。リッチな果実味とクリーンな透明感が同居する辛口ワインです。
KIRINの公式ホームページより

味はかなりサッパリとした辛口。渋みはそれなりにあります。
このワインのいいところは。。
・価格が手頃
・コンビニやスーパーで売っていることが多い
・辛口かつ飲みやすいシャルドネは料理をあまり選ばない
・スクリューキャップでオープナーが不要

こんなところですかね。
もう少し価格の安いおすすめの白ワインもありますが
味や香りはこちらの方が私は好きです。(私は濃いほうが好き)
ちなみにシャルドネというのはぶどうの種類の名前です。
もっと辛口が好き!という人は「ソーヴィニヨン・ブラン」もオススメです。

また白ワインは飲みきれなかった場合に残しておいて
料理に使うことができます。
そんなときにスクリューキャップだと保存しやすいですよね。

ちなみに私の経験上、糖質制限中にアルコールを取りすぎると
肝臓の処理がそちらに取られて低血糖症になりやすいので
ダイエット中にオススメといっても結局はほどほどがいいと思います。







2017年6月28日水曜日

Android開発でConstraintLayoutでアプリが落ちる現象

(2017/06/28)
ひさびさにAndroid開発をしようと思ってEmptyActivityで
空のアプリを作って以下のような簡単なListViewを表示しようとしたら
コンパイルエラーもないのにエミュレータ側でアプリが立ち上がらずに
落ちてしまいます。

class MainActivity : AppCompatActivity() {



    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        // ListView

        val lv = findViewById(R.id.list_view) as ListView

        val list_items = listOf("1", "2", "3")

        // アダプタをセット

        val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list_items)

        lv.adapter = adapter





    }

}


ちなみに環境は以下の通りです。
・Windows10
・AndroidStudio2.3.3
・Kotlin1.1.3


調べてみたらどうやらAndroidStudio2.2くらいからデフォルトで
選ばれるようになった「ConstraintLayout」が原因とわかりました。

以前のように「RelativeLayout」で書き直したら以下のように
問題なく動きました。


ConstraintLayoutはマテリアルデザインしやすかったりXMLのネストを
浅く書けたりするみたいなんですけど今のところちょっと不具合がまだ
多そうに感じます。
勉強するのも良さそうなのですがもうちょっと安定してからですかね。
私はとりあえずはRelativeLayoutで進めようかなと思っています。








「午後の紅茶 おいしい無糖」を紅茶好きのSEが飲んでみました。

(2017/06/28)
唐突ですが私は紅茶が好きです。
仕事中や食後もコーヒーではなく紅茶をいつも飲んでいます。

コーヒーはココぞというときにはたまに飲むのですが
どうも強すぎる味や香りが「大好き」にはなれないんです。

なので目も覚めつつ香りが程よくて飲みやすい紅茶はベストフレンドです。
中でもダージリンが好きなのですがKIRINからいい感じの商品が出ましたね。

午後の紅茶 おいしい無糖。
今までも無糖の紅茶はありましたがこの商品は少し違います。
ちゃんと「ダージリン」らしいです。
手摘みダージリン茶葉使用と記載があります。

早速FamilyMartで購入して飲んでみました。

さすがに香り、味ともにきちんと淹れたものやお店のものにはかないませんが
ちゃんとダージリンしてます!
値段も普通で150円程度でこれはコスパいいですね。

このレベルのものがコンビニや自販機で買えるというのは良い時代になりましたね。
私は甘いものが苦手なのでこういう無糖系があると本当助かります。

2017年6月現在、ペットボトルの紅茶の中では一番美味しいです。
自信を持ってオススメできます!


本当はFamilyMartでその場で淹れる紅茶があるみたいなのでそれを買いに行ったのですが
会社の最寄りのFamilyMartにはそれがないそうで買えなかったので
代わりにこちらを購入したんですよね。

次回はそちらのほうを飲んでみたいと思います。


2017年6月27日火曜日

TJライナーのメリット・デメリット

(2017/06/27)
他でもちょくちょく書いていますが私は埼玉県の坂戸市に住んでいます。
となると使用できる駅は東武東上線の坂戸駅一択です。
そして幸運なことにこの駅はTJライナーが停まる駅です。
そんなわけで私はTJライナーをかなりヘビーに使っております。

TJライナーについて軽く紹介します。

■TJライナーとは
TJライナー(ティージェイライナー)は、東武鉄道東上本線で運転されている座席定員制(池袋乗車時のみ)の優等列車である。JRなどで運行されているホームライナーに似た形で運行されている。
2008年平成20年)6月14日に運転を開始し、東上本線の有料列車としては特急「フライング東上」号以来約50年ぶりとなる。ただし「TJライナー」は「フライング東上」と異なり、この名称を愛称としてだけではなく、愛称を兼ねた正式な列車種別名としている。
シンボルカラー(ロゴマーク)は青を基調とする。停車駅案内・駅時刻表においての色は橙を使用。
2010年1月には、日本鉄道運転協会創立51周年記念式典における東記念賞を受賞した[
Wikipediaより

■使用することになった経緯
私の会社は働き方をある程度自由に選べるので、TJライナーで通える時間帯で
仕事をすることができます。
お金よりもQOLを大事にする私としてはTJライナーを使わない選択肢はありませんでした。


■メリット
・必ず座れる
必ず座れるのは相当大きいです。この時間を作業などにあてることができるようになりました。

・座席が広く進行方向に向かって座れる
普通の車両が隣との距離はあまりないですがTJライナーはノートPCで作業できる程度の幅がありますし、新幹線に近いです。

・空調が通常の車両よりも良い
東武東上線はエアコンがひどいです。夏は暑いし冬は寒い。基本的に混み具合からすると不快指数は高いのですがTJライナーの空調はかなりいいです。暑い、寒いとは感じづらいです

・朝は特にすいているので二人がけの席でもだいたい一人で座れる
朝はまだ利用者が少ないのでひとりで2席独占状態が多いです。

・池袋~坂戸間が38分!
1時間を覚悟するこの距離がこの時間で済んでしまうのはすごいです。

・全車両で無料でTOBU WIfiが使用できるのでスタバ状態
ちょっと前のエントリーで書きましたが現在PCは証明書エラーでつなぐことができません。スマホに関しては問題なく無料でネットが使えます。


・スマホで予約できる
いちいち券売機でチケットを買う必要がありません。スマホでピピッとやって駅でQRコードを表示させて読んでもらえばOKです。クレジットカードは東武カードでなくて大丈夫です。(東武の定期券はあいかわらず東武カード必須)


■デメリット
・夜は310円、朝は410円かかる
このインセンティブに関して私はお金がかかるのは逆にメリットですが、費用がかかるというのはデメリットとは言えると思います。

・特に夜は二人席で隣で酒盛りが始まると匂いがきつい
わりとありがちなのですが、お仕事終えて疲れたサラリーマンが新幹線のごとくお酒を飲み始める事が多いです。が、新幹線ほど広くもないし換気もされないので匂いはかなりきつくなります。禁酒車両で+100円とかあったらそっち買います。。。

・朝は途中下車ができないのでお腹が痛いときには地獄を見る
お腹の調子が悪い日、二日酔いの日に死ぬ思いをしたことが何度かあります。。。
降りれないならば電車内にトイレを用意してください。お願いします。

・3大キャリアじゃないとスマホ利用できない。(3大キャリアのキャリアメール必須。。)
UQでも駄目です。3大キャリアのみ。システムは最低レベルです。
サービス開始当初は何故かSoftBankのiPhoneしか使用できず、auのiPhoneは弾かれるというお粗末さでした。


・座席は普通の車両と比べると良いが新幹線よりは狭く、それなりの体型の男性二人だと若干きつい
私は通常サイズの男ですが、同じサイズの男性が隣に座ると若干窮屈です。

・基本的にはスマホではなくチケットが前提のシステム
スマホでQRコードを表示させてそれを読み取ってもらうシステムですが、朝はハンディ端末で読むためにあまり問題ないですが池袋駅はチケットを読み取る前提で固定の装置で下から読み取るためスマホを逆向きにしなければならず読み取り失敗が多いです。


・朝はギスギスしている
メリットでも触れた点の裏返しなのですが、朝は一人で二人席を独占できることが多いため、逆にみんな隣に座られたくないというオーラがすごいです。隣の席にバッグを置いたりしてブロックするようなルール違反もかなり見られます。









Javaで文字列関連の自作ユーティリティ

(2017/06/27)
ApacheCommonsとGsonが必要なところがあります。

public class StringUtil {


    /**

    * パラメータを3桁カンマ区切り数字として返す。

    * @param number        処理対象文字列

    * @return                      フォーマット後文字列

    */

    public static String formatComma(String number) {

            if (!NumberUtils.isCreatable(number)) {

                    return number;

            }

            NumberFormat nfNum = NumberFormat.getNumberInstance();

            return nfNum.format(Double.parseDouble(number));

    }



    /**

    * パラメータの文字列を、パラメータの最大文字数で切って返す。

    *

    * nullの場合ブランクを返す。

    * 文字数以内の場合文字列をそのまま返す。

    * 指定文字数を超える場合は文字数で切った文字列を返す。

    *

    * @param target 処理対象文字列

    * @param length 文字数

    * @return 処理後文字列

    */

    public static String split(String target, int length) {

            String res = null;



            if (StringUtils.isEmpty(target)) {

                    res = "";

            } else if (target.length() > length) {

                    res = target.substring(0, length);

            } else {

                    res = target;

            }



            return res;

    }



    /**

    * 引数の文字列をSHA-256で暗号化して、16進数エンコードする。

    * ※base64でもエンコード出来るが、その場合、文字数が64文字以下になる。

    * @param pass

    * @return

    */

    public static String encode(String pass) {

            MessageDigest md = null;

            try {

                    md = MessageDigest.getInstance("SHA-256");

            } catch (NoSuchAlgorithmException e) {// 発生しない

                    e.printStackTrace();

            }

            md.update(pass.getBytes());

            byte[] digest = md.digest();



            // 16 進数文字列として出力

            StringBuilder sb = new StringBuilder();

            for(byte b : digest) {

                    String hex = String.format("%02x", b); // 16 進数 2 桁として表示 (1byte は 00 ~ ff)

                    sb.append(hex);

            }



            String result = sb.toString();



            if (result.length() > 64) {

                    result = result.substring(0, 64);

            }



            return result;

    }



    /**

    * ランダムな32文字の文字列を生成する。

    * CSRF攻撃対策用のトークンとして使用する。

    * @return

    */

    public static String getRandomToken() {

            SecureRandom random = new SecureRandom();

            byte bytes[] = new byte[32];

            random.nextBytes(bytes);



            // 16 進数文字列として出力

            StringBuilder sb = new StringBuilder();

            for(byte b : bytes) {

                    String hex = String.format("%02x", b); // 16 進数 2 桁として表示 (1byte は 00 ~ ff)

                    sb.append(hex);

            }



            String result = sb.toString();



            if (result.length() > 32) {

                    result = result.substring(0, 32);

            }

            return result;

    }



    /**

    * ランダムな文字列を生成する。

    * 文字列に記号を含めるため、base64でエンコードする。

    * パスワードを生成するために使用する。

    * @param num   文字数

    * @return      生成したパスワード

    */

    public static String getRandomPass(int num) {

            SecureRandom random = new SecureRandom();

            byte bytes[] = new byte[32];

            random.nextBytes(bytes);



            String encoded = Base64.getEncoder().encodeToString(bytes);



            String result =  "";

            if (num <= 32) {

                    result = encoded.substring(0, num);

            } else {

                    result = encoded.substring(0, 32);

            }

            return result;

    }



    /**

    * 数値を指定の桁で0埋めする

    * @param num   処理対象数値

    * @param digit 桁数

    * @return              0埋め後文字列

    */

    public static String padZero(int num, int digit) {

            return String.format("%0" + digit +"d", num);

    }



    /**

    * 指定の桁までスペース埋めする

    * @param str   処理対象文字列

    * @param digit 桁数

    * @return              スペース埋め後文字列

    */

    public static String padSpace(String str, int digit) {

            return String.format("%" + digit +"s", str);

    }



    /**

    * 数字の頭の0を除去する

    * @param str   処理対象文字列

    * @return              0除去後文字列

    */

    public static String ltrimZero(String str) {

            return str.replaceFirst("^0+", "");

    }



    /**

    * 文字列の頭のスペースを除去する

    * @param str   処理対象文字列

    * @return              スペース除去後文字列

    */

    public static String ltrim(String str) {

            return str.replaceFirst("^ +", "");

    }



    /**

    * 文字列の後ろのスペースを除去する

    * @param str   処理対象文字列

    * @return              スペース除去後文字列

    */

    public static String rtrim(String str) {

            return str.replaceFirst(" +$", "");

    }



    /**

    * JSON文字列からMapを生成

    * @param json  JSON文字列

    * @return              Map

    */

    public static Map<String, String> createMapFromJson(String json) {

            Gson gson = new Gson();

            Type listType = new TypeToken<HashMap<String, String>>() { }. getType();

    HashMap<String, String> map = gson.fromJson(json, listType);

    return map;

    }



    /**

    * MapからJSON文字列を生成

    * @param map   Map

    * @return              JSON文字列

    */

    public static String createJsonFromMap(Map<String, String> map) {

            Gson gson = new Gson();

            return gson.toJson(map);

    }



    /**

    * パラメータ1がnullの場合はパラメータ2を返す(SQLのNVLと同じ)

    * @param val1  検査対象文字列

    * @param val2  パラメータ1がnullの時に返す文字列

    * @return              判定後パラメータ1OR2

    */

    public static String nvl(String val1, String val2) {

            if (val1 == null) {

                    return val2;

            } else {

                    return val1;

            }

    }

}

2017年6月23日金曜日

Javaで日付関連の自作ユーティリティ

(2017/06/23)


public class DateUtil {


    /**

    * システム日付を返す

    * @return システム日付

    */

    public static java.util.Date getToday() {

        return new java.util.Date(System.currentTimeMillis());

    }

 

    /**

    * システム日付を返す(SQL)

    * @return システム日付

    */

    public static java.sql.Date getTodaySql() {

        return new java.sql.Date(System.currentTimeMillis());

    }

 

    /**

    * パラメータのDateに日数を加算

    * @param date      対象日付

    * @param add_days      加算日数

    * @return              計算後の日付

    */

    public static java.util.Date addDay(java.util.Date date, int add_days) {

        Calendar cal = Calendar.getInstance();

        cal.setTime(date);

        cal.add(Calendar.DATE, add_days);

 

        return new java.util.Date(cal.getTimeInMillis());

    }

 

    /**

    * パラメータのDateに日数を加算(SQL)

    * @param date      対象日付

    * @param add_days      加算日数

    * @return              計算後の日付

    */

    public static java.sql.Date addDaySql(java.sql.Date date, int add_days) {

        Calendar cal = Calendar.getInstance();

        cal.setTime(date);

        cal.add(Calendar.DATE, add_days);

 

        return new java.sql.Date(cal.getTimeInMillis());

    }

 

    /**

    * パラメータのDateに月を加算

    * @param date          対象日付

    * @param add_months    加算月数

    * @return                  計算後の日付

    */

    public static java.util.Date addMonth(java.util.Date date, int add_months) {

        Calendar cal = Calendar.getInstance();

        cal.setTime(date);

        cal.add(Calendar.MONTH, add_months);

 

        return new java.util.Date(cal.getTimeInMillis());

    }

 

    /**

    * パラメータのDateに月を加算(SQL)

    * @param date          対象日付

    * @param add_months    加算月数

    * @return                  計算後の日付

    */

    public static java.sql.Date addMonthSql(java.sql.Date date, int add_months) {

        Calendar cal = Calendar.getInstance();

        cal.setTime(date);

        cal.add(Calendar.MONTH, add_months);

 

        return new java.sql.Date(cal.getTimeInMillis());

    }

 

    /**

    * パラメータのDateに年を加算

    * @param date          対象日付

    * @param add_months    加算年数

    * @return                  計算後の日付

    */

    public static java.util.Date addYear(java.util.Date date, int add_years) {

        Calendar cal = Calendar.getInstance();

        cal.setTime(date);

        cal.add(Calendar.YEAR, add_years);

 

        return new java.util.Date(cal.getTimeInMillis());

    }

 

    /**

    * パラメータのDateに年を加算(SQL)

    * @param date          対象日付

    * @param add_months    加算年数

    * @return                  計算後の日付

    */

    public static java.sql.Date addYearSql(java.sql.Date date, int add_years) {

        Calendar cal = Calendar.getInstance();

        cal.setTime(date);

        cal.add(Calendar.YEAR, add_years);

 

        return new java.sql.Date(cal.getTimeInMillis());

    }

 

    /**

    * パラメータのDateをYYYY/MM/DDのフォーマットにして返す

    * @param date 対象日付

    * @return 変換後の日付文字列

    */

    public static String formateYyyyMmDd(java.util.Date date) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

        return sdf.format(date);

    }

 

    /**

    * パラメータのDateをYYYY/MM/DDのフォーマットにして返す(SQL)

    * @param date 対象日付

    * @return 変換後の日付文字列

    */

    public static String formateYyyyMmDdSql(java.sql.Date date) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

        return sdf.format(date);

    }

 

    /**

    * パラメータのDateをYYYY/MMのフォーマットにして返す

    * @param date 対象日付

    * @return 変換後の日付文字列

    */

    public static String formateYyyyMm(java.util.Date date) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM");

        return sdf.format(date);

    }

 

    /**

    * パラメータのDateをYYYY/MMのフォーマットにして返す(SQL)

    * @param date 対象日付

    * @return 変換後の日付文字列

    */

    public static String formateYyyyMmSql(java.sql.Date date) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM");

        return sdf.format(date);

    }

 

    /**

    * システム日時をYYYYMMDDHHMMのフォーマットにして返す

    * @return 変換後の日時文字列

    */

    public static String getTodayYyyyMmDdHhMm() {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");

 

        java.sql.Timestamp ts = new java.sql.Timestamp(System.currentTimeMillis());

 

        return sdf.format(ts);

    }

 

    /**

    * システム日付をyyyy-MM-dd HH:mm:ssのフォーマットにして返す

    * @return 変換後の日付文字列

    */

    public static String getTodayYyyyMmDdHhMmSs() {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

 

        java.sql.Timestamp ts = new java.sql.Timestamp(System.currentTimeMillis());

 

        return sdf.format(ts);

    }

 

    /**

    * システム日付をYYYYMMDDのフォーマットにして返す

    * @return 変換後の日付文字列

    */

    public static String getTodayYyyyMmDd() {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

 

        java.sql.Timestamp ts = new java.sql.Timestamp(System.currentTimeMillis());

 

        return sdf.format(ts);

    }

 

    /**

    * システム日付をYYYY/MM/DDのフォーマットにして返す

    * @return 変換後の日付文字列

    */

    public static String getTodayYyyyMmDdWithSlash() {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

 

        java.sql.Timestamp ts = new java.sql.Timestamp(System.currentTimeMillis());

 

        return sdf.format(ts);

    }

 

 

    /**

    * YYYY-MM-DD(もしくはYYYY/MM/DD)形式の文字列をDateにして返す(java.util.Date 版)

    * @param str_date

    * @return

    */

    public static java.util.Date convertStringToDate(String str_date) {

        // YYYY/MM/DD形式の場合はフォーマットを変更してから処理

        if (str_date.indexOf("/") > -1) {

            str_date = str_date.replaceAll("/", "-");

        }

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

 

        java.util.Date result = null;

        try {

            result = sdf.parse(str_date);

        } catch (ParseException e) {

            e.printStackTrace();

        }

        return result;

    }

 

    /**

    * YYYY-MM-DD(もしくはYYYY/MM/DD)形式の文字列をDateにして返す(SQL)

    * @param str_date

    * @return

    */

    public static java.sql.Date convertStringToDateSql(String str_date) {

        // YYYY/MM/DD形式の場合はフォーマットを変更してから処理

        if (str_date.indexOf("/") > -1) {

            str_date = str_date.replaceAll("/", "-");

        }

 

        return java.sql.Date.valueOf(str_date);

    }

 

}

現役SEによるZenBook3レビュー

(2017/06/23)


軽量薄型で開発できるノートPCが欲しくてASUSのZenBook3(UX390UA-512GP)を購入しました。
軽くレビュー的なものをしたいと思います。

まずはスペック。
■ディスプレイ:12.5インチ
■解像度:1920×1080
■重さ:910g
■厚さ:11.9mm
■CPU:Core i7-7500U
■メモリ:16GB
■グラフィック:Intel® HD グラフィックス 620
■ストレージ:512GB (PCI Express 3.0 x4接続)
■外部IF:USB3.1(Type-C)×1、ヘッドホンジャック
■OS:Windows 10 Home 64ビット

本当に薄くて軽くてかつスペック的にはきちんと開発できそうです。
ただ、やはりUSB Type-Cひとつという拡張性のなさがネックなのか?
というところですかね。

実際に主に下記の用途で使用してみた感想を書こうかと思います。
①ブラウザでネット閲覧
②ブログ
③Excelで資料作成
④AndroidStudioでアプリ開発
⑤ドラゴンクエスト10

①ブラウザでネット閲覧
これは何の問題もないですね。TouchPadの3本指のジェスチャーに
ブラウザの前へと後ろへを割り当てるとさらに快適です。(Macに近い)

②ブログ
やや深みのないキータッチのため打ち漏らしが若干あります。
あとEnterの位置が少し遠い、上下左右の方向キーが小さいなど
とにかく文字をたくさん打つって言う人には不満があるかも。
似たサイズのマシンだとブログ系の人はDELLやHPのウルトラブックのほうが
キーボード的にはいいかもです。
ただし、個人的にはMacBookよりはかなり打ちやすいです。

③Excelで資料作成
OfficeSoloに入ってみました。Excelに関しては何も問題ないですね。
16GBのメモリとSSDのおかげでデスクトップよりも早い立ち上がり
サクサク動きます。

④AndroidStudioでアプリ開発
重いと評判のAndroidのエミュレータもこのスペックだとストレスなく
立ち上がります。職場の数年前のLet'sNoteと比較すると段違いの速度ですし
2年前のBTOデスクトップゲーミングPCと比較しても遜色ないです。
これがやりたかったので、本当に買ってよかったと思っています。

⑤ドラゴンクエスト10
ベンチマークだと1280×720で5000くらいです。割と快適にプレイできます。
おすすめはこの解像度でウインドウ最大化すると文字も見やすくていいです。
BTOのゲーミングPCと比較すると、チャットと、処理が貯まる大量の敵とかのときに
わずかにレスポンスが遅くなる気がしました。
まあさすがにグラボなしなので仕方ないです。でもウルトラブックでゲームが
できるというのは大きいんじゃないかなと思います。

■その他
・指紋認証
精度自体は問題ないのですが、スリープからの復帰などのときに指紋認証の
登録がされていない、というような文言が出て指紋認証を諦められる時があります。
他の方もなっているようなのでWindowsHelloかAsusuのソフトウェアに
何らかの問題があると思われます。
一応回避策としては、再起動するとまた使用できるようになります。

・バッテリー持ち
通勤中に使ってみたところ1時間程度のWeb閲覧、ブログ編集、Excelの資料作りなど
の作業で8~15%程度の減りでした。
おそらくガッツリ一日作業するような場合はアダプターがあったほうが良さそうです。

・サウンド関係
音はこだわっているだけあってなかなか良いです。
MacBookPro、MacBookAirより良かったです。
少し高音のシャリシャリ感は気になりました。
音量を上げても割れないのと薄型PCとは思えない出力は
好印象です。

・拡張性
やはりUSB Type-Cひとつというのは少ないです。
ミニドッグだとType-Aが一つ使えるだけというのも心もとなく
1台持ちの場合はHUBが必須になるかと思います。
私はサブなので特に問題ないですけど。

■総評
ZenBook3は開発もできるし軽いゲームもできる軽量薄型ウルトラブック
だということがわかりました。
最近の麦茶だと700mlくらいの容量があるので、それよりちょっと重い
くらいの重量でこのスペックは画期的です。
ただ開発をしない人はcorei5のモデルのほうがコスパはいいですね。
またブロガーのような文字をたくさん打つ人はもう少しキーが深いPCを
選んだほうが良さそうです。
拡張性は本当にないのですがデフォで付属するミニドッグがあるので
今のところは困ってないですね。(ドラクエはコントローラ必須)

個人的には購入して良かったです。とても満足しています。
どなたかの参考になれば幸いです。









2017年6月22日木曜日

本物のPython

今日はおやすみだったのでデニーズでランチ。
マンションに帰ってきたら管理人さん(女性)が大絶叫してる。

何かと思って聞いてみたらなんと大きな蛇が出たらしい。
いくら私がPython好きだからって本物かよ!

まあでもそこは小さい頃、佐賀の山奥で育った私。
蛇など怖くないですし
子供も多いこのマンションでそのままにはできないと思い
すぐに家に帰って装備を整え捕獲に出発。

ちなみに装備は以下。
・バイクの冬用グローブ
・虫かご

しばらくの格闘の末、何とか捕獲に成功しました。

もう管理人さんは大騒ぎ。
「いやー!!!怖いーー!!殺してーー」

ちなみに捕獲したのはこの子。

上からの写真


可愛いですね。
殺してしまうなんてあまりに可愛そう。

ということで高麗川の奥地に放ってきました。

いや、たまたま休みでたまたま通りかかって良かった。

子供達が見たらパニックだったでしょうね。。

GoogleSpreadSheetでJavaScriptのマクロ

(2017/06/22)
これもまた仕事でGoogleSpreadSheetでJavaScript(JS)のマクロを 組んでみたのでメモ書きです。 今回は「SyntaxHighlighter」で綺麗に表示できるかも実験。
function createDateList() {

  const START_ROW = 6;
  const END_ROW=36;

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // 日本の祝日取得
  var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var startTime = new Date(2012, 0, 1);
  var endTime = new  Date(2020, 11, 31);
  var events = cal.getEvents(startTime, endTime);

  // 標準時間を取得
  var nstart = sheet.getRange("H2").getValue();
  var nend = sheet.getRange("I2").getValue();
  var nrest = sheet.getRange("J2").getValue();

  // 色をクリア
  sheet.getRange("A" + START_ROW + ":N" + END_ROW).setBackgroundRGB(255, 255, 255);
  // 時間・作業内容クリア
  sheet.getRange("C" + START_ROW + ":E" + END_ROW).setValue("");
  sheet.getRange("G" + START_ROW + ":I" + END_ROW).setValue("");
  sheet.getRange("K" + START_ROW + ":L" + END_ROW).setValue("");
  sheet.getRange("N" + START_ROW + ":N" + END_ROW).setValue("");
  var yesterday;
  for (i = START_ROW; i < END_ROW + 1; i++) {

    var today = sheet.getRange("A" + i).getValue();
    var weekday = sheet.getRange("B" + i).getValue();

    // 不要な日を消す
    if (i > 30) {
      valY = yesterday.toString().slice(8, 10);
      valT = today.toString().slice(8, 10);
      if (valT != "" && valY > valT) {
        sheet.getRange("A" + i + ":I" + i).setValue("");
        continue;
      }
    }

    if (weekday == "日") {
      sheet.getRange("A" + i + ":N" + i).setBackgroundRGB(255, 230, 230);

    } else if (weekday == "土") {
      sheet.getRange("A" + i + ":N" + i).setBackgroundRGB(200, 230, 255);
    } else {
      sheet.getRange("C" + i).setValue(nstart);
      sheet.getRange("D" + i).setValue(nend);
      sheet.getRange("E" + i).setValue(nrest);
    }

    // 祝日
    for (j = 0; j < events.length; j++) {
      var holiday = events[j].getAllDayStartDate().toString();

      if (today == holiday) {
        sheet.getRange("A" + i + ":N" + i).setBackgroundRGB(255, 230, 230);
        sheet.getRange("N" + i).setValue(events[j].getTitle());
        sheet.getRange("C" + i).setValue("");
        sheet.getRange("D" + i).setValue("");
        sheet.getRange("E" + i).setValue("");
        sheet.getRange("G" + i).setValue("");
        sheet.getRange("H" + i).setValue("");
        sheet.getRange("I" + i).setValue("");
        sheet.getRange("K" + i).setValue("");
        sheet.getRange("L" + i).setValue("");
      }
    }
    yesterday = today;

  }

}

2017年6月21日水曜日

Kotlinを思い出すためのサンプルソース

(2017/06/21)
↑今回から日付を入れます。

仕事ではあまり触れる機会が少ないKotlin。
JavaやPHPの後だと忘れがちなんでそのまま実行できるような
Kotlin思い出す用のソースを貼っておきます。
あとで綺麗に見えるように編集するかも。→しました(2017/06/22。ただしKotlinには対応してないんでハイライトがない。。。)

fun main(args: Array<String>) { // ←JVM言語ですが、このように一番外枠がClassでなくても大丈夫。Ptyhonのモジュールのような考え方です。

    // Javaと相互互換を保証しています。ので、Javaの資産がそのまま使えます。またこのファイルのメソッドなどもJavaから呼び出せます。
    println(java.sql.Timestamp.valueOf("2013-10-11 12:13:4"))
    System.out.println("Javaによるsysout")

    // (アドレスが)変更できない変数の宣言は「val」(Javaで言う所のfinal)
    val str: String = "Hello, World!"
    val num: Int = 5 // プリミティブはない。IntとかLongとか。Javaでいうラッパーを使用する。ここらへんもPythonに近いですね。

    // 3項演算子の代わりにこんな文法がある
    val res = if (num.equals(5)) {
        "Hi, Tom!"
    } else {
        "Hi, Bob!"
    }

    println(str + num.toString())
    println(res)

    // (アドレスが)変更できる変数の宣言は「var」。Kotlinでは可能な限り「val」を使うことを推奨
    var str2: String = "test"
    str2 = "test2"
    println("str2:" + str2)
    val str3: String = "test"
    // str3 = "test3" ←これはコンパイルエラー。リテラルはアドレスが別になるため。
    // str3 = str3 + str2 ←よってこれもコンパイルエラー。StringBuilderのように使う場合はvarを使用する。
    str2 += "abcd"
    println("文字列の変更。test2 + abcd = " + str2)

    // 型の変換は変換元のメソッドで行う
    val int1: Int = "123".toInt()
    val int2 = int1 * 10
    println(int2.toString())
    //Int.parseInt("123") ←こんなメソッドはない

    // Switchはなくて、whenを使う
    val color: String = "青"
    val piyo = when (color) {
        "青" -> "blue"
        "赤" -> "red"
        else -> "other"
    }
    println(piyo)


    // (中身を)変更できないリスト。Pythonで言う所のタプル。
    // (豆知識)Pythonでも可能な限りリストではなくタプルを推奨してますよね。
    println("変更できないリスト")
    val list: List<String> = listOf("1", "2", "5")
    // list.add("5") ←変更できないリストなのでaddメソッドは存在しない
    for (value1 in list) {
        println(value1)
    }

    // (中身を)変更できるリスト。Pythonで言う所のリスト
    println("変更できるリスト。宣言は「val」なところに注目。この場合はアドレスが変わらないという意味")
    // JavaでfinalのListにもaddはできますよね
    val mutableList: MutableList<Int> = mutableListOf(9, 8, 7, 6, 5)
    mutableList.add(4)
    for (value1 in mutableList) {
        println(value1)
    }

    // JavaのObjectにあたるクラスはAnyです
    val any1: Any = "This is Any."
    val any2: Any = 123 // Javaと違ってプリミティブがないのでこんな書き方になる。Javaなら「Object any2 = new Integer(123);」とか。
    println(any1.toString())
    println(any2.toString())

    // クラスの使い方。Kotlinでは「new」は不要
    val carol = Car(price = 1000000, speed = 250, name = "キャロル")
    println("name:" + carol.name) // ←実はこれはフィールド(値)を直接参照しているのではなく、プロパティ(getter)の呼び出しです
    // メソッド呼び出し
    carol.displayInfo()

    // Try-Catch
    try {
        throw Exception("try-catch")

    } catch (e: Exception) {
        println("Error Message:" + e.message)
    }

    // ラムダ
    val sum: (Int, Int) -> Int = { x, y -> x + y }
    println("ラムダの処理結果→" + sum(1, 2))

    // 匿名関数
    val sum2 = fun(a: Int, b: Int): Int {
        return a + b
    }
    println("匿名関数の処理結果→" + sum2(1, 2))

    // 2つの結果を戻してくれる関数。Javaに欲しかったですよね。
    val pair = carol.addNumbers(2, 3)
    println("2つの結果を返してくれる関数 ひとつめ→" + pair.first + " ふたつめ→" + pair.second)

    // プライマリコンストラクタの動き
    val cb400sf = Bike("CB400SF", 200, 800000)
    println("プライマリコンストラクタで設定されたもの→" + cb400sf.name + "," + cb400sf.maxSpeed + ",\\" + cb400sf.price)

    // filterの使い方。trueの要素だけ返す
    val filterSample = arrayOf(1, 2, 3).filter { num -> num != 2 }
    print("filterの使い方→")
    for (x in filterSample) {
        print(x.toString() + " ")
    }
    println()

    // filterNotにすると逆になる
    val filterNotSample = arrayOf(1, 2, 3).filterNot { num -> num != 2 }
    print("filterNotの使い方→")
    for (x in filterNotSample) {
        print(x.toString() + " ")
    }
    println()

    // forEach
    println("ListのforEachはJava8と同じ雰囲気で。")
    listOf(1, 2, 3).forEach { x -> println(x + 1) }
    // リスト系は他にもMaxとかMinとかDistinctとか便利なのがたくさんある。リファレンスは見たほうがいいです。

    // Stringの便利な機能やメソッド
   println("Stringの便利な機能やメソッド")
    val a = 2
    val b = 3
    // もうformatメソッドは必要ありません
    println("$a + $b = ${a + b}") // 2 + 3 = 5
    // ヒアドキュメントも使えます
    val hereDoc = """
<html>
    <body>
        $a + $b = ${a + b}
    </body>
</html>
"""
    println(hereDoc)


    // Kotlinはnull safetyです。
    // 基本的にNull Pointer Exceptionは発生しません。(Javaで定義したメソッドの使い方によってはそれでも起こるけど)
    // 普通の変数にnullを代入しようとするとコンパイルエラーになります
    // val nullDesu: String = null ←コンパイルエラー
    // nullが入り得る場合は明示的に下記のようにしなければいけません
    val nullDesu: String? = null
    // println(nullDesu.length) ←わざとぬるぽ起こそうとしてもコンパイルエラー。nullが入り得る変数で危険なことはできない仕様です
    if (nullDesu != null) {
        println(nullDesu.length) // nullチェックをするとコンパイルが通ります
    }

    // 既存のクラスに機能を追加できる「Extension」という機能
    // 今回はStringクラスに機能追加しちゃいます
    fun String.addShimasu(x: Int): String {
        return this + x.toString()
    }
    println("これがExtensionです!!!".addShimasu(123456))

}

// クラスの書き方(Javaっぽく) 
// ちなみにデフォルトだとclassはpublic finalです。
// また、staticの概念はないです
class Car {
    // getterやsetterは記載不要です。
    // 変数名がgetter、setterとして外部と連携します。
    // 直接に値(フィールド)にアクセスするのではないので、これらは「フィールド」ではなく「プロパティ」と呼びます。
    // 要はJavaで言う所のメンバ変数をprivateで宣言してgetter, setterを用意した状態と同じで、メンバ変数名でgetter, setterが使用できるということです。
    val price: Int
    val speed: Int
    val name: String

    constructor(price: Int, speed: Int, name: String) {
        this.price = price
        this.speed = speed
        this.name = name
    }

    // 何も返さない時はvoidではなくUnit型
    fun displayInfo(): Unit {
        println("クラスのメソッド呼び出し↓")
        println("Name:" + this.name)
        println("MaxSpeed:" + this.speed)
        println("Price:" + this.price)
        return
    }

    // 複数の値を返せる関数
    fun addNumbers(a: Int, b: Int): Pair<Int, Int> {
        return Pair(a + 1, b + 1)
    }
}

// クラスのプライマリコンストラクタの書き方(Kotlinっぽい)
class Bike(name: String, maxSpeed: Int, price: Int) {
    val name = name
    val maxSpeed = maxSpeed
    val price = price
}

TOBU WIFIにPCから接続しようとするとエラーになる件

私は東武東上線ユーザかつ、よくTJライナーを使っています。
このTJライナーにはFreeWifiが整備されていてスマホなどから
無料で使用することができます。
(ただし、メールアドレスの登録かJapanWifiへの登録が必要)


今回PCから繋ごうとして問題が発生しました。
証明書エラー。(2017/06/21現在)
これは東武側が対応しないと繋げないですかねぇ。
正確には、繋がるんだけどその後証明書エラーで
Windows10のブラウザではその先に進めない。
解決したらまた投稿しますね。

2017年6月20日火曜日

過去の投稿について

ひさびさにブログを再開しようと思って書き始めたのですが
ついでに過去の投稿をさらっと見てみました。

ひどい。。。黒歴史だ、これは。

自分への戒めとして削除はしませんが相当恥ずかしいですね。

まあでも私は人生「昨日はすでに黒歴史」と思っているので
前に進んでいきましょう。

CB400SSのエキパイ清掃

ひっさびさにブログを再開しようと思います。

今回はバイクネタ。私の愛車CB400SSなんですが
最近エキパイが焼けて汚れてしまっていました。

こんな感じ。
ずいぶん焼けてますね。

そんなわけで綺麗にします。
使う道具は以下。
・ステンレス用サビ落とし(クリーナー)
・ステンレス用焼け取り(クリーナー)
・ウエス
・フクピカ

例によって儲ける気がないのでどこのメーカーの何とか
リンクとかは貼りません。

清掃方法は単純。
①フクピカで汚れや付いているゴミを軽く落とす
②サビ取り
③焼け取り
④フクピカで仕上げ

清掃の結果がこちらです。
綺麗になったんですが謎に金色っぽくなったような気がしないでもないです。

せっかく綺麗にしたのでちょっとツーリングにでもと思ったら
天気予報:雨
今回は諦めました。。