2009年10月22日

google voice开通的关键步骤和使用方法推荐

一、开通
在接到邀请码后,一定要用美国的vpn注册。
由于google voice一定要用美国的号码激活,因此一定要设法搞到一个美国虚拟号码,方法有:virtualphoneline,或gizmo5+ipkall,或28tel。
其中virtualphoneline可一步得到虚拟号码,但一个月后过期。
gizmo5+ipkall也要用vpn注册,ipkall通常要一天以后才会开通。
28tel是收费的。

得到虚拟号后,就可以激活了,也就是将你的google voice打到此号码上,并输入验证码。
virtualphoneline和gizmo5都可以将电话转移到gtalk或skype上,但是gtalk没有拨号盘,所以在激活的时候,一定要先转移到skype上,接通电话后打开拨号盘输入验证码。
28tel是将美国的电话转接到国内电话,激活应该更没有问题。

二、用法
由于google voice支持免费拨打接听美加的电话,因此可以通过google voice实现和美国pc-phone免费通话。
原理是,google voice先拨打你的美国虚拟号码,此号码转接到你的gtalk/skype上(通过gtalk2voip或opensky),就好象别人向你发起语音聊天,接受后就建立了google voice和你的聊天软件的连接。然后google voice开始拨打你希望拨出的号码,连接建立后将通话切换到你的客户端上。有点象是三方通话。
作为测试方法,你可以申请2个虚拟号码,都绑定到你的google voice上,激活后一个转移到skype,另一个转移到gtalk,然后让google voice呼叫其中一个号码,将另一个作为你的phone to ring就是google voice转接给你的主叫号码。要注意的是,用此方法测试,一定要将google voice仅仅forward to主叫号码。点connect后,google voice先后接通主叫号码和呼出号码,就可以在gtalk和skype之间建立语音通话。
因此用此方法,事实上可以实现不同IM之间的语音通话,但是skype的voip免费转接只有3分钟,而gtalk是不限时长的。
我的建议是,用google voice+gtalk和美国朋友/同事间进行免费通话。

但是,但是,如果要开电话会议,gtalk就不够了,因为会议系统往往需要密码验证,而gtalk是没有拨号盘的。
我的建议是让已加入会议的某位美国朋友/同事通过你的google voice和你建立三方通话,这样就无需验证了。
当然,如果会议特别短的话,比如3分钟,那么skype足够了。

google voice的另一特色功能是支持发免费短信,比如可以直接发免费短信给国内的手机用户,但是但是,只支持英文,(唐人街的兄弟们内牛满面了)
我一般不建议这类用法:比如给美国朋友发短信说,孩子我已经打掉了。。。

2009年10月20日

用gae+推土鳖架设私家twit服务器

原理:
1、用开源twitter客户端程序推土鳖通过google app engine创建twitter服务。
2、通过google apps将此代理指向私家域名。


准备工作:
1、申请gmail帐号,免费。
2、购买.net或.com帐号,以便申请google apps,费用50-100元。
3、从 http://dl.getdropbox.com/u/152173/tuitubie_v1.zip 下载推土鳖源码包。
5、下载并安装google app engine for java: http://code.google.com/appengine/downloads.html

详细过程:
1、申请并开通google app engine。
2、创建自己的application。
3、将推土鳖源码复制到google app engine sdk安装目录下,修改war\WEB-INF目录下的appengine-web.xml和web.xml:
appengine-web.xm中,<application>你自己的程序名</application>。
web.xml中,<param-name>encrypt_key</param-name><param-value>7dri783e</param-value>,param-value为8位数字加字母组合。
2个文件都应以UTF8格式保存。
打开dos窗口,进入gae的bin目录,运行命令appcfg.cmd update [推土鳖war包的目录]。
如果这一步失败,如提示javac没有找到,则按如下提示操作:
1)设置系统变量,CLASSPATH指向java sdk的lib目录,PATH增加java sdk的bin目录。
2)如果安装了java jre,则将javac.exe从jdk\bin复制到jre6\bin, 将tools.jar从jdk\lib复制到jre6\lib。

4、申请开通google apps,一般.net/.com域名都能申请成功。
5、将此代理指向自己的私家域名,这一步非常关键,因为存放google app engine程序的appspot.com随时可能被封。
1)首先添加域名解析,添加一个cname转向域名,注意:不要按照google apps的说明指向ghs.google.com,因为已经被封了。
由于ghs也是给域名转向用的,你完全可以用别的转向域名定位google app engine的服务器。可google ghs.google.com得到可用的替代转向域名。
2)在appengine的管理页面上,选择左边的菜单"Administation">"Application Settings",点击右边的"Add Domain"按钮,输入apps的域名,提交。激活服务。添加新网址。这样就将gappproxy指向你的私家域名了。
可以http://你的域名/ 进行测试。


放心地推吧!
也可以小范围传播你的twitter服务器,你的好友可以在你的帮助下突破网络封锁了。

域名是封不完的,twitter不死!

2009年10月14日

轻松创建私家twit api

原理:
1、用birdnest通过google app engine创建twitterapi。
2、通过google apps将此代理指向私家域名。
3、使用twitterfox支持twitterapi的修改版,或其它支持twitterapi的客户端登录twitter。

准备工作:
1、申请gmail帐号,免费。
2、购买.net或.com帐号,以便申请google apps,费用50-100元。
5、下载并安装python。
6、下载并安装google app engine for pythod。

详细过程:
1、申请并开通google app engine。
2、创建自己的application。
3、将birdnest源码复制到google app engine sdk安装目录下,修改app.yaml文件,通过appcfg.py update 上传。
或google birdnest twitter。
4、申请开通google apps,一般.net/.com域名都能申请成功。
5、将此代理指向自己的私家域名,这一步非常关键,因为存放google app engine程序的appspot.com随时可能被封。
1)首先添加域名解析,添加一个cname转向域名,注意:不要按照google apps的说明指向ghs.google.com,因为已经被封了。
由于ghs也是给域名转向用的,你完全可以用别的转向域名定位google app engine的服务器。可google ghs.google.com得到可用的替代转向域名。
2)在appengine的管理页面上,选择左边的菜单"Administation">"Application Settings",点击右边的"Add Domain"按钮,输入apps的域名,提交。激活服务。添加新网址。这样就将gappproxy指向你的私家域名了。
可以http://你的域名/ 进行测试。
另外象twibble等客户端也支持自定义twitterapi.

放心地推吧!
也可以小范围传播你的twitterapi,你的好友可以在你的帮助下突破网络封锁了。

域名是封不完的,twitter不死!

轻松创建私家http代理服务器

原理:
1、用gappproxy通过google app engine创建代理服务器。
2、通过google apps将此代理指向私家域名。
3、使用gapproxy客户端在本机创建代理。

准备工作:
1、申请gmail帐号,免费。
2、购买.net或.com帐号,以便申请google apps,费用50-100元。
3、从https://code.google.com/p/gappproxy/downloads/list下载服务器端源码包。
4、以同一地址下载windows客户端程序。
5、下载并安装python。
6、下载并安装google app engine for pythod。

详细过程:
1、申请并开通google app engine。
2、创建自己的application。
3、将gappproxy源码复制到google app engine sdk安装目录下,修改app.yaml文件,通过appcfg.py update 上传。
或google gappproxy。
4、申请开通google apps,一般.net/.com域名都能申请成功。
5、将此代理指向自己的私家域名,这一步非常关键,因为存放google app engine程序的appspot.com随时可能被封。
1)首先添加域名解析,添加一个cname转向域名,注意:不要按照google apps的说明指向ghs.google.com,因为已经被封了。
由于ghs也是给域名转向用的,你完全可以用别的转向域名定位google app engine的服务器。可google ghs.google.com得到可用的替代转向域名。
2)在appengine的管理页面上,选择左边的菜单"Administation">"Application Settings",点击右边的"Add Domain"按钮,输入apps的域名,提交。激活服务。添加新网址。这样就将gappproxy指向你的私家域名了。
可以http://你的域名/fetch.py 进行测试。
6、安装设置gappproxy客户端,选中Use FetchServer,地址为http://你的域名/fetch.py
7、将浏览器的http代理设置为127.0.0.1:8000。注意如果你是拨号用户,IE的设置在连接页中,不要选"局域网设置",而是设置拨号网络的连接。

放心地爽吧!
也可以小范围传播你的代理服务器,你的好友只要安装gappproxy客户端,就可以在你的帮助下突破网络封锁了。



2009年9月28日

tor

http://docs.google.com/View?id=dfc32596_290ffjb68dt

翻墙还需搭桥——Portable Tor设置特别说明

Portable Tor的下载地址:http://bit.ly/USOkd

下载之后双击执行,会要求你指定一个目录,将其压缩包内的文件释放到指定目录中。

解压缩完毕之后双击执行PortableTor.exe,则可看到以下程序窗口:

(或下载Vidalia Bundle安装版:http://ifile.it/xvcf3zj)




去掉"启动时显示此窗口"之前的对号,省得以后开机自动运行该程序的时候总是显示这个窗口……

按"设定"按钮,就可以看到以下对话框:



在"常规"标签中,可以去掉"Start a proxy application when Vidalia starts"之前的对号(当然有人不在意这个)……



对于国内用户这一步最重要

"网络"标签中这一页对话框中,在"我的ISP阻挡了对Tor网络的连接"之前打勾,然后就可以看到"Bridge Settings",可以为Tor添加Bridge。

bridges@torproject.org发一封邮件(最好使用gmail邮箱,没有的话就最好注册一个),内容为:"get bridges"(邮件写不写标题都可以),几秒钟之内,你就会收到一封含有bridge list(一般是三个)的邮件,比如,其中有这样的内容:


[This is an automated message; please do not reply.]

Here are your bridge relays:

bridge 92.41.50.141:443
bridge 83.226.198.100:9443
bridge 69.60.117.34:9001


把这三行分别拷贝粘贴到文字输入框中,然后点击右边标有绿色加号的按钮即可。



由于必须有bridge才可以正常使用tor,所以,这一项中,现在还只能选择"Run as a client only"……

至此,设定完毕,关闭此对话框,在主窗口中启动tor,一会儿就连接上了。而后,还可以查看Tor网络地图,看看你现在连上的tor中转站都在地球上的什么位置……



如果你恰好喜欢使用Firefox,那么请下载这个定制版:http://ifile.it/ay1zgp3

解压缩之后,Mozilla Firefox 3的目录下有一个tor目录,里面的执行文件就是Tor Portable,按照以上方式设置即可。该定制版的Firefox已经安装了FoxyProxy插件,默认已经为Youtube、Facebook、Twitter设定了"自动通过Tor访问"……

Firefox究竟好在哪里,请查阅这个链接的内容:http://bit.ly/4G4GAn

分享自由

当成功连接Tor(表现为主界面中的洋葱头变绿了)之后,就可以将自己的机器也变成bridge。

  1. 停止Tor服务(在主界面中按"Stop Tor"按钮);
  2. 点击"设置中继服务器"按钮;
  3. 在"Sharing"标签页中选择第三项"帮助用户访问Tor网络……";
  4. 在"网络"标签中,把"我的ISP阻挡了对Tor网络的连接"之前的对号去掉;
  5. 点击"确定"按钮关闭对话框;
  6. 退出Vidalia控制面板(记得也要在任务托盘中退出"Privoxy"程序),而后重新启动Vidalia(就是重新运行PortableTor.exe)——这时Windows可能会跳出一个对话框要求你为Tor程序解除防火墙禁止规则,确认即可。
  7. 成功连接Tor之后,点击"设置中继服务器"按钮,就可以看到对话框最低端"Let others access your bridge by giving them this line:"之下多了一行代码
    (例如:***.***.***.***:9001 0B8C4718CA87DA97C0673D3F73AAAD6FD80C953A)如下图所示:


这时,你的计算机也成了Tor网络中的一个bridge。你可以把"bridge ***.***.***.***:9001"这行代码(无需后面那一长串数字字母构成的字符串)拷贝粘贴给你的那些无法正常访问Tor的朋友,让他按照之前介绍的方法添加到他的网桥列表中,他就可以正常访问Tor了——因为他也有bridge了,而后他也可以将自己的机器变成bridge……如此生生不息。




2009年9月16日

被雷得外焦内嫩 - 我爱我的祖国各地群众自发朗诵



新白娘子传奇之洞房花烛版:

山东快书版:

伦敦音版:

绵羊音:

京剧版:

变形金刚版:

大师兄版:

杭州话版:

外星人版:

生产队版:  

山东版:

混搭版:

电视购物咆哮版:

小沈阳、葛优、易中天以及唐僧御弟:

吟诗事件记录曲:

超级玛丽版:

猥琐欠抽版:

18X:

2009年9月6日

醉舟网开发笔记

一、网址跳转
以下是.htaccess全文:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.zzhou\.net$ [NC]
RewriteRule ^(.*)$ http://zzhou.net/$1 [R=301,L]
RewriteRule ^(\w+)/(\w+)$ view.php?user=$1&sub=$2
RewriteRule ^(\w+)$ view.php?user=$1&sub=home
RewriteRule ^(\w+)/$ view.php?user=$1&sub=home

实现以下功能:
1、将www.zzhou.net自动跳转到zzhou.net


二、mysql字符集问题及其它
1、MySQL 字符集: UTF-8 Unicode (utf8)
2、建表是设定字符集utf8_unicode_ci,字段字符集为utf8_general_ci
3、要读写相关UTF8字段时:
    mysql_query("set names 'utf8' ");  
    mysql_query("set character_set_client=utf8");  
    mysql_query("set character_set_results=utf8");
    mysql_query("set character_set_connection=utf8");
4、设置自增变量
  先建表,然后修改结构,在AUTO_INCREMENT一项打勾。


三、表单检查
  <FORM ID='fm1' ACTION='adduser2.php' METHOD='post'> //将表单提交给adduser2.php
    用户名(英文与数字组合): <INPUT TYPE='TEXT' ID='uname' NAME='username' SIZE='20'>
<BR /><BR />
密码:       <INPUT TYPE='PASSWORD' ID='p1' NAME='pwd' SIZE='20'><BR /><BR />
重输入密码: <INPUT TYPE='PASSWORD' ID='p2' NAME='pwd2' SIZE='20'><BR /><BR />
昵称(可中文): <INPUT TYPE='TEXT' NAME='nick' SIZE='20'><BR /><BR />
图片地址: <INPUT TYPE='TEXT' NAME='pp' SIZE='80'><BR /><BR />
描述一下自己: <BR /><BR />
<TEXTAREA NAME="desc" COLS="80" ROWS="10"></TEXTAREA><BR /><BR />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<INPUT TYPE='BUTTON' NAME='sub' SIZE='30' VALUE='提  交' onClick='checkinput()'><BR /><BR /> //提交前先执行checkinput()
  </FORM>

  <script language="javascript">
    function checkinput()
{
 var flag1=/^[a-zA-Z0-9]{1,20}$/;  
 var tmp='';
 var ff=true;
      if (!flag1.exec(document.getElementById('uname').value)) //检查用户名输入有效性
 {
tmp='用户名只能是英语或数字, 长度1-20位!\n';
ff=false;
 }
 else
 {
ff=true;
 }
      var pwd=document.getElementById('p1').value;
 var pwd2=document.getElementById('p2').value;
 if (pwd !== pwd2)
 {
tmp=tmp+'两次输入的密码不一致!';
ff=false;
 }
 else
 {
 }  
 if (ff==true)
 {
   document.getElementById('fm1').submit(); //全部检查完结,则提交表单
 }
 else
 {
   alert (tmp);
 }
}

  </script>

从表单得到数据:
$user = $_POST['username']; 

在adduser2.php进一步检查用户名是否重复,如重复则提示信息将返回表单页面:
$tmp = "用户".$user2."已存在!";
$tmp = "<script language=javascript>alert ('" . $tmp . "')</script>";
echo $tmp;
echo ("<script language=javascript>window.history.go(-1);</script>"); 


五、建立SQL连接
  $link=mysql_connect("ip address","username","password"); //connect to mysql
  mysql_select_db('db name'); // connect to db  
  mysql_query("set names 'utf8' ");  
  mysql_query("set character_set_client=utf8");  
  mysql_query("set character_set_results=utf8");
  mysql_query("set character_set_connection=utf8");

  查询具体数据:
  $sql = "SELECT * FROM tb_list"; // select sql
  $result = mysql_query($sql);
  while ($user_data = mysql_fetch_array($result))  // get data from dataset array
  {
    $sub = $user_data['fl_subdomain']; // get 1 single data
  }

  检查结果集是否为空:
  $result = mysql_query($sql);
  $i = mysql_num_rows($result);
  if ($i == 0): //有数据

mysql_close($link);//关闭连接


六、cookie
设置cookie:
setcookie('usrid',(string) $userid);
setcookie('usr',$user);
setcookie('pwd',$pwd);

清除cookie:
  setcookie('usrid', "", time() - 3600);
  setcookie('usr', "", time() - 3600);
  setcookie('pwd', "", time() - 3600);  


七、根据查询结果创建动态元素
用类似document.getElementById('button_" . $sub . "').value == '显示'的方法创建动态java script脚本,然后用document.getElementById属性获得相应对象,修改相应的属性。

输入新在线文档的名称:

一、网址跳转
以下是.htaccess全文:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.zzhou\.net$ [NC]
RewriteRule ^(.*)$ http://zzhou.net/$1 [R=301,L]
RewriteRule ^(\w+)/(\w+)$ view.php?user=$1&sub=$2
RewriteRule ^(\w+)$ view.php?user=$1&sub=home
RewriteRule ^(\w+)/$ view.php?user=$1&sub=home

实现以下功能:
1、将www.zzhou.net自动跳转到zzhou.net


二、mysql字符集问题及其它
1、MySQL 字符集: UTF-8 Unicode (utf8)
2、建表是设定字符集utf8_unicode_ci,字段字符集为utf8_general_ci
3、要读写相关UTF8字段时:
    mysql_query("set names 'utf8' ");  
    mysql_query("set character_set_client=utf8");  
    mysql_query("set character_set_results=utf8");
    mysql_query("set character_set_connection=utf8");
4、设置自增变量
  先建表,然后修改结构,在AUTO_INCREMENT一项打勾。


三、表单检查
  <FORM ID='fm1' ACTION='adduser2.php' METHOD='post'> //将表单提交给adduser2.php
    用户名(英文与数字组合): <INPUT TYPE='TEXT' ID='uname' NAME='username' SIZE='20'>
<BR /><BR />
密码:       <INPUT TYPE='PASSWORD' ID='p1' NAME='pwd' SIZE='20'><BR /><BR />
重输入密码: <INPUT TYPE='PASSWORD' ID='p2' NAME='pwd2' SIZE='20'><BR /><BR />
昵称(可中文): <INPUT TYPE='TEXT' NAME='nick' SIZE='20'><BR /><BR />
图片地址: <INPUT TYPE='TEXT' NAME='pp' SIZE='80'><BR /><BR />
描述一下自己: <BR /><BR />
<TEXTAREA NAME="desc" COLS="80" ROWS="10"></TEXTAREA><BR /><BR />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<INPUT TYPE='BUTTON' NAME='sub' SIZE='30' VALUE='提  交' onClick='checkinput()'><BR /><BR /> //提交前先执行checkinput()
  </FORM>

  <script language="javascript">
    function checkinput()
{
 var flag1=/^[a-zA-Z0-9]{1,20}$/;  
 var tmp='';
 var ff=true;
      if (!flag1.exec(document.getElementById('uname').value)) //检查用户名输入有效性
 {
tmp='用户名只能是英语或数字, 长度1-20位!\n';
ff=false;
 }
 else
 {
ff=true;
 }
      var pwd=document.getElementById('p1').value;
 var pwd2=document.getElementById('p2').value;
 if (pwd !== pwd2)
 {
tmp=tmp+'两次输入的密码不一致!';
ff=false;
 }
 else
 {
 }  
 if (ff==true)
 {
   document.getElementById('fm1').submit(); //全部检查完结,则提交表单
 }
 else
 {
   alert (tmp);
 }
}

  </script>

从表单得到数据:
$user = $_POST['username']; 

在adduser2.php进一步检查用户名是否重复,如重复则提示信息将返回表单页面:
$tmp = "用户".$user2."已存在!";
$tmp = "<script language=javascript>alert ('" . $tmp . "')</script>";
echo $tmp;
echo ("<script language=javascript>window.history.go(-1);</script>"); 


五、建立SQL连接
  $link=mysql_connect("ip address","username","password"); //connect to mysql
  mysql_select_db('db name'); // connect to db  
  mysql_query("set names 'utf8' ");  
  mysql_query("set character_set_client=utf8");  
  mysql_query("set character_set_results=utf8");
  mysql_query("set character_set_connection=utf8");

  查询具体数据:
  $sql = "SELECT * FROM tb_list"; // select sql
  $result = mysql_query($sql);
  while ($user_data = mysql_fetch_array($result))  // get data from dataset array
  {
    $sub = $user_data['fl_subdomain']; // get 1 single data
  }

  检查结果集是否为空:
  $result = mysql_query($sql);
  $i = mysql_num_rows($result);
  if ($i == 0): //有数据

mysql_close($link);//关闭连接


六、cookie
设置cookie:
setcookie('usrid',(string) $userid);
setcookie('usr',$user);
setcookie('pwd',$pwd);

清除cookie:
  setcookie('usrid', "", time() - 3600);
  setcookie('usr', "", time() - 3600);
  setcookie('pwd', "", time() - 3600);  


七、根据查询结果创建动态元素
用类似document.getElementById('button_" . $sub . "').value == '显示'的方法创建动态java script脚本,然后用document.getElementById属性获得相应对象,修改相应的属性。

2009年8月30日

zzhou.net

做了一个个人网站zzhou.net醉舟。
醉舟是兰波的成名诗作,全文见:http://zzhou.net/zzhou.txt
醉舟网主要提供二级、三级域名跳转服务,注册用户可以得到类似zzhou.net/tallrain二级域名方式的个人页面,在页面上可以定义若干个次级目录链接,如zzhou.net/tallrain/news
每一个链接其实都是一次跳转,如zzhou.net/tallrain/news其实是跳转到http://dl.getdropbox.com/u/258641/tallrainrss.htm,但是zzhou.net/tallrain/news这个网址非常好记。
另外,在个人的页面上其实是列出了个人所建的所有链接,此外还包括一些文字录入的内容和好友链接等。
建这个网站主要是出于以下两点考虑:
1、国内的域名跳转一定要备案,非常不方便。
2、目前很流利短域名跳转,但是短域名产生的后缀字符都是随机产生的,不好记。而醉舟网的域名后缀是用户自定义的,好记。
希望对大家有用。

2009年8月13日

Delphi7处理XML

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,msxml,XMLIntf,XMLDoc;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  xmlDoc:IXMLDocument;
  trsnode, tmpnode, tmpnode2:IXMLNode;
  trnode: ixmlnodelist;
  m1,m2,l1,l2:string;
  fm, fl: boolean;
  i:integer;
begin

  xmlDoc := TXMLDocument.Create(nil);
  xmldoc.LoadFromFile('E:\bfcec\trans\ap\all.utf8.xml');
  xmldoc.Encoding:='utf-8';
  trsnode:=xmldoc.ChildNodes.FindNode('TranslationElements');
  trnode:=trsnode.ChildNodes;
  for i:= 1 to trnode.Count do
  begin
    m1:='';
    l1:='';
    m2:='';
    l2:='';
    fm:=true;
    fl:=true;

    try
      tmpnode:=trnode.Nodes[i-1].ChildNodes.FindNode('SourceLiterals');
      if tmpnode<>nil then tmpnode:=tmpnode.ChildNodes.FindNode('LiteralSet');
      if tmpnode<>nil then tmpnode:=tmpnode.ChildNodes.FindNode('MediumDescription');
      if tmpnode <> nil then m1:=tmpnode.Text;
    except
      m1:='';
    end;

    try
      tmpnode:=trnode.Nodes[i-1].ChildNodes.FindNode('TargetLiterals');
      if tmpnode<>nil then tmpnode:=tmpnode.ChildNodes.FindNode('LiteralSet');
    except
      m2:='';
      fm:=false;
    end;

    try
      if tmpnode<>nil then tmpnode2:=tmpnode.ChildNodes.FindNode('MediumDescription');
      if tmpnode2<>nil then m2:=tmpnode2.Text;
      if tmpnode2=nil then tmpnode.AddChild('MediumDescription');
    except
    end;

      m1:=trim(m1);
      m2:=trim(m2);
      if (m1<>'') and (m2='') and fm then
      begin
       //if tmpnode = nil then trnode.Nodes[i-1].ChildNodes.FindNode('TargetLiterals').ChildNodes.FindNode('LiteralSet').AddChild('MediumDescription');
       trnode.Nodes[i-1].ChildNodes.FindNode('TargetLiterals').ChildNodes.FindNode('LiteralSet').ChildNodes.FindNode('MediumDescription').Text:=m1;
      end;

    try
      tmpnode:=trnode.Nodes[i-1].ChildNodes.FindNode('SourceLiterals');
      if tmpnode<>nil then tmpnode:=tmpnode.ChildNodes.FindNode('LiteralSet');
    except
      l1:='';
    end;

    try
      if tmpnode<>nil then tmpnode2:=tmpnode.ChildNodes.FindNode('LongDescription');
      if tmpnode2<>nil then l1:=tmpnode2.Text;
      if tmpnode2=nil then tmpnode.AddChild('LongDescription');
    except
    end;

    try
      tmpnode:=trnode.Nodes[i-1].ChildNodes.FindNode('TargetLiterals');
      if tmpnode<>nil then tmpnode:=tmpnode.ChildNodes.FindNode('LiteralSet');
      if tmpnode<>nil then tmpnode:=tmpnode.ChildNodes.FindNode('LongDescription');
      if tmpnode<>nil then l2:=tmpnode.Text;
    except
      l2:='';
      fl:=false;
    end;

    
      l1:=trim(l1);
      l2:=trim(l2);
      if (l1<>'') and (l2='') and fl then
      begin
       //if tmpnode=nil then trnode.Nodes[i-1].ChildNodes.FindNode('TargetLiterals').ChildNodes.FindNode('LiteralSet').AddChild('LongDescription');
       trnode.Nodes[i-1].ChildNodes.FindNode('TargetLiterals').ChildNodes.FindNode('LiteralSet').ChildNodes.FindNode('LongDescription').Text:=l1;
      end;

  end;
  xmldoc.SaveToFile('E:\bfcec\trans\ap\all.out.utf8.xml');
  xmldoc:=nil;
  showmessage('done');
end;

end.