メモ帳

やったこととかちまちまと書く 需要のない記事を生成している

JVM言語で正規表現してみた

レポートにC言語以外のプログラミング言語における正規表現の扱い方を調べてC言語と比較せよって項目があったのでJVM言語でやってみた

C言語 (今回実装する機能*1 )

#include <stdio.h>
#include <regex.h>

int main(int argv, char* args[]) {
    char str[] = "C言語で正規表現";
    char regex[] = "正規表現";
    regex_t preg;
    if (regcomp(&preg,regex, REG_EXTENDED | REG_NEWLINE ) != 0) {
        printf("Error");
        return 1;
    }

    if(!(regexec(&preg, str,0,NULL,0) != 0)) {
        printf("Match: %s\n",str);
    } else {
        printf("No Match: %s\n",str);
    }

    regfree(&preg);
    return 0;
}
参考

qiita.com

Java

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class Regex{
    public static void main(String args[]){
        String str = "Javaで正規表現";
        String regex = "正規表現";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        
        if(m.find()) {
            System.out.println("Match: " + str);
        } else {
            System.out.println("No Match: " + str);
        }
    }
}
matches,findの違いについて

codezine.jp

Scala

val s = "Scalaで正規表現"
val r = "正規表現".r

if(r.findFirstIn(s).nonEmpty)
    println("Match: " + s)
else 
    println("No Match: " + s)

Groovy

def str = "Groovyで正規表現"
if(str =~ "正規表現") {
    println str
}
参考

正規表現

Kotlin

fun main(arge: Array<String>) {
    val str = "Kotlinで正規表現"
    val regex = Regex("正規表現")
    if(regex.containsMatchIn(str))
        println("Match: " + str)
    else 
        println("No Match: " + str)
}
参考

qiita.com

Clojure

(def text "Clojureで正規表現")
(print (if (re-find #"正規表現" text) "Match: " "No Match: " ) text "\n")

(print (if (re-seq #"正規表現" text) "Match: " "No Match: " ) text "\n")

雑感

Kotlinを除き若い言語ほど正規表現を使うのが手軽になってきていると思った。(小並感)
正規表現は取っ付きづらいイメージがあったけど実際に使ってみるとそうでも無かった。パターンは書くのめんどくさいけど・・・
Groovyの

=~ 

は初めてみるやり方だったので感心した。Haskellとか他の言語にも実装されているらしいけどね。(正規表現を全く使わないので分からず)

*1:本当はしっかりパターンを記述するべきだろうけど・・・

Minecraft ModをKotlinで書いてみた

Gradleが使えるので簡単にMinecraftも動かせると思ったのでやってみた
kotlinlang.org

まだ考えて書けるレベルまでできてないので今回はこれで変換したコードを動かした
try.kotlinlang.org

対象のコード(初期のコードを変換させただけ、名前空間のところは削ったけど)

package com
import net.minecraft.init.Blocks
import net.minecraftforge.fml.common.Mod
import net.minecraftforge.fml.common.Mod.EventHandler
import net.minecraftforge.fml.common.event.FMLInitializationEvent

@Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION)
class ExampleMod {
  @EventHandler
  fun init(event:FMLInitializationEvent) {
    System.out.println("DIRT BLOCK >> " + Blocks.dirt.getUnlocalizedName())
  }
  companion object {
    const val MODID = "examplemod"
    const val VERSION = "1.0"
  }
}

Gradle
gist.github.com

英語サイト見るまでランタイムがないってことがわからずとても苦労した。
まだGradleの使い方が理解できてない・・・

iframeでJavaScriptを動的に実行する

(タイトルおかしいと思ったので編集しました)
iframeを用いてJavaScriptコードを動的実行する。
やり方は主に3つ(多分)あって、

document.write(content);

document.srcdoc=content;

document.appendChild(content);

がある。docは同じとは限らない。

write版

var doc = document.getElementById("iframe").contentWindow.document;
var content = 'console.log("Hello World!");';
doc.open();
doc.write('<div><script>' + content + '<\/script><\/div>');
doc.close();

srcdoc版

var doc = document.getElementById("iframe");
doc.srcdoc = '<div><script>console.log("Hello World!");<\/script><\/div>';

appendChild版

var script = document.createElement("script");
script.type = "text/javascript";
script.innerHTML = 'console.log("Hello World!")';
doc.body.appendChild(script);

write版とappendChildは直接iframe内のHTMLに挿入する感じ。対してsrcdoc版はタグの要素に入れるため生成後のHTMLコードを見ると汚いと感じるかもしれない。
"と'は使い分けていかないと動かないので注意

こういったことも可能らしい
ja.stackoverflow.com
個人的にはappendChild版が一番好き
パフォーマンスは知らない。
あとJSファイルを作成して追加する方法もできそう。