MayBeMayBe

MayBeMayBe

Posts Tagged ‘JAVA

JFreeChart – MultipleAxis Demo….

with one comment

 

 

..

..

..

 

..

 

..


public class MultipleAxisDemo
{
   /**
   * Creates the demo chart.
   *
   * @return The chart.
   */
   private static JFreeChart createChart() {
   XYDataset dataset1 = createDataset("Series 1", 100.0, new Minute(), 200);

   JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "Multiple Axis Demo 3",
            "Time of Day",
            "Primary Range Axis",
            dataset1,
            true,
            true,
            false);

   chart.setBackgroundPaint(Color.white);
   chart.setBorderVisible(true);
   chart.setBorderPaint(Color.BLACK);
   TextTitle subtitle = new TextTitle("Four datasets and four range axes.");
   chart.addSubtitle(subtitle);

   XYPlot plot = (XYPlot) chart.getPlot();
   plot.setOrientation(PlotOrientation.VERTICAL);
   plot.setBackgroundPaint(Color.lightGray);
   plot.setDomainGridlinePaint(Color.white);
   plot.setRangeGridlinePaint(Color.white);

   plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
   XYItemRenderer renderer = plot.getRenderer();
   renderer.setSeriesPaint(0, Color.black);

   // AXIS 2
   NumberAxis axis2 = new NumberAxis("Range Axis 2");
   axis2.setAutoRangeIncludesZero(false);
   axis2.setLabelPaint(Color.red);
   axis2.setTickLabelPaint(Color.red);
   plot.setRangeAxis(1, axis2);

   plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_LEFT);

   XYDataset dataset2 = createDataset("Series 2", 1000.0, new Minute(), 170);
   plot.setDataset(1, dataset2);
   plot.mapDatasetToRangeAxis(1, 1);
   XYItemRenderer renderer2 = new StandardXYItemRenderer();
   renderer2.setSeriesPaint(0, Color.red);
   plot.setRenderer(1, renderer2);

   // AXIS 3
   NumberAxis axis3 = new NumberAxis("Range Axis 3");
   axis3.setLabelPaint(Color.blue);
   axis3.setTickLabelPaint(Color.blue);
   //axis3.setPositiveArrowVisible(true);
   plot.setRangeAxis(2, axis3);

   XYDataset dataset3 = createDataset("Series 3", 10000.0, new Minute(), 170);
   plot.setDataset(2, dataset3);
   plot.mapDatasetToRangeAxis(2, 2);
   XYItemRenderer renderer3 = new StandardXYItemRenderer();
   renderer3.setSeriesPaint(0, Color.blue);
   plot.setRenderer(2, renderer3);

   // AXIS 4
   NumberAxis axis4 = new NumberAxis("Range Axis 4");
   axis4.setLabelPaint(Color.green);
   axis4.setTickLabelPaint(Color.green);
   plot.setRangeAxis(3, axis4);

   XYDataset dataset4 = createDataset("Series 4", 25.0, new Minute(), 200);
   plot.setDataset(3, dataset4);
   plot.mapDatasetToRangeAxis(3, 3);

   XYItemRenderer renderer4 = new StandardXYItemRenderer();
   renderer4.setSeriesPaint(0, Color.green);
   plot.setRenderer(3, renderer4);

   // AXIS 5
   NumberAxis axis5 = new NumberAxis("Range Axis 5");
   axis5.setLabelPaint(Color.magenta);
   axis5.setTickLabelPaint(Color.magenta);
   plot.setRangeAxis(4, axis5);

   XYDataset dataset5 = createDataset("Series 5", 2500.0, new Minute(), 200);
   plot.setDataset(4, dataset5);
   plot.mapDatasetToRangeAxis(4, 4);

   XYItemRenderer renderer5 = new StandardXYItemRenderer();
   renderer5.setSeriesPaint(0, Color.magenta);
   plot.setRenderer(4, renderer5);

   return chart;
 }

..

..

MultipleAxis

..

..

..

..

 

Advertisements

Written by MayBeMayBe

May 14, 2014 at 19:40

Posted in Programming

Tagged with

Servlet…,,

leave a comment »

Written by MayBeMayBe

April 15, 2014 at 00:09

Posted in Programming

Tagged with ,

Regular Expression…….,,

leave a comment »

 

메모 용임…

의미 없음..

 

<BR>\([a-zA-Z].*\)

<BR>&nbsp;{0, 7}\([a-zA-Z].*\)
(<BR>\([a-zA-Z].*\)|<BR>&nbsp;{1, 7}\([a-zA-Z].*\))

(<BR>\([a-zA-Z].*\)|<BR>&nbsp;{0, 7}\([a-zA-Z].*\)|\([a-zA-Z].*\))

(순이익|순손실|<br>==|==)

\([a-zA-Z,'<>/;\-&\s]+\)
(width='[%s’0-9{1,9}]+’|height='[%s’0-9{1,9}]+’)

 

..

 

 

Written by MayBeMayBe

October 26, 2013 at 16:15

Posted in Programming

Tagged with ,

JFreeChart….,,

with 2 comments

 

 

..

..

http://www.jfree.org/jfreechart/

..

GPL…

..

개발문서(Developer Document)를 제외한 나머지는 라이선스 비용이 없다. 잠시 테스트 해 보았는데 좋다….

..

jFreeChart-test

jFreeChart-test

..

기본적으로 함수 몇개를 손을 보고, 중요한 함수들 추가하고.. 긴 날짜들에서 빠진 날짜들을 집어 넣은 함수 추가..

시간축이 서로 다른 값들을 하나의 시간축으로 합해서, 하나의 값으로 표시하는 것 등….

YoY는 그리 어려운 것은 아닐테고…

..

..

test__HyundaiMotors

test__HyundaiMotors

..

test__조선내화

test__조선내화

..

test__한국쉘석유

test__한국쉘석유

..

test__POSCO

test__POSCO

..

..

==============================================================

PNG로 차트를 그리면, 한글이 깨지고 있다.

찾으면 해결책이 있겠거니…

 

..

..

 

 

 

 

 

 

 

Written by MayBeMayBe

October 23, 2013 at 23:25

Posted in Programming

Tagged with

한ㅈㅏ…..,,

leave a comment »

..


...
class ValueComparator implements Comparator<String>
{
   Map<String, String> base;
   public ValueComparator(Map<String, String> base)
   {
      this.base = base;
   }
   public int compare(String a, String b)
   {
      if(base.get(a).length() > base.get(b).length())
      {
        return -1;
      }
      else
      {
         return a.compareTo(b);
      }
   }
}

public class ReplacementHanja
{
   public static void main(String[] args)
   {
      ReplacementHanja instanceHanja = new ReplacementHanja();

      Map<String, String> replacements = new HashMap<String, String>();

      ValueComparator mapComparator = new ValueComparator(replacements);
      TreeMap<String, String> sorted_map = new TreeMap<String, String>(mapComparator);

      instanceHanja.initList(replacements);
      sorted_map.putAll(replacements);;

      StringBuffer strBuffer = new StringBuffer();
      String regexp = "";
      for(Map.Entry<String, String> entry : sorted_map.entrySet())
      {
         regexp += entry.getKey() + "|";
      }
      regexp += "厚";

      Pattern p = Pattern.compile(regexp);

      String file = "E://List//input.html";
      String strOutput = "E://List//output.html";

      List<String> lines = new ArrayList<String>();

      BufferedReader in;

      try
      {
         in = new BufferedReader(new FileReader(file));
         String line = in.readLine();
         while(line != null)
         {
            Matcher m = p.matcher(line);

            while(m.find())
            {
               m.appendReplacement(strBuffer, replacements.get(m.group()));
            }
            line = in.readLine();
            m.appendTail(strBuffer);
         }
         instanceHanja.saveFile(strBuffer.toString(), strOutput);

         System.out.println("Exit..............");
      }
      catch (FileNotFoundException e)
      {
         e.printStackTrace();
      }
      catch (IOException e)
      {
         e.printStackTrace();
      }
   }
   private void initList(Map<String, String> replacements)
   {
      replacements.put("訓鍊", "훈련");
      replacements.put("推尋", "추심");
      replacements.put("誤謬", "오류");
      replacements.put("免除", "면제");
      replacements.put("物流", "물류");
      replacements.put("瑕疵", "하자");
      replacements.put("承繼", "승계");
      replacements.put("除", "제");
      replacements.put("加", "가");
      .....
   }
...
...

..

..

참조….

http://stackoverflow.com/questions/7661460/replace-multiple-substrings-in-a-file-at-once

..

..

Hanja Conversion

..

..

한자 배열 수는 세어보지는 않았지만, 약 400개 한자 정도면 충분할 듯…

같은 한자라도 경우에 따라 쓰이는 “음”이 다른 경우가 있다.

..

까다로운 경우인데, 그것 때문에 TreeMap 사용…

..

정렬을 할 때, 한자 단어 길이로 정렬을 하였는데, 그나마 쓸수 있을 듯…

..

아직 테스트 중이고, 몇개를 돌려 보면 쓸 수 있을듯..

..

WordPress에소 소스 코드를 올리면 정렬이 완전히 깨지고 있다.

아무래도 TAB이 있는 경우만 정렬을 유지하고 “SPACE”인 경우는 무시하고 있는 듯..

..

..

..

Written by MayBeMayBe

October 16, 2013 at 23:39

Posted in Writing

Tagged with

Normalization…..,,

with one comment

 

 

 

..

..

..

SEC 1999 OP Report - Balance Sheet

..

위는 어떤 회사에 대한 특정한 시기(1999년??)에 발표한 보고서 중 하나이다. 시간적으로 상당히 오래되었다. 모르는 것 아니고 감안은 충분히 해야하겠지만 1999년경이면 그래도 어느 정도는 알려진 이후이기도 하다.

..

눈으로 보면 위에 있는 표(Table)은 잘 정리되어 있는 것 같다.

그렇지만, 위에 있는 표를 긁어서 MS Excel이나 기타 문서편집기로 붙여 놓기를 하면 테이블이 상당히 깨질 것이다.

..

눈으로 보기엔 정규화가 잘 된 것 같고, 정렬도 잘 되어서 이쁜 면도 있다. 그렇지만 HTML 소스에서 보게 되면, 문제가 있는 것이다.

Excel 같은 컴퓨터는 생각을 할줄 모른다. ‘0’ 아니면 ‘1’일 뿐이고 나머지 값 판단할 때도 0이나 1에서 기반한 것에서 그렇게 나간것도 없을 것이다.

..

다시, 위에 있는 그림에서 숫자 1번과 같이 첫번째 열에 있는 미수금과 대손충당금은 행이 구분된 것 처럼 보이지만 사실상 구분되지 않았다. 2번 또한 마찬가지..

HTML에서 행을 구분할 때는 <TR>이라는 내부 약속어가 있다. 그런데 위에 있는 표는 그런 것을 아예 무시하고 <BR>을 사용하였다.

비유가 정확한지 모르지만 MS Word 같은것에서도 행을 바꿀 때 “enter”키가 있고 “Shift + enter”키가 있다. 칸(행)을 내리는 것은 맞지만 내부적으로 쓰이는 것은 전혀 다른 것으로 알고 있다.

<TR>을 사용해야할 곳에 <BR>을 사용하여서 문제가 있다면, 그래도 어느정도 이해할 수 있고 수정할 수 있는 여지가 있다.

거기에는 일정한 규칙(Pattern)이 존재하기 때문이다. 쉽게 <BR>을 <TR>로 바꾸면 되는 것인다.

그런데….

다시 위에 있는 그림에서 1번과 2번을 보면 내부적으로 <TR> 대신 <BR>을 사용하였겠거니 싶었는데, 그것 또한 아니다…

1번에서 “미수금”과 “대손충당금”을 칸 구분할 때 사용한 것은, <TR>도 아니고 하물며 <BR>도 아닌 “&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;”이다.

“&nbsp;”는 HTML에서 한칸을 뛰우라는 것인데 MS Word에서 “Space”키와 비슷한 효과가 있다고 생각하면 된다.

..

어떻게 “space”키를 여러번 눌렀다고 행이 바뀌는가…?

그것은, 다시 HTML 열을 정할 때 열 크기를 고정키면 눈에는 행이 바뀌는 것과 같은 효과가 있다.

만약, 변칙적으로 이런 방법을 사용하였다면, 그러면 위에 있는 그림 2번에서도 같은 방법을 사용하게 된다면, 거기에는 다시 Pattern이 있는 것이라 짜증은 나지만 그럭저럭 넘어갈 수도 있다.

그러나, 위에 있는 그림에서 2번은 <BR>을 사용하였다…

..

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

..

탓하는 것은 분명 아니고, 그럴 이유도 별로 없다. 1999년이라는 것을 생각하자…

이런 형태가 대충 2002년까지 반복되는 것 같은데, 또 재미있는 것은 다른 회사들은 제대로 입력한 곳도 많다는 것이다.

아마, 교육이나 지침 같은 것이 있었는데 제대로 이해하지 못한 상태에서 반복된 일일 가능성도 있을 것이다.

..

..

눈에 보이는 것이 전부는 아니고, 또 전부이겠지만….

..

정규화가 되지 않아도 일정한 규칙이 있으면, 어느정도는 변칙적으로 수정할 수도 있겠지만 쉽지만은 않을 것이다.

..

..

가끔, 눈에 보이는 HTML table을 엑셀로 붙여놓기 하면 테이블 구성이 완전히 깨질때가 있는데 그 때도 excel 내부에서 그런 것을 표로 구성해 주는 부가 명령어같은게 있다.

같은 말이다.

내가 자주 쓰는 것은 일정한 문자 반복, 가령 공백문자나 특정 구분문자 등인데 그것도 그런 것이 있을 때만 가능하고 없을 때는…..

..

손으로…?

..

..

..

..

이상하다, 이상하다, 이상하다, 이상하다, 이상하다 싶어서…

위에 있는 그림에서 1번열과 2번열에 있는 문자열 수를 전부 세어 보았더니 1번 열에 있는 칸(행) 수와 2번 열에 있는 칸(행)수가 같지 않아서……

찾아 보았더니, 내부적으로 그렇게 사용해서 발생한 문제였다.

..

흠…….

…..

넘어갈 것은 넘어가고…….해야겠지만…

..

생각보다, 내부에서 쓰이는 규칙같은게 자주 변하는 것 같고 일관성도 없는 것 같다. 어느 순간부터(최근?) 정해서 규칙을 강화해 나갈 수도 있는 것이지만…..

상당히 규칙성, Pattern이 약하다.

특정 시기에 맞추어 코드를 짜면 다른 시기에 엉킬 수 밖에 없는 구조이고 내부적인 유지보수가 상당히 어렵게 되었다. 그런 것에 맞추어 범용적으로 코드를 짜게 되면, 마찬가지로 예외적인 경우 처리도 많이 해야해서 마찬가지로 유지보수가 어려운 문제가 있고…

..

..

..

아래 있는 그림은, 위에 있는 Table에 해당하는 HTML source code…..

SEC 1999 OP Report - Balance Sheet HTML

..

..

..

..

(*추가….
예전에도 언급을 하였지만, 위와 같는 문서가 가진 문제는 “검색”이 상당히 어렵다는 것이다.
가령, 그림 중에서 “매출채권”을 찾을려고 하면 검색에 잡히지 않는다.
“매 출 채 권”과 같이 눈에 보기 좋게 표현해버리면 어떻게 검색을 해야하지….?
모든 경우에 “매 출 채 권” 과 같이 표현하는 것은 아니고, 어떤 때는 “매         출       채        권”과 같이 표현해 버리면….

..
Regular Expression을 많은 이들이 알아야할 이유도 없고, 그 표현식이 제대로 되었는지 검토하는 것도 하세월이다.
이쁘게 정렬을 해야한다면, 가운데 정렬이나 오른쪽 정렬과 같은 방법으로…..

..
사소해보이지만, 시간이 지나서 일괄적으로 검색을 해야할 때도 많을 것이다.
참고로, 최근에는 많이 좋아졌겠지만 가끔은 아닌경우도 보일 때가 있다…
)

..

..

..

아래는, List를 Array로 감싸는 소스 형태 때문에….. 붙여 넣은 것…

..

..

...
File inputFile = new File(strFilePath);

Document doc = Jsoup.parse(inputFile,
                              GlobalSettings.getInstance().getHtmlEncoding());
Element docBody = doc.body();

String strBody = docBody.html();

Elements tableElements = docBody.select(<table>);
Element table = tableElements.get(1);
Elements trElements = table.select(<tr>);

// selected tr's td. every td's within one Line.<TR>
Elements tdElements = trElements.get(1).select(<td>);

int iTdSize = tdElements.size();
StringBuilder strBuilder = new StringBuilder();

List<String> listArray[] = new ArrayList[iTdSize];
for(int i = 0; i < iTdSize; i++)
{
   listArray[i] = new ArrayLis<String>();
}

for(int i = 0; i < iTdSize; i++)
{
   Element el = tdElements.get(i);

   String[] tdParts = el.html().split("< br/>");

   for(String strPart : tdParts)
   {
      listArray[i].add(strPart);
   }
}
for(int i = 0; i < listArray[0].size(); i++)
{
   System.out.println(listArray[0].get(i) + " " + listArray[1].get(i));
}
...

..

..


...

List<String> listArray[] = new ArrayList[iTdSize];
for(int i = 0; i < iTdSize; i++)
{
   listArray[i] = new ArrayList<String>();
}

...

for(String strPart : tdParts)
{
   listArray[i].add(strPart);
}

...

for(int i = 0; i < listArray[0].size(); i++)
{
   System.out.println(listArray[0].get(i) + " "  + listArray[1].get(i));
}

...

..

..

..

..

Written by MayBeMayBe

September 16, 2013 at 01:07

Posted in Programming, Writing

Tagged with

AutoScale….,,

with 3 comments

 

 

 

..

..


...

/*
SPECIFICATION: Calculate Y-Axis min, max and Division vlaue
from each Vector's result min and max value.

   PARAMETERS : eAlign
      eALIGN_BOTTOM : align with Bottom line.
      eALIGN_TOP : align with TOP line.
      fMaxValue : Input value for pass min value.
      fMinValue : Inptu value for pass max value.
      *pfMin : Output value, for Y-AXIS' min start position.
      *pfMax : Output value, for Y-AXIS' max stop position.
      *pfDivision : Output value, for Y-AXIS' division value.
      This could be (1, 2, 5)*pow(10, integer)

*******************************************************************************/
BOOL SomeCommonUtils::GetYAxisAutoScale(eALIGN_TYPE eAlignMode,
                                           float fMinValue,
                                           float fMaxValue,
                                           float *pfMin,
                                           float *pfMax,
                                           float *pfDivision)
{
   if((pfMin == NULL) || (pfMax == NULL) || (pfDivision == NULL))
   {
       ERROR(("Null pointer access..."));
       return FALSE;
   }

   /**********************************************************************************
   * for Auto Scale, the max division value of tye Y-Axis
   **********************************************************************************/
   static const UINT32 udwYAXisDivision = 10;

   float fDelta = (fMaxValue - fMinValue);
   if(fDelta == 0)
   {
      // for 1dB step size, for the execption.
      fDelta = (float)(udwYAXisDivision - 2);

      //if max and min value is equal, forcely aligned TOP.
      eAlignMode = eALIGN_TOP;
   }

   ///////////////////////////////////////////////////
   // for normalize each input value. whatever small or big.
   float fNormalize = 1/fDelta;

   //We using 10 division, and min max value are under 2 margin,..
   float fDivision = fDelta/(udwYAXisDivision - 2);

   fNormalize = 1;
   fDivision = fDivision/fNormalize;

   INT32 iLogScale = 0;

   if(fDivision >= 1)
   {
      iLogScale = 0;
   }
   else
   {
      //In case of the value is smaller than '1', then I'll convert to 10^0 base number.
      //ex) 0.02 ==> 2*pow(10, -2)
      iLogScale = (INT32)log10(fDivision);

      iLogScale = abs(iLogScale)+1;
   }

   fDivision = fDivision*(float)pow(10, iLogScale);

   //Step size per division. Only 1, 2, 5's mutiply by Interger n supported.
   enum eStepSizeType
   {
      eStepSize1 = 1, // ...0.01, 0.1, 1, 10, 100, .....
      eStepSize2 = 2, // ...0.02, 0.2, 2, 20, 200, .....
      eStepSize5 = 5 // ...0.05, 0.5, 5, 50, 500, .....
   };

   // fDivision value have limited value
   // such as 1*pow(10, N), 2*pow(10, N), 5*pow(10, N) ==> N is integer
   for( UINT32 udwIndex = 0; udwIndex < 10; udwIndex++)
   {
      float fTempCompare = (float)pow(10.0f, (float)udwIndex);

      if(fTempCompare*eStepSize1 >= fDivision)
      {
         fDivision = fTempCompare*eStepSize1;
         break;
      }
      else if((fTempCompare*eStepSize2) >= fDivision)
      {
         fDivision = fTempCompare*eStepSize2;
         break;
      }
      else if((fTempCompare*eStepSize5) >= fDivision)
      {
         fDivision = fTempCompare*eSteoSize5;
         break;
      }
   }
   //I need re-conversion when fDivision value is smaller than 1.
   fDivision = fDivision*(float)pow(10.0f, float(-1*iLogScale));
   *pfDivision = fDivision;

   switch(eAlignMode)
   {
      case eALIGN_BOTTOM:
         // 1 : BOTTOM margin
         // 9 : TOP margin position.
         *pfMin = fMinValue - fDivision;
         *pfMax = fMinValue + (udwYAXisDivision-1)*fDivision;
         break;

      case eALIGN_TOP:
         *pfMin = fMaxValue - (udwYAXisDivision-1)*fDivision;
         *pfMax = fMaxValue + fDivision;
         break;

      default:
         *pfMin = 0.0f;
         *pfMax = 1.0f;
         *pfDivision = 1.0f;
         ERROR(("Unsupported align..."));
         return FALSE;
   }
   return TRUE;
}
...

..

..

..

..

..

..

Written by MayBeMayBe

September 9, 2013 at 11:19

Posted in Programming

Tagged with ,