[Flutter/Window] 사운드 재생(Sound Play)

Programming/Flutter 2024. 5. 30. 21:11 Posted by 생각하는로뎅
반응형

Flutter Window 용 사운드 재생을 위해서는 아래 라이브러리를 사용한다.

 

window 용 라이브러리 사용 방법이 없어서, 정리하기로 했다.

(라이브러리 소스 뒤적뒤적... )

 

 

[ Window 용 Flutter 라이브러리 Url ]

https://pub.dev/packages/audioplayers_windows/install

 

audioplayers_windows install | Flutter package

Windows implementation of audioplayers, a Flutter plugin to play multiple audio files simultaneously

pub.dev

 

 

 

1. pubspec.yaml

dependencies:
  ....
  audioplayers_windows: ^4.0.0

 

 

2. 라이브러리 Get 후, 아래 패키지를 사용이 가능하다.

import 'package:audioplayers_platform_interface/audioplayers_platform_interface.dart';

 

 

3. static 으로 구성된 instace 으로 객체를 가져 올 수 있다.

import 'package:audioplayers_platform_interface/audioplayers_platform_interface.dart';

class ... {

  // 경고 사운드
  AudioplayersPlatformInterface soundWarringPlayer = AudioplayersPlatformInterface.instance;

}

 

 

4. 사운드 파일 경로는 assets 폴더 아래에 위치(SOUND_WARRING_PATH)하였으며, 사운드 ID(SOUND_WARRING_ID) 로 여러 사운드를 구분 할 수 있다.

 

create 메소드를 호출시, stream 객체가 만들어 지는데, Future 비동기 방식이므로, then 메소드를 이용하여, 추후 stream 객체가 만들어지면, 상태 값을 받을 수 있도록 getEventStream 을 한다.

 

import 'package:audioplayers_platform_interface/audioplayers_platform_interface.dart';

class ... {

  // 경고 사운드
  final String SOUND_WARRING_ID = "SOUND_WARRING";
  final String SOUND_WARRING_PATH = "assets/sound_waring.wav";
  
  // 경고 사운드
  AudioplayersPlatformInterface soundWarringPlayer = AudioplayersPlatformInterface.instance;

  @override
  void initState() {
  
    // 경고 사운드 설정
    Future<void> soundWarringFuture = soundWarringPlayer.create(SOUND_WARRING_ID);  // 생성
    
    soundWarringFuture.then((value) {
      // 상태 값
      Stream<AudioEvent> soundWarringEvent = soundWarringPlayer.getEventStream(SOUND_WARRING_ID);
      soundWarringEvent.listen((event) {
        debugPrint(event.eventType.name);
      });

    });
    
    // 재생 url 설정
    soundWarringPlayer.setSourceUrl(SOUND_WARRING_ID, SOUND_WARRING_PATH); 
    
    // 반복 설정
    soundWarringPlayer.setReleaseMode(SOUND_WARRING_ID, ReleaseMode.loop);
    
  }
}

 

 

5. 아래 소스를 주석하면, 1번만 재생이 가능하고, 종료시 상태값 AudioEventType.complete (complete) 값을 받을 수 있다.

 

ReleseMode.loop 는 stop 시, complete  값은 들어오지 않고, seekComplete(AudioEventType.seekComplete) 값만 들어온다.

soundWarringPlayer.setReleaseMode(SOUND_WARRING_ID, ReleaseMode.loop);  // 반복 설정

 

 

6. 사운드 플레이가 가능하다.   

soundWarringPlayer.resume(SOUND_WARRING_ID);

 

 

7. 사운드 중지가 가능하다.

soundWarringPlayer.stop(SOUND_WARRING_ID);

 

 

8. 사운드 중지 후, relese 와 dispose 후에는 resume 을 수행하여도 사운드는 재생되지 않는다.

soundWarringPlayer.stop(SOUND_WARRING_ID);
soundWarringPlayer.release(SOUND_WARRING_ID);
soundWarringPlayer.dispose(SOUND_WARRING_ID);

 

반응형
반응형

MongoDB 에서 보내오는 Date Format 형식은 아래와 같다.

 

yyyy-MM-dd'T'HH:mm:ss.SSS'Z'

2024-04-06T07:27:00.000Z

 

 

해당 날짜는 한국 시간과 일치하지 않아, 변환이 필요하다.

 

변환 도중 실패한 사례는 아래와 같다.

import java.text.SimpleDateFormat
import java.util.Date

var dateFormat = SimpleDateFormat("yyyy.MM.dd HH:mm", Locale.KOREAN)
val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US)
dateFormat.timeZone = TimeZone.getTimeZone("Asia/Seoul")

val date : Date? = sdf.parse("2024-04-06T07:27:00.000Z")

date?.let {
    Log.d("test_date", dateFormat.format(it))
}

 

위 코드는 에뮬레이터에서는 정상 동작하였으나, 실제 디바이스에서는 변환이 되지 않는 현상이 있었다.

 

 

그래서, 아래 코드로 적용 후에는 실제 디바이스에서도 변환이 정상적으로 가능하게 되었다.

 

import java.time.OffsetDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter

val zone = ZoneId.of("Asia/Seoul")
val fmt = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm", Locale.getDefault())

val dateTime = OffsetDateTime.parse("2024-04-06T07:27:00.000Z").atZoneSameInstant(zone)

dateTime?.let {
    Log.d("test_date", fmt.format(it))
}

 

반응형

[MongoDB] 랜섬웨어 (READ__ME_TO_RECOVER_YOUR_DATA)

Programming/Node.js 2024. 4. 6. 14:06 Posted by 생각하는로뎅
반응형

MongoDB 데이터 입력 후 자꾸 어느 순간 데이터가 증발하는 현상이 발생했다.

 

그리고 이상한 테이블과 글자가 아래 처럼 나타났다.

 

READ__ME_TO_RECOVER_YOUR_DATA

All your data is backed up. You must pay 0.0060 BTC to ~~~~~ In 48 hours, your data will be publicly disclosed and deleted. (more information: go to http://iplis.ru/data01)After paying send mail to us: rambler+11z39t@onionmail.org and we will provide a link for you to download your data. Your DBCODE is: 11Z39T

 

모든 데이터가 백업됩니다. ~~~~` 에 0.0060 BTC를 지불해야 합니다. 48시간 내에 귀하의 데이터가 공개되고 삭제됩니다. (자세한 정보: http://iplis.ru/data01로 이동) 비용을 지불한 후 rambler+11z39t@onionmail.org로 메일을 보내주시면 데이터를 다운로드할 수 있는 링크를 제공해드립니다. 귀하의 DBCODE는 11Z39T입니다.

 

검색해보니 랜섬웨어 란다. 

 

 

MongoDB 는 기 설치시 계정이 없이 admin 권한으로 접속이 가능하고, 또한 외부 망에서 접근이 안되게 설정 되어 있다.

 

툴킷으로 외부에서 접속해야했기에, 외부 허용으로 하는 순간..... 이렇게 랜섬웨어에 당하는 것이었다....!!

 

그래서 아래 처럼, 인증을 해야지 접속이 가능하도록 수정하였다.

 

 

1. mongod.conf 파일 위치를 찾는다.

ps -ef | grep mongo

 

 

 

2. vi 편집기로 연다.

vi /etc/mongod.conf

 

 

3. 아래 처럼 security 를 설정한다.

security:
  authorization: enabled

 

 

4. MongDB 를  재기동 한다.

sudo systemctl restart mongod.service

 

반응형