1. 만들어 놓은Blendspace를 끌어다 놓고, OutputPose - Result에 링크

 

compile하면 blendspace노드에 그리드 형태가 나온다.

 

2. Angle,Speed변수를 생성하여 값 셋팅

3. 사용하려는 캐릭터 블루프린트의 AnimationMode : UseAnimationBlueprint로 변경

AnimClass : 적용하려는 ABP로 변경

 

4. EventBluePrint함수에서 pawn정보(각도,이동속도)를 가져와서 애니메이션을 동작하도록 할 수 있다.

TryGetPawnOwner : 현재 pawn owner

GetVelocity : speed값을 셋팅하기 위한

VectorLength : 벡터의 속도 값만 필요(float)

 

'언리얼' 카테고리의 다른 글

unreal) blend space  (0) 2025.01.01
unreal) Animaion Blueprint Blend  (0) 2024.12.31
unreal) camera lag  (0) 2024.12.23
unreal) TSubclassOf<class ~>  (0) 2024.12.20
unreal) CameraShake, ClientStartCameraShake  (0) 2024.12.19

블렌드 스페이스(Blend Space)는 언리얼 엔진에서 여러 입력값에 따라 몇 개의 애니메이션을 블렌딩할 수 있게 만들어주는 에셋

 

애니메이션 중간 보간된 상태를 적절하게 보여준다.

 

preview valu값은 컨트롤 키를 눌러야 움직일 수 있음

 

'언리얼' 카테고리의 다른 글

unreal) Blendspace : AnimGraph 에서 사용하기  (0) 2025.01.01
unreal) Animaion Blueprint Blend  (0) 2024.12.31
unreal) camera lag  (0) 2024.12.23
unreal) TSubclassOf<class ~>  (0) 2024.12.20
unreal) CameraShake, ClientStartCameraShake  (0) 2024.12.19

애니메이션 블루프린트 

언리얼의 블루프린트 애니메이션 블랜드를 통해 앞으로 뛰는 애니메이션과 가만히 서있는 애니메이션을 특정 변수의 값에 따라 동작하도록 설정할 수 있다.

 

Forward 값을 통해 0~1로 적절하게 Blend 조절

 

Left 값을 통해 적절하게 섞을 수 있다.

'언리얼' 카테고리의 다른 글

unreal) Blendspace : AnimGraph 에서 사용하기  (0) 2025.01.01
unreal) blend space  (0) 2025.01.01
unreal) camera lag  (0) 2024.12.23
unreal) TSubclassOf<class ~>  (0) 2024.12.20
unreal) CameraShake, ClientStartCameraShake  (0) 2024.12.19

 

 

'언리얼' 카테고리의 다른 글

unreal) blend space  (0) 2025.01.01
unreal) Animaion Blueprint Blend  (0) 2024.12.31
unreal) TSubclassOf<class ~>  (0) 2024.12.20
unreal) CameraShake, ClientStartCameraShake  (0) 2024.12.19
unreal) BlueprintImplementableEvent  (0) 2024.12.09

Ocsillation Duration : 카메라 쉐이크 경과 시간

Ocsillation Blend in/out Time,  : 시작과 끝의 블렌드 지속 시간

Rot Ocsillation : 회전 진동 :진동 기능에 따라 카메라가 회전

Loc Ocsillation : 위치 진동 : 카메라를 이리저리 움직임

FOV Ocsillation  : 카메라를 확대, 축소하면서 시야에 영향을 줌

 

GetWorld()->GetFirstPlayerController()->ClientStartCameraShake(DeathCameraShakeClass);

포탄 쏠때

 

터렛 죽을때

'언리얼' 카테고리의 다른 글

unreal) camera lag  (0) 2024.12.23
unreal) TSubclassOf<class ~>  (0) 2024.12.20
unreal) BlueprintImplementableEvent  (0) 2024.12.09
unreal) GetWorldTimerManager()  (0) 2024.11.28
unreal) 특정 거리 안에 들어오면 회전하는 타워  (0) 2024.11.28

BlueprintImplementableEvent

정의만 하고 구현은 블루프린트에서만 할 수 있도록

 

https://assetstore.unity.com/packages/tools/integration/unirx-reactive-extensions-for-unity-17276

 

UniRx - Reactive Extensions for Unity | 기능 통합 | Unity Asset Store

Use the UniRx - Reactive Extensions for Unity from neuecc on your next project. Find this integration tool & more on the Unity Asset Store.

assetstore.unity.com

 

 

 

ref

https://skuld2000.tistory.com/31

https://mentum.tistory.com/512

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

 

타이머 등록

 
GetWorldTimerManager().SetTimer(FireRateTimerHandle, this, &ATower::CheckFireCondition, FireRate, true);

 

내부

FORCEINLINE void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TMethodPtr< UserClass > InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)
{
    InternalSetTimer(InOutHandle, FTimerUnifiedDelegate( FTimerDelegate::CreateUObject(InObj, InTimerMethod) ), InRate, InbLoop, InFirstDelay);
}

InOutHandle : 타이머를 관리하는 핸들러

InTimerMethod : 타이머 종료시 실행 함수

InRate : 반복되는 주기

InbLoop : 반복 여부

 

 

타이머 해제

GetWorldTimerManager().ClearTimer(FireRateTimerHandle);

Tower.cpp

void ATower::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	if(Tank)
	{
		float Distance = FVector::Dist(GetActorLocation(), Tank->GetActorLocation());
		if (Distance <= FireRange)
		{
			RotateTurret(Tank->GetActorLocation());
		}
	}
}

void ATower::BeginPlay()
{
	Super::BeginPlay();

	Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
}

 

 

BeginPlay에서 현재 PlayerPawn을 가져온다. (Tank)  매번 호출하기에는 부하가 있으니

Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));

 

그 이후 Tick()에서 특정 거리 안에 들어오면 Rotate처리

float Distance = FVector::Dist(GetActorLocation(), Tank->GetActorLocation());

FVector::Dist를 통해 Tank와 거리 계산

 

'언리얼' 카테고리의 다른 글

unreal) BlueprintImplementableEvent  (0) 2024.12.09
unreal) GetWorldTimerManager()  (0) 2024.11.28
unreal) FMath::RInterpTo  (0) 2024.11.20
unreal) DrawDebugSphere  (0) 2024.11.19
unreal) EditDefaultsOnly, EditInstanceOnly, BlueprintReadWrite  (0) 2024.11.11

매개변수

  • Center: The center location of the sphere in the game world.
  • Radius: The radius of the sphere.
  • Segments: The number of segments used to approximate the sphere’s surface.
  • Color: The color of the sphere.
  • PersistentLines: Whether the sphere’s lines should persist between frames.
  • LifeTime: The amount of time the sphere should remain visible, in seconds.
  • DepthPriority: The priority of the sphere’s depth in the rendering pipeline.
  • Thickness: The thickness of the lines used to draw the sphere.

 

	DrawDebugSphere(GetWorld(), GetActorLocation() + FVector(0, 0, 200),
		100.f,12, FColor::Red, true,30.f);

 

 

 

GetHitResultUnderCursor

Trace Hit

void ATank::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	if(PlayerControllerRef)
	{
		FHitResult HitResult;
		PlayerControllerRef->GetHitResultUnderCursor(ECC_Visibility, false, HitResult);
		DrawDebugSphere(GetWorld(), HitResult.ImpactPoint,
	25.f,12, FColor::Red, false,-1.f);
	
	}
}

 

 

 

참고
https://agrawalsuneet.github.io/blogs/drawdebugsphere-in-unreal/

CreateDefaultSubobject :

생성자에서만 실행가능

템플릿으로 <>안에 사용할 컴포넌트를 넣어줌

TEXT()

각각의 컴포넌트를 구분하기 위한 값이 들어간다.

해쉬 값을 생성하기 때문에, 다른 TEXT와 겹치면 안된다.

 

하위 클래스 셋팅하기

EditDefaultsOnly

default 편집에서만 수정가능

 

EditInstanceOnly

인스턴스에서만 편집가능

 

BlueprintReadWrite

블루프린트에서 접근 가능

 

AllowPrivateAccess = "true"

BlueprintReadWrite 키워드를 썼기 때문에 접근제한자 private에서도 사용 불가능하지만.

AllowPrivateAccess  = "true"로 사용 가능하도록 할 수 있다.

 

 

Category = "Super Duper ~~"

설정한 카테고리 이름으로 블루프린트에서 검색이 가능하다.

단순히 솔루션 탐색기에서  delete를 해도 완전히 삭제되지 않는다.

1. 언리얼 에디터 종료

2. 솔루션탐색기 에서 제거

3. 프로젝트 폴더에에서 클래스 삭제

4.솔루션 재빌드

 

VisibleAnywhere

블루프린트에서 보이지만 수정 불가능

 

EditAnywhere

블루프린트에서 수정가능한 필드

 

VisibleInstanceOnly

블루프린트에 detail창에는 보이지 않지만 Main 배치한 인스턴스에서만 보인다.

기억할 내용

- "이 애플리케이션을 외국에서 사용하는 일은 절대 없을 텐데 뭐하러 국제화하지?, "count는 음수가 될 수 없어," 로깅은 실패할 리 없어" 이런 식으로 자신을 기만하지 말자, 특히 코딩할때는

- 단정문으로 불가능한 상황을 예방하라

- 물론 그런 일은 절대일어나지 않을 거야' 라는 생각이 든다면 그런 일을 확인하는 코드를 추가하라

- 하지만 오류 처리를 해야 하는곳에 단정을 대신 사용하지는 말라

- 첫 번째 방어선은 가능한 오류를 검사하는 것이고, 그 다음은 그러고 놓친 것을 잡아내기 위해 단정을 사용하는 것이다.

- 프로그램을 출시할 때 단정기능을 꺼 버리는 것은 줄타기 곡예를 하면서 연습으로 한 번 건너 봤다고 그물 없이 건너는 것과 비슷하다.

 

 

느낀 점

 실제 서비스를 할때는 예상치 못한 여러가지 이슈가 발생하게된다. 게임은 특히 여러사람들이 동시에 접속하고 상호작용하는 부분들이 많기 때문이다. 그래서 크래시리포트등 발생시점에 기록을 남기는 편이다. 마찬가지로 이러한 부분을 잡아내는데 필요한 방법인것 같다. 절대로 일어날리 없다고 생각했지만 일어난다. 이 단정은 디버깅요소로 활용할 수 있다.

Topic 24 죽은 프로그램은 거짓말을 하지 않는다.

기억할 내용

- '있을 수 없는 일'이 발생했을 때 우리는 그 사실을 알아야 한다. '그런 일은 절대 일어날 리 없어'라는 사고에 빠지기 쉽다.

- 망치지 말고 멈춰라 : 가능한 한 빨리 문제를 발견하면 좀 더 일찍 시스템을 멈출 수 있으니 더 낫다. 

- 어떤 환경에서는 실행 중인 프로그램을 그냥 종료해 버리는 것이 적절하지 못할 수도 있다.(해제되지 않은 리소스, 로그메시지 기록, 트랜잭션 정리, 등)

- 이상 발생하면 이 시점 이후로 하는 일은 모두 수상쩍은 게 된다. 되도록 빨리 종료시키자.

 

 

느낀 점

 여기서 말하고자 하는 것은 이슈가 발생하면 그 상황에서 이상하게 통과시키지 말고 그 즉시 종료시키라고 한다. 한번 이슈가 발생된 이후에는 원인 모를 이슈가 계속해서 발생할 수 있기 때문이다. 그렇다고 무조건적으로 종료만 시키는 것은 능사가 아니다. 실제 서비스하고 있는 코드라면 로그를 잡고 프로그램이 죽지 않도록 하게 할 때도 있다. 

Topic 23 계약에 의한 설계

기억할 내용

- 수천 년간 우리가 얻은 해법 중 몇 가지는 소프트웨어를 만드는 데에도 적용할 수 있다. 정직한 거래를 보장하는 최선의 해법 중 하나는

'계약'이다.

- DBC : 계약에 의한 설계(Design By Contrac)

- 정확한 프로그램이란 ...많지도 적지도 않게 딱 그만큼만 하는 프로그램

- 예상이 되는 프로그램

- 선행조건 : 루틴의 선행 조건이 위반된 경우에는 루틴이 호출되어서는 안 된다.

- 후행조건 : 루틴이 자기가 할 것이라고 보장하는 것

- 클래스 불변의 법칙 : 호출자의 입장에서 볼 때는 이 조건이 언제나 참인 것을 클래스가 보장한다.

- tip37 계약으로 설계하라

- '게으름뱅이코드' 수용할 것은 엄격하게 확인하고, 내어 줄 것에 대해서는 최소한도를 약속하는 것이다.

- DBC 구현 : 코드를 작성하기 전에 유요한 입력범위가 무엇인지, 경계 조건이 무엇인지, 루틴이 뭘 전달한다고 약속하는지, 혹은 더 중요하게는 생각하는 무엇을 약속하지 않는지 등을 나열하는 것만으로도 더 나은 소프트웨어를 작성하는데 큰 도움이 된다.

 

 

느낀 점

 이번주제는 소프트웨어를 설계할 때 조건을 걸면서 좀 더 안정된 설계가 가능하다는 말인 것 같다. 프로젝트가 길어지면서 다양한 함수와 복잡해지는 코드가 많아지게 되는데 이러한 계약의 의한 설계를 함으로써 안정된 설계가 필요하다. 요즘에 느끼는 것도 항상 코드를 작성할 때는 규칙이 있어야 한다. 일관성이 있어야 흐름이 예상이 되기 때문이다.

GetOverlappingActors : 액터가져오기

AActor* UTriggerComponent::GetAcceptableActor() const
{
	TArray<AActor*> Actors;
	GetOverlappingActors(Actors);

	for (AActor* Actor : Actors)
	{
		bool HasAcceptableTag = Actor->ActorHasTag(AcceptableActorTag);
		bool IsGarbbed = Actor->ActorHasTag("Grabbed");
		if (HasAcceptableTag && !IsGarbbed)
		{
			return Actor;
		}
	}

	return nullptr;
}

 

셋팅해놓은 태그가 붙어있고 Grabbed가아니면 액터를 반환.

UPrimitiveComponent : "기본적인 렌더링 기능 컴포넌트 클래스"

void UGrabber::Grab()
{
	UE_LOG(LogTemp, Display, TEXT("Grab"));

	UPhysicsHandleComponent* PhysicsHandle = GetPhysicsHandle();
	if (PhysicsHandle == nullptr)
	{
		return;
	}

	FHitResult HitResult;
	if (GetGrabberableInReach(HitResult))
	{
		UPrimitiveComponent* HitComponent = HitResult.GetComponent();
		HitComponent->SetSimulatePhysics(true);
		HitComponent->WakeAllRigidBodies();
		AActor* HitActor = HitResult.GetActor();
		HitActor->Tags.Add("Grabbed");
		HitActor->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);
		PhysicsHandle->GrabComponentAtLocationWithRotation(
			HitResult.GetComponent(),
			NAME_None,
			HitResult.ImpactPoint,
			GetComponentRotation()
		);
	}
}

HitActor->Tags.Add("Grabbed"); : 동적으로 Tag추가

HitActor->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform); : Actor의 RootComponent를 현재 연결되어 있는 모든 SceneComponent에서 분리

 

석상이 놓여있으면 트리거로 인해 철장이 열리고 잡는 순간 다시 철장이 내려옴

 

 

같은 속성의 액터오브젝트로 바꿔치기

Topic 22 엔지니어링 일지

기억할 내용

- 일지를 쓰면 좋은 점 3가지

기억보다 더 믿을 만하다

지금 하는 일에 계속해서 집중할 수 있다.

무언가를 쓰기 위해 하던 일을 멈추면 여러분의 뇌도 기어를 바꾼다.

- 수년 전에 여러분이 무엇을 하고 있었는지 돌이켜 볼 수 있다.

-  때때로 수년 전에 여러분이 무엇을 하고 있었는지 돌이켜 볼 수 있다.

- 종이를 사용해라 키보드를 두드리는 것과 다른 무언가 특별한 것이 있다. 

 

느낀 점

 메모하는 습관이 중요하다는 것은 이미 알고 있지만, 무언가를 쓸 때 뇌는 기어를 바꾸며, 내가 지금 무엇을 하고 있는지 되돌아볼 수 있는 시간이 될 수 있다는 등, 뭔가 머릿속에 추상적으로만 (메모하니까 좋겠지~) 생각했던 것들이 구체적으로 어떤 효과가 있는지 알게 되었다. 

Topic 21 텍스트 처리

기억할 내용

- 프로그래밍에서 텍스트 처리 언어는 목공에서'루터'와 같다. (루터 절단 기계) => 적절히 사용하면 놀라운 효과를 낸다.

- 유틸리티를 뚝딱 만들어 낼 수도있고, 아이디어를 프로토타입해 볼 수도 있다.

- 전통적인 언어를 사용하다보면 다섯 배에서 열 배 가까이 더 오래 걸릴 것이다.

- tip35 텍스트 처리 언어를 익혀라

 

느낀 점

 이번 주제는 주로 프로그래밍에 사용하는 언어 외에 텍스트 처리 언어를 사용해 업무의 생산성을 높이자 라는 의미가 있다. 여기서 제시한 연습문제에서는 소스파일에서 반복적으로 작업을 하는 기능을 처리하는 스크립트를 만들라 하는데 유용할 것같다. awk, sed에 대해서도 알아봐야겠다.

가고일 석상으로 인해 문이 내려가다가 멈춘다.

이 가고일에 컴포넌트에 접근하여서 물리적용 해제 하기

 

 

if (Actor != nullptr)
{
	UPrimitiveComponent* Component = Cast<UPrimitiveComponent>(Actor->GetRootComponent());
	if (Component != nullptr)
	{
		Component->SetSimulatePhysics(false);
	}
    
	Actor->AttachToComponent(this, FAttachmentTransformRules::KeepWorldTransform);
	Mover->SetShouldMove(true);
}

 

- UPrimitiveComponent`는 Unreal Engine에서 사용되는 주요 컴포넌트 중 하나로, 모든 "기본적인" 렌더링 가능 컴포넌트의 기본 클래스

 - SetSimulatePhysics(bool) 물리 시뮬레이션 on/off

- AttachToComponent : RootComponent를 제공된 구성 요소에 연결

wall하위로 들어갔다.

 

결과

문이 밑으로 내려간다.

 

Topic 20 디버깅

기억할 내용

- 디버깅의 심리 : 단지 문제 풀이일 뿐이라는 사실을 받아들이고, 그런 마음으로 공략하라.

- 다른 사람의 버그를 발견 후, 그 버그를 만들어 낸 부정한 범죄자를 비난하는 데에 시간과 노력을 쏟지말고 ... 기술의 전당에서는 남을 비난하기보다 문제를 고치는 데에 집중해야 한다.

- Tip29 비난 대신 문제를 해결하라.

- 버그가 여러분의 잘못인지 다른 사람의 잘못인지는 중요치 않다. 어쨌거나 그 버그를 해결해야 하는 사람은 여러분이다.

- 디버깅 사고 방식 : 가장 속이기 쉬운 사람은 자기 자신이다. - 애드워드 불워 -리턴

- 버그를 목격하거나 버그 신고를 보는 순간의 첫 반응이 '그건 불가능해'라면 여러분은 두말할 필요 없이 틀렸다.'정말 그럴 리가 없는데'로 시작하는 생각의 흐름에 신경 세포 하나도 낭비하지 말라.

- 특정한 증상만 고치지 말고 항상 문제의 근본 원이을 찾으려고 노력 하라

- 실마리 찾기 : 우연에 의해 오도되기 쉽다. 우리는 우연한 사건을 디버깅하느라 시간을 낭비할 여유가 없다. 일단 정확하게 관찰해야 한다. 

디버깅 전략 

- 버그 재현하기 : 재현할 수 없다면 어떻게 그 버그를 고쳤다는 것을 확인할 수 있겠는가?

- Tip31 고치기 전에 실패하는 테스트부터

- Tip32 그놈의 오류메시지 좀 읽어라

- 이상한 결과 : 실패하는 테스트를 이용하여 문제를 재현하라 

- 메모를 하면 도움이 될 때가 많다. 추적을 시작할 때 우리가 어디에 있었는데 메모를 남겨 두지 않았다면 원래 자리로 돌아오느라 시간을 많이 소모했을 것이다.

- 로깅과 트레이싱 : 트레이싱 구문은 '여기까지 도달'이나 'x값 = 2'와 같이 화면 혹은 파일에 출력하는 작은 진단용 메시지를 일컫는다.

- 트레이싱은 여러 프로세스가 동시에 작동하는 경우, 실시간 시스템, 이벤트 기반 애플리케이션 등, 시간 자체가 중요한 요소가 되는 시스템에서 이루 말할 수 없이 소중하다.

- 고무오리 : 문제의 원인을 찾는 방법에는 그냥 누군가에게 설명하는 방법이 있다.

- 문제를 설명하게 되면 혼자 코드를 살펴볼 때는 당연히 여기고 지나갈 것을 명시적으로 이야기해야 한다.

- 소거법 : 사람들이 작성한 애플리케이션 코드, 외부 제품(데이터베이스나 네티워크, 웹 프레임워크, 특화된 통신 방식, 알고리즘 등) 플랫폼 환경(운영체제, 시스템 라이브러리, 컴파일러)이 뒤섞여 있을 것이다. 하지만 처음부터 그런 생각을 하지는 말라

- 발굽 모양을 보면 말을 떠올려야지 얼룩말부터 떠올리지 말라

- 가정하지 말라, 증명하라

 

느낀 점

 이번 주제는 내용도 많고, 개발할 때 중요하게 생각했던 것들이라 생각된다. 공감이 되는 부분이 꽤나 많았다.  발하다 보면 버그가 발생하는데 이 버그가 누가 만들어 냈는지 궁금할 때가 많은데, 그럴 시간에 문제를 해결하려고 노력하는 것이 맞다. 그리고 다른 사람의 의해 나의 작업물에 버그가 보고 되면 그 부분에서는 그럴 리가 없는 데를 얘기한 내가 부끄러웠다.(그럴 리가 없는데, 발생했잖아). 

버그를 추적할 때 메모장을 사용하기, 누군가에게 설명하기, 로깅과 트레이싱(은 몰랐던 용어라 찾아봄)등 디버깅에 필요한 방법들을 제시해주고 있어 실제로 버그 발생 시 적용해 볼만 것들이 많았다.

Topic 19 버전 관리

기억할 내용

- 버전 관리 시스템은 일종의 거대한 '실행 취소'키와 같다.

- 버그 추적이나, 감사, 성능관리, 품질 관리를 해야 할 때 매우 귀중하다.

- 언제나 버전 관리 시스템을 사용하라

- 혼자서 한 주짜리 프로젝트를 진행하는 경우일지라도, 나중에 '버리기로 한' 프로토타입일지라도, 심지어 열분이 작업하는 것이 소스코드가 아닐지라도, 모든 것을 버전 관리 아래에 둬라. 각종 문서, 전화번호 목록, 외부 업체에 보내는 메모, makefile, 빌드와 릴리스 절차, 로그 파일을 정리하는 작은 셸 스크립트까지 모두 다.

- 브랜치 사용하기

 

느낀 점

 프로젝트에서 버전관리 시스템은 필수라고 생각한다. 이번 주제에서 '특정 브랜치에서 푸시를 하면 시스템을 빌드하고 테스트를 수행한 다음, 테스트가 성공하면 새로운 코드를 서비스에 배포한다.'라는 내용이 있는데, 현재 회사에서도 이렇게 당연히 진행되어야 하는 반복적인 작업을 자동화 하는 방법을 진행하고 있다. 내가 직접 만들어 본적은 없어서 이런 작업이 어떤식으로 진행되는지 알아 볼 필요가 있어 보였다.

Topic 17셸 가지고 놀기 , Topic 18 파워 에디팅

 

Topic 17셸 가지고 놀기

기억할 내용

- GUI는~ 자신에게 꼭 맞는 '매크로 도구'를 만들 수 없다.

- GUI에 장점은 WYSIWYG(What You See Is What You Get)보는 것이 여러분이 얻는 것이라면, 단점은 WYSIAYG(Waht You See Is All You Get, 보는 것이 전부다. 111p

- 자신 만의 셸 만들기

- GUI에서 수동으로 하는 작업있으면 자동화할 수 있는 법 알아보기

 

느낀 점

 수동적인 작업을 할때 자동화를 하고 싶거나, 커스텀한 동작을 단축키 하나로 할 수 있는 방법이 있을까 이런 생각을 한 적이 있었는데, 이 방법이 아닐까 생각이 들었다. 

 

Topic 18 파워 에디팅

기억할 내용

- 에디터를 유창하게 쓸 쑤 있게 해라

- 유창해지는 것의 가장~ 생각이 자유롭게 흐를 것이고 프로그래밍에 큰 도움이 될 것이다.

- 어떤 것이 '유창'한 것인가.

- 텍스트를 편집할때 문자, 단어, 줄 문단 단위로 커서를 이동하거나 내용을 선택하라

- 코드를 편집할 때 반대쪽 괄호로 이동하거나, 함수, 모듈 등 다양한 문법 단위로 커서로 이동하라

- 변경한 코드의 들여쓰기를 자동으로 맞춰라

- 무엇가 같은 일을 반복하는 것을 발견할 때마다 이렇게 생각하는 습관을 들여라, '분명 더 나은 방법이 있을 텐데.' 그리고 더 나은 방법이 있는지 찾아보라.

- 에디터 성장시키기

- 명백한 한계에 봉착한다면 필요한 기능을 추가하는 확장 기능을 찾아보라

- 사용하는 에디터의 확장 기능 언어를 파헤쳐라 보라. 여러분이 늘 하는 반복적인 일을 자동화할 방법을 연구해 보라

 

느낀 점

 작업을 할 때 마우스가 아닌 키보드로 화면을 자유재자로 이동하거나 커서를 쉽게 이동하는 사람들이 있다. 키보드와 마우스를 왔다 갔다 하는 시간을 단축시키고, 수동으로 반복적인 일들을 자동화하는 방법으로 작업 능률이 늘어난다고 생각이 들었다. 여기서 제시한 도전 과제를 연습해야겠다는 생각이 들었다.

Topic 16 일반텍스트의 힘 

기억할 내용

- HTML,JSON,YAML,HTTP, SMTP, IMAP 등이 일반텍스트이다. 106p

- 지원 중단에 대한 보험 (형태의 데이터와 그 자체만으로 의미가 드러나는 데이터는 다른 어떤 형태의 데이터보다, 심지어 그 데이터를 생성한 애플리케이션보다 더 오래 살아남을 것이다.) 107p

- 기존 도구의 활용 (버전 관리 시스템에서 에디터, 명령 줄 도구에 이르기까지 컴퓨터 세계의 거의 모든 도구는 일반 텍스트를 다룰 수 있다. 108p

- 더 쉬운 테스트 (시스템 테스트에 합성 데이터를 일반 텍스트로 표현하면 특별한 도구를 만들 필요 없이 간단하게 테스트 데이터를 추가하거나 수정할 수 있다.) 109p

- 최소 공통분모 (널리 퍼져있고, 미래에도 살아 남을 것이다.)
 

느낀 점

 일반 텍스트가 무엇인가 했지만, 사람이 직접 읽고 이해할 수 있는 형태의 인쇄가능한 문자로 이루어진 텍스트를 말하는 것이다. 더 나은 테스트를 하고, 더 쉬운 테스트 환경을 만들기 위해서는 이번 주제와 Topic 17(셀 가지고 놀기)을 잘 다룰 줄 알아야겠다는 생각이 들었다. 하지만 이런 부분도 단점은 존재한다. 보통 포맷형태가 공간을 많이 차지한다. 바로 읽기가 쉬워 보안에는 약할 수 있다. 

Topic 15 추정

기억할 내용

- 추정하는 법을 배우고 측정 능력을 계발하여 ~ 직관적으로 이것이 가능한지 판단할 수 있게 된다. 94p
- 얼마나 정확해야 충분히 정확한가? ~ 무언가를 끝내는 데 근무일 기준으로 약 130일 동안 일해야 한다고 말하면 드는 사람은 실제 소요 기간이 추정과 상당히 비슷하리라 기대할 것이다. 하지만 "아, 대략 6달 정도 걸리겠군요"라고 말하면 지금부터 5~7달 사이 언젠가쯤 끝날 것 이라 여길 것이다. 두 숫자는 같은 기간을 이야기하지만 '130일'은 실제 여러분의 느낌보다 더 정확도가 높으이라는 인상을 풍길 수 있다. 95p
- 추정치는 어디에서 나오는가?
1. 그 일을 해본 사람에게 물어보라
2. 무엇을 묻고 있는지 이해하라
3. 시스템의 모델을 만들어라 ( 기본적인 것만 갖춘 개략적인 모델을 만들어 보라, 조직이 개발하는 동안 사용할 발판, 밑그림이 될것이다.) 97p
4.모델을 컴포넌트로 나눠라
5. 각 매개 변수에 값을 할당하라 (결과에 가장 큰 영향을 미치는 매개 변수를 찾아서 이 매개 변수의 값을 최대한 정확하게 산출해 내는 것이다.) 98p
6. 여러분의 추정 실력을 기록하라 (나중에 이 값이 실제 결과에 얼마나 가까웠는지를 평가해 보면 정말 좋을 것 이다.)
- 프로젝트 일 추정하기
1. 미사일에 페인트 칠하기(숫자 하나로 대답해야만 하는 상황이 아니라면 숫자 하나가 아니라 여러가지 시나리오로 추정한다.)
2. 코끼리 먹기(단계를 작은 단위로 나누어 점증적으로 )
- 계산한 추정치를 기록으로 남겨라. 그리고 각 추정치가 얼마나 정확했는지 기록으로 남겨라. 오차가 50%이상이라면 잘못된 추정치를 내게 된 원인이 무엇인지 찾아보라
 

느낀 점

 실제로 작업을 할때는 일정을 추정하기가 쉽지 않았다. 작업을 진행하다가 예상치못한 요인 코드뿐만 아니라 외부 요인까지..내기 해보진 않은 일이라면 더더욱 어려웠다. 여기서 제시한 방법을 활용하며 일정산정 방법을 가다듬고 결과에 따라 정확도가 얼마나 떨어지는지 점검해보는 연습을 해야겠다. (뭐든지 사실 생각만 하는 것보다는 실제로 적용해보아야 안다.)

Topic 13 프로토타입과 포스트잇

기억할 내용

-  프로토타입 ~ 위험 요소를 노출시킨 후, 이를 매우 저렴한 비용으로 바로잡을 기회를 얻는 것이다. 80p

-  프로토타입은 빠르게 개발할 수 있다.  ~ 여러분에게 당장 중요하지 않은 세부사항이라면 추후에 사용자에게 매우 중요해질지도 모르지만 일단 무시하면서 코딩할 수 있다.

- 세부 사항을 포기할 수 없는 환경에 처해 있다면 진짜로 프로토 타입을 만들고 있는 게 맞는지 자문해 보라.

- 프로토 타입 대상은 ~ 증명되지 않았거나, 실험정이거나, 의심이 가는것, 마음이 편하지 않은 것 모두가 프로토타이핑의 대상이 될 수 있다. 81p

- 프로토타이핑의 가치는 생산한 코드에 있는것이 아니라 이를 통해 배우는 교훈에 있다.

- 아키텍처를 프로토타이핑할 때는 코드를 작성하지 않고 화이트보드, 포스트잇, 인덱스카드 등을 사용해도 된다. 83p

- 프로토타팁임을 모르는 사람에게는 오해를 살 정도로 매력적일 수도 있기 때문에 ~ 이 코드는 폐기할 것이고, 불완전하며, 완성할 수 없다는 사실을 분명히 주지시켜야 한다.

 

느낀 점

- 이책에서 말하는 예광탄, 프로토타입 각각 장단점이 있고, 요구되는 목적, 특성에 따라 선택이 필요하다. 나는 평소에 프로토타입이라고 생각했지만 예광탄에 가까운 작업을 선 작업을 했던 것 같다. 프로토타입은 없어질 코드이며, 코드는 남지 않고 작업하면서 이를 통해 배우는 교훈에 있다는 말이 포인트라고 생각했다. 

+ Recent posts