2019年8月29日木曜日

MacでJavaのバージョンを切り替える

概要

私は開発の都合でいくつかのバージョンのJavaをMacにインストールしています。時々によってバージョンを切り替えながら作業をしているので、切り替える方法のメモを残しておこうと思います。

手順

  1. .bashrc の作成
    .bashrc に JAVA_HOME と PATH を書き込んで保存します。
    vi ~/.bashrc
    
    .bashrcには下記のように書き込みます。下記の場合、 1.8 となっている箇所がJavaのバージョンです。切り替える時はこの部分を 1.7 や 11 といったように書き換えます。
    export JAVA_HOME=`/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v "1.8"`
    PATH=$JAVA_HOME/bin:$PATH
    
  2. .bashrc の読み込み
    .bashrc はシェルの起動時に1度だけ読み込まれるファイルです。そのため .bashrc を書き換えただけでは変更が bash に反映されません。下記コマンドで読み込む必要があります。
    source ~/.bashrc

2019年8月28日水曜日

CircleCI 2.0 を使っているのに 2.0 にアップグレードするように Service Alert が表示される

困ったこと

CircleCIを利用しており、設定直後は正常に利用することが出来ていました。ところが、特に設定を変更したりしていないのですが、アラートが表示されるようになりました。
Service alert: Your project references CircleCI 1.0 or it has no configuration. CircleCI 1.0 and projects without configuration files are no longer supported. You must update your project to use CircleCI 2.0 configuration to continue. Learn more.
アラートの内容を読むと利用しているバージョンが1.0であること、またはコンフィグファイル(.circleci/config.yml)が存在していないことが原因のようです。
CircleCIの公式サイトを見ると下記のような記述を見つけました。
The CircleCI 1.0 cloud infrastructure is no longer available as of March 15, 2019.
2019年3月15日をもってCircleCI 1.0は利用できなくなるという記述です。しかし、CircleCIを導入したのは2019年の8月に入ってからです。これまでアラートが表示されずに利用できていたので、2.0を利用していたと考えられます。
また、 .circleci/config.yml は存在していました。

調べたこと

.circleci/config.yml が存在しているため、ここに記述した内容に誤りがあるのではないかと思いました。
英語で書かれているので若干自信はありませんが、 .circleci/config.yml に誤りはないようでした。

解決

同じ問題が発生していた方がいたようで、解決することが出来ました。
上記リンク先の中程に以下のような記述があります。
This banner should go away once the 1.0 jobs fall off the jobs list. If it’s still showing please open a ticket so we can take a look.
ジョブリストに 1.0 のものが含まれているとアラートが表示されるようになっているようです。
過去のジョブは不要なので、いま開発中のプロジェクトだけ指定してジョブリストを表示させたらアラートが消えました。管理画面のJOBSにプロジェクト名が一覧表示されています。対象のプロジェクト名をクリックすることでプロジェクトの指定が出来ました。

2019年8月27日火曜日

MariaDBが突然起動できなくなったときにやったこと

概要

MacのMariaDBが突然起動出来なくなりました。MariaDBの設定を変更したりしていなかったため、起動出来なくなった原因は不明です。以下のようなエラーメッセージが表示されていました。
Can't read dir of '/usr/local/etc/my.cnf.d' (Errcode: 20 "Not a directory")

対処方法

エラーメッセージで指定されているディレクトリを作成したら起動するようになりました。
cd /usr/local/etc
mkdir my.cnf.d

原因

調べたのですがよく分かりませんでした。

その他

原因調査中にMariaDBをUpgradeするという方法で解決していた方を見かけたので試してみました。
brew upgrade mariadb
残念ながら私の環境では下記のようなメッセージが表示されてしまい、解決することが出来ませんでした。
Error: mariadb 10.4.6 already installed
インストールされているMariaDBとUpgrade先のMariaDBのバージョンが同じだと、この方法では解決できないようです。

2019年2月11日月曜日

javascript : filterを使って配列からユニークな要素を取り出す

filterを使うと条件に合致した要素を配列から取り出すことができる。

var filtered = [10, 5, 6, 9, 12].filter(element => element >= 10);

上のコードだと、[10, 12]が取得できる。

これを応用して配列からユニークな要素を取り出す。

var array = [1, 2, 3, 2, 1, 5];
var filtered = array.filter(a => array.filter(b => b === a).length === 1);

これで filtered に array の中からユニークな要素を抽出することができる。一つ一つ要素を調べていく方法でも同じ結果が得られるけれど、このほうがスッキリしていていいと思う。

2018年11月1日木曜日

VSCodeでJavaのWebアプリ開発

Tomcat for Java を使ってVSCode簡単なWebアプリを開発してみる。

GradleとTomcatがインストールされていることが前提となるので、インストールされていないようならインストールしておいてほしい。

Gradle : https://gradle.org/
Tomcat : https://tomcat.apache.org/download-90.cgi

何はともあれ、Tomcat for Javaをインストールする。


指示はでないのだけれど、一度VSCodeを再起動したほうがいい。私の環境では、ちゃんと動いてくれなかったのだ。

ソースの構成は下記の通り。

-+-src
|  +-main
|  |  +-java
|  |     +-com
|  |        +-hello
|  |           +-HelloController.java
|  +-webapp
|     +-hello.jsp
+-build.gradle

まずはgradleから作成する。

■build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'war'

sourceSets {
    main {
        java {
            srcDir 'src'
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.0.1'
}

gradleを書き終えたらbuild.gradleのあるディレクトリでコマンドを実行。

gradle eclipse

.classpathや.projectといったファイルが作成される。eclipseを使うわけではないので必要ないと思うのだけれど、これをやらないと何故かコンパイルができなかったり、インテリセンスが動作しなかったりと上手くいかなかった。誰か原因を知っていたら教えてほしい。

src/main/java/com/hello/HelloController.javaを作成する。HelloController.javaを開くとVSCodeがなにやらしはじめる。

こんなメッセージが表示されるはずだ。


100%になると消えるのでそれまで待ったほうがよさそうな感じがする。数秒程度なので、これが終わったらHelloController.javaのコードを書いていく。

■HelloController.java
package com.hello;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.net.httpserver.HttpServer;

@WebServlet("/")
public class HelloController extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        getServletContext().getRequestDispatcher("/hello.jsp").include(request, response);
    }
}

次はsrc/main/webapp/hello.jsp。

■hello.jsp
<html>
    <head>
        <title>Hello World</title>
    </head>
    <body>
        <h1>Hello World</h1>
    </body>
</html>

ここまで出来たら、Gradleでビルドを実行する。

gradle build

ビルドが成功すると/build/libディレクトリにwarが出来上がる。


出来上がったwarを右クリックしてメニューを表示させ、Debug on Tomcat Serverを選択。


Tomcat Serverを選択するダイアログが表示されるので、+Add New Serverを選択し、Tomcatのインストールディレクトリを指定する。


このような表示が output ビューに表示されたら、Tomcatの起動に成功。

情報: Server startup in 1279 ms


ブラウザでアクセスするときちんと表示されることが分かる。
http://localhost:8080/TomcatForJavaDemo/


これでTomcat上でJavaのWebアプリを動作させることができた。

やってみて思ったのだが、やはりEclipseなどのIDEのほうが便利だということだ。あまり考えなくて済む。私のやり方が悪いのかVSCodeだと、インテリセンスがうまく動いてくれないことがあった。またデバッガが少し不安定のような気がしている。

下記のように20行目にブレイクポイントを置いてみて実際にデバッグしてみる。


すると、ぜんぜん関係ないところで止まってしまう。


本来止まって欲しい、ブレイクポイントを置いたところではどうやっても止まってくれない。今回、この問題を解消することができなかった。何かやり方に問題でもあるのだろうか。

VSCode自体は動作が軽くていいので、出来ればJavaの開発でも使いたい。しかし、デバッガがちゃんと動作させられないと、複雑なプログラムを作るのは難しい。どうしたものだろうか。

2018年10月23日火曜日

VSCodeでJava環境構築

Visual Studio CodeでJavaの開発環境構築をやってみる。

まず、拡張機能ビューを開く。Ctrl + Shift + Xでビューが開くので「Java Extension Pack」をインストールする。



単純なソースを書いて保存。右下の言語モードの選択でJavaを選択すると、Javaのハイライトが行われるようになる。デフォルトだとこの欄はPlain Textとなっている。



F5で実行。はじめてF5を押した時はlaunch.jsonというファイルが作成されるだけなので、2回押す必要がある。



デバッグコンソールにHello World!と表示されたことが確認できた。

行番号の左横をクリックすることでブレイクポイントも置ける。

2018年10月22日月曜日

PostgreSQLにおけるスキーマの定義変更

スキーマの定義変更方法。すぐ忘れてしまうのでメモしておく。

スキーマの名称変更。

alter schema [name] rename to [newname]

nameが既存のスキーマ名で、newnameが新しいスキーマ名。

スキーマの所有者変更。

alter schema [name] owner to [newowner]

nameが所有者を変更したいスキーマ名で、newownerが新しい所有者のロール名。

スキーマの所有者を変更はスーパーユーザーでないと出来ない。