23년도 ( 취업 전 23.01 ~ 23.06 )

Year 2023 (Before Getting a Job: Jan 2023 ~ Jun 2023)

 


23년도에 webOS OSE 로 끄적끄적 프로젝트 한 거 가지고 LG 전자에 취업했다.

프론트, 백엔드 구해서 한 쪽에선 쇼핑몰을 만들고

임베디드하는 사람 3인은 라즈베이파이를 활용한 쇼핑카트 대쉬보드를 만들었었다.

webOS OSE 를 올리고, 빌드 스크립트도 끄적끄적 만져가면서
이미지에 빌트인으로 앱이랑 서비스들을 추가하고 부팅시 앱이 자동 실행되도록 했었다.

 

Back in 2023, I landed a job at LG Electronics thanks to a project I had been messing around with using webOS OSE.

We recruited front-end and back-end developers to build an e-commerce mall on one side, while a team of three embedded developers (including myself) built a shopping cart dashboard using a Raspberry Pi.

We flashed webOS OSE onto it, played around with the build scripts, added built-in apps and services to the image, and configured the app to run automatically upon booting.

 

 

ESP32 12대 ( 플젝 다끝나고 1대 쇼트나서 죽음 ;;) 에 코드짜서 BLE 비콘을 만들고 데모룸에 전선작업해서 곳곳에 깔고.
I wrote code for 12 ESP32 boards (one short-circuited and died right after the project ended, lol;;) to create BLE beacons, did some wiring in the demo room, and deployed them all over the place.

 

아래와 같이 블루투스 / 와이파이 전파 신호 세기를 가지고 쇼핑카트 의 좌표계를 계산하고 신호 노이즈를 필터링해서 반환하는 인터페이스를 가진 백그라운드 서비스와.. ( GPS 원리와 동일하다, 칼만 필터링 등등 섞어서 최적화 했었다, ML 하려고 24시간 넘게 5초 단위로 데이터를 뽑았는데 값이 너무 튀어서 실패.. )

Using the Bluetooth and Wi-Fi signal strengths, I built a background service with an interface that calculates the shopping cart's coordinates and filters out signal noise. (It works on the same principle as GPS. I optimized it by mixing in Kalman filtering and other techniques. I tried to use Machine Learning by extracting data every 5 seconds for over 24 hours, but the values fluctuated too violently, so it failed...)

 

 

허접하지만 주어진 커다란 데모룸에 지형을 만들고 지도데이터를 추가하고

Though it was a bit unpolished, I created the terrain and added map data for the huge demo room we were given.

 

 

웹페이지에서 만들어놨던 장바구니들 중에서 하나 골라와서..

Then, we would fetch one of the shopping carts created on the web page...

 

DB 조회해서 지도 상에 띄우고, 뭐 경로 간단하게 나마 짜서 띄우고 하는 걸 만들었었다.. 

Query the database, display it on the map, and map out a simple route. That’s what I built.

 

전자과 전공해서 신호처리, 안테나 설계.. 무선설비기사... 테크를 탔었는데 거의 모든 스택 전부 쥐어짜서 썼던 플젝으로 기억한다.

욕토부터 API 인터페이스 설계, 신호처리, 임베디드 SW, 프론트 백엔드...

평생 잊지 못할 플젝이다. 6 주 동안 6시간 이상 잔 적이 없다.. 맨날 티격태격 싸우고.. 토론하고...

밤 샘 빌드하고.. 빌드 에러 고치고.. ( 나이틀리 빌드를 진짜 밤새가면서 했었다 )

Since I majored in Electronic Engineering, I had followed a tech track focusing on signal processing, antenna design, and getting a wireless equipment engineer license. I remember this project as one where I squeezed out and utilized literally every single stack I knew.

From Yocto to API interface design, signal processing, embedded SW, front-end, and back-end...

It’s a project I will never forget for the rest of my life. For 6 weeks, I never slept more than 6 hours a day... We were constantly bickering, arguing, and debating...

Building all night, fixing build errors... (I literally stayed up all night doing nightly builds).

 

23.06 ~ 25.09

Self QNA

 

Q1 . 그렇게 취업해서 하고 있는 일은?

A1.  LG TV에 들어가는 OS 에서 오디오 / 미디어 관련 된 일을 하고 있습니다. 

 

Q1. So, now that you got the job, what do you actually do?

A1. I work on audio and media-related features for the OS that goes into LG TVs.

 

 

 

Q2.  오 그러면 음질이랑 관련된 걸 하시나요?

A2. 반은 맞고, 반은 틀리다고 볼 수 있는데요, 주로 오디오 규격/ 포멧 / 파싱 / 입출력 관리 가 메인 업무입니다...

기술 스택으로 보자면 Gstreamer.. Codec...  Alsa... 뭐시기 일단 요즘 사람들이 "고품질 오디오를 재생하고 싶다!"

했을 때 제 손을 탄다거나 거쳐가신다 보시면 됩니다. 막 FLAC이니 MP3니 그런 것부터 방송 오디오 규격 같은 거요. 넷플릿스 오디오 규격이라던가. 유튜브.. 정확히는 오디오 디코더 관련 미디어 프레임워크 업무에요.

미디어 표준 기술 구현, 사용자 부가 기능, 기기별 스펙 관리가 제 메인 업무 입니다. 

 

Q2. Oh, so do you work on things related to sound quality?

A2. You could say that's half-right and half-wrong. My main responsibility is actually managing audio standards, formats, parsing, and input/output control.

 

In terms of the tech stack, it involves Gstreamer, Codec, Alsa, and so on. Basically, nowadays, if someone says, "I want to play high-quality audio!", you can assume it has either passed through my hands or gone through my code. Everything from FLAC and MP3 to broadcasting audio standards, or Netflix and YouTube audio specs. To be precise, I work on the media framework related to audio decoders.

Implementing media standard technologies, adding user features, and managing specs for each device model are my main duties.

 

 

 

Q3. 에... 그럼 하신 것 중 외부로 공개되는 업무들은 뭐가 있을까요?

Q3. Ah... Then what are some of the projects you’ve worked on that are publicly visible?

 

A3. https://webostv.developer.lge.com/develop/specifications/video-audio-250

 

 

 

Audio and Video Format on webOS TV 25

AudioDolby Digital, Dolby Digital Plus, AAC, MPEG-1 Layer III (MP3), Dolby AC-41), MPEG-H 3D Audio1), DTS1), DTS-HD1), DTS:X11) AudioDolby Digital, Dolby Digital Plus, AAC, PCM, Opus, DTS1), DTS-HD1), DTS:X11), MPEG-1 LayerI, II, MPEG-1 Layer III (MP3) Aud

webostv.developer.lge.com

+ 2026 추가 !

https://www.flatpanelshd.com/news.php?subaction=showfull&id=1773377506&fbclid=IwY2xjawTJLxpleHRuA2FlbQIxMQBicmlkETJmRUM2Q1VuRUlXN3MzNXZ4c3J0YwZhcHBfaWQQMjIyMDM5MTc4ODIwMDg5MgABHku8YWs-RhrkGd30iIny2LJ4A1NPQxr8Uy-DFfz-dT0OOMTO-uW7v2S6gSTJ_aem_6aM3f-Q-DmXgDi_olcJkIw

 

LG TVs gain support for Eclipsa Audio

In addition to Dolby Atmos

www.flatpanelshd.com

Eclipsa Audio 라는 포맷을 LG TV 에 추가했습니다.

 

 

 

여기에서 제 손을 거쳐간 포맷이... DTS 일부 파일 재생 관련, 그리고 25년도 TV에서 DTS 포맷 제거한 거..

MPEG-H 3D Audio, WMA, Opus 같은 게 있고요.

유튜브로 동영상 재생하면 나오는 오디오도 관여하고 있죠. 
LG TV에서 파일이 잘 재생 자체가 안된다 -> 25년도 7월 이후 출시한 제품은 제가 잘 못 한 겁니다. 뭔가 재생되고 있는데 소리 안 나오는 건 제 잘 못 아니에요. 

26년도부턴 제가 작업한게 많이 나올 겁니다.

많은 기대하셔도 좋아요.

요것들은 아직 입을 열 수는 없어요. 제가 추가한 기능 하나 만으로 막 기사도 뜬 것도 있고.. 
CES 전시회 한 것도 있고.. (위에 업데이트했습니다! )후훗... 저 잘 나가요.

아 참고로 저 문서에서 오디오와 관련된 전부는 제가 작성한 겁니다. 25년도 건 온전히 제가 작성했지요.

 

 

In this document, the formats that went through my hands include... playback support for certain DTS files, and removing the DTS format from the 2025 TVs.

There's also MPEG-H 3D Audio, WMA, and Opus.

I'm also involved in the audio that plays when you watch videos on YouTube.

If a file just straight up doesn't play on an LG TV—if the product was released after July 2025, that's my mistake. But if something is playing but no sound is coming out, that’s not my fault.

Starting from 2026, a lot of the work I did will start rolling out.

You can look forward to it.

I can't talk about those just yet. Just one feature I added actually made it into the news articles, and we even showcased it at the CES exhibition... Heh... I'm doing pretty well.

Ah, by the way, everything related to audio in that document was written by me. I completely authored the 2025 version.

 

Q4. 왜 오디오를 하시나요?

A4. 제 취미가 오디오/ 음악 감상이거든요. 음악을 하진 않지만 오디오 장비랑 뭐 이런 저런 것들에 많이 투자하고, 좋은 소리를 들으러 여기 저기 다니고, 다양한 환경을 세팅하고, 다양한 조건에서, 다양한 장르의 음악을 듣는 걸 좋아합니다.

박람회, 공연, 전시회, 박물관 가리는 거 없이 가요. 노래방이나 큰 음악 틀어놓은덴 안 가요. 제 귀는 소중하니까..

그냥 덕업일치로 만족하면서 일도하고 덕질도 하고 그러고 있어요.

Q4. Why did you choose audio?

A4. My hobby is audio gear and listening to music. I don't make music myself, but I invest a lot in audio equipment, travel around to listen to good sound, set up various environments, and enjoy listening to different genres of music under different conditions.

I go to expos, concerts, exhibitions, and museums indiscriminately. But I don't go to karaoke rooms or places that blast loud music. My ears are precious to me...

So, I'm just happily working and enjoying my hobby at the same time—a perfect alignment of work and personal passion (Deok-up-il-chi).

 

 

Q5. 이 글을 쓰는 이유는?

A5. 회사 근처로 갓 이사와서 아직 데스크탑이 없고 노트북만 있는데, 여기에 취준 자료만 남아있어서 보다가 할 게 없어서 적습니다.
낼부터는 오버워치 달릴 겁니다.

Q5. Why are you writing this post?

A5. I recently moved near the company and don't have my desktop set up yet, only my laptop. It only has my job-prep materials on it, so I was looking through them, had nothing else to do, and decided to write this.

Starting tomorrow, I'm going to grind Overwatch.

 

 

 

Q6. 앞으로 할 일은?

A6. 열심히 재미있는 일하면서 성과도 인정받고,  잘 벌고 잘 모아서 서울에 집사기.

뭐 블로그는 webOS랑 안드로이드 위주로 작성할 계획입니다. 이 외 OS 도 리뷰는 종종 할 건데,

미래에 AI가 많이 발전하면, 타겟 제품에 맞는  HW / OS 를 바로바로 각 모듈별로 짜서 바로바로 빌드가 가능한 날이 올 거라.

의미가 있으려나 싶네요.

Q6. What are your plans for the future?

A6. Work hard on fun projects, get recognized for my performance, make good money, save up, and buy a house in Seoul.

As for this blog, I plan to write mostly about webOS and Android. I'll occasionally review other OSes too, but...

If AI advances significantly in the future, a day will come when it can instantly write and build the HW/OS tailored to a target product for each module on the spot.

So I wonder if it'll even matter.

 

 

 

Q7. 10년 뒤의 나의 모습은?

A7. 날 뽑아준 기업에게 최선을.

예전에 다른 데 지원 넣으며 술마시고 다짐했었었는데, 웃기긴 하지만 이 다짐, 아직 유효합니다.

뭐 서울에 집 살 만큼 연봉은 주겠죠. 대출이랑.. 전세는 지금 얻었는데요, 아래의 기준의 이건 매맵니다.

 

Q7. Where do you see yourself in 10 years?

A7. Do my absolute best for the company that hired me.

I made this promise to myself while having a drink back when I was applying to other places. It sounds a bit funny, but that commitment is still valid.

Well, I'm sure they'll give me a salary high enough to buy a house in Seoul... along with loans... I just got a Jeonse (charter lease) place for now, but considering the criteria below, this is pretty spicy (tough).

 

 

 

 

 


App.vue


<script>
export default {
  methods:{
    getmypos() {
      // making bridge setting
      let bridge = new WebOSServiceBridge();
      let url = 'luna://com.sscart.app.service/mypos';
      let params = '{}';
      //call back func (if get scanned rssi data, it works)
      bridge.url = url;
      bridge.onservicecallback = this.getmyposcallback;
      setInterval(() => {
        bridge.call(url, params);
      }, 500);
    },
    getmyposcallback(msg) {
      let myx = JSON.parse(msg).x;
      let myy = JSON.parse(msg).y;
      this.$store.commit('SET_POS', {
        x: myx,
        y: myy
      })
    }
  },
  mounted() {
    this.getmypos();
  }
}
</script>

 

 

타겟 페이지


MYpage/ Main.Vue


<script>
...
import MartMap from "@/components/MartMap.vue"
...

export default {
  data(){
    return{
...
    }
  },
  components:{
...
},
  methods:{
...
  },
  mounted(){
    // console.log(this.$store.state.cart_x + this.$store.state.cart_y );
    var movingtarget = document.getElementById("cart-icon");
    setInterval(() => {
      movingtarget.style.top = `${7.5*this.$store.state.cart_x+8}%`
      movingtarget.style.left = `${6.4*this.$store.state.cart_y-4}%`
    }, 1000);
  },
}
</script>

 

 

 


Hosted webApp


<!--
 *
 * ChangYong Ahn.
 * SSAFY 08th, A102 first project.
 * 
 *
-->

<!DOCTYPE html>
<html>
<head>
    <script>location.href='Hosted webPage URL';</script>
</head>
<body>
</body>
</html>

JS Service


/*
 * ChangYong Ahn.
 * SSAFY 08th, A102 first project.
 * 
 */


// eslint-disable-next-line import/no-unresolved
const pkgInfo = require('./package.json');
const Service = require('webos-service');

// Create service by service name on package.json
const service = new Service(pkgInfo.name); 
const logHeader = "[" + pkgInfo.name + "]";

...

// MAKE APP SERVICE ACTIVE BACKGROUND.
service.activityManager.create('keepAlive', (activity) => {
    keepAliveActivity = activity;
    console.log('created activity');
})

// CHECK IF BLUETOOTH SERVICE POSSIBLE.
service.call('luna://com.webos.service.bluetooth2/adapter/setState', {"powered":true},function(msg) {
    console.log(JSON.stringify(msg));
    myrsp = JSON.stringify(msg);
});


...

//Other API Subsribe

//BLE Beacon Data Subscribtion
var sub = service.subscribe("luna://com.webos.service.bluetooth2/le/startScan", {"subscribe": true, "name":"ESP32"});

...



service.register("mypos",function(message){
    //console.log(logHeader, "SERVICE_METHOD_CALLED:/mypos");
    //console.log("In mypos callback");

    message.respond({
        returnValue: true,
        x:curx,
        y:cury
    });
});


...

//////만약에, 타 Service를 Subscribe 하는 Service를 만들었다면,
//////반드시, Quit으로 해당 subscribe를 꺼줄것
//////////////////Customized quit///////////////////
//////////////////////////////////////
service.register("quit", function(){
    sub.cancel();

    service.activityManager.complete(keepAliveActivity, (activity) => {
        keepAliveActivity = null;
        console.log('completed activity');
    });
});

필자는 쫌 더 좋은 스펙으로 맞춰보려고 한다.

 

요렇게 하면 USB 3.0 단자로 2.5인치 SSD를 사용할 수 있다.

MicroSD 카드는 읽기쓰기 속도가 낮은데, 이는 안드로이드 환경에서 특히 성능 저하를 유도하기 때문에, 

가능한 빠른 저장장치를 쓰자.

 

다만 이러면 이동식디스크로 인식을 하지 않기 때문에 앞서 언급한 툴들에서 SSD 를 인식하지 못한다.

곰곰히 생각해보다가, 라즈베리파이 Imager 에서 인식하길래, 여기 옵션중에 기타 이미지를 직접 선택할 수 있다는 걸 기억해내서,

여기서 포맷하고, 64비트 OS한번깔았다가 이미지를 올리는 중이다. 훨씬 빠르게 진행된다... 

 

 

필자가 가지고 있는 1280*800 10.1 인치 LCD 디스플레이에선 TWRP에 진입시 화면 송출이 되지 않는 문제가 발생했다.

( 확인 해보니, SSD, 키보드혹은 USB, 마우스동글, 디스플레이 등 4포트 전부 연결하다보니, 특히 디스플레이쪽에서 요구 전력이 커서 셧다운 되는 문제였다. -> 화면 밝기가 100퍼였는데 적당히 밝은 40퍼로 타협봐서 해결했다.)

 

그래서 컴퓨터 모니터로 전부 작업하고, 마우스와 키보드를 활용하여 조작할 예정이다.

 

거진 5년? 10년만에 롬질 하는 거라... TWRP에서 USB마우스가 인식되는 걸 보며 까무러칠뻔했다...

 

config.txt

# Boot device
#dtoverlay=android-sdcard
dtoverlay=android-usb

요걸로 바꿔준다.

 

아 그리고 리파티션에 관해서, 기본 시스템 저장공간이 작은 편이기에, GApps에서 Core로 받아서 진행하겠다.

( 리파티션 정상적으로 끝나면 저장공간이 넉넉해진다. 추후 Full로 받아도 될 것 같다.) 

프로젝트에서도 그렇게 큰 용량은 필요할 것 같지도 않기도 하고.

 

왜 그럼 SSD를 쓰냐고 묻는다면, 특가였기 때문이다. 512기가에 SATA 규격 거진 종결 스펙인 550/500 정도인 SSD가 단돈 38000원 언저리였다. 당일 배송에.

그리고 라즈베리파이 + 안드로이드 + SSD 부팅이라는 혼종이라면, 팀 빌딩에서 이목을 끌 수 있을 것  같아서다.

 

 

USB 부팅을 위해선, 기존 SD카드를 활용하여 라즈비안 OS를 올린 뒤, 그 위에서 EEPROM(부트로더)을 업데이트 해줘야한다.

 

라즈비안OS 에서 EEPROM 업데이트 할 때 쓰는 명령어들.

sudo apt update
sudo apt full-upgrade
sudo reboot


sudo rpi-eeprom-update


사용 가능한 업데이트가 있으면 다음을 사용하여 설치할 수 있습니다.
sudo rpi-eeprom-update -a
sudo reboot


현재 EEPROM 버전 읽기
vcgencmd bootloader_version




EEPROM 이미지에서 구성 파일 읽기

rpi-eeprom-config pieeprom.bin

현재 부트 로더 구성 편집

sudo -E rpi-eeprom-config --edit
sudo reboot

저장된 구성 파일 적용
sudo rpi-eeprom-config --apply boot.conf
sudo reboot

 

성공!

 

이제 SSH 연결해서, 구글 프로텍터 인증 어쩌고를 받아야한다.

 

TWRP에서 유의할 점은, 리파티션해주는 파일, GApps 플래싱할 파일 담은 USB 자체를 가끔 우선적으로 인식해버리는 경우가 있는데,

Mount 옵션에서, USB랑 Boot 랑 같이 체크가 되어있는지 확인해야한다.

문제가 있으면, USB만 뽑은뒤, 리커버리모드로 몇 번 재부팅해주면 된다.

(나중에 확인해보니, USB포트마다 번호가 있다더라. )

+ Recent posts