오늘 심각한 고민을 했습니다  ... 자바는 그냥 갔다 버려야되나..


Parallel Python 이거 써보고 할말을 잃었습니다. 생각보다 너무 쉽고.


Parallel Python을 사용하기 위해서는 대략 다음 절차를 수행하시면 됩니다.



연산을 하려는 노드, Master노드에 Parallel Python 설치(http://www.parallelpython.com/) [현재 저같은경우 Python 2.7을 사용하고 있습니다.]


그다음 연산하려는 모든 노드에서 네트웍 대역이 같다면, ppserver.py -a (이 의미는 실제 코드 설명할때 설명0


그리고 마스터 노드에서 병렬처리할 코드를 작업하시면 됩니다.


큰틀은 다음과 같습니다. 


가장 중요한 부분은 ppserver= ppservers=("*",) 입니다. 앞에서 ppserver.py -a  한이유와 같은데, 만약 같은 네트워크 대역폭에 있으면 알아서 감지합니다. 


 job_server.submit(mysum,(100,),callback=sum.result) 


실행할 함수?, 그리고 Parameter, 콜백 함수 입니다. 


만약 이럴경우, 병렬로 돌릴때 그 모듈이 돌아가기 위해 필요한 모듈이 있다고 가정할대, 예를들명 mysum을 연산할때 파이선의 math 모듈이 반드시 필요하다 그럴경우에는 modules = ("math","sys")와 같이 파라메터를 넣어주시면 됩니다.


파이썬이 이렇게 강력할줄이야.. 




import sys,thread
import pp
class myTest:
def __init__(self):
self.value=0
self.lock = thread.allocate_lock()

def result(self, value):
self.lock.acquire()
self.value += value
self.lock.release()


def mysum(n):
result=0
for i in range(1,1000):
result+=i
return result



sum = myTest()

ppserver= ppservers=("*",)

job_server = pp.Server(ppservers=ppservers)
job1 = job_server.submit(mysum,(100,),callback=sum.result)

job_server.print_stats()

job_server.wait()

print "result is "+str(sum.value)

job_server.print_stats()


저작자 표시 비영리 변경 금지
신고
  1. Favicon of http://navisphere.net BlogIcon 룬룬 2016.01.03 15:19 신고

    오늘은 드디어 아는 뭔가가 나와서 반가운 마음이 드네요.
    먼저 복 많이 받으시고요. :) 늘 은은히 이어가는 인연이 즐겁습니다.

    저는 전공이 컴퓨터비전, 패턴인식, 머신러닝에 가까운 사람입니다.
    파이썬도 많이들 쓰더라구요. 아마 MATLAB이 유료이기에 그 대안으로 사용되는 분위기가 아니었나 싶습니다.

    저 또한 처음에는 고가의 MATLAB에서 벗어나보고자 배우기 시작한 것이 Python이고 말씀하신 부분, 그 명쾌하게 한줄로 해결되는 듯한 그 부분에 인상이 깊은 언어로 남아있습니다. 배우기 쉽고 수천의 이미 준비된 라이브러리들.. 그렇지 않을 수가 없었죠. :)

    병렬처리라고 하면 제 머릿속에서는 GPU를 이용한 것들이 먼저 떠오르는데 써주신 Parallel Python은 MPI 같은 환경을 말하는 것인가봅니다.
    어쨌든 Python의 편리함은 부정할 수 없는 것 같고요.

    개인적으로 조금 배우고 써보면서 느낀 점을 단 점 위주로 말씀드려보고자 합니다. 사용하실 때 감안을 해보면 좋을 것 같습니다.
    분야 때문에 환경이 좀 다를 수도 있을 것 같기도 해요.

    1. 빠른 결과를 보기 위한 실험용으로는 최적입니다.
    말씀드렸듯 이미 준비된 모듈들이 너무나도 많습니다. 단순 wrapper들도 많고요.

    2. 짜임새 있는 구조로 아름다운 코드를 만들기는 힘든 것 같습니다.
    제가 실력이 모자라 그런 느낌을 받았을 수도 있는데, 스크립트 언어 특성상 그 부분에 이르러서야 오류가 나기 때문에 아까운 시간들을 놓칠 때가 많습니다.
    단순 문법이나 사용상 오류들을 잡는데 시간을 많이 보냈던 것 같습니다. C/C++에서는 빌드조차 안될 것 같은 그런 오류들 말이에요.
    모듈간 연동시에도 크게 검사 과정이 없기 때문에 코드의 크기가 커질 수록 다루기가 힘든 물건이 되어버리는 것 같습니다.

    3. Type 문제
    제게는 이것이 가장 큰 문제로 다가왔습니다.
    사용하다보면 Numpy 등에서 새로 정의된 Type들을 사용하게 되는데, 이것과 기존 Type 혹은 다른 모듈의 Type들이 혼용되기 시작하면 사람이 이를 다루지 못하는 시기가 오게 됩니다.
    C/C++에서는 강력한 Type 검사를 통해 막아주고 있는 부분인데요, MATLAB등은 Matrix, Cell, Dictionary 정도로 제한이 되고 있는 부분이고요.


    아마 지금은 첫줄 같은 고민을 하시긴 해도, 결국 Java를 선택하는 날이 오시리라 믿습니다.


    그럼에도 매력적인 언어임에는 틀림이 없는 것 같습니다.
    어차피 도구니까요. 적절한 목적에 잘 사용하면 되겠죠. :D

    어제 동생과 이야기하다가 나온 것인데,
    Perl 같은 스크립트가 커지면 Python정도로 확장했다가 더 큰 규모가 필요해지면 기존 언어로 가는게 적절한 순서가 아닐까 싶네요.


    오늘은 살짝 넘어서 이야기한 것 같나요? 아는게 나오니 신이 나서... 넓은 마음으로 봐주시고요. :)
    휴일에도 공부하시는 모습에 박수를 보냅니다. 짝짝짝.


    • Favicon of http://redeyesofangel.tistory.com BlogIcon Yuika eizt 2016.01.03 15:43 신고

      새해 복 많이 받으세요 :)

      생각해보면 가벼운 MPI 같은 느김이 맞을것 같습니다. 저 같은 경우는 MPI같은 것과는 거리가 멀고(아마..) (대강들어본적은 있습니다... 학교 다닐대 배울기회가 있었지만,, 수업이 빡세다고해서.. 선택을 안했지만요..)

      요즘에는 학교에서 나와서 빅데이터를 처리하는데 사용하는 Hadoop(MapReduce,Hbase, Hive ...) 안에 있는것들과 Storm 이런 위주로 사용하고 있네요..

      그러다 보니, 가끔식 어떤 데이터들을 처리할대 한개 컴퓨터에서 돌릴때 약간쫌 꼼수로 MapReduce로 나누어서 돌리거나 그러는데... 약간 사이비이네요. 너무 불편했는데,, 어제 파이선이 보이는것입니다..

      사실 어제는 신기했는데,, 전 이걸 그대로 쓰려는게 아니라 제가 하고 싶은 작업에 응용을 해보고 싶은데.. 별로 재밌게 진행되지는 않는것 같네요..

      어디선가 잘 안돌아가는것 같은데..사실 중간중간 검증하면서 하고 든요.. 에러를 내보내는 상황도 아니라서 약간은 애매하네요

      편리하지만 말씀해주신 것들은 염두해 두고 ,, 사용해 봐야겠네요 ㅎㅎ

      감사합니다. :)

몇가지 처리해야할 작업이 있습니다. 


몇 가지 케이스에 대해 계속 테스트를 해보고 있지만. 이걸 Hadoop MapReduce로 처리하는것은 정말 성능이 안나오더군요. 흔히 말한는 반복적인 작업... 이걸 Storm, 또는 Spark를 통해 해결해 보고 싶지만. 현재 사정상 신규아키텍처를 도입하는데 문제가 있어서... 


물론,,, 현재 환경은 HDP(Hortonworks Data Platform)2.3 이기 때문에, 설치하거나 실행하는데, 문제는 아닙니다. Storm 같은경우 Topology를 만들면 되겠지만.. 약간 제가 생각하는 작업에는 불리할것 같고.. Spark쪽은 아직 제가 지식이 부족해서 시간대비 성과가 부족할것 같은 생각 때문입니다.


물론, 전 아직까지는 언어중에 Java가 좋지만, 요즘 왠만한 귀찮은 작업들은 Python으로 하고 있었는데(사실 과거에는 Perl도 배워보고 싶엇지만..) 너무 강력해서 계속 쓰게 되네요. 솔찍히 Java로 10줄 만들걸 파이선으로 3줄이면 표현이 되거든요..


사실 이렇게 하다가 고민이 생겼습니다. 다중 노드(현재 저 같은 경우는 10노드 + 추가 2노드) Produce Consumer 패턴?으로 로 작업을 병렬로 처리해보고 싶었는데, 이걸 프로그램으로 하나하나 만들기도 모하고,, 이러저런 고민이 많았는데,,


파이선이 해결해 주었네요 http://www.parallelpython.com/ 몇가지 고민은 Master Node에서 Slave 노드로 작업을 어떻게 넘겨주느냐 여부인데,, 자체적인 Queue가 있는것인지, 아님 외부 Queue를 이용해야하는지 봐봐야겠네요..


지금 RabbitMQ와 Kafaka를 동시에 보고 있는데,,, 제가 제대로 알고 있다면 Kafakfa는 Consumer에게 전달된 메세지가 어떤것인지에 대한 보장??꼭 UDP같은 성격이라... 의 문제가 있어서... 텍스트들을 보다 보면,, 케이스에 따라서는 RabbitMQ를 추천하시더군요 


일단은 이번포스팅의 목적은 파이선에서 병렬 처리를 쉽게 해주는 방법이 있는데,, 그것은 parallel python 입니다.


파이썬 짱짱,, 

저작자 표시 비영리 변경 금지
신고


저작자 표시 비영리 변경 금지
신고

reference : https://svn.apache.org/repos/asf/hbase/branches/0.20_on_hadoop-0.18.3/src/examples/thrift/DemoClient.java



package org.apache.hadoop.hbase.thrift;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.security.PrivilegedExceptionAction;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.security.auth.Subject;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import javax.security.auth.login.LoginContext;
import javax.security.sasl.Sasl;

import org.apache.hadoop.hbase.thrift.generated.AlreadyExists;
import org.apache.hadoop.hbase.thrift.generated.ColumnDescriptor;
import org.apache.hadoop.hbase.thrift.generated.Hbase;
import org.apache.hadoop.hbase.thrift.generated.Mutation;
import org.apache.hadoop.hbase.thrift.generated.TCell;
import org.apache.hadoop.hbase.thrift.generated.TRowResult;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSaslClientTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

/**
 * See the instructions under hbase-examples/README.txt
 */
public class DemoClient {

    static protected int port;
    static protected String host;
    CharsetDecoder decoder = null;

    private static boolean secure = false;

    public static void main(String[] args) throws Exception {

        if (args.length < 2 || args.length > 3) {

            System.out.println("Invalid arguments!");
            System.out.println("Usage: DemoClient host port [secure=false]");

            System.exit(-1);
        }

        port = Integer.parseInt(args[1]);
        host = args[0];
        if (args.length > 2) {
          secure = Boolean.parseBoolean(args[2]);
        }

        final DemoClient client = new DemoClient();
        Subject.doAs(getSubject(),
          new PrivilegedExceptionAction<Void>() {
            @Override
            public Void run() throws Exception {
              client.run();
              return null;
            }
          });
    }

    DemoClient() {
        decoder = Charset.forName("UTF-8").newDecoder();
    }

    // Helper to translate byte[]'s to UTF8 strings
    private String utf8(byte[] buf) {
        try {
            return decoder.decode(ByteBuffer.wrap(buf)).toString();
        } catch (CharacterCodingException e) {
            return "[INVALID UTF-8]";
        }
    }

    // Helper to translate strings to UTF8 bytes
    private byte[] bytes(String s) {
        try {
            return s.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

    private void run() throws Exception {
        TTransport transport = new TSocket(host, port);
        if (secure) {
          Map<String, String> saslProperties = new HashMap<String, String>();
          saslProperties.put(Sasl.QOP, "auth-conf,auth-int,auth");
          /**
           * The Thrift server the DemoClient is trying to connect to
           * must have a matching principal, and support authentication.
           *
           * The HBase cluster must be secure, allow proxy user.
           */
          transport = new TSaslClientTransport("GSSAPI", null,
            "hbase", // Thrift server user name, should be an authorized proxy user.
            host, // Thrift server domain
            saslProperties, null, transport);
        }

        transport.open();

        TProtocol protocol = new TBinaryProtocol(transport, true, true);
        Hbase.Client client = new Hbase.Client(protocol);

        byte[] t = bytes("demo_table");

        //
        // Scan all tables, look for the demo table and delete it.
        //
        System.out.println("scanning tables...");
        for (ByteBuffer name : client.getTableNames()) {
            System.out.println("  found: " + utf8(name.array()));
            if (utf8(name.array()).equals(utf8(t))) {
                if (client.isTableEnabled(name)) {
                    System.out.println("    disabling table: " + utf8(name.array()));
                    client.disableTable(name);
                }
                System.out.println("    deleting table: " + utf8(name.array()));
                client.deleteTable(name);
            }
        }

        //
        // Create the demo table with two column families, entry: and unused:
        //
        ArrayList<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
        ColumnDescriptor col;
        col = new ColumnDescriptor();
        col.name = ByteBuffer.wrap(bytes("entry:"));
        col.timeToLive = Integer.MAX_VALUE;
        col.maxVersions = 10;
        columns.add(col);
        col = new ColumnDescriptor();
        col.name = ByteBuffer.wrap(bytes("unused:"));
        col.timeToLive = Integer.MAX_VALUE;
        columns.add(col);

        System.out.println("creating table: " + utf8(t));
        try {
            client.createTable(ByteBuffer.wrap(t), columns);
        } catch (AlreadyExists ae) {
            System.out.println("WARN: " + ae.message);
        }

        System.out.println("column families in " + utf8(t) + ": ");
        Map<ByteBuffer, ColumnDescriptor> columnMap = client.getColumnDescriptors(ByteBuffer.wrap(t));
        for (ColumnDescriptor col2 : columnMap.values()) {
            System.out.println("  column: " + utf8(col2.name.array()) + ", maxVer: " + Integer.toString(col2.maxVersions));
        }

        Map<ByteBuffer, ByteBuffer> dummyAttributes = null;
        boolean writeToWal = false;

        //
        // Test UTF-8 handling
        //
        byte[] invalid = {(byte) 'f', (byte) 'o', (byte) 'o', (byte) '-',
            (byte) 0xfc, (byte) 0xa1, (byte) 0xa1, (byte) 0xa1, (byte) 0xa1};
        byte[] valid = {(byte) 'f', (byte) 'o', (byte) 'o', (byte) '-',
            (byte) 0xE7, (byte) 0x94, (byte) 0x9F, (byte) 0xE3, (byte) 0x83,
            (byte) 0x93, (byte) 0xE3, (byte) 0x83, (byte) 0xBC, (byte) 0xE3,
            (byte) 0x83, (byte) 0xAB};

        ArrayList<Mutation> mutations;
        // non-utf8 is fine for data
        mutations = new ArrayList<Mutation>();
        mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("entry:foo")),
            ByteBuffer.wrap(invalid), writeToWal));
        client.mutateRow(ByteBuffer.wrap(t), ByteBuffer.wrap(bytes("foo")),
            mutations, dummyAttributes);


        // this row name is valid utf8
        mutations = new ArrayList<Mutation>();
        mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("entry:foo")), ByteBuffer.wrap(valid), writeToWal));
        client.mutateRow(ByteBuffer.wrap(t), ByteBuffer.wrap(valid), mutations, dummyAttributes);

        // non-utf8 is now allowed in row names because HBase stores values as binary

        mutations = new ArrayList<Mutation>();
        mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("entry:foo")), ByteBuffer.wrap(invalid), writeToWal));
        client.mutateRow(ByteBuffer.wrap(t), ByteBuffer.wrap(invalid), mutations, dummyAttributes);


        // Run a scanner on the rows we just created
        ArrayList<ByteBuffer> columnNames = new ArrayList<ByteBuffer>();
        columnNames.add(ByteBuffer.wrap(bytes("entry:")));

        System.out.println("Starting scanner...");
        int scanner = client.scannerOpen(ByteBuffer.wrap(t), ByteBuffer.wrap(bytes("")), columnNames, dummyAttributes);

        while (true) {
            List<TRowResult> entry = client.scannerGet(scanner);
            if (entry.isEmpty()) {
                break;
            }
            printRow(entry);
        }

        //
        // Run some operations on a bunch of rows
        //
        for (int i = 100; i >= 0; --i) {
            // format row keys as "00000" to "00100"
            NumberFormat nf = NumberFormat.getInstance();
            nf.setMinimumIntegerDigits(5);
            nf.setGroupingUsed(false);
            byte[] row = bytes(nf.format(i));

            mutations = new ArrayList<Mutation>();
            mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("unused:")), ByteBuffer.wrap(bytes("DELETE_ME")), writeToWal));
            client.mutateRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), mutations, dummyAttributes);
            printRow(client.getRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), dummyAttributes));
            client.deleteAllRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), dummyAttributes);

            // sleep to force later timestamp
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // no-op
            }

            mutations = new ArrayList<Mutation>();
            mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("entry:num")), ByteBuffer.wrap(bytes("0")), writeToWal));
            mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("entry:foo")), ByteBuffer.wrap(bytes("FOO")), writeToWal));
            client.mutateRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), mutations, dummyAttributes);
            printRow(client.getRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), dummyAttributes));

            Mutation m;
            mutations = new ArrayList<Mutation>();
            m = new Mutation();
            m.column = ByteBuffer.wrap(bytes("entry:foo"));
            m.isDelete = true;
            mutations.add(m);
            m = new Mutation();
            m.column = ByteBuffer.wrap(bytes("entry:num"));
            m.value = ByteBuffer.wrap(bytes("-1"));
            mutations.add(m);
            client.mutateRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), mutations, dummyAttributes);
            printRow(client.getRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), dummyAttributes));

            mutations = new ArrayList<Mutation>();
            mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("entry:num")), ByteBuffer.wrap(bytes(Integer.toString(i))), writeToWal));
            mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("entry:sqr")), ByteBuffer.wrap(bytes(Integer.toString(i * i))), writeToWal));
            client.mutateRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), mutations, dummyAttributes);
            printRow(client.getRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), dummyAttributes));

            // sleep to force later timestamp
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // no-op
            }

            mutations.clear();
            m = new Mutation();
            m.column = ByteBuffer.wrap(bytes("entry:num"));
            m.value= ByteBuffer.wrap(bytes("-999"));
            mutations.add(m);
            m = new Mutation();
            m.column = ByteBuffer.wrap(bytes("entry:sqr"));
            m.isDelete = true;
            client.mutateRowTs(ByteBuffer.wrap(t), ByteBuffer.wrap(row), mutations, 1, dummyAttributes); // shouldn't override latest
            printRow(client.getRow(ByteBuffer.wrap(t), ByteBuffer.wrap(row), dummyAttributes));

            List<TCell> versions = client.getVer(ByteBuffer.wrap(t), ByteBuffer.wrap(row), ByteBuffer.wrap(bytes("entry:num")), 10, dummyAttributes);
            printVersions(ByteBuffer.wrap(row), versions);
            if (versions.isEmpty()) {
                System.out.println("FATAL: wrong # of versions");
                System.exit(-1);
            }

            List<TCell> result = client.get(ByteBuffer.wrap(t), ByteBuffer.wrap(row), ByteBuffer.wrap(bytes("entry:foo")), dummyAttributes);
            if (!result.isEmpty()) {
                System.out.println("FATAL: shouldn't get here");
                System.exit(-1);
            }

            System.out.println("");
        }

        // scan all rows/columnNames

        columnNames.clear();
        for (ColumnDescriptor col2 : client.getColumnDescriptors(ByteBuffer.wrap(t)).values()) {
            System.out.println("column with name: " + new String(col2.name.array()));
            System.out.println(col2.toString());

            columnNames.add(col2.name);
        }

        System.out.println("Starting scanner...");
        scanner = client.scannerOpenWithStop(ByteBuffer.wrap(t), ByteBuffer.wrap(bytes("00020")), ByteBuffer.wrap(bytes("00040")), columnNames, dummyAttributes);

        while (true) {
            List<TRowResult> entry = client.scannerGet(scanner);
            if (entry.isEmpty()) {
                System.out.println("Scanner finished");
                break;
            }
            printRow(entry);
        }

        transport.close();
    }

    private void printVersions(ByteBuffer row, List<TCell> versions) {
        StringBuilder rowStr = new StringBuilder();
        for (TCell cell : versions) {
            rowStr.append(utf8(cell.value.array()));
            rowStr.append("; ");
        }
        System.out.println("row: " + utf8(row.array()) + ", values: " + rowStr);
    }

    private void printRow(TRowResult rowResult) {
        // copy values into a TreeMap to get them in sorted order

        TreeMap<String, TCell> sorted = new TreeMap<String, TCell>();
        for (Map.Entry<ByteBuffer, TCell> column : rowResult.columns.entrySet()) {
            sorted.put(utf8(column.getKey().array()), column.getValue());
        }

        StringBuilder rowStr = new StringBuilder();
        for (SortedMap.Entry<String, TCell> entry : sorted.entrySet()) {
            rowStr.append(entry.getKey());
            rowStr.append(" => ");
            rowStr.append(utf8(entry.getValue().value.array()));
            rowStr.append("; ");
        }
        System.out.println("row: " + utf8(rowResult.row.array()) + ", cols: " + rowStr);
    }

    private void printRow(List<TRowResult> rows) {
        for (TRowResult rowResult : rows) {
            printRow(rowResult);
        }
    }

    static Subject getSubject() throws Exception {
      if (!secure) return new Subject();

      /*
       * To authenticate the DemoClient, kinit should be invoked ahead.
       * Here we try to get the Kerberos credential from the ticket cache.
       */
      LoginContext context = new LoginContext("", new Subject(), null,
        new Configuration() {
          @Override
          public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
            Map<String, String> options = new HashMap<String, String>();
            options.put("useKeyTab", "false");
            options.put("storeKey", "false");
            options.put("doNotPrompt", "true");
            options.put("useTicketCache", "true");
            options.put("renewTGT", "true");
            options.put("refreshKrb5Config", "true");
            options.put("isInitiator", "true");
            String ticketCache = System.getenv("KRB5CCNAME");
            if (ticketCache != null) {
              options.put("ticketCache", ticketCache);
            }
            options.put("debug", "true");

            return new AppConfigurationEntry[]{
                new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule",
                    AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
                    options)};
          }
        });
      context.login();
      return context.getSubject();
    }
}

reference : https://svn.apache.org/repos/asf/hbase/branches/0.20_on_hadoop-0.18.3/src/examples/thrift/DemoClient.java


저작자 표시 비영리 변경 금지
신고

최근에 학교에서 이런저런것을 진행하면서 자바로 무엇인가 만들때는, 쌩으로 짜지 않고 최대한 라이브러리를 이용하려고 하고 있습니다.(일딴 검증되었으니까,.?,, 제가 짜면 괜히 느려질것 같은 그런 문제점도..) 


물론 JVM위에서 돌아가기때문에 C언어 같은 네이티브에 가까운 속도의 문제를 기대하는건 아니지만. (사실은 어떻게 하다보니.. 자바를 쓰다보니까.. 익숙해져서요..)


보통의 자바책의 맨 뒷장(예를 들어 학교 학부과정에서 쓸만한 책들,, 정말 래퍼런스 책말고..)에 보면 보통 가장 많이 나오는것중 하나가 MySQL을 이용한 프로그램 예제들입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.sql.*;
 
public class MyDBHelper {
 
 public static void main(String[] args) {
  
  Connection conn;
  Statement stmt;
  
  try {
   Class.forName("com.mysql.jdbc.Driver");
  }catch(ClassNotFoundException e) {
   System.err.print("ClassNotFoundException: ");
  }
  
  try {
   String jdbcaAddress = "jdbc:mysql://localhost:3306/mydb";l
   String id = "user";
   String pass = "userpasswd";
   
   conn = DriverManager.getConnection(jdbcUrl, Id, pass)
   
   stmt = conn.createStatement();   
   
   
   stmt.close();

   conn.close();
  }catch(SQLException e) {
   System.out.println("SQLException: " + e.getMessage());
  } 
 }
}


흔히 말하면, 이런식의 예제였죠... 그런데 요즘 이런저런것을 찾다가 Apache Commons 라는것을 알게되었습니다. 여기서 DButils라는 패키지를 제공하는데 https://commons.apache.org/proper/commons-dbutils/

한예로 들면 이곳에서 제공하는 DButils를 이용하면 다음과 같아집니다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public MysqlHelper(String url, String user, String passwd) {
 
        String driver = "com.mysql.jdbc.Driver";
 
        if (!DbUtils.loadDriver(driver)) {
 
            logger.fatal("Failed Loading JDBC Driver!");
            System.exit(1);
 
        }
 
        try {
            connection = DriverManager.getConnection(url, user, passwd);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }


DButils로 DB를 연결하면 이런식의 모양이 나옵니다. 별로 자바책에서 나오는 예제하고 달라지는건 없습니다. Dbutils라는것이 연결된것 빼고는.  약간 미리 적어놓자면, 보통의 자바책이라는곳에서 DB에 Query를 날리기 위해서 String 을 이용해서 SQL를 만드는 약간의 노가다 작업이 있었는데, 이게 DButils를 이용하면 생각보다 쉽게 해결됩니다. 그 다음 포스트에서 DButils를 이용한 Select, Insert, Update 예제를 올려보도록 하겠습니다. 


저작자 표시 비영리 변경 금지
신고

일단, 자료를 저장하기 위해, Class A라는것을 만들었습니다.

자료를 담아야할 그릇이 있어서. 지금 이걸 bytearray로 이용해서 다른쪽 컴터로 보낸다음 거기서 열어봐야되는데.

분명 예전에 배울때, serialize 하고 했던것 같아서 보고 있었는데,  제 생각에는 소스가 길었던걸로 생각했는데, 딱 두줄이네요


자바 내에서도 기본적인 기능이 있지만. 




역시나 구글신

https://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array


The best way to do it is to use ApacheUtils:

To Serialize:

byte[] data = SerializationUtils.serialize(yourObject);

deserialize:

YourObject yourObject = (YourObject) SerializationUtils.deserialize(byte[] data)

Regards

사랑해요 스택 오버플로 ㅠㅠㅠㅠ 아파치 라이브러리를 이용하면 딱두줄이면 되네요. 필요하신분은 라이브러리를 받으시면 되겠지만 Maven을 이용하시면


                <dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-lang3</artifactId>

<version>3.3.2</version>

</dependency>


아래 내용을 입력해주시면 됩니다. 


참고로. 만약 내가 Class A라는 것을 사용해서 사용하는데 이걸 그냥 bytearray로 변환시키면 Cast 오류가 납니다.


반드시, public class A implements Serializable 사용하시려는 클래스에다가 Serializable 을 implements 하하셔서 사용해야합니다. 




저작자 표시 비영리 변경 금지
신고

 이것저것을 하다가 이클립스에 메이븐을 이용해서 톰켓에 Deploy하던중 생긴 문제입니다. 


Source: http://fanshuyao.iteye.com/blog/1688314


중국어는 못하지만, 영어로 Thank you 라고 남겨놓고 싶었으나, 답글도 어떻게 다는지 모르겠네요 


답은 간단합니다. 


<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
    
    <Loader delegate="true" /> 
     

</Context>




저작자 표시 비영리 변경 금지
신고




http://www.tryerlang.org/

Introduction

Erlang is a programming language created in the Computer Science lab at Ericsson in Sweden in the late 1980s. The above prompt represents an Erlang shell, where you can try the full power of Erlang (well, sort of). To start this tutorial please type ok..

Please note that in Erlang every instruction must be terminated by a DOT (.), and to have it evaluated type Enter.!

What if I get stuck during a tutorial?

You can use the special commands prev. and next. to navigate through the tutorial steps.

Learn More about Erlang

To learn more about Erlang, have a look to the Erlang Programming book, written by Francesco Cesarini and Simon Thompson, and published by O'Reilly.


저작자 표시 비영리 변경 금지
신고

진짜 구글에 없는게 없네요 ...



Solution is here: http://forums.sun.com/thread.jspa?threadID=5368614&tstart=1
First rename the .bin file to .zip
Then with any tool, decompress the zip. It gives a comment that the beginning of the file has bytes that are not part of the zip (this is the script), but it decompress it correctly. It places the file in its subdirectory.
Then rename the file again to .bin, and execute it. It works!

EDIT: This is the real solution:
https://bugs.edge.launchpad.net/ubuntu/+bug/104511

1 - Erase any jmf.bin file that you had download. Download a new one and put in a folder, and check file size:

ls -l

This is a probably result:
-rwxr-xr-x 1 nobody nogroup 2419679 2009-03-07 11:52 jmf-2_1_1e-linux-i586.bin

filezise: 2419679 bytes

2 - Give permission to file:
chmod +x jmf-2_1_1e-linux-i586.bin

THIS IS THE MOST IMPORTANT STEP
3 - Edit jmf-2_1_1e-linux-i586.bin downloaded file with vim as root
vim -b jmf-2_1_1e-linux-i586.bin (YOU HAVE TO USE THIS COMMAND -b BECAUSE IT'S A BINARY FILE)

4 - At vim type this:
/tailPress ENTER.

Then press the key l to move to the left on that line, until the sign +.

Press i to insert text, and insert -n , with a space. Press ENTER.

The new line should be like this:
tail -n +309 $0 > $outname
5 - Now press ESC and type:
:wqPress ENTER.
6 - Now execute the jmf bin file.

That's it.

저작자 표시 비영리 변경 금지
신고

만약 지금 Java를 이용해서 sqlite를 사용중이시고 데이터를 insert 중이신데 속도가 느리다

그런데 웹을 검색해보면 트랜잭션 하는데, 전부다 안드로이드 이야기 이다.


그러시다면 제가 포스팅한 주제를 제대로 찾아오셨습니다.

안드로이드에서 sqlite 쪽 보시면 명시적 트랜잭션 ? 이라든지 등등 많은데 자바에서는 이렇게 표현하시면 되실듯 하십니다.(제가 이것때문에 아주 어휴)


Connection sqlite_conn = DriverManager.getConnection("jdbc:sqlite:test.db");


sqlite_conn.setAutoCommit(false);

분기문[이곳에 insert문]

sqlite_conn.setAutoCommit(true);


저작자 표시 비영리 변경 금지
신고



지금 모좀 하는데, 자바 공부할때마다 대학교에서부터 궁금했던건데


학교에서 배운건 싱크로나이즈 동기화 밖에 안배웠습니다.


물론  전역 변수를 선언해버리고서 해결하는 방법이 있습니다.(예전에 과제할때 이 방법을 많이 사용했습니다.)

(근데 이건 이렇게 하는게 아니라고 안좋다고 들었습니다.)


그런데 이렇게 안하고도 공식적인 방법으로 더 할수 있는 방법이 있습니다.


물론 여기에는 소스는 안올려놓고, 두개의 포스트를 추천 드리겠습니다. 


http://javacan.tistory.com/64


파이프를 사용해서 쓰레드간 통신 하는 방법 입니다. 파이프를 처음 사용하시는 분들은 API를 꼭 참고 하시기 바랍니다.

제가 여기서 많이 이상한짓을 많이해서


제가 지금 정확히는 기억안나는데 파이프로 전송할수 있는 범위는 0~255 만약 스트링이면, 캐릭터로 잘라서 전송하던지 해야할것 같습니다.

물론 다른방법도 있을것 같지만 그런부분에 대해서는 지식이 적어서


다른 한방법법은 블록킹큐를 이용하는 방법입니다.


http://devyongsik.tistory.com/430


지금 저도 필요한 작업을 하다가 사용하는 중이라 나중에 제대로 알고 나면 이부분에 대해서 소스를 첨부하던지 해서 보기 편한방법으로 다시 올려보겠습니다. 

저작자 표시 비영리 변경 금지
신고



이클립스 설치하고 maven 설치하고 


가장 큰 문제가 저는 메이븐을 사용이 이번이 처음이거든요 ..


필요한 라이브러리는 직접 구해서 집어넣었는데, 메이븐 같은 방법이 


netty가 필요해서 집어넣었는데 저런식으로 오류가 나네요..


거의 2~3? , 허비한것 같은데. 답은 공식 홈페이지에 나오네요 ..


그냥 메이븐에서 추가하면 pom.xml에서 아래부분이 다릅니다. 저렇게 고치면 오류가 안나네요 

Downloading from Maven 2 repository

First off, add the following repository section to your pom.xml or ~/.m2/settings.xml:

1
2
3
4
5
6
7
8
9
10
11
<repositories>
  ...
  <repository>
    <id>repository.jboss.org</id>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
  ...
</repositories>

And then add the following dependency section to your pom.xml:

1
2
3
4
5
6
7
8
9
10
<dependencies>
  ...
  <dependency>
    <groupId>org.jboss.netty</groupId>
    <artifactId>netty</artifactId>
    <version>X.Y.Z.Q</version>
    <scope>compile</scope>
  </dependency>
  ...
</dependencies>


저작자 표시 비영리 변경 금지
신고




이클립스 파일을 잘못건드려서 제대로 동작 안하는 바람에 이클립스를 다시 받으러 갔더니,


새로운 버전이 올라와있네요.


일딴 , 보이는걸로 보면 일딴 예뻐졌습니다.


파이팅

뿌잉

eclipse-jee-juno-win32.zip.1.torrent


첨부파일은 이클립스 공식에서 제공하는 토렌트 파일입니다.


그리고 티스토리는 마플 스티커를 쓸수 있네요 ㅋㅋㅋ 제점수는

저작자 표시 비영리 변경 금지
신고
  1. Favicon of http://navisphere.net BlogIcon 룬룬 2012.07.12 01:44 신고

    오 내일 회사가면 바로 업데이트해봐야겠네요. :)
    이클립스는 속도만 빨라지면 참 좋을 것 같은데요..

    • Favicon of http://redeyesofangel.tistory.com BlogIcon Yuika eizt 2012.07.12 21:04 신고

      일단 예뻐지긴 했는데,,

      아직은 인디고가 손에 익어서 저는 juno가 완전히 대세되면 넘어가보렬고요 ㅎㅎ


1. 자바 디자인 패턴 1 – Iterator

 

2. 자바 디자인 패턴 2 – Adapter

 

3. 자바 디자인 패턴 3 - Factory Method

 

4. 자바 디자인 패턴 4 - Template Method

 

5. 자바 디자인 패턴 5 – Singleton

 

6. 자바 디자인 패턴 6 – Strategy

 

7. 자바 디자인 패턴 7 – Composite

 

8. 자바 디자인 패턴 8 – Decorator

 

9. 자바 디자인 패턴 9 - Chain of Responsibility

 

10. 자바 디자인 패턴 10 – Facade

 

11. 자바 디자인 패턴 11 – Observer

 

12. 자바 디자인 패턴 12 – Prototype

 

13. 자바 디자인 패턴 13 – Flyweight

 

14. 자바 디자인 패턴 14 – Builder

 

15. 자바 디자인 패턴 15 – Mediator

 

16. 자바 디자인 패턴 16 – Visitor


출처 : http://iilii.egloos.com

저작자 표시 비영리 변경 금지
신고
일단

통신을 해야하는 상황이 있어서,


서버용 프로그램을 하나 만들고 클라이언트용 프로그램을 하나 만들었습니다.

언어는 자바고요


서버 프로그램은 리눅스 상에서 돌아갑니다.

분명 로컬상에서는 잘되는데, 서버로 옮기니까 .

java.net.ConnectException: Connection timed out: connect 


오류 나오네요.. 순간 멍.


아참... netstat -ntlp 했는데 포트가 열려있는것은 확인했는데.


! solution : 방화벽 확인해보세요..!!1



저작자 표시 비영리 변경 금지
신고

When you install the Java platform, the Java plugin file is included as part of that install. If you want to use Java within Firefox, you need to manually create a symbolic link from the plugin file in the release to one of the locations that Firefox expects. To make the plugin available to all users, create the link inside of the Firefox application's directory, in the plugins subdirectory. Alternatively, you can create the symbolic link in your home directory, in ~/.mozilla/plugins. In the remainder of this document, the text, " Firefox plugins directory ", implies either of these locations.

This release provides the Next-Generation Java plugin. If you have been using the classic plugin, see the Notes for further information.

The plugin file for Linux is located here:

     
            
<JRE>
/lib/i386/libnpjp2.so

If you are using a 32-bit Firefox, you should use the 32-bit Java Plugin (from the lib/i386 directory). To determine which version of Firefox you are running, launch the application, and select the menu item Help -> About Mozilla Firefox. At the bottom of the window is a version string line that contains either "Linux i686" (32-bit) or "Linux x86_64" (64-bit).

To install the Java Plugin follow these steps:

1. Exit Firefox.

2. Uninstall any previous installations of Java Plugin.

Only one Java Plugin can be used at a time. When you want to use a different plugin, or version of a plugin, remove the symbolic links to any other versions and create a fresh symbolic link to the new one.

Remove the symbolic links (or move them to another directory) to javaplugin-oji.so and libnpjp2.so from the Firefox plugins directory.

3. Create a symbolic link to the Java Plugin in the Firefox plugins directory.

Create a symbolic link to the Java Plugin libnpjp2.so file in the Firefox plugins directory:

    cd  
              
<Firefox>/plugins ln -s
<JRE>
/lib/i386/libnpjp2.so .
4. Start the Firefox browser .

 저 같은 경우는 ubuntu 에서 apt-get으로 설치하였는데, 이럴경우는 ~/.mozilla 이곳으로 들어온다음 plugin폴더 안에

자바 플러그인 파일을 심볼릭 링크로 걸면 됩니다. 만약 plugin폴더가 없으면 폴더를 만들으시면 됩니다.

Type about:plugins in the Location bar to confirm that the Java Plugin is loaded. You can also click the Tools menu to confirm that Java Console is there.

Notes

  • The classic plugin file was located here:
      
                    
    <JRE>
    /plugin/i386/javaplugin-oji.so

    This file should no longer be used and all symbolic links to it removed.

  • See Browsers Supported by Next-Generation Java Plugin for information about browser support in the new Java Plugin.

저작자 표시 비영리 변경 금지
신고
Torre Marenostrum - 1/4
Torre Marenostrum - 1/4 by . SantiMB . 저작자 표시비영리변경 금지

아 오늘은 컴퓨터 그만하고 자고 일어나서 해야겠어요

일단은 구글신께서 알려주신겁니다.;

일단 제 자체는 리눅스를 더 공부해야겠네요 ㅠㅠ

2010/08/19 - [Study/Java] - Flex 와 Java XMLsocket을 사용하기

일단 예저에 했던것을 공부할겸 텀프로젝트로 낼겸-- 다시 나름대로 포팅해보고 있습니다. 예전에 없던 디비 연동이라던지 등등등

그런데 리눅스에서ㅏ 아무리 843 포트를 열려고 해도 안열리는겁니다.

구글느님의 답변입니다.

Sadly, you are likely stuck starting up as root.

Other daemons start up as root, then listen to their < 1024 port, then they change user id to the user that they are supposed to be for the rest of the session.

The only other easy alternative is to choose a higher port number.

아 루트로 해야되네요 !!!! 저는 일반계정으로 하고 있었는데...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

즉 답변은 1024보다 너 높은 포트를 사용하시던지 일반 계정으로 하신다면 굳이 그 아래것을 열으셔야 한다면 루트계정으로 열으셔야 합니다!!!

저작자 표시 비영리 변경 금지
신고

'Study > Linux' 카테고리의 다른 글

tcl 문법  (0) 2012.01.18
우분투 기본 방화벽  (0) 2012.01.15
ssh RSA로 접속 불가능시  (0) 2012.01.09
리눅스에서 843포트 여는 방법  (0) 2011.11.29
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist  (0) 2011.10.15
centos6 grouplist  (0) 2011.10.10
Vi , VIM 자동 정렬  (0) 2011.10.05
Coffee Break
Coffee Break by bitzcelt 저작자 표시비영리변경 금지

이클립스 실행시 Failed to create the java virtual machine

이런 메세지가 나온다면 ,

이클립스 폴더안에  물론 JDK는 제대로 설치가 되어있는다는 가정하에 .
eclipse.ini을 열어서

openFile
--launcher.XXMaxPermSize
128M
--launcher.XXMaxPermSize
128m


이부분이 256으로 되어있을텐데 128로 바꾸어보세요, 웹상의 말로는 vm 을 못찾는것보다는 메모리의 문제가 되서 그렇다고 하네요

남은 명절 즐겁게 보내세요.
저작자 표시 비영리 변경 금지
신고

'Study > --Java' 카테고리의 다른 글

java 디자인 패턴  (0) 2012.07.06
java.net.ConnectException: Connection timed out: connect  (0) 2012.04.03
BufferedReader vs Scanner  (0) 2011.09.12
Failed to create the java virtual machine  (0) 2011.09.12
java sqlite jdbc eclipse build path  (0) 2011.07.14
Java sqlite jdbc  (0) 2011.07.14
[JAVA] atoi, iota  (5) 2011.07.07

Tree in mist
Tree in mist by Per Ola Wiberg ~ Powi 저작자 표시


2011/07/14 - [Study/Java] - Java sqlite jdbc

 


jdbc 드라이버를 받은다음 , 해당 eclipase 프로젝트 위에서  오른쪽 마우스 -> Properties -> Java Build Path -> Libraries -> Add Extenal JARS...
저작자 표시 비영리 변경 금지
신고

'Study > --Java' 카테고리의 다른 글

java.net.ConnectException: Connection timed out: connect  (0) 2012.04.03
BufferedReader vs Scanner  (0) 2011.09.12
Failed to create the java virtual machine  (0) 2011.09.12
java sqlite jdbc eclipse build path  (0) 2011.07.14
Java sqlite jdbc  (0) 2011.07.14
[JAVA] atoi, iota  (5) 2011.07.07
Flex 와 Java XMLsocket을 사용하기  (0) 2010.08.19

SqliteJDBC

SQLiteJDBC is a Java JDBC driver for SQLite. It runs using either a native code library 100% Pure Java driver based on NestedVM emulation.

Both the pure driver and the native binaries for Windows, Mac OS X, and Linux x86 have been combined into a single jar file.

Download

The current version is v056, based on SQLite 3.6.14.2.

That should be everything you need.

News

  • 2009-12-03: There will be a new version soon, just dealing with some test suite issues. I created anew mailing list, though the Google Group has mysteriously reappeared since then.
  • 2009-06-09: Upgrade to SQLite 3.6.14.2 and add a 64-bit binary for OS X.
  • 2009-01-14: Note that the mailing list for SQLite JDBC is currently unavailable as the Google Group unexpectedly disappeared.

Getting Started

Read the usage page for the full story.

import java.sql.*;

public class Test {
  public static void main(String[] args) throws Exception {
    Class.forName("org.sqlite.JDBC");
    Connection conn =
      DriverManager.getConnection("jdbc:sqlite:test.db");
    Statement stat = conn.createStatement();
    stat.executeUpdate("drop table if exists people;");
    stat.executeUpdate("create table people (name, occupation);");
    PreparedStatement prep = conn.prepareStatement(
      "insert into people values (?, ?);");

    prep.setString(1, "Gandhi");
    prep.setString(2, "politics");
    prep.addBatch();
    prep.setString(1, "Turing");
    prep.setString(2, "computers");
    prep.addBatch();
    prep.setString(1, "Wittgenstein");
    prep.setString(2, "smartypants");
    prep.addBatch();

    conn.setAutoCommit(false);
    prep.executeBatch();
    conn.setAutoCommit(true);

    ResultSet rs = stat.executeQuery("select * from people;");
    while (rs.next()) {
      System.out.println("name = " + rs.getString("name"));
      System.out.println("job = " + rs.getString("occupation"));
    }
    rs.close();
    conn.close();
  }
}

Run with:

java -cp .:sqlitejdbc-v056.jar Test

There are also some details on date handling and custom functions.

Keeping Informed

To be informed when a new release is made, I recommend subscribing to the freshmeat project for this driver. Every release I make goes up there immediately with a short summary of the changes. They provide a free email service with these details and don't load you up with spam.

There's a mailing list.

Released under a BSD license.

Version control for this project is handled with git. Get the source from github.

http://www.zentus.com/sqlitejdbc/ 

저작자 표시 비영리 변경 금지
신고

'Study > --Java' 카테고리의 다른 글

BufferedReader vs Scanner  (0) 2011.09.12
Failed to create the java virtual machine  (0) 2011.09.12
java sqlite jdbc eclipse build path  (0) 2011.07.14
Java sqlite jdbc  (0) 2011.07.14
[JAVA] atoi, iota  (5) 2011.07.07
Flex 와 Java XMLsocket을 사용하기  (0) 2010.08.19
java.net.BindException: Address already in use  (0) 2010.08.19

Wind socket below Iceland's Eyjafjoell volcano ash plume. South bound wind push ash cloud toward european skies, on May 08, 2010. Photo by Etienne de Malglaive/ABACAPRESS.COM Photo via Newscom


이번에 Flex하고 Java 연결시키는 작업때문에 하지도 않았던 자바 보느라 플랙스 보느라 정책적인 문제 해결하느라 머리가 완전히 스팀이 올랐다고 해야되나. 물론 여기에 제 프로그래밍 기술적인 부분을 올려놓으면 좋겠지만 완전 난잡한 코드에 거의 다른 분들 소스를 참고한데다가 , 또 완벽히 설명할 자신이 없기에 소스 올려놓는것은 제외하고 블로그 2개를 추천드립니다. 물론 이블로그의 특성상 또다른 저와 같은 고민을 하는 분들을 위해서, 혹은 그리고 나중에 제가 다시 보더라고 힌트를 얻기 위해서요 .

http://mudchobo.tomeii.com 머드초보님의 블로그입니다. 이곳에 머드초보님께서 flex를 클라이언트로 java를 서버로 해서, 만든 소스를 보실수 잇습니다. 제가 생각하기 중점은, 플래스하고 자바에서 소켓을 보내고 받는 과정입니다. 물론 중점이겠지만.

약간 덧붙이자면, 여기서 플랙스쪽에서 자바쪽으로 데이터를 받을때 InputStreamReader을 사용하는데
이것을 찾아보니 이것은 값을 뱉어낼때 형태를 지정해야합니다 int형인지 cha형인지 그러니까 2가지 자료형으로 자료를 내 뱉습니다. 그리고 만약 자료가 없을때는 -1을 리턴합니다.


그런데 약간 구경해보니까 XML로 소켓을 받을때 뒤에 \n이라는것을 붙여줘야 된다고 합니다. 그런데 자바쪽에서 보니까 이녀석이 계속 기다리기 만 하는겁니다.

이걸 int로 찍어봤더니 aaa 보낼경우 int값으로 바꾸면 96 96 96 10 0 이렇게 문장을 끝내더군요.

그리고 보낼때 PrintWriter 를 사용하는데 보낼때 저는 XML이라 \n만 넣엇는데 - 안넘어가더라고요.
다시 확인해봤떠니 \0까지 해줘야 되더라고요,,.
pw.print(result_read+"\n\0"); 대략 이정도로?


그리고 http://ummae.tistory.com/ 곳에가면 정책적인 문제를 해결하실수 있습니다.
그러니까 이 플래쉬라는 게 그냥 로컬에서 테스트할때는 소켓이 왔다 갔다가 잘합니다. 그런데 다른컴퓨터를 이용해서 접속할때는 안됩니다. 이걸 어도비에서 정책적으로 막아놨다고 합니다.

기존에는 플랙스내에서 소스 첨부하는 방법하고 정책서버를 따로 운영하는 방법방법이 있었는데 지금은
업데이트 되면서 정책서버를 따로둬야하는듯 합니다.

이곳에 링크를 따라가시면 어도비쪽에서 파이썬 ,펄로 데몬으로 해서 리눅스 환경에서 사용할수 잇는 정책서버를 만들어 올려놓앗습니다. 제가 찾아보았는데 윈도우 쪽은 없는것 같고 윈도우에서 하시려면 직접 만들으셔야 할것 같습니다.

혹시 저같은 분들을 위해서 약간의 정보를 남겨놉니다. 즐거운 하루되세요 .


저작자 표시 비영리 변경 금지
신고

'Study > --Java' 카테고리의 다른 글

java sqlite jdbc eclipse build path  (0) 2011.07.14
Java sqlite jdbc  (0) 2011.07.14
[JAVA] atoi, iota  (5) 2011.07.07
Flex 와 Java XMLsocket을 사용하기  (0) 2010.08.19
java.net.BindException: Address already in use  (0) 2010.08.19
이클립스 가릴레오(galileo) 플러그인 지우는 방법  (0) 2009.10.26
JAVA 1.6 한글 api  (2) 2009.10.05
Jessica
Jessica by 旅の達人黒沢オティス 저작자 표시비영리동일조건 변경허락
흐악... 중간고사 기말고사를 지나서 여름방학이 오고야 말았습니다..
요즘따라 느끼는것은... 무엇인가 만들때 마다 만들때 마다 한계점에 도달한다는거랄까..

생각해보니 그나마 제대로 사용할수 있는 언어가 C(Gcc) , PHP( html 이런거 포함하고 자바 스크립트는..)ㅠㅠ

약간 부끄럽지만 3학년인데 자질마저 의심하고 있습니다. 물론 그동안 제가 가진 정서적인 사고방식에 의하면 매우 뜻깊게 시간을 보낸것 같기도 하지만, 공학적인 사고를 하면 엄청난 비효율적이였는지 나타나고 있네요... 이번방학에 해야될거 당장,, C++ 하고,, JAVA 둘다 객체지향이니 ::

그러니까 제가 이런생각을 하는것이 아,, 그렇네요, 전 학교에서 배우면서 이론과목이 매우 쓸모없다고 생각했었습니다..

그런데 생각해보면 이번 운영체제 Inter-process communication을 배웠었는데. IPC를 하기 위한 한 방법중 하나가 소켓이라는것도 알았네요..

지금 진행하고 있는 일이 잇는데.. 그러니까 구도가 PHP로 만들어진 페이지에서 명령을 내리면 C 라던지 다른 언어로 만들어진 어플리케이션 또는 프로그램이 작동되게 하는 구도입니다..

그런데,, 저는 소켓프로그래밍이 PHP에서도 가능하다고 들어서 PHP에서 echo서버를 구현하려고 했지만 - 약간은 한심한 생각이였던것 같습니다. 물론 제 지식에서는 .. 구글링을 해보니....순수 PHP가지고는 불가능하다는 결론이 내려졌습니다..

그동안 잘못생각했던것은 PHP가 웹에서만 작동한다고 생각했는데.. 어떤 프리랜서 프로그래머 분께서 쓰신글을 보면서 리눅스 콘솔상에서도 작동한다는것을 알게되었습니다.. 물론 글을 다 안읽어봤지만 그렇게 하면 echo 서버 구현도 가능하다고도 생각했지만.

일단 이글의 요점은. 웹페이지로 PHP를 접속했을때. 모 어떤 명령을 내릴수도 있찌만 C라던지 다른 프로그램으로 소켓이 날라가는 경우를 구현이라고 보다는 연습한 경우입니다. 만약 저와 비슷한 지식을 가지시거나 약간의 정보를 필요하셨던분이라면 얻으실수도 있을지 모르겠습니다.

그리고 여기서 사용되는 것은 UDP 입니다.



일단 간단히 연습해본 스샷입니다. 아이피부분은 제거해서 올린것이고,,
참고로 왼쪽 화면 같은 경우는 Gcc를 이용해서 UDP echo listing Server를 만들어서 10000번 포트로 열은 것입니다.


혹시 지나가는 컴쟁이님 계시면,, 약간의 조언을 주신다면 정말로 감사드립니다


차두리 == 로봇두리 == 안드로이드 == OS는 구글 == 안드로이드 2,2.................................................



저작자 표시 비영리 변경 금지
신고
이클립스에서 플러그인을 깔았다 지우러고 하는데, 웹을 검색해보니,, 갈릴레오 버전 내용이 잘 안보여서요;; 가나메는 있는데;;

약간 갈릴레오 넘어오면서 바뀐거는.. 가나메 경우 기억에서 헷갈리는데 업데이트 하는곳에 관리하는곳이 있었는데, 갈릴레오의 경우 약간 다른듯 합니다.

참고로 저는 이클립스를 한글패치를 해서 사용중이라... 도움말 메뉴의 멘 아래 메뉴를 누르면 이클립스 정보가 나오고, 거기서 플러그인
인스톨된 목록을 볼수 있는 버튼이 나옵니다.

저작자 표시 비영리 변경 금지
신고
Freedom Flying Threw Our Wings (HDR)
Freedom Flying Threw Our Wings (HDR) by Kuzeytac 저작자 표시비영리변경 금지

apt-get으로 설치하면 한번에 설치가 되지만;
(전 아직도, yum이나 apt-get으로 설치하면 좋은데; 소스로 직접 컴파일 하는 이유를 잘모르겠습니다.. 여러가지 경로에 의하면 직접 커스터마이즈 할수 있고 능동적 대응 등등이라고 하던데)

proftpd를 날려버리고, 컴파일해서 설치하려고 했더니
make 를 딱 치니까 command not found 라고 뜨는겁니다..

그러니까, 순간 당황했습니다. Centos에서 그런적이 없었거든요..

구글신께서 말씀하시길.. apt-get install make 를 하라고 하십니다.
ftp://ftp.gnu.org/gnu/make/  << 또는 여기를 이용하라고 하더군요.

저작자 표시 비영리 변경 금지
신고
Rastaholm ~ sunset and flowers
Rastaholm ~ sunset and flowers by Per Ola Wiberg (Powi) 저작자 표시

 그러니까,, 자바를 보다가, 몇몇 궁금한점떄문에 API를 보려고 찾던중.

물론 웹상으로 볼수는 있지만 - 이상하게 다운받아서 보는걸 즐기는 편이라..

http://xrath.com/files/jdk-6-docs-ko.zip 에서 받으려고 했는데; 링크가 깨져있더라고요;;

jdk-6-docs-ko.zip.1.torrent

그래서 토렌트 파일로 첨부합니다. 토렌트 파일이 무엇이냐고요? 정말로 엄청나게 진보한 p2p 방식입니다. 일종의..

자매품 : 이클립스 토렌트 파일입니다.(참고로 가릴레오.)이건 이클립스 공식싸이트에서도 받으실수 있는겁니다.;ㅎㅎ


eclipse-SDK-3.5.2-win32.zip.torrent



추가합니다. 은근히 여기로 들어오시는분들이 많더군요. 일단 제가 토렌트를 유지안하는 관계로 거의 다운받기 힘드실겁니다. 한번 토렌트 파일로 받아보려고했는데 시드 파일이 없더군요 그래서 직접 압축해서 올려봅니다 .

7zip으로 압축하였고, 7zip이나 7zip을 지원하는 압축프로그램으로 파일 두개 받으셔서 압축풀어보시길 바랍니다.



jdk-6-docs-ko.7z.001


jdk-6-docs-ko.7z.002






저작자 표시 비영리 변경 금지
신고
  1. 자바 개발자 2015.01.30 14:12 신고

    사내에서 http://xrath.com/javase/ko/6/docs/ko/api/index.html 가 접근이 안되었는데, 올려주셔서 감사합니다!! 좋은 하루 되세요~

IMG_0519.JPG
IMG_0519.JPG by reemer 저작자 표시비영리동일조건 변경허락

오늘부터 학교에서 약간 재미있는 언어를 배우기 시작했습니다.

물론 포스팅 글은 프롤로그 컴파일러 설치라고 했지만, 제가 이해한것과, 웹 서핑결과로는 제목이 부적절하다는것이 맞을듯 합니다.

하지만 만약 저 같은 생각을 하시는분이 정보를 찾고 있을지 몰라서 일단 제목을 그렇게 해논거고요

프롤로그가 모냐고요? 그냥 쉽게 말하면 logical 언어, 논리 언어라는 뜻입니다.

그러니까 일반 사람들이 생각하는,, C언어, 베이직 이런 언어하고는 완전히 다르겠다고 하겠지요? 그러니까 이런 부류를 절차지향 언어라고 한답니다-0

잠깐 머리에서 정리가 안되는것은 책이나 어디서 보기로 언어를 나눌때 Convensional 언어, 그러니까 절차지향하고 Logical로 나눈다고 했는데- 객체지향은 어디 부류에 넣어야 할가요?

3가지로 분류해야하나-;;

설치화면은 대략 이렇습니다.;; 아직 개념만 배운관계로 직접 실행은 안해봣는데-

논리 언어라.;; 약간 재미있을듯 합니다..; 이것 말고도 Lisp도 있다는데;; 약간 신기하네요;

즐거운 하루되세요.

저작자 표시 비영리 변경 금지
신고

'Study > Prolog' 카테고리의 다른 글

gprolog 컴파일 하기...  (2) 2009.09.24
리눅스에 prolog 설치 방법  (0) 2009.09.23
Prolog 컴파일러 설치.  (2) 2009.09.16
  1. Favicon of http://parksk.tistory.com BlogIcon 박상근 2009.09.16 03:06 신고

    학교 커리큘럼에 이런 과목이 있다니...!!!
    완전 부러운걸요...
    저는 바뀌지 않는 나이 지긋하신 교수분들과 아주 오래된 책들로 옛 커리큘럼에서 크게 바뀌지 않은 채로 배우는 터라...ㅠㅠ

    • Favicon of http://redeyesofangel.tistory.com BlogIcon Yuika eizt 2009.09.16 21:50 신고

      ㅎㅎㅎ...원래 알고리즘 과목인데- C로 코드짜고 할줄 알았는데- 이걸 가르치시더라고요;;

      저도 나이 지긋하신 교수님께서 가르치신다는..;;하핫..

어떻게 하다가, 안드로이드 XML 부분을 같이 하게 되었습니다;;

이클립스에 플러그인을 설치해야하는데; http://dl-ssl.google.com/android/eclipse/ 이걸할때 반응이 없을경우, https 로 고쳐보시고 안될경우에는 http://dl-ssl.google.com/android/eclipse/site.xml 으로 해보고서 하세요;;

정보의 출처는 구글 그룹스에서 어느 외국 유저분이 남긴 정보;;(만약 영어를 정확히 해석했다면;;;하하;)
저작자 표시 비영리
신고

'Study > XML' 카테고리의 다른 글

이클립스 갈릴레오 외부 프로젝트 불러오기  (0) 2009.07.09
안드로이드!  (4) 2009.07.08
http://dl-ssl.google.com/android/eclipse 이클립스가 못찾을때  (0) 2009.07.08
XML의 구조,,  (0) 2009.04.18
[XML]XLST 이미지 넣기  (0) 2009.04.17
[XML]XLST 문서 만들기  (0) 2009.04.17
eXtensible Markup Language  (4) 2009.04.15


import java.io.*;

class EXC2
{
        public static void main(String args[]) throws IOException
        {
                String temp_num;
                int number;
                BufferedReader Buffer;;
                Buffer = new BufferedReader(new InputStreamReader(System.in));
                try
                {
                        System.out.print("only number : ");
                        temp_num=Buffer.readLine();
                        number=Integer.parseInt(temp_num);
                        System.out.println("number is "+number);
                }
                catch(NumberFormatException e)
                {
                        System.out.println("wrong information");

                }
                finally
                {
                        System.out.println("have noting to do");
                }
        }
}


C++에서는 예외처리가 있다고는 알고 있습니다. 아직 이쪽으로는 ++까지는 안해봐서,,
약간의 기억을 더듬자면, C로 switch case 나 또는 if를 이용해서 메뉴를 입력받을때, 물론 정상적인 시나리오로는
작동이 되겠지만..입력해서 안될 값을 입력하면 segement fault 제대로 입력했다면, 그냥 죽어버립니다..

물론, 여러가지 프로그래밍 기법들은 통해서 해결하는 방법은 있겠지만..자바를 처음 배우는 입장에서는 왠지 모를
그런것이랄까...;?

잠깐 해석하면 try는 에러가 발생할 범위이고, catch는 에러가 나면 이렇게 처리하고
finally는 에러나든지 말든지 출력합니다.


저작자 표시 비영리
신고
일단 소스코드는..
 
class SumAll
{
        public static void main(String args[])
        {
                int result;

                int n1 = Integer.parseInt(args[0]);
                int n2 = Integer.parseInt(args[1]);
                int n3 = Integer.parseInt(args[2]);

                result = n1+n2+n3;

                System.out.println(result);
        }
}



일단 저거대로 그냥 java로 실행시키면, 아규먼트 값을 안입력해서 생기신걸 볼수 있습니다.
일단 자세히는 모르겠지만.. 배열 범위를 넘어나, 그럴때 생긴 것입니다.

저작자 표시 비영리
신고

물론 C를 잘하는건 아니지만, 일단 방학인 이상,, 시간이 많다는 가정하에..자바를 시작했습니다.
예제를 쳤는데. 시작부터 오류가 나버리네요;; 혹시 저런 오류가 나시고 실행이 안되시나요?

그러면.. 100% 입니다..

저같은경우 Test로 쳐야 했는데. test로 했더니 저렇게 나오더군요.

저작자 표시 비영리
신고
12

+ Recent posts