??xml version="1.0" encoding="utf-8" standalone="yes"?>久久男人的天堂,国产三级在线免费观看,日本免费一区二区三区http://www.aygfsteel.com/RoyPayne/category/50508.htmlQ敲L想的键盘,滑动灉|的鼠标?/description>zh-cnThu, 05 Jan 2012 19:31:21 GMTThu, 05 Jan 2012 19:31:21 GMT60Math.floor和Math.ceil http://www.aygfsteel.com/RoyPayne/archive/2012/01/05/367883.htmlRoyPayneRoyPayneThu, 05 Jan 2012 01:20:00 GMThttp://www.aygfsteel.com/RoyPayne/archive/2012/01/05/367883.htmlhttp://www.aygfsteel.com/RoyPayne/comments/367883.htmlhttp://www.aygfsteel.com/RoyPayne/archive/2012/01/05/367883.html#Feedback0http://www.aygfsteel.com/RoyPayne/comments/commentRss/367883.htmlhttp://www.aygfsteel.com/RoyPayne/services/trackbacks/367883.html
public class CeilAndFloor {
    public static void main(String[] args) {
    /*
        q两个宝贝函数的主要d是截掉小C后的位数.
        区别? floorL把数字变得越来越,而ceilL把数字变大?br />                其实名字可以理解floor是地板,ceil是天花板?br />    
*/

        System.out.println("==============Math.floor()==============");
        System.out.println("Math.floor(99.1) = " + Math.floor(99.1));
        System.out.println("Math.floor(-99.1) = " + Math.floor(-99.1));
        System.out.println("Math.floor(99.9) = " + Math.floor(99.9));
        System.out.println("Math.floor(99.9) = " + Math.floor(-99.9));
        
        System.out.println("\n\n==============Math.ceil()==============");
        System.out.println("Math.ceil(99.1) = " + Math.ceil(99.1));
        System.out.println("Math.ceil(-99.1) = " + Math.ceil(-99.1));
        System.out.println("Math.ceil(99.9) = " + Math.ceil(99.9));
        System.out.println("Math.ceil(99.9) = " + Math.ceil(-99.9));
        
    }
}
l果
==============Math.floor()==============
Math.floor(99.1) = 99.0
Math.floor(-99.1) = -100.0
Math.floor(99.9) = 99.0
Math.floor(99.9) = -100.0

==============Math.ceil()==============
Math.ceil(99.1) = 100.0
Math.ceil(-99.1) = -99.0
Math.ceil(99.9) = 100.0
Math.ceil(99.9) = -99.0

RoyPayne 2012-01-05 09:20 发表评论
]]>
用Java获得当前性能信息http://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367840.htmlRoyPayneRoyPayneWed, 04 Jan 2012 06:54:00 GMThttp://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367840.htmlhttp://www.aygfsteel.com/RoyPayne/comments/367840.htmlhttp://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367840.html#Feedback0http://www.aygfsteel.com/RoyPayne/comments/commentRss/367840.htmlhttp://www.aygfsteel.com/RoyPayne/services/trackbacks/367840.html在Java中,可以获得ȝ物理内存、剩余的物理内存、已使用的物理内存等信息Q本例讲解如何取得这些信息,q且获得在Windows下的内存使用率?/span>
     首先~写一个MonitorInfoBeanc,用来装蝲监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存用率{字D,该类的代码如下:
      

package com.amigo.performance;

/**
 * 监视信息的JavaBeanc?
 * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * 
@version 1.0 
 * Creation date: 2008-4-25 - 上午10:37:00
 
*/
public class MonitorInfoBean {
    /** 可用内? */
    private long totalMemory;
    
    /** 剩余内存. */
    private long freeMemory;
    
    /** 最大可使用内存. */
    private long maxMemory;
    
    /** 操作pȝ. */
    private String osName;
    
    /** ȝ物理内存. */
    private long totalMemorySize;
    
    /** 剩余的物理内? */
    private long freePhysicalMemorySize;
    
    /** 已用的物理内存. */
    private long usedMemory;
    
    /** U程L. */
    private int totalThread;
    
    /** cpu使用? */
    private double cpuRatio;

    public long getFreeMemory() {
        return freeMemory;
    }

    public void setFreeMemory(long freeMemory) {
        this.freeMemory = freeMemory;
    }

    public long getFreePhysicalMemorySize() {
        return freePhysicalMemorySize;
    }

    public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {
        this.freePhysicalMemorySize = freePhysicalMemorySize;
    }

    public long getMaxMemory() {
        return maxMemory;
    }

    public void setMaxMemory(long maxMemory) {
        this.maxMemory = maxMemory;
    }

    public String getOsName() {
        return osName;
    }

    public void setOsName(String osName) {
        this.osName = osName;
    }

    public long getTotalMemory() {
        return totalMemory;
    }

    public void setTotalMemory(long totalMemory) {
        this.totalMemory = totalMemory;
    }

    public long getTotalMemorySize() {
        return totalMemorySize;
    }

    public void setTotalMemorySize(long totalMemorySize) {
        this.totalMemorySize = totalMemorySize;
    }

    public int getTotalThread() {
        return totalThread;
    }

    public void setTotalThread(int totalThread) {
        this.totalThread = totalThread;
    }

    public long getUsedMemory() {
        return usedMemory;
    }

    public void setUsedMemory(long usedMemory) {
        this.usedMemory = usedMemory;
    }

    public double getCpuRatio() {
        return cpuRatio;
    }

    public void setCpuRatio(double cpuRatio) {
        this.cpuRatio = cpuRatio;
    }
}

接着~写一个获得当前的监控信息的接口,该类的代码如下所C:

package com.amigo.performance;

/**
 * 获取pȝ信息的业务逻辑cL?
 * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * 
@version 1.0 
 * Creation date: 2008-3-11 - 上午10:06:06
 
*/
public interface IMonitorService {
    /**
     * 获得当前的监控对?
     * 
@return q回构造好的监控对?br />     * @throws Exception
     * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
     * Creation date: 2008-4-25 - 上午10:45:08
     
*/
    public MonitorInfoBean getMonitorInfoBean() throws Exception;

}

该类的实现类MonitorServiceImpl如下所C:


package com.amigo.performance;

import java.io.InputStreamReader;
import java.io.LineNumberReader;

import sun.management.ManagementFactory;

import com.sun.management.OperatingSystemMXBean;

/**
 * 获取pȝ信息的业务逻辑实现c?
 * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * 
@version 1.0 Creation date: 2008-3-11 - 上午10:06:06
 
*/
public class MonitorServiceImpl implements IMonitorService {
    
    private static final int CPUTIME = 30;

    private static final int PERCENT = 100;

    private static final int FAULTLENGTH = 10;

    /**
     * 获得当前的监控对?
     * 
@return q回构造好的监控对?br />     * @throws Exception
     * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
     * Creation date: 2008-4-25 - 上午10:45:08
     
*/
    public MonitorInfoBean getMonitorInfoBean() throws Exception {
        int kb = 1024;
        
        // 可用内?/span>
        long totalMemory = Runtime.getRuntime().totalMemory() / kb;
        // 剩余内存
        long freeMemory = Runtime.getRuntime().freeMemory() / kb;
        // 最大可使用内存
        long maxMemory = Runtime.getRuntime().maxMemory() / kb;

        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory
                .getOperatingSystemMXBean();

        // 操作pȝ
        String osName = System.getProperty("os.name");
        // ȝ物理内存
        long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;
        // 剩余的物理内?/span>
        long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;
        // 已用的物理内存
        long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb
                .getFreePhysicalMemorySize())
                / kb;

        // 获得U程L
        ThreadGroup parentThread;
        for (parentThread = Thread.currentThread().getThreadGroup(); parentThread
                .getParent() != null; parentThread = parentThread.getParent())
            ;
        int totalThread = parentThread.activeCount();

        double cpuRatio = 0;
        if (osName.toLowerCase().startsWith("windows")) {
            cpuRatio = this.getCpuRatioForWindows();
        }
        
        // 构造返回对?/span>
        MonitorInfoBean infoBean = new MonitorInfoBean();
        infoBean.setFreeMemory(freeMemory);
        infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
        infoBean.setMaxMemory(maxMemory);
        infoBean.setOsName(osName);
        infoBean.setTotalMemory(totalMemory);
        infoBean.setTotalMemorySize(totalMemorySize);
        infoBean.setTotalThread(totalThread);
        infoBean.setUsedMemory(usedMemory);
        infoBean.setCpuRatio(cpuRatio);
        return infoBean;
    }

    /**
     * 获得CPU使用?
     * 
@return q回cpu使用?br />     * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
     * Creation date: 2008-4-25 - 下午06:05:11
     
*/
    private double getCpuRatioForWindows() {
        try {
            String procCmd = System.getenv("windir")
                    + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"
                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
            // 取进E信?/span>
            long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));
            Thread.sleep(CPUTIME);
            long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));
            if (c0 != null && c1 != null) {
                long idletime = c1[0] - c0[0];
                long busytime = c1[1] - c0[1];
                return Double.valueOf(
                        PERCENT * (busytime) / (busytime + idletime))
                        .doubleValue();
            } else {
                return 0.0;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return 0.0;
        }
    }

    /**
     * dCPU信息.
     * 
@param proc
     * 
@return
     * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
     * Creation date: 2008-4-25 - 下午06:10:14
     
*/
    private long[] readCpu(final Process proc) {
        long[] retn = new long[2];
        try {
            proc.getOutputStream().close();
            InputStreamReader ir = new InputStreamReader(proc.getInputStream());
            LineNumberReader input = new LineNumberReader(ir);
            String line = input.readLine();
            if (line == null || line.length() < FAULTLENGTH) {
                return null;
            }
            int capidx = line.indexOf("Caption");
            int cmdidx = line.indexOf("CommandLine");
            int rocidx = line.indexOf("ReadOperationCount");
            int umtidx = line.indexOf("UserModeTime");
            int kmtidx = line.indexOf("KernelModeTime");
            int wocidx = line.indexOf("WriteOperationCount");
            long idletime = 0;
            long kneltime = 0;
            long usertime = 0;
            while ((line = input.readLine()) != null) {
                if (line.length() < wocidx) {
                    continue;
                }
                // 字段出现序QCaption,CommandLine,KernelModeTime,ReadOperationCount,
                
// ThreadCount,UserModeTime,WriteOperation
                String caption = Bytes.substring(line, capidx, cmdidx - 1)
                        .trim();
                String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();
                if (cmd.indexOf("wmic.exe") >= 0) {
                    continue;
                }
                // log.info("line="+line);
                if (caption.equals("System Idle Process")
                        || caption.equals("System")) {
                    idletime += Long.valueOf(
                            Bytes.substring(line, kmtidx, rocidx - 1).trim())
                            .longValue();
                    idletime += Long.valueOf(
                            Bytes.substring(line, umtidx, wocidx - 1).trim())
                            .longValue();
                    continue;
                }

                kneltime += Long.valueOf(
                        Bytes.substring(line, kmtidx, rocidx - 1).trim())
                        .longValue();
                usertime += Long.valueOf(
                        Bytes.substring(line, umtidx, wocidx - 1).trim())
                        .longValue();
            }
            retn[0] = idletime;
            retn[1] = kneltime + usertime;
            return retn;
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                proc.getInputStream().close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    
    /**
     * 试Ҏ.
     * 
@param args
     * 
@throws Exception
     * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
     * Creation date: 2008-4-30 - 下午04:47:29
     
*/
    public static void main(String[] args) throws Exception {
        IMonitorService service = new MonitorServiceImpl();
        MonitorInfoBean monitorInfo = service.getMonitorInfoBean();
        System.out.println("cpu占有?" + monitorInfo.getCpuRatio());
        
        System.out.println("可用内?" + monitorInfo.getTotalMemory());
        System.out.println("剩余内存=" + monitorInfo.getFreeMemory());
        System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory());
        
        System.out.println("操作pȝ=" + monitorInfo.getOsName());
        System.out.println("ȝ物理内存=" + monitorInfo.getTotalMemorySize() + "kb");
        System.out.println("剩余的物理内?" + monitorInfo.getFreeMemory() + "kb");
        System.out.println("已用的物理内存=" + monitorInfo.getUsedMemory() + "kb");
        System.out.println("U程L=" + monitorInfo.getTotalThread() + "kb");
    }
}

该实现类中需要用C个自q写byte的工LQ该cȝ代码如下所C:


package com.amigo.performance;

/**
 * byte操作c?
 * 
@author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * 
@version 1.0 
 * Creation date: 2008-4-30 - 下午04:57:23
 
*/
public class Bytes {
    /**
     * ׃String.subStringҎ字处理存在问题(把一个汉字视Z个字?Q因此在
     * 包含汉字的字W串时存在隐患,现调整如下:
     * 
@param src 要截取的字符?br />     * @param start_idx 开始坐标(包括该坐?
     * 
@param end_idx   截止坐标Q包括该坐标Q?br />     * @return
     
*/
    public static String substring(String src, int start_idx, int end_idx){
        byte[] b = src.getBytes();
        String tgt = "";
        for(int i=start_idx; i<=end_idx; i++){
            tgt +=(char)b[i];
        }
        return tgt;
    }
}

q行下MonitorBeanImplc,读者将会看到当前的内存、cpu利用率等信息?/span>













RoyPayne 2012-01-04 14:54 发表评论
]]>
java 通过System.getProperties()获取pȝ参数http://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367837.htmlRoyPayneRoyPayneWed, 04 Jan 2012 06:37:00 GMThttp://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367837.htmlhttp://www.aygfsteel.com/RoyPayne/comments/367837.htmlhttp://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367837.html#Feedback0http://www.aygfsteel.com/RoyPayne/comments/commentRss/367837.htmlhttp://www.aygfsteel.com/RoyPayne/services/trackbacks/367837.html阅读全文

RoyPayne 2012-01-04 14:37 发表评论
]]>
ListResourceBundlehttp://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367835.htmlRoyPayneRoyPayneWed, 04 Jan 2012 06:29:00 GMThttp://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367835.htmlhttp://www.aygfsteel.com/RoyPayne/comments/367835.htmlhttp://www.aygfsteel.com/RoyPayne/archive/2012/01/04/367835.html#Feedback0http://www.aygfsteel.com/RoyPayne/comments/commentRss/367835.htmlhttp://www.aygfsteel.com/RoyPayne/services/trackbacks/367835.html    ListResourceBundle ?nbsp;ResourceBundle 的一个抽象类Q用于管理方便而又易于使用的列表中的语a环境资源。有兌源包的常规信息,请参?nbsp;ResourceBundle?br />    子类必须重写 getContents q提供一个数l,其中数组中的每个w是一个对象对。每对的W一个元素是键,该键必须是一?nbsp;StringQƈ且第二个元素是和该键相关联的倹{?br />      下面?/span>CZ昄了具有基本名U?"MyResources" 的资源包pd的两个成员?MyResources" 是资源包pd的默认成员,"MyResources_fr" ?French 成员。这些成员是ZListResourceBundleQ一个相关的CZ昄了如何把一个资源包d到基于属性文件的此系列)。此CZ中的键Ş式ؓ "s1" {。实际的键完全取决于您的选择Q只要它们和E序中用于从资源包中获取对象的键相同。键区分大小写?br />     

public class MyResources extends ListResourceBundle {
     protected Object[][] getContents() {
         return new Object[][] = {
     // LOCALIZE THIS
         {"s1", "The disk \"{1}\" contains {0}."},  // MessageFormat pattern
         {"s2", "1"},                               // location of {0} in pattern
         {"s3", "My Disk"},                         // sample disk name
         {"s4", "no files"},                        // first ChoiceFormat choice
         {"s5", "one file"},                        // second ChoiceFormat choice
         {"s6", "{0,number} files"},                // third ChoiceFormat choice
         {"s7", "3 Mar 96"},                        // sample date
         {"s8", new Dimension(1,5)}                 // real object, not just string
     
// END OF MATERIAL TO LOCALIZE
     };
   }
 }

 public class MyResources_fr extends ListResourceBundle {
     protected Object[][] getContents() {
         return new Object[][] = {
     // LOCALIZE THIS
         {"s1", "Le disque \"{1}\" {0}."},          // MessageFormat pattern
         {"s2", "1"},                               // location of {0} in pattern
         {"s3", "Mon disque"},                      // sample disk name
         {"s4", "ne contient pas de fichiers"},     // first ChoiceFormat choice
         {"s5", "contient un fichier"},             // second ChoiceFormat choice
         {"s6", "contient {0,number} fichiers"},    // third ChoiceFormat choice
         {"s7", "3 mars 1996"},                     // sample date
         {"s8", new Dimension(1,3)}                 // real object, not just string
     
// END OF MATERIAL TO LOCALIZE
     };
   }
}


RoyPayne 2012-01-04 14:29 发表评论
]]>
classloaderhttp://www.aygfsteel.com/RoyPayne/archive/2011/12/30/367567.htmlRoyPayneRoyPayneFri, 30 Dec 2011 04:07:00 GMThttp://www.aygfsteel.com/RoyPayne/archive/2011/12/30/367567.htmlhttp://www.aygfsteel.com/RoyPayne/comments/367567.htmlhttp://www.aygfsteel.com/RoyPayne/archive/2011/12/30/367567.html#Feedback0http://www.aygfsteel.com/RoyPayne/comments/commentRss/367567.htmlhttp://www.aygfsteel.com/RoyPayne/services/trackbacks/367567.html

What is ClassLoader?
   
   与普通程序不同的是,JavaE序Qclass文gQƈ不是本地的可执行E序。当q行JavaE序Ӟ首先q行JVMQJava虚拟机)Q然后再把Java class加蝲到JVM里头q行Q负责加载Java class的这部分叫做Class Loader?/span>

  JVM本n包含了一个ClassLoaderUCؓBootstrap ClassLoaderQ和JVM一PBootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClassQ即所有java.*开头的c)。另外JVMq会提供两个ClassLoaderQ它们都是用Java语言~写的,由BootstrapClassLoader加蝲Q其中Extension ClassLoader负责加蝲扩展的JavaclassQ例如所有javax.*开头的cd存放在JRE的ext目录下的c)QApplicationClassLoader负责加蝲应用E序自n的类?/span>
  当运行一个程序的时候,JVM启动Q运行bootstrapclassloaderQ该ClassLoader加蝲java核心APIQExtClassLoader和AppClassLoader也在此时被加载)Q然后调用ExtClassLoader加蝲扩展APIQ最后AppClassLoader加蝲CLASSPATH目录下定义的ClassQ这是一个程序最基本的加载流E?/span>
  ? 学ClassLoader看OSGI

When to load the class?

什么时候JVM会用ClassLoader加蝲一个类呢?当你使用javaL行一个类QJVM使用ApplicationClassLoader加蝲q个c;然后如果cA引用了类BQ不是直接引用q是用Class.forName()引用QJVM׃扑ֈ加蝲cA的ClassLoaderQƈ用这个ClassLoader来加载类B。JVM按照q行时的有效执行语句Q来军_是否需要装载新c,从而装载尽可能的c,q一点和~译cL不相同的?/span>
  Why use your own ClassLoader?
  gJVM自n的ClassLoader已经_了,Z么我们还需要创qClassLoader呢?
  因ؓJVM自带的ClassLoader只是懂得从本地文件系l加载标准的java class文gQ如果编写你自己的ClassLoaderQ你可以做到Q?/span>
  1Q在执行非置信代码之前,自动验证数字{֐
  2Q动态地创徏W合用户特定需要的定制化构建类
  3Q从特定的场所取得java classQ例如数据库?/span>
  4) {等
  事实上当使用Applet的时候,qC特定的ClassLoaderQ因旉要从|络上加载java classQƈ且要查相关的安全信息?/span>
  目前的应用服务器大都使用了ClassLoader技术,即你不需要创qClassLoaderQ了解其原理也有助于更好地部|自q应用?br />

ClassLoader Tree & Delegation Model

当你军_创徏你自qClassLoaderӞ需要承java.lang.ClassLoader或者它的子cR在实例化每个ClassLoader对象Ӟ需要指定一个父对象Q如果没有指定的话,pȝ自动指定ClassLoader.getSystemClassLoader()为父对象?/span>
  所以当创徏自己的Class LoaderӞ只需要重载findClass()q个Ҏ?br />

Unloading? Reloading?

当一个javaclass被加载到JVM之后Q它有没有可能被卸蝲呢?我们知道Win32有FreeLibrary()函数QPosix有dlclose()函数可以被调用来卸蝲指定的动态连接库Q但是Javaq没有提供一个UnloadClass()的方法来卸蝲指定的类?/span>
  在Java中,java class的卸载仅仅是一U对pȝ的优化,有助于减应用对内存的占用。既然是一U优化方法,那么完全是JVM自行军_如何实现Q对Java开发h员来说是完全透明的?/span>
  在什么时候一个java class/interface会被卸蝲呢?Sun公司的原话是q么说的Q?class or interfacemay be unloaded if and only if its class loader is unreachable. Classesloaded by the bootstrap loader may not be unloaded."
  事实上我们关心的不是如何卸蝲cȝQ我们关心的是如何更新已l被加蝲了的cM而更新应用的功能。JSP则是一个非常典型的例子Q如果一个JSP文g被更改了Q应用服务器则需要把更改后的JSP重新~译Q然后加载新生成的类来响应后l的h?/span>
  其实一个已l加载的cL无法被更新的Q如果你试图用同一个ClassLoader再次加蝲同一个类Q就会得到异常(java.lang.LinkageError: duplicate classdefinitionQ,我们只能够重新创Z个新的ClassLoader实例来再ơ加载新cR至于原来已l加载的c,开发h员不必去它Q因为它可能q有实例正在被用,只要相关的实例都被内存回收了Q那么JVM׃在适当的时候把不会再用的cd载?/span>
  使用U程上下文类加蝲? 可以在执行线E中, 抛弃双亲委派加蝲链模? 使用U程上下文里的类加蝲器加载类.
  典型的例子有, 通过U程上下文来加蝲W三方库jndi实现, 而不依赖于双亲委z?
  大部分java app服务?jboss, tomcat..)也是采用contextClassLoader来处理web服务?/span>
  当然, 好东襉K有利? 使用U程上下文加载类, 也要注意, 保证多根需要通信的线E间的类加蝲器应该是同一? 防止因ؓ不同的类加蝲? Dcd转换异常(ClassCastException).
  参考资料及囄来源——Understanding J2EE Application Server Class Loading Architectures



RoyPayne 2011-12-30 12:07 发表评论
]]>
վ֩ģ壺 ĩ| ľ| ƽ| | | Ϫ| | | ƺ| ɽ| ׺| | | | | | ʲ| ¡| Ȫ| | | | ʮ| | ½| ƽ| | ɳ| | տ| | | ׶| ѭ| | ֣| | ຣʡ| | | |