Android 시스템에 핑을 보내다가 신기한 사실을 알아냈다

나는 집에서 라즈베리 파이를 이용해 음악을 틀어 두는데 내 핸드폰을 향해 주기적으로 핑을 보내다가 일정 시간동안 응답이 없으면 내가 집에 없는 것으로 판단하고 음악을 멈추게 해 놓았다. 그런데 핸드폰을 가만히 두면 배터리를 아끼기 위해(충전기에 꽂혀 있는데도) 시스템이 잠든 상태에 빠지고 핑에 대한 응답을 하지 않아 음악이 멈추는 일이 자주 발생했다.

그래서 Android 시스템이 화면이 꺼진 후 얼마나 시간이 지나야 잠드는지 확인하고 싶어서 Wi-Fi monitor를 통해 와이파이 신호를 살펴보고 있었는데 놀라운 사실을 발견했다. 핑에 대한 응답은 안 하지만 내 핸드폰의 맥 어드레스가 발신지인 와이파이 패킷이 잡히고 있었다.
혹시나 내가 핑을 보내는 패킷의 목적지 주소까지 스캔해서 그렇게 잘못 뜨는 건가 싶어 핸드폰의 와이파이를 꺼 봤는데 그 상태에서는 패킷이 잡히지 않았다. 핑에 대한 응답은 없는데 패킷은 발생하는 이 상황을 좀 더 살펴봐야겠다.

결론적으로 음악을 꺼 주는 스크립트는 주기적으로 핑을 보내는 부분은 그대로 두고 Wi-Fi monitor로부터 해당 맥어드레스가 발신지인 패킷이 최근에 있었는지를 확인하도록 바꿨다. 뭔가 하찮은 일에 과한 노력을 쏟은 거 아닌가 싶지만 애초에 이 프로젝트가 그러라고 만든 프로젝트니 상관 없겠지.

Twitter에서 멘션된 유저만 뽑아오기

트위터가 제공하는 API에서 유저가 쓴 글은 당연히 불러올 수 있지만 그 글에 멘션 된 유저는 불러올 수 없다. 그렇다고 그냥 거기에 스레드를 생성한다고 자동으로 멘션이 붙는 것도 아니다. 그래서 결국은 멘션된 유저의 목록을 뽑아 올 필요가 있다.

트위터에서는 @만 붙인다고 다 멘션이 되는 게 아니다. 예를 들어 @a-@b 가@is나 a@not과 같은 트윗이 있다고 하자.
이 경우 a, b, is는 멘션이 된 유저지만 not의 경우 앞에 문자([a-zA-Z_])가 있기 때문에 멘션이 되지 않는다. 그래서 1시간 동안 씨름 한 결과 이걸 정확히 걸러내는 정규식을 만들었다.

(?:\B@)\w+

위와 같이 사용하면 정확히 멘션이 된 유저만 뽑아 올 수 있다. 다만 @a @b @a 같은 트윗일 경우 중복이 될 수 있으니 중복 제거는 알아서 해야 한다.