Rev. 2.73

아이폰 예약 배송 때문에 난리가 났군요. KT가 운영하는 폰스토어의 질의응답 게시판에 불이 났습니다. 주문 취소 요청부터 갖은 욕설과 협박을 불사하는 글들이 지금 이 시간에도 빗발치고 있습니다. 요지는 1차 사전 예약한 소비자들을 우롱했다는 것인데요. 채권보전료, 가입비, USIM 구입비에 추가 징수에 대한 불만을 토로하는가 하면, 하필 주말을 수령 기간으로 골라서 배송지에 발이 묶였다는 분도 있고, 벌써 우채국에서 수령해 사용하는 분이 있는 반면에 11월 22일 등록한(주문번호 8~9만번 대) 예약자의 구매 진척도가 현재까지도 "배송대기"인 점, ARS 전화 상담 불통 등을 꼽을 수 있습니다. 심지어 12월 1일이 되어 오프라인 매장에서 구입한 사용자 보다도 늦게 받아보는 사태가 발생하는 시나리오까지 제기되고 있는 상황입니다. "개그만화보기 좋은 날"이 또다시 패러디 되었더군요. 이러한 현실이 참으로 실망스럽네요.

덧. 28일 저녁에 2만대 분량이 우체국으로 입고된 상황이고, 전산입력에 소홀하여 폰스토어의 배송현황 상태가 변경되지 않는 것이라는 정보가 입수되었습니다. 30일 오전에 우체국 택배로 문의하여, 이름, 주소, 전화번호로 조회해 보아야 확실하다고 합니다. 한시름 놓았네요. 휴~

Comments

최근 트위터로부터 유입되는 트래픽이 급증했습니다. 글 제목과 URL을 복사하고 붙여넣었을 뿐입니다. 하지만 요딴식의 트위팅은 정말 짜증나고 귀찮죠. 좀처럼 트위터에 시간을 할애하지 못하는 분들도 계실거고요. 그래서 PHP와 트위터 API를 이용하여 블로그에 포스팅하는 것과 동시에 트위터에도 포스팅되도록 만들었습니다. 아래는 PHP를 이용하여 트위터에 원격으로 포스팅하는 방법에 대하여 소개한 내용입니다.

curl -u 사용자명:암호 -d status="메시지" http://twitter.com/statuses/update.xml

아시다시피 트위터는 다양한 방식의 API를 제공합니다. 그 중에는 curl을 이용하여 트위터에 원격으로 포스팅할 수 있고 이것을 PHP로 작성하면 다음과 같습니다.

<?php
  // Set username and password
  $username = 'username';
  $password = 'password';
  // The message you want to send
  $message = 'is twittering from php using curl';
  // The twitter API address
  $url = 'http://twitter.com/statuses/update.xml';
  // Alternative JSON version
  // $url = 'http://twitter.com/statuses/update.json';
  // Set up and execute the curl process
  $curl_handle = curl_init();
  curl_setopt($curl_handle, CURLOPT_URL, "$url");
  curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
  curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl_handle, CURLOPT_POST, 1);
  curl_setopt($curl_handle, CURLOPT_POSTFIELDS, "status=$message");
  curl_setopt($curl_handle, CURLOPT_USERPWD, "$username:$password");
  $buffer = curl_exec($curl_handle);
  curl_close($curl_handle);
  // check for success or failure
  if (empty($buffer)) {
    echo 'message';
  } else {
    echo 'success';
  }
?>

변수 $buffer에는 원격지 서버가 응답한 내용이 들어 있고 이것으로 성공 여부를 구분할 수 있습니다.

Comments



이것은 Toki Woki에서 만든 스크롤 시계입니다. <div> 요소의 overflow 속성을 절묘하게 이용하여 만들었습니다. 소스를 보니 MooTools 라이브러리를 기반으로 슈퍼 클래스를 상속하여 사용하고 있습니다. 이것을 Prototype 라이브러리로 다시 작성해 보았습니다. :

(function() {
  var barDim = 64, sbDim = 18;
  var Bar = Class.create({
    initialize: function(dir) {
      this.dir = dir;
      var dim = dir == 'v' ? barDim : (Prototype.Browser.Gecko ? barDim : barDim + sbDim);
      this.holder = new Element('div', {style: 'width:' + (dir == 'h' ? dim : sbDim) + 'px; height:' + (dir == 'h' ? sbDim : dim) + 'px; overflow: auto; float: left'});
      this.content = new Element('div', {style: 'line-height: 0'}).update(' ');
      this.activate(true, true);
      this.holder.insert(this.content);
    },
    activate:function(b, now) {
      var side = this.dir == 'h' ? 'width' : 'height';
      if (now) this.content.setStyle(side + ':' + (b ? barDim + sbDim : barDim / 2) + 'px');
      else this.content.morph(side + ':' + (b ? barDim * 2 : barDim / 2) + 'px');
    }
  });
  var HBar = Class.create(Bar, {
    initialize: function($super){
      $super('h');
      this.holder.setStyle('margin-left:' + sbDim + 'px; margin-right: ' + sbDim + 'px');
    }
  });
  var VBar = Class.create(Bar, {
    initialize: function($super, push){
      $super('v');
      push && this.pushRight();
    },
    pushRight:function() {
      this.holder.setStyle('margin-left:' + barDim + 'px');
    }
  });
  var Digit = Class.create({
    initialize: function(push) {
      var holder = this.holder = new Element('div', {style: 'width:' + (barDim + 2 * sbDim) + 'px; float: left; margin-right: 5px'});
      this.bars = [new HBar(), new VBar(), new VBar(true), new HBar(), new VBar(), new VBar(true), new HBar()].each(function(it) { holder.insert(it.holder);});
      this.lights = [
        [1, 1, 1, 0, 1, 1, 1],//0
        [0, 0, 1, 0, 0, 1, 0],//1
        [1, 0, 1, 1, 1, 0, 1],//2
        [1, 0, 1, 1, 0, 1, 1],//3
        [0, 1, 1, 1, 0, 1, 0],//4
        [1, 1, 0, 1, 0, 1, 1],//5
        [1, 1, 0, 1, 1, 1, 1],//6
        [1, 0, 1, 0, 0, 1, 0],//7
        [1, 1, 1, 1, 1, 1, 1],//8
        [1, 1, 1, 1, 0, 1, 1] //9
      ];
      push && this.pushRight();
    },
    show: function(n) {
      n = Math.floor(n);
      n = n % 10;
      var light = this.lights[n];
      this.bars.each(function(it, index) { it.activate(light[index] == 1); });
    },
    pushRight: function() {
      this.holder.setStyle('margin-left: 12px');
    }
  });
  function showTime() {
    var now = new Date();
    h1.show(now.getHours()/10);
    h2.show(now.getHours());
    m1.show(now.getMinutes()/10);
    m2.show(now.getMinutes());
    s1.show(now.getSeconds()/10);
    s2.show(now.getSeconds());
  }
  var h1 = new Digit(), h2 = new Digit(), m1 = new Digit(true), m2 = new Digit(), s1 = new Digit(true), s2 = new Digit();
  $('main').insert(h1.holder).insert(h2.holder).insert(m1.holder).insert(m2.holder).insert(s1.holder).insert(s2.holder);
  showTime();
  setInterval(showTime, 1000);
})();

덧. IE에서는 작동하지 않습니다.

Comments