EclipseでTomcat起動タイムアウトし、起動しない原因と対処方法

Tomcat起動タイムアウトエラー

EclipseでTomcatを使ったWEBアプリケーションの開発をおこなう際、いきなりTomcatが起動しなくなった場合の対処方を紹介します。
今回紹介するのは、Tomcat起動でタイムアウトが発生した場合の対処方法です。


Tomcat起動でタイムアウトした場合は、設定を変更することで事象が解消されることがほとんどです。


EclipseでのTomcat起動時に起動タイムアウトが発生すると、以下のようなメッセージが表示されます。


一概には言えませんが、紹介する2つの方法のどちらかで対処可能なことが多いです。


環境情報


  • Eclipse:Luna Service Release2(4.4.2)
  • WEBサーバ:Tomcat8.5

タイムアウト値を変更する


まずは、単純にタイムアウト値を変更する方法です。
WEBサーバに配置するアプリケーション自体が大きくなってくれるとTomcatへの展開も時間が掛かってしまい、タイムアウトが発生することがあります。


タイムアウト値の変更方法は以下になります。


まず、Eclipse上のコンソールビューでサーバタブを選択し、「ローカルホストのTomcat v8.0のサーバ」をダブルクリックし、Tomcatの設定ウィンドウをひらきます。



Tomcatの設定ウィンドウにおいて、タイムアウトに関する設定が存在するので、このタイムアウト値を変更することで、Tomcat起動時のタイムアウト値を変更することができます。



割当メモリを変更する


タイムアウト値を長めに変更してもTomcat起動時にタイムアウトの問題が発生する場合は、Tomcatに割り当てられているメモリが少ない事が原因で起動に失敗している可能性があります。
その場合は、メモリの設定を見直してみましょう。


メモリの設定方法は以下になります。
タイムアウト値の変更で使用したTomcatの設定ウィンドウで、一般情報の「起動構成を開く」を選択します。



起動構成プロパティーの編集において、引数タブを押下し、VM引数の設定ウィンドウをひらきます。



VM引数の設定ウィンドウにおいて、末尾に以下の文字列を追加します。


-Xmx1024M -Xms521M -Djava.awt.headless=true

-Xmx ヒープ全体の最大値
-Xms ヒープ全体の最小値
-Djava.awt.headles headlessモードの設定

一番最後の「-Djava.awt.headless」は、メモリの設定とはちょっと違いますが、trueにしておいた方が無難です。
特にGUI環境が無いLinuxサーバでTomcatを動かす場合、この設定がないとエラーになることがあるようです。
なので、常にtrueを設定しておいた方がいいです。


まとめ


EclipseでのTomcat起動タイムアウトは現認が解り辛いです。
しかし、紹介した2つの方法のいずれかで解決することが多いです。


Tomccat起動タイムアウトになった際の見直しポイント
  • タイムアウト値を単純に伸ばそう
  • メモリの設定を見直そう


CSSだけで画像っぽい表示をやってみる。画像は使わない!

CSS

WEBページを作成していく上で、ちょっとした画像を使用したい場合があります。
ひと昔まえであれば、本当にいちいち画像を作成する必要がありましたが、HTML5・CSS3が主流の現在においては、ちょっとした画像は準備する必要はありません。

CSSで画像っぽい表現が可能となります。


今回は、簡単な例ですが、WEBページ上で”画像っぽい”表示をおこなう方法を紹介します。


環境情報


  • ブラウザ:Chrome81

WEB画面にマークを付ける


例として、一覧画面上に、新着の内容については新着であるマークをつける場合を考えます。

よくあるパターンですよね。

恰好良いマークをつけたいのでデザイナーさんに頼んで画像をつくってもらいたいところですが、そんな必要はありません。


以下のような表示であれば、わざわざ画像を作る必要はなく、HTMLとCSSで表現できます。


::after疑似要素を使用した新着マークの表示サンプル

実際のWEBページはこちら


::after疑似要素を使ったサンプルコード


実際は、CSSの::after疑似要素を使ってマーク表示をおこなっています。
::after疑似要素は、選択した要素の最後の子要素として擬似要素を作成します。
よく content プロパティを使用して、要素に装飾的な内容を追加するために用いられます。


まずは、HTMLのサンプルです。

マークを付けたい要素に対して「newクラス」を付加します。

    <table>
        <tr>
            <th>No</th>
            <th>タイトル</th>
            <th>日時</th>
        </tr>
        <tr>
            <td class="new">1</td>
            <td>画像を使わずに画像っぽい表示をさせる①</td>
            <td>2020/06/14 11:27</td>
        </tr>
        <tr>
            <td>2</td>
            <td>画像を使わずに画像っぽい表示をさせる②</td>
            <td>2020/06/13 23:05</td>
        </tr>
        <tr>
            <td>3</td>
            <td>画像を使わずに画像っぽい表示をさせる③</td>
            <td>2020/05/03 08:11</td>
        </tr>
    </table>

次に、CSSのサンプルです。

一応、サンプルWEBページに使用しているCSSを全て紹介していますが、実際にマーク表示で使用している箇所は、「::after」属性部分のみとなります。

        body {
        }
        table, tr, th, td {
            border: solid 1px gray;
        }
        table {
            width: 800px;
        }
        table tr th:nth-child(1) {
            font-weight:bold;
            width:10%;
            background:#FFFFCC;
        }
        table tr th:nth-child(2) {
            font-weight:bold;
            width:60%;
            background:#FFFFCC;
        }
        table tr th:nth-child(3) {
            font-weight:bold;
            width:30%;
            background:#FFFFCC;
        }
        .new::after {
            content:"新";
            font-weight:bold;
            background:#FF0000;
            height:30px;
            width:30px;
            border-radius:21px;
            text-align:center;
            line-height:30px;
            display:inline-block; 
            color:#FFF;
            margin-left:20px;
        }

::after疑似要素の使い方


サンプルを例にして、::after疑似要素の使い方について図で説明します。
あまり難しいものではないです。


CSSでのマーク表示方法

「border-radius」で丸みを表現して画像っぽいスタイルを作成するところがポイントですね。


まとめ


HTMLとCSSだけで、ひとむかし前だと画像を準備する必要があったようなデザインも表現できることが解っていただけたかと思います。


まとめ
  • 指定要素の後に別要素を付加するのは::after疑似要素を使えばよい
  • ちょっとした画像っぽい表現は、HTMLとCSSで可能

それではまた。



JavaMailを使って添付ファイル付きメールの送受信をおこなう

Java

JavaMailを使ってメールの送信や受信をおこなうことができますが、添付ファイル付きメールの送信や受信もおこなうことができます。


今回は、添付ファイル付きメールの送受信について、サンプルプログラムを紹介します。
添付ファイルを付けてメールの送信をおこなうサンプルプログラムと、メールを受信して添付ファイルを保存するサンプルプログラムになります。


添付ファイルを意識していないサンプルプログラムについては、以前に作成した記事を参照ください。


環境情報


今回は、Yahooメールを使ってメールの送受信をおこなってみます。


  • Java1.8.60
  • POP3:Yahooメール
  • SMTP:Yahooメール

添付ファイル付きメールを受信する


メール受信プログラムは以下になります。
1~4が、添付ファイル保存で重要な部分になります。


import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;

import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.internet.MimeMultipart;

public class MailReceiveAtach {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        try {
            // メール受信のプロパティ設定
            Properties props = new Properties();
            props.put("mail.pop3.host", "pop.mail.yahoo.co.jp");
            props.put("mail.pop3.port", "110");

            // メール受信フォルダをオープン
            Session session = Session.getDefaultInstance(props);
            Store store = session.getStore("pop3");
            store.connect("address", "password");
            Folder folderInbox = store.getFolder("INBOX");
            folderInbox.open(Folder.READ_ONLY);

            // メッセージ一覧を取得
            Message[] arrayMessages = folderInbox.getMessages();
            for (int lc = 0; lc < arrayMessages.length; lc++) {

                // メッセージの取得
                Message message = arrayMessages[lc];

                // 件名の取得と表示
                String subject = message.getSubject();
                System.out.print("件名:" + subject + "\r\n");

                // 受信日時を表示
                String sentDate = message.getSentDate().toString();
                System.out.print("受信日時:" + sentDate + "\r\n");

                // 本文の取得と表示
                MimeMultipart mltp = 
                     (MimeMultipart)message.getContent();
                BodyPart body1 = mltp.getBodyPart(0);
                System.out.print("本文:" + 
                    body1.getContent().toString() + "\r\n");

                // 1:添付ファイルボディを取得
                BodyPart body2 = mltp.getBodyPart(1);
                String fileName = body2.getFileName();
                System.out.print(
                    "添付ファイル名:" + fileName + "\r\n");

                // 2:添付ファイルのストリームを取得
                InputStream ins = body2.getInputStream();

                // 3:出力ストリームに出力しながらファイルを保存する
                OutputStream outs = 
                    new FileOutputStream("save.txt"); 
                int out;
                while ((out = ins.read()) != -1) {
                    outs.write(out);
                }

                // 4:ストリームをクローズ
                ins.close();
                outs.close();

                // 取得の最大件数は10件
                if (lc &amp;amp;gt;= 10) {
                    break;
                }
                System.out.print("\r\n");
            }
        } catch (Exception e) {
            System.out.print("例外が発生!")
            e.printStackTrace();
        } finally {
        }
        System.out.print("end: main\r\n");
    }
}

「1」で、添付ファイルが保存されているボディパートを取得します。
本サンプルプログラムは決め打ちで「1」と記載しています。

本来であれば、ボディパートの数だけループして、添付ファイルが格納されているボディパートについてのみ、「2」以降の添付ファイル保存処理をおこなうべきです。
添付ファイルが複数存在する場合はこのボディパートが複数存在することになるので、ループで回す必要があるということですね。


「2」で、添付ファイルのインプットストリームを取得して、ファイル保存の準備をおこないます。


「3」で、アウトプットストリームを使用して添付ファイルの保存をおこないます。
添付ファイルのファイル名は「save.txt」です。


「4」でストリームをクローズして終了、です。


添付ファイル付きメールを送信する


メール送信プログラムは以下になります。
添付ファイルを2つ添付しているサンプルプログラムになります。


import java.util.Properties;

import javax.mail.Address;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Transport;
import javax.mail.Multipart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.activation.FileDataSource;
import javax.activation.DataHandler;

public class MailSendMlt {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        try {
            // メール送信のプロパティ設定
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.mail.yahoo.co.jp");
            props.put("mail.smtp.port", "587");
            props.put("mail.smtp.auth", "true");
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.ssl.trust", "*");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.connectiontimeout", "10000");
            props.put("mail.smtp.timeout", "10000");

            // セッションを作成する
            Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication 
                        getPasswordAuthentication() {
                        return new PasswordAuthentication(
                            "fromAddress", "password");
                    }
                });

            // メールの送信先はYahooメール。送信元もYahooメール
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(
                "fromAddress", "fromAddress"));
            message.setReplyTo(
                new Address[]{new InternetAddress("toAddress")});
            message.setRecipients(
                Message.RecipientType.TO, 
                InternetAddress.parse("toAddress"));
            message.setSubject("テスト");

            // メッセージ本文
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText("テストメール。");

            // 1:添付ファイル1を添付するボディパートを取得
            MimeBodyPart attachedFilePart1 = new MimeBodyPart();

            // 2:添付ファイル1のデータソースを取得
            FileDataSource fs1 = new FileDataSource("attach1.txt");

            // 3:ボディパート1に添付ファイル1を添付
            attachedFilePart1.setDataHandler(new DataHandler(fs1));
            attachedFilePart1.setFileName(
                MimeUtility.encodeWord(fs1.getName()));

            // 4:添付ファイル2を添付するボディパートを取得
            MimeBodyPart attachedFilePart2 = new MimeBodyPart();

            // 5:添付ファイル2のデータソースを取得
            FileDataSource fs2 = new FileDataSource("attach2.txt");

            // 6:ボディパート2に添付ファイル2を添付
            attachedFilePart2.setDataHandler(new DataHandler(fs2));
            attachedFilePart2.setFileName(
                MimeUtility.encodeWord(fs2.getName()));

            // 7:メールに、本文・添付1・添付2の3つを添付
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);
            multipart.addBodyPart(attachedFilePart1);
            multipart.addBodyPart(attachedFilePart2);
            message.setHeader(
                "Content-Transfer-Encoding", "base64");

            // 8:メールを送信する
            message.setContent(multipart);
            Transport.send(message);

        } catch (Exception e) {
            System.out.print("例外が発生!\r\n");
            e.printStackTrace();
        } finally {
        }
        System.out.print("end: main\r\n");
    }
}

「1」~「3」が添付ファイル1の作成処理になります。


「1」で、添付ファイルのボディパートを作成します。


「2」で、添付するファイルのデータソースを作成します。


「3」で、添付ファイルを添付します。


「4」~「6」も「1」~「3」と同じで、添付ファイル2を添付します。


「7」で、本文・添付1・添付2をメッセージ本文に添付してメール自体は完成します。


最後に「8」でメールを送信します。


まとめ


紹介したサンプルプログラムで、添付ファイルのメール送受信が可能です。
参考にしてください。




IT業界に就職・転職したい人向け!IT業界の内情を現役エンジニアが解説

IT業界

就職活動を始めた学生さんや、転職を考えている社会人の人で、『IT業界に就職したい!』と考えている人は多いと思います。


筆者は実際にIT業界に身を置き、そういった新社会人や新IT業界人を向かい入れる側なのですが、よく、”僕が思っていた仕事内容とは違いました。。。”とおっしゃる人がいます。


なぜそういった事が起きるのかと考えた時に、やはり、正しくIT業界の現状を理解・把握できていないことが原因なのだと思います。


今回は、IT業界に身を置く筆者が、IT業界の現状と様々な職種について説明していきます
これからIT業界に飛び込もうとしている人達の助けになればと思います。


ちょっとネガティブな事も書きますが、基本的には”IT業界って楽しいよ!”っていう内容になっているので、楽しく読んでください。


IT業界と建設業界


IT業界の現状を説明する前に、IT業界を建設業界と比較してみます。
よく、IT業界と建設業界は似ている、と言われています。
これは、100%同意はできない部分もありますが、基本的には合っています。


IT土方多重請負の業界構造工数商売、単語はきいた事がある人もいると思いますが、様々な観点で似ています。


絵で表現してみました。
例として、1億の仕事をお客様が発注した場合、で表現してみました。


IT業界と建設業界

億を超えるような大きな仕事の場合、そのほとんどは大手メーカが受注し、(いわゆる)下請けに発注します。
それを末端にまで発注しようとした場合、当然ですが、受注した額よりも少ない額で下請けに発注します。
そのため、下になればなるほど受注額は少なくなってきます。


こういった構造は建設業界でも同じです。
下請けになればなるほど、受注額が減ってしまうのですね。


これが、IT業界が多重請負構造と言われる所以です。


ちょっと理不尽に感じる人もいるかもしれませんが、現在のIT業界はこれが現状でして、この構造はまだ続いていくでしょう。
まずは、こういった業界構造であることを理解しておくことが大事です。


本記事ではわかりやすく「下請け」と表現しましたが、IT業界では「下請け」という言葉はほとんど使わないです。
やっぱり、響きがあまり良くないですからね。
協力会社、BP(BusinessPartner)といった言い方をします。


じゃあ、具体的には自分はどこに入りたいのか?具体的にどの会社がどの位置にいるのか?を説明していきます。


皆が知っている大手メーカー/一次受け


一次受けとなるような会社は、皆さんが名前は一度も聞いたことのあるような会社になります。
建設業界でいうところの、大林組・鹿島建設・清水建設ですかね。


IT業界での代表的な会社としては以下のような会社です。


  • NTTデータ
  • 富士通
  • NEC
  • 日立

やはり、こういった会社は強いです。
例えば、国の仕事を受注しようとした場合、様々な企業資格で必要だったりするのですが、こういった会社はほぼ全ての資格を持っています。
また、これも国の仕事を例にすれば、こういった会社はたいがい国からの天下りを受けていたりするので、大きな仕事になると優先的に仕事が受注できたりします。


ちょっと幻滅してしまいましたか?
しかし、筆者は、やはり大手は大手の理由があると思っています。


大きな仕事になればなるほど、様々なスキルが必要になります。
プログラムしていく能力だけではなく、ハードウェアを購入して構築していくスキル、関係各位と理解関係を調整しながら物事を調整していくスキル、また、仮にトラブルが起きた時に数億の損失をカバーしきれる資金力、
こういった事は、大手の会社しかできません。


その代わり、自分のやりたい事はやれないかもしれないですね。
例えば、プログラミングやインフラ基盤構築を専門とするプロフェッショナルになろうとした場合、なれない確率が高いです。
組織全体のバランスが優先される部分があるので、個人の希望は通りにくいと考えたほうがよいです。


あと、結局はお客様とのフロントに立つ会社になるので、クレーム等は日常茶飯事だと思っていいです。
毎日、お客さんとか上司から怒られて仕事をしていく、くらいの仕事になります。


こういう人は向いている
  • とにかく大きな仕事がしたい人
  • 自分が本当にやりたい仕事じゃなくてもいいけど安定したお給料は欲しい、という人
  • 所属会社のブランドが欲しい人

こういう人は向いていない
  • 職人(プログラマ、など)になりたい人
  • 組織の歯車、的な立ち位置が嫌な人
  • メンタルが弱い人

中堅ITベンダー/二次受け


一次受けとなるメーカーが大型の開発案件を受注したとしても、大手メーカー単独で全てのシステム開発をおこなうことはありません。
大規模なシステム開発になると、タイミングによっては数百人の規模になります。
大手メーカーになると、そういった規模の開発案件が何百も同時進行しているので、それを自社の社員だけでまかなうことはできないのです。


建設業界でも同じでしょう。

中堅の建設会社であっても、全ての業務ができるように大工さんや基礎職人、とび職の人を正社員として囲い込んでいることはありません。


そうなると、大手メーカーは二次受けする会社をみつけて仕事を発注することになります。


こういった、二次受けが可能な会社は実は限られています。
あまりメジャーではない会社がほとんどなので、名前をきいてもピンとこないと思いますが、条件としては以下のような会社です。


  • 従業員が300名以上

従業員の数というのは、実は重要な要因です。
メーカーからしたら、安心して仕事を発注したい訳なので、ある程度規模がある”仕事をやりきってくれる会社”を好みます。
この目安が従業員の数になります。
数億の仕事を、従業員10名の会社の社長が”うちはできます!やります!”と言っても誰も信じないのです。
実際には小さい会社はそんな大きな仕事はやりたがらないですね。
もしシステムトラブルが起きたときに、責任をとれないということがわかっているのです。


300名というのは筆者の主観が入っていますが、実は300名を超えるシステム開発会社というのは少ないのです。
500名以上ともなると、大手といってもいいかもしれません。


実際の開発業務では、この中堅ITベンダーの人が主力になります。
メーカーの人がとりまとめ役としてプロジェクトを仕切ることにはなるのですが、実際の現場の力が問われるのは、この中堅ITベンダーの人達です。
場合によっては、お客様との交渉にもメーカーの人間と同行して実施することもあります。


当然、この中堅ITベンダーにもエンジニアはいるのですが、メーカーと同じように全ての開発要員を自社要員だけでまかなうことはできるのはまれです。
なので、この後説明する三次受け・四次受けと協力してシステム開発をおこなっていくわけですが、三次受け・四次受けの会社はあくまで”人出し”です。


多くの開発メンバを管理して業務を遂行していくスキルが必要になってくるのは、この中堅ITベンダーの技術者になります。


開発チーム

メーカー側にも技術者は存在するので、常にこういった開発チームの体制になる訳ではないのですが、このパターンが最も多いように思います。


筆者としては、IT業界で本当の実力をつけていくのには、この規模の開発会社で現場の経験を積んでいくことが一番よいと思っています。
プログラミングもできるし、ある程度の個人の意見も尊重されます。


こういう人は向いている
  • 開発現場の達人になりたい人
  • 職人(プログラマ、など)になりたい人

こういう人は向いていない
  • 所属会社のブランドが欲しい人
  • メンバの面倒をみるような立場がきらいな人

小さいIT会社や個人事業主/三次受け・四次受け


小さいIT会社の規準は、難しいですが以下の規準でよいと思います。


  • 従業員が100名未満

従業員が300名~100名の間は、中堅から小さいIT会社のグレーゾーンですが、100名未満であれば小規模と考えていいです。
こういった会社は、そのほとんどが”人だし”の商売をやっています。


三次受け・四次受けと書きましたが、実は受けてもいないのです。
仕事を受けるというよりも、二次受けの会社に人を貸し出すことで、月あたり何十万かの対価を得ます。
この対価で売り上げを上げている訳です。


こういった会社が良いのは、とにかくアットホームなところです。(会社にもよるかもしれませんが)社員全員の顔と名前が一致するくらいなので、皆の基本的には仲良く仕事ができます。


しかし、基本的に”人だし”をメインとしているので、自社に社員はほとんどいない、といった状態になります。
皆が、お客様先に常駐しているので当然ですよね。
なので、帰属意識も芽生えにくく、離職率はすごく高くなってしまいます。
会社によってはいろいろ工夫をしており、チーム単位でお客様先に常駐をさせたりなど、会社としての体制を保とうとしていますが、なかなか厳しいですね。


また、プログラミングなどの実績経験はつきますが、プロジェクトマネージャーといったメンバをまとめ役周りをすることはほとんどないと思った方がいいです。
あくまで一人のメンバ、としてやっていくことになります。


こういう人は向いている
  • そもそも会社という組織に期待していない人
  • 職人(プログラマ、など)という立場だけでよく、人をたばねる立場にはなりたくない人

こういう人は向いていない
  • 所属会社のブランドが欲しい人
  • メンバの面倒をみるような立場に立ちたい人

インターネットサービス会社


インターネットサービス会社は、IT業界の多重請負構造とは無関係の位置にいると思ってよいです。

インターネットサービス会社とは、自分でインターネットサービスや製品を展開することで売り上げと利益を上げている会社になります。


インターネットサービス会社での代表的な会社としては以下のような会社です。


  • Yahoo
  • DNA
  • Excite

こういった会社は、何かしらお客さんからシステム開発の受注を受けて開発をおこなうといった事は、ほぼありません。
自分でシステムを作って、自分の会社のブランドで売り上げと利益を上げている事になります。


筆者も、一時的にこういった会社に所属していることがあるのですが、インターネットサービス会社とそれ以外のIT会社は別世界と思った方がよいですね。
インターネットサービス会社でのシステム開発は、とにかくスピードです。
設計工程や試験工程といった本来はシステム構築に必要な工程を多少は省いても、1日でも早くサービスをリリースすることを最優先としています。


こういう人は向いている
  • とにかくプログラムがしたい人
  • 華やかな世界にあこがれている人

こういう人は向いていない
  • 大型のシステム開発がやりたい人
  • プログラミング能力以外の設計力や試験力を付けたい人

どんな職種があるのか


一言でIT業界といっても、どういった規模の会社があり、どういった特徴があるかを説明しましたが、次にどんな職種があるのか?を説明していきます。


かつ、この職種だったらこういった会社が良い!というのも説明していきます。かつ、この職種だったらこういった会社が良い!というのも説明していきます。


  • ◎:ばっちりハマるポジションがある(おすすめ)
  • 〇:あるけど先行き不安
  • △:ちょっと厳しい
  • ×:やめた方がいい

プログラマー



いわゆる、実際にプログラミングしてシステムを作っていく人です。
一番イメージしやすい職種かと思います。


しかし、あえてプログラマーと書かせてもらいましたが、実際にプログラミングだけをやっている訳ではないです。
機能レベルでの設計書も作成する必要もありますし、試験仕様書を作って試験の実施もおこないます。


プロジェクトを取りまとめる立場のプロジェクトマネージャーも、ほぼ全てがプログラマー出身です。
なので、ある程度経験をつんだプログラマーはプログラマーとしてだけで仕事をしていくのは難しく、メンバをとりまとめる立場のプロジェクトマネージャーになっていくことを会社からは期待されます。


この、プログラマーとは実際はプログラミングだけしている訳ではない、という点が、IT業界に就職する学生さんはイメージできていない部分でもあります。
作業の比率としては、プログラマーとしての作業期間のうち、プログラミングをしている期間は30%~40%ほどです。
他の期間は、設計書を書いたり試験をやったりしています。


メーカー
中堅ITベンダー
小さいIT会社
インターネットサービス会社

システムエンジニア



プログラマーとシステムエンジニアは職種が違います。
プログラマーはプログラミングを主戦場としますが、システムエンジニアはもっと幅広く対応するスキルが必要となります。


システム全体を設計するスキルや、プロジェクトの進捗を管理するスキル、お客様と仕様整合をする調整スキル、といったシステム開発全般のスキルが必要です。
そのほとんどの人はプログラマー出身の人が多いですが、プログラミングのスキルが無い人がシステムエンジニアになった場合は、本人・その周りの人、全てが不幸になる傾向があります。


スキルがない人が重大な調整毎を行おうとするので、当然、本人も相当のストレスが掛かりますし、その人に振り回される周りの人も不幸になります。


なので、いきなりシステムエンジニアになる事はお勧めしません。
ある程度、システムの仕組み等を把握した上でシステムエンジニアになることをおすすめします。


メーカー
中堅ITベンダー
小さいIT会社 ×
インターネットサービス会社 ×

デザイナー



ここでのデザイナーとは、いわゆる、WEB画面のレイアウトやスマートフォン画面のレイアウトを作成するデザイナーの事です。
※システムのデザイン(設計)を設計する人ではありません。


筆者の個人的な見解なのですが、プログラマーやシステムエンジニアの人が、ちょっと腰かけでデザイナーをすることはできないと思っています。
デザイナーの人は、デザイナーになるための教育を受け、デザイナーとしての経験を積んでいかないと、しっかりとしたデザインのスキルは身に付かないですね。


デザイナーを専門で雇っているのは大手メーカーとインターネットサービス会社くらいのものです。
中堅ITベンダや小さいIT会社では、デザイナーとして職種は募集はしていないでしょう。


デザイナーはインターネットサービス会社の方が需要があります。
ほぼ全てのインターネットサービス会社が、自前でデザイナーを抱えています。


メーカー
中堅ITベンダー
小さいIT会社 ×
インターネットサービス会社

営業



当然、IT業界のあらゆる会社にも営業という職種があります。
しかし、IT業界の営業は、学生さんがイメージする営業とはちょっと違ってきます。



営業といえば、足を使ってお客様先に製品を売り込みに行って、といった業務をイメージするかもしれないですが、IT業界の営業はちょっと変わってきます。
システムの受発注に関するお客様との金額整合、何かしらクレームがあった時に最前線で対応、営業書類の作成、といった作業がメインとなります。


ある程度システムを理解しておく必要があるところもポイントになります。
さすがにプログラミングの知識までは必要ないですが、システムの知識もある程度もったうえで、営業的な観点でお客様と折衝していくことが必要ですね。


プロジェクトが正常に進んでいる時はいいですが、ちょっとプロジェクトがよれてくるとしんどい立場になります。
いろいろ風当りが強くなってきますからね。


メーカー
中堅ITベンダー
小さいIT会社
インターネットサービス会社

インフラエンジニア、ネットワークエンジニア



インフラエンジニアとは、OSやミドルウェアのインストールと設定、チューニングなどを専門とするエンジニアになります。
インフラエンジニアは、プログラミングとは別のスキルが必要になります。
OSやミドルウェアの設定の他に、システムを稼働していく上での監視の設定、など、様々なスキルが必要です。


ネットワークエンジニアも同じです。
ファイアウォール、DNS、ネットワーク通信プロトコル、どれも専門の知識が必要です。


ここ最近は、需要に比べてエンジニアの数が絶対的に足りないといわれています。
必須のスキルが必要な分野でもあるので、ねらい目の職種かもしれません。


インフラエンジニアやネットワークエンジニアは、メーカーでは専門部隊があります。
中堅ITベンダーや小さいIT会社では専門部隊をもっている事は少ないです。
必要であれば専門のスキルをもっている人を募集してプロジェクトを進めることが多いです。


メーカー
中堅ITベンダー
小さいIT会社
インターネットサービス会社

IT業界に入ろうと思っている人へのアドバイス


最後に、筆者からIT業界に飛び込もうとしている人達へのアドバイスをまとめます。


ITベンダとインターネットサービス会社の違いは意識しよう


システム開発をおこなう会社を大きく2つにわけるとした場合、ITベンダとインターネットサービス会社に分類することができると考えています。
ITベンダとは、多重請負のピラミッド構造に組み込まれているIT会社です。
インターネットサービス会社は、Yahooに代表されるような自分でサービスや製品を展開して会社です。


個人の力量にもよりますが、ITベンダのエンジニアはインターネットサービス会社のエンジニアに転職しても十分にやっていけると思いますが、
その逆は厳しいと思っています。
イメージとしては、ITベンダのやっていた事を10とした場合、そのうちの6をインターネットサービス会社のエンジニアはやっている、と思っています。


筆者の見解としては。。。


スキル ITベンダ

インターネットサービス会社

プログラミングスキル 超必要 超必要
テストスキル 超必要 必要
品質管理スキル 超必要 必要
プロジェクト管理スキル 超必要 必要
大型PJの運用スキル 必要 必要

こういった感じです。


インタネットサービス会社は華やかなイメージがあるので飛び込みたい気持ちもあると思いますが、いったんはITベンダで力を付けたうえでインターネットサービス会社に転職することをお勧めします。


大きい会社は給料がいい、とは限らないよ


最初に説明しましたが、多重請負構造ではメーカー、一次受けとなるITベンダが一番多く売り上げが上がる事になります。
しかし、だからといってその会社で働く個人の給料にそのまま反映されるとは限らないです。


下手をしたら、3次受け・4次受けの会社に所属している会社の社員の方がメーカーで働く社員よりも給料がよい場合があります。


なぜこういうことが起こるのかというと、メーカー等は間接部門の人が多いので、その分、売り上げを分配する対象の人が多いのです。
そうなってくると、どうしても個人に入ってくるお金を少なくなってしまいます。


小さい会社になればなるほど、そういった間接部門の人間を少なくなってくるので、個人に入っているお金が多くなっているという事になります。


でもまあ、大手の方が給料がよいという傾向はありますけどね。


プログラマー=プログラミングだけする人、じゃないよ


各業種の説明でも書きましたが、プログラマーはプログラミングだけをやる訳ではないです。
プログラミングだけではなく、機能的な設計や試験設計、および、試験の実施が必要になります。


実はこれがよくわかっていない人が多いです。


むしろ新入社員であれば最初の1年くらいは試験がメインでしょう。
先輩が作った試験仕様書を使って試験をやる時期が続いて、見込みのある人間からプログラミングをやらせてもらえる、といった感じです。
で、経験を積んでいくと上流工程(基本設計、機能設計)を任せてもらうようになってきます。


まとめ


IT業界と一言でいっても、いろいろな業種や会社があります。
学生さんがそういった違いを見極めたうえで自分のやりたい事を決めていくのは大変な事かもしれないですが、自分でよく考えて就職活動をしましょう。


まとめ
  • 入る会社でやれる事が違ってくるので、よく考えて決めようね。
  • 大きい会社の方がいい、ってわけじゃないよ。
  • プログラミングだけやっていればいい、なんて思わない方がいいよ。

それではまた!



POIで罫線を書く。Javaサンプルプログラムと、全ての罫線出力

ApachePOI

JavaでExcelの加工や出力をおこなう時は、Apache POIが便利です。
Apache POIは、セルへの文字列出力や塗り潰し色の設定が可能ですが、罫線の設定も可能です。


今回は、Apache POIで可能な罫線出力を、サンプルプログラムと同時に出力結果をふまえて紹介していきます。


セルの塗り潰し色設定方法については、以前の記事を参考にしてください。



環境情報


  • OS:Windows10
  • Java:Java1.8.0_60
  • Apache POI:poi 4.1.0

罫線を設定するサンプルプログラム


サンプルプログラムは以下になります。
ApachePOIで設定可能な全ての罫線を設定して出力しています。


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class PoiLine {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        Workbook tempbook = null;
        try {
            //--- テンプレートファイルをひらいて、シートを指定 --//
            Path tempPath = Paths.get("./template.xlsx");
            InputStream inSt = Files.newInputStream(tempPath);
            tempbook = new XSSFWorkbook(inSt);
            Sheet sheet = tempbook.getSheet("Sheet1");

            //--- B2セル 罫線なし ---//
            Row row = sheet.createRow(1);
            Cell cell = row.createCell(1);
            cell.setCellValue("罫線なし");
            CellStyle style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.NONE);
            cell.setCellStyle(style);

            //--- B4セル 長点線 ---//
            row = sheet.createRow(3);
            cell = row.createCell(1);
            cell.setCellValue("長点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DASH_DOT);
            cell.setCellStyle(style);

            //--- B6セル 長点点線 ---//
            row = sheet.createRow(5);
            cell = row.createCell(1);
            cell.setCellValue("長点点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DASH_DOT_DOT);
            cell.setCellStyle(style);

            //--- B8セル 破線 ---//
            row = sheet.createRow(7);
            cell = row.createCell(1);
            cell.setCellValue("破線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DASHED);
            cell.setCellStyle(style);

            //--- B10セル 点線 ---//
            row = sheet.createRow(9);
            cell = row.createCell(1);
            cell.setCellValue("点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DOTTED);
            cell.setCellStyle(style);

            //--- B12セル 二重線 ---//
            row = sheet.createRow(11);
            cell = row.createCell(1);
            cell.setCellValue("二重線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.DOUBLE);
            cell.setCellStyle(style);

            //--- B14セル 中太線 ---//
            row = sheet.createRow(13);
            cell = row.createCell(1);
            cell.setCellValue("中太線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.MEDIUM);
            cell.setCellStyle(style);

            //--- B16セル 長点線(中太線) ---//
            row = sheet.createRow(15);
            cell = row.createCell(1);
            cell.setCellValue("長点線(中太線)");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.MEDIUM_DASH_DOT);
            cell.setCellStyle(style);

            //--- B18セル 長点点線(中太線) ---//
            row = sheet.createRow(17);
            cell = row.createCell(1);
            cell.setCellValue("長点点線(中太線)");
            style = tempbook.createCellStyle();
            style = setBorder(
                style, BorderStyle.MEDIUM_DASH_DOT_DOT);
            cell.setCellStyle(style);

            //--- B20セル 破線(中太線) ---//
            row = sheet.createRow(19);
            cell = row.createCell(1);
            cell.setCellValue("破線(中太線)");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.MEDIUM_DASHED);
            cell.setCellStyle(style);

            //--- B22セル 斜長点線 ---//
            row = sheet.createRow(21);
            cell = row.createCell(1);
            cell.setCellValue("斜長点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.SLANTED_DASH_DOT);
            cell.setCellStyle(style);

            //--- B24セル 太線 ---//
            row = sheet.createRow(23);
            cell = row.createCell(1);
            cell.setCellValue("太線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.THICK);
            cell.setCellStyle(style);

            //--- B26セル 細線 ---//
            row = sheet.createRow(25);
            cell = row.createCell(1);
            cell.setCellValue("細線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.THIN);
            cell.setCellStyle(style);

            //--- B28セル 細点線 ---//
            row = sheet.createRow(27);
            cell = row.createCell(1);
            cell.setCellValue("細点線");
            style = tempbook.createCellStyle();
            style = setBorder(style, BorderStyle.HAIR);
            cell.setCellStyle(style);

            //--- out.xlsxとしてファイル出力 --//
            Path outPath = Paths.get("./out.xlsx");
            OutputStream outSt = Files.newOutputStream(outPath);
            tempbook.write(outSt);
        } catch (IOException e) {
            System.out.print("入出力例外が発生!");
        } finally {
            //--- テンプレートをクローズ --//
            try {
                if (tempbook != null) {
                    tempbook.close();
                }
            } catch (IOException e) {
                System.out.print("終了処理で入出力例外が発生!");
            }
        }
        System.out.print("end: main\r\n");
    }

    // 
    // 罫線を設定する
    // 
    public static CellStyle setBorder(
        CellStyle cellStyle, BorderStyle kind) {
        cellStyle.setBorderLeft(kind);
        cellStyle.setBorderRight(kind);
        cellStyle.setBorderTop(kind); 
        cellStyle.setBorderBottom(kind); 
        return cellStyle;
    }
}

実際に罫線を設定している処理は、「setBorder」メソッドになります。
罫線は上下左右を別々にしか設定できないため、上下左右全ての罫線を指定された罫線種別に変更するメソッドを自作しています。


setBorderLeft() セル左の罫線を設定
setBorderRight() セル右の罫線を設定
setBorderTop() セル上の罫線を設定
setBorderBottom() セル下の罫線を設定

罫線の種類


ApachePOIでは、エクセルで設定可能な罫線を全て指定可能になります。
罫線の種類はBorderStyleクラスに定義されており、サンプルプログラムで全ての罫線設定を試しています。


NONE 罫線なし
DASH_DOT 長点線
DASH_DOT_DOT 長点点線
DASHED 破線
DOTTED 点線
DOUBLE 二重線
MEDIUM 中太線
MEDIUM_DASH_DOT 長点線(中太線)
MEDIUM_DASH_DOT_DOT 長点点線(中太線)
MEDIUM_DASHED 破線(中太線)
SLANTED_DASH_DOT 斜長点線
THICK 太線
THIN 細線
HAIR 細点線

実際にサンプルプログラムを出力した結果は以下になります。
全ての罫線が出力できています。



まとめ


ApachePOIを使用すれば、簡単にエクセル操作ができます。
今回紹介した罫線の設定も可能ですが、色の設定も可能となります。


まとめ
  • Javaでエクセルを操作するためには、Apache POIをつかうべき!
  • Apache POIを使えば、エクセルへの文字列出力だけではなく、罫線設定も簡単におこなうことができる