25
23

More than 5 years have passed since last update.

ShellとJavaで突然の死を招く

Last updated at Posted at 2015-06-14

TL;DR

もうやだぽ
_人人人人人人人人人人人人人人人人人_
> 彼女に技術書捨てろって言われた! <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

ちょっとだけ気が晴れました。
良いですね、突然の死。

ただ、吹き出しの中にメッセージを入力したり、吹き出しの長さ調整が非常に面倒くさかったです。
もう手がつかれた腱鞘炎になる。
心に沈殿した濁りを吐き出したいだけなのに、なぜこんなにも大変なんだ。

そうだ、私はプログラマーだった。
この仕事はプログラムにやってもらおう。

コード

簡易実現のため、入力に改行コード含まれないことにします。

shell実装

突然の死(death.sh)
#/bin/bash

msg=$1
bytes=`echo $1 | iconv -f=utf8 -t=sjis | wc --byte`
width=`echo ${bytes}/2 + 1 | bc`

for i in `seq 1 1 $width`; do
        over="${over}人";
        under="${under}^Y"
done;

echo "_${over}_" 
echo "> ${msg} <"
echo " ̄${under} ̄" 

Java実装

突然の死(Main.java)(java7実装)

    public static String suddendeath(String msg) {

        // 全角と半角文字で文字幅が異なるのでバイト数で判断
        byte[] bytes = msg.getBytes(Charset.forName("Windows-31J"));

        StringBuilder br = new StringBuilder();

        // 上段
        br.append("_人");
        for (int i = 0; i < bytes.length / 2; i++) {
            br.append("人");
        }
        br.append("_");
        br.append(System.getProperty("line.separator"));

        // メッセージ本体
        br.append("> ").append(msg).append(" <");

        // 下段
        br.append(System.getProperty("line.separator"));
        br.append(" ̄");
        for (int i = 0; i < bytes.length / 2; i++) {
            br.append("^Y");
        }
        br.append(" ̄");

        return br.toString();
    }

なんとなくStreamを使った実装も作ってみます。

突然の死(Main.java)(Java8実装)
    public static String suddendeathBy8(String msg) {

        // 全角と半角文字で文字幅が異なるのでバイト数で判断
        byte[] bytes = msg.getBytes(Charset.forName("Windows-31J"));

        StringBuilder br = new StringBuilder();

        // 上段
        br.append("_人");
        IntStream.range(0, bytes.length / 2).forEach(i -> br.append("人"));
        br.append("_\n");

        // 本文
        br.append("> ").append(msg).append(" <\n");

        // 下段
        br.append(" ̄");
        IntStream.range(0, bytes.length / 2).forEach(i -> br.append("^Y"));
        br.append(" ̄\n");

        return br.toString();
    }

動かします

shellは実行が簡単で良いですね。
引数が突然の死フォーマットで標準出力されます。

Shell実行結果

shell実行結果
% sh death.sh お前の服捨てろー!!                                                                      
_人人人人人人人人人人_
> お前の服捨てろー!!<
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

Java実行結果

Javaはすこし手間を加える必要がります。

まず、実行用のMainメソッドを作ります。
エラーハンドリングはしてません。

Main.java
public class Main {
    public static void main(String[] args) {
        String result = suddendeath(args[0]);
        System.out.println(result);
    }
}

あとはコンパイルして実行するだけですね。

java実行結果
% javac -encoding UTF-8 Main.java 
% java Main 要らない雑貨持ち込むな―!
_人人人人人人人人人人人人人人_
> 要らない雑貨持ち込むな―! <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

まとめ

  • すったもんだの末、技術書は会社に持っていくことで合意が取れました
  • 大きな言い争いにならなかったのは「突然の死」で事前にストレスが発散され、冷静な会話が出来たからだと思います
  • 私の経験から「突然の死」は男女の仲もとりもてる良いプログラムなので、みなさんもご愛顧下さい
25
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
23