Tech/JavaScript2017. 11. 10. 12:31

Javascript Unit Test를 수행하기 위해 Mocha, Jasmine, Qunit 중에 검토하다가 비교적 가장 최신 기술이고, Mock을 쓰기 편한 쪽이라 추측하여, Mocha의 사용법을 알아보았다. (Unit Test를 작성할 때, BDD, TDD 두 가지 스타일을 모두 제공한다는 점에서도 끌렸다.)


설치

  1. chai를 설치한다.

    npm install -g chai
    (or npm install chai --save-dev)
  2. mocha를 설치한다.

    npm install -g mocha



BDD Unit Test

  1. 모듈을 작성한다. (app.js)

    (function(exports) {
      "use strict";
     
      function Tester() {}
      exports.Tester = Tester;
     
      Tester.prototype = {
        sum: function (a, b) {
          return a + b;
        }
      };
    })(this);



  2. 테스트 코드를 작성한다. (app.test.js)

    var expect = chai.expect;
     
    describe("BDD Test"function() {
      describe("더하기 테스트"function() {
        it("2와 4를 합했으니, 6이 될 것이다."function() {
          var tester = new Tester();
          expect(tester.sum(2, 4)).to.equal(6);
        });
      });
    });



  3. 테스트를 수행 결과를 표시하기 위한 html을 작성한다. (index.html)

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>BDD unit test</title>
      <!-- mocha 스타일 적용 -->
      <link rel="stylesheet" media="all" href="../component/mocha/mocha.css">
    </head>
    <body>
      <div id="mocha"><p><a href=".">Index</a></p></div>
      <div id="messages"></div>
      <div id="fixtures"></div>
      <!-- mocha.js 로드 -->
      <script src="../component/mocha/mocha.js"></script>
      <!-- chai.js 로드 -->
      <script src="../component/chai/chai.js"></script>
      <script src="app.js"></script>
      <!-- bdd 스타일 UnitTest임을 설정함 -->
      <script>mocha.setup('bdd')</script>
      <script src="app.test.js"></script>
      <!-- UnitTest 수행 -->
      <script>mocha.run();</script>
    </body>
    </html>



  4. html을 실행시켜본다.

    1. 성공했을 때
    2. 실패했을 때

 

 

Command Line Test

  1. 모듈을 작성한다. (app.js)

    module.exports = {
      sum: function(a,b) {
        return a+b;
      }
    }



  2. 테스트 코드를 작성한다. (app.test.js)

    var chai = require('chai');
    var assert = chai.assert;
    var app = require('../app.js');
     
    describe('Sum Test'function() {
      it("1과 2를 더하면, 3이 될 것이다."function() {
        assert.equal(3, app.sum(1,2));
      });
    });



  3. Command Line으로 결과를 확인한다.

     

MockTest

  1. Sinon.JS를 다운로드 받는다. (사이트 주소 : http://sinonjs.org/)
    1. Document : http://sinonjs.org/docs/
    2. 참고 사이트 : http://elijahmanor.com/unit-test-like-a-secret-agent-with-sinon-js/
       
  2. 다운로드 받은 sinon.js를 추가한다. (index.html)

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>BDD unit test</title>
      <!-- mocha 스타일 적용 -->
      <link rel="stylesheet" media="all" href="../component/mocha/mocha.css">
    </head>
    <body>
      <div id="mocha"><p><a href=".">Index</a></p></div>
      <div id="messages"></div>
      <div id="fixtures"></div>
      <!-- mocha.js 로드 -->
      <script src="../component/mocha/mocha.js"></script>
      <!-- chai.js 로드 -->
      <script src="../component/chai/chai.js"></script>
      <!-- sinon.js 로드 -->
      <script src="../component/sinon/sinon-1.17.3.js"></script>
      <script src="app.js"></script>
      <!-- bdd 스타일 UnitTest임을 설정함 -->
      <script>mocha.setup('bdd')</script>
      <script src="app.test.js"></script>
      <!-- UnitTest 수행 -->
      <script>mocha.run();</script>
    </body>
    </html>



  3. 테스트를 위한 클래스를 정의한다. (person.js)

    (function(exports) {
      "use strict";
     
      function Person() {}
      exports.Person = Person;
     
      Person.prototype = {
        setName: function(name) {
          this.name = this.returnName(name);
        },
        returnName: function(name) {
          return name;
        }
      };
    })(this);



  4. Mock Test 코드를 작성한다. (person.test.js)
    (tick) "setName" 함수를 호출했을 때, "returnName" 함수를 호출하는지 확인한다.

    var expect = chai.expect;
     
    describe("Person"function() {
      describe("constructor"function() {
        it("Mock Test"function() {
          var person = new Person();
          var mock = sinon.mock(person);
     
          mock.expects("returnName").once().withExactArgs("Betty");
          person.setName("Betty");
     
          mock.verify();
          mock.restore();
        });
      });
    });



  5. 결과를 확인한다.



'Tech > JavaScript' 카테고리의 다른 글

Javascript Task Runner : Grunt 의 개요 및 장점  (0) 2015.06.05
Posted by 알 수 없는 사용자
Tech/Android 개발2015. 7. 9. 18:29

Android Studio에서 Junit 기반 단위 테스트(Unit Test) 환경 구축하기

안드로이드 Instrumentation 테스트의 경우에는 안드로이드 장치 또는 시뮬레이터에 직접 테스트 코드를 올려서 테스트가 진행됩니다. 이러한 과정 때문에 비교적 느립니다. 다른 방식으로 데스크탑 환경에서도 테스트를 할 수 있습니다. 이 방식에서는 보통 Junit을 기반으로 다양한 Mocking 라이브러리 또는 Robolectric과 같은 프레임워크를 사용하여 테스트가 진행됩니다. 이 포스트에서는 이런 방식의 가장 기본이 되는 Junit 테스트 환경을 구축하는 방법에 대해 설명하겠습니다.


진행환경

* Window 8.1  /  * Android Studio 1.2.2


1. 프로젝트 생성

Blank Activity 프로젝트를 기본 옵션으로 하나 생성합니다.


2. Unit Test 폴더 구조 생성

안드로이드에서 Instrumentation 테스트의 경우는 src/androidTest/java를, Junit 테스트의 경우에는 src/test/java를 기본 테스트 폴더로 인식합니다. 

프로젝트를 생성하시면 기본적으로 androidTest 폴더가 생성되어있을 것입니다. 상단 좌측의 프로젝트 구조 보기를 'Project'로 선택하시고 androidTest폴더에서 우클릭 -> Refactor -> Rename 을 통해 test로 이름을 변경하면 됩니다.


3. 빌드 스크립트에 Junit 추가

app의 build.gradle 파일을 열어서 dependency에 testCompile 구문을 추가합니다.

dependencies {
  ...
  testCompile 'junit:junit:4.12'
  ...
} 

메뉴에서 Tools -> Android -> Sync Project with Gradle Files 를 선택해 Gradle 파일을 Sync 시켜 줍니다.


4. Test Artifact 설정

좌측 하단 Build Variant 탭을 클릭한 후 Test Artifact를 Unit Tests로 설정해 줍니다.

여기까지 하시면 안드로이드가 java 폴더를 테스트 폴더로 인식하여 첫번째 사진과 같이 초록색 아이콘 으로 표시되어야 합니다.


5. Unit Test 코드 작성

이제 환결 설정은 다 끝났습니다! 작동하는지 알아보기 위해 간단히 Calculator 클래스를 만들어서 두 정수를 더하는 메소드를 테스트 해보겠습니다.

아래와 같이 Calculator랑 CalculatorTest 클래스를 생성하고 코드를 써줍니다.

 Calculator.java

CalculatorTest.java 

public class Calculator {
  public int add(int a, int b) {
    return a+b;
  }
}

import org.junit.Test;
import static org.junit.Assert.assertTrue;

public class CalculatorTest {
  @Test
  public void testAdd() {
    Calculator calculator = new Calculator(); 
    int actual = calculator.add(10, 10); 
    int expected  = 10+10;
    assertTrue(actual == expected);
  }
}


6. 테스트하기

테스트 java 폴더에서 우클릭 -> Run -> All Tests를 통해 테스트를 실행할 수 있습니다. 성공하면 아래와 같은 결과가 나옵니다.

끝!


참조

https://developer.android.com/training/testing/unit-testing/local-unit-tests.html
http://tools.android.com/tech-docs/unit-testing-support


'Tech > Android 개발' 카테고리의 다른 글

Android에서 SignalR 사용하기  (0) 2015.06.19
안드로이드에서의 HLS 스트리밍 이슈들  (0) 2015.04.13
Android 개발환경 설정  (0) 2011.04.15
Posted by 알 수 없는 사용자
Tech/Android 개발2015. 6. 19. 17:02

SignalR 이란?

웹 서버와 브라우저 간의 실시간 양방향 통신을 위해 HTML5 표준인 WebSocket이 있습니다. 그러나 아직 WebSocket이 지원되지 않는 환경이 많습니다. Signal R은 MS에서 만든, 추상화를 통해 단일한 API로 서버와 클라이언트 간의 실시간 양방향 통신을 가능하게 해주는 라이브러리입니다. 내부적으로는 환경에 따라서 WebSocket을 사용하기도 하고 Long Poliing을 사용하기도 하는 등 다양한 방식을 사용합니다. 또한, 이러한 기능을 하는 대표적인 라이브러리로는 Node.js 기반의 Socket.IO가 있습니다! 


Android에서 SignalR 사용하기

만들려고 하는 예제

  • 서버와 클라이언트 허브에 각각 'hello' 라는 메소드가 있고 이 메소드는 문자열 하나를 인자로 받습니다.
  • 안드로이드 클라이언트에서 서버에 hello 메소드를 통해 문자열을 보내면 서버도 클라이언트로 hello 메소드를 통해 같은 문자열을 보냅니다.
  • 안드로이드 앱은 서버로부터 문자열을 받으면 Toast 메시지로 이를 보여줍니다.

구현하기 

1. 라이브러리 추가
signalR 자바 및 안드로이드 버전 클라이언트 라이브러리와 gson이 필요합니다. signalR 라이브러리들은 현재 jar을 공식적으로 받을 수 있는 곳은 없고 github 저장소에서 소스를 빌드하여 사용하셔야 합니다. gson은 로컬에 jar이 없어도 jcenter나 maven 저장소의 dependency를 지정함으로써 사용할 수 있긴합니다. 일단 이 예제를 진행하면서 빌드해 놓은 라이브러리 파일들과 bintray에서 받은 gson jar 파일을 첨부합니다. 

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.google.code.gson:gson:2.3.1' compile files('libs/signalr-client-sdk.jar') compile files('libs/signalr-client-sdk-android.jar') }


2. Permission 추가 

네트워크 통신을 사용하므로 <uses-permission android:name="android.permission.INTERNET"/> 를 Android Manifest 파일에 추가해 줍니다.


3. 멤버변수 선언

public class MainActivity extends ActionBarActivity {

    HubConnection mConnection;
    HubProxy mHub;

MainActivity.java를 생성하고 통신의 주체가 되는 모듈인 HubConnection 과 HubProxy를 선언해 줍니다. 여러 곳에서 사용되기 때문에 이번 예제에서 간편함을 위해 멤버변수로 선언하였습니다.


4. 연결 설정 및 초기화

    private void initialize() {
        String serverUrl = "http://server.url";
        String hubName = "hubName";

        Platform.loadPlatformComponent(new AndroidPlatformComponent());
        mConnection = new HubConnection(serverUrl);
        mHub = mConnection.createHubProxy(hubName);
    }

SignalR 서버 Url과 서버에서 사용하는 hubName을 설정합니다. 


5. 메시지 받을 준비 하기

    private void prepareGetMessage() {
        mHub.on("hello", new SubscriptionHandler1<String>() {
            @Override
            public void run(final String msg) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
                    }
                });
            }
        }, String.class);
    }

Hub의 on 메시지를 통해서 서버가 hello 메소드를 호출할 경우의 리스너를 등록합니다. 앞서 말씀드렸듯이 이 메소드는 인자를 하나만 받기 때문에 리스너로 SubscriptionHandler1을 사용하였습니다. 인자가 여러 개일 경우 개수에 따라서 SubscriptionHanlder2, SubscriptionHanlder3, ... 클래스를 사용하시고 알맞은 클래스 타입을 설정해주면 됩니다. 
( 안드로이드는 아직 Java8을 지원하지 않아 Lambda Expression을 사용하지 못하여 코드가 상당히 기네요ㅜㅜ ) 


6. 연결 성립하기

private void connectToServer() { try { SignalRFuture<Void> awaitConnection = mConnection.start(); awaitConnection.get(); Toast.makeText(this, "Connected", Toast.LENGTH_LONG).show(); } catch(Exception e) { Log.e("SignalR", "Failed to connect to server"); } }

동기 방식(Synchronous)으로 연결을 합니다. 따라서 Exception 없이 awaitConnect.get() 구문이 수행되고 나면 연결이 성립되었다고 볼 수 있습니다. 안드로이드에서 네트워크 통신 작업은 UI Thread에서 수행이 불가능하지만 위 메소드는 UI Thread에서도 호출이 가능합니다. 왜냐하면 실질적인 통신작업은 사실상 비동기로 이루어지고 awaitConnect.get()이 세마포어를 획득하기 위해 기다리는 식으로 구현되었기 때문입니다. 


7. 메시지 보내기

    private void sendMessage(String msg) {
        try {
            mHub.invoke("hello", msg).get();
        } catch( Exception e ){
            Log.e("SignalR", "Fail to send message");
        }
    }

Hub의 invoke 메소드를 통해 서버 Hub 메소드를 호출하는 식으로 메시지를 보냅니다. 이 역시 연결 성립할 때와 같은 방식으로 동기로 진행되며 UI Thread에서도 사용 가능합니다.


8. 연결 해지

    @Override
    protected void onDestroy() {
        mConnection.stop();
        super.onDestroy();
    }

stop 메소드를 통해 연결을 해지합니다. 이 예제에서는 앱의 onDestory가 호출 될 때 연결 해지를 하였습니다! 


9. 최종 결과 앱


지금까지 말씀드린 내용을 구현한 소스파일을 첨부합니다.

activity_main.xml

MainActivity.java


참조

Github : SignalR/java-client

Github : SignalR/java-samples

Getting Started with the Java SignalR SDK



Posted by 알 수 없는 사용자
Tech/JavaScript2015. 6. 5. 18:07

기존에 Xinics에서는 HTML5 Javascript 어플리케이션 배포를 위해 빌드 시 Ant 스크립트를 사용해 왔었습니다. Ant 스크립트로 Javascript 빌드를 할 때의 여러 가지 한계와 불편한 점으로 인해 대안을 조사하였습니다. 그 일환으로 Grunt에 대해 조사한 내용을 공유합니다.

1. Grunt란? 

Grunt는 Javascript를 사용한 Task Runner입니다. 즉 반복적인 작업을 스크립트를 통해서 한 번에 수행하게 해주는 자동화 도구입니다. Javascript 앱 빌드의 경우에는 여러 가지 JS 및 CSS 파일을 하나로 합치고 minify 하며 또 어떤 파일은 배포 폴더로 복사하고 하는 과정들을 스크립트를 작성하여 한 줄의 명령어를 통해 자동화시킬 수 있습니다. Makefile, Ant 등의 Javascript 버전이라고 볼 수 있습니다. Grunt와 Grunt 플러그인들은 npm(Node.js Package Manager)을 통해 설치되고 관리됩니다. 즉 Node.js 모듈입니다. 자세한 내용은 공식 웹사이트에서 확인하실 수 있습니다.


2. Grunt의 장점

1. Javascript/Node.js 기반의 빌드 툴이다.

Javascript 및 Node.js는 활발하게 유지 보수되며 성장하고 있는 언어 및 플랫폼입니다. 따라서 안정성 및 전망에서 많은 기대를 할 수 있습니다. 


2. Javascript 어플리케이션에서 사용되는 다양한 기능들을 안정적인 플러그인으로 제공한다.

jshint, minify, uglify, less 등 Javascript 어플리케이션에서 주로 사용되는 대부분 기능을 플러그인으로 제공하고 있습니다. 또한, Ant보다 안정적입니다. 플러그인의 안정성과 관련하여 Xinics에서 Ant를 사용하는 동안은 몇 가지 문제점이 있었습니다. Ant 스크립트에서 Javascript minify를 위해 사용하는 Yui Compressor 최신 버전( 2.4.8 )은 Window 환경에서 PATH 문제로 인해 기본 동작을 하지 않는 이슈가 있었습니다.또한 Ant 스크립트에서 jshint를 지원하는 라이브러리 ant-jshint 는 더이상 진행되고 있지 않습니다(!)


3. 작성 및 유지보수가 쉬운 빌드 스크립트를 제공한다.

간단하고 직관적인 설정 및 빌드 스크립트를 제공합니다. 또한, Javascript 언어 기반으로 되어 있기에 만약 플러그인이 지원하지 않는 기능에 대해서는 직접 소스코드를 통해서 구현할 수 있다는 유연성도 가지고 있습니다. Ant 등의 다른 빌드 툴에 비해 어느 정도 간결한지는 아래 나타나 있습니다.


출처 : Whe We Use Node.js and Grunt to Build Javascript

4. 커뮤니티가 크고 활발하다.

Grunt 외에도 Node.js 기반으로 빌드하는 방식은 Gulp를 사용하는 방식과 npm 스크립트를 사용하는 방식이 있습니다. 앞서 거론한 장점들은 이 방식들도 가지고 있습니다. 그래서 Grunt, Gulp, npm 스크립트 중 어떤 것이 좋은지에 대해 다양한 의견이 있습니다. 자세한 내용은 아래 포스트들에서 살펴보실 수 있습니다.

The Battle of Build Scripts: Gulp vs Grunt
Why We should stop using Grunt & Gulp

그러나 Grunt가 확실히 장점을 가지는 부분은 가장 커뮤니티가 넓고 활발하다는 점입니다. 다양한 플러그인들이 개발되었고 많은 사용자층이 있으며 유지보수 및 업데이트가 잘 진행되고 있습니다. 또한, jQuery, Wordpress, Twitter 등 유명 라이브러리 및 플랫폼에서 빌드를 위해 Grunt를 사용한다는 것 또한 신뢰를 주는 부분입니다.

P.S 한국어 페이스북 커뮤니티도 있습니다! https://www.facebook.com/groups/gruntjs.kr/


'Tech > JavaScript' 카테고리의 다른 글

[Mocha Unit Test]  (0) 2017.11.10
Posted by 알 수 없는 사용자
Xinics 이야기2015. 4. 17. 15:13
최근 자이닉스에서 개발부 신입사원 모집을 했습니다.
자이닉스는 작은 회사이기도 하고 개인을 대상으로 하는 비즈니스를 하지 않아서 아직은 자이닉스라는 회사에 대해서 모르시는 분들이 많다고 생각됩니다. 그래서 그런지 이력서가 산더미처럼 접수되지는 않았지만 덕분에 이력서 하나하나를 꼼꼼히 읽어 볼 수 있는 기회가 생겼습니다.

짧은 문서 하나만으로 그 사람을 온전히 판단하는 것은 불가능 할테지만 '이 분과 같이 일하면 좋겠다.' 라는 생각을 불러일으킬 수 있는 이력서를 기대하고 읽었습니다. 하지만 이력서를 읽으면서 전체적으로 느낀 감상은 '아쉽다' 였습니다.

제가 이번에 이력서를 검토하면서 느낀것을 간단히 풀어보자면

1. 오타는 없애자


오타와 맞춤법 때문에 도저히 읽기 힘든 이력서는 없었지만 그래도 읽다가 눈에 확 띄는 오타가 나오면 신경쓰이는 것은 사실입니다. 자신을 표현하는 이력서에 대한 기본적인 성의라는 측면에서 오타는 없었으면 좋겠습니다.


2. 스토리가 포함된 자기 소개서


'열정적, 성실함, 집중력, 사교성, 책임감, 인내심'
이력서를 보내주신 많은 분들이 비슷한 단어를 통해서 자신을 표현합니다.
분명히 회사에서 같이 일하기에 저런 성격을 가진 사람이 더 선호되겠지요. 

하지만 비슷비슷한 단어들 중에서도 저런 성격을 표현할 때 자신이 경험했던 일을 통해 이야기 하듯이 풀어내는 소개서가 인상에 많이 남았습니다. 이력서를 보는 사람에게 내가 이런 사람이라는 것을 알리는 방식으로써 스토리텔링이 도움이 되지 않을까 생각합니다.


3. 무엇을 하고 싶습니까? 이 회사는 자신이 하고 싶은 일을 할 수 있는 회사입니까?


이 회사에 이력서를 내기 전에 자신이 하고 싶은 일을 지원한 회사에서 할 수 있는지, 혹은 자신이 꿈꾸는 것을 이 회사에서 이룰 수 있는지에 대한 고민을 했으면 좋겠습니다.

이력서를 낸 지원자를 채용하는 것은 회사지만, 자신이 앞으로 다닐 회사를 선택하는 것은 스스로의 몫이라고 생각합니다. 그런 선택을 위해서는 지원하기 전에 회사에 대해서 조금이라도 시간을 내서 알아보는 것이 좋지 않을까요? 

물론 회사에서도 자신의 목표가 뚜렷하고 그 목표가 회사의 비전과 비슷한 사람에게 더욱 매력을 느낄테지요.


4. 교육이 100% 실력을 보장하지는 않습니다.


IT 회사에서 개발자 신입사원을 모집하다보니, 입사 지원 전에 교육 기관에서 IT 교육을 받으신 분들이 많았습니다.
하지만 교육 기관에서 습득한 지식이 100% 지원한 회사에 연결된다는 보장은 없습니다. 심지어 지금 회사에서 다루고 있는 분야와 전혀 무관한 분야의 교육을 받으신 분들도 계셨습니다.

신입사원들이 교육 과정에서 배웠길 기대하는 것은 실무에 바로 투여하기 위한 기술이 아니라, 회사에 맞는 새로운 지식을 쌓아나갈 때에 필요한 기초입니다.

예를 들면 교육 과정에서 프로젝트를 진행할 때 팀 단위로 업무를 했을 때 겪었던 문제점과 그 문제점을 해결하기 위한 노력, 프로젝트 내에서 만들어낸 코드의 품질을 높이기 위해서 고민했던 시간같은 것들이 있겠네요.




회사에서는 뭐든 다 할 수 있는 슈퍼맨 같은 신입 개발자를 기대하지는 않습니다.
함께 일하게 되었을 때 커뮤니케이션에 장벽이 없고 회사 업무를 통해 성장할 수 있는 가능성을 가진 사람을 기대합니다. 그리고 무엇보다도 개인의 꿈을 회사에서 같이 키워나갈 수 있는 사람과 함께 일하고 싶습니다.


Posted by 알 수 없는 사용자
Tech/Android 개발2015. 4. 13. 10:31

알려진 안드로이드 HLS 스트리밍 이슈들

안드로이드에서 HTML video 태그를 이용하여 HLS를 서비스할 경우 정상적인 시청 환경을 제공할 수 없을 정도로 이슈가 많다는 것은 널리 알려진 사실입니다. 아래는 대표적인 HTML5 동영상 플레이어 중 하나인 JWPlayer에서 정리한 이슈 입니다.


Android 2.3 (Gingerbread)
  · 지원 안함
Android 3.0 (Honeycomb)
  · HLS 스트림이 장치와 충돌을 일으킨다.
Android 4.0 (ICS)
  · VOD에서 seek 불가능
  · 영상 가로세로 비율이 감지되지 않아 이미지 변형을 일으킨다.
  · 전체화면 진입시 영상이 처음부터 다시 시작된다.
Android 4.1+ (Jelly Bean)
  · 영상 가로세로 비율 이슈는 수정되었지만 여전히 seek이 불가능하다.
  · 크롬에서 HLS를 인식하지 못해 mimetype 을 감지하지 못한다.
  · 전체화면 진입 시 오류가 발생하고 장치가 멈춘다.


Seek 불가, 화면 비율 깨짐, 전체화면 진입시 오류 발생 등 굵직한 이슈들이 많이 보입니다. 


2015년 4월, 국내 주요 기기들에서의 안드로이드 HLS 이슈

위 JWPlayer 포스트는 약 2년전인 2013년 2월 27에 작성되었습니다. 모바일 세상에서의 변화의 속도를 감안하면 결코 짧지 않은 약 2년여의 시간이 지난 지금은 이슈들이 많이 없어졌을까요? 자이닉스에서 현재 사용되고 있는 국내 주요 기기들에서도 이슈들이 발생하는지 테스트를 진행해 보았습니다. 

테스트 환경

1) 서버 환경
 Wowza 3.6.2

2) 테스트 기기 목록

 번호

기기명 

 운영체제

제조사

발매일 

 Galaxy S3

 4.1 (Jelly Bean)

 삼성 

 2012.09

 Galaxy Note2

 4.4 (KitKat) 

 삼성

 2012.09

 Galaxy Note3

 4.4 (KitKat)

 삼성

 2013.09

 Galaxy S5

 5.0 (Lollipop) 

 삼성

 2014.03

 VEGA Racer

 4.1 (Jelly Bean) 

 팬텍

 2011.06

 VEGA IRON2

 4.4 (KitKat)

 팬텍

 2014.05

 Optimus LTE2

 4.1 (Jelly Bean) 

 LG

 2012.05

 LG G Pro2

 4.4 (KitKat)

 LG

 2014.02

 Nexus5

 5.1 (Lollipop)

 LG

 2013.10

* 위 테스트 기기들에 대해 기본 브라우저 및 Chrome 에서 진행
* 단 Nexus5는 Chrome이 기본 브라우저여서 Chrome만 진행함.
* Chrome 버전은 41로 테스트를 진행

테스트 결과

이슈 내용 

 발생한 환경

 영상이 가로세로 비율이 무시되고 화면에 꽉찬다.

 ① Galaxy S3-기본 브라우저
 
② Galaxy Note2-기본 브라우저

 전체화면[각주:1] 진입 시 영상의 끝으로 간다.

 ① Galaxy S3-기본 브라우저

 현재 시간이 계속 0초로 남아있다.

 ① Galaxy S3-Chrome
 
⑤ VEGA Racer-Chrome

 Seek이 불가능하다.

 ① Galaxy S3-Chrome
 ② Galaxy Note2-Chrome
 
⑤ VEGA Racer-Chrome

 영상 전체 길이가 짧아진다. ( 예: 59분 59초 영상 -> 56분 45초 )

 ② Galaxy Note2-기본 브라우저
 
③ Galaxy Note3-기본 브라우저, Chrome
 
⑤ VEGA Racer-Chrome
 
⑥ VEGA IRON2-기본,브라우저, Chrome

비교적 최신 기기들과 OS에서는 이슈가 없는 경향을 보이지만 테스트 표본이 작고 명시적으로 보장한다는 명세가 없어 확신은 할 수가 없습니다. 또한 나온지는 조금 지났어도 아직 제법 높은 점유율을 가지고 있는 Galaxy S3나 Note2등의 기기에서는 확실히 정상적인 시청이 불가능할 정도의 많은 이슈가 있습니다. 따라서 아직까지는 안드로이드 HTML5에서 HLS 스트리밍을 제공하기에는 많은 어려움이 따른다는 결론을 낼 수 있을 것 같습니다.


안드로이드 네이티브 App으로 HLS 스트리밍을 할 때의 이슈

안드로이드 HTML HLS 스트리밍의 대안으로써 네이티브 앱을 제작하는 방법이 종종 제안되고는 합니다. 간단히 시청만 가능한 프로토타입 앱[각주:2]을 제작하여 위와 같은 테스트 환경에서 확인해 보았습니다. 다수의 기기에서 어느정도 시청은 가능한 수준이라고 볼 수 있으나, 아래와 같은 공통적인 이슈가 발생하였습니다. 또한 아래 이슈들은 내장 플레이어에서도 동일하게 발생함을 확인하였습니다.

이슈내용
 * 영상 전체 길이가 짧게 나타난다. (59분 59초 영상 -> 56분 45초)
 * Seek시 Seek한 시간보다 뒤로 이동한다. ( 25:00 Seek -> 26:30으로 이동 )
 * 작게 측정된 전체 시간 이후의 시간을 재생하고 있는 동안은 Seek이 안 되는 현상 발생

발생 기기
 
① GalaxyS3② Galaxy Note2, ③ Galaxy Note3, ⑤ VEGA Racer


  1. 전체화면은 video 엘리먼트의 webkitEnterfullscreen 메소드를 의미합니다. [본문으로]
  2. 안드로이드 SDK의 VideoView를 사용 [본문으로]
Posted by 알 수 없는 사용자



Ash Maruya 지음

오늘날 기업들은 상상할 수 있는 그 어떤 것이든 만들 수 있다. 그러므로 우리가 대답해야 할 질문은 "이것을 만들 수 있을까?"가 아니라 "이것을 만들 필요가 있을까?"다. 그 어느 때보다 이런 실험이 필요하다.

팀에서 새로운 비즈니스를 찾아나가는 과정에서 아는 것이 없는 현재 상황을 돌파하고자 참고한 책이다.
책에서 말하는 A 부터 Z까지 곧바로 적용할 수는 없을 테지만 조금씩이라도 현재 프로세스에 잘 녹여서 의미를 부여할 계획이다 :)

그런 측면에서 Lean Canvas 도구는 초기 아이디어를 정리하는데 꽤 쓸만하다고 생각한다.
우선 생각한대로 시도하고, 실험을 통해 학습하여 개선해보자!


아래는 책에서 인상깊게 읽은 구절들

--

린 경영의 중요한 세 가지
1. 고객 개발 - 사무실 밖으로 나가라
2. 린 스타트업 - 낭비를 없애거나 자원을 효율적으로 사용한다.
3. 부트스트래핑 - 매출을 통한 자금 충당

p37.
고객은 여러분의 솔루션에는 관심이 없다. 자신의 문제에만 관심이 있다. - 데이브 맥클루어, 500 스타트업스

p38.
대부분의 스타트업에서 가장 큰 위험은 아무도 원하지 않는 것을 만드는 것이다.

p39.
어떤 문제가 해결할 가치가 있는지 판단하려면 다음 세가지 질문에 답을 해본다.
  • 고객이 원하는 것인가? (필수성)
  • 고객이 돈을 내고 구입할 것인가? 그렇지 않다면 누가 구입할 것인가? (실용성)
  • 문제를 해결할 수 있을 것인가? (실현 가능성)
p72.
MVP는 미완성 제품이나 결함이 많은 제품과 동의어가 아니라는 사실을 기억하자. MVP는 고객이 '가장 중요'하다고 생각하는 문제뿐만 아니라 해결할 가치가 있는 문제를 해결할 수 있어야 한다. 즉, 가격에 합당한 가치를 제공하게 MVP를 설계해야 한다.

p83.
우리는 스타트업이 매우 불확실하다는 것을 알지만 불확실성과 위험은 다르다. 위험하지 않은 것들도 불확실할 수 있다.
  • 불확실성: 완전히 확실하지 않은 것, 즉 두 가지 이상의 가능성이 존재하는 상태
  • 위험: 손실, 재난 또는 다른 바람직하지 못한 결과가 생길 수 있는 불확실한 상태
p90.
조언자 의견을 '심사 결과'나 '입증된 내용'으로 받아들이지 말고 위험을 식별하고 우선순위를 정하는 수단으로 받아들여야 한다. 사업 모델을 장악하는 것은 여전히 여러분의 몫이다.

p91.
전형적인 부서는 잊어버려라
문제팀: 문제 팀은 고객 인터뷰, 사용성 테스트 시행 등 '외부' 활동을 '주로' 담당한다.
솔루션팀: 솔루션 팀은 소스 코드 개발, 테스트 시행, 제품 설치 등 '내부' 활동을 '주로' 담당한다.

p93~95.
효과적으로 실험하기
  • 속도, 학습, 초점을 극대화하라
  • 한 가지 핵심 지표나 목표를 파악하라
  • 가능한 최소한의 일을 통해 학습하라
p107.
학습을 위한 가장 빠른 방법은 소스 코드를 발표하는 것도, 분석 결과를 모으는 것도 아닌 고객과 이야기 하는 것이다.

p119.
문제 인터뷰는 '문제-고객군'에 대한 여러분의 가설을 검증하는 일이다. 문제 인터뷰에서 여러분은 다음 위험을 구체적으로 다루어야 한다.
  • 제품 위험: 무슨 문제를 해결하려고 하는가? (문제)
    • 고객에게 가장 중요한 문제 세 가지는 무엇인가?
  • 시장 위험: 경쟁 제품은 무엇인가? (기존 대안)
    • 고객은 현재 이 문제를 어떻게 해결하는가?
  • 고객 위험: 불편을 겪는 사람은 누구인가? (고객군)
    • 사업성 있는 고객군인가?
p135.
솔루션 인터뷰 - 실제 제품을 만들기 전에 '데모'를 이용해 솔루션을 테스트하라.
  • 고객 위험: 불편을 겪는 사람들은 누구인가? (얼리아답터)
    • 얼리아답터를 판단하는 기준은 무엇인가?
  • 제품 위험: 이 문제들을 어떻게 해결하려고 하는가? (솔루션)
    • 제품 출시에 필요한 최소 기능들은 무엇인가?
  • 시장 위험: 가격 모델은 무엇인가? (수익원)
    • 고객들이 솔루션을 유료로 구입할 것인가?
    • 고객들이 감당할만한 가격대는?
p156.
최우선적으로 할 일은 가능한 한 최소 제품을 구축할 수 있게 MVP의 범위를 핵심 기능으로 축소하는 것이다.

p167.

실행에 옮길 수 있는 지표란 관찰된 결과에 구체적이고 반복 가능한 행동을 연관시킬 수 있는 지표다.



Posted by 알 수 없는 사용자
Tech/닷넷 일반2014. 6. 7. 19:58

Visual Studio에서 제공하는 테스트 도구에 NUNIT을 결합해서 사용할 수 있다면 정말 유용할 것입니다. 이번 웹 캐스트는 Visual Studio에서 제공하는 테스트 도구와 NUNIT 간의 연동을 도와주는 NUNIT Test Adapter의 사용 방법과 함께, Windows Forms 기반 응용프로그램에서 Visual Studio와 NUNIT Test Adapter를 결합하여 테스트를 진행할 수 있는 방법을 소개합니다.

아래 이미지를 클릭하시면 웹 캐스트가 시작됩니다.


링크 바로 가기: http://cms.rkttu.com/em/5392cf5a56846

This web cast powered by XINICS SilverStream & Commons

Posted by 알 수 없는 사용자
Xinics 이야기2013. 12. 4. 13:00

 

㈜ 자이닉스 윈도우, 모바일, 웹 어플리케이션 
경력직 개발자 모집 채용 공고

 
자이닉스는 리치미디어 기반의 소프트웨어 개발 전문 기업으로 이러닝/프레젠테이션 콘텐츠 저작도구 및 지식 공유 플랫폼 솔루션을 개발하여, 국내 유수의 대학/기업 및 일본 시장에서 비즈니스를 전개하고 있습니다.

자이닉스는 데스크톱 기반의 어플리케이션 개발 기술, DirectX 및 Windows Media 기반의 미디어 변환 및 저작 기술, 웹 어플리케이션 개발 기술 등을 보유하고 있으며, 최근 모바일 어플리케이션 부문의 개발까지 확대하여 다양한 콘텐츠 저작 도구 및 공유 솔루션을 개발/공급하고 있습니다.


자이닉스는 윈도우, 모바일, 웹 어플리케이션 경력직 개발자 인력을 다음과 같이 채용 하고자 합니다.

관련 분야의 전문성을 가지고 새로운 영역을 개척하려는 자기 개발 의지와 도전 의지를 가지고 계신 분들의 많은 지원을 바랍니다.

Exciting

즐겁게, 신나게, 그렇지만 치열하게 일합니다.

평범하고 좋은 사람이 되기 보다, 특별한 가치를 지향하는, 세상의 변화를 꿈꾸는 회사이고자 합니다.

고객의 꿈을 실현할 수 있도록, 우리가 먼저 꿈꾸고 우리가 먼저 실천하고자 합니다.

그것이 바로 자이닉스가 말하는 Exciting입니다. 


096_110228.jpg


  1.png

Technology

이미 주어진 것을 개발하여
결과만 내는 개발자를 원하지 않습니다.

무엇을, 왜 만드는 것인지,
어떻게 만드는 것이 최선인지 고민하고,
더디더라도 사용성과 품질을 생각하여 
진정한 가치있는 상품을 만들 수 있는 개발을 지향합니다.

 다양한 웹, 윈도우 어플리케이션 기반의 디지털 커뮤니케이션 솔루션에 대한 경험을 토대로,
모바일 영역까지 확장하여,
이제는 글로벌 시장에서 겨루고자 합니다.

Companions

자이닉스 일원들이 서로 하나의
생활 공동체를 이루는 동반자입니다.

또한 우리는 고객에게 기술을 통해 가치를 전달하고, 
함께 성장해 가는 기술 동반자입니다.

같이 하기 때문에 더 큰 꿈을 이룰 수 있는
진정한 동반자가 되는 것,

그것이 자이닉스가 꿈꾸는 비전입니다.



 3.png

 


▼ 자이닉스 소개 슬라이드  (클릭해서 슬라이드를 넘겨보세요)



▼ 자이닉스 근무환경이 궁금하시다고요?


 

모집 인원
o      윈도우 및 모바일 어플리케이션 개발 부문 1~2명
o      웹 어플리케이션 개발 부문 1~2명

모집 분야

o      모바일 환경에서의 프레젠테이션 및 콘텐츠 제작 어플리케이션 개발
o      웹 기반 콘텐츠 관리 시스템(CMS) 및 서비스 플랫폼 개발


담당 업무

= 콘텐츠 제작 플랫폼(Contents Creation Platform)
           콘텐츠 제작 플랫폼은 사용자의 상황 및 의도에 가장 적합한 콘텐츠 생산 도구의 제공을 목표로 합니다.
       • 어플리케이션 개발 부문
                [Windows 및 Mobile 어플리케이션 개발 부문]
                     # 업무 영역: 윈도우 및 모바일 콘텐츠 제작용 어플리케이션 개발
                     # 전문 영역:
                               - iOS/Android 등 주류 모바일 플랫폼에 대한 어플리케이션 개발
                                        -    Objective-C, Java
                               - HTML5 기술을 이용한 어플리케이션 융합
                               - 윈도우 어플리케이션 개발
                                        -    Visual C++, C#, .NET Framework, WPF


= 콘텐츠 관리 및 서비스 플랫폼
       • 웹 CMS/서비스 플랫폼 개발 부문
                     # 업무 영역: 웹 기반 콘텐츠 관리 시스템(CMS) 및 서비스 플랫폼 개발
                     # 전문 영역:
                               - 웹 기반의 콘텐츠 관리 및 서비스 플랫폼 개발
                                        -    PHP, JavaScript, CSS, Ajax, jQuery, HTML5, XML
                               - Open CMS를 활용한 서비스 플랫폼 개발
                                        -    WordPress
                               - 클라우드 환경을 기반으로 한 웹 서비스 개발

지원 자격 조건

o      전문대 졸 이상 
o      모집 분야 및 담당 업무 관련 경력 2~3년 (*)

심사 시 주안점 및 우대 조건

o      관련 업무에 대해 적극적인 참여를 통한 개발 경험이 있으신 분
o      활발한 커뮤니케이션에 익숙하고 팀 단위 활동에 적극적이신 분
o      영어, 일본어 등 외국어 능통자 우대
 
근무 조건 및 복리후생

o      연봉 - 사내 규정에 따름, 퇴직금 별도
o      주 5일 (월~금) 근무, 연차 12일
o      4대 보험 (국민연금, 고용보험, 산재보험, 건강보험), 퇴직금
o      각종 경조금, 경조 휴가
o      우수 사원 포상
o      도서구입비 지원
o      역량 강화를 위한 교육, 세미나, 전시회 등 적극 지원

전형 절차
 
o      1차: 서류 전형 (1차에 합격하신 분에 한해서 개별 통보)
o      2차: 기술 면접
o      3차: 인성 면접
o      4차: 최종 면접

제출 서류

o      이력서 (연락처/사진 포함) 및 자기소개서 
        ※  이력서는 제공해 드리는 양식을 참고해 주시고, 자기소개서는 자유 양식으로 작성하시기 바랍니다.
             (이력서 양식 다운로드 - http://link.rkttu.com/xinics-resume-form)
o      경력 및 참여 부문별 개발 경험 및 관심사 위주로 작성 

접수 방법

o      이메일 접수 : recruit@xinics.com 

전형 일정

o      서류 접수: 채용 완료 전 까지
o      서류 전형 결과 발표: 서류 접수 후 서류 심사 통과자에게 개별 통보
o      면접: 서류 심사 합격자 개별 연락하여 일정 확인
        ※ 지원자 규모 및 여부에 따라 변동 가능

문의 및 연락처

o      이메일 : recruit@xinics.com
o      전화: 02-2109-8801 (311)
o      담당자: 박진궁 차장
 
회사 위치 

o      서울시 구로구 구로동 197-22 에이스테크노타워 5차 610호 (주)자이닉스
o      회사로 오시는 길 (네이버 지도) - http://link.rkttu.com/xinics-map 

 

Posted by 알 수 없는 사용자
Tech/닷넷 일반2013. 10. 25. 22:00

NUnit의 GUI Runner는 여러 개의 테스트 유닛 프로젝트를 로드하여 동시에 테스트 결과를 시각적으로 확인할 수 있는 매우 유용한 유틸리티입니다. 그러나 한 가지 아쉬운 점이 있다면, Visual Studio와 완벽하게 통합되어있지는 않아서 단위 테스트 도중 변수의 상태를 확인하거나 디버깅을 하기에는 불편한 구조로 제작되어있다는 점입니다. 그래서 개인적으로 자주 애용하는 대안으로 Reflection을 사용하여 Test Fixture와 Test Case를 검색하여 자동으로 호출하는 유틸리티 클래스의 소스 코드를 https://github.com/rkttu/nunit-self-runner 에 게시하였습니다.

이 프로그램 코드는 NUnit Framework 어셈블리 외에 특별한 종속성이 없고 어떤 코드에서든 쉽게 붙여넣어 시작할 수 있습니다. 그러나 기능 상의 제약이 있는데 다음과 같은 유형의 Test Fixture나 Test Case에서는 작동하지 않습니다.

  • Test Fixture 생성 시 별도의 생성자 매개 변수가 필요한 경우
  • Test Method 실행 시 별도의 호출 매개 변수가 필요한 경우
  • private이나 protected, internal 멤버

이 소스 코드를 NUnit 클래스 라이브러리 프로젝트에 추가하고, 해당 NUnit 클래스 라이브러리를 컴파일하여 실행하면 다음과 같은 형태로 단위 테스트가 전개될 것입니다.

 

 

테스트에 실패하는 케이스, 즉 Exception이 발생하면 위와 같이 적색의 Test case failed 라는 문구가 나타나고 자세한 Stack Trace 결과가 노란색의 텍스트로 표시되어 시각적으로 구분을 쉽게 해줍니다. 그리고 실패했다는 사실을 알리기 위하여 테스트가 일시 중단되고, Enter 키를 누르면 계속 실행됩니다. 이 메시지를 확인하고 적절한 위치에 중단점을 설정하면 디버거가 해당 위치에서 중지되므로 좀 더 쉽게 문제를 진단할 수 있습니다.

 

 

반면 예외 없이 정상적으로 실행되는 테스트 케이스는 초록색의 Test case succeed 메시지를 표시하고 중단없이 계속 다음 테스트를 진행합니다. 그리고 한 Test Fixture의 실행이 완료되면 다시 사용자의 입력을 대기하는 상태로 들어가며, Enter 키를 누르면 다음 Test Fixture로 진행할 수 있으므로 인터랙티브하게 단위 테스트 결과를 확인할 수 있습니다. 

 

모든 테스트 Fixture의 실행이 끝난 이후에도 한 번 더 사용자의 입력을 기다립니다. 콘솔에 표시된 전체 내용을 리뷰하고 마지막으로 Enter 키를 누르면 프로그램이 완료됩니다.

Posted by 알 수 없는 사용자