プログラミングしたい日記

いつもプログラミングとか音楽聞いてたりする人の日記です

数列作って遊んでたらなんか等式の証明(?)したくなったので

まえがき

証明なんてしたことないから書き方があってるかどうかすらわからない。
式変形して同じものを導き出せばいいとか書いてあったからそれを使わせてもらう。
間違ってたらスイマセン。

きっかけ

{\displaystyle
n, \sqrt{n}, 2n
}
の数列を作っていて途中で
{\displaystyle
\frac{n\sqrt{n}}{\sqrt{n} \div 2} = 2n
}
という式が出来上がるなとなぜか途中で気づいたのでなんとなくしたくなったのでしますはい。

証明

{\displaystyle
\frac{n\sqrt{n}}{\sqrt{n} \div 2} = 2n
}

で、nというのは(\sqrt{n})^2である。

\sqrt{n}mに置き換えると、

{\displaystyle
\frac{m^3}{m \div 2} = 2m^2
}

という式となる。

\div2を消すために分母と分子に2をかけると

{\displaystyle
\frac{2m^3}{m} = 2m^2
}

となる。

あとは約分してあげて

{\displaystyle
2m^2 = 2m^2
}

Minecraft1.8のサーバーのtickの間隔を変更(tps変更)

今回は、Minecraft1.8のバニラサーバーのtick間隔を変更する方法を紹介します。

使用するソフト

変更方法

まず、Minecraftサーバーのjarファイルをzipファイルに変更します。
jarファイルはzipファイルの拡張子をjarに変更しただけなので拡張子を変更するだけでできます。

次に、そのzipファイルを解凍します。
色々出てくるのでその中のnet\minecraft\server\MinecraftServer.classバイナリエディタで開きます。

00000260行の09列目に32という値があるのでそれを変更します。
32という数値は16進数なので10進数で表すと50となっています。

変更が終わったら正常に変更できたかどうかを確認するためjd-guiでそのMinecraftServer.classを開いて、450行目あたりの値が変更した値になっているかどうか確認してください。

変更し終わったら再度圧縮してください。
ここで注意なのが、フォルダを圧縮してはいけません。ファイルたちを圧縮してください。
つまり、netフォルダの1つ前のファイル・フォルダ群をすべて選択して圧縮してください。

最後にできたzipファイルをjarファイルに変更して完了です。

突発でCODE RUNNER - 予選Bに参加してきた

突発でCODE RUNNNERの予選Bに参加してきました。
この記事も突発で書いた記事なので文章がおかしいかも...?

CODE RUNNERとは

どこまで全力で、走りきれるか!?
参加者全員が同時に対戦する、まったく新しいプログラミングコンテスト始動。どこまで全力で、走りきれるか。文字通り「マラソン」型のバトルです。最後まで勝ち続ける、アルゴリズムを実装し、日本一の学生プログラマに輝け!

ニコニコ生放送(予選B): CODE RUNNER 予選B 実況中継 - 2014/11/02 19:30開始 - ニコニコ生放送

参加の意図

暇だったので、「プログラミング」とニコニコ生放送で検索したらたまたまこの放送が引っかかり、「これ面白そう」と思ったので競技数分前に準備して参加しました。(なんでこんなタイミングに...って思われそう(笑))

NetBeansが偶然起動していたのでプロジェクト作ってクラス作って参加しました。

どんな感じのコードを書いたか

使った言語はもちろんJavaです。他のやつはわからないし時間の無駄だと思ったので使いませんでした。

まずは、とにかく点を取っておこうと無限ループ+sleep(1250)程度でattackしていました。
これでは点を取れないので、部屋が変わらない限りは

FOR (J = 0; J < 2; J++) {
 IF (J == 0) {
  攻撃するSKILLIDを1追加して攻撃。もし使ったやつが今まで使った中で一番攻撃力が高ければそのIDを保存。
 } ELSE {
  今まで使った中で一番攻撃力が戦ったIDで攻撃
 }
}

みたいな感じのコードで戦っていました。

しかし、このコードにはバグがあり、部屋が変わるとなんとダメージが通らなくなってしまうのです。(原因がよくわからなかった)
このバグが、新しいコードを作成している時に発覚したので5分くらいロスしましたし非常にめんどくさかったです...orz

最終的なソースコードは記事の最後に長いですが書いておきます。

トラブルの発生

22:30頃にAPIの受付が非常に悪くなり、TIMEOUTが頻発しました。
もちろん自分だけではなく、他の人も同じような現象が発生していました。
主催エンジニアチームが頑張って対応してくれたのですが、3,4回目で予選Bは打ち切られました...(結果は反映される模様)

まだいけると思ったのですがコードを書き終えた頃にはもう遅かったです...
次回やるのであれば改善してまたやって欲しいですね。

感想

この手の競技プログラミングは初めてですし、とても楽しかったです。
何の準備もせず突発でやったのもありますし、まだまだスキルが低いせいで順位は結構低めでしたorz

次回もあるのであればさっき書いたように、サーバーを改善してまだ戻ってきて欲しいです。
そして、その時には上位にいけるよう頑張りたいです。

書いたコード

クソコードですが...

CodeRunnerクラス(改善前のコード)
package coderunner;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;

public class CodeRunner {

  private final static String token = "token=CDVMX93YPR10ESUA9I4JNE9EK2VD23JF";

  private final static String attackURL = "https://game.coderunner.jp/attack?";

  private final static String infoGetURL = "https://game.coderunner.jp/info?";

  public static void main(String[] args) throws MalformedURLException, IOException, InterruptedException {
    for (int i = 0; i <= 99; i++) {
      HttpsURLConnection conn;
      URL url = new URL(attackURL + token + "&skill=" + i);
      conn = (HttpsURLConnection) url.openConnection();
      BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
      String str;
      while ((str = reader.readLine()) != null) {
        System.out.println(str);
      }
      System.out.print(",");
      System.out.println(getUserInfo());
      System.out.println("__-------------------------------__");
      Thread.sleep(1500);
    }
  }

  private static String beforeUserInfo;
  public static boolean changedRoom(String userInfo) throws IOException {
    if (beforeUserInfo == null)
      return false;
    if (beforeUserInfo != null && !getUserInfo().equals(beforeUserInfo)) {
      return true;
    }
    beforeUserInfo = getUserInfo();
    return false;
  }

  public static String getUserInfo() throws MalformedURLException, IOException {
    HttpsURLConnection conn;
    URL url = new URL(infoGetURL + token + "&filter=members&style=text");
    conn = (HttpsURLConnection) url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String str;
    while ((str = reader.readLine()) != null) {
      return reader.readLine();
    }
    return null;
  }
}
CodeRunnerV2クラス
package coderunner;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import javax.net.ssl.HttpsURLConnection;

public class CodeRunnerV2 {

  private final static String token = "token=CDVMX93YPR10ESUA9I4JNE9EK2VD23JF";

  private final static String attackURL = "https://game.coderunner.jp/attack?";

  private final static String infoGetURL = "https://game.coderunner.jp/info?";

  private final static HashMap<Integer, DamageList> map = new HashMap<>();

  private static int[] currentRoomDamageList = new int[100];

  private static int beforeRoomNum = -1;

  public static void main(String[] args) {
    while (true) {
      try {
        int maxDamage = 0;
        int maxDamageSkill = 0;
        //スキルをひと通り回す
        for (int i = 0; i < 100; i++) {
          Thread.sleep(1250);

          //SkillIDで攻撃
          int damage = attack(i);

          //最大ダメージを保存
          if (maxDamage < damage) {
            maxDamage = damage;
            maxDamageSkill = i;
            System.out.println("最大ダメージを発見: " + "S-" + i + " D-" + damage);
          }

          //与えたダメージをリストに保存
          if (i < 100) {
            currentRoomDamageList[i] = damage;
          }

          DamageList currentType = null;
          boolean kotei = false;
          //i==15の時にmapの中にあるリストと一致する場合は一番高いダメージを与え続けてそれ以外は最も高いダメージを探しつづける
          if (i == 15) {
            Iterator<DamageList> itDamageList = map.values().iterator();
            while (itDamageList.hasNext()) {
              DamageList damageList = itDamageList.next();
              if (damageList.allMatch(currentRoomDamageList)) {
                currentType = damageList;
                kotei = true;
              }
            }
          }
          //同じ部屋IDがmapに存在すればそれに固定
          Iterator<DamageList> itDamageList = map.values().iterator();
          while (itDamageList.hasNext()) {
            DamageList damageList = itDamageList.next();
            if (damageList.id == getRoom()) {
              currentType = damageList;
              kotei = true;
            }
          }

          //固定モード
          if (kotei == true) {
            //部屋が同じなら固定
            System.out.println("攻撃を固定しました");
            int beforeDamage = -1;
            while (true) {
              int damage_ = attack(currentType.maxDamageId);
              if (damage_ < beforeDamage) {
                break;
              }
              beforeDamage = damage_;
              System.out.println(getRoom());
              Thread.sleep(1250);
            }
            System.out.println("固定を解除しました");
            Thread.sleep(1250);
          } else { //記録モード
            if ((i > 30 && maxDamage > 1000) || i == 98) {
              LinkedList<Integer> l = new LinkedList<>();
              for (int n : currentRoomDamageList) {
                l.add(n);
              }
              DamageList dl = new DamageList();
              dl.damageList = l;
              dl.id = getRoom();
              dl.maxDamageId = maxDamageSkill;
              dl.maxDamage = maxDamage;
              map.put(i, dl);
              currentRoomDamageList = new int[100];
              System.out.println("履歴を記録しました: " + "最大ダメージ: " + maxDamage + "  最大ダメージスキルID: " + maxDamageSkill + l.toString());
              break;
            }
          }

          //部屋変更を検出
          if (changedRoom(getRoom())) {
            int ZEROCount = 0;
            for (int nnn : currentRoomDamageList) {
              if (nnn == 0)
                ZEROCount++;
            }
            if (ZEROCount < 85) {
              LinkedList<Integer> l = new LinkedList<>();
              for (int n : currentRoomDamageList) {
                l.add(n);
              }
              DamageList dl = new DamageList();
              dl.damageList = l;
              dl.id = getRoom();
              dl.maxDamageId = maxDamageSkill;
              dl.maxDamage = maxDamage;
              map.put(i, dl);
              currentRoomDamageList = new int[100];
              System.out.println("履歴を記録しました: " + "最大ダメージ: " + maxDamage + "  最大ダメージスキルID: " + maxDamageSkill + l.toString());
            }
            System.out.println("部屋変更検出");
            break;
          }
          System.out.println(getRoom());

        }
      } catch (InterruptedException | IOException e) {
        System.out.println("Time out OR ERROR!");
        currentRoomDamageList = new int[100];
        e.printStackTrace();
      }
    }
  }

  public static boolean changedRoom(int nowRoom) throws IOException {
    if (beforeRoomNum == -1) {
      beforeRoomNum = nowRoom;
      return false;
    }
    if (beforeRoomNum != nowRoom) {
      beforeRoomNum = nowRoom;
      return true;
    }
    beforeRoomNum = nowRoom;
    return false;
  }

  public static String getMembers() throws MalformedURLException, IOException {
    HttpsURLConnection conn;
    URL url = new URL(infoGetURL + token + "&filter=members&style=text");
    conn = (HttpsURLConnection) url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String str;
    while ((str = reader.readLine()) != null) {
      return reader.readLine();
    }
    return null;
  }

  public static int getRoom() throws MalformedURLException, IOException {
    HttpsURLConnection conn;
    URL url = new URL(infoGetURL + token + "&style=text&filter=you");
    conn = (HttpsURLConnection) url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String str;
    int c = 0;
    while ((str = reader.readLine()) != null) {
      if (c == 4) {
        return Integer.parseInt(str);
      }
      c++;
    }
    return -1;
  }

  public static int attack(int skillId) throws IOException {
    HttpsURLConnection conn;
    URL url = new URL(attackURL + token + "&skill=" + skillId);
    conn = (HttpsURLConnection) url.openConnection();
    conn.setReadTimeout(12500);
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String str;
    while ((str = reader.readLine()) != null) {
      int damage = Integer.parseInt(str);
      System.out.println("攻撃: " + "S-" + skillId + " D-" + damage);
      return damage;
    }
    return -1;
  }

}
DamageListクラス
package coderunner;

import java.util.LinkedList;

public class DamageList {

  public int id;
  
  public LinkedList<Integer> damageList;
  
  public int maxDamageId;
  
  public int maxDamage;
  
  public boolean allMatch(int[] damageList) {
    boolean f = true;
    for (int i = 0; i < 10; i++) {
      if (!(this.damageList.get(i) == damageList[i])) {
        f = false;
      }
    }
    return f;
  }
  
}

NetBeans+Java1.8 でScalaを使えない時の対処法

対象

この記事は以下の方を対象としています。

ant -f [Project Directory] run
init:
deps-jar:
[Project Directory]\nbproject\build-impl.xml:405: The following error occurred while executing this line:
[Project Directory]\nbproject\build-impl.xml:238: Unknown target 'jvm-1.8'
ビルド失敗(合計時間: 0秒)

原因

原因はよくわかっていません。
ただちょっと検索してみると
https://www.marshut.net/iuhyum/error-scala-netbeans.html
こんな内容が出てきました。

AntじゃなくてSBTかMaven使えと言われても...
変え方調べてみたけどわからない(´・ω・`)
仕方ないのでなんとかしようと行き着いたのが次の方法です。

解決方法

[Project Directory]\nbproject\build-impl.xml:238 が青くなっててクリックするとその場所が開くと思います。
その開いた場所(行)を

<scalac addparams=" -dependencyfile &quot;${basedir}/${build.dir}/.scala_dependencies&quot; @{addparams}" deprecation="${scalac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" extdirs="@{extdirs}" force="yes" fork="true" includes="@{includes}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="jvm-1.7" unchecked="${scalac.unchecked}">

に変えます。

変更点は、

  • -make:transitive を消した
  • target="jvm-${javac.target}" を target="jvm-1.7" にした。

この2点だけです。
なんで解決したかはわかりません。

まとめ

とりあえずこれで問題なくコンパイル・実行できる(ハズ)
根本的な原因はよくわかっていないので知っている人がいれば教えて下さい。

ITパスポートを受けてきました

今日、ITパスポートを受けてきました。
どんな感じだったのか書いていきます。

試験場に行く途中

車で送ってもらって試験会場に行きました。
この時はそこまでドキドキしてなかったのですが。。。

車の中ではITパスポートの参考本を軽く読んで行きました。

試験場についた~受験直前

当たり前ですがほとんどが高校生です。
これで落ちたら色々落ち込みそうな年齢層の集まりですな((((;゚Д゚))))ガクブル

この時になって結構ドキドキしてきました。
過去問の正答率は85%程度だったので自信はあったのですが、やっぱり心配だしドキドキします。
受付時間になって試験場に入って待合室で待機。

本人確認をして試験場となる部屋に入室。

試験時 - 小問

最初から、「ん?」となる問題が出てきてビビったので、「後で確認する(だったはず)」にチェックを入れてとりあえず次の問題に進んでいきました。

ストラテジの問題は、結構頭を使う問題が出てきて考えさせられました。どっちかというと記憶の正確性を問われていた気もしますが...w

マネジメントの問題は、小問に関しては特に難もなく解くことができました。

テクノロジ系の問題はほとんどが計算というより知識を問う問題ばかり&知っているものが多かったのですらすら解けました。

小問を解き終わり、見直しをしました。
見直しをするといくつか問題をちゃんと読んでいなかったところがあり、間違った選択をしている問題がありました。
その問題を修正して中問に挑みます。

試験時 - 中問

やはり中問は、考えさせられました。
ストラテジ・マネジメントの問題はしっかり問題文(左側の方)を読んで答えないと間違っていることがあるのでかなり読んで答えました。
テクノロジの問題は、どちらかと言うと問題文(右側の方)を読めば答えられる問題が多かったです。

最後にまた見直しをして、試験時間を60分ほど残して試験終了ボタンを押して試験が終了しました。

点数は...

f:id:wintermaples:20141025150139p:plain
合格基準点まではちゃんと到達していました。
マネジメントとテクノロジは700点以上ありますが、ストラテジがすごく低いですねw(ストラテジをちゃんと勉強しないとorz)
ストラテジも700点以上とったら総合720点以上行けたかもしれないですねー... 残念です。

まあ、合格基準点にはちゃんと到達出来ていたので喜びましょう(*^_^*)

今後

まだ正式な合格ではないのでなんとも言えないですが(ほぼ合格ですが)、受かったら今度が基本情報技術者試験を受けたいと思います。

難易度は調べてみると、少々高いようなので頑張って勉強したいと思います。



ITの知識があまりなくても勉強すれば取れる資格なので興味のある人は取ってみては?

CSS Design created by satotaka99. Thankyou.