[ROR 팁]Rails rake test에서 특정 기능만 테스트하기!

Programming 2014.02.26 16:59

rake test를 돌릴 때 원하는 기능의 테스트들만 한번에 돌리고자 할 때... 유용한 팁


만약 디렉토리가


test/controllers/blog_controller_test.rb

test/models/blog_model_test.rb

test/jobs/blog_job_test.rb 

...


이런식으로 작성이 되었다면 blog에 관련된 테스트만 돌리고싶다! 는 needs다.


namespace :test do

  rule "" do |t|

    # rake test:blog

    if /test:(.*)(:([^.]+))?$/.match(t.name)

      arguments = t.name.split(":")[1..-1]

      file_name = arguments.first

      test_name = arguments[1..-1]


      Dir["test/**/#{file_name}*_test.rb"].each {|path|

        result = `ruby -Ilib:test #{path}`

        puts "=========[ #{file_name} test result ]================================================================"

        puts result[result.index("Finished tests")..-1].to_s.split('\n')

        puts "==========================================================================================="

      }

    end

  end

end




아무 .rake 파일을 만들어서 lib/tasks 밑에 넣어주면 된다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

drop all MongoDB MapReduce temp collections (tmp.mrs... collections)

Programming 2012.07.11 16:50

몽고디비에서 MapReduce 작업을 하다가 실패하는 경우 쓰래기 컬렉션들이 생성된채로 남아 있게 된다.


tmp.mrs.logs_1320387613_149
tmp.mrs.logs_1320387655_156
tmp.mrs.logs_1320390722_606
tmp.mrs.logs_1320395235_1164
tmp.mrs.logs_1320396089_1277
tmp.mrs.logs_1320405546_2308
tmp.mrs.logs_1320405750_2327
tmp.mrs.logs_1320405958_2352
... (you get the idea)


이런형태로..


이는 설정에서 쓰래기 컬렉션이 남지 않게 설정하면 되는것으로 알곤 있지만..


일단 생성된 녀석들을 한번에 drop 시키는 방법은..


db.system.namespaces.find({name: /tmp.mr/}).forEach(function(z) { try{ db.getMongo().getCollection( z.name ).drop(); } catch(err) {} });


이렇게 한줄로 샥~


몽고디비 역시 더러워...-_-;; 별루야 정말;


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

eclipse에서 tomcat debug mode시 Invalid memory access of location 0x14 에러!

Programming 2012.02.23 02:20
eclipse에서 debug mode로 톰켓을 돌리려고 하면 

Invalid memory access of location 0x14 

에러가 뜨면서 동작하지 않는다.

그 이유를 열심히 구글링 해보니 hosts파일에서 127.0.0.1이 없어서 생긴 문제란다.

그래서 내 hosts파일을 열어보니. 아니 글쎄!
어쩌다가 127.0.0.1 localhost가 주석 처리되어있넹.;;
그래서 다시 주석처리를 풀고 나니 잘동작한다!! 
 
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Apache-Tomcat proxy ajp

Programming/Apache 2012.02.08 01:56

1.버전에 맞는 아파치 소스 다운로드

wget http://apache.mirror.cdnetworks.com/httpd/httpd-2.0.63.tar.gz

 

2.압축 해제 후 module/proxy 디렉토리로 이동

tar xvzf httpd-2.0.63.tar.gz

/usr/local/src/httpd-2.0.63/modules/proxy


3.컴파일

/usr/local/apache/bin/apxs -i -a -c mod_proxy.c proxy_util.c

/usr/local/apache/bin/apxs -i -a -c mod_proxy_http.c proxy_util.c

/usr/local/apache/bin/apxs -i -a -c mod_proxy_connect.c proxy_util.c

/usr/local/apache/bin/apxs -i -a -c mod_proxy_ajp.c proxy_util.c ajp_header.c ajp_utils.c ajp_link.c ajp_msg.c


4. 결과

mod_proxy_ajp.so

mod_proxy_connect.so

mod_proxy_http.so

mod_proxy.so


5.httpd.conf 확인 & 수정

(1) 다음처럼 LoadModule에 추가되어있음을 확인

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_connect_module modules/proxy_connect.so

LoadModule proxy_http_module modules/proxy_http.so

LoadModule proxy_ftp_module modules/mod_proxy_ajp.so


(2) 제일 하단에 다음처럼 추가

ProxyRequests On

ProxyVia On

<Proxy *>

Order deny,allow

Allow from all

</Proxy>


(3) vhost conf 파일이나 <Location> 안에 추가.

ProxyPass /pass ajp://localhost:8009/pass

ProxyPassReverse /pass ajp://localhost:8009/pass


(3-1) 같지만 다른 방법으로는 Rewrite를 사용하는 방법이 있음. ( http://httpd.apache.org/docs/current/mod/mod_rewrite.html )

RewriteEngine On

RewriteRule /pass(.*) ajp://localhost:8009/pass$1 [P]


6. 마지막으로 Tomcat server.xml 파일을 체크해줄것.

<Connector port="8009"

enableLookups="false" secure="true" URIEncoding="UTF-8"

tomcatAuthentication="false"

protocol="AJP/1.3" />

흐아~~~~ 새벽 2시다.-_-+ 

여담.
필요한 모듈들을 모두 안넣어주면 아래와 같은 에러가 발생한다.-_-;
제길 단순히 모듈이 없어서 나는 에러였다. 제길... 제길... 

[Wed Feb 08 01:03:15 2012] [warn] proxy: No protocol handler was valid for the URL /pass/test.html. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

트위터 API를 활용해서 트윗 버튼 & 팔로잉 팔로워 리스트 & count

Programming 2011.08.23 15:18
트위터 API읽느라 고생했다.

내가 구현하고 싶은것은 이런 간단한 것이다. 하지만 이것 구현하는데 이틀이나 걸리다니.-_- 제길.. 여튼..



필요한 API는 아래 4개이다.
 

ResourceDescription
GET followers/ids Returns an array of numeric IDs for every user following the specified user. This method is powerful when used in conjunction with users/lookup.
GET friends/ids Returns an array of numeric IDs for every user the specified user is following. This method is powerful when used in conjunction with users/lookup.
GET users/lookup Return up to 100 users worth of extended information, specified by either ID, screen name, or combination of the two. The author's most recent status (if the authenticating user has permission) will be returned inline. This method is crucial for consumers of the Streaming API. It's also well suited...
GET users/show Returns extended information of a given user, specified by ID or screen name as per the required id parameter. The author's most recent status will be returned inline.
그리고 자바스크립트를 좀 편하게 쓰기 위해 jQuery를 이용했음.


소스코드 보기

 

후. 이젠 페북API로 넘어가자..OTL 
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

HTML페이지에서 윈도우 응용프로그램 실행시키기

Programming 2010.11.10 18:12
흔히들 mailto:abc@gmail.com 이런식으로 하이퍼 링크를 시켜서 아웃룩을 실행시킨다.
이러한 하이퍼링크를 통해서 컴퓨터내 응용프로그램을 실행시키는 방법에 대해서 알아본다.

1. 시작 > 실행 > regedit


2. HKEY_CLASSES_ROOT 하위에 새로운 키 생성


3. 아래와 같은 구조로 새로운 키 계속 생성


4. 값은 아래와 같이 입력
HKEY_CLASSES_ROOT 
     alert
          (Default) = "URL:Notepad Protocol"
          URL Protocol = ""
          DefaultIcon
               (Default) = "C:\WINDOWS\NOTEPAD.EXE,1"
          shell
               open
                    command
                         (Default) = "C:\WINDOWS\NOTEPAD.EXE" "%1"



5. 테스트 페이지 작성.
<html>
<head>
<title> url protocol test </title>
</head>
<body>
<a href="testurlprotocol:test.txt">notepad 실행시키기</a>
</body>
</html>

6. 클릭~




7. 퍼트리기





이렇게 하면 보안문제도 없고~ 깔끔~~

참고자료 : http://msdn.microsoft.com/en-us/library/aa767914(VS.85).aspx
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

[JAVA] jce1.2.2 라이브러리

Programming 2010.04.08 16:04
아놔 맨날 뭐 받을라면 로그인하래.-_-;
그래서 그냥 여기다 올려 놓습니다.;



read me


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

[iBatis Tip] Oracle Multi-insert를 iBatis iterator를 사용하여 구현해 보자.

Programming 2009.09.08 16:16
오라클에는 여러개의 값을 한번에 insert하기 위해서 쓰는 multi insert구문이 있습니다.
바로 insert all인데요.
CREATE TABLE t (
pid   NUMBER(5),
fname VARCHAR2(20),
lname VARCHAR2(25));

INSERT ALL
INTO t (pid, fname, lname)
VALUES (1, 'Dan', 'Morgan')
INTO t (pid, fname, lname)
VALUES (2, 'Jeremiah', 'Wilton')
INTO t (pid, fname, lname)
VALUES (3, 'Helen', 'Lofstrom')
SELECT * FROM dual;
SELECT * FROM t;

위와 같이 쓰는겁니다.

자 그럼 위와 같은 커리를 iBatis로 편하게 만드려면 어케하는지 봅시다.

일단 자바 클래스부터 살펴볼까요?

모델이 되는 클래스 부터.
public class Table{
private String pid;
private String fname;
private int lname;
public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getFname() { return fname; } public void setFname(String fname) { this.fname = fname; } public int getLname() { return lname; } public void setLname(int lname) { this.lname = lname; }
}

DAO 클래스는 알아서 만드시고 메소드만 넣을게요.
public Object tableMultiInsert(List<Table> param ) {
return getSqlMapClientTemplate().insert("Table.tableMultiInsert", param);
}

SqlMap.xml은 아래와 같이.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" 
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Table">

<insert id="tableMultiInsert" parameterClass="java.util.List">
INSERT ALL
        <dynamic>
<iterate conjunction=" "  >
INTO t (pid, fname, lname) 
VALUES (#[].pid#, #[].fname#, #[].lname#)
</iterate>
</dynamic>
SELECT * FROM dual
</insert>

</sqlMap>

요렇게 쓰심 됩니다~~


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

[java]ZipFile 사용시 한글 깨짐 문제...해결!!

Programming 2009.03.10 21:56
아놔. 오늘 하루죙일 이 문제로 싸웠네..
http://www.google.co.kr/search?hl=ko&lr=&client=firefox-a&rls=org.mozilla:ko:official&newwindow=1&q=java+Zip+%ED%95%9C%EA%B8%80+%ED%8C%8C%EC%9D%BC%EB%AA%85&start=10&sa=N

뭐 저런 쿼리로 구글링 아무리 열심히해도 누구는 jazzlib를 쓰라하고..
누군 ZipFileInputStream을 고치라하고..-_-;;
또 누구는 ant.jar에 있는 ZipFile을 쓰라한다.-_-;;

하지만 그 누구도 정확한 답을 주지 못했다.
온갖 난리를 치다 결국 얻은 교훈은....
API를 제일 먼저 보자!!!!

org.apache.tools.zip API(클릭)


쫌..ㅠㅠ;;
This class adds support for file name encodings other than UTF-8 (which is required to work on ZIP files created by native zip tools and is able to skip a preamble like the one found in self extracting archives. Furthermore it returns instances of org.apache.tools.zip.ZipEntry instead of java.util.zip.ZipEntry.

요렇게 친절하게 적어놨자나!!!
UTF-8이 적용되지 않은 파일 압축을 풀게 해주기 위해 저런 클래스를 만들었다고!
그리고...

Constructor Summary
ZipFile(java.io.File f)
          Opens the given file for reading, assuming the platform's native encoding for file names.
ZipFile(java.io.File f, java.lang.String encoding)
          Opens the given file for reading, assuming the specified encoding for file names.
ZipFile(java.lang.String name)
          Opens the given file for reading, assuming the platform's native encoding for file names.
ZipFile(java.lang.String name, java.lang.String encoding)
          Opens the given file for reading, assuming the specified encoding for file names.

생성시 인코딩을 설정해 줄 수 있자나.ㅠㅠ;

그래서 결국 나온 코드는...
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipException;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

public class ZipFileUtil {

    public static int unZip(String orgFileName, String orgDirName) {
        return ZipFileUtil.unZip(new File(orgDirName + File.separator + orgFileName));
    }


    @SuppressWarnings("unchecked")
    public static int unZip(File fileName) {
        Enumeration entries;
        ZipFile zipFile = null;

        try {
            zipFile = new ZipFile(fileName,"EUC-KR");   // 요거 한방이면 끝인데.ㅠㅠ;

            entries = zipFile.getEntries();

            while (entries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String orgDirName = fileName.getParent() + File.separator;
                String entryFileName = entry.getName();
                if (entry.isDirectory()) {
                    System.err.println("Extracting directory: " + entryFileName);
                    (new File(orgDirName + entryFileName)).mkdir();
                    continue;
                } else {
                    String[] tmpSplit = entryFileName.split(File.separator);
                    if (tmpSplit.length > 1) {
                        String tmpDir = "";
                        for (int i = 0; i < tmpSplit.length - 1; i++)
                            tmpDir += (tmpSplit[i] + File.separator);
                        tmpDir = orgDirName + tmpDir;
                        File tmpFile = new File(tmpDir);
                        if (!tmpFile.exists())
                            tmpFile.mkdir();
                    }
                }
                System.out.println("Extracting File: " + entryFileName);

                FileUtil.copyInputStream(zipFile.getInputStream(entry),
                        new BufferedOutputStream(new FileOutputStream(
                                orgDirName + entryFileName)));
            }

        } catch (ZipException ze) {
            ze.printStackTrace();
            return 0;
        } catch (IOException ioe) {
            ioe.printStackTrace();
            return 0;
        } finally {
            try {
                if (zipFile != null)
                    zipFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return 1;
    }

}


import java.io.*;
public class FileUtil {
   
     /**
     * 파일을 stream으로 읽어들여 대상 outputStream에 복사하는 메소드
     * @param in
     * @param out
     * @throws IOException
     */
    public static final void copyInputStream(InputStream in, OutputStream out)
            throws IOException {
        byte[] buffer = new byte[1024];
        int len;

        while ((len = in.read(buffer)) >= 0)
            out.write(buffer, 0, len);

        in.close();
        out.close();
    }
}


정말 허무한 고생했다.ㅠㅠ;

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

SpringFramework + Quartz

Programming 2008.04.28 17:54

quartz를 사용하기 위해 필요한 라이브러리

  1. spring.jar - http://www.springframework.org/download
  2. quartz.jar - http://www.opensymphony.com/quartz/download.action

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">
      <property name="jobClass">
        <value>example.ExampleJob</value>
      </property>
      <property name="jobDataAsMap">
        <map>
          <entry key="timeout"><value>5</value></entry>
        </map>
      </property>
    </bean>
<bean id="exampleBusinessObject" class="example.ExampleBusinessObject"/>
<bean id="methodInvokingJobDetail"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject"><ref bean="exampleBusinessObject"/></property>
    <property name="targetMethod"><value>doIt</value></property>
    <property name="concurrent"><value>false</value></property>
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  <property name="jobDetail">
    <!-- see the example of method invoking job above -->  
    <ref bean="methodInvokingJobDetail"/>
  </property>
  <property name="startDelay">
    <!-- 10 seconds -->
    <value>10000</value>
  </property>
  <property name="repeatInterval">
    <!-- repeat every 50 seconds -->
    <value>50000</value>
  </property>
</bean>

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail">
    <ref bean="exampleJob"/>
  </property>
  <property name="cronExpression">
    <!-- run every morning at 6 AM -->
    <value>10 * * * * ?</value>
  </property>
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
    <list>
      <ref local="cronTrigger"/>
      <ref local="simpleTrigger"/>
    </list>
  </property>
</bean>   

<!--
  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

    <property name="quartzProperties">
      <props>
        <prop key="org.quartz.scheduler.instanceName">RiskienhallintaScheduler</prop>
        <prop key="org.quartz.scheduler.instanceId">instance_1</prop>
        <prop key="org.quartz.scheduler.rmi.export">false</prop>
        <prop key="org.quartz.scheduler.rmi.proxy">false</prop>
       
        <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
        <prop key="org.quartz.threadPool.threadCount">3</prop>
       
        <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>

      </props>
    </property>
    <property name="triggers">
    <list>
      <ref local="cronTrigger"/>
      <ref local="simpleTrigger"/>
    </list>
  </property>
  </bean>
  -->  
</beans>


QuartzJobBean.java

package example;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class ExampleJob extends QuartzJobBean {

  private int timeout;
 
  /**
   * Setter called after the ExampleJob is instantiated
   * with the value from the JobDetailBean (5)
   */
  public void setTimeout(int timeout) {
    this.timeout = timeout;
  }
 
  protected void executeInternal(JobExecutionContext ctx)
  throws JobExecutionException {
      System.out.println("job called. timeout is : "+timeout);
  }
}
  


ExampleBusinessObject.java

package example;

public class ExampleBusinessObject {
     
  // properties and collaborators
 
  public void doIt() {
    System.out.println("doIt method called in ExampleBusinessObject class");
   
  }
}

결과

doIt method called in ExampleBusinessObject class
job called. timeout is : 5

이 글은 스프링노트에서 작성되었습니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming' 카테고리의 다른 글

Quartz properties  (0) 2008.05.27
SpringFramework + Quartz  (0) 2008.04.28
wget.java  (0) 2008.03.17
simple java wget  (0) 2008.03.17


티스토리 툴바