'개발'에 해당되는 글 188건

  1. 2009.12.07 YouTube flv 소스 가져오기 8
  2. 2009.12.01 PreparedStatement Set Array 1
  3. 2009.12.01 Insert text file into MySQL 1
  4. 2009.11.20 [Flex] comboBox를 이용한 필터링
  5. 2009.11.19 VideoDisplay 컨트롤 시작해보기 1
  6. 2009.11.19 Flex 개발에 도움이 될만한 사이트
  7. 2009.11.19 flex 강좌
  8. 2009.10.26 [Eclipse] java editor template[상용구] 1
  9. 2009.10.12 Java FX for Eclipse 2
  10. 2009.09.21 Base64 Encoding/Decoding 예제 1
2009. 12. 7. 10:40

YouTube flv 소스 가져오기




http://dennisjaamann.com/blog/?p=70

Youtube video in AS3 FLVPlayback

Lately,
I’ve been busy trying to get youtube movies to play in the standard FLVPlayback component.

Getting this to work was really a pain in the butt now and then, especially because while I was working on this,
youtube changed some stuff on their side undoing all my previous work. But hey, stuff happens!
In the end perseverance and a lot of patience finally resulted in a working solution.

I will break up the solution into several pieces, describing the steps that need to be taken in order for this to work.

1) We need to get the video (.flv) from the youtube server.

To achieve this, one must of course understand how to get this video.
To start off, just navigate to a youtube movie. e.g. http://www.youtube.com/watch?v=vE_WqdKbTvY , then right-click anywhere in page and watch the page source code.

In the source code, search for the string “swfArgs”, which will look something like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var swfArgs = {
"q": "top%20gear%20carrera%20gt",
"fexp": "903500,900130", 
"invideo": true, 
"sourceid": "ys",
"video_id":"vE_WqdKbTvY", 
"l": 478,
"fmt_map": "18/512000/9/0/115,34/0/9/0/115,5/0/7/0/0", 
"sk": "PbB4AIyvqpbLl0DYyCX5rpmXcQe-FEcZC", 
"is_doubleclick_tracked": "1", 
"usef": 0,
"t": "vjVQa1PpcFO6TnxVA4_nkqbqKN-z4CoWJgWn2Pfu77I=", 
"hl": "en", 
"plid": "AARoEenKN8A9FYLn", 
"vq": null, "ad_module": "http://s.ytimg.com/yt/swf/ad-vfl91517.swf", 
"cr": "NL", 
"tk": "j7SixOLxSJ1xxBIwWubnN9sXiu7hrejTmRv4ruMx4N3OaeyhN0xImQ=="};

As you can see this is an object, containing data about the swf and thus the .flv played at the youtube html page.
The video_id is the identifier of the movie and t is a token set by youtube that enables you to view / download the video.
This token expires after a given period of time, so I can’t place a permanent download link for the flv file here.

So now that we have the parameters of the video we need to fill them in as follows into a fixed url, used by youtube to retreive the flv video:
http://www.youtube.com/get_video.php?video_id=[id]&t=[t]
In our case:
http://www.youtube.com/get_video.php?video_id=vE_WqdKbTvY&t=vjVQa1PpcFO6TnxVA4_nkqbqKN-z4CoWJgWn2Pfu77I=
When navigating to this url with your browser, the video will start downloading

Don’t bother trying to open this last link, because as stated before, the token will probably have expired by the time you read this.
(Also the token is linked to the IP that first requested it, which in this case would be mine. More about this later)
If you would like to test if and how this works, just follow all the steps described above and see for yourself.
Pretty cool huh?

Now that we know how to get the .flv video of any youtube movie, we need to find a way to automatically do this, without the need to go through all the steps again.
We will use a php proxy script that eliminates all sandbox issues, accepts any youtube url and then returns the physical video (.flv) as if it were present on our own server.
However, this script will be a mere redirect to the location of the video on youtube servers, the file will not be physically downloaded by your server.

To create a script like this, I did some searching and quickly stumbled upon a script I found here.
This worked fine at first, but as I was saying youtube changed some things server side along the way.
That’s why i needed to search for a solution and needed to modify the script in order to getting it to work again.

The problem was caused because youtube changed the token idea.
A token is now linked to an IP address, meaning that the video can only be downloaded by the IP address that first requested the token.
This is a problem when trying to do this in-browser, where the browser is on the localhost, and the script is on a server and thus causing an IP mismatch. The result is that the file cannot be accessed.
After alot of searching around the final solution is to retreive the headers from the youtube download url and extracting the location of the flv that is embedded.

The result for the php proxy script:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
    $id = trim($_REQUEST['id']);
 
    $url = "http://www.youtube.com/watch?v=" . $id;
 
    $url = $url . "&fmt=18"; //Gets the movie in High Quality, uncomment this line to get it in normal quality
 
    $ch = curl_init();
 
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
    $info = curl_exec($ch);
 
    if (!preg_match('#var swfArgs = (\{.*?\})#is', $info, $matches))
    {
        echo "Check the YouTube URL : {$url} <br/>\n";
        die("Couldnt detect swfArgs");
    }
 
    if (function_exists(json_decode)) # >= PHP 5.2.0
    {
	$swfArgs = json_decode($matches[1]);
        $video_id = $swfArgs->video_id;
        $t = $swfArgs->t;
    }
    else
    {
        preg_match('#"video_id":.*?"(.*?)"#is', $matches[1], $submatches);
        $video_id = $submatches[1];
 
        preg_match('#"t":.*?"(.*?)"#is', $matches[1], $submatches);
        $t = $submatches[1];
    }
 
    curl_close($ch);
 
    $fullPath = "http://www.youtube.com/get_video.php?video_id=" . $video_id . "&t=" . $t; // construct the path to retreive the video from
 
    $headers = get_headers($fullPath); // get all headers from the url
 
    foreach($headers as $header){ //search the headers for the location url of youtube video
	if(preg_match("/Location:/i",$header)){
	    $location = $header;			  
	}
    }
 
    header($location); // go to the location specified in the header and get the video
?>

An example of correct usage:

Navigate to http://www.dennisjaamann.com/demo/youtubeFLVPlayback/php/getYoutubeFLV.php?id=[videoID],
where the videoID is the id from the youtube movie http://www.youtube.com/watch?v=vE_WqdKbTvY
In this case: http://www.dennisjaamann.com/demo/youtubeFLVPlayback/php/getYoutubeFLV.php?id=vE_WqdKbTvY
When navigating to the url above, you will notice that the script will redirect you to the physical location of the .flv file.This will start the download prompt.

Isn’t this exactly what we need? :)

2) Workaround for FLVPlayback

When we take the url retreived above and try to play it in the standard FLVPlayback component as follows:

1
2
3
4
	var videoPlayer:FLVPlayback = new FLVPlayback();
        addChild(videoPlayer);
	videoPlayer.source = "http://www.dennisjaamann.com/demo/youtubeFLVPlayback/php/getYoutubeFLV.php?id=vE_WqdKbTvY";
	videoPlayer.play();

The video doesn’t play and we get the following error:
VideoError: 1005: Invalid xml: URL: “http://www.dennisjaamann.com/demo/youtubeFLVPlayback/php/getYoutubeFLV.php?id=vE_WqdKbTvY&FLVPlaybackVersion=2.1″ No root node found; if url is for an flv it must have .flv extension and take no parameters
at fl.video::SMILManager/http://www.adobe.com/2007/flash/flvplayback/internal::xmlLoadEventHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()

Which is kind of a suprise, because when we open the source url in our browser there is clearly an .flv file there.

However, when analyzing the error message we can clearly see the problem. The key part here is:
“if url is for an flv it must have .flv extension and take no parameters”
When taking a look at our url http://www.dennisjaamann.com/demo/youtubeFLVPlayback/php/getYoutubeFLV.php?id=vE_WqdKbTvY,
it is obvious that it doesn’t end on .flv and that our url accepts parameters.

This behaviour is caused by a few lines of code in the NCManager class used by the FLVPlayback component.
There, the check is done whether the url ends on .flv and that the url does not accept parameters.

This leaves us 2 options:
- Extend the NCManager, overwrite this behaviour and make the FLVPlayback use this custom class
- Find a way to give the NCManager a correctly formatted url, so that it can stop nagging

I prefer the second option because it leaves the NCManager unmodified and hereby we can eliminate any unwanted behaviour.
Also, since I have a little php experience, I quickly realized that this had the funky smell of url rewriting.
With url rewriting you can take any url and format it to the format required which is exactly what we need here…

So we need to change the original url
http://www.dennisjaamann.com/demo/youtubeFLVPlayback/php/getYoutubeFLV.php?id=vE_WqdKbTvY
to
http://www.dennisjaamann.com/demo/youtubeFLVPlayback/videos/vE_WqdKbTvY.flv

This can be achieved by adding a .htaccess file to your project folder on the web server.
The code below is also included in the source files at the bottom of this post. But please note, not all operating systems show a .htaccess file.
This is because that it sometimes is a hidden file type.

Here’s the code for that:

1
2
3
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^videos/([^/]+).flv php/getYoutubeFLV.php?id=$1 [NC]

And that’s all folks!
When we now execute our code again with the modified url, the NCManager has stopped nagging and the videoplayer plays the wanted video.

1
2
3
4
	var videoPlayer:FLVPlayback = new FLVPlayback();
        addChild(videoPlayer);
	videoPlayer.source = "http://www.dennisjaamann.com/demo/youtubeFLVPlayback/videos/vE_WqdKbTvY.flv";
	videoPlayer.play();

This workaround took like a minute or so to be succesful, leaves the the NCManager unchanged and does the trick.
That’s why I’ve chosen this solution because it is simple and elegant.

Read more about basic url rewriting here

3) Create the player.

All that is left now is to create our application. I have prepared an example in flex (sdk 3.3)

This is the result:

View the full example with source here
Or download the example source files here: youtubeFLVPlayback (851)

Tags: , , , , ,

2009. 12. 1. 10:54

PreparedStatement Set Array





/*
JDBC Recipes: A Problem-Solution Approach (Problem-Solution Approach) (Hardcover)

by Mahmoud Parsian 


# Publisher: Apress (September 15, 2005)
# Language: English
# ISBN: 1590595203

*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

import oracle.sql.ArrayDescriptor;

public class Main {

  public static void main(String[] argsthrows Exception {
    Connection conn = null;
    PreparedStatement pstmt = null;
    java.sql.Array sqlArray = null;
    conn = getOracleConnection();
    // For oracle you need an array descriptor specifying
    // the type of the array and a connection to the database
    // the first parameter must match with the SQL ARRAY type created
    ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("CHAR_ARRAY", conn);
    // then obtain an Array filled with the content below
    String[] content = "v1""v2""v3""v4" };
    sqlArray = new oracle.sql.ARRAY(arrayDescriptor, conn, content);

    String query = "insert into CHAR_ARRAY_TABLE(id, array) values(?, ?)";

    pstmt = conn.prepareStatement(query);
    pstmt.setString(1"0001");
    pstmt.setArray(2, sqlArray);

    int rowCount = pstmt.executeUpdate();
    System.out.println("rowCount=" + rowCount);
    System.out.println("--Demo_PreparedStatement_SetArray end--");
    pstmt.close();
    conn.close();
  }

  private static Connection getHSQLConnection() throws Exception {
    Class.forName("org.hsqldb.jdbcDriver");
    System.out.println("Driver Loaded.");
    String url = "jdbc:hsqldb:data/tutorial";
    return DriverManager.getConnection(url, "sa""");
  }

  public static Connection getMySqlConnection() throws Exception {
    String driver = "org.gjt.mm.mysql.Driver";
    String url = "jdbc:mysql://localhost/demo2s";
    String username = "oost";
    String password = "oost";

    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
  }

  public static Connection getOracleConnection() throws Exception {
    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@localhost:1521:databaseName";
    String username = "userName";
    String password = "password";

    Class.forName(driver)// load Oracle driver
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
  }

}


2009. 12. 1. 10:51

Insert text file into MySQL





import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class InsertTextFileToMySQL {

  public static Connection getConnection() throws Exception {
    String driver = "org.gjt.mm.mysql.Driver";
    String url = "jdbc:mysql://localhost/databaseName";
    String username = "root";
    String password = "root";

    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
  }

  public static void main(String[] args)throws Exception {
    String id = "001";
    String fileName = "fileName.txt";
    
    FileInputStream fis = null;
    PreparedStatement pstmt = null;
    Connection conn = null;
    try {
      conn = getConnection();
      conn.setAutoCommit(false);
      File file = new File(fileName);
      fis = new FileInputStream(file);
      pstmt = conn.prepareStatement("insert into DataFiles(id, fileName, fileBody) values (?, ?, ?)");
      pstmt.setString(1, id);
      pstmt.setString(2, fileName);
      pstmt.setAsciiStream(3, fis, (intfile.length());
      pstmt.executeUpdate();
      conn.commit();
    catch (Exception e) {
      System.err.println("Error: " + e.getMessage());
      e.printStackTrace();
    finally {
      pstmt.close();
      fis.close();
      conn.close();
    }
  }
}

2009. 11. 20. 09:36

[Flex] comboBox를 이용한 필터링




<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="simpletestCat.send();simpletestFood.send()"  layout="horizontal">

<mx:Script>
<![CDATA[
  import mx.controls.dataGridClasses.DataGridColumn;
  import mx.collections.ArrayCollection;

  [Bindable]
  private var categoryList:ArrayCollection;
  [Bindable]
  private var foodList:ArrayCollection;
 
  private function filterByCategory(event:Event):void{
   if((event.target as ComboBox).selectedIndex == 0){
    foodList.filterFunction = null;
   }else{
    foodList.filterFunction = catFilter;    
   }
   
   foodList.refresh();
   foodListBox.selectedIndex =0
  }
 
  private function catFilter(item:Object):Boolean{
   return item.category_name == categorySelect.selectedItem.category_name;
  }

]]>
</mx:Script>

<mx:HTTPService id="simpletestCat"
url="assets\categorylist.xml"
result="categoryList=simpletestCat.lastResult.list.category;categoryList.addItemAt('All', 0);categorySelect.selectedIndex=0"/>
<mx:HTTPService id="simpletestFood"
url="assets\foodlist.xml"
result="foodList=simpletestFood.lastResult.list.food"/>

<mx:ComboBox id="categorySelect" change="filterByCategory(event)"
dataProvider="{categoryList}"
labelField="category_name"/>
<mx:ComboBox id="foodListBox"
dataProvider="{foodList}"
labelField="product_name"
width="200"/>

</mx:Application>

2009. 11. 19. 19:15

VideoDisplay 컨트롤 시작해보기




나는 이전에 VideoDisplay 컨트롤로 간단한 예제를 생성해서 플래시 비디오(FLV)가 로딩할때 이벤트 순서의

이해를 돕도록 만들었습니다.

 

다음 예제는 VideoDisplay 컨트롤을 만들고,

디버깅 DataGrid 안에 각각 FLV의 이벤트 , 비디오 상태 , 플레이헤드 타임 , 총 재생시간을 표시합니다:

 

 

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" backgroundColor="white" creationComplete="init();">

 

    <mx:Script>

        <![CDATA[

            import mx.collections.ArrayCollection;

            import mx.events.CuePointEvent;

            import mx.events.VideoEvent;

 

            [Bindable]

            private var arrColl:ArrayCollection;

 

            [Bindable]

            private var FLV_URL:String = "http://www.helpexamples.com/flash/video/clouds.flv";

 

            /**

             * Initialize the ArrayCollection object.

             */

            private function init():void {

                arrColl = new ArrayCollection();

            }

 

            private function doVideoEvent(evt:VideoEvent):void {

                doAddItem({type:evt.type});

            }

 

            private function doCuePointEvent(evt:CuePointEvent):void {

                doAddItem({type:evt.type});

            }

 

            private function doProgressEvent(evt:ProgressEvent):void {

                doAddItem({type:evt.type});

            }

 

            /**

             * Add the item to the ArrayCollection instance, revalidate the DataGrid control, and scroll to the last item in the DataGrid.

             */

            private function doAddItem(obj:Object):void {

                arrColl.addItem({type:obj.type, state:videoDisplay.state, playheadTime:videoDisplay.playheadTime, totalTime:videoDisplay.totalTime});

                dataGrid.validateNow();

                dataGrid.selectedIndex = arrColl.length;

                dataGrid.scrollToIndex(arrColl.length);

            }

        ]]>

    </mx:Script>

 

    <mx:VideoDisplay id="videoDisplay" source="{FLV_URL}" autoPlay="false" autoRewind="false"

            ready="doVideoEvent(event);"

            rewind="doVideoEvent(event);"

            playheadUpdate="doVideoEvent(event);"

            close="doVideoEvent(event);"

            complete="doVideoEvent(event);"

            progress="doProgressEvent(event);" />

 

    <mx:HBox>

        <mx:Button label="play()" click="videoDisplay.play();" />

        <mx:Button label="pause()" click="videoDisplay.pause();" />

        <mx:Button label="stop()" click="videoDisplay.stop();" />

    </mx:HBox>

 

    <mx:DataGrid id="dataGrid" dataProvider="{arrColl}" width="320" rowCount="5">

        <mx:columns>

            <mx:DataGridColumn id="typeCol" dataField="type" headerText="Evt. type" />

            <mx:DataGridColumn id="stateCol" dataField="state" />

            <mx:DataGridColumn id="playheadTimeCol" dataField="playheadTime" textAlign="right" />

            <mx:DataGridColumn id="totalTimeCol" dataField="totalTime" textAlign="right" />

        </mx:columns>

    </mx:DataGrid>

 

</mx:Application>

 

* 이 문서의 권한은 http://blog.flexexamples.com 에 있음을 밝힘니다. 2차 가공물의 권한은 저에게 있습니다.

 


2009. 11. 19. 13:26

Flex 개발에 도움이 될만한 사이트




1. AnimatedGIfLoader Flex Component - 플렉스 AP에서 움직이는 gif 로딩 해줌
http://dougmccune.com/blog/animatedgifloader-flex-component/

2. Asdia - flash 내에 다어이그램이나 플로우 차트, UML을 쉽게 통합해 줌
http://code.google.com/p/asdia/

3. as3flexunitlib - unit testing(ActionScript 3.0 framework)
http://code.google.com/p/as3flexunitlib/

AsWing A3 - flash application(or RIA) UI를 쉽게 만들어 줌
http://www.aswing.org/

4. Cairngorm
http://labs.adobe.com/wiki/index.php/Cairngorm

5. DisplayShelf Component - 3D
http://www.quietlyscheming.com/blog/components/tutorial-displayshelf-component/

6. flex2treemap - Treemap Component
http://code.google.com/p/flex2treemap/

7. flex4filemaker - Flex4FileMaker(Flex 2)
http://code.google.com/p/flex4filemaker/

8. FlexBook - Flex flip book component
http://www.quietlyscheming.com/blog/components/flexbook/   책표현

9. flexbox
http://flexbox.mrinalwadhwa.com/

10. flexcalendar - Flex Calendar Components
http://code.google.com/p/flexcalendar/

11. flexedtoolkit - Flexed Toolkit
http://code.google.com/p/flexedtoolkit/

12. FlexLib - 유저 인터페이스 콤포넌트
http://code.google.com/p/flexlib/

13. flexservicelocator - 웹 서비스 이용을 위한 ServiceLocator
http://code.google.com/p/flexservicelocator/

14. flextube - youtube 관련 콤포넌트
http://code.google.com/p/flextube/

15. Flex 2 Basic Email Form - HTTP Service를 사용해서 이메일 발송
http://augiemarcello.com/flex-2-basic-email-form/

16. Flex 2 Debug Component
http://www.mikenimer.com/index.cfm/2006/7/5/FlexDebugPanel

17. Flex 2 Primitive Explorer
http://www.3gcomm.fr/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html

18. Flex Developers Journal
http://flex.sys-con.com/

19. Free Visual Reflection Component for Flex 2
http://blog.benstucki.net/?id=20

20. Granite Data Services
http://www.graniteds.org/confluence/pages/viewpage.action?pageId=229378

21. JAM - ActionScript and MXML
http://www.onflex.org/code/

22. Live reflection component
http://www.rictus.com/muchado/2006/07/05/live-reflection-component/

23. osflash-xray -AS2/AS3/Flex1.5/Flex2 디버거
http://code.google.com/p/osflash-xray/

24. SpringGraph
http://mark-shepherd.com/blog/springgraph-flex-component/

25. The ServeBox Foundry
http://sourceforge.net/projects/sbasfoundry

26. ZoomFrame
http://www.zeuslabs.us/2007/08/14/open-source-flex-component-zoomframe/
2009. 11. 19. 13:13

flex 강좌




플렉스 기초 강좌 2차 1회 1-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 1회 1-2교시  : 강사-이성용(공룡) 보기 클릭  

플렉스 기초 강좌 2차 1회 2-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 1회 2-2교시  : 강사-이성용(공룡) 보기 클릭 

 

플렉스 기초 강좌 2차 2회 1-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 2회 1-2교시  : 강사-이성용(공룡) 보기 클릭  

플렉스 기초 강좌 2차 2회 2-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 2회 2-2교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 2회 2-3교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 2회 3   교시  : 강사-이성용(공룡) 보기 클릭 

 

플렉스 기초 강좌 2차 3회 1-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 3회 1-2교시  : 강사-이성용(공룡) 보기 클릭  

플렉스 기초 강좌 2차 3회 2-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 3회 2-2교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 3회 3-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 3회 3-2교시  : 강사-이성용(공룡) 보기 클릭 

 

플렉스 기초 강좌 2차 4회 1-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 4회 1-2교시  : 강사-이성용(공룡) 보기 클릭  

플렉스 기초 강좌 2차 4회 2-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 4회 2-2교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 4회 3교시     : 강사-이성용(공룡) 보기 클릭 

 

플렉스 기초 강좌 2차 5회 1-1교시  : 강사-김학영(검쉰) 보기 클릭 

플렉스 기초 강좌 2차 5회 1-2교시  : 강사-김학영(검쉰) 보기 클릭  

 플렉스 기초 강좌 2차 5회 3교시     : 강사-김학영(검쉰) 보기 클릭 

 

플렉스 기초 강좌 2차 6회 1-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 6회 1-2교시  : 강사-이성용(공룡) 보기 클릭  

플렉스 기초 강좌 2차 6회 2-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 6회 2-2교시  : 강사-이성용(공룡) 보기 클릭 

 

플렉스 기초 강좌 2차 7회 1-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 7회 1-2교시  : 강사-이성용(공룡) 보기 클릭  

플렉스 기초 강좌 2차 7회 2-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 7회 2-2교시  : 강사-이성용(공룡) 보기 클릭 

 

플렉스 기초 강좌 2차 8회 1-1교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 8회 1-2교시  : 강사-이성용(공룡) 보기 클릭  

플렉스 기초 강좌 2차 8회 1-3교시  : 강사-이성용(공룡) 보기 클릭 

플렉스 기초 강좌 2차 8회 2교시     : 강사-이성용(공룡) 보기 클릭 


2009. 10. 26. 14:38

[Eclipse] java editor template[상용구]





개발을 하면서 싱글턴 패턴을 적용할 경우가 가끔 있습니다.

사실 몇 줄 안되지만 살짝 귀찮기도 합니다. Eclipse 의 Tempate 를 이용하여 편하게 추가하는 법을 소개합니다.


이클립스에서 Window - Preferences - Java - Editor - Templates 를 선택합니다.

New 버튼을 클릭하여 새로운 Template 추가 창에 다음과 같이 입력합니다.



  1. private static ${enclosing_type} instance;   
  2.   
  3. public static ${enclosing_type} getInstance(){   
  4.     if(null == instance){   
  5.         instance = new ${enclosing_type}();   
  6.     }   
  7.     return instance;   
  8. }   
  9.   
  10. private ${enclosing_type}() {}  



싱글턴 패턴을 적용한 클래스에 sing 정도만 치고 Ctrl + Space 를 하면 아래와 같이 템플릿을 적용할 수 있습니다.


손쉽게 싱글턴 패턴이 추가되었습니다.




간만에 포스팅 쓰려니 캡쳐하는 것도 귀찮네요 ㅋㅋㅋ
2009. 10. 12. 16:25

Java FX for Eclipse





JavaFX가 넷빈즈에서만 돌아가는 줄 알았는데 역시나 이클립스 용 플러그인이 나와 있습니다.


위 링크를 통해 다운로드 받은 파일을 eclipse 설치 폴더에 압축해제하면 설치는 완료 됩니다.

사용방법은 다음과 같습니다.

아래 이미지와 내용은 해당 사이트의 Getting Start 문서를 옮겨왔습니다.

JavaFX SDK 설치

JavaFX SDK for Windows or Mac Os X 다운로드 받아 설치합니다.

Eclipse 설치

Eclipse 3.4 이상이 필요하며. Eclipse IDE for Java EE Developers for Windows or Mac OS X 설치가 필요합니다.

Plugin 설치

  1. plugin을 다운로드 받습니다.:
  2. com.sun.javafx.eclipse.feature-win32-win32-x86-1.0.1.zip for Windows
  3. com.sun.javafx.eclipse.feature-macosx-carbon-x86-1.0.1.zip for Mac OS X
  4. eclipse 설치 디렉토리에 압축을 해제합니다.
  5. Eclipse 을 실행합니다.

JavaFX 프로젝트 만들기 와 JavaFX SDK 설정하기
  1. 이클립스를 시작하면 이클립스 workbench의 기본 레이 아웃이 보입니다.
    New empty workbench
  2. Package Explorer에서 오른쪽 클릭하여 New > Java Project 를 선택합니다.
    New Java Project menu
  3. Create a new JavaTM project 로 자바 프로젝트를 생성합니다. 
    New empty workbench
  4. MyJavaFXProject 라는 프로젝트 명과 Finish 버튼을 누릅니다. 새로운 프로젝트가 Package Explorer에 나타납니다. 
    New project created
  5. 프로젝트 이름을 선택하고 오른쪽 클릭하여 JavaFX > Add JavaFX Nature 를 선택합니다.
    Add JavaFX nature to Java Project
  6. 그럼 JavaFX perspective가 활성화 됩니다. JavaFX nature 를 Java Project 에 처음 추가 하는것이라면 JAVAFX_HOME 속성값을 물어볼수도 있습니다.
    Error, JavaFX SDK home not set up.
    JAVAFX_HOME 속성 설정은 아래 단계를 따릅니다.:
    1. 다이얼로그 메시지의 OK 버튼을 누르고 No thanks, I prefer Cancel 버튼을 누릅니다.
    2. 아래와 같은 다이얼로그 창이 그면 JAVAFX_HOME 값을 (empty)로 추가시킵니다.
      Preferences: Classpath Variables
    3. 그리고 Edit... 버튼을 누르면 아래와 같은 창이 뜹니다.
      Edit classpath variable
    4. Folder... 버튼을 눌러 the JavaFX SDK 설치 폴더를 지정해줍니다. 
      Select instalation folder of JavaFX SDK
    5. 폴더선택창의 OK 버튼을 누르고, 변수 Edit 창의 OK 버튼을 누릅니다. 
      Result of setting JAVAFX_HOME property
    6. Preferences 다이얼로그의 OK버튼을 누릅니다. 그럼 JAVAFX_HOME 변수의 세팅이 끝납니다. 만약 Cancel 버튼을 누르면 에러 다이얼로그 창이 뜨며 다시 반복하여 묻게 됩니다.
  7. 이로서 첫번째 JavaFX Project 생성이 완료되었습니다. 
    Opened JavaFX Perspective with Java Project with JavaFX nature

Adding Files

  1. MyJavaFXProject 를 확장해보자. src 폴더를 선택하고. 오른쪽 클릭을 하여 New > Package를 선택한다. 그리고 package 이름에 com.sun.eclipse.example를 입력해보자.
    Adds new Empty Script file into folder.
  2. src/com.sun.eclipse.example 폴더를 오른쪽 클릭후. New > Empty Script 를 선택하자.
    Adds new Empty Script file into folder.
  3. New File 마법사가 보일것이다. Name 필드에 Main 이라고 입력하자.
    New file wizzard
  4. Finish 버튼을 누르면 새로운 JavaFX 스크립트 창이 열린다. 
    New empty FX script
  5. Snippets view를 보자. 여기엔 애플리케이션 개발을 도와줄 여러 가지 code snippets 이 있다. Applications 항목을 열어 Stage를 선택해보자.
    Snippets View
  6. Stage 노드를 editor window로 Drag and drop 하면. Insert Template: Stage 다이얼로그가 보인다. title 변수값을 Hello World 로 바꾸자.
    Result after drop
  7. Insert 버튼을 누르면 template 의 결과가 소스 코드로 변환되어 insert 된다. 
    Result in editor
  8. Mission accomplished, Sir!

Running

Eclipse 로 실행하는 것은 매우 쉽다.

  1. 툴바의 Run 버튼을 누른다. 
    Run icon
  2. 첫번째 실행이라면 Edit Configuration 다이얼로그가 보인다. 
    Configuration
    모든 옵션은 default 값이다. 가장 흥미로운 부분은 Profile - Target 옵션이다. 여기서 실행환경을 조정할 수 있다. 가능한 옵션은 아래와 같다.:
    • Desktop profile - Run as Application
    • Desktop profile - Run as Applet
    • Desktop profile - Run with WebStart
    • Mobile Profile[?] - Run in Emulator
  3.  Run 버튼을 눌러 애플리케이션을 작동시킨다. console 창에 실행 프로그레스가 뜰것이다. 
    Running application

Building

Eclipse 에서의 Build 작업은 default로 자동으로 제공된다. Project 메뉴에서 Build와 관련된 좀 더 많은 옵션을 볼 수 있다.

Configuration Options

  1. Package Explorer 에서 프로젝트 선택 후 오른쪽 클릭하여 Properties를 선택한다. 
    Menu: Project Properties
  2. Properties 창이 보이면 JavaFX Defaults 를 선택한다.
    Properties: JavaFX Defaults
    여기서 JavaFX Project의 실행과 디플로이 프로세스 동안 사용되는 몇가지 기본 파라미터 값을 수정할 수 있다. 좀 더 많은 정보는 JavaFX Packager Documentation 을 통해 볼 수 있다.

JavaFX Help

이 플러그인은 JavaFX SDK documentation로의 접근을 매우 쉽게 해준다. Help > Java FX > JavaFX Script Documentation or press Ctrl + F1 를 누르므로서 Document에 접근 할 수 있다.
JavaFX SDK Help

Footnotes:

  • 언제든 JAVAFX_HOME 변수를 아래와 같은 방법으로 수정 할 수 있다.:
    1. Open Window > Preferences
    2. Expand Java > Build Path and select Classpath Variables
    3. Edit JAVAFX_HOME
  • SDK의 profile을 아래 단계를 통해 수정 할 수 있다.:
    1. Right click on project name. Select Properties > Java Build Path > Libraries
    2. Double click on JavaFX System Library. The Edit Library dialog appears. Here you can set the profile to use.
      Dialog: Edit JavaFX System Library
2009. 9. 21. 10:18

Base64 Encoding/Decoding 예제





Base64 Encoding/Decoding 예제



package monky.libs.security;



import sun.misc.*;
import java.io.*;



public class Base64Utils {

/**
  * Base64Encoding 방식으로 바이트 배열을 아스키 문자열로 인코딩한다.
  * In-Binany, Out-Ascii
  *
  * @param encodeBytes  인코딩할 바이트 배열(byte[])
  * @return  인코딩된 아스키 문자열(String)
  */
public static String encode(byte[] encodeBytes) {
  byte[] buf = null;
  String strResult = null;
 
  BASE64Encoder base64Encoder = new BASE64Encoder();
  ByteArrayInputStream bin = new ByteArrayInputStream(encodeBytes);
  ByteArrayOutputStream bout = new ByteArrayOutputStream();
 
  try {
   base64Encoder.encodeBuffer(bin, bout);
  } catch (Exception e) {
   System.out.println("Exception");
   e.printStackTrace();
  }
  buf = bout.toByteArray();
  strResult = new String(buf).trim();
  return strResult;
}



/**
  * Base64Decoding 방식으로 아스키 문자열을 바이트 배열로 디코딩한다.
  * In-Ascii, Out-Binany
  *
  * @param  strDecode 디코딩할 아스키 문자열(String)
  * @return  디코딩된 바이트 배열(byte[])
  */
public static byte[] decode(String strDecode) {
  byte[] buf = null;
 
  BASE64Decoder base64Decoder = new BASE64Decoder();
  ByteArrayInputStream bin = new ByteArrayInputStream(strDecode.getBytes());
  ByteArrayOutputStream bout = new ByteArrayOutputStream();

  try {
   base64Decoder.decodeBuffer(bin, bout);
  } catch (Exception e) {
   System.out.println("Exception");
   e.printStackTrace();
  }
  buf = bout.toByteArray();
  return buf;
}



public static void main(String args[]) {
  String strOrgin = "Monky";
  String strDecode = null;
  byte[] bytOrgin = strOrgin.getBytes();
 
  System.out.println("OriginString=" + strOrgin);
 
  String strEncoded = Base64Utils.encode(bytOrgin);
  System.out.println("EncodedString=" + strEncoded);
 
  byte[] bytDecoded = Base64Utils.decode(strEncoded);
  strDecode = new String(bytDecoded);
  System.out.println("DecodedString=" + strDecode);
}


}



수행결과

OriginString=Monky
EncodedString=TW9ua3k=
DecodedString=Monky


        /**
         * BASE64 Encoder
         * @param str
         * @return
         * @throws java.io.IOException
         */
        public static String base64Encode(String str)  throws java.io.IOException {
                sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
                byte[] b1 = str.getBytes();
                String result = encoder.encode(b1);
                return result ;
        }

        /**
         * BASE64 Decoder
         * @param str
         * @return
         * @throws java.io.IOException
         */
        public static String base64Decode(String str)  throws java.io.IOException {
                sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
                byte[] b1 = decoder.decodeBuffer(str);
                String result = new String(b1);
                return result ;
        }