arron99

saper

  博客中心 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  515 随笔 :: 0 文章 :: 235 评论 :: 0 Trackbacks
Cached @ 2025/4/26 10:52:37Control ASP.skins_cogitation_controls_blogstats_ascx
<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

留言簿(2)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜

Cached @ 2025/4/26 10:52:37Control ASP.skins_cogitation_controls_singlecolumn_ascx

2006年11月19日 #

在编写SAP程序时,程序员经常需要将常字符串进行分割,在字符串中加入回车换行或TAB字符,在其他语言可以使用$13$10的ASCII码进行插入.而在abap里却出错,为了解决此问题,请使用sap的类CL_ABAP_CHAR_UTILITIES.
CL_ABAP_CHAR_UTILITIES中有字符常量:如:CR_LF,HORIZONTAL_TAB,NEWLINE等等.
下面给出字符串中加入回车换行的示例:

DATA: crlf(2) TYPE c.
DATA: l_html(4096)  TYPE C.
crlf = cl_ABAP_char_utilities=>cr_lf.
CONCATENATE l_html crlf  '_FUNCTION'
              '30'
              'WWW_GET_REPORT' '>' INTO l_html.

string的标准函数

查找: FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern IN dobj
替换:
REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern  IN dobj WITH new
          REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new
移动:SHIFT c [BY n PLACES] [mode]
拼接:CONCATENATE c1 ... cn INTO c [SEPARATED BY s]
分割:SPLIT c AT del INTO c1 ... cn.
大小写转换:TRANSLATE text TO UPPER CASE.
                     
TRANSLATE text TO LOWER CASE.
字符串覆盖:OVERLAY c1 WITH c2 [ONLY str].
压缩字符串:CONDENSE c [NO-GAPS].

系统扩张的string函数(函数组CSTR)

STRING_LENGTH
STRING_CONCATENATE
STRING_MOVE_RIGHT
STRING_REVERSE
STRING_SPLIT
STRING_CENTER
TEXT_SPLIT
STRING_SPLIT_AT_POSITION
OVERLAY_BYTE
SJIS_SBC_TO_DBC
SJIS_DBC_TO_SBC

posted @ 2006-11-19 23:22 arron99 阅读(912) | 评论 (0)编辑 收藏

1 BAPI的优点

bapi是面向对象的设计;
bapi是固定的,一般不能修改;
bapi可以被sap内部部件和非sap程序使用;
bapi的成功和错误信息始终通过RETURN返回;
bapi可以被许多开发平台使用;

2 何时该考虑使用BAPI设计程序

用VB/JAVA?C++等语言编写非SAPGUI程序访问和处理sap数据;
SAP不同部件之间通讯;
与非sap程序或者老系统交换数据:
使用异步通信分发数据如:ALE
可以通过SAP Business Connector or Internet Application Components 与因特网程序集成;

3 关于RETURN

RETURN用于BAPI返回错误和成功的消息,它可以是BAPIRETURN,BAPIRETURN,BAPIRET1,BAPIRET2和BAPIRET2_FIX中的一种类型.这些结构一般都包括以下字段:

TYPE

CHAR 1

S

= success message
E = error message
W = warning message
I = information message
A = termination message (abort)

ID

CHAR 20

Message ID The structure BAPIRET2 takes into account the name space extension for the message class as of Release 4.0. If you want messages to be compatible with earlier R/3 Releases, use the message classes before Release 4.0.

NUMBER

NUMC 3

Message number

MESSAGE

CHAR 220

Full message text from the message table. All variables (in fields Message_V1 to Message_V4) have been replaced with text.

MESSAGE_V1
MESSAGE_V2
MESSAGE_V3 MESSAGE_V4

CHAR 50

Fields for the variable texts of the message

 

4 BAPI的程序框架

Log on
       (Source code)
   Call BAPI
(Source code)
   Call BAPI
       (Source code)
Call BAPI BapiService.TransactionCommit()
       (Source code)
   Call BAPI
       (Source code)
   Call BAPI
       (Source code)
Call BAPI BapiService.TransactionCommit()
       (Source code)
Log off

5 相关函数

'BALW_BAPIRETURN_GET2':取生成返回消息
    CALL FUNCTION 'BALW_BAPIRETURN_GET2'
         EXPORTING
              TYPE   = 'E'
              CL     = 'BC_BOR'
              NUMBER = 163
              PAR1   = MSG1_HLP
              PAR2   = MSG2_HLP
         IMPORTING
              RETURN = RETURN.
BAPI_TRANSACTION_COMMIT 和 API_TRANSACTION_ROLLBACK: BAPI事务函数

BUFFER_SUBSCRIBE_FOR_REFRESH和BUFFER_REFRESH_ALL: 缓冲区处理函数

'TRANSACTION_BEGIN ,'TRANSACTION_STATUS' 和'TRANSACTION_END' 的调用示例
    call function 'TRANSACTION_BEGIN'  "94702/KB
         importing                     "94702/KB
              transaction_id = transaction_id                  "94702/KB
         exceptions                    "94702/KB
              others         = 1.      "94702/KB
    call function 'BAPI_PO_CREATE'     "94702/KB
         exporting                     "94702/KB
              po_header                  = po_head             "94702/KB
         importing                     "94702/KB
              purchaseorder              = h_ebeln             "94702/KB
         tables                        "94702/KB
              po_items                   = po_item             "94702/KB
              po_item_schedules          = po_sched            "94702/KB
              po_item_account_assignment = po_acct             "94702/KB
              po_item_text               = po_text             "94702/KB
              return                     = return              "94702/KB
         exceptions                    "94702/KB
              others                     = 0.                  "94702/KB
    call function 'TRANSACTION_STATUS' "94702/KB
         importing                     "94702/KB
              status  = status_of_transaction                  "94702/KB
         exceptions                    "94702/KB
              others  = 1.             "94702/KB
    if status_of_transaction = commit_work.                    "94702/KB
      commit work and wait.            "94702/KB
    endif.                             "94702/KB
    call function 'TRANSACTION_END'    "94702/KB
         exporting                     "94702/KB
              transaction_id = transaction_id                  "94702/KB
         exceptions                    "94702/KB
              others         = 1.      "94702/KB

posted @ 2006-11-19 23:19 arron99 阅读(989) | 评论 (0)编辑 收藏

The FI-GL table BSEG, which is one of our biggest PR1 tables, is an example of a clustered table. At the database-level, there is no table called BSEG, but instead RFBLG is being used for the BSEG data. Most of the fields known in BSEG are not known in the database table RFBLG, but are compressed in a VARDATA field of RFBLG. So tests in the WHERE clause of SELECTs agains BSEG are not used by the database (e.g. lifnr = vendor account number, hkont = G/L account, kostl = cost center). As a consequence, these tests are done after the facts similar to using the CHECK statement, and as already said in tip 1, CHECK statements are worse than tests in the WHERE-clause.

Check this link also.
https://forums.sdn.sap.com/thread.jspa?forumID=50&threadID=38572&messageID=373481#373481
1) select with header information from bkpf
2) use secondary index tables
http://forums.sdn.sap.com/jive3/thread.jspa?forumID=50&threadID=14280&messageID=105504#105504
1.BSAK Accounting: Secondary Index for Vendors
2.BSAS Accounting: Secondary Index for G/L Accounts
3.BSIK Accounting: Secondary Index for Vendors
4.BSID Accounting: Secondary Index for Customers
5.BSIM Secondary Index, Documents for Material
6.BSAD Accounting: Secondary index for customers
7.BSIS Accounting: Secondary Index for G/L Accounts
3) use logical data base e.g.: BRF

via: https://forums.sdn.sap.com/thread.jspa?threadID=100759  


posted @ 2006-11-19 23:18 arron99 阅读(779) | 评论 (0)编辑 收藏

***INCLUDE MMWE0F01 .
* 88951 26.11.97 4.0B KB: Preis黚ergabe an ME_CREATE_PO_ITEM
* 94702 04.02.98 4.0B KB: Verbuchungsproblem Bestellung/Kundenauftrag
*102133 24.04.98 4.0C KB: Preis黚ernahme in Bestellung
*106225 09.06.98 4.5A KB: Bestellpreismengeneinheit in Bestellposition
*134329 15.01.99 4.5B RB: WE/RE-Kennzeichen
*167369 12.08.99 4.6B RB: Positionsreihenfolge in erzeugten Objekten
*&---------------------------------------------------------------------*
*&      Hinzuf黦en neue Position aus dem Katalog in BAN
*&---------------------------------------------------------------------*
form ban_store_cat.

  clear ban.
  ban-preq_item = h_banpos + 1.
  clear bankey.
  bankey-preq_item = ban-preq_item.

* lesen BAN - merken Indizes
  read table ban with key bankey binary search.
  h_index = sy-tabix.
  h_subrc = sy-subrc.

* 黚ernehmen globale Daten in BAN
  move-corresponding global to ban.
  if ban-preq_name is initial.
    ban-preq_name = sy-uname.
  endif.

* 黚ernehmen Katalog-Daten in BAN
  ban-material     = new_item-matnr.
  ban-pur_mat      = new_item-matnr.
  ban-quantity     = new_item-quantity.

  if new_item-unit is initial.
    message s064 with new_item-unit.
    exit.
  endif.
  perform unit_of_measure_to_sap using new_item-unit.
  if exitflag ne space.
    message s064 with new_item-unit.
    exit.
  endif.

  ban-unit         = new_item-unit.
  ban-short_text   = new_item-description.

  if not new_item-currency is initial and
     not new_item-price is initial.
    perform value_to_sap using new_item-currency new_item-price.
    if exitflag ne space.
      message s065 with new_item-price new_item-currency.
      exit.
    endif.
  endif.

  ban-preis        = new_item-price.
  ban-c_amt_bapi   = new_item-price.
  ban-price_unit   = new_item-priceunit.
  if not ban-preis is initial.
*  BAN-PO_PRICE = '2'.                                "102133/KB
    ban-po_price = '1'.                "102133/KB
  endif.

  if not new_item-currency is initial.
    perform currency_to_sap using new_item-currency.
    if exitflag ne space.
      message s066 with new_item-currency.
      exit.
    endif.
  endif.

  ban-currency     = new_item-currency.
  ban-waers        = ban-currency.
  ban-deliv_date   = sy-datlo + new_item-leadtime.
  ban-vend_mat     = new_item-vendormat.
  ban-manu_mat     = new_item-manufactmat.
  ban-mfr_no_ext   = new_item-manufactcode.

  if h_catalogs-lifnr ne space.
    ban-fixed_vend = h_catalogs-lifnr.
    ban-purch_org  = h_catalogs-ekorg.
  else.
    ban-fixed_vend = new_item-vendor.
    if not h_catalogs-ekorg is initial and
       ban-purch_org is initial.
      ban-purch_org = h_catalogs-ekorg.
    endif.
  endif.

* Materialnummer von Katalog 黚ergeben - Pr黤en Mat. und 黚ern. Daten
  if ban-pur_mat  ne space.
    perform material_get using ban-pur_mat.
    if no_material ne space or
       no_status_b ne space.
      message s050 with ban-pur_mat.
      clear ban-pur_mat.
      clear ban-material.
    else.
      move-corresponding mat_tab to ban.
      ban-preis = mat_tab-c_amt_bapi.
      perform material_availability_check.
    endif.
  endif.

* Materialnummer 黚er Infosatz suchen, wenn Lieferantenmatnr. sitzt
  if ban-pur_mat eq space.
    if ban-vend_mat ne space.
      perform determine_material_inforecord using new_item-vendormat
                                                  ban-fixed_vend
                                                  ban-pur_mat
                                                  ban-info_rec.
* falls Materialnummer gefunden wurde, so weiter, als sei sie eingegeben
      if ban-pur_mat ne space.
        perform material_get using ban-pur_mat.
        if no_material ne space or
           no_status_b ne space.
          clear ban-pur_mat.
          clear ban-material.
        else.
          move-corresponding mat_tab to ban.
          ban-preis = mat_tab-c_amt_bapi.
          perform material_availability_check.
        endif.
      endif.
    endif.

* Materialnummer 黚er Hersteller und Herstellerteilenummer
    if new_item-manufactmat ne space and
       new_item-manufactcode ne space.
      perform determine_material_manufact using new_item-manufactmat
                                                new_item-manufactcode
                                                ban-pur_mat.

* falls Materialnummer gefunden wurde, so weiter, als sei sie eingegeben
      if ban-pur_mat ne space.
        perform material_get using ban-pur_mat.
        if no_material ne space or
           no_status_b ne space.
          clear ban-pur_mat.
          clear ban-material.
        else.
          move-corresponding mat_tab to ban.
          ban-preis = mat_tab-c_amt_bapi.
          perform material_availability_check.
        endif.
      endif.
    endif.
  endif.

* lesen lieferantenstamm und ermitteln EKORG
  if ban-fixed_vend ne space and
     ban-purch_org  eq space.
  endif.

* Festwerte
  if ban-price_unit is initial.
    ban-price_unit = 1.
  endif.
  ban-del_datcat = '1'.
  ban-item_cat   = '0'.
  ban-update = 'I'.

  perform check_mandantory_fields.

* WE/RE-Kennzeichen setzen                                    "134329/RB
  select single * from t163  where pstyp = ban-item_cat.      "134329/RB
  select single * from t163k where knttp = ban-acctasscat.    "134329/RB
                                       "134329/RB
  ban-gr_ind = t163-wepos.             "134329/RB
  ban-gr_non_val = t163-weunb.         "134329/RB
  ban-ir_ind = t163-repos.             "134329/RB
                                       "134329/RB
  if ban-acctasscat ne space.          "134329/RB
    ban-consumpt = t163k-kzvbr.        "134329/RB
    if t163-wepov eq space.            "134329/RB
      ban-gr_ind = t163k-wepos.        "134329/RB
    endif.                             "134329/RB
    if t163-weunv eq space.            "134329/RB
      ban-gr_non_val = t163k-weunb.    "134329/RB
    endif.                             "134329/RB
    if t163-repov eq space.            "134329/RB
      ban-ir_ind = t163k-repos.        "134329/RB
    endif.                             "134329/RB
  endif.                               "134329/RB

* merken redirectURL f黵 SD-scenario
  ban-katalog = h_catalogs-katalog.
  ban-sd      = sel_sd.
  if sel_sd ne space.
    read table redirect with key ban-katalog.
    if sy-subrc ne 0.
      redirect-katalog = ban-katalog.
      field-get 'SD_HOOK_URL' 1 h_redirect h_redirect_length.
      move h_redirect to redirect-url.
      append redirect.
    endif.
  endif.

  if h_subrc eq 0.
    modify ban index h_index.
  else.
    insert ban index h_index.
  endif.
  h_banpos = ban-preq_item.

* erzeugen Kontierungszeile
  perform init_bsc.

* erzeugen Textzeilen
  perform init_bantx.
  clear ban.

endform.

*&---------------------------------------------------------------------*
*&      膎dern Position 黚er das Detailbild - Grunddaten
*&---------------------------------------------------------------------*
form ban_store_core.

  clear bankey.
  bankey-preq_item = bapieban-preq_item.
  read table ban with key bankey binary search.
  h_index = sy-tabix.
  h_subrc = sy-subrc.

* unerhebliche Felder - einfach 黚ernehmen
  ban-doc_type     = bapieban-doc_type.
  ban-pur_group    = bapieban-pur_group.
  ban-short_text   = bapieban-short_text.
  ban-store_loc    = bapieban-store_loc.
  ban-preq_name    = bapieban-preq_name.
  ban-trackingno   = bapieban-trackingno.
  ban-preis        = eban-preis.
  ban-price_unit   = bapieban-price_unit.
  ban-currency     = bapieban-currency.
  ban-vend_mat     = bapieban-vend_mat.

* L鰏chen Bezugsquellendaten bei bestimmten 膎derungen
  if ban-plant ne bapieban-plant or
     ban-mat_grp ne bapieban-mat_grp or
     ban-unit ne bapieban-unit or
     ban-item_cat ne bapieban-item_cat.
    clear next.
    loop at sos where preq_item eq ban-preq_item.
      delete sos.
      next = next + 1.
    endloop.
    if next > 0.
      clear next.
      message s132.
      clear: ban-fixed_vend,
             ban-purch_org,
             ban-agreement,
             ban-agmt_item,
             ban-info_rec.
    endif.
  endif.

* 黚ernehmen Felder, wenn Nichtlagerposition
  if ban-pur_mat  eq space.
    ban-mat_grp      = bapieban-mat_grp.
    ban-plant        = bapieban-plant.
    ban-unit         = bapieban-unit.
    ban-c_amt_bapi   = bapieban-c_amt_bapi.
    ban-price_unit   = bapieban-price_unit.
    ban-currency     = bapieban-currency.
    if not ban-preis is initial.
*     BAN-PO_PRICE = '2'.                                 "102133/KB
      ban-po_price = '1'.              "102133/KB
    endif.
  else.
*  IF NOT BAN-PREIS IS INITIAL.                           "102133/KB
*     BAN-PO_PRICE = '1'.                                 "102133/KB
*  ENDIF.                                                 "102133/KB
  endif.

* Anstossen Verf黦barkeit bei 膎derung Menge oder Termin
  if ban-material ne space.
    if ban-quantity ne bapieban-quantity or
       ban-deliv_date ne bapieban-deliv_date.
      ban-quantity     = bapieban-quantity.
      ban-deliv_date   = bapieban-deliv_date.
      perform material_availability_check.
      message s047.
    endif.
  endif.

  ban-quantity     = bapieban-quantity.
  ban-deliv_date   = bapieban-deliv_date.

* Festwerte
  if ban-price_unit is initial.
    ban-price_unit = 1.
  endif.
  ban-del_datcat = '1'.
  ban-item_cat   = '0'.
  ban-update = 'I'.
  perform check_mandantory_fields.

  modify ban index h_index.

endform.

*&---------------------------------------------------------------------*
*&      Sichern neue oder ge鋘derte Daten in interner Tabelle BAN
*&---------------------------------------------------------------------*
form ban_store_loop.

  clear bankey.
  bankey-preq_item = banwa-preq_item.
  read table ban with key bankey binary search.
  h_index = sy-tabix.

  if sy-subrc eq 0.
* Position ver鋘dert
    if ban-update ne space.
* Daten der Verf黦barkeit haben sich unter Umst鋘den ge鋘dert
      if ban-quantity ne banwa-quantity or
         ban-deliv_date ne banwa-deliv_date.
        ban-quantity   = banwa-quantity.
        ban-deliv_date = banwa-deliv_date.
        if ban-material ne space.
          perform material_availability_check.
          message s047.
        endif.
      endif.
* L鰏chen Bezugsquellendaten bei bestimmten 膎derungen
      if ban-unit ne banwa-unit.
        clear next.
        loop at sos where preq_item eq ban-preq_item.
          delete sos.
          next = next + 1.
        endloop.
        if next > 0.
          clear next.
          message s132.
          clear: ban-fixed_vend,
                 ban-purch_org,
                 ban-agreement,
                 ban-agmt_item,
                 ban-info_rec.
        endif.
      endif.

      ban-unit  = banwa-unit.
      ban-short_text = banwa-short_text.
      perform check_mandantory_fields.
      modify ban index h_index.

* Position ver鋘dert, aber Dummyposition
    else.
      move-corresponding global to ban.
      move-corresponding banwa  to ban.
      if ban-preq_name is initial.
        ban-preq_name = sy-uname.
      endif.
      if ban-pur_mat ne space.
        perform material_get using ban-pur_mat.
        if no_material ne space or
           no_status_b ne space.
          message s050 with ban-pur_mat.
          prepare_item = 'X'.
          delete ban index h_index.
          exit.
        else.
          move-corresponding mat_tab to ban.
          ban-preis = mat_tab-c_amt_bapi.
*           IF NOT BAN-PREIS IS INITIAL.                    "102133/KB
*              BAN-PO_PRICE = '1'.                          "102133/KB
*           ENDIF.                                          "102133/KB
          perform material_availability_check.
        endif.
      else.                            "102133/KB
        if not ban-preis is initial.   "102133/KB
          ban-po_price = '1'.          "102133/KB
        endif.                         "102133/KB
      endif.
      if ban-price_unit is initial.
        ban-price_unit = 1.
      endif.
      ban-del_datcat = '1'.
      ban-item_cat   = '0'.
      ban-update = 'I'.
      h_banpos = ban-preq_item.
      perform check_mandantory_fields.

* WE/RE-Kennzeichen setzen                                    "134329/RB
      select single * from t163  where pstyp = ban-item_cat.  "134329/RB
      select single * from t163k where knttp = ban-acctasscat."134329/RB
                                       "134329/RB
      ban-gr_ind = t163-wepos.         "134329/RB
      ban-gr_non_val = t163-weunb.     "134329/RB
      ban-ir_ind = t163-repos.         "134329/RB
                                       "134329/RB
      if ban-acctasscat ne space.      "134329/RB
        ban-consumpt = t163k-kzvbr.    "134329/RB
        if t163-wepov eq space.        "134329/RB
          ban-gr_ind = t163k-wepos.    "134329/RB
        endif.                         "134329/RB
        if t163-weunv eq space.        "134329/RB
          ban-gr_non_val = t163k-weunb."134329/RB
        endif.                         "134329/RB
        if t163-repov eq space.        "134329/RB
          ban-ir_ind = t163k-repos.    "134329/RB
        endif.                         "134329/RB
      endif.                           "134329/RB

      modify ban index h_index.

* erzeugen Kontierungszeile
      perform init_bsc.
* erzeugen Textzeilen
      perform init_bantx.
    endif.

* neue Position
  else.
    clear ban.
    move-corresponding global to ban.
    move-corresponding banwa  to ban.
    if ban-preq_name is initial.
      ban-preq_name = sy-uname.
    endif.
    if ban-pur_mat ne space.
      perform material_get using ban-pur_mat.
      if no_material ne space or
         no_status_b ne space.
        message s050 with ban-pur_mat.
        prepare_item = 'X'.
        delete ban index h_index.
        exit.
      else.
        move-corresponding mat_tab to ban.
        ban-preis = mat_tab-c_amt_bapi.
*        IF NOT BAN-PREIS IS INITIAL.                       "102133/KB
*           BAN-PO_PRICE = '1'.                             "102133/KB
*        ENDIF.                                             "102133/KB
        perform material_availability_check.
      endif.
    else.                              "102133/KB
      if not ban-preis is initial.     "102133/KB
        ban-po_price = '1'.            "102133/KB
      endif.                           "102133/KB
    endif.
    if ban-price_unit is initial.
      ban-price_unit = 1.
    endif.
    ban-update = 'I'.
    perform check_mandantory_fields.
    ban-item_cat = '0'.
    ban-del_datcat = '1'.
    h_banpos = ban-preq_item.

* WE/RE-Kennzeichen setzen                                    "134329/RB
    select single * from t163  where pstyp = ban-item_cat.    "134329/RB
    select single * from t163k where knttp = ban-acctasscat.  "134329/RB
                                       "134329/RB
    ban-gr_ind = t163-wepos.           "134329/RB
    ban-gr_non_val = t163-weunb.       "134329/RB
    ban-ir_ind = t163-repos.           "134329/RB
                                       "134329/RB
    if ban-acctasscat ne space.        "134329/RB
      ban-consumpt = t163k-kzvbr.      "134329/RB
      if t163-wepov eq space.          "134329/RB
        ban-gr_ind = t163k-wepos.      "134329/RB
      endif.                           "134329/RB
      if t163-weunv eq space.          "134329/RB
        ban-gr_non_val = t163k-weunb.  "134329/RB
      endif.                           "134329/RB
      if t163-repov eq space.          "134329/RB
        ban-ir_ind = t163k-repos.      "134329/RB
      endif.                           "134329/RB
    endif.                             "134329/RB

    insert ban index h_index.

* erzeugen Kontierungszeile
    perform init_bsc.
* erzeugen Textzeilen
    perform init_bantx.
  endif.
  clear ban.

endform.

*&---------------------------------------------------------------------*
*&      膎dern Position - Kontierungen 黚er das Detailbild
*&---------------------------------------------------------------------*
form bsc_store_account.

  clear bankey.
  bankey-preq_item = bapieban-preq_item.
  read table ban with key bankey binary search.

* bsc lesen und Daten fortschreiben
  clear bsckey.
  bsckey-preq_item = bapieban-preq_item.
  bsckey-serial_no = '01'.
  read table bsc with key bsckey binary search.
  h_index1 = sy-tabix.
  if sy-subrc eq 0.
    move-corresponding bapiebkn to bapipogna.
    perform check_account_assignment.
    check exitflag eq space.
    move-corresponding bapipogna to bapiebkn.
    move-corresponding bapiebkn to bsc.
    move-corresponding bsckey to bsc.
    modify bsc index h_index1.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Form  CHECK_MANDANTORY_FIELDS
*&---------------------------------------------------------------------*
form check_mandantory_fields.

  if ban-quantity is initial.
    message e094.
  endif.

  if ban-deliv_date is initial.
    message e095.
  endif.

  if ban-unit is initial.
    message e096.
  endif.

endform.                               " CHECK_MANDANTORY_FIELDS

*&---------------------------------------------------------------------*
*&      Aufruf fremder Katalog
*&---------------------------------------------------------------------*
form call_catalog.

  loop at catalogs where katalog eq select_cat.
    exit.
  endloop.
  h_catalogs = catalogs.

* merken Katalog-Id und Lieferant in Hilfsfeld
  sel_sd = catalogs-sd_catalog.
  sel_vendor = catalogs-lifnr.

* im Falle SD, Kundennummer besorgen
  if sel_sd ne space.
    perform get_company_code.
    perform get_customer_number.
    field-set 'CUSTOMER_NO' 1 customer_no.
  endif.

* Aufruf Katalog
* wenn vorher bereits aufgerufen - URL aus interner Tabelle
  read table redirect with key catalogs-katalog.
  if sy-subrc eq 0.
    clear my_hook_url.
    its-wgateurl my_hook_url.
    field-set 'MM_HOOK_URL' 1 my_hook_url.
    field-set '~OkCode' 1 'SHPS'.
    its-browser_redirect redirect-url.
  else.
* wenn noch nicht aufgerufen - URL 黚er Customizingtabelle aufbauen
    perform catalog_browser_redirect using catalogs-katalog.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Form  CATALOG_BROWSER_REDIRECT
*&---------------------------------------------------------------------*
*       Aufruf externe Kataloge 黚er Customizingtabelle
*----------------------------------------------------------------------*
form catalog_browser_redirect using cbr_katalog.

  data: url like savwctxt-fieldcont,
        hook like savwctxt-fieldcont,
        name like savwctxt-fieldname,
        cont like savwctxt-fieldcont,
        hook_name like savwctxt-fieldname,
        hook_index like sy-tabix,
        sep.

  refresh: xmw03.
  clear: xmw03.
* Katalog-Parameter besorgen
  select * from tmw03
           into table xmw03
           where katalog = cbr_katalog.
  sort xmw03.

* 1. Runde: URL des Katalogs merken
  loop at xmw03.
    hook_index = sy-tabix.
* Parameter merken bei Parameter-Wechsel
    if xmw03-fieldnam ne space.
      if name ne space or cont ne space.
        field-set name 0 cont.
        clear: name, cont.
      endif.
* Parameter-Name
      name = xmw03-fieldnam.
    endif.
* Parameter-Wert analysieren
    case xmw03-valuetyp.
* URL
      when '0'.
        concatenate url xmw03-fieldval into url.
* Festwert
      when '2'.
        concatenate cont xmw03-fieldval into cont.
* ABAP-Feld
      when '1'.
        write (xmw03-fieldval) to cont.
* Hook-Url
      when '4'.
* Ende 1.Runde
        exit.
    endcase.
  endloop.

* Fester Teil der R點kgabe-URL vom ITS
  its-wgateurl hook.

* 2. Runde: R點kgabe-URL merken
  loop at xmw03 from hook_index.
* Erster Parameter: Trennzeichen '?'
    if not hook cs '?'.
      sep = '?'.
* Folgeparameter: Trennzeichen '&'
    else.
      sep = '&'.
    endif.
* Parameter-Wert analysieren
    case xmw03-valuetyp.
* Festwert
      when '2'.
       concatenate hook sep xmw03-fieldnam '=' xmw03-fieldval into hook.
* ABAP-Feld
      when '1'.
        write (xmw03-fieldval) to cont.
        concatenate hook sep xmw03-fieldnam '=' cont into hook.
* Hook-Url
      when '4'.
        hook_name = xmw03-fieldnam.
    endcase.
  endloop.

* Komplette R點kgabe-URL als Parameter merken
  field-set hook_name 0 hook.
* URL zusammenbauen, encoden und an ITS 黚ergeben
  its-browser_redirect url.

endform.

*&---------------------------------------------------------------------*
*&      Pr黤en Kontierungsdaten
*&---------------------------------------------------------------------*
form check_account_assignment.

  perform fill_bapicobl.
  refresh return1.
  clear   return1.
  clear   exitflag.

* Aufruf Kontierungspr黤ung und -erg鋘zung
  call function 'BAPI_ACCSERV_CHECKACCASSIGNMT'
       exporting
            check_codingblock   = bapicobl
       importing
            changed_codingblock = bapicobl
       tables
            return              = return1
       exceptions
            error_message       = 1.

* keine Fehler
  if return1[] is initial and
     sy-subrc eq 0.
    perform fill_bapipogna.
  else.
* Fehler ausgeben
    loop at return1 where type eq 'E'.
*     MESSAGE ID RETURN1-ID TYPE RETURN1-TYPE NUMBER RETURN1-NUMBER
      message id return1-id type 'S' number return1-number
              with return1-message_v1 return1-message_v2
                   return1-message_v3 return1-message_v4.
      exitflag = 'X'.
      exit.
    endloop.

    loop at return1 where type ne 'E'.
      message id return1-id type 'S' number return1-number
              with return1-message_v1 return1-message_v2
                   return1-message_v3 return1-message_v4.
    endloop.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Pr黤en Globale Daten auf Vollst鋘digkeit
*&---------------------------------------------------------------------*
form check_global_data.

  clear global_data_missing.
  if bapipogn-doc_type is initial.
    global_data_missing = 'X'.
  endif.
  if bapipogn-pur_group is initial.
    global_data_missing = 'X'.
  endif.
  if bapipogn-mat_grp is initial.
    global_data_missing = 'X'.
  endif.
  if bapipogn-plant is initial.
    global_data_missing = 'X'.
  endif.
  if bapipogn-acctasscat is initial.
    global_data_missing = 'X'.
  endif.
  if bapipogna-cost_ctr is initial.
    global_data_missing = 'X'.
  endif.

endform.

*&---------------------------------------------------------------------
*       Erzeugen Bestellung
*----------------------------------------------------------------------
form create_po.

 data: transaction_id like arfctid,    "94702/KB
       commit_work(15) value 'COMMIT_WORK',                    "94702/KB
       status_of_transaction(15).      "94702/KB

  clear return.
  refresh return.
 clear transaction_id.                 "94702/KB

* Verbuchung 'normal' wenn SD nicht im Spiel                  "94702/KB
 if sd_katalog is initial.             "94702/KB
* Aufruf BAPI zum Erzeugen der Bestellung
    call function 'BAPI_PO_CREATE'
         exporting
              po_header                  = po_head
         importing
              purchaseorder              = h_ebeln
         tables
              po_items                   = po_item
              po_item_schedules          = po_sched
              po_item_account_assignment = po_acct
              po_item_text               = po_text
              return                     = return
         exceptions
              others                     = 0.

* Verbuchung mit commit and wait, wenn SD im Spiel            "94702/KB
 else.                                 "94702/KB
    call function 'TRANSACTION_BEGIN'  "94702/KB
         importing                     "94702/KB
              transaction_id = transaction_id                  "94702/KB
         exceptions                    "94702/KB
              others         = 1.      "94702/KB
    call function 'BAPI_PO_CREATE'     "94702/KB
         exporting                     "94702/KB
              po_header                  = po_head             "94702/KB
         importing                     "94702/KB
              purchaseorder              = h_ebeln             "94702/KB
         tables                        "94702/KB
              po_items                   = po_item             "94702/KB
              po_item_schedules          = po_sched            "94702/KB
              po_item_account_assignment = po_acct             "94702/KB
              po_item_text               = po_text             "94702/KB
              return                     = return              "94702/KB
         exceptions                    "94702/KB
              others                     = 0.                  "94702/KB
    call function 'TRANSACTION_STATUS' "94702/KB
         importing                     "94702/KB
              status  = status_of_transaction                  "94702/KB
         exceptions                    "94702/KB
              others  = 1.             "94702/KB
    if status_of_transaction = commit_work.                    "94702/KB
      commit work and wait.            "94702/KB
    endif.                             "94702/KB
    call function 'TRANSACTION_END'    "94702/KB
         exporting                     "94702/KB
              transaction_id = transaction_id                  "94702/KB
         exceptions                    "94702/KB
              others         = 1.      "94702/KB
 endif.                                "94702/KB

* Auswertung der aufgetretenen Fehler und Fortschreiben Protokoll
  loop at return.
    error_po = 'X'.
    move-corresponding return to prot_po.
    prot_po-vendor = po_head-vendor.
    append prot_po.
  endloop.

* Merken SD-Katalog in PO-Tabelle um den erneuten Aufruf zu erm鰃lichen
  clear object_po.
  if h_ebeln ne space.
    po_exist = 'X'.
    object_po-number = h_ebeln.
    if not sd_katalog is initial.
      object_po-katalog = sd_katalog.
    endif.
    append object_po.
  endif.

  clear: po_head, po_item, po_acct, po_text, return.
  refresh: po_item, po_acct, po_text, return.

endform.

*&---------------------------------------------------------------------*
*&      Form  CREATE_REQUISITION
*&---------------------------------------------------------------------*
*       Anlegen Bestellanforderung 黚er BAPI_REQUISITION_CREATE
*----------------------------------------------------------------------*
form create_requisition.

  clear error_rq.
  clear rq_exist.
  clear return.
  refresh return.

* Aufruf BAPI zum Erzeugen der Bestellanforderung
  call function 'BAPI_REQUISITION_CREATE'
       exporting
            skip_items_with_error          = 'X'
       importing
            number                         = h_banfn
       tables
            requisition_items              = req_item
            requisition_account_assignment = req_acct
            requisition_item_text          = req_text
            return                         = return
       exceptions
            others                         = 0.

* Auswertung der aufgetretenen Fehler und Fortschreiben Protokoll
  loop at return.
    error_rq = 'X'.
    move-corresponding return to prot_rq.
    append prot_rq.
  endloop.

* Banfnummer merken
  if h_banfn ne space.
    rq_exist = 'X'.
    object_rq-number = h_banfn.
    append object_rq.
  endif.

  clear: req_item, req_acct, req_text, return.
  refresh: req_item, req_acct, req_text, return.

endform.

*&---------------------------------------------------------------------*
*&      Form  CREATE_RESERVATION
*&---------------------------------------------------------------------*
*       Anlegen Reservierung 黚er BAPI_RESERVATION_CREATE
*----------------------------------------------------------------------*
form create_reservation.

  clear return.
  refresh return.

* Aufruf BAPI zum Erzeugen der Reservierungen
  call function 'BAPI_RESERVATION_CREATE'
       exporting
            reservation_header = res_head
       importing
            reservation        = h_rsnum
       tables
            reservation_items  = res_item
            return             = return
       exceptions
            others             = 0.

* Auswertung der aufgetretenen Fehler und Fortschreiben Protokoll
  loop at return.
    error_rs = 'X'.
    move-corresponding return to prot_rs.
    prot_rs-material = res_item-material.
    append prot_rs.
  endloop.

* Reservierungsnummer merken
  if h_rsnum ne space.
    rs_exist = 'X'.
    object_rs-number = h_rsnum.
    append object_rs.
  endif.

  clear: res_item, res_head, return.
  refresh: res_item, return.

endform.

*&---------------------------------------------------------------------
*       Erzeugen Kundenauftrag
*----------------------------------------------------------------------
form create_sd_order.

  sort object_po by katalog number.
  loop at object_po where katalog ne space.
* f黮len 躡ergabefelder / - tabelle f黵 SD
    sd_index = sy-tabix.
    field-set 'PO_NUMBER' 1 object_po-number.
    next = 0.
    loop at ban where katalog eq object_po-katalog.
      add 1 to next.
      edi_quan = ban-quantity.
      condense edi_quan.
      edi_date = ban-deliv_date.
      perform unit_of_measure_to_iso using ban-unit.
      field-set 'ORDER_ITEM-QUANTITY'   next edi_quan.
      field-set 'ORDER_ITEM-MATERIAL'   next ban-vend_mat.
      field-set 'ORDER_ITEM-UNIT_ISO'   next ban-unit.
      field-set 'ORDER_ITEM-DELIV_DATE' next edi_date.
    endloop.
* zur點ksetzen Katalog in OBJECT_PO -> diese PO ist bereits weg
    sd_katalog = object_po-katalog.
    clear object_po-katalog.
    modify object_po index sd_index.
    perform sd_browser_redirect_post.
  endloop.

* keine weiteren POs mehr ans SD zu 黚ergeben
  if sy-subrc ne 0.
    no_more_po = 'X'.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Konvertieren ISO-Currency in internes SAP-Format
*&---------------------------------------------------------------------*
form currency_to_sap using cts_currency.

  data: h_waers like ekko-waers.
  data: h_currency(3).
  h_currency = cts_currency.
  clear exitflag.

  call function 'CURRENCY_CODE_ISO_TO_SAP'
       exporting
            iso_code  = h_currency
       importing
            sap_code  = h_waers
       exceptions
            not_found = 1
            others    = 2.

* Konvertierung erfolgreich - Feld umsetzen
  if sy-subrc eq 0.
    cts_currency = h_waers.
  else.
    exitflag = 'X'.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Form  DETERMINE_MATERIAL_INFORECORD
*&---------------------------------------------------------------------*
*       Ermitteln Materialstamm 黚er Lieferantenmaterial aus Infosatz
*----------------------------------------------------------------------*
form determine_material_inforecord using dmi_vendormat
                                         dmi_vendor
                                         dmi_material
                                         dmi_info_rec.

* local table
  data heina like bapieina occurs 1 with header line.
  clear: dmi_material, dmi_info_rec.

* determine material via vendor material number and vendor number
  call function 'BAPI_INFORECORD_GETLIST'
       exporting
            vendor             = dmi_vendor
            vend_mat           = dmi_vendormat
            purchorg_data      = ' '
            general_data       = 'X'
       tables
            inforecord_general = heina
            return             = return
       exceptions
            others             = 0.

  read table heina index 1.
  check sy-subrc eq 0.
  dmi_material = heina-material.
  dmi_info_rec = heina-info_rec.

endform.

*&---------------------------------------------------------------------*
*&      Form  DETERMINE_MATERIAL_MANUFACT
*&---------------------------------------------------------------------*
*       Ermitteln Materialstamm 黚er Herstellerteilenummer und -Code
*----------------------------------------------------------------------*
form determine_material_manufact using dmm_manufactmat
                                       dmm_manufactcode
                                       dmm_material.

* local tables
  data hmfrpn like bapimatmfrpn occurs 1 with header line.
  data hmat like bapimatlst occurs 1 with header line.

* determine vendor via the manufacturer code
  clear: cred_exp, cred_imp.
  refresh: cred_exp, cred_imp.
  cred_exp-comp_code  = global-co_code.
  cred_exp-tabname    = 'LFA1'.
  cred_exp-fieldname  = 'EMNFR'.
  cred_exp-fieldvalue = dmm_manufactcode.
  append cred_exp.

* determine internal manufacturer
  call function 'BAPI_CREDITOR_FIND'
       tables
            selopt_tab = cred_exp
            result_tab = cred_imp
       exceptions
            others     = 0.

  read table cred_imp index 1.
  check sy-subrc eq 0.
  check not cred_imp-vendor_no is initial.

* determine material master with the vendornumber and manufactmat
  refresh hmfrpn.
  hmfrpn-manu_mat = dmm_manufactmat.
  hmfrpn-mfr_no   = cred_imp-vendor_no.
  append hmfrpn.
  ban-mfr_no = cred_imp-vendor_no.

  call function 'BAPI_MATERIAL_GETLIST'
       tables
            manufacturerpartnumb = hmfrpn
            matnrlist            = hmat
       exceptions
            others               = 0.

  read table hmat index 1.
  check sy-subrc eq 0.

  dmm_material = hmat-material.

endform.

*&---------------------------------------------------------------------
*       F黮len Kontierungsblockdaten zur Pr黤ung
*----------------------------------------------------------------------
form fill_bapicobl.

  clear bapicobl.
  bapicobl-pstng_date    = sy-datlo.
  bapicobl-doc_date      = sy-datlo.
  bapicobl-comp_code     = global-co_code.
  bapicobl-bus_area      = bapipogna-bus_area.
  bapicobl-gl_account    = bapipogna-g_l_acct.
  bapicobl-func_area     = bapipogna-func_area.
  bapicobl-func_area_long = bapipogna-func_area_long.
  bapicobl-co_area       = bapipogna-co_area.
  bapicobl-costcenter    = bapipogna-cost_ctr.
  bapicobl-orderid       = bapipogna-order_no.
  bapicobl-cost_obj      = bapipogna-cost_obj.
  bapicobl-profit_ctr    = bapipogna-profit_ctr.
  bapicobl-wbs_element   = bapipogna-wbs_elem_e.
  bapicobl-network       = bapipogna-network.
  bapicobl-assetmainno   = bapipogna-asset_no.
  bapicobl-assetsubno    = bapipogna-sub_number.
  bapicobl-plant         = global-plant.
*BAPICOBL-material     = bapieban-material.  "nur in Position
  bapicobl-sales_ord     = bapipogna-sd_doc.
  bapicobl-sched_line    = bapipogna-sdoc_item.
  bapicobl-s_ord_item    = bapipogna-sched_line.
  bapicobl-rec_ind       = bapipogna-rec_ind.
  bapicobl-part_acct     = bapipogna-part_acct.
  bapicobl-funds_ctr     = bapipogna-funds_ctr.
  bapicobl-cmmt_item     = bapipogna-cmmt_item.
  bapicobl-cmmt_item_long = bapipogna-cmmt_item_long.
  bapicobl-fund          = bapipogna-fund.

endform.

*&---------------------------------------------------------------------
*       躡ernehmen Kontierungsblockdaten nach der Pr黤ung
*----------------------------------------------------------------------
form fill_bapipogna.

  bapipogna-bus_area   = bapicobl-bus_area.
  bapipogna-g_l_acct   = bapicobl-gl_account.
  bapipogna-func_area  = bapicobl-func_area.
  bapipogna-func_area_long = bapicobl-func_area_long.
  bapipogna-co_area    = bapicobl-co_area.
  bapipogna-cost_ctr   = bapicobl-costcenter.
  bapipogna-order_no   = bapicobl-orderid.
  bapipogna-cost_obj   = bapicobl-cost_obj.
  bapipogna-profit_ctr = bapicobl-profit_ctr.
  bapipogna-wbs_elem_e = bapicobl-wbs_element.
  bapipogna-network    = bapicobl-network.
  bapipogna-asset_no   = bapicobl-assetmainno.
  bapipogna-sub_number = bapicobl-assetsubno.
  bapipogna-sd_doc     = bapicobl-sales_ord.
  bapipogna-sdoc_item  = bapicobl-sched_line.
  bapipogna-sched_line = bapicobl-s_ord_item.
  bapipogna-rec_ind    = bapicobl-rec_ind.
  bapipogna-part_acct  = bapicobl-part_acct.
  bapipogna-funds_ctr  = bapicobl-funds_ctr.
  bapipogna-cmmt_item  = bapicobl-cmmt_item.
  bapipogna-cmmt_item_long = bapicobl-cmmt_item_long.
  bapipogna-fund       = bapicobl-fund.

endform.

*&---------------------------------------------------------------------
*       F黮len Bestellkopfdaten
*----------------------------------------------------------------------
form fill_po_head.

  po_head-doc_type  = zug-doc_type.
  po_head-purch_org = zug-purch_org.
  po_head-pur_group = ban-pur_group.
  po_head-agreement = zug-agreement.
  po_head-vendor    = zug-fixed_vend.
  po_head-created_by = ban-preq_name.
  if po_head-created_by eq space.
    po_head-created_by = sy-uname.
  endif.

endform.

*&---------------------------------------------------------------------
*       F黮len Bestellpositionsdaten
*----------------------------------------------------------------------
form fill_po_item.

  move-corresponding ban to po_item.
  if ban-po_price ne space.            "88951/KB
    po_item-po_price = 'X'.            "88951/KB
  endif.                               "88951/KB
  po_item-po_item = ban-preq_item.
  po_item-agreement =  zug-agreement.
  po_item-agmt_item =  zug-agmt_item.
  po_item-info_rec =   zug-info_rec.
  po_item-orderpr_un = po_item-unit.   "106225/KB
  perform value_to_bapicurr using ban-preis po_item-net_price
                                  ban-currency.
  append po_item.

endform.

*&---------------------------------------------------------------------
*       F黮len Bestelleinteilungsdaten
*----------------------------------------------------------------------
form fill_po_sched.

  po_sched-po_item = ban-preq_item.
  po_sched-serial_no = '01'.
  po_sched-del_datcat = ban-del_datcat.
  po_sched-deliv_date = ban-deliv_date.
  po_sched-quantity   = ban-quantity.
  append po_sched.

endform.

*&---------------------------------------------------------------------
*       F黮len Bestellkontierungsdaten
*----------------------------------------------------------------------
form fill_po_acct.

  move-corresponding bsc to po_acct.
  po_acct-po_item = ban-preq_item.
  po_acct-quantity = ban-quantity.
  append po_acct.

endform.

*&---------------------------------------------------------------------
*       F黮len Bestelltexte
*----------------------------------------------------------------------
form fill_po_text.

  move-corresponding bantx to po_text.
  po_text-po_item = ban-preq_item.
  append po_text.

endform.

*&---------------------------------------------------------------------*
*&      Form  FILL_REQ_ITEM
*&---------------------------------------------------------------------*
*       F黮len Positionsdaten in 躡ergabetabellen f黵 BAPI..CREATE
*----------------------------------------------------------------------*
form fill_req_item.

  move-corresponding ban to req_item.
  if req_item-manuf_prof is initial.
    clear req_item-pur_mat.
  endif.
  if req_item-preq_name eq space.
    req_item-preq_name = sy-uname.
  endif.
  perform value_to_bapicurr using ban-preis req_item-c_amt_bapi
                                  ban-currency.
  append req_item.

endform.

*&---------------------------------------------------------------------*
*&      Form  FILL_REQ_ACCT
*&---------------------------------------------------------------------*
*       F黮len Kontierungsdaten Banf in 躡ergabetabelle f黵 BAPI..CREATE
*----------------------------------------------------------------------*
form fill_req_acct.

  move-corresponding bsc to req_acct.
  append req_acct.

endform.

*&---------------------------------------------------------------------*
*&      Form  FILL_REQ_TEXT
*&---------------------------------------------------------------------*
*       F黮len Banftexte in 躡ergabetabelle f黵 BAPI..CREATE
*----------------------------------------------------------------------*
form fill_req_text.

  move-corresponding bantx to req_text.
  append req_text.

endform.

*&---------------------------------------------------------------------*
*&      Form  FILL_RES_HEAD
*&---------------------------------------------------------------------*
*       F黮len Kopfdaten Reservierung in 躡ergabestruktur f黵 CREATE
*----------------------------------------------------------------------*
form fill_res_head.

  move-corresponding bsc to res_head.
  res_head-created_by = ban-preq_name.
  res_head-res_no     = ban-preq_no.
  res_head-move_type  = global-move_type.
  res_head-res_date   = sy-datlo.
  res_head-plant      = ban-plant.
  if res_head-created_by eq space.
    res_head-created_by = sy-uname.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Form  FILL_RES_ITEM
*&---------------------------------------------------------------------*
*       F黮len Positionsdaten Reservierung in 躡ergabetabelle f黵 CREATE
*----------------------------------------------------------------------*
form fill_res_item.

  move-corresponding bsc to res_item.
  res_item-material   = ban-material.
  res_item-short_text = ban-short_text.
  res_item-plant      = ban-plant.
  res_item-store_loc  = ban-store_loc.
  res_item-batch      = ban-batch.
  res_item-req_date   = ban-deliv_date.
  res_item-quantity   = ban-quantity.
  res_item-unit       = ban-unit.
  if res_item-gr_rcpt eq space.
    res_item-gr_rcpt = sy-uname.
  endif.
  append res_item.

endform.

*&---------------------------------------------------------------------*
*&      Form  FILL_XEKPO
*&---------------------------------------------------------------------*
*       versorgen interne Tabelle XEKPO mit internen Werten
*----------------------------------------------------------------------*
form fill_xekpo tables   po_itemdet structure bapiekpo
                         xekpo structure ekpo
                using    object_po-salesdocument.

  xekpo-mandt = sy-mandt.
  xekpo-ebeln = po_itemdet-po_number.
  xekpo-ebelp = po_itemdet-po_item.
  xekpo-labnr = object_po-salesdocument.
  xekpo-idnlf = po_itemdet-vend_mat.
  append xekpo.

endform.

*&---------------------------------------------------------------------*
*&      Ermitteln g黮tige Kataloge
*&---------------------------------------------------------------------*
form get_catalogs using gca_mat_grp gca_plant.

  refresh: h_cat, catalogs.
  clear  : h_cat, catalogs.

  call function 'BAPI_PROCOPERATION_GETCATALOGS'
       exporting
            material_group = gca_mat_grp
            plant          = gca_plant
       tables
            valid_catalogs = h_cat
            return         = return.

  loop at h_cat.
    catalogs-katalog = h_cat-catalog.
    catalogs-lifnr   = h_cat-vendor.
    catalogs-ekorg   = h_cat-purch_org.
    catalogs-sd_catalog = h_cat-sd_catalog.
    catalogs-katbez  = h_cat-cat_text.
    append catalogs.
  endloop.

endform.

*&---------------------------------------------------------------------*
*&      Ermitteln Hausw鋒rung als Vorschlagsw鋒rung
*&---------------------------------------------------------------------*
form get_currency.

  data: begin of compdeta.
          include structure bapi0002_2.
  data: end of compdeta.

  check global-currency is initial.
  check not global-co_code is initial.
  call function 'BAPI_COMPANYCODE_GETDETAIL'
       exporting
            companycodeid      = global-co_code
       importing
            companycode_detail = compdeta.
  global-currency = compdeta-currency.

endform.

*&---------------------------------------------------------------------*
*&      Ermitteln Buchungskreis aus GLOBAL-PLANT
*&---------------------------------------------------------------------*
form get_company_code.

  check global-co_code is initial.
  if global-plant ne t001w-werks.
    select single * from t001w where werks eq global-plant.
    check sy-subrc eq 0.
  endif.
  if t001k-bwkey ne t001w-bwkey.
    select single * from t001k where bwkey eq t001w-bwkey.
    check sy-subrc eq 0.
  endif.
  global-co_code = t001k-bukrs.

endform.

*&---------------------------------------------------------------------*
*&      Ermitteln Kundennummer f黵 SD-Katalog
*&---------------------------------------------------------------------*
form get_customer_number.

  clear: bapi1008_5, bapireturn, customer_no.

* read the company code level date for the customer number at vendor
  call function 'BAPI_CREDITOR_GETDETAIL'
       exporting
            creditorid              = sel_vendor
            companycode             = global-co_code
       importing
            creditor_company_detail = bapi1008_5
            return                  = bapireturn
       exceptions
            others                  = 0.

* if no error occured - move customer number in the internal field
  check bapireturn-type ne 'E'.
  customer_no = bapi1008_5-act_at_ven.

endform.

*&---------------------------------------------------------------------*
*&      Ermitteln F4-Hilfen f黵 versch. Felder
*&---------------------------------------------------------------------*
form get_helpvalues tables f4_tab1 structure bapif4b
                           f4_tab2 structure bapif4c
                           f4_tab3 structure bapif4d
                           f4_tab4 structure bapif4e
                    using  ghv_objname
                           ghv_method
                           ghv_parameter
                           ghv_field.

* call BAPI for the helpvalues
  call function 'BAPI_HELPVALUES_GET'
       exporting
            objname                    = ghv_objname
            method                     = ghv_method
            parameter                  = ghv_parameter
            field                      = ghv_field
       tables
            selection_for_helpvalues   = f4_tab1
            helpvalues                 = f4_tab2
            values_for_field           = f4_tab3
            description_for_helpvalues = f4_tab4
       exceptions
            others                     = 0.

endform.

*&---------------------------------------------------------------------*
*&      Erzeugen Textzeilen f黵 neue Position
*&---------------------------------------------------------------------*
form init_bantx.

  clear bantx.
  do 3 times.
    bantx-preq_item = ban-preq_item.
    append bantx.
  enddo.

endform.

*&---------------------------------------------------------------------*
*&      Erzeugen Kontierungszeile f黵 neue Position
*&---------------------------------------------------------------------*
form init_bsc.

  clear bankey.
  bankey-preq_item = ban-preq_item.
  read table ban with key bankey binary search.
  check sy-subrc eq 0.
  clear bsckey.
  bsckey-preq_item = ban-preq_item.
  bsckey-serial_no = '01'.
  read table bsc with key bsckey binary search.
  h_index1 = sy-tabix.
  if sy-subrc ne 0.
    move-corresponding bsckey to bsc.
    move-corresponding global to bsc.
    if global-g_l_acct is initial.
      clear h_wbs_elem.
* Aufruf zu einem sp鋞eren Release auf BAPI umstellen - mom. nicht da
      call function 'ME_ACCOUNT_ASSIGNMENT'
           exporting
                i_matnr      = ban-pur_mat
                i_werks      = ban-plant
                i_bwtar      = space
                i_sobkz      = space
                i_vbeln      = space
                i_vbelp      = '000000'
                i_ps_psp_pnr = h_wbs_elem
                i_kzbws      = space
                i_knttp      = ban-acctasscat
                i_matkl      = ban-mat_grp
           importing
                e_sakto      = bsc-g_l_acct
           exceptions
                others       = 0.
    endif.
    bsc-preq_qty = ban-quantity.
    insert bsc index h_index1.
  endif.

endform.

*&---------------------------------------------------------------------
*       Globale Daten initialisieren
*----------------------------------------------------------------------
form init_global_data.

  get parameter id 'WRK' field h_werks.
  if bapipogn-plant is initial.
    bapipogn-plant = h_werks.
  endif.
  get parameter id 'EKG' field h_ekgrp.
  if bapipogn-pur_group is initial.
    bapipogn-pur_group = h_ekgrp.
  endif.
  get parameter id 'WGR' field h_matkl.
  if bapipogn-mat_grp is initial.
    bapipogn-mat_grp = h_matkl.
  endif.
  get parameter id 'LAG' field h_lgort.
  if bapipogn-store_loc is initial.
    bapipogn-store_loc = h_lgort.
  endif.
  get parameter id 'CNT' field h_kostl.
  if bapipogna-cost_ctr is initial.
    bapipogna-cost_ctr = h_kostl.
  endif.
  get parameter id 'BSA' field h_bsart.
  if bapipogn-doc_type is initial.
    bapipogn-doc_type = h_bsart.
  endif.
  get parameter id 'BWA' field h_bwart.
  if bapipogn-move_type is initial.
    bapipogn-move_type = h_bwart.
  endif.
  if bapipogn-acctasscat is initial.
    bapipogn-acctasscat = 'K'.
  endif.
  if bapipogn-preq_name is initial.
    bapipogn-preq_name = sy-uname.
  endif.
  if bapipogna-gr_rcpt is initial.
    bapipogna-gr_rcpt = sy-uname.
  endif.
  if bapipogna-g_l_acct is initial.
    clear h_wbs_elem.
* Aufruf zu einem sp鋞eren Release auf BAPI umstellen - mom. nicht da
    call function 'ME_ACCOUNT_ASSIGNMENT'
         exporting
              i_matnr      = space
              i_werks      = bapipogn-plant
              i_bwtar      = space
              i_sobkz      = space
              i_vbeln      = space
              i_vbelp      = '000000'
              i_ps_psp_pnr = h_wbs_elem
              i_kzbws      = space
              i_knttp      = bapipogn-acctasscat
              i_matkl      = bapipogn-mat_grp
         importing
              e_sakto      = bapipogna-g_l_acct
         exceptions
              others       = 0.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Verf黦barkeitspr黤ung Material anstossen
*&---------------------------------------------------------------------*
form material_availability using maa_item
                                 maa_material
                                 maa_plant
                                 maa_quantity
                                 maa_unit
                                 maa_delivdate.

  clear: xwmdvsx, xwmdvex.
  refresh: xwmdvsx, xwmdvex.

* Zur點ksetzen AVAIL zur Position
  loop at avail where preq_item eq maa_item.
    delete avail.
  endloop.

* F黮len 躡ergabestrukturen
  xwmdvsx-req_date = maa_delivdate.
  xwmdvsx-req_qty  = maa_quantity.
  append xwmdvsx.

* Aufruf Verf黦barkeitspr黤ung
  call function 'BAPI_MATERIAL_AVAILABILITY'
       exporting
            plant         = maa_plant
            material      = maa_material
            unit          = maa_unit
            check_rule    = '03'
       importing
            endleadtme    = end_rlt
            av_qty_plt    = avail_qty_plant
            dialogflag    = not_available
       tables
            wmdvsx        = xwmdvsx
            wmdvex        = xwmdvex
       exceptions
            error_message = 1.

* zuerst angeforderte Menge in Tabelle eintragen, bzw. 1. Eintrag mod.
  loop at avail where preq_item eq maa_item.
    avail-preq_item = maa_item.
    avail-select = 'X'.
    avail-menge = maa_quantity.
    avail-lfdat = maa_delivdate.
    avail-available = 'No'.
    avail-unit = maa_unit.
    modify avail index sy-tabix.
    exit.
  endloop.
  if sy-subrc ne 0.
    avail-preq_item = maa_item.
    avail-select = 'X'.
    avail-menge = maa_quantity.
    avail-lfdat = maa_delivdate.
    avail-available = 'No'.
    avail-unit = maa_unit.
    append avail.
  endif.

  clear h_menge.
* nun die Daten aus der Verf黦barkeit hinten anh鋘gen
  loop at xwmdvex.
    avail_key-preq_item = maa_item.
    avail_key-select = 'X'.
    avail_key-menge = xwmdvex-com_qty + h_menge.
    avail_key-lfdat = xwmdvex-com_date.
    read table avail with key avail_key.
    if sy-subrc ne 0.
      move-corresponding avail_key to avail.
      clear avail-select.
      avail-available = 'Yes'.
      if not avail-menge is initial.
        avail-unit = maa_unit.
        append avail.
      endif.
    else.
      avail-available = 'Yes'.
      modify avail index sy-tabix.
    endif.
    h_menge = avail_key-menge.
  endloop.

endform.

*&---------------------------------------------------------------------*
*&      Verf黦barkeitspr黤ung Material anstossen und Daten 黚ernehmen
*&---------------------------------------------------------------------*
form material_availability_check.

* Aufruf Verf黦barkeit mit ge鋘derter Menge oder Termin
  perform material_availability using ban-preq_item
                                      ban-material
                                      ban-plant
                                      ban-quantity
                                      ban-unit
                                      ban-deliv_date.

* Pr黤en, ob diese Menge zum gew黱schten Termin verf黦bar -> Ampel
  avail_key-preq_item = ban-preq_item.
  avail_key-select = 'X'.
  avail_key-menge = ban-quantity.
  avail_key-lfdat = ban-deliv_date.
  read table avail with key avail_key.
  if sy-subrc eq 0 and
     avail-available eq 'Yes'.
    ban-available = 'X'.
    ban-avail_qty = ban-quantity.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Lesen Material mit Materialnummer
*&---------------------------------------------------------------------*
form material_get using h_matnr.

  clear: no_material, no_status_b.

* pr黤en, ob Material bereits gelesen
  read table mat_tab with key h_matnr binary search.

* wenn nicht, nachlesen
  if sy-subrc ne 0.
    h_tabix = sy-tabix.
    clear: mtcom, mt06e, mtcor.
    mtcom-kenng = 'MT06E'.
    mtcom-matnr = h_matnr.
    mtcom-werks = global-plant.
    mtcom-spras = sy-langu.
    mtcom-pstat = 'EBD'.
    mtcom-kzspr = 'X'.
    mtcom-spr_meins = 'X'.
    mtcom-kzmpn = 'X'.
    call function 'MATERIAL_READ'
         exporting
              schluessel    = mtcom
         importing
              matdaten      = mt06e
              return        = mtcor
         tables
              seqmat01      = tdummy
         exceptions
              error_message = 01.

* Material nicht vorhanden
    if mt06e is initial or
       sy-subrc ne 0.
      no_material = 'X'.
      exit.
    endif.

* Buchhaltungssicht ist Minimum
    if mtcom-pstat ca 'B' and mtcor-fstat ca 'B'.
      no_status_b = 'X'.
      exit.
    endif.

* sichern Daten in interner Tabelle
    mat_tab-pur_mat  = h_matnr.
    mat_tab-material = mt06e-bmatn.
    if mt06e-mprof is initial.
      mat_tab-material = h_matnr.
    endif.
    mat_tab-manuf_prof = mt06e-mprof.
    mat_tab-short_text = mt06e-maktx.
    mat_tab-mat_grp = mt06e-matkl.
    mat_tab-unit = mt06e-meins.
    if mt06e-vprsv ne space.
      mat_tab-c_amt_bapi = mt06e-verpr.
      if mt06e-vprsv eq 'S'.
        mat_tab-c_amt_bapi = mt06e-stprs.
      endif.
      mat_tab-price_unit = mt06e-peinh.
    endif.
    mat_tab-plant = global-plant.
    mat_tab-pur_group = mt06e-ekgrp.
    if mat_tab-pur_group eq space.
      mat_tab-pur_group = global-pur_group.
    endif.
    insert mat_tab index h_tabix.
  endif.

endform.

*&---------------------------------------------------------------------
*       Erzeugen neue leere Positionszeilen
*----------------------------------------------------------------------
form new_items.

  sort ban by preq_no preq_item.
  clear ban.
  h-tabix = 1.
  h_bnfpo = 0.

* diese Abfrage nur sicherheitshalber
  if ban[] is initial.
    do 10 times.
      h_bnfpo   = h_bnfpo + 1.
      ban-preq_item = h_bnfpo.
      ban-quantity  = 1.
      ban-c_amt_bapi = 1.
      ban-preis      = 1.
      ban-deliv_date = sy-datlo.
      ban-del_datcat = '1'.
      append ban.
    enddo.
  else.

* ab 50 Positionen geht nix mehr - Fehler und tsch
    describe table ban lines count1.
    if count1 ge 50.
      message s067.
      clear ok-code.
      exit.
    endif.
    read table ban index count1.
    h_bnfpo = ban-preq_item.
    clear ban.

* wenn noch was geht, werden einfach 5 neue aufgemacht...
    do 5 times.
      h_bnfpo   = h_bnfpo + 1.
      ban-preq_item = h_bnfpo.
      ban-quantity  = 1.
      ban-c_amt_bapi = 1.
      ban-preis      = 1.
      ban-deliv_date = sy-datlo.
      ban-del_datcat = '1'.
      append ban.
    enddo.
  endif.

endform.

*&---------------------------------------------------------------------
*       Fortschreiben Kundenauftragsnummer in den Bestellungen
*----------------------------------------------------------------------
form po_confirmation.

  loop at object_po where salesdocument ne space.
    clear: po_itemdet, xekpo.
    refresh: po_itemdet, xekpo.
* sperren Bestellung
    call function 'MM_ENQUEUE_DOCUMENT'
         exporting
              i_ebeln = object_po-number
              i_bstyp = 'F'.
* besorgen Positionsdaten
    call function 'BAPI_PO_GETDETAIL'
         exporting
              purchaseorder = object_po-number
         tables
              po_items      = po_itemdet
              return        = return.
* f黮len interne Struktur f黵 Position plus f黮len SD-Auftragsnummer
    loop at po_itemdet.
      perform fill_xekpo tables po_itemdet
                                xekpo
                         using  object_po-salesdocument.
    endloop.
    if not xekpo[] is initial.
* verbuchen 膎derung aber ohne 膎derungsbeleg
      call function 'ME_UPDATE_DOCUMENT_RESPONSE' "IN UPDATE TASK
           tables
                xekpo          = xekpo
           exceptions
                update_mistake = 01.
    else.
* falls keine Positionen vorhanden, entsperren Bestellung
      call function 'DEQUEUE_EMEKKOE'
           exporting
                ebeln = object_po-number.
    endif.
  endloop.

endform.

*&---------------------------------------------------------------------
*       Neuvergeben Positionsnummern nach L鰏chen einer Position
*----------------------------------------------------------------------
form prepare_preq_item.

  data: h_preqitem like bapieban-preq_item.
  sort ban by preq_no preq_item.
  next = 0.

  loop at ban.
    add 1 to next.
    check ban-preq_item ne next.
    h_preqitem = ban-preq_item.
    ban-preq_item = next.
    modify ban index sy-tabix.
    loop at bsc where preq_item eq h_preqitem.
      bsc-preq_item = ban-preq_item.
      modify bsc index sy-tabix.
    endloop.
    loop at bantx where preq_item eq h_preqitem.
      bantx-preq_item = ban-preq_item.
      modify bantx index sy-tabix.
    endloop.
    if ban-update ne space.
      h_banpos = ban-preq_item.
    endif.
  endloop.

endform.

*&---------------------------------------------------------------------
*       Lesen interne Tabelle BAN mit Key
*----------------------------------------------------------------------
form read_ban_with_key using rbw_item.

  clear bankey.
  bankey-preq_item = rbw_item.
  read table ban with key bankey.

endform.

*&---------------------------------------------------------------------
*       Lesen interne Tabelle BSC mit Key
*----------------------------------------------------------------------
form read_bsc_with_key using rbw_item.

  clear bsckey.
  bsckey-preq_item = rbw_item.
  bsckey-serial_no = '01'.
  read table bsc with key bsckey.

endform.

*&---------------------------------------------------------------------
*       Lesen vorhandene Bestellungen zum User f黵 Status
*----------------------------------------------------------------------
form read_po_items.

  check read_po ne space.
* zur點ksetzen alle betroffenen Tabellen
  clear: spo_head, spo_item, po_item, spo_acct, spo_sched, spo_hist,
         spo_hist_sum.
  refresh: spo_head, spo_item, po_item, spo_acct, spo_sched, spo_hist,
           spo_hist_sum.

* lesen alle PO-items zum User
  call function 'BAPI_PO_GETITEMS'
       exporting
            doc_date        = sel_date
            preq_name       = sy-uname
            with_po_headers = 'X'
       tables
            po_headers      = spo_head
            po_items        = po_item
            return          = return
       exceptions
            others          = 0.

* l鰏chen der Dienstleistungen
  loop at po_item.
    if po_item-item_cat = '9'.
      delete po_item.
    endif.
  endloop.

  sort spo_head by po_number.
  clear:  h_ebeln,
          po_details.
  refresh: po_details.

* Aufruf GETDETAIL wegen Ampel auf 躡ersichtsbild - Historie
* Wird auf dem 躡ersichtsbild das Detailbild zur Bestellung gew鋒lt,
* mu?nicht noch der GETDETAIL aufgerufen werden - merken in int. Tab.
  loop at po_item.
* nur beim Gruppenwechsel den GETDETAIL aufrufen
    if po_item-po_number ne h_ebeln and
       h_ebeln ne space.
      clear: po_itemdet, po_acct, po_sched, po_hist, po_hist_sum.
      refresh: po_itemdet, po_acct, po_sched, po_hist, po_hist_sum.
      call function 'BAPI_PO_GETDETAIL'
           exporting
                purchaseorder              = h_ebeln
                items                      = 'X'
                account_assignment         = 'X'
                schedules                  = 'X'
                history                    = 'X'
           tables
                po_items                   = po_itemdet
                po_item_account_assignment = po_acct
                po_item_schedules          = po_sched
                po_item_history            = po_hist
                po_item_history_totals     = po_hist_sum
                return                     = return
           exceptions
                others                     = 0.

* merken aller Daten zur Bestellung in internen Tabellen f黵 Detailbild
      read table spo_head with key h_ebeln binary search.
      move-corresponding spo_head to spo_item.
      loop at po_itemdet.
        detailkey-number = po_itemdet-po_number.
        detailkey-position = po_itemdet-po_item.
        read table po_details with key detailkey.
        if sy-subrc eq 0.
          move-corresponding po_itemdet to spo_item.
          spo_item-preq_name = sy-uname.
          append spo_item.
        endif.
      endloop.
      loop at po_acct.
        spo_acct-po_number = po_itemdet-po_number.
        detailkey-number = po_itemdet-po_number.
        detailkey-position = po_acct-po_item.
        read table po_details with key detailkey.
        if sy-subrc eq 0.
          move-corresponding po_acct to spo_acct.
          append spo_acct.
        endif.
      endloop.
      loop at po_sched.
        spo_sched-po_number = po_itemdet-po_number.
        detailkey-number = po_itemdet-po_number.
        detailkey-position = po_sched-po_item.
        read table po_details with key detailkey.
        if sy-subrc eq 0.
          move-corresponding po_sched to spo_sched.
          append spo_sched.
        endif.
      endloop.
      loop at po_hist.
        spo_hist-po_number = po_itemdet-po_number.
        detailkey-number = po_itemdet-po_number.
        detailkey-position = po_hist-po_item.
        read table po_details with key detailkey.
        if sy-subrc eq 0.
          move-corresponding po_hist to spo_hist.
          append spo_hist.
        endif.
      endloop.
      loop at po_hist_sum.
        spo_hist_sum-po_number = po_itemdet-po_number.
        detailkey-number = po_itemdet-po_number.
        detailkey-position = po_hist_sum-po_item.
        read table po_details with key detailkey.
        if sy-subrc eq 0.
          move-corresponding po_hist_sum to spo_hist_sum.
          append spo_hist_sum.
        endif.
      endloop.
    endif.
    h_ebeln = po_item-po_number.
    po_details-po_number = po_item-po_number.
    po_details-po_item = po_item-po_item.
    append po_details.
  endloop.

* Nochmal mit letzter Bestellung
  if h_ebeln ne space.
    clear: po_itemdet, po_acct, po_sched, po_hist, po_hist_sum.
    refresh: po_itemdet, po_acct, po_sched, po_hist, po_hist_sum.
    call function 'BAPI_PO_GETDETAIL'
         exporting
              purchaseorder              = h_ebeln
              items                      = 'X'
              account_assignment         = 'X'
              schedules                  = 'X'
              history                    = 'X'
         tables
              po_items                   = po_itemdet
              po_item_account_assignment = po_acct
              po_item_schedules          = po_sched
              po_item_history            = po_hist
              po_item_history_totals     = po_hist_sum
              return                     = return
         exceptions
              others                     = 0.

* merken aller Daten zur Bestellung in internen Tabellen f黵 Detailbild
    read table spo_head with key h_ebeln binary search.
    move-corresponding spo_head to spo_item.
    loop at po_itemdet.
      detailkey-number = po_itemdet-po_number.
      detailkey-position = po_itemdet-po_item.
      read table po_item with key detailkey.
      if sy-subrc eq 0.
        move-corresponding po_itemdet to spo_item.
        spo_item-preq_name = sy-uname.
        append spo_item.
      endif.
    endloop.
    loop at po_acct.
      spo_acct-po_number = po_itemdet-po_number.
      detailkey-number = po_itemdet-po_number.
      detailkey-position = po_acct-po_item.
      read table po_item with key detailkey.
      if sy-subrc eq 0.
        move-corresponding po_acct to spo_acct.
        append spo_acct.
      endif.
    endloop.
    loop at po_sched.
      spo_sched-po_number = po_itemdet-po_number.
      detailkey-number = po_itemdet-po_number.
      detailkey-position = po_sched-po_item.
      read table po_item with key detailkey.
      if sy-subrc eq 0.
        move-corresponding po_sched to spo_sched.
        append spo_sched.
      endif.
    endloop.
    loop at po_hist.
      spo_hist-po_number = po_itemdet-po_number.
      detailkey-number = po_itemdet-po_number.
      detailkey-position = po_hist-po_item.
      read table po_item with key detailkey.
      if sy-subrc eq 0.
        move-corresponding po_hist to spo_hist.
        append spo_hist.
      endif.
    endloop.
    loop at po_hist_sum.
      spo_hist_sum-po_number = po_itemdet-po_number.
      detailkey-number = po_itemdet-po_number.
      detailkey-position = po_hist_sum-po_item.
      read table po_item with key detailkey.
      if sy-subrc eq 0.
        move-corresponding po_hist_sum to spo_hist_sum.
        append spo_hist_sum.
      endif.
    endloop.
  endif.

* Auswerten f黵 Ampelanzeige (hier wird vorerst nur die WEMNG und WESPS
* in die Auswertung genommen)
  sort spo_hist_sum by po_number po_item.
  loop at spo_item.
    h_index = sy-tabix.
    clear pokey.
    pokey-po_number = spo_item-po_number.
    pokey-po_item   = spo_item-po_item.
    read table spo_hist_sum with key pokey binary search.
    if sy-subrc ne 0.
      spo_item-cl_ind = red.
    else.
      if spo_hist_sum-deliv_qty ge spo_item-quantity or
         spo_hist_sum-blocked_qy ge spo_item-quantity.
        spo_item-cl_ind = green.
      else.
        if spo_hist_sum-deliv_qty eq 0 and
           spo_hist_sum-blocked_qy eq 0.
          spo_item-cl_ind = red.
        else.
          spo_item-cl_ind = yellow.
        endif.
      endif.
    endif.
    modify spo_item index h_index.
  endloop.

  if spo_item[] is initial.
    clear read_po.
  endif.

endform.

*&---------------------------------------------------------------------
*       Lesen Bestellposition f黵  Statusdetailbild
*----------------------------------------------------------------------
form read_po_detail.

* Position mu?in internen Tabellen vorhanden sein - Daten bereitstellen
  sort spo_item by po_number po_item.
  sort spo_head by po_number.
  sort spo_hist_sum by po_number po_item.
  sort spo_acct by po_number po_item.
  sort spo_sched by po_number po_item.

  clear: spo_item, spo_head, spo_hist_sum, spo_sched, spo_acct,
         h_meins1, h_meins2.
  read table spo_item with key pokey binary search.
  h_meins1 = spo_item-unit.
  h_meins2 = spo_item-unit.

  read table spo_head with key pokey-po_number binary search.
  read table spo_hist_sum with key pokey binary search.
  if sy-subrc ne 0.
    clear spo_hist_sum.
  endif.
  read table spo_sched with key pokey binary search.
  if sy-subrc ne 0.
    clear spo_sched.
  endif.
  read table spo_acct with key pokey binary search.
  if sy-subrc ne 0.
    clear spo_acct.
  endif.

endform.

*&---------------------------------------------------------------------
*       Lesen vorhandene Bestellanforderungen zum User f黵 Status
*----------------------------------------------------------------------
form read_requisitions.

  check read_rq ne space.
  clear: req_stat, req_item.
  refresh: req_stat, req_item.

* lesen Positionen
  call function 'BAPI_REQUISITION_GETITEMS'
       exporting
            preq_name               = sy-uname
            preq_date               = sel_date
            closed_items            = closed_items
            partially_ordered_items = 'X'
            assigned_items          = 'X'
       tables
            requisition_items       = req_item
            return                  = return
       exceptions
            others                  = 0.

* f黮len Statustabelle
  loop at req_item.
    move-corresponding req_item to req_stat.
    if req_item-ordered ge req_item-quantity.
      req_stat-cl_ind = green.
    else.
      if req_item-ordered = 0.
        req_stat-cl_ind = red.
      else.
        req_stat-cl_ind = yellow.
      endif.
    endif.
    append req_stat.
  endloop.

  if req_stat[] is initial.
    clear read_rq.
  endif.

endform.

*&---------------------------------------------------------------------
*       Lesen Detail Bestellanforderung f黵 Statusdetailbild
*----------------------------------------------------------------------
form read_requisitions_detail.

* zuerst lesen, ob GETDETAIL bereits aufgerufen
  read table sreq_item with key bankey binary search.
  clear: h_meins1, h_meins2.

  if sy-subrc ne 0.
* falls nicht - nachlesen und in SREQ_ITEM merken
    clear: req_itemdet, req_acct.
    refresh: req_itemdet, req_acct.
    call function 'BAPI_REQUISITION_GETDETAIL'
         exporting
              number                         = req_stat-preq_no
              account_assignment             = 'X'
         tables
              requisition_items              = req_itemdet
              requisition_account_assignment = req_acct
              return                         = return
         exceptions
              others                         = 0.
    loop at req_itemdet.
      read table sreq_item with key bankey binary search.
      if sy-subrc ne 0.
        move-corresponding req_itemdet to sreq_item.
        if not sreq_item-fixed_vend is initial.
          clear bapi1008_4.
          call function 'BAPI_CREDITOR_GETDETAIL'
               exporting
                    creditorid              = sreq_item-fixed_vend
               importing
                    creditor_general_detail = bapi1008_4.
          sreq_item-name = bapi1008_4-name.
        endif.
        insert sreq_item index sy-tabix.
      endif.
    endloop.
    clear sreq_acct.
    loop at req_acct.
      move-corresponding req_acct to sreq_acct.
      append sreq_acct.
    endloop.
    loop at sreq_acct where preq_no eq sreq_item-preq_no
                        and preq_item eq sreq_item-preq_item.
      exit.
    endloop.
    read table sreq_item with key bankey binary search.

* Banf bereits gelesen
  else.
* Kontierung dazulesen - Ausgehend von Einfachkontierung
    clear sreq_acct.
    loop at sreq_acct where preq_no eq sreq_item-preq_no
                        and preq_item eq sreq_item-preq_item.
      exit.
    endloop.
  endif.

  h_meins1 = sreq_item-unit.
  h_meins2 = sreq_item-unit.


endform.

*&---------------------------------------------------------------------
*       Lesen vorhandene Reservierungen zum User f黵 Status
*----------------------------------------------------------------------
form read_reservations.

  check read_rs ne space.
  clear: res_stat, res_stat1.
  refresh: res_stat, res_stat1.

* lesen Reservierungen
  call function 'BAPI_RESERVATION_GETITEMS'
       exporting
            gr_rcpt           = sy-uname
            req_date          = sel_date
            closed_items      = closed_items
       tables
            reservation_items = res_stat1
            return            = return
       exceptions
            others            = 0.

* f黮len Statustabelle
  loop at res_stat1.
    move-corresponding res_stat1 to res_stat.
    if res_stat1-withd_quan ge res_stat1-quantity.
      res_stat-cl_ind = green.
    else.
      if res_stat-withd_quan = 0.
        res_stat-cl_ind = red.
      else.
        res_stat-cl_ind = yellow.
      endif.
    endif.
    append res_stat.
  endloop.

  if res_stat[] is initial.
    clear read_rs.
  endif.

endform.

*&---------------------------------------------------------------------
*       Lesen Detail Reservierung f黵 Statusdetailbild
*----------------------------------------------------------------------
form read_reservations_detail.

* zuerst lesen, ob GETDETAIL bereits aufgerufen
  read table sres_item with key reskey binary search.
  clear h_meins1.

  if sy-subrc ne 0.
* falls nicht - nachlesen und in SRES_ITEM merken
    clear: res_itemdet, bapirkpf.
    refresh: res_itemdet.
    call function 'BAPI_RESERVATION_GETDETAIL'
         exporting
              reservation        = reskey-res_no
         importing
              reservation_header = bapirkpf
         tables
              reservation_items  = res_itemdet
              return             = return
         exceptions
              others             = 0.

    loop at res_itemdet.
      read table sres_item with key reskey binary search.
      if sy-subrc ne 0.
        move-corresponding bapirkpf to sres_item.
        move-corresponding res_itemdet to sres_item.
        insert sres_item index sy-tabix.
      endif.
    endloop.
  endif.
  h_meins1 = sres_item-unit.

endform.

*&---------------------------------------------------------------------
*       Refresh all internal tables and structures
*----------------------------------------------------------------------
form refresh_all.

  clear: mtcom, mtcor, mt06e, bapieban, bapipogn, bapipogna, bapirkpf,
         eban, ebkn, ban, bankey, bsc, bsckey, bantx, bantxweb,
         avail, availweb, avail_key, banwa, new_item, global, material,
         mat_tab, req_item, sreq_item, req_itemdet, req_stat, req_acct,
        sreq_acct, req_text, res_head, res_item, res_itemdet, sres_item,
         res_stat1, res_stat, reskey, po_head, spo_head, po_item,
         spo_item, po_itemdet, po_hist, spo_hist, po_hist_sum,
         spo_hist_sum, xekpo, po_sched, spo_sched, po_acct, spo_acct,
         po_text, pokey, proc, proc_acct, proc_prot, prot_po, prot_rs,
         prot_rq, object_po, object_rs, object_rq, catalogs, h_cat,
         xmw03, h_catalogs, zug, xwmdvsx, xwmdvex, return, redirect,
         h_redirect, sd, sder, f4_bsart, f4_bwart, f4_ekgrp, f4_ekorg,
         f4_matkl, f4_werks, f4_lgort, f4_knttp, f4_meins, f4_waers,
         po_number, salesdocument, my_hook_url, sd_hook_url,
         h_redirect_length, sd_katalog, h_banpos.

  refresh:
         ban, bsc, bantx, bantxweb,
         avail, availweb, new_item,
         mat_tab, req_item, sreq_item, req_itemdet, req_stat, req_acct,
         sreq_acct, req_text, res_item, res_itemdet, sres_item,
         res_stat1, res_stat, spo_head, po_item,
         spo_item, po_itemdet, po_hist, spo_hist, po_hist_sum,
         spo_hist_sum, xekpo, po_sched, spo_sched, po_acct, spo_acct,
         po_text, proc, proc_acct, proc_prot, prot_po, prot_rs,
         prot_rq, object_po, object_rs, object_rq, catalogs, h_cat,
         xmw03, xwmdvsx, xwmdvex, return, redirect,
         h_redirect, sd, sder, f4_bsart, f4_bwart, f4_ekgrp, f4_ekorg,
         f4_matkl, f4_werks, f4_lgort, f4_knttp, f4_meins, f4_waers.

endform.

*&---------------------------------------------------------------------
*       Sichern Daten
*----------------------------------------------------------------------
form save_objects.

* reset interne Tabellen
  clear: proc, proc_acct, object_po, object_rs, object_rq,
         prot_po, prot_rs, prot_rq, sd_katalog.
  refresh: proc, proc_acct, object_po, object_rs, object_rq,
           prot_po, prot_rs, prot_rq.

* f黮len der 躡ergabetabellen f黵 'Entscheidungsbapi'
  loop at ban where update ne space.
    move-corresponding ban to proc.
    proc-catalog = ban-katalog.
    perform value_to_bapicurr using ban-preis proc-c_amt_bapi
                                    ban-currency.
    append proc.
  endloop.

  loop at bsc.
    move-corresponding bsc to proc_acct.
    append proc_acct.
  endloop.

* Analysieren Positionen nach Customizing und Positionsdaten
  if not proc[] is initial.
    call function 'BAPI_PROCOPERATION_GETINFO'
         tables
              procurement_item    = proc
              procurement_account = proc_acct
              return              = return
         exceptions
              others              = 0.
  endif.

* Auswerten Tabellen Proc/Ban und f黮len der einzelnen Objekttabellen
  clear: po_head, po_item, po_sched, po_acct, po_text, return, zug,
         req_item, req_acct, req_text, res_head, res_item, proc_prot,
         error_pr.
  refresh: po_item, po_sched, po_acct, po_text, return,
           req_item, req_acct, req_text, res_item, proc_prot.
  sort proc by obj_to_gen fixed_vend purch_org doc_type agreement
               preq_item.

* Zuerst alle Positionen ohne Objektzuordnung in Protokolltabelle
  loop at proc where obj_to_gen ne req and
                     obj_to_gen ne res and
                     obj_to_gen ne po.
    error_pr = 'X'.
    move-corresponding proc to proc_prot.
    append proc_prot.
  endloop.

* Dann alle Banfpositionen
  loop at proc where obj_to_gen eq req.
    perform read_ban_with_key using proc-preq_item.
    perform fill_req_item.
    loop at bsc where preq_item eq proc-preq_item.
      perform fill_req_acct.
    endloop.
    loop at bantx where preq_item eq proc-preq_item
                  and text_line ne space.
      perform fill_req_text.
    endloop.
  endloop.
  if not req_item[] is initial.
    perform create_requisition.
  endif.

  clear error_rs.
  clear rs_exist.
* Dann alle Reservierungen
  loop at proc where obj_to_gen eq res.
    perform read_ban_with_key using proc-preq_item.
    perform read_bsc_with_key using proc-preq_item.
    perform fill_res_head.
    perform fill_res_item.
* Reservierung pro Position anlegen, wegen der Kontierung im Kopf
    perform create_reservation.
  endloop.

  clear error_po.
  clear po_exist.
* Zuletzt alle Bestellungen abarbeiten
  loop at proc where obj_to_gen eq po.
* Gruppenwechsel in Bezugsquelle abfragen - nur einmal Kopfdaten
    if zug-fixed_vend ne proc-fixed_vend or
       zug-agreement ne proc-agreement or
       zug-purch_org ne proc-purch_org or
       zug-doc_type ne proc-doc_type.
      if not zug is initial.
        clear sd_katalog.
        perform read_ban_with_key using zug-preq_item.
        perform fill_po_head.
        if ban-sd ne space.
          sd_katalog = ban-katalog.
        endif.
        perform create_po.
        clear sd_katalog.
      endif.
    endif.
    move-corresponding proc to zug.
    perform read_ban_with_key using proc-preq_item.
    perform fill_po_item.
    perform fill_po_sched.
    loop at bsc where preq_item eq proc-preq_item.
      perform fill_po_acct.
    endloop.
    loop at bantx where preq_item eq proc-preq_item
                    and text_line ne space.
      perform fill_po_text.
    endloop.
  endloop.

* letzte Bestellung sichern
  check not zug is initial.
  clear sd_katalog.
  perform read_ban_with_key using zug-preq_item.
  perform fill_po_head.
  if ban-sd ne space.
    sd_katalog = ban-katalog.
  endif.
  perform create_po.
  clear sd_katalog.

* Aufruf Kundenauftrag f黵 alle Bestellungen aus SD/Retail
  perform create_sd_order.

endform.

*&---------------------------------------------------------------------
*       Setzen HOOK-URL und rufen SD-Katalog f黵 Buchen
*----------------------------------------------------------------------
form sd_browser_redirect_post.

  clear my_hook_url.
  its-wgateurl my_hook_url.
  field-set 'MM_HOOK_URL' 1 my_hook_url.
  read table redirect with key sd_katalog.
  field-set '~OkCode' 1 'ORMM'.
  its-browser_post redirect-url.

endform.

*&---------------------------------------------------------------------
*       Setzen Subscreens
*----------------------------------------------------------------------
form set_subscreen using sss_frame0 sss_frame1 sss_frame2.

  aw-dynnr_frame_0 = sss_frame0.
  aw-dynnr_frame_1 = sss_frame1.
  aw-dynnr_frame_2 = sss_frame2.

endform.

*&---------------------------------------------------------------------*
*&      膎dern Position 黚er das Detailbild - Verf黦barkeitsdaten
*&---------------------------------------------------------------------*
form store_availability.

  clear bankey.
  bankey-preq_item = bapieban-preq_item.
  read table ban with key bankey binary search.
  h_index = sy-tabix.


* Anstossen Verf黦barkeit bei 膎derung Menge oder Termin
  if ban-material ne space.
    if ban-quantity ne bapieban-quantity or
       ban-deliv_date ne bapieban-deliv_date.
      ban-quantity     = bapieban-quantity.
      ban-deliv_date   = bapieban-deliv_date.
      perform material_availability_check.
      message s047.
    endif.
  endif.

  ban-quantity     = bapieban-quantity.
  ban-deliv_date   = bapieban-deliv_date.

  modify ban index h_index.

endform.

*&---------------------------------------------------------------------
*       Globale Daten merken und in der Struktur GLOBAL sichern
*----------------------------------------------------------------------
form store_global_data.

  move-corresponding bapipogn to global.
  perform get_catalogs using global-mat_grp global-plant.
  perform get_company_code.
  perform get_currency.
  perform check_account_assignment.
  check exitflag eq space.

  move-corresponding bapipogna to global.

  loop at ban where update ne space.
* bei Materialposition Warengruppe nicht aus Global 黚erschreiben
    if ban-pur_mat ne space.
      h_matkl = ban-mat_grp.
    endif.
    move-corresponding global to ban.
    if ban-pur_mat ne space.
      ban-mat_grp = h_matkl.
    endif.
    modify ban.
  endloop.

  loop at bsc.
    move-corresponding global to bsc.
    modify bsc.
  endloop.

endform.

*&---------------------------------------------------------------------*
*&      膎dern Position 黚er das Detailbild - Bezugsquellen
*&---------------------------------------------------------------------*
form store_source_of_supply.

  read table sosweb index select_sos.
  check sy-subrc eq 0.

  clear bankey.
  bankey-preq_item = bapieban-preq_item.
  read table ban with key bankey binary search.
  h_index = sy-tabix.

  ban-fixed_vend   = sosweb-fixed_vend.
  ban-purch_org    = sosweb-purch_org.
  ban-agreement    = sosweb-agreement.
  ban-agmt_item    = sosweb-agmt_item.
  ban-info_rec     = sosweb-info_rec.

* zur點ksetzen Preis黚ernahme in PO, wenn pos. nicht aus Katalog,
* aber nun g黮tige Bezugsquelle sitzt
* bei Katalogpositionen werden nur zus鋞zl. Konditionen aus der
* Bezugsquelle 黚ernommen, aber nicht der Bruttopreis - der aus Katalog
  if not ban-po_price is initial and
     ban-katalog is initial and
     ( not ban-agreement is initial or
       not ban-info_rec is initial ).
    clear ban-po_price.
  endif.

  modify ban index h_index.

endform.

*&---------------------------------------------------------------------*
*&      Form  REFRESH_STATUS_TABLES for new selection
*&---------------------------------------------------------------------*
form refresh_status_tables.

* zur點ksetzen alle betroffenen Tabellen
  clear: spo_head, spo_item, po_item, spo_acct, spo_sched, spo_hist,
         spo_hist_sum, req_stat, req_item, res_stat, res_stat1.
  refresh: spo_head, spo_item, po_item, spo_acct, spo_sched, spo_hist,
           spo_hist_sum, req_stat, req_item, res_stat, res_stat1.

endform.

*&---------------------------------------------------------------------*
*&      Zur點ksetzen  Bezugsquellen
*&---------------------------------------------------------------------*
form reset_source_of_supply.

  clear bankey.
  bankey-preq_item = bapieban-preq_item.
  read table ban with key bankey binary search.
  h_index = sy-tabix.

  clear: ban-fixed_vend,
         ban-purch_org,
         ban-agreement,
         ban-agmt_item,
         ban-info_rec.
  modify ban index h_index.

  clear: bapieban-fixed_vend,
         bapieban-purch_org,
         bapieban-agreement,
         bapieban-agmt_item,
         bapieban-info_rec,
         lfa1-name1.

endform.

*&---------------------------------------------------------------------*
*&      Konvertieren SAP-UNIT in ISO-Unit
*&---------------------------------------------------------------------*
form unit_of_measure_to_iso using uof_unit.

  data: h_unit_iso(3).
  call function 'UNIT_OF_MEASURE_SAP_TO_ISO'
       exporting
            sap_code    = uof_unit
       importing
            iso_code    = h_unit_iso
       exceptions
            not_found   = 1
            no_iso_code = 2
            others      = 3.
* Konvertierung erfolgreich - Feld umsetzen
* fall Konvertierung nicht erfolgreich mit Katalogunit einfach weiter
  if sy-subrc eq 0.
    uof_unit = h_unit_iso.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Konvertieren ISO-UNIT in internes SAP-Format
*&---------------------------------------------------------------------*
form unit_of_measure_to_sap using uof_unit.

  data: h_unit like t006-msehi.
  clear exitflag.

  call function 'UNIT_OF_MEASURE_ISO_TO_SAP'
       exporting
            iso_code  = uof_unit
       importing
            sap_code  = h_unit
       exceptions
            not_found = 1
            others    = 2.
* Konvertierung erfolgreich - Feld umsetzen
* fall Konvertierung nicht erfolgreich mit Katalogunit einfach weiter
  if sy-subrc eq 0.
    uof_unit = h_unit.
  else.
    exitflag = 'X'.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Konvertieren interner Wert in BAPICURR-Format
*&---------------------------------------------------------------------*
form value_to_bapicurr using vtb_preis vtb_preqprice vtb_currency.

  call function 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
       exporting
            currency        = vtb_currency
            amount_internal = vtb_preis
       importing
            amount_external = vtb_preqprice
       exceptions
            others          = 1.


endform.

*&---------------------------------------------------------------------*
*&      Konvertieren externer Wert in internes SAP-Format
*&---------------------------------------------------------------------*
form value_to_sap using vts_currency vts_value.

  data: h_price like ekpo-netpr.
  clear exitflag.

  call function 'CURRENCY_AMOUNT_IDOC_TO_SAP'
       exporting
            currency    = vts_currency
            idoc_amount = vts_value
       importing
            sap_amount  = h_price
       exceptions
            others      = 1.

  if sy-subrc eq 0.
    vts_value = h_price.
  else.
    exitflag = 'X'.
  endif.

endform.

posted @ 2006-11-19 23:13 arron99 阅读(988) | 评论 (0)编辑 收藏

最近SAP宣布其NetWeaver平台通过了Java EE 5兼容性认证,作为SAP在企业级SOA应用中推动开放标准(Open Standards)又一个胜利,在Java平台的标准化进程中又一次在众多竞争产品牵头领跑。开放标准在SAP产品中一直扮演着重要的角色,特别是进入企业级SOA时代后,SAP不遗余力地执行和定开放标准来降低企业级SOA的拥有成本。譬如:SAP NetWeaver作为第一个业务流程平台(business process platformBPP)对开放标准的支持最大限度的提供了SAP和非SAP平台和应用之间的互操作性。
 
在各个重要的国际标准化组织中,都能够找到SAP的身影。举例来说,SAP互联网联合组织(World Wide Web ConsortiumW3C)顾问委员会成员,大名鼎鼎的W3C正是全球互联网基本技术标准的制定者;SAP也是信息结构化标准推进组织(Organization for the Advancement of Structured Information StandardsOASIS)的会员,OASIS是制定和推广SOA标准的主要国际组织;SAP还担任网络服务互操作性组织 (Web Services - Interoperability OrganizationWS-I) 主席,领导制定网络服务在不同平台,系统和编程语言之间互操作标准;SAP同时作为开放SOA协作团体(Open SOA Collaboration)的领导成员,积极定义用于创建复合应用的编程语言无关性模型;等等。
 
SAP推动多方面的开放标准工作,不仅广泛地参与基础技术类标准的制定,更重要的贡献是在业务层面的标准制定工作中充分发挥30+年来为各种各样客户提供商用软件所积累的经验。下表是一些SAP参与的重要开放标准。
 
基础技术类标准(Technology Standards)
 
分类
关键标准举例
基础元数据(Metadata Infrastructure):关注企业级SOA命名,存储,索引和元语表述
UDDI,是通用描述、发现和集成(Universal Description, Discovery, and Integration)的缩写。它是基于XML的描述规范,为全球企业在互联网上发布和查找网络服务提供类似电话黄页的功能
 
WS-MetadataExchange,网络服务元数据交换,网络服务元数据是网络服务的使用说明书,元数据交换帮助服务消费系统自动发现和正确使用网络服务
消息(Messaging):描述如何可靠发送消息
SOAP ,是简单对象访问协议(Simple Object Access Protocol)的缩写,它定义通过基于XML消息访问网络服务,它是服务供应系统和消费系统之间交流的世界语
 
WS-Addressing ,网络服务寻址,它独立网络传输协议定义网络服务寻址所信息的表达方式,好像邮局邮政编码同样适用邮寄航空信或是平信
 
WS-ReliableMessaging,网络服务可靠消息发送,它定义服务供应和消费之间保证消息发送可靠性,好像邮局的挂号信保证送达
管理 (Management) :企业级SOA平台统一的管理接口
WS-Management,网络服务管理,它定义企业级SOA平台统一的管理接口,让不同企业级SOA平台可以被任何符合标准的管理界面操作
安全(Security) :企业级SOA安全可信任互操作
SAML ,安全声明标记语言(Security Assertion Markup Language)的缩写,它定义不同安全控制域之间互操作规范,实现单点登录(Single Sign On)
 
SPML ,安全规定标记语言(Service Provisioning Markup Language)的缩写,跨组织管理身份认证的标准
 
XML Encryption ,对XML消息中加密数据表达和处理的规范
 
XML Signature,防止非法篡改和复制消息,对XML消息应用数字签名的标准
 
业务语义定义语言
分类
关键标准举例
流程定义语言(Process Definition Languages) :定义流程执行序列和条件,是基于网络服务的自动化业务流程的剧本
WS-BPEL,网络服务业务流程执行语言(Web Services Business Process Execution Language)的缩写,它是对由网络服务组织成自动业务流程的复合应用统一表达,这种统一的表达能够被不同的平台解释执行
 
BPEL4People ,网络服务业务流程执行语言用户扩展(Web Services Business Process Execution Language Extension for People)的缩写,它在复合应用的统一表达中增加业务流程中人机交互的扩展描述规范
服务定义语言(Service Definition Languages) :定义网络服务接口,主要是输入输出,是网络服务的产品详细规格说明书
WSDL,网络服务描述语言(Web Services Description Language)的缩写,它定义网络服务的规范描述,是整个网络服务的基石之一。服务供应系统和消费系统据此互相理解网络服务的功能,服务质量,等等,如同网络服务的产品详细规格说明书
 
EPCIS,产品代码电子信息服务(Electronic Product Code Information Service)的缩写,它对于支持射频识别(Radio Frequency IdentificationRFID)的网络服务规范获取应用层事件的方式
 
 
业务语义标准
分类
关键标准举例
跨行业标准(Cross Industry ):用于定义跨行业业务内容的语义,例如:业务对象,消息
 
ANSI X12,美国标准化组织X.12委员会制定的跨行业电子数据交换标准
 
UN/CEFACT,联合国电子商务中心(United Nations/Centre for Trade Facilitation and Electronic Business)的技术规范,SAP企业网络服务采纳其中很大一部分
行业标准(Industry-Specific):用于定义特定行业业务内容的语义
CIDX (Chemical),化学行业业务数据交换
 
RosettaNet (High Tech),高科技行业业务数据交换
 
 
以上挂一漏万地列举了一些标准,制定和倡导应用开放式标准是一项双赢的活动,它为部署SA P 平台的用户提供对其它系统的良好互操作性,同时也保证SAP平台开放性,能容易地被其它系统集成。SAP的开发者网络上提供了进一步的内容
posted @ 2006-11-19 23:08 arron99 阅读(745) | 评论 (0)编辑 收藏

所有关于SOA的讨论几乎都集中在弹性、把应用程序拆解成服务、模块化、再利用、可得性提高以及服务的管理上。SOA可切割、执行任何你交办的任务,而且做得更快、更有效率,成本也比以往用过的其它方法来得低廉。这一切究竟有何意义?这些讨论通常都是空论,未触及企业真正需要因应的实际商业问题或商机。这种情况可能导致SOA陷入只为使用技术而使用技术的危险。上一回这种情况发生时,造成景气衰颓,现在信息工业好不容易才走出不景气、开始复苏。

有没有客户说,他们最担心的是无法凭应用程序打造服务?这种客户我倒没见过。环绕SOA的讨论忽略了客户今天真正需要解决的实际商业问题。电信公司和无线服务提供者担心顾客流失。制药公司日以继夜研发救命的新药,设法让药品快一点上市。医院希望病历能够时时更新,好让医师在紧要关头需要查阅病历时俯拾即得。

我们需要展开不同类型的讨论。这种讨论的重点必须是:解决实际商业问题,对协助客户转型到能迅速响应市场环境变迁的随选(on demand)业务,究竟有多重要。SOA可协助达此目标,凭仗的是提供一个可互通的、可调适的和有弹性的产业标准架构,但最重要的则是与商业紧密相连。几乎任一种产业标准运用成功的论点,对SOA来说都适用。标准让企业更容易做生意,而且产生规模效率。

对SOA可能衍生的利益一无所知的商业领袖,可能在市场上失去竞争优势,被更灵活、懂得善用这种强大新兴技术的竞争对手超越。SOA提供的商业价值极大,分析师预期,短短两年之后,企业为了取得SOA带来的利益,将在软件与服务上投资210亿美元。

SOA被策略性地摆在商业与科技交接处的中心,好让企业能迅速适应瞬息万变的环境。SOA让IT部门跟上商业任务的脚步,作法是从基本的应用程序与IT系统中萃取商业流程,并加以自动化。把商业流程自IT分离出来,会产生极大的商业弹性,让企业领导者加强控制公司内部的交易,以及公司与商业伙伴、供货商乃至于顾客的交易。

几乎每家公司内部的每个商业流程都与科技有关联。有了SOA,一个组织即可对员工、顾客和商业伙伴提供服务,无须像从前的专属方案那般投入大量的时间与金钱。因为人人都依循同一套标准,企业就能够快速反应、弹性应变而且具有竞争力。横跨整个企业部署SOA,会释出IT资源,有助于确保科技投资集中在能够带动业绩成长的核心功能。

客户着手建构SOA时,必须根据业务的需求而行。务必发展出一套详细的计划,认清公司为支持改良式商业流程所需要发展或加入的服务为何,并订定优先级。一家公司——或更明确地说,一个IT部门——不能只是凭空猜测哪些服务可带来最大的附加价值,必须有一套系统性的作法,始能发展出一份部署服务导向架构的蓝图。

这种作法有助于确定依商业流程模型订定的目标得以确实落实,并以有效率的方式产生最大的成效。横跨整个企业部署SOA,会释出IT资源,有助于确保科技投资集中在能够带动业绩成长的核心功能。

回到我刚开始的问题,我怀疑我今年或未来会碰到任何一个主动要求非SOA不可的客户。 SOA是一份蓝图,是一种达到目标的手段。客户需要的是弹性,以便把营收扩大到极至、提供更好的客户服务、降低成本,并协助符合法令的规定。SOA正是协助他们达到那些目标的一种产业标准。
 

posted @ 2006-11-19 23:07 arron99 阅读(634) | 评论 (0)编辑 收藏

通过阅读本文,您将了解面向服务的架构(Service-Oriented Architecture,SOA)、XML 和 XMLBeans 如何在解决实际商业问题中发挥重要作用及其原因,文中将以娱乐业为例进行案例分析。本文的目的并不在于介绍代码,而是让您了解在需要使用 XML 时如何使用 XMLBeans 及其原因。

  面对日益升级的软件复杂度,企业架构师的注意力逐渐集中到了一种能够解决系统集成问题的方法 —— 面向对象的架构(SOA)。从本质上来说,SOA 就是要通过增强业务与信息技术(IT)的运作关系来提高企业效益。

  SOA 将请求/应答设计范例应用于同步和异步应用程序中。在这种方法中,业务应用程序的逻辑和功能以服务的形式体现。应用程序开发人员或系统集成人员可以通过组合一项或多项服务来构建应用程序,而不必知道服务的底层实现方法。通过这种方式可以实际地整合所有 IT 资源,包括孤立的数据和以前不兼容的遗留系统。

  在 SOA 范例中,提供者与消费者通过消息进行通信。消息传递接口必须与平台和语言无关。因此,通常使用符合 XML 模式的 XML 文档来构造消息。当然,也常常以 XML 格式存储应用程序数据。

  XML 提供了基本语法,您可以使用基本语法在各种计算机、各种应用程序和各种组织之间共享信息,而无需经过多层转换。XML 之所以重要,是因为它为构建集成基础设施提供了通用的标准化平台,从而为企业应用程序集成工作提供支持。

  为什么使用 XMLBeans?

  使用 XMLBeans 可以将 Java&#8482; 编程语言与 XML 结合使用。Java 编程语言是一种面向对象的语言,它基于开放的、公开的标准,可移植、健壮而且可靠。由于具备这些特点,Java 编程语言已被广泛接受并在包括娱乐业在内的许多行业中得到了实现。然而,XML 与 Java 编程语言不兼容。而 XMLBeans 就是扫清这一障碍的最佳选择。

  XMLBeans 用于 XML 数据绑定。使用 XMLBeans,Java 应用程序就可以充分利用 XML 的优势。XMLBeans 使用 XML Schema 来编译用于访问和修改 XML 实例数据的 Java 接口和类。使用此项技术,您可以将 XML Schema 编译到一组 Java 类中使其具有以下功能:

  遇到任何 Schema 时都使用 XMLBeans根据需要在任意级别访问 XML 数据XMLBeans 提供了以下应用程序接口(API)用于数据绑定:

  XmlObject:如果 Java 类是通过 XML Schema 生成的,则这些 Java 类都是派生自 XmlObject API。

  XmlCursor:XmlCursor API 提供了对 XML Infoset 的低层访问权,它表示 XML 实例中的光标位置。

  SchemaType:用于底层元信息的 XML Schema 对象模型。

        XMLBeans 编译器将生成 XML 模式的对象表示。这个对象表示是一组表示模式的结构和约束的通用 Java 类和接口。在生成 Java 类和接口后,符合该模式的 XML 实例文档就会与之绑定。绑定过程包括以面向对象的方式使用 XMLBeans API 来访问实际 XML 实例文档中的数据。

  如果使用功能强大的 XMLBeans,则无需为使用 XML 而编写所有代码。您可以轻松地在应用程序中使用 XML。如果不使用 XMLBeans,您就必须编写代码来利用模式的每一部分。试想:用 XMLBeans 为模式生成类,假定有若干个一对一、一对多和多对多关系需要管理,使用 XMLBeans 可以轻而易举地完成这一任务:

  安装 XMLBeans。

    编译模式来生成 Java Archive(JAR)文件。

    编写代码将 XML 实例绑定到表示模式的 Java 类型上。清单 1 提供了一个简单的例子:

    清单 1. XMLBeans 简单易用

   File xmlEntertainFile = new File("c:\entertain.xml");

   // Bind the instance to the XMLBeans types that were generated.

   EntertainDocument entDoc =

   EntertainDocument.Factory.parse(xmlEntertainFile);

   // Get and then print pieces of the XML instance.

   Entertain ent = entDoc.getEntertain();

   Entertain[] entArray = ent.getEntertainArray();

   for (int i = 0; i < entArray.length; i++)

   {

   System.out.println(entArray[i]);

   }

  娱乐业

  那么,所有这一切是如何在现实世界里实现的呢?首先,计算能力发生了不可思议的转变。随着 SOA 的推广,计算能力越来越多地从传统星型模型(在这种模型里,高性能的服务器共同组成集线器)转到更加对等的模型上,组合网络的优势在于比中央服务器具有更强大的计算能力。实际上,中央服务器就变成了网络中的节点。随着 Internet 和高速 Internet 连接的发展,娱乐业走向了数字化。大多数新产品的销售和发行已经或即将采用数字化方式。

  信不信由你,娱乐业因声名狼藉的 Napster 采用这种计算范例而成为最早利用这种转变的行业之一。最近由 South by Southwest(SXSW, Inc.)举办的研讨会又用事实证明了娱乐业仍是先驱者。SXSW 是一家私人公司,位于得克萨斯州奥斯丁市。这家公司专门承办娱乐界及相关媒体业人士的会议和节庆活动。该公司最近承办的会议(2006 年 3 月 11 日至 14 日)讨论了数码创意和电影制作工作者在开发和制作时可利用的工具。其中一次小组讨论专门探讨了发展 XML 在娱乐业的应用:Looking for XML in All the Wrong Places。该公司的会议材料中写到,"Everyone wants to do everything with XML."

      电影业

  电影业更是 XML 的热情拥护者。电影业已经在包装和发行数字化产品给影院和其他实体的进程中迈出了重要步伐,这其中就包括使用 XML。2005 年 7 月,致力于电影数字化的 Digital Cinema Initiatives(DCI)组织与活动影像和电视工程师协会(Society of Motion Picture and Television Engineers,SMPTE)标准委员会的成员合作,发布了获得主流电影制片公司认可的数字影院的系统规范。标准涵盖了 XML 在包装、文件格式、帧率和调速、编辑播放列表和包装清单等方面的使用。

  现在网络上可以找到有很多面向电影业的新应用程序,例如 Apple 的获奖软件 Final Cut Pro,该软件支持开放的、基于标准的 XML Interchange Format。在 Final Cut Pro 中,XML Interchange Format 说明了项目的各个方面。从剪辑、挂片及片段,剪接、转场及效果,到调色设置和关键帧,Final Cut Pro 都为创作人员和编程人员提供了找到影片设计中的亮点的方法。在 Final Cut Pro 中使用 XML 为您提供了一种开放、透明的纯文本格式,可通过多种多样的工具来阅读和操纵此格式。使用 XML Interchange Format 意味着 Final Cut Pro 用户可以与支持 XML 的任何应用程序或系统(包括数据库系统、网络服务器、基于 HTML 的 Web 创作工具和图形化应用程序)共享关于项目的各种信息。还意味着基于 Java 的应用程序可以使用 XMLBeans 轻松地访问这些数据。现在,开发人员可以创建与 Final Cut Pro 完全集成的基于 Java 的应用程序,也构建可节省大量时间和金钱的自定义后期制作管道,这都要归功于 XMLBeans。

  XMLBeans 与业内发行

  当然,后期制作结束后,要考虑的最重要的事情就是发行,不发行就没有利润。通过 Amazon.com 等代理商,Internet 已经成为各种形式媒体产品(例如 DVD、各类音乐,当然还有图书)发行的重要组成部分。很多人都知道 Amazon.com 是图书经销商,其实它也是娱乐业发行网络的一员。由基于 XML 的协议组成的 Amazon Web 服务(Amazon Web Services,AWS)提供了对 Amazon 的技术平台和产品数据的直接访问功能,从检索一组产品的信息一直到将产品放入购物车,从而提高应用程序的性能,或添加更好的搜索功能。使用 AWS,您可以直接访问 Amazon 的强大平台来启用和增强您的应用程序。

  Amazon.com 并非娱乐业的惟一 Internet 资源。Netflix.com 等实体也是发行网络的组成部分。Netflix 使用 RSS(Really Simple Syndication)提要来提供对其内容的访问。开发人员可以使用 RSS 提要创建各种有趣的新方法,来显示 Netflix 提供的信息。当然,RSS 提要不仅限于 Netflix。您可以在许多站点(无论是新闻通讯社的站点还是内容提供商的站点)中找到这些支持 XML 的文档。

  可以想像,这种新途径不但能带来巨额利润,而且几乎不会引致与数字版权管理(Digital Rights Management,DRM)和盗版相关的任何问题。随着新发行渠道的开辟,影视制作方(摄影棚、独立制作室等)必须要能与有意购买产品的各方(包括影院、电视台、租赁商和付费点播提供商)进行互动。目前,业内有几家成员正与电子商务组织探讨,在使用 Internet 这种最新或许也是最节省成本的发行渠道发行影视作品时,怎样才能做到既有利可图又安全可靠。这种交互构成了与 DRM 相关的问题。

        广泛使用 XMLBeans 的关键在于建立整个娱乐业都接受的开放式 XML 标准。不过,如果您要进行娱乐节目创作并且拥有 XML 编码标准(哪怕是您自己的 XML 模式),就可以利用 XMLBeans。只要使用 XML(无论标准与否),您就可以使用 XMLBeans 来提高创作效率,减少必须测试和维护的代码,并且达到松散耦合和更为面向服务的目标。在 XML 标准补充到 DRM 领域中之后,您还可以利用 XMLBeans 来执行和使用标准。通过本文及其他文章中列出的 XMLBeans 的技术优势,您可以看到一种应用 DRM 标准的一致方法,从而帮助您简化部署及与合作伙伴、发行商和客户交换版权数据的过程。DRM 领域内下一代标准是开放数字版权语言(Open Digital Rights Language,ODRL)。您可以从 ODRL 站点下载 XML 模式。

  若要从 ODRL 站点下载 XML 模式,请执行以下步骤:

  下载并安装 XMLBeans 和将在其中部署代码的容器。
  在 ODRL 站点中检索 Expression Language Schema 和 Data Dictionary Schema,然后将文件保存到您创建的容器中。
  访问 XMLBeans Web 站点,然后通过 XML 模式文件生成 XMLBeans。选择保存 Java 源文件的选项。生成的 xmlTypes.jar 文件包含使用 ODRL 和 XMLBeans 所需的类。
  使用 XMLBeans 还有很多其他优点。XMLBeans 可能是目前市场上最成熟的 XML 对象绑定技术,而且免费。总之,XMLBeans 绝对是您在使用 XML 时值得考虑的工具。随着 XML 在娱乐业内的应用的快速发展,如果要使 XML 内容可为基于 Java 的应用程序所用,您会很容易地看到 XMLBeans 的优势。

  结束语

  娱乐业在多种层面上为很多应用程序使用了 XML。由于 Java 编程语言是世界标准的面向对象的编程语言,而 XML 已成为娱乐业首选的数据格式,XMLBeans 将很快成为首选的 Java 绑定工具。XMLBeans 可创建用于 Java 开发的类,从而避免重复劳动,节约时间和成本。两者结合在一起,为开发客户和供应商应用程序提供了切实有效的方法。

posted @ 2006-11-19 23:05 arron99 阅读(707) | 评论 (0)编辑 收藏

天下无贼》这个影片起因就是傻根带着6万元钱坐火车回家,如果说铁路就是SOA,那么傻根坐了火车,但是在途中他还是丢了钱。这是为什么呢?因为傻根只是使用了铁路(SOA架构)但是却没有使用SOA的服务,或者说没有使用相关的解决方案。
其实傻根可以使用邮政的服务,如果那样《天下无贼》的故事就不存在了,但是他没有使用。正是没有使用相关的服务,傻根的6万元钱才惹来后来的风波。傻根的故事其实和很多企业一样,傻根之所以不使用邮政服务是舍不得花那一点点邮费,就像很多企业一样,即使花了很多钱搭建了基础设施却不舍得在软件和解决方案上投入,最终的结局就是使基础设施失去了其发挥作用的效率。
在影片中,我们可以看到傻根不仅没有选择邮政服务,即使在火车上,傻根选择的也是最低档的服务——硬座,而火车上其实还提供了很多更高级的服务,比如黎叔坐的就是软卧,如果傻根选择软卧,安全系数肯定会高一些。从这里我们也可以看出,即使采用同样的基础架构,但是由于选择服务或者解决方案的不同,获得的效果也是不同的。
SOA和铁路的发展一样,铁路也有快慢车之分,车上也有以硬座、软卧,车站周围也有档次不同的宾馆、酒店等设施,这些都说明SOA的关键不是在于架构有多好,而是选择的服务是不是合适。
除了在服务上的不同之外,建设SOA也必须要有全球化的视角,这需要做到四个就绪——包括理念就绪、品牌就绪、网络就绪和服务就绪。
近五十年以来,软件业的中心就是美国,后来通过爱尔兰渗透到欧洲,事实上它是通过欧洲的一个门户,通过以色列来做加密和核心的软件,通过墨西哥来做南美的渗透,通过印度来做外包,除了日本的软件比较特殊一些,它完全是通过嵌入式的软件来发展。中国可能更复杂一些,但基本上来说五十年来整个软件全球化的过程都是通过美国来制定标准向全球辐射的,20世纪90年代以后从全球化的角度来说,从政治和经济体的角度来说,又发生了一些变化,比如说新自由主义,完全是从政治和经济体的角度来考虑这个全球化的,包括WTO,其实都是从政治和经济体的角度来考虑全球化的,当然到2000年以后突然发现软件业和互联网是密不可分地融合在一起了,所谓Internet、web2.0事实上都是在这个背景下,所谓的大策就是理念就绪。
品牌就绪其实就是美国的另外一个发明特许经营,就是完善通过品牌化的手段积累资金来做商业,成立一个品牌的体系。
另外一个就是网络就绪,网络就绪其实就是Internet,包括SOA通过企业的渗透,2.0通过个人的渗透,完全搭建了一个全球化的列车,在这个全球化的列车上会发现发展中国家或者是所有的国家只要想搭这个车都可以上来,或者是说所有人都可以上来。
但是上来之后会发现这个待遇是不一样的,因为这个车厢不一样,所以就好比傻根和黎叔坐的车厢不一样,这个时候你就会发现傻根为什么没有任何服务,黎叔坐的车厢有一套很标准化服务网络在支持他,那么在这个时候网络就绪是远远不够的,这时候必须有一套成熟的、全球化的服务体系来支撑,所谓的SOA应用的含义就应该把服务也加进去,它必须有一个服务的功能在里面,这就是服务就绪。
有了这四个就绪,建设SOA的条件才算成熟,才有可能搭建SOA架构。在四个就绪里面,头三个基本已经形成,只有服务的标准还没有形成。
解决这个问题的有利条件是全球化,全球化让企业拥有了共同的平台,包括标准的网络推介语言,基于全球化的标准服务接口,使各个企业之间、社会的各个部门之间的联通有了一个沟通的共同语言,这样的话能够使信息的分享以及信息的流动更加顺畅,使所有企业能够更加充分发挥SOA的价值。
就像铁路,铁轨的宽度有了标准之后,铁路的发展就实现了飞跃,SOA也是一样,当服务的标准形成之后,其发展速度也会大大加快。但值得注意的是铁路的服务也不是一个标准,其中有共性的,也有个性的。比如一些基本需求,吃喝拉撒等等这是所有人都需要的,但是傻根和黎叔需要的服务还有不同的地方,傻根是图便宜,黎叔要的是舒服,所以,两个人做的车厢、吃的饭、喝的水是不一样的。
SOA也是如此。 
posted @ 2006-11-19 23:02 arron99 阅读(982) | 评论 (0)编辑 收藏

XManage 2.0 from uXcomm Inc,一家位于美国俄勒岗州的创办三年的公司本周公布: SOA和Web服务已经开始从原有的整合软件功能向管理企业硬件基础设施转变。

  据其产品计划副主席Craig Wassenberg所说,比如HP、Dell和Motorola等一些知名厂商也是由来自IBM的系统管理专业人员在SOA出现之初建立起来的, 因此产品开发软件代理商管理诸如刀片服务器之类的硬件一开始就可以建立在SOA的基础上。

  他还表示,该公司所开发的软件架构是在SOA普及之前几年的面向服务架构。该公司拥有的所有管理软件都是以服务来架构的:就像在SOA业界中所有服务都有明确的用户界面一样,其软件中有一种服务定义语言。每一种服务封装并抽取实现服务的方法。遗留软件系统能通过封装被整合进这个联结较为松散的服务之中。

  据Wassenberg说, UXcomm 直接将其管理软件销售给设备、软件系统制造商,然后制造商再将其直接整合入他们所建立的硬件应用系统以适合相应企业的硬件基础设施。在逐步实现SOA的过程中需要让厂商在现有的管理系统基础上将其产品更多的整合起来以适应外界的变化和需求。SOA 也能让uXcomm利用新兴潮流、开放资源。

  他还表示,在系统管理行业中有一些好的开放性的技术资源可以利用,除此以外来自不同供应商的各种商务软件也可以成为资源。 在这种情况下,我们在某种意义上就成为了SOA式的管理联结,将CA, Tivoli与HP开放界面连接起来。通过这种SOA方案,所有拥有合理界面的软件,不管是API也好,protocol界面也好,我们都能进行改编,封装并创建新的服务与之相互作用。

  随着SOA其他方面的发展,系统管理出现一种新的标准, 即由分布式管理任务组(DMTF)开发的WS-Management,Wassenberg将之简称为WS-Man。

  目前,在系统管理行业中出现了一股创建面向服务的管理协议的推动力。WS-Man是在SOA顶层运行, 规定了以XML为基础的信息,可以定义句子构造、语义并且在系统管理行业中广泛运用使SOA易于管理。因此,支持WS-Man协议的设备将拥有一个面向服务管理界面。而根据用户和设备的不同,各种方案就能通过整合这些松散联接的服务建立起来。

  最后,Wassenberg表示uXcomm正在与顶级供应商在系统管理空间中合作,以实现面向服务架构管理方案。
posted @ 2006-11-19 23:00 arron99 阅读(630) | 评论 (0)编辑 收藏

 2006,SOA闹的沸沸扬扬,连11月份的系统分析师的考试SOA都成了案例分析的必答题。但是大多人一听到SOA,感觉还是很茫然,SOA如何整和现有的企业系统?SOA关键是什么呢?

        我个人认为,SOA的关键是用新方法去思考,不管投资的多少,即使不搭配任何产品也可以实现SOA。SOA可以考虑先抛开技术,思考企业所存在业务。企业应该依商业逻辑划分系统层次,决定哪些应用需要提炼成为服务,然后从现有的系统中提取服务进行集成。如果紧密捆绑而无法拆解系统、开发者离职无力修改,或者委外项目无法取得程序代码等情况,则可以考虑重新开发,也可以考虑按传统的方式与SOA架构的新系统进行集成。现有系统全面转换为SOA架构的系统需要一个比较长的过渡期和比较大的IT投资。

posted @ 2006-11-19 22:57 arron99 阅读(687) | 评论 (0)编辑 收藏

Eclipse到现在已经是5年的历史了,2001年11月7日,  IBM  首先发布了这个开源项目。这五年的历史是Eclipse 高速发展的历史,从原来的默默无闻到现在的一鸣今人,到现在已经被下载了数千万次.你可以看到在Eclipse社区有多少人对eclipse 的热爱(http://birthday.eclipse.org/images/map.php?individual)就能反应了这点。现在的Eclipe已经不是单单一个IDE那么简单,而是一个完整的平台,甚至是各大厂商对SOA解决方案的最好的平台。现在很多的厂商把他们的产品集成到了Eclise,如websphere studio,bea workshopstudio,甚至像国内普元的EOS也是集成了Eclipse。Eclipse的一个新时代已经到来。

     Eclipse发布了2006年的Release Train,代号Callisto,是以Eclipse 3.2为核心的10个Eclipse项目同步发布的稳定版本。它包括了10多个不同的项目组,200多个开发者,用几年时间写了700多万行的代码而型成的。这写开发者来自包括美国,加拿大,法国,俄罗斯,中国等12个国家和地区。核心层主要新特性包括独立OSGi运行时,WTP和TPTP增强对Web Services的支持,DTP和GMF的1.0版,新增对Intel OSX的支持,及对Vista支持的预览版。各子项目自身也有许多新特性。Eclipse已开始筹划明年的Release Train,代号Europa。
Callisto 包含了以下几个重要的功能和框架:

Business Intelligence and Reporting Tools (BIRT) 2.1
C/C++ IDE (CDT) 3.1
Data Tools Platform (DTP) 1.0
Eclipse Modeling Framework (EMF) 2.2
Graphical Editor Framework (GEF) 3.2
Graphical Modeling Framework (GMF)1.0
Eclipse Project 3.2
Test and Performance Tools Platform (TPTP) 4.2,
Web Tools Platform (WTP) 1.5
Visual Editor (VE) 1.2..

有兴趣的朋友可以到这个链接去看一下他的具体信息。

    有了Callisto,也为了使得Eclipse成为一个真正的开发平台。 于是我相信在未来的几年中,随着SOA的不断深入,基于EClipse平台的开发将达到一个顶峰,所有IT厂商都会借着Eclipse这面大旗宣传他们自己的解决方案在Eclipse上的应用的。

posted @ 2006-11-19 22:56 arron99 阅读(713) | 评论 (0)编辑 收藏

首先最让学生们感兴趣的是MAERSK(马士基物流)公司的笔试题。马士基每年录取者和参加应聘者的比例是1:1000,极高的淘汰率让能进入马士基的人成为一个神话。由于参加笔试者不用做任何准备,既不用准备英语,也不用回答诸如“为何要进我们公司”或者“你有什么特长”的问题,因此流传甚广的“另类”笔试题还是吸引了一大批参加者。此类题目是绝对不对外公开的,试卷当场收回,据说此试题MAERSK每年要用,因此绝对保密。

经做过试题的同学透露,笔试分为性格测试和快速智力问答两部分。所谓性格测试,就是从善良、果断、热情、勇敢、孤僻、激情等描写性格的词语中分别勾出符合你对自己的评价和朋友对你的评价的词语。可不要认为尽挑一些褒义的词语就肯定通过,公司会根据你的选项输入电脑制作出个人发展曲线图,从中能看出某人的发展潜力和远期竞争力。第二是快速智力问答,要求在12分钟内回答50道题目,而这些题目都是最简单的智力测试题,如“2、4、8、16一系列数字,按规律下一个该是多少”类似的题目,连小学生都会做,关键是时间问题,看12分钟内最多能做出几道,目的当然是考察你的反应速度。

马士基物流,世界排名前列的物流公司,每次招聘的都需要经过笔势然后面试等等。据说他的笔势有题库,每次会抽题考应聘者。偶刚刚参加笔试回来,跟大家分享一下。 笔试题分为两部分,性格题和逻辑题。 性格题基本是是人才测评题,一张纸两面,题目不一样,选项都是一样的!所以应聘者一定要细心!不需要任何技巧,没有好坏之分,只要老实回答就行。可怜我,看题不仔细啊,所以回答的不好。题目是这样的,正面题目:“你在别人眼中是怎样的?”然后一大堆形容词。反面题目:选项还是那堆形容词!一模一样!只是题目:“你希望自己是怎样?”两题不好区分啊,一定小心就是! 逻辑题累似iq题,有计算的,也有推理的,题量巨大,时间10分钟,不可能完成的!只是马士基的招聘系统会根据你答题四路和类型,分析你的人才类型,以及能力,从而确定你是否适合公司。还是那句,不在乎你回答问题的多寡和技巧,就是要根据他们的标准衡量你是否适合。 总的来说,细心是关键,其他的无可准备。

MAERSK 笔试包括两部分:逻辑(部分题目类似gre/gmat)与性格测试,上述测试为中文。逻辑测试进行12分钟,要求尽可能的多做题,保证一定的正确率。当然,很少有人在规定时间内完成全部试题。性格测试比较轻松。此外,测试前需要添一张application form。    
只有通过笔试,才有面试可能。    
面试一般有三轮:一面是你以后的同事,二面是部门经理,三面是公司经理。当然,各个分公司可能会根据情况有所不同。  
面试会涉及一些专业问题,按照常规会测试英文。    
Maersk内部有一个MISE培训很有名,只是名额有限。


在MAERSK测试中最重要的是性格测试,也就是你做的 “你认为别人如何评价你”和“你如何评价自己”两部分。一般人在做这些的时候都会选择那些看上去比较漂亮的词语,比如说活泼,正直,诚实什么的褒义词。如果你都选这些那很遗憾你基本上快没戏了(当然也不绝对的)。如果你能在选择的时候考虑多一点,(它在发放“你认为别人如何评价你”和“你如何评价自己”考题时候有个时间差,而且栏目里选项内容是完全一样的,一般人第二次选的词语会和第一次差不多)选些什么卑鄙,叛逆,之类的适合自身的有个性的贬义词,那恭喜你笔试中最重要的一关你已经过了,其他的3部分只要不出大错,你基本上就可以捞到一个面试机会了,还有忘了说只要通过笔试,MAERSK的面试只是个走过场,不要太紧张,只要你不是太烂太笨,一般都会过,然后就可以在它漂亮的办公室里过着每天机器般的生活了。呵呵!还有在MAERSK里,做美国线和拼箱的客服是最累的,其他的也都还可以,只要你够细心,什么都好。


IQ测试题,好像共五十题,很EASY就做了四十题以上有把握是对的(其实我坐车去深圳都坐晕了,要不可以做更多),由此看来IQ题难度还是不大的。性格测试题我觉得只要前后不矛盾,别人对你的评价(要求)少选些就行了。我是根据实际情况来做的。  然后回广州,第二个星期接通知,通知时在电话里先用英语面试了一轮,约五六分钟,可能觉得还行就通知去面试了。于是又坐两个多小时的车到深圳,去到那里被一个HR问了约十几分钟问题,然后她说她没有问题问了,而另一个人要面试我。接着一个小女孩(我认为她年纪不大,她自己说是去年到马士基的)来面试我约十五分钟。不是做HR的,问得十分不专业,可能是以后的同事。为了这三十几分钟花费了我两三百大元。  过了两天又接到电话,通知去最后面试。这次坐车到罗湖火车站,然后坐12路公车,因为太困,在车上睡着了,只要两个站的公车结果坐到梅林总站了。只得又晕头转向的往回坐。去到又有个HR说要再测一次IQ题,题目比第一次难一些,我自己估计只做对了三十五题左右。(这些测试的正确率和数量好像跟以后的入职工资有一点点关系的)。做完测试后五六分钟,HR通知有个经理会面试我。中国人来的,又被他用英文折磨了四十分钟左右。  然后第二天就来电谈工资了。    马士基的HR真的很撒大牌,态度跟别的所有企业的HR都不同,特不耐烦,特恶劣。都谈工资了,问清楚一点都生气,说你问题咋这么多?好像不可以问个明白似的。看到上面说马士基态度恶劣,我完全同意。  马士基的工资不高,就是同行业中等水平略高一点。比我期望值差了一截。本人估计在深圳租房700元+水电上网250元+吃饭600元+交通300元=1852元。这应该是基本生活费了。SO SAD。去不去好呢?!


关于笔试,性向部分非常重要.马士基的工作作风是非常tough的,因此要尽量选择反应自信开朗,外向,坚强,追求完美这样的词.那么周围人对你的看法就要反过来选了,尽量少选是最好,选些无关紧要的,比如“轻松自在“啊,“稳定“啊等等.  面试时一定要条理清楚,问什么就直接答,然后再做阐述; 而且还要注意把相关的对自己有利的信息尽量提供出来,哪怕人家没有问到.

船东给薪水都是本身有个固定的标准,你要得很高超出的话,他也不会答应。福利方面,MAERSK有社保,医保以及住房补贴(外的户口的话会直接在每个月按工资发给你)。面试问题不外乎是对自己的评价,职业理想,离职及来此求职的原因,你觉得自己是否及如何做好应聘的工作。



但是对应聘这一块儿还是有点发言权的    
刚开始是逻辑和性格测试,有点象行政能力测试,我在达飞的同学的笔试也是如此。    
两张卷子,12分钟一张,题目很简单啊。我第一张没做完,主要是由于比我们早进去5分钟的几个人做完了在聊天,吵死了,我对他们大喊:SHUT UP!第二张卷子,我放松了下,大约9分钟做完吧。    
性格测试全部胡填,1分钟搞定。    
据说笔试是过关就OK,更重要的是PI。    
几天后就是一面,是SEALAND和LOG,还有FINANCE的MANAGER面的,一通狂侃,问什么问题都忘了,不过和网上流传的面试流程大同小异。要自信,很重要!  
面完了,三个MANAGER问我还有什么问题,我说MAERSK怎么发音,这时LOG的MANAGER才说,哦,没考口语~我又做自我介绍,他们又问了些问题什么的就结束了~    
然后下一面就是部门的主管,我在SEALAND,就是OPS和CUS的TEAMLEADER面,他们都很NICE,但问题非常细致,我被面了半个小时。    
过了几天,就是去MANAGER的小房间去谈合同和SALARY。    
我们公司是很稳定,很少招人。招我来是由于一个人跳槽走了。    
工作压力很大,东西比较烦琐,中午只休息一个小时。我刚来,所以每天都早到晚退,一般不需要加班。周末周日都不加班。  
一般如果晚上加班超过8点,打车费(50以内)和晚餐费(50以内)都是可以报销的。    

另外,我们的态度我觉得还可以,至少我在做LOCAL SERVICE的时候接电话态度都非常客气。只是有些客户,尤其是大客户,态度不好的说。    
我们出提单的速度也不慢拉。    
至于楼上的一些攻击,说我们公司态度不好,我想有些时候可能是工作太多,人手不够吧,我常常两个座机一起响,手机也响,其中的一个座机还提示另有一个电话进来。  
还有另外的原因,就是我们公司绝大多数业务做的都是FOB,客户源不需要太发愁。    
PS:如果就船公司的规模,实力来说,MAERSK的确是最大的,无论是柜子的数量还是船的数量,和每年的出货量。  


马士基这点我还是喜欢它,不看学历证书的,只看能力。而且每周五必须全天说英文,其实这份工用书面英语较多,一部电脑,一部电话及可。居然没想到笔试关过了而且还是高分。顺便说一句能进马士基简直是奇迹,一千个人投简历只会录取一个。当然那种低级职位除外。它开始就是电话里用英语面试,过了再通知几时笔试,笔试就会刷了绝大多数人,我那是什么都没想,身上就揣着两个本,一个四级,一个毕业证。真是初身牛犊不怕虎。笔试很简单,给你两张纸,上面全是形容词,描述个性的,什么聪明、果断等。一张纸要你勾别人对你的期盼,一张要你勾你对自己的评价。两张的形容词都差不多。你别以为尽拣好的挑就行,他会用你勾的东西在电脑里做个关于你能力及发展价值的曲线。这些考试题有几套,绝对保密的。每次都用同样的东西。有的人过了宝结、飞利浦、DELL的不一定能过它的笔试题。另外还有一个测试是要你在12分钟内做题,题目都是小学数学,也有英语同义词、逻辑推理,很简单,就是看你的正确率,好像共是60道题。我也就答到40多题就到时间了。想不到居然过了,后来打电话给让我再让考一次,说上次是海运部,这次招的是物流公司,又给我过了,上网查 了下资料,才知马士基是世界航运第一巨头。那时我英语很烂的,现在好一点,第一次面试是TEAM MANAGER,对我印象蛮好的,就是英语出问题,开始表现不错,后来要我用英语介绍一下自己的优缺点,我慌了,汉语我还不知道说什么呢,何况用英语?支支吾吾几句。过后等不到复试通知,败北。

posted @ 2006-11-19 22:02 arron99 阅读(1131) | 评论 (1)编辑 收藏

也许你不必开发自己的操作系统,但如果你真想体验一下底层技术开发带给你的快乐,你就很有必要参与一下编译操作系统内核的工作。因为只有如此,你才可能真的精通一个操作系统。早在2000年,国内开源软件的早期倡导者宫敏先生就给出了这样的建议。


Linux内核发展简史
1991年9月,Linux 0.01诞生,更确切地说,是0.01版的Linux内核诞生了。1994年3月,Linux 1.0推出,Linux内核开始真正成形。1996年6月,Linux推出了2.0版本的内核,从此Linux的大版本就没有改动过。2001年1月,Linux 2.4推出。2003年12月 ,Linux2.6推出。至本月,Linux内核又发布了2.6.12版本

Linux内核发展到了2.4的版本,已经是一个较为成熟的版本了。支持所有64位处理器、面向企业、全方位整合系统资源、需要更少内存的Linux 2.4内核完整版,将为人类打开一个美丽的新世界。
解密Linux内核2.4

2.6相对于2.4有很大的改动;它引入了许多新的特性,同样也去除很多过时的特性。它在哪些方面有大的改动?它对Linux的开发人员以及其他层面的Linux用户可能有什么样的影响?阅读此文,你将得到答案。
Linux 2.6内核的精彩世界(一)
Linux 2.6内核的精彩世界(二)
Linux 2.6内核的精彩世界(三)
Linux 2.6内核的精彩世界(四)

基本技能
要使用新的内核首先当然要取得新内核的源码,内核的官方网站是http://www.kernel.org 在上面可以得到最新的内核。下载了内核源码之后,我们还要提取源码,然后才能进入编译的过程。
2.6内核的安装(一)
2.6内核的安装(二)

配置与编译内核用到的工具很多,在这里只对几个关键工具进行介绍:Make、GCC、RPMBuild、中间件。
linux配置、编译内核实用工具

编译实战
由于操作系统的内核贴近硬件,需要对计算机的体系结构有所了解,例如CPU的工作原理、接口特性和BIOS调用等。读者千万别因为这些望而却步,这里将介绍一些阅读Linux内核源码必备的技能。
看Linux内核源码 练内力必备技能

对于用户,编译一个内核版本需要的不仅是升级内核和软件那么简单。一般来说,编译后的内核都能很好地工作,但是有些功能在初始化时(准确地说是在系统初始化阶段,即init执行rc.sysini和rcx.d时)会失败。
内核编译问题详解

在Kernel 2.6x和以前的版本的编译方法有点区别,所以就简单的把编译过程写出来,主要是帮助初学Linux的兄弟。
Kernel 2.6x 编译过程

编置内核包含两大项内容,即配置内核和编译内核。这两项工作需要经常查看内核的文档,至少要查看Readme文件和Documentation目录下的Changes文件。它们对内核进行了描述,比如升级内核可能出现的问题和内核对系统中工具的版本要求等。Linux内核的编制方法下面将做具体说明。
Linux配置与编译内核

linux-2.6.x内核发布后,与2.6.x内核配套的系统程序并没有相应的来得及更新, 升级过程会碰到很多问题。虽然网上已有很多关于升级到2.6.x文章,但总是有些细节没有作很好的总结,因此撰写本文将我的经验与大家分享一下。
升级RH9.0到2.6.5内核全过程

配置和编译内核很复杂吗?如果对你来说答案是肯定的,那么来试试看图说话式的教学方法吧。
Linux 2.6内核编译安装全景体验(上)
Linux 2.6内核编译安装全景体验(中)
Linux 2.6内核编译安装全景体验(下)

提高篇
linux是一个具有保护模式的操作系统。它一直工作在i386 cpu的保护模式之下。
内存被分为两个单元: 内核区域和用户区域。内核区域存放并运行着核心代码,当然,顾名思义,用户区域也存放并运行用户程序。当然,作为用户进程来讲它是不能访问内核区域内存空间以及其他用户进程的地址空间的。
关于Linux内核级后门的原理和简单实战

自动软件测试让您可以在一段时间内运行相同的测试,从而确保您所比较的内容具备真正的可比性。在本文中,Linux Test Project 团队的成员们分享了他们对 Linux? 内核进行压力所使用的测试的方法、原理以及脚本和工具。
对 Linux 内核进行压力测试

推荐学习网站:http://www.oldlinux.org/index_cn.html,收集Linux从酝酿到开发初始版本有关的所有资料和信息(1991-1995);重新建立起最古老的Linux可运行系统,这些系统在其它地方很难再找到了;为初学者提供一个学习Linux内核基本工作原理的最简单方法。
posted @ 2006-11-19 22:01 arron99 阅读(638) | 评论 (0)编辑 收藏

赛季面对猛龙,科比以81分让整个联盟惊叹;昨日再次面对猛龙,他又拿下31分11个篮板和7次助攻,帮助湖人以107比100取胜。更重要的是,科比职业生涯的总得分已达17024分,而完成这些他仅28岁零86天,超越了张伯伦、乔丹、奥斯卡·罗伯特森、贾巴尔和奥尼尔,成为NBA历史上拿到17000分的最年轻球员。

    在经过4天休息后,科比终于开始找回上赛季得分王的风采,而且还在篮板和助攻上给予球队不小帮助。

    “我的腿毫无问题,我开始感觉自己有释放不完的能量了。”胜利让科比开心不已,“4天的休息太棒了,我很快就能找到以前的那个我了。”其实第1节科比的进攻欲望并不强烈,只出手6次命中两球,他把更多的精力放在篮板球和为队友创造机会上。而里程碑式的17000分,发生在第2节第46秒,科比在右边底线距离篮筐16英尺的地方跳投命中,总得分达到17001分

posted @ 2006-11-19 21:59 arron99 阅读(598) | 评论 (0)编辑 收藏

  东方早报消息:“我知道自己还年轻(27岁),但我感觉自己已经老了,我感到很累。”几天前,麦蒂就曾这样说过。昨天,在接受TNT电视台采访时,麦蒂再次表示自己感到身心俱疲,想要在三年后离开篮球。

    “我要享受天伦之乐,我有美好的家庭,妻子和两个孩子,这些对我来说已经足够。”说这话的时候,麦蒂显得很平静。在联盟中效力十年,没有夺得总冠军的人并不只有麦蒂,艾弗森拖着伤痕累累的身躯,战斗至今,也许麦蒂自己清楚地明白,他的腰背伤已经不可能痊愈,也没有其他球队敢冒风险将他换去。

    于是,麦蒂选择在休斯敦终老。麦蒂同火箭的合约到2010年到期,还剩三年。“你会想念篮球吗?”记者追问道。“也许吧,不过我会去找点别的事做,也许会去打打棒球。”进入NBA前,麦蒂就是个出色的棒球投手,每年夏天他都会去为休斯敦太空人队助威,同时麦蒂同休斯敦棒球队的超级球星克莱门克是好友。

posted @ 2006-11-19 21:58 arron99 阅读(549) | 评论 (0)编辑 收藏

我是一个追求完美的人,所以现实生活中往往容易
感到失望与痛苦,我们的四周围绕着太多粗糙不堪
的玩意,前些日子有一同事买了一部国产手机,然
后每隔一小段时间就看到他往手机修理处跑,后来
他痛心疾首地对我说:"这辈子我再也不买国产手
机!"。我感到茫然,为什么很多MADE IN CHINA
的产品的质量那么差?为什么我们的汽车市场、
手机市场都是老外的产品在兴风作浪?我是爱国
的,但如果我有足够的MONEY,我是不会购买国内
产品的......显而易见,有用耐用的产品对我们
的生活与工作来说真是太重要了,软件也一样,
一个有用的软件产品能帮助用户解决实际问题,
能体现出对用户的价值。

那如何才能设计出有用的软件呢?这是一个大问
题,小弟显然不够资格来光明正大地回答,因此
只好虚心地、试探性地作一下论述,免得贻笑大
方。

现在的软件开发在很多的眼中似乎变得越来越简
单,该死的可视化开发工具让我们变得越来越傻,
简单易用的软件库层出不穷,社会信息化的进步
有时却让人的脑子退步,尽管如此,市场上众多
的软件产品中能成功的也只是凤毛麟角,可见软
件产品的重心已不在于开发技术与工具,开发工
作本身的确已变成了相当容易的事情,而设计出
有用的软件才是真正的困难之所在!

设计这个词对我等俗人来说是高不可攀的,那
需要天赋,需要思想的火花,需要灵感的喷发,
DESIGNER一直是我比较仰慕的一种人......前
些时候看过一本书,说软件设计的出发点就是
3W,呵呵,这里不是万维网的WWW,而是Who(为
谁设计,用户是谁)、What(要解决哪些用户问题
)、Why(为什么要解决这些问题)三个单词的合并
,也就是说在作软件设计时,必须先很好地回答
这三个问题,如果没有明确的答案,就先别急着
开发产品,可见它的重要性。

其实3W说白了,都是围绕着用户来的,因此满足
用户的需求,便于用户的使用,同时又能使开发
技术尽可能简单,这就是我们所要追求的。当然
这话说得容易,做起来就没那么容易,相信很多
同行也都有一些雷同的体会,在我们进行软件设
计的过程中总会遇到一些相违背的思想,只有处
理好了,才能设计出有用的软件产品。

(1)技术决定产品的设计

我曾经相信技术是最酷的,是万能的,是至
上的,在CODING时我喜欢用最IN的方式来SHOW我
的技术水平,而很少去从用户的角度来思考问题。
现在看来,这是错误的,用户买你的软件其实并
不是为了其中的什么酷技术,而是因为软件产品
能满足他们的需求,能使他们的生活、工作更方
便一些,更有趣一些。因此是用户与市场决定了
产品的设计,而不是单纯的技术。

(2)我是高手我怕谁

毫无疑问,我们程序员是属于高智商群体,这
很让我沾沾自喜,我们大多受过高等教育,我们聪
明自信,我们热爱技术热爱CODING,正因如此,我
们有一点骄傲自大,自觉不自觉地将软件设计当成
是自我表达的一种方式,我是高手,用户是什么?
呵呵,我怕什么?实际上,过度地自信往往会让设
计工作变得了你一个人的表现。我们应善于学习,
向市场学习,向用户学习,向懂行的人学习,“三
人行必有我师”,要真正搞懂市场要什么,用户要
什么,产品要什么?

(3)你要什么,我就做什么

这种满足人的一切需要正是完美主义者所容易
犯的错误,有这种思想的设计者,往往忽略了技术
上的可行性,这种设计通常会导致软件产品的失败,
不仅会浪费大量的人力物力,更重要的是浪费大量
美好的青春年华,所以软件设计只有基于用户需求,
立足于可行的技术才能成功。

......

应还有别的,只是我暂时想不到,总而言之,用户
与市场是软件设计中最重要的因素,软件设计工作
中更多的是研究用户与市场,而不是研究技术。

posted @ 2006-11-19 21:38 arron99 阅读(674) | 评论 (1)编辑 收藏

在这篇文章里,我不打算将创业的艰辛与喜悦重新回忆一遍,我确实不想去误导大家,因为我所处的年代是一个物质缺乏的年代,成功相对来说要容易得多。每个人的成长经历都有其个性化的东西,每个人的成功创业经验虽然有一些可以遵循的普遍规律,但一般来说都很难复制,成功需要不断地创新。
对于今天很多的年轻人来说,一味注重技术至上的观念刻骨铭心,其实很多时候努力并非一定有回报。事实上,有不少出类拔萃的人才往往做出来的产品就是卖不掉,因为设计者压根儿就不了解用户的需求和心理以及产品功能的恰当定义,而总想在同事及其老板面前卖弄自己的技术和产品功能。其实有很多思维性的东西恰恰是很多人所忽视的,因为从一开始的出发点就错了,怎么可能取得辉煌的成绩呢?所以有时拥有卓越的技术并不一定代表人生的成功,很多企业就是死在一些自命不凡的“卓越人才”手中。

它山之石可以攻玉,减少“阶段0”的开发
有所“创造”确实是人人期待的,令人瞩目的发明虽然激动人心却谈何容易,人们时常将盖茨没有任何爆炸性的发明作为茶余饭后的笑料,我们不妨从另外一个角度去探索微软的成功奥妙从而为我们所用。
确实不假,盖茨的DOS源代码是从帕特森手上“买”来的。这些年来,我收集了世界各地中英文版有关微软的专著来比较研究,大家仅仅注意到盖茨为建立整个行业架构标准的远见,并叹服盖茨深得市场运作经验的精髓,我认为这些研究成果都是后来者研究微软成功经验,是“牵强附会”不可复制的理论总结。
当初微软公司还仅仅是一家很稚嫩的公司,可以说生存下去是盖茨作为老板唯一的使命。事实上,正当盖茨决定动手来写IBM所要的OS时,原计划在一年左右完成,但IBM公司只给了他几个月的时间。尽管帕特森的QDOS并不完善错误百出,但为了履行对IBM的承诺,盖茨购买了QDOS改贴标签后卖给了IBM公司。盖茨对此心知肚明,因为他知道如果用一年的时间来做OS的开发,他将失去与巨人IBM的合作机会,那是一种浪费。付一小部分的技术费用没有关系,只要能获得Know-how,获得更高的利润就好了。通过支付权利金引入技术,然后以模仿的方式学习他人的技术,再改造成符合IBM需要即可。
“买”――只要有现成的就不需要自己开发,这就是盖茨的过人之处,而且恰恰是很多人忽视的地方,值得我们所有人学习和仿效。盖茨就是由于没有“阶段0”,从而大幅度地降低开发风险。
当年,我是一个人单枪匹马借了2.15万元出来创业的,可以说是负资产,后来才开始有伙伴注资6万元。没有经验怎么办?我有一个非常好习惯,读书从不拘泥于他人的观点,也满足于人云亦云,否则那就是听别人讲故事,那不是您的东西,有入宝山空手而归。我认为,要想成功就必须“研究”成功者的轨迹,向成功者学习。
下面我会把我“第一桶金”的故事告诉你,这也是尽量减少“阶段0”开发一个非常典型的例子。
当年,《羊城晚报》几乎每天都有半版广告刊登信息台(听歌、悄悄话等)广告,一打听广告费每天几十万。当时相信不少人在利用公费电话在拨打这些信息台。后来我送货到客户那里发现电话机都外加了一个铁壳并上了一把锁,从看到那一幕开始,我决定做电话加密码锁,锁长途电话0字头,手机、BB机、信息台的9字头。通过朋友介绍,福州某公司有这个技术,于是我打了一个试探性的电话,使用5000元购买方案和源代码,对方非常爽快地同意了。我生怕有变立即坐飞机到福州去,很快就见到了郑新建工程师,他原来在福州某公司工作,我见到他的时候已经离开了福州某公司,但仍然自己写一些产品解决方案,通过福州某公司销售。买到方案与源代码之后,我立即带样机到各地去做测试,发现这台样机兼容性太差,而且市场已经开始在卖的产品也存在同样的问题,我想只要解决好兼容性的问题,如果在任何地区交换机局域网都能够使用,那就是最好的产品不愁没有市场。
我当时既没有资金也没有生产和销售经验,到底怎么将技术变成市场上所需要的产品呢?那是因为我找到了生产电话分线器的广州市白云区百新电器厂的老板陈国亮,由他生产和销售,每销售一台产品给我提成。以这个项目为起点,我们使用PIC单片机的数量很快就达到了每月100K以上,一年以后Microchip香港公司经理Andi主动找上门来将当时的广州强力电子研究所发展成为了授权分销商。
毫不否认盖茨的远见和判断力是微软至关重要的核心竞争力,但盖茨也绝非天才,否则盖茨就不会在浏览器上输给网景了,尽管微软使用的很多技术都不是微软所发明的,但毫不妨碍微软独步天下。

注重核心技术,其余的外包
通过创业以来第一个项目的成功,我深深地体会到商业模式比技术本身更重要。
通过十多年的努力,我们设计的“铁将军(Steel Mate)”品牌汽车防盗器、汽车倒车雷达不仅成为了全世界范围的“隐性冠军”,而且为GE等世界著名汽车厂商售前市场提供配套产品,与此同时我们为智能卡酒店门锁厂商设计与制造的各种智能卡门锁控制模块在国内也一直处于第一名的地位。
他们为何能够取得与众不同的成功呢?其最大的长处就是产品创意与制造、简约时尚风格的工业设计、模具制造技术以及精心打造的销售渠道,这些厂商深刻明白“注重核心技术做自己擅长的,其余的外包分段取利”的基本道理,而对于我来说就是“智慧出租”,通过与强者合作获得双赢。
通过这些成功经验的积累,我们开始全力以赴注重发展核心技术,将自己不擅长的技术全部外包。比如,我们长期投资清华大学计算机系,并建立以陈渝博士后为主Linux内核开发团队,为公司底层的技术提供良好支撑,而我们自己则将精力集中于Linux驱动开发。这种分工合作、协同开发的模式赢得市场上宝贵的时间,并快速取得了应用成果。
也许有程序员会关心JTAG开发工具问题,那也是一个“外包”的项目。当时,我们在网上发现了一个由计算机爱好者业余时间设计的H-JTAG,这是一个比较稳定的调试器软件,正好适合我们使用。于是我就同设计者联系,并决定由周立功单片机资助他继续开发,同时,其开发成果还免费提供给网上的用户下载,保证它作为一个自由软件。其实,无论是Linux还是H-JTAG都是开源软件,如果担心其它的同行因此受益而超越自己的话,难免需要在公司负担很多开发人员,面面俱到地做许多事实上是重复的开发工作。其实,我们的合作伙伴都是所在领域的专家,如果自己从头到尾去学习和开发,不仅抢了合作伙伴的饭碗,而且结果未必理想。这种情况下不但会延误宝贵的商机,而且还会影响与合作伙伴之间的关系。其实只要引入我们企业长期积累和制定的嵌入式系统工程管理思想和规范,即可得到自己想要的结果:“做你最擅长的,其余的外包”,类似这样的案例在周立功单片机将会越来越多。

专注与差异化生存
1999年1月23日我离开了原公司,先后分别创立了广州周立功单片机发展有限公司与广州致远电子有限公司,分别从事贸易业务与产品制造。
作为代理商通过为客户提供解决方案从而达到大批量销售芯片是代理行业惯常使用的手段,而实际上通过设计能够真正达到增值获得丰厚回报的代理商却少之又少。要知道过去公司的人才数量和资源是非常宝贵的,如果没有正确的战略,机会可能稍纵即逝。事实上创业开始的前几年,我们一共为用户设计了超过100个品类的产品,产品型号超过500种,可以说几乎涉及到了各行各业,但能够带来稳定而丰厚回报的案例几乎没有。我经过一段时间的思考和报表分析发现,目前公司的业务做得太多、太杂,没有将任何一个行业做精。于是我下定决心减少用户数量集中精力在1-2个行业做强、做大,直至成为顶尖的行业专家,坚持十年如一日重点做好汽车配套产品与智能卡门锁控制模块的开发。通过多年的精耕细作,我们通过为直接用户设计产品增值年销售单片机的数量已经超过了1000万片,无论是对用户还是对半导体公司来说,我们无疑是一家非常有价值的代理商。
1999年5月,PHILIPS半导体公司邀请我去上海洽谈是否有意向代理LPC700单片机,当我拿到用户手册时离去上海的时间只有5天。当时公司不像现在有250位大学生,总共只有8个人,怎么办?我一边写商业计划书,一边与大家翻译用户手册、打字和贴图,面对机会就像抓住救命稻草一样加班加点,每天只休息3-5个小时。第5天我赶到上海东亚富豪酒店时,我将整整齐齐的材料放在了来自美国PHILIPS半导体公司2位经理的面前,包括吃饭在内仅仅只洽谈了2个小时,代理权就正式谈下来了。事后他们告诉我,就是因为我与众不同,专注且非常有个性。
风雨变换诱惑莫测,人怕出名猪怕壮,这是常理!随后找上门来要求我们代理芯片的著名半导体公司不下10家。这时候,对于很多人来说不做什么就是一个艰难的选择。此时,我认为不管对方开出的条件多好,有冲突的就是不做,性能不突出的也不做,如果能够形成价值链互补,就一定要通过自己的努力和业绩表现主动去“求”半导体公司授权给我们,我就是这样取得了Keil、Catalyst、Sipex的代理权和信用额度。2004年SHARP半导体公司北京、日本、美国一共五位经理来到我的办公室要求我代理SHARP的ARM,帮助SHARP在中国推广以及制造用于全球销售的开发套件,我根本没有思考就一口回绝了,可以说SHARP给我的条件非常之好,特别是美国人觉得是非常不可思议的事情,作为商人这么好的赚钱机会都不要。为什么?我们之所以暂时“强大”,就是因为我们长期以来专注于发展PHILIPS半导体,集中精力对准焦点成为了小河里的大鱼,进而才引起了众人的关注。如果我们分散了精力,最后的结果一定会什么都不是!
当决定专注的目标之后,接下来的就是想办法如何做得与众不同,这是一件不容易的事情。最重要的就是穷举用户最大的需求和竞争者最容易忽略之处,然后将其做到最好。
为了推广好PHILIPS的单片机和ARM,我们定位于帮助初学者快速入门,至今一共编写出版了20多本专著,并将大部分版权全部捐献给了出版社用于降低成本,同时我也还会继续坚持将这项工作做下去、争取做得更好。邓小平有一句名言:“计算机要从娃娃抓起!”我认为,任何一个有远见的厂商,要想成功地推广嵌入式系统,一定要从在校大学生抓起,这必定是一件一举多得的好事。既能够提高企业的美誉度,又能获得市场占有率,还能为学生提供实践的理论基础。为何很少有厂商或者代理商心甘情愿去做?这不仅可帮助企业建立差异化,而且还能够给企业带来长远的利益,何乐而不为?
比如说,至今在国内任何一家代理商的网站上几乎都找不到完整的芯片中文数据手册、用户手册与应用手册,不是我们的同行不知道其中的重要性。首先大家普遍认为这是半导体公司的份内之事,其次大家或许感到自己做好之后放到网站任由用户免费下载,会给其它代理商占了便宜。但很多人却始终不明白,这是满足用户需求制造公司服务差异化的最佳机会。
于是我们决心从网站入手坚持长期投资,做中国最好的嵌入式系统专业技术网站,建立专业的技术支持与开发团队。特别是对于优质用户的服务,网站还专门开通了“快速绿色通道”,如果这样的用户遇到问题,都是由我、分公司经理及其相关服务部门的经理牵头负责实施“保姆式”的服务,我们实施的服务战略就是:“用有限的资源为有效的用户提供高质量的服务”。
“你若亲近神,神就亲近你!” 2001年8月一篇来自PHILIPS内部刊物的报道《风险意味着机会》,我是被推上了“本地英雄”封底人物栏目的第一位亚洲代理商;2004年PHILIPS半导体公司又给我授予了“优秀卓越贡献奖”,来自全国各地的用户连续多年通过《亚洲资源》媒体将我们公司评选为“本地十大最受客户欢迎的分销商”。没有用户崇高的忠诚度和长期的大力支持,我们不可能从1999年以来连续多年销售单片机取得PHILIPS亚太区第一名的业绩。
一个“人弃我取”的机会成就了我,尽管个人与团队的努力至关重要,但可以毫不掩饰地说,如果没有PHILIPS半导体经理的慧眼相马,一定是巧妇难为无米之炊,业界不会再有我的一席之地。
在嵌入式系统应用技术方面与我们不相伯仲或者说比我们聪明能干的人才何止万千,为何只有少数人能够脱颖而出呢?就是因为想法太多、不专注,不能坚持在一个行业里面十年如一日地下苦功夫。但面对众多的竞争者和后来者,我每天都如履薄冰,不敢有丝毫的懈怠,每天坚持学习到深夜,因为唯有不断地学习和更新思维才有可能具备远见并及时规避可能出现的失误。

关注用户的需求
其实维系企业生命的关键在于产品是否能够获得市场的青睐,我们要做的并非是成为技术的领先者,而是要将技术成果转化为迎合消费者需要的商品。
八十年代是一个物质缺乏的年代,而今天的人们更加注重消费享受和情感的分享,这是任何人都无法否认的现实。我们公司刚开始做产品时,由于我个人偏爱蓝色,所以我凭着老板的权威将所有产品的外观全部都做成蓝色,其实当时也有不少的人向我提出改进意见,但我仍然还是无动于衷,为什么?就是因为我是做技术出身的,而且从创业初期开始一直都是依靠技术一路拼杀过来的,可以说过于迷信技术的力量,因此在很长的一段时间内,公司完全走的是研究的路子。而我却恰恰忽视了用户读产品的心理需求,以至于在产品推向市场之后一直都无法打开局面。
当时,EasyPRO系列编程器面市的时候,其销售数量一年下来都不到500套,同时有用户表示对于产品的设计很不满意,这可以说是一次深刻的教训。于是我下定决心组建工业设计事业部,首先从EasyPRO系列通用编程器开始,亲自管理、研究和参与产品的外观设计,将原来的模具全部废掉重新设计。尽管是第一次设计,在产品的外观上没有做出非常杰出的效果,但无论如何,新产品外观比原有的产品出众得多。2005年10个月的时间里,EasyPRO系列通用编程器的销售数量达到了6000套。2006年我们又推出了SmartPRO系列智能型通用编程器,预计本年度销售编程器的总数量将超过10000套,而这些产品将带着我和我们公司跻身于国内编程器市场主流品牌之列。
从那次深刻的教训以后,我明白好的外观设计可以凸现产品的魅力,让产品与环境融为一体,刺激消费者产生强烈的购买欲望。即使是普通产品,经过精心设计,也会成为一件时尚产品,甚至让人们觉得它就是一件艺术品,从这一点来说,时尚、新潮、艺术化的外观设计是塑造产品品牌形象的第一要素。
从那以后,我开始改变产品简介、广告以及展示会的形象设计,为了配合新的形象,我们展开了大规模、全方位的宣传:一方面尽量多地为用户提供产品简介手册,同时通过大量的媒体广告,让用户认识并初步了解公司,从而迅速有效地提高了品牌知名度;另一方面组织各种全国巡回演讲、免费ARM技术培训活动和产品展示会,而且我们每次参加展示会都是投入4个摊位并进行特装展位设计,目的就是为了获得与用户积极沟通的机会。
2003年暑假期间,周立功单片机投资80万元邀请了行业3位著名的嵌入式系统专家组成讲师团在全国10个城市主办了免费的ARM巡回演讲,提供了免费的午餐,可以说规模空前。这次巡讲中,共有8000多人参加了这次活动,随后公司趁热打铁推出了售价400元的EasyARM2104开发学习套件,第一个月生产的1000套在15天之内抢购一空,直到销售了15000套之后才因新产品的推出而停产。这次活动不仅收回了80万元的宣传费用,而且还直接或间接地影响了超过50万嵌入式相关人员,强有力地达到了品牌宣传的目的。在赢得丰厚利润回报的同时,也打造了嵌入式行业一次非常成功的“事件营销”经典案例,我深深地体会到“俘虏”用户的心是提升品牌的唯一途径。

全球化市场意识
过去,一个公司可能需要等到10年之后才开始考虑是否全球化,而今天由于网络技术的发展,无论我们身处何地,世界各地的新信息仿佛就在眼前,谁也不会被边缘化了,所以今天成立公司明天就要准备全球销售。
这几年ARM已经到了热得不得了的程度,很多人不以为然,其实这是一种必然趋势。事实上,我在美国PHILIPS半导体公司看到,美国1997年出版的《嵌入式系统》杂志就已经大量刊登OS与32位嵌入式系统开发工具等文章和广告。在美国硅谷主办的嵌入式系统展示会上,来自欧美的上千展位展现在我眼前的是各种各样嵌入式系统产品,中国厂商普遍展示的是蜂鸣器、继电器等低档元器件。我第一次身临其境地感受到了中美之间的差距究竟有多大。中国太需要懂得国际市场需求和游戏规则的人才和企业家了。
同样是做USB分析仪,全球只有5家,我们自己的USB分析仪升级版在中国目前定价为3800元,这款产品原来的售价只有1800元,用户还认为太贵了。其实这样的产品在国内一年的销售数量也就200台,但是同样的情况在美国,一个小公司一年的销售额就能够到2000万美元,他们的单台最低售价不低于10000美元,以至于美国同行直接给我来电话,希望我在售价的基础上至少加一个0。
中国企业不做全球化销售能行吗?不行!而且中国企业必须向价值链顶端攀升,否则我们只能做欧美消费品市场的廉价加工基地。

个性化的企业文化,帮助他人走向成功
通过与用户合作所经历的共同成功过程中,用户将我教育成为了一个善良、上进、诚实、优秀的人才。我不仅懂得如何做自己最擅长事情的方式方法,而且也懂得了如何与用户、与员工分享成功的道理。一旦芯片销售数量增大成本下降就主动给用户降价,赢得了用户更长远的支持;公司效益提高了,年终就主动给员工涨工资、加奖金并对优秀员工提供购房津贴。由于公司的规模不大,我们一直以招聘二类本科应届生为主,在内部采取导师制的培养模式,为他们提供至少一年的严格训练,帮助他们规划职业生涯,想尽办法提供机会将他们培养成优秀的人才。这些年来不少公司打电话向我们公司挖人,关键人才从未出现过流失,至今跳槽的员工不超过12人,我深深地感到这就是我人生最大的快乐和财富,离开了支持我的用户和追随我的人才,我将变得一钱不值。
为了保证企业的可持续发展所带来的人才困境,我与江西理工大学合作以五年为期开办了“3+1”嵌入式系统应用开发特训班,与此同时还设立了每人3000元共10人的“周立功奖学金”资助那些动手能力极强而成绩中等的学生,开展校企无缝联接,培养嵌入式系统创新性开发人才的有益尝试,即就是从7个班中选拔30位爱好者用3年的时间修完所有课程,我们为每一位学生提供一台计算机、全套开发工具及其设计中所发生的一切费用,由我们组织著名专家开设专题讲座和课程,学校组织1位专职辅导员和2位指导教师,并由我们提供必要的津贴,然后用一年的时间专门做毕业设计,为此我们制定了严谨、细致的培训计划。
这些年我们还不断赞助各省电子大赛、毕业设计大赛、创新设计大赛,捐赠了50所大学单片机创新实验室,以求扩大企业的知名度和广泛寻求人才的来源。

最后的话
很多开发工程师以为这些都是老板或者经理们应该考虑的问题,与己无关,其实是大错而特错。作为一位优秀而卓越的开发人员,如果希望获得人生的完全成功和快乐,我们时刻需要明白,任何一个企业的可持续发展一定是群策群力的结果。
1981年我经历了高考失败之后上了技校,1999年我作为劳动模范被保送上了大学,创业至今十多年来,往事依然历历在目,用户给予我的回报很多,很难在此一一完全道来,谨以此文与同行、用户分享和交流。
这些年来,我陆续捐资资助教育、设立奖学金以及帮助家乡修建乡村水泥公路、祠堂等公益事业回馈社会。1990年的中秋节,我只身一人南下广东打工,不曾想到会有今天这样的成绩,我一直非常珍惜这来之不易的机会。
作为一个嵌入式技术爱好者,我的愿望就是:“生命不息、奋斗不止!”力争为发展中国的嵌入式系统应用技术贡献自己的一份力量。

posted @ 2006-11-19 21:12 arron99 阅读(616) | 评论 (0)编辑 收藏

2004年9月30日,代号为“Tiger”,研发历时近三年的J2SE 5.0发布正式版本,这是Java平台历来发布版本中改动面波及最大的一次。
纵观Tiger,“Ease of development”是其核心主题,这一点着重体现于语言特性上的改进,这在很大程度上,简化了开发人员日常的编程任务,以往一些琐碎的手工劳动都代之以轻松自然,而又安全可靠的自动化实现。其中的注解功能,以及随之而来的声明式编程,还对构筑于J2SE 5.0之上的J2EE 5.0产生了巨大影响。尽管Tiger在语言特性上做了很大的动作,但作为Java技术的基础支撑,这些改动都是深思熟虑的结果。
Tiger发布至今也有大半年了,那么Sun又是如何规划J2SE的未来蓝图的呢?据悉,J2SE的下两个版本分别是代号为“Mustang”的J2SE 6.0和代号为“Dolphin”的J2SE 7.0,预计Mustang将于明年发布。在吸取了Tiger研发周期过长的教训之后,Sun副总裁Graham Hamilton表示,Mustang的发布周期将不会那么长。并且,Sun还将“Becoming more open”作为Mustang的主题之一。未来JCP对Java技术的影响将会愈加深入,而整个研发过程也将会愈加透明。Mustang在正式发布前的内部版本也会陆续见诸于众,如此,广大Java开发者便可以更加及时的了解到Java发展的最新情况。在语言层面上的扩展依然会比较谨慎,比如像AOP这样的当下热门技术,依然不太可能会见诸其中。据Hamilton所言,一个有可能被引入的语法特性被称作“friends”import机制,它将使由多个包组成的大型项目变得易于管理。
posted @ 2006-11-19 15:39 arron99 阅读(544) | 评论 (0)编辑 收藏

2003年4月2 日,Sun与微软达成16亿美元的法律和解。如果不是晚了一天,许多人会以为这是一个在4月1日愚人节开的玩笑。尽管当时所有人都像是看到“太阳从西边出来了”那样张大了嘴巴,但这的确是事实。
根据两家公司达成的版权协议,双方会为采用对方的技术而支付专利费用,微软向Sun提前支付3.5亿美元使用费,Sun则承诺,如果Sun集成微软的某些技术,也会向微软付款。
毫无疑问,“私下了结”的方式对双方而言都是最好的结果。就在协议签署的当天,在美国旧金山由Sun和微软为“抛弃十年恩怨、携手合作“举行的新闻发布会上,尽管比尔•盖茨没有到场,但这并没有防碍现场看起来异常轻松的气氛。麦克尼利和鲍尔默各自穿了一件密歇根州底特律“Red Wings”曲棍球队的运动服,并谈及了一起在哈佛大学读书的经历,麦克尼利还说:“当时我们两人是非常要好的朋友,当然我们也有吵架的时候。”人与人当然可能成为终生的知己,但是公司与公司之间有的只能是利益上的分分合合。
posted @ 2006-11-19 15:38 arron99 阅读(605) | 评论 (0)编辑 收藏

Java和开源几乎就是天生的一对,这可以从无比兴盛繁荣的Java开源软件社区得到佐证。目前最有影响力的Java开源软件项目,要数JBoss和Eclipse。可以说,几乎所有的Java开发人员都获多或少的听到过或接触和使用过它们。前者是目前最优秀、应用最为广泛的企业级开源J2EE应用服务器,后者是功能完全可以替代商业产品的Java IDE。二者的覆盖功能之全、支持工具之广、子项目之多,几乎可以仅凭借它俩来完成企业应用的开发构建到部署实施的全过程,而软件开发者和客户也都可以最大程度上享受高质量,高可靠Java开源软件所带来的低成本优势。
JBoss和Eclipse的巨大成功,几乎令各自领域的商用竞争者抓狂,其中BEA的WebLogic和IBM的WebSphere在商业利润上受到JBoss的巨大侵蚀,而Borland的JBuilder、JetBrains的IDEA等诸多优秀的商用开发工具也不得不面对Eclipse独大的现实。JBoss的CEO兼创始人Marc Fleury曾直言不讳地表示,希望占据市场主导地位。“我们希望打败IBM,成为中间件领域里最大的厂商。”JBoss在4.0以前还只是以一个Group存在,盈利手段主要靠服务和销售文档。但在最近,JBoss已经发展成为一个有限公司,并吸纳多家风险投资,专注于获取利润为目标之一的第二代开源软件模式(JBoss自己称为“Professional Open Source”)的创新和运营。这区别于以理论研究为爱好的学院型开源或大公司为基础的非盈利组织开源,如Linux和Apache。当然JBoss的这种运营方式势必会导致更多的代码控制和专有修改权,但按JBoss的说法是这样更能获得企业客户的信赖。JBoss的这种模式是否能获得成功还要我们拭目以待。
不管JBoss和Eclipse的未来发展如何,JBoss和Eclipse的成功已经让我们看到了Java开源软件的威力,祝愿它们一路走好。 
posted @ 2006-11-19 15:38 arron99 阅读(539) | 评论 (0)编辑 收藏

2004年9月30日,代号为“Tiger”,研发历时近三年的J2SE 5.0发布正式版本,这是Java平台历来发布版本中改动面波及最大的一次。
纵观Tiger,“Ease of development”是其核心主题,这一点着重体现于语言特性上的改进,这在很大程度上,简化了开发人员日常的编程任务,以往一些琐碎的手工劳动都代之以轻松自然,而又安全可靠的自动化实现。其中的注解功能,以及随之而来的声明式编程,还对构筑于J2SE 5.0之上的J2EE 5.0产生了巨大影响。尽管Tiger在语言特性上做了很大的动作,但作为Java技术的基础支撑,这些改动都是深思熟虑的结果。
Tiger发布至今也有大半年了,那么Sun又是如何规划J2SE的未来蓝图的呢?据悉,J2SE的下两个版本分别是代号为“Mustang”的J2SE 6.0和代号为“Dolphin”的J2SE 7.0,预计Mustang将于明年发布。在吸取了Tiger研发周期过长的教训之后,Sun副总裁Graham Hamilton表示,Mustang的发布周期将不会那么长。并且,Sun还将“Becoming more open”作为Mustang的主题之一。未来JCP对Java技术的影响将会愈加深入,而整个研发过程也将会愈加透明。Mustang在正式发布前的内部版本也会陆续见诸于众,如此,广大Java开发者便可以更加及时的了解到Java发展的最新情况。在语言层面上的扩展依然会比较谨慎,比如像AOP这样的当下热门技术,依然不太可能会见诸其中。据Hamilton所言,一个有可能被引入的语法特性被称作“friends”import机制,它将使由多个包组成的大型项目变得易于管理。
posted @ 2006-11-19 15:37 arron99 阅读(610) | 评论 (0)编辑 收藏

1998年,Java 2平台正式发布。经过了三年时间的发展、热热闹闹的攻关宣传、红红火火的众厂商的热情参与,Sun终于知道Java适合干什么了。对比Java刚发明时的技术定位,与Java的戏剧性触“网”的那段历史,Java 2平台的发布可真算得上是有的放矢了。根据官方的文档,Java 2是Sun意识到“one size doesn’t fit all”之后,把最初的Java技术打包成三个版本的产物,也就是著名的J2ME、J2SE、J2EE。
之所以说Java自从Java 2平台发布之后,进入了现代。那是因为之前的历史怎么看来都和现在程序员日常开发使用的技术无什么关系,比如Applet,已经很少有人使用了。Java 2之后的历史就不一样了,至少人们在推崇轻量级开发,猛批EJB时还不时会引用J2EE这个词是如何诞生的。而Java 2的三大版本中,除了J2EE得到了长足发展和广泛使用之外,J2ME也在手机市场上取得了遍地开花的结果。相较之下,J2SE难免落寞,只剩SWT这个血统不纯的家伙在Rich Client回归的时代吸引着人们的眼球了。无论今天看来当时的Java 2有多么的不成熟,至少经过市场和时间的检验,Java 2规划出来的三大方向把Java技术指向了光明的方向是勿庸置疑的。 
posted @ 2006-11-19 15:36 arron99 阅读(611) | 评论 (0)编辑 收藏

1998年,JCP组织成立,并且开始把握Java的发展方向。JCP组织的开放性,不但使得所有对Java感兴趣的商业公司可以参与Java的发展,更重要的是JCP允许个人、非盈利组织、学校等加入,这就给Java带来了巨大的活力。随之兴起的Java开源运动的最大贡献是实现和鼓励了知识共享,在众多热情的开源程序员们的努力和分享下,很多原先只被商业公司掌握的技术、思想和产品可以被所有需要的开发人员免费或者以较低的价格获得使用权,并通过开放源代码更容易的获得反馈和改进意见从而进一步演化发展。我们知道,所谓知识不是孤立发展认知,而是人们的经验,认识是思考交流和积累的产物。而开源运动所带来的开放、反馈、交流的风气正是符合人类社会知识形成和发展的规律。
开源运动起源于西方的发达国家,有其现实背景和文化根源。1990年代可以说是IT产业的一个黄金时代。信息时代的兴起对IT人员,特别是软件人员有着巨大的需求。而软件开发又是一种类似艺术创作的脑力活动,和所有的艺术家、作家们一样,在作品打上自己的印记并流传在世界上是每一个创作人员的梦想。互联网时代下的高收入的舒适生活,早九晚五的编写公司的代码并不能满足很多有激情的软件开发人员的梦想,再加上西方传统的基督教文化中十分推崇的分享和交流,开源的出现和兴起也就水到渠成了。今天,开源运动已经不仅仅是一些个人天才程序员们的游乐园地,而是发展成为一项开源软件产业。
posted @ 2006-11-19 15:36 arron99 阅读(493) | 评论 (0)编辑 收藏

Sun在1996年一开始首先成立了JavaSoft组织,并在1月23日正式发布自己的Java 1.0,作为20世纪业界出现的最重要的技术之一,Java引起了编程世界的革命。直到现在,Java仍然是互联网上最流行的语言。
在Sun正式发布Java 1.0之后,Java这门新生的语言就拥有了自己的会议——JavaOne,这次会议初试啼音就吸引了600多名参与者。除了拥有这么多的积极参与者来进行Java的开发之外,各大知名公司也纷纷向Sun申请Java的许可。一时间,NetScape、惠普、IBM、Oralce、Sybase甚至当时刚推出Windows 95的微软都是Java的追随者。
Java的应用就像是世界上的顶级玩家们组成的一个公开联盟,告诉全世界我们大家就是都在用着Java。也正是因为如此,Java也找到了自己的归宿。现在的J2EE已经成为中大型企业级应用的标准,成为承接数据库和Web之间的一个重要桥梁。
当年Java的机会实在太多了,以至于很难知道到底该做什么。最终Java在应用服务器市场获得了难以取代的地位,也确定了J2EE的发展方向,并且仍将延续下去。 
posted @ 2006-11-19 15:35 arron99 阅读(549) | 评论 (0)编辑 收藏

Java诞生的1995年,正是微软在软件产业地位达到巅峰的时代,Windows 95发布时的风光场面给人们留下的深刻印象至今难忘。尽管如此,作为最卓越的技术领袖,比尔•盖茨仍然敏锐地注意到Java。当他了解了Java的一些细节之后,给予了这样的评价:“Java是很长时间以来最优秀的程序设计语言。”基于此,微软于1996年3月申请并获得了Java许可证。微软对于Java的这一热情态度在当时大大提高了人们对Java的兴趣和信心,但也有不少人担心微软会依靠自己强大的影响力在标准之外另立标准,从而破坏Java的纯洁性。
果然,从1997年发布Visual J++的第一个版本开始,微软就开始在Java中掺入自己的私有扩展。这毫无疑问引起Sun的高度重视。1997年10月,Sun向美国加州地方法院起诉微软公司违反两公司就微软使用Java技术所签定的合同,指控微软公司在自己的Java产品中做了“不恰当的修改”,违反了合同中承诺向用户提供Java兼容产品的条款。这一官司旷日持久,直到2001年1月双方达成和解,微软将继续提供采用Sun开发的Java技术的现有产品(包括测试版)。不过,Sun有限制地仅对包括Java 1.1.4的微软产品提供许可。到了2001年7月,微软公布新版的Windows XP将不再支持Sun的JVM,并且推出了.NET平台与Java分庭抗礼。
现在回过头去看,当时的这一场官司对Java世界产生了深远的影响。如果没有这一场官司,也许很多Java程序员都在使用Visual J++,基于WFC开发Windows客户端程序,同时不得不面对被两个不同的事实标准所分裂的Java世界。 

posted @ 2006-11-19 15:35 arron99 阅读(542) | 评论 (0)编辑 收藏

1995年,Sun正式对外公布了Java,并且发布了JDK 1.0。这种外形酷似C++,却包含一颗Smalltalk般纯洁的面向对象之心的全新程序设计语言及其平台,几乎在一夜之间就成为软件产业的新宠儿。Java当时仅仅被用来为网站制作一些动态应用,诸如动画图片之类,但这仍然引起了很多Web开发者们的注意,他们非常渴望有一种安全的语言,可以在静态的HTML网页上制作动画图片。Sun最终把Java集成到NetScape浏览器。同时因为它具有“只写一次,随处运行”的特性,而引起了很多开发者的注意,他们可以再也不用为了使程序能够在不同型号的硬件上运行而耗费大量的时间来编译代码了。
当时的Web浏览器的出现也为Java的出现起到了很好的推动作用,通过Java和Web浏览器的结合,人们似乎看到了什么,有人甚至预言PC将在一两年内退出历史的舞台,取而代之的是基于Java的浏览器应用程序,通过网络计算设备来进行应用。Java的出现为当时的软件产业带来了无限的遐想。 
posted @ 2006-11-19 15:34 arron99 阅读(528) | 评论 (0)编辑 收藏

LarryWall说,优秀程序员应有的三个特点:懒惰、急躁和傲慢。Java就是诞生在一群懒惰、急躁而傲慢的程序天才之中。
1990年12月,Sun的工程师Patrick Naughton被当时糟糕的Sun C++工具折磨的快疯了。他大声抱怨,并威胁要离开Sun转投当时在Steve Jobs领导之下的NeXT公司。领导层为了留住他,给他一个机会,启动了一个叫做Stealth(秘密行动)的项目。随着James Gosling等人的加入,这个项目更名为Green。其目标是使用C++为嵌入式设备开发一种新的基础平台技术,James Gosling本人负责开发一个SGML编辑器。正如人们事后分析的那样,这位天才的程序员太懒惰,所以没有把C++学好,开发中碰了一头包;太急躁——所以不愿意停下来读读Scott Meyers的新书《Effective C++》;太傲慢——所以轻易地决定开发一中新的编程语言。他把这种语言命名为C++++--,意思是C++“加上一些好东西,减去一些坏东西”。显然这个糟糕的名字不可能长命百岁,很快这种颇受同伴喜爱的小语言被命名为Oak。
到了1992年9月,Oak语言连同Green OS和一些应用程序一起发布在称做Start 7的小设备上,从而使之有了第一次精彩的亮相。随后,Sun开了一家名为FirstPerson的公司,整个团队被转移到这家公司里研发机顶盒,以投标时代华纳公司的一个项目。这帮天才被技术狂热所鼓舞,开发出了一个高交互性的设备,结果没想到时代华纳公司和有线电视服务商并不愿意用户拥有那么大的控制权,从而在竞标之战中败给了SGI。Oak的锋芒之锐,竟然把客户都给吓懵了。Sun沮丧地关闭了FirstPerson,召回了整个团队。事实证明,传统行业中那些脑满肥肠的保守主义者是腐朽没落的。回去!回到激情澎湃的IT产业,抓住互联网的大潮,这才是出路!1994年,Oak被命名为Java,针对互联网的新一轮开发如火如荼,一切已经就绪,熔岩在地下奔流,火山即将喷发。
 
posted @ 2006-11-19 15:33 arron99 阅读(559) | 评论 (0)编辑 收藏

就在几年前,Linux在世界最快的超级计算机排位中还几乎没有,但最近的信息表明,在世界500强超级计算机系统中,使用Linux 操作系统的已经占到了280席。

  目前,日本的Earth Simulator Center排名世界第一。美国的超级计算机系统占据了从第二到第五的四个位子。而在前五名中,IBM的设备占了三席。

  在去年,Harvard Research 集团的Linux策略副总裁Bill Claybrook曾经估计Linux系统在500强中占据了大约170席。

  专家们普遍认为,Linux非常迅速地抢占了原来Unix把持的空间。同时,由于Intel构架在超级计算机中得到越来越广泛的应用,也让Linux得以迅速发展。在一年前,500强中Intel构架的系统占据了119席。六个月前占据了189席。最新的数据显示则是287席。

  就在这287个Intel系统中,有243左右个系统使用Linux。


posted @ 2006-11-19 15:31 arron99 阅读(562) | 评论 (0)编辑 收藏

朋友告诉我,他读书的时候,校外有录像厅半夜播放色情片;一位同学,常带领大家翻墙出去“欣赏”。某天,该同学不知为何,打电话向公安机关告发,录像厅遭查封,大家没了去处,知道真相后,将告发者暴打一顿了事。

 

    最近甚嚣尘上的“360safe事件”,让我想起上面这个故事。无论出于什么心理,打击丑恶事物的结果总是好的。既得利益者窝里反,让其他既得或将得利益者不爽,群起而攻之,是非对错太复杂,按下不表。当媒体都在关注当事人之间的互相指责、谩骂时,该被关注的对象:流氓软件,反而成了配角。

 

    什么是流氓软件?有媒体认为,“流氓软件”定义不清晰,应该组织专家研讨鉴定。其实何须这么麻烦——未经同意强行安装、未经事前告知强行弹出广告、不提供删除功能,有这三条之一,就足以裁定一个软件是“流氓”了。用户被不断弹出的广告窗口、变得极不稳定的操作系统所困扰,这时候还去谈什么“定义”,实在有避重就轻、王顾左右而言他之嫌疑。某些坚称“没有流氓软件”的媒体,更让人怀疑有幕后公关交易的可能。

 

    流氓软件,存在对电脑用户的严重侵权行为,和苍蝇蚊子等害虫一样,理应加以杀灭。360safe开了一个头,但它决不是无二之选。在中国互联网乌七八糟的环境中,一家商业公司力推的安全产品,尤其是针对竞争对手的安全产品,值不值得信赖,现在很难说。流氓软件怎么杀?程序,自然该用程序杀。程序是谁写的?自然是程序员。所以,杀灭流氓软件,程序员当仁不让。

 

    问题是,流氓软件从何而来?我们不得不遗憾地承认,是程序员写的。不知道读者中,有没有写过或正在写流氓软件的程序员。如果有,他一定会辩解自己是出于生计所迫。实际上,能写出过得去的流氓插件的程序员,找份高薪工作,根本不成问题。是报答老板的知遇之恩,还是为了炫耀自己的技术水准?无论如何,对于有良知的程序员来说,写流氓软件代码,字里行间都写着“耻辱”二字。计算机技术是为了造福人类,用自己掌握的编程功力为虎作伥,实在不值得。流氓软件程序员,应从我做起,不再参与肮脏下作的勾当,彻底告别流氓软件。

 

    我相信,全中国的程序员中,有相当部分具备编写杀灭流氓软件程序的功力。有时听到程序员朋友说,今天又手工干掉一个流氓软件,我就想,不知多少用户,因为没有能力自己删除流氓软件,而深受其害呢?如果程序员们都把自己杀流氓软件的经验分享出来,甚至做成杀灭工具,让大家都能使用,流氓软件的末日,大概也就到了。

 

    在某些公司利用流氓软件大赚其钱的时候,也同时在毁灭软件行业。现在是程序员展示良知与实力的时机了。我们呼吁程序员朋友,不写流氓软件,分享删除流氓软件的经验,编写杀灭流氓软件的程序。流氓软件是互联网身上的一颗毒瘤,是软件行业的害群之马,理应被群起而攻之,击灭而后快。程序员行动起来,抵制和进攻流氓软件,还互联网一个清净,还软件业一个公平,还自己一个名誉。

 

    商人重利,有些短视的商人为了利益不惜伤害用户、杀鸡取卵,流氓软件就是这样流行起来的。程序员行动起来之时,就是流氓软件灭亡之日,希望这一天不要太晚到来。

 

posted @ 2006-11-19 15:30 arron99 阅读(563) | 评论 (0)编辑 收藏

  第一台微型计算机其实是超级技术发烧友摆弄的玩意儿。但是随着AppleⅡ的"可视计算"软件(VisiCalc)于1979年首次推出,个人计算机开始走出实验室并走向商业应用。2年后,IBM也发布了PC,不久之后,这种灰色的小盒子和录音电话一样成为美国企业高效运转的标志。

          接下来发生了一件有趣的事情。一些新人和新公司(比如Kaypro、Compaq以及那个叫Michael Dell的大学生)陆续进入这个由Apple创建并由IBM引入正轨的市场。多亏PC的结构是开放式的,"IBM克隆制造者"们因此可以通过组装配件来生产廉价的PC。

          这些克隆产品有一个共同的特点——它们都安装了由一家小软件公司生产的磁盘操作系统,这家公司的名字叫微软。

          与此同时,Apple正准备发布Lisa,这是第一种支持图形用户界面的商业计算机。接踵而至的是Macintosh、桌面出版系统,Apple在美国"超级碗"橄榄球联赛上为图形用户界面的Macintosh大做广告。

          作为回应,微软也于1985发布了自己的图形用户界面,也就是比较原始的Windows,两家公司为此打了多年的官司。当Compaq抢在IBM之前发布了第一款386计算机后,用户操作界面图形化的革新完成了。

          计算机逐渐成为流行文化不可分割的组成部分。1982年,PC被《时代》杂志推选为"Machine of the Year",当时PC以微弱优势击败了吸尘器和爆米花机。1984年,William Gibson在他的小说《神经漫游者》(Neuromancer)中曾使用"赛博空间"(Cyberspace)一词描绘一个由联网的机器构成的世界,这部小说很快就变成了现实。

          在20世纪80年代中期,IT业的专家们开始考虑将计算机应用到企业中去,而局域网技术和客户机/服务器技术的发展则令计算机的设计者们倍感欢欣。

          1984年,局域网和小型机保有量的基数少于100万台。1988年发布的一份调查报告显示,局域网用户数量在4年中增加到了600万,而小型机的用户数量在同期则停滞不前。随着新的以太网标准的推出以及网络连接性能的改善,IEEE于1995年认可了快速以太网,并发布了802.3u 100Bast-T标准,其网络传输速度可以达到100Mbps

          新的硬件设备和系统软件开始使用这些网络技术。1986年,IBM发布了高速工作站RT,这是第一台采用IBM倡导的RISC架构的个人计算机。次年,Sun公司宣布和AT&T联合开发用于商业工作站的Sparc/Unix平台。

          企业逐步认识到在网络环境中改进员工之间协作水平的意义。1989年出现的Lotus Notes Release 1.0 提供了群组邮件、电话簿以及对程序进行定制的功能。SAP则于1992年发布了R/3客户机/服务器软件。

          随着Windows 95的发布,微软得到了企业级用户的关注。Windows 95 提供了"开始"按钮和任务条,对文件系统、网络支持都进行了改善,另外Windows 95还有一个全新的用户界面。为了给Windows 95作宣传,微软不惜花了120万美元购买滚石乐队1981年的作品"Start Me Up"的使用权。然而,另一场对企业级计算产生更大影响意义的革命正在悄然"StartUp"(启动)。

          Netscape是互联网的始作俑者。1995年8月,该公司首次上市融资的巨大成功为随后互联网长达4年的混乱埋下了隐患。高科技公司随之纷纷涌现,一种畸形的经济出现了——公司的业绩不是用它们能挣多少钱来衡量,而是用它们如何烧钱来衡量,昭示着一个CEO层

第一台微型计算机其实是超级技术发烧友摆弄的玩意儿。但是随着AppleⅡ的"可视计算"软件(VisiCalc)于1979年首次推出,个人计算机开始走出实验室并走向商业应用。2年后,IBM也发布了PC,不久之后,这种灰色的小盒子和录音电话一样成为美国企业高效运转的标志。

          Netscape Navigator的巨大成功让沉睡于Windows 95的微软猛然惊醒。这个来自Redmond的巨人感到Navigator浏览器对它的桌面市场垄断造成了威胁,于是斥资百万投入Internet Explorer的开发(具有讽刺意味的是,IE 1.0 的开发代号是根据美国国家超级计算中心的Mosaic项目起的——Mosaic项目正是Netscape诞生的渊源)。

          浏览器之争影响到了软件开发,公开发布软件测试版以及补丁程序成为行业惯例。充分采用信息技术的公司学会了通过网站和电子邮件向雇员以及客户提供信息。

          企业为自己的名字添加.com或者.net这样的后缀,并花费数十亿美元来保护域名安全和建设网站。这些都成为黑客攻击的目标,黑客们在成千上万的网站上留下他们的"记号",包括美国中央情报局(CIA)、美国空军、纽约时报和情趣女孩在内的各种类型的网站都未能幸免。

          浏览器之争的结局影响深远。Netscape在连续3年亏损之后渐渐淡出市场,最终于1998年被AOL收购。

          几个月之后,梅丽莎病毒(Melissa)在几个小时内传遍全球。正当人们为解决千年虫问题忙得不可开交的时候,微软的软件以及国际互联网自身的漏洞也很快成了一个大问题。

          2001年春,美国圣何塞 Mercury新闻台的一则新闻可以用来对这个时代进行简洁的概括:"一个月以前,你是一个28岁的百万富翁,不过现在你只是一个28岁的普通人。"

          千年虫问题悄然过去,Nasdaq在2000年4月崩盘了,".COM"的未来几乎在一夜之间倾覆,长达10年的经济泡沫宣告破裂。但更大的灾难还在后头——恐怖分子发动了"911"袭击。

          国际互联网的架构仍然存在问题。2000年2月份出现的大规模DoS(拒绝服务)攻击使很多大型网站瘫痪,包括Amazon、CNN以及Yahoo!。2年后,一次DoS攻击竟然将互联网全球13个域名服务器中的9个打垮。

          红色代码、尼姆达、Klez、冲击波、Slammer、巨无霸等一系列恶性蠕虫病毒感染了数百万台计算机。Slammer还曾让ATM机、911呼救中心以及其他连接到互联网的系统失效。

          在接受了一系列安全漏洞的教训之后,2002年1月比尔盖茨提出了"可信赖计算"战略。随后的18个月中,微软发布了60个安全公告,并且对各种产品使用的补丁规定了"关键级别"。微软还受到了一个意想不到的对手的挑战:开发源代码的Linux,Linux现在俨然已经成为网络操作系统中的第二号人物。

          同时期,Internet 2,也就是下一代互联网试验网,开始取得进展。目前这个网络可以实现实时的歌剧转播。

          随着Linux逐步进入桌面市场以及计算平台逐步向移动通讯设备和机顶盒开放,数字化时代的下一阶段将是最激动人心的

posted @ 2006-11-19 15:29 arron99 阅读(715) | 评论 (0)编辑 收藏

IBM加强了在超级计算机市场的统治地位,在全球超级计算机500强中占据了半数席位,惠普所占比例大幅下降。

  惠普在500台最强大超级计算机中所占比例降到了26%(131台),半年前是34%(170台)。
IBM占到了51.8%(259台) ,去年11月时只有43%。

  自从1993年发布“超级计算机500强”以来,首次出现了所有上榜计算机都能每秒处理一万亿次计算的情况,1997年的超级计算机500强没有一台能进入今年的排行榜。去年11月上榜的计算机中有201台此次不能上榜,这反映了市场的迅速变化。

  IBM超级计算机占据了前两位,在前十位中占据了六位。IBM的商用系统在500强中占据了161席。IBM还主宰了低端领域,有193个系统采用低成本的Linux软件和大众市场芯片。

  Silicon Graphics上榜的计算机从20台增加到24台,戴尔拥有21台,Cray有16台。英特尔成为了最大的赢家,333台上榜计算机采用了英特尔芯片,一年前只有287台。77台计算机采用了IBM的Power处理器,36台采用了惠普的新片,25台采用了AMD的计算机。

  中国目前有19台超级计算机上榜,略微落后于日本的23台。中国三年前才首次上榜。

  NEC在2002年建造的“地球模仿者”被IBM超过了,目前仅排名第四。前十台计算机中有五台基于IBM的“Blue Gene”设计,采用IBM的Power芯片。

  IBM的Blue Gene/L目前是全球最快计算机,每秒能处理1.368亿次计算。该系统还在建造中,完成后的速度还将提高一倍,这将使该计算机在一段时间内保持领先地位。日本政府五月表示,计划在2010年以前建造每秒能处理一千万亿次计算的超级计算机。(
posted @ 2006-11-19 15:27 arron99 阅读(539) | 评论 (0)编辑 收藏

如果将计算机喻为科学皇冠,那么超级计算机无疑是皇冠上最耀眼的明珠。一个国家超级计算机的研制水平,是国际上用来衡量其科技水平最重要的标志之一。超级计算机一直以来应用于工业,科研,国防中最尖端的一些领域。在所有超级计算机的研制者中,西摩·克雷(Seymour Cray)被誉为是无可非议的“超级计算机之父”。

1925年克雷出身于美国的一个工程师家庭,他从小就喜爱电子学,中学期间更是长时间泡在电气实验室,对于摆弄各种电气设备、收音机、电动机以及各种电路乐此不疲,他长期沉迷其中,以至于极少参加各种社会活动。小时候的这些经历似乎已经预示了他将来一定会走出一条出色的技术专家道路。

中学毕业后,18岁的克雷加入部队,服役期间正值二战末期,他随着部队走南闯北,到过世界上不少的战区。二战结束后,克雷回到美国,开始在威斯康星大学上学,不久,又转到明尼苏达大学,1951年取得了该大学的电气工程学士学位,由于感到一些课程太缺乏数学内容,其后克雷又花了一年时间学习数学,1952年他拿到了数学硕士学位。就像很多人一样,拿到学位后,到底应该何去何从呢?克雷开始迷茫了。这时克雷的老师给了他一个建议说,如果我是你,我会沿着这条路走下去,一直走进工程研究协会(ERA)。克雷听从了老师的建议,从此也奠定了其一生事业的发展方向。

随后克雷加入了ERA,负责建造密码设置。当时的克雷对还对计算机一无所知,为了完成目标,他一头扎进图书馆,开始吸收各种计算机的知识。不久后,他设计出他的第一台计算机EAR 1103。但是没过多久,ERA被收购,克雷发现这家新公司与他自己的目标――研制第一流的超级计算机相差太远,最后克雷选择了离开。

1957年,克雷和其它几位ERA的同事辞职后,创办了CDC。在克雷刚开始CDC 1604的设计时,电子工业中最重要的创新――电子管问世了,也正是因为电子管刚刚出现,价格很高。面对资金短缺的问题,克雷不得不在CDC 1604的建造中使用了不少的废弃的二手晶体管。尽管如此,CDC 1604还是成为了当时最好的计算机,也是独一无二的晶体管超级计算机,不能不说,这完全是克雷一次伟大的成功。随着CDC 1604的商业成功,克雷的声望与日俱增,然而对克雷而言,这也许并不是一件好事,过多的行政事务与社会活动使他不能专心于他的目标。于是克雷和公司达成协议,在他老家威斯康星的丛林中建立一个实验室,在此后的整整4年中,克雷谢绝一切社交往来,潜心于超级计算机的研究,为此别人送他一个“丛林隐士”的外号。他的隐居没有白费,1963CDC 6600的推出,使得CDC公司成为了市场上真正的主导者,再到后来CDC 7600的推后,这台每秒运行1000万次的机器被公认是当时第一台真正意义上的超级计算机,克雷也成了举世闻名的超级计算机专家,CDC公司从此开始独霸整个超级计算机市场。

     CDC在当时实在是太成功了,这也导致了其将目光转移到了计算机的商业应用,不再重视超级计算机的研制。这使得坚持自己信念的克雷第二次的选择了离开。1972年,克雷自立门户,创立了克雷研究公司,公司的宗旨是只生产超级计算机。此后的十余年中,克雷先后创造了CRAY-1CRAY-2等机型,他亲手设计了Cray机型的全部硬件与操作系统,其中的作业系统更是他用机器码编写完成。在CRAY-1,他第一次采用了集成电路来制造,速度达到了每秒钟2.4亿次,是当时市场上其它机型的40多倍速,而价格却相差无几,这使得CRAY-1取得了空前的成功,其后推出的CRAY-2更是比CRAY-1功能强大了46倍,运行速度达到了每秒12亿次的浮点运算,很多以前需要几年运算才能完成的工作在CRAY-2上只需要1秒钟。到了1984年时,克雷公司占据了超级计算机市场70%的份额。

但好景不长,到了20世纪80年代后期 PC的发展如日中天,大型机和超级计算机都受到了较大的冲击,最终CRAY-3在商业市场上惨淡收场。此时的克雷再一次与公司的意见出现分歧,1989年他退出了自己一手创办的克雷研究公司,另行成立了克雷计算机公司,全力研究CRAY-4,但是这个设计目标为每秒1000亿次的机型最终没有完成,1995年克雷计算机公司被迫宣布破产。

   面对事业的几次大起大落,克雷一直没有放弃过,到1996年,70余岁的克雷再一次创办了SRC公司,希望再一次能为世界创造出奇迹,可惜天不作美,厄运突然降临,19969月,一场意外的交通事故让克雷永远的停止了呼吸,享年71岁。

 
posted @ 2006-11-19 15:26 arron99 阅读(570) | 评论 (0)编辑 收藏

之前零零碎碎地写了一些东西,现在回过头一看,发现很多地方自己想得并不清楚,说得也就更不清楚了。写了篇文章,结果把关于“管理和技术”这样老得掉渣的事情又翻出来讲了一遍。
    对于这个话题,大家都是有很多想法需要表达,下面讲讲自己的一些看法。

管理的意义

    说起管理,可能大家都会想到分配任务,估算进度,作计划,制定制度,或者要求大家加班。
    很多公司的项目经理同样也是高级程序员。管理作为模范带头的形象出现,以技术服人。
    还有的项目经理以“管人”为己任,制定规章制度,约束手下的行为方式或者思考方式,时不时地拿些零碎的任务来折磨程序员。

    管理分为管人和理事。有些朋友的观点是“技术不如我的没有资格管我”,还有的观点是“管理就是约束”等等。如果说狭义的管理是公司指派的管理者,那么广义的管理就是指“影响”他人的行为和有效地利用资源。
    不记得是在哪本书上看到的,管理者可以指派,但领袖是无法由上面指派下来的。
    管理的最终目的是让团队顺利的完成任务。其他的都是管理的方式,不是目的。如果我们从广义的管理概念上出发,抛弃公司制定的职位限制,可以说搞技术的和管理并不矛盾。

自组织团队

    以前写过一篇关于自组织团队的文章,有兴趣的朋友可以看一看
    在自组织团队中的每一个成员都是管理者,而由公司指派的项目经理都不直接参与到开发工作中,他们存在的意义是给开发团队创造最高效工作的环境。这也是我比较提倡的管理理念。
    说起自组织团队最经典的例子就是鸟群。每只鸟只有相对局部和简单的行为规则,但一定规模的群体则表现出秩序井然,以及集体的应急行为。这似乎存在某种群体计划和管理,但事实上并没有。

管理是风

    还是从鸟群来看,比如说秋天往南飞的大雁。他们没有群体计划和管理,但是小学生都知道“一会儿排成人字形,一会儿排成一字形”。那么它们怎么会这样的呢?
    答案是“风”,或者说是“空气动力学”。
    大雁们知道什么队形最省力,什么样扇翅膀的方式最高效。排在第一位的大雁都是经验丰富的老雁。但它并不是管理者。真正的管理者是处于无形的风。看不见的风的形态决定了大雁群的行为方式,大雁借助风的力量完成迁徙。
    风对于大雁来说不是一种束缚,也不是它们的模范。但有经验的大雁能利用风来更好地飞翔,同时排在后方的大雁能借助前方的大雁扇动翅膀时带来的气流省力。所以说管理的最高境界是无形,在无形的管理下带出有序高效的团队。同时团队中的成员是相互影响,相互管理的。

    管理的目的是为了让大家顺利地完成任务,所以管理就是“使之合理”。合理代表着有高效的流程、合理的制度、健康的成员关系、共同为之努力的愿景等等。

超越了工匠的工匠

    马克思说“人是一切社会关系的总和”。也可以说团队成员是团队内部关系的总和。
    每个人的价值并不完全在于他的技术能力,更多的在于他的影响力。在一个团队内部来说,人的影响力就是他融入团队的一个重要标志。管理你的管理者,同时管理着你的团队。
    上面说了,如果有这样一个优秀的管理者为我们提供了很好的环境,那我们又能做什么?
    “缘督以为经”,按照风的规则做事,充分利用管理者创造的条件完成自己的目标。
    如果作为一只经验丰富的大雁,自然地会作为领队带领着团队以正确的方式做事。这个时候他就不再是一个工匠,而是一个超越了工匠的工匠。
   
工匠的做法是只关注眼前的活儿。作为一个艺术家,这点无可厚非。但作为一个软件项目的参与者,由于软件系统的日趋庞大和复杂,所以不得不“委屈求全”地和他人合作。在这个状态下,技术并不是全部的因素。

初级程序员写的代码只有编译器才能读懂,但高级程序员写的代码却是为了让更多的人读懂。这也说明了当技术达到一定层次的时候,我们不应该只是关注于代码,而应该关注于人。只要关注于人,那就不可避免地需要“劳心”。

不少像我这样醉心于技术的人都认可以技术服人的方式,但在人与人之间的交往之中可能以德服人的成分要多些。虽然说“以德服人”听起来有点揶揄的味道,但德高望重的人更加容易被人认可。
就比如说墨子的成功,一方面在于他的技术却是很牛,但更重要的一点在于他的影响力。

作为程序员,“劳力”是天经地义的事情,但作为一个为了创造更高价值的程序员,则必须要“劳心”。
posted @ 2006-11-19 15:23 arron99 阅读(556) | 评论 (1)编辑 收藏

涂曙光,微软简洁的名片上,他的职务写着:解决方案技术专家,微软技术大会Tech·ED上,他是年轻而有活力的MVP讲师,在国内SharePoint技术社区,他是相当知名,并有大量“崇拜者”的Kaneboy。这样的涂曙光,你能把他和一个中专生、一名宾馆服务生联系起来么?
 
把时间往前拨回9年,从岳阳石油化工学校电气化专业毕业的涂曙光,不愿按照父亲安排进家乡电力公司,心里怀着对计算机的热爱,决心到外面闯一闯,当时他现在的妻子黄燕,和他一同毕业后,在长沙一家宾馆做服务员,于是涂曙光也觅了一个机会去了长沙一家酒店做服务员,紧接着就被送去广州白天鹅宾馆做培训,其间只有很少的一点工资,协议却一签就是一年,他带着个小包就南下去了广州。后来黄燕去广州探望他的时候,发现他的床头放着一本翻得皱皱的《C++语言大全》,那时黄燕已经去了一家电脑培训学校讲授Office方面的课程,看到那本厚厚的《C++语言大全》,惊讶的问:“这种全是代码的书,没有电脑实验的情况下,你是怎么读下去的?”涂曙光说:“嗯,只要理解了代码,就可以在心里想象出代码的运行过程,知道代码最终的输出结果。”
 
一年的培训结束后,涂曙光回到了长沙的那家宾馆继续做服务员。回忆起往事,涂曙光笑着说:“做服务员让自己得到了一段很难得的人生经历,而且假如有一天过不下去了,我还是可以轻松找份服务员的工作养活自己,我经常用这个底线来鼓励自己!” 不过专职的服务员,涂曙光只做了2个月,随后就到了黄燕所在的电脑公司做起了攒机器的活。后来,涂曙光总笑着说:“因为黄燕,我进了IT业。”但黄燕却说:“涂曙光最终都会进入到这个行业里面,他的所有兴趣都在计算机上,从看到那本厚厚的《C++语言大全》开始我就知道,无论过程怎样,最终他一定会走上这条自己的路。”
 
此后的几年时间,涂曙光开始寻找各种进一步深入编程的机会,从电脑公司到网络公司,再到软件公司,先后换了多份工作,接触和使用的技术也经历了CGI、ASP、VB、Delphi的转变。2003年涂曙光进入了深圳一家软件公司,而这家软件公司是微软公司的金牌合作伙伴,于是,他开始接触和研究.NET技术,并很快成为了.NET开发方面的专家。由于公司研发方面的原因,涂曙光开始对当时国内还没有什么人了解的SharePoint Portal Server开始进行研究,并很快成为了当时国内仅有的极少数SharePoint开发人员之一。
 
一个偶然的机会,涂曙光在网上看到了现在已经在.NET技术圈相当知名的博客堂网站,立刻萌生了写Blog的年头。从此,国内的SharePoint Portal Server的技术人员就开始在博客堂上看到了一位叫做kaneboy的人在不断的撰写着SharePoint相关的文章,而他的文章,在当时几乎成为了很多人唯一可以得到的SharePoint中文技术资料。2004年,由于涂曙光在博客堂上大量的SharePoint技术文章,他获得了微软最有价值专家(MVP)的称号。
 
2004年对于涂曙光的职业生涯无疑是一个转折点。因为在获得MVP称号后不久,经过一个成功的面试,他进入了微软公司专业解决方案部,成为了负责Office System和SharePoint Portal Server等产品的解决方案技术专家。
posted @ 2006-11-19 15:21 arron99 阅读(670) | 评论 (0)编辑 收藏

910的凌晨,当34岁的法兰西球魂齐达内黯然下场后不久,亚平宁半岛的王子们开始庆祝他们阔别了24年的大力神杯。而世界杯史上保持对意大利28年不败记录的法国,却在这一刻被命运捉弄。经历了小组赛的如履薄冰和淘汰赛的渐入佳境,齐达内带领这支逐渐老去的法国队坚定的走向自己的荣誉。然而,命运却让他在生命中最后一场比赛中再次落泪。残酷的哨音响起,他逐渐黯淡的背影,慢慢在人们眼前模糊,这竟是他留给世界最后的回忆。下一个4年的轮回,能够带给我们什么?蓝色海洋洋溢的柏林上空,又是谁的眼泪在飞?

      世界杯的硝烟散尽时,我却发现,World Cup,历届世界杯的英文写法,却在此时此刻略显不同。这个大家耳熟能详的简单词语中,蕴涵了本月最流行的八本技术图书。是巧合?是世界杯把它们带来,还是因为它们世界杯才更精彩?

 

                         Web性能测试实战

                         Beginning C# Objects中文版

                         应用Rails进行敏捷WEB开发

 World Cup  深入理解LINUX网络内幕(影印版)

                         Delphi 2006 高效数据程序设计

                         C2005从入门到精通

                         UML用户指南(第2版)

                         Pro Spring中文版

 

1. Web性能测试实战

  作者:陈绍英,夏海涛,金成姬

  在本书中,作者作了一个很有趣的比喻:亚健康IT人与亚健康的软件。有一次作者和几位测试同行一起爬香山,结果第二天几个人累得几乎下不了床,一个星期之后,才觉得走路时的腿是自己的。毫无疑问,这几个人的身体都已进入亚健康状态。就在作者趴在床上休养生息的时候,想到了用亚健康来定义软件。根据级别可分为四类:

  超级健康软件——UNIX超级健康软件的典型,体魄像运动员一样,非常抗折腾

  健康软件——性能稳定,可以满足用户现在以及将来一定时期内的扩展需求。例如我们日常用到的数据库管理系统。

  亚健康软件——软件性能很一般,就像亚健康IT人正常上下班一样,能满足使用要求,但是扩展性、稳定性都很一般,只要环境发生变化,极有可能成为不健康软件
 
不健康软件——性能很差,甚至存在严重缺陷的软件。

  毫无疑问,开发人员应以做出超级健康或健康的软件为目标。但是现实恰恰相反,就像很多IT人都处于亚健康状态一样,在现实的软件中,超级健康和健康软件的比例很低,多数软件都存在性能问题。而这也是本书讨论的重点。随看软件系统日益复杂和普及,软件亚健康问题将会越来越突出,因此我们应该尽早寻找诊断和治疗这一问题的方法。为此,本书提出了“Web全面性能测试模型,期望能够成为帮助解决软件亚健康问题的一剂良药

几位作者都是进行WEB测试的一线人员,拥有丰富的测试经验。他们在本书中提供了很好的Web软件性能测试解决方案,把他们多年在该领域的丰富实践经验深入浅出地与读者共同分享,紧密结合测试项目来探讨如何规划与实施性能测试。相信本书对于软件测试人员、开发人员和项目管理人员都将大有裨益。

 

2. Beginning C# Objects中文版

  作者:Jacquie Barker and Grant Palmer

译者:韩磊,戴飞

本书是由该书作者之一Jacquie Barker的经典畅销著作Beginning Java Object一脉传承而来,与之具有异曲同工的特色。主要译者韩磊CSDN的总编辑,曾与刘韧合著《网络媒体教程》。

本书最初和最重要的关注点,是软件对象:什么是软件对象,为什么它们如此神奇而直白,以及如何正确使用对象去构建一个软件应用。同时这也是一本关于C#的书:它并非一本“C#大全,而是一份对该语言的温文但全面的介绍,还特别强调了如何把对象模型转换到功能完备的C#应用程序——技术图书领域内的其他图书很少这样编写。

值得一提的是,本书的前面章节对于有一定经验的开发人员来说或许过于简单,因为许多对象技术建立于基础软件工程原则之上,这些原则经年以来在许多项目中实践过,只是稍加包装而已。本书从内容上来看比较适合初级学习者由浅入深的进行学习,它将带领你深入理解ObjectOO编程,着重讲解了OO编程与C#两者的关系,以及如何将他们融会贯通。就好像武侠小说里的绝世武功,空有招式没有内功是无法发挥其威力的,对OO的理解是灵魂,而C#只不过是一种语言,一种工具,等待我们去使用。从本书内容来看,绝对不可能让你成为OO专家或者C#大师,也不可能教会你所有C#的知识,但是它能够让你感觉到你在驾驭这种语言。如果你具备一些编程经验或者对编程的初级概念有一定了解,会对你学习本书有很大帮助。你不必对C#有任何认识,那是本书需要教你的事情;你也不必对对象有任何了解,正如书中所说,人类天生是从对象的角度去看问题,本书只是让你认识到这一点。

 

3. 应用Rails进行敏捷Web开发

  作者:Dave Thomas, David Hansson

  译者:林芷薰

  此书即《agile web development with rails》第一版,在其出版两周后便登上Amazon书店计算机书籍排行榜榜首。此外本书还是2006Jolt Award(震撼大奖)得主,来自Jolt Award震撼大奖获奖图书系列Pragmatic 书架。Pragmatic系列以优质的图书质量闻名,相信所有喜欢RubyROR的读者可以庆幸放心的购买本书了。本书预计7月份出版。

  笔者曾在上期《程序员》的文章中提过,Rails已经越来越成为最火热的Web框架。2006上半年Ajax框架是毫无疑问的大红大紫,而Rails就好像是武功发挥到极致的武林高手一样以一种看不见的方式越来越热,当我们在各个著名BBS里发现增添了Ruby on Rails版块时,才会恍然大悟:啊,原来ROR已经有这么多人在研究了。随着动态语言Python在国内的走红,Ruby强大的面向对象功能和短小精干,开发效率高的特色也让众多优秀程序员着迷。虽然目前在国内Python的资源相对较多,但我认为RubyRails将会随着国内技术氛围渐渐成熟而逐步成长。

  本书中以一个完整的在线购书网站示例,真实地再现了一个完整的迭代式开发过程,让读者亲身体验实际应用开发中遇到的各种问题、以及Rails如何有效解决这些问题。在随后的“Rails框架部分中,作者深入介绍了Rails框架的各个组成部分。如果你对Rails缺乏了解,那么你应该首先阅读起步部分,通过一个最简单的示例应用感性了解这个时下热门的web框架。如果你对Ruby这种动态语言更加感兴趣,那么建议你去购买同样是Pragmatic系列的《Programming Ruby 中文第二版》,这本书同样获得了Jolt Award震撼大奖,预计将于20069月出版。

 

4. 深入理解LINUX网络内幕(影印版)

  作者:Christian Benvenuti

  Linux如此的流行正是得益于它的特性丰富并有效的网络协议栈。如果你曾经惊叹于Linux能够实现如此复杂的工作,或者你只是想通过现实中的例子学习现代网络,本书将会解答你的许多问题。
  O'Reilly
对于国内的读者来说是最具实力的影印版图书出版公司,他们曾经出版的《深入浅出设计模式》,《深入浅出Java》,《深入浅出HTMLCSSXHTML》等图书都是国内高级读者了解国外大师思考方法的渠道。同其他O'Reilly的流行书籍一样,本书清楚地阐述了网络的基本概念,并指导你如何用C语言实现。虽然早先的TCP/IP经验是有用的,但初学者通过本书仍然可以学习到协议本身和大量的应用信息。一旦彻底掌握了这些网络工具,你就可以使用本书所附的代码,准确地指出Linux内核中最重要的部分如何工作。
 
网络功能的实现或破坏在不同的时候是由不同的代码块完成的,这正是理解网络和实现它的难点中的一部分。本书的成功之一就是描述这些代码块如何集成,以及众多的函数和数据结构之间的关系。它不仅描述了Linux网络的全貌,而且是理解Linux网络细节的有效指南。

 
本书作者Christian Benvenuti是一个专注于操作系统网络的设计者。他在书中不仅解释了Linux代码如何工作,还阐述了主要网络特性的目的以及在不同解决方案间是如何抉择的。书中还包含了大量的流程图和其他图表以帮助读者理解。

 

5. Delphi 2006 高效数据程序设计

  作者:李维

  李维老师又出新书了!在大陆,大多数读者都非常喜欢李维老师平易风趣的写作风格,让人在不知不觉间被图书内容深深吸引,不忍释卷。继《面向对象开发实践之路》和《INSIDE VCL(深入核心——VCL架构剖析)  》两本著名杰作之后,李维老师又出版了关于Borland新一代dbExpress的技术原创图书。Borland新一代的dbExpress提供了跨平台、高效率的数据引擎。dbExpress不但提供广泛的关联数据库存取能力,并且适用在C/SWeb和多层的应用系统之中。本书不但深入讨论dbExpress的使用技巧,更辅以丰富的范例让读者完全掌握Delphi/.NETdbExpressDataSnap的技术。
 
随着关联数据库广泛使用在不同的应用系统中,程序员面临了如何在各种应用系统中存取多种不同的关联数据库。由于以往的数据存取技术大都只能执行在特定的操作系统并且只能存取传统的数据库,因此,已经不适合使用在今日多变而且使用者要求复杂的应用之中。     Delphi/.NETdbExpress则刚好提供这些需求的解决方案,因为dbExpress拥有高效率的执行能力,适合使用在各种类型的应用系统中,并且提供了执行在WindowLinux.NET平台的能力。李维老师将以他一贯风趣的写作风格吸引众多的读者,并使读者全面了解最新一代的Borland产品。

 

6. C2005从入门到精通

  作者: (英)夏普 著,周靖

   本书是从去年起就吸引了众多微软产品程序员的“微软.NET系列丛书”中的一本,到今年已经在网络上极为流行。然而,也许是因为本书在国内出版稍晚的关系,国内的市场已经涌现出了一批精品的原创.NET2.0图书,例如人民邮电出版社的《ASP.NET2.0开发指南》,郝钢主编。可以称为是一本全面细致讲述.NET2.0的精品图书,可以作为程序员的案头工作手册。相比之下,这本《C#2005从入门到精通》虽然内容不错,但是对国内读者来说文风略显僵硬,还是《ASP.NET2.0开发指南》这本原创图书更加适合中国读者的口味。后者直线上升的销售数据也说明了这一点。

   和另一本即将出版的《Visual C# 2005技术内幕》不同,本书面向的是相对初级的用户。对于那些已经对C#语言有深入了解的中高级读者来说,本书的吸引力并不会很大。建议中高级读者购买阅读即将出版的同系列图书《Visual C# 2005技术内幕》和《Microsoft .NET框架设计(第2版):C#》。这两本书相信会是整套丛书的重头戏。

 

7. UML用户指南(第2版)

  作者:(美)Grady Booch,James Rumbaugh,Ivar Jacobson

译者:邵维忠 麻志毅 马浩海 刘辉

   UML(统一建模语言)已经成为对软件密集型系统的制品进行可视化、详述、构造和文档化的工业标准。作为事实上的标准建模语言,UML便于项目各方之间的交流,并能减少相互之间的误解。UML2.0标准化进一步扩大了语言的范畴和生存能力。其内在的表达能力允许用户对从企业信息系统、基于Web的分布式应用到实时嵌入式系统中的各种事物建模。

  本书是UML方面最权威的一本著作,三位作者是面向对象方法最早的倡导者,是UML的创始人。本版涵盖了UML 2.0。书中为具体的UML特征提供了参考,描述了一个使用UML进行开发的过程,旨在让读者掌握UML的术语、规则和语言特点,以及如何有效地使用这种语言,知道如何应用UML去解决一些常见的建模问题。深入、全面的内容和丰富的示例使得本书前一版成为软件开发人员的必读著作,本版继承了这些优点,并对内容进行了全部更新,以反映UML 2.0在表示法和用法上的变化。通过这本必备指南,读者可以迅速地掌握工业标准建模语言的最新特性,并能将其应用到软件项目中。在第二版中,添加了一章介绍构件和内部结构,包括用于构造封装设计的一些相当重要的新能力,更新了关于供接口、需接口、协作,顺序图、活动图和UML外扩方面的内容,并涵盖了UML 2.0规范所引入的其他修改。

 

8. Pro Spring中文版

  作者:(英)Rob Harrop,Jan Machacek 译者:夏昕

   本书是继《Spring in Action》之后第二本国外引入的Spring方向的重量级著作,由著名的Apress2005年出了第一版。在国内的中文译名为《Spring 专业开发指南》,由著名Java方向的作者夏昕翻译。本书深入分析了Spring框架的各大核心包,并结合实例展示了它们的具体应用,通过深入浅出的讲解,帮助读者建立AOPIOC等概念。并且以贯穿全书的一个示例系统为主线,让你了解如何使得Spring与众多优秀的开源项目结合,提供更加强大的功能;不仅对Spring MVC的应用进行了大篇幅的探讨,同时与其它Spring相关书籍不同,本书还对Spring的远程访问技术以及任务管理机制进行了深入介绍,突出Spring作为轻量级框架的特征的同时,还将Spring与传统J2EE开发方式进行了完美的结合。附录中还介绍了Spring项目的测试以及富客户端开发,展示了Spring IDE的使用方法,以及Spring未来会面对的一些技术变革。

posted @ 2006-11-19 15:11 arron99 阅读(2468) | 评论 (2)编辑 收藏

1. Unix操作系统

2. IBM System R-1983年以DB2的形式进入商业市场

3. 基因排序软件-美国基因组研究所(IGR)

4. IBM System 360系统

5. Java语言

6. Mosaic浏览器-第一款图形界面浏览器

7. Sabre系统-美国航空公司的信息查询系统

8. 苹果Macintosh系统

9. 微软Excel电子表格

10.阿波罗宇宙飞船导航系统

11.Google搜索排名

12.Morris蠕虫-造成的经济损失超过1000万美元

细细的想想,还有挺有意思的,比如:“1988年11月2日爆发的Morris蠕虫,当时,几天之内就有6000多台互联网服务器被感染而瘫痪,造成的经济损失超过一千万美元.”能够短短几天内千万如此大的损失,确实很“伟大”啊.

不解为什么微软的Excel名列第九位,而微软的众多OS却榜上无名?想想大概是因为,只有每个行业创造的第一才算伟大吧.
posted @ 2006-11-19 15:05 arron99 阅读(587) | 评论 (0)编辑 收藏

简单的示例程序如下:
    
    /**
 * 读出1.txt中的内容,写入2.txt中
 *
 */

import java.io.*;

public class ReadWriteFile{
 public static void main(String[] args){
  try{
   
   File read = new File("c:\\1.txt");
   File write = new File("c:\\2.txt");
   
   BufferedReader br = new BufferedReader(
         new FileReader(read));
   BufferedWriter bw = new BufferedWriter(
         new FileWriter(write));
   String temp = null;
   temp = br.readLine();
   while(temp != null){
    //写文件
    bw.write(temp + "\r\n"); //只适用Windows系统
    //继续读文件
    temp = br.readLine();
   }
   
   bw.close();
   br.close();
   
  }catch(FileNotFoundException e){ //文件未找到
   System.out.println (e);
  }catch(IOException e){
   System.out.println (e);
  } 
 } 
}

posted @ 2006-11-19 15:02 arron99 阅读(725) | 评论 (0)编辑 收藏

周小川是在参加第八届20国集团财政部长和中央银行行长会议期间接受新华社记者采访时说这番话的。他说,这次会议认为世界经济形势良好,并呼吁各国政府 借此机会实施必要的改革。周小川认为,中国储蓄率较高,财政状况良好,有条件进行养老和医疗保障制度的改革。

  周小川说,中国的社会保障主要是养老和医疗两个方面,这也是构建社会主义和谐社会的重要组成部分。中国老龄化问题正在变得突出,现收现付的养老保险制度将难以为继。

  他说,新的社会保障体系需要建立一个包括国家支持、个人账户和商业保险等在内的多支柱的体系,特别是要建立预筹积累的个人账户。他指出,建立起有效的激励机制,鼓励人们加入养老和医疗保障体制,这对养老和医疗制度的改革至关重要。他说,这一过程需要“创新、大胆、慷慨”。他还强调:要勇于开拓思路,采取符合中国国情的措施;新的保障体制要覆盖全社会,不降低标准;该花钱时不能吝啬,敢于把钱用在刀刃上。

  针对不同群体收入不均衡问题,周小川认为可以采取区别对待的方法:对那些有足够储蓄的人来说,要通过激励机制鼓励他们主动加入养老和医疗保障体制;对储蓄相对不足的人来说,可以通过发展消费者信贷来支持他们;对比较贫困的人来说,应当采用量力而行和国家帮助并用的办法。

  他还说,居民的社保资金应当通过资本市场得以保值增值,以分享国民经济增长的好处。

posted @ 2006-11-19 13:14 arron99 阅读(651) | 评论 (0)编辑 收藏

 据美联社10月31日报道,周二的欧冠联赛中,罗马队主场迎战希腊的奥林匹亚克斯队。这场比赛之前,两队球迷发生冲突,导致一人被刺,大轿车起火。

  罗马队球迷冲入了奥林匹亚克斯队球迷下榻的饭店。一位32岁的奥林匹亚克斯队球迷的大腿被刺了5刀。据意大利安莎社报道,这位球迷马上被送进了医院。

  在另外一起暴力事件中,罗马队球迷将奥林匹亚克斯队球迷乘坐的大轿车点燃,造成车中的球迷受伤。

posted @ 2006-11-19 13:08 arron99 阅读(646) | 评论 (1)编辑 收藏

因为艾弗森的一件球衣,艾弗森的一位球迷去世了,现在艾弗森要出钱为这位球迷举办葬礼。这不是一个单纯的慈善行为,或球员刻意地作秀以摆出一个高调的姿态,这次,艾弗森是真的被他的球迷凯文·约翰逊的遭遇震动了。

  2003年6月24日,艾弗森的球迷凯文·约翰逊在费城的大街上等电车时,遭到了一群十几岁年轻人的挑衅。他们向约翰逊索要他穿在身上的艾弗森的球衣,被约翰逊拒绝,随后他们就开枪击中了约翰逊的脖子后颈。开枪的男子叫弗格森,事发后他被警方逮捕入狱。约翰逊则因为这次枪击受伤,就此瘫痪在床,他的病情不断恶化,最终不得不使用呼吸器维持生命。上个星期,呼吸器不再对约翰逊有效,约翰逊的大脑因缺氧严重损伤,家人不得不就此决定放弃对他的治疗。

  在谈到约翰逊被枪击的事件时,76人队的“中流砥柱”表情凝重而严肃,他直接引用了美国的枪杀统计数据——今年“费城已有将近400人(精确的数据是直至本周已有357人)被枪击身亡”。

  “在费城发生的这些枪击事件实在是太糟糕了。”艾弗森说。艾弗森家境贫寒,从小就是看着街头暴力长大的,但如今他对此却只感到厌倦和难过。“我不认为,凭借我的一己之力能完成这个社会现在必须做的事,但我想,一个人也可以贡献出他的力量。改变这种局面需要许多人一起努力,在费城有很多愿意出力的人。除了我正在做的,我愿意尽力做更多我可以做的。”

  尽管艾弗森也曾被联盟冠以“坏小孩”的头衔,曾经和家庭暴力、私藏大麻等一系列乱七八糟的犯罪行为扯上关系,但作为一个父亲,一个已过而立之年的球队领袖,艾弗森也早已不再是鲁莽顽劣的少年了。

  当地时间本周二,约翰逊去世了,他只有22岁。“是时候让凯文回去了。”约翰逊的母亲詹妮斯在决定放弃对儿子的治疗后痛苦地说。

  约翰逊的葬礼定在美国时间下周三。艾弗森在得知约翰逊去世的消息后,主动联系了詹妮斯,并表示葬礼的钱由他来负担。詹妮斯告诉艾弗森,约翰逊有多喜欢看艾弗森打篮球,有多爱艾弗森。但约翰逊的死亡却让这位七届全明星赛球员陷入了悲哀之中。艾弗森简直不敢相信,约翰逊的生命就这样画上了句号,就像他无力改变费城的治安状况一样。对于篮球场以外的事,艾弗森感到无奈、无助。

  “如果他们如此看重那件球衣,如果他们如此想要那件球衣,我可以给他们100件。”艾弗森摇着头说,“看到有人因此而死去,这太困难了。为了一件球衣,或者其他什么物质上的东西,这太没有意义了。生命的价值怎么能拿来和一件球衣相提并论。”

  由于葬礼举行的那天,艾弗森要和76人队征战密尔沃基,艾弗森将缺席约翰逊的葬礼,但约翰逊将穿着艾弗森的球衣入葬。艾弗森希望,人们能够明白,他为约翰逊的葬礼负担费用是出于一片真心:“我只是想做一些我能做的。”

  2005年,乔丹的球迷史蒂文·特雷特在芝加哥南部的一所小医院里去世了,意外的发生也只是因为特雷特拒绝向抢劫犯交出穿在他脚上的新款乔丹球鞋。如今,又一名艾弗森的球迷因为相似的意外身亡了。艾弗森无法改变已经发生的事,但或者他可以继续约翰逊身前未完成的“事业”。在过去的三年里,约翰逊把时间用在了拜访学校和青年组织上,他在各种集会活动中以自己活生生的例子告诫费城的孩子和成人们,用枪来解决问题的后果,并不明智。

posted @ 2006-11-19 13:06 arron99 阅读(637) | 评论 (0)编辑 收藏

意甲联赛第12轮率先进行的一场比赛中。AC米兰客场0-0战平恩波利。

  红黑军团在最近5轮意甲联赛中的战绩为1胜4负,塞尔吉尼奥、法瓦利、卡拉泽、加图索、安布罗西尼的伤势让安切洛蒂巧妇难为无米之炊。

此役,安切洛蒂在后防线上排出了卡福-科斯塔库塔-马尔蒂尼-扬库罗夫斯基的防线;中场,布罗基与卡卡、皮尔洛、西多夫负责攻防的组织;前锋线上,吉拉迪诺和奥利维拉联袂冲锋陷阵。

  第6分钟卡卡中场传出过顶球,奥利维拉左路下底传中,恩波利后卫将球挡出,布罗基外围远射偏出右侧立住;第11分钟恩波利右路传中,邵达蒂飞身抢点,迪达出击奋力将球擒获。

  第17分钟奥利维拉前场得球后突然起左脚远射,恩波利门将巴里因为站位靠前本已缴械投降,然而这记精彩绝伦的落叶球竟然被横梁挡出,AC米兰痛失领先良机!随后卡福与卡卡打出禁区前二过一配合后的右脚打门被巴里飞身挡出,角球开出后吉拉迪诺的头球攻门又被站在球门线上的后卫头球顶出。

  第22分钟科斯塔库塔故意放倒马特尼被黄牌警告;第25分钟卡福在中场被对方断球,马特尼沿左路高速突破到禁区内之后起脚打门,迪达稳稳将球没收;第32分钟皮尔洛因侵犯马特尼被黄牌警告。

  第36分钟AC米兰获得前场任意球,扬库罗夫斯基将球敲入禁区,卡卡回做,西多夫外围大力抽射偏出左侧立柱;第44分钟奥利维拉在禁区外远程发炮,可惜皮球再度被立柱挡出!上半场结束,AC米兰的打门两度被门框挡出,他们遗憾的与对手战成0-0。

  易地再战,AC米兰继续猛攻。第46分钟前场策动进攻,西多夫得球后颇具想象力的将球横向传出,卡卡在禁区前沿无人盯防的情况下大力抽射,主队门将巴里分身将球挡出底线;2分钟后万努奇断下皮尔洛脚下球后组织快速反击,马里亚尼尼禁区外右脚远射正中迪达下怀;第54分钟马特尼左前场拔脚远射,皮球偏出了右侧立住。

  第58分钟安切洛蒂用老将因扎吉替下了吉拉迪诺;第61分钟马尔蒂尼左路将球吊到后点,西多夫倒地卧射皮球偏的离谱;1分钟后卡卡禁区前沿巧妙直塞,卡福心领神会高速下底传中,因扎吉在对方后卫纠缠下的抢点打门未能吃正部位;第65分钟恩波利中场断球后快速反击,布斯切在距离球门30米开外果断起脚远射,迪达将球挡出底线。

  第66分钟恩波利换上从AC米兰租借而来的波奇,被他替下的同样是曾经效力于红黑军团的邵达蒂;2分钟后古尔库夫替下了组织核心皮尔洛;第72分钟布罗基前场斜线带球过程中右脚怒射,主队门将巴里不敢怠慢双拳将球击出;第74分钟恩波利快速反击,布罗基从身后铲倒万努奇被主裁判黄牌警告。

  第77分钟安切洛蒂用博列洛换下奥利维拉试图放手一搏;第83分钟恩波利禁区内风声鹤唳,博列洛的头球打门被对方后卫挡出底线;1分钟后主队快速反击,马尔蒂尼无奈踢到万努奇被黄牌警告;补时第1分钟AC米兰开出右侧角球,恩波利后卫将球顶出,马尔蒂尼在禁区前沿的凌空打门被巴里用脚神奇挡出;全场比赛结束,AC米兰遗憾的与对手战成0-0平局。

  双方出场阵容:

  恩波利(4-2-3-1):巴里;拉吉,马尔佐拉蒂(68'阿达尼),瓦尼格里,卢齐尼;马里亚尼尼;莫罗;布斯切,万努奇,马特尼(80'费奇尼);邵达蒂(66'波奇)

  AC米兰(4-3-1-2):迪达;卡福,科斯塔库塔,马尔蒂尼,扬库罗夫斯基;布罗基,皮尔洛(68'皮尔洛),西多夫;卡卡;奥利维拉(78'博列洛),吉拉迪诺(58'因扎吉)

posted @ 2006-11-19 13:02 arron99 阅读(586) | 评论 (0)编辑 收藏

北京时间11月19日,NBA常规赛继续进行,火箭客场挑战活塞,虽然当家球星姚明和麦蒂表现都不错,但由于火箭队其它队员发挥太差,最终92-104落败。

  首节比赛中麦蒂的表现很是面貌一新,在汉比组合为活塞取得5-0开局并一路领跑下,麦蒂内突外投个人包办火箭前三球,首节7投6中拿下15分的表现很是久违,活塞虽一度取得9分优势,但麦蒂通过首节结束前个人5-0攻势再将比分迫近,首节火箭23-24落后。不过在姚明助力拿下6分的情况下,火箭暴露了“姚麦外无人得分”的问题,除了穆托姆博的两次罚球,其他人均无斩获。

范甘迪令旗一挥,次节开场祭出了巴蒂尔带4位替补主打的招法,海德、帕吉特等人果不辱使命,一波11-0令同时替补主打的活塞一时手忙脚乱,火箭趁机抢得两位数优势。姚明在重新出场后成为了火箭稳健涨分点,单节13分中更有罚球9中7的“破坏力”表现,职业生涯86%的罚球准度绝非浪得虚名。不过火箭不会打优势球的问题在半场收官阶段再次体现,活塞在半场拿到17分的汉密尔顿引领下以一波14-4迫近,普林斯压哨球后追为50-52。

  在阿尔斯通与汉密尔顿的三分对飙引领下,第三节进入激烈拉锯局面,比卢普斯成为了活塞领军者,其半节时间内就收获10分,此节后段的3次助攻又数次带动活塞超出。而在麦蒂因犯规问题休整情况下,姚明责无旁贷成为火箭统帅,单节12分之外,姚明在助攻与篮板上也多有贡献,对施奈德、海德等人的助攻均很显神韵。三节过后火箭78-76领先。

  末节前段火箭继续领跑拉锯,海德三分送喜后,麦蒂抛投将比分战为83-81。但这也成为了火箭本场最后的领先,姚麦进攻点均受到制约,海德几番飙射也没有了准头,数次失误更令对手轻松快攻,活塞末节中段形成17-2攻势,比卢普斯在2分49秒命中三分后,活塞98-85确立胜势。在漫长得分荒中,姚明还两度遭到拉希德封盖。

  姚明此战18投8中、罚球20中17,取得了33分16个篮板4次助攻的亮点数据,但也出现了8次失误;麦蒂的24分中来自后三节的仅有9分。姚麦之外火箭最高分为海德的8分。汉密尔顿为活塞贡献30分8次助攻7个篮板,比卢普斯23分9次助攻,拉希德-华莱士15分11个篮板,普林斯15分。

posted @ 2006-11-19 12:59 arron99 阅读(608) | 评论 (0)编辑 收藏

我有些意外,但微微一笑答应了。缓步进入舞池,随意聊天。她神态悠闲,不过却掩饰不住孤独。一曲终了,我礼貌告别,返回原处,发现友人身旁已经有人落座,并且为她买了杯鸡尾酒。

  很奇怪这里的人们,以及氛围,问友人。她笑着说,这是美国达拉斯最有名的一夜情酒吧,挤满了寂寞的人们。他们害怕孤独,也不愿承担责任。来这儿的几乎全是生活优裕品位高雅的人士,色情俱乐部是他们不屑光顾的,因此只有在这里寻找短暂取暖的伙伴。

  我环顾四周,果然,大多数是衣着不凡的中年男女,也有不少白领青年,来这里结识陌生伴侣,消除白天工作的劳累。宽敞的厅内,精心设计的灯盏光线柔和,既不刺眼,也足够让你看清对方的神情面容。于是,在暧昧的灯光里,白天奔波忙碌的人们衣香鬓影,眼波流转,在这个地方寻觅逃脱寂寞的出口。

深夜,酒吧里依然人影幢幢热闹非凡。我们走出来,回头看去,玻璃窗内的酷河,谈笑风生的人们目光汹涌,却无声无息。

  在它的背后,是居民区璀璨温暖的灯火。

  营业时间:

  餐厅:周一至周五:11am-11pm;周六、日:4pm-11pm

  酒吧:周日至周三:11am-late;周四至周六:11am-2am

posted @ 2006-11-19 12:56 arron99 阅读(675) | 评论 (1)编辑 收藏

 在我眼里,和紧挨着的美国达拉斯不同,Irving是个美丽而安静的城市。所以,当我走进CoolRiver酒吧的时候,面对里面熙熙攘攘的人群,不免有些惊讶。

  中文译名应该叫“酷河”的这个Cafe,其实是个不小的餐馆。但是夜幕降临后,总是有很多衣冠楚楚的人来到这里,轻松小酌。它倚河而居,四周全是碧绿的草坪,周围的公路也悄然无声。透过宽大洁净的落地窗,可以看见里面昏黄的吊灯,墙壁上的油画,以及酒柜上闪闪发亮的瓶子。

  一走进酷河,就发觉里面的人们朝我们打量的目光和别处不一样,它们更加热烈更加灼灼,仿佛有无法隐藏的欲望和探究的冲动。友人去洗手间的时候,我独自坐于吧台,很快就有一个衣着得体的女子过来问:“是否能请我跳支舞?”她一头金发,妆化得很精致,打扮也很有气质,绝不是风尘女子。

posted @ 2006-11-19 12:55 arron99 阅读(690) | 评论 (0)编辑 收藏

 据技术部门的分析,黑客攻陷银联网站后,在网站首页植入了一段恶意脚本,并在服务器上放置了“黑洞2005”。如果用户的系统存在漏洞,浏览该网站后就会被“黑洞”程序侵入,其电脑被黑客控制。并且,该程序专门针对安装摄像头的用户编写,黑客可以很方便地获取用户的视频信息。

  据了解,从11月初开始,黑客通过侵入网站散播病毒的行为逐渐猖獗。不过,这次被黑客植入的“黑洞2005”版本较老,一些杀毒软件已能够查杀,用户上网时只要开启杀毒软件的全部监控,就能将其阻挡于电脑之外。同时,有关专家也建议用户,除了上述措施之外,还应该使用个人防火墙,这样就能比较好地阻挡病毒的侵入。

posted @ 2006-11-19 12:51 arron99 阅读(636) | 评论 (0)编辑 收藏

谈及黄健翔辞职事件,孙正平透露说:“中央电视台将在下周一召开部门会议,在会上宣布对这个事件的具体处理措施。在此之前,作为个人,我不方便代替部门来回答对黄健翔一事的看法。”针对“自己是否检举信作者”这个敏感问题,孙正平首次给出正面回应:“至于说到那封信是不是我写的,我想我根本没有必要写这样一封信,自己也不会去写这样的东西,因为他做了些什么,不写大家也看得见。你看他平时留下的博客、文章、外出的活动和自我介绍就知道那些事了。”同时,孙正平还表示:“黄健翔也应该看见那封信了吧?既然这样他就已经看见了落款的写法(注:落款为“体育频道编辑部”),这样的署名又怎么会是一个人执笔后的落款方式呢?其实,究竟是谁写的这封信并不重要,台里对很多事情都有着自己的规定,出现了问题就会警告,如果多次警告仍无改变就会有其他的处理方式。哪怕是部门不说什么,人事部门也会对一些行为有自己的处理措施,我想这也不仅是中央电视台才有的做法。”(许 文)
posted @ 2006-11-19 12:41 arron99 阅读(654) | 评论 (0)编辑 收藏

1.公司新配给我一个助理. 

今天,我,助理以及我们老总,去局里开会.会毕,领导要写个注意事项给我们.我和老总当时拿笔都不太方便. 

我随口问助理..你带笔了吗? 

他马上回答: 带了 

然后,几双眼睛看着他..接下来的十秒钟内..他睁着那双无辜的大眼,看着我们三个. 

于是,我打破这个尴尬的僵局..补充一句.. 

借我用用.. 

-..- 又是尴尬的十秒过去了..他才拿过自己的背包里找到一只笔,递给了我.然后我才递给领导.. 

回来,在车上..我们老总问他..为什么要让XX(我的名字)补充一句,你才把笔递给领导呢?就不能聪明点吗?? 

他很气愤的大声在车里说道: 我故意的,因为我觉的你们在利用我.. 

顿时...车里又是尴尬的十秒.... 



2.此人是考试进我们公司的..笔试成绩很高....尤其是英语.. 

=..= 但是..他每次跟老外沟通都基本上是用汉语喊话+肢体语言.. 

我甚郁啊... 

今天,会毕还要和领导合影.他接过相机,开始低头研究. 

我们老总和领导摆了好久的POSE..他还没有抬头.. 

我叫他快照... 

他说:"等会啊.这是我第一次摸数码相机,研究下" 

我现在有点拿他当偶像了 



3.傻猫:"你觉得冷吗" 
助理:"不冷" 
傻猫:"我觉得有点冷" 
然后双目对视20秒 
傻猫:"能把你的外衣给我批一下吗?" 
又是尴尬的20秒过去了,他才把衣服脱给傻猫. 

后来大家在一起说起这事,老总问他:你为什么要她补充一句,你才把衣服给她呢 
他很气愤的大声说到:我故意的,因为我觉得她想看我脱衣服... 



4.其实,我理解每个踏上社会的新人.. 

因为我也是这么过来的... 

而且,我能接受笨的人..坚决不接受蠢的人.. 

连我们客户看见他干活都说..他是属驴的..打一下走一步.... 

懒的要命... 

有份资料让他翻译..翻译好了以后递给我说.. 

哎..你去帮我打印出来.. 

我直接骂他脸上了...你的工资我也一起帮你领了吧... 

我还是觉的这个不能拿他是新人做借口.. 

完全是个人素质.... 



5.他跟我说... 

是老板的朋友的朋友的朋友..认识他父母.. 

他父母送礼给了老板的朋友的朋友的朋友... 

所以,才能来我们公司考试... 

谁知道考的还不错..管人事的那位大姐..就顺水人情了啊... 

=..= 今天老总找我谈话了.他一个劲问我,现在的大学有没有教过社交礼仪这门课... 

我都无语了... 



6.刚让他去送份资料给局里领导看... 

我让他打车去..然后坐公车回来.. 

结果人家老先生....坐公交去的..打车回来的... 

说什么送去的时候他不累..回来了。.他累了..就打了... 



7.我有教啊...比如这次去东盟吧.. 

总理马上就到我们这里来了..我准备给总理领路..我就把相机给他..让他多拍些领导人的照片..这以后也算我们公司的资本... 

老先生.....把我一通子拍啊... 



8.现在我只能是说..把工作给他讲明白.. 

就拿今天送资料这事来说...他回来找我报销..我一顿生气... 

他还不解..一个劲的问我...为什么生气.. 

我就说..打车去..是因为领导急着要..你要快去送...坐公车回来是因为公司没什么急事..你可以节约成本.. 

他马上大叫一声: 你TMD(他的口头禅,我都听习惯了)不早说明白啊. 



9.他帮我接了个电话..是个搞推销的... 

卖办公用品...我说这个事是出纳那边负责..你找那个大姐问问我们要不要吧.. 

我们出纳大姐说。.已经买过了..让他推了... 

结果....十分钟过去后..我看他还在那聊...我就过去问他..怎么还不挂 

他来了句...X姐,我们还是买他们的东西吧...挺好的....真的... 

我气死了...就说了句气话..说..你想买..去给老总打申请... 

MB......他真的去打了啊... 

老总把我叫过去一顿骂...说他怎么又管起公司买东西来了... 



10. 他口语不灵...不管人家客户说什么..他都YES...很多事..客户就以为他明白了...结果我就问他什么事...他就说..他也没搞懂... 

我说,那你为什么不问清楚,或者说,直接告诉客户你听不懂..让他们换个简单直接的说法给你... 

他冲我大吼一嗓子 

这么丢脸的事...我可干不出来... 
posted @ 2006-11-19 11:35 arron99 阅读(699) | 评论 (0)编辑 收藏

有时候抽象的事物也可以让我们感知,有时候实体的事物也能转眼化为无形,岁月当是明证,我们活的时候 真正感觉到自己是存在的,岁月的脚步一走过,转眼便如云烟无形。但是,这些消逝于无形的往事,却可 以拿来下酒,酒后便会浮现出来。 

    把初恋的温馨用一个精致的琉璃盒子盛装,等到青春过尽垂垂老矣的时候,掀开合盖,扑面一股热流,足以使我们老怀堪慰。 

    这其中还有许多意想不到的情趣,譬如将月光装在酒壶里,用文火一起温来喝……此中有真意,乃是酒仙的境界。 

    有一次与朋友住在狮头山,每天黄昏时候在刻着“即心是佛”的大石头下开怀痛饮,常喝到月色满布才回到和尚庙睡觉,过着神仙一样的生活。最后一天我们都喝得有点醉了,携着酒壶下山,走到山下时顿觉胸中都是山香云气,酒气不知道跑到何方,才知道喝酒原有这样的境界。 

    喝酒是有哲学的,准备许多下酒菜,喝得杯盘狼籍是下乘的喝法;几粒花生米一盘豆腐干,和三五好友天南地北是中乘的喝法;一个人独斟自酌,举杯邀明月,对影成三人,是上乘的喝法。 

    关于上乘的喝法,春天的时候可以面对满园怒放的杜鹃细饮五加皮;夏天的时候,在满树狂花中痛饮啤酒;秋日薄暮,用菊花煮竹叶青,人与海棠俱醉;冬寒时节则面对篱笆间的忍冬花,用腊梅温一壶大曲。这种种,就到了无物不可下酒的境界。 

    当然,诗词也可以下酒。 

    俞文豹在《历代诗余引吹剑录》谈到一个故事,提到苏东坡有一次在玉堂日,有一幕士善歌,东坡因问曰: “我词何如柳七(即柳永)?”幕士对曰:“柳郎中词,只合十七八女郎,执红牙板,歌‘杨柳岸,晓风残月’。学士词,须关西大汉、铜琵琶、铁棹板,唱‘大江东去’。”东坡为之绝倒。 

    这个故事也能引用到饮酒上来,喝淡酒的时候,宜读李清照;喝甜酒时,宜读柳永;喝烈酒则大歌东坡词。其他如辛弃疾,应饮高梁小口;读放翁,应大口喝大曲;读李后主,要用马祖老酒煮姜汁到出怨苦味时最好;至于陶渊明、李太白则浓淡皆宜,狂饮细品皆可。 

    喝纯酒自然有真味,但酒中别掺物事也自有情趣。范成大在《骏鸾录》里提到:“番禺人作心字香,用素茉莉未开者,着净器,薄劈沉香,层层相间封,日一易,不待花蔫,花过香成。”我想,应做茉莉心香的法门也是掺酒的法门,有时不必直掺,斯能有纯酒的真味,也有纯酒所无的余香。我有一位朋友善做葡萄酒,酿酒时以秋天桂花围塞,酒成之际,桂香袅袅,直似天品。 

    我们读唐宋诗词,乃知饮酒不是容易的事,遥想李白当年斗酒诗百篇,气势如奔雷,作诗则如长鲸吸百川,可以知道这年头饮酒的人实在没有气魄。现代人饮酒讲格调,不讲诗酒。袁枚在《随园诗话》里提过杨诚斋的话:“从来天分低拙之人,好谈格调,而不解风趣,何也?格调是空架子,有腔口易描,风趣专写性灵,非天才不辩。”在秦楼酒馆饮酒作乐,这是格调,能把去年的月光温到今年才下酒,这是风趣,也是性灵,其中是有几分天分的。 
posted @ 2006-11-19 11:32 arron99 阅读(666) | 评论 (0)编辑 收藏



按此在新窗口浏览图片screen.width-500)this.width=screen.width-500;" border=0>
posted @ 2006-11-19 11:26 arron99 阅读(623) | 评论 (0)编辑 收藏

刚才在电玩巴士上看到,PS3叫卖到8000元,黑,真是太黑了。美国才卖599美元。加拿大是660加币。我在加拿大留学。一般加拿大的留学生。一个月送餐都能挣到1000多加币。当地人的最低工资更是税后7.5加币/小时。最低,一个月都有2000多加币。660加币,对于本地人,贵吗?e而且老外都不买盗版,一个正版游戏,一般都是50-80加币之间。我同学玩XBOX,没有盗版,只能买正版,一年光游戏就花了1000多加币。看报道,PS3现在每台是亏损,甚至是每台亏损200美金。主机一般都是亏损,都靠游戏挣钱。PS3得硬件配置本身就相当高。不说别的地方,我就说加拿大,7,8个人吃顿中国街边类似的饭店,就要花将近200加币。而中国,也就100多点人民币。一个松下的电饭煲,都要100多加币。所以,在大家看来贵,是因为中国的消费水平低,而国外的消费水平高,日本的学生,打一个月工,就能买个LV的新款包,在中国,打一年也买不了啊。所以国内玩家,因为价格都不看好索尼,但在国外,跟XBOX的差价,在玩家眼中几乎不是考虑的因素。
posted @ 2006-11-19 11:25 arron99 阅读(616) | 评论 (1)编辑 收藏

上周去石牌西卖完好内存条(kingston DDR333 256M)被一群打扮成乡下人妇女的骗子调包了,真的很不爽。(那群人的口音应该湖南的)当时的情景是一群人围了过来,很多人接着看我的内存条,问我价格,我说没有120我不卖。其中有个人抓着我的内存条不放手,我感觉不对劲,(因为不看又要抓那么紧)我想拿回来,但是抢都抢不回来,感觉就是内存条是她的一样,看了N恶心。那时真想一拳打过去,没有想到我忍了这一关后,接下来又来了一个乡下妇女(应该是在准备调包)。那人接过手中的内存条看了看,也问我多少钱,我照实告诉了她。然后说太贵了,把内存条给了我旁边的同事。直到我接到内存条到那女人问价格,我现在还是一直没有记忆。我同事告诉我,有个人把我的视线挡住了,当是我接到内存条时的手感不对,但是我太相信自己了,就走了,不到100米,我发现内存条不是我的。我跑到被骗的地点,发现人去场空了。问了下其他人,我手中的内存值几毛钱,才2块。靠,120块的内存就变成了2块,连坐地铁都不够。火上心头,就把内存条折了四半,狠狠的摔在地上,骂道,靠,骗子,总有一天会受惩罚的。后来自己走的时候才发现自己的手在折内存条时,被内存条划伤了,一直流血。真是陪了夫人又折兵。所以建议大家卖二手配件时,小心点,自己手能抓的尽量抓住。别让一群人围过来,那一定是骗子。那些乡下人怎么会懂电脑。
posted @ 2006-11-19 11:24 arron99 阅读(798) | 评论 (1)编辑 收藏

iPhone 机不惊人死不休


按此在新窗口浏览图片screen.width-500)this.width=screen.width-500;" border=0>
乔布斯的iPhone计划迟迟不肯露面,让那些老外们是翘首等待,但中国的兄弟们却好像从来不需饱受此等相思苦,如果说先前的DM751只是打擦边球,那么市面上的2款手机肯定是让iPod迷们真假难辨,均支持MP3/MP4,Cosun是200万像素,CECT的均是300万像素摄像头,功能是让许多老美汗颜,这不就是iPod么?
PS:读者评论:人有多大胆,地有多大产。
 

按此在新窗口浏览图片screen.width-500)this.width=screen.width-500;" border=0>
posted @ 2006-11-19 11:23 arron99 阅读(615) | 评论 (1)编辑 收藏

点长的心理测验,请先拿笔记下你选的abc各有几个,再算出分数。此测验可以测出你的大脑较偏阳性,还是阴性,结果可了解你的大脑是否存有男性荷尔蒙。 
  
     1.你在看地图,或街上指示时,你会: 
     a.会有困难,而找人协助 
     b.把地图转过来,面对你要走的方向 
     c.没有任何困难 
  
     2.你在准备一道做法复杂的菜时,一边正在播放收音机, 还有朋友的来电.你会: 
     a.三件事同时进行 
     b.关掉收音机,但嘴巴和手都没有停 
     c.告诉朋友,你做好菜后马上回电话给他 
  
     3.朋友要来参观你的新家,问你该怎么走,你会: 
     a.画一张标示清楚的地图寄给他们,或是请别人替你说明该如何走 
     b.问她们有没有熟悉的地标,然后告诉他们该怎么走 
     c.口头上告诉他们该怎么走 
  
     4.解释一个想法或概念时,你很可能会怎么做: 
     a.会利用铅笔、纸和肢体语言 
     b.口头解释加上肢体语言 
     c.口头上清楚简单的解释 
  
     5.看完一场很棒的电影回家后,你喜欢: 
     a.在脑海里回想电影的画面 
     b.把画面及角色的台词说出来 
     c.主要引述电影里的对话 
  
     6.在电影院里你最喜欢坐在: 
     a.电影院的右边 
     b.不在意坐在哪里 
     c.电影院的左边 
  
     7.一个朋友的机器出了问题,你会: 
     a.深表同情,并和他们讨论他们的感觉 
     b.介绍一个值得信任的人去修理 
     c.弄清楚它的构造,想帮他们修理好 
  
     8.在不熟悉的地方,有人问你北方是哪个方向,你会: 
     a.坦白说你不知道 
     b.思考一会儿后,推测大约的方向 
     c.毫无困难的指出北方方向 
  
     9.你找到一个停车位,可是空间很小,必须用倒车才能停进去,你会: 
     a.宁愿找另一个车位 
     b.试图小心的停进去 
     c.很顺利的倒出车停进去 
  
     10.你在看电视时,这时电话响了,你会: 
     a.接电话,电视开着 
     b.把音量转小后才接电话 
     c.关掉电视,叫其他人安静后才接电话 
  
     11.你听到一首新歌,是你喜欢的歌手唱的,通常你会: 
     a.听完后,你可以毫无困难的跟着唱 
     b.如果是首很简单的歌,听过后你可以跟着哼唱一小段 
     c.很难记得歌曲的旋律,但是你可以回想起部分歌词 
  
     12.你对事情的结局如何会有强烈的预感,是借着: 
     a.直觉 
     b.可靠的资讯和大胆的假设,才做出判断 
     c.事实统计数字和资料 
  
     13.你忘了把钥匙时放在哪里,你会: 
     a.先做别的事,等到自然想起为止 
     b.做别的事,但同时试着回想你把钥匙放在哪里 
     c.在心理回想刚刚做了哪些事,藉此想起放在何处 
  
     14.你在饭店里,听到远处传来警报,你会: 
     a.指出声音来源 
     b.如果你够专心,可以指出声音来源 
     c.没办法知道声音来源 
  
     15.你参加一个社交宴会时,有人向你介绍七八位新朋友,隔天你会: 
     a.可以轻易想起他们的长相 
     b.只能记得其中几个的长相 
     c.比较可能记住他们的名字 
  
     16.你想去乡间度假时,但是你的伴侣想去海边的渡假胜地.你要怎么说服他呢? 
     a.和颜悦色的说你的感觉:你喜欢乡间的悠闲,小孩和家人在乡间过得很快乐。 
     b.告诉他如果能去乡间渡假,你会感到很愉快,下次你会很乐意去海边 
     c.说出事实:乡间渡假区比较近,比较便宜,有规划适当的休闲设施 
  
     17.规划日常生活时,通常你会: 
     a.列张清单,这样一来该做什么事一目了然 
     b.考虑你该做哪些事 
     c.在心里想你会见到哪些人,会到哪些地方,以及你得处理哪些事 
  
     18.一个朋友有了困难,他来找你商量,你会: 
     a.表示同情,还有你能理解他的困难 
     b.说事情并不如他想的严重,并加以解? 
     c.给他建议,或是合理的忠告,告诉他该如何解决 
  
     19.两个已婚的朋友有了外遇,你会如何发现: 
     a.你会很早就察觉 
     b.经过一段时间后才察觉 
     c.根本不会察觉 
  
     20.你的生活态度为何? 
     a.交很多朋友,和周围的人和谐相处 
     b.友善的对待他人,但保持个人隐私 
     c.完成某个伟大目标,赢得别人的尊敬,名望及获得晋升 
  
     21.如果有选择,你会喜欢什么样的工作: 
     a.和可以相处的人一起工作 
     b.有其他同事,但也保有自己的空间 
     c.独自工作 
  
     22.你喜欢读的书是: 
     a.小说,其他文学作品 
     b.报章杂志 
     c.非文学类,传记 
  
     23.购物时你倾向: 
     a.常常是一时冲动,尤其是特殊物品 
     b.有个粗略的计画,可是心血来潮时也会买 
     c.读标签,比较价钱 
  
     24.睡觉起床吃饭,你比较喜欢怎么做: 
     a.随心所欲 
     b.依据一定的计画,但弹性很大 
     c.每天几乎有固定的时间 
  
     25.你开始一个新的工作,认识许多新同事.其中一个打电话到家里找你, 你会 : 
     a.轻易的认出他的声音 
     b.谈了一会儿话后,才知道他是谁 
     c.无法从声音辨认他到底是谁 
  
26.和别人有争论时,什么事会令你很生气: 
     a.沉默或是没有反应 
     b.他们不了解你的观点 
     c.追根究底的问问题,或是提出质疑,或是评论 
  
     27.你对学校的拼字测验以及作文课有何感觉? 
     a.觉得两项都很简单 
     b.其中一项还可以,另一项就不是很好 
     c.两项都不好 
  
     28.碰到固定的舞步或是爵士舞时,你会: 
     a.听到音乐就会想起学过的舞步 
     b.只能跳一点点,大多想不起来 
     c.抓不准时间和旋律 
  
     29.你擅长分辨动物的声音,并模仿动物的声音吗? 
     a.不太擅长 
     b.还可以 
     c.很棒 
  
     30.一天结束后,你喜欢: 
     a.和朋友或家人谈谈你这一天过得如何 
     b.听别人谈他这一天过得如何 
     c.看报纸电视,不会聊天 
  
标题: 解答分析 
    
计分方法: 
    选择a: +15分 
    选择b: + 5分 
    选择c: - 5分 
    结果分析: 
    1.多数男性的分数会分布在 0-180 分之间 
    多数女性的分数会分布在 150-300 分之间 
    2.偏男性化的大脑,分数会低于150分.分数越接近0分就越男性化,睾丸素的分泌也越多 .......他们有很强的逻辑观念、分析能力、说话技巧,很自律,也很有组织,不容易受到情绪的影响.要是女性得到很低的分数,那她很可能有女同性恋的倾向. 
    3.分数高过180分的,就是很女性化的人.分数越高,大脑就越女性化.富有创意,有音乐艺术方面的天份.他们会凭直觉与感觉做决定,并擅长从很少的资讯判断问题.分数高过180分的男人,他们是同性恋的机率也越高. 
    4.分数低于0分的男性或高于300分的女性,他们大脑的构造是完全不同的,同在地球上生活是他们唯一的共同点. 
    5.分数在150分到180分之间的人,他的思考方式拥有两性的特质..他对男女都没有偏见,并在解决问题方面,反应会比较灵活,找出最佳的解决方法.不管男性或女性,他都可以成为他们的好友.......
posted @ 2006-11-19 11:21 arron99 阅读(639) | 评论 (1)编辑 收藏

在IE的地址栏里输入下面的字符,然后回车你就会看到IE隐藏的一个大秘密

javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.images; DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5}R++}setInterval('A()',5); void(0);
posted @ 2006-11-19 11:21 arron99 阅读(667) | 评论 (0)编辑 收藏

利用修电脑这一机会来泡MM的土匪,一般平时都是花了较多时间陪着自己的电脑和网友,没有太多时间和固定场所(例如大学自修室、英语角或者公共社交场所)接触真实MM的人。很多这方面的高手也都是成功地在修好电脑的同时弥补了自己姻缘的缺憾,顺利找到另一半!但是并不是所有的相遇都是美满的结局,这除了土匪个人的RPWT,主要还在于他们在修理电脑的时候没有注意MM们的RPWT。给出一些个人建议:

1、如果MM只会站在一边看着你修,连杯水都不给你倒,除非她年纪太小太不懂事,不然这样的MM基本不懂关心照顾别人,也不懂尊重别人的劳动和付出。这样的MM若不是超级大美女,还是算了!

2、如果MM会一直问这问那,特别是如果主要问你为什么要这样修的原因,这种MM不够重视分工,喜欢主导一切,不能够尊重权威和相信理性,娶回家只会让你多一个唠唠叨叨的监工。如果你不喜欢被人呼来唤去,没有自疟倾向,这种MM还是算了!

3、如果MM一直问你要不要喝水,要不要歇一会儿,还问一些和修电脑无关的情况,例如问你这么好的技术都怎么学来的啊,如果殷勤到一反常态的地步,恭喜你!这个MM想泡你!!!如果这个MM一贯对人热情,那么这种MM属于擅长公关,有很强的管理和组织能力,这种MM也会成为未来家中的主管,但是好在是一种以人为本的管理,你不至于太痛苦这样的MM,只要平时不是那种过分往上爬巴结领导的类型,实际上还算不错的选择

4、如果MM话并不多,默默地给你倒杯水,然后再一旁看着,不时跑过来帮你递东西,这种是贤妻良母型,是那种甘愿在背后默默支持你的类型,你要是事业主导型的土匪,毫不犹豫泡这个MM吧!!!极品赞不绝口。(就是恐龙也不妨考虑一下)

5、如果MM给你东西吃,证明对你不见外;从来没见过的MM话,证明对你很有好感!小子,你赚了!

6、MM站着看你修电脑,有座位不坐,离得近的是关心电脑!离得远的还站着,如果不是眼睛超好的那种,这种MM有同甘共苦的意识,一般富有同情心,比较爱国(自己到时候对照一下)

7、MM坐着看你修电脑,正常;MM坐着但是不看你,眼光会游移到别的地方或者做自己的小动作,死了心吧!她已经有意中人了!

8、MM躺着看你修电脑(还真的有!)遇到的都是和我太熟悉的才这样!第一次就这样没遇到过,真有的话,就是RPWT!!!

9、MM在你修电脑的时候去洗澡了(遇到一次!)这个MM如果不是三天没洗澡,那就是把你当成家人看待了,我觉得关系很熟这样的话就不算什么;如果第一次就这样,建议逃走或者躺下!!!

10、MM修电脑的时候把父母介绍给你(到她家修电脑)或者给你看她存在电脑上家人的照片,她很希望成为你重要的朋友。

11、MM修电脑的时候把MM介绍给你,电脑其实没问题,这个MM觉得你人不错,肥水不流外人田,便宜自己的姐妹先;或者她姐妹最近刚失恋,需要找个凯子过渡一下。
posted @ 2006-11-19 11:19 arron99 阅读(652) | 评论 (1)编辑 收藏

笔记本维修培训,就象是弄着玩  

    真正的笔记本主板维修技术员是需要很长时间培训起来的,而且需要芯片电路技术和故障维修经验。技术是每个人都可以学到的,但是经验是学不到的,技术员在工厂培养自己的维修经验,会人为的到报废很多很多片主板,这些主板都是千把块钱一片,有经验的维修的好,没经验的新员工不知道哪里坏了,最后终究会维修到报废的,我在工厂里学到今天掌握的技术和经验,至少让工厂赔了百多万,也就是一两千片板板。 

    看到外面的笔记本维修培训,就象是弄着玩,以为说培训起来就培训起来了,不过是骗学员的几百块钱而已,说实话,象我,在工厂里带徒弟,真本事是不传的,定多给它指点些皮毛而已,真的,毕竟是自己一步步摸索出来的技术和经验,一下子全给别人说了,自己也就没什么混的了,三四千请我教技术维修的真本事,我还不一定答应的,挺为外面的拿些花钱去培训的人悲哀,其实什么都学习不到的! 

    本子越做越薄,越来越轻,怕怕  

    现在本子是越做越薄,越来越轻,怕怕,肯定要把主板做的小,做的薄!主板小了,但是上面的芯片和板内布线是不会少的,哪样就导致板内显露极端的密集,上面的芯片紧凑,依据我维修主板见到的各种主板故障现象,薄的主板故障多,而且多半故障都会出现为主板容易变形,导致内部线路不良,我就一句话,主板有一点点变形,你的本本就会极端的性能不稳定,会出现什么故障很难说的。而且是修不好的。 

  主板小,上面的芯片密集度增高,有些小芯片本身是会散发很高的热量的,就会影响到其周围的场效应管的稳定性,而场效应管在主板上是很多的,一般用来控制产生或转化某些工作电压,所以会导致你的主板短路的。主板短路了,问题就大了,你会不知道它会不停的加电不停的开机,很容易烧CPU和其它东西的。所以笔记本的主板并不是越小越好,哪样会增加主板的散热不良,增高主板的短路几率和其它故障,不稳定的因素很高很高的。所以主板小的本本一般用的CPU频率很低的。降低其散热量。当然,这只是片面性的言词。 

    主板“改进”偷工减料  

    现在的本本都在抢低价市场,都在压低价钱来卖,竞争啊,低价本本有什么不好呢?一来是,价钱低了,赚的利润少了,所以公司会给工厂下订单时,给的价钱很低很低,我工厂生产笔记本主板,一块成本一千多块钱,但是只挣大客户一块钱。说出去谁都不会相信的。客户给的价钱低,没关系,工厂为了拉拢客户照样接单,但是生产的时候为了不赔钱,会对主板进行一些改进,也就是所谓的偷工减料,太难听了。例如,一条内存电压线路,本来应该用30个电容,但是只用12个电容一样可以使用,那样就会少用18个电容,本本上电压线路又很多,所以省下不少的物料,或者本来应该用质量好的物料,用个价钱便宜的来代替,工厂大批量生产,会省下笔很可观的钱的,那样成本价钱就会降低很多的,但是主板省了很多的物料,就会不稳定的,倒霉的是买本本的了 . 

    扩展内存条主板稳定性更高  

    一般来说,本本上是不会告诉买家用的是板载内存还是扩展内存,如果用的是两个内存槽,那样的板会好写,因为加的是扩展内存,稳定型高,不容易出错,坏了 可以换个内存条就好,但是如果是内存芯片直接焊接在主板上,哪样的板内存线路很不稳定,很容易出现蓝屏档机花屏黑屏等等各种不稳定的现象都会出现,烂的不能再烂,一般来说这样的板都是会报废的,因为内存的线路在板上出现了不良,行业术语各位看不懂的,也就不说了,各位一定要买之前最好了解一下本子的内寸是插在扩展槽上的还是直接焊接在主板上的,两个扩展槽的板稳定性比内寸直接焊接在板上的板要高十倍左右,至少我维修的板,两个内存槽的用的是外接的内存条,线路不容易坏,而我维修的板载内存的板,大批量的报废,很难维修的。都是内部线路问题。建议大家买那些用的是扩展内存条的板,稳定性很高很高! 

    集成显卡稳定性高好几倍  

    有显卡的板,真是烂。如果主板上是焊接的独立显卡,如果不花屏看起来显示效果是比集成显卡的好,但是如果出现了花屏黑屏,主板直接报废吧,建议大家买新板。很难维修的,很难判断出是显卡还是显存损坏。而且显卡线路有问题了是查不出来的,在工厂里是不会给工程师哪个时间取查每条线路,不现实,外面维修的也不可能查出来,没那个维修条件。而且换显卡显存并不见的能换好,可能给你换成其它故障了,所以如果有钱,就买带独立显卡的,坏了就坏了,没钱的,建议还是买集成显卡的,主板稳定性高好几倍,就算出现花屏黑屏,定多是内存坏了或者直接换北桥就好,维修简单,极大的减少了主板的不稳定性和故障率。

    台机和本本的区别在於你的用途

    如果是为了便利移动方便,而且需要常常携带移动,不是玩那种特大型的游戏的话,那就买本本喽,我感觉本本用起来性能并不比台机差,噪音很小。我的本本是方正h240d的,买的时候7300,不过一直在玩传奇游戏,当做台机来用的,有点糟蹋了!如果你买台机的话,建议买个液晶的显示器,毕竟现在液晶的显示器也便宜的很多了,质量还算不错的,搬运的时候左手显示器,右手机箱,提起就走了,也算方便的。不过台机最好不要买品牌机,太贵了,不划算,而且买台机主板的时候要考虑到主板的稳定性能,主板还是最重要的,不过我感觉很多人自己配制的台机没有配制好,虽然说都可以用,但是各个硬件之间好像兼容的并不好,影响了机器的整体性能,另外cpu不要去超频!能超也不要超! 

  如果你钱充足,考虑还是买个7000到8500之间的本本,这样的本本主板在生产中应该不会省料的。质量还行。如果运行超大型游戏(例如3d类型)或较达的运用软件,建议买台机,玩玩传奇游戏之类的看网页和word/photoshop之类的软件,买本本吧! 

   本本最重要的是携带移动   

   本本在携带移动中,不可避免的会出现轻微的晃动震动,感觉这样并不会对本本有影响,确实如此 ? 不过据我维修的板板来看,感觉经常携带本本移动还是不好的,让本本有很大的故障隐患,该故障为冷焊,也就是说主板上的芯片是用焊锡焊接在主板上,但是在南北桥cpu槽等bga里是有几百个的焊接点的,本本移动时的轻微震动会影响这些焊接点。我们对本本做切片分析,用400倍的显微镜看南桥和主板焊接的一个锡球,该锡球上部和南桥连着,下面和主板连着,和南桥连着的部分出现局部轻微的断层,用手一压南桥,该点受力接触好,主板ok,松手则主板fail,具体现象说不清楚,因此告诫大家,本本能不移动最好不去移动,不要夸张的天天带着本本上下班,经常移动会使bga力的上千个锡球不稳定出现冷焊现象。任何一个点都会造成本本故障。天天带本本移动个吧里路,不出三五月,本本肯定出故障!本本稳定型是最重要的。 

    讲讲温度对本本的影响  

    工厂里本本的一个测试项目就是温差。主板和芯片的焊接是用焊锡,焊锡再剧烈的温度差下会热帐冷缩而整体断咧或局部断咧!在自己感觉很冷的天,用本本玩大型游戏,本本发热量很高,会发现本本外表局部很热,但是关机后因天很冷,主板在短时间内由热变冷。影响焊锡的焊接稳定性。或者在冷天里开机玩游戏,没有给本本预热,主板在热帐冷缩过程, 在比较明显的温度差下会出现变形,影响外表的芯片焊接点的稳定性和板层内部的极细极细的线路,本本散热很好,所以本本内部的主板上会是冰凉冰凉的,因为里面由锡纸和铜箔散热片,同样的温度,手在空气里稍微冷,但是接触到铁片就会感觉冰凉的,就是这个道理。本本外壳是温度40度,则内部主板上的温度不讳低于65度,如果带独立显卡的话,跑3D10分钟,我不敢用手直接触摸显卡芯片,会烫伤手,玩游戏一小时后显卡周围的温度绝对不讳低于80度,在散热条件很好的情况下!
posted @ 2006-11-19 11:18 arron99 阅读(627) | 评论 (0)编辑 收藏