61阅读

我个人对炒纸黄金的一些经验总结-水培的一些个人经验--绿藻的问题

发布时间:2017-10-27 所属栏目:水培

一 : 水培的一些个人经验--绿藻的问题

有过水培经历的朋友也许都遇上过,许多资料都说这东西对水培植物有害,可我的经验是适当的绿藻有利于水培植物的生长。

用透明容器水培如果光线比较强或者有阳光直射都会长绿藻,要想避免长绿藻一定不能让阳光照到水。不过如果绿藻没有长成棉状,只是在瓶壁和根上有些绿色的东西那倒是对植物生长有利。

 水培的一些个人经验--绿藻的问题

不知大家注意过没有,整团的绿藻在阳光下能产生小气泡,这就是绿藻产生的氧气,在植物生长最旺盛大量消耗氧气的白天能有这样天然的氧气供应一定是件好事,而晚上绿藻虽然也消耗氧气可那时植物对氧的消耗也减少了。

所以我的经验是适当的生长绿藻对植物的生长有利,对小天使、吊兰来说很好的保证了植株不烂根。只是不要让绿藻长得太疯,过一段时间做一些必要的清洗,擦去玻璃瓶上的绿藻,并对根做适当的冲洗。

当然用玻璃瓶来水培长了绿藻影响美观,不过这东西要是长上了想彻底清除还真是困难,既然它有这样的好处也算一点点安慰吧。

二 : SQL Join的一些总结

1.1.1 摘要

Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等。[www.61k.com]如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join具体联接表或函数进行查询的特性

本文将通过具体例子介绍SQL中的各种常用Join的特性和使用场合:

目录

  • Inner join
  • Outer join
  • Cross join
  • Cross apply
  • Cross apply 和 Inner join的区别
  • Semi-join和Anti-semi-join

1.1.2 正文

首先我们在tempdb中分别定义三个表College、Student和Apply,具体SQL代码如下:

USE tempdb ---- If database exists the same name datatable deletes it. IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'College') DROP TABLE College; IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Student') DROP TABLE Student; IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Apply') DROP TABLE Apply; ---- Create Database. create table College(cName nvarchar(50), state text, enrollment int); create table Student(sID int, sName nvarchar(50), GPA real, sizeHS int); create table Apply(sID int, cName nvarchar(50), major nvarchar(50), decision text);

Inner join

内联接(Inner join)是最常用的联接类型之一,它查询满足联接谓词的数据。

假设我们要查询申请表Apply中申请学校的相关信息,由于Apply表中包含学校名字我们并不能预知,所以我们可以根据cName来内联接(Inner join)表College和Apply,从而找到Apply表中包含学校的信息。

具体SQL代码如下:

---- Gets college information from college table ---- bases on college name. SELECT DISTINCT College.cName, College.enrollment FROM College INNER JOIN  Apply ON College.cName = Apply.cName

join SQL Join的一些总结

图1查询结果

cNamestateenrollment
StanfordCA15000
BerkeleyCA36000
MITMA10000
CornellNY21000
HarvardMA29000

表1 College表中的数据

如上图1所示,我们把Apply表包含的学校信息查询出来了,由于Harvard并没有被查询出来,所以我们知道暂时还没有学生申请Harvard。

内联接(Inner join)满足交换律:“A inner join B” 和 “B inner join A” 是相等的。

Outer join

假设我们想看到所有学校信息;即使是那些没有申请的学校(如:Harvard),这时我们可以使用外部联接(Outer join)进行查询。由于外部联接保存一个或两个输入表的所有行,即使无法找到匹配联接谓词的行。

具体SQL代码如下:

---- Gets all college information SELECT College.cName, College.state, College.enrollment, Apply.cName, Apply.major, Apply.decision FROM College LEFT OUTER JOIN  Apply ON College.cName = Apply.cName

join SQL Join的一些总结

图2左联接查询结果

如上图3所示:由于在Apply表中并没有学生申请Harvard,但是我们通过左联接(left outer join)把所有学校信息查询出来了。

由于左联接(left outer join)产生表College的完全集,而Apply表中匹配的则有值,而不匹配的则以NULL值取代,所以我们知道Apply表中没有学生申请Harvard。

通过左联接查询我们可以获取College的完全集,假设现在我们既要获取College的完全集又要获取Apply的完全集,那么我们可以考虑使用完整外部联接(full outer join)。使用完整外部联接,我们可以查询所有的学校,不管它们是否匹配联接谓词:

---- Gets all information from college and apply table. SELECT College.cName, College.state, College.enrollment, Apply.cName, Apply.major, Apply.decision FROM College FULL OUTER JOIN  Apply ON College.cName = Apply.cName

join SQL Join的一些总结

图3 完整外部联接查询结果

现在我们获取了College和Apply的完全数据集,对于表中匹配的则有值,即使没有找到匹配cName的则以NULL值取代。

下表显示每种外部联接(outer join)匹配时保留数据行的情况:

扩展:sql join / sql left join / sql join的用法

联接类型

保留数据行

A left outer join B

all A rows

A right outer join B

all B rows

A full outer join B

all A and B rows

表2 外部联接保留数据行

完整外部联接(full outer join)满足交换律:“A full outer join B” 和 “B full outer join A” 是相等的。

Cross join

交叉联接(cross join)执行两个表的笛卡尔积(就是把表A和表B的数据进行一个N*M的组合)。也就是说,它匹配一个表与另一个表中的每一行;我们不能通过使用ON子句在交叉联接指定谓词,虽然我们可以使用WHERE子句来实现相同的结果,这是交叉联接基本上是作为一个内部联接了。

交叉联接相对于内部联接使用率较低,而且两个大表不应该进行交叉联接,因为这将导致一个非常昂贵的操作和一个非常大的结果集。

具体SQL代码如下:

---- College Cross join Apply. SELECT College.cName, College.state, College.enrollment, Apply.cName, Apply.major, Apply.decision FROM College CROSS JOIN Apply
join SQL Join的一些总结

图4 College表和Apply表的行数

join SQL Join的一些总结

图5 交叉联接

现在我们对College和Apply表进行交叉联接,而且生成数据行为College和Apply表行数的笛卡尔积即5 * 20 = 100。

Cross apply

在SQL Server 2005中提供了Cross apply使表可以和表值函数(table-valued functions TVF‘s)结果进行join查询。例如,现在我们想通过函数的结果值和表Student进行查询,这时我们可以使用Cross apply进行查询:

---- Creates a function to get data from Apply base on sID. CREATE FUNCTION dbo.fn_Apply(@sID int) RETURNS @Apply TABLE (cName nvarchar(50), major nvarchar(50)) AS BEGIN  INSERT @Apply SELECT cName, major FROM Apply where [sID] = @sID  RETURN END  ---- Student cross apply function fn_Apply. SELECT Student.sName, Student.GPA, Student.sizeHS, cName, major FROM Student CROSS APPLY dbo.fn_Apply([sID])

我们也可以使用内部联接实现和Cross apply相同的查询功能,具体SQL代码如下:

---- Student INNER JOIN Apply bases on sID. SELECT Student.sName, Student.GPA, Student.sizeHS, cName, major FROM Student INNER JOIN [Apply] ON Student.sID = [Apply].sID

join SQL Join的一些总结

图6 Cross apply查询

Outer apply

在介绍Cross apply和Outer join之后,现在让我们理解Out apply也就不难了,Outer apply使表可以和表值函数(table-valued functions TVF‘s)结果进行join查询,找到匹配值则有值,没有找到匹配值则以NULL表示。

---- Student outer apply function fn_Apply. SELECT Student.sName, Student.GPA, Student.sizeHS, cName, major FROM Student OUTER APPLY dbo.fn_Apply([sID])
join SQL Join的一些总结

图7 Outer apply查询

Inner Join和Cross apply的区别

首先我们知道Inner join是表和表的联接查询,而Cross apply是表和表值函数的联接查询,在前面Cross apply例子中,我们也可以通过Inner join实现相同的查询。

---- Student cross apply function fn_Apply. SET STATISTICS PROFILE ON SET STATISTICS TIME ON SELECT Student.sName, Student.GPA, Student.sizeHS, cName, major FROM Student CROSS APPLY dbo.fn_Apply([sID]) SET STATISTICS PROFILE OFF SET STATISTICS TIME OFF
---- Student INNER JOIN Apply base on sID. SET STATISTICS PROFILE ON SET STATISTICS TIME ON SELECT Student.sName, Student.GPA, Student.sizeHS, cName, major FROM Student INNER JOIN [Apply] ON Student.sID = [Apply].sID SET STATISTICS PROFILE OFF SET STATISTICS TIME OFF

Cross apply查询执行时间:

CPU 时间= 0 毫秒,占用时间= 11 毫秒。

Inner join查询执行时间:

CPU 时间= 0 毫秒,占用时间= 4 毫秒。

join SQL Join的一些总结

图8 执行计划

如图8所示:Cross apply首先执行TVF(table-valued functions),然后对表Studnet进行全表扫描,接着通过遍历sID查找匹配值。

Inner join对表Student和Apply进行全表扫描,然后通过哈希匹配查找匹配的sID值。

通过以上的SQL执行时间和执行计划,我们能不能说Inner join比Cross apply好呢?答案是否定的,如果表的数据量很大,那么Inner join的全表扫描耗费时间和CPU资源就增加了(可通过数据量大的表进行测试)。

虽然大多数采用Cross apply实现的查询,可以通过Inner join实现,但Cross apply可能产生更好的执行计划和更佳的性能,因为它可以在联接执行之前限制集合加入。

扩展:sql join / sql left join / sql join的用法

Semi-join和Anti-semi-join

Semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询(查找到匹配的数据行就返回,不再继续查找)。

Anti-semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询,然后返回不匹配的数据。

不同于其他的联接运算,Semi-join和Anti-semi-join没有明确的语法来实现,但Semi-join和Anti-semi-join在SQL Server中有多种应用场合。我们可以使用EXISTS子来实现Semi-join查询,Not EXISTS来实现Anti-semi-join。现在让我们通过具体的例子说明吧!

假设要求我们找出Apply和Student表中sID匹配的学生信息,这和前面的Inner join查询结果将一样,具体SQL代码如下:

---- Student Semi-join Apply base on sID. SELECT Student.sName, Student.GPA, Student.sizeHS ----[Apply].cName, [Apply].major FROM Student WHERE exists (  SELECT *  from [Apply]  where [Apply].sID = Student.sID )

我们发现常用的EXISTS子句,原来是通过Left Semi Join实现的,所以说Semi-join在SQL Server中又许多使用场合。

join SQL Join的一些总结

图9 查询结果

join SQL Join的一些总结

图10 执行计划

现在要求我们找出还没有申请学校的学生信息,这时我们立刻反应可以使用NOT EXISTS子句来实现该查询,具体SQL代码如下:

---- Gets student still not apply for school. SELECT Student.sID, Student.sName, Student.GPA, Student.sizeHS ----[Apply].cName, [Apply].major FROM Student WHERE NOT EXISTS (  SELECT *  FROM [Apply]  WHERE [Apply].sID = Student.sID )

其实,我们常用的NOT EXISTS子句的实现是通过Anti-semi-join,通过执行计划我们发现在查找匹配sID时,SQL使用 Left Anti Semi Join进行查询。

join SQL Join的一些总结

图11 查询结果

join SQL Join的一些总结

图12 执行计划

1.1.3 总结

本文介绍了SQL中常用了联接查询方式:Inner join、Outer join、Cross join和Cross apply的使用场合和特性。

系列博文导航

  • Deadlock的一些总结
  • SQL Transcation的一些总结

参考

  • http://blogs.msdn.com/b/craigfr/archive/2006/07/19/671712.aspx

SQL代码

  • http://files.cnblogs.com/rush/Sample.rar

扩展:sql join / sql left join / sql join的用法

三 : H8 一些总结

刚接触Android,做项目的时候遇到了很多问题,有些是不知道安卓本身就有这个功能,有些是对于一些问题的处理没有经验。(www.61k.com]下面这些问题有的是自己在工作中遇到的,有些是身边同事遇到的,分析不一定是对的,但是在项目中这些问题就是按下面所描述的来处理的,现在写出来做下记录,方便自己,方便他人。

1、为了提升进模块的速度,在主入口的onCreate方法里面做的工作越少越好,尽量只做与更新UI相关的工作,其它的工作延后处理,像判断是否为第一次进入模块这种不能延后处理的,应该考虑程序的运行效率,可以通过判断这个文件是否存在的方式来判断是否为第一次进入,因为第一次进入模块时,保存进模块记录的配置文件是一个从无到有的过程,判断文件是否存在的效率会优于读取文件的效率。

2、libproject不能直接进行单元测试,可以借助于对调用该project的工程进行单元测试来测试libproject。

3、Eclipse中出现如下图所示不明字符时,在Window->Preferences->General->Editors->Text Editors->去掉show whitespace characters然后Apply就可以了。

4、保存配置文件的操作最好在onPause()方法完成,不要在onDestory()和onStop()方法中实现;具体可以参考android官方例程中的NotePad,它保存文件都是在onPause方法中实现的,关于Activity在各种情况下的回调方法的调用关系,可以看一下下面这两篇文章:
(1)Android-Activity详解与汇总:
(2)Android Activity类应用技巧分享:http://yangguangfu.iteye.com/blog/677240

5、完全退出一个进程需要一定的时间,在结束一个进程时,需要处理在退出后又快速进入这个进程的情况,还有需要确保在Activity onDestory的结束动画播完之后再调用结束进程的方法,不然会出现屏闪的情况,建议在退出进程时做类似于如下处理方式的处理:

6、对于静态类或者单例模式的类,应该将构造函数私有化,禁止外部将其实例化。安卓源码中很多静态类都做了类似的处理,比如TextUtils:

7、使用StarUML对代码进行逆向转换成类图时,StarUML对于代码中有的符号不识别会导致相应的类逆向失败,比如“<”,将这些不识别的符号替换掉或者删除逆向才能成功。

8、在初始化ViewPager时,应先给Adapter初始化内容后再将该adapter传给ViewPager,如果不这样处理,在更新adapter的内容后,应该调用一下adapter的notifyDataSetChanged方法,否则在ADT22以上使用会报The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged的异常,具体原因可参考:http://stackoverflow.com/questions/16756131/fragmentstatepageradapter-stopped-working-after-updating-to-adt-22

9、自定义控件时,在onDraw和move方法里面不能做过多的工作,和小系统相比,安卓的画图操作效率本来就不怎么高,对于这种频繁更新视图的方法里,一是要精简代码,二是要减小刷新区域。在写描红控件的过程中,从数据中取出来的每个字的字模都是成千上万个点的信息,这种显然不能在onDraw里直接操作,可以通过为画布设置一张图片,然后将点信息存放在画布上,在onDraw方法里只需要显示为这块画布设置的图片就可以了,具体操作类似于如下代码:

10、在退出使用ViewPager的界面时,记得在退出之前调用其removeAllViews方法,避免频繁进出该界面时内存不断上涨;

11、对于单个应用占用内存较多容易导致内存不足时,可以考虑按功能将该application的各界面分成多个进程来处理,从而分担主进程的内存压力。但是要记住一点,进程之间是不共享数据的。

12、当有多个属性决定排序的情况时,可以考虑将各个属性数值化,然后按照各参数的优先级对各个参数划分成不同的数量级,最终将每个需要排序的项的各个属性转化成一个待排序的数据(权值),排序只针对这个数值进行排序,就不用在排序的时候考虑那些复杂的规则了,这样在需求有变动时也好处理,只需要根据排序的规则为不同的属性值调整优先级,不需要修改排序的算法了。

13、在自定义控件时,三个构造函数都要定义,这样无论在xml文件还是在代码中都能正常使用了,如果只定义仅带Context的构造函数,会导致该控件在xml文件中使用时程序运行时异常。

14、在一个类里建议最多使用两个线程(在一本书上看到的,具体哪本搞忘了),线程太多了太难管理了,过多的线程时,只要稍管理不到位,就会出现很多随机问题,用线程锁也会有效率的问题。

15、对于一个类,需要满足不同的需求时,在初始化时,需要接收的入参也不一样,一般都是通过重载初始化的方法来满足各个调用者的需求,为了简化代码,可以考虑构建器来实现这种多个可选参数的情况,具体可以参考《Effective Java》一书的第二条“遇到多个构造器参数时要考虑用构建器”或者android源码中的AlertDialog类,它通过构建一个内部静态类Builder来降低代码的冗余。

如果你觉得上面的这些没啥营养,那就给你推荐点有营养的吧:
1、资源检索:百度网盘真的很不错,只要有一个百度账号,下载电子书什么的都是免费的。这个搜索引擎可以搜索出多数你需要的资源:http://so.baiduyun.me/
顺便分享一下我在百度网盘的资源,几十G的电子书:http://pan.baidu.com/share/link?shareid=249850146&uk=973539797
这些书有些我还是在看的,不要说我只会屯资源。大家也可以注册一个玩玩,挺方便的。
2、资源:
(1) Android开发者必知的开发资源:                
(2)(不断更新)每个程序员都应该知道的那些事儿:   http://geek.csdn.net/news/detail/1566
(3) Junit测试驱动开发:                         http://wenku.baidu.com/course/view/d9d776a20029bd64783e2c00

扩展:jxl的一些总结 / ps学习的一些总结 / 总结了一些经验不足


(4) ANT使用全攻略:        http://wenku.baidu.com/course/view/dd2cbd64783e0912a2162a00
(5) stack overflow:        http://stackoverflow.com/
(6) mobile tuts+:         http://mobile.tutsplus.com/category/tutorials/android/
(7)《The Busy Coder's Guide to Android Development》: http://pan.baidu.com/share/link?shareid=525553&uk=3810048654
(8) 直接拿来用!最火的Android开源项目(完结篇):  http://www.csdn.net/article/2013-05-21/2815370-Android-open-source-projects-finale/1
(9) InfoQ:          http://www.infoq.com/cn/

3、工具:
(1)快捷键管理工具Auto HotKey,找目录、开软件不用老用鼠标点来点去了:

(2)如果你还想进一步提高你的工作效率,推荐使用Total Commander,不过这需要一定的学习成本,需要学习一段时间才能熟练使用,我尝试两三次了,现在只能做一些基本的操作。

扩展:jxl的一些总结 / ps学习的一些总结 / 总结了一些经验不足

本文标题:我个人对炒纸黄金的一些经验总结-水培的一些个人经验--绿藻的问题
本文地址: http://www.61k.com/1104315.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1