空の下で暮らすくま

レーザーカッターや3Dプリンタを覚えたクマ🐻

dockerでjavaの開発環境を整えてみた

parallelsによる仮想開発環境から無料で開発できる環境に置き換えたい、といわれたのでdockerでできないか調べてみました。

作りたいもの

今回は、

parallelsで仮想環境を用意」・・・macで仮想環境を用意したということだったので、真っさらな開発環境を用意する必要がありそう。

centOSを入れた」・・・OSをいれたということはそこにコマンドからJDKを入れたのかな。

「9000円くらいの課金」・・・parallelsの本体価格が8500円

この条件であればdockerでできるかな😇

なぜdocker?

javaの環境(image)が用意されているので、jdkやosのインストールが不要。手間が省ける。

コマンド1発で仮想環境(dockerではコンテナと呼ぶ)が立ち上がるので簡単。

ただcentOSではなくDebian系のosなので、絶対centOS!!!!とかだとこの案は却下😨

目次
  • 1.dockerでjavaの環境構築
  • 2.もっと効率よく開発しよう

1が説明とテスト、2は開発環境も整備した環境なので2がオススメ!

1、dockerでjavaの環境構築

まずは、dockerが必要なのでmacに公式サイトからダウンロードしてインストールします。

https://docs.docker.com/docker-for-mac/install/

正しくインストールできてるか確認👀

> docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

javaのイメージをローカルで使用可能にするためにpull。

> docker pull java

仮想環境を起動する。—name javatestで名前を指定、

> docker run -it --name javatest java

一応ファイルに記述したかったのでvimをインストール。osはdebianなのでaptが使える。(centOSyumと同じパッケージ管理ツール)

# apt update
# apt install vim

javaの動作確認用テストファイルを作成。

# vim Main.java
public class Main {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}

コンパイルしてクラスを作成、

# javac Main.java

実行。

# java Main
Hello World!

できた!

dockerで作成したコンテナにフォルダを送信する

dockerで作成した仮想環境[コンテナ]にローカルからフォルダを送信するには、docker cpを使います。scpのdocker版。

ローカル環境で実行、ローカルからdockerコンテナへファイルを送信する。

> docker cp [オプション] ローカル・パス|- コンテナ:パス
> docker cp ~/Document/javatest/Main.java:/home/share

一応開発環境はこれで整ったのですが、フォルダを送信やファイルへの変更をいちいちコマンドでやるのは大変です。

2、効率よく開発しよう✏️

問題点

エディタが使えない・・・コードの作成や編集をvimでやるのはむずい。

フォルダを送らないといけない・・・時間かかったり、送れたかの確認がコマンドでしかないので面倒。

解決方法

macのフォルダと共有させて、コード編集やファイル管理はmac上、コンパイルはdockerコンテナでやればよさそう。

ここから見る人用にはじめから解説。

macにdockerをインストール。https://docs.docker.com/docker-for-mac/install/

javaのイメージをローカルで使用可能にするpullまでは一緒。

> docker pull java

runするときに-v /path/to/macFolder:/path/to/dockerContainerFolderをつけると、macにあるフォルダとシェアさせるこができる。(正確にはホストのディレクトリをマウントする)

> docker run -v /path/to/macFolder:/path/to/dockerContainerFolder --name javasample -i -t java

ぼくの場合は、

> docker run -v ~/Documents/javatest:/home/share --name javasample -i -t java

動作確認

macの~/Documents/javatestにTest.javaのファイルをエディタで作成し設置。

f:id:yabu_sw:20190221174454p:plain:w300

dockerコンテナの/home/shareで、

# javac Test.java
# java Test
Test Hello World!

macのエディタからコードを作成し、dockerでコンパイルと実行ができました!

macで削除したファイルがdocker上で消えるか確認。一応コマンドから実行(finder上で移動・削除しても一緒)。

macの~/Documents/javatest

> ls
Test.java Test.class
> rm Test.java
> ls
Test.class

dockerコンテナの/home/share

# ls
Test.class

消えてるのが確認できた!

dockerの操作

動いてるdockerを確認する。他にも[CONTAINER ID]の確認とかに使う。

> docker ps

-aで停止しているコンテナの確認もできる

> docker ps -a

dockerを停止(docker上で実行)

# exit

dockerを停止(ローカル上で実行)

> docker stop [CONTAINER ID]

作成したdockerコンテナを起動

> docker start [CONTAINER ID]

コンテナ削除(不要になったときに使う)

> docker rm [CONTAINER ID]
まとめ

javaの実行環境だけだったら、dockerとローカルマシンに共有フォルダを作成するだけでめっちゃ簡単になった。

これで要件は満たせたかな、、、?

2/22追記 eclipsとかintelliJ使った方がやっぱよさそうだよね笑

参考文献

qiita.com

qiita.com

qiita.com

qiita.com

論文発表用のスライドにはページ番号を追加しよう

論文発表のスライドを作成していると「スライドにはページ番号を振りなさい」とアドバイスをいただきました。

調べると一括でページ番号をつける方法がありました。(googleスライド編)

ページ番号

ページ番号を納入するには、[挿入]→[スライド番号]を選択。 f:id:yabu_sw:20190217151909p:plain:w300

[適用]を押すと全てのスライドにページ番号が振られます。 f:id:yabu_sw:20190217152000p:plain:w300

[選択したスライド]に適用は今表示しているページのみ番号を表示させます。

参考サイト

support.google.com

picins.styが無いと言われた時の対処法

f:id:yabu_sw:20190206132003p:plain

卒業論文を書くためにtexファイルを頂いたのですが、mactexshopでタイプセットすると、pincins.styが無い(! LaTeX Error: File `picnis.sty` not found.)と言われたのでその対処法。

大人しくpicins.styで調べてみると、どうやら写真を挿入するのに使うためのファイルのようです。

コードを見てみると、\usepackage{picins}の記述がありました。

解決法

パッケージをダウンロードしましょう。リンクは本家サイトから。 https://ctan.org/pkg/picins

このフォルダの中にpicins.styがあるので、これをtexファイルが置いてある場所と同じフォルダに置くとコンパイルが通ると思います。

まとめ

卒論書くのって大変ですね、、、がんばろう〜

簡単なAPIをawsで作成!APIGatewayからlambdaを通してDBから値を返す時に困ったところ

少し前からサーバレスでHPを作ってみたい!と思って、awsを触っています。

今回はlambdaでDynamoDBから値を取得して返すところまでやっており、ほとんどは参考にしたリンクでできたのですが、個人的につまずいたところだけここで紹介していこうと思っています。

参考にしたリンクはこちらです↓

基本的にはこちら(AWSのLambdaとDynamoDBとAPIGatewayの連携 - Qiita)のリンクを参考に進めています。

こちらもかなり参考にしました。 初めての、LambdaとDynamoDBを使ったAPI開発 - Qiita

とりあえずここまでは進められた

"IAMでDynamoDBにアクセス可能なロールの作成"と"DynamoDBにテーブル作り項目の作成をする"までは記事通りにできると思います。

IAM作って

f:id:yabu_sw:20190121234046p:plain

DynamoDB作成

f:id:yabu_sw:20190121233615p:plain

lambdaで関数をテストしようとすると、、、?

ここでいよいよlambdaで関数作成だ、、、!って思ったのですが、DBから取得して値を返すところができずに困ってしまいました。

// ~~~省略~~~

dynamo.query(params, function(err, data) {
    console.log("dynamo_data:", data);
    console.log("dynamo_err:", err);
    context.done(null, data);
});

これがなんか実行できない、、、(一時間くらい調べてよくわかんなかった

一旦ゴールは値を返すところまでにすることにして、とにかく動けという感じで調べてみます。

すると、二つ目のリンクからデータベースの指定したテーブルの値を全部返すdynamo.scanを使う方法が載っていたので、そちらを参考にするとなんとかDBの値を返すことはできました。

regionを自分のDBを作成した場所にしするのと、tablenameはDB作成時に作った名前に変更すれば、さっき作ったテーブル中身を全部返してくれると思います。

僕が作ったのだとこんな感じ↓

var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB({
    region: 'ap-northeast-1' //regionはDBを作ったregion
});
exports.handler = (event, context, callback) => {
    var params = {
        "TableName": "test"
    };
    console.log("event:", event);
    dynamo.scan(params, function(err, data) {
        console.log("dynamo_data:", data);
        console.log("dynamo_err:", err);
        context.done(null, data);
    });
};

いちおうテストして値が返ってくるか検証しましょう。

→大きく詰まったのはこれくらいでしたが、結局指定した値までは取れてないので、そこはまた勉強が必要かな、、、

残るはAPIGatewayの設定

APIGatewayの設定は2つめのリンクを参考にしました。(めっちゃわかりやすかった

初めての、LambdaとDynamoDBを使ったAPI開発 - Qiita

最後に

記事通りに進めて自分が詰まったところを書きました。

参考になればうれしいです!

個人的には、結構簡単なとこで詰まってる気がしてつらい、、、笑

できるとこまでは一応進むことができたので、次はS3を使って静的サイトを作って見ようと思ってます✌️

参考サイト

qiita.com

qiita.com

awsでなぞの料金発生?ec2を停止したけど課金されてた

今年の6月くらいになんかwebサービス作ってみようと思って、awsのec2を使い始めました。

腕試しくらいで作ろうと思ってたので学生無料枠を利用しつつ12ヶ月くらいは置いとこうと思って作り始めました。

最初の2ヶ月くらいは無料(もしくは30円くらい)で使ってたのですが、いつの間にか400円くらい課金されてたので、原因を調べてみました。

elastic IPがあやしい👻

どこで請求が発生してるか調べるために、料金明細を調べていきます。

サービス→請求

f:id:yabu_sw:20181230171149p:plain

請求→料金明細

f:id:yabu_sw:20181230171144p:plain

料金明細を見てみると、このような表示が。 f:id:yabu_sw:20181230171141p:plain

Elastic IPが時間で課金されてるのがわかります。

あれ?1つ無料じゃなかったっけ?

Elastic IPは一つ無料だったような気がしていたので調べてみると、

「起動しているインスタンスでElastic IPを一つだけ使用している場合のみ無料」

参考はこちら→EIPで料金発生するパターンとしないパターン #AWS | DevelopersIO

なるほどです。ぼくがec2を起動している時は料金は発生しなかったけど、サービスの開発をやめてインスタンス切ったので料金が発生していたようです。

まとめ

料金明細からどこに課金されてるかを確認するのは重要ですね、、、

同じようなことで困ってる人の力になれば幸いです!

dev.classmethod.jp

qiita.com

aws.amazon.com

サーバレスでHPを作ってみたい!

ちょうど一ヶ月前にこんな記事が目にとまりました。

https://qiita.com/asmsuechan/items/17f168f151346ac5cf65

とある大学の研究室のHPをサーバレスで作った話です。 この記事をみて「僕もこういうのやりたかった大学人生だった、、」 という話を同級生としてたら、「やってみたらいいじゃん」と言われたのでやってみようと思いました。

ただ、この記事をみた時点の自分の感想は、「さーばれすとかわかんない??ChatOps?Vue.jsミタコトアルネ」みたいな状態だったので、一旦わかる部分とわからない部分を明確にしておきます。

フロントエンド

React.jsを少しだけ触ったことがあるくらいです。

Vue.jsは使ってみたいとずっと思ってたので、この記事にならってVue.jsを使おうかなと思っています。

AWS lamdaとserverless framework

awsはec2とかしか使ったことないです。

lambdaとserverless frameworkは初見さん。

Slack bot

slackのapiは使ったことがないのでこれも初見です。

twitterapiは何回か触ったことがあるので、サーバレスの部分とかよりはなんとかなりそう。

それにChatOpsは調べたらたくさん事例が出てきたので大丈夫そう。

DB

データベースも記事ならってDynamoDBを使う予定です。

いちおう一通りのデータベース操作はできてるつもり。

どんな感じで進める?

全くわからないlambdaとserverless frameworkから勉強して、どんな感じで使えるか理解していきたい。

次にVue.jsとslackをやって、ある程度理解できたらserverless frameworkと組み合わせてみて、どんな動きするか確かめながらやってこうかなって感じです。

フォーラムに大量のスパムコメントが来たので一括削除した

f:id:yabu_sw:20181220032121p:plain

昨夜からこのようなスパムがきていたらしく気づいたらコメント数が6万以上来ていました。

調べてみるとbbpressで作成したフォーラムにコメントとして書かれまくってた様子。

放置しても邪魔になるので一括で消したいなと思いつつ、一つ一つ削除するのは面倒だなと思っていたので、データベースから削除する方法を参考にして一括削除をしました。

参考サイトはこちら↓

incloop.com

1.データベースのバックアップをとる。

phpmyadminを利用してデータベースを管理していたので、export機能を使って全体のバックアップをとりました。

2.wp1_postmetaを削除する。

データベースを見てみるとwp1_postmetaとwp1_postsの量が圧倒的に増えています。

そこにスパム投稿とそれに関する情報が入ってそうなので、そこを調べていきます。

f:id:yabu_sw:20181220032356p:plain

wp1_postmetaの中身を見てみるとどれがフォーラムに投稿されたデータかを判別できないので、wp1_postsと結合させて調べます。

フォーラムへの投稿を削除したいので、guidの列に”forums"が含まれている部分のみを検索しました。

今回自分の場合は、直近3日間のフォーラムへのコメントが全てスパムだったので、日付と"forums”のみで判別しています。

———————————————SERECT———————————————
SELECT * 
FROM `wp1_postmeta` 
INNER JOIN wp1_posts 
        ON wp1_postmeta.post_id = wp1_posts.ID
WHERE post_date LIKE "2018-12-17%"
AND guid LIKE "%forums%"

———————————————DELETE———————————————
DELETE `wp1_postmeta` 
FROM `wp1_postmeta` 
INNER JOIN wp1_posts 
    ON wp1_postmeta.post_id = wp1_posts.ID
WHERE post_date LIKE "2018-12-18%"
AND guid LIKE "%forums%"

“SELECT"で検索して値があるか確認し、”DELETE"で削除します。

3.wp1_postsも削除する。

wp1_postmetaと同じように日付とguidの文字列に”forums”が含まれていたら抽出、ざっくり確認したら削除という手順で実行します。

———————————————SERECT———————————————
SELECT * 
FROM `wp1_posts` 
WHERE post_date LIKE "2018-12-18%"
AND guid LIKE "%forums%”

———————————————DELETE———————————————
DELETE `wp1_posts`
FROM `wp1_posts` 
WHERE post_date LIKE "2018-12-18%"
AND guid LIKE "%forums%"

ぼくは3日分のコメントが溜まっていたので、2と3の作業を3回実行しました。

4.スパム対策

今回のスパムは一旦削除することができたので、次から来ないように対策をします。

スパム対策にはakismetを使用しました。

それと今回はコメントに大量のスパムが投稿され続けてしまったので、連続投稿の間隔を10秒→1分に変更しました。

参考にしたリンクはこちらです。

akismetの設定

pasolack.com

bbpressの設定

wordpressで掲示板を作るならbbpress!使い方の完全マニュアル

この記事もspam対策にはよさそうだったので、akismetで防げない場合は試してみたい。

netaone.com

感想

初めから対策しとけよって感じですね、、、 bbpressを使っての対策であれば、投稿スロットル時間の間隔を長くすること。 Akismetは使っていたけど、もうちょいちゃんとするならreCapthchaとかも使った方がいいかなと思いました。

参考リンク :

incloop.com

qiita.com

pasolack.com

wordpressで掲示板を作るならbbpress!使い方の完全マニュアル

netaone.com