2012年11月29日星期四

男性保健:饮食习惯大整顿做个好爸爸【3】

男性保健:饮食习惯大整顿做个好爸爸【3】

  很多年来一般都是很关注孕妇和胎儿生长发育与饮食的关系,男性的饮食从来都是不是人们关注的范畴,最近,美国一项新研究成果表明:男性饮食与自身的生殖健康有着密切联系,作为繁衍后代的另一半,父亲的饮食对孩子将来的健康也至关重要。

  研究人员发现,通常建议怀孕妇女在饮食中补充叶酸,以防止婴儿出现先天性神经系统缺陷的做法,对于准备做父亲的男子来说,同样具有重要意义。研究显示,男性体内叶酸水平过低,会导致精液浓度降低,精子活力减弱。此外,叶酸在人体内能与其他物质合成叶酸盐,如果男性体内缺乏叶酸盐,还会加大婴儿出现染色体缺陷的几率,使婴儿长大后患癌症的危险性增加。


  很多年来一般都是很关注孕妇和胎儿生长发育与饮食的关系,男性的饮食从来都是不是人们关注的范畴,最近,美国一项新研究成果表明:男性饮食与自身的生殖健康有着密切联系,作为繁衍后代的另一半,父亲的饮食对孩子将来的健康也至关重要。

  研究人员发现,通常建议怀孕妇女在饮食中补充叶酸,以防止婴儿出现先天性神经系统缺陷的做法,对于准备做父亲的男子来说,同样具有重要意义。研究显示,男性体内叶酸水平过低,会导致精液浓度降低,精子活力减弱。此外,叶酸在人体内能与其他物质合成叶酸盐,如果男性体内缺乏叶酸盐,还会加大婴儿出现染色体缺陷的几率,使婴儿长大后患癌症的危险性增加。


  研究还表明,男性缺乏维生素C会损害自身的精子数量和质量,这就意味着吸烟男子的生殖能力比常人低下。曾有研究认为,大量吸烟会导致男子性欲下降甚至出现阳萎。其实,这除了吸烟会引起阴茎动脉狭窄外,可能正与吸烟会使体内维生素C大量流失相关。


  所以,有关专家建议,为了生育一个健康聪明的孩子,男子在计划做父亲时,就应该多吃绿叶蔬菜、水果和粗粮。这些食物中叶酸和维生素C含量都很高。如果不能从食物中摄取足够的维生素和叶酸,可在医生的指导下服用叶酸药品和维生素。同时,最好莫沾烟酒,或者最大限度做到少抽少饮。


TAG:叶酸 饮食习惯 好爸爸 胎儿生长发育 体内 维生素C 婴儿 男子 男性 动脉狭窄

2012年11月26日星期一

花椒大料能治病可活血降压抑菌【2】

花椒大料能治病可活血降压抑菌【2】

  在众多的调料中,有一类具有特殊的香气,常被用于除掉鱼肉类的腥味,尽管它们的用量很小,但研究证实,它们是天然抗氧化剂的重要来源,具有活血降压、抑菌等作用。

  花椒:花椒气味芳香,可除鱼、肉类腥味,还可促进唾液分泌,增加食欲,花椒还能使血管扩张,降低血压,但花椒为热性,不宜多食。

  家庭烹调时,花椒可炝锅增香,如炒白菜时,投入几粒花椒,待炸至变黑时捞出,留油炒菜;还可炸花椒油,用花椒、植物油、酱油制成“三和油”,浇在凉拌菜上;腌制蔬菜、肉时,也可放入。

  肉桂:肉桂又叫桂皮,含有肉桂醛等芳香物质,还有丰富的类黄酮等抗氧化物质,并且肉桂还是镁的极好来源。桂皮性热,夏季不宜多食,桂皮还有活血作用,孕妇不宜多食。

  家庭烹调肉类时加一点肉桂,不仅可以增加香味,还能抑制氧化、减少杂环胺的产生。

  八角:八角又名大茴香。有研究发现,八角茴香水煎剂对人型结核杆菌及枯草杆菌有抑制作用。其乙醇提取液对金黄色葡萄球菌等有较强的抑制作用。

  八角可用来榨油拌凉菜。也可在炖肉的时候加入八角,去除肉类的腥臊味。


  在众多的调料中,有一类具有特殊的香气,常被用于除掉鱼肉类的腥味,尽管它们的用量很小,但研究证实,它们是天然抗氧化剂的重要来源,具有活血降压、抑菌等作用。

  花椒:花椒气味芳香,可除鱼、肉类腥味,还可促进唾液分泌,增加食欲,花椒还能使血管扩张,降低血压,但花椒为热性,不宜多食。

  家庭烹调时,花椒可炝锅增香,如炒白菜时,投入几粒花椒,待炸至变黑时捞出,留油炒菜;还可炸花椒油,用花椒、植物油、酱油制成“三和油”,浇在凉拌菜上;腌制蔬菜、肉时,也可放入。

  肉桂:肉桂又叫桂皮,含有肉桂醛等芳香物质,还有丰富的类黄酮等抗氧化物质,并且肉桂还是镁的极好来源。桂皮性热,夏季不宜多食,桂皮还有活血作用,孕妇不宜多食。

  家庭烹调肉类时加一点肉桂,不仅可以增加香味,还能抑制氧化、减少杂环胺的产生。

  八角:八角又名大茴香。有研究发现,八角茴香水煎剂对人型结核杆菌及枯草杆菌有抑制作用。其乙醇提取液对金黄色葡萄球菌等有较强的抑制作用。

  八角可用来榨油拌凉菜。也可在炖肉的时候加入八角,去除肉类的腥臊味。


  香叶:香叶又叫月桂叶,其主要活性成分是芳樟醇、丁香酚等,具有很好的抗氧化作用。

  家庭烹调时,香叶可用于酱类菜肴或汤类的调味,也常用于煲仔菜。香叶亦可作罐头的调味剂,适合在烹调肉类的时候,蘸酱加进去。

  胡椒:含胡椒辣碱、挥发油等,内服可健胃,不可过量,以防刺激胃黏膜。

  在烹调中,可用于去除肉类菜肴中的腥味。应在菜肴或汤羹即将出锅时均匀拌入,不要高温油炸。

  女性养生:这22种睡眠方式会加速女人衰老(组图)


TAG:饮食 食疗 活血 月桂叶 丁香酚 花椒油 降压 抑菌 养生 肉桂 大料 治病

男性养生:细数伟哥的11种悲催副作用

男性养生:细数伟哥的11种悲催副作用

  通常异常勃起不育的病人最常用的药品,但许多人不知道,吃伟哥失去的比得到的更多,下面为你细数神奇伟哥的11大损人副作用

  1、头痛 临床试验中发现,约有13%的人服药后出现头痛,且服用剂量越大愈烈。

  2、眼花 约有3%的服药者可发生短暂的视力模糊,有的还会出现看见蓝光的幻。

  3、昏晕 可能造成血压骤降,如同时服用硝酸甘油等药物,常会立即头昏甚至晕倒。

  4、异常勃起 将伤及阴部肌肉组织,甚至加重阳痿。

  5、掩盖心血管疾病 阳痿可能是心脏疾病、糖尿病或癌症的先兆,服用该药可能掩盖真正的病情。

  6、血压降低 伟哥可引起血压降低,而含三硝酸甘油或硝酸盐等心脏病药物也会降低血压,故伟哥与这些药混用时血压会大大降低,有时可能危及生命。

  7、永久性阳痿 长期服用伟哥可产生药物依赖性,甚至形成永久性阳痿。

  8、青光眼眼科专家警告,服用伟哥可导致血压下降,但青光眼患者眼压较高,有3%~5%的人可能出现急性青光眼,可使人一夜失明,即使治好也不能恢复原来视力。

  9、暂时性耳聋 FDA报道,伟哥可致聋,约1/3为暂时性耳聋。

  10、不育 美国一些专家认为,年轻人用伟哥可能会影响生殖能力。

  11、加重睡眠呼吸暂停 梗阻性睡眠呼吸暂停是由于在睡眠中喉部软组织塌陷,阻塞气道导致短时间的呼吸停止而产生的常见病症。勃起功能障碍在梗阻性睡眠呼吸暂停患者中有很高的发病 率,当这些患者服用伟哥时,可能引起上呼吸道充血(淤血),以至于加重呼吸障碍。 然而,尽管有这些可能的副作用,伟哥看来还是成了迄今为止最成功的春药之一。


TAG:伟哥 副作用 异常勃起 服用 阳痿 睡眠呼吸暂停 养生 青光眼 患者 梗阻性

2012年11月23日星期五

冬吃板栗养胃健脾补肾推荐2款栗子养生食谱【7】

冬吃板栗养胃健脾补肾推荐2款栗子养生食谱【7】

 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  冬天来临,在凉飕飕的凉意中,吃着热乎乎、香气扑鼻的糖炒栗子,那才叫爽!栗子又叫板栗、大栗、毛栗,味道特别香甜。农历十月,有的地方的人们会将栗子挂在通风的地方吹几天,风干以后特别美味,因此也称栗子为“风栗”。

 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  栗有养胃健脾、补肾强筋的功用,适用于肾虚所致的腰膝酸软、舒筋活络等症。《本草纲目》:“栗味甘性温,入脾胃肾经。治肾虚,腰腿无力,能通肾益气,厚肠胃也。”


 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  冬天来临,在凉飕飕的凉意中,吃着热乎乎、香气扑鼻的糖炒栗子,那才叫爽!栗子又叫板栗、大栗、毛栗,味道特别香甜。农历十月,有的地方的人们会将栗子挂在通风的地方吹几天,风干以后特别美味,因此也称栗子为“风栗”。

 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  栗有养胃健脾、补肾强筋的功用,适用于肾虚所致的腰膝酸软、舒筋活络等症。《本草纲目》:“栗味甘性温,入脾胃肾经。治肾虚,腰腿无力,能通肾益气,厚肠胃也。”


 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  唐代孙思邈说:“栗,肾之果也,肾病宜食之。” 中医认为栗子能补脾健胃、补肾强筋、活血止血,对肾虚有良好的疗效,故又称为“肾之果”,经常食用有强身愈病的功能。


 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  药师推荐,栗子适用于肾虚所致的腰膝酸软等症,“肾主骨,腰为肾之府”,栗为肾之果,能益肾,又含有大量淀粉、蛋白质、脂肪、B族维生素等多种营养素,素有“千果之王”的美誉。脾胃虚寒者、腰腿无力者可多吃栗子熬的汤或粥。


 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  栗子炆鸡

  材料:栗子300~400g,鸡1只,冬菇50g,生姜4片。

  做法:

  1、栗子洗净,晾干。鸡去内脏、尾部,洗净,切成块状。冬菇洗净,浸泡至软。

  2、热油锅将姜片爆香,放鸡块翻炒,变色后加入栗子、冬菇稍炒片刻。


 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  3、加入2碗水武火烧开改文火炆20分钟,放入少量生抽、糖稍煮片刻即可。

  功效:补脾养肾。

  分量:4~5人用。


 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  风栗红豆冬菇煲猪腱肉

  材料:风栗250g,红豆50g,冬菇30g,猪腱肉400g,生姜3片。

  做法:

  1、风栗洗净,切两半。红豆、冬菇各洗净、浸泡。猪腱肉洗净,切小方块状。与生姜一同放入炖盅。加入清水2500ml(约10碗量)。


 冬吃板栗养胃健脾补肾 推荐2款栗子养生食谱

  2、武火滚后改至文火煲2小时。饮时再放入适量盐即可。

  功效:养脾健胃,滋阴益气。

  分量:4~5人用。


TAG:板栗 养胃 健脾补肾 冬菇 脾胃虚寒 肾主骨 养生 本草纲目 肾之府 生姜

如何科学测量阴茎长度?

如何科学测量阴茎长度?

  阴茎是男性生殖器官的重要部分,对一个男人来说非常重要。早在远古时代,阴茎就出现在石刻图腾上,充分体现了人们对生殖器官的崇拜。阴茎的大小有种族和个体的差异,我国男子(18-45岁)的阴茎长度(非勃起)在4.5-8.8厘米之间,平均为6.5厘米,横径平均为2.5厘米,阴茎中部平均周径为8厘米。

  那么,怎样测量阴茎的长度呢?这里教你一种医生常用的方法。非勃起阴茎长度的测量:室温18℃,取直立姿势,将阴茎提起与身体呈90°,用直尺测量阴茎上方的耻骨联合处到阴茎头顶部的长度。勃起阴茎长度的测量:取直立姿势,用手捏住阴茎头用力拉向前方,牵拉到不能延长为止,用直尺测量耻骨联合到阴茎头的长度(牵拉后的长度与勃起的长度基本相同),大于或等于8厘米为正常。

  值得提醒的是,有些男人由于肥胖,腹部脂肪较多,使一部分阴茎埋在脂肪内,使阴茎看起来较小,测量时可用手推小腹脂肪。不过阴茎小一点的男人也不必在意,只要做爱的方法得当是不会影响性生活的。

  推算阴茎长度是否正常的公式:

  国际男性保健组织(MTD)通过近30年研究得出:

  正常阴茎长度M=(身高T-105)*0.618/3.14(厘米)

  正常阴茎直径D=M/3.14(厘米)

  (欧美=亚洲/1.414/0.618)厘米

(责任编辑:张阳)


TAG:阴茎 男性生理 性爱

2012年11月21日星期三

哈佛大学研究揭示:男性长寿的3个秘诀

哈佛大学研究揭示:男性长寿的3个秘诀

  美国一项长达72年的研究显示,比起出生背景、社会地位或个人财富,男性长寿的秘诀更多在于拥有快乐婚姻、亲密好友和一条宠物犬。

  婚姻友谊

  这项“格兰特研究”始于1940年。研究人员随访268名当时身体健康的大学二年级白人男生至今,每两年对他们进行一次评估。

  结果显示,一个人是否长寿更多地在于幸福程度而非社会地位,与之有关的是情商、人际关系、欢乐、社会联系和心理弹性。

  研究现阶段负责人、哈佛大学医学院的乔治·瓦扬告诉英国广播公司4台记者,亲密无间的友谊是快乐、长寿生活的关键。31名单身研究对象中,只有4人至今健在;而那些有亲密朋友的研究对象中,超过三分之一仍然健在。

  瓦扬说,有一个美满的家庭非常重要,对于70岁以上人群,婚姻能带来更多满足感。此外,寻找幸福永远不嫌晚,“你会惊讶地发现,70岁至90岁这一年龄段人群,即便曾经历巨大损失,仍能找到爱情”。

  宠物助力

  瓦扬还建议:“如果你想要过得快乐,家中又没有一个6个月大的婴儿供你逗乐,不妨养一条宠物犬。”

  看来,狗不仅是男人最好的朋友,也可能是长寿秘诀之一。

  先前研究显示,养宠物犬比宠物猫更能促进身心健康。英国贝尔法斯特女王大学的研究人员发现,宠物犬能帮助主人增强免疫力,抵御疾病侵袭,即便生病后也能更快恢复。遛狗则可以作为日常锻炼,有益健康。

  此外,饲养宠物犬的人往往血压更低,胆固醇水平更低。

  后天更重

  “格兰特研究”还显示,对古稀老人的健康状况和幸福程度而言,50岁时的生活境遇比年轻时候的经历影响更大。

  能否健康地老去同时受可控和不可控因素影响。一个人无法控制父母的社会背景、早期家庭稳定或者长辈的寿命,但一定能够决定自己是否吸烟、饮酒、锻炼或保持体重稳定。

  瓦扬说,当年逾80岁,50岁前养成的习惯比基因更能影响生活质量,“优雅、体面地变老的保障,更多在于我们自己,而非主要的基因构成”。

  令人惊讶的是,年轻时度假质量这种玩乐能力的衡量标志,比经济收入更能预示晚年生活幸福程度。

  瓦扬坦承,这项研究令他受益匪浅,“给我带来很多希望”.


TAG:研究人员 宠物犬 研究对象 哈佛大学 格兰特研究 男性 基因 婚姻 秘诀 爱情

2012年11月19日星期一

男性养生:男人怎样去判断精子健康与否?【2】

男性养生:男人怎样去判断精子健康与否?【2】

  判断男性精液是否正常的条件:

  (1)活动力:精子中呈直线迅速向前运动者≥50%。

  (2)颜色:正常是灰白色或略带黄色。乳白色或黄绿色提示生殖道或副性腺存在炎症;粉色、红色、显微镜下见红细胞者为血性精液,常见于副性腺、后尿道的炎症,偶可见于结核或肿瘤。

  (3)粘稠度:将玻璃棒接触已经液化的精液,轻轻提捧,可形成精液丝,正常时其长度小于2 cm。

  (4)液化时间:正常精液射出后,在精囊凝固酶的作用下变为胶冻状,经15~30分钟在前列腺液化酶的作用下变为液体,此为精液液化。射出精液30分钟后,精液仍不液化属于异常。

  (5)精液量:正常≥2ml。大于7ml时为过多,不但精子密度降低,而且易从阴道中流出,以致精子总数降低,常见于精囊炎;小于2ml为精液量过少,但通常以1ml以下为过少。此时精液与女性生殖道接触面积小,或因粘稠不利于精子进入女方宫颈口而导致不育,常见于严重的副性腺炎症、睾酮水平低下、射精管梗阻、逆行射精等。

  (6)精子计数:一般以每毫升精液中的精子数表示。正常计数≥20×106/ml。低于此值为精子过少,见于各种原因导致的生精功能障碍等,可因精子进入子宫腔及输卵管的机会减少而致生育力低下或不育。如精子计数大于250×106/ml为精子过多,因其活动力受影响也可导致不育。

  (7)精子形态:正常形态的精子≥50%,否则可造成不育。

  (8)酸碱度:精液正常的pH值为7 2~7 8。小于7 2见于射精管梗阻或受尿液污染;大于 7 8见于精囊炎症或标本陈旧。


  判断男性精液是否正常的条件:

  (1)活动力:精子中呈直线迅速向前运动者≥50%。

  (2)颜色:正常是灰白色或略带黄色。乳白色或黄绿色提示生殖道或副性腺存在炎症;粉色、红色、显微镜下见红细胞者为血性精液,常见于副性腺、后尿道的炎症,偶可见于结核或肿瘤。

  (3)粘稠度:将玻璃棒接触已经液化的精液,轻轻提捧,可形成精液丝,正常时其长度小于2 cm。

  (4)液化时间:正常精液射出后,在精囊凝固酶的作用下变为胶冻状,经15~30分钟在前列腺液化酶的作用下变为液体,此为精液液化。射出精液30分钟后,精液仍不液化属于异常。

  (5)精液量:正常≥2ml。大于7ml时为过多,不但精子密度降低,而且易从阴道中流出,以致精子总数降低,常见于精囊炎;小于2ml为精液量过少,但通常以1ml以下为过少。此时精液与女性生殖道接触面积小,或因粘稠不利于精子进入女方宫颈口而导致不育,常见于严重的副性腺炎症、睾酮水平低下、射精管梗阻、逆行射精等。

  (6)精子计数:一般以每毫升精液中的精子数表示。正常计数≥20×106/ml。低于此值为精子过少,见于各种原因导致的生精功能障碍等,可因精子进入子宫腔及输卵管的机会减少而致生育力低下或不育。如精子计数大于250×106/ml为精子过多,因其活动力受影响也可导致不育。

  (7)精子形态:正常形态的精子≥50%,否则可造成不育。

  (8)酸碱度:精液正常的pH值为7 2~7 8。小于7 2见于射精管梗阻或受尿液污染;大于 7 8见于精囊炎症或标本陈旧。


  男人注意生活方式,产生优质精子:

  1、不洗桑拿浴、蒸汽浴,不泡热水澡,因为精子怕高温。

  2、不要穿过紧的内裤、牛仔裤,还是因为精子怕高温。

  3、裸睡,因为这样会让精子感到舒适、凉快,从而活力十足。

  4、放弃不良嗜好,如作息不规律、吸烟、喝酒等。5多吃富含锌的食物,因为锌具有补精壮阳的作用,这其中植物类食物主要有豆类、花生、小米、萝卜、大白菜等;动物类食物以牡蛎最佳,其次是牛肉、鸡肝、蛋类、羊肉、猪肉等。

  想要拥有健康宝贝,还要注意什么?

  有了肥沃的土壤只是条件之一,还要有优良的种子,这才能保证苗好。

  怀孕也是一样。如果想要生一个健康、聪明的孩子,准爸爸一定要先学会保持“精”力。因为精子的数量和质量是优生的关键要素之一,男性一般社交及商务活动繁多,难免经常沾染烟酒,或是熬夜,要知道烟酒、不规律的作息都是精子的杀手。

  还有一个方面的问题,就是存在于睾丸中的精子,存活时间为2个多月,如果不射精,源源不断积累的精子就会老化,重新被身体吸收。因此,如果准备怀孕,丈夫应该在妻子排卵前1周,将老化的精子排出去,这样就能保证最有生命力的精子可以向子宫游去与卵子汇合。


TAG:血性精液 精子形态 凝固酶 精子计数 精子数 男人 后尿道 不育 炎症 副性腺

2012年11月14日星期三

【ASP.NET Web API教程】2.3.4 创建Admin视图

【ASP.NET Web API教程】2.3.4 创建Admin视图

注:本文是【ASP.NET Web API系列教程】的一部分,如果您是第一次看本博客文章,请先看前面的内容。

Part 4: Adding an Admin View
第4部分:添加Admin视图

本文引自:http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-framework,-part-4

Add an Admin View
添加Admin视图

Now we’ll turn to the client side, and add a page that can consume data from the Admin controller. The page will allow users to create, edit, or delete products, by sending AJAX requests to the controller.
现在我们转入客户端,并添加一个能够使用从Admin控制器而来的数据的页面。通过给控制器发送AJAX请求的方式,该页面将允许用户创建、编辑,或删除产品。

In Solution Explorer, expand the Controllers folder and open the file named HomeController.cs. This file contains an MVC controller. Add a method named Admin:
在“解决方案资源管理器”中,展开Controllers文件夹,并打开名为HomeController.cs的文件。这个文件是一个MVC控制器。添加一个名称为Admin的方法:

public ActionResult Admin() {     string apiUri= Url.HttpRouteUrl("DefaultApi", new { controller = "admin", });     ViewBag.ApiUrl = new Uri(Request.Url, apiUri).AbsoluteUri.ToString();     return View(); }

The HttpRouteUrl method creates the URI to the web API, and we store this in the view bag for later.
HttpRouteUrl方法创建了发送给Web API的URI,我们随后把它存储在视图包(view bag)中。

Next, position the text cursor within the Admin action method, then right-click and select Add View. This will bring up the Add View dialog.
下一步,把文本光标定位到Admin动作方法的内部,然后右击,并选择“添加视图”。这会带出“添加视图”对话框(见图2-20)。

WebAPI2-20

图2-20. 添加视图


In the Add View dialog, name the view "Admin". Select the check box labeled Create a strongly-typed view. Under Model Class, select "Product (ProductStore.Models)". Leave all the other options as their default values.
在“添加视图”对话框中,将此视图命名为“Admin”。选中标签为“创建强类型视图”的复选框。在“模型类”下面,选择“Product (ProductStore.Models)”。保留所有其它选项为其默认值(如图2-21)。

WebAPI2-21

图2-21. “添加视图”对话框的设置


Clicking Add adds a file named Admin.cshtml under Views/Home. Open this file and add the following HTML. This HTML defines the structure of the page, but no functionality is wired up yet.
点击“添加”,会把一个名称为Admin.cshtml的文件添加到Views/Home下。打开这个文件,并添加以下HTML。这个HTML定义了页面的结构,但尚未连接功能。

<div >     <div >         <ul id="update-products">             <li>                 <div><div >Product ID</div><span></span></div>                 <div><div >Name</div> <input type="text" /></div>                  <div><div >Price ($)</div> <input type="text" /></div>                 <div><div >Actual Cost ($)</div> <input type="text" /></div>                 <div>                     <input type="button" value="Update" />                     <input type="button" value="Delete Item" />                 </div>          </li>         </ul>     </div>     <div >     <h2>Add New Product</h2>     <form id="product">         @Html.ValidationSummary(true)         <fieldset>             <legend>Contact</legend>             @Html.EditorForModel()             <p>                 <input type="submit" value="Save" />             </p>         </fieldset>     </form>     </div> </div>

Create a Link to the Admin Page
创建到Admin页面的链接

In Solution Explorer, expand the Views folder and then expand the Shared folder. Open the file named _Layout.cshtml. Locate the ul element with id = "menu", and an action link for the Admin view:
在“解决方案资源管理器”中,展开Views文件夹,然后展开Shared文件夹。打开名称为_Layout.cshtml的文件。定位到id = "menu"的ul元素,和一个用于Admin视图的动作链接:

<li>@Html.ActionLink("Admin", "Admin", "Home")</li>

In the sample project, I made a few other cosmetic changes, such as replacing the string “Your logo here”. These don’t affect the functionality of the application. You can download the project and compare the files.
在这个例子项目中,我做了几个其它装饰性的修改,如替换了字符串“Your logo here(这是你的logo)”。这些不会影响此应用程序的功能。你可以下载这个项目并比较此文件。


Run the application and click the “Admin” link that appears at the top of the home page. The Admin page should look like the following:
运行该应用程序,并点击出现在首页顶部的这个“Admin”链接。Admin页面看上去应当像这样(见图2-22):

WebAPI2-22

图2-22. Admin页面


Right now, the page doesn't do anything. In the next section, we'll use Knockout.js to create a dynamic UI.
此刻,这个页面不做任何事情。在下一小节中,我们将使用Knockout.js来创建一个动态UI。

Add Authorization
添加授权

The Admin page is currently accessible to anyone visiting the site. Let's change this to restrict permission to administrators.
Admin此刻可以被任何访问网站的人所访问。让我们做点修改,把许可限制到管理员。

Start by adding an "Administrator" role and an administrator user. In Solution Explorer, expand the Filters folder and open the file named InitializeSimpleMembershipAttribute.cs. Locate the SimpleMembershipInitializer constructor. After the call to WebSecurity.InitializeDatabaseConnection, add the following code:
先从添加“Administrator(管理员)”角色和administrator用户开始。在“解决方案资源管理器”中,展开Filters文件夹,并打开名称为InitializeSimpleMembershipAttribute.cs的文件,定位到SimpleMembershipInitializer构造器。在对WebSecurity.InitializeDatabaseConnection的调用之后,添加以下代码:

const string adminRole = "Administrator"; const string adminName = "Administrator"; 
if (!Roles.RoleExists(adminRole)) { Roles.CreateRole(adminRole); }
if (!WebSecurity.UserExists(adminName)) { WebSecurity.CreateUserAndAccount(adminName, "password"); Roles.AddUserToRole(adminName, adminRole); }

This is a quick-and-dirty way to add the "Administrator" role and create a user for the role.
这是添加“Administrator”角色并为该角色创建用户的一种快速而直接的方式。

In Solution Explorer, expand the Controllers folder and open the HomeController.cs file. Add the Authorize attribute to the Admin method.
在“解决方案资源管理器”中,展开Controllers文件夹,并打开HomeController.cs文件。把Authorize(授权)注解属性添加到Admin方法上:

[Authorize(Roles="Administrator")]public ActionResult Admin(){    return View();}

Open the AdminController.cs file and add the Authorize attribute to the entire AdminController class.
打开AdminController.cs文件,并把Authorize注解属性添加到整个AdminController类上:

[Authorize(Roles="Administrator")]public class AdminController : ApiController{    // ...

MVC and Web API both define Authorize attributes, in different namespaces. MVC uses System.Web.Mvc.AuthorizeAttribute, while Web API uses System.Web.Http.AuthorizeAttribute.
MVC和Web API都定义了Authorize注解属性,但位于不同的命名空间。MVC使用的是System.Web.Mvc.AuthorizeAttribute,而Web API使用System.Web.Http.AuthorizeAttribute


Now only administrators can view the Admin page. Also, if you send an HTTP request to the Admin controller, the request must contain an authentication cookie. If not, the server sends an HTTP 401 (Unauthorized) response. You can see this in Fiddler by sending a GET request to http://localhost:port/api/admin.
现在,只有管理员才可以查看Admin页面。而且,如果对Admin控制器发送一个HTTP请求,该请求必须包含一个认证cookie。否则,服务器会发送一个HTTP 401(未授权)响应。在Fiddler中,通过发送一个http://localhost:port/api/admin的GET请求,便会看到这种情况。

看完此文如果觉得有所收获,恳请给个推荐




TAG:

火狐浏览器下JS代码不兼容setTimeout函数失效无效不运行执行的解决办法

火狐浏览器下JS代码不兼容setTimeout函数失效无效不运行执行的解决办法

今天检查自己用JQuery+AJAX+PHP做的网站后台登录检测,发现登陆成功后执行页面跳转函数这段JavaScript(JS)代码特效在IE和谷歌浏览器Chrome下都可以很好地执行,兼容性还不错。结果到了火狐(FireFox)浏览器下setTimeout这个JS内置函数不执行了,无效了,也没报错!打开FireBUG指望它能检测出JS的错误,结果没用...Javascript(JS)脚本代码在各浏览器下的兼容是一个很头疼的问题,经过一番调试和搜索,终于解决了setTimeout这个JS代码在火狐下失效不兼容不能运行和执行的错误。目前这个setTimeout可以很好地兼容IE6,7,8,9以及谷歌浏览器Chrome,火狐浏览器FireFox,苹果浏览器Safari,Opera。

setTimeout是一个很不错的函数,网站页面前端工程师经常将其用于几秒后执行的动作。setTimeout这个JS内置函数其用法也很简单,下面是setTimeout()的函数说明以及用法详解和实例、示例代码:

setTimeout()的作用是指定在多少毫秒后执行一个JS函数或者表达式代码

setTimeout的用法、语法、参数:setTimeout(code,millisec)

setTimeout参数说明:

code是必需参数。要调用的函数后要执行的 JavaScript 代码串。
millisec是必需参数。在执行代码前需等待的毫秒数。毫秒和秒之间的换算是:1000毫秒=1秒

setTimeout实例代码(1秒后页面跳转到指定的URL):

<script language="javascript">
function go(){//定义函数
window.location="main.html";//页面跳转
}
window.setTimeout("go()",1000);//1秒后执行函数go
</script>

但是以上JS代码是无法兼容火狐的,这主要是因为IE和火狐的浏览器引擎是不同的。让这段页面跳转JS代码兼容IE、火狐、SAFARI、OPERA:

<script language="javascript">
function go(){//定义函数
window.location="main.html";//页面跳转
}
window.setTimeout(function(){go()},1000);//1秒后执行函数go
</script>

经过看.看.呗[kankanbei.com]站长的测试,它完美地兼容了各主流浏览器,特此写出来和大家分享。值得注意的是实现页面跳转的JS代码我们习惯写作location.href=页面地址,而这段代码在火狐下也是不能运行的,你需要写作window.location=页面地址。
火狐浏览器下JS代码不兼容setTimeout函数失效无效不运行执行的解决办法 - 看看呗,原文地址:http://www.kankanbei.com/html/matrix/javascript/201012/08-333.html




TAG:

悦怀SEO:解析网站失去快照后仍可收录的蹊跷现象

悦怀SEO:解析网站失去快照后仍可收录的蹊跷现象

  站长们运营网站遇到的蹊跷现象很多,百度十一位、快照不更新、搜索不同关键词快照日期不一样等,蹊跷的现象遇到的多了,站长们也不以为然了,可不知这些现象中都意味着网站的毛病。在论坛看到有网友问首页没有快照,但是内页还是会被秒收的现象,悦怀营销(www.yuehuai.com )给大家分析下其中的奥秘吧 。

  第一:网站改版影响。网站在改版之后,遇到这样的情况是很正常的。蜘蛛来网站抓取内容时,发现网站的结构改变,不能按照正常的抓取方式进行,便会对首页进行重新审核。如果网站是因为近期改版导致此现象,站长们需要把首页的权重找出,改版之前的网址需要通过301重定向到新网站,以免造成蜘蛛抓取时的404错误链接。网站改版后内页可以被收录,说明蜘蛛每天都会来网站抓取内容,只是对首页的权重不够高,因此没有给与相应的快照日期,站长们可以在内页设置锚文本链接到首页,提高首页的权重,引导蜘蛛去首页进行抓取,既而给与相应的权重。

  第二:网站首页结构错误。首页没有快照日期,站长们要想到去查看网站日志,蜘蛛是否来网站首页进行爬行,如果日志中有蜘蛛的爬行,但是网站就是没有收录,这时站长们就要考虑网站是否是结构建设错误,首页是否设置了JS跳转、或者是否是完全的flash、网站代码是否有错误等,有时会是首页中多了几个DIV标签或者某行代码中缺少了一个标签之类的,这样的情况下也不会影响到访问,却会影响到蜘蛛爬行抓取首页的。经常使用IE浏览器时,会提示您浏览的网页有错误,这时我们可以通过浏览器提示的错误信息,对网站进行改善,以免错误的代码影响蜘蛛在网站的抓取。

  第三:网站首页作弊优化。站长们有时为了能提高新站的权重,给首页优化的程度很大,特别是对首页关键词的布局方面,分析遇到这样蹊跷现象的网站,会分析站长们犯的同样错误,关键词大量的堆积在标题、H标签、alt标签、页面布局中,蜘蛛来网站首页进行抓取时发现有太多的关键词堆积,会认为这样的网站是作弊优化,并不会给予相应的权重。反而如果网站的内页优化力度适中,更新的内容质量高,并会抓取内页的内容放入数据库。因为首页优化过度,造成这样的蹊跷现象是很常见的,要想首页的权重尽快恢复,站长们还是检查下首页的优化方式,是否存在大量的作弊手法,去除作弊优化方式,恢复首页权重。

  第四:网站首页长期不更新。网站快照日期是站长们判断网站权重的标准,遇到这样蹊跷的问题肯定会很着急,在着急之余也要考虑下,网站首页是否存在优化弊端,内页可以被蜘蛛秒收,蜘蛛给内页的权重还是很高的,这可能是内页长期的更新结果,那站长们就要检查下网站的首页是否长期坚持更新,首页长期不更新,蜘蛛每天爬行的都是同样的内容,自然不会给予太多的权重。网站的首页需要的是坚持长期更新内容,可以在首页调用内页版块,可以用标题+描述的形式,单独的标题导航可能并不能引起蜘蛛的抓取,通过文字内容的描述,增加首页的内容,提高蜘蛛的抓取频率。

  网站出现首页不更新,内页收录的现象也是比较蹊跷的,可站长们不要忽略这样的毛病所在,必要要分析出问题的所在,找到问题后要想办法解决。按照SEO优化的常理来说,网站的首页权重应该是最高的,被指向的链接也应该是最多的,不至于出现首页不收录,内页收录的现象,希望以上的分析能帮助站长们解决问题,尽快恢复首页权重。



TAG:悦怀 SEO 解析 网站 失去 快照 仍可 收录 蹊跷 现象 站长 网站 网站推广 赚钱

Android SDK 4.2 正式版发布

Android SDK 4.2 正式版发布

Google 刚刚宣布正式发布 Android 4.2 SDK,可从 Android SDK Manager 上下载,该版本包含了几个功能,例如屏幕锁定 widget 和 GPU 渲染。该版本的 SDK 级别是 17,为开发者提供了一些新的工具,包括可以直接在 Nexus 10 的 GPU 上运行的渲染脚本,这是移动计算平台的首创。开发者也可以将任何现有 widget 都置放在锁屏上,并以互动屏保的形式,创建 Daydream 的内容。

另外,Google 为了帮助开发者为阿拉伯语、希伯来语和波斯语的用户创建更好的应用,增加本地 RTL 支持,可以轻松地为用户提供一流的应用体验。此外,Android 4.2 也为韩文、日文和泰文等书写系统优化了一系列字体和字符。





TAG:

Parsix GNU/Linux 4.0 正式版发布

Parsix GNU/Linux 4.0 正式版发布

Parsix GNU/Linux是可安装的自启动运行DVD,它基于Debian GNU/Linux。该项目的目标是基于Debian的测试分支及GNOME桌面环境的最新稳定版本发布,提供一份即刻可用的、易于安装的操作系统。可以 用该发行自己的软件仓库安装额外的软件包。

Parsix 4.0 更新软件包:GNOME 3.4.2, X.Org 7.7, GRUB 2, GNU Iceweasel 16.0.2, GParted 0.12.1, Empathy 3.4.2.3, LibreOffice 3.5.4, VirtualBox 4.1.18

发行说明:http://www.parsix.org/wiki/ReleaseNotes40r0

下载地址:

  • parsix_4.0r0-i386.iso (1,030MB, MD5)
  • parsix_4.0r0-amd64.iso (1,027MB, MD5).




TAG:

【ASP.NET Web API教程】2.3.3 创建Admin控制器

【ASP.NET Web API教程】2.3.3 创建Admin控制器

注:本文是【ASP.NET Web API系列教程】的一部分,如果您是第一次看本博客文章,请先看前面的内容。

Part 3: Creating an Admin Controller
第3部分:创建Admin控制器

本文引自:http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-framework,-part-3

Add an Admin Controller
添加Admin控制器

In this section, we’ll add a Web API controller that supports CRUD (create, read, update, and delete) operations on products. The controller will use Entity Framework to communicate with the database layer. Only administrators will be able to use this controller. Customers will access the products through another controller.
在本小节中,我们要添加一个对产品支持CRUD(创建、读取、更新和删除)操作的Web API控制器。该控制器将使用实体框架与数据库层进行通信。只有管理员才能够使用这个控制器。客户端将通过另一个控制器访问产品。

In Solution Explorer, right-click the Controllers folder. Select Add and then Controller.
在“解决方案资源管理器”中右击Controllers文件夹,选择“添加”,然后选“控制器”(见图2-16)。

WebAPI2-16

图2-16. 添加控制器


In the Add Controller dialog, name the controller AdminController. Under Template, select "API controller with read/write actions, using Entity Framework". Under Model class, select "Product (ProductStore.Models)". Under Data Context, select "<New Data Context>".
在“添加控制器”对话框中,将此控制器命名为AdminController。在“模板”下选择“带有读/写动作的API控制器(用实体框架)”。在“模型类”下选择“Product (ProductStore.Models)”。在“数据上下文”下选择“<新数据上下文>”(见图2-17)。

WebAPI2-17

图2-17. 添加控制器对话框中的设置


If the Model class drop-down does not show any model classes, make sure you compiled the project. Entity Framework uses reflection, so it needs the compiled assembly.
如果“模型类”下拉列表未显示任何模型类,请确保已编译了此项目。实体框架使用反射,因此它需要已编译的程序集。


Selecting "<New Data Context>" will open the New Data Context dialog. Name the data context ProductStore.Models.OrdersContext.
选择“<新数据上下文>”会打开“新数据上下文”对话框。将该数据上下文命名为ProductStore.Models.OrdersContext(见图2-18)。

WebAPI2-18

图2-18. 命名“新数据上下文”


Click OK to dismiss the New Data Context dialog. In the Add Controller dialog, click Add.
点击“OK”退出这个“新数据上下文”对话框。在“添加控制器”对话框中点击“添加”。

Here's what got added to the project:
以下是添加到项目的内容:

  • A class named OrdersContext that derives from DbContext. This class provides the glue between the POCO models and the database.
    一个名称为的OrdersContext类,它派生于DbContext。这个类提供了POCO模型与数据库之间的粘合。
  • A Web API controller named AdminController. This controller supports CRUD operations on Product instances. It uses the OrdersContext class to communicate with Entity Framework.
    一个名称为AdminController的Web API控制器。这个控制器支持对Product实例的CRUD操作。它使用OrdersContext类与实体框架进行通信。
  • A new database connection string in the Web.config file.
    Web.config文件中的一个新的数据库连接字符串。

上述新添加项见图2-19。

WebAPI2-19

图2-19. 新添加到项目的内容


Open the OrdersContext.cs file. Notice that the constructor specifies the name of the database connection string. This name refers to the connection string that was added to Web.config.
打开OrdersContext.cs文件。注意,其构造器指明了数据库连接字符串的名称。该名称是指被添加到Web.config的连接字符串。

public OrdersContext() : base("name=OrdersContext")

Add the following properties to the OrdersContext class:
将以下属性添加到OrdersContext类:

public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }

A DbSet represents a set of entities that can be queried. Here is the complete listing for the OrdersContext class:
DbSet表示一组能够被查询的实体。以下是这个OrdersContext类的完整清单:

public class OrdersContext : DbContext {     public OrdersContext() : base("name=OrdersContext")     {     } 
public DbSet<Order> Orders { get; set; } public DbSet<OrderDetail> OrderDetails { get; set; } public DbSet<Product> Products { get; set; } }

The AdminController class defines five methods that implement basic CRUD functionality. Each method corresponds to a URI that the client can invoke:
类定义了实现基本的CRUD功能的五个方法。每个方法对应于一个客户端可以请求的URI(见表2-2):

表2-2. AdminController中实现CRUD操作的五个方法
Controller Method
控制器方法
Description
描述
URI HTTP Method
HTTP方法
GetProducts Gets all products.
获取全部产品
api/products GET
GetProduct Finds a product by ID.
根据ID查找一个产品
api/products/id GET
PutProduct Updates a product.
更新一个产品
api/products/id PUT
PostProduct Creates a new product.
创建一个新产品
api/products POST
DeleteProduct Deletes a product.
删除一个产品
api/products/id DELETE

Each method calls into OrdersContext to query the database. The methods that modify the collection (PUT, POST, and DELETE) call db.SaveChanges to persist the changes to the database. Controllers are created per HTTP request and then disposed, so it is necessary to persist changes before a method returns.
每一个方法调用都会进入OrdersContext对数据库进行查询。对数据集进行修改的方法(PUT、POST以及DELETE)会调用db.SaveChanges,以便把这些修改持久化回数据库。每个HTTP请求都会创建控制器(实例),然后清除它。因此,在一个方法返回之前,对修改持久化是必要的。

Add a Database Initializer
添加数据库初始化器

Entity Framework has a nice feature that lets you populate the database on startup, and automatically recreate the database whenever the models change. This feature is useful during development, because you always have some test data, even if you change the models.
实体框架有一个很好的特性,它让你在(应用程序)启动时填充数据库,并在模型发生修改时重建数据库。这个特性在开发期间是有用的,因为你总会有一些测试数据,甚至会修改模型。

In Solution Explorer, right-click the Models folder and create a new class named OrdersContextInitializer. Paste in the following implementation:
在“解决方案资源管理器”中,右击Models文件夹,并创建一个名称为OrdersContextInitializer的新类。粘贴以下实现:

namespace ProductStore.Models {     using System;     using System.Collections.Generic;     using System.Data.Entity; 
public class OrdersContextInitializer : DropCreateDatabaseIfModelChanges<OrdersContext> { protected override void Seed(OrdersContext context) { var products = new List<Product>() { new Product() { Name = "Tomato Soup", Price = 1.39M, ActualCost = .99M }, new Product() { Name = "Hammer", Price = 16.99M, ActualCost = 10 }, new Product() { Name = "Yo yo", Price = 6.99M, ActualCost = 2.05M } };
products.ForEach(p => context.Products.Add(p)); context.SaveChanges();
var order = new Order() { Customer = "Bob" }; var od = new List<OrderDetail>() { new OrderDetail() { Product = products[0], Quantity = 2, Order = order}, new OrderDetail() { Product = products[1], Quantity = 4, Order = order } }; context.Orders.Add(order); od.ForEach(o => context.OrderDetails.Add(o));
context.SaveChanges(); } } }

By inheriting from the DropCreateDatabaseIfModelChanges class, we are telling Entity Framework to drop the database whenever we modify the model classes. When Entity Framework creates (or recreates) the database, it calls the Seed method to populate the tables. We use the Seed method to add some example products plus an example order.
通过对DropCreateDatabaseIfModelChanges类的继承,我们是在告诉实体框架,无论何时修改了模型类,便删除数据库。当实体框架创建(或重建)数据库时,它会调用Seed方法去填充数据库。我们用这个Seed方法添加了一些例子产品和一个例子订单。

This feature is great for testing, but don’t use the DropCreateDatabaseIfModelChanges class in production, because you could lose your data if someone changes a model class.
这个特性对于测试是很棒的,但在产品(指正式运行的应用程序 — 译者注)中不要使用这个DropCreateDatabaseIfModelChanges类。因为,如果有人修改了模型类,便会丢失数据。


Next, open Global.asax and add the following code to the Application_Start method:
下一步,打开Global.asax,并将以下代码添加到Application_Start方法中:

System.Data.Entity.Database.SetInitializer(    new ProductStore.Models.OrdersContextInitializer());

Send a Request to the Controller
向控制器发送请求

At this point, we haven’t written any client code, but you can invoke the web API using a web browser or an HTTP debugging tool such as Fiddler. In Visual Studio, press F5 to start debugging. Your web browser will open to http://localhost:portnum/, where portnum is some port number.
此刻,我们还没有编写任何客户端代码,但你已经可以使用Web浏览器或诸如Fiddler之类的调试工具来调用这个Web API了。在Visual Studio中按F5键启动调试。你的浏览器将打开网址http://localhost:portnum/,这里,portnum是某个端口号。

Send an HTTP request to "http://localhost:portnum/api/admin". The first request may be slow to complete, because Entify Entity Framework needs to create and seed the database. The response should something similar to the following:
发送一个HTTP请求到“http://localhost:portnum/api/admin”。第一次请求可能会慢一些才能完成,因为实体框架需要创建和种植数据库。其响应应当类似于下面这样:

HTTP/1.1 200 OK Server: ASP.NET Development Server/10.0.0.0 Date: Mon, 18 Jun 2012 04:30:33 GMT X-AspNet-Version: 4.0.30319 Cache-Control: no-cache Pragma: no-cache Expires: -1 Content-Type: application/json; charset=utf-8 Content-Length: 175 Connection: Close 
[{"Id":1,"Name":"Tomato Soup","Price":1.39,"ActualCost":0.99},{"Id":2,"Name":"Hammer", "Price":16.99,"ActualCost":10.00},{"Id":3,"Name":"Yo yo","Price":6.99,"ActualCost": 2.05}]

看完此文如果觉得有所收获,恳请给个推荐




TAG:

关于inputfile上传控件样式的跨HTML5浏览器的一个兼容性解决方案

关于inputfile上传控件样式的跨HTML5浏览器的一个兼容性解决方案

最近在使用画布处理图像像素时用到了file上传控件,发现了file上传控件的两个兼容性问题。一个是file上传控件在火狐下无法通过css改变width,另一个是file上传控件在不同的浏览器下的外观和行为都不一样。

下面是file上传控件在IE10,firefox16,chrome22,opera12,safari5.1.7里的截图:

在IE10里,双击输入框或者单击按钮都弹出文件选择框。在其他浏览器里单击输入框,按钮或文字都可以触发文件选择框。

鉴于这种混乱情况,有必要要统一样式和行为。下面是我的兼容性方案。

先看一下最终结果在各浏览器的截图:

基本思路:创建输入框和按钮模拟file上传控件。将file上传控件设置成透明。让file上传控件于用于模拟的按钮右对齐。修改元素的堆叠顺序,让按钮处于下面,file上传控件在中间,输入框在上面。在文件选择完毕后将file上传控件里的值赋给用于模拟的输入框。

原理:在不同的浏览器里,file上传控件的按钮的height都是可调的,而且file上传控件的右侧都是可以单击的。所以通过调节file上传控件的height,并调整file上传控件的位置(右对齐),可以让file上传控件的可单击区域与用于模拟的按钮完全覆盖。当file上传控件透明时用户单击用于模拟的按钮就触发了文件选择框。但同时file上传控件的堆叠顺序不能先于用于模拟的输入框,不然当用户将鼠标置于所见的输入框上时可能会看到光标不是指示文本而是为一个箭头(而且为一个箭头时单击会弹出文件选择框),用户将感到困惑。

实现:先看看html部分的代码。

1 <div id="file">2  <input type="text" value="未选择文件" /><input type="button" value="浏览" /><input type="file" />3 </div>

然后是css部分的代码。

 1 #file { 2      position:relative; 3      width:226px; 4      height:25px; 5      border:1px #99f solid; 6 } 7 #file input { 8      font-size:16px; 9      margin:0;10      padding:0;11      position:relative;12      vertical-align:middle;13      outline:none;14 }15 #file input[type="text"] {16      border:3px none;17      width:172px;18      z-index:4;19 }20 #file input[type="button"] {21      width:54px;22      height:25px;23      z-index:2;24 }25 #file input[type="file"] {26      position:absolute;27      right:0px;28      height:25px;29      opacity:0;30      z-index:3;31 } 

最后javascript部分,用于把file上传控件获得的文件路径显示到可见的输入框里。

1 window.onload=function(){2         file=document.querySelector("#file input[type='file']");3         text=document.querySelector("#file input[type='text']");4         file.addEventListener("change",assign,false);5         function assign(){6                text.value=file.value;7         }8 }

欢迎留言交流或指正。




TAG:

2012年11月13日星期二

浅析网站利用付费方式进行广告宣传的利与弊(二)

浅析网站利用付费方式进行广告宣传的利与弊(二)

  站长朋友,您们好,在上一节内容中主要讲到了网站利用付费方式进行广告宣传的优势,接下来主要为站长朋友们分享我们在付钱出去的同时会遇到哪一些弊端,事情并不是绝对的,也并不是说站长付钱出去了就一定会为您带来利益,这也就是典型的投资需谨慎。

  网站利用付费方式进行广告宣传的劣势:

  一、网站进行付费广告宣传最大的一个劣势就是风险性,投资都有风险,我们在互联网中进行付费推广既有大的风险也有小的风险,大的风险就是投资的资金全部被对方所卷跑,这种事情在互联网是司空见惯的事情,随着互联网的发展,很多诈骗份子也出现在了互联网。而小的风险就是我们的投资失败,比如我们利用百度搜索引擎做推广,您的IP点击是4元钱一个,而这4元钱有可能会为您换来400元的利润,同时也有可能您这四元钱送给了百度,这就是小的风险,针对风险笔者只能说这是不可控制的,我们只能够通过措施降低风险。

  二、网站付费推广要求站长的头脑思维必须发达,互联网的竞争非常残酷,在互联网中您认不倒别人,别人也不认识您,在这种环境下如果您的头脑思维过慢,有可能被吃得一根骨头都不会剩下,站长朋友们您在进行付费推广的时候是否想过这样一个问题:我的脑袋有别人那么灵活吗?别人可以在一夜之间转变行业,而您行吗?所以付费推广不是小事情,头脑反应慢的站长我建议您不要进行推广,老老实实做站更好。

  三、付费推广要求站长的承受能力要高,如果您是小投资那么恭喜您,或许您不会尝试那种失去一切的痛苦;如果您是大投资那么笔者同样要恭喜您,或许你会在不断的打击中得到成长,笔者在3个月中投资所有的家当,最后得到的就是投资的经验与汲取的教训,可以说没有失败就没有成功,而笔者还有东山再起的机会,但并不是所有的投资人都能够向我这样心胸坦荡,在投资之前站长您先想一想,如果你不能够接受失败,那么最好就是建立一个域名、租用一个主机,慢慢的去优化网站更适合您。

  四、付费推广要求站长必须长时间的呆在电脑旁,付费推广与我们的自然推广不一样,我们是给了钱的去打广告,如果用户通过我们所给的钱进入了网站,但是网站没有人,这个时候用户离开,我们损失的就是无数的广告费+零收益。付费推广告诉站长:我们必须无时无刻的呆在电脑旁,可以说对一个人的健康会造成很大的影响。

  五、付费推广的压力是自然推广的十倍及以上,付费推广靠的钱,这种无形的压力压在肩上造就的就是高负担,这是一种心理压力,如果我们失败了那么更是一种折磨,可以说付费推广除了在风险上的弊端最大,剩下的还有对自己的心上的压力,这种压力是无形的,但是破坏力却非常大。

  并不是每一个人都适合付费推广,付费推广的弊端告诉我们:如果我们没有强大的承受能力、没有灵活的头脑思维、没有健康的身体、没有承担巨大压力的勇气、没有担当风险的决心,那么作为一站之长的您还是选择自然推广吧,因为您不适合付费推广。本文出自中国logo设计制作网http://www.logozhizuowang.com,转载请保留作者链接,谢谢。今晚很晚了,有机会的话准备再写一篇站长如何选择适应自己的推广方式,这样就可以帮助站长选择自己是做付费推广还是自然推广了,站长朋友们,晚安!



TAG:浅析 网站 利用付 方式进 行广 告宣 站长 朋友 您们 站长 网站 网站推广 赚钱

学用MVC4做网站二:2.2添加用户组

学用MVC4做网站二:2.2添加用户组

一、用户

二、用户组

2.1浏览用户组

2.2添加用户组

修改[Add]Action

/// <summary>        /// 添加用户组        /// </summary>        /// <returns></returns>        [AdminAuthorize]        public ActionResult Add()        {            ViewData.Add("Type", TypeSelectList);            return View();        }

添加强类型视图

image

完成后代码如下:

@model Ninesky.Models.UserGroup@{    ViewBag.Title = "添加用户组";    Layout = "~/Views/Layout/_Manage.cshtml";}<div class="left">    <div class="top"></div>    左侧列表</div><div class="split"></div><div class="workspace">    <div class="inside">        <div class="notebar">            <img alt="" src="~/Skins/Default/Manage/Images/UserGroup.gif" />添加用户组        </div>        @using (Html.BeginForm())        {            @Html.ValidationSummary(true)            <fieldset>                <legend>用户组资料</legend>                @Html.HiddenFor(model => model.UserGroupId)                <ul>                    <li>                        <div class="editor-label">                            @Html.LabelFor(model => model.Type)                        </div>                        <div class="editor-field">                            @Html.DropDownList("Type")                        </div>                    </li>                    <li>                        <div class="editor-label">                            @Html.LabelFor(model => model.Name)                        </div>                        <div class="editor-field">                            @Html.EditorFor(model => model.Name)                            @Html.ValidationMessageFor(model => model.Name)                        </div>                    </li>                    <li>                        <div class="editor-label">                            @Html.LabelFor(model => model.Description)                        </div>                        <div class="editor-field">                            @Html.EditorFor(model => model.Description)                            @Html.ValidationMessageFor(model => model.Description)                        </div>                    </li>                    <li>                        <div class="editor-label">                        </div>                        <div class="editor-field">                            <input type="submit" value="保存" />                        </div>                    </li>                </ul>            </fieldset>        }    </div></div><div class="clear"></div>@section Scripts {    @Scripts.Render("~/bundles/jqueryval")}

修改用户组添加处理动作[Add(UserGroup userGroup)]Action,完成后的代码

[HttpPost]        [AdminAuthorize]        public ActionResult Add(UserGroup userGroup)        {            userGroupRsy = new UserGroupRepository();            if (userGroupRsy.Add(userGroup))            {                Notice _n = new Notice { Title = "添加用户组成功", Details = "您已经成功添加["+userGroup.Name+"]用户组!", DwellTime = 5, NavigationName = "用户组列表", NavigationUrl = Url.Action("List", "UserGroup") };                return RedirectToAction("ManageNotice", "Prompt", _n);            }            else            {                Error _e = new Error { Title = "添加用户组失败", Details = "在添加用户组时,未能保存到数据库", Cause = "系统错误", Solution = Server.UrlEncode("<li>返回<a href='" + Url.Action("Add", "UserGroup") + "'>添加用户</a>页面,输入正确的信息后重新操作</li><li>联系网站管理员</li>") };                return RedirectToAction("ManageError", "Prompt", _e);            }        }

浏览器中查看一下

image

输入资料测试一下,可以添加资料。

image




TAG:

块级元素水平,垂直居中的两种方式

块级元素水平,垂直居中的两种方式

方式一: 利用margin

<!DOCTYPE html><html>    <head>        <title>块级元素水平,垂直居中</title>        <meta charset="utf-8">        <style>        	.wrapper {        		height: 600px;        		border: 1px solid gray;        	}        	.box {        		width: 100px;        		height: 100px;        		background: gold;        		margin: 250px auto 0;        	}        </style>    </head>    <body>		<div >			<div ></div>		</div>    </body></html>

 

方式二,利用定位及负边距

<!DOCTYPE html><html>    <head>        <title>块级元素水平,垂直居中</title>        <meta charset="utf-8">        <style>        	.wrapper {        		height: 600px;        		border: 1px solid gray;        		position: relative;        	}        	.box {        		width: 100px;        		height: 100px;        		background: gold;        		position: absolute;        		left: 50%;        		top: 50%;        		margin-left: -50px;        		margin-top: -50px;        	}        </style>    </head>    <body>		<div >			<div ></div>		</div>    </body></html>

  




TAG:

C#操作配置文件

C#操作配置文件

读取指定节点的值:

 1         ///<summary>  2         ///返回*.config文件中appSettings配置节的value项   3         ///</summary>  4         ///<param name="strKey"></param>  5         ///<returns></returns>  6         public static string GetAppConfig(string strKey) 7         { 8             foreach (string key in ConfigurationManager.AppSettings) 9             {10                 if (key == strKey)11                 {12                     return ConfigurationManager.AppSettings[strKey];13                 }14             }15             return null;16         }    

修改以及增加一个节点(Key),修改其实就是判断该Key是否存在,存在则删除,再创建。

 1         ///<summary>   2         ///在*.config文件中appSettings配置节增加一对键、值对   3         ///</summary>   4         ///<param name="newKey"></param>   5         ///<param name="newValue"></param>   6         public static void UpdateAppConfig(string newKey, string newValue) 7         { 8             bool isModified = false; 9             foreach (string key in ConfigurationManager.AppSettings)10             {11                 if (key == newKey)12                 {13                     isModified = true;14                 }15             }16 17             18             Configuration config =19                 ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);20             // 如果操作的Key 已存在,则删除21             if (isModified)22             {23                 config.AppSettings.Settings.Remove(newKey);24             }25             // 在配置文件中添加节点26             config.AppSettings.Settings.Add(newKey, newValue);27             // 修改配置文件后还需要保存28             config.Save(ConfigurationSaveMode.Modified);29             // 重置配置文件,如果不执行这行语句,已更新的配置文件不会得到应用30             ConfigurationManager.RefreshSection("appSettings");31         } 

读写配置文件很简单,也很方便。




TAG:

学用MVC4做网站二:2.1浏览用户组

学用MVC4做网站二:2.1浏览用户组

一、用户

二、用户组

2.1浏览用户组

在开始做浏览用户组之前,首先要考虑权限问题。浏览、添加、修改、删除用户组必须是系统管理员才能进行的操作,Action上必须验证是否是管理员,因此添加一个AdminAuthorize。在Extensions文件夹上点右键添加类"AdminAuthorizeAttribute”,继承自AuthorizeAttribute。

重写AuthorizeCore(HttpContextBase httpContext),里面什么代码都不写直接返回true。

因为管理员这块的功能还没做,目的是不验证管理员就可以进行添加、删除、浏览,权限验证代码等以后写管理员这块时再加。

using System;namespace System.Web.Mvc{    /// <summary>    ///  管理员权限验证    /// </summary>    public class AdminAuthorizeAttribute:AuthorizeAttribute    {        protected override bool AuthorizeCore(HttpContextBase httpContext)        {            return true;        }    }}

修改[List]Action,给其加上管理员权限验证。

/// <summary>        /// 用户组列表        /// </summary>        /// <param name="Id">用户组类型</param>        /// <returns></returns>        [AdminAuthorize]        public ActionResult List(int Id = -1)        {            userGroupRsy = new UserGroupRepository();            IQueryable<UserGroup> _userGroup;            if (Id == -1) _userGroup = userGroupRsy.List();            else _userGroup = userGroupRsy.List(Id);            return View(_userGroup);        }

id是用户组类型,因为用户组类型是枚举类型,从0起始,所以这里浏览地址不带id参数时设为-1显示所有用户组,当如数id参数时显示指定类型的用户组。

右键添加强类型“UserGroup”视图List.cshtml,修改生成的代码。

@model IEnumerable<Ninesky.Models.UserGroup>@{    ViewBag.Title = "用户组列表";    Layout = "~/Views/Layout/_Manage.cshtml";}<div class="left">    <div class="top"></div>    左侧列表</div><div class="split"></div><div class="workspace">    <div class="inside">        <div class="notebar">            <img alt="" src="~/Skins/Default/Manage/Images/UserGroup.gif" />用户组列表        </div>        <div class="buttonbar">@Html.ActionLink("添加用户组", "Add", "UserGroup")             </div>        <table>            <tr>                <th>                    @Html.DisplayNameFor(model => model.Name)                </th>                <th>                    @Html.DisplayNameFor(model => model.Type)                </th>                <th>                    @Html.DisplayNameFor(model => model.Description)                </th>                <th></th>            </tr>            @foreach (var item in Model)            {                <tr>                    <td>                        @Html.DisplayFor(modelItem => item.Name)                    </td>                    <td>                        @Html.DisplayFor(modelItem => item.Type)                    </td>                    <td>                        @Html.DisplayFor(modelItem => item.Description)                    </td>                    <td>                        @Html.ActionLink("修改", "Edit", new { id = item.UserGroupId }) |                @Html.ActionLink("删除", "Delete", new { id = item.UserGroupId })                    </td>                </tr>            }        </table>    </div></div><div class="clear"></div>

运行浏览器里看下效果,还行。

现在应该添加一个下拉菜单,可以选择不同的用户组类型来显示相应类型的用户组

在【UserGroupController】添加属性TypeSelectList

/// <summary>        /// 用户组类型的SelectList列表        /// </summary>        public List<SelectListItem> TypeSelectList        {            get            {                List<SelectListItem> _items = new List<SelectListItem>();                _items.Add(new SelectListItem { Text = UserGroupType.Anonymous.ToString(), Value = ((int)UserGroupType.Anonymous).ToString() });                _items.Add(new SelectListItem { Text = UserGroupType.Limited.ToString(), Value = ((int)UserGroupType.Limited).ToString() });                _items.Add(new SelectListItem { Text = UserGroupType.Normal.ToString(), Value = ((int)UserGroupType.Normal).ToString() });                _items.Add(new SelectListItem { Text = UserGroupType.Special.ToString(), Value = ((int)UserGroupType.Special).ToString() });                return _items;            }        }

修改[List]Action代码

/// <summary>        /// 用户组列表        /// </summary>        /// <param name="Id">用户组类型</param>        /// <returns></returns>        [AdminAuthorize]        public ActionResult List(int Id = -1)        {            userGroupRsy = new UserGroupRepository();            IQueryable<UserGroup> _userGroup;            if (Id == -1) _userGroup = userGroupRsy.List();            else _userGroup = userGroupRsy.List(Id);            var _typeLists = TypeSelectList;            _typeLists.Insert(0, new SelectListItem { Text = "全部", Value = "-1" });            if (_typeLists.Any(t => t.Value == Id.ToString())) _typeLists.SingleOrDefault(t => t.Value == Id.ToString()).Selected = true;            ViewData.Add("GroupTypeList",_typeLists);            return View(_userGroup);        }

在L.cshtml视图里@Html.ActionLink("添加用户组", "Add", "UserGroup")后面添加

用户组类型:@Html.DropDownList("GroupTypeList")

底部添加

<script type="text/javascript">    $("#GroupTypeList").change(function () {                window.location.href = "/UserGroup/List/" + $(this).children("option:selected").val();    })</script>

完成后的List.cshtml代码如下:

@model IEnumerable<Ninesky.Models.UserGroup>@{    ViewBag.Title = "用户组列表";    Layout = "~/Views/Layout/_Manage.cshtml";}<div class="left">    <div class="top"></div>    左侧列表</div><div class="split"></div><div class="workspace">    <div class="inside">        <div class="notebar">            <img alt="" src="~/Skins/Default/Manage/Images/UserGroup.gif" />用户组列表        </div>        <div class="buttonbar">@Html.ActionLink("添加用户组", "Add", "UserGroup") 用户组类型:            @Html.DropDownList("GroupTypeList")        </div>        <table>            <tr>                <th>                    @Html.DisplayNameFor(model => model.Name)                </th>                <th>                    @Html.DisplayNameFor(model => model.Type)                </th>                <th>                    @Html.DisplayNameFor(model => model.Description)                </th>                <th></th>            </tr>            @foreach (var item in Model)            {                <tr>                    <td>                        @Html.DisplayFor(modelItem => item.Name)                    </td>                    <td>                        @Html.DisplayFor(modelItem => item.Type)                    </td>                    <td>                        @Html.DisplayFor(modelItem => item.Description)                    </td>                    <td>                        @Html.ActionLink("修改", "Edit", new { id = item.UserGroupId }) |                @Html.ActionLink("删除", "Delete", new { id = item.UserGroupId })                    </td>                </tr>            }        </table>    </div></div><div class="clear"></div><script type="text/javascript">    $("#GroupTypeList").change(function () {                window.location.href = "/UserGroup/List/" + $(this).children("option:selected").val();    })</script>

完成,浏览器中查看一下

image




TAG:

站长需要重视并解决原创文章问题

站长需要重视并解决原创文章问题

  随着百度的算法变化,更加注重网站原创文章的问题.让很多站长纳闷,想当年我们做优化的时候都是外链的队伍,现在为什么要写原创文章呢?百度老李的专利就是外链锚文本,难道他放弃了?

  做了五年的网站推广,今天和大家分享下百度最近的变化:

  首先,作为搜索引擎领先的基础是用户体验,用户通过搜索引擎能搜索到,最新最有价值的资讯。而不是老旧的复制的资讯。其实百度早就知道,一直是搜索引擎老大认为没有必要.因为很多网站确实在做内容,做的很好非常不错,但百度不想给予排名。希望他们来推广.

  直到获悉360推出搜索so360.瞬间获取百分之十几的份额,百度慌了,要提升用户体验了。于是最近就用了这个算法。

  其次,百度站长平台之间公告了链接联盟,点名之间挂链机构,对于他们的自动挂链程序进行惩罚.不知道百度什么时候关注中小站长,直到我们知道百度利润下滑,百度提高推广门槛。以前3600可以做推广现在需要5600推广。百度为此做了三件事情:第一件是把所有做优化相关业务的网站全部K掉,第二件事就是把大量不更新文章的企业站点K掉,让你搜索企业名称都搜索不到。第三件事降低门户发链接权重,如果发的内容带链接或内容不相关全部给予降权处理。他们希望通过这样提升百度业绩,提升股价。同时链接处理了,客户自然做原创,也算是对用户体验有帮助。

  最后,他对网站原创内容进行分析。不是你更新网站的文章是原创的就行,需要与主题相关。因为很多人哪不相关的内容更新到网上,对用户没有价值。换句话说文章质量要有,文章要写的好。现在的站长如果做推广不写原创文章肯定被K,做网站就要想到文章的问题.文章找谁写呢?我在这里分享一个文章写的不错的合作伙伴,不发qq了直接发他的淘宝店铺(http://shop100872979.taobao.com/)合作三年了,没让我失望过!!最近他们开了淘宝店铺,我找了好多地方,这个是我认为价格最低质量最好,交易最放心的的一个。淘宝交易安全放心。

  搜索引擎还是有竞争好,不能一家独大,老站长的体会。

  ..



TAG:站长 重视 解决 原创文 章问 随着 百度 算法 变化 更加 站长 网站 网站推广 赚钱

ROSA 2012 Enterprise Linux Server 发布

ROSA 2012 Enterprise Linux Server 发布

ROSA是一家俄罗斯公司,它开发一系列基于Linux的解决方案。它的旗舰产品,ROSA Desktop,是基于Mandriva的发行,其特色是高度定制的KDE桌面,以及为改进工作环境的用户友好性而设计的大量修改。

下载地址:

  • ROSA-Server-2012-i386-DVD.iso (2,456MB, SHA256, torrent)
  • ROSA-Server-2012-x86_64-DVD.iso (3,293MB, SHA256, torrent).

发行通知:

http://www.rosalab.com/blogs/rosa-releases-its-server-oriented-operat





TAG:

SEO的天职是打造网站的就可用性

SEO的天职是打造网站的就可用性

  最近耳朵里听的最多的依然还是某某的网站被K了、某某的网站恢复了、百度又在发疯了,加上百度也在密集发布了网站SEO的一些犯规判断标准,但是百度和站长似乎都忘记了一个搜索的根本,搜索可用性、网站可用性。在搜索市场的绝大部分场合可以这么说,搜索可用性=网站可用性。SEO的天职是应该打在网站的可用性,而百度的天职就是打造搜索可用性,而不是一二三的拿这个那个规则忽悠站长,这样似乎在变相的诱导站长门的SEO趋势,让站长门脱离打造网站可用的本质。

  一个产品能不能被用户普遍接收,可用性是用户唯一判断的标准,这种可用性体现在用户对产品使用使用门槛,产品外观可用性,产品使用简易性。我想这也是对一个可用性网站判断的适用标准。

  哪么让我们看看一个网站如何应该做到可用性。

  1、网站层次感很重要

  一个网站如果SEOER把网站打造的什么都重要,哪么这个网站也就意味什么都不重要,很多SEOER心里虽然都知道,但是落实到网站上还是没有网站的层次感,一个网站的层次感表现在网站的图片、文字、链接上。三者的布局体现了一个网站可用性。

  2、网站的文字布局

  一张网页的文章内容可以说是每个搜索用户浏览网站的第一目标,网站的内容在网页上的布局应该尽可能的使得不同的相关内容进行关键字之间的衬托和促进,而不是1个内容狂轰滥炸的在页面上罗列,我想这种情况在医疗网站的内容建设上尤其突出。网页内容的文字布局建议尽可能的排在人视觉的上半部分,如果一个网站一进去都是图片,没人什么的文章,这种网站可以说对用户来说就是一片花海中感觉无从选择,这个有悖用户关键字搜索的初衷。

  3、网站的定位布局

  网站定位布局一般都体现在网的导航设计,一、二级侧目录、面包屑、产品页中,一个设计合理的定位布局,应该是用户点击一个页面就是知道身在何处,页面内容是否和搜索初衷相似。这点在淘宝、京东、亚马逊的网站上体现的最好的定位布局。

  SEO都说是搜索引擎优化,优化的东西就是一个个网站,网站的本质是给用户用哦,SEO的天职就是打造网站的可能性,这才是每个SEOER的需要牢记的。你要我们的网站可用性得到用户的认可,何必还要在意百度的今天一个打击垃圾外链,明天一个打击采集、质量网站吗?牢记网站本质,不要被百度弄的精神疲惫

  本文由牛人小鱼 http://blog.sina.com.cn/1976xiaoyu 发布,欢迎转载,转载请注明出处



TAG:SEO的天职 站长 网站 网站推广 赚钱

全方位谈下新闻对网站影响的重要性

全方位谈下新闻对网站影响的重要性

  大部分一个站点出现问题,多多少少和文章编辑有关系,今天小编我就从文章质量方面来分享一下我个人的看法:

  首先文章质量包括:文章的相关性、文章标题、文章主题、关键词密度、文件头文件尾的编辑、文章的原创性、违禁词。

  1.文章的相关性:一个站内新闻的添加很重要,为了丰富站内内容,我们不断的往站内添加新闻来丰富站内知识。其中,文章的添加最主要的一个相关性,符合用户的需求,遵循用户的体验度。

  2.文章标题:一篇文章的编辑,最吸引的是文章标题的编辑,一个新颖的标题可以为站内带来流量,吸引读者眼球。

  3.文章主题:新闻的添加-文章的主题明确也很重要。

  4.关键词密度:在编辑文章期间关键就是关键词密度的排放,如果关键词密度较大,搜索引擎会认为堆砌关键词,认为垃圾,关键词较少,又不利于我们优化。所以,我们在编辑的时候要适当的规划关键词。

  5.文件头文件尾的编辑:判断一篇文章的新颖,最主要的是看开头、结尾的编辑,搜索引擎在检索的时候也是从开头检索。所以,保持文件头文件尾的编辑的新颖性很重要。

  6.文章的原创性:一篇文章质量的高低要看你编辑文章的原创度高不高,一篇高质量的文章可以给这个站点带来一定的流量,吸引读者眼球。

  7.违禁词:导致站点打不开,出现一系列错误现象。

  8.文章大量的重复:如果添加的文章有大量的重复,搜索引擎在检索的时候会认为是垃圾,认为这个站点是在作弊。

  9.有规律的更新:有规律的更新新闻可以保持站点的稳定,也有利于我们优化!

  一个站点和文章编辑的一些相关的知识大概就这么多,以上就是我总结的一些技巧,希望可以为你带来一些帮助!此文主要有http://www.lfqicai.cn转载保留



TAG:方位谈 下新 网站 影响 大部 一个 站点出 现问 多多 站长 网站 网站推广 赚钱

2012年11月12日星期一

Scrum和项目流程总结

Scrum和项目流程总结

最近所在的两个项目组都用到了敏捷开发Scrum,之前对它的理解更多的停留在自己工作涉及到的一些具体形式,比如Daily Scrum,工作量的评估等。对于Scrum是什么,为什么要用Scrum,一直没有去思考过这些问题,更没有做过深入的学习。前几天看到园子里的一篇关于scrum的博文(http://www.cnblogs.com/speeding/archive/2012/10/30/2746532.html),收获颇多,加深了对Scrum的理解。

Scrum的出现,我的理解是为了适应软件需求的频繁变化,以及满足客户尽快看到软件产品的需求。从网上搜索了一下对Scrum的定义,摘录了一个觉得解释最好的关于Scrum的定义如下:

  • Scrum是一个敏捷开发框架,是一个增量的、迭代的开发过程。在这个框架中,整个开发过程由若干个短的迭代周期组成,一个短的迭代周期称为一个Sprint,每个Sprint的建议长度是2到4周。在Scrum中,使用产品Backlog来管理产品的需求,产品backlog是一个按照商业价值排序的需求列表,列表条目的体现形式通常为用户故事。Scrum团队总是先开发对客户具有较高价值的需求。在Sprint中,Scrum团队从产品Backlog中挑选最高优先级的需求进行开发。挑选的需求在Sprint计划会议上经过讨论、分析和估算得到相应的任务列表,我们称它为Sprint backlog。在每个迭代结束时,Scrum团队将递交潜在可交付的产品增量。 Scrum起源于软件开发项目,但它适用于任何复杂的、创新性的项目。(摘自:http://www.scrumcn.com/page/whatisscrum/index.php)
  • 结合上文提到的博文中对Scrum的定义:Scrum总结起来就是3355(3455):3种角色、3种工件、4种仪式(活动),5个价值观
    • 3种角色:Product Owner(PO)、Scrum Master(SM)、Scrum Team
    • 3种工件:Product Backlog、Sprint Backlog、Tracking/Increment
    • 4个活动:Sprint Planning、Daily Scrum、Sprint Review、Sprint Retrospective
    • 5个价值观:Courage、Commitment、Focus、Respect、Openness

回顾一下之前所在的两个项目的工作流程,以下用P1和P2表示自己经历的两个项目。

P1项目:是一个完整的Scrum团队。包括1个PM,1个BA,1个Dev Architect,1个DBA,1个QA Lead,7个Developer,2个QA,这个是组织内部的人员,还包括客户方的Product manager。Scrum中的3种角色我们都齐了。感觉我们的项目应该算是传统开发模式和Scrum开发模式的一个结合,我们的角色和分工还是很明确的。

项目的运作流程:

  • BA负责和客户方的PM、UX manager沟通需求,在JIRA上建立Requirement,形成初步的Product Backlog。BA再给组织内部的Dev和QA讲解requirement,同时大家一起讨论需求,BA再收集讨论结果,对于不明确的需求再和客户方进行沟通。通过和客户的几轮沟通(邮件、电话会议)确认最终的Product Backlog,并由Product Manager确认PBI的优先级。根据Product backlog的优先级选取当前Sprint的Sprint Backlog,并和客户确认。
  • Sprint Planning Day:组织内部所有成员开计划会议,评估各自的工作量,分解任务,将每个可执行的任务分解到2天以内。
  • PM发出Sprint Plan,大家按照计划,在JIRA上创建自己的task,BA负责维护requirement(即product backlog中的item,item还包括上一个sprint遗留的bugs),Dev和QA在每个requirement分别创建自己的Dev task和QA task。QA Task,我们通常包含write test outline, design test cases, test execution三个任务,其中前两个需要和BA、开发一起review,并update。
  • 作为QA Lead,我会根据当前Sprint的Sprint Backlog制定Test Plan,确定测试范围、测试方法(测试级别、出入准则)、测试策略、测试进度计划、测试资源分配、测试风险分析。
  • 开发发出Code Complete的通知,Release owner完成部署后,测试开始执行测试,提交bug。同时每天还要进行bug triage,对bug进行分类和排列优先级。正式的测试执行两轮,第一轮运行所有的case,第二轮运行新需求和bug fix相关的case。非正式的测试就是针对前两轮中failed的case,重新执行,再做一些adhoc的测试。
  • 测试完成并符合退出准则,我会发出Test Report。BA根据Release owner的release通知和我的test report,编写sprint的release note,发给客户
  • 客户的Product Manager根据release note选择需要发布到正式产品服务器的requirement和code change。
  • 我们的scrum中没有用到burn down chart,而是直接利用Product Backlog完成情况跟踪项目进度
  • Daily Scrum每天开,同时team成员轮流做meeting minute
  • Sprint Review的话,PM会定期(通常是两天)和不同的角色进行相关工作的review
  • Sprint Retrospective,在一个sprint结束后,新的sprint开始之前,PM会主持Sprint Retrospective,每人写三条项目中做的好的地方和三条需要改进的地方,不记名的写(这里有个插曲,由于我们组人不多,基本上大家的笔迹都能猜出来,所以会后的一个乐趣就是猜纸条都是谁写的)

总结下来,发现我们组的scrum貌似运行的还不错。

P2项目:我们是独立的测试团队,严格来说我们团队本身的运行算不上是scrum,但是从整个产品开发过程和与其他team的协作来看,有一些Scrum的元素在里面。整个测试团队有1个Test Manager,2个sub test team分别manual team和automation team,manual team有1个lead和6个tester,automation team有1个lead和3个developer。整个团队就是负责产品的功能测试。

项目的运作流程:

  • 项目采用的是迭代开发,一个迭代一个月,三个迭代为一个周期称为一个Train
  • 迭代开始,由销售在RTC上记录user story(通过市场的反馈获得),销售、需求、架构、开发、测试等的人会在RTC上讨论user story,并做comments,由user story的owner对user story进行update(这个讨论都是由经理级的人参与)
  • 开发和测试分别在确定好的user story下,创建自己的task。
  • Test Manager会针对每个Train制定一个测试计划,包括:
    • 测试策略:定义Test Coverage(测试范围、级别)、Test Preparation(工具的选择、测试环境的搭建(服务器、客户端操作系统和浏览器的覆盖列表)、设计测试用例、测试计划和测试用例的review)、Test Execution(第一轮测试、Story的Regression test)、Test Report(测试执行记录、缺陷报告、周报、测试状态报告)
    • 测试进度:定义重要的milestone(test preparation完成、开发code complete、第一轮测试执行完成、Regression test执行完成)
    • 测试跟踪:通过user story和test task的映射,以及tester对于test task的实际执行情况,对user story的测试情况进行跟踪
    • 测试资源和角色:定义测试团队的成员和角色,之前有所介绍
    • build verification test:定义daily的BVT的目的(监控系统运行情况、验证最新版本被成功部署、24小时内获得反馈)和daily BVT的报告格式
    • regression test:定义回归测试的目标和自动化对于回归测试的支持
    • automation test:定义当前阶段自动化的目标、新的自动化的需求、自动化工具、自动化框架
    • 风险和依赖:识别风险,并对风险进行分析,提出Mitigation plan
  • Manual lead针对每个iteration的user story情况,分配user story给tester,同时按照Manager的测试计划推进项目的测试工作
  • Tester在RTC的user story下创建自己的test task,包括write test outline、design test cases、test execution,前两项需要小组讨论、并发相应developer做review,然后由owner进行update。测试执行阶段运行test cases,提交bug,并就bug直接和developer进行沟通。
  • Automation lead会针对Train制定automation development计划,主要涉及三个方面:Framework Improvement、Automation coverage和新的自动化需求。
  • Developer会根据这个计划展开工作,在每个迭代进行维护自动化测试框架、开发新脚本扩大自动化测试覆盖、支持新的自动化需求。同时还要支持daily的automation regression test,以及测试阶段不同服务器上的automation test支持
  • 项目进行过程中,Test Manager会和各种manager开daily的各种review meeting,包括bug的triage meeting

在P2项目中,由于整个项目团队有上百人,我们测试团队只是其中一小部分,所以整个项目角度的敏捷开发流程,对于我们测试团队的大多数成员来说只涉及到自己工作的一小部分。从Scrum的角度来看,我们应该不属于Scrum,但是有很多与Scrum相似的地方,比如需求的记录是通过user story,manager们会有类似于daily scrum的会议等等。




TAG:

为Windows 8开发业务应用程序

为Windows 8开发业务应用程序

Windows 8和Windows Server 2012的到来把平板风格的用户界面带入了主流。虽然很多应用程序的类型都将会容易地从这种全新设计当中获得益处,不过传统业务应用程序的开发人员或许会担心他们的应用程序要如何来适应。Metro代表了一种设计理念的改变,几乎带来了全新的图形风格,显然是没有这么容易适应的。

重要的不同之处在于,其和所有用户都息息相关,而不仅仅是那些使用平板或触摸屏设备的人们。为了讲述在拥抱Metro风格之后要做出的一些设计决定,微软的Robert Green向大家介绍了来自Macadamian公司的Nadine Fox。他们一起为大家剖析了一款采用Metro风格的费用管理系统,它可以作为传统在线业务应用程序的典型代表。

Green反复提到的一个观点就是“内容置于边框之上”。这种约定的效果一眼就可以从应用程序的界面上感受得到。当应用程序运行于Windows 8并由鼠标操作的时候,传统的菜单栏和Ribbon都已经消失。相反,费用报告条目这一重点内容就是界面中的焦点。用于传统应用程序里面的界面元素只有“应用程序栏”得以保留,其在特定应用程序条目被选中的时候才显示出来。否则就会隐藏在屏幕之外,以尽量减少用户的干扰。

为了进一步强调“内容置于边框之上”的准则,甚至传统的对话框也不被赞成。取而代之的是,让应用程序在字段旁边发出提醒来提示必填的信息:

Green也演示了他的示例应用程序利用到的一些其他Windows 8的特定特性,例如便利的共享机制。它可以通过电子邮件、Twitter或发送便签的方式来共享信息。

在观看了这个演示之后,人们对Windows 8风格UI下面业务应用程序的这种可行设计模式印象非常深刻,不过在他们的演示和设计里面确实需要一种全新的思路。面对挑战的开发人员,将需要一段时间的适应以及一定的艺术设计资源,才能很好地利用这一新的界面风格。




TAG:

对列表自定义去重

对列表自定义去重

同事问我要一个对list去重的方法,而且只根据某个字段判断,也就是说,默认的distinct方法不适用,实现如下:

image

如上,通过一个lambda表达式来自定义compare的逻辑,简单去除是够用了。

同时还用原生的linq语法实现了一次,当然,这个来自于这篇文章




TAG:

android NDK 知识汇总

android NDK 知识汇总

原汇总:
【eoeAndroid社区索引】android开发环境NDK教程问题汇总帖
http://www.eoeandroid.com/thread-165553-1-1.html

环境:
Windows下配置NDK开发环境
http://www.eoeandroid.com/thread-201977-1-1.html
android
NDK开发环境搭建(windows) 最新整理 截止2012年9月
http://www.eoeandroid.com/thread-204936-1-1.html
android
的NDK在Windwos环境搭建
http://www.eoeandroid.com/thread-188434-1-1.html
Android小白成长之初级篇(4):NDK配置
http://www.eoeandroid.com/thread-180287-1-1.html

基础:
Android
浅谈NDK(一)
http://www.eoeandroid.com/thread-98078-1-1.html
Android
浅谈NDK(二)
http://www.eoeandroid.com/thread-98082-1-1.html
你对Android
NDK的理解
http://www.eoeandroid.com/thread-73072-1-1.html
android NDK
学习
http://www.eoeandroid.com/thread-70669-1-1.html

开发:
ndk开发过程
http://www.eoeandroid.com/thread-184030-1-1.html
NDK工程创建与编译运行
http://www.eoeandroid.com/thread-201993-1-1.html
android
ndk示例 ndk入门
http://www.eoeandroid.com/thread-203972-1-1.html
Android实现用java和NDK两种方式
将彩色图片转化为灰度
http://www.eoeandroid.com/thread-197456-1-1.html

文档:
Android中通过NDK使用OpenCV库
http://www.eoeandroid.com/thread-226398-1-1.html
Android:
NDK编程入门笔记
http://www.eoeandroid.com/thread-200027-1-1.html
NDK环境搭建傻瓜式教程
http://www.eoeandroid.com/thread-225523-1-1.html
对Android
NDK的误解及解析
http://www.eoeandroid.com/thread-201319-1-1.html
android
NDK 的性能研究
http://www.eoeandroid.com/thread-194999-1-1.html


以解决:
使用ndk-build编译程序的时候出错。。。。。。
http://www.eoeandroid.com/thread-201808-1-1.html
NDK-GDB
调试hello-jni 提示找不到符号
http://www.eoeandroid.com/thread-195507-1-1.html
NDK编译ffmpeg,支持rtsp,且含有swscale模块。
http://www.eoeandroid.com/thread-186472-1-1.html




TAG:

Listview首列固定,不能移动到其他列

Listview首列固定,不能移动到其他列

ListView的首列是checkbox,所以想固定首列,不能移动。
本想找到根本的解决办法,没找到。所以弄了这个笨办法。哪位知道怎么根本解决,麻烦告知,谢谢。
var view = this.lvFiles.View as GridView; if (view != null && view.Columns != null) view.Columns.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Columns_CollectionChanged); } void Columns_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Move) { var view = this.lvFiles.View as GridView; if (view == null) return; if (view.Columns == null) return; if (e.NewStartingIndex == 0) { view.Columns.CollectionChanged -= new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Columns_CollectionChanged); view.Columns.Move(e.NewStartingIndex, e.OldStartingIndex); view.Columns.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Columns_CollectionChanged); } if (e.OldStartingIndex == 0) { view.Columns.CollectionChanged -= new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Columns_CollectionChanged); view.Columns.Move(e.NewStartingIndex, e.OldStartingIndex); view.Columns.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Columns_CollectionChanged); } } }

  




TAG:

合理挖掘bbs、blog价值 促进站点跨越式腾飞(上)

合理挖掘bbs、blog价值 促进站点跨越式腾飞(上)

  随着百度算法的不断变化,越来越多的站长觉得BBS、BLOG已经没有利用价值了,其实BBS与BLOG的价值仍在,只是这种价值从外在表现转化为了内在潜力,以前我们可以利用BBS签名为网站带来无数的外链,而现在百度搜索引擎已经降低了对BBS的外链权重;以前的新浪博客、网易博客等等可以为网站直接带来权重转化,而现在这种转化已经大不如以前。但是站长朋友可以将BBS于BLOG忘记吗?

  随着门户博客的不断衰落,独立博客出现在了用户面前,我们可以搜索一些关键词发现居于第一的词很多都是个人独立博客;而论坛现在也已经逐渐成为了专业人士交流的场所,如果您是一名站长那么就绝对不能过忽略了BBS与BLOG带来的价值,下面具体的谈一谈作为一名站长如何合理的挖掘bbs、blog价值,促进站点跨越式腾飞。

  第一、利用BBS进行专业信息交流

  既然BBS为我们提供了沟通交流的平台,那么作为一名站长就可以正确的利用,并不是说我们在利用BBS的时候非要为自己的网站加上一个外链,这种做法是完全没有必要的。有理智的站长应该是通过分享信息来达到自己的目的,比如说我们作为站长最权威的A5交流平台,如果你想要推广自己的网址,那么就可以先写出自己的网站特色,是做什么的,能够解决哪一些问题,最后附一张图片,图片上加上网址的水印。通过这样的方法如果是有需要的客户就会进入你的网站,而那种纯粹广告文字的帖子,试问这样做有价值吗?如果你想推广自己的网站,还可以分享专业信息,比如你是做SEO优化的,那么就可以分享自己的SEO心得,最后可以留下自己的QQ,通过这种专业的分享让更多的用户看到您的实力,从而为您的网站带来人气与收益,这种做法难道不好吗?并不是说BBS只是拿来做外链的地方。

  第二、利用BLOG提高网站知名度

  现在的独立BLOG的排名比行业站的排名要好做一些,BLOG的内部链接构建简单,友链容易交换,做一个BLOG比做一个行业网站更容易,我们可以看到现在很多个人博客占据了百度首页,因此这里我们也可以利用博客为网站提高知名度,下面来谈谈我的看法:

  1、我们创建独立博客之后,在独立博客导航栏下部放上自制宣传图,宣传图带上超链接至行业站,宣传图的内容应该是与宣传知名网站有关的内容,这样能够将进入网站的流量引导至行业站。

  2、博客内容要有专业性,比如我们做的是一个脚步保暖的网站,那么我们在博客中就应该分享一些真正的脚步保暖方法、保暖技巧,通过这样的方法让整个博客看起来具备专业性,能够通过博客留住一部分流量。

  3、博客中可以介绍自己形象,其实独立博客的主要作用并不是来宣传与推广产品,其主要作用应该是宣传个人,比如现在的卢松松博客、zac等等就非常出名,可以说他们通过自己的博客让整个网站的知名度都得到了大幅度的提升。

  BBS与BLOG并不是没有价值,而是现在这两种运营方向有转变,要想采取最新最全的价值就要放弃以前的思维,BBS不是拿来塑造网站外链的、BLOG也不是拿来推广产品的,他们仅仅是一个让网站跳空的平台,希望各位站长能够有效把握,由于时间的原因这里只写出了两点内容,下一篇内容将写完这部分的内容,望站长支持。本文由减肥药排行榜http://www.shiyaojianfeile.com 原创,现在笔者通过独立博客为网站带来了不少的流量,希望对独立博客的重视能够帮助到网站站长。



TAG:理挖 bbs blog 价值 促进站 点跨 越式 腾飞 随着 站长 网站 网站推广 赚钱

表分区的阴暗面(执行计划)

表分区的阴暗面(执行计划)

CareSon 发表了一片博文http://www.cnblogs.com/CareySon/archive/2012/10/30/2745918.html其实我碰到过类似的事情,但是没有仔细研究为什么。借着CareSon的Demo,仔细的观察了执行计划。

测试数据

  当然第一步根据CareSon的Demo建立一份测试数据。

  第二步为了做比较的需要,建一个非分区的非聚集索引,Key 和 分区对齐的非聚集索引一样。

  第三步建议一个非分区表,数据和分区表一样,我在测试的时候叫Order2

  第四步在Order2建3个索引,1 聚集索引非分区,2.非聚集索引分区,3非聚集索引非分区

疑问

  这样测试数据就准备全了。CareSon的博文给我几个问题:1.为啥不走非聚集索引,2.走了索引会怎么样,3如果索引是非分区索引呢,4如果表是非分区表,中的分区索引会怎么样

测试结果

  根据问题我写了一下几个sql和对应执行计划和结果(性能差距很大所以单看执行计划就能猜出那个性能比较好):

  1.使用索引提示,强行走分区索引

SELECT TOP 100 id,OrderDate,DateModified,Placeholder FROM dbo.Orders WITH (INDEX = IDX_Data_DateModified_Id_OrderDate)WHERE DateModified >='20120625'
ORDER BY DateModified,Id

  

  

(100 行受影响)
表 'Orders'。扫描计数 4,逻辑读取 286265 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 1514 毫秒,占用时间 = 1132 毫秒。

  2.在分区表中不走索引(在这里表结构要稍微的变动一下,把非聚集索引删除)

SELECT TOP 100 id,OrderDate,DateModified,Placeholder FROM dbo.Orders WHERE DateModified >='20120625'                          ORDER BY DateModified,Id

  

(100 行受影响)
表 'Orders'。扫描计数 6,逻辑读取 25229 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 266 毫秒,占用时间 = 513 毫秒。

  3.使用索引提示,强行走非分区索引

SELECT TOP 100 id,OrderDate,DateModified,Placeholder FROM dbo.Orders WITH (INDEX = idx_DateModified)WHERE DateModified >='20120625' 
ORDER BY DateModified,Id

  

  

(100 行受影响)
表 'Orders'。扫描计数 1,逻辑读取 318 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 122 毫秒。

  4.在非分区表中,使用索引提示走分区索引

SELECT TOP 100 id,OrderDate,DateModified,Placeholder FROM dbo.Orders2 with (INDEX = IDX_Data2p_DateModified_Id_OrderDate)WHERE DateModified >='20120625'
ORDER BY DateModified,Id

  

(100 行受影响)
表 'orders2'。扫描计数 4,逻辑读取 286265 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 1701 毫秒,占用时间 = 1152 毫秒。

  5.非分区表正常运行

SELECT TOP 100 id,OrderDate,DateModified,Placeholder FROM dbo.Orders2 WHERE DateModified >='20120625'
ORDER BY DateModified,Id

(100 行受影响)
表 'orders2'。扫描计数 1,逻辑读取 318 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 140 毫秒。

解决问题

  现在结果有了,那么就来解答先前的几个问题1.为啥不走非聚集索引,2.走了索引会怎么样,3如果索引是非分区索引呢,4如果表是非分区表,中的分区索引会怎么样

  1.为啥不走索引呢?

    1和2 对比一下,1中逻辑读大概是2中的10倍,就算SQL Server 再傻也会用2这个执行计划。

  2.走了索引会怎么样?

    看1的执行时间和执行计划,走了索引性能很烂

  3.如果索引是非分区索引呢?

    请对比1和3,2和3性能差距不是一点点,那么就引出另外一个话题,为什么非分区索引性能比分区的好呢?这个下面再讨论

  4.表如果是非分区表,中的分区索引会怎么样?

    对比4和5非常负责任的告诉你,性能很烂。

总结

  现在来说说为什么非分区索引性能在这里比分区的好,分区索引是根据分区方案,分别存放,如前面的例子直接使用某个值来过滤,索引查找会扫描所有分区,查询那些数据,那么它读取的页远远大于直接在非聚集索引中seek,自己运行demo,查看非聚集索引seek左边的排序,是根据orderdate,id排序,视乎在为了给嵌套循环做准备,之后还要根据datemodified,id排序。非分区索引严格按照排序的字段排序,因此看执行计划的时候看实际相应行数为100,但是看走分区索引的实际相应行数则为170081也就意味着走非分区索引加大了IO,和多余的计算。恰恰造成查询偏慢的原因就是因为分区的阴暗面。不恰当的使用分区。CareSon的博文让我对分区表和索引对齐有了更加深入的认识。




TAG:

巧妙设计广告着陆页 提高流量转换率

巧妙设计广告着陆页 提高流量转换率

  随着互联网的发展,网络营销渐渐的进入企业的营销,网站营销的方式很多,不同的行业需要的营销方式自然也是不同的,但广告形式的营销在每个行业都不可缺少,但是用户对硬性的广告并感兴趣,这时就需要设置广告着陆页,通过着陆页的过渡,提高网站的流量转换率。笔者给大家分享下着陆页的设计理念。

  第一:着陆页面要专业。广告着陆页就是用户通过广告语点击进入的页面,着陆页是广告的过渡页,要想提高用户流量的转换,页面的专业性显的很重要。页面要针对广告的产品进行说明,同时,如果是官方做的活动,需要在着陆页上表明官方字样,给用户诚信真实的感觉。网站的页面建设、风格设计、服务器稳定性等,都是影响流量转换的因素。着陆页不用像广告页那样大量的华丽语言修饰,更多的是要结构建设清晰,风格要大气点,整体的要大气不失品质,尽量的提高网站的专业性,提高流量的转换率。

  第二:着陆页内容丰富。广告页中对产品的介绍很粗略,如果想要用户找到自己需求,然后下订单,着陆页中必须对产品进行详细的介绍,不同的产品类别需要分开说明,此产品和同类产品相比的优势,此时购买产品的优惠措施,产品的导购步骤等,都是需要在广告着陆页需要标明的,而且页面的设计也要考虑到用户的体验,图文相结合的形式更能吸引眼球,配图应该要进行相应的处理,让图片看起来更专业,图片的像素要高,文字也要进行一定的格式排版,以免文字的版式影响网站整理的布局。着陆页主要的是给用户过渡,所以此页面并不需要更新太多的内容,没必要加入大量的SEO优化,如果遇到有产品的优惠信息加以更新,其他的内容基本上可以不用更新。

  第三:着陆页客服联系要及时。客服系统是网络营销中不可缺少的,网络营销中用户只能通过客服务系统更详细的了解产品,用户来到着陆页不可能所有的客户都能很熟练的完成购买,下订单的过程中避免不了会遇到问题,这时客服系统显得很重要。网站上的联系方法要清晰,可以预留联系电话、QQ、MSN、邮箱等,为了提高用户对网站的信任度,可以使用400电话、企业QQ等,这些可以减少用户对网站的不信任,以免因为不信任丢失产品订单量,降低流量的转换率。

  第四:着陆页展示客户案例。网络营销最大的弊端就是用户不敢相信真实性,的确现在互联网的骗子也很多,为了提高用户对产品的了解,对网站服务的肯定,可以在着陆页给用户展示已经合作的客户案例,清晰明了的案例介绍比千万句华丽的语言有用。真实的客户案例可以打消用户的疑心,客户案例的展示可以通用视频、文字、图片等展示,有案例可寻的广告着陆页流量的转换肯定高于无案例的。同时,为了打消客户的戒心和疑问,可以在着陆页设置客服答疑系统,列出常见的用户疑问,并给出完整的答复,这样既减少了客服的时间,又可以增加页面的转换率。

  用户通过想要的关键词进入网站,但是用户并不能在网站下订单,网站的流量转换率低,这时网站的广告着陆页显的十分重要。着陆页能否打动用户,促使用户下订单,页面的设计技巧并是有利武器,以上说到的几点技巧,希望能帮站长们提高流量的转换率。

  本文原创来源:http://www.hlqxc.org 首发A5,转载请注明来源。



TAG:巧妙 计广 告着 陆页 提高 流量转 换率 随着 互联 发展 站长 网站 网站推广 赚钱

使用Kinect测量身高

使用Kinect测量身高

    使用Kinect测量身高的方法其实有很多种:

    第一种方式是使用Kinect的视场角以及结合一些三角形几何运算,就可以大致测量出物体的高度,这一点在之前介绍深度影像处理的时候有提到。

    第二种方式是使用Kinect骨骼追踪提供的20个关节点的相关坐标,在根据一定的算法测量出人体的身高。在Channel9上面的这个例子的一个分享,在这里拿过来和大家分享一下。在这里,根据臂展和身高有相似的关系,我对这个例子做了一点扩展,计算臂展来粗略计算身高,用臂展计算身高其实有个好处就是既可以使用正常模式(Normal model,20个关节点),可以使用坐姿模式(Seat model,10 个关节点),这样您坐着就可以测量身高,不过精度不保证哈。这里只是提供这么一个思路。

一. 计算身高的算法

    Kinect获取的骨骼数据包含20个关节点的X,Y,Z坐标信息。您可能会想,为什么不直接使用头部(head)关节点和脚趾(foot)关节点之间的距离来直接计算身高。这样不准确,因为用户可能并没有站直,如果这样算的话,误差比较大。

    另一个问题是,头部关节点给出的是头部中心点的位置,如果使用这个位置,您需要额外增加9至11厘米,但是即使这样,也不能达到百分之一百的准确,如果要更精确一点的话,可能需要使用深度影像值来提取头部的顶部位置。也不需要那么麻烦,现在来看看我们怎样使用骨骼关节点来计算高度信息。

    仔细观察下面的骨骼点,可以看到,身高可以由下面几部分组成(如图中红色部分):

• 头部(Head) –肩膀中心(ShoulderCenter)

• 肩膀中心(ShoulderCenter) – 脊柱中心(Spine)

• 脊柱中心(Spine) – 髋部中心(HipCenter)

• 髋部中心(HipCenter) – 左或右膝关节(KneeLeft or KneeRight)

• 左膝关节KneeLeft(右膝关节KneeRight) – 左踝关节leLeft (右踝关节AnkleRight)

• 左踝关节leLeft (右踝关节AnkleRight)- 左脚FootLeft (右脚FootRight)

KinectMeasureHeightw

使用臂展计算身高,也可以计算图中绿色所示的关节点:

• 左手(HeadLeft) –左手腕(Wrist Left)

• 左手腕(Wrist Left) – 左胳膊肘(Elbow Left)

• 左胳膊肘(Elbow Left) – 左肩膀(Shoulder Left)

• 左肩膀(Shoulder Left)–肩膀中心(Shoulder Center)

• 肩膀中心(Shoulder Center)-右肩膀(Shoulder Right)

• 右肩膀(Shoulder Right)- 右胳膊肘 (Elbow Right)

• 右胳膊肘 (Elbow Right)- 右手腕(Wrist Right)

•右手腕(Wrist Right)- 右手 (Hand Right)

   原理就是这样,下面来编代码实现。

二. 实现

    程序界面很简单,展示20个关节点,然后显示计算结果。有几点需要说明:

    首先,关节点的位置信息是三维的,下面公式用来计算两个关节点的距离

public static double Length(Joint p1, Joint p2){    return Math.Sqrt(        Math.Pow(p1.Position.X - p2.Position.X, 2) +        Math.Pow(p1.Position.Y - p2.Position.Y, 2) +        Math.Pow(p1.Position.Z - p2.Position.Z, 2));}

    上面的代码很直接。第二步,我们应该使用左腿还是右腿还进行测量更加准确呢,我们使用那个追踪的最好的。下面的代码用来计算腿部处于追踪状态的点的数量。如果那个数量多,那么就用那一个。

public static double Length(params Joint[] joints){    double length = 0;    for (int index = 0; index < joints.Length - 1; index++)    {        length += Length(joints[index], joints[index + 1]);    }    return length;}

    使用上面的函数,我们就可以判断是使用左腿还是右腿了。

// Find which leg is tracked more accurately.int legLeftTrackedJoints = NumberOfTrackedJoints(hipLeft, kneeLeft, ankleLeft, footLeft);int legRightTrackedJoints = NumberOfTrackedJoints(hipRight, kneeRight, ankleRight, footRight);double legLength = legLeftTrackedJoints > legRightTrackedJoints ? Length(hipLeft, kneeLeft, ankleLeft, footLeft) : Length(hipRight, kneeRight, ankleRight, footRight);

     然后我们使用扩展方法,来计算骨骼的高度。下面是方法的代码:

public static double Height(this Skeleton skeleton){    const double HEAD_DIVERGENCE = 0.1;    var head = skeleton.Joints[JointType.Head];    var neck = skeleton.Joints[JointType.ShoulderCenter];    var spine = skeleton.Joints[JointType.Spine];    var waist = skeleton.Joints[JointType.HipCenter];    var hipLeft = skeleton.Joints[JointType.HipLeft];    var hipRight = skeleton.Joints[JointType.HipRight];    var kneeLeft = skeleton.Joints[JointType.KneeLeft];    var kneeRight = skeleton.Joints[JointType.KneeRight];    var ankleLeft = skeleton.Joints[JointType.AnkleLeft];    var ankleRight = skeleton.Joints[JointType.AnkleRight];    var footLeft = skeleton.Joints[JointType.FootLeft];    var footRight = skeleton.Joints[JointType.FootRight];    // Find which leg is tracked more accurately.    int legLeftTrackedJoints = NumberOfTrackedJoints(hipLeft, kneeLeft, ankleLeft, footLeft);    int legRightTrackedJoints = NumberOfTrackedJoints(hipRight, kneeRight, ankleRight, footRight);    double legLength = legLeftTrackedJoints > legRightTrackedJoints ? Length(hipLeft, kneeLeft, ankleLeft, footLeft) : Length(hipRight, kneeRight, ankleRight, footRight);    return Length(head, neck, spine, waist) + legLength + HEAD_DIVERGENCE;}

     同样滴,我们使用手,手腕,胳膊肘,肩膀,等9个关节点来计算臂展,并使用臂展来近似计算身高,下面的名为ArmExtendWith的扩展方法即为计算臂展的方法。

public static double ArmExtendWith(this Skeleton skeleton){    var armWidthDeviation = 0.5;    var handRight = skeleton.Joints[JointType.HandRight];    var wristRight = skeleton.Joints[JointType.WristRight];    var elowRight = skeleton.Joints[JointType.ElbowRight];    var shoulderRight = skeleton.Joints[JointType.ShoulderRight];    var shoulderCenter = skeleton.Joints[JointType.ShoulderCenter];    var handleft = skeleton.Joints[JointType.HandLeft];    var wristleft = skeleton.Joints[JointType.WristLeft];    var elowleft = skeleton.Joints[JointType.ElbowLeft];    var shoulderleft = skeleton.Joints[JointType.ShoulderLeft];    // Calculate the left and right arm extends width    double rightArmExtendsWidth = Length(handRight, wristRight, elowRight, shoulderRight, shoulderCenter);    double leftArmExtendsWidth = Length(handleft, wristleft, elowleft, shoulderleft, shoulderCenter);    return rightArmExtendsWidth + leftArmExtendsWidth + armWidthDeviation;}

    最后,再SkeletonFrameReady事件中调用该方法即可。

void Sensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e){    using (var frame = e.OpenSkeletonFrame())    {        if (frame != null)        {            canvas.Children.Clear();            Skeleton[] skeletons = new Skeleton[frame.SkeletonArrayLength];            frame.CopySkeletonDataTo(skeletons);            var skeleton = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();            if (skeleton != null)            {                // Calculate height.                double height = Math.Round(skeleton.Height(), 2);                double armExtendsWidth = Math.Round(skeleton.ArmExtendWith(), 2);                // Draw skeleton joints.                foreach (JointType joint in Enum.GetValues(typeof(JointType)))                {                    DrawJoint(skeleton.Joints[joint].ScaleTo(640, 480));                }                // Display height.                tblHeight.Text = String.Format("Height: {0} m", height);                tblArmExtendWidth.Text = String.Format("ArmWidth: {0} m", armExtendsWidth);            }        }    }}

    现在您可以运行代码查看结果了。

三. 结语

     本文介绍了两种利用Kinect测量身高的方法,一种是之前讲过的,利用Kinect的视场角和物体构成的三角关系,运用几何运算,测量物体身高,第二种是利用Kinect提供的骨骼数据,根据关节点直接的距离,来计算人体的身高。本文着重讲解了利用骨骼关节点之间的距离计算身高的两种方法,一种是Channel9上面分享的利用头部、脊柱、髋关节、膝关节、踝关节等8个关节点的长度来计算身高,还有一种就是使用与臂展相关的,手、手腕、胳膊肘、肩膀等9个关节点信息,叫第一种方法相比,该方法可以使用坐姿模式进行计算。当然,可能精度不是很准确,本文只是提供了一些Kinect在测量身高方面的思路,源代码点击此处下载,希望本文对您有帮助!




TAG:

JS提示框

JS提示框

<html><head><script type="text/javascript">function disp_prompt()  {  var name=prompt("请输入您的名字","Bill Gates")  if (name!=null && name!="")    {    document.write("你好!" + name + " 今天过得怎么样?")    }  }</script></head><body><input type="button" onclick="disp_prompt()" value="显示提示框" /></body></html>




TAG:

2012年11月11日星期日

黑马程序员ADO.NET学习

黑马程序员ADO.NET学习

//ADO.NET是一组向.NET程序员公开数据访问服务的类,它提供了一系列的方法用于支持对Microsoft SQL Server和

//无连接模型:将数据下载到客户机器上,并在客户机上将数据封装到内存中,然后可以像访问本地关系数据库一样访问内存中的数据(例如:DataSet)。

//连接模型:依赖于逐记录的访问,这种访问要求打开并保持与数据库的连接。

//ADO.NET被分割成两大类:一类是与数据库直接连接的联机对象(.NET Data Provider),其中包含了Command对象、DataReader对象以及DataAdapter对象等。另一类则是不用与数据库保持连接的断线对象,例如DataSet。

//SqlDataReader类似于指针,不会保存数据在电脑上,会在数据库服务器中一条条的读,服务器连接断开后就不能读取数据。优点,对程序占用内存没有影响,适合用在大数据量的数据操作

//SqlDataAdapter是DataSet和数据库之间沟通的桥梁。 数据集DataSet包含若干DataTable表,DataTable包含若干行DataRow。优点:将查询结果填充到本地内存中,即使连接断开也不会影响数据的读取。适合用在小数据量的数据操作,大量的数据操作会非常占用内存。

//使用参数化执行数据库操作可以防止一些SQL漏洞注入攻击。

配置Web.Config文件进行数据库连接:

<??><configuration>  <connectionStrings>  <add name="MSSqlDB"   connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Demo.mdf;Integrated Security=True;User Instance=True"/>    <add name="Demo" connectionString="Server=.\SQLEXPRESS;Database=Demo;User ID=sa;Password=123"/>  </connectionStrings></configuration>

使用SqlDataReader读取数据库中的数据:

string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;string sql = "SELECT * FROM T_Demo";          using (SqlConnection _SqlConn = new SqlConnection(strConn))//实例化数据库连接对象            {              using (SqlCommand _SqlCmd = _SqlConn.CreateCommand())//实例化数据库命令执行对象                {                    _SqlCmd.CommandText = sql;//设置要执行的sql语句                       _SqlConn.Open();//打开数据库连接                    using (SqlDataReader _SqlReader = _SqlCmd.ExecuteReader())//实例化数据库读取对象                    {                        while(_SqlReader.Read())//如果读取到数据则返回true                        {                            string name = _SqlReader.GetString(_SqlReader.GetOrdinal("Name"));//获取数据库中的字段                                 Response.Write(name);                        }                  }               }            }

使用SqlDataAdapter将数据库中读取的数据保存到数据集中:

string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;string sql = "SELECT * FROM T_Demo";          using (SqlConnection _SqlConn = new SqlConnection(strConn))//实例化数据库连接对象            {              using (SqlCommand _SqlCmd = new SqlCommand(sql,_SqlConn))//实例化数据库命令执行对象                {                 using (SqlDataAdapter _SqlAdapter= new SqlDataAdapter(_SqlCmd))//实例化数据适配器对象                    {                        DataTable data = new DataTable();//实例化数据集,这是一个在内存中的缓存数据                            _SqlAdapter.Fill(data);//使用数据适配器填充数据集                            foreach ( DataRow row in data.Rows)                        {                            Response.Write(row["Name"].ToString());                        }                  }               }           }

SQL漏洞注入攻击:SELECT * FROM T_User WHERE UserName = '1' AND Password = '1' or '1'='1'

参数化执行查询操作:

            string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;            string sql = "SELECT * FROM T_Demo WHERE Name=@name AND UserPwd=@pwd";            using (SqlConnection _SqlConn=new SqlConnection(strConn))            {                using (SqlCommand _SqlCmd=new SqlCommand(sql,_SqlConn))                {                     //这样写程序会把输入的值直接拿到数据库去比对,而不会去拼接字符串                       _SqlCmd.Parameters.Add(new SqlParameter("@name", "admin"));                    _SqlCmd.Parameters.Add(new SqlParameter("@pwd", "admin"));                    _SqlConn.Open();                    int result = Convert.ToInt32(_SqlCmd.ExecuteScalar());                    Response.Write(result);                }            }

参数化执行非查询操作:

        protected void btnDemo_Click(object sender, EventArgs e)        {            string sql = "INSERT INTO T_Demo (Name,Age,Sex)VALUES(@name,@age,@sex)";            Dictionary<string, object> paramValue = new Dictionary<string, object>();            paramValue.Add("@name", "张耕明");            paramValue.Add("@age", "28");            paramValue.Add("@sex", "男");            Response.Write(ExecuteNonQuery(sql, paramValue));        }        public int ExecuteNonQuery(string sql, Dictionary<string, object> paramValue)        {            string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;            using (SqlConnection _SqlConn=new SqlConnection(strConn))            {                using (SqlCommand cmd = new SqlCommand(sql, _SqlConn))                {                    foreach (var v in paramValue)                    {                        cmd.Parameters.Add(new SqlParameter(v.Key, v.Value));                    }                    _SqlConn.Open();                    return cmd.ExecuteNonQuery();                }               }        }




TAG:

【ASP.NET Web API教程】1 ASP.NET Web API入门

【ASP.NET Web API教程】1 ASP.NET Web API入门

Getting Started with ASP.NET Web API
第1章 ASP.NET Web API入门

摘自:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api

In this chapter, you'll learn: The basics of building an HTTP service using ASP.NET Web API
本章你将学习:用ASP.NET Web API建立HTTP服务的基本知识。本章包含三个教程:

1.1 Tutorial: Your First Web API
1.1 教程:第一个Web API
In this tutorial, you will create your first HTTP service using ASP.NET Web API.
在本教程中,你将用ASP.NET Web API创建第一个HTTP服务。
1.2 Deep Dive into Web API
1.2 深入探讨Web API
Daniel Roth takes a code-centric deep dive into the Web API features and how to use Visual Studio 2012 to leverage those features in your own API development.
Daniel Roth以一段核心代码深入探讨了Web API特性,并演示了如何用Visual Studio 2012把这些特性用于你自己的API开发中。(这是一段视频教程,本翻译系列略 — 译者注)
1.3 Pro ASP.NET Web API
1.3 精通ASP.NET Web API
Pro ASP.NET Web API, by Tugberk Ugurlu and Alexander Zeitler, shows you how to build flexible, extensible web services that run seamlessly on a range of operating systems and devices, from desktops to tablets to smart phones—even the ones we don’t know today.
精通ASP.NET Web API,Tugberk Ugurlu、Alexander Zeitler著,向你展示如何建立灵活、可扩展的Web服务,这些服务无缝地运行在一系列操作系统和设备上,从桌面机器到平台电脑以及智能电话 — 甚至今天还不知道的设备。(这是一本将于2013年1月底出版的书,本翻译系列略 — 译者注)



TAG:

黑马程序员HTML、CSS学习笔记

黑马程序员HTML、CSS学习笔记

HTML:

//预格式化:保留文字在源代码中的格式,页面中显示的和源代码中的效果完全一致。浏览器在显示其中的内容时,会完全按照其真正的文本格式来显示。

例如,原封不动地保留文档中的空白,如空格、制表符等。

//HTML中空格的显示:使用&nbsp;或者加空格的时候将输入法设为全角。

//超链接:指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,也可以是相同网页上的不同位置,还可以是一个图片、一个电子邮件地址、一个文件或者一个应用程序。超文本链接是超链接的一种,是指用文字链接的形式来指向一个目标。

HTML文档类型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

//只有确定了正确的DOCTYPE,XHTML里的标识和级联样式才能正常生效。在HTML 1.0中有3种DTD声明可以选择,过度的Transitional、严格的Strict和框架的Frameset。使用严格的DTD来制作页面当然是最理想的方式,但对于没有深入了解Web标准的网页设计者,比较合适的是使用过渡的DTD。因为这种DTD还允许使用表现层的标识、元素和属性。

<!DOCTYPE html>:可以这样写而不用声明DTD。

基本结构:

<!>//注释标签用来在源文档中插入注释,注释会被浏览器忽略。<html>//html元素可告知浏览器这是一个html类型的文档。    <head>//定义在html语言头部的内容不会在网页上直接显示,它用于包含当前文档的相关信息,可以包含title元素、meta元素等。        <title></title>//页面标题元素。  <meta name="信息名称" content="内容1,内容2" />//meta元素用来定义页面的附加信息,其中包括页面的作者、版权、关键字等信息。        <style type="text/css"></style>//编写css代码。  <link href="xx.css" rel="stylesheet" type="text/css" />//引用外部css代码。  <link href="xx.ico" rel="Shortcut Icon" />//在标题栏添加图片。        <script type="text/javascript"></script>//编写javascript代码。  <script type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script>//引用外部javascript代码。    </head>    <body></body>//body元素定义文档的主体,它包含文档的所有内容(比如文本、图像、颜色和图形等等)。</html>

HTML标签元素:

<div></div>//在页面中div元素用来将页面内容分割成各个独立的部分。在每个div元素中,不仅可以包含文本内容,也可以包含图片、表单等。<p></p>//用来定义一个段落。在p元素中,可以包含文本、图片和用来修饰文本的元素。<br />//用来使文本换行显示。<hr />//用一条一定高度的分隔线,分隔页面内容。<blockquote></blockquote>//缩进显示。<pre></pre>//用来定义预格式化的文本。被包围在pre元素中的文本通常会保留空格和换行符。<address></address>//用来在内容中定义地址的相关内容。<b></b>//用来使包含的文本内容加粗显示。<small></small>//用来使包含的文本内容缩小一号显示。<i></i>//用来使包含的文本内容以斜体方式显示。<sup></sup>//用来使包含的文本内容以上标的方式显示。<sub></sub>//用来使包含的文本内容以下标的方式显示。<em></em>//用来强调内容,一般被强调的部分会以斜体显示。<strong></strong>//用来强调内容,一般被强调的部分会加粗显示。<a href="#1" target="_blank"></a>//用来链接一个目标,_blank表示目标页面在新的窗口显示。<a href="http://www.xxx.com"></a>//HTTP路径<a href="ftp://www.xxx.com"></a>//FTP路径<a href="mailto:xxx@sina.com"></a>//邮件路径,用来链接一个电子邮件的地址。<img src="#" alt="Alternate Text" />//用来在页面中定义一个图片。路径属性src用来定义一个调用图片的路径,代替图片的文本属性alt用来定义当图片路径错误或者其它原因无法显示时,替代图片的文本。<img src="naruto.ico"     alt="picture" width="258" border="0" usemap="#Map"  /><!>    <map name="Map" id="Map">      <area shape="poly" coords="83, 161, 152, 164, 114, 86" href="#" />      <area shape="circle" coords="181, 73, 41" href="#" />      </map><form action="/" method="post"></form>//用来创建一个表单。action:用来指定当提交表单时向何处发送表单数据。method:用来指定如何发送表单数据,可取值为get或者post。get:以URL变量的形式来发送。post:以HTTP post的形式来发送。<input type="text" id="name" name="name" value="" /> //用来提供用户输入文本的功能,只能单行显示,超出定义宽度的内容将被隐藏。<input type="password" id="name" name="name" value="" />//用来提供输入密码。<input type="submit" id="name" name="name" value="" />//用来发送表单中的内容。<input type="reset" id="name" name="name" value="" />//用来重置表单中的内容。<input type="image" id="name" name="name" value="" />//用来发送表单中的内容。<input type="button" id="name" name="name" value="" />//用来激活相应的行为。<input type="checkbox" id="name" name="name" value="" />//用来提供用户多项选择的功能。<input type="radio" id="name" name="name" value="" />//用来提供用户单项选择的功能。<input type="hidden" id="name" name="name" value="" />//用来隐藏表单控件的内容。<textarea rows="10" cols="10"></textarea>//用来提供用户输入文本的功能,多行显示。<label for="id"></label>//用来定义一个关联的标记。<iframe src=""></iframe>//用来在页面中定义一个框架区域。<select>//用来在页面中定义一个可以选择的下拉列表。    <optgroup label="">//用来定义下拉列表中的项目的分组。       <option value=""></option>//用来定义下拉列表中的项目。    </optgroup></select><fieldset>//将表单内的元素分组。    <legend></legend>//定义元素标题。</fieldset><ul>//无序列表元素,用来定义没有顺序编号的列表元素。     <li></li>//用来定义列表中的条目。</ul><ol>//有序列表元素,用来定义有顺序编号的列表元素。    <li></li></ol><dl>//用来定义类似术语或者词汇表的列表信息。    <dt></dt>//用来定义dl元素中的一个具体的条目,可以在dt元素中使用文本或者图片等。    <dd></dd>//用来定义dl元素中的一个具体的条目说明,可以在dd元素中使用其它的列表元素。</dl><table border="0" cellspacing="0" cellpadding="0" width="100%" >//用来在页面中定义一个表格。border:定义边框宽度。cellspacing:定义单元格之间的间距。cellpadding:定义单元格与其中的内容之间的间距。width:定义表格宽度。<caption></caption>//定义表格的标题。<thead></thead>//定义表格的表头。<tbody>//定义表格的主体。    <tr>//用来定义表格的行。        <td></td>//用来定义表格的单元格。    </tr></tbody><tfoot></tfoot>//定义表格的表尾。</table>

CSS:

//CSS又称为级联样式表,通常也简称为样式表。是W3C组织制定的,用于控制网页样式的一种标记性语言。由于使用CSS从页面中剥离了修饰内容,减少了大量的冗余代码,所以代码更加简洁清新、浏览速度更快等好处。

//使用CSS样式,通常有3种方法:元素中直接添加样式、从页面头部<style>元素中调用、采用链接的形式调用。其中元素中直接添加样式优先级最高、从页面头部调用次之、采用链接外部CSS样式最低。

//盒子模型:一个块元素可以看成是一个盒子形状的模型。这个模型的主体部分是元素的内容部分,用来显示元素中的主要内容,这个部分由width(宽)和height(高)属性来控制。在内容部分之外是补白部分,由padding属性控制。在padding属性之外是元素的边框,由border属性控制。在盒子模型的最外面是边界部分,由margin属性控制。

//在HTML中,页面元素可以分为两类。一类是块元素、另一类是内联元素。之所以区分元素,是因为在样式表中有部分属性是只对块元素有效。

块元素:是指那些在默认的情况下会换行显示的元素,如<div>元素、<p>元素等。

内联元素:是指在默认情况下显示方式类似于文本的元素。默认情况下同行显示,直到总体宽度大于父元素的时候才换行。如<a>、<b>、<img>、<input>。

//在网页中,使用浮动属性可以更改块元素的默认显示方式,将原来换行显示的块元素同行显示。

//当绝对定位的盒子的外层的盒子设置了相对定位的属性后,绝对定位的盒子相对于外层盒子的位置进行定位。

使用选择器关联CSS样式:

<style type="text/css">  *{}//选择所有的元素。  div{}//元素选择器,使用元素的名称来关联。    #name{}//id选择器,使用元素的id属性的值来关联。    .name{}//类选择器,使用元素的class属性的值来关联。    div p{}//后代选择器,选择所有div元素里的p元素。  .node>a{}//子元素选择器,选择class为node下的直接a元素。  a,p{}//分组选择器,选择所有的a元素和p元素。    a:link{}//伪类,定义未访问的链接样式。    a:visited{}//伪类,定义已访问的链接样式。    a:hover{}//伪类,定义鼠标悬停时的链接样式。    a:active{}//伪类,定义选定的链接样式。</style>

控制字体的显示:

    font-family//字体选择属性,用来定义使用的字体。    font-size//字体大小属性,用来控制字体的显示尺寸。    font-style//字体样式属性,用来定义字体的显示样式。    font-weight//字体加粗属性,用来定义字体是否显示加粗或者变细的效果。    color//字体颜色属性,用来定义字体使用的颜色。    text-decoration//字体修饰属性,用来定义字体的修饰效果。    text-transform//转换大小写属性,用来定义英文字母大小写之间的转换。    font-variant//小型大写字母属性,用来定义英文字母是否显示小型大写字母的效果。小型大写字母是介于大写字母和小写字母之间的一种效果。    letter-spacing//字母间隔属性,用来定义字母或(中文文字)之间的间隔大小。    word-spacing//单词间隔属性,用来定义单词之间的间隔大小。    line-height//行高属性,用来定义文本中行高的大小。

控制文本的显示:

text-indent//文本缩进属性,用来定义文本段落中段首的缩进效果。    text-align//水平对齐属性,用来定义元素的水平对齐效果。    direction//文本方向属性,用来定义元素中文本的显示方向。

控制列表元素的显示:

list-style-type//列表符号属性,用来定义列表中使用的预设符号。    list-style-image//列表图像属性,用来定义列表元素中替换列表符号的图像。    list-style-position//标记位置属性,用来定义列表中标记的显示位置。

控制元素的定位:

position//元素的定位属性,用来定义元素的定位方式。常用的属性是absolute(绝对定位)和relative(相对定位)。    z-index//层叠定位属性,用来定义层叠元素的显示顺序。使用没有单位的数字值。

元素的浮动属性:

float//用来定义块元素的浮动方式。

溢出属性:

overflow//用来定义元素溢出部分的显示方式。

显示方式属性:

display//用来更改元素默认的显示方式。

使用CSS的例子:

body{filter:gray;}//将网页过虑为灰度图,火狐浏览器不兼容。*{               //消除缝隙。    margin:0px auto;  padding:0px auto;}.content{        //居中显示。    margin-left:auto;  margin-right:auto;}border-width:1px 2px 3px 4px;//4个属性值:依次表示上、右、下、左边框的属性。border-style:double solid dashed;//3个属性值:前者表示上边框的属性,中间表示左右边框的属性,后者表示下边框的属性。border-color:Black Orange;//2个属性值:前者表示上下边框的属性,后者表示左右边框的属性。font-size:1.5em;//相对长度单位,相对于当前对象内文本的字体尺寸倍数。如果没有设置字体尺寸则相对于浏览器的默认字体尺寸。position:relative;//相对定位,相对于原来的位置偏移指定的距离,相对定位的盒子仍在标准流中,其它盒子仍然视其在原来的位置。position:absolute;//绝对定位,盒子的位置以浏览器窗口为基准进行定位,绝对定位的盒子脱离标准流,其它盒子视其不存在。position:fixed;//固定定位,盒子的位置以浏览器窗口为基准进行定位,脱离标准流。top:19px;//使用top、left、right、bottom指定相对定位、绝对定位或者固定定位的盒子的偏移距离。display:block;//将行内元素改为块级元素。display:inline;//将块级元素改为行内元素。display:none;//将元素的显示设为不可见。background-repeat:repeat-x;//背景图像将在水平方向重复。background-position:50px 20px;//移动背景图片的位置。




TAG: