처음에는 Keeper를 쓰다가, 나중에 1password로 변경해서 사용했다.

그런데, 매년 45,000 원 상당을 지불하려다가 보니, 과연 내가 그정도의 보안이 필요한가라는 미묘한 현타가 오기 시작했다. 물론 중요는 하지만 그래도 45,000 원을 지불해 가면서 해야 할까 라는 생각이 들었다.

그러다가 여러가지 솔루션들을 보았는데 신박한 제품이 보였다.

Bitwarden(https://bitwarden.com/) 이라는 제품인데, 가장 매력적인게, Volt를 저장하기 위한 서버를 자기가 구성할 수 있다는 점이였다.


문제는 서버를 구축하기 위해서는 SSL 및 Docker 기반으로 구축해야하는데, Docker에 대한 이해가 부족한 상황이라..

나중에 여유가 되면 서버나 구축해서 집에다 이 저장소를 만들어 구성해봐야 겠다.

1password도 내년 3월까지는 사용할수 있으니까.. 당장은 1password로 유지해야 겠다.

2020. 4. 3. 오전 11:29

728x90

SyntaxHighlighter 3.0.83 (http://alexgorbatchev.com/SyntaxHighlighter/manual/configuration/) 의 설정 값 중, 블로그에서 사용되는 값들을 정리한다.

보통 pre 안에 class 값으로 brush:xxxxx 로 표시하는 내용들이다.

  • C# 코드용  ['c#', 'c-sharp', 'csharp'];
  • XML, HTML용  ['xml', 'xhtml', 'xslt', 'html'];
  • 파워쉘 등 ['powershell', 'ps'];
  • 일반 텍스트  ['text', 'plain'];
  • C/C++ ['cpp', 'c'];
  • Javascript ['js', 'jscript', 'javascript'];
  • SQL  ['sql'];

만약 내용이 Javascript라면 아래와 같이 HTML 소스에 넣으면 된다.

<pre class=”brush:js”> 내용 …. </pre>

2020. 4. 2. 오후 3:34

728x90

.bat 혹은 .cmd 파일을 만들 때, 간혹 특수 문자가 포함되는 암호를 입력하게 할 때 그냥 그대로 입력하면 안될 때가 있다.

그 이유를 확인해본 결과 cmd.exe 내에서 특수 문자중 “%”와 “^” 때문이다.

%의 경우 간혹 환경변수 값 조회하는 구조와 유사할 경우 적용이 안되고, ^ 인 경우에는 아예 ESC 형태의 값이라고 파싱해서 발생되는 문제다.

%만 단독으로 쓰면 상관 없지만, %???% 로 쓰면 환경 변수로 치환된다. 
^인 경우에는 바로 뒤에 오는 글자가 ESC 로 전환되어 화면 표시 방법이 달라지게 된다.

이 경우 해결방법은 다음과 같다.

% –> ^%
^ –> ^^

위와 같이 변환을 하면 된다.

그러면 원하는 특수 문자가 화면에 제대로 표시된다.

2020. 4. 2. 오후 3:24

728x90

Original : https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html

Kernel > About FreeRTOS Kernel > Coding, Testing, & Style

 

Coding Standard, Testing and Style Guide

On this page:

 

Coding Standard / MISRA Compliance

The core FreeRTOS source files (those that are common to all ports, but not the port layer) conform to the MISRA coding standard guidelines. Compliance is checked using pc-lint with the linked lint configuration files. As the standard is many pages long, and is available for purchase from MISRA for a very small fee, we have not replicated all the rules here.

Deviations from the MISRA standard are listed below:

  • Two API functions have more than one exit point. A deviation was permitted in these two cases for reasons of critical efficiency.
  • When creating tasks, the source code manipulates memory addresses to locate the start and end addresses of the stack allocated to the created task. The code has to work for all the architectures to which FreeRTOS has been ported – which includes architectures with 8, 16, 20, 24 and 32-bit buses. This inevitably requires some pointer arithmetic. When pointer arithmetic is used, the arithmetic result is programatically checked for correctness.
  • The trace macros are, by default, empty, so do not generate any code. Therefore, MISRA compliance checking is performed with dummy macro definitions.
  • MISRA rules are turned off on a line by line basis, as deemed appropriate (that is, complying with the rule is deemed to create less appropriate code for a deaply embedded system than carefully not complying). Each such occurrence is accompanied by a justification using the special pc-lint MISRA comment mark-up syntax.

FreeRTOS builds with many different compilers, some of which are more advanced than others. For that reason FreeRTOS does not use any of the features or syntax that have been introduced to the C language by or since the C99 standard. The one exception to this is the use of the

stdint.h

header file. The

FreeRTOS/Source/include

directory contains a file called

stdint.readme

that can be renamed

stdint.h

to provide the minimum stdint type definitions necessary to build FreeRTOS – should your compiler not provide its own.

 

Testing

This section describes the tests performed on common code (the code located in the FreeRTOS/Source directory, that is built by all FreeRTOS kernel ports), and the tests performed on the portable layer code (the code located in subdirectories of the

FreeRTOS/Source/portable

directory).

  • Common code

    The standard demo/test files attempt to provide ‘branch’ test coverage (in most cases this actually achieves ‘condition’ coverage because the kernel’s coding style deliberately keeps conditions simple specifically for this purpose), whereby tests ensure both ‘true’ and ‘false’ paths through each decision are exercised. ‘branch’ coverage is measured using GCOV by defining the mtCOVERAGE_TEST_MARKER() macro to a NOP (no operation) instruction in the ‘else’ path of each ‘if()’ condition if the ‘else’ path would otherwise be empty. mtCOVERAGE_TEST_MARKER() is only defined while measuring test coverage – normally it is an empty macro that does not generate any code.

  • Port layer

    Port layer code is tested using ‘reg test’ tasks, and, for ports that support interrupt nesting, the ‘interrupt queue’ tasks.

    The ‘reg test’ tasks create multiple (normally two) tasks that first fill all the CPU registers with known values, then continuously check that every register maintains its expected known value as the other tests execute continuously (soak test). Each reg test task uses unique values.

    The ‘interrupt queue’ tasks perform tests on interrupts of different priorities that nest at least three deep. Macros are used to insert artificial delays into pertinent points within the code to ensure the desired test coverage is achieved.

 

It is worth noting that the thoroughness of these tests have been responsible for finding bugs in silicon on multiple occasions.

 

Naming Conventions

The RTOS kernel and demo application source code use the following conventions:

  • Variables
    • Variables of type uint32_t are prefixed ul, where the ‘u’ denotes ‘unsigned’ and the ‘l’ denotes ‘long’.
    • Variables of type uint16_t are prefixed us, where the ‘u’ denotes ‘unsigned’ and the ‘s’ denotes ‘short’.
    • Variables of type uint8_t are prefixed uc, where the ‘u’ denotes ‘unsigned’ and the ‘c’ denotes ‘char’.
    • Variables of non stdint types are prefixed x. Examples include BaseType_t and TickType_t, which are portable layer defined typedefs for the natural or most efficient type for the architecture and the type used to hold the RTOS tick count respectively.
    • Unsigned variables of non stdint types have an additional prefix u. For example variables of type UBaseType_t (unsigned BaseType_t) are prefixed ux.
    • Variables of type size_t are also prefixed x.>
    • Enumerated variables are prefixed e
    • Pointers have an additional prefixed p, for example a pointer to a uint16_t will have prefix pus.
    • In line with MISRA guides, unqualified standard char types are only permitted to hold ASCII characters and are prefixed c.
    • In line with MISRA guides, variables of type char * are only permitted to hold pointers to ASCII strings and are prefixed pc.
  • Functions
    • File scope static (private) functions are prefixed with prv.
    • API functions are prefixed with their return type, as per the convention defined for variables, with the addition of the prefix v for void.
    • API function names start with the name of the file in which they are defined. For example vTaskDelete is defined in tasks.c, and has a void return type.
  • Macros
    • Macros are pre-fixed with the file in which they are defined. The pre-fix is lower case. For example, configUSE_PREEMPTION is defined in FreeRTOSConfig.h.
    • Other than the pre-fix, macros are written in all upper case, and use an underscore to separate words.

 

Data Types

Only stdint.h types and the RTOS’s own typedefs are used, with the following exceptions:

  • char

    In line with MISRA guides, unqualified char types are permitted, but only when they are used to hold ASCII characters.

  • char *

    In line with MISRA guides, unqualified character pointers are permitted, but only when they are used to point to ASCII strings. This removes the need to suppress benign compiler warnings when standard library functions that expect char * parameters are used, especially considering some compilers default unqualified char types to be signed while other compilers default unqualified char types to be unsigned.

There are four types that are defined for each port. These are:

  • TickType_t

    If configUSE_16_BIT_TICKS is set to non-zero (true), then TickType_t is defined to be an unsigned 16-bit type. If configUSE_16_BIT_TICKS is set to zero (false), then TickType_t is defined to be an unsigned 32-bit type. See the customisation section of the API documentation for full information.

    32-bit architectures should always set configUSE_16_BIT_TICKS to 0.

     

  • BaseType_t

    This is defined to be the most efficient, natural, type for the architecture. For example, on a 32-bit architecture BaseType_t will be defined to be a 32-bit type. On a 16-bit architecture BaseType_t will be defined to be a 16-bit type. If BaseType_t is define to char then particular care must be taken to ensure signed chars are used for function return values that can be negative to indicate an error.

  • UBaseType_t

    This is an unsigned BaseType_t.

  • StackType_t

    Defined to the type used by the architecture for items stored on the stack. Normally this would be a 16-bit type on 16-bit architectures and a 32-bit type on 32-bit architectures, although there are some exceptions. Used internally be FreeRTOS.

  •  

 

Style Guide

  • Indentation

    Tab characters are used to indent. One tab equals four spaces.

  • Comments

    Comments never pass column 80, unless they follow, and describe, a parameter.

    C++ style double slash (//) comments are not used.

     

  • Layout

    The FreeRTOS source code lay out is designed to be as easy to view and read as possible. The code snippets below show first the file layout, then the C code formatting.

    /* Library includes come first… */
    #include <stdlib.h>
    /* …followed by FreeRTOS includes… */
    #include “FreeRTOS.h”
    /* …followed by other includes. */
    #include “HardwareSpecifics.h”
    /* #defines comes next, bracketed where possible. */
    #define A_DEFINITION	( 1 )
    
    /*
     * Static (file private) function prototypes appear next, with comments
     * in this style – with each line starting with a ‘*’.
     */
    static void prvAFunction( uint32_t ulParameter );
    
    /* File scope variables are the last thing before the function definitions.
    Comments for variables are in this style (without each line starting with
    a ‘*’). */
    static BaseType_t xMyVariable.
    
    /* The following separate is used after the closing bracket of each function,
    with a blank line following before the start of the next function definition. */
    
    /*———————————————————–*/
    
    void vAFunction( void )
    {
        /* Function definition goes here – note the separator after the closing
        curly bracket. */
    }
    /*———————————————————–*/
    
    static UBaseType_t prvNextFunction( void )
    {
        /* Function definition goes here. */
    }
    /*———————————————————–*/
    
    File Layout



    /* Function names are always written on a single line, including the return
    type.  As always, there is no space before the opening parenthesis.  There
    is a space after an opening parenthesis.  There is a space before a closing
    parenthesis.  There is a space after each comma.  Parameters are given
    verbose, descriptive names (unlike this example!).  The opening and closing
    curly brackets appear on their own lines, lined up underneath each other. */
    void vAnExampleFunction( long lParameter1, unsigned short usParameter2 )
    {
    /* Variable declarations are not indented. */
    uint8_t ucByte;
    
        /* Code is indented.  Curly brackets are always on their own lines
        and lined up underneath each other. */
        for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ )
        {
            /* Indent again. */
        }
    }
    
    /* For, while, do and if constructs follow a similar pattern.  There is no
    space before the opening parenthesis.  There is a space after an opening
    parenthesis.  There is a space before a closing parenthesis.  There is a
    space after each semicolon (if there are any).  There are spaces before and
    after each operator.  No reliance is placed on operator precedence –
    parenthesis are always used to make precedence explicit.  Magic numbers,
    other than zero, are always replaced with a constant or #defined constant.
    The opening and closing curly brackets appear on their own lines. */
    for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ )
    {
    }
    
    while( ucByte < fileBUFFER_LENGTH )
    {
    }
    
    /*  There must be no reliance on operator precedence – every condition in a
    multi-condition decision must uniquely be bracketed, as must all
    sub-expressions. */
    if( ( ucByte < fileBUFFER_LENGTH ) && ( ucByte != 0U ) )
    {
        /* Example of no reliance on operator precedence! */
        ulResult = ( ( ulValue1 + ulValue2 ) – ulValue3 ) * ulValue4;
    }
    
    /* Conditional compilations are laid out and indented as per any
    other code. */
    #if( configUSE_TRACE_FACILITY == 1 )
    {
        /* Add a counter into the TCB for tracing only. */
        pxNewTCB->uxTCBNumber = uxTaskNumber;
    }
    #endif
    
    A space is placed after an opening square bracket, and before a closing
    square bracket. 
    ucBuffer[ 0 ] = 0U;
    ucBuffer[ fileBUFFER_LENGTH – 1U ] = 0U;
    
    Formatting of C Constructs
  •  

2020. 3. 24. 오후 1:29

728x90

Original : https://www.freertos.org/RTOS.html

Kernel > About FreeRTOS Kernel


The FreeRTOS™ Kernel

마켓 리딩, 사실상 표준, 크로스 플랫폼 RTOS 커널

15년 넘게 세계 대표 칩 회사 간의 파트너쉽 속에서 개발된 FreeRTOS 는 마이크로 컨트롤로 및 작은 마이크로프로세서용 마켓 리딩하는 리얼타임 OS(RTOS)이다. MIT 오픈 소스 라이선스 하에서 자유롭게 배포된 FreeRTOS는 커널을 포함해 전방위적인 산업에 걸처 다양한 라이브러리가 만들어지고 확대 적용되고 있다.  하루 평균 500회 다운로드 되고 있는 FreeRTOS는 안정성, 접근성 및 사용 편의성을 기준으로 구성되었습니다. 

알고 있나요?

  • FreeRTOS 는 하루 평균 500회의 다운로드를 기록하고 있음 (2018년 기준).
  • FreeRTOS 는 2011동안모든 EETimes Embeded Market Suvey 내 교육 클래스 중 최고의 자리에 올랐읍니다.
  • FreeRTOS 는 타 상업용 RTOS에 비해 낮은 프로젝트 위험도 및 소유에 대한 전체 비용을 낮추는데 도움을 드립니다.그 이유는 다음과 같습니다.:
    • 전체적인 지원 및 문서화가 되어 있습니다.
    • 대부분은 우리와의 연락없이도 시장에 제품을 출시해도 됩니다. 다만, 완벽한 마음의 평화가 필요하시다면, 언제든지 완전 면책형 상업라이선스(직접적 지원을 포함)으로 전환할 수 있는 변경도 가능합니다.
  • 일부 FreeRTOS ports never completely disable interrupts.
  • For strict quality control purposes, and to remove all IP ownership ambiguity, official FreeRTOS code is separated from community contributions.
  • FreeRTOS has a tick-less mode to directly support low power applications.
  • FreeRTOS is designed to be simple and easy to use: Only 3 source files that are common to all RTOS ports, and one microcontroller specific source file are required, and its API is designed to be simple and intuitive.
  • The RL78 port can create 13 tasks, 2 queues and 4 software timers in under 4K bytes of RAM!

  • Why choose FreeRTOS?

    “It’s probably safe to say at this point that FreeRTOS goes through more ‘peer-review’ than any other RTOS available on the planet. I have used it in several projects – one of which was a multiprocessor environment that used more than 64 processors and needed to run for months reliably. The RTOS core performed well. Take FreeRTOS for a spin.” – John Westmoreland


    FreeRTOS provides the best of all worlds: FreeRTOS is truly free and supported, even when used in commercial applications. The FreeRTOS open source MIT license does not require you to expose your proprietary IP. You can take a product to market using FreeRTOS without even talking to us, let alone paying any fees, and thousands of people do just that. If, at any time, you would like to receive additional backup, or if your legal team require additional written guarantees or indemnification, then there is a simple low cost commercial upgrade path. Your peace of mind comes with the knowledge that you can opt to take the commercial route at any time you choose.

    Here are some reasons why FreeRTOS is a good choice for your next application – FreeRTOS…

    • Provides a single and independent solution for many different architectures and development tools.
    • Is known to be reliable. Confidence is assured by the activities undertaken by the SafeRTOS sister project.
    • Is feature rich and still undergoing continuous active development.
    • Has a minimal ROM, RAM and processing overhead. Typically an RTOS kernel binary image will be in the region of 6K to 12K bytes.
    • Is very simple – the core of the RTOS kernel is contained in only 3 C files. The majority of the many files included in the .zip file download relate only to the numerous demonstration applications.
    • Is truly free for use in commercial applications (see license conditions for details).
    • Has commercial licensing, professional support and porting services available in the form of OPENRTOS from our partner WITTENSTEIN high integrity systems.
    • Has a migration path to SafeRTOS, which includes certifications for the medical, automotive and industrial sectors.
    • Is well established with a large and ever growing user base.
    • Contains a pre-configured example for each port. No need to figure out how to setup a project – just download and compile!
    • Has an excellent, monitored, and active free support forum.
    • Has the assurance that commercial support is available should it be required.
    • Provides ample documentation.
    • Is very scalable, simple and easy to use.
    • FreeRTOS offers a smaller and easier real time processing alternative for applications where eCOS, embedded Linux (or Real Time Linux) and even uCLinux won’t fit, are not appropriate, or are not available.

    2020. 3. 24. 오후 1:22

    728x90

    log4net의 설정방법은 매우 다양하고 많다.

    이중 가장 기본적인 설정 방법을 설명한다. nuget을 이용하여 개발하는 경우가 있는데, 이는 개발자가 모두 인터넷에 잘 연결된 사용자들이나 쓰는 방법이고, Offline 환경에서는 잘 맞지 않는다. 특히나 공동 작업일 때는 package 폴더도 공유해야 하는데, 이게 사이즈가…

    여기서는 Assembly DLL 만 연결하는 방법으로 소개한다.

     

    Assembly 폴더 만들고 log4net.dll 복사하기.

    제일 먼저 하는 것은 Solution 폴더 위치에 Assembly라는 폴더를 만든다. 보통 Visual Studio를 써서 프로젝트를 만들면 Solution 폴더 하위에 Project 폴더들이 박히는데, 여러 개의 Project를 만든 후 모든 Project들이 log4net을 쓴다면, 이 방법이 제일 좋은 것 같다.

    그 안에 log4net.dll 을 복사해서 넣는다.

     

    Project 내 참조 추가.

    Project 폴더 내에 있는 참조 위에서 참조추가를 시도한다.

    참조 폴더에서 위에 넣었던 파일을 Browse로 찾아서 넣도록 한다. 만일 캐쉬로 있다고 해도 다른 위치의 파일일 수 있으니 반드시 직접 Browse 해서 찾아서 넣도록 한다. 그 이유는 여러개의 프로젝트 작업을 수행한 경우 파일 이름은 같을지 몰라도 전혀 다른 프로젝트의 DLL을 참조할 수 있다.

     

    AssemblyInfo.cs 수정

    Properties 폴더 안에 AssemblyInfo.cs 파일이 있는데 이 파일을 연다.

    그 안에 여러가지 내용이 있지만, 맨 밑에다가 다음 한 줄을 추가한다.

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]

     

    app.config 설정

    이 부분은 내용이 참 많은데, 자세한 설명없이 단순하게 추가할 내용만 정리한다.

    먼저 XML의 configuration 엘리멘트 안에 다음과 같은 섹션을 추가한다. 이전에 이미 만들어 넣었다면, section만 추가할 수도 있다. 이 항목이 들어가야 log4net 이라는 엘리멘트를 만들어 넣을 수 있다.

    <configSections>
      <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
    </configSections>

    section을 추가했다면 이제 아래 쪽에(보통은 appSettings 밑) 다음과 같은 항목을 추가한다.

    <log4net>
      <appender name="Appender" type="log4net.Appender.RollingFileAppender">
        <file value="service.log"/>      
        <rollingStyle value="Date"/>      
        <datePattern value="_yyyyMMdd'.log'"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %-5level %logger - %message%newline"/>
        </layout>
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      </appender>    
      <root>
        <level value="ALL"/>
        <appender-ref ref="Appender"/>
      </root>
    </log4net>

     

    위와 같이 설정할 때, Appender 쪽만 잘 잡아주면 되는데, 파일 저장 위치나, 로그가 쌓일 때 텍스트 형식등을 정의할 수 있다. file과  conversionPatten 이라는 엘리멘트를 수정하면 된다.

     

    log 개체 소스에 박기

    실제 로그를 쌓기 위해 소스에 박기전에 각 소스 클래스 내 로그 관련 인스턴스를 생성한다. 그렇다고 매번 클래스 만들어질 때마다 만들 수 없으므로 1회안에 활성화 될 수 있도록 static 으로 구성한다.

    모든 클래스 최 상단에 다음과 같은 코드를 담도록 한다.

    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    위와 같이 넣으면 코드안에서 다음과 같이 코드를 작성할 수 있다.

    log.Error("Service started");

     

    정리하며

    매번 코드 내에 적용하면서 다른 프로젝트 내의 코드를 복사해서 처리하는 것만 했지 별도로 정리한적이 없어서 정리해봤다.

    나중에, 설정 관련된 특이하게 응용했던 것들도 정리해보려고 한다.

    2020. 3. 11. 오전 9:41

    728x90

    프로젝트를 수행을 한다고 할 때, 내 기준으로 볼 때, 각 개발자들의 개발 속도를 측정하는 일은 매우 중요하다. 각 개발자, 아니 자신에게 일이 맡겨졌을 때, 이 일을 해결하기 위해서는 어느정도의 시간이 필요한지를 알아야 계획을 잡고 업무를 수행할 수 있기 때문이다.종료일을 잡고 그 종료일에 맞게 수행하기 위해서 이다.

    물론 S/W 관련 연구자들이나, 개발자 중심의 판단 보다, 영업적 판단, 경영적 판단을 중심으로 생각하는 경우 위와 같은 일정 수립에서는 선 설계를 통한 명확한 구분을 가져가는 것이 좋다고 판단하는 경우가 있다. 미리 설계를 하며, 각 설계의 내용을 명확히 하면 각 등급별 표준 등위에 따라 나누더라도 완벽하지는 않지만, 매우 높은 정확도를 갖는 개발 기간 산정이 가능하다고 믿고 있다.

    하지만, 여기에는 설계의 함정이라고 생각하는 부분이 있다. 사실 S/W를 설계하는 작업 자체가 난이도가 매우 높은 작업이다. 그래서 무슨 H/W 의 도면이나, 건설 도면 같이 생각하고 각 내용들을 구분지어 할 수 있다고 믿는데, 실제 S/W 개발 중에 나오는 설계는 위에 언급한 도면과 같은 상세 설계가 아니라, 무엇을 개발할지에 대한 대략적인 개발  방향을 잡는 용도라고 본다.

    만약 위에서 언급한 블루프린트 설계도 같이 작성을 하려면, 최소한 현재 업무에 대한 전체 공정에 5~60% 이상의 기여를 하고 이와 같은 공정 자체를 3번 이상 수행을 해야 설계가 나올 것 같다. (천재적이거나 광범위한 경험을 갖는 사람이면 위의 한계점이 무의미할 수 도 있겠지만;;;; )

    예를 들어 금융 관련 시스템 개발을 3년 정도하고, 엘리베이터 제어 소프트웨어 개발을 1년 정도 한 개발자가, 어느날 국가 세금 관리 시스템을 만든다고 생각해보자. 대략적인 설계는 가능하다. S/W 공학에서 이야기하는 UML이나, 패키지라고 통칭되는 각종 개발 방법론에 의거한 관련 산출물은 만들 수 있다. 그런데 그 설계안 대로 개발을 할 수 있을까? 아니 그 설계도를 보면서 개발 관련된 종료시점을 예측할 수 있을까?

    사람 머릿속에서 만들어지는 각종 아이디어를 아예 표준화하여 생각하는 것 자체를 통일시키거나(모든 사람의 머릿속 생각이 동기화되어 동일한 생각을 하게해주는?) 오롯히 혼자 개발하며 동시에 머릿속 생각이 바뀜이 전혀 없다면 가능하겠지만, 실제 현장에서는 중구난방이다. 벽돌이나 전자부품 처럼 표준이라는게 매우 불분명 하다. 그것을 맞춰보려 개발 표준안을 만들지만 어디까지나 권고 사항이고 생각하는 방식이나 표현 방식은 제각각이다.

    결국 표준화되지 않는 개개인의 머릿속에서 탄생하기 때문에, 모든 산술적 데이터는 개개인에 맞추어 나와야 하며, 그래서 개개인의 개발 속도가 매우 중요하다고 본다. 즉 이 개발속도 라는 것을 통해 단위 단위를 개개인에게 맡기고 산정하여 합산 처리하면 분명한 완료 일자가 잡히게 된다.

    완료 일정이 잡히면 분명한 단위 단위가 예측되며 이후 개발 계획이 설 수 있다.

    물론 개발 속도는 개발 외적인 부분에서 사용되지 않도록 장치를 잘 갖추어야 한다. 만약 개발 속도를 개개인을 평가하는 기준이되거나 급여, 기여도 등에 미치지 않도록 해야 한다. 팀을 구성해 팀 단위의 평가 형태로 가져갈 수 있게 하는 등의 안전장치를 확보하고 개개인의 개발 속도에 대한 평가가 필요하다.

    2020. 1. 16. 오전 12:08

    728x90

    Jenkins 에서 다양한 인증 기반을 구성할 수 있는데, 그 중 MS Windows에서 제공하는 Active Directory를 이용하는 방법이다.

    일단, Jenkins 사이트에 접속한다.

    그리고 난 뒤 왼편의 메뉴에서 "Jenkins 관리"를 선택한 뒤, "Configure Global Security"를 선택한다.


    Configure Global Security 안에서 이번에는 "Enable security"를 체크한다.

    그리고 난 뒤, Security Realm 안에서 LDAP을 선택한다.

    그리고 난 뒤 다음과 같이 입력한다.

    • Server : AD 서버의 주소를 넣는다.
    • rootDN : LDAP 쿼리 형태로 경로를 넣는다. 해당 주소를 DC=xxxx, DC=yyyy 로 넣도록 한다. 만일 Domain Name이 testdomain.com 이라면, DC=testdomain, DC=com 으로 만들면 된다. 이 경로는 ADSI 라는 도구를 사용하면 간단하게 추출 가능하다.
    • User search base : 사용자 계정들이 담긴 위치를 잡는다. 일단 rootDN을 기준으로 상대 위치를 잡는다. 만일 AD 상의 Users를 사용한다면 CN=Users 로 넣으면 된다.
    • User search filter : 계정으로 사용할 id 부분인데, 이 부분은 sAMAccountName={0} 으로 한다. LDAP 상에 해당 개체의 속성 값 중, sAMAccountName 을 사용하면 된다.
    • Manager DN : AD 쿼리를 할 때, 로그인을 해야만 접근이 가능한 경우에 넣는다. 관리자 계정에 대한 LDAP 쿼리용 주소값을 넣도록 한다. 위의 이미지를 기준으로 보면,  ????.local 도메인 안에 xxxxx\ServiceAccounts OU 안에 있는 yyyyy Admin. 이라는 계정을 사용할 때 사용한다.
    • Manager Password : 위에서 결정한 관리자 계정에 대한 암호를 넣는다.

    그리고 난 뒤, 밑에 위치한 "Test LDAP settings" 버튼을 눌러 AD 상의 계정으로 정상적으로 로그인 되는지 확인하도록 한다.

    참고로 Authorization 안에 있는 항목을 세가지로 설정할 수 있는데, 선택에 따라 다음과 같다.

    • Anyone can do anything : 모든 사용자가 뭐든지 할 수 있는 모드. 로그인이 필요 없기 때문에, 인터넷으로 연결된 곳에서는 쓸 수 없다.
    • Legacy mode : 특정 사용자별로 권한을 설정할 때 사용하는데, 권한을 다양하게 설정해야 하는 경우 이 기능을 사용한다. 만일 개발팀 내에서만 쓴다면 이 모드는 설정을 귀찮게 한다.
    • Logged-in users can do anything : 평등하게 로그인만 성공하면 무조건 모든지 쓸 수 있도록 한다.

    2019. 12. 23. 오후 2:06

    728x90

    + Recent posts

    728x90