しんさんの出張所 はてな編 このページをアンテナに追加 RSSフィード

カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2015 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 |
2016 | 05 | 08 | 10 | 11 | 12 |

2016-12-04

[][][]超高速に初めるJAX-RS

ソースコードは一つだけ。設定ファイルは1行追加するだけ。それですぐにJAX-RSを動かせる。

JAX-RSはわからなくても大丈夫。JavaSEなのですぐ確認できる。

GradleまたはMaven環境さえあればよいのでNetBeansに限らないけど一応NetBeans説明していく。


Gradleまたはmavenの環境を用意する

NetBeansであればGradleはプラグインを入れる必要がある。今回はGradleでやってみる。

メニューの「ツール」−「プラグイン」から入れる。


プロジェクトの新規作成

メニューから「ファイル」−「新規プロジェクト」を選ぶ。

カテゴリで「Gradle」を選びプロジェクトは「Single Gradle Project」を選ぶ。


依存ライブラリの追加

プロジェクトツリーからBuilde Scripts/Project/build.gradleを開く。

以下の部分があるので

dependencies {
    // TODO: Add dependencies here ...
    // You can read more about how to add dependency here:
    //   http://www.gradle.org/docs/current/userguide/dependency_management.html#sec:how_to_declare_your_dependencies
    testCompile group: 'junit', name: 'junit', version: '4.10'
}

dependencies の中に

compile "org.glassfish.jersey.containers:jersey-container-jdk-http:2.24.1"

の1行を加える。

プロジェクトのリロード

プロジェクトツリーのルートアイコンを右クリックして「Reload Project」を選ぶ。


インクラスを作る

import java.net.URI;
import java.util.Scanner;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;

import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

public class Main {

    //サーバー起動
    public static void main(String[] args) {
        
        URI uri = UriBuilder.fromUri("http://localhost/").port(8080).build();
        ResourceConfig config = new ResourceConfig(Calc.class);
        JdkHttpServerFactory.createHttpServer(uri, config);

        //Enter押すまで待つ
        new Scanner(System.in).nextLine();

        System.exit(0);
    }

    //JAX-RSのコードをここに書く
    @Path("calc")
    public static class Calc {

        //http://localhost:8080/calc?a=1&b=2
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public int add(@QueryParam("a") int a, @QueryParam("b") int b) {
            return a + b;
        }
    }
}

サーバー起動

プロジェクトを実行する。F6でよい。


ブラウザ起動

上記のコードのコメント部分

        //http://localhost:8080/calc?a=1&b=2

ここをCTRL+クリックする。

ブラウザが起動して結果が表示される。

NetBeansでは文字列やコメントでURLぽいものがあればブラウザで開けるのでコメントで描いておくと楽。

2016-11-29

[][]libGDXの基礎19 CIMを使ってテクスチャロードを高速化する

http://qiita.com/shinsan68k/items/abf27ed60b0607ea24b0

今回はCIMフォーマットの説明です。これを使うと単純に高速化する、そう思って構わないです。

某ゲームのVer2.6で半分程度CIMにさしかえて画面ロードの切り替えが大幅に早くなっています。起動時間も1〜5秒は早くなりました。

2.7ではさらにCIM化が進み、起動時間はさらに短縮。採用前の2.5と比べると半分近くにまでなっています。

古めの端末の計測で30秒くらいの起動時間が15秒くらいと大幅に早くなっているのを確認しています。

2016-11-25

[][][]libGDX用SpriteStudioのプレイヤーgzip対応

コンバートしたアニメーションデータはJSONで出力されますが、これが実はとても大きいです。

そのため、gzip圧縮されたJSONの展開に対応しました。

ファイル名の最後に.gzまたは.gzipという拡張子を付けているとgzip圧縮とみなして展開します。

それ以外であれば今まで通りテキストとしてJSONをそのまま読み込みます。

https://github.com/shinsan68k/gdx-ssplayer

2016-11-23

[][][]libGDX用SpriteStudioのプレイヤーを公開

libGDX用SpriteStudioのプレイヤーを公開しました。

https://github.com/shinsan68k/gdx-ssplayer

サンプル画像はSpriteStudioのところにあったものをそのままいれてあります。

HTML5版をべた移植したものになっています。そのため機能が古く制限も多いです。

あらかじめJSONを生成しておいてください。


もともと1年前に作っていて途中でやめたものを引っ張り出して完成させたものですのでご勘弁を。

構成がほぼべた移植なのでSsAnimationやらSsSpriteやら使い勝手はlibGDXらしくないかと思います。

ネーミング的にも挙動的にもSpriteとも関係がありませんし、本来ならセル情報などをTextureRegionにするべきでしょう。

そのかわり挙動はHTML5版とほぼ同じはずです。



SpriteStudioは、株式会社ウェブテクノロジの登録商標です。

2016-11-20

[][]libGDXの基礎18 Pixmapで動的にテクスチャを作る

libGDXの基礎18 Pixmapで動的にテクスチャを作る

http://qiita.com/shinsan68k/items/13a6a0d1b3a4c2844192

わりと重要そうなPixmapの説明をしていなかった気がしたので書いてみました。

今まで直接は利用していなかったけど、画像ファイルからテクスチャ転送する際に間接的に利用していたのです。

2016-10-16

[][]NetBeans 8.2の新機能SQLプロファイリング

NetBeans 8.2の目立機能はPHP7対応とJavascriptがES6やES7対応などの強化。

JavaはJava9対応が目玉となり、バージョンも本来9.0だったのだが、遅れたため、8系としてリリースされた。


数少ないJavaの新機能の一つではあるが、非常に有効なものなので画像多めで紹介した。

http://qiita.com/shinsan68k/items/8e9ce7c17a396d391480

qiitaにNetBeans関係を書いたのは初か。

2016-10-12

[][]libGDXの基礎17 テキスト描画 FreeTypeFontGeneratorを使う

今回は文字の描画。日本語の描画のほか、縁取りや影を落としてみたりもしている。

http://qiita.com/shinsan68k/items/7d99bac60b519f124298

かなり重要度の高い項目。使いかたは簡単なのでガンガン使おう。

ちなみに古いバージョンでは使い方が全く違ううえに、利用もかなりしづらいものだったので無視してよい。

2016-10-09

[][]libGDXの基礎16 MathUtils

今回はMathUtilsの紹介です。

http://qiita.com/shinsan68k/items/4373de59dd067ce867fb

メソッドはいろいろとありますが浮動小数点のイコール判定と2のべき乗、ランダムのみ取り上げました。

値を範囲内に収めるclampあたりもよく使うでしょうか。

javadocはこちらです。

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/MathUtils.html

2016-08-21

[][]libGDXの基礎15 NinePatchを使う

今回はNinePatch(ナインパッチ)の使い方です。

原理的には難しくなくて、ただ引き延ばす場所を指定するだけです。ナインパッチという名前は知らなくても大昔にHTMLテーブルレイアウトして使っていた人は多いのではないでしょうか。

http://qiita.com/shinsan68k/items/5b9c9981fbcdbb49a8af

qiitaで前回から1年以上たってしまいましたが、少しずつでも書いていけたらと。

横線入れると一区切りになるというスライドモードにも章単位で対応してみました。

完全にスライド用にはしていないです。というか文字の大きさ固定とかコード全部載せてるやつなので無理です。

一部分のみではなく、完全なソースコードがあるので従来通り下にスクロールして読む方がいいとは思いますが。

2016-05-12

[][]Thymeleaf 3.0を試す その3 ユーティリティを作る

Thymeleaf 3.0を試す

Thymeleaf 3.0を試す その2 エスケープの有無

の続き。

今までパラメータとして文字列しか渡していませんでしたが、もちろん数値も扱えます。

〜
        String template = "[[${a}]] + [[${b}]] = [[${a+b}]]";

〜

        Map<String, Object> params = new HashMap<>();
        params.put("a", 1000);
        params.put("b", 20000);
〜

計算もView側でできるのがわかりますね。

実行結果

1000 + 20000 = 21000

3桁区切り

3ケタごとに区切り文字を入れたいというのはよくあることです。もちろんそれも標準で用意はされてはいます。一応。

〜
        String template = "[[${#numbers.formatInteger(a+b, 1, 'DEFAULT')}]]";
〜

実行結果

21,000

一応と書いたのは、見てわかる通りあほみたいに長いのが原因です。

実行しないとこのミスはわからないしこんなのいちいち書いてられないと思います。書いていたらおかしいと思わないといけませんよね。


オレオレutil

というわけで作ります。まずシンプルに何も考えず現在できる仕組みの中で考えてみましょう。

        //----------------------------------------------------------------------
        //追加したいユーティリティ
        //----------------------------------------------------------------------
        class OreOreUtil {
            public String num(int num){
                NumberFormat nf = NumberFormat.getInstance();
                return nf.format(num);
            }
        }
〜
        String template = "[[${oreore.num(a+b)}]]";
〜
        Map<String, Object> params = new HashMap<>();
        params.put("a", 1000);
        params.put("b", 20000);
        params.put("oreore", new OreOreUtil());
〜

実行結果

21,000

まずはこれで十分だと思います。しいて言えばユーティリティなのかパラメータなのかどうかがわかりにくいです。パラメータとして渡していますので。「#」は予約されていてパラメータの名前として使えないのでこうなります。

が、命名規則でどうにでもなるとは思いますので気になる人だけ次に進むとよいでしょう。

複雑化させる仕組みは必須ではないと思います。


まじめに実装する

dialectという拡張する仕組みがどうやらあるぽいです。全ソースコードを載せます。

import java.text.NumberFormat;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.context.IContext;
import org.thymeleaf.context.IExpressionContext;
import org.thymeleaf.dialect.IExpressionObjectDialect;
import org.thymeleaf.expression.IExpressionObjectFactory;

public class Thymeleaf3 {

    public static void main(String[] args) {

        //----------------------------------------------------------------------
        //追加したいユーティリティ
        //----------------------------------------------------------------------
        class OreOreUtil {
            public String num(int param){
                NumberFormat nf = NumberFormat.getInstance();
                return nf.format(param);
            }
        }
        
        //----------------------------------------------------------------------
        //「#oreore」という名前でOreOreUtilにアクセスさせるためのしくみ
        //----------------------------------------------------------------------
        class OreOreDialect implements IExpressionObjectDialect{
            
            final static String KEY = "oreore";
            
            final Set<String> names = new HashSet<String>(){
                {add(KEY);}
            };
            
            @Override
            public IExpressionObjectFactory getExpressionObjectFactory() {
                return new IExpressionObjectFactory() {
                    
                    @Override
                    public Set<String> getAllExpressionObjectNames() {
                        return names;
                    }

                    @Override
                    public Object buildObject(IExpressionContext context, String expressionObjectName) {
                        if(KEY.equals(expressionObjectName)){//名前が一致したなら
                            return new OreOreUtil();
                        }
                        return null;
                    }

                    @Override
                    public boolean isCacheable(String expressionObjectName) {
                        return true;
                    }
                };
            }

            @Override
            public String getName() {
                return "OreOreUtilDialect";
            }
        }
        
        //----------------------------------------------------------------------
        //ここから下が実行
        //----------------------------------------------------------------------
        
        
        //準備
        TemplateEngine engine = new TemplateEngine();
        //オレオレ設定追加
        engine.addDialect(new OreOreDialect());


        String template = "[[${#oreore.num(a+b)}]]";


        Map<String, Object> params = new HashMap<>();
        params.put("a", 1000);
        params.put("b", 20000);

        IContext context = new Context(Locale.getDefault(), params);

        //生成
        String result = engine.process(template, context);

        //出力
        System.out.println(result);
    }
}

実行結果は同じです。

21,000

#oreore.num()でアクセスできているのがわかりますね。