GWA2写日志的两种方法setBy和debug

在新近的一次GWA2(吉娃兔)的部署中,被问到在GWA2中是否有类似Logger的类用来写日志的。答案是有的。

我看了一下现有的代码,大概有两种方法可以实现写日志。

1. setBy $hm_result = $webapp_instance->setBy(‘file:’, $arrayArgs); setBy 进一步地根据 file: 设置将处理转交给 WebApp::writeObject, writeObject实现对文件的操作。 $arrayArgs的写法为: $arrayArgs = array(‘target’=>’/path/to/file’, ‘islock’=>false, ‘isappend’=>true, ‘content’=>”what needs to be written to file or log.”); 返回值为HashMap,成功或者失败+原因.

2. debug debug是全局可访问方法,debug本身也具有写入文件的功能, 用法为: debug($message, ‘something_tag’, ‘file:/path/to/file’); 这样就将$message的内容写入指定的日志文件中去,同时在file的文件名部分自动追加日期,在message消息体自动追加时间戳和日志标记(如something_tag).

相比较而言,debug更适合用来写日志。 debug的设计之初也是用来调试的。debug还支持其他丰富的调用。在输出时,不但支持指定文件 file: , 还支持在后台、在页面前端等各种方式。对日志内容描述也有更丰富的信息,如调用 debug_backtrace, 将HashMap对象遍历,将其他Object进行序列化等。  

发表在 -GWA2, 编程技术, 计算机技术 | 标签为 , , , , | 留下评论

冰糖雪梨膏儿童宝宝砀山慈梨膏汽車老司機車載書中自有黃金屋医疗器械鱼跃

-GWA2 Java版本的i18n/中文编码/乱码问题

本篇问题域被定义为 -GWA2-吉娃兔)的 -Java 版本的多语言的编码/乱码问题,也包括中文的编码和乱码问题。当然,也具有普遍意义,包括所有Java/JSP应用的中文编码、乱码问题。

gwa2-logo-201606.v2.png (300×300)

这次距离上次写Blog间隔的时间较长,主要是由于发布 -GWA2 Java版本占用了大量的业余时间(包括熬夜),所以拖了一些时间,中间的探索过程(如对反射、序列化的相关思考和实验)还是有值得记录的地方,今后慢慢整理。其中之一就是Java的字符编码,或者再收窄成Java应用的中文字符乱码问题。 网上搜索Java中文乱码的帖子有很多,包括我自己几年前也写作过,如在2009-12-10 17:05:14发布的“

javac编译java文件乱码的解决方案

”贴文和2014 年 11 月 21 日的“

中文编码杂谈

”,谈了在一个Java实现的游戏项目中的中文编码问题及相关方面的知识和问题,这次之所以重新谈,是立场发送了改变,不只是解决问题,而是以更好的方式解决问题——极力避免将宝贵的计算资源用在字符转码上,尽量不在应用代码成使用字符转码的方法,不做字符转码的事情。 要这样做就是创造统一的运行时环境,包括输入与输出,Java源码的i18n的编码是unicode,我们选择的统一的运行时字符编码是UTF-8. 要实现这一目标设计到Webserver(App container)、Java类、JSP、HTTP和数据库后台、HTML前端等,下面分别记录,以形成可供参考的文档。

0. Java虚拟机启动时(Webserver、App container等) 在命令行带入指定字符编码的启动参数 -Dfile.encoding=UTF8

1. JSP文件页面头部时 设置JSP页面的语言及编码 <%@page language=”java” pageEncoding=”UTF-8″%> 很多时候,要求这个语句放JSP文件的第一行.

2. JSP初始化运行时 加入对语言环境变量的指定,调用设置语句 System.setProperty(“sun.jnu.encoding”, “UTF-8”); System.setProperty(“file.encoding”, “UTF-8”); request.setCharacterEncoding(“UTF-8”);

3. JSP对输出内容做字符编码控制 response.setCharacterEncoding(“utf-8”); response.setContentType(“text/html;charset=utf-8”);

4. 输出内容编码的指定 如果输出的是HTML或者XML需要在相应的文档里显示地声明字符编码是UTF-8, 如在HTML中 <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/> 或者在XML中

 <?xml version="1.0" encoding="UTF-8"?>

经过上述7个步骤的设置,基本的UTF-8环境应该已经统一起来了。然而,如果内容来自数据库(以MySQL为例),字符编码仍然是个不小的问题。如果是这样,需要在JAVA连接数据库时和进行读写时进行相应的操作。当然前提是,数据库及数据表也是UTF-8的编码。 基本上可以确定,读写数据库,如果不进行字符转码且操作正常,需要在如下四个方面取得高度地一致。 Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 对应地在JSP中进行补救的相应措施包括:

5.  连接数据库时 在JDBC等驱动加载时,增加字符编码指定参数 setCharacterEncoding=utf8 在进行创建连接进行查询时,首先执行SQL语句 set names ‘utf8’ 经此6个方面的设置,大致成了。

-GWA2 是 General Web Application Architecture, 通用网络应用(软件程序)架构,也提供了 -PHP 对应的版本。 utf8   附记及扩展:

What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text / 每个程序员都需要绝对、积极地知道一些文本编码和字符集的事情

发表在 -GWA2, 服务器运维, 编程技术, 计算机技术 | 标签为 , , , , , , | 3条评论

显白黑茶色蓝黑色板栗色三元牛奶李宁体育用品汽車老司機

在MS Edge微软浏览器中启用 –自然域名 ( -NatureDNS )

-NatureDNS服务增加了对安全HTTP的支持,也既可以提供基于 HTTPS的 –自然域名 服务。如此以来,可以满足在MS Edge(微软视窗浏览器第十二版,也即 MS Edge浏览器)下设置 –NatureDNS 为默认搜索服务。主要操作过程记录如下。

1.  打开微软Edge浏览器,Windows 10以后为系统默认浏览器,取代 MSIE 11;

ms edge

2. 在 MS Edge使用 https://ufqi.com/naturedns 访问自然域名,注意是https的访问协议;

-ufqi-naturedns

3. 使用 HTTPS 访问 –自然域名 首页,会看到浏览器地址栏内的锁头标记,表示通信是加密和安全的。 点击页面右上角的“设置当前浏览器”;

naturedns

4. 点击浏览器右上角的菜单栏内的“…”按钮,进一步地选择“Settings” “设置”

ms edge

5. 在设置中,下翻页,找到“View Advanced settings(查看高级设置)”

ms edge default search engine

6. 在高级设置中进一步的下翻页,找到 “Search in the address bar with(在地址栏内搜索使用)”,点击下面的“Change(修改)”;

ms edge default search engine

7. 在打开的”Change search engine”的对话框中,选择“-ufqi-naturedns(discovered)”, 然后进一步的选择下面的“Set as default(设置为默认)”,然后即可生效;

如果没有自动出现“-ufqi-naturedns”的选项,请页面刷新  https://ufqi.com/naturedns ,然后重新启动浏览器即可发现该选项。

ms edge default search engine

另外在主流浏览器中设置 -自然域名 -NatureDNS 的系列:

Chrome浏览器使用-自然域名-NatureDNS设置方法, -R/U2SJ

Firefox浏览器使用-自然域名-NatureDNS的设置方法,  -R/X2SM

-NatureDNS 自然域名浏览器支持设置程序简化,  -R/h2Tf 

发表在 -NatureDNS/-自然域名, 计算机技术 | 标签为 , , | 留下评论

插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板書中自有顔如玉冰糖雪梨膏儿童宝宝砀山慈梨膏汽車老司機車載

-GWA2新增命令行运行及NO_SQL_CHECK支持

使用中的框架才会被进化。

-GWA2 在实际部署和应用中遇到新需求,于是就增加新功能,如下两个:1)新增命令行运行模式支持;2)新增对NO_SQL_CHECK的支持,分述如下,备忘。

1. GWA2 新增对命令行运行模式的支持
如果使用-GWA2的PHP实现,可以在某些情况下,需要在PHP的命令行(command line)模式下执行某些任务程序,如下是需求场景。
有 /?mod=abc&act=read 的程序,Web访问是
http://domain/path/?mod=abc&act=read

这样可以获得程序的执行,取得预期的结果返回。这一情况是远程的,需要Web Server接转,然后交给 Mod_PHP或者FastCGI给PHP解释器去执行,然后再将结果返回给Web Server,Web Server进一步地返回给用户。这显然有点绕,如果PHP处理的业务逻辑是在后台的某项计算。应景的,就是让PHP的脚本直接在后台执行,例如,
/usr/local/php/bin/php -c /www/bin/php/php.ini “/path/index.php” “?mod=abc&act=read&fmt=json”

就可能直接和快很多,而且有些时候,Web Server和(或)Mod_PHP或FastCGI都有执行时长的限制,这对某些需要耗时的程序也不利,于是就想法设法,让基于 -GWA2 写的脚本程序,既可以在浏览器中执行,也可以通过PHP脚本执行,事情就这样成了。

主要改动是在入口程序,对于PHP 命令行的调用,构建一些基本的$_SERVER变量出来。如此以来,一段脚本程序,既可以在web上被访问,也能够在本地通过命令行来执行,也即,
http://domain/path-to-webapp/index.php?mod=abc&act=efg
shell> php “/path-to-webapp/index.php” “?mod=acd&act=efg”

2) 对NO_SQL_CHECK的支持
-GWA2 在设计时,考虑了对SQL Injection的规避,所有对每次SQL的拼接和执行,都做安全性检测,但有时候,限于Java或者PHP程序本身的问题,如
<?php

$idArr = “1, 2, 3, 4”;

$db = new MySQLi();
$bad_stmt = $db->prepare(SELECT `idAsLetters` FROM `tbl` WHERE `id` IN(?));
$bad_stmt->bind_param(“s”, $idArr);
$bad_stmt->bind_result($ias);
$bad_stmt->execute();
?>
就不能参数预期结果,取而代之的是会将整个 $idArr 视为一个 String,而不是一个list.
反向的,如果我们不这样做,而是将 id list直接放入SQL中,不使用bind_param进行变量的代入,在一些情况下也能够通过。

然而,如果where语句进一步的复杂成 where url in (URL_LIST)时,URL中可能包括?,这个字符在-GWA2的SQL检查中会被视为是待替换变量,会由此在运行时变量容器hmf中进行查找对应的参数,显然找不到,于是就会触发错误。

有鉴于此,我们在 $_CONFIG中增加了:
$conf[‘no_sql_check’] = ‘omit_sql_security_check’; # keep original form of sql in some cases, 14:24 Friday, May 20, 2016, refer: http://php.net/manual/en/mysqli-stmt.bind-param.php, “2 asb(.d o,t )han(a t)n i h e i(d.o_t)dk ¶”

当访问时,设置某个$obj为临时不检查SQL时(SQL检查前置),这不对SQL做进一步的检查,从而略过这一步骤,如

$obj->set($_CONFIG[‘no_sql_check’], true); # omit sql check
$sql = ‘select * from ‘.$obj->getTbl().’ where url in (‘.$tmpStr.’)’;
$result = $obj->execBy($sql, null);
$obj->set($_CONFIG[‘no_sql_check’], false); # restore it as check

gwa2-logo-201606

 

发表在 -GWA2, 计算机技术 | 标签为 , , , | 2条评论

冰糖雪梨膏儿童宝宝砀山慈梨膏汽車老司機車載書中自有黃金屋医疗器械鱼跃

gwa2更新多数据库驱动支持

gwa2-dba-arch-201605-v2

-GWA2 在设计时,预留了对多个数据持久化的支持,其中就包括多个数据库及其驱动的支持接口,但一直没实现。一时总是瞎忙,再就是驱动不足,LAMP作为一种雷打不动的成熟解决方案,已经运行好多年,有好些成功的cases。

但最近还是老革命遇上新问题了,一个驱动之一就是 -PHP 7.0+决绝地丢掉了MySQL的相关类库,使用MySQLi这个新款的驱动类库,另外还备选了PDO作为支持。

按说这也不是难事,之前的 mysql.class 只要稍作修改就能够支持变更为对 mysqli 的支持。但如果两个并存呢? 就需要在程序里做很多判断,如果是mysql就用mysql, 如果是mysqli就用mysqli, 这样也能,而且我们能发现类似的判断在 -discuz 论坛的源码中。 但这样明显的不足是,会牺牲性能,每次执行查询都做一次多次判断,然后是不必要的耗费,需要改进。

解决办法就是两个驱动并存,那就是如前文所述,要正儿八经地实现 -GWA2 之前的设计了。一种思想思路是在 -GWA2 的数据库管理员(DBA.class)中,根据项目的配置文件所指定,加载定向的数据库驱动。其代码逻辑如下:

gwa2-dba-construct

具化到一个WebApp,其运行环境和所需后台的数据库总是明确和一定的,此时在 config.class中予以指定, 然后在 Object进行实例化时,即可加载相应的数据库驱动。每一个实现了 DBA指派功能的数据库驱动,都需要根据要求实行最基本和常用的 select (read) 和 update (write)功能。

这样就实现了该设计。根据题图,每个对象会有实例,根据对象的实例不同,可能调用文件系统、数据库系统后者API读写接口等外部联系,其中数据库接口有数据库管理员调配各种数据库驱动,以实现对不同数据库的读写。

—- —- —- —-

2016-07-04 Update.

讲清这件事不太容易,刚好在移植和实现 GWA2 Java版本的时候,有个过程Snap shot,用来说明这个设计,该是合适的,如下图,读取数据库的一个流程。

gwa2-file-layers-diagram-201607

发表在 -GWA2, 编程技术, 计算机技术 | 标签为 , , , | 6条评论

李宁体育用品汽車老司機愛自己悅己容2nd插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板

自然域名:-帝测科技 及其层级

180702_DSCxs0082xfJPGx

传统 .com 域名有点复杂,直接使用自然域名( -NatureDNS )就简单了: -帝测科技  , 有渠道的亲请转送。

有兴趣? 再试试  -帝测科技-股票   , 或者  -股票-帝测科技  . 股票代码也不好记。

没看错,未来的品牌传播,就这样简单,前面加上“链接到”的符号即可 “-”直达目标 。

网址记不住,地址记不住,电话记不住,股票代码记不住,都没有关系,记住品牌,其他纷至沓来。

还如:

-people

-教育部

-网信办

-weibo

关于自然域名的层级问题,我们曾在

关于带有连字符hyphen名称注册自然域名NatureDNS ( -R/b2Tf  )

的文档中做过讨论。认为:“一种思考和规划是,-derby 这样的顶级域名,当属于其行政主管机关,或者由其授权给运营者,然后负责 -derby 下的各种域名,然后分给当地大学的,就是 -derby-university .

类似地, -university 则应该在名义上归属于 大学联合会的组织,由其运营或者委托其他机构运营,该受托机构负责分配 -university-derby 给大学 the University of Derby .”

 

发表在 -NatureDNS/-自然域名, 计算机技术 | 留下评论

山羊绒围巾女冬英伦百搭围脖双面格子加厚保暖披肩迪士尼母婴显白黑茶色蓝黑色板栗色三元牛奶