소녀전선 1-4E(야간)

요즘 핫하다는 소녀전선.

거창한 공략은 아니고 그냥 이제 막 야간을 시작할 때 참고될겸 스프링필드의 전용 아이템 입수자랑(…).

1. 제대 능력 및 장비




(M14는 1-4E 도는중에 렙업되었고 신경을 안써서-_-a 세번째 장비가 없는상태)

이제 막 야간을 돌기위한 세팅

– 딜이 안되어도 되므로 시야확보를 위해 HG(권총)을 소지하는게 좋음
– AR(돌격소총)은 야시장비를 지니는것이 좋음 (제작하거나 1-1E에서 몇개 주워두면 됨)
– RF(소총)은 철갑탄 필수 (이것또한 제작하거나 1-1E에서 몇개 주워두면 됨)
– 나머지 아이템은 그냥 있는대로 착용

두번째 턴까지는 모든 영상이 다 동일하다. 세번째부터는 적들이 어디에있는지 고민조금 하다보면 대략 어디로 갈지 감을 잡을 수 있다. 첫 제대가 탄약 부족을 겪지않을 가장 확실한 방법은 2턴 돌입할 때 두번째 제대와 교체하여 탄약을 보충하면 된다. 턴은 그렇게 빠듯하지 않지만 아래 영상 중 위쪽에 끼리끼리 모여서 돌아다니는 경우가 발생하는데 자칫 클리어 못할 수 있어도 그런 경우 지금까지 두번밖에 겪지 못했다.

– 첫번째 영상

– 두번째 영상

– 세번째 영상

– 네번째 영상

– 다섯번째 영상

– 여섯번째 영상

G36하고 스프링필드에 언제부턴가 정들어버렸다(…)

녹화를 시작한지 여섯번째만에 흭득.

실제로는 25번만에 획득했지만 처음엔 뭣도 몰라서 실패도했으므로 대략 20번만에 얻은것같다.

전용템은 보스 전투 S랭크, 전투 승리 S랭크 보상. 이렇게 얻을 기회가 총 두번있다고한다.

하… 얼마나 더 좋아질지는 뭐 그다지 기대는 하지말고 교정까지 해야 그나마 좀 나아지는거같다. 어떤사람은 기대했다가 그대로 코어로 갈았다고한다(…). 정도 들었고-_-a 지금가지고있는것 중 쓸만한 총기이니 써야지(…).

img (raw image) 파일 마운트하기

마운트 하기위해서 당연하겠지만 관리자 권한이 있어야한다.
kpartx를 실행하여 없다면 우분투 기준으로 sudo apt install kpartx 하여 설치한다.
(sudo -i 명령으로 루트쉘을 얻는것이 편하다.)

아래 명령들은 루트 쉘을 얻은상태 기준으로 설명한다.

kpartx -v filename.img 명령을 실행하면 아래와같이 파티션 맵 정보가 표시된다.

root@ubuntu:/home/iruis# kpartx -v sdcard.img
loop0p1 : 0 65536 /dev/loop0 1
loop0p2 : 0 756470 /dev/loop0 65537
loop0p3 : 0 30468096 /dev/loop0 823296
loop deleted : /dev/loop0
root@ubuntu:/home/iruis#

이건 그냥 정보만 보는것이고 -a 옵션을 붙이면 /dev/mapper 폴더 아래 loop0p1와같은 이름으로 디바이스가 매핑된다. (-v 옵션은 자세한 정보를 표시하는 옵션.)

root@ubuntu:/home/iruis# kpartx -a -v sdcard.img
add map loop0p1 (252:0): 0 65536 linear 7:0 1
add map loop0p2 (252:1): 0 756470 linear 7:0 65537
add map loop0p3 (252:2): 0 30468096 linear 7:0 823296
root@ubuntu:/home/iruis#

이제 mount /dev/mapper/loop0p1 /mnt와같은 명령으로 마운트하여 이미지 내용을 보거나 수정할 수 있다.

작업을 끝내면 마운트 명령으로 마운트한 파일 시스템을 전부 언마운트하고 kpartx -d sdcard.img와같이 -d 옵션을 붙여 attach한 파일 이름을 넣으면 매핑된 디바이스를 지울 수 있다. (마찬가지로 -v 옵션을 넣으면 자세한 정보가 표시된다.)

root@ubuntu:/home/iruis# kpartx -d -v sdcard.img
del devmap : loop0p3
del devmap : loop0p2
del devmap : loop0p1
loop deleted : /dev/loop0
root@ubuntu:/home/iruis#

뭔가 다른 방법도 있던거같은데… 이 방법도 간편해서 넘어가야겠다(…).

Bluetooth A2DP on Linux

– 삽질 기록용 –

라즈베리파이의 블루투스를 사용해서 aux단자 출력을 하려했는데… 연결된 장치에서 전송하는 포맷에따라서 디코딩이 실시간으로 안되어 툭툭 끊기는 현상이있었다(…)

결국 메인 PC에서 사용하고있던 인텔 듀얼링크 무선랜을 때다가 사용하고있는 젠투리눅스에 연결-_-;; (어차피 유선으로 사용하고있었고 블루투스도 연결된 기기가 없기에)

기본적으로 Gentoo Wiki의 이 페이지에 기술된 내용대로 빌드되어있으면 일부 기기(ex 안드로이드)에서 스트리밍되는 음원 재생 문제없지만, TV나 아이폰에서 전송되는 음원을 디코딩하지 못하였다. 대부분 다른 배포본 위주의 설명이라 그냥 감으로 해보았는데… 일단 성공하였다. (아직 해결되어야할게 한가지있지만.)

일단 사용한 pulseaudio의 USE 옵션은 아래와같다. 아마도 libsamplerate 이 USE 옵션이 핵심인거같다. (우분투같은경우 리소스가 너무나도 많으니 패스.)
X alsa alsa-plugin asyncns bluetooth caps dbus gdbm glib gnome gtk ipv6 libsamplerate native-headset orc qt4 realtime ssl systemd tcpd udev webrtc-aec

이제 블루투스에서 오디오를 사용하기 위해서는 아래와같이 설정한다.

/etc/bluetooth/audio.conf (기본적으로 없으므로 생성, 내용출처)

# Configuration file for the audio service

# This section contains options which are not specific to any
# particular interface
[General]

# Switch to master role for incoming connections (defaults to true)
Master=true

# If we want to disable support for specific services
# Defaults to supporting all implemented services
#Disable=Control,Source
Enable=Source

# SCO routing. Either PCM or HCI (in which case audio is routed to/from ALSA)
# Defaults to HCI
#SCORouting=PCM

# Automatically connect both A2DP and HFP/HSP profiles for incoming
# connections. Some headsets that support both profiles will only connect the
# other one automatically so the default setting of true is usually a good
# idea.
AutoConnect=true

# Headset interface specific options (i.e. options which affect how the audio
# service interacts with remote headset devices)
[Headset]

# Set to true to support HFP, false means only HSP is supported
# Defaults to true
HFP=true

# Maximum number of connected HSP/HFP devices per adapter. Defaults to 1
MaxConnected=1

# Just an example of potential config options for the other interfaces
#[A2DP]
#SBCSources=1
#MPEG12Sources=0

/etc/pulse/system.pa (마지막 부분에 추가, 내용출처)

### Automatically load driver modules for Bluetooth hardware
.ifexists module-bluetooth-policy.so
load-module module-bluetooth-policy
.endif

.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif

load-module module-switch-on-connect 도 한라인 추가하였다. 정확한 내용은… 기억 안난다. 패스.

마지막으로 아래 github 저장소에서 simple-agent.autotrust, bluezutils.py 두개의 파일을 다운받아서 simple-agent.autotrust를 실행시킨다. (이벤트를 처리안하면 오디오 연결이 안된다.)
https://github.com/BaReinhard/Super-Simple-Raspberry-Pi-Audio-Receiver-Install/tree/master/usr/local/bin

만약 장치이름을 바꾸고싶다면 /etc/bluetooth/main.conf 파일에서 Name을 바꿔주면 되고 DiscoverableTimeout 항목을 0으로 설정하면 discovering를 무한으로 한다. Policy에서 AutoEnable을 true로 설정하는것도 있던데 차이는 모르겠다.

또한 Class 항목을 0x200414로 바꾸면 오디오 장치로 블루투스가 인식된다. 일부 장치는 기본값을 사용하면 스피커 장치가 아니여서 목록에 나타나지않는다. 젠투에서는 Class 값이 적용되지않아 hciconfig hci0 class 0x200414 명령을 실행하여 변경하였다.

systemctl restart bluetooth 명령으로 서비스를 재실행하여 변경된 내용들 적용. (아마 재부팅 해야할수도있다.)

A2DP 스택이 적용되었으면 bluetoothctl에서 show 커맨드를 실행하면 아래와같이 나온다.

Controller 7C:5C:F8:D7:99:7E
        Name: BlueZ Gentoo
        Alias: BlueZ Gentoo
        Class: 0x000000
        Powered: yes
        Discoverable: yes
        Pairable: yes
        UUID: Headset AG                (00001112-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
        UUID: OBEX File Transfer        (00001106-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: OBEX Object Push          (00001105-0000-1000-8000-00805f9b34fb)
        UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
        UUID: IrMC Sync                 (00001104-0000-1000-8000-00805f9b34fb)
        UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
        UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
        UUID: Message Notification Se.. (00001133-0000-1000-8000-00805f9b34fb)
        UUID: Phonebook Access Server   (0000112f-0000-1000-8000-00805f9b34fb)
        UUID: Message Access Server     (00001132-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d052B
        Discovering: no

여기서 중요한것이 Audio Sink.

오디오 장치로 연결이 잘 되었다면 pactl list sources short명령을 치면 아래와같이 나온다.

1       alsa_output.pci-0000_00_1b.0.analog-stereo.monitor      module-alsa-card.c      s16le 2ch 48000Hz       IDLE
2       alsa_input.pci-0000_00_1b.0.analog-stereo       module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED
3       alsa_output.pci-0000_00_03.0.hdmi-stereo.monitor        module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED
7       bluez_source.F8_3F_51_27_C2_1F.a2dp_source      module-bluez5-device.c  s16le 2ch 48000Hz       RUNNING

아직은 Gnome Desktop에 사용자가 로그인되어야 음원이 출력되는 문제가있지만… 더 깊이 알아보기 귀찮다. 어차피 24시간 켜놓는것이니까 -_-;;
어차피 두면 잠금화면이 뜨기때문에 걍 다음에 의욕이 생길 때 까진 이렇게 써야겠다.

https://github.com/BaReinhard/Super-Simple-Raspberry-Pi-Audio-Receiver-Install/blob/master/usr/local/bin/volume-watcher.py 이 파일은 AVRCP 이벤트를 처리하는것이지만… 역시나 귀찮…

https://ludwig.im/en/projects/steam-pulseaudio-sound-latency-lagging-problem-noise 이것은 latency를 줄이기 위한 팁

덧) 위와같이 별별삽질 다 해봐야 무선 특유의 지연시간 사라지지않고 결국 그냥 제품으로 잘 나와있는거 사는게 정신건강과 시간적으로 더 이득이라는 생각이 드는건 안비밀. 결국 주머니 사정(…). 일단 두어달 후에 그냥 옵티컬 DAC 잘 나온거 하나 사야겠다 -_-;;

WinCrypt의 핸들은 스레드 안정성이 보장안되는거같다

영어가 안되어 크롬의 번역으로 https://stackoverflow.com/a/10807684 이 댓글을 읽어보니…

ECB 모드로 동작할때는 상태가 변경되지않아 상관없으나 기본 모드인 CBC 모드는 상태정보가 변경되기때문에 안정적이지 않다고 이해된다.
이걸 사용하면서 로직 손을 보고나서는 왜 자꾸 패킷이 깨지나했더니 이런거였구나(…) 이거때문에 거의 한달을 미궁에 빠져있었네 orz

복잡하게 처리할거는 없으니 Semaphore를 사용해서 해결해야겠다(…)

참고로 WinCrypt의 사용법 글은 이글의 바로 전 글

AES 256 암호화를 위한 WinCrypt 사용하기

MSDN에서 참고하자니… 너무나도 설명이 장황하고 API 사용에 핵심이되는걸 찾지못하여 example을 구글링하여 여차저차 짜집기하였다. 그중 가장 많은 도움이된 글은 이글이글.

만약 Crypt관련함수들 링크실패하면 헤더나 소스코드에 #pragma comment(lib, "advapi32")를 넣으면된다.

아래는 최소한의 헤더파일

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <wincrypt.h>

AES 암호화에서 안정성이 보장되는 AES 256을 기준으로 설명한다. 그 하위 AES 암호화는 KEY의 길이가 다르기때문에 필요하다면 32비트 KEY 대신 16비트 키를 사용하면… 될것이다. 나머지는 알고있기로는 동일.

필요한 변수는 아래와같다.

HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;

첫번째로 Provider를 얻어야한다.

if (CryptAcquireContext(&hCryptProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0) == FALSE) {
    return FALSE;
}

핸들을 해제하는 코드는 아래와같다. 이 핸들은 지속적으로 사용하게된다. 완전하게 사용이 끝났으면 그때 Release 해주면된다. Continue reading AES 256 암호화를 위한 WinCrypt 사용하기