소개는 학생이 퀴즈를 풀기전에 알아두어야할것들에 대한 이해를 도와주는 설명이 들어갈 수 있습니다.  







기본적으로 시간제한 및 시작/종료 날짜가 세팅 안되있지만 설정가능합니다.




퀴즈를 통과하기 위한 성적을 결정하며, 퀴즈를 몇번 되풀이해서 풀게하나 및 채점방법입니다.




한 페이지당 퀴즈가 몇개 보여질지 결정합니다.




- 퀴즈를 순서대로 보여줄것인지, 뒤섞을것인지.

- 지연된 피드백 선택하면, 문제 다 풀고나서 피드백 보여진다.




- 적응 모드:  각 질문에 여러번 응할수 있게함. (학생의 답안이 틀렸을때 메세지를 표시하고 틀린 질문을 다시 보여줄지 / 다른 질문을 보여줄지여부 : 전체 퀴즈를 다시 풀게하는 Attemps allowed 와 다르다) 

각 시도는 마지막 시도에 누적됩니다 : 이거 예로 하면 매번 시도했던 내용들이 바로 전에 시도했던 결과와 취합되어 표시되며, (이전에 0점 맞았는데 이번에 답을 맞추면 점수를 높혀줌) 학생은 이전에 시도했던 답변의 내용과 얻은 점수를 보게된다. 


"각 시도는 마지막 시도에 누적됩니다" 설정은 퀴즈를 평가의 도구가 아닌 가르치기 위한 도구로 사용할때 특히 유용하다. Attempts allowed 설정은 학생이 퀴즈를 계속 다시 풀 수 있게하고, 이 설정은 처음 시도할 때부터 이후의 시도까지 답변을 유지하므로, 두 가지 설정을 같이 사용하면 학생이 문제를 맞출 때까지 계속 재시도가 가능한 퀴즈를 생성할 수 있어서 퀴즈를 평가의 도구에서 가르치는 도구로 전환한다.






- 학생이 자신이 푼 퀴즈를 검토할 때 보게 될 정보를 결정한다.

                             - 시도중에 :  이거 선택하면 문제 푸는 도중에 피드백을 받을수있고, 정답확인할수있다.

                            -  위에 질문작동에 종속되어 작동한다. 지연된 피드백이 선택되면 시도중에가 무용지물





                              퀴즈창에 학생의 프로필사진 및 이름 표시, 감독관이 학생신분을  확인할수있게함



여러번 풀때 시간간격 및 비밀번호를 알아야 퀴즈를 풀수있게 함 



                                         등급 변화에 따른 전반적인 피드백  (퀴즈별 피드백은 따로 있다) 


  - 학생이 퀴즈를 볼수있게/없게한다.

  - 학생들 각자가 퀴즈를 풀기 때문에 퀴즈 모둠 설정의 실제 사용은 퀴즈결과블록에 모둠의 최고 점수를 표시하는것 외에는 없다.


레퍼런스:

- Moodle 2.0 이러닝 강좌 개발 책 참조 -



- 관련 jar 를 다운받아서 프로젝트에 추가합니다.

- 클래스패스에 log4j.xml 파일을 추가합니다. 

- log4j.xml 파일에 아래 내용을 써 넣습니다.


1.  Console 로 출력 


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

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="true"

xmlns:log4j='http://jakarta.apache.org/log4j/'>

 

<appender name="console" class="org.apache.log4j.ConsoleAppender">

   <layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" 

 value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />

   </layout>

</appender>

 

<root>

<level value="DEBUG" />

<appender-ref ref="console" />

</root>

 

</log4j:configuration>


<level value="DEBUG"/>: DEBUG 레벨부터 출력하라. 

<appender-ref ref="console"/>: console 에 출력할거야.


2. 파일로 출력 


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

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="true"

xmlns:log4j='http://jakarta.apache.org/log4j/'>

 

<appender name="file" class="org.apache.log4j.RollingFileAppender">

  <param name="append" value="false" />

  <param name="maxFileSize" value="10KB" />

  <param name="maxBackupIndex" value="5" />

  <!-- For Tomcat -->

  <param name="file" value="${catalina.home}/logs/myStruts1App.log" />

  <layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" 

value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />

  </layout>

</appender>

 

<root>

<level value="ERROR" />

<appender-ref ref="file" />

</root>

 

</log4j:configuration>


<param name="append" value="false" />: 어플리케이션 실행시마다 덮어쓸것이냐? 뒤에 붙힐것이냐? 디폴트 : true


3. 콘솔과 파일에 출력 


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

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="true"

  xmlns:log4j='http://jakarta.apache.org/log4j/'>

 

<appender name="console" class="org.apache.log4j.ConsoleAppender">

   <layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" 

value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />

   </layout>

</appender>

 

<appender name="file" class="org.apache.log4j.RollingFileAppender">

   <param name="append" value="false" />

   <param name="maxFileSize" value="10MB" />

   <param name="maxBackupIndex" value="10" />

   <param name="file" value="${catalina.home}/logs/myStruts1App.log" />

   <layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" 

value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />

   </layout>

</appender>

 

<root>

<level value="DEBUG" />

<appender-ref ref="console" />

<appender-ref ref="file" />

</root>

 

</log4j:configuration>


<appender-ref ref="file" />: file 에 출력할거야.

${catalina.home}/logs/myStruts1App.log: 이 위치에 출력할거야.  


3. 패키지/클래스별 출력 

    <logger name="org.springframework" additivity="false">

        <level value="WARN" />

        <appender-ref ref="console" />

        <appender-ref ref="file" />

    </logger>


"org.springframework"         은 WARN 이상부터만 출력하라~ 

 additivity="false"               로그 이벤트가 부모에서 전달되지 않는다. 


4. 날짜별 파일 출력



5. 용량별 파일 출력



 



레퍼런스: 

http://www.mkyong.com/logging/log4j-xml-example/

http://seosh81.info/?p=404

http://logging.apache.org/log4j/1.2/manual.html


파이썬은 왜 느릴까? 느린가?     (파이썬 종류에 따라서 천차만별임을 염두..) 

https://medium.com/@cookatrice/why-python-is-slow-looking-under-the-hood-7126baf936d7

https://hbfs.wordpress.com/2009/11/10/is-python-slow/


왜 항상 자바는 c++ 보다 느릴까?  (언제 쓰여진건지 모르겠군요. 항상이란 말이 좀 깨림칙...) 

http://sungpi.postach.io/post/wae-hangsang-jabajavaneun-c-boda-neuringa


왜 인터프리트 언어는 컴파일언어보다 느릴까?

http://stackoverflow.com/questions/1694402/why-are-interpreted-languages-slow

http://stackoverflow.com/questions/7991877/why-is-an-interpreter-slower-than-a-compiler-in-practice


C++ VS Python 속도비교 

http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/

http://www.matthiaskauer.com/2014/02/a-speed-comparison-of-python-cython-and-c/


스택 오버플로우의  답변 중 하나

All answers seem to miss the real important point here. It's the detail how "interpreted" code is implemented.

Interpreted languages are slower because their method, object and global variable space model is dynamic. This requires many many extra hash-table lookups on each access to a variable or method call. This is where most of the time is spent. It is a painful random memory lookup, which really hurts when you get a L1/L2 cache-miss.

Google's Javascript Core8 is so fast and targeting almost C speed for a simple optimization: they take the object data model as fixed and create internal code to access it like the data structure of a native compiled program. When a new variable or method is added or removed then the whole compiled code is discarded and compiled again.

The technique is well explained in the Deutsch/Schiffman paper "Efficient Implementation of the Smalltalk-80 System".

The question why php, python and ruby aren't doing this is pretty simple to answer: the technique is extremely complicated to implement.

And only Google has the money to pay for JavaScript because a fast browser-based JavaScript interpreter is their fundamental need of their billion dollar business model.


가장 심플한 답변 

compiled language like C is usually compiled directly into machine code. When you run the code, it is executed directly by the CPU.

A fully interpreted language like BASIC or PHP is usually interpreted each time it runs. When you execute your code, the CPU executes the interpreter, and the interpreter reads and executes your source code. (PHP can be classified as fully interpreted, since while it does use opcodes, they are usually thrown away after the execution.)

bytecode interpreted language like Python, is compiled from source code to bytecode that is executed by a virtual machine. The CPU runs the VM, and the VM executes each bytecode instruction. In Python, the bytecode is compiled the first time code is executed.

In Java, bytecode is compiled ahead of execution. The Java VM also has a special feature called Just-in-time compilation. This means that during execution, it may compile some of the bytecodeto machine code, which it can send to the CPU to execute directly.

In conclusion, with compiled languages, the CPU runs the code directly. In interpreted languages, the CPU usually runs the interpreter or virtual machine. This makes interpreted languages generally slower than compiled languages, due to the overhead of running the VM or interpreter.

NOTE: While we speak of interpreted and compiled languages, what we are really discussing is the usual execution style of a language. PHP can be compiled (using HipHop), and C can be interpreted (using Parrot VM).


보통 JAR 파일을 프로젝트에 넣을때, 이렇게 사용합니다.


방법 1 :


- 프로젝트 안에 lib 라는 새 폴더 만들기 (이름은 아무거나) 

- 그 안에 jar 파일 넣기 

- 이클립스에서 refresh 하면 폴더가 보여짐

- jar 파일을 모두 선택한후에 , 오른쪽 클릭 -  Build Path - Add to Build Path 클릭하면 끝

- 이클립스에서 Referenced Libraries 에 보여질것임.


방법 2 : 

- 프로젝트 안에 lib 라는 새 폴더 만들기 (이름은 아무거나) 

- 그 안에 jar 파일 넣기 

- 이클립스에서 refresh 하면 폴더가 보여짐

Project -> Select Build Path -> Select Configure Build Path -> Library   Add Jars .. 로  lib 폴더 안의 jar 파일 
  선택함

- 이클립스에서 Referenced Libraries 에 보여질것임.


방법 3:

Referenced Libraries 말고 내 자신이 만든 library 그룹에 넣고 싶을때는 

-Project -> Select Build Path -> Select Configure Build Path -> Library    에서 Add Library 선택후 

 아래처럼 User Library 선택하고 새로운 User Library 만들어주고  (이름을 MyLib) 


Add Jars .. 를 한후에 lib 폴더 안의 jar 파일을 선택해주고

Order and Export 를 클릭후 MyLib 폴더 체크를 꼭해주면 

- 이클립스에서 MyLib  에 JAR 파일이 있는게 보일겁니다.


External JAR 는 뭘까나? 


  • 이름에서 느껴지듯이 현재 개발되고 있는 코드에 의해서 생겨난게 '아닌'  jar 파일이란 얘기다.
    추가적인으로 외부에서 더해지는 유틸리티성 jar 파일을 설정한다.  외부싸이트나 친구,동료가 제공한
     API jar 파일 될수도 있고 ~
  • 이클립스에 외부 jar 파일을 추가하려면 Project -> Select Build Path -> Select Configure Build Path -> Library 탭으로 가면 된다. 아래 빨강색 박스~



그럼 Library 는 머냐? 

라이브러리는 일반적으로 어떤 회사나 굵직한 단체에서 개발된것들로서, JDK 디렉토리나 스프링같은것들 로

부터의 in-built jar 파일이다. 


adding JAR /  Adding External JAR /  Adding Library 는 그래서 먼 차이? 

  • Adding Jar :  이클립스안에 하나 이상의  프로젝트가 있고 , 또다른 프로젝트의 jar 파일을 추가할때, adding jar 파일이라고 불리는데, 위 사진에서 첫번째 버튼이며, 다른 프로젝트로부터 jar file 을 추가할때 사용한다.
  • Adding External Jar: 어떤 싸이트, 친구, 동료, 또다른 제조사로부터 제공된 API Jar 파일을 추가할때~
  • Adding A Library: 다음과 같은 대화상자가 열리는데 , 당신의 시스템에 인스톨된  다른 라이브러리들을 추가할수있다. 또한 User Library 를 선택해서 자신의 라이브러리를 추가할수도 있다.




요런 답변도 있군요.


Adding JAR:   

- 당신의 워크스페이스 안에 있는 A JAR File 을 추가할때.

- 또는 이미 프로젝트에 존재하는 빌드패스에 jar 파일을 추가할때~

- 프로젝트 디렉토리에  상대경로로 참조될것이다.                      

Adding  External JAR

- 당신의 파일 시스템 안에 있는 JAR 를 추가할때,  거의 테스트 목적으로만 써라..안그러                                             면 프로젝트가 굉장히 어수선해질것이다. 

- 프로젝트에 절대경로로 참조될것이다. 

Adding  Library

 - JUnit 같은 built-in 라이브러리들 추가할때, 그때 이클립스에 의해 따라 오기때문에 
    저녀석들의  위치는  알필요 없다.





레퍼런스: 

http://stackoverflow.com/questions/8486403/eclipse-ide-add-jar-add-external-jar-add-library



톰캣의 클래스패스 (웹어플리케이션이 필요로하는 JAR 파일을 찾는) 를 어떻게 설정하는지에 관한 문제는 

어느 게시판을 가더라도 많은 흔한 주제이다.


왜 톰캣 유저에게 클래스패스가 문제를 일으키나? 


classpath  는 JVM 에게 해당 어플리케이션을 동작시키기 위해 클래스/패키지를 어디서 찾으라고 알려주는 인자이다. 

근데 왜  저런 클래스 패스를 잘 알고있는 경험많은 자바 개발자들이 톰캣에서는 문제를 가질까? 

그것에 대한 3가지 답변이 있다.

  1. Tomcat 는 다른 자바프로그램과 동일한 방법으로 classpath 를 바라보지 않는다.
  2. Tomcat 이 classpath 를 해결하는 방법은 매 버전마다 조금씩 달라져 왔다.
  3. 톰캣의 기술문서와 기본 설정은 어떤것을 이루어내는 가장 좋은 방법을 푸쉬하는데, 만약 이 가장좋은 방법을 
    따르지 않는다면 , 어둠속에서 배회하게 될것이며  만약 니가 다른 이상한 짓을 한다면 , 별다른 정보를 제공받지 못할것이다.
    (바깥에 있는 디펜던시 , 공유되는 디펜던시  or  동일한 라이브러리/클래스의 다중 버전 같은..) 


일반적인 사용법과 달리 어떻게 톰캣 클래스 패스는 사용되는가?

모든 아파치 톰캣은 가능한 자동적이면서,  직관적이며,  자기-포함 (self-contained) 이라는 목적을 갖고있는데 효율적인 관리를 위해 웹 어플리케이션의 배포나 설정을 표준화하려고 노력중이다. 그와 동시에 보안과 네임스페이스 이유에 대한 여러 라이브러리들의 접근을 제한하고 있다. (?)

자바 클래스 패스 환경 변수를 사용하는것보다 어려운 이유는 , 톰캣의 "시스템" 클래스로더를 만들어질때  톰캣의 스타트 스크립트는 이런 변수(OS환경변수) 를 무시하며,자신의 클래스패스를 만들어버린다.  

Tomcat 이 어떻게  classpath 를 설정하는지 이해하기위해  Tomcat 6 의 시작 프로세스를 살펴보자.

  1. JVM 부트스트랩 로더는 코어 자바 라이브러리를 로딩한다. JAVA_HOME  변수를 통해서 코어라이브러리의 위치를 알수있다.

  2. Startup.sh 은 "start"  파라미터와 함께  bin/Catalina.sh 를 호출하며 , 시스템 클래스 패스를 덮어쓰고  bootstrap.jar  과 tomcat-juli.jar. 를 로딩한다.  이 리소스들은 오직 Tomcat 한테만 보인다.

  3. 클래스로더들은 각각 디플로이된 컨텍스트에 대해 생성되며  그것들은 웹 어플리케이션 마다의   WEB-INF/classes 와 WEB-INF/lib  안에 있는 JAR 와 클래스들을 로드한다. 이런 리소스들은 오직 그들을 로드한 웹어플리케이션에만 보인다.
     
  4. Common 클래스로더는  $CATALINA_HOME/lib 에 있는 모든 클래스들과 JAR 를 로드한다.  이 리소스들은 톰켓과 모든 어플리케이션에 노출된다.

톰캣은 4개 혹은 그 이상의 속성에 의해 설정된 여러가지 클래스패스들을 해석하는데,  그것중에 

하나만 표준위치에 있을뿐이다.톰캣에 공통 라이브러리를 추가하려면  TOMCAT_HOME/bin/catalina.sh 

파일에  CLASSPATH를 추가해주거나 TOMCAT_HOME/conf/catalina.properties  에 common.loader를 추

가해 주면 된다.


레퍼런스 : https://www.mulesoft.com/tcat/tomcat-classpath


'WAS &amp; 웹서버' 카테고리의 다른 글

톰캣 최종분석 ex14 소스 분석  (0) 2015.08.24
톰캣 최종분석 ex05 소스 분석  (0) 2015.08.15

ClassNotFoundException :   

클래스 로더가 클래스 패스에서 해당 클래스를 못 찾으면 발생한다. 이 에러가 발생하면 기본적으로 클래스 패스와 
그 패스에 해당 클래스가 존재하는지 확인해야한다.

NoClassDefFoundError :

이것이 발생하면 이유를 찾기가 꽤나 골치아퍼 지는데, 이것은 컴파일타임때 요구되는 클래스가 존재하지만 
런타임때 클래스들이 바뀌거나, 제거되거나, 클래스의 스태틱 초기화가 예외를 던지면 이것이 발생한다. 
먼 소리냐하면 클래스패스에 클래스가 존재하더라도, 이 클래스에 요구되는 클래스들중 하나에 문제가 생겼다는 
이야기이다. 따라서 이 클래스와 의존관계를 맺는 모든것들을 살펴봐야한다.

예제 :

public class Test1
{
}
public class Test 

{
   public static void main(String[] args)

   {
        Test1 = new Test1();    
    }

}

     
두개의 (Test, Test1)  클래스를 컴파일한후에 , Test1.class 파일을 지우고 RUN 해보면 아래의 예외를 던진다.

Exception in thread "main" java.lang.NoClassDefFoundError: Test
        at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more
 

번외 :  JAVA 와 WAS 의 클래스 로딩 차이 

Java에서 클래스로더가 클래스나 리소스를 찾을 땐 부모 클래스로더에게 우선 이를 위임하게 된다. 그래서 부모 클래스로더가 해당 클래스나 리소스를 찾을 수 없게되면 자신이 직접 해당 클래스나 리소스를 찾는 형태로 동작하게 된다. 아래는 이와 관려련하여 Java 7의 API문서에서 발췌한 내용이다.

The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader. When requested to find a class or resource, a ClassLoader instance will delegate the search for the class or resource to its parent class loader before attempting to find the class or resource itself.

클래스로더가 복수개 존재할 때 공통으로 사용되는 클래스나 리소스들을 모두 각자 로딩한다면 해당 자원들을 중복되게 로딩함으로써 JVM의 permanent generation를 낭비하게 된다. 하지만 부모 클래스로더에서 해당 자원들을 먼저 찾는 방식으로 동작할 경우 복수개 클래스로더의 부모가 모두 같을 경우 부모에 로드된 자원을 함께 사용하게 되므로 자원의 낭비를 막을 수 있다. 이러한 방식의 클래스로딩 메커니즘을 parent-first / child-last 방식이라고 명명하도록 하겠다.

하지만 WAS에서는 parent-first / child-last 방식을 사용하지 않는다.

(이미지 출처: Tomcat 클래스로더 How-to)

대표적은 WAS인 Tomcat의 클래스로더 계층구조는 위의 그림과 같다. 만약 WAS에서 Java와 같은 parent-first / child-last 방식의 클래스로딩 메커니즘을 사용할 경우 각각의 웹앱들은 Common 클래스로더에서 로딩된 클래스를 함께 사용하게 된다. 즉, WAS의 lib 폴더에 존재하는 클래스들을 모든 웹앱에서 함께 사용하게 되어버린다.

웹앱 개발 시에 A라는 라이브러리의 최신 버전인 2.0 버전을 사용했다고 하자. 개발과 검증을 모두 완료하고 해당 웹앱을 WAS에 배포했는데 만약 Common 클래스로더에 이미 A라는 라이브러리의 1.0 버전이 로딩되어 있다면 어떻게 될 것인가? 1.0과 2.0의 클래스 명(패키지 경로 포함)이 같고 기능이 바뀌었다면 2.0기반에서 작업된 웹앱은 제대로 동작하지 않을 것이다. 이와 같은 문제가 발생할 수 있기 때문에 WAS에서는 parent-first / child-last 방식의 클래스로딩 메커니즘이 아닌 parent-last / child-first 방식의 클래스로딩 메커니즘을 사용한다.

참고로 Tomcat에서는 아래와 같은 순서로 클래스로더를 사용한다. (엄밀히 말하면 parent-last / child-first가 아니라 Common과 웹앱만 순서가 바뀐 것이다.)

  • Bootstrap
  • System
  • /WEB-INF/classes
  • /WEB-INF/lib/*.jar
  • Common


2014.08.12 추가

Tomcat이 아닌 다른 WAS들의 경우 모두 parent-last / child-first 방식을 디폴트로 따르는 것은 아닌 것 같다. 하지만 그런 WAS들의 경우 어떤 클래스로딩 메커니즘 방식을 사용할지 설정할 수 있다. 자체 서비스를 하는 기업의 경우 이런 설정을 자신들이 변경할 수 있지만 WAR 패키지로 판매하는 제품을 만드는 기업의 경우 WAS의 클래스로딩 메커니즘 설정에 따라 충돌이 발생할 수 있기 때문에 주의해야 한다.

http://epicdevs.com/16

레퍼런스 : http://www.javaroots.com/2013/02/classnotfoundexception-vs.html

 

안드로이드 어플리케이션의 타이틀 바를 제거하고 싶을 때 아래의 두가지 방법중 하나를 사용한다.


1. 프로그램 코드로 삽입


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);

    requestWindowFeature(Window.FEATURE_NO_TITLE);   를 SetContentView '위에' 써주어야한다.



2. manifest 파일 수정


<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<activity

    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"   추가 


유의사항으로는 

public class MainActivity extends AppCompatActivity {

이거 에러난다.

public class MainActivity extends FragmentActivity {

FragmentActivity 를 상속받으면 OK~

+ Recent posts