そこに仁義はあるのか(仮)

略してそこ仁!

初心者大歓迎! webアプリを作ってみよう!勉強会のレポ起因にブログ書いてもらったからやってみた!!!

勉強会レポはこの記事
初心者大歓迎! webアプリを作ってみよう!勉強会に参加してSpring Bootさわってきた!!@ビズリーチ - そこに仁義はあるのか(仮)


で、追加で試してみたのはこの記事!!!
Spring Bootをやってみた — 裏紙
Spring BootのサンプルをGradle化した、けども…… — 裏紙
SpringBoot+Gradleでホットデプロイを使えるように - しおしお(´・ω・`)

続きを読む

初心者大歓迎! webアプリを作ってみよう!勉強会に参加してSpring Bootさわってきた!!@ビズリーチ

勉強会でビズリーチに行ってきたよ!

オフィス、芝生あるし海あるし、波の音するし、さえずり聞こえるし最高だった。
ちなみに、勉強会の内容は、SpringBootJavaで、twitterみたいなwebアプリを作ろう!って感じだったよ!

twitter廃人的に、ハッシュタグ欲しかった><

続きを読む

もう少し甘えても...いいですか////

このエントリーはしょぼちむ Advent Calendar 2014 - Adventarの25日目(ラスト!!!)の記事です!
24日目はうらがみさんのしょぼつむ #syobochim — 裏紙でした!!!

まさかのAdvent Calendar完走!!!そしてみなさんガチすぎ…!!:(;゙゚'ω゚'):

すごいものつくってくれた人がいたり、テストについて話してくれるひともいれば、チーム運用のはなししてくれるひともいたり、えっ!まさかこの人も書いてくれるの?!というサプライズいっぱいあり。。。
しょぼちむとはなんなのかを考える良い機会になりました(・−・)(真顔)

ネタあり真面目あり、技術ありネタありで、すごくすごく楽しい一ヶ月を

本当にありがとうございますーー!!!!!うおおおお!!!!!


みなさん、私にいろいろなことを教えてくれる!!!うれしいたのしいうれしい!!!!('ω'≡'ω'≡'ω'≡'ω')

そこで。。。。

もう少し甘えても...いいですか////

続きを読む

オレ、童貞捨てたよ。(AndroidとKotlinはじめてみた。)

(このエントリーはKotlin Advent Calendar 2014 - Adventarの21日目の記事です!)

24歳、このままKotlinをやらずに20代後半に足を踏み入れていいのか自問し、
ついにKotlin童貞を捨てる事にしました。
あと、ついでにAndroid童貞も捨てます。

しょぼちむ Advent Calendar 2014 - Adventarの12日目、[twitter:@grimrose]さんの
open build/reports/life/index.html: しょぼちむさんがKotlinをやらない理由を考えてみたの記事に、こう↓かいてあったので、とりあえずGitHub - JetBrains/kotlin: The Kotlin Programming Languageにスターつけるとこから始めた。

f:id:syobochim:20141221010447p:plain

f:id:syobochim:20141221010540g:plain

よし。いい滑り出しです。

続きを読む

JJUG CCC 2014 Fall でIntelliJ IDEAの使い方を教えてもらってきたよ! #jjug_ccc #jbugj

IntelliJ IDEA、Jが大文字なの最近知った…。
ブログ書くの相当のんびりしてしまった…。

JJUG CCC 2014 Fall - 日本Javaユーザーグループ | Doorkeeper
のイベントで、サムライズムの@さんによるIntelliJ IDEAのハンズオンがあったので、参加してきました!!

のんびりと2時からの参加だったよ!!

ハンズオンの資料はこちら!
丁寧に書いてあって、ハンズオン参加しなかった人もやってみると良いのではなかろうか!

yusuke/ideahandson · GitHub

続きを読む

JJUG CCC 2014 Fallの懇親会でLTしてきました! #jjug_ccc

参加レポは別で書くよん

BCELについて

Apache Commons BCEL™ -

BCELはClassファイルを解析するためのライブラリです!
findBugsでも使われていて、『このclassでこういうmethodを使用しているときにはbugを検知する』っていう解析ができる!

前に仕事で、findBugsの解析クラスを作成したことがあって、そのときにBCELを知りました!
今回のLTでは、クラスファイル名とメソッド名を調べるだけだったけど、
アクセス修飾子(publicなのかprivateなのか)のような、MethodやClassの属性を調べることもできる

ただし、開発自体は2006年でとまってる…(^p^)

f:id:syobochim:20141122160642p:plain

LT終わった後に、@さんにASM - Home Pageを教えてもらった!
こちらは、今も開発されているので、Java8環境での解析をする場合は、ASMの方がイイ!!らしい
ASMの話はまた別でする!*1

BCEL

準備

mavenリポジトリがある!
Maven Repository: org.apache.bcel » bcel » 5.2

ので、準備も簡単!

<dependency>
    <groupId>org.apache.bcel</groupId>
    <artifactId>bcel</artifactId>
    <version>5.2</version>
</dependency>

コードの解析

Classの取得

Classを取得したいときはこう書けばOK!

JavaClass javaClass = new ClassParser(<<解析したいClassファイルのファイルパス>>).parse();
Methodの取得

ClassファイルのMethodを取得して、Listとしてもつときはこう

List<Method> methods = Arrays.asList(javaClass.getMethods());

methodを一つ取得して、アクセス修飾子を調べたい場合はこう書けばいい

methods.get(1).isPrivate()
Codeの解析

↓こうかけば、javapしたときに表示される情報が一行ずつ詰まってるStreamができる*2

methods.stream()
 .map(Method::getCode)
 .map(code -> Utility.codeToString(code.getCode(), javaClass.getConstantPool(), 0, 1, false))
 .flatMap(s -> Arrays.stream(s.split("\n")))

↓この情報が入ってるよ!

173:  invokevirtual	java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;

ちなみに

を確認することができるよ!

ちなみに、LTしたときのソースはこんな感じでした!

import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.classfile.Utility;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class SyobochimJyoshiryokuDetector {
    static final String PATH = "/Users/syobochim/dev/gist/build/classes/main/jjugccc2014/";

    public static void main(String[] args) {
        File dir = new File(PATH);
        List<File> files = Arrays.asList(dir.listFiles());

        files.stream()
                .filter(File::isFile)
                .forEach(file -> {
                    try {
                        JavaClass javaClass = new ClassParser(file.getPath()).parse();
                        System.out.print(javaClass.getClassName() + " : ");
                        if (hasJyoshiryoku(javaClass)) {
                            System.out.println("女子力あります");
                        } else {
                            System.out.println("女子力ないです");
                        }
                        System.out.println();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
    }

    private static boolean hasJyoshiryoku(final JavaClass javaClass) {
        List<Method> methods = Arrays.asList(javaClass.getMethods());

        return methods.stream()
                .map(Method::getCode)
                .map(code -> Utility.codeToString(code.getCode(), javaClass.getConstantPool(), 0, 1, false))
                .flatMap(s -> Arrays.stream(s.split("\n")))
                .anyMatch(s -> s.matches(".*Syobochim\\.jyoshiryoku.*"));

    }
}

*1:本当はこの記事で話したかったんだけど、公式サイトがずっとつながらなかった(^q^)

*2:javapしたときの情報はJavaソースそのままの一行とは違うから注意!