Author Archives: slime

블랙핑크 로제의 보컬의 특징

 

블랙핑크 로제(Rosé)의 보컬은 독특하고 감성적인 음색으로, 그녀만의 매력을 잘 표현합니다. 로제의 목소리는 블랙핑크 노래에서 매우 중요한 역할을 하며, 전 세계 팬들에게 깊은 인상을 주고 있습니다. 그녀의 보컬 특징은 다음과 같습니다:

1. 감성적인 음색

• 로제의 목소리는 맑고 서정적이면서도 약간 허스키한 톤을 가지고 있어 매우 감정적이고 따뜻하게 들립니다. 이 허스키한 음색은 그녀의 보컬을 더 개성 있고 감성적으로 만듭니다. 노래의 감정선을 잘 표현하여 듣는 이들에게 강한 감정적 울림을 줍니다.

2. 맑은 고음

• 로제는 고음에서 특히 맑고 깨끗한 소리를 낼 수 있는 능력이 뛰어납니다. 고음이 힘차면서도 부드럽게 이어지며, 목소리의 깊이를 더합니다. 블랙핑크 곡에서 후렴구나 클라이맥스 부분에서 그녀의 고음이 돋보이는 경우가 많습니다.

3. 독특한 발음과 딕션

• 로제는 호주에서 자라서 영어가 모국어인 덕분에 영어 가사에서도 자연스러운 발음과 유려한 딕션을 자랑합니다. 한국어 가사에서도 특유의 발음 스타일이 반영되어 있어 그녀의 목소리가 더욱 독특하게 들립니다.

4. 강렬한 감정 표현

• 로제는 노래에서 감정의 변화와 깊이를 잘 표현합니다. 발라드나 감성적인 노래에서 슬픔이나 고독함 같은 감정을 강하게 드러낼 수 있으며, 댄스곡에서도 강렬한 에너지를 전달할 수 있는 보컬 스타일을 가지고 있습니다. 이러한 감정 표현 능력은 그녀의 솔로곡인 “On The Ground”나 “Gone”에서 특히 두드러집니다.

5. 유연한 보컬 컨트롤

• 로제는 자신만의 보컬 스타일을 잘 유지하면서도 다양한 장르에서 유연하게 보컬을 조절할 수 있는 능력이 있습니다. 블랙핑크의 곡들은 힙합, EDM, 팝, 발라드 등 다양한 장르를 포함하는데, 로제는 각 장르에 맞게 목소리의 텍스처와 강약을 조절하며 자연스럽게 소화해냅니다.

6. 탄탄한 라이브 실력

• 로제는 무대 위에서도 안정된 라이브 실력을 보여주며, 춤을 추면서도 흔들리지 않는 보컬로 공연을 진행할 수 있는 능력이 있습니다. 라이브 공연에서 그녀의 보컬은 음원과 큰 차이가 없을 정도로 안정적이며, 특히 감정적인 곡에서는 라이브로 듣는 것이 더 매력적입니다.

로제의 보컬은 블랙핑크의 음악에 감성적 깊이와 독특한 개성을 더해주며, 그녀의 솔로 활동에서도 큰 강점으로 작용하고 있습니다.

인디 해커, 1인 개발자 사업가

인디 해커(indie hacker) 또는 1인 개발 사업은 혼자서 독립적으로 소프트웨어나 서비스를 개발하고, 이를 통해 수익을 창출하는 형태의 창업을 의미합니다. 일반적으로 스타트업과 달리, 외부 투자 없이 자기 자금이나 작은 규모의 자원을 활용해 자립하는 것이 특징입니다.


인디 해커가 되는 과정은 보통 다음과 같은 단계를 거칩니다:


1. 아이디어 선정: 사용자의 문제를 해결할 수 있는 독창적인 아이디어를 찾습니다.

2. 개발: 혼자서 코딩, 디자인, 배포 등 모든 개발 과정을 직접 수행합니다.

3. 런칭: 제품을 웹사이트, 앱스토어, 또는 소셜미디어 등을 통해 공개하고 홍보합니다.

4. 마케팅 및 판매: 초기 사용자를 확보하고, 꾸준한 피드백을 통해 제품을 개선하면서 수익을 창출할 수 있는 방법을 찾습니다.

5. 유지 및 확장: 수익 모델이 안정화되면 계속해서 제품을 관리하거나 확장할지, 또는 새로운 아이디어를 개발할지 결정합니다.


대표적인 예로 SaaS(서비스형 소프트웨어), 모바일 애플리케이션, 디지털 제품(예: 온라인 강의, 이북) 등을 많이 개발합니다.


인디 해커 활동의 장점으로는 유연한 일정 관리, 창의적인 통제권, 그리고 작은 규모에서도 큰 성공을 이룰 가능성이 있습니다.


2011 iMac 에서 Plex 서버

 할아버지 2011 아이맥을 Plex 서버로 돌리고 있는데 기가비트 이더넷에 꼽고 이 아이맥의 내장 하드에서 다른 기가비트 이더넷으로 연결한 컴으로 파일 복사를 하면 100MB/s 이 쉽게 나옵니다만 아이맥의 외장 하드로 부터 복사를 하면 40MB/s 언저리도 겨우 나옵니다… 이 아이맥의 UBS2 의 최대속도가 480Mbps 라… 기가비트 이더넷은 개살구임. 물론 10Gb Thunderbolt 포트가 있지만 Mini DP 형태의 썬더볼트 지원 외장하드 케이스는 구하기도 힘들고 재고가 있다해도 배보다 배꼽이 커지지요. UBS2 외장 하드로도 Plex 서버로 쓰는데는 충분함.

메타의 Threads

메타의 Threads 가 작년 7월 5일에 오픈했고, 다음날인가 내 첫 포스팅… 반년이상 눈팅만하다 최근에 눈에 띄이는 글들에 댓글을 조금 달고 있는데… 형태는 비슷하지만 트위터와는 결이 다름. 일단 얼마전까지 유행했던 Clubhouse. 요즘 그 곳을 언급하는 사람 거의 없고 페북이나 X 에서 Threads 를 더 언급함. 잠깐 유행이 될지, X, 인스타, 페북처럼 큰 자리를 잡을지는 아직은 나는 관망중. My 1st posting on Theread: https://www.threads.net/@sexydeveloper/post/CuX5ngusHr2?xmt=AQGzrKUfDJkBejgz0_KzvXSN-DtDzLRrI51ILeM3b6upLw

iOS error – Canvas area exceeds the maximum limit (width * height > 16,777,216)

웹에서 그림을 그리기 위해 캔버스 개체를 생성하는데 FHD (1920×1080) 로 캔버스를 생성해 만든 앱이 iOS 의 사파리나 크롬, 앳지에서 올려보면 Canvas area exceeds the maximum limit (width * height > 16,777,216) 이런 에러를 개발자 모드에서 보이며 실행 안됨. 근데 1920×1080 = 2,073,600 로 제한을 넘어가지 않는데도 이 에러가 난다는 심오한 문제? 눈치챘겠지만 레티나 디스플레이 때문임. 해상도가 높다보니 window 개체의 device pixel ratio 속성이 3 이야 그러니 물리적으로 (1920×3) x (1080×3) = 18,662,400 를 논리적 1920×1080 짜리 캔버스로 생성하려고 하니 에러가 남. 구글링해보면 몇가지 방법이 (생성형 AI 들은 앞에 설명한 내용을 내가 써주기 전까지 제대로 모름) 있는데, 일반적으로 iOS 제한 픽셀 / (1920×3) x (1080×3) = 0.89… 이 비율로 캔버스를 생성하고 그려진 내용을 이 비율로 zoom out 시켜서 표시… 열라 귀찮긴한데… 여하튼 그렇게 해야 표시됨. 돈받고 하니 하지 안 그럼 모르고 있을 일이지 않을까? ㅋ 

Streptosquarus Shape Count

 

A bacteria called streptosquarus comes in very peculiar shapes. The streptosquarus is flat with no perceived thickness. (It is essentially two-dimensional.) It is composed of an integer number of unit squares.

In addition, all the squares in the streptosquarus must be touching at least one other square of the bacteria along edges. 

Write a program that takes a positive integer from the user and returns the number of possible different streptosquarus shapes of that size. Notice that there is only one streptosquarus of sizes one and two, but there are two of size three, five of size four, and 12 of size five.

모든 가능한 스트렙토스쿼러스의 형태를 생성하고, 회전과 대칭에 의한 중복을 제거하여 유일한 형태의 수를 계산해야 합니다. 회전과 대칭을 확인하는 로직을 추가하여 중복을 제거하는 것이 핵심입니다.

이 알고리즘은 크기가 커질수록 매우 느려질 수 있으므로, 크기가 5를 초과하는 경우에는 실행 시간을 고려해야 합니다.

from collections import deque


def generate_streptosquarus(n):
if n == 1:
return 1

# All possible moves from a square
moves = [(0, 1), (1, 0), (0, -1), (-1, 0)]

# Generate all possible shapes by adding a square to each exposed edge
def generate_shapes(current_shape):
new_shapes = set()
for x, y in current_shape:
for dx, dy in moves:
new_pos = (x + dx, y + dy)
if new_pos not in current_shape:
new_shape = current_shape | {new_pos}
new_shapes.add(frozenset(new_shape))
return new_shapes

# Normalize shapes by rotating and flipping to remove duplicates
def normalize(shape):
# Convert frozenset to a sorted list of tuples to allow rotations and flips
shape = sorted(shape)

def rotate(shape):
return sorted((y, -x) for x, y in shape)

def flip(shape):
return sorted((-x, y) for x, y in shape)

# Generate all unique rotations and flips of the shape
unique_transforms = {tuple(shape)}
for _ in range(3): # Rotate three more times
shape = rotate(shape)
unique_transforms.add(tuple(shape))

# Flip the shape and get all its rotations
shape = flip(shape)
unique_transforms.add(tuple(shape))
for _ in range(3): # Rotate three more times
shape = rotate(shape)
unique_transforms.add(tuple(shape))

# Normalize to ensure all shapes start from (0, 0)
def normalize_shape(transform):
min_x = min(x for x, y in transform)
min_y = min(y for x, y in transform)
return tuple((x - min_x, y - min_y) for x, y in transform)

normalized_shapes = set(normalize_shape(transform) for transform in unique_transforms)
return min(normalized_shapes) # Return the smallest normalized shape

# Use a set to store all unique shapes
unique_shapes = set()

# Starting queue with a single square
queue = deque([frozenset([(0, 0)])])
while queue:
shape = queue.popleft()
if len(shape) == n:
norm_shape = normalize(shape)
unique_shapes.add(norm_shape)
else:
for new_shape in generate_shapes(shape):
queue.append(new_shape)

return len(unique_shapes)


# Example usage
def main():
print("Enter a positive integer or 'q' to quit.")
while True:
user_input = input("Enter a integer number or 'q' to quit: ")
if user_input.lower() == 'q':
print("Program has ended.")
break
try:
n = int(user_input)
if n < 1:
print("Warning: Please enter a positive integer.")
elif n > 6:
print("Warning: Calculations for numbers greater than 6 may be slow.")
result = generate_streptosquarus(n)
print(f"Number of possible shapes for a streptosquarus of size {n}: {result}")
except ValueError:
print("Warning: Please enter a valid integer or 'q' to quit.")


if __name__ == "__main__":
main()

플러터 함수 호출 앞에 const 붙이는게 된 이유

위의 플러터 앱 진입점에 있는 main() 함수에서, 예전에는 안 붙이던 MyApp() 앞에 const 가 붙게 되었습니다. 

runApp(const MyApp()); 

이거나

const MyApp({super.key});

이 곳에 const 는 왜 붙이게 되었는가? Flutter에서 const 키워드를 사용하는 것은 최적화와 관련된 중요한 부분입니다. const 키워드를 사용하여 위젯을 선언하면, Flutter는 그 위젯을 위젯 트리에 한 번만 생성하고, 다시 빌드할 필요가 없는 경우 재사용합니다. 이것은 특히 상태가 변하지 않는(static) 위젯에 유용합니다.

이전 버전의 Flutter에서는 const의 사용이 필수적이지 않았습니다. 하지만, Flutter의 성능을 향상시키고, 앱의 메모리 사용량을 줄이기 위해 const 키워드의 사용이 점점 더 권장되었습니다.

const를 사용하는 주요 이점은

메모리 효율성: const로 생성된 객체는 컴파일 시간에 생성되며, 런타임에는 같은 객체를 재사용합니다. 이는 메모리 사용량을 줄이는 데 도움이 됩니다.

성능 향상: const 위젯은 상태가 변하지 않으므로, Flutter 프레임워크가 위젯을 다시 빌드할 필요가 없습니다. 이는 렌더링 성능을 향상시키는 데 도움이 됩니다.

코드 가독성: const를 사용하면 해당 객체가 변경 불가능하다는 것을 명확하게 알 수 있으며, 이는 코드의 가독성과 유지 보수성을 향상시킵니다.

예를 들어, runApp(const MyApp());에서 const MyApp()은 MyApp 위젯이 상태를 가지지 않고, 그 인스턴스가 변경될 필요가 없음을 나타냅니다. 마찬가지로, const MyApp({super.key});는 MyApp의 생성자가 항상 동일한 인스턴스를 반환하도록 보장합니다.

이러한 최적화는 특히 대규모 앱 또는 복잡한 UI를 가진 앱에서 더욱 중요해집니다. 따라서 최신 Flutter 개발에서는 const의 사용이 더욱 강조되고 있습니다. 

#플러터 #Flutter #상수형 #const

UGREEN 1-IN 2-OUT Bidirectional HDMI Switcher 4K 60Hz

오늘 사용해 본 제품은 UGREEN 의 Bidirectional HDMI Switcher 4K 60Hz 제품입니다. 

Bidirectional 이기 때문에 2 in 1 Out, HDMI Splitter 로 쓰거나 1 in 2 Out HDMI Selector 로 쓸수 있습니다.

액스박스와 플레이스테이션에 1개 모니터가 있을 때 하고싶은 게임기를 모니터에 연결하는 것으로 쓸 수 있고요. 

한개의 컴퓨터 출력을 오늘은 왼쪽 모니터, 내일은 오른쪽 모니터에서 보고 싶을 때 이럴 때 사용할 수 있는 것이죠.

저는 한쪽은 맥에 한쪽은 윈도에 연결해서 한개의 모니터로 출력하는데 쓰려고 샀습니다.

전환 속도는 그렇게 빠르지 않아서 라이브 방송에서 쓸만하지는 않겠네요. 캐나다 아마존 현재 가격은 19불입니다.

슬라임의 간단 리뷰 였습니다.

Phaser JS game framework

Phaser는 HTML5 게임 프레임워크 입니다:

이는 캔버스 및 WebGL을 사용하여 데스크탑과 모바일 브라우저에서 동작하는 2D 게임을 만드는 데 사용됩니다. Phaser는 개방적이고 활발한 커뮤니티와 함께, 매우 포괄적인 문서와 예제를 제공하고 있어 개발자들이 쉽게 게임을 개발할 수 있도록 돕습니다.

Phaser를 사용하는 개발자는 JavaScript 또는 TypeScript를 사용하여 게임을 작성할 수 있으며, 프레임워크는 물리 엔진, 스프라이트, 입출력, 사운드 및 음악, 상태 관리 등 게임 개발에 필요한 다양한 기능들을 제공합니다.

Phaser의 주요 특징은 다음과 같습니다:

  • Canvas와 WebGL 렌더링: Phaser는 자동으로 브라우저가 지원하는 가장 적합한 렌더링 방식을 선택합니다.
  • 다양한 게임 오브젝트 지원: 텍스트, 스프라이트, 타일맵, 파티클 시스템 등 다양한 게임 오브젝트를 지원합니다.
  • 물리 엔진 통합: Arcade Physics, P2JS, Ninja Physics 등 여러 물리 엔진을 통합하여 사용할 수 있습니다.
  • 입출력: 키보드, 마우스, 터치 스크린을 위한 강력한 입력 지원을 제공합니다.
  • 애니메이션: 스프라이트 애니메이션을 쉽게 추가하고 관리할 수 있습니다.
  • 상태 관리: 게임의 다양한 상태를 관리할 수 있는 시스템을 제공합니다.
  • 자산 관리: 이미지, 오디오 파일, JSON 데이터 등의 자산을 로드하고 관리하는 로더 시스템을 가지고 있습니다.
  • 모바일 지원: 모바일 브라우저에 최적화되어 있으며, 반응형 게임을 만들 수 있습니다.

Phaser는 대표적인 오픈 소스 게임 프레임워크로, 개인 프로젝트부터 상업적인 게임 개발에 이르기까지 다양한 목적으로 사용됩니다.

ZeroMQ (0MQ, ZMQ)

 ZeroMQ (또는 0MQ, ZMQ)는 고성능 비동기 메시징 라이브러리로, 소켓 프로그래밍을 단순화하여 메시지 큐의 기능을 더 쉽고 유연하게 사용할 수 있게 해줍니다. ZeroMQ를 사용하면 다양한 메시징 패턴을 통해 분산된 시스템과 서비스 간에 데이터를 교환할 수 있습니다. 이 라이브러리는 다양한 프로그래밍 언어로 구현되어 있어, 여러 언어로 작성된 시스템 간에도 통신이 가능합니다.

ZeroMQ는 기존의 메시지 지향 미들웨어(MOM) 시스템과는 달리 브로커가 없는 아키텍처를 제공합니다. 이는 메시지를 라우팅하거나 큐잉하는 중앙 서버가 없다는 것을 의미합니다. 대신, ZeroMQ 소켓을 사용하여 직접적으로 클라이언트와 서버, 혹은 노드 간에 통신할 수 있습니다. 이는 시스템의 복잡성을 줄이고 성능을 향상시키는 데 도움을 줍니다.

ZeroMQ는 다음과 같은 여러 통신 패턴을 지원합니다:

  • 요청-응답(Request-Reply): 클라이언트-서버 패턴을 구현하며, 하나의 요청에 하나의 응답을 보냅니다.
  • 발행-구독(Publish-Subscribe): 메시지를 발행하고 여러 구독자가 메시지를 수신할 수 있는 패턴입니다.
  • 파이프라인(Push-Pull): 작업 분배자와 작업자 노드 간의 작업 부하 분산을 위한 패턴입니다.
  • 독점적 페어(Exclusive Pair): 두 노드 간의 전용 연결을 위한 패턴입니다.

ZeroMQ는 높은 확장성과 성능을 가지고 있으며, 분산 컴퓨팅, 마이크로서비스 아키텍처, 비동기 태스크 큐, 리얼타임 데이터 전송 등 다양한 분야에서 사용됩니다. 그것의 비동기 I/O 모델과 비블로킹 방식의 소켓 연산은 효율적인 리소스 사용과 빠른 데이터 처리를 가능하게 합니다.

ZeroMQ는 복잡한 네트워크 프로토콜과 통신 패턴을 추상화하여 개발자가 메시징 시스템을 더 쉽게 구축할 수 있도록 돕습니다. 이로 인해 개발자는 네트워크의 세세한 부분에 대해 걱정하지 않고도, 메시지 교환 로직에 더 집중할 수 있습니다.