반응형

반응형

개발 도구

  1. Eclipse : http://www.eclipse.org/
  2. Netbean : http://www.netbeans.org/community/releases/60/index.html
  3. Firebug : http://www.getfirebug.com/

소스코드 관리

  1. CVS : http://www.cvshome.org
  2. Subversion : http://subversion.tigris.org
  3. MS Visual SourceSafe
  4. BitKeeper : http://www.bitkeeper.com
  5. ClearCase : http://www-306.ibm.com/software/awdtools/clearcase/

빌드 스크립트 도구

  1. make : http://source.redhat.com/cygwin
  2. Automake : http://www.gnu.org/software/automake
  3. Ant : http://ant.apache.org
  4. NAnt : http://nant.sourceforge.net
  5. Groovy : http://groovy.codehaus.org
  6. Rake : http://rake.rubyforge.org/  
  7. SCons : http://www.scons.org/

빌드 시스템

  1. Mavenhttp://maven.apache.org 
  2. Maven2 : http://maven.apache.org/maven2/index.html

CI 도구 (Continuous integration )

  1. CruiseControl : http://cruisecontrol.sourceforge.net
  2. CruiseControl .NET : http://sourceforge.net/projects/ccnet
  3. DamageControl : http://damagecontrol.codehaus.org
  4. AntHill : http://www.urbancode.com/projects/anthill
  5. Continuum : http://maven.apache.org/continuum
  6. LuntBuild : http://luntbuild.javaforge.com/  
  7. Buildix : http://buildix.thoughtworks.com/  
  8. Hudson : https://hudson.dev.java.net/  (직관적이고 사용법이 쉬움)

이슈 추적 도구

  1. Bugzilla : http://www.bugzilla.org
  2. JIRA : http://www.atlassian.com/software/jira/default.jsp
  3. FogBugz : http://www.fogcreek.com/FogBugz
  4. PR-Tracker : http://www.prtracker.com  
  5. Trac : http://trac.edgewall.org/

테스트 프레임워크

  1. JUnit : http://www.junit.org
  2. NUnit : http://www.nunit.org
  3. xUnit.NET : http://www.codeplex.com/xunit
  4. MbUnit : http://www.mbunit.org
  5. HTMLUnit : http://htmlunit.sourceforge.net
  6. HTTPUnit : http://httpunit.sourceforge.net
  7. JWebUnit : http://jwebunit.sourceforge.net
  8. Cobertura : http://cobertura.sourceforge.net
  9. Clover : http://www.cenqua.com/clover  
  10. Cactus : http://jakarta.apache.org/cactus/
  11. Emma : http://emma.sourceforge.net/
  12. Fit : http://fit.c2.com
  13. Fitness : http://fitnesse.org  
  14. Watir : http://wtr.rubyforge.org
  15. Systir : http://atomicobject.com/systir.page
  16. AUT : http://aut.tigris.org/
  17. UnitTest++ : http://unittest-cpp.sourceforge.net/  
  18. TestNG : http://testng.org/doc/  
  19. CppUnit : http://sourceforge.net/projects/cppunit  
  20. CppUnit2 : http://cppunit.sourceforge.net/cppunit-wiki/CppUnit2  
  21. Selenium : http://www.openqa.org/
  22. Agitar : http://www.agitar.com/  
  23. JTest : http://www.parasoft.com/jsp/home.jsp  
  24. PushToSoft : http://www.pushtotest.com/  
  25. Eclemma : http://www.eclemma.org/

프로젝트 관리

  1. OpenProj : http://openproj.org/openproj 
  2. dotproject : http://www.dotproject.net/
  3. Mantis : http://www.mantisbt.org/

커뮤니케이션 도구, 위키

  1. MoinMoin : http://moinmoin.wikiwikiweb.de/
  2. Confluence : http://www.atlassian.com/software/confluence/
  3. TWiki : http://twiki.org/
  4. SocialText : http://www.socialtext.com/  
  5. Springnote : http://www.springnote.com/ko

성능분석

  1. ANTS Load : http://www.red-gate.com/products/ants_load/index.htm  
  2. JunitPerf : http://www.clarkware.com/software/JUnitPerf.html  
  3. Jmeter : http://jakarta.apache.org/jmeter/

기타

  1. Structure101 : http://www.headwaysoftware.com/index.php  
  2. FreeMind : http://freemind.sourceforge.net/wiki/index.php/Main_Page  
  3. Capistrano : http://manuals.rubyonrails.com/read/book/17


 

출처 :   개발이 좋아 개발자가된 많은 사람들에게 말하고 싶은 이야기. by k16wire
           http://moai.tistory.com/notice/270 

반응형

[edit] Open-source products

  • Bandera — analyser for Java
  • Checkstyle — analyse Java and apply coding standard
  • ClassCycle — analyse Java class cycles and class and package dependencies (Layers)
  • CQual — A tool for adding type qualifiers in C
  • FindBugs — an open-source static bytecode analyzer for Java (based on Jakarta BCEL).
  • Flawfinder — open source programming tool that examines C or C++ source code for security weaknesses.
  • Jlint — for Java
  • JsLint - online analyzer for JavaScript
  • Oink — collaboration of C++ static analysis tools
  • Perl::Critic - a static code analysis tool for Perl
  • Pixy — a PHP 4 source code scanner for detection of XSS and SQL injection vulnerabilities.
  • PMD (software) — a static ruleset based Java source code analyzer that identifies potential problems.
  • PyChecker - The original static code analyser for Python.
  • pylint - A static code analyser for Python. Works as a plugin to PyDev for the Eclipse IDE.
  • RATS — Rough Auditing Tool for Security, which can scan C, C++, Perl, PHP and Python source code.
  • Soot — A Java program analysis and compiler optimization framework
  • Sparse — a tool designed to find faults in the Linux kernel.
  • Splint — an open source evolved version of Lint (C language).

[edit] Commercial products

  • Aivosto Oy's - Project Analyzer - Static code analysis tool for VBA, and VB6/VB.net
  • Armorize Technologies CodeSecure - source code scanning (PHP, J2EE, ASP, etc.)
  • Axivion Bauhaus Suite — a tool for C, C++, Java and Ada code that comprises various analyses such as architecture checking, interface analyses, and clone detection.
  • checKing - monitors the quality of software development process, including violations of coding rules for Java, JSP, Javascript, XML and HTML.
  • Checkmarx CxSuite - a suite of software which helps developers and auditors identify software security vulnerabilities. Company homepage (http://www.checkmarx.com)
  • ClockSharp - checks C# code against the Philips C# coding standard.
  • Compuware DevPartner - static code analyzer for .NET (C#, ASP.NET) with Visual Studio 2005 integration
  • Coverity Prevent — analyzes C, C++ and Java code.
  • DMS Software Reengineering Toolkit — supports custom analysis of C, C++, Java, COBOL, and many other languages.
  • Fortify — helps developers identify software security vulnerabilities in C/C++, Java, JSP, Javascript, ASP.NET, C#, VB.NET, PHP, "Classic" ASP, VB, PL/SQL, T-SQL, XML and other languages.
  • FxCop — static analysis for Microsoft .NET programs based on IL. Standalone and integrated in some Microsoft Visual Studio editions. From Microsoft.
  • Green Hills Software DoubleCheck - static analysis for C and C++ code.
  • HP Code Advisor - A static analysis tool for C and C++ programs
  • Intel Compiler Suite — The Intel compilers Intel C++ Compiler and Intel_Fortran_Compiler both offer static analysis.
  • IntelliJ IDEA — IDE for Java that also provides static code analysis.
  • Klocwork K7 — provides security vulnerability and defect detection as well as architectural and build-over-build trend analysis for C, C++ and Java
  • Lattix, Inc. LDM - Architecture and dependency analysis tool for Ada, C/C++, Java, .NET software systems.
  • LDRA Testbed - A software analysis and testing tool suite for C, C++, Ada83, Ada95 and Assembler (Intel, Freescale, Texas Instruments).
  • M Squared Technologies Resource Standard Metrics - source code analysis and metrics (Java, Javascript, etc.)
  • Microsoft Visual Studio - Visual Studio Team System includes a static code analyzer.
  • MZTools - MZTools 3.0 - Free Static Code Analysis, productivity enhancement tool for VBA.
  • NStatic - deep static analysis of C# code.
  • Ounce Labs — automated source code analysis that enables organizations to identify and eliminate software security vulnerabilities in languages including Java, JSP, C/C++, C#, ASP.NET, and VB.Net.
  • Parasoft - static code analysis and security testing tools for Java, C, C++, C#, .Net, HTML, CSS, JavaScript, VSscript.
  • PC-Lint - A multiplatform static code analysis tool by Gimpel Software for C and C++. Also available for the GNU/Linux and Unix operating systems in the form of FlexeLint.
  • PolySpaceTM code verifiers by The MathWorks - Software verification for C, C++ and Ada
  • QA-C - deep static analysis of C for quality assurance and guideline enforcement.
  • ReSharper - Add-on for Visual Studio 2003/2005 from the creators of IntelliJ IDEA, which also provides static code analysis for C#.
  • SemmleCode — object oriented code queries for static program analysis.
  • SofCheck Inspector — provides static detection of logic errors, race conditions, and redundant code for Java and Ada.
  • Sotoarc/Sotograph - Architecture and quality in-depth analysis and monitoring for Java, C#, C and C++
  • STAN — Structure Analysis for Java. Eclipse integrated visual dependency analysis, quality metrics and reporting.
  • Swat4j — a model based, goal oriented source code auditing tool for Java. Comes as an Eclipse plug-in.
  • Telelogic Logiscope RuleChecker (coding standards checking) and Audit (metrics measurement and ISO 9126-based quality modeling) for C, C++, Ada, Java.
  • TorqueWrench - A static Java bytecode analysis tool by StackFrame, LLC.
  • Understand — analyzes C,C++, Java, Ada, Fortran, Jovial, Delphi — reverse engineering of source, code navigation, and metrics tool.
  • Viva64 — analyzes C, C++ code for detect 64-bit portability issues.
  • Veracode SecurityReview — an outsourced application security testing and remediation, C, C++, Java, .Net and other languages.
  • CodePro Analytix - Static code analysis for Java, integrated with Eclipse.
  • Sparrow - C/C++ memory-bug detecting static analyzer.

반응형
1900 Drag & Drop의 구현

스윙에서의 Drag & Drop 을 구현해 보자. 과정이 꽤 복잡하고 기능상에 약간의 제약은 있으나 한번 구현해 볼 만한 예제라고 생각을 한다. 소스코드는 자바소프트에서 발췌했음을 알아두길 바란다. 중간중간에 풍선도움말을 두겠으니 단풍잎에 마우스를 갖다대면 도움말이 뜨니 참고하길 바란다.

Drag & Drop step
Drag & Drop 을 구현하는 것은 비교적 쉽다. 그렇지만 가장 난해한 것은 모든 과정에 대해서 이해하는 것이다. 다음의 순서를 먼저 익혀두길 바란다.     [ DnD Source Download]

1. Drag source 에 대한 참조를 가진다. - DragSource.getDefaultSource() 나 new DragSource() 를 통해서.
2. Drag gesture recognizer 를 생성한다. - DragSource.createDafaultGestureRecognizer()
3. Drop target 를 생성한다. - 하나의 컴포넌트와 Drop target listener 를 명세한다.
4. Transferable 로 옮겨질 수 있는 데이타를 wrap 한다.
5. Drag 를 초기화한다. - DragSource.startDrag()
6. DropTargetLisenter, DragSource 인터페이스를 구현함으로써 Drop 를 핸들링한다.

Drag & Drop (이하 D&D) 는 하나의 datasource 와 여러개의 droptarget 에 - 흔히 콤포넌트와 연관되어져 있다 - 와 연관되어 이뤄진다. 다음에 나열된 클래스와 인터페이스는 D&D 에서 사용되는 것을 정리한 것이다. 대부분의 것들은 java.awt.dnd 패키지에 있고, 오직 하나 Transferable 은 java.awt.datatransfer 패키지에 있다.

DragGestureRecognizer : 컴포넌트에서 drag 를 수행할려고 할때 이벤트를 발사한다.
DragSource : Drag 와 DragGestureRecognizer 를 초기화한다.
DropTarget : 연관된 컴포넌트 상에서 Drop 이 일어난다.
Transferable ; D&D 를 통해서 전송되어지는 데이타를 위한 Wrapper 이다.
DragGestureListener : DragGestureRecognizer 에 의해 통보를 받고 drag 를 초기화한다.
DragSourceListener : DragSource 이벤트에 반응한다.
DropTargetListener : Drop 포함한 target 이벤트를 핸들링한다.

D&D 는 하나의 기미(Gesture) 즉, 마우스를 내려서 드래깅을 시도할때 초기화된다. 그러면 DragGestureRecognizer 는 이런 기미를 포착하고 이벤트를 발생하는 것이다.
DragSource 는 startDrag() 메소드로 초기화작업을 수행하고, createDragGestureRecognizer() 나 createDafaultDragGestureRecognizer() 를 이용하여 DragGestureRecognizer 를 생성하게 되는 것이다.
DropTarget 은 하나의 컴포넌트와 Listener 객체와 연관되어 있어서 drop target event 가 발생할때 listener 객체가 통보를 받게 된다.
DragGestureListener 는 recognizer 에 의해 drag gesture 를 통보받는데 전형적인 반응예는 DragSource.startDrag() 메소들르 호출하게 되었을 경우이다.
DragSourceListener 는 drag 가 초기화된 후 dragsource 에서 일어나게 된다.

다소 나열적인 설명이었지만 어느 정도 감을 잡기 위해서 중복 설명했다. D&D 하는 과정과 메소드호출, 클래스와 인터페이스의 API 를 꼼꼼하게 살펴보면 이해할 수 있으리라 생각한다. 가장 기본적인 D&D 를 하기 위해서는 반드시 DragSource, DropTarget, DragGestureRecognizer, Transferable 이 반드시 생성이 되어야 하고, Listener 가 구현되어야 한다는 것을 명심하길 바란다. 그러나 실제 구현은 몇가지 객체를 생성하고 데이타를 Wrapping 하고 핸들링하는 것을 빼면 나머지 동작은 프로그래머 재량에 상관없이 자체적으로 구현이 된다.
Adding D&D to Swing Component
여기서도 두가지 방법이 있을 수가 있는데 한가지 방법으로는 Swing Component 를 상속해 객체를 만들어 그것을 DragSource, DropTarget 으로 만들어 사용하는 방법과 제 3의 콤포넌트를 생성해 두가지를 수행하는 방법이 있다.
첫번째 방법으로 수행을 하면 반드시 객체만이 D&D 특성을 가질수가 있고, 표준 Component 는 그런 특성을 공유할 수 없음을 명심하길 바란다. 가령 JList 를 상속한 ListDragSource 객체를 만들어서 D&D 를 추가해 사용한다면 ListDragSource 만이 그런 동작을 할 수 있다는 것을 의미한다.

아래에 있는 그림은 이 프로그램을 실행시켰을때 볼 수 있는 화면이다. 왼쪽은 DragSource 로 JTree 를 이용해 구현했고, 오른쪽은 DropTarget 은 JTextPane 을 이용해 구현했음을 보길 바란다. 이것은 .txt 와 .java 로만 한정되어 있기 때문에 다른 확장자를 가진 파일을 D&D 했을 경우에는 에러창을 발견하게 될 것이다. 그리고 .txt 와 .java 파일은 그 내용을 JTextPane 에서 볼 수 있을 것이다.

 

오른쪽의 파일을 D&D 수행할 수가 있다

 

확장자가 .txt 와 .java 가 아닐 경우에 볼 수 있는 경고창이다.


위의 프로그램은 얼마든지 응용해서 확장할 수 있다고 생각한다. 다른 파일도 볼 수 있게끔 할 수 있고, image 도 가능하리라 생각한다.
다음 장에서는 소스코드 분석에 들어가도록 하겠다. 먼저 해당 API 를 꼼꼼히 살펴본 다음에 코드분석에 임하길 바란다.
  
Source Analysis
Test.java 소스이다. main() 와 기본 인터페이스가 설정돼 있다. 아래의 코드를 살펴보면 알겠지만
Test 생성자는 drop target 을 생성해낸다.
 즉 TextPane 을 drop target component 로 생성하는 것이다.
실제 drop 이 일어났을때 Test.drop() 메소드가 호출이 된다. drop 과 연관된 transferable 은
 String 으로써 데이타를 제공해주며 drop 을 받아들인 후에 readFile() 메소드가 호출이 돼
 file 의 내용을 TextPane 으로 로딩을 하게 된다.
Drop 이 완료된 후 e.dropComplete(true) 가 호출이 돼 실제 drop 이 완료되게 된다.
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;

public class Test extends JFrame implements DropTargetListener {
	private JTextPane textPane = new JTextPane();

	public Test() {
                   super("Drag and Drop With Swing");
                   new DropTarget(textPane,DnDConstants.ACTION_COPY_OR_MOVE,this);
	   JSplitPane splitPane =
                      new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,createTreePanel(),createTextPanel());
	   splitPane.setDividerLocation(250);	
	   splitPane.setOneTouchExpandable(true);
	   getContentPane().add(splitPane, BorderLayout.CENTER);
	}
	public static void main(String args[]) {
	  Test test = new Test();
	  test.setBounds(300,300,850,350);
	  test.setVisible(true);
	  test.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	  test.addWindowListener(new WindowAdapter() {
	  public void windowClosed(WindowEvent e) {
                        System.exit(0);
	    }
	  });
	}
	private JPanel createTreePanel() {
	  JPanel treePanel = new JPanel();
	  DragTree tree = new DragTree();
	  treePanel.setLayout(new BorderLayout());
	  treePanel.add(new JScrollPane(tree), BorderLayout.CENTER); 
	  treePanel.setBorder(BorderFactory.createTitledBorder(
		"Drag source for filenames"));
        	return treePanel;
	}
	private JPanel createTextPanel() {
	  JPanel textPanel = new JPanel();
	  textPanel.setLayout(new BorderLayout());
	  textPanel.add(new JScrollPane(textPane),BorderLayout.CENTER);
	  textPanel.setMinimumSize(new Dimension(375,0));
	  textPanel.setBorder(BorderFactory.createTitledBorder(
	    "Drop target for filenames"));

	  return textPanel;
	}
	private void readFile(final String filename) {
	  EditorKit kit = textPane.getEditorKit();
	  Document document = textPane.getDocument();

          try {
	    document.remove(0,document.getLength());
	    kit.read(new FileReader(filename), document, 0); 
	  }
	  catch(Exception ex) {
	    ex.printStackTrace();
	  }
	}
        
	public void drop(DropTargetDropEvent e) {
	  try {
	   DataFlavor stringFlavor = DataFlavor.stringFlavor;
	   Transferable tr = e.getTransferable();
 public class DataFlavor extends Object implements Externalizable, Cloneable
 
 이 클래스는 D&D 수행할 때 클립보드에 들어가는 데이타의 형태를 제공해주는 클래스이다.
 여기서 사용된 StringFlavor 는 java Unicode String class 을 나타낸다.
 MimeType = "application/x-java-serialized-object" 을 나타내게 된다.
if(e.isDataFlavorSupported(stringFlavor)) { String filename = (String)tr.getTransferData(stringFlavor); e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); // 인자로 넘어온 액션으로 drop 을 받아들인다. readFile(filename); textPane.setCaretPosition(0); // Text 의 첫줄이 TextPane 의 첫줄에 오게끔 설정한다. e.dropComplete(true); } else { e.rejectDrop(); // Drop 을 거절한다. } } catch(IOException ioe) { ioe.printStackTrace(); } catch(UnsupportedFlavorException ufe) { ufe.printStackTrace(); } } // DropTargetListener 메소드를 구현한 부분이다. public void dragEnter(DropTargetDragEvent e) { } public void dragExit(DropTargetEvent e) { } public void dragOver(DropTargetDragEvent e) { } public void dropActionChanged(DropTargetDragEvent e) { } }
< 출처 : http://www.javastudy.co.kr/docs/b612/swing/draganddrop.html >
반응형

안녕하세요
Winter of Code 운영자 입니다.

Winter of Code란 학생-개발자간의 합작 프로젝트로 일정기간(1/31~3/18) 동안 프로젝트를 진행을 하면서 멘토와, 그리고 다른 참가자와 만나서 교류(네트워킹)하는 행사 입니다.

특히 WoC 2008에서는, 참여, 공유, 개방이라는 키워드에 알맞게, 프로젝트를 진행하는 것 못지 않게, WoC 참가자들간의 교류를 지향 합니다.


Code your Network!!

이 캐치프레이즈는 개발을 꿈꾸는 예비개발자들의 실력향상에 못지않게, 같은 분야의 동료를 만나는 것의 중요성을 이야기 합니다.
WoC의 프로젝트기간이 끝난 이후에도, 직접 만들고 싶은 서비스나, 프로그램이 있을 때 WoC에서 함께 했던 동료들과 아이디어와 기술을 나누고, 함께 시도 할 수 있는 Network을 넓혀가는 행사로 만들어 가려고 합니다.

많은 참여 부탁 드립니다.




WoC에 참가를 하게 되면,, (WoC 혜택)
  • 프로젝트 진행을 통한 Spec up!
프로젝트 진행 과정에서 발생하는 어려운 문제를 해결해가면서 얻는 기술은 학생 때에 할 수 있는 최고의 Spec Up 기회입니다.

  • 멘토에게 듣는 개발 실무    
개발실무자인 멘토의 조언을 통해 실무에서 다져진 프로젝트 진행 방법, 그리고 현재 기업에서 가장 필요로 하는 입사자의 능력 혹은 성격 등에 대한 진솔한 조언을 들을 수 있습니다.

  • 개발에 관심 있는 친구, 동료를 만날 수 있는 곳 WoC
팀 프로젝트를 통해 인맥을 만들고, 훗날 취업, 서비스 개발의 길을 함께 할 수 있는 친구와 동료를 만날 수 있는 있습니다.



  • WoC에서는 이러한 분들의 참여를 기다리고 있습니다.
- 새로운 기술을 습득 하고 실력향상에 열정을 가진 분들
- 주변의 사람들과 함께 교류(네트워킹)하는 것을 즐기는 분들
- 다양한 분야를 다양한 시각으로 바라보는 것을 좋아하는 분들


수행계획서 신청기간 : 08. 12/20~ 09. 1/18 (24시)
프로젝트 신청기간 : 08. 12/20~ 09. 1/28 (13시)


<추가 참가 혜택>

1. 오프라인 강연
학생들에게 도움이 되는 다양한 오프라인 강연을 준비하고 있습니다. 
  • 기업 출신 멘토 강연 (예상주제: 기업개발문화, 기업에서 원하는 인재상, 팀 프로젝트 스킬 등)
  • 학생 벤처 성공비결 (난~ 단순히 하고 싶은 프로젝트로 회사를 차렸을 뿐이고! 대박이 났고!)
  • 개발자의 돋보이는 이력서
  • 개발 서적 번역 스토리 (개발자들의 지적인일상)  

2. 우수작 시상
  • 우수작 한국 소프트웨어 진흥원장상 수여
  • 최우수상 300만원 (1팀)
  • 우수상 100만원 (2팀)
  • 특별상 20만원씩 (5팀)
참고: WoC 우수작 선정은 멘토와 운영위원회 그리고 참여하는 학생들의 의견을 모아 결정됩니다. 특히 특별상은 WoC 우수작의 백미로 WoC 프로젝트를 진행하는 과정에 열심히 그리고 즐겁게 참여한 팀들에게 드리는 상입니다. Ex: 교류상, 공유상, 인기상

3. 프로젝트 보조금 40만원 지급
보조금은 개발 및 연구비용으로 사용처는 크게 오프라인 모임 식음료대와 프로젝트 진행용 도서구입비로 나누어 집니다. 자세한 보조금 사용 내역은 후에 멘토 및 학생프로젝트 팀리더에게 전달 예정입니다.  

4. 사은품
- 취업 포탈 정보 교환권
- W 팩키지: 온?오프라인 행사 참가 시 따뜻한 무릎 담요와 멋진 모자티셔츠를 증정합니다.    

5. 한빛 미디어 40% 할인혜택 (WoC 프로젝트 기간동안)
반응형
저희는 오늘 전국 260여 스타벅스 매장에 KT 무선 인터넷 서비스를 무료로 제공한다는 소식을 전해드립니다.

스타벅스를 찾는 고객 누구나 자신의 단말기를 이용해 KT 무선 인터넷 서비스를 무료로 이용할 수 있습니다. 스타벅스에서 무료 인터넷을 사용하려면, 무선랜이 장착된 노트북을 이용해 메인 화면에서 ‘무료 인터넷 사용하기’ 버튼을 클릭하면 됩니다. 별도의 회원 가입이나 접속 프로그램 없이 인터넷을 편리하게 즐길 수 있습니다.


이번 무선인터넷 무료제공 캠페인은 ‘전세계 정보를 체계화하여 언제 어디서나 접속하여 활용할 수 있도록 하겠다’는 구글의 미션을 국내에서 실천한 또 하나의 좋은 예입니다. 요즘과 같이 경기가 침체되었을 때, 국내 사용자들이 언제 어디서나 경제적이면서도 쉽고, 빠르고, 편리하게 인터넷을 이용하는데 도움이 되었으면 합니다!

작성자: 구글코리아 블로그 운영팀


ㅎㄷㄷ 구글 대단하네..  이런 발상 아주 좋다고 생각한다..

역시 구글인가.. 구글 기업 이미지가 한층 업그레이드 되는듯 하다..

접때 일산 화정역 인근 스타벅스에서 노트북을 가지고 사용한적이 있었다..

여러개의 무선네트워크가 잡히긴 했지만 스타벅스가 아닌 인근 건물 네트워크라 사용하기 불편했다.

망할 스타벅스 무선네트워크도 제공하지 않다니 하고 실망했다. ㅎㅎ 뭐 이젠 구글이 제공한다니...
반응형
<출처 : http://javaora.tistory.com/entry/Learning-the-JavaFX-Script-Programming-Language-Lesson-11-Access-Modifiers >

목차
- 기본 접근자
- package 접근자
- protected 접근자
- public 접근자
- public-read 접근자
- public-init 접근자


- 기본 접근자
기본접근자는 "scipt-only"로서 특별한 접근자 키워드를 제공하지 않는다. 

var x;
var x : String;
var x = z + 22;
var x = bind f(q);

기본 접근자는 같은 스크립트 파일 내에서는 얼마든지 접근이 가능하며 그외에는 모든 접근이 불가능하다.


- package 접근자
package 접근자는 이름에서 알 수 있듯 같은 패키지 내에서는 변수, 함수, 클래스의 접근이 가능하다.

// Inside file tutorial/one.fx
package tutorial; // places this script in the "tutorial" package
package var message = "Hello from one.fx!"; // this is the "package" access modifier
package function printMessage() {
     println("{message} (in function printMessage)");
}

// Inside file tutorial/two.fx
package tutorial;
println(one.message);
one.printMessage();

위 소스를 tutorial 이라는 디렉토리를 만들어 각각 one.fx 와 two.fx라는 파일로 저장하자.

javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two

두개의 파일을 컴파일후 two 파일을 실행해보자.

Hello from one.fx!
Hello from one.fx! (in function printMessage)

예를 보면 둘다 tutorial이란 패키지 명을 생성되어있으며 two.fx 파일에서 one.fx 파일의 변수와 함수를 사용함에 있어 문제가 없음을 알 수 있다.


- protected 접근자
protected 접근자는 같은 패키지 내에서 또한 해당 클래스를 상속받은 서브클래스에서의 접근만을 허용한다.


- public 접근자
public 접근자는 이전 레슨을 통해서 보았듯이 접근에 제한이 없다.


- public-read 접근자
public-read 접근자는 변수의 읽기 기능만 public으로 선언하며 쓰기 기능은 같은 스크립트 파일내에서만 가능하다. 추가적으로 두개의 접근자를 이용하여 쓰기 기능의 접근자를 지정 할 수도 있다. 가령 package public-read 또는 protected public-read 와 같이 접근자를 쓴다면 쓰기기능에 있어서는 package나 protected의 접근성을 제공한다는 의미이다. 예를 보도록 하자.

// Inside file tutorial/one.fx
package tutorial;
public-read var x = 1;

// Inside tutorial/two.fx
package tutorial;
println(one.x);

아까 작성한 예제 파일 one.fx와 two.fx를 다음과 같이 수정해 보자. 그리고 컴파일 후 실행해보자.

javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two

1

그 결과는 쉽게 예상 가능 할 것이다. 그럼 two.fx 예제를 다음과 같이 수정해보자.

// Inside tutorial/two.fx
package tutorial;
one.x = 2; 
println(one.x);

public-read 접근자 속성이 부여된 변수를 수정해보려고 하면 어떻게 될까? 컴파일하면 다음과 같은 에러메시지가 나온다.

tutorial/two.fx:3: x has script only (default) write access in tutorial.one
one.x = 2;
   ^
1 error

그럼 이번엔 one.fx 파일의 x 변수의 쓰기 권한을 package로 바꿔보자.

// Inside file tutorial/one.fx
package tutorial;
package public-read var x = 1;

// Inside tutorial/two.fx
package tutorial;
one.x = 2;
println(one.x);

컴파일후 실행하면 바뀐 값인 "2"가 출력될 것이다. 위에 언급한대로 쓰기에 package 접근속성을 부여 하였으므로 같은 tutorial 패키지 내 이므로 그 수정이 가능하다.


- public-init 접근자
public-init 접근자는 변수에 초기화 기능에만 public 접근 속성을 부여한다. 그러나 처음 초기화 이외의 쓰기 권한은 public-read와 같은 방식으로 이용해야 한다. 또한 이 변수의 읽기 접근 속성값은 public 이다. 예를 보도록 하자.

// Inside file tutorial/one.fx
package tutorial;
public class one {
     public-init var message; //초기화 접근 속성만을 제공함.
}

// Inside file two.fx
import tutorial.one;
var o = one {
     message: "Initialized this variable from a different package!"
}
println(o.message);//읽기 속성은 public 이므로 아무런 문제가 없다.

컴파일후 실행하면 예상하듯 "Initialized this variable from a different package!" 가 출력된다.

그럼 이미 초기화된 값을 수정하려 한다면 어떻게 될까?

// Inside file two.fx
import tutorial.one;
var o = one {
     message: "Initialized this variable from a different package!"
}
o.message = "Changing the message..."; // WON'T COMPILE
println(o.message);

two.fx:12: message has script only (default) write access in tutorial.one
o.message = "Changing the message..."; // WON'T COMPILE
 ^
1 error

예상대로 해당 수정부분에서 에러가 발생한다. 이부분에 에러가 발생되지 않도록 하려면 위 public-read 예에서 봤듯 쓰기 가능한 접근 권한인 package나 protected 접근 속성을 부여하면 된다.


이것으로 10회에 걸친 JavaFX의 간단한 문법에 대해 알아 보았다. 대부분 Java나 Javascript와 비슷한 문법을 택하였기 때문에 원문의 설명과 그 예제 또한 간단간단하게만 나와있다. 

작성된 글이 믿음직스럽지 않다면.. ^^;; 원문으로 읽어보는 것도 도움이 될 듯 싶다.

참고 :
1. Learning the JavaFX Script Programming Language

반응형
<출처 : http://javaora.tistory.com/entry/Learning-the-JavaFX-Script-Programming-Language-Lesson-10-Packages >

목차
- 1단계 : 패키지 이름을 선택한다.
- 2단계 : 디렉토리를 생성한다.
- 3단계 : 패키지 선언을 추가한다.
- 4단계 : 접근자를 추가한다.
- 5단계 : 소스를 컴파일한다.
- 6단계 : 클래스를 사용한다.

현재까지의 테스트는 아마 한 디렉토리내에서 이루어졌을 것이다. 그럼 다른 디렉토리에 있는 클래스는 어떻게 사용해야 할까? 정답은 바로 패키지이다. 패키지를 이용한 개선된 소스코드 관리 방식을 이용해보자.

패키지는 코드들을 기능적으로 분류하여 그룹화 시킨다. 패키지는 또한 정의된 클래스에 고유한 네임스페이스(namespace)를 제공한다. 아래 6단계를 통해 Address 클래스를 패키지화 시켜보자.


- 1단계 : 패키지 이름을 선택한다.
코드를 수정하기전, 먼저 패키지 이름을 무엇으로 할지 정해야 한다. Address 라는 클래스는 애초에 주소록이라는 애플리케이션의 일부로 포함시키기 위해 만들었었다. 그래서 Address 클래스에 addressbook 이라는 패키지 이름을 사용하기로 해보자.


- 2단계 : 디렉토리를 생성한다.
이번 단계에선 addressbook이라는 이름의 디렉토리를 생성해보자. 이 디렉토리에는 addressbook 패키지에 속하는 클래스들은 모두 저장되게 될 것이다. 이 디렉토리의 위치는 원하는 곳에 생성하면 된다. 


- 3단계 : 패키지 선언을 추가한다.
자, 이제 Address.fx 소스에 패키지 이름을 추가해보자. 패키지는 package라는 키워드 다음에 패키지 이름을 적게 되며, 소스의 제일 첫번째 줄에 넣어주면 된다.

package addressbook;

class Address {
     var street: String;
     var city: String;
     var state: String;
     var zip: String;
}


- 4단계 : 접근자를 추가한다.
이제 클래스에 접근자를 추가하자. 클래스를  public으로 선언하도록 해보자.

package addressbook;

public class Address {
     public var street: String;
     public var city: String;
     public var state: String;
     public var zip: String;
}

이 public 키워드에 대해서는 다음 레슨에서 배울것이며, 일단 다른 클래스에서의 모든 접근을 허용한다고만 알아두도록 하자.


- 5단계 : 소스를 컴파일한다.
addressbook 디렉토리로 이동하여 javafxc Address.fx 라고 입력하면 컴파일 된다. 컴파일이 완료되면 해당 디렉토리에 .class 파일들이 생성되었을 것이다.


- 6단계 : 클래스를 사용한다.
패키지화된 클래스를 사용하는 방식은 두가지 이다. 첫번째 방식은 "패키지명.클래스명" 과 같이 사용한다. 이름이 좀 길어진다는 단점이 있다. 두번째는 미리 import 라는 키워드를 통해 addressbook.Address 라는 "패키지명.클래스명"을 입력하여 해당 패키지의 클래스를 사용하겠다고 명시한후 클래스명인 Address 만으로 그 사용이 가능하다.

// Approach #1

addressbook.Address {
     street: "1 Main Street";
     city: "Santa Clara";
     state: "CA";
     zip: "95050";
}

// Approach #2
import addressbook.Address;

Address {
     street: "1 Main Street";
     city: "Santa Clara";
     state: "CA";
     zip: "95050";
}

이 예제를 packagetest.fx 라는 이름으로 저장하고 컴파일해보자. 별다른 에러없이 컴파일이 끝난다면 패키지를 잘 찾은 것이다.

반응형
<출처 : http://javaora.tistory.com/entry/Learning-the-JavaFX-Script-Programming-Language-Lesson-9-Writing-Your-Own-Classes >

목차
- Customer 예제
- 다른 클래스로부터의 상속

- Customer 예제
Lesson 2를 통해 객체(object)를 사용하는 방법에 대해 배웠었다. 그런데 먼저 .class 파일을 다운로드 받길 요청했고, 컴파일러를 가지고 Address와 Customer 객체를 생성하는 방법에 대해 알게 되었다. 아래 예제를 통해 빠뜨린 클래스의 정의 방법에 대해 알아보자.

def customer = Customer {
     firstName: "John";
     lastName: "Doe";
     phoneNum: "(408) 555-1212"
     address: Address {
          street: "1 Main Street";
          city: "Santa Clara";
          state: "CA";
          zip: "95050";
     }
}

customer.printName();
customer.printPhoneNum();
customer.printAddress();

class Address {
     var street: String;
     var city: String;
     var state: String;
     var zip: String;
}

class Customer {
     var firstName: String;
     var lastName: String;
     var phoneNum: String;
     var address: Address;

    function printName() {
        println("Name: {firstName} {lastName}");
    }

    function printPhoneNum(){
        println("Phone: {phoneNum}");
    }

    function printAddress(){
        println("Street: {address.street}");
        println("City: {address.city}");
        println("State: {address.state}");
        println("Zip: {address.zip}");
    }
}

위 예제는 변수와 함수에 대해 배울때 봐왔던 코드와 비슷하다. Address 클래스에는 street, city, state, zip 등의 인스턴스 변수들이 모두 String 타입으로 선언되어 있고, Customer 클래스에는 몇개의 인스턴스 변수와 그 값을 출력하는 변수들이 더해져 있다. 이 변수와 함수들은 클래스 내부에 선언되어져 있기 때문에 이들이 생성되는 곳 어디에서든 그 사용이 가능하다.


- 다른 클래스로부터의 상속

또한 클래스는 다른 클래스로부터 변수와 함수등을 상속받아 사용할 수 있다. 예를 들면, 은행에서 계좌에 저축하고 금액 확인하는 것은 생각해보자. 각 계좌는 계좌번호와 저축된 금액이 있다. 이 계좌에서 남은 금액을 조회하거나, 추가 예금을 하거나, 돈을 찾을 수도 있다. 이것을 변수와 함수를 가진 Account라는 클래스로 만들어 보자.

abstract class Account {

     var accountNum: Integer;
     var balance: Number;

     function getBalance(): Number {
          return balance;
     }

     function deposit(amount: Number): Void {
          balance += amount;
     }

     function withdraw(amount: Number): Void {
          balance -= amount;
     }
}

abstract 라는 키워드를 주목하자. 이 키워드의 의미는 Account 객체를 직접적으로 생성 할 수 없다는 뜻이다.(이렇게 생성한 목적은 오직 계좌에 저축을 하거나 저축금액을 확인하기 위함이다.)

accountNum 과 balance 라는 변수는 각각 계좌번호와 저축금액을 저장하게 된다. 남은 함수들은 각각 계좌에 남은 금액을 조회하거나(getBalance()), 저축을 하거나(deposit()), 출금을 하는(withdraw()) 기능만을 제공한다.

SavingsAccount 라는 클래스를 정의하자. 이 클래스는 extends 라는 키워드를 통해 변수와 함수를 상속 받는다.

class SavingsAccount extends Account {

     var minBalance = 100.00;
     var penalty = 5.00;

     function checkMinBalance() : Void {
          if(balance < minBalance){
               balance -= penalty;
          }
     }
}

SavingAccount 클래스는 Account의 서브 클래스로서 자동적으로 Account의 인스턴스 변수와 함수의 내용이 포함되며 사용 할 수 있다. 위 예에서 보듯 상속받는 클래스는 상속받는 변수와 함수외에 추가적으로 자신의 변수와 함수를 생성 할 수 있다.

Account 클래스를 상속받는 또 다른 클래스 CheckingAccount 라는 클래스를 정의해보자

class CheckingAccount extends Account {

     var hasOverDraftProtection: Boolean;

     override function withdraw(amount: Number) : Void {
          if(balance-amount<0 and hasOverDraftProtection){

               // code to borrow money from an overdraft account would go here

          } else {
               balance -= amount; // may result in negative account balance!
          }
     }
}

위 예제는 출금시 현재 저축액보다 더 많은 금액을 출금 할 수 없도록 막아 놓았다. 특이한 점은 withdraw라는 함수는 Account에 존재하는 함수로서 이를 재정의(override) 했다. 이렇게 재정의 되는 함수는 앞에 override라는 키워드를 사용하게 된다.
반응형
<출처 : http://javaora.tistory.com/entry/Learning-the-JavaFX-Script-Programming-Language-Lesson-8-Data-Binding-and-Triggers >


목차

- 바인딩이란?(Binding Overview)
- 바인딩과 객체(Binding and Object)
- 바인딩과 함수(Binding and Function)
- 바인딩과 시퀀스(Binding with Sequence)
- Raplace Trigger


* 바이딩이란?

bind 라는 키워드는 바인드 구문의 값인 목적변수의 값(value of target value)과 연관시키는 작업이다. 바인드 구문은 몇몇 기본 형(type)이나 객체, 함수의 결과 값 혹은 구문의 결과값으로 사용될 수 있다. 일단 말로서 설명을 하려면 약간 복잡 하지만 자바에서의 값을 참조하는 것과 동일하다고 보면 된다. 다음 설명등을 통해 좀 더 명확한 개념을 잡을 수 있을 것이다.


* 바인딩과 객체

먼저 아래 예를 먼저 보자.

var x = 0;
def y = bind x;
x = 1;
println(y); // y 는 1
x = 47;
println(y); // y 는 47

위 예에서 변수 x를 선언하고, y를 선언해 x를 바인드 시킨다.  그리고 x 값을 바꿔보자 그리고 y값을 프린트 한다. 그럼 바뀐 x 값이 출력된다. 이는 바운드된 변수인 y의 값은 x값에 따라 자동으로 업데이트 되어 새로운 값으로 바뀌게 된다.

여기서 이전 레슨에 대한 기억을 상기해보자. 우리는 예전 Lesson 2를 통해 def는 일반적으로 값을 할당한 후 상수 처럼 사용되는 변수라 설명한 바 있다. 실제로 def 로 선언된 변수의 값을 바꾸면 컴파일시 에러가 떨어진다. 하지만 bind 라는 키워드를 이용한 바인딩의 결과 그 값이 변경이 가능해진 것이다.

그럼 이를 객체에 적용해보자.

var myStreet = "1 Main Street";
var myCity = "Santa Clara";
var myState = "CA";
var myZip = "95050";

def address = bind Address {
     street: myStreet;
     city: myCity;
     state: myState;
     zip: myZip;
};

println("address.street == {address.street}");
myStreet = "100 Maple Street";
println("address.street == {address.street}");

결과는 다음과 같다.

address.street == 1 Main Street
address.street == 100 Maple Street

코드에서 보듯 address 라는 객체의 street은 myStreet이라는 변수를 참조하게 되고, 결과적으로 myStreet의 값이 바뀜에 따라 address 객체의 내부 변수인 street 변수의 값이 바뀌게 되었다.

위 예에서는 클래스인 Address를 바인딩 하였으나 그 하부의 인스턴스 변수에 까지 영향을 미침을 알 수 있다.
위 코드는 아래와 같은 방식들로도 표현 가능하다.

def address = bind Address {
     street: bind myStreet;
     city: bind myCity;
     state: bind myState;
     zip: bind myZip;
};
def address = Address {
     street: bind myStreet;
     city: bind myCity;
     state: bind myState;
     zip: bind myZip;
};


* 바인딩과 함수

이전 레슨에서 간단하게 함수에 대해 배운적이 있다. 이번에 배워야 할 부분이 더 있다. 바로 바운드 함수(bound function)와 비바운드 함수(non-bound function) 이다.

아래 함수를 보자. 아래 함수는 x, y 좌표를 받아 Point 라는 객체를 리턴한다.

var scale = 1.0;
bound function makePoint(xPos : Number, yPos : Number) : Point {
     Point {
          x: xPos * scale
          y: yPos * scale
     }
}
class Point {
     var x : Number;
     var y : Number;
}

여기서 makePoint 가 바운드 함수 이다. 바운드 함수는 function 키워드 앞에 bound라 표시한다. 이때 bound와 앞서 배운 bind를 다르다. 혼동해선 안된다.

이제 위 코드를 활용한 예를 보자.

var scale = 1.0;

bound function makePoint(xPos : Number, yPos : Number) : Point {
     Point {
          x: xPos * scale
          y: yPos * scale
     }
}

class Point {
     var x : Number;
     var y : Number;
}

var myX = 3.0;
var myY = 3.0;
def pt = bind makePoint(myX, myY);
println(pt.x);

myX = 10.0;
println(pt.x);

scale = 2.0;
println(pt.x);

위 코드의 결과는 아래와 같다.

3.0
10.0
20.0

위 결과를 보면 바운드 함수의 결과값인 Point를 바인딩한 객체 pt는 인자(argument)인 myX 값의 변화에 따라 그 인스턴스 변수 값이 달라짐을 알수 있다. 또한 scale 변수값의 변경에도 영향을 받음을 알 수 있다.

그럼 비바운드 함수 경우에는 어떨까? 위 makePoint 함수에서 앞에 bound라는 키워드를 제거하고 다시 테스트 해보면 결과는 다음과 같아진다.

3.0
10.0
10.0

scale 변수값의 변경에는 영향을 받지 않음을 알 수 있다. 비바운드 함수의 경우 함수의 인자값에 변경이 가해질때만 함수의 재호출(re-invoke)가 일어난다. scale 변수는 함수의 인자값이 아닌 함수의 외부 변수라 함수에 영향을 미치지 않음이다. 즉, 이말은 다음과 같다. 바운드 함수의 경우엔 함수의 인자나 함수에서 사용되어지는 변수의 바인드 되어지는 변수에 어떤 값의 변경이 이루어지면 내부적으로 함수의 재호출이 일어나 값이 바뀌게 되는 것이다.


* 바인딩과 시퀀스

bind는 for문에서도 사용 할 수 있다. 이를 보기전에 먼저 두개의 시퀀스를 정의하고 그 결과를 봐보자.

var seq1 = [1..10];
def seq2 = bind for (item in seq1) item*2;
printSeqs();

function printSeqs() {
     println("First Sequence:");
     for (i in seq1){println(i);}
     println("Second Sequence:");
     for (i in seq2){println(i);}
}

seq1에는 1부터 10까지 10개의 아이템(item)이 있고, seq2에도 10개의 아이템이 있다. seq2의 아이템들은 seq1의 아이템에 각각 2를 곱한 값이다. 결과는 다음과 같다.

First Sequence:
1
2
3
4
5
6
7
8
9
10
Second Sequence:
2
4
6
8
10
12
14
16
18
20

위 코드를 보면 seq1과 seq2 는 bind 키워드를 통해 바인딩 된 상태이다.

그럼 이런 의문이 든다. "만약 seq1의 모든 아이템이 바뀌거나 혹은 몇몇 아이템이 바뀐다면 seq2에 영향을 미칠까?" 한번 테스트 해보자. seq1의 제일 뒤에 11이란 값을 인서트 해보자. 그리고 seq2를 프린트 해봄으로서 확인해보자.

var seq1 = [1..10];
def seq2 = bind for (item in seq1) item*2;
insert 11 into seq1;
printSeqs();

function printSeqs() {
     println("First Sequence:");
     for (i in seq1){println(i);}
     println("Second Sequence:");
     for (i in seq2){println(i);}
}

결과는 다음과 같다.

First Sequence:
1
2
3
4
5
6
7
8
9
10
11
Second Sequence:
2
4
6
8
10
12
14
16
18
20
22

결과는 seq1의 끝에 11을 인서트 함으로서 seq2의 앞에 10개의 아이템에는 아무런 영향을 미치지 않고, seq2 끝에 22라는 값이 추가 되었음을 알 수 있다.


* Replace Trigger

Replace Trigger는 임의의 코드 블록으로 변수 뒤에 붙어 변수의 값이 바뀌었을때 실행된다. 아래의 코드가 기본 문법을 보여준다. password 라는 변수를 정의하고, 위에 replace trigger를 붙인다. password의 값이 변경되면 trigger를 통해 이 임의의 코드 블록이 실행된다.

var password = "foo" on replace oldValue {
     println("\nALERT! Password has changed!");
     println("Old Value: {oldValue}");
     println("New Value: {password}");
};

password = "bar";

결과는 다음과 같다.

ALERT! Password has changed!
Old Value: 
New Value: foo

ALERT! Password has changed!
Old Value: foo
New Value: bar
위 예제에서는 trigger가 두번 사용된다. 처음엔 password 변수가 초기화 되고 "foo"라는 값이 할당되었을 때 그리고 다시 "bar"라는 값이 할당되었을 때이다. 위 코드에서 사용된 oldValue라는 변수는 trigger가 호출되면 이전 값이 저장된다. 변수명은 여기선 임의로 oldValue라고 하였으나 정해진 것은 아니다.(사용자가 임의로 변경 가능하다.)

+ Recent posts