<?xml version="1.0"?>
<!-- name="generator" content="blojsom v2.14" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <channel>
        <title>Miles' Blog</title>
        <link>http://2yup.com/blojsom/blog/miles/</link>
        <description>Welcome 2 My Planet</description>
        <language>en</language>
        <image>
            <url>http://2yup.com/blojsom/favicon.ico</url>
            <title>Miles' Blog</title>
            <link>http://2yup.com/blojsom/blog/miles/</link>
        </image>
        <docs>http://backend.userland.com/rss</docs>
		<generator>blojsom v2.14</generator>
		<dc:publisher>MILES</dc:publisher>
		<dc:creator>miles@2yup.com</dc:creator>
		<dc:date>2004-09-21T16:38:51+08:00</dc:date>

                <item>
            <title>Yup Mailman 1.3版总结</title>
            <link>http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=33047996624FDB59187D43BC2E7321AF.txt</link>
            <description>&lt;img src=&quot;$resdir$/mailmanlogo64x64.gif&quot; border=1 align=left style=&quot;margin:10px&quot;&gt;
现在功能已经基本完成了，支持附件的管理。今天作了测试，发信也没有什么问题~~ 我给了一个版本号1.3，以后每次功能的完善会根据具体情况决定major version和minor version的更新。&lt;br&gt;&lt;br&gt;


到目前为止，值得注意的几个问题：
&lt;ol&gt;
&lt;li&gt;不要用&lt;code&gt;\r\n&lt;/code&gt;作new line标记，而应该用&lt;code&gt;\n&lt;/code&gt;。不知道为什么，用&lt;code&gt;PrintWriter.println()&lt;/code&gt;（包裹一个&lt;code&gt;Socket.getOutputStream()&lt;/code&gt;）时候，会自动将其中的\n替换成\r\n。这样的结果，就是当用\r\n作换行标记时候，会产生\r\r\n，从而使得邮件内容错误。&lt;code&gt;PrintWriter.println()&lt;/code&gt;的javadoc没有说明这个情况。
&lt;li&gt;仍然不知道如何用jdom在读写xml文档时候完全保留white spaces。写的时候，一定不要设置newLine为true，否则会导致白空格丢失，但是，如果不设置newLine，整个xml文件看上去是一塌糊涂。。另外，对于entity，似乎也很难保留，其中的引导&amp;还是会被替换成&amp;导致内容完全无效。。不知道是这方面的api本身问题，还是我使用不当，不得其法 :(&lt;br&gt;
&lt;font color=green&gt;最终我还是选择了用普通纯文本方式写，jdom读。这样就解决了所有问题。&lt;/font&gt;
&lt;li&gt;当使用&lt;code&gt;XYLayout&lt;/code&gt;时候，如果remove以后想重新设置一个现存的component的位置，除了parent.add时候设置正确的&lt;code&gt;XYConstain&lt;/code&gt;以外，还需要对component&lt;code&gt;setBounds()&lt;/code&gt;，否则位置会有问题。
&lt;li&gt;多操作系统下的测试还没有进行，不过如何调用系统默认的浏览器仍然是个问题。查找默认路径对于windows比较适用，其他系统可能稍微有点勉强。
&lt;/ol&gt;

&lt;br&gt;
下一步的目标，是实现multipart/alternative，让正文有更好的适应性。当功能比较完善的时候，我考虑把它作为share ware发布 :)
</description>
            <guid isPermaLink="true">http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=33047996624FDB59187D43BC2E7321AF.txt</guid>
			<pubDate>星期二, 21 九月 2004 16:38:51 +0800</pubDate>
              	          <wfw:comment>http://2yup.com/blojsom/commentapi/develop/yupmailman/?permalink=33047996624FDB59187D43BC2E7321AF.txt</wfw:comment>
              <wfw:commentRss>http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=33047996624FDB59187D43BC2E7321AF.txt&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
                <item>
            <title>ContentType不可以反复设置？</title>
            <link>http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=616B0B54A526979F9C6CC91D07558809.txt</link>
            <description>发现一个新问题，就是JTextPane的ContentType在被设置成text/html后，重新设置成text/plain就会报&lt;code&gt;IllegalArgumentException: Must be StyledEditorKit&lt;/code&gt;&lt;br&gt;
我估计可能是因为text/plain无法保证text/html所拥有的格式导致的。。总之api doc上面没有说明。&lt;br&gt;&lt;br&gt;

BTW，新的YupStudio logo和Mailman的icon：&lt;br&gt;&lt;br&gt;
&lt;img src=&quot;$resdir$/yuplogo64x64.gif&quot; border=1&gt; &amp;nbsp; &amp;nbsp;
&lt;img src=&quot;$resdir$/mailmanlogo64x64.gif&quot; border=1&gt;
</description>
            <guid isPermaLink="true">http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=616B0B54A526979F9C6CC91D07558809.txt</guid>
			<pubDate>星期三, 15 九月 2004 10:11:55 +0800</pubDate>
              	          <wfw:comment>http://2yup.com/blojsom/commentapi/develop/yupmailman/?permalink=616B0B54A526979F9C6CC91D07558809.txt</wfw:comment>
              <wfw:commentRss>http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=616B0B54A526979F9C6CC91D07558809.txt&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
                <item>
            <title>Yup Mailman - 我们的自用群发软件</title>
            <link>http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=06B16BBEFEE3AE79EFD40050102CE1CB.txt</link>
            <description>因为目前的网站推广需要，这两天抽空作了一个群发邮件的桌面程序。以前没真正做过swing UI，这也算是新的尝试了 ;)&lt;br&gt;&lt;br&gt;

程序的核心是利用socket与目标smtp server通信来发信。因为考虑到带宽的利用率，所以设计了多线程的方式。这里的任务分配其实很有学问，目前只是简单的根据mail address的数量和用户设置的thread count进行了数学上分配，其实考虑到建立socket的开销，更好的方式是根据主机MX纪录来分配，这样可以最大限度的利用现有socket资源，避免频繁的握手。。。有空一定要好好优化这部分！ (y)&lt;br&gt;&lt;br&gt;

大多的工作还是在周边。一方面是UI，还有一方面是设置文件、成功失败列表文件、临时预览文件的管理，以及他们和UI的交互。大量的dirty works。。。还好有jb这样的优秀RAD工具，否则现在也没有写笔记的功夫了 :P &lt;br&gt;&lt;br&gt;

总结一下其间遇到的几个难缠的问题：&lt;br&gt;&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;要让滚动条总在最下端，有3个方法：&lt;br&gt;
  &lt;ul&gt;
  &lt;li&gt;调用&lt;code&gt;JScrollPane.getViewport().scrollRectToVisible()&lt;/code&gt;，使得最下面的某一点可见；
  &lt;li&gt;设置vertical scroll bar的value到max；
  &lt;li&gt;在scroll pane里面&lt;code&gt;setCaretPosition()&lt;/code&gt;（也就是编辑光标的位置）到length()。
  &lt;/ul&gt;
看上去第一和第二个方案比较cool一点，可实际上用于多线程环境都会造成死锁。而我这里恰好有一个需要多线程更新scroll pane的地方：失败和成功邮件状态察看（参看下面的截图）。这里为了保证逐行的显示mail address，不至于串行，所以在scroll pane内的那个text pane上用到了&lt;code&gt;synchronized() {}&lt;/code&gt;。&lt;br&gt;
没有细看类库的source，我推测可能是因为这些操作都不是原子的，而其中某些步骤和我这里的synchronized相互竞争了锁导致的问题。这里还有待进一步的研究（如果有时间:P）。&lt;br&gt;&lt;br&gt;
&lt;li&gt;发信时候，有些smtp server会反向查询from地址的主机部分，检查和你的本机ip是否相同。我现在用的是&lt;code&gt;blah@本机ip地址&lt;/code&gt;，不过似乎有时候还是会失败。这个需要深入测试
&lt;li&gt;我的几个dialog，比如preference，还有preview，都是在show的时候让默认的cancel/close button去&lt;code&gt;requestFocus()&lt;/code&gt;，不过完全没有作用 :( 
&lt;/ol&gt;
其他的问题大多没什么难解决的，细心就没问题了。目前的版本还很粗糙，我的目标是把它最终做成一个功能完善的共享软件。有时间就有可能，呵呵。。

下面是一些界面截图以供参考 :)
&lt;br&gt;&lt;hr size=1&gt;

&lt;img src=&quot;$resdir$/mail_man_1.gif&quot;&gt;&lt;br&gt;&lt;br&gt;主界面&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;img src=&quot;$resdir$/mail_man_2.gif&quot;&gt;&lt;br&gt;&lt;br&gt;参数设置界面&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;img src=&quot;$resdir$/mail_man_3.gif&quot;&gt;&lt;br&gt;&lt;br&gt;邮件预览菜单:可以用内部的浏览器,或者IE进行预览。&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;img src=&quot;$resdir$/mail_man_4.gif&quot;&gt;&lt;br&gt;&lt;br&gt;预览界面&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;img src=&quot;$resdir$/mail_man_5.gif&quot;&gt;&lt;br&gt;&lt;br&gt;开始发送&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;img src=&quot;$resdir$/mail_man_6.gif&quot;&gt;&lt;br&gt;&lt;br&gt;失败和成功邮件状态察看&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;img src=&quot;$resdir$/mail_man_7.gif&quot;&gt;&lt;br&gt;&lt;br&gt;发送完成报告
</description>
            <guid isPermaLink="true">http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=06B16BBEFEE3AE79EFD40050102CE1CB.txt</guid>
			<pubDate>星期三, 15 九月 2004 10:04:09 +0800</pubDate>
              	          <wfw:comment>http://2yup.com/blojsom/commentapi/develop/yupmailman/?permalink=06B16BBEFEE3AE79EFD40050102CE1CB.txt</wfw:comment>
              <wfw:commentRss>http://2yup.com/blojsom/blog/miles/develop/yupmailman/?permalink=06B16BBEFEE3AE79EFD40050102CE1CB.txt&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
            </channel>
</rss>
