우리에게 1ms의 의미란 (FPS vs Frame time)

Intro

이 글은 최적화 관점에서 FPS(Frame Per Second) 대신 Frame time(1ms)을 어떤 의미로 어떻게 볼 수 있는지에 대해 간단히 이야기해봅니다.

FPS? Frame time?

FPS는 다들 많이 들어보았을 것 같습니다. 말 그대로 Frame Per Second, 프레임 당 초(시간)을 의미하며 Frame rate(프레임률)이라고도 말합니다.

위키 참고: https://ko.wikipedia.org/wiki/프레임_레이트

1초 동안 보여주는 화면(프레임)의 수

예를 들면, FPS 60 == 1초당 60 프레임을 그린다고 볼 수 있겠습니다.

**Frame time(프레임 시간)**은 FPS에 비해서 생소할 수 있지만 간단히 말하면 화면(프레임)이 그려지는데 걸리는 시간입니다. (한 프레임을 그리는데 사용할 수 있는 버퍼 시간으로도 볼 수 있습니다.)

FPS와 동일하게 예를 들면, frame time 16ms == 화면 1개 그리는데 16ms 소요된다고 볼 수 있습니다.
FPS와 Frame time을 엮어서 보면 아래와 같겠죠

FPSFrame timeFrame time(ms)
201/2050ms
301/3033.33ms
601/6016.67ms
1001/10010ms
1441/1446.9ms

이렇게 보니 FPS와 Frame time이 연관이 있는 것은 알았습니다. 최적화 관점에서 이 두 값을 어떤 의미로 볼 수 있을까요?

최적화 후 1ms 차이

게임을 개발하면서 FPS가 안정적일 수 있도록, 더 높은 FPS로 플레이할 수 있도록 최적화를 하는데요. 이 때 최적화 결과 Frame time이 1ms 줄었을 때 FPS 변화는 어떻게될까요?

FPS와 Frame time 관계를 보았을 때 60 FPS 기준으로 Frame time은 16.67ms 였는데요.

Frame time이 16.67ms → 15.57ms가 될 경우, 60 FPS → 63.8 FPS. 약 3.8 FPS 상승합니다.

더 높은 FPS에서는 어떨까요? 10ms → 9ms가 되면 100 FPS → 111.11 FPS. 약 11.11 FPS 상승합니다.

최적화 후에는 FPS를 보는 것 보다 Frame time을 보는게 더 명확하다

60 FPS 고정인 상태 또는 게임에서의 부하(stress), 여러가지 하드웨어 환경에 따라 측정 결과가 다를 수 있긴합니다.

다만 최적화 후 개선된 항목(function 또는 Operation)이 얼마나 게임 환경(성능)에 영향을 주었는지를 Frame time 변화를 통해서 조금 더 명확하게 볼 수 있습니다.

물론 FPS 보다는 바로 이해가 가지 않을 수는 있지만 다른 요소에 영향을 받지 않는 수치로 볼 수 있는 것이죠.

Fin

일반인(?)의 시선으로 Frame time을 최적화 관점에서 정리를 해보았습니다.

항상 최적화 이후에 1ms, 0.5ms 개선했다는 내용이 큰 개선인가? 하는 의문이 있었고 그런 참에 계산해보고 정리해보면서 개선의 크기와 영향도를 알게되어서 즐거운 공부였네요.

틀린 내용이 있다면 편하게 댓글 남겨주세요.
고맙습니다. :)

참고 영상

https://www.youtube.com/watch?v=GpYyjb5mz48

What is Buildbot

빌드봇(Buildbot)

https://buildbot.net/
“The Continuous Integration Framework”
“Python-based continuous integration testing framework”
Jenkins, Circle CI와 같은 CI 프레임워크로 지속적인 통합을 위한 프로그램입니다.

Buildbot in Action

Buildbot Home - https://buildbot.buildbot.net/#/

빌드봇 기본 설명

기본적으로 Buildbot은 작업 예약 시스템입니다. 작업을 대기하고 필요한 리소스를 사용할 수 있을 때 작업을 실행하며 결과를 보고합니다.
소스 저장소에서 소스를 받아 마스터(master)가 워커(worker)에게 빌드를 요청합니다.

사실 다른 CI 서비스들과 크게 다른 점은 없지만 현재 사용하고 있는 CI 서비스라서 공부 및 소개하는 차원에서 정리해봅니다.

다른 자료들을 보면서 어떤 장, 단점이 있는지 참고하면서 공부하려고 했는데 자료가 거의 없네요. 😂
빌드봇 공식 문서를 보면서 정리해보고자 합니다. :)

빌드봇 가이드 문서 살펴보기

Introductions

https://docs.buildbot.net/current/manual/introduction.html

빌드봇 소개는 기능 소개로 시작되네요.

  • run builds on a variety of worker platforms
  • arbitrary build process: handles projects using C, Python, whatever
  • minimal host requirements: Python and Twisted
  • workers can be behind a firewall if they can still do checkout
  • status delivery through web page, email, IRC, other protocols
  • track builds in progress, provide estimated completion time
  • flexible configuration by subclassing generic build process classes
  • debug tools to force a new build, submit fake Changes, query worker status
  • released under the GPL

정리해보면 다음과 같습니다.

  • 다양한 워커 플랫폼으로 빌드할 수 있고, 다양한 언어 프로젝트를 빌드 가능
  • Python, Twisted로 설치 요구사항이 적음
  • 빌드 상태 추적 및 예상 완료 시간 제공
  • 빌드 프로세스 설정과 관련하여 유연하게 설정 가능

현재 빌드봇을 사용하는 이유가 빌드 프로세스 설정을 커스텀하게 할 수 있어서이긴 합니다.

사실 젠킨스도 커스텀하게 설정할 수는 있겠지만 현재 사용하는 시스템을 대체하려면 여러가지 커스텀하게 변경해야하는게 많아서 어렵다고는 생각합니다. 😂

https://stackshare.io/buildbot
Stackshare 서비스에서 투표된 내용을 기반으로 보면, 장점으로 “Highly configurable builds”가 1순위네요.
추가로는 “Beautiful waterfall(이쁜 워터폴)”, “Hosted internally(내부 설치)”가 있었습니다.

시스템 구조 오버뷰

앞서 첨부했던 이미지에 있는 내용과 동일한 이미지를 시작으로 시스템 아키텍쳐(구조)에 대한 이야기가 나옵니다.
소스코드 저장소에서 변경사항이 있을 경우 빌드마스터가 이벤트를 받아 워커에 빌드를 요청하고 빌드 상황을 이메일, 웹, 등에서 볼 수 있다는 기본적인 구조를 설명합니다.

워커는 빌드마스터에게 명령을 받고 빌드를 진행하며, 빌드마스터가 코드를 제공하지는 않고 저장소에서 코드를 받아 빌드를 진행합니다.

Buildmaster Architecture

buildmaster architecture

빌드마스터 구조라고 소개해두었지만, 빌드마스터가 어떻게 워커에게 일을 주는 지에 대해 알 수 있는 그림이네요.
문서 상에 설명되어있는 내용을 기준으로 정리해보겠습니다.

Change Sources(변경사항들)
VCS 저장소 내에서 무엇인가 수정될 때마다 변경사항 오브젝트를 생성합니다.
대부분의 ChangeSource는 어떤 종류의 후크 스크립트에서 메시지를 받습니다.
일부 소스들은 정기적으로 저장소를 적극적으로 폴링합니다. 모든 변경사항은 스케줄러에게 제공됩니다.

Schedulers(스케쥴러)
빌드 수행 시기를 결정합니다.
스케쥴러는 BuildRequest에 대한 변경사항을 수집하고, 이 변경사항은 워커를 사용할 수 있을 때까지 빌더들에 전달하기 위해 대기열에 있습니다.

Builders(빌더)
각 빌드의 수행 방법을 정확하게 제어합니다(BuildFactory에서 구성된 일련의 BuildSteps). 각 빌드는 단일 워커에서 실행됩니다.

Status plugins(상태 플러그인)
HTTP, 메일 및 IRC와 같은 프로토콜을 통해 빌드 결과에 대한 정보를 제공합니다.

Each Builder is configured with a list of Workers that it will use for its builds. These workers are expected to behave identically: the only reason to use multiple Workers for a single Builder is to provide a measure of load-balancing.

빌더는 빌드에 사용할 워커들의 목록으로 구성됩니다.
이 워커들은 동일하게 작동해야합니다: 단일 빌더에 여러 워커들을 사용하는 유일한 이유는 로드 밸런싱을 제공하는 것 때문입니다.

Status Delivery Architecture(상태 전달 아키텍쳐)

Status

가이드 문서상에 있는 내용을 그대로 번역하면서 정리해보겠습니다.

The buildmaster maintains a central Status object, to which various status plugins are connected. Through this Status object, a full hierarchy of build status objects can be obtained.

빌드 마스터는 다양한 상태 플러그인이 연결된 중앙 상태(Status) 객체를 유지합니다. 이 상태 객체를 통해 빌드 상태 객체의 전체 계층을 얻을 수 있습니다.

configuration(구성, 설정) 파일은 활성화된 상태 플러그인을 제어합니다. 각 상태 플러그인은 최상위 상태 객체에 대한 참조를 가져옵니다. 여기에서 각 빌더, 빌드, 단계 및 로그 파일에 대한 정보를 요청할 수 있습니다.
이 on-demand 쿼리 인터페이스는 html.Waterfall 플러그인에서 웹 브라우저가 기본 URL에 도달 할 때마다 기본 상태 페이지를 작성하는 데 사용됩니다.

상태 플러그인은 또한 새로운 빌드가 발생할 때 이 상태를 확인(hear)하기 위해 구독(subscribe)할 수 있습니다.
MailNotifier는 이를 사용하여 최근에 완료된 각 빌드에 대해 새 이메일 메시지를 작성합니다.

상태 객체는 빌드 마스터의 기본 디렉토리에 있는 디스크의 기존 빌드 상태를 기록합니다. 이를 통해 히스토리 빌드에 대한 정보를 리턴할 수 있습니다.

스케줄러빌더에 해당하는 상태 객체도 있습니다. 이를 통해 상태 플러그인은 예정된 빌드 및 각 워커의 온라인 / 오프라인 상태에 대한 정보를 보고 할 수 있습니다.

이미지를 보면서 정리해보면, 상태 객체 - 빌더 상태 - 빌드 상태 - 단계(step) 상태 - 로그 파일 구조로 상태를 볼 수 있게 구조화되어있습니다.
최상위 상태 객체는 상태 플러그인이 메일로 상태를 알릴 것인지, IRC로 상태를 알릴 것인지 등 정보를 제공합니다.

Control Flow

가이드 문서에는 “빌드봇에서의 하루” 느낌으로 플로우를 설명합니다.

  • 개발자는 일부 소스 코드 변경 사항을 저장소에 커밋합니다. 일종의 훅(hook) 스크립트 또는 커밋 트리거는 구성된 변경 소스 중 하나를 통해 이 변경에 대한 정보를 빌드 마스터에게 보냅니다. 이 알림은 이메일 또는 네트워크 연결을 통해 도착할 수 있습니다 (빌드마스터가 변경 사항을 구독 할 때 시작되거나 커밋 트리거가 변경 사항을 빌드마스터에게 푸시 할 때 시작됨). 변경 사항에는 변경한 사람, 수정된 파일, 변경 사항이 포함된 리비전 및 체크인 코멘트(주석)에 대한 정보가 포함됩니다.
  • 빌드마스터는 이 변경 사항을 구성된 모든 스케줄러에 분배합니다. 중요한 변경 사항으로 인해 “tree-stable-timer”가 시작되고 변경 사항이 새 빌드로 들어갈 목록에 추가됩니다. 타이머가 만료되면 구성된 각 빌더 세트에서 빌드가 시작되어 모두 동일한 소스 코드를 컴파일 / 테스트합니다. 달리 구성하지 않는 한, 모든 빌드는 여러 워커에서 병렬로 실행됩니다.
  • 빌드는 일련의 단계로 구성됩니다. 각 단계는 해당 빌더와 연관된 원격 워커에서 몇 개의 명령을 호출하게합니다. 첫 번째 단계는 거의 항상 변경사항을 생성한 같은 VC 시스템에서 적절한 리비전을 체크아웃하는 것입니다. 나머지는 일반적인 컴파일 및 실행 단위 테스트를 수행합니다. 각 단계가 실행될 때 워커는 명령 결과 값을 보고(리포트)하고 상태를 빌드마스터에게 반환합니다.
  • 빌드가 실행되면 “빌드 시작”, “단계 시작”, “빌드 완료”등과 같은 상태 메시지가 상태 대상 모음에 게시됩니다. 이러한 대상 중 하나는 일반적으로 이벤트 목록을 표시하는 HTML Waterfall 표시이며 각 열의 맨 위에 있는 최신 빌드 결과를 요약합니다. 개발자는 이 페이지를 주기적으로 확인하여 변경사항이 어떻게 되었는지 확인할 수 있습니다. 빨간색으로 표시되면 실수를 한 것이므로 문제를 해결해야합니다. 녹색으로 표시되면, 그들은 자신의 의무를 다했다는 것을 알 수 있고 그들의 변경사항이 무엇을 깨뜨린 것은 아닌지에 대해 걱정할 필요가 없습니다.
  • MailNotifier 상태 대상이 활성화된 경우, 빌드가 완료되면 빌드변경사항을 기여(참여)한 모든 개발자에게 이메일이 발송됩니다. MailNotifier는 실패한 빌드 또는 전달에서 실패로 전환된 빌드에 대해서만 메일을 보내도록 구성할 수 있습니다. 다른 상태 대상은 IRC와 같은 다른 통신 채널을 통해 유사한 실시간 알림을 제공할 수 있습니다.

빌드봇 살펴보기 마무리

사실 다른 CI 서비스를 많이 아는 상태에서 빌드봇을 둘러보아서 차이점이나 장점을 자세히 소개하지는 못했던 것 같습니다.
다음 포스트에서는 빌드봇 설치, CI 환경 구축까지 해서 테스트가 잘되는지 한번 해봐야겠습니다. 😀
그 후에 젠킨스나 다른 설치형 CI 서비스도 한번 둘러보고 포스트 남겨보겠습니다.

이번 글이 가이드 문서의 번역글로 작성된 것 같기는 합니다.
나중에 빌드봇을 설치하고 설정해보면서 알게되는 내용도 같이 정리해보겠습니다.
그때는 이 글에 #1, #2 이렇게 붙을 수도 있겠네요. 😀

What is Clumsy

Clumsy 소개

https://jagt.github.io/clumsy/index.html

네트워크 환경, 상태를 컨트롤할 수 있는 툴 입니다.
Windows 환경에서만 동작하는 툴이어서 맥(Mac), 리눅스(Linux)에서는 사용할 수 없는 툴입니다.
(Windows의 WinDivert라는 네트워크 관련 패키지를 사용해서 컨트롤하는 프로그램이기 때문입니다.)

clumsy demo

다운로드

사용 방법

https://jagt.github.io/clumsy/manual.html

General

Clumsy Screen

  1. Filtering: 패킷은 이 필터를 조건으로 캡처됩니다. 필터링에 있는 내용을 조건으로 패킷을 잡아 아래 함수들이 동작합니다.
  2. Presets 메뉴: 선택할 수 있는 내장 프리셋 목록이 있습니다. 어떤 필터들이 있는지 드롭다운을 눌러서 볼 수 있습니다.
  • config.txt 에 실행파일과 함께 번들로 필터를 추가할 수도 있습니다.
  1. Start 버튼: 패킷 캡쳐를 시작합니다. 필터의 구문이 맞지 않거나, 다른 이슈로 인해 시작이 안될수도 있습니다.
  • 캡쳐가 시작되면 버튼은 “Stop”으로 변경되고, 버튼 왼쪽 작은 아이콘에 녹색으로 표시됩니다.
  • 캡쳐에 실패하면 아이콘은 적색으로 표시됩니다.
  1. Function control: 캡쳐된 패킷에 대해 원하는 기능을 사용할 수 있습니다.
  • Lag - 패킷 전송을 지연시킵니다. Lag time 만큼 지연시킵니다.
  • Drop - 패킷을 전송하지 않고 떨어뜨립니다.(드롭합니다) Chance 값에 따라 떨어뜨립니다.
  • Throttle - 특정 시간 동안 트래픽을 차단하고 나중에 일괄적으로 보냅니다.
  • Out of order - 순서를 뒤섞습니다.
  • Duplicate - 패킷을 중복으로 보냅니다.
  • Tamper - 패킷 내용을 변경(변조)합니다.
  1. Parameters control
  • Inbound - 밖에서 안으로 들어오는 패킷에 대해 적용합니다.
  • Outbound - 안에서 밖으로 나가는 패킷에 대해 적용합니다.
  • Lag time / Chance - 적용하고자하는 확률, 지연 값을 설정할 수 있습니다.
  1. Status: 현재 상태에 대한 메세지를 보여줍니다.

Client Packet Loss Test

10% packet loss test

  • 모든 패킷에 대해서 10% 확률로 패킷을 드롭시키는 설정입니다.

정리

이 틀을 네트워크 테스트를 하다가 알게되었는데 가이드 문서가 없어서 블로그에 한번 정리해보았습니다.
툴 자체는 간단하고 네트워크 지식(UDP, TCP, 인바운드, 아웃바운드 정도) 알면 사용하는데에는 무리가 없어보이는 툴입니다.
네트워크 상태 테스트에서 일반적으로 발생하는 문제 케이스에 대한 테스트 케이스도 한번 정리해두면 좋을 것 같습니다.

Perforce Client(P4V) basics

P4V 가이드 #1

갑자기 PM이 Perforce 프로그램인 P4V 가이드를 작성하게 되었는데요. 사실 저는 Git, SVN 정도를 사용해본 경험만 있고 이번에 Perforce를 처음 사용하게 되었습니다.

제가 P4V를 볼 일은 많지 않지만 다른 사용자분들의 P4V 사용을 돕기 위해서 가이드 문서를 작성하다가 한국쪽 가이드 문서가 많지 않아 이렇게 블로그로 정리해보게 되었습니다.

툴 설명이라 엄청나게 큰 팁이 있다기 보다 이런 기능도 있구나, 이런 화면에 이런 기능도 있구나 하는 것을 조금씩 정리해보고 공유해보려 합니다. :)

이번 포스트에서는 접속화면 부터 메인메뉴 화면을 중심으로 다뤄보고 다음 포스트에는 P4V에서 자랑하는 기능들을 중심으로 설명해보려합니다. 시작하겠습니다!

다른 Perforce 가이드 문서들

접속 화면

P4V를 켜게되면 아래와 같은 화면을 볼 수 있습니다.

Login

  • 서버 주소, 이름, 워크스페이스를 설치하면서 설정한대로 또는 추가 설정하여 진행할 수 있습니다.
  • 워크스페이스(Workspace)는 내가 앞으로 로컬에서 작업할 공간을 의미합니다.
    • 특정 스트림과 맞춰 설정해두고 그 스트림에 수정사항을 제출할 수 있는 공간으로 이해하시면 됩니다.
  • Show dialog at startup 옵션을 체크해두면 시작할 때마다 이 창을 볼 수 있습니다.
    • 똑같은 값인데 항상 뜨는 창이 귀찮다면 해당 옵션을 끄고 시작하면됩니다.

Setting

처음 접속 시에 아래와 같은 화면이 나와 설정이 필요할 경우 참고하세요.
(갑작스러운 윈도우 화면이지만 정보와 버튼 UI 레이아웃은 맥과 동일합니다)

SSL fingerprint trust

Encoding check

  • Trust this fingerprint 체크! → Connect
    • p4 서버 연결시 SSL이 설정되어있을 경우, 확인 절차로 나옵니다. 아닌 경우에는 설정창이 뜨지 않습니다.
    • 이 컴퓨터에서 보안 연결하는 것을 설정하는 작업입니다.
  • 드롭다운을 눌러서 서버에 설정된 인코딩에 맞춰 설정합니다.
    • CPC949 또는 UTF-8, UTF-8 (no bom) 등이 있습니다. 자신의 서버에 맞게 설정해주세요.

메인 화면

Main view

  • 메인 화면은 처음 실행한 화면과 예시 화면이 다를 수 있습니다.
  • 현재 히스토리(History)를 보여주는 영역을 메인 영역으로 정의하고 설명드리겠습니다.
    • 화면 상단에 뷰(View) 메뉴를 눌러보면 많은 뷰 메뉴가 있습니다.
    • 모든 뷰 메뉴에 대한 자세한 설명이 필요하다면 이 링크를 참고해주세요. (영어 주의)
  • 현재 보이는 화면에서 자주보는 메뉴는 다음과 같습니다.
    • History: 왼쪽 트리에서 선택한 디팟(Depot), 스트림, 파일의 히스토리를 볼 수 있습니다.
    • Files: 왼쪽 트리에서 Workspace 탭으로 갔을 때, 각 폴더에 있는 파일 목록을 볼 수 있습니다.
    • Pending: 현재 작업하고자 Checkout한 파일리스트 또는 제출(서밋, Submit)하기 위해 만든 체인지리스트(Changelist)를 관리할 수 있습니다.
    • Submitted: 내가 제출한 체인지리스트의 목록을 볼 수 있습니다.

History

History view

  • 왼쪽 메뉴에서 선택한 항목(디팟, 스트림, 파일)의 히스토리를 볼 수 있습니다.
  • Revision / Date Submitted / Submitted By / Description 각 컬럼별로 정렬하여 볼 수 있습니다.
  • 브랜치(스트림)에 상관없이 디팟의 히스토리를 보고 싶다면 stream 항목을 눌러서 히스토리를 볼 수 있습니다.
  • 왼쪽 메뉴 상단의 필터 버튼을 통해 스트림을 타입별로 골라서 볼 수 있습니다.
    • mainline 스트림만 보고 싶다면, 필터 버튼 > Tree Restricted to Stream Type > Mainline
    • Development 스트림만 보고 싶다면, 필터 버튼 > Tree Restricted to Stream Type > Development
    • Release 스트림만 보고 싶다면, 필터 버튼 > Tree Restricted to Stream Type > Release
    • 필터를 사용하지 않고 모든 스트림을 보는 옵션은 No Filter 또는 All Types 입니다.
  • 저장소의 히스토리만 보고자 한다면, 로컬에 소스를 받을 필요없이 리모트의 히스토리만 볼 수 있습니다.

Files

Files view

  • 왼쪽 메뉴에서 선택한 항목의 하위에 있는 파일들을 볼 수 있습니다.
    • 폴더를 선택할 경우 해당 폴더안에 있는 파일들을 볼 수 있습니다.
    • 파일을 선택하더라도 같은 폴더안에 있는 파일들도 볼 수 있습니다.
  • 각 파일 항목 별로 마우스 오른쪽 버튼을 누르면 기능들이 많습니다.
    • Check Out, Mark for Delete, File History 등 사용하고자하는 기능을 사용할 수 있습니다.

Pending

Pending view

  • 현재 보여지는 화면과 가이드를 보고 있는 여러분의 화면은 다를 수 있습니다.
    • 메뉴 상단에 필터가 어떻게 적용되어있냐에 따라 다릅니다.
    • 필터를 어떻게 적용하냐에 따라 다른 사람의 Pending changelist(작업 내용)을 볼 수 있습니다.
  • 체크아웃을 하여 작업한 내용을 넣거나 체크아웃 하기 전 미리 체인지리스트를 만들 수 있는 화면입니다.

Submitted

Submitted view

  • 기본 필터로는 현재 사용자가 제출한 체인지리스트를 볼 수 있습니다.
    • 필터를 어떻게 적용하냐에 따라 다른 사용자가 제출한 내용도 볼 수 있습니다.
  • 각 항목은 마우스 오른쪽 버튼을 클릭하면 상세 내용을 볼 수 있는 메뉴들을 볼 수 있습니다.

Filter 기능

Filter

  • 내가 원하는 조건에 따른 결과를 볼 수 있도록 하는 필터 기능입니다.
  • 위에 메인메뉴에서 있던 Pending, Submitted 등의 메뉴에서 사용할 수 있습니다.
  • -/+ 버튼으로 조건을 추가할 수 있습니다.
    • User, Workspace, Files를 조건으로 검색할 수 있습니다.
  • 필터 기능은 슬프게도 히스토리(History) 메뉴에는 없습니다. :(
  • 각 필터 항목에 OR / AND 연산을 할 수 있는 쿼리가 지원되지 않습니다.
    • 혹시나 해서 && 나 || AND OR 등 지원되는 것이 없네요. :(
  • 자주사용하는 필터는 저장해서 사용할 수 있습니다.
    • 메뉴 상단 필터 버튼 > Save Filter… > 필터 이름입력 > OK

각 메뉴에서 Ctrl + f (Cmd + f)를 누르면 검색할 수 있습니다. 다만 제한조건이 있습니다.

  • 히스토리 메뉴에서는 Revision, Submitted By, Description 항목에 있는 내용으로 검색할 수 있습니다.
  • 각 Pending, Submitted에서는 설명 메세지, 체인지리스트 값으로 검색할 수 있습니다.
  • 다만 한계점은, 지금 리스트에 보이는 만큼에서만 검색됩니다.
    • 퍼포스는 전체 체인지리스트를 한번에 받아오지 않게 되어있기 때문입니다.
    • 검색 기능은 다소 불편하지만 스크롤을 쭉 내려서 검색하는 것도 방법입니다.

추가적으로 할 수 있는 방법은 HTML Tools를 사용해서 검색 툴을 만드는 것 정도가 있을 수 있겠습니다.

  • https://www.perforce.com/.../enable-html-tools.html
  • 예시 중에 Demo Run Queries 를 참고하면 전체 체인지리스트에서 검색할 수는 있어보입니다.
  • 나중에 다른분들도 사용해볼 수 있도록 만든 뒤에 공유해보겠습니다.

마무리

회사에서 SVN을 사용하다가 Perforce로 마이그레이션하면서 빠르고 편한 것도 있지만 여러 어려움을 겪고 있는데요. 기존에 검색되던 것들이 쉽게 검색되지 않는 것과 종종 발생하는 대규모 lock 사태 등..

조금씩 사내 시스템에 개선해나가면 Perforce도 쓸만해지지 않을까라는 생각을 하며 다른 사용자분들도 잘 사용하고 계신지 궁금하네요. 다음 포스트에서 더 유익한 정보 가져오겠습니다.

감사합니다.

주간 자바스크립트 #448

Electron 6, String#replace 트릭과 JS에서의 스코프 학습

JavaScript Weekly Issue 448: August 2, 2019
본문: https://javascriptweekly.com/issues/448

Hotkey

Hotkey: 키보드에서 ‘핫키’가 눌렸을 때, 요소에 동작을 트리거하는 것

페이지의 요소에 대한 빠르고 간단한 바로 가기 키를 원하십니까? data-hotkey 특성을 설정하고 핫키를 사용하십시오. 순차적으로 누르는 여러 개의 키를 지원하기도 한다. GitHub를 구축하여 사용(GitHub 페이지에서 소스 확인 및 data-hotkey 속성 확인)
GITHUB

Electron 6.0 릴리스

버전 5가 출시된 지 3개월 만에, 인기있는 JavaScript 기반 크로스 플랫폼 데스크탑 앱 구축 플랫폼은 버전 6에 도달했고 Chromium 76, Node 12.4 및 V8 7.6을 사용한다.
ELECTRON.JS TEAM

Jason Lengstorf와 함께 Gatsby 과정 소개

기본적으로 Gatsby를 사용하여 굉장히 🔥 빠른 웹 사이트를 구축하십시오. 이 과정에서는, 당신은 처음부터 블로그를 만들고, 당신의 새로운 블로그를 Netlify로 배포하여 세계가 볼 수 있도록 할 것이다!
FRONTEND MASTERS SPONSOR

당신은 String.prototype.replace가 치환 패턴을 지원하는지 알고 있습니까?

약간 Perl처럼 느껴지지만, 이것은 내가 전에 자바스크립트에서 본 적이 없는 흥미로운 기능이다. (MDN에 문서가 있음에도 불구하고) 예시: 'abc'.replace('b', '$&-$&') === 'ab-bc'.
STEFAN JUDIS

간단한 MVC 앱을 플레인 자바스크립트로 만들기

만약 여러분이 React, Angular, Mithrill, Ember, 그리고 나머지 것들에 대해 듣는 것에 싫증이 나서 자바스크립트를 쓰고 싶다면, 이것은 여러분을 위한 것이다. (궁극적으로, 그러한 모든 프레임워크들은 매우 유용하지만 그것들 없이 먼저 작업할 수 있다는 것은 그들이 하는 것에 감사하는 데 도움이 될 것이다!)
TANIA RASCIA

Comlink로 메인 스레드에서의 Redux 해제

Web Workers를 주의깊게 사용하면 UI 스레드에서 계산을 제거하여 주요 UX 및 성능상의 이점을 얻을 수 있다. 여기 Redux를 사용할 때 할 수 있는 한 가지 방법이 있다.
SURMA

짧은 소식들

💻 채용 공고

채용 공고는 따로 번역하지 않습니다.

JavaScript Developer at X-Team (Remote)

Join the most energizing community for developers. Work from anywhere with the world’s leading brands.
X-TEAM

Front-end Engineer

Goldstar is looking for front-end Engineers with React experience on-site in Portland, Oregon and Pasadena, California.
GOLDSTAR

Get Hired Based on Your Skills Not Your CV

Our AI makes it easier and quicker to match with top JavaScript jobs, with no recruiters and an average salary of £70k.
HACKAJOB

📘 튜토리얼, 오피니언, 영상

자바스크립트에서 스코프

자바스크립트에서 스코프에 대해 알아보자

구글의 역동적인 자바스크립트 듀오 Jake와 Surma가 태블릿 기반의 데모를 완성한 변수 스코프와 관련된 재미있는 대화를 선보이고 있다.
GOOGLE CHROME DEVELOPERS

옵셔널 체이닝에 대한 ES 제안 보기

당신이 알아야 할 필수 사항으로 제안을 요약한다.
DR. AXEL RAUSCHMAYER

필요한 측정 지표를 잃지 않기 위한 개발자 가이드

측정 지표를 수집하고 저장하는 것은 생산의 일부분이다. 안좋은 사건이 발생할 때, 당신은 문제를 디버깅하기 위해 이용할 수 있는 지표를 가질 필요가 있다.
INFLUXDATA SPONSOR

React Hook이 Redux를 대체하는가?

이 질문은 최근 커뮤니티에서 훅(hook) 사용 사례가 증가함에 따라 자주 제기되었다. 그러나 Eric의 TLDR은 ‘훅은 위대하지만, 대체할 수 없다’이며, 그 이유를 심도 있게 설명한다.
ERIC ELLIOTT

Vuetify 2.0 시작하기

Vuetify는 Vue.js를 위한 머터리얼 디자인 기반 구성요소 라이브러리이다.
BEN HONG

Jest를 사용한 유닛 테스트 시 Mock 사용을 위한 빠른 팁

DANIEL CALDAS

자바스크립트에서 최상위 함수들

왜 1등 시민으로서의 기능(즉, 그 나름대로의 물건으로서)을 취급할 수 있는지 궁금해 하는 초심자를 대상으로 하는 간단한 튜토리얼은 장점이 있다.
NICK SCIALLI

상위 10개의 GitHub 모범 사례 - 수천 개의 저장소에서 얻은 교훈

DATREE.IO SPONSOR

나의 VS Code 설정: VS Code를 최대한 활용

VS Code 사용자라면 고려할만한 추가 기능 및 툴.
DEEPU K SASIDHARAN

RxJS Observable을 이해하고 왜 필요한지

RxJS는 ‘observables’을 기반으로 하는 반응형 프로그래밍 라이브러리로서, Angular가 반응성을 위해 사용한다. 따로 쓸 수도 있다.
NWOSE LOTANNA

🔧 코드와 도구들

Hackathon Starter: Node 웹 앱용 보일러 플레이트

필요한 거의 모든 것이 포함되어 있기 때문에 (해커톤과 같은) Node 앱을 빠르게 만들기 시작할 때 사용하는 보일러 플레이트.
SAHAT YALKABOV

Esprint: 여러 스레드 간에 ESLint를 실행하여 성능 향상

이것은 ESLint로 통합될 수 있다고 여겨져 왔다.
PINTEREST

병합하기 전에 코드가 오류 없는지 확인하십시오

적용 범위, 중복, 복잡성 및 스타일 문제에 대한 표준을 설정하고 Git 워크플로우에서 실시간 피드백을 확인하십시오.
CODACY SPONSOR

Treeverse: 트리 구조를 깊이 또는 면적을 먼저 걷기

ISAAC Z SCHLUETER

Rollup: 최신 ES6 모듈 번들러

새로운 프로젝트는 아니지만, 최근에 많이 릴리스되고 있다. ES 모듈을 사용하여 코드를 작성하고 트리 흔들기/죽은 코드를 삭제하고 필요한 형식으로 번들링하십시오. Rollup이 더 인기 있는 대안들에 비해 이긴 것 중 하나는 속도다.
ROLLUP CONTRIBUTORS

WebStorm 및 IntelliJ용 자바스크립트 플러그인 상위 25개

ILANA BRUDO

⚡️ 릴리스 요약

  • Font Awesome 5.10.0 — 유명한 아이콘 툴킷.
  • webpack 4.39.0 — ‘웬만한 건 빼고 거의 다 있는’ 번들러.
  • TUI Editor 1.4.5 — 마크다운 기반의 WYSIWYG 에디터.
  • Spectacle 5.7 — \React.js 기반 프레젠테이션 라이브러리.
  • Duktape 2.4 — C/C++ 프로젝트를 위한 내장형 자바스크립트 엔진.