??xml version="1.0" encoding="utf-8" standalone="yes"?>成人精品天堂一区二区三区,三级国产在线观看,在这里有精品http://www.aygfsteel.com/treenode/在\上?/description>zh-cnSat, 17 May 2025 21:46:56 GMTSat, 17 May 2025 21:46:56 GMT60武侠隐喻反?/title><link>http://www.aygfsteel.com/treenode/archive/2006/12/01/84856.html</link><dc:creator>TreeNode</dc:creator><author>TreeNode</author><pubDate>Fri, 01 Dec 2006 07:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/treenode/archive/2006/12/01/84856.html</guid><wfw:comment>http://www.aygfsteel.com/treenode/comments/84856.html</wfw:comment><comments>http://www.aygfsteel.com/treenode/archive/2006/12/01/84856.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.aygfsteel.com/treenode/comments/commentRss/84856.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/treenode/services/trackbacks/84856.html</trackback:ping><description><![CDATA[ <p> <br />软g业L充满了Ş形色色的隐喻。比如说Q把E序中的问题UCؓbugQ把互联|上传播的病毒叫做蠕虫;<br />把Y件开发的q程比作造房?.....q些都是我们q个行业中流行的隐喻Q以至于它们已经成ؓ软g开<br />发者文化中一个特有的l成部分?/p> <p>在这里,我想要说的是一个特别具有“中国特艜y的隐喻Q我UC为武侠隐喅R?/p> <p>毋庸我多做解释,可能很多E序员看到这个词p以勾起丰富的惌。我们中的很多h喜欢把自己所崇敬<br />和佩服的、Y件界有媄响力的hUC为大侠,q惌己有朝一日能够达C们的境界。(跑题一下,<br />q个U谓现在g有了一个比较草根的、或者说比较Web2.0的版本——叫做牛人)上个世纪那个个h<br />英雄M的年代,曄涌现Z大批q样的h物,现在很多Z然习惯称他们为“大侠”——这?br />中包括求伯君、王志东、鲍x、朱崇君...</p> <p>除此之外Q我们还喜欢重量的出版物UC为武林秘c?把Y件开发的l织团体比作江湖帮派Q?br />要Ş容Y件开发的理想境界Q也怼搬出“飞花摘叶俱可伤人”或“无剑胜有剑”这L句子。所有这?br />都或多或的表明Q武侠深深媄响了大量的程序员Q他们非常喜Ƣ用武侠中的理念来比喻Y件开发过E中<br />的现象。或许,也是因ؓE序??的生zdq枯燥,需要文化来加一点味道,而他们自觉不自觉?br />选择了武侠。这是所谓的中国特色吧?/p> <p>我必老实的承认:我自己就曄深受武侠的媄响,q去也一直没有感到有什么不妥。但是,<br />在前几天看过|上的某些回帖中一些充满武侠隐d道的文字Q突然觉得有些不是滋呟?br />我开始思考:对于软g开发来_武侠是不是一个好的隐喻?l论Q不是不好,而是非常?br />p。武侠和软g开发根本没有什么共同点Q甚臛_以说是水火不容的?/p> <p>Z么说武侠和Y件开发没有共同点Q武侠讲的是破坏的艺术。太史公说“侠以武犯禁”?br />武侠的意义,在最好的情况下,也仅仅是杀富济贫、除暴安良,是对旧有U序的破坏?br />问题在于Q破坏是痛快惬意的,但破而不立就是纯_的破坏Q没有Q何积极意义?br />破坏以后新的U序如何建立呢?没有哪一个武侠故事ؓ此做出答案,<br />也没有一个侠客操心这U事。他们在乎的是“十步杀一人,千里不留形”的高手形象Q?br />至于C以后烂摊子谁来收拾?那本大侠可就不着了?/p> <p>软g开发是Q而不?br />破坏。即使旧的系l非常糟p,我们也没有理由将其付之一炬——这是Z么现代的敏捷<br />开发者非常强调重构的原因。构造新的代码固然是极具创造快感的工作Q但是Y件开发过<br />E中q有成打的“肮脏”工作:需求分析,设计Q文档,调试Q维?.....q些工作J冗<br />而琐,但却是整个开发过E中必不可少的组成部分。想潇洒一下就拍拍屁股Ch?br />E序员没有什么职业素质可a?/p> <p>武侠中的高手是什么Ş象?天马行空Q独往独来Q神出鬼没。这L人看h很有性格Q?br />但在C企业中恰恰是最忌讳的。而正正经l提倡Team Work的团队反倒在武侠中常常成?br />讥刺的对象——你不妨看看林或全真这L大型团队在金庸小说中被丑化成了什么地步?/p> <p>武侠所描绘的是农业C会的典型情c一位高手通常只会把自q技Z授给至亲和少数几?br />信得q的弟子Q弟子亦然。这U结构非常脆弱:一旦出CQ何问题,q门技艺很Ҏ失传了?/p> <p>武侠中的U籍是这样一U东西:你得到它以后Q最好藏之名山,偷偷修炼。一旦泄漏,只会l你<br />带来杀w之。和师徒授受的问题相同,q样只会让最好的技艺在历史长河中渐渐灭。现代社会和开?br />源代码运动则昄了相反的情况Q知识可以由M取与学习Q而不分门z贵贱。与别h分n<br />知识也不会给你带来Q何坏处?/p> <p>武侠成ؓ隐喻带来的恶果就是,E序员以成ؓ“高手”ؓ荣,以炫耀技巧ؓ乐;无视风险<br />大量采用一些看上去比较炫的新技术;愤世嫉俗以ؓ天下只有自己怀才未遇;不会与h<br />沟通,|顾客户需求,把不懂技术的用户当白_不会开诚布公,L自己偷偷留一手;<br />凡此U种Q不能说都是因ؓ武侠毒。但是在E序员中造成了不好的风气Q武侠的影响<br />是不可忽视的?/p> <p>武侠是成qh的童话,但Y件开发不是童话。Y件开发要的是脚踏实地Q而不是快意恩仇?br />q在做侠客梦的程序员Q愿你们早点醒来?/p> <p> </p> <img src ="http://www.aygfsteel.com/treenode/aggbug/84856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/treenode/" target="_blank">TreeNode</a> 2006-12-01 15:33 <a href="http://www.aygfsteel.com/treenode/archive/2006/12/01/84856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在SWT中实现自lCombohttp://www.aygfsteel.com/treenode/archive/2006/07/06/56900.htmlTreeNodeTreeNodeThu, 06 Jul 2006 02:08:00 GMThttp://www.aygfsteel.com/treenode/archive/2006/07/06/56900.htmlhttp://www.aygfsteel.com/treenode/comments/56900.htmlhttp://www.aygfsteel.com/treenode/archive/2006/07/06/56900.html#Feedback4http://www.aygfsteel.com/treenode/comments/commentRss/56900.htmlhttp://www.aygfsteel.com/treenode/services/trackbacks/56900.html
上一ơ,我实C一个自l的按钮。现在,看到有h询问是否可以在Combo的列表中加入囑փ。其实这相当ҎQ只要重载Combo Widgetq把自绘接口暴露出来卛_。以下是单的代码CZQ?br />
package org.eclipse.swt.widgets;

import java.io.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.win32.*;

public class CustomCombo extends Combo
{
    
public CustomCombo( Composite parent, int style )
    {
        
super( parent, style );

        
try
        {
            InputStream is 
= getClass().getResourceAsStream( "bullet.gif" );
            image 
= new Image( getDisplay(), is );
            is.close();
        }
        
catch ( IOException e )
        {
            e.printStackTrace();
        }
        
final int CB_SETITEMHEIGHT = 0x0153;

        OS.SendMessage( handle, CB_SETITEMHEIGHT, 
024 );
        OS.SendMessage( handle, CB_SETITEMHEIGHT, 
-124 );
    }

    @Override
    
int widgetStyle()
    {
        
final int CBS_OWNERDRAWFIXED = 0x0010;
        
final int CBS_HASSTRINGS = 0x0200;
        
// final int CBS_OWNERDRAWVARIABLE = 0x0020;
        return super.widgetStyle() | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS;
    }

    @Override
    
protected void checkSubclass()
    {
    }

    @Override
    
public void dispose()
    {
        image.dispose();
        
super.dispose();
    }

    
/* @Override
    LRESULT wmMeasureChild( int wParam, int lParam )
    {
        MEASUREITEMSTRUCT mis = new MEASUREITEMSTRUCT();
        OS.MoveMemory( mis, lParam, MEASUREITEMSTRUCT.sizeof );
        mis.itemHeight = 40;
        OS.MoveMemory( lParam, mis, MEASUREITEMSTRUCT.sizeof );
        return null; // super.wmMeasureChild( wParam, lParam );
    } 
*/

    @Override
    LRESULT wmDrawChild( 
int wParam, int lParam )
    {
        DRAWITEMSTRUCT dis 
= new DRAWITEMSTRUCT();
        OS.MoveMemory( dis, lParam, DRAWITEMSTRUCT.sizeof );

        GC gc 
= new GC( new DCWrapper( dis.hDC ) );
        Rectangle rc 
= new Rectangle( dis.left, dis.top, dis.right - dis.left,
                dis.bottom 
- dis.top );
        Display display 
= getDisplay();
        
if ( (dis.itemState & OS.ODS_SELECTED) != 0 )
        {
            gc
                    .setBackground( display
                            .getSystemColor( SWT.COLOR_LIST_SELECTION ) );
            gc.setForeground( display
                    .getSystemColor( SWT.COLOR_LIST_SELECTION_TEXT ) );
            gc.fillRectangle( rc );
        }
        
else
        {
            gc.setBackground( display
                    .getSystemColor( SWT.COLOR_LIST_BACKGROUND ) );
            gc.setForeground( display
                    .getSystemColor( SWT.COLOR_LIST_FOREGROUND ) );
            gc.fillRectangle( rc );
        }
        String text 
= getItem( dis.itemID );
        gc.drawImage( image, dis.left 
+ 1, dis.top + 1 );
        gc.drawText( text, dis.left 
+ 20, dis.top );

        gc.dispose();

        
return null;
    }

    
private static class DCWrapper implements Drawable
    {
        
private int    hdc;

        DCWrapper( 
int hdc )
        {
            
this.hdc = hdc;
        }

        
public int internal_new_GC( GCData data )
        {
            
return hdc;
        }

        
public void internal_dispose_GC( int handle, GCData data )
        {
        }
    }

    
private Image    image;
}


值得说明的是Q如果设|Combo为OwnerDraw Variable风格Q则必须重蝲wmMeasureChildҎ来指定每一的高度。如果用OwnerDraw Fixed风格Q则只需要在构造的时候发送一条CB_SETITEMHEIGHT消息p了?br />

 另外一U值得考虑的选择是将Win32的ComboBoxEx控g包装成SWT Widget。不q,q需要{换若q结构ƈ提供接口QWin32的ImageList理机制和SWT的Image包装Ҏ差别比较大,使得q种Ҏ实现hȝ的多?br />



TreeNode 2006-07-06 10:08 发表评论
]]>
用cglib代码生成避开烦h的内部类http://www.aygfsteel.com/treenode/archive/2006/06/27/55289.htmlTreeNodeTreeNodeTue, 27 Jun 2006 03:29:00 GMThttp://www.aygfsteel.com/treenode/archive/2006/06/27/55289.htmlhttp://www.aygfsteel.com/treenode/comments/55289.htmlhttp://www.aygfsteel.com/treenode/archive/2006/06/27/55289.html#Feedback0http://www.aygfsteel.com/treenode/comments/commentRss/55289.htmlhttp://www.aygfsteel.com/treenode/services/trackbacks/55289.html在上回的blog中,我抱怨过用Java用内部类来实C件回调的机制是多么难看和ȝ。在q段旉里,我一直在考虑是否有什么方法可以不用内部类而实现同L效果。因为Java语言本n的限Ӟ所以常规方法是行不通的。有人徏议用反射——的通过反射可以调用L的方法,但是反射效率不佳Q对频繁发生的事件或怸太合适。动态代理也不能解决Ҏ映射的难题。我g走进了死胡同?/p>

既然此\不通,那么C#是如何实现delegate的呢Q过M曑֐闻过一些内q,不过q次被逼才真的下决心认真去看这斚w的东ѝ原来M$使用的是代码生成的技术:对于每个delegateQC#都会为它生成一个派生于MulticaseDelegate的对象,其中实现了一个和delegate{֐相同的方法。同Ӟ对delegate的操作符+=?=也会被编译器处理成对MulticaseDelegateҎ的调用?/p>

知道了这一点,接下来就需要看看Java中有没有cM的代码生成技术了。有意思的是,查找的时候发现有消息_Java 6.0QMutangQ中会提供动态代码生成的功能。这的确很吸引hQ不qJava6q在Beta阶段Q眼下还指望不上。其他比较出名的Ҏ是Apache becl和Objectweb ASM了。这两个库都比较底层Q不q还有一个开源的目——cglib——它在内部用了asmQ不q提供了较多的实用功能。据说Hibernate和Spring都用Cq个东西。研I这个库的时候,我一眼看CMethodDelegatecZ—很明显q就是我要找的东西了?/p>

MethodDelegate的设计思想很类gC#的delegate——将接口调用转发l类的一个成员函数。不q阅L档的时候我发现一个问题。MethodDelegate要求其所实现的接口必d有一个公共方法,但是SWT中的许多事g接口都有不止一个方法;比如QSelectionListener有widgetSelected和idgetDefaultSelected两个Ҏ。因此要在SWT中用MethodDelegateQ还

必须再多实现另外一层{发?/p>

了解手段Q接下来的事情就不难了。ȝhQ需要的步骤大致如下Q?br />1、ؓ每种需要实现的事g声明一个接口。这是MethodDelegate的要求?br />2、用一个类实现SWT的事件接口,q将特定的接口调用{发到W一步所实现

的接口?br />3、用MethodDelegate提供的方法,声明事g处理对象QEvent Handler

TargetQ通常ZH体或主部gQ要实现上述的事件接口。下面就来实C下。ؓ了简单v见,需要实现的接口声明Z件{发类的内部接口,以避免维护太多接口文Ӟ因ؓ该接口只需要声明一个方法,所以不会把外部cL得太q复杂。)例如Q处理部仉择事gQwidgetSelectedQ的cd以如下实玎ͼ

package org.yuhao.swt.events;

import net.sf.cglib.reflect.MethodDelegate;

import org.eclipse.swt.events.*;

public class WidgetSelectedHandler implements SelectionListener
{
 public WidgetSelectedHandler( Object target, String

methodName )
 {
  delegate = (IWidgetSelectedDelegate)

MethodDelegate.create( target,
    methodName,

IWidgetSelectedDelegate.class );
 }

 public void widgetDefaultSelected( SelectionEvent e )
 {
 }

 public void widgetSelected( SelectionEvent e )
 {
  delegate.invoke( e );
 }

 public void invoke( SelectionEvent e )
 {
 }

 public interface IWidgetSelectedDelegate
 {
  void invoke( SelectionEvent e );
 }

 private IWidgetSelectedDelegate delegate;
}

q个接口虽然只有外部cȝ刎ͼ但是必须声明为public的,否则q行会出错(我想大概是因Z码生成以后还是外部类Q需要公开讉K权限Q。ؓ了简化调用,再声明一个处理事件的辅助cEventHandlerQ专门管理将各种事g转发到相应的Handler的工作:

public class EventHandler
{
 public EventHandler( Object target )
 {
  this.target = target;
 }

 public void handleSelected( Button btn, String methodName )
 {
  btn.addSelectionListener( new

WidgetSelectedHandler( target, methodName ) );
 }
 private Object target;
}

q样Q在H口中就可以单的如下处理事gQ?br />public MainShell extends Shell()
{
  public MainShell( Display display )
 {
  ......
  handler = new EventHandler( this );
  handler.handleSelected( btn, "btn_clicked" );
 }

 public void btn_clicked( SelectionEvent e )
 {
  ...
 }
}

q里q需要注意:1、Q何事件处理方法必d明ؓpublic的。这样似乎有q面向对象的装原则Q不q实际上q不会造成什么大问题?、事件方法的{֐必须和对应的事gҎ相同。例如,widgetSelectedҎ有一个SelectionEvent参数Q那么处理该事g的btn_clickedҎ也必L且只有这一个参数。如果写错了Q那么运行的时候会抛出异常Q说找不到指定的Ҏ。这q是需要程序员的细心来保证。还幸q的是出错的提示非常明显Q不必担心用了q度复杂的技术而找不到真正的出错点?br />



TreeNode 2006-06-27 11:29 发表评论
]]>
内部c让我厌恶Javahttp://www.aygfsteel.com/treenode/archive/2006/06/15/53098.htmlTreeNodeTreeNodeThu, 15 Jun 2006 14:37:00 GMThttp://www.aygfsteel.com/treenode/archive/2006/06/15/53098.htmlhttp://www.aygfsteel.com/treenode/comments/53098.htmlhttp://www.aygfsteel.com/treenode/archive/2006/06/15/53098.html#Feedback31http://www.aygfsteel.com/treenode/comments/commentRss/53098.htmlhttp://www.aygfsteel.com/treenode/services/trackbacks/53098.html
        b.addSelectionListener( new SelectionAdapter()
        {
            
public void widgetSelected( SelectionEvent e )
            {
                Runnable longJob 
= new Runnable()
                {
                    
boolean    done    = false;
                    
int        id;

                    
public void run()
                    {
                        Thread thread 
= new Thread( new Runnable()
                        {
                            
public void run()
                            {
                                id 
= nextId[0]++;
                                display.syncExec( 
new Runnable()
                                {
                                    
public void run()
                                    {
                                        
if ( text.isDisposed() )
                                            
return;
                                        text
                                                .append( 
"\nStart long running task "
                                                        
+ id );
                                    }
                                } );
                                
for ( int i = 0; i < 100000; i++ )
                                {
                                    
if ( display.isDisposed() )
                                        
return;
                                    System.out
                                            .println( 
"do task that takes a long time in a separate thread "
                                                    
+ id );
                                }
                                
if ( display.isDisposed() )
                                    
return;
                                display.syncExec( 
new Runnable()
                                {
                                    
public void run()
                                    {
                                        
if ( text.isDisposed() )
                                            
return;
                                        text
                                                .append( 
"\nCompleted long running task "
                                                        
+ id );
                                    }
                                } );
                                done 
= true;
                                display.wake();
                            }
                        } );
                        thread.start();
                        
while ( !done && !shell.isDisposed() )
                        {
                            
if ( !display.readAndDispatch() )
                                display.sleep();
                        }
                    }
                };
                BusyIndicator.showWhile( display, longJob );
            }
        } );
另外一U:
        delegate void NotifyStartDelegate( int threadId );
        
delegate void NotifyFinishDelegate( int threadId );
        
        btnInvoke.Click 
+= BtnInvokeClick;
        
        
void BtnInvokeClick(object sender, System.EventArgs e)
        {
            text.Text 
= "invoke long running job";
            
            Cursor 
= Cursors.WaitCursor;
            Thread thread 
= new Thread( new ThreadStart(ThreadProc) );
            thread.Start();
        }
        
        
private void ThreadProc()
        {
            
int threadId = nextId ++;
            
bool done = false;
            
            
if ( IsDisposed )
                
return;
            
            Invoke( 
new NotifyStartDelegate(notifyThreadStart), new object[] { threadId } );
            
for ( int i=0; i<100000; i++ )
            {
                
if ( IsDisposed )
                    
return;
                Console.WriteLine( 
"do task that takes a long time in a separate thread " + threadId );
            }
        
            
if ( IsDisposed )
                
return;
            Invoke( 
new NotifyFinishDelegate(notifyThreadFinish), new object[] { threadId } );
            done 
= true;
        }
        
        
private void notifyThreadStart( int threadId )
        {
            text.Text 
+= "\r\nStart long task " + threadId;
            threadCount 
++;
        }
        
        
private void notifyThreadFinish( int threadId )
        {
            text.Text 
+= "\r\nCompleted long running task " + threadId;    
            threadCount 
--;
            
if ( threadCount == 0 )
                Cursor 
= Cursors.Default;
        }
        
        
private int nextId = 0;
        
private int threadCount = 0;

我在另一个地方也抱怨过Q在所有我了解的语aҎ里面,没有一U像Java内部cM栯我觉得反感——甚臛_了恶心的地步。大多作B/Spȝ的JavaE? 序员可能不会有这L感觉Q因为那个领域基本上很少会用到这个概c可是在C/SQ不用Swingq是SWTQ内部类都是l不q去的一座大山。在阅读Eclipse站点上许多代码示例以后,我终于有了痛苦到——一点也不夸张——想要作呕的地步。上面第一D代码就是让我感到窝心的代码之一Q仅仅是其中之一Q还不是最丑陋的)。我惻IJava 语言的发明者大概从来就没写q桌面程序;他根本也不打ؓq个领域的程序员提供一U比较好的事件回调机制?br />
内部cL什么问题呢Q首先,你愿意在ȝ代码逻辑之前Q先׃好几分钟L清楚“这个括号到底是和哪个配对”这U蠢问题吗?你不妨回头看看第一D늚代码Q想惌D其实相当简单的E序Q是不是真的值得用这么多括号去考验你的智力?br />
内部cL对封装的严重破坏。它对外部类的Q何私有变量都有完全的讉K权限——如果你H然发现某个变量的内容不对劲了,你不能仅仅在setXXX里面加个? 点就指望能捕获到错误Q真正的元凶可能是内部类里面的哪一句呢。如果内部类都非常简单,那倒也没什么。可是当内部cȝ来实C件的时候,你就没法指望它一 直那么简单了?br />
内部cL试的盲区。TDDL_要测试,试Q所有包含逻辑的类都应当通过充分的测试。可是内部类怎么试Q只要想惛_能知道,大多数内部类是根本没法测试的Q它和外部类实在是耦合的太紧密了。匿名内部类的问题更严重——它是绝Ҏ法测试的。你怎么试一个连名字都没有的ҎQ?br />
不管有意无意Q内部类在(臛_我看到的Q实践中事实上鼓׃不好的编E风根{就是说Q它q背了DRYQDon't Repeat YourselfQ的原则。比如,button.addSelectionListener后面几乎L跟着SelectionAdapter+括号+ widgetSelected原型?一堆括PDisplay.asyncExec后面L要写上new Runnble()Qvoid runQ)Q括P{等。千一律的东西Q可是又不得不写。而且Q几乎没有什么好的办法可以改q!因ؓ语法的规则要求你必须q样做。每天写q些无聊的东 西,你的话会不会烦?哦,工具是有的。可是工具只负责生成代码Q以后的l护q是要你来做——不是么Q?br />

TreeNode 2006-06-15 22:37 发表评论
]]>
SWT: 深入内幕之消息机制探U(上篇Q?/title><link>http://www.aygfsteel.com/treenode/archive/2006/06/03/50114.html</link><dc:creator>TreeNode</dc:creator><author>TreeNode</author><pubDate>Sat, 03 Jun 2006 04:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/treenode/archive/2006/06/03/50114.html</guid><wfw:comment>http://www.aygfsteel.com/treenode/comments/50114.html</wfw:comment><comments>http://www.aygfsteel.com/treenode/archive/2006/06/03/50114.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.aygfsteel.com/treenode/comments/commentRss/50114.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/treenode/services/trackbacks/50114.html</trackback:ping><description><![CDATA[     摘要: 本文试图透过SWT面向对象的封装,深入研究界面框架的构造中最复杂也可以说是最有趣的问题之一——即界面框架如何以面向对象的方式实现操作pȝ底层的消息机制?nbsp; <a href='http://www.aygfsteel.com/treenode/archive/2006/06/03/50114.html'>阅读全文</a><img src ="http://www.aygfsteel.com/treenode/aggbug/50114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/treenode/" target="_blank">TreeNode</a> 2006-06-03 12:46 <a href="http://www.aygfsteel.com/treenode/archive/2006/06/03/50114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">躣</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ѷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ž</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank">Ƿ</a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">齭</a>| <a href="http://" target="_blank">۽</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>