20210227のJavaに関する記事は8件です。

【Java】AtCoderのABC-193に参加しました。

こんばんは。

2021/2/27に、AtCoderのABC-193に参加しました。
レートは以下の通りとなっています。

image.png

残念ながらC問題でつまずきました。

順位は5353位でした。C問題が解けた前回よりも良かったです。
レートは184→197に更新!200まであと少し!たぶん次は超えるでしょう。

A問題

A円の品物がB円で売られていた。何割引か?
まあこれは問題の通りですな。

import java.util.Scanner;

public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
  double a = sc.nextDouble();
  double b = sc.nextDouble();
  System.out.println(((a-b)/a)*100);
}
}

B問題

人気ゲーム機を買いたいが、N箇所の店に売っている。
それぞれ、自宅から徒歩A分のところに、P円でX個の在庫がある。
0.5分ごとに1個ずつ売れてしまう。
一番安く手に入る価格はいくらか?

import java.util.Scanner;

public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  int a[] = new int[n];
  int p[] = new int[n];
  int x[] = new int[n];
  int min = 1000000000;
  char flg = '0';
  for(int i=0;i<n;i++){
  a[i] = sc.nextInt();
  p[i] = sc.nextInt();
  x[i] = sc.nextInt();
    if((x[i]-a[i])>0){
        flg = '1';
        if(p[i]<min){
          min = p[i];
        }    
    }
  }
  if(flg=='0'){
  System.out.println(-1);
  }else{
  System.out.println(min);
  }

}
}

C問題

正解を導くロジックにはなってもタイムアウトでだめでした。

感想

今回は残念な結果ではありますが、また次に向けて頑張ります。
今週はPM関連の試験があり、そちらの注力してプログラミングの練習を休んでいましたので、また次回に向けて練習を積んでいきます。
レート200を直近の目標にして頑張ります。

これからもコツコツ取り組んで、茶色を目指したいと思います!
同じく灰色レベルで頑張っている方、お互い頑張りましょう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでJava開発環境を構築する

概要

最近PGする機会がめっきり減ってきたので、コーディング力を維持する(というか成長させる)ために、Javaでも書いてみようと思いました。
せっかくなのでクラウドの統合開発環境の代表格(?)であるAWSを使ってみます。

やること一覧

  1. Gitでリポジトリ作成
  2. Cloud9 の環境作成
  3. READMEをGitにpush
  4. プログラムを一本push

1. Gitでリポジトリ作成

20210227_01.png

いつもの画面が出てきます。
20210227_02.png

2. Cloud9 の環境構築

  • AWSマネジメントコンソールの検索バーにCloud9と入力
  • Cloud9が選択肢に出てくるのでクリック
  • 「Create environment」をクリック
  • 名前と概要を書いて「Next step」をクリック
  • 高性能でなくていいですし、デフォルトからセッティングをいじる必要もなさそうと判断してそのまま「Next step」をクリック
    20210227_07.png
    20210227_08.png

  • 確認画面が出てきます。Cloud9環境を使用するにあたっての注意事項が書いてあるので、読んでから「Create environment」をクリック

  • 数分待ちます。

  • できました!
    20210227_11.png

3. READMEをGitにpush

Gitリポジトリに書いてある始め方に沿って進めます。

$ git init
$ git add README.md 
$ git commit -m "first commit"
$ git config --global user.name "Mick Danjoh"
$ git config --global user.email *****@gmail.com
$ git branch -M main
$ git remote add origin https://github.com/danjo-m/lemon.git
$ git push -u origin main

リポジトリにpushできました。
20210227_12.png

4. プログラムを一本push

まじで何でもないプログラムを作ってpushします。

あらかじめJDKが入っていることを確認。

$ java -version
openjdk version "11.0.10" 2021-01-19 LTS
OpenJDK Runtime Environment Corretto-11.0.10.9.1 (build 11.0.10+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.10.9.1 (build 11.0.10+9-LTS, mixed mode)

いつものHello World

Sample1.java
public class Sample1 {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
$ ls
README.md  Sample1.java
$ javac Sample1.java 
$ java Sample1
Hello World!

Hello Worldできました。
こいつをpushしておきます。

$ git add Sample1.java
$ git commit -m "Create first pg"
$ git push origin main

gitignoreやクラスファイルの整理はおいおい。

おまけ:Gitコマンド

Githubで情報提供されていたコマンドのオプションをすっかり忘れていたので、
使ったものだけでも整理。

  • git commit -m "comment"
    • -mで単一コメントを記述する。
    • 対象ファイルを書かない場合はステージされている(addした)全ファイルをコミット。
  • git branch -M <branch_name>
    • 「branch_name」のカレントブランチの名前を変更。
    • -mだと上書き禁止。-Mだと強制上書き。
  • git push -u <remote_path> <local_branch>:<remote_branch> *「remote_path」へ「local_branch」を「remote_branch」へpush。 *ブランチ名はローカルとリモートが同じ場合は1つに省略可。
    • -uオプションで、次回からgit pushだけで今回と同じ操作ができる。
    • 「remote_path」は省略名で指定可能。省略名はgit remote -vで確認。
$ git remote -v
origin  https://github.com/danjo-m/lemon.git (fetch)
origin  https://github.com/danjo-m/lemon.git (push)

参考リンク

Gitチートシート
[Git]git branch コマンドの -m と -M オプションの違い
git pushのオプション -u とは

以上!お疲れさまでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【正規表現】<div>などのタグ文字をデリミタ指定する方法【最短指定】

初めに

<何か>のような始点Aから終点Bまでの文字列を正規表現で指定する方法について述べただけの記事です

本題

始点(今回は「<」)から終点(今回は「>」)までの文字列を単純に正規表現で表すと

正規表現[不正解]
String regExp = "<.*>";

こんな形になると思いますがこれだとうまく動きません。

なぜかというと、.*で指定した文字数は貪欲でマッチしうる文字列(最長文字列)にマッチするためです。
そのため、出現するデリミタが一つだけならばいいですが、2つ以上出た場合に途中の文字列全てにマッチしてしまいます。

そのため、最短でマッチするように指定するためには「+」や「*」の後に「?」をつけてあげると最短の文字列にマッチします。

正規表現[正解]
String regExp = "<.*?>";

最後に

今回はJavaの記述で行いましたが、基本的に正規表現は共通で扱われるので他の言語でも動くはずです。
最短マッチはあまり参考資料がないので(僕がみた中では)ハマると結構時間が取られてしまうかなと思い筆を取りました。

かくいう私も数時間ほど悩んでしまいました、、、

参考になれば幸いです

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Minecraft Plugin]簡単なPlayer vs Enemyのミニゲームを作成してみよう

2021-02-27_20.23.05.png

開発環境

  • IDE: Intellij IDEA Ultimate
  • java version: 1.8.0_271
  • Minecraft: 1.16.4
  • Spigot Plugin

どのようなPluginなのか

プレイヤー同士協力して敵Mobを退けながらゴールを目指すシンプルなゲームを実装します
Youtube: https://youtu.be/lEvXYIoAG48
github: https://github.com/FratikaK/L4D_gamepl

Enemyの湧かせ方について

これはとても悩みました。Locationで指定した位置に湧かせるのが自然でいいかもしれませんが、
Mapの広さ故、かなり莫大な量のLocationを書かなければいけません。

そこでSpigotが提供しているListenerとMinecraftとスポナーのシステムを利用してみました

    //SpawnerSpawnEventを使用する
    @EventHandler
    public void zombieSpawn(SpawnerSpawnEvent event) {
        //スポナーからスポーンさせる処理はまずキャンセルする
        event.setCancelled(true);

        if (L4D_gamepl.isGame()) {
            //プレイヤー数 * 任意の数字分湧かせる
            int mobNum = L4D_gamepl.getSurvivorList().size() * 8;

            //スポナーの位置を特定してそこにまとめて湧かす
            Location spawnerLocation = event.getSpawner().getLocation().clone();
            spawnerLocation.add(0.5, 1, 0.5);

            //スポナーイベントが発生するたびにスポナーの設定を初期化する
            CreatureSpawner spawner = event.getSpawner();
            spawner.setSpawnCount(1);
            spawner.setSpawnRange(20);
            spawner.setRequiredPlayerRange(40);
            spawner.setMaxNearbyEntities(10);
            spawner.setDelay(0);
            spawner.setMinSpawnDelay(200);
            spawner.setMaxSpawnDelay(200);

            //スポナーの位置に湧かせる
            for (int i = 0; i < mobNum; i++) {
                event.getSpawner().getWorld().spawnEntity(spawnerLocation, event.getSpawner().getSpawnedType());
            }

            //ランダム関数で特殊mobをevent1回につき1匹スポーンさせる
            Random random = new Random();
            event.getSpawner().getWorld().spawnEntity(spawnerLocation, spawnSpecialMob(random.nextInt(8)));

        }
    }

これでスポナーを置いておけば勝手にEnemyがスポーンします
スポナーの設定もここで行っているので、わざわざコマンドで設定する必要がありません

武器のシステム

このPluginのゲームに使用する武器はCrackShotのPluginを利用しています
CrackShot URL: https://dev.bukkit.org/projects/crackshot

武器を入手するには、Enemyを倒すことで得られるお金を必要とします
お金を得る処理はこのように書いています

    @EventHandler
    public void playerKillMobs(EntityDeathEvent event) {

        //プレイヤーが死亡の場合はreturn
        if (event.getEntity().getType() == EntityType.PLAYER) {
            return;
        }

        Player player = event.getEntity().getKiller();

        //所持金を加算
        player.setStatistic(Statistic.ANIMALS_BRED, player.getStatistic(Statistic.ANIMALS_BRED) + 5);
   }

このコードから、Statistic(プレイヤーの統計)を所持金として置き換えています
データベース等を利用する気はなかったので、サーバー側で保存される統計情報を利用しました

次は武器を購入する処理です
村人をインタラクトすることで取引画面が表示されます
2021-02-27_18.49.35.png

    private void showMerchantInventory(Player player) {

        String traderText = "Trade Items";

        if (!L4D_gamepl.isGame()) {
            traderText = "Trial Weapons";
        }
        //Inventoryを作成
        Inventory inventory = Bukkit.createInventory(null, 54, traderText);

        ItemStack firework = getMetaItem(Material.FIREWORK_STAR, "グレネード", "$20");
        ItemStack clay = getMetaItem(Material.CLAY_BALL, "コンカッション", "$70");
        ItemStack apple = getMetaItem(Material.APPLE, "回復のリンゴ", "$50");
        ItemStack beef = getMetaItem(Material.COOKED_BEEF, "ステーキ", "$120");
        ItemStack minecart = getMetaItem(Material.FURNACE_MINECART, "Landmine", "$30");
        //以下略...

        inventory.setItem(0, firework);
        inventory.setItem(1, clay);
        inventory.setItem(2, apple);
        inventory.setItem(3, beef);
        inventory.setItem(4, minecart);
        //以下略

        //引数のプレイヤーに作成したInventoryを表示させる
        player.openInventory(inventory);
    }

    //アイテム名と説明文をつけたItemStackを返す
    private ItemStack getMetaItem(Material material, String displayName, String lore) {
        ItemStack itemStack = new ItemStack(material);
        ItemMeta itemMeta = itemStack.getItemMeta();

        itemMeta.setDisplayName(ChatColor.AQUA + displayName);
        List<String> lores = new ArrayList<>();
        lores.add(ChatColor.GOLD + lore);
        itemMeta.setLore(lores);
        itemMeta.setCustomModelData(1);

        itemStack.setItemMeta(itemMeta);

        return itemStack;
    }

そして所持金が足りていれば購入できます!

    private void dealings(Player player, Material material, int money, String itemName) {

        //所持金が足りなければreturn
        if (player.getStatistic(Statistic.ANIMALS_BRED) < money) {
            player.sendMessage(ChatColor.RED + "所持金が足りません!");
            return;
        }
        //渡す武器を作成する
        ItemStack itemStack = new ItemStack(material);
        ItemMeta itemMeta = itemStack.getItemMeta();
        itemMeta.setDisplayName(ChatColor.YELLOW + itemName);
        itemStack.setItemMeta(itemMeta);

        //所持金を引いて、武器を渡す
        player.setStatistic(Statistic.ANIMALS_BRED, player.getStatistic(Statistic.ANIMALS_BRED) - money);
        player.getInventory().addItem(itemStack);
        player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 0);

        player.sendMessage(ChatColor.AQUA + itemName + "を購入しました");
    }

復活システム

プレイヤーは死亡した後、スペクテイターモードで観戦者モードになっています
しかし、ずっと観戦者でいるのはつまらないので生存プレイヤーがチェックポイントにたどり着けば、
復帰することができます

    //引数のプレイヤーを復帰させる
    private void resurrectionPlayer(Player player) {

        //生存プレイヤーならreturn
        if (L4D_gamepl.getSurvivorList().contains(player.getUniqueId())) {
            return;
        }

        //死亡プレイヤーリストにあれば復帰処理
        if (L4D_gamepl.getDeathPlayerList().contains(player.getUniqueId())) {

            //リスト整理
            L4D_gamepl.getSurvivorList().add(player.getUniqueId());
            L4D_gamepl.getDeathPlayerList().remove(player.getUniqueId());

            player.setPlayerListName("[" + ChatColor.AQUA + "生存者" + ChatColor.WHITE + "]" + player.getDisplayName());

            //初期状態に戻す
            player.setGameMode(GameMode.SURVIVAL);
            player.setFoodLevel(6);
            //初期アイテムを渡す処理
            pl.giveGameItem(player.getInventory(), player);
        }
    }

Perkシステム

Perkとはいわゆる職業、特殊能力のことを指しています
2021-02-27_19.23.25.png

Perkが設定されているかどうかはMetadataで処理しています

    public void setPeekDeck() {

        //PEEK_KEYを持っているか
        if (!player.hasMetadata(PEEK_KEY)) {
            plugin.getLogger().info("[PeekDecks]プレイヤーにメタデータが付与されていません");
            return;
        }

        //メタデータはリスト型として返ってくるので、for文で取得する
        List<MetadataValue> peeks = player.getMetadata(PEEK_KEY);

        MetadataValue value = null;

        for (MetadataValue v : peeks) {
            if (v.getOwningPlugin().getName() == plugin.getName()) {
                value = v;
                break;
            }
        }

        //メタデータが見つからなかった場合はreturn
        if (value == null) {
            return;
        }

        //すでにあるポーション効果を削除
        removePotion();

        //メタデータの持っている値に応じてポーション効果を付与する
        switch (value.asString()) {
            case tank:
                player.addPotionEffect(new PotionEffect
                        (PotionEffectType.DAMAGE_RESISTANCE, 1000000, 1, true));
                break;

            case scout:
                player.addPotionEffect(new PotionEffect
                        (PotionEffectType.SPEED, 1000000, 0, true));
                break;

            case regene:
                player.addPotionEffect(new PotionEffect
                        (PotionEffectType.REGENERATION, 1000000, 0, true));
                break;

            case destroyer:
                //CSUtilityはCrackShotのAPIからです
                new CSUtility().giveWeapon(player, "GL", 1);
                break;
        }
    }

例として画像のグラインダーは敵を倒す度に体力を回復します

        //体力が20であればreturn
        if (player.getHealth() == 20) {
            return;
        }

        //grinderのmetadataが付与されていれば1ポイント回復する
        PerkDecks perkDecks = new PerkDecks(player, pl);
        if (perkDecks.getMetadata(player, PerkDecks.getPerkKey(), pl).equals(PerkDecks.getGrinder())) {
            player.setHealth(player.getHealth() + 1);
        }

発生したバグとその対処について

プレイヤーが無敵になる、一撃で死亡することがある

発生する条件を発見できなかったので、これは苦労しました
EntityDamageByEntityEventは発生しているようです

対処として、直接プレイヤーの体力を操作する方式をとりました

    @EventHandler
    public void noOverDamage(EntityDamageByEntityEvent event) {

        Entity entity = event.getEntity();

        if (event.getDamager().getType() == EntityType.PRIMED_TNT && entity.getType() == EntityType.PLAYER) {
            return;
        }

        if (entity.getType() != EntityType.PLAYER) {
            return;
        }
        Player player = (Player) entity;
        //イベントはキャンセルしておく
        event.setCancelled(true);
        //一撃死の原因かもしれないので、ダメージを受けた時にクールダウンを発生させておく
        player.setNoDamageTicks(20);

        //付与されているPerkがGrinderかScoutであれば受けるダメージが増える
        PerkDecks perkDecks = new PerkDecks(player, pl);
        if (perkDecks.getMetadata(player, PerkDecks.getPerkKey(), pl) == PerkDecks.getGrinder()
                || perkDecks.getMetadata(player, PerkDecks.getPerkKey(), pl) == PerkDecks.getScout()) {
            if (player.getHealth() < 6) {
                player.setHealth(0);
                return;
            }
            player.setHealth(player.getHealth() - 6);
        } else if (perkDecks.getMetadata(player, PerkDecks.getPerkKey(), pl) == PerkDecks.getTank()) {
            if (player.getHealth() < 2.5) {
                player.setHealth(0);
                return;
            }
            player.setHealth(player.getHealth() - 2.5);
        } else {
            if (player.getHealth() < 4) {
                player.setHealth(0);
                return;
            }
            player.setHealth(player.getHealth() - 4);
        }
    }

このようにsetHealthで体力を操作しています
これを応用すれば、特定のEnemyからのダメージを増やすこともできます

PvPの設定をオフしているのに、グレネードなどの投げ物のダメージが入る

例えば、コンカッション。当たれば対象に移動速度低下がつく強力な武器ですが、
CrackShot側のバグなのか、プレイヤーにも付与されてしまいます

    @EventHandler
    public void removeRaid(PlayerMoveEvent event) {
        if (event.getPlayer().hasPotionEffect(PotionEffectType.BAD_OMEN)) {
            event.getPlayer().removePotionEffect(PotionEffectType.BAD_OMEN);
        }

        if (event.getPlayer().hasPotionEffect(PotionEffectType.SLOW)) {
            event.getPlayer().removePotionEffect(PotionEffectType.SLOW);
        }
    }

PlayerMoveEventで強制的にポーション効果を消す処理を入れました
CrackShot側のバグなのか判明するまで待つしかないですかね...

EnemyMobの増えすぎでサーバーに負荷がかかる

プレイヤー数に応じてMobを増やす関係上、
そのまま放置しているといつかクラッシュする可能性がありました

プレイヤーはもういないのにMobが湧いても意味ないです

public class LagFixTask extends BukkitRunnable {

    @Override
    public void run() {

        long removed = Bukkit.getWorlds().stream()
                //ワールド内の生存しているエンティティ
                .flatMap(world -> world.getEntitiesByClasses(Projectile.class, Explosive.class, LivingEntity.class).stream())
                //20秒以上生存している、プレイヤーではないエンティティ
                .filter(livingEntity -> livingEntity.getTicksLived() > 20 * 20 && livingEntity.getType() != EntityType.VILLAGER && livingEntity.getType() != EntityType.PLAYER)
                //エンティティを削除する
                .peek(Entity::remove)
                //カウント
                .count();

        if (removed > 0) {
            Bukkit.getLogger().info("[LagFixTask] 不要な" + removed + "体のエンティティが削除されました");
        }
    }
}

BukkitRunableを採用して、一定時間ごとに放置されているMobを削除する処理をいれて対処しました

これはLeonGunWarさんのPluginを参考にさせていただきました
GitHub: https://github.com/AzisabaNetwork/LeonGunWar/blob/master/src/main/java/net/azisaba/lgw/core/tasks/CrackShotLagFixTask.java

さいごに

簡単なミニゲームを作ってみたいという思いから作成してみました
今後PvPも実装してマルチサーバーとして公開してみたいと考えています

この記事がjava Plugin開発初心者の役に立てれば幸いです

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

超絶初心者がMacでEclipseを動かすまで

自分が通っていた職業訓練校ではEclipseを使ってコードを書いていたので、家でも同じようにしよう!と思ったのですが、訓練校で使っていたのは Windows、家のはMacで、微妙に違う!
しかも自分はMacを持ってるにも関わらずMac初心者(今使ってるノートパソコンが初Mac)なので、今後同じ事をする必要がある時用の覚え書きに。

注:自分が後で見返す用にスマホ撮影した写真を載せてますが、自分用なので汚いです。

とりあえずEclipseを日本語で使いたいので、
https://mergedoc.osdn.jp/
から日本語化のプラグインを纏めてインストールします。
3BCD9F86-9E5C-4C67-A80E-BE85C7051376.jpeg

A65ECBB8-611F-4D83-96D0-1001046CEE86.jpeg

Windowsでした時は7-zipとかいうのもダウンロードして、それを使って解凍していましたが、Macでは必要ないみたいです。らくちん。

インストール完了したらとりあえず開いてみます。

3735BF51-D9FE-48AA-A2B9-A3F1AF28463B.jpeg

ディレクトリの選択が出てきますが、もう何か選択されているのでそのまま起動します。

83C7E654-3F76-4E97-BE2F-599C0FCC39C3.jpeg

おおお!できました。

次は動かしてみる予定です。
何を作ろうかなー。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【備忘録】JavaでWebブラウザ(IE)の操作を自動化

これまでPowerShellでWebブラウザの自動操作をしていましたが、javascriptで言うところの「getElementsByClassName()」メソッドが上手くいかず「Javaで作れないかな~」ということで簡単なひな形だけ先に作ってみました。

上述のPowerShellはInternet Explorer(略称:IE)との相性が良かったので、今回も同じWebブラウザを使います。

今回は「Selenium IE Driver」と「IEDriverServer」を使いました。

前提条件

・Windows 10 pro 64bit
・Java 1.8
・Eclipse(Pleiades)
・Apache Maven 3.6.3
・Internet Explorer 11 ←自動操作したいWebブラウザ

最終的なプロジェクトの構成とmain()

image.png
・自分はプロジェクト内に「driver」ディレクトリを作って、その中に32bit版と64bit版を入れました。
 (最初64bitでやろうとしましたがエラーが出てしまうので32bit版を追加してそのままになってるだけですスミマセン)
・そして実行するクラスの記述は以下。

sample.java
package ~~~~~~~~~;

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class sample {
    public static void main (String[] args) {
//IEDriverServerの指定、インスタンスの生成、指定URLの展開
        System.setProperty("webdriver.ie.driver", "driver\\IEDriverServer32.exe");
        InternetExplorerDriver driver = new InternetExplorerDriver();
        driver.get("http://www.google.co.jp");
//検索ボックスのname属性が"q"なので、それを指定して検索したいワードをsendKeysで指定
        WebElement textBox = driver.findElement(By.name("q"));
        textBox.sendKeys("世界のグルメ レシピ");
//検索ボタンの押下げ
        driver.findElement(By.className("gNO89b")).click();
//検索結果の一覧を取得しコンソールに出力
        int i = 0;
        List<WebElement> elements = driver.findElements(By.className("LC20lb"));
        for (WebElement element : elements) {
            i++;
            System.out.println(i +"件目:"+element.getText());
        }
//IEを閉じる
        driver.quit();
    }
}

やること

① IEDriverServerのダウンロード
 → ここからダウンロードできます。自分は2021年2月26日時点での最新バージョンを入れました。
 → 自分の場合は64bit版だと自動操作が上手くできませんでしたが、32bit版だと正しく動作しました。
 → ちなみに、IEDriverServerのexeファイルは本体内ドライブじゃなくても大丈夫。自分は外付けUSBに入れてますがちゃんと機能します。
② 保護モードやレジストリ等の設定をおこなう
 → ① と ② については、以下のページで分かり易く書いてありますよ。
https://bitwave.showcase-tv.com/seleniumでinternet-explorer11を動かす方法/
(※:リンク内後半にある「iexplore.exe」はスペリングミスではなく、本当にこのままでOK。)

③ Eclipse で Maven プロジェクトを作成。
 → Selenium IE Driver を Central Repository から引張り易くするためだけです。
 → Selenium IE Driver は バージョン3.141.59 じゃないと自分はエラーが出ちゃいました。
 → 別にMavenで作らなくても、ダウンロードした Selenium IE Driver の jar を「ビルド・パス」から「外部アーカイブの追加」でプロジェクト内に入れてしまえばOK。

④ あとはプログラムを組んで実行すればOK!
 ※IEの右上の設定から「拡大」で「100%」より大きい指定をしているとエラーが起きるので注意。

IEの自動操作でお仕事も趣味も有意義な時間をお過ごしくださいませ~♪

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RaspberryPiにJAVA用のOpenCVをインストールしてWindows+Eclipseからリモートデバッグする方法①

記)2021/02/27
具体的な導入方法を順次追加する。
Windows10を基準に書く。Macは持っていないので不明
無茶苦茶長いので、頑張って読み込んで下さい。

ちなみに、以下の記事(英語)を読めばわかると言えば身も蓋もないので日本語で詳しく書くことにする。
https://qengineering.eu/install-opencv-4.5-on-raspberry-pi-4.html

①RaspberryPiにOSをインストールする。
https://www.raspberrypi.org/software/
image.png
あ)Windows10PCにマイクロSDカード(16gでも実験だけなら可能だが、実用的なものを作るには最低でも32G以上を推奨)をセットし前記ソフトをインストールし起動。指示に従い書き込み
い)マイクロSDをラズベリパイへセットし起動
う)VNC、SSHを有効化する。
え)キャッシュを増やす

swapon
sudo sed -i -e 's/SWAPSIZE=.*/SWAPSIZE=2048/g' /etc/dphys-swapfile
sudo systemctl restart dphys-swapfile.service
swapon

②以下の記事に従ってbellsoftのJDKとsambaまで導入をすませる。
https://qiita.com/kamoshika9999/items/a7cffb954220e4afed10
Windows10からラズパイで実行するjavaFXプログラムをリモートデバッグする方法~環境構築からデバッグ実行まで②~

③依存関係をインストールする。Windows10でVNCからターミナルを起動し、コピ&ペースト&実行
この依存関係にあるパッケージだが詳しく調査出来ていない。OpenCVの使われ方によってはパッケージが不足し実行時エラーが出るかもしれない。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install cmake gfortran
$ sudo apt-get install libjpeg-dev libtiff-dev libgif-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install libgtk2.0-dev libcanberra-gtk*
$ sudo apt-get install libxvidcore-dev libx264-dev libgtk-3-dev
$ sudo apt-get install libtbb2 libtbb-dev libdc1394-22-dev libv4l-dev
$ sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev
$ sudo apt-get install libjasper-dev liblapack-dev libhdf5-dev
$ sudo apt-get install protobuf-compiler

④2021/02/27時点で4系の最新版である4.5.1をダウンロード

wget https://codeload.github.com/Itseez/opencv/zip/4.5.1

image.png

image.png
/home/pi/に4.5.1のアーカイブがダウンロードされる。

⑤フォルダ作成、移動、解凍する

mv 4.5.1 opencv.zip
unzip opencv.zip 
cd opencv-4.5.1/

image.png

⑥ANTのインストール

sudo apt-get install ant

⑦ANT_HOMEとJAVA_HOMEの設定 .bashrcの編集

sudo nano ~/.bashrc

image.png
追記する。パスは適宜修正必要

⑧ANTのシンボリックリンクの修正
これをやらないとcmake-guiでパスが通らない

ln -snf /usr/share/ant/bin/ant /bin/ant

⑨ビルド用フォルダ作成
ここにopencv-4.5.1.jaraとネイティブライブライブラリである.soファイルが作成される
今回この2ファイルを作成できれば成功

mkdir build
cd build

⑩cmake-guiを実行 sudoをつけないとエラーが出るので注意
image.png
⑪ソースコードとビルドフォルダを選択する
image.png
⑫GroupedとAdvancedにチェックを入れてConfigreボタンを押す
image.png
⑬CMakeSetupダイアログが出るのでそのままFinishボタンを押す

image.png
⑭Configuring doneと表示されれば一応成功だが....肝心のJAVAラッパーが作成できていない
image.png
image.png

⑮エントリにJAVA_HOMEが無いのが原因
image.png

⑯エントリを追加する。間違いやすいところなので詳しく書く
あ)現在選択されているJDKを確認する
image.png

  • 1 /usr/lib/jvm/bellsoft-java13-arm32-vfp-hflt/bin/java が選択されているので
    /usr/lib/jvm/bellsoft-java13-arm32-vfp-hflt/
    をクリップボードへコピーしておく。 bin/javaまで選択しないこと image.png

い)CMake-guiへ戻り、Add Entryボタンを押す
image.png
う)出てきたダイアログに先ほどクリップボードにコピーしたパスをValue値に張り付け、OKを押す
NameにJAVA_HOME
TypeにPATHを選択
image.png

え)エントリの最上部に追加されるので確認する
この時点ではJAVAのエントリグループにグループ化されて入らず、Configureを実行した後でグループ化される

お)Configureボタンを押す
完了後、ログのjavaの項目を確認するとYESに変わっているはず
image.png

か)もう一度Configreボタンを押す。するとUngrouped EntriesとOPENCVのエントリが赤から白に変わる
image.png
き)Generateボタンを押す。Generating doneと表示されればcmake-guiでの作業は終了。
cmake-guiを閉じる
image.png

⑰カレントフォルダが/home/pi/opencv-4.5.1/buildになっていることを確認してからmakeを実行する。
約6時間

sudo make -j3

今回はコア3つで実行することにする
失敗する場合は依存関係のパッケージが不足していのでログをよく見て適宜インストールすること

⑱カレントフォルダが/home/pi/opencv-4.5.1/buildになっていることを確認してからインストールする

sudo make install

⑲/home/pi/opencv-4.5.1/buildフォルダの
binに opencv-4.5.1.jar
libに libopencv-4.5.1.so
がそれぞれ入っているので確認しておく。
結局必要なのはこの二つで、どこに置いてもよいのでclasspathとDjava.library.pathで設定された位置にあれば良い

今回はここまで、次回はopencvのテスト起動とeclipseからリモートデバッグする方法を書く予定

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

google-java-formatをVSCode・macOS環境で利用する

対象とする読者

VSCode・macOS環境でのjava開発にてGoogle Java Styleに自動整形するフォーマッタ(google-java-format)を適用させたい方

環境

macOS Catalina (version: 10.15.7)
VSCode for macOS (version: 1.53.2)

設定法

  • ターミナルにてHomebrewでgoogle-java-formatをインストール
brew install google-java-format
  • VSCodeにて拡張機能emeraldwalk.runonsaveをインストール
    Screen Shot 2021-02-27 at 10.27.37.png

  • VSCodeにてsetting.jsonに以下の要素を追加1

{
  "emeraldwalk.runonsave": {
    "commands": [
      {
        "match": "\\.java$",
        "cmd": "google-java-format --replace ${file}"
      },
    ],
  },
}

参考


  1. setting.jsonの開き方はコチラの記事を参照 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む