2013년 9월 24일 화요일

[Book] Hackers(무삭제판) : 해커스 세상을 바꾼 컴퓨터 천재들(한빛미디어)

[Book] Hackers(무삭제판) : 해커스 세상을 바꾼 컴퓨터 천재들(한빛미디어)


http://www.hanb.co.kr/trackback/978-89-6848-045-4

IT 개발자는 너무나 빠른 환경적 변화와 발전하는 기술에 정신이 없다.
항시, 급변하는 파도를 즐기지만 한편으로는 미래를 걱정한다.
멘토와 책을 통해 끊임없이 인생의 항로를 조정하던 나!
그래서 개발서적 말고도 IT관련 신변잡기 같은 책도 즐겨 본다.
거울 삼아 더 나은 길을 선택하기 위한 하나의 투자인샘이다.
그런 의미에서 "해커스"라는 책은 IT 의 역사책이라고 볼 수 있다.
즉, 과거를 통해 미래를 점쳐 볼 수 있는 것이다.
혹, 어떤이는 초기 컴퓨터의 이야기가 미래를 점칠 수 있는 선구안을 만들기에는 무리라고 말할지도 모르겠다.
비록 컴퓨터라는 전자기계를 다루지만 인간이 하기에 거기에는 정신이 담겨있다.
난 이 책에서 IT 개발자 종족들 즉, 해커들의 정신을 느꼈다. 아니 이미 나에게 존재했고 그것을 공유 했다고 하는 것이 더 맞을듯 하다.



내가 이 책을 읽는 동안 책과 관련된  2가지일을 경험하게 된다.
하나는 넥슨 컴퓨터 박물관에 간 것이다.
책에 나온 다양한 사진들을 실물로 보고 만질 수 있었다.
여기에 구경 온 여학생이 이들은 참 좋겠다고 한다. 처음 만들때 부터 있었으니
컴퓨터를 더 잘 이해 할 수 있지 않겠냐는 거다. 헉~ "해커스"를 주고 읽히고 싶었다.
그때 난 "해커스"책을 손에 들고 있었으니 가능했겠지만, 그때는 아직 다 읽지 않은 상태여서~~



두번째는 스티브 잡스라는 영화를 본 것이다.
과거 "스티브 잡스"와 "빌게이츠의 야망을 가진 남자들"이라는 책을 읽었지만
영상이라는게 확실히 무언가 다르게 느끼게 해준다. 난 영화를 보고 집에 돌아 오는 도중 "해커스 책"책의 뒷편에 무한히 많은 아이디어를
적어 내려가며 "해커스"의 한명이 되어 가고 있었다.

이 두 경험을 하면서 책을 읽으니 더욱더 생생한, 마치 소설처럼 몇 십년을 그 시대의
주인공처럼 감정이입되며 읽을수 있었다.
엄청 큰 컴퓨터(?)에 천공카드 넣으며 프로그램 하던 나, 서랍에 두루마리 화장지 같은 거 넣어서 프로그램 공유하던 나
상업적인 것 보다 자유 / 공유를 외치던 나, 양 사이드에 체스판 프로그램을 두고 두명의 교수님을 모셔서 서로 마치 인공지능 컴퓨터와 싸우듯 한 장난끼 많던 나,
단지 전자 조각들에게 아름다운 음악과 멋진 그림을 꿈꾸던 나,
조잡한 결과물에 환호하고 재미있어한 나의 선배들, 그 밑바탕에서 우리는 아니 나는 우주정복해야 하지 않겠는가 ㅋ

너무 등장인물이 많고 여러 사건이 다루어지다 보니 정신이 없고 기억하기 조금은 어렵지만 우리의 선배들의 정신과 앞으로 우리가 추구해야 할 모습을 조금은
알게된 책 같다. IT 개발자 들이여 인문학을 공부해야 한다고 세간에서는 엄청 떠들고 있다. 우리 분야의 역사 정도는 알아야 T자형 인간 아니겠는가!

참고 조각들..기억하고픈 것들
빌게이츠의 " 생물학 해킹" 천재 열정 순수함
오라일리 "DIY는 해킹"
주크버그 "과거 하드웨어 차원 아닌 운영체제 차원의 컴퓨터에 접근 " => 사회 시스템에 돌아가는 방식에 흥미가 있음
http://blog.aladin.co.kr/733529165/6621487

2013년 8월 28일 수요일

한빛리더스 7기 활동


한빛 리더스 7기


8월 21일에 결과 나왔다. ㅎㅎ



한빛 리더스 7기 IT 전문서에서 활동할 수 있게 되었다.
ㅋㅋ. 다시 조금은 잼나는 일이 주위에 생기려나.~~

8월 27일에 1차 미션이 시작 되었다. 

한빛 리더스 7기 미션 1 - 도서리뷰 / 오탈자 찾기



난 해커스(무삭제)라는 책을 선택 했다. 요즘 부쩍 해킹에 관심이 간다~~


제12회 스타트업 위크엔드 on the cruise



제12회 스타트업 위크엔드 on the cruise


 여성 위크엔드에 이어 두번째 참여하게 되었다. 

열정으로 살았지만 평탄한 느낌을 깨기위해, 배위에서 (제주도 크루즈) 한다니
색달라 과거와 달리 욕심 없이 경험해 보고자 신청했다. 
늦게 신청했지만, 항상 개발자는 부족하니~~ 한동안 이쪽을 손 놓아
조금 걱정이지만 완성도높이기 위한 기술적 도움을 주는데 치중해 보려한다.
(능력이 되는한..) 하루니,밤새서 하는 개발 문화는 없애야지..
이제 나라도 실천해야지...절대 늙어서 그런것은 아니겠지.
다만, 문화 타파 차원에서..ㅋㅋ 또 얼마나 좋은 사람들을 만날지..기대 므흣
  1.  http://onoffmix.com/event/18140
  2. http://m.appcenter.kr  : 8/28() 12:00 ~ 9/3() 10:00 : 100s Speech : 아!! 아이디어 많은 데 딱히 이번 이벤트에 낼 만한게 없다. 고민~~~
  3. startup@appcenter.kr : 신*분증(믿을 만한 곳이지만, 영 꺼림직 하다.) : 성함, 연락처 기재
  4. 문의처: 070-7525-0500(HOTLINE) 
  5. 공식 페이스북 www.facebook.com/SWSeoul
  6. 스타트업 위크엔드 Alumni 모임 www.facebook.com/groups/265177456841924
  7. http://appcenter.kr/




2012년 2월 2일 목요일

[android]android overlay 4.0 부터 HWComposer로 바뀜(2012. 02. 02)

android overlay 4.0 부터  HWComposer로 바뀜
http://mungi.tistory.com/256 에서 펌
참고 : http://hybridego.net/1485, http://hybridego.net/1482
[Android] Ice Cream Sandwitch 소스를 대충 훑어본 결과...
Linux/Android 2011/11/28 20:57

고도리님 말씀. http://www.aesop.or.kr/54050

많은 부분을 훑어보지는 않았습니다.

가장 큰 변화는 역쉬 Display/Audio에 있네요.....우쒸.

1. LayerBuffer가 없어지면서 Overlay가 없어지고, HWComposer가 새로 생겼습니다.


2. Audio HAL관련 부분에 변화가 많네요.
예제가 있어서 좋기는 한데, 예제가 꽝입니다............또 gingerbread에서 했던 짓을 해 놓은 듯

머 좋은거 주기 싫어서 제조사들 알아서 하삼....정도 이지만, 예전보다 나아졌네요...^^
즉, Audio HAL은 전부 재작업 수준입니다. Froyo/Gingerbread에서 작업했던 분들은 알 수 있겠지만요.

참, ALSA를 쓰기는 하는데, 아마도 이 부분은 전부 재작업일 듯 합니다.

3. Multimedia에 AACExtractor와 AVIExtractor가 들어갔습니다. 하나는 날로 먹을 듯 하네요.
AVI를 짤까 말까 고민하고 있었는데.......나이수....

4. Sensor들이 슬슬 default로 들어가는 녀석들이 늘었네요. 몇몇 업체는 짱으로 짜증날 듯

Camera/Input 부분만 보면 대략 윤곽이 나오겠네요..........개발 기간이랑 가격 견적(?)요...ㅎㅎ

좋은 Audio Device만 일주일 꼬박 작업해야할 듯 합니다....ㅠ.ㅠ

포드 google prediction api 적용(2012. 02. 02)

포드 google prediction api 적용 :  과거 운행정보 분석으로 운행 예측
http://code.google.com/intl/ko-KR/apis/predict/docs/developer-guide.html

[android]asset 주의 점(2012. 02. 02)

http://zeph1e.tistory.com/49#footnote_link_49_2
asset 주의 점
/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
    ".jpg", ".jpeg", ".png", ".gif",
    ".wav", ".mp2", ".mp3", ".ogg", ".aac",
    ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
    ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
    ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
    ".amr", ".awb", ".wma", ".wmv"
};

2012년 1월 30일 월요일

[android] 최강안드로이드 책 코드 발췌(2012. 01. 30)

1. android:background="@android:drawable/editbox_background"/>
2. FrameLayout mContentView = (FrameLayout)getWindow().getDecorView().findViewById(android.R.id.content);
3. final View zoom = mWebView.getZoomControls();    zoom.getTouchables().get(0).setOnClickListener(new OnClickListener(){
4. ABC<sup>+</sup>
5.     static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
        Contacts._ID,
        Contacts.DISPLAY_NAME,
        Contacts.CONTACT_STATUS,
        Contacts.CONTACT_PRESENCE,
        Contacts.PHOTO_ID,
        Contacts.LOOKUP_KEY,
    };
        Cursor cursor = getContentResolver().query(Contacts.CONTENT_URI,
        CONTACTS_SUMMARY_PROJECTION, null, null, null);
        startManagingCursor(cursor);
       
        SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this,
               android.R.layout.simple_list_item_2, cursor,
                new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
                new int[] { android.R.id.text1, android.R.id.text2 });

        setListAdapter(mAdapter);
6.     onLayout()에서 호출함
view spoof, view original
       현재 레이아웃 스크린 좌표 얻기
        final int[] globalPos = new int[2];
        spoof.getLocationOnScreen(globalPos);
        레이이아웃에 위치를 지정해 주기
spoof.layout(x, y, x + original.getWidth(), y + original.getHeight());

onMeasure(int, int) Called to determine the size requirements for this view and all of its children.
onLayout(boolean, int, int, int, int)

private void showOverlay() {
       ToastViewOverlay overlay = (ToastViewOverlay)
               getLayoutInflater().inflate(R.layout.secure_view_overlay, null);
       overlay.setActivityToSpoof(this);
     
       Toast toast = new Toast(getApplicationContext());
       toast.setGravity(Gravity.FILL, 0, 0);
       toast.setDuration(Toast.LENGTH_LONG);
       toast.setView(overlay);
       toast.show();
   }
7.
int timeout = 10000;
       
        SocketAddress socketAddress = new InetSocketAddress("192.168.10.77", 6001);
sock = new Socket();
       
   sock.setReceiveBufferSize(64000);
   sock.setSoTimeout(30000);
   sock.setSoLinger(true, timeout);
   sock.connect(socketAddress, timeout);

PrintWriter out = new PrintWriter( new
BufferedWriter( new OutputStreamWriter(sock.getOutputStream())),true);
out.println(message);
// sleep(20000);
BufferedReader input = new BufferedReader(new InputStreamReader(sock.getInputStream()));
     
String st = input.readLine();
8.      // setTheme(android.R.style.Theme);
        // setTheme(android.R.style.Theme_Light);
        // setTheme(R.style.Theme_Translucent);
        setTheme(R.style.Theme_Transparent);
        setContentView(R.layout.main);
9.  public static final String testContent = "<html><body><b>HTML 문서를 TextView에 출력합니다.</b><font size='+1'>크게</font>"
    + "<img src=\"http://developer.android.com/assets/images/home/honeycomb-android.png\"/></body></html>";
    tvText.setText(Html.fromHtml(testContent, imgGetter, null));
    private final ImageGetter imgGetter = new ImageGetter() {
@Override
public Drawable getDrawable(String source) {
HttpGet get = new HttpGet(source);
DefaultHttpClient client = new DefaultHttpClient();
Drawable drawable = null;
try {
HttpResponse response = client.execute(get);
StatusLine status = response.getStatusLine();

if (status.getStatusCode() != 200)
return null;

InputStream stream = response.getEntity().getContent();
   File path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);      
   File file = new File(path, "HtmlPicture.png");
FileOutputStream fileout = new FileOutputStream(file);
byte buf[] = new byte[8192];
int len;

while ((len =stream.read(buf)) > 0) {
fileout.write(buf, 0, len);
}

fileout.close();
drawable = Drawable.createFromPath(file.toString());
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return drawable;
}
};

10. http://developer.android.com/reference/android/R.drawable.html
public class HelloTabs extends TabActivity implements TabHost.TabContentFactory {
        View v;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       TabHost tabHost = getTabHost();
       LayoutInflater.from(this).inflate(R.layout.main, tabHost.getTabContentView(), true);

       tabHost.addTab(tabHost.newTabSpec("tab1")
               .setIndicator("tab1", getResources().getDrawable(android.R.drawable.star_big_on))
               .setContent(R.id.view1));
       tabHost.addTab(tabHost.newTabSpec("tab2")
        .setIndicator("tab2", getResources().getDrawable(android.R.drawable.star_big_off))
               .setContent(R.id.view2));
       tabHost.addTab(tabHost.newTabSpec("tab3")
        .setIndicator("tab3", getResources().getDrawable(android.R.drawable.stat_notify_call_mute))
               .setContent(this));
   }

   @Override
public View createTabContent(String tag) {
    TextView tv = new TextView(this);
    tv.setText("Content for tab with tag " + tag);
       return tv;
   }
}

11.     private static int MOOD_NOTIFICATIONS = R.layout.main;
    private NotificationManager mNM;
    private final int[] mood = {R.drawable.stat_happy,R.drawable.stat_neutral,R.drawable.stat_sad};
    private final int[] message = {R.string.status_bar_happy_message,R.string.status_bar_ok_message, R.string.status_bar_sad_message};
          CharSequence text = getText(textId);
        Notification notification = new Notification(moodId, text, System.currentTimeMillis());
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, SyncThread.class), 0);

        notification.setLatestEventInfo(this, getText(R.string.status_bar_mood_title),
                       text, contentIntent);
        mNM.notify(MOOD_NOTIFICATIONS, notification);

12.
 private void addEvent(String title) {
    SQLiteDatabase db = hostData.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(HostDatabase.TIME, System.currentTimeMillis());
    values.put(HostDatabase.TITLE, title);
    db.insert(HostDatabase.TABLE, null, values);
   }

  private void deleteEvent(String title) {
   SQLiteDatabase db = hostData.getWritableDatabase();
   db.delete(HostDatabase.TABLE, "tiltle=?", new String[] {title});
  }

  private void updateEvent(String title) {
   SQLiteDatabase db = hostData.getWritableDatabase();
   ContentValues values = new ContentValues();
   values.put(HostDatabase.TIME, System.currentTimeMillis());
   db.update(HostDatabase.TABLE, values, "tiltle=?", new String[] {title});
  }
 
  private Cursor getEvents() {
    SQLiteDatabase db = hostData.getReadableDatabase();
    Cursor cursor = db.query(HostDatabase.TABLE, null, null, null, null,
        null, null);
   
    startManagingCursor(cursor);
    return cursor;
  }

  private void showEvents(Cursor cursor) {
    StringBuilder ret = new StringBuilder("Saved Events:\n\n");
    while (cursor.moveToNext()) {
      long id = cursor.getLong(0);
      long time = cursor.getLong(1);
      String des = cursor.getString(2);
      ret.append(id + ": " + time + ": " + des + "\n");
    }
    output.setText(ret);
  }

@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + TABLE + "( " + BaseColumns._ID
+ " integer primary key autoincrement, " + TIME + " integer, "
+ TITLE + " text not null);";
Log.d("EventsData", "onCreate: " + sql);
db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion >= newVersion)
return;

String sql = null;
if (oldVersion == 1)
sql = "alter table " + TABLE + " add note text;";
if (oldVersion == 2)
sql = "";

Log.d("EventsData", "onUpgrade : " + sql);
if (sql != null)
db.execSQL(sql);
}

13.     <ProgressBar android:id="@+android:id/progress_large"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ProgressBar android:id="@+android:id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ProgressBar android:id="@+android:id/progress_small"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ProgressBar android:id="@+android:id/progress_small_title"
        style="?android:attr/progressBarStyleSmallTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

        // Request for the progress bar to be shown in the title
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
       
        setContentView(R.layout.main);
       
        // Make sure the progress bar is visible
        setProgressBarVisibility(true);
14. android:bufferType="spannable"
    http://blog.naver.com/taiji567?Redirect=Log&logNo=109529292