css/0000775000076400007640000000000011200117063011245 5ustar draxusdraxuscss/ui-darkness/0000775000076400007640000000000011200117063013472 5ustar draxusdraxuscss/ui-darkness/images/0000775000076400007640000000000011200117063014737 5ustar draxusdraxuscss/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png0000664000076400007640000000352211200017574022753 0ustar draxusdraxusPNG  IHDRdp}IDATx[۶Pj*mvzžri +f˟=qӫ{tJ+u{^=vWt5:glGmzW۫sW=*9uWz3]{UWӎ-m]1Sw2c^;Y,+s+8fgeQ29]>Oom8z2{3ÑqΊf}>r3Oo?FchGmmWwu]mgFmGs-;zfc}7ϟ?>9?$t(@B$t(eq]T-3oll^ζk;hy!j?̶nՏGEo/gG4lptw|1ޕFgoYt>Yݗr8sK[~mw'8ۻ^)uU;>;&g =vw¹fQK#EpZ7g0Jj?G]]'E3P߿h/vs6ei}D8Ih9ag0 -^^:~Ёw":oS(X8J]"J?JM3WHN;ՙSYG;yҿ   : wPW : wPxC$t(@B|C$t(#w(:zݞp;t(wP;t(@B'?auQ32Fe>˲u:rQ;Ѹf[ݯz}4Ql+pvmye?::׽Q3;*YrQGѺ<̴x!J mQ;6::3ƨ۷o|GPn_0s|^ֽhc^mhoezrmm^~z[!֖mh\oNX{(!ڿzl%{EufIOܗ-g^c=7c1;c+n~hhHIDATx] c۶H儒-kiZK:glkn-tI>p,|J,wJ%$$2ŽA5nnF)0~ aG>ܔ9;`_{u n5_AA@l6B诼0PcPz@@.qK Cb (п$Qر6)w@(!!!!!Fx>!┰AA\Ȝe o(Q@jrVgK"; 4ɞ{MKN`݄ES=7jHݴ-ě Wֹd6' <ı27!!!!!!!GlǗboxl؀?h- r;P(Қ<:CŪӡAPOi_ !DhLX VuRvtпL%aݧ{X?=PXצ>ê9,N o O Nh@8?z{&VhO)F/HqJё`mRPC#N4kV C\ũ:S;9T%PߓrBmKjeQ$lvςD: Aw|"1EbyH=8?_(/44{|tA@G-'="*DELEV[7e`,GC[BfR͐>.xu`pL| 5VmxNه"klPl!<tqKHHHHv-&,4ʣF{iemj"7+́*ppևgt~{NZEloE@zݩ1&gr|JIe-v(  c:<˦1KǂCrᧀwGsA|Aߕ:q@<^]N!ֱ?!!!!BabvP+7j| L,xqRqc!B;1 {wB &<tLk Vc.㺼z0k_mVe^2" xDMh44i[  NO fꑱcB MH ty 1H3{#t~;BǏburcKTttz1'n`GSlUsA} v ~iS_6bl9'Uhr>e𹦳3vH?CQ8F&]rU7+Ā>ـ4flBz&g{nk9Jsg?#PsꓵA?kgߎ0& FKA:ie 6tԋ/дQM UF@]:f2N>tn<@S`̻Y߳FDM5puPNWo)GSvqJ}.\2dP\AoYT76ǹ1'巿19YF կ4V. &kjNş < j8_dvG%_?=w|4w`;&vOň7h Կ 1?M}+܌?Q~ĘΫ'|`3|Y]IT ^S~hFN)T푀%P[:e~9qѼMoQl6/u;}b-Zɠ;Z>4cmxx*u%rNN|+@S@uoF>fJFq{M1Ӳ}pH ;F !q׀ d%z&[ (7?H27ԝޖ,v.E1`RVg{yy!Kx:;Q+iFX&`䱉bV"gw S!{~ $$$$$|#_/M\}Bߓk>G Ml¿`]ఄiڝL/^N>4pԯƟ^uFK?_  v6F*kpmQrWh<۞|p`-;i_22sO})G%z5f\X ]ה# =/:|AWxد#\J 1~;?&uuT> &mt98_E)וoS9 F1M-W[imV.Cg fG'+rՄC:VnQj ^՗墾["3;}oF3.V\_6a cD}% gDQyQٿ=;<1(ڿCB`md:[|V@cB=sY3hG?ԚA b|.wAYZ%{1ct]9Mu8e7 ו=$ؗ]ȌaJBȌ h~t:|cHHHHHHH6 DwABF׌}CF"@wmxNO=no/t`NUw|`S+,)7;oO@ցp? se%PIENDB`css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png0000664000076400007640000000032311200017574021751 0ustar draxusdraxusPNG  IHDR(dcBIDATh10s(3ɿy> m^9#rjO | .'$$$$$$$$$$$$$|p~O#"""""""""""""""""""""""M9QOIENDB`css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png0000664000076400007640000000014211200017574022564 0ustar draxusdraxusPNG  IHDRdG,Z`)IDATc```0FFF&&&&,2 4܁/)#8IENDB`css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png0000664000076400007640000000024711200017574022145 0ustar draxusdraxusPNG  IHDR_:MnIDAT81@DK 桹l,\[`x|Y˄'t9fZJٱ _ D?oaoB]|1 @YIENDB`css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png0000664000076400007640000000026411200017574022165 0ustar draxusdraxusPNG  IHDR(ddrz{IDATh1 1T$t3;_TUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPT?+[IENDB`css/ui-darkness/images/ui-icons_a83300_256x240.png0000664000076400007640000001043311200017574021112 0ustar draxusdraxusPNG  IHDRIJPLTE3333333333333333333333333333333333333333333333333333333333333333333333333333333f?NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx] c۶H儒-kiZK:glkn-tI>p,|J,wJ%$$2ŽA5nnF)0~ aG>ܔ9;`_{u n5_AA@l6B诼0PcPz@@.qK Cb (п$Qر6)w@(!!!!!Fx>!┰AA\Ȝe o(Q@jrVgK"; 4ɞ{MKN`݄ES=7jHݴ-ě Wֹd6' <ı27!!!!!!!GlǗboxl؀?h- r;P(Қ<:CŪӡAPOi_ !DhLX VuRvtпL%aݧ{X?=PXצ>ê9,N o O Nh@8?z{&VhO)F/HqJё`mRPC#N4kV C\ũ:S;9T%PߓrBmKjeQ$lvςD: Aw|"1EbyH=8?_(/44{|tA@G-'="*DELEV[7e`,GC[BfR͐>.xu`pL| 5VmxNه"klPl!<tqKHHHHv-&,4ʣF{iemj"7+́*ppևgt~{NZEloE@zݩ1&gr|JIe-v(  c:<˦1KǂCrᧀwGsA|Aߕ:q@<^]N!ֱ?!!!!BabvP+7j| L,xqRqc!B;1 {wB &<tLk Vc.㺼z0k_mVe^2" xDMh44i[  NO fꑱcB MH ty 1H3{#t~;BǏburcKTttz1'n`GSlUsA} v ~iS_6bl9'Uhr>e𹦳3vH?CQ8F&]rU7+Ā>ـ4flBz&g{nk9Jsg?#PsꓵA?kgߎ0& FKA:ie 6tԋ/дQM UF@]:f2N>tn<@S`̻Y߳FDM5puPNWo)GSvqJ}.\2dP\AoYT76ǹ1'巿19YF կ4V. &kjNş < j8_dvG%_?=w|4w`;&vOň7h Կ 1?M}+܌?Q~ĘΫ'|`3|Y]IT ^S~hFN)T푀%P[:e~9qѼMoQl6/u;}b-Zɠ;Z>4cmxx*u%rNN|+@S@uoF>fJFq{M1Ӳ}pH ;F !q׀ d%z&[ (7?H27ԝޖ,v.E1`RVg{yy!Kx:;Q+iFX&`䱉bV"gw S!{~ $$$$$|#_/M\}Bߓk>G Ml¿`]ఄiڝL/^N>4pԯƟ^uFK?_  v6F*kpmQrWh<۞|p`-;i_22sO})G%z5f\X ]ה# =/:|AWxد#\J 1~;?&uuT> &mt98_E)וoS9 F1M-W[imV.Cg fG'+rՄC:VnQj ^՗墾["3;}oF3.V\_6a cD}% gDQyQٿ=;<1(ڿCB`md:[|V@cB=sY3hG?ԚA b|.wAYZ%{1ct]9Mu8e7 ו=$ؗ]ȌaJBȌ h~t:|cHHHHHHH6 DwABF׌}CF"@wmxNO=no/t`NUw|`S+,)7;oO@ցp? se%PIENDB`css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png0000664000076400007640000000016511200017574022674 0ustar draxusdraxusPNG  IHDRdG,Z`n~hhHIDATx] c۶H儒-kiZK:glkn-tI>p,|J,wJ%$$2ŽA5nnF)0~ aG>ܔ9;`_{u n5_AA@l6B诼0PcPz@@.qK Cb (п$Qر6)w@(!!!!!Fx>!┰AA\Ȝe o(Q@jrVgK"; 4ɞ{MKN`݄ES=7jHݴ-ě Wֹd6' <ı27!!!!!!!GlǗboxl؀?h- r;P(Қ<:CŪӡAPOi_ !DhLX VuRvtпL%aݧ{X?=PXצ>ê9,N o O Nh@8?z{&VhO)F/HqJё`mRPC#N4kV C\ũ:S;9T%PߓrBmKjeQ$lvςD: Aw|"1EbyH=8?_(/44{|tA@G-'="*DELEV[7e`,GC[BfR͐>.xu`pL| 5VmxNه"klPl!<tqKHHHHv-&,4ʣF{iemj"7+́*ppևgt~{NZEloE@zݩ1&gr|JIe-v(  c:<˦1KǂCrᧀwGsA|Aߕ:q@<^]N!ֱ?!!!!BabvP+7j| L,xqRqc!B;1 {wB &<tLk Vc.㺼z0k_mVe^2" xDMh44i[  NO fꑱcB MH ty 1H3{#t~;BǏburcKTttz1'n`GSlUsA} v ~iS_6bl9'Uhr>e𹦳3vH?CQ8F&]rU7+Ā>ـ4flBz&g{nk9Jsg?#PsꓵA?kgߎ0& FKA:ie 6tԋ/дQM UF@]:f2N>tn<@S`̻Y߳FDM5puPNWo)GSvqJ}.\2dP\AoYT76ǹ1'巿19YF կ4V. &kjNş < j8_dvG%_?=w|4w`;&vOň7h Կ 1?M}+܌?Q~ĘΫ'|`3|Y]IT ^S~hFN)T푀%P[:e~9qѼMoQl6/u;}b-Zɠ;Z>4cmxx*u%rNN|+@S@uoF>fJFq{M1Ӳ}pH ;F !q׀ d%z&[ (7?H27ԝޖ,v.E1`RVg{yy!Kx:;Q+iFX&`䱉bV"gw S!{~ $$$$$|#_/M\}Bߓk>G Ml¿`]ఄiڝL/^N>4pԯƟ^uFK?_  v6F*kpmQrWh<۞|p`-;i_22sO})G%z5f\X ]ה# =/:|AWxد#\J 1~;?&uuT> &mt98_E)וoS9 F1M-W[imV.Cg fG'+rՄC:VnQj ^՗墾["3;}oF3.V\_6a cD}% gDQyQٿ=;<1(ڿCB`md:[|V@cB=sY3hG?ԚA b|.wAYZ%{1ct]9Mu8e7 ו=$ؗ]ȌaJBȌ h~t:|cHHHHHHH6 DwABF׌}CF"@wmxNO=no/t`NUw|`S+,)7;oO@ցp? se%PIENDB`css/ui-darkness/images/ui-icons_222222_256x240.png0000664000076400007640000001043311200017574021027 0ustar draxusdraxusPNG  IHDRIJPLTE"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""]NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx] c۶H儒-kiZK:glkn-tI>p,|J,wJ%$$2ŽA5nnF)0~ aG>ܔ9;`_{u n5_AA@l6B诼0PcPz@@.qK Cb (п$Qر6)w@(!!!!!Fx>!┰AA\Ȝe o(Q@jrVgK"; 4ɞ{MKN`݄ES=7jHݴ-ě Wֹd6' <ı27!!!!!!!GlǗboxl؀?h- r;P(Қ<:CŪӡAPOi_ !DhLX VuRvtпL%aݧ{X?=PXצ>ê9,N o O Nh@8?z{&VhO)F/HqJё`mRPC#N4kV C\ũ:S;9T%PߓrBmKjeQ$lvςD: Aw|"1EbyH=8?_(/44{|tA@G-'="*DELEV[7e`,GC[BfR͐>.xu`pL| 5VmxNه"klPl!<tqKHHHHv-&,4ʣF{iemj"7+́*ppևgt~{NZEloE@zݩ1&gr|JIe-v(  c:<˦1KǂCrᧀwGsA|Aߕ:q@<^]N!ֱ?!!!!BabvP+7j| L,xqRqc!B;1 {wB &<tLk Vc.㺼z0k_mVe^2" xDMh44i[  NO fꑱcB MH ty 1H3{#t~;BǏburcKTttz1'n`GSlUsA} v ~iS_6bl9'Uhr>e𹦳3vH?CQ8F&]rU7+Ā>ـ4flBz&g{nk9Jsg?#PsꓵA?kgߎ0& FKA:ie 6tԋ/дQM UF@]:f2N>tn<@S`̻Y߳FDM5puPNWo)GSvqJ}.\2dP\AoYT76ǹ1'巿19YF կ4V. &kjNş < j8_dvG%_?=w|4w`;&vOň7h Կ 1?M}+܌?Q~ĘΫ'|`3|Y]IT ^S~hFN)T푀%P[:e~9qѼMoQl6/u;}b-Zɠ;Z>4cmxx*u%rNN|+@S@uoF>fJFq{M1Ӳ}pH ;F !q׀ d%z&[ (7?H27ԝޖ,v.E1`RVg{yy!Kx:;Q+iFX&`䱉bV"gw S!{~ $$$$$|#_/M\}Bߓk>G Ml¿`]ఄiڝL/^N>4pԯƟ^uFK?_  v6F*kpmQrWh<۞|p`-;i_22sO})G%z5f\X ]ה# =/:|AWxد#\J 1~;?&uuT> &mt98_E)וoS9 F1M-W[imV.Cg fG'+rՄC:VnQj ^՗墾["3;}oF3.V\_6a cD}% gDQyQٿ=;<1(ڿCB`md:[|V@cB=sY3hG?ԚA b|.wAYZ%{1ct]9Mu8e7 ו=$ؗ]ȌaJBȌ h~t:|cHHHHHHH6 DwABF׌}CF"@wmxNO=no/t`NUw|`S+,)7;oO@ցp? se%PIENDB`css/ui-darkness/images/ui-icons_ffffff_256x240.png0000664000076400007640000001043311200017574021517 0ustar draxusdraxusPNG  IHDRIJPLTENtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx] c۶H儒-kiZK:glkn-tI>p,|J,wJ%$$2ŽA5nnF)0~ aG>ܔ9;`_{u n5_AA@l6B诼0PcPz@@.qK Cb (п$Qر6)w@(!!!!!Fx>!┰AA\Ȝe o(Q@jrVgK"; 4ɞ{MKN`݄ES=7jHݴ-ě Wֹd6' <ı27!!!!!!!GlǗboxl؀?h- r;P(Қ<:CŪӡAPOi_ !DhLX VuRvtпL%aݧ{X?=PXצ>ê9,N o O Nh@8?z{&VhO)F/HqJё`mRPC#N4kV C\ũ:S;9T%PߓrBmKjeQ$lvςD: Aw|"1EbyH=8?_(/44{|tA@G-'="*DELEV[7e`,GC[BfR͐>.xu`pL| 5VmxNه"klPl!<tqKHHHHv-&,4ʣF{iemj"7+́*ppևgt~{NZEloE@zݩ1&gr|JIe-v(  c:<˦1KǂCrᧀwGsA|Aߕ:q@<^]N!ֱ?!!!!BabvP+7j| L,xqRqc!B;1 {wB &<tLk Vc.㺼z0k_mVe^2" xDMh44i[  NO fꑱcB MH ty 1H3{#t~;BǏburcKTttz1'n`GSlUsA} v ~iS_6bl9'Uhr>e𹦳3vH?CQ8F&]rU7+Ā>ـ4flBz&g{nk9Jsg?#PsꓵA?kgߎ0& FKA:ie 6tԋ/дQM UF@]:f2N>tn<@S`̻Y߳FDM5puPNWo)GSvqJ}.\2dP\AoYT76ǹ1'巿19YF կ4V. &kjNş < j8_dvG%_?=w|4w`;&vOň7h Կ 1?M}+܌?Q~ĘΫ'|`3|Y]IT ^S~hFN)T푀%P[:e~9qѼMoQl6/u;}b-Zɠ;Z>4cmxx*u%rNN|+@S@uoF>fJFq{M1Ӳ}pH ;F !q׀ d%z&[ (7?H27ԝޖ,v.E1`RVg{yy!Kx:;Q+iFX&`䱉bV"gw S!{~ $$$$$|#_/M\}Bߓk>G Ml¿`]ఄiڝL/^N>4pԯƟ^uFK?_  v6F*kpmQrWh<۞|p`-;i_22sO})G%z5f\X ]ה# =/:|AWxد#\J 1~;?&uuT> &mt98_E)וoS9 F1M-W[imV.Cg fG'+rՄC:VnQj ^՗墾["3;}oF3.V\_6a cD}% gDQyQٿ=;<1(ڿCB`md:[|V@cB=sY3hG?ԚA b|.wAYZ%{1ct]9Mu8e7 ו=$ؗ]ȌaJBȌ h~t:|cHHHHHHH6 DwABF׌}CF"@wmxNO=no/t`NUw|`S+,)7;oO@ցp? se%PIENDB`css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png0000664000076400007640000000016311200017574021641 0ustar draxusdraxusPNG  IHDRoX :IDAT81 BQ 7@&:lbX^>#A0|KUuEHrԵxsbYPrIENDB`css/ui-darkness/jquery-ui-1.7.1.custom.css0000664000076400007640000006545311200120714020123 0ustar draxusdraxus/* * jQuery UI CSS Framework * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { position: absolute; left: -99999999px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } /* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix { height:1%; } .ui-helper-clearfix { display:block; } /* end clearfix */ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; float: right; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } /* * jQuery UI CSS Framework * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=333333&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=25&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=05_inset_soft.png&bgImgOpacityContent=25&borderColorContent=666666&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=555555&bgTextureDefault=02_glass.png&bgImgOpacityDefault=20&borderColorDefault=666666&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=0078a3&bgTextureHover=02_glass.png&bgImgOpacityHover=40&borderColorHover=59b4d4&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f58400&bgTextureActive=05_inset_soft.png&bgImgOpacityActive=30&borderColorActive=ffaf0f&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=02_glass.png&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=01_flat.png&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px */ /* Component containers ----------------------------------*/ .ui-widget { font-family: Segoe UI, Arial, sans-serif; font-size: 1.1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Segoe UI, Arial, sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #666666; background: #000000 url(images/ui-bg_inset-soft_25_000000_1x100.png) 50% bottom repeat-x; color: #ffffff; } .ui-widget-content a { color: #ffffff; } .ui-widget-header { border: 1px solid #333333; background: #333333 url(images/ui-bg_gloss-wave_25_333333_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } .ui-widget-header a { color: #ffffff; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #666666; background: #555555 url(images/ui-bg_glass_20_555555_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eeeeee; outline: none; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #eeeeee; text-decoration: none; outline: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #59b4d4; background: #0078a3 url(images/ui-bg_glass_40_0078a3_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; outline: none; } .ui-state-hover a, .ui-state-hover a:hover { color: #ffffff; text-decoration: none; outline: none; } .ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #ffaf0f; background: #f58400 url(images/ui-bg_inset-soft_30_f58400_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; outline: none; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; outline: none; text-decoration: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #cccccc; background: #eeeeee url(images/ui-bg_highlight-soft_80_eeeeee_1x100.png) 50% top repeat-x; color: #2e7db2; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #2e7db2; } .ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #ffb73d; background: #ffc73d url(images/ui-bg_glass_40_ffc73d_1x400.png) 50% 50% repeat-x; color: #111111; } .ui-state-error a, .ui-widget-content .ui-state-error a { color: #111111; } .ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #111111; } .ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } .ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_cccccc_256x240.png); } .ui-widget-content .ui-icon {background-image: url(images/ui-icons_cccccc_256x240.png); } .ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } .ui-state-default .ui-icon { background-image: url(images/ui-icons_cccccc_256x240.png); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } .ui-state-active .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_4b8e0b_256x240.png); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_a83300_256x240.png); } /* positioning */ .ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-ne { background-position: -16px 0; } .ui-icon-carat-1-e { background-position: -32px 0; } .ui-icon-carat-1-se { background-position: -48px 0; } .ui-icon-carat-1-s { background-position: -64px 0; } .ui-icon-carat-1-sw { background-position: -80px 0; } .ui-icon-carat-1-w { background-position: -96px 0; } .ui-icon-carat-1-nw { background-position: -112px 0; } .ui-icon-carat-2-n-s { background-position: -128px 0; } .ui-icon-carat-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -64px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -64px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 0 -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-off { background-position: -96px -144px; } .ui-icon-radio-on { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; } .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; } .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; } .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } .ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; } .ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } .ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } .ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; } .ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; } /* Overlays */ .ui-widget-overlay { background: #5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); } .ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #cccccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion ----------------------------------*/ .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } .ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker ----------------------------------*/ .ui-datepicker { width: 17em; padding: .2em .2em 0; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left:2px; } .ui-datepicker .ui-datepicker-next { right:2px; } .ui-datepicker .ui-datepicker-prev-hover { left:1px; } .ui-datepicker .ui-datepicker-next-hover { right:1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width:auto; } .ui-datepicker-multi .ui-datepicker-group { float:left; } .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } .ui-datepicker-row-break { clear:both; width:100%; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } .ui-datepicker-rtl .ui-datepicker-group { float:right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display/**/: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ }/* Dialog ----------------------------------*/ .ui-dialog { position: relative; padding: .2em; width: 300px; } .ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } /* Progressbar ----------------------------------*/ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable ----------------------------------*/ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider ----------------------------------*/ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs ----------------------------------*/ .ui-tabs { padding: .2em; zoom: 1; } .ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } .ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } facebox/0000755000076400007640000000000011200133047012062 5ustar draxusdraxusfacebox/tl.png0000644000076400007640000000020411007650731013214 0ustar draxusdraxusPNG  IHDR 2ϽKIDATxڍΡ DQ"% tr 'u/yNIENDB`facebox/bl.png0000644000076400007640000000017411007650731013200 0ustar draxusdraxusPNG  IHDR 2ϽCIDATc Za XSUBtb *4%J!~ 4C= :P8K/6TIENDB`facebox/README.txt0000644000076400007640000000026211007650731013571 0ustar draxusdraxusPlease visit http://famspam.com/facebox/ or open index.html in your favorite browser. Need help? Join our Google Groups mailing list: http://groups.google.com/group/facebox/ facebox/closelabel.gif0000755000076400007640000000172311007650731014675 0ustar draxusdraxusGIF89aBYYY҃PPPTTTVVVRRRQQQXXXUUUSSSWWWLLLOOOfff```{{{lllxxxKKK___ߴpppccc咒nnnoooՎeeevvvmmm|||籱yyyZZZdddMMMsssgggNNNiiizzz!,B\]\'\,GB\\#]!@Q"].4UZ]×ZZM2EZ$ > [ ][̕[ /\냣[ T6Fа0 ]"lYAKșd` Z0Q.d|J$@ HU&xN-* 8zP$&$!-,ɳU]**ytKRCHa )i%Zڥ-m!FQ0`B&E71K|H†O$c tM"neIQbU2Ǒg 1%qM`puNc9'[lI@q+BiY@8pI :,`3GUq#ذ7l9YπDQq=+/8¹M document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); } facebox/b.png0000644000076400007640000000012411007650731013017 0ustar draxusdraxusPNG  IHDR1_IDAT8c @)f5dԐQCF vpi\IENDB`facebox/tr.png0000644000076400007640000000017511007650731013231 0ustar draxusdraxusPNG  IHDR 2ϽDIDATxڍʡ 0أKt<3Ԗ ˣpK -3m0Q8ظ56*;XE/QIENDB`facebox/loading.gif0000755000076400007640000000531711007650731014210 0ustar draxusdraxusGIF89a 򺺺444ėTTT! NETSCAPE2.0! , H *\p hp"8G>D)R4CIË\9p:ȹs1_2`p` u< uSYڐkǞ`Fhvƴ6S>u+ryJ/QM.0@p_ ++/KY&]9ى Mr `ixr\˪ vfjMO&*Z؇o>;ܦŝ",,@CPؼrSE.ٴjTWYR Y+ѫKb ڌ! ,H*Terms * Loads the #terms div in the box * * Terms * Loads the terms.html page in the box * * Terms * Loads the terms.png image in the box * * * You can also use it programmatically: * * jQuery.facebox('some html') * * The above will open a facebox with "some html" as the content. * * jQuery.facebox(function($) { * $.get('blah.html', function(data) { $.facebox(data) }) * }) * * The above will show a loading screen before the passed function is called, * allowing for a better ajaxy experience. * * The facebox function can also display an ajax page or image: * * jQuery.facebox({ ajax: 'remote.html' }) * jQuery.facebox({ image: 'dude.jpg' }) * * Want to close the facebox? Trigger the 'close.facebox' document event: * * jQuery(document).trigger('close.facebox') * * Facebox also has a bunch of other hooks: * * loading.facebox * beforeReveal.facebox * reveal.facebox (aliased as 'afterReveal.facebox') * init.facebox * * Simply bind a function to any of these hooks: * * $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... }) * */ (function($) { $.facebox = function(data, klass) { $.facebox.loading() if (data.ajax) fillFaceboxFromAjax(data.ajax) else if (data.image) fillFaceboxFromImage(data.image) else if (data.div) fillFaceboxFromHref(data.div) else if ($.isFunction(data)) data.call($) else $.facebox.reveal(data, klass) } /* * Public, $.facebox methods */ $.extend($.facebox, { settings: { opacity : 0, overlay : true, loadingImage : 'facebox/loading.gif', closeImage : 'facebox/closelabel.gif', imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ], faceboxHtml : '\ ' }, loading: function() { init() if ($('#facebox .loading').length == 1) return true showOverlay() $('#facebox .content').empty() $('#facebox .body').children().hide().end(). append('
') $('#facebox').css({ top: getPageScroll()[1] + (getPageHeight() / 10), left: 385.5 }).show() $(document).bind('keydown.facebox', function(e) { if (e.keyCode == 27) $.facebox.close() return true }) $(document).trigger('loading.facebox') }, reveal: function(data, klass) { $(document).trigger('beforeReveal.facebox') if (klass) $('#facebox .content').addClass(klass) $('#facebox .content').append(data) $('#facebox .loading').remove() $('#facebox .body').children().fadeIn('normal') $('#facebox').css('left', $(window).width() / 2 - ($('#facebox table').width() / 2)) $(document).trigger('reveal.facebox').trigger('afterReveal.facebox') }, close: function() { $(document).trigger('close.facebox') return false } }) /* * Public, $.fn methods */ $.fn.facebox = function(settings) { init(settings) function clickHandler() { $.facebox.loading(true) // support for rel="facebox.inline_popup" syntax, to add a class // also supports deprecated "facebox[.inline_popup]" syntax var klass = this.rel.match(/facebox\[?\.(\w+)\]?/) if (klass) klass = klass[1] fillFaceboxFromHref(this.href, klass) return false } return this.click(clickHandler) } /* * Private methods */ // called one time to setup facebox on this page function init(settings) { if ($.facebox.settings.inited) return true else $.facebox.settings.inited = true $(document).trigger('init.facebox') makeCompatible() var imageTypes = $.facebox.settings.imageTypes.join('|') $.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i') if (settings) $.extend($.facebox.settings, settings) $('body').append($.facebox.settings.faceboxHtml) var preload = [ new Image(), new Image() ] preload[0].src = $.facebox.settings.closeImage preload[1].src = $.facebox.settings.loadingImage $('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() { preload.push(new Image()) preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1') }) $('#facebox .close').click($.facebox.close) $('#facebox .close_image').attr('src', $.facebox.settings.closeImage) } // getPageScroll() by quirksmode.com function getPageScroll() { var xScroll, yScroll; if (self.pageYOffset) { yScroll = self.pageYOffset; xScroll = self.pageXOffset; } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict yScroll = document.documentElement.scrollTop; xScroll = document.documentElement.scrollLeft; } else if (document.body) {// all other Explorers yScroll = document.body.scrollTop; xScroll = document.body.scrollLeft; } return new Array(xScroll,yScroll) } // Adapted from getPageSize() by quirksmode.com function getPageHeight() { var windowHeight if (self.innerHeight) { // all except Explorer windowHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode windowHeight = document.documentElement.clientHeight; } else if (document.body) { // other Explorers windowHeight = document.body.clientHeight; } return windowHeight } // Backwards compatibility function makeCompatible() { var $s = $.facebox.settings $s.loadingImage = $s.loading_image || $s.loadingImage $s.closeImage = $s.close_image || $s.closeImage $s.imageTypes = $s.image_types || $s.imageTypes $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml } // Figures out what you want to display and displays it // formats are: // div: #id // image: blah.extension // ajax: anything else function fillFaceboxFromHref(href, klass) { // div if (href.match(/#/)) { var url = window.location.href.split('#')[0] var target = href.replace(url,'') $.facebox.reveal($(target).clone().show(), klass) // image } else if (href.match($.facebox.settings.imageTypesRegexp)) { fillFaceboxFromImage(href, klass) // ajax } else { fillFaceboxFromAjax(href, klass) } } function fillFaceboxFromImage(href, klass) { var image = new Image() image.onload = function() { $.facebox.reveal('
', klass) } image.src = href } function fillFaceboxFromAjax(href, klass) { $.get(href, function(data) { $.facebox.reveal(data, klass) }) } function skipOverlay() { return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null } function showOverlay() { if (skipOverlay()) return if ($('facebox_overlay').length == 0) $("body").append('
') $('#facebox_overlay').hide().addClass("facebox_overlayBG") .css('opacity', $.facebox.settings.opacity) .click(function() { $(document).trigger('close.facebox') }) .fadeIn(200) return false } function hideOverlay() { if (skipOverlay()) return $('#facebox_overlay').fadeOut(200, function(){ $("#facebox_overlay").removeClass("facebox_overlayBG") $("#facebox_overlay").addClass("facebox_hide") $("#facebox_overlay").remove() }) return false } /* * Bindings */ $(document).bind('close.facebox', function() { $(document).unbind('keydown.facebox') $('#facebox').fadeOut(function() { $('#facebox .content').removeClass().addClass('content') hideOverlay() $('#facebox .loading').remove() }) }) })(jQuery); facebox/br.png0000644000076400007640000000017411007650731013206 0ustar draxusdraxusPNG  IHDR 2ϽCIDATʡ EQ[Efꆘp5 q1jt5N%2%_\:` S>/zIENDB`feed.xml0000664000076400007640000117315211200144152012113 0ustar draxusdraxus Planet ETSIIThttp://localhost/El planet informaticotelecomunicado de GranadaWed, 06 May 2009 01:14:50 GMTPyRSS2Gen-1.0.0http://blogs.law.harvard.edu/tech/rssEntrega del premio y publicación de lujoyglamour.nethttp://atalaya.blogalia.com//historias/62951http://atalaya.blogalia.com//historias/62951¿Pasa algo con el correo de Telefónica?http://atalaya.blogalia.com//historias/62932http://atalaya.blogalia.com//historias/62932Lo que me esperahttp://atalaya.blogalia.com//historias/62925http://atalaya.blogalia.com//historias/62925La serie de ayerhttp://atalaya.blogalia.com//historias/62852http://atalaya.blogalia.com//historias/62852[Libro] Asimov's, March 2009http://atalaya.blogalia.com//historias/62841http://atalaya.blogalia.com//historias/62841Adentrándose en el mundo proceloso del podcasthttp://atalaya.blogalia.com//historias/62835http://atalaya.blogalia.com//historias/62835Son tiempos duros para los milmillonarioshttp://atalaya.blogalia.com//historias/62826http://atalaya.blogalia.com//historias/62826Si consume marcas, es usted un marquéshttp://atalaya.blogalia.com//historias/62822http://atalaya.blogalia.com//historias/62822Taller de audacity/podcasting por J. A. Geladohttp://atalaya.blogalia.com//historias/62817http://atalaya.blogalia.com//historias/62817[Libros recibidos] Diáspora y El Secreto de Niceahttp://atalaya.blogalia.com//historias/62800http://atalaya.blogalia.com//historias/62800Blogs y Medios Granada 2009http://draxus.org/weblog/2009/04/22/blogs-y-medios-granada-2009/<div align="center"><img src="http://draxus.org/weblog/wp-content/uploads/2009/04/logo_VIB_M.jpg" alt="Logo BMC6" /></div> <p>Y ya va por la <strong>6ª edición</strong> estas <a href="http://geneura.ugr.es/~jmerelo/jornadas/BMC6/">jornadas de bitácoras y medios de comunicación</a> que organizan <a href="http://atalaya.blogalia.com/">JJ Merelo</a> y <a href="http://blogs.ideal.es/cableados/posts">JF Barrera</a>. Tuve la suerte de asistir a los <a href="http://draxus.org/weblog/2007/05/12/pequeno-resumen-de-las-jornadas-bmc4/">dos</a> <a href="http://draxus.org/weblog/2008/05/17/cronica-bmc5/">últimas</a> y me dejaron con buen sabor de boca, así que repetiré de nuevo en esta cita que os invito a no perderos.</p> <p>Serán los próximos <strong>14 y 15 de mayo en el <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=es&msa=0&msid=114220721601479762600.000001124c86c73003cfa&ll=37.174201,-3.594911&spn=0.009934,0.017381&z=16">Hospital del Peregrino</a></strong> y contaremos con la presencia de bloggers y profesionales de reconocido prestigio como <a href="http://pjorge.com/">pjorge</a>, <a href="http://fernand0.blogalia.com/">fernand0</a>, <a href="http://www.soniablanco.es/">soniablanco</a>, <a href="http://alt1040.com/">earcos</a>, <a href="http://kekasanchez.wordpress.com/">kekasanchez</a>, <a href="http://escolar.net/">escolar</a> y muchos más. Cómo no, también acudirán habituales del bloguerío granaíno como <a href="http://blog.arkangel.info/2009/04/20/bmc6/">Arkangel</a>, <a href="http://www.psicobyte.com/articulo/bym6">Psicobyte</a>, <a href="http://www.campanilla.info">Campanilla</a>, <a href="http://misvaguedades.blogspot.com/2009/04/sextas-jornadas-de-bitacoras-y-medios.html">Alfonso E. Romero</a>, <a href="http://moviendocubos.blogspot.com/2009/04/vi-jornadas-sobre-bitacoras-y-medios-de.html">LP-Spain</a> y espero que muchos más :)</p> <p>Podéis ver el <a href="http://geneura.ugr.es/~jmerelo/jornadas/BMC6/">programa de las jornadas</a> y <strong><a href="http://geneura.ugr.es/~jmerelo/jornadas/BMC.cgi">apuntaros</a></strong> por si queréis venir. Por la noche habrá <em>cerveceo</em> :)</p>http://draxus.org/weblog/2009/04/22/blogs-y-medios-granada-2009/Cómo clonar ramas (branch) en githttp://draxus.org/weblog/2009/04/18/como-clonar-ramas-branch-en-git/<p><strong>Escenario</strong><br /> Tienes tu proyecto en un repositorio de github.com con dos ramas (<em>master</em> y <em>foo</em>) y quieres clonarlas a tu disco duro.</p> <p><strong>Solución</strong></p> <p><code>git clone git@github.com:usuario/proyecto.git</code></p> <p>Con esto obtendremos la rama principal (<em>master</em>).</p> <p><code>git fetch<br /> git checkout --track -b foo origin/foo</code></p> <p>Y con esto otro la rama <em>foo</em>.</p> <p>¿Conocéis alguna forma más sencilla? En este caso tenemos dos ramas, pero si hubiese N+1, ¿tendremos que descargar todas una a una?</p> <p><a href="http://groups.google.com/group/github/browse_thread/thread/71f944b925467ab6">Vía</a></p>http://draxus.org/weblog/2009/04/18/como-clonar-ramas-branch-en-git/Navegación jerarquizada de pestañas en Firefoxhttp://draxus.org/weblog/2009/04/15/navegacion-jerarquizada-de-pestanas-en-firefox/<p>En <a href="http://www.genbeta.com/navegadores/es-hora-de-acabar-con-las-pestanas">este post de Genbeta</a> hablan de que los chicos de <a href="http://labs.mozilla.com/">Mozilla Labs</a> están maquinando la <strong>idea de cambiar la <a href="http://es.wikipedia.org/wiki/Navegaci%C3%B3n_por_pesta%C3%B1as">navegación por pestañas</a> de Firefox</strong> por otra un tanto más &#8220;semántica&#8221; como podéis ver en <a href="http://www.azarask.in/blog/post/firefoxnext-tabs-on-the-side/">este post</a> y en <a href="http://informationarchitects.jp/designing-firefox-32/">este otro</a>.</p> <p><img src="http://draxus.org/weblog/wp-content/uploads/2009/04/treetabs.png" alt="Tree Style Tab imagen" /> A raíz de ahí he encontrado el plugin <strong><a href="https://addons.mozilla.org/en-US/firefox/addon/5890">Tree Style Tab</a></strong> que lo que hace simplemente es eliminar la barra superior de pestañas y ponerlas en el lateral, pero esta vez jerarquizas por orden de navegación. Es decir, puedes controlar mucho mejor de &#8220;dónde vienes&#8221; navegando, así como tener muchas más pestañas a la vista que de la manera tradicional.</p> <p>Ahora me pregunto, si la primera vez que se usaron las pestañas fue en <strong>1994</strong> y fue hasta el año 2006 cuando Microsoft decidió incorporarlas en IE7, ¿cuánto tardarán en adaptarse a las nuevas técnicas de navegación? :-)</p>http://draxus.org/weblog/2009/04/15/navegacion-jerarquizada-de-pestanas-en-firefox/HP LaserJet 1020 en Fedora 10http://draxus.org/weblog/2009/04/14/hp-laserjet-1020-en-fedora-10/<p>Desde hace unos días soy usuario de <a href="http://fedoraproject.org/">Fedora 10</a>, por ahora bastante contento, y la <a href="http://draxus.org/weblog/2005/07/29/hp-laserjet-1020-en-ubuntu/">otra forma que usaba en Ubuntu</a> no me funcionó, así que os dejo con un nuevo how-to más sencillo:</p> <ol> <li>Enciende la impresora</li> <li>Si tienes una versión configurada de la misma en Impresoras, bórrala</li> <li>Ejecuta como root los siguientes comandos:</li> <li><code># yum install hplip hplip-gui</code></li> <li><code># hp-setup</code></li> <li>Sigue los pasos de la instalación gráfica</li> <li>Apaga la impresora y vuelve a encenderla</li> <li>Ya debe funcionar correctamente</li> </ol> <p>Vía <a href="http://tkjacobsen.wordpress.com/2008/12/15/hp-laserjet-1020-on-fedora-10/">Troels Kofoed Jacobsen’s blog</a></p>http://draxus.org/weblog/2009/04/14/hp-laserjet-1020-en-fedora-10/Mobi-Blog: blog de experiencias Erasmushttp://draxus.org/weblog/2009/04/04/mobi-blog-blog-de-experiencias-erasmus/<p><img src="http://draxus.org/weblog/wp-content/uploads/2009/04/mobi-blog.gif" alt="logo mobi-blog" align="left" /> La semana pasada me invitaron a una reunión en el <a href="http://cevug.ugr.es" title="Centro de Enseñanzas Virtuales de la Universidad de Granada">CEVUG</a> para abordar distintos aspectos del proyecto <a href="http://www.mobi-blog.eu">Mobi-Blog</a>, apoyado por <a href="http://mobi-blog.eu/test/">distintas universidades e instituciones europeas</a>.</p> <p><strong><a href="http://www.mobi-blog.eu">Mobi-Blog</a></strong> es una bitácora que permite a los estudiantes europeos contar sus experiencias durante su etapa de intercambio en otros países, la mayoría incentivadas por las <a href="http://es.wikipedia.org/wiki/Beca_Erasmus">becas Erasmus</a>.</p> <p>En la reunión tratamos aspectos de <strong>usabilidad y accesibilidad</strong> a mejorar en el blog, así como otros detalles técnicos y de idiomas. Con el proyecto se pretende crear además una <strong>guía online</strong> donde estructurar diverso contenido que puede ser de utilidad a los estudiantes, integrando también artículos de blog en la misma.</p> <p>Fue <strong>una experiencia interesante y enriquecedora</strong> donde pude conocer a gente de las universidades de <a href="http://www.ugr.es">Granada</a>, <a href="http://www.reading.ac.uk/">Reading</a> y <a href="http://www.uni-erlangen.de/">Erlangen-Nuremberg</a> muy competentes.</p>http://draxus.org/weblog/2009/04/04/mobi-blog-blog-de-experiencias-erasmus/AAP Práctica 3 - Script para Greasemonkeyhttp://draxus.org/weblog/2009/03/30/aap-practica-3-script-para-greasemonkey/<p><strong><a href="https://addons.mozilla.org/es-ES/firefox/addon/748">Greasemonkey</a></strong> es un plugin para el navegador Firefox que nos permite modificar el comportamiento de la página web que estemos visitando gracias a los <a href="http://userscripts.org/">diferentes scripts</a> que tengamos instalados. Estos scripts se programan en Javascript, de manera que tenemos una versatilidad increíble para cambiar el aspecto y dotar de más funcionalidad a una web.</p> <p>Para mi práctica he hecho un script muy simple pero útil para <strong>los foros de <a href="http://swad.ugr.es">Swad</a></strong>, la plataforma de apoyo a la docencia con más uso de la Universidad de Granada. La funcionalidad que he añadido es la de citar en tu respuesta el trozo de texto que selecciones de un mensaje anterior.</p> <p>Los que tengáis cuenta en Swad podéis <strong>instalar</strong> el script simplemente pinchando en: <strong><a href="http://draxus.org/weblog/wp-content/uploads/2009/03/replyswad.user.js">replyswad.user.js</a></strong> (previamente has de tener instalado <a href="https://addons.mozilla.org/es-ES/firefox/addon/748">Greasemonkey</a>).</p> <p>Este sería el botón extra añadido:</p> <div align="center"><img src="http://draxus.org/weblog/wp-content/uploads/2009/03/replyswad_boton.png" alt="boton citar texto swad" /></div> <p>Y este el aspecto que presentaría nuestro mensaje:</p> <div align="center"><img src="http://draxus.org/weblog/wp-content/uploads/2009/03/replyswad_mensaje.png" alt="mensaje con texto citado swad" /></div>http://draxus.org/weblog/2009/03/30/aap-practica-3-script-para-greasemonkey/[Meme] Disco aleatoriohttp://draxus.org/weblog/2009/03/26/meme-disco-aleatorio/<p><strong>gskbyte</strong> me envía <a href="http://www.gskbyte.net/2009/03/09/meme-disco-aleatorio/">este meme</a> consistente en hacer una portada de un disco ficticio mezclando imagen, nombre del grupo y nombre del disco obtenidos de forma aleatoria a través de distintos sistemas. En mi caso he obtenido el siguiente resultado.</p> <div align="center"><img src="http://draxus.org/weblog/wp-content/uploads/2009/03/sitsandthinks.jpg" alt="portada ficticia" /></div> <p><strong>Nombre del grupo:</strong> <a href="http://en.wikipedia.org/wiki/Severn_Valley_Limited">Severn Valley Limited</a> (artículo aleatorio de la Wikipedia inglesa)<br /> <strong>Nombre del disco:</strong> <a href="http://www.quotationspage.com/quote/1161.html">sits and thinks, mostly sits</a> (últimas palabras de una cita aleatoria)<br /> <strong>Imagen de la portada:</strong> <a href="http://www.flickr.com/photos/darwinbell/3196413626/">Sit, yes. Park, no.</a> (imagen aleatoria de Flickr. nota: realmente la he buscado en la <a href="http://www.flickr.com/creativecommons/">sección de Creative Commons</a> porque me salían todas con Copyright&#8230;)</p>http://draxus.org/weblog/2009/03/26/meme-disco-aleatorio/El Chojin - Superhéroehttp://draxus.org/weblog/2009/03/25/el-chojin-superheroe/<div align="center"><a href="http://vids.myspace.com/index.cfm?fuseaction=vids.individual&videoid=54002437">&#8220;SUPERHÉROE&#8221;</a><br /></div> <p><a href="http://www.elchojin.net/">El Chojin</a> vuelve a sus orígenes. El nuevo disco promete: <em>&#8220;Cosas que pasan, que no pasan y que deberían pasar&#8221;</em>, a la venta el 31 de marzo :)</p>http://draxus.org/weblog/2009/03/25/el-chojin-superheroe/Finalista de los Premios Web Ideal.eshttp://draxus.org/weblog/2009/03/19/finalista-de-los-premios-web-ideales/<p><strong><a href="http://ideal.es">Ideal.es</a></strong> es la edición digital del diario más leído de Granada. Con <a href="http://premios-web.ideal.es">estos premios</a> quieren dar a conocer la creatividad e innovación en el ámbito de Internet a las mejores webs de Granada. Estos galardones anuales distinguen aquellos sitios que, a juicio del jurado y de los propios usuarios, ofrecen un servicio más original y eficaz.</p> <p>Envíe este blog a la categoría <em>Premio al mejor espacio personal en Internet</em> y ha sido seleccionado <strong>finalista</strong>, junto con <a href="http://andaluciapeople.com">AndalucíaPeople</a> que también envíe al <em>Premio a la mejor implementación de software libre en Internet</em>.</p> <p>Por ello <strong>os animo a votar</strong> con 5 puntos a <strong>The Power of Mind</strong> a través de <a href="http://premios-web.ideal.es/ficha.php?id=206">este enlace</a> y a <strong>AndalucíaPeople</strong> en <a href="http://premios-web.ideal.es/ficha.php?id=205">este otro</a>.</p> <p>Asimismo felicitar a <a href="http://mindgarden.es/">fide</a> por la <a href="http://premios-web.ideal.es/ficha.php?id=135">nominación de <strong>Mrs. Carrington</strong></a>, a <a href="http://www.ferminius.es/">Ferminius</a> por la de <a href="http://premios-web.ideal.es/ficha.php?id=221">su <strong>fotoblog</strong></a> y a juancamon por <a href="http://premios-web.ideal.es/ficha.php?id=20">su <strong>blog</strong></a>, que también os animo a votar.</p>http://draxus.org/weblog/2009/03/19/finalista-de-los-premios-web-ideales/AAP Práctica 1 - Recursos para la asignaturahttp://draxus.org/weblog/2009/03/05/aap-practica-1-recursos-para-la-asignatura/<p>Aquí os dejo con una serie de recursos que nos pueden ser útiles para la asignatura de <a href="http://draxus.org/weblog/category/universidad/aap/">AAP</a>, junto con una valoración personal sobre 5 puntos.</p> <ul> <li><strong><a href="http://getfirebug.com/">Firebug</a></strong>: plugin de Firefox imprescindible para el desarrollo web e incluye un intérprete de Javascript así como un profiler y un debugger. 5/5 puntos</li> <li><strong><a href="http://visualjquery.com/">Visual jQuery</a></strong>: es una herramienta para la navegación por la documentación de jQuery, que nos permite encontrar fácilmente ayuda sobre un procedimiento que estemos buscando de este popular framework de Javascript. 4/5 puntos (debería estar actualizado a la última versión estable 1.3.1)</li> <li><strong><a href="http://www.gotapi.com/">gotAPI</a></strong>: buscador vertical para distintos lenguajes de programación. Imprescindible para encontrar rapidamente ayuda sobre funciones de un determinado lenguaje (HTML, Javascript, PHP, Perl, Ruby, C++, etc.) 4/5 puntos</li> <li><strong><a href="http://javascript.infogami.com/Javascript_in_Ten_Minutes">Javascript in Ten Minutes</a></strong>: un repaso rápido a la funcionalidad y sintaxis de Javascript. 3/5 puntos (viene bien para un vistazo rápido)</li> <li><strong><a href="http://spellbook.infinitiv.it/wdrl/">&lt;WebDevResourceList /&gt;</a></strong>: listado de frameworks, cms, wikis, blogs, foros y demás herramientas que podemos filtrar por el lenguaje programación que utilizan (PHP, Python, Ruby, Perl, Java&#8230;). 2/5 puntos (algo tonto, pero curioso)</li> <li><strong><a href="http://www.sprymedia.co.uk/article/Visual+Event">Visual Event</a></strong>: nos permite añadir una capa sobre la web para ver los eventos javascript que incorpora. Se puede ver un ejemplo <a href="http://www.sprymedia.co.uk/dataTables/demo_events.html">aquí</a>. 3/5 puntos (sólo funciona con algunas librerías)</li> <li><strong><a href="http://www.w3schools.com/XML/xml_examples.asp">XML Examples</a></strong>: algunos ejemplos sobre cómo trabajar con XML, aplicando CSS, XSLT, Ajax y Javascript. 5/5 puntos (ejemplos claros e ilustrativos)</li> </ul>http://draxus.org/weblog/2009/03/05/aap-practica-1-recursos-para-la-asignatura/Música para el puente: Alexander the Great, Iron Maidenhttp://misvaguedades.blogspot.com/2009/04/musica-para-el-puente-alexander-great.html<div><span>¿Es posible recibir una clase de historia clásica en una canción?</span> Con <a href="http://es.wikipedia.org/wiki/Iron_Maiden">Iron Maiden</a>, es así. <span>Su obra</span><span> Alexander the Great</span> nos narra la vida y hazañas de uno de los primeros conquistadores occidentales, conocido por nosotros como Alejandro Magno.<br /><br />Quiero dejar la traducción de la <a href="http://www.lyricsfreak.com/i/iron+maiden/alexander+the+great_20068056.html">letra</a>. El que a partir de este (y de otros muchos ejemplos que podría poner) argumente que todo el <span>heavy metal</span> es "tíos dando gritos" y falta de cultura, tal vez debiera pensar bien lo que está diciendo. Por cierto, el <span>frontman</span> de la banda, <a href="http://es.wikipedia.org/wiki/Bruce_Dickinson">Bruce Dickinson</a> es Licenciado en Historia, tirador de esgrima (incluso estuvo apunto de participar en Barcelona'92) y piloto comercial, además de un excelente cantante.<br /><br /><div>Tal vez no sea de vuestro estilo, pero espero que al menos os guste la letra.<br /></div></div><div><br /><br /><br /></div><span>Alejandro Magno</span><br /><br /><span>Hijo mío, pide para ti otro reino,</span><br /><span>pues este que te lego es demasiado pequeño para ti.</span><br />(rey Filipo de Macedonia)<br /><br />Cerca del este, en una parte de la antigua Grecia<br />En una antigua tierra llamada Macedonia,<br />Nació el hijo de Filipo de Macedonia<br />Y el nombre de esta leyenda fue Alejandro.<br /><br />Con una edad de diecinueve años<br />Se convirtió en el rey macedonio<br />y juró liberar toda Asia Menor.<br />En el mar Egeo, en el 334 a.C.<br />destruyó completamente la armada persa.<br /><br /><span>Alejandro Magno</span><br /><span>Su nombre infundía temor en los corazones de los hombres</span><br /><span>Alejandro Magno</span><br /><span>Fue una leyenda entre los mortales</span><br /><br />El rey Darío III,<br />vencido, huyó a Persia.<br />También los escitas cayeron en el río Syr Daria<br />y Egipto cayó bajo el rey macedonio.<br />Y fundó la ciudad llamada Alejandría.<br /><br />Cerca del río Tigris<br />se encontró de nuevo con el Rey Darío<br />y de nuevo le derrotó en la batalla de Arbela.<br />Al entrar en Babilonia y en Susa encontró grandes tesoros,<br />conquistó Persépolis, la capital de Persia.<br /><br /><span>Alejandro Magno</span><br /><span>Su nombre infundía temor en los corazones de los hombres</span><br /><span>Alejandro Magno</span><br /><span>Fue una leyenda entre los mortales</span><br /><br />Un rey de Frigia había atado un yugo a un carro<br />Pero Alejandro cortó ese nudo gordiano<br />Y la leyenda decía que aquél que deshiciese el nudo<br />se convertiría en el gobernante de Asia.<br /><br />Divulgó el helenismo por todas partes,<br />la forma macedonia de pensar.<br />Su cultura era el estilo de vida oriental<br />y allanó el camino para la cristiandad.<br /><br />El hastío de la batalla marchando de una parte a otra,<br />y el ejército de Alejandro línea a línea,<br />No le seguirían hasta la India,<br />cansados del combate, del dolor y de la gloria.<br /><br /><span>Alejandro Magno</span><br /><span>Su nombre infundía temor en los corazones de los hombres</span><br /><span>Alejandro Magno</span><br /><span>Murió de fiebres en Babilonia</span><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-9187496223630077225?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/musica-para-el-puente-alexander-great.htmlDe incultura, fanatismo y falta de autocrítica (en política)http://misvaguedades.blogspot.com/2009/04/de-incultura-fanatismo-y-falta-de.html<a href="http://www.rrhhdigital.com/userfiles/FNTV_Por_el_pleno_empleo.jpg"><img src="http://www.rrhhdigital.com/userfiles/FNTV_Por_el_pleno_empleo.jpg" alt="" border="0" /></a>De los comentarios en la web del diario Ideal, <a href="http://ideal.es/">ideal.es</a>, en la noticia <a href="http://www.ideal.es/granada/20090428/espana/psoe-sufre-primera-derrota-200904282120.html">sobre la primera derrota parlamentaria del gobierno</a>: (copio literalmente)<br /><h3></h3><div><blockquote><h3>uno</h3><div class="texto">tu lo que eres es un pedazo de facha de mucho cuidado, que habeis estado 40 años gobernando por cogollos y quereis seguir haciéndolo. No sois más que una panda de canallas. Zapatero es uno de los mejores presidentes que hemos tenido jamás. Qué culpa tendrá el de que la economía esté como esté, Porque esta crisis la han provocado los americanos, no lo olvides.</div></blockquote>En resumidas cuentas, <span>el mensaje contiene las siguientes </span><span>perlas</span>:<br /></div><ul><li>El que opina que hay que "sacar al PSOE del poder" (comentario anterior dixit) es un facha. Da igual que sea nacionalista, de IU, de UPyD o por supuesto del PP. Cada vez me hace más gracia cómo <span>facha</span> es un término que viene a ser usado por los que "no piensan como tú".</li><li>El PP y la dictadura de Franco, para este señor (por llamarlo de algún modo), viene a ser lo mismo, con lo cuál el PP no es una opción válida "per sé" (ver el punto anterior).<br /></li><li>Zapatero es uno de los mejores presidentes que hemos tenido jamás... Sin comentarios.</li><li>Y ahora viene lo mejor: <span>Qué culpa tendrá el de que la economía esté como esté, Porque esta crisis la han provocado los americanos, no lo olvides. </span>La "economía" es algo que se pincha y corta en América, de lo que Zapatero no tiene culpa ninguna.</li></ul><div>¿Representa este personaje al votante medio español? ¿Es esto la definición más clara de <span><a href="http://en.wikipedia.org/wiki/Fanboy">fanboy</a> socialista</span> (a lo mejor con un poco de humildad se daría cuenta de que tal vez el gobierno no lo está haciendo tan bien)? ¿Estamos tan engañados pensando que la crisis sólo viene de fuera? ¿Los errores del gobierno son "de otros" y sólo son suyos sus aciertos?<br /><br /><span>Me preocupan la incultura, el fanatismo y la falta de autocrítica.</span> Ese mensaje lo contiene todo, y lo peor es que creo que representa a un gran porcentaje de la población española...<br /></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-2903057754205524633?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/de-incultura-fanatismo-y-falta-de.htmlRelato: la vueltahttp://misvaguedades.blogspot.com/2009/04/relato-la-vuelta.html<div>Suena el despertador a las 7AM y me levanto. Me levanto temprano. No he podido dormir demasiado, tan sólo unas cinco horas. El tacto áspero de mis manos y el olor a productos de limpieza que invade el ambiente son los testigos vivos de la tarea realizada el día de antes. Una tarea en cierto modo ingrata, pero necesaria. Una tarea que me ha impedido dormir más.<br /><br />Mi despensa está completamente vacía. <span>Tiene gracia</span>, pensaba. <span>Es como una metáfora... Como esas cosas cosas que se vacían y que no vuelves nunca a rellenar. </span><span>Efectivamente, n</span>o es lo único que está vacío, pero eso es otra historia. Recojo los bártulos y cierro la puerta por última vez. La llave, como fue acordado, es devuelta en mano. Aprovecho para ir a desayunar.<br /><br /><span>Café con leche y croissant</span>. <span>Dos croissants...</span> Qué típico. Engullo el primero, y guardo el segundo para dentro de un rato. Con el café estoy más rato. Me doy todo el tiempo del mundo mientras multitud de escenas pasan por mi cabeza, del mismo modo que muchas personas con prisa acaban con su desayuno en un tiempo ridículo. Todavía no llevo media taza, cuando ya he cambiado de compañeros de mesa varias veces.<br /><br />Miro pasar el tren que debía coger. No corro, es inútil, no llegaría. En vez de eso, me quedo extasiado mirando su infatigable cabalgar por la vía, seguido del vómito de una incontable multitud de aquellos que vienen a trabajar. Seguro que muchos han sido compañeros anónimos de viaje, también seguro que otros no. Tras dejar su carga, el tren parte hacia su destino y se aleja. Supongo que quedarse mirando pasar vagones de un tren que se va es lo más parecido a aquel verso del <span>Calle Melancolía </span>donde el maestro dice "pasa por mi mirada un tren interminable".<br /><br />Pero el tren se termina. No hay<span> melancolía</span> ni tristeza. Tampoco hay alegría, ni emoción alguna. Me quedo un rato inmóvil y me vuelvo a sentir un poco como mi despensa... Entonces, decidido, y mordisqueando mi <span>croissant</span> de reserva emprendo la marcha. Ha llegado la hora de partir.<br /></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-737167484167876032?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/relato-la-vuelta.htmlPopurrí de P2P, Ministra de Cultura y acciones judicialeshttp://misvaguedades.blogspot.com/2009/04/popurri-de-p2p-ministra-de-cultura-y.html<div><a href="http://swordfishcode.com/wp-content/uploads/2008/06/news-pirate_bay.jpg"><img src="http://swordfishcode.com/wp-content/uploads/2008/06/news-pirate_bay.jpg" alt="" border="0" /></a>La verdad es que llevo bastante tiempo sin dejar mi opinión sobre alguno de los temas que me preocupan porque hay demasiada información (de la que me interesa) que comentar. Estos han sido unos días en los que se han dado muchas noticias (en general bastante malas) <span>sobre el P2P y la libertad en internet</span>.<br /><br />Para no dejarme ningún tema en el tintero, y a sabiendas de que siendo breve, voy a olvidar muchas de las cosas que quería decir, listaré todos los temas que me interesan, opinando (e informando) un poco de cada uno. A saber:<br /></div><ul><li><a href="http://www.20minutos.es/noticia/462270/5/">La primera condena</a><span> en España relacionada con el P2P.</span> Fundamentalmente, se ha producido mucha <span>desinformación</span> sobre el tema. En este caso y otros similares, siempre es bueno recurrir a <a href="http://www.filmica.com/david_bravo/archivos/009353.html">David Bravo</a> para echar un poco de luz sobre asuntos tan oscuros (recomiendo la suscripción a su blog de forma casi obligatoria si te interesa el tema de la libertad en Internet). El tema me parece preocupante en tanto una persona (el acusado) se ha declarado culpable de algo que no es delito. En este tema, la desinformación causada por los medios de comunicación tradicionales, a sueldo de <a href="http://www.psoe.es/">Moscú</a> es aberrante. <span>¿Hasta donde llega el brazo oscuro de la <a href="http://www.sgae.es/">innombrable</a>? </span>Enrique Dans en su blog es <a href="http://www.enriquedans.com/2009/04/los-medios-la-desinformacion-y-los-intereses-creados.html">bastante claro</a> sobre la desinformación (de hecho hacía tiempo que no le leía tan cabreado) y plantea la posible relación de la llegada de la ministra Sinde al gobierno con esta sentencia.<span> <span>¿Estamos ante el principio del acoso (e intento de)</span> derribo del P2P en España?<br /></span></li><li>Y si de sentencias condenatorias va el juego, <span>los miembros de </span><a href="http://thepiratebay.com/">The Pirate Bay</a> (el principal <span>tracker</span> Bittorrent, alojado hasta ahora en Suecia, país sin <a href="http://misvaguedades.blogspot.com/2009/04/angeles-gonzalez-sinde-dimision.html">ministros de cultura cuyo trabajo es incompatible con su cargo</a>) <span>ha sido condenado por un tribunal a un año de prisión por "asistir a la distribución de material protegido por derechos de autor"</span>. El tema me ha caído como un jarro de agua fría, pero he visto que, con la tradicional socarronería (y que por cierto, alabo) que derraman los comunicados oficiales de los miembros de esta página, <a href="http://thepiratebay.org/blog/151">quitan importancia a la sentencia</a>, que pretenden recurrir. Por otra parte, han ocurrido dos reacciones que considero interesantes. La primera, que a partir de la recepción de la sentencia <span>han aumentado en más de 3000 los afiliados al <a href="http://www.piratpartiet.se/international/english">Partido Pirata de Suecia</a> </span><span>(<span>PiratPartiet</span>)</span><span>,</span> esbozándose ya como quinta fuerza política (<a href="http://torrentfreak.com/pirate-party-membership-surges-following-pirate-bay-verdict-090417/">enlace sobre las afiliaciones, en inglés</a>). Este partido se presenta a las elecciones europeas e incluso aspira a conseguir varios escaños. La segunda reacción a la sentencia, es <a href="http://torrentfreak.com/ifpi-site-under-attack-by-pirate-bay-supporters-090420/">el ataque DDoS</a> (de <a href="http://es.wikipedia.org/wiki/Ataque_de_denegaci%C3%B3n_de_servicio">denegación de servicio</a>) en represalia contra la web de la <a href="http://www.ifpi.org/">IFPI</a> (la "federación internacional de la industria fonográfica") y que ha dejado "tumbada" la página durante un rato (mostrando la gente lo que es capaz de hacer con un poco de organización). <span>No soy demasiado partidario de este tipo de activismo</span>, en incluso lo considero casi fuera del límite de la legalidad, pero en algunos casos sangrantes como éste no me importa mirar para otro lado. De hecho, <span>espero sinceramente que el ataque sea el primero de una larga lista</span>. Afortunadamente, el <a href="http://es.wikipedia.org/wiki/Hacktivismo">hacktivismo</a> siempre emerge cuando se le necesita.</li><li>La <a href="http://internautas.org/">Asociación de Internautas</a>, en un alarde del más genial periodismo de investigación (de ese que ya poco se ve en este país de pandereta), <a href="http://www.internautas.org/html/5525.html">nos descubren las incompatibilidades de la recién nombrada ministra de Cultura, Ángeles González Sinde</a>. Según afirman, <span>la ministra es administradora de varias empresas a las que va a subvencionar con sus políticas</span>. Además, planean su recusación apoyándose en principios legales (<strong><a href="http://noticias.juridicas.com/base_datos/Admin/l5-2006.html">Ley 5/2006, de 10 de abril, de regulación de los conflictos de intereses de los miembros del Gobierno y de los Altos Cargos de la Administración General del Estado</a>).</strong> Si aún no estás convencido de que la ministra Sinde <a href="http://misvaguedades.blogspot.com/2009/04/angeles-gonzalez-sinde-dimision.html">debería dimitir</a>, tal vez tu postura no sea del todo imparcial.<br /></li><li>Mientras tanto, el último Premio Cervantes dice <a href="http://www.elpais.com/articulo/cultura/Marse/perlas/escritor/anomalo/elpepucul/20090420elpepucul_5/Tes">verdades como puños</a> (<span>Sigo pensando, con matices, que el problema del cine español no es la piratería, sino la falta de talento</span>). Dichas declaraciones suponen una gota más en el vaso del descontento generalizado del público por una <a href="http://ecodiario.eleconomista.es/cultura/noticias/1178655/04/09/el-drama-del-cine-espanol-gastacasi-el-triple-de-lo-que-ingresaVolver-y-dos-coproducciones-las-unicas-peliculas-rentables-de-las-99-que-recibieron-ayudas-en-2008.html">industria deficitaria</a> que tiene que sobrevivir a base de inversiones como pago por las <a href="http://es.wikipedia.org/wiki/%C2%A1Hay_motivo%21">ayudas prestadas</a>. Si aún sigues pensando que la mal llamada piratería perjudica al cine español, tal vez te interese <a href="http://historiasdehispania.blogspot.com/2009/04/cine-cine-cine-cine.html">este artículo</a>, donde se desmiente ese hecho de forma cuantitativa.<br /></li><li>No todo son malas noticias en esta falta de libertad que nos invade. <span>Paulo Coelho, el conocido escritor, habla estos días </span><a href="http://www.europapress.es/tecnologia/internet-00446/noticia-coelho-no-intercambia-egoista-amargado-solitario-20090416124334.html">a favor de compartir archivos en Internet</a>. Incluso se ofreció para testificar a favor en el juicio anterior contra <span>The Pirate Bay</span>. Creo que merece la pena leer sus declaraciones. Y si como yo, de verdad piensas "qué valor tiene el tipo éste", ya sabes <a href="http://www.lecturalia.com/autor/15/paulo-coelho">qué adquisición</a> debes realizar en la <a href="http://www.ferialibrogranada.es/">Feria del Libro</a> esta semana si estás por Granada...</li><li>Finalmente, si tras leer a Coelho tal vez piensas que es muy fácil hablar de compartir archivos desde la postura del escritor, no te pierdas estas <span><a href="http://www.diariodemallorca.es/secciones/noticia.jsp?pRef=2009041800_9_455419__Actual-pirateria-acabara-soberbia-arrogancia-discograficas">declaraciones</a> de los miembros de Amaral</span>: "Lo importante es que se escuche música porque de esa manera se puede comparar" [...] "Lo que es evidente es que la piratería acabará con la soberbia y la arrogancia de las compañías de discos". Sin comentarios (y me quito el sombrero).</li><li>Como colofón, y si te quieres reír un rato de un hecho altamente cargado de ironía, echa un ojo a este <a href="http://www.libertaddigital.com/internet/el-pais-lanza-una-campana-contra-si-mismo-a-cuenta-de-las-descargas-1276356695/">genial artículo de Daniel Rodríguez Herrera</a> en Libertad Digital*. En él se plantea la curiosa conjetura de que <span>El País ha comenzado una campaña plasmada en la línea editorial general del diario para criminalizar las descargas por Internet</span> mientras que <span>en su versión digital (</span><a href="http://www.elpais.com/">elpais.com</a><span>) proporciona enlaces a páginas de descargas</span>. Curioso, ¿no?</li></ul><div><br />Me dejo las vueltas que está dando por Francia lo de la <a href="http://en.wikipedia.org/wiki/HADOPI_law">ley HADOPI</a>. Por lo menos hasta que se clarifique la situación por parte del gobierno, ISPs y autoridades. Pero a pesar de todo, es un tema muy preocupante, sobre todo <span>ahora que se acercan elecciones al parlamento europeo</span>.<br /><br />Supongo que es difícil pedir comentarios tras esta lluvia (chaparrón) de ideas e información, pero <span>me gustaría contar con vuestra participación y opinión</span>. No corren buenos tiempos para la libertad en Internet y estaría bien que informarais correctamente a la gente que conocéis (empezando por supuesto por vosotros).<br /></div>____________________<br /><div>* Si te disgusta el medio donde está, lamento decirte que es la fuente primaria. Criticar a Libertad Digital <span>per sé</span> es tan pueril como hacer lo propio con el diario Público. Y, aunque no leo ninguno de los dos normalmente, no me sale ningún sarpullido por leer una noticia suelta de vez en cuando en alguno de ellos.<br /></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-4111782218538130286?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/popurri-de-p2p-ministra-de-cultura-y.html(Sextas) Jornadas de Bitácoras y Medios de Comunicación (BMC6)http://misvaguedades.blogspot.com/2009/04/sextas-jornadas-de-bitacoras-y-medios.html<div><a href="http://bmc6.geneura.org/"><img src="http://geneura.ugr.es/%7Ejmerelo/jornadas/BMC6/logo_VIB_M.jpg" alt="" border="0" /></a>No sería justo no hacerse eco del <span>sarao</span><span> bitacoril</span> que más cerca me pilla. Las (ya sextas) <a href="http://atalaya.blogalia.com/historias/62760">Jornadas de Bitácoras y Medios de Comunicación</a> son el mejor sitio para poder <span>conocer a blogueros</span> (y <span>blogueras</span> ;)), enterarse de qué va esto de la<span> blogosfera</span>, escuchar a <span>expertos en periodismo hablando sobre experiencias bitacoriles</span>, y, cómo no, echar <span>unas cervezas</span> (este año parece que no hay karaoke :D).<br /></div><div><br />Según leo vía <a href="http://atalaya.blogalia.com/">JJ</a> (que otra vez vuelve a organizar todo esto junto a <a href="http://blogs.ideal.es/cableados/posts">Javier Barrera</a>), este año habrá <span>flashtalks </span>(minicharlas para contar tu proyecto en unos pocos minutos), y se contará con gente de la talla de <a href="http://pjorge.com/">PJorge</a>, <a href="http://escolar.net/">Nacho Escolar</a> y <a href="http://fernand0.blogalia.com/">Fernando Tricas</a> (también conocido como fernand0). Por supuesto la asistencia es <span>gratuita</span> (aunque se recomienda registro [ver más abajo en la página de las jornadas]).<br /><br />En mi caso, he asistido a las dos ediciones anteriores (<a href="http://misvaguedades.blogspot.com/search/label/bmc4">cuarta</a> y <a href="http://misvaguedades.blogspot.com/search/label/bmc5">quinta</a>), y la experiencia ha sido inmejorable. He aprendido mucho, he escuchado historias fantásticas, me he divertido bastante, y lo que es más encontrado a personas geniales. Os animo que si no tenéis nada que hacer, que vengáis. <span>Yo creo que iré</span>, si <a href="http://misvaguedades.blogspot.com/2009/04/364.html">las apreturas</a> no lo impiden.<br /><br />El sitio de celebración del evento es (al igual que los años pasados) el <span>Patio del</span> <a href="http://www.aprensagranada.org/" rel="help" title="web de la AP Granada"><cite>Hospital del Peregrino</cite></a>; <span>mapa:</span> <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=es&msa=0&msid=114220721601479762600.000001124c86c73003cfa">Placeta del Peregrino y Peregrina, s/n</a>. La fecha es el <span>14 y 15 de mayo de 2009</span>. Para más detalle, aquí está la <a href="http://geneura.ugr.es/%7Ejmerelo/jornadas/BMC6/">página de las jornadas</a>.<br /></div><span></span><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-6397323265789177582?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/sextas-jornadas-de-bitacoras-y-medios.htmlMúsica: Barón Rojo, "Concierto para ellos"http://misvaguedades.blogspot.com/2009/04/musica-baron-rojo-concierto-para-ellos.html<div>Probablemente uno de los mejores homenajes a esos <span>caídos</span> del rock: Jimi Hendrix, Janis Joplin, Bon Scott y otros (realmente no entiendo qué pinta John Lennon ahí, pero bueno). La canción es de <a href="http://es.wikipedia.org/wiki/Bar%C3%B3n_Rojo_%28banda%29">Barón Rojo</a>, quizás la banda de metal más internacional que hemos tenido en España y fue incluida en su álbum "Volumen Brutal", de 1982.<br /><br />La letra no contiene mucho más allá que este homenaje (en el estribillo), pero evoca multitud de ambientes relacionados con el mundo del rock y de los años 80 que muchos desearíamos que aún pervivieran. Una época en que la buena música era radiada por <a href="http://es.wikipedia.org/wiki/El_pirata">locutores</a> cuyo nivel de conocimiento musical deja a la altura de la zapatilla a <a href="http://los40.com">todos los de ahora</a>. Una época en la que la <a href="http://es.wikipedia.org/wiki/Radiof%C3%B3rmula">radiofórmula</a> no consistía en la emisión de <a href="http://es.wikipedia.org/wiki/Dem_bow">bazofia galopante</a> promocionada por discográficas. Una época en la que los músicos no eran <a href="http://www.operaciontriunfo.com/">clones prefabricados para ganar dinero</a>, sino verdaderos artistas. Una época en la que podías escuchar a <a href="http://es.wikipedia.org/wiki/Whistesnake">Whitesnake</a> o a <a href="http://es.wikipedia.org/wiki/Rainbow_%28banda%29">Rainbow</a> sin tener que ir a un local esepecífico de ese tipo de música... Una época en la que el rock no era un estilo prácticamente marginal, y los que lo escuchamos no éramos considerados "los raros".<br /><br />Os dejo con el vídeo (que combina la pista original con imágenes de un concierto de la banda en Venezuela en 2001), y tras él, la letra:<br /><div><br /></div><br />Otra vez aquí, sintonízanos<br />ven y enróllate, dice un locutor.<br />Y en la noche suena el Heavy Rock.<br />Después de un café, vuelves a fumar<br />luego AC/DC tocarán las campanas negras<br />del infierno.<br /><br />En cada concierto de Rock &amp; Roll.<br />Las campanas doblan por Bon Scott<br />pos Janis, Lennon, Allman, Hendrix,<br />Bolan, Bonhan, Brian y Moon.<br />pos Janis, Lennon, Allman, Hendrix,<br />Bolan, Bonhan, Brian y Moon. <span><br /></span><br /><br />Oyes el rumor de un oscuro mar<br />Duerme alrededor, la ciudad.<br />Las sirenas, lloran, cuídate<br />no te dejes atrapar.<br />Pides escuchar tal ó cual canción<br />Whitesnake o Rainbow,<br />siempre Rock<br />las guitarras hablan para ti.<br /><br />En cada concierto de Rock &amp; Roll.<br />Las campanas doblan por Bon Scott<br />pos Janis, Lennon, Allman, Hendrix,<br />Bolan, Bonhan, Brian y Moon.<br />pos Janis, Lennon, Allman, Hendrix,<br />Bolan, Bonhan, Brian y Moon.<span><br /></span></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-2019996504025177588?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/musica-baron-rojo-concierto-para-ellos.htmlÁngeles González-Sinde, dimisiónhttp://misvaguedades.blogspot.com/2009/04/angeles-gonzalez-sinde-dimision.html<div>Podría enumerar los muchos motivos por los que pido esto, incluso antes de que la susodicha señora comience a ejercer de ministra de Cultura, pero me quedo con los que tan bien expone <a href="http://www.enriquedans.com/2009/04/una-pesadilla-angeles-gonzalez-sinde-ministra-de-cultura.html">por aquí Enrique Dans</a>. En definitiva, un ministerio continuista con el "talante" de <a href="http://molinapirate.blogspot.com/">Molina</a>, a cuya cabeza se ha situado a una persona que no entiende qué es la sociedad de la información, y fuertemente ligado a una asociación con ánimo de lucro a costa de nuestros bolsillos (la SGAE).<br /></div><div><br />Os dejo por aquí el banner de la campaña (de la <a href="http://internautas.org/">Asociación de Internautas</a>) contra este nuevo <span>favor de Zapatero a la SGAE</span>:<br /><a href="http://www.internautas.org/graficos/baner_sinde.gif"><img src="http://www.internautas.org/graficos/baner_sinde.gif" alt="" border="0" /></a>También podéis apuntaros al <a href="http://www.facebook.com/group.php?gid=76826011168">grupo de facebook</a>, que a día de hoy ya lleva más de 1000 asociados.<br /><br /><span>Malos tiempos se avecinan para Internet en España...</span><br /></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-2227213696917154206?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/angeles-gonzalez-sinde-dimision.htmlPaís de pandereta (google dixit)http://misvaguedades.blogspot.com/2009/04/pais-de-pandereta-goole-dixit.html<div>Ya vimos <a href="http://misvaguedades.blogspot.com/2007/10/vueltas-con-la-compra-de-jaiku-por.html">por aquí</a> algún "experimento" en el que jugueteaba con <a href="http://trends.google.com/">google trends</a> para "estimar" el interés de un concepto. Recordemos que <span>google trends</span> es una utilidad de google que permite comparar el volumen de búsqueda de varias consultas, en un intervalo concreto de tiempo, y en una zona geográfica particular.<br /><br />En este caso, e inspirado por <a href="http://www.ensilicio.com/2009/01/una-grafica-resumen-de-2008.html">un post de ensilicio</a> (blog altamente recomendable para quien disfrute interpretando datos, gráficas y sacando conclusiones de ellas), me he decidido a ver cómo le interesan a la gente temas más o menos diversos (culturales y no tanto). El resultado es <span>de lo más desalentador</span> (la explicación sobre qué es cada cosa, un poco más abajo):<br /></div><a href="http://www.google.com/trends/viz?q=matem%C3%A1ticas,+literatura,+sin+tetas+no+hay+paraiso,+gran+hermano,++real+madrid&date=ytd&geo=es&graph=weekly_img&sort=0&sa=N"><img src="http://www.google.com/trends/viz?q=matem%C3%A1ticas,+literatura,+sin+tetas+no+hay+paraiso,+gran+hermano,++real+madrid&date=ytd&geo=es&graph=weekly_img&sort=0&sa=N" alt="" border="0" /></a><br /><div>En azul y rojo, al fondo de la gráfica, se encuentran los volumenes de búsquedas en google correspondientes a los términos <span>"matemáticas"</span> y a <span>"literatura"</span>, respectivamente. Obviamente, es normal encontrar más búsquedas de literatura que de matemáticas (alrededor de 3 veces más). Lo que viene ahora ya no es tan agradable, en mi opinión.<br /><br />En amarillo, <span>"sin tetas no hay paraiso"</span>, serie de alto contenido cultural y presentando unos modelos de vida y personales altamente enriquecedores (nótese la ironía). Por cada búsqueda en google del término "matemáticas", se ha buscado siete veces "sin tetas no hay paraíso".<br /><br />En morado, <span>"real madrid"</span>. El fútbol (¡de un sólo equipo!) interesa <span>17 veces más que las matemáticas y 4 veces más que la literatura</span>. Como colofón, decir que el color verde corresponde a <span>"gran hermano"</span>, máximo representante de la telebasura española, que no sólo no aporta nada, sino que es uno de los responsables del atontamiento y de la desorientación actual de los jóvenes al elegir a sus modelos. Aunque con una media de unas 18 veces más consultas que "matemáticas" durante los 12 últimos meses, en el momento álgido (supongo que de la última edición de esta bazofia), se acumulaban <span>unas 50 veces más consultas que nuestro primer término seleccionado</span>.<br /><br />No voy a sacar conclusiones muy elaboradas a partir de un estudio tan poco serio como este, pero sí que voy a decir algo que todos sabemos: <span>un país en que un equipo ¿deportivo?, un reality show (o más concretamente, la telebasura en su esencia más pura) y una serie cuyos protagonistas son <span>putones</span> y <span>puteros</span>, interesan más que la ciencia y la cultura, está claramente enfermo</span>.<br /><br /><span>¿Qué piensas?</span> ¿Soy demasiado alarmista? ¿Hay algo con lo que no estás de acuerdo? ¿Hay que dar una <span>n-</span>ésima oportunidad a esta sociedad? ¿Es mejor "pasar" de la subcultura y convertirse en un analfabeto de ésta? ¿Es una tontería el <span>google trends</span>? ¿Las cosas que tienen valor son sólo aquellas por las que se puede obtener un beneficio claro? Espero tu opinión.<br /></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-4093260459019677319?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/pais-de-pandereta-goole-dixit.html364http://misvaguedades.blogspot.com/2009/04/364.html<div><a href="http://www.shepherd.edu/university/calendars/calendar.jpg"><img src="http://www.shepherd.edu/university/calendars/calendar.jpg" alt="" border="0" /></a>Es <span>el número de días de empleo y sueldo que me quedan bajo la denominación</span> de <span>Becario FPU del Ministerio de Ciencia e Innovación</span> (a menos, claro está, que alguna universidad acepte una solicitud de plaza de esas que de vez en cuando echo para matar mi aburrimiento). Después de esto, ¿quién sabe? No es que tenga un <span>horror vacui</span> al momento en que deje de ser doctorando (y pase a ser doctor), es que sencillamente esta etapa de mi vida laboral tiene fecha de caducidad (y desgraciadamente no hay nada garantizado tras la misma por parte de <a href="http://www.micinn.es">mamá estado</a>).<br /><br />¿Qué habrá después? <span>Dentro de aproximadamente un año</span> informaremos a su debido tiempo de todas las posibilidades y de mis elecciones correspondientes.<br /><br />Sean buenos, y <span>no se fíen ni de su madre</span>.<br /></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-8462597379600855128?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/04/364.htmlPersonajes interesantes de la informática II: Ada Byronhttp://misvaguedades.blogspot.com/2009/03/personajes-interesantes-de-la.html<div><a href="http://www.ieeeghn.org/wiki/images/8/87/Ada_Lovelace.jpg"><img src="http://www.ieeeghn.org/wiki/images/8/87/Ada_Lovelace.jpg" alt="" border="0" /></a><span>Si el pensar en una mujer que vivió en el S. XIX como un personajes influyente de la informática te suena raro, sigue leyendo. Tal vez te sorprenda esta historia.</span><br /><br /><span>Ada Byron</span> (o <span>Ada Lovelace</span>, como luego sería conocida tras casarse) fue una londinense nacida en 1815, hija del famoso poeta romántico Lord Byron. Criada por su madre, perteneciente al ambiente aristocrático de la Inglaterra de inicios del diecinueve, fue instruida en las ciencias por numerosos tutores. De hecho, durante su juventud estudió matemáticas de la mano de <span>Augustus De Morgan</span> (el creador de las leyes que llevan su nombre).<br /><br />Con diecisiete años, en 1833, conoció a <span>Charles Babbage</span>, profesor de matemáticas en Cambridge e inventor. Babbage (quien además fue también un pionero en el área de la informática) participaría igualmente en la formación matemática de Ada Byron, aunque tras un tiempo siguieron caminos independientes. En su trabajo como matemático, Babbage había diseñado un prototipo de calculadora, que había llamado la "máquina diferencial". Esta <a href="http://www.microsiervos.com/archivo/ordenadores/maquina-diferencia-babbage-en-accion.html">"máquina diferencial"</a> era un artefacto que podía calcular, de forma automática, logaritmos de números naturales con bastante precisión (lo que suponía un gran avance en la época). Sin haber terminado de construir la primera máquina, Babbage quiso ir más allá, e ideó un artefacto mejor, a la que se referiría como <span>"máquina analítica"</span>. Esta máquina debía permitir el realizar una serie arbitraria de operaciones matemáticas. Lo que Babbage había concebido en su mente era el primer computador de la historia más de 100 años antes que verdaderamente alguien consiguiera construirlo.<br /><br />Desgraciadamente, la idea de Babbage era buena, pero no consiguió llevarla a cabo debido a la falta de financiación. Dicha construcción requería de numerosos ingenios mecánicos y era de una complejidad demasiado elevada para los pocos medios económicos de los que disponía. Poco tiempo después, en 1842, <span>Lovelace y Babbage volverían a encontrarse</span>, pues ésta le escribiría pidiéndole ayuda para continuar con sus estudios de matemáticas. Babbage, a quien siempre le había impresionado el intelecto de Lovelace, le enseñó su idea de máquina analítica sobre la que ella, rápidamente, se puso a trabajar.<br /><br />Ada empezó a <span>traducir una memoria</span> sobre la idea de "máquina analítica" por un matemático <a href="http://www.cs.kuleuven.ac.be/%7Edirk/.image/ada-letters.jpg"><img src="http://www.cs.kuleuven.ac.be/%7Edirk/.image/ada-letters.jpg" alt="" border="0" /></a>italiano que se interesó en el trabajo de Babbage y al que financió parcialmente. Y a dicha traducción, iba añadiendo sus propias anotacios. Ada, que se denominaba a sí misma <a href="http://es.wikipedia.org/wiki/Analista_de_sistemas">"analista"</a> (término que hoy día perdura en el trabajo de ingeniero informático), comprendió perfectamente los planos de la máquina, pero añadió su propia visión sobre la misma: se dio cuenta que la máquina analítica estaba concebida para <span>desarrollar y calcular cualquier función ... de cualquier grado de generalidad y complejidad</span>. Ada llegó a conjeturar la posibilidad de, en un futuro, generar música automáticamente con esta máquina, crear gráficos o apoyar el trabajo científico.<br /><br />Además, Ada Lovelace <span>comparó a la máquina analíca con un telar</span> que teje ciertos dibujos en el tejido. A partir de unos patrones predeterminados, el telar ejecuta las órdenes. Estos patrones o "planes", equivaldrían a una secuencia de órdenes a ejecutar por la máquina analítica. Ada escribió un "plan" para la máquina analítica que fuera capaz de calcular algunos <a href="http://es.wikipedia.org/wiki/N%C3%BAmero_de_Bernoulli">números de Bernoulli</a>. Esto no es otra cosa que el primer programa de ordenador, conocido. Mientras tanto, el tamaño de la traducción de la memoria junto con las notas ya era de tres veces el original. Esto, aunque suene algo extraño, <span>convierte a Ada Lovelace en la primera programadora de la historia</span> y, por qué no, en la primera informática (aunque este término tardaría más de 100 años en llegar a tener sentido).<br /><br /><span>En 1852, con tan sólo 37 años, Ada Lovelace moría</span> de cáncer de útero. De haber vivido más, podría haber llegado a recibir un reconocimiento que no le llegaría hasta un siglo después. Posiblemente una de las mentes más brillantes de la época, y tal vez la primera visionaria en la informática se apagaba en un ambiente en el que, el desprecio a la actividad intelectual llevada a cabo por mujeres la había obligado a realizar sus publicaciones científicas firmando tan sólo con sus iniciales.<br /><br />A principios de los 80, el Departamento de Defensa de los EE.UU. decidió crear <span>un lenguaje de programación nuevo</span>, derivado de Pascal y que tuviera características que le permitieran funcionar correctamente en entornos críticos (como misiones de guerra). Dicho lenguaje fue denominado <a href="http://es.wikipedia.org/wiki/Ada_%28lenguaje_de_programaci%C3%B3n%29"><span>Ada</span></a><span>, precisamente en honor de Ada Lovelace,</span> y aún hoy goza de cierta popularidad entre los programadores. También en su honor, la British Computer Society, creó en 1998 la <a href="http://en.wikipedia.org/wiki/Lovelace_Medal">"Medalla Lovelace"</a>, un premio destinado a quienes realicen avances significativos en la informática. Por último, el rostro de Ada Lovelace es el de la mujer que aparece en los hologramas de los productos de Microsoft. Sirva este pequeño homenaje en su memoria.<br /><br /><span>Para saber más:</span><br /></div><ul><li><a href="http://www-groups.dcs.st-and.ac.uk/%7Ehistory/Biographies/Lovelace.html">http://www-groups.dcs.st-and.ac.uk/~history/Biographies/Lovelace.html</a></li><li><a href="http://www.laflecha.net/perfiles/tecnologia/ada_lovelace">http://www.laflecha.net/perfiles/tecnologia/ada_lovelace</a></li><li><a href="http://es.wikipedia.org/wiki/Ada_Lovelace">http://es.wikipedia.org/wiki/Ada_Lovelace</a><br /></li></ul><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/7118326140139224040-5615652891272495831?l=misvaguedades.blogspot.com" /></div>http://misvaguedades.blogspot.com/2009/03/personajes-interesantes-de-la.htmlMe dao cuenta duna cosicahttp://fergunet.blogspot.com/2009/05/me-dao-cuenta-duna-cosica.htmlhttp://fergunet.blogspot.com/2009/05/me-dao-cuenta-duna-cosica.htmlAviso Importante As Usualhttp://fergunet.blogspot.com/2009/04/aviso-importante-as-usual.htmlhttp://fergunet.blogspot.com/2009/04/aviso-importante-as-usual.htmlPrimera Ley Bloguera de Fergusonhttp://fergunet.blogspot.com/2009/04/primera-ley-bloguera-de-ferguson.htmlhttp://fergunet.blogspot.com/2009/04/primera-ley-bloguera-de-ferguson.htmlEl Meme de la Semana!http://fergunet.blogspot.com/2009/04/el-meme-de-la-semana.htmlhttp://fergunet.blogspot.com/2009/04/el-meme-de-la-semana.htmlTruco para sacarse una tesis en menos de 10 añoshttp://fergunet.blogspot.com/2009/04/truco-para-sacarse-una-tesis-en-menos.htmlhttp://fergunet.blogspot.com/2009/04/truco-para-sacarse-una-tesis-en-menos.htmlVirus hijoputahttp://fergunet.blogspot.com/2009/03/virus-hijoputa.htmlhttp://fergunet.blogspot.com/2009/03/virus-hijoputa.htmlHow-To: Cómo hacer interfaces gráficas en condiciones con Eclipsehttp://fergunet.blogspot.com/2009/03/how-to-como-hacer-interfaces-graficas.htmlhttp://fergunet.blogspot.com/2009/03/how-to-como-hacer-interfaces-graficas.htmlEl Pollo vende El Minihttp://fergunet.blogspot.com/2009/03/el-pollo-vende-el-mini.htmlhttp://fergunet.blogspot.com/2009/03/el-pollo-vende-el-mini.htmlTe das cuenta de que estás en el siglo XXI...http://fergunet.blogspot.com/2009/02/basura.htmlhttp://fergunet.blogspot.com/2009/02/basura.htmlLos Oscars en Directohttp://fergunet.blogspot.com/2009/02/los-oscars-en-directo.htmlhttp://fergunet.blogspot.com/2009/02/los-oscars-en-directo.htmlPerdonen que no escriba, pero...http://eldiegoj.blogspot.com/2009/03/perdonen-que-no-escriba-pero.htmlHe estado muy ocupado...<br /><br />... en el <a href="http://brainstorm.ubuntu.com/">brainstorm</a> de Ubuntu<br /><br /><a href="http://1.bp.blogspot.com/_36e_UiYNaUA/Sc9hva8GBRI/AAAAAAAAAYQ/H0KjH85J88Y/s1600-h/brainstorm-diegoj.png"><img src="http://1.bp.blogspot.com/_36e_UiYNaUA/Sc9hva8GBRI/AAAAAAAAAYQ/H0KjH85J88Y/s400/brainstorm-diegoj.png" alt="" id="BLOGGER_PHOTO_ID_5318577152260965650" border="0" /></a><br />... Y <a href="https://launchpad.net/">traduciendo</a> aplicaciones software a español<br /><a href="http://2.bp.blogspot.com/_36e_UiYNaUA/Sc9h_C0IqDI/AAAAAAAAAYY/zclpG2077jc/s1600-h/launchpad-diegoj.png"><img src="http://2.bp.blogspot.com/_36e_UiYNaUA/Sc9h_C0IqDI/AAAAAAAAAYY/zclpG2077jc/s400/launchpad-diegoj.png" alt="" id="BLOGGER_PHOTO_ID_5318577420663040050" border="0" /></a><br /><br /><br />Espero escribir algo más interesante pronto. ;)<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-7325526342462161570?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/03/perdonen-que-no-escriba-pero.html¿Tú también, hijo mío?http://eldiegoj.blogspot.com/2009/02/tu-tambien-hijo-mio.htmlPantalla de apagado de <a href="http://www.reactos.org">Reactos</a> 0.3.8:<br /><br /><a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SYspr1E_LbI/AAAAAAAAAX0/ROAComN4gK4/s1600-h/reactos.png"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SYspr1E_LbI/AAAAAAAAAX0/ROAComN4gK4/s400/reactos.png" alt="" id="BLOGGER_PHOTO_ID_5299375219490631090" border="0" /></a>Algún día os comentaré los sistemas operativos <span>esotéricos</span> que estoy probando.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-6738326440069307422?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/02/tu-tambien-hijo-mio.htmlCuando tratas con usuarios...http://eldiegoj.blogspot.com/2009/02/cuando-tratas-con-usuarios.htmlTe das cuenta de que hay <span>dos tipos de usuarios</span> que nadie, nadie, nadie desea:<br /><ol><li>Los que se creen que <span>se puede hacer cualquier cosa de forma sencilla y sin problemas</span>. De hecho te suelen<span> echar en cara</span> por qué no lo has hecho antes. Además suelen equiparar sus conocimientos con los tuyos (<span>fácilmente</span>).<br /></li><li>Los que <span>no te hacen caso</span> y hacen caso al listillo de turno que sabe menos que tú, pero<span> que sabe de ese tema más que nadie porque hizo un cursillo bla, bla, bla</span>.<br /></li></ol>En definitiva, <span>incultura popular</span> (otra cosa es que lo reconozcan, claro).<br /><br />Esperemos que esta clase de usuarios (en algunos ambientes cada vez más escasa) evolucione hacia el tipo de <span>usuario modelo</span>: razonado, abierto a sugerencias, sincero y <span>educado</span>.<br /><br />P. S.: simplemente me apetecía compartirlo con vosotros. ;)<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-4924622745821777362?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/02/cuando-tratas-con-usuarios.htmlTraducir: una forma sencilla de colaborar con el software librehttp://eldiegoj.blogspot.com/2009/02/traducir-una-forma-sencilla-de.html<div>Cuando presenté el proyecto (sí, ese del que todavía no os he contado nada) decidí que aun habiéndome quedado una asignatura debía hacer algo (además de descansar, claro).<br /><br />Lo primero de todo, decidí que debía colaborar con el software libre (en la medida de mis posibilidades), puesto que éste había hecho mucho por mí: me había proporcionado un sistema operativo confiable que me permitía trabajar, investigar y tener ocio sin necesidad de gastarme dinero.<br /><br />Así pues, debido a que en el año 2007 me había hecho una cuenta en <a href="https://launchpad.net/">launchpad.net</a>. porque había oído que era la plataforma de colaboración de <a href="http://www.canonical.com/">Canonical</a>, empresa que promueve y desarrolla de <a href="http://www.ubuntu.com/">Ubuntu</a>, decidí <span>usarla</span>.<br /><br />En primer lugar, vi que había varias formas de colaborar, desde desarrollando aplicaciones (obviamente), informar de bugs, preguntar a los desarrolladores y lo más raro de todo... <span>Traducir aplicaciones</span>.<br /><br />Vi que se podían traducir fácilmente los textos de las aplicaciones mediante formularios web. Sin necesidad de instalar nada, sólo con mis conocimientos de inglés y algo de tiempo.<br /><br /><a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SYjd5tDvoEI/AAAAAAAAAXs/x-hVdak8uJo/s1600-h/ejemplo-traduccion-launchpad.png"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SYjd5tDvoEI/AAAAAAAAAXs/x-hVdak8uJo/s400/ejemplo-traduccion-launchpad.png" alt="" id="BLOGGER_PHOTO_ID_5298728945018970178" border="0" /></a><br /><br />También me di cuenta de la gran cantidad de software que hay, y que los hispanohablantes no podemos usar porque no está en nuestro idioma. Así que decidí que iba a ampliar en varios cientos de millones de personas la audiencia de esos grandes programas desconocidos.<br /><br />Eso sí, quería traducir algo que atrayese a la gente al software libre (y a Ubuntu en particular). Algo que cuando se lo enseñaras a alguien dijera: <span>¡Guau! ¿está eso para Windows?</span> Y yo contestase: <span>No, sólo para Ubuntu</span>. En definitiva, decidí traducir algunos juegos.<br /><br />Como tengo como afición los juegos de rol, me resultan estimulantes y me lo paso bien jugando sólo con un papel, lápiz y unos dados decidí buscar si había algún RPG que fuera software libre, y lo encontré: <a href="http://scourgeweb.org/">SCOURGE</a>. Era un juego de rol con mucho texto y bastante argumento, desarrollado por una comunidad activamente desde el año 2004, y que al jugarlo en inglés me daba dolor de cabeza (algunas cosas están escritas en inglés antiguo). Total, que me puse en contacto con el equipo de desarrollo SCOURGE y les indiqué que tenía interés en hacer la traducción vía <a href="https://translations.launchpad.net/scourge/trunk/+pots/scourge/es/+translate">launchpad</a>.<br /><br />Eran unas 2550 cadenas de texto en inglés, de las cuales estaban traducidas sólo un 20% (que también tuve que revisar). Me lo propuse y un poco más de una semana lo hice.<br /><br />Luego les convencí para que me dieran acceso al repositorio SVN, traduje otras 1000 cadenas de texto más, y conseguí una traducción completa (beta) al español del juego SCOURGE.<br /><br />Curiosamente, no he jugado a SCOURGE hasta ahora, puesto que mi antiguo portátil no <span>tiraba</span> con él.<br /><br />Éste es el resultado:<br /></div><br /><a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SYjYKXAwltI/AAAAAAAAAXU/P9ESuwzf9RQ/s1600-h/scourge-spanish01.png"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SYjYKXAwltI/AAAAAAAAAXU/P9ESuwzf9RQ/s400/scourge-spanish01.png" alt="" id="BLOGGER_PHOTO_ID_5298722634088879826" border="0" /></a><br /><br /><a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SYjYeqcToYI/AAAAAAAAAXc/dC4vJtX3aEM/s1600-h/scourge-spanish02.png"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SYjYeqcToYI/AAAAAAAAAXc/dC4vJtX3aEM/s400/scourge-spanish02.png" alt="" id="BLOGGER_PHOTO_ID_5298722982902079874" border="0" /></a><br /><br /><a href="http://1.bp.blogspot.com/_36e_UiYNaUA/SYjY20dzQLI/AAAAAAAAAXk/nynVyiw3xCU/s1600-h/scourge-spanish03.png"><img src="http://1.bp.blogspot.com/_36e_UiYNaUA/SYjY20dzQLI/AAAAAAAAAXk/nynVyiw3xCU/s400/scourge-spanish03.png" alt="" id="BLOGGER_PHOTO_ID_5298723397909561522" border="0" /></a><br /><div>Evidentemente, no se me recordará como Linux Torvalds por mi contribución, a la humanidad pero por algo se empieza :D. Ahora continúo traduciendo aplicaciones, en <a href="https://launchpad.net/%7Ediegojromerolopez">launchpad</a> y mi objetivo es retocar las ya existentes para que sean de buena calidad, porque <span>un software que no está en tu idioma no lo puedes usar bien</span>. Una vez que tenga una idea clara de qué aplicación hacer (no quiero hacer una que resuelva un problema de otra forma) la haré.<br /><br />Volviendo al tema, por si os interesa, el juego va de una <span>compañía de mercenarios "exterminadora de alimañas" </span>que va aceptando misiones. Tu objetivo es hacer un grupo de héroes y completarlas todas. Podéis descargaros el juego para vuestro PC <a href="https://sourceforge.net/project/showfiles.php?group_id=98006">aquí</a>. (Aunque la versión no sea la 1.0, os puedo asegurar que da para horas de juego y es totalmente estable).<br /><br />El juego es GPL, pero el <span>arte</span> es <span>prestado</span>, así que estaría bien que fueran CC o similar.<br /><br />Por eso, Si deseas colaborar, puedes hacerte un usuario en <a href="http://scourgeweb.org/">SCOURGE</a> y ayudar en los siguientes detalles:<br /></div><ul><li><span>Modelos 3D</span>: desarrollar modelos (creo que en formato md3, pero no me hagáis mucho caso). Esto es lo fundamental.<br /></li><li>Texturas 3D</li><li>Hacer un paquete .deb para Ubuntu (esto voy a ver si me pongo y lo hago).<br /></li><li>Imágenes 2D</li><li>Desarrollo de la historia.</li><li>Optimización de código.</li><li>Traducción al español. Bien por aquí, bien por la web de SCOURGE o bien por <a href="https://launchpad.net/%7Ediegojromerolopez">launchpad</a>, podéis ayudarme a mejorar la traducción de <span>mi-indio-ser</span> a algo mejor.</li></ul>Edición 1: corrección de errores tipográficos.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-1448553495293108338?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/02/traducir-una-forma-sencilla-de.html¿Por qué no usar Microsoft Internet Explorer?http://eldiegoj.blogspot.com/2009/01/por-que-no-usar-microsoft-internet.html<div>Vía <a href="http://www.reddit.com/r/programming/comments/7sq0r/fail_ie8_homepage_has_ie7_compatibility_tag_in/">reddit</a> me acuerdo de algo (y veo añadidos) que yo vi hace tiempo al instalarme la beta de Internet Explorer 8: <span>la versión de Internet Explorer 8 (IE 8) que aparecerá en pocos meses, es incompatible con la versión 7</span>.<br /><br />De tan mala calidad era la interpretación del estándar que Microsoft tuvo que implementar un mecanismo para incluir archivos de hojas de estilo (en realidad permite incluir más elementos aparte de las hojas de estilo, pero se suele usar para CSS) de forma condicional. Esto es, permitir que si el navegador es cualquiera usa la hoja de estilo general, si es la versión Internet Explorer 6 usa otro estilo, si es la versión 7 usa otro distinto, si es de una versión igual o menor que una dada, o incluso simplemente si es IE. A esta técnica se la conoce como comentarios condicionales (<a href="http://msdn.microsoft.com/en-us/library/ms537512.aspx">conditional comments</a>).<br /><br />Pues bien, en la <a href="http://www.microsoft.com/windows/Internet-explorer/beta/default.aspx">página principal de Microsoft sobre Internet Explorer 8</a>, han tenido que usar este tipo de estrategias para que esa página se viera bien en la versión 7. Sólo tienes que ver el código fuente (texto en <span>verde</span>):<br /><br /></div><a href="http://3.bp.blogspot.com/_36e_UiYNaUA/SX7xSTcdNxI/AAAAAAAAAWQ/Uf4aZJH7caU/s1600-h/codigo-fuente-web-ie8.png"><img src="http://3.bp.blogspot.com/_36e_UiYNaUA/SX7xSTcdNxI/AAAAAAAAAWQ/Uf4aZJH7caU/s400/codigo-fuente-web-ie8.png" alt="" id="BLOGGER_PHOTO_ID_5295935508593850130" border="0" /></a><br />Página de Microsoft sobre IE 8:<br /><br /><a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SX7_NkAtP2I/AAAAAAAAAWo/CjX0Y4ppDT0/s1600-h/ie8-web.png"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SX7_NkAtP2I/AAAAAAAAAWo/CjX0Y4ppDT0/s400/ie8-web.png" alt="" id="BLOGGER_PHOTO_ID_5295950820304306018" border="0" /></a><br />En realidad, debería decir que la <span>versión 7 de este navegador es incompatible con la 8</span>, puesto que la última versión interpreta algo mejor el <a href="http://www.w3.org/">estándar de páginas web</a>.<br /><br /><div>Por otro lado, más grave aún es que en la captura de pantalla podemos ver cómo muestran la web SIN respetar los estándares usando un modo de "compatibilidad" con IE 7. Esto se hace mediante una <a href="http://blogs.msdn.com/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx">etiqueta</a><a href="http://blogs.msdn.com/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx"> especial para IE 8</a>. Es decir, que no sólo los navegadores de distintas versiones interpretan los estilos CSS de manera distinta, sino también la propia estructura de los documentos <a href="http://es.wikipedia.org/wiki/C%C3%B3digo_HTML">HTML</a>/<a href="http://es.wikipedia.org/wiki/XHTML">XHTML</a>. Y por si fuera poco, <span>hay que hacer las páginas pensando en las características propias (no estándares) de la versión de Internet Explorer en el que se verán</span>.<br /><br />De hecho, han tenido que incluir un modo de compatibilidad en IE 8 para que se puedan ver las páginas del mismo modo (en realidad, <span>interpretando de la misma forma errónea</span> <span>el estándar</span>) que en la versión 7. Fíjate en el texto que aparece debajo del puntero de ratón.<br /><br /><a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SX75ZpM5FwI/AAAAAAAAAWY/sieDMOgn0Vs/s1600-h/modo-compatibilidad.png"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SX75ZpM5FwI/AAAAAAAAAWY/sieDMOgn0Vs/s400/modo-compatibilidad.png" alt="" id="BLOGGER_PHOTO_ID_5295944430786254594" border="0" /></a><br /><br />Por último, y no directamente relacionado con esto, está el tema de que <span>la página de descarga de Internet Explorer 8 no es estándar</span> según el validador del W3C (puedes verlo tú mismo <a href="http://validator.w3.org/check?verbose=1&uri=http%3A%2F%2Fwww.microsoft.com%2Fwindows%2FInternet-explorer%2Fbeta%2Fdefault.aspx">aquí</a>):<br /><br /><a href="http://1.bp.blogspot.com/_36e_UiYNaUA/SX78jZJjRTI/AAAAAAAAAWg/kY3W8JoNVsY/s1600-h/ie8-w3c-erros-w3c-validation.png"><img src="http://1.bp.blogspot.com/_36e_UiYNaUA/SX78jZJjRTI/AAAAAAAAAWg/kY3W8JoNVsY/s400/ie8-w3c-erros-w3c-validation.png" alt="" id="BLOGGER_PHOTO_ID_5295947896810849586" border="0" /></a><br />De verdad deseas seguir usando un <span>producto</span> que:<br /><ol><li><span>No respeta los estándares</span> internacionales.</li><li><span>No tiene compatibilidad</span> entre versiones.</li><li>Hay que <span>adaptar las páginas a él</span>. Al contrario de como debería suceder, una página estándar deberá ser modificada para que se visualice bien en Internet Explorer.<br /></li><li>Es <span>fuente de múltiples vulnerabilidades</span> (como por ejemplo, <a href="http://news.cnet.com/8301-1009_3-10124702-83.html">ésta</a> de Diciembre del año pasado) que pondrán tu PC con Windows en <span>riesgo</span>.</li></ol><span>No uses Microsoft Internet Explorer, usa cualquier otra alternativa</span>, hay muchas y cualquiera es mejor: <a href="http://www.mozilla-europe.org/es/firefox/">Firefox</a>, <a href="http://www.apple.com/safari/download/">Safari</a>, <a href="http://www.google.com/chrome?hl=es">Google Chrome</a>, u <a href="http://www.opera.com/browser/download/">Opera</a>.<br /><br />P. S.: en algunos países, la incultura tecnológica de los gobernantes hace que al acceder a páginas oficiales veamos cosas como por ejemplo que en la <a href="http://www.senat.ro/PaginaPrincipala.aspx">página web del senado rumano</a>, al usar un navegador distinto de Internet Explorer en un sistema operativo distinto a Windows XP/Vista aparece la siguiente pantalla:<br /><br /><a href="http://1.bp.blogspot.com/_36e_UiYNaUA/SX8GP2Bo7YI/AAAAAAAAAWw/6ik0puw_vws/s1600-h/senado-rumano.png"><img src="http://1.bp.blogspot.com/_36e_UiYNaUA/SX8GP2Bo7YI/AAAAAAAAAWw/6ik0puw_vws/s400/senado-rumano.png" alt="" id="BLOGGER_PHOTO_ID_5295958556081188226" border="0" /></a>Muy lamentable.<br /></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-8086600395147136218?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/01/por-que-no-usar-microsoft-internet.htmlComprar 1, regalar 1http://eldiegoj.blogspot.com/2009/01/comprar-1-reglar-1.html<a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SXyRFkgH5LI/AAAAAAAAAWI/YktAdZQ48Ck/s1600-h/comprar1regalar1.jpg"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SXyRFkgH5LI/AAAAAAAAAWI/YktAdZQ48Ck/s400/comprar1regalar1.jpg" alt="" id="BLOGGER_PHOTO_ID_5295266786764645554" border="0" /></a><br />Visto por un amigo en un supermercado regentado por asiáticos. ¿Estaremos ante una evolución del lenguaje? Bien pensado, hablar así es más práctico. :)<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-352794450857963861?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/01/comprar-1-reglar-1.htmlEl coche de Horatio bajo la atenta mirada de Michael Scofieldhttp://eldiegoj.blogspot.com/2009/01/el-coche-de-horatio-bajo-la-atenta.htmlEl <a href="http://csimiami.wetpaint.com/page/Cars+of+CSI:+Miami?t=anon">coche</a> de <a href="http://www.instantcaruso.com/">Horatio</a> en Granada, siendo vigilado por Michael Scofield.<br /><a href="http://4.bp.blogspot.com/_36e_UiYNaUA/SXkG3VJrBdI/AAAAAAAAAWA/tzDhfIzvydg/s1600-h/horatio%26scofield.jpg"><img src="http://4.bp.blogspot.com/_36e_UiYNaUA/SXkG3VJrBdI/AAAAAAAAAWA/tzDhfIzvydg/s400/horatio%26scofield.jpg" alt="" id="BLOGGER_PHOTO_ID_5294270384591013330" border="0" /></a>Yeahhhhh!<br /><br />P. S.: El <a href="http://flickr.com/photos/26494646@N05/2815660858">grafiti</a> en cuestión.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-7302181535320059190?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/01/el-coche-de-horatio-bajo-la-atenta.htmlLa mejor noticia del díahttp://eldiegoj.blogspot.com/2009/01/la-mejor-noticia-del-da.html<a href="http://3.bp.blogspot.com/_36e_UiYNaUA/SWy8i-eZSKI/AAAAAAAAAVo/iz0M_SaifWU/s1600-h/noticia-mas-interesante.png"><img src="http://3.bp.blogspot.com/_36e_UiYNaUA/SWy8i-eZSKI/AAAAAAAAAVo/iz0M_SaifWU/s400/noticia-mas-interesante.png" alt="" id="BLOGGER_PHOTO_ID_5290810971325548706" border="0" /></a><br /><br />Porque nunca sabes qué noticia te vas a encontrar en el Google Reader. ;)<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-5177271240201132312?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/01/la-mejor-noticia-del-da.htmlEl año de Linuxhttp://eldiegoj.blogspot.com/2009/01/el-ao-de-linux.html<div><br /></div><span>Introducción</span><br /><br /><div>Desde hace <a href="http://eldiegoj.blogspot.com/2009/01/ya-soy-ingeniero.html">años</a>, vengo oyendo hablar de "El X año de <a href="http://en.wikipedia.org/wiki/Linux">Linux</a>", concretamente la frase completa es "<span>El X <a> va a ser el año de Linux</span>".<br /><br />Esta frase se refería a el año en el cual el sistema operativo de software libre Linux (en realidad, <a href="http://en.wikipedia.org/wiki/GNU/Linux_naming_controversy">GNU/Linux</a>, o eso dicen) empezaría a ganar una cuota de mercado considerable, y podría en un futuro próximo hacerle la competencia a los sistemas operativos de Microsoft y Apple en el campo de los computadores personales.<br /><br />Ese año no ha llegado. De hecho, se ha dicho que el <a> ha sido 1999, 2000, 2001, 2002, así hasta el año 2008 pero no nos engañemos. <span>No ha habido año de Linux aún</span>. Un <a href="http://marketshare.hitslink.com/operating-system-market-share.aspx?qprid=8&qpmr=100&qpdt=1&qpct=3&qptimeframe=Y">sistema operativo con una cuota de mercado de menos del 1%</a> indica que la gran mayoría de los habitantes de este planeta no lo usan.<a href="http://3.bp.blogspot.com/_36e_UiYNaUA/SWgECOGYwOI/AAAAAAAAAVQ/VUSqu1o8ssI/s1600-h/os-market-share-.png"><img src="http://3.bp.blogspot.com/_36e_UiYNaUA/SWgECOGYwOI/AAAAAAAAAVQ/VUSqu1o8ssI/s320/os-market-share-.png" alt="" id="BLOGGER_PHOTO_ID_5289482198537781474" border="0" /></a><a><br /><a><br /><span><a></span><div><span>Causas<br /></span></div><a><br /><a><div>Se puede uno plantear que ¿cómo <span>no ha tenido éxito</span> un sistema operativo (SO) de código abierto (cualquiera puede usarlo sin coste e incluso modificarlo) y de buena calidad? Desde mi punto de vista, el hecho de que despúes de más de 17 años (Linux nació en 1991) no se haya creado una base de usuarios para Linux tiene las siguientes causas:</div><br /><a><br /><a><br /><a><ul><li><span>Linux como sistema operativo profesional/de servidores</span>. Linux sí que ha triunfado en el mundo de los servidores de internet debido a su fiabilidad, funcionalidad, alta eficiencia y por supuesto, a que es código libre. Empresas como IBM, Red Hat e incluso Oracle han invertido millones de euros en el desarrollo de Linux. Por eso, se ha "olvidado" que el <span>objetivo de cualquier producto es venderse</span> (entiéndase venderse como usarse, en este caso) al mayor número de consumidores.</li></ul><a><a><a><br /><a><br /><a><ul><li><span>Indolencia de usuarios</span>: los usuarios han escogido productos de Microsoft (y Apple). Algunos dirán que estas empresas se han aprovechado de eso estableciendo licencias de uso restrictivas, pero, qué demonios, <span>están en su derecho</span>, ellos hacen el producto ellos lo venden como quieran. <span>La culpa es de los usuarios que se han aceptado esas licencias</span>.<span> Es curioso que para comprar un coche una persona pueda dedicar varios meses de comparar fabricantes, mientras que en el caso del software no dedica más de unos minutos, siendo como va a ser con toda seguridad una parte muy importante de su trabajo</span>.</li></ul><br /><a><br /><a><ul><li><span>El problema de los fabricantes de hardware</span>: hasta hace no muy poco, era raro el fabricante que desarrollaba controladores para Linux. Desconozco si era por presiones empresariales, o simplemente por desgana (no nos engañemos, <span>hacer un controlador para un SO que usa un 1% de la gente no es rentable</span>). Felizmente, esto ha cambiado y empresas como Intel, AMD y Nvidia sacan al mercado controladores para Linux. En el caso de Intel y AMD son además, de código libre.</li></ul><br /><a><br /></div><ul><li><a href="http://1.bp.blogspot.com/_36e_UiYNaUA/SWgW16U7nlI/AAAAAAAAAVY/uy7sgoengFQ/s1600-h/linux-distro-timeline.png"><img src="http://1.bp.blogspot.com/_36e_UiYNaUA/SWgW16U7nlI/AAAAAAAAAVY/uy7sgoengFQ/s320/linux-distro-timeline.png" alt="" id="BLOGGER_PHOTO_ID_5289502877792575058" border="0" /></a><span>Fragmentación de la comunidad</span>: uno de los problemas de ser libre es que cualquiera que tenga conocimientos puede fabricarse su propia versión de Linux (que en jerga técnica se conoce como <a href="http://es.wikipedia.org/wiki/Distribuci%C3%B3n_de_linux">Distribución de Linux</a>). Esto implica que hay miles de distribuciones de linux. Peor aún, se pueden hacer distribuciones que se basen en otras distribuciones, con lo que hay más combinaciones. Así, se montaron distribuciones potenciadas por la Fundación del Software Libre (FSF) como Debian, otras por empresas privadas (Red Hat), otras impulsadas por individuos (Slackware), etc. Por ejemplo, <a href="http://en.wikipedia.org/wiki/List_of_linux_distributions">aquí</a> puedes ver unas cuantas distribuciones de Linux. En un momento de la historia, se dijo que <span>Linux era el único SO con más versiones que usuarios</span>. Lo que no dejaría de ser cierto si contamos sólo a los usuarios de computadores personales. Bueno, el caso es que, como era de esperar, cada distribución empezó a incluir determinadas características propias. Y llegó un momento en que aun teniendo el mismo núcleo del SO, las aplicaciones eran muy distintas. Valga el ejemplo de los distintos sistemas de instalación de paquetes. <span>Con la diversidad llegó el caos</span>, porque si la unión hace la fuerza, la división NO. Linux se fragmentó tanto que se perdió capacidad de desarrollo puesto que<span> lo que se hacía para una distribución no siempre valía para otra</span>. Esto está cambiando.</li></ul><div><br /><br /></div><ul><li><span>Más diversidad; entornos de escritorio distintos con TODA la funcionalidad repetida (Gnome, KDE, Xfce, OpenBox, LDE)</span>: se han hecho escritorios con la misma funcionalidad por varios grupos. Problemas de licencias de software llevaron a la creación de <a href="http://en.wikipedia.org/wiki/GNOME">Gnome</a> (potenciado por la <a href="http://www.fsf.org/">FSF</a>), debido a posibles incompatibilidades con la Licencia General Pública de Linux que pudiera haber al usar <a href="http://en.wikipedia.org/wiki/KDE">KDE</a> (además de que en aquella época dependía de software cuya licencia no estaba clara). Cada escritorio tiene un conjunto de programas que realizan las mismas funciones pero que <span>no son para nada compatibles</span> (eso no quiere decir que no se puede tener un escritorio y usar software del otro).</li></ul><div><br /></div><ul><li><span>Aplicaciones específicas para SO tipo Windows</span>: aplicaciones profesionales como Photoshop, AutoCad o similares sólo están en su versión para Windows. Gracias al software de traducción <a href="http://www.winehq.org/">Wine</a> que permite usar programas Windows en Linux algunos de estos problemas <a href="http://blog.knightlust.com/?p=88">se han solventado</a>. Nótese que esto es un parche, y la solución real sería dejar de usar esos programas o pedir su desarrollo para Linux. Problema: los usuarios no usan Linux -> la empresa no desarrolla para Linux -> los usuarios no usan Linux (círculo vicioso).</li></ul><div><br /></div><ul><li><span>Falta de juegos comerciales</span>: en Linux apenas hay juegos comerciales. Pero valga decir, que si a día de hoy alguien se compra un computador pensando en jugar, no tiene <span>muchas luces</span>. Digamos que, gracias a las videoconsolas, este problema se ha solventado. Lamentablemente no ha sido gracias a los fabricantes, sino gracias a la casi inexistencia de un gran público consumidor de juegos de PC. Además, la proliferación de juegos de calidad alta, media y baja en Linux ha sido increíble. Para una muestra, visita <a href="http://happypenguin.org/">Happy Penguin</a>.<br /></li></ul><div><br /></div><ul><li><span>Pérdida de objetivos claros o inexistencia de hoja de ruta</span>: durante mucho tiempo se ha estado inmerso en luchas de escaso interés sobre mantener la libertad de código en todo el núcleo, por añadir determinadas funcionalidades, por ver qué entorno de escritorio era el más usado (ver arriba), etc. Al final, se ha olvidado que el objetivo de todo producto es venderse. Y Linux (aparte de un proyecto colaborativo maravilloso) es eso, un producto. Menos mal que llegó <a href="http://en.wikipedia.org/wiki/Mark_Shuttleworth">Mark Shuttleworth</a> y aplicó técnicas de márketing a este mundo y gracias a su proyecto (<a href="http://en.wikipedia.org/wiki/Ubuntu">Ubuntu</a>) el objetivo ha vuelto ha estar claro.<br /></li></ul><div><br /><br /></div><ul><li><span>GNU</span>: <a href="http://en.wikipedia.org/wiki/GNU">GNU</a><span> no es un nombre comercial, GNU no son siglas fáciles de recordar, GNU es difícil de pronunciar, GNU no es un buen nombre para márketing</span>... He dicho estas frases en tono de humor, pero un motivo por el que casi nadie habla de GNU/Linux es que <span>GNU suena a alienígena</span>, y encima de todo, no significa nada puesto que es un <a href="http://es.wikipedia.org/wiki/Acr%C3%B3nimo_recursivo">acrónimo recursivo</a>. Aquí creo que <a href="http://en.wikipedia.org/wiki/Richard_Stallman">Richard Stallman</a> cometió el error de su vida y <span>condenó a Linux a un ostracismo del mundo de los usuarios de a pie</span>.</li></ul><div><br /></div><ul><li><span>La piratería</span>: sí, parece raro que lo diga, pero la gente normal tiene la concepción de que la piratería no es mala, y no sólo eso, ¡sino que la practican a diario! Es un poco increíble como algo que es ilegal y moralmente rechazable está tan socialmente aceptado. El caso es que el Windows de 0€ (Windows pirata) es usado en muchos sitios (conozco casos personalmente), por lo que el uso de una alternativa libre y gratuita no se contempla.</li></ul><div><br /></div><ul><li><span>Incultura e inmovilismo</span>: sé de gente (que se autodenomina "de letras") que aunque les expongas argumentos ingenieriles sobre el uso de determinados programas te responderán con sandeces y te dirán que ellos tienen razón, aunque no tengan ni idea de lo que estén hablando. De esta gente hay mucha, y es curioso que no razonen de esta forma ante un arquitecto al comentar la solidez de una estructura, o un ingeniero industrial al hablar de determinado tipo de máquina. Será por el <a href="http://es.wikipedia.org/wiki/Efecto_Dunning-Kruger">efecto Duning-Kruger</a> aplicado al mundo del software.<br /></li></ul><div> <span>Todo eso está muy bien, pero ¿será 2009 el año de Linux?</span><br /><br />En primer lugar, contando conque no tengo contactos de ningún tipo con la comunidad más allá de leer diariamente <a href="http://planet.ubuntu.com/">Planet Ubuntu</a> y tampoco tengo contactos con los fabricantes de hardware no esperes que mi opinión no contenga imperfecciones.<br /><br />Bien, dicho esto, <span>creo que no</span>. 2009 no será el año de Linux. El año de Linux no llegará hasta que desaparezcan las cien mil distribuciones cada una con su propio sistema de gestión de paquetes, y se unifiquen en 3 ó 4 y todas compatibles entre sí. Gracias a Mark Shuttleworth, <span>el ecosistema está siendo purgado de distribuciones que lo único que hacían era confundir y equivocar al usuario en su elección de un SO.</span> En otras palabras, Ubuntu está siendo la distribución más conocida y está viendo su número de usuarios incrementarse mucho con respecto a las demás. Por mi parte, no pienso cambiar de distribución, ya que tiene todo lo que necesito.<br /><br />Dicho esto, el 2009 viene con buenas noticias:<br /></div><ul><li>AMD liberó los <a href="http://www.theregister.co.uk/2008/12/31/amd_open_source_3d_code/">drivers de sus tarjetas gráficas</a>.</li><li>Varios fabricantes están sacando sus ultraportátiles con Linux (Asus, <a href="http://www.shopping.hp.com/webapp/shopping/computer_can_series.do?storeName=computer_store&category=notebooks&a1=Category&v1=Mini&series_name=minimi_series">HP</a>, Dell, Acer). Lamentablemente, todas las versiones son distintas.</li><li>Windows va a sacar su nuevo SO (<a href="http://en.wikipedia.org/wiki/Windows_7">Windows 7</a>), lo que obligará a una costosa migración que puede que haga que la gente piense en Linux (esperemos que Ubuntu) como alternativa.</li><li><a href="http://www.engadget.com/2009/01/05/freescales-i-mx515-netbook-processor-promises-low-cost-long-ba">Freescale</a> fabricará chips ARM compatibles con la próxima <a href="http://www.linuxdevices.com/news/NS9527593286.html">versión ARM de Ubuntu</a>.</li><li>Los <a href="http://www.desktoplinux.com/news/NS6584029937.html">computadores públicos de Vietnam sólo usarán Linux</a>.</li><li>Palm ha sacado un smartphone que usa una versión modificada de Linux: el <a href="http://www.crunchgear.com/2009/01/04/exclusive-new-palm-phone-to-have-slide-down-keyboard-large-touchscreen/">Palm Pre</a>.<br /></li><li><span>La crisis económica</span>: sí, sí, sí, sé que no es una buena noticia para la sociedad, lo sé. Pero contando conque en la mayoría de los casos el software libre es también gratis, y los desarrolladores viven no de licencias de uso, sino de pago-por-servicios (pago por soporte), esperemos que las empresas recorten gastos también en licencias de uso, y por ende usen Linux.<br /></li></ul><div>Es decir, auguro que la base de usuarios va a alcanzar un 3% a finales del año 2009. Es decir, el año 2009 no será el año de Linux, pero habrá un incremento espectacular en el número de usuarios.<br /><br /><span>Entonces, ¿cuándo será el año de Linux?</span><br /></div><ul><li>Cuando se repita el éxito de Firefox en Linux, es decir, cuando uno de cada 5 personas use Linux.</li><li>Cuando la administración pública use exclusivamente un SO de calidad como Linux</li><li>Cuando una <span>empresa fuerte</span> (estoy pensando en Google) <span>potencie, desarrolle, financie o recomiende</span> públicamente una distribución de <span>Linux</span>. Si ello llega a pasar, el argumento de autoridad tipo <span>lo dice Google, has de hacerlo</span> hará que muchos usuarios dejen de usar Windows.</li><li>Cuando los ingenieros en informática dejen de usar Windows, puesto que no es bueno trabajar con un SO que no se controla al 100%.</li></ul><div><br /><span>Vale, me has convencido. ¿Qué puedo hacer yo?</span><br /><span></span><br /></div><ul><li>Visitar <a href="http://www.ubuntu.com/getubuntu/download">ubuntu.com</a> y (pulsando sobre el botón <span>gordote</span> verde) bajarte la imagen ISO de CD, grabártela y probarla sin necesidad de instalártela.</li><li>Dejar de ayudar a los que tienen software ilegal. Si se lo instalaron ellos porque eran tan <span>listillos</span>, que sean <span>listillos</span> para arreglarlo también.</li><li>Dejar de ayudar a los que instalaron software legal. <span>Yo lo hago sólo a condición de que en ese mismo PC instale Ubuntu, por ahora, lo he hecho 1 vez</span>.<br /></li><li>Promover Ubuntu como alternativa real a Windows.</li><li>Dejar de usar formatos cerrados. Dejar de usar Microsoft Office y empezar a usar <a href="http://www.openoffice.org/">OpenOffice.org</a>.</li></ul><br /><span>Vale, vale, esto de Linux me ha encantado ¿cómo puedo contribuir?</span><br /><br /><div>Si quieres contribuir de manera económica, siempre puedes hacer donaciones a la FSF, a la Gnome foundation, a KDE o a cualquier otro proyecto relacionado con este mundo.<br /><br />Si no quieres gastar dinero, o no puedes, o no estás seguro, te diría lo siguiente:<br /></div><ul><li>Si eres desarrollador, piensa en desarrollar alguna aplicación para Linux.</li><li>Si no eres desarrollador y sabes hablar inglés, podrías ayudar en la traducción de Ubuntu o de algún software de Linux vía <a href="https://translations.launchpad.net/">Launchpad</a>.</li><li>Si no eres desarrollador y no sabes inglés, descárgate y prueba Ubuntu (<a href="http://www.ubuntu.com/getubuntu/download">ubuntu.com).<br /></a></li></ul><div>Nota 1: no quiero flamewars en los comentarios.<br /></div>Nota 2: tengo sueño, es tarde y habré escrito algo mal, seguro.<br />Nota 3: no soy anti-Microsoft ni anti-Apple ni anti-nada. De hecho, considero a estas compañías como grandes éxitos de mercado y de desarrollo de software. Sólo me posiciono en contra de su modelo de negocio, no me parece seguro, ni eficiente, ni centrado en el usuario.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-5660426399733001910?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/01/el-ao-de-linux.htmlYa soy ingenierohttp://eldiegoj.blogspot.com/2009/01/ya-soy-ingeniero.htmlYa soy <span>ingeniero en informática</span>.<br /><br />Después de más de 5 años (concretamente 5 años y 3 meses) he obtenido el tan ansiado título. He estado noches sin dormir, días sin parar de trabajar y varios años casi sin tener aficiones.<br /><br />Ahora me puedo dedicar a trabajar y ha vivir un poco como la gente normal. :D<br /><br />Sólo me resta deciros, que <span>cualquier cosa se puede conseguir si se trabaja lo suficiente</span>.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2596647485826090536-2096999575531593681?l=eldiegoj.blogspot.com" /></div>http://eldiegoj.blogspot.com/2009/01/ya-soy-ingeniero.htmlPracticando con la Steadicamhttp://moviendocubos.blogspot.com/2009/05/practicando-con-la-steadicam.htmlSteadicam es un dispositivo que permite llevar la cámara de cine o televisión atada al cuerpo del operador de cámara mediante un arnés. <span>Compensa los movimientos del operador</span>, mostrando imágenes similares al punto de vista subjetivo del personaje.<br /><br /><a href="http://3.bp.blogspot.com/_4tCDCW4W_go/Sf3Awy-MlVI/AAAAAAAAApU/YdSSBFlP6d4/s1600-h/img_5883.jpg"><img src="http://3.bp.blogspot.com/_4tCDCW4W_go/Sf3Awy-MlVI/AAAAAAAAApU/YdSSBFlP6d4/s400/img_5883.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5331629478425433426" /></a><br /><br />La steadicam se compone de:<br /><ul><li><span>Arnés</span> que se coloca el operador de cámara</li><li><span>Brazo isoelástico</span> que va del arnés al brazo recto</li><li><span>Palo</span> recto con: gimball (donde se adapta la cámara), monitor y sistema de contrapesos.</li><li><span>Cámara</span>.<br /></li></ul>El pasado martes 28 de abril, gracias a la iniciativa de Ignacio Tamayo (nuestro profesor de Dirección de Operaciones en la Comunicación Audiovisual) y a la colaboración de un técnico de la <a href="http://www.latitudmedia.com/">productora latitud media de Granada</a> tuvimos la oportunidad de aprender a usar una steadicam.<br /><br /><a href="http://4.bp.blogspot.com/_4tCDCW4W_go/Sf3ARX9vJuI/AAAAAAAAApM/KTfRXRmb7zA/s1600-h/img_5826.jpg"><img src="http://4.bp.blogspot.com/_4tCDCW4W_go/Sf3ARX9vJuI/AAAAAAAAApM/KTfRXRmb7zA/s400/img_5826.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5331628938599802594" /></a><br /><br /><span>La clase fue muy practica,</span> desde las 10 de la mañana hasta pasadas las 18h de la tarde todos pudimos sentir el peso del equipo en nuestras espaldas, comprobar en primera persona su funcionamiento y adquirir algo de habilidad en su manejo.<br /><br />Personalmente puedo decir que esta es una experiencia muy enriquecedora por que:<br /><ul><li>No imaginaba que un operador de steadicam soportaba ese <span>peso</span></li><li>He aprendido a <span>configurar y preparar</span> el equipo de steadicam</li><li>He aprendido a hacer algunos <span>planos</span> con la steadicam</li></ul><br /><br /><a href="http://2.bp.blogspot.com/_4tCDCW4W_go/Sf3BAcEpzHI/AAAAAAAAApc/LmnSHW-7k6Q/s1600-h/img_5831_2.jpg"><img src="http://2.bp.blogspot.com/_4tCDCW4W_go/Sf3BAcEpzHI/AAAAAAAAApc/LmnSHW-7k6Q/s400/img_5831_2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5331629747156405362" /></a><br /><br />Eso si, al día siguiente estuve un poco hecho polvo, me dolía todo, pero lo llevé bien porque pensaba que iba a ser peor.<br /><br />Por último sólo decir que la steadicam funciona muy bien, <span>se consiguen muy buenos planos</span> (personalmente me suelen gustar bastante) y me gusta mucho la <span>movilidad</span> que ofrece.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-6167445326770610842?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/05/practicando-con-la-steadicam.htmlCompletadas las labores de actualización de Sigatrabajando.comhttp://moviendocubos.blogspot.com/2009/05/completadas-las-labores-de.htmlDurante el último mes y medio he estado trabajando en mis ratos libres para actualizar y adecuar la web y el foro de Sigatrabajando.<br /><br /><a href="http://4.bp.blogspot.com/_4tCDCW4W_go/Sf26qTDHQOI/AAAAAAAAApE/YrOcZ09wdfY/s1600-h/IMG_0893.JPG"><img src="http://4.bp.blogspot.com/_4tCDCW4W_go/Sf26qTDHQOI/AAAAAAAAApE/YrOcZ09wdfY/s320/IMG_0893.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5331622769707139298" /></a><br /><br />Aquí tenéis los resultados:<br /><a href="http://www.sigatrabajando.com/">http://www.sigatrabajando.com/</a><br /><a href="http://foro.sigatrabajando.com/">http://foro.sigatrabajando.com/</a><br /><br />Os animo a que participéis en nuestros debates y sigáis nuestras noticias sobre transporte sostenible en Granada.<br /><br />El feed del blog es este: <a href="http://feeds2.feedburner.com/sigatrabajando">http://feeds2.feedburner.com/sigatrabajando</a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-5248699360925760120?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/05/completadas-las-labores-de.htmlCurso de cine y comichttp://moviendocubos.blogspot.com/2009/04/curso-de-cine-y-comic.htmlDel 20 al 24 de abril de 2009 he asistido a un curso de cine y comic organizado por la <a href="http://www.tomacerogranada.com/">asociación toma cero</a>.<br /><br />En el curso hemos tenido a los siguientes ponentes:<br /><ul><li><a href="http://davidfilms.blogspot.com/">David Eating</a>: Un chico tan simpático como su apellido apasionado del cine y todo lo que le rodea.</li><li><a href="http://www.granadablogs.com/comic/">Miguel Ángel Alejo</a>: Profesional de arriba abajo en el mundo del comic y conocedor de otros muchos artes. Su experiencia le avala.</li><li><a href="http://pelisdegaraje.blogspot.com/">Miguel Ángel S. Cogolludo</a>: Experto en efectos especiales, animación y 3D. Yo lo conocí por primera vez a través de su <a href="http://ode.pelisdegaraje.net/">primera película de efectos especiales montada con un 486 y un pentium</a>.<br />Tras explicarnos como era el trabajo de un creador de efectos especiales me quedó clara una cosa: Supongo que no me dedicaré a ello <span>(y no digo nunca porque eso en un blog queda fatal como 20 años después trabajes precisamente en eso xD)</span><br /></li><li><a href="http://jab.weblogs.us/">JAB</a>: Creativo "multimierda" (tal como él, comicamente, dice refiriéndose a que hace de todo). Creador del <a href="http://www.elninogilipollas.com/">niño gilipollas que quería volar</a> y trabajador de <a href="http://www.elninogilipollas.com/flipy/email_flipy.swf">la universidad</a>.</li></ul>Durante el curso he apuntado cosas sueltas que se han dicho y que pueden ser interesantes:<br /><ul><li><a href="http://www.freesound.org/">Free Sound Proyect</a>, web de samples de sonido</li><li>Comics de <a href="http://es.wikipedia.org/wiki/Robert_Crumb">Robert Crumb</a>, del trabajo de su colaborador Havey Pekar se basó la pelicula <a href="http://es.wikipedia.org/wiki/American_Splendor">American Splendor</a> . Las peliculas <a href="http://es.wikipedia.org/wiki/Art_School_Confidential">Art School Confidential</a> y <a href="http://es.wikipedia.org/wiki/Ghost_World_%28pel%C3%ADcula%29">GhostWorld</a> son adaptaciones de los comics de Daniel Clowes<br /></li><li>Compañeros aficionados del 3D, animaciones, etc: <a href="http://3demostraciones.blogspot.com/">Alejandro</a> y <a href="http://calvosaez.blogspot.com/">Calvo Saez</a></li><li>Comics interesantes:<br /></li><ul><li><a href="http://es.wikipedia.org/wiki/Ranma_%C2%BD">Ranma</a>: Comic humoristico que narra las aventuras de una chica muy machota<br /></li><li><a href="http://es.wikipedia.org/wiki/Beck_%28manga%29">Beck</a>:Historia de unos chicos que se montan su grupo de rock, me llamó la atención la banda sonora de la adaptación a la serie.<br /></li><li><a href="http://es.wikipedia.org/wiki/Gravitation">Gravitation</a>: Manga yaoi en el que sueñan con convertirse en una banda de pop</li></ul><li>Truco: Los gags de muchos comics se temporizan con los gags de una película de charles chaplin.</li><li>Peliculas interesantes: <a id="aptureLink_OuQn4Nib51" href="http://en.wikipedia.org/wiki/Juno%20%28film%29">Juno</a>, <a id="aptureLink_YveoM429y0" href="http://en.wikipedia.org/wiki/Cloverfield">Cloverfield</a>, <a id="aptureLink_LCo7Q4jBCu" href="http://en.wikipedia.org/wiki/Paranoid%20Park%20%28film%29">Paranoid Park</a>, <a id="aptureLink_F5lIVfDiOY" href="http://en.wikipedia.org/wiki/Milk%20%28film%29">Milk</a> y <a id="aptureLink_e6LrGN2w0K" href="http://en.wikipedia.org/wiki/Am%C3%A9lie">Amelie</a><br /></li></ul>(Apunté algunas cosas más pero no he encontrado referencias a ellas)<br /><br />En resumen el curso me ha gustado bastante, he aprendido mucho tanto de comics como de cine, he conocido a gente y ha molado.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-7343090836705302956?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/curso-de-cine-y-comic.htmlCómo levantarte y prepararte para irte en 5 minutoshttp://moviendocubos.blogspot.com/2009/04/como-levantarte-y-prepararte-para-irte.htmlEntre que tengo poco tiempo para escribir y que el vídeo lo dice todo simplemente dejo el vídeo sin comentarlo<br />¡Lo puedes comentar tu en los comentarios del blog!<br /><br /><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-7486842252798577045?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/como-levantarte-y-prepararte-para-irte.htmlVI Jornadas sobre bitácoras y medios de comunicaciónhttp://moviendocubos.blogspot.com/2009/04/vi-jornadas-sobre-bitacoras-y-medios-de.html¡Uno de los eventos que más espero vuelve este año!<br /><br /><span>Días</span>:14 y 15 de mayo de 2009<br /><span>Lugar</span>: <a id="aptureLink_r46JRo27gS" href="http://maps.google.com/maps?om=0&iwloc=addr&f=q&ll=37.1739389%2C-3.5967558&hl=en&z=15&ie=UTF8">Patio del Hospital del Peregrino, C/ San Matías, Granada</a><br /><span>Programa</span>: <a href="http://geneura.ugr.es/%7Ejmerelo/jornadas/BMC6/">En la web oficial del evento</a><br /><span>NOTA: <a href="http://geneura.ugr.es/%7Ejmerelo/jornadas/BMC.cgi">Hay que inscribirse</a></span><br /><br /><a href="http://geneura.ugr.es/%7Ejmerelo/jornadas/BMC6/logo_VIB_M.jpg"><img src="http://geneura.ugr.es/%7Ejmerelo/jornadas/BMC6/logo_VIB_M.jpg" alt="" border="0" /></a><br /><br />El evento bitácoras y medios de comunicación (en adelante BMC) es un evento de carácter anual que se celebra en Granada y en el cual se discute mucho sobre los <span>medios de comunicación y esa relación con internet</span> que va creciendo de año en año a un buen ritmo.<br /><br />En el evento participan <span>periodistas, profesionales de los medios de comunicación y profesionales del medio en internet</span> que llenarán un programa muy interesante con temas como los siguientes<br /><ul><li>Creación de identidad personal digital. Una introducción a la web 2.0</li><li>Creación de la identidad digital de un medio.</li><li>Redes Sociales: Los problemas de la identidad digital. La privacidad. Soluciones</li><li>BalzacTv &amp; Enredados &amp; PJorge</li></ul><br /><br /><span>Además tenéis dos razones de peso más para que no os lo perdáis</span><br /><ul><li>Por la noche hay cervezas</li><li>Yo me encargo de los medios audiovisuales: <ul><li>Habrá streaming, lo podréis ver desde casa!</li><li>Estaré yo, podéis venir a <s>verme</s> verlo en directo!</li></ul><br /></li></ul><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-5724588295078856578?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/vi-jornadas-sobre-bitacoras-y-medios-de.htmlVideoclips en lenguaje de signoshttp://moviendocubos.blogspot.com/2009/04/videoclips-en-lenguaje-de-signos.htmlEn el mercado audiovisual (y en cualquier otro mercado) innovar es importante.<br /><br />A raíz del <a href="http://raven.es/2009/04/18/michael-dimartino/">post de Raven</a> he conocido los vídeos de <a href="http://www.youtube.com/user/Captainl0ver">CaptainL0ver en youtube</a>. El autor del canal de youtube es interprete del lenguaje de signos y ha aplicado los conocimientos de su profesión a algunos de sus vídeos (otros los ha subtitulado).<br /><br />De modo que por ejemplo tiene videoclips en los cuales cuenta la canción en lenguaje de signos pero sin detrimento de las artes habituales en un videoclip como es el baile, los efectos, etc. simplemente vedlo<br /><br /><br /><br />No sólo tiene videoclips también tiene vídeos en los que habla sobre algún tema como <a href="http://www.youtube.com/watch?v=zHzUpCd8k7U&feature=channel_page">el matrimonio homosexual</a> tema que trata de forma muy divertida a la vez que seria y porsupuesto subtitulado.<br /><br />En definitiva lo que hace es unir distintos artes para obtener un arte más grande. Es bueno saber de todo.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-5472870001490083405?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/videoclips-en-lenguaje-de-signos.htmlEl caso de Domino's Pizzahttp://moviendocubos.blogspot.com/2009/04/el-caso-de-dominos-pizza.htmlEsta mañana <a href="http://www.viralvideochart.com/youtube/disgusting_dominos_people?id=unMJR9-4MdA">me ha llegado un vídeo</a> con el título "Disgusting Domino's People"<br /><br /><br /><br />En el vídeo se puede ver como un empleado de una tienda local de una multinacional de comida rápida <span>hace guarradas sobre la comida</span> que está preparando, presuntamente para los clientes.<br /><br />Este vídeo sin duda <span>genera una increíble mala imagen</span> para todos los comercios de la cadena, es de las peores cosas que le pueden pasar a la empresa y lo curioso es que es un hecho relativamente pequeño que puede afectar a gran escala. Desde esta mañana me he estado preguntando cómo una empresa puede salir lo menos dañada posible después de la difusión de un vídeo como este.<br /><br />La <span>respuesta oficial de la empresa</span> <a href="http://www.viralvideochart.com/youtube/disgusting_dominos_people__dominos_responds?id=7l6AJ49xNSQ">me ha llegado esta noche</a><br /><br /><br /><br />Una respuesta en la que el presidente de Domino's USA se disculpa por el vídeo, dice que ha sido un incidente aislado, han despedido a estos dos empleados, han cerrado la sede y la han saneado de arriba a abajo. Añade que lo más importante son los clientes, que tienen estrictos procesos de control de sanidad y calidad y que le causa <span>nosequé</span> (perdón, no entiendo el verbo que dice) que dos individuos puedan perjudicar el sistema que tiene 125000 empleados en USA y en más de 60 países en el mundo. <br /><br /><br /><span>Analicemos el efecto de estos vídeos</span><br />El primer vídeo tuvo efecto viral el día 14 de Abril con un efecto en este momento de casi un millón de visualizaciones pero decayendo en efecto viral.<br />El segundo vídeo tuvo efecto viral el día 15 de Abril con un efecto en este momento de unas 66000 visualizaciones y subiendo en efecto viral.<br /><br />Lo primero que cabe destacar es la rápida respuesta por parte de la empresa y lo segundo la capacidad que ha tenido la empresa que, aun no llegando aún a todo el público, ha hecho uso de los mismos canales que le han perjudicado para colocar su respuesta y esta respuesta ha sido posible entre otras cosas gracias a que ellos ya estaban en el medio, ya tenían su canal de youtube.<br /><br />Por tanto, <span>moraleja de hoy para los empresarios</span>: Estate atento a lo que dicen de tu empresa, preparate para lo peor y que tu empresa esté presente en los canales de distribución (hoy en día el pack básico para internet es: Facebook + Twitter + Youtube + Página web con blog).<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-538332750449123603?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/el-caso-de-dominos-pizza.htmlCurso gratuito de XHTML+CSShttp://moviendocubos.blogspot.com/2009/04/curso-gratuito-de-xhtmlcss.htmlLa Oficina Web de la Universidad de Granada, en colaboración con la Asociación de Webmasters de Granada, se complace en anunciar la próxima realización de un taller gratuito sobre “Realización de páginas web con XHTML+CSS”, dirigido a aquellas personas que quieran iniciarse en el diseño de páginas web respetando los estándares actuales de navegabilidad y accesibilidad web.<br /><br />Los datos del taller son los siguientes:<br />- Fecha: 24 de abril de 2009<br />- Lugar: Centro de Enseñanzas Virtuales, Aula Darro.<br />- Duración: de 10:00 a 13:30<br />- Programa: XHTML+CSS básico, validadores y tests de accesibilidad web.<br />- Organiza: Oficina Web de la UGR<br />- Participa: Asociación de Webmasters de Granada<br /><br />Los interesados en asistir a este taller deben solicitar una plaza por email a ofiweb (arrob@) ugr.es indicando su nombre completo, email de contacto, tipo de vínculo con la UGR (estudiante, profesor o PAS) y DNI. El número de plazas es limitado, por lo que deberán esperar a recibir una confirmación de su solicitud una vez revisada. Se emitirá un certificado de asistencia.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-952821876574279365?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/curso-gratuito-de-xhtmlcss.htmlKanye West - Gay Fish (Parodia de Southpark)http://moviendocubos.blogspot.com/2009/04/kanye-west-gay-fish.htmlHace unos días hicieron una parodia en la conocida serie de TV Southpark con una canción, al parecer de Kanye West (el mismo que participó en la canción <a href="http://moviendocubos.blogspot.com/2008/11/msica-estelle-ft-kanye-west-american.html">American Boy</a>)<br /><br /><br /><br />Al poco salió la canción completa para su descarga en la web de Southpark. Yo me he descojonado con la letra xD<br /><a href="http://media.southparkstudios.com/crap/downloads/download.php?file_id=25010">Descargar</a><br /><br /><br /><blockquote>(Uh. Come on.)<br />Ive been so lonely, girl<br />Ive been so sad and down<br />Couldnt understand<br />My head is jerked around<br />I wanted to be free<br />with other creatures like me<br />And now I got my wish<br /><br />Cuz I know that Im a gay fish<br /><br />(Gay fish, yo)<br />Mother fuckin gay fish (Im a fish, yo)<br />Girl I am a gay fish (its alright, girl)<br />Makin love to other gay fish<br /><br />All those lonely nights<br />At the grocery store<br />In the frozen fish aisle<br />Feeling like a whore<br />Cuz I wasnt being true<br />Even though everyone said<br />That I had to make a switch (gay fish)<br /><br />Now I know that Im a gay fish<br /><br />(Gay fish, yo)<br />Mother fuckin gay fish (Im a fish, yo)<br />Girl I am a gay fish (Now where I belong, girl)<br />Making love to other gay fish<br /><br />[Updated: The extended version continues here]<br /><br />I used to be scared, denying who I was<br />Actin straight, but then goin out to the gay fish clubs<br />Dancin with the marlins, makin out with all the snappers<br />Id take a salmon home and work that coddle fin for hours<br />But now Im out and Im free to love what I want<br />Be it yellowfin or bass or that trout in Vermont<br />I slap that marlin ass, make that cougar butt shake<br />Ill come to your house and have an orgy in your mother fucking fish tank<br /><br />Mother fuckin gay fish (Im a fish, yo)<br />Girl I am a gay fish (Now where I belong, girl)<br />Making love to other gay fish<br /><br />I really get around<br />Im a slut of the sea<br />When I say I got crabs<br />I mean it generally<br />I was eating dinner<br />And just had to go down<br />On that mackerel on the dish<br /><br />Cus Im the gayest of the gay fish<br /><br />Mother fuckin gay fish (Im a fish, yo)<br />Girl I am a gay fish (Now where I belong, girl)<br /><br />But I got to settle down<br />I cant be a whore<br />I aint gonna just sleep<br />With any fish no more<br />Found me a lover<br />A brother whos a cross-dressing pike named Trish<br /><br />And together we are gay fish<br /><br />Mother fuckin gay fish (Im a fish, yo)<br />Girl I am a gay fish (Now where I belong, girl)<br />Making love to other gay fish. </blockquote><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-2899239457739006855?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/kanye-west-gay-fish.htmlOtra vez esos correos en cadena que dicen que el messenger será de pagohttp://moviendocubos.blogspot.com/2009/04/otra-vez-esos-correos-en-cadena-que.htmlHoy he recibido este correo en cadena<br /><br /><blockquote>Hola a todos:<br />Parece que todas las advertencias eran reales. El uso del msn y el mail costará dinero a partir del verano 2009. Si envías este mail a 18 diferentes contactos de tu lista, tu icono sera azul y sera gratis para ti. Si no me crees, ve a www.msn.com</blockquote><br /><br />Estoy harto de tener que perder tiempo leyendo estas tonterías.<br />Hoy me han pillado con el puntillo y he contestado de este modo<br /><br /><blockquote>Atención, no es lo único que va a costar dinero!!<br /><br />A partir de 2010 vamos a tener que pagar por ver los anuncios de televisión<br /><br />Manda este email al papa, al ministro de publicidad, a tu madre y a la chica de la tienda de chuches y tu televisión se volverá de color rojo y no tendrás que pagar por ver la publicidad!<br /><br />+Info: <a href="+Info: http://www.fepe55.com.ar/blog/2007/07/04/msn-no-se-cierra-ni-se-hace-pago/">http://www.fepe55.com.ar/blog/2007/07/04/msn-no-se-cierra-ni-se-hace-pago/</a></blockquote><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/28894586-9062416978899514056?l=moviendocubos.blogspot.com" /></div>http://moviendocubos.blogspot.com/2009/04/otra-vez-esos-correos-en-cadena-que.htmlFilosofía de Murphyhttp://www.carlostenor.com/2009/05/02/filosofia-de-murphy/<p><strong>Sonríe</strong>. Mañana podría ser peor.</p>http://www.carlostenor.com/2009/05/02/filosofia-de-murphy/Nuevas fotoshttp://www.carlostenor.com/2009/04/22/nuevas-fotos/<p>He subido a mi flickr algunas fotos nuevas. De esta semana santa, que me vestí de romano con el grupo de romanos de mi pueblo.<br /> <a title="Yo de romano por carlostenor, en Flickr" href="http://www.flickr.com/photos/carlostenor/3466022363/"><img src="http://farm4.static.flickr.com/3541/3466022363_4685099036.jpg" alt="Yo de romano" width="500" height="333" /></a></p> <p>Y de la puerta de mi piso en Darmstadt, la primavera ha llegado a Alemania!<br /> <a title="Puerta de mi piso por carlostenor, en Flickr" href="http://www.flickr.com/photos/carlostenor/3466843104/"><img src="http://farm4.static.flickr.com/3618/3466843104_d793ab9d1a.jpg" alt="Puerta de mi piso" width="500" height="333" /></a></p>http://www.carlostenor.com/2009/04/22/nuevas-fotos/Cambio Feeds a FeedBurnedhttp://www.carlostenor.com/2009/04/19/cambio-feeds-a-feedburned/<p>Pues nada, al final me decidí a cambiar los <a href="http://es.wikipedia.org/wiki/Fuente_web">feeds</a> de todos mis blogs a <a href="http://feedburner.google.com/">Feedburned</a>.</p> <p>En un principio no me hacía mucha gracia la idea de dejar en manos de un tercero mi feed pero hice un pequeño sondeo con los 10 blogs más populares del mundo y los 10 blogs más populares de españa y casi todos lo usan. Además el hecho de que Google lo comprara me da más confianza.</p> <p>Este es el primer post que escribo con el nuevo feed funcionando, espero que no haya ningún problema con los suscriptores actuales ya que la dirección del feed sigue siendo la misma.</p> <p><img class="size-full wp-image-94 aligncenter" title="feedburner" src="http://www.carlostenor.com/wp-content/uploads/2009/04/feedburner.gif" alt="feedburner" width="188" height="223" /></p>http://www.carlostenor.com/2009/04/19/cambio-feeds-a-feedburned/Cambio de imagenhttp://www.carlostenor.com/2009/04/18/cambio-de-imagen/<p>He cambiado la imagen de todos mis blogs. Todavía faltan algunas cosas por retocar, por ejemplo las cabeceras que ahora mismo son muy sosas y les quiero poner dibujitos.</p> <p>Me costó bastante trabajo adaptar el theme sobre todo porque necesitaba algunas funcionalidades de Wordpress 2.7 como la de paginar los comentarios y tuve que tocar bastante la plantilla, pero al final el resultado creo que lo merece.</p> <p>Todavía estoy testeando porque seguro que tienen algún fallo, si encontráis algo no dudéis en comentármelo.</p> <p>Las direcciones son:</p> <ul> <li><a href="http://www.diariohacker.com">Diario Hacker</a></li> <li><a href="http://robotica.es">Robotica.es</a></li> <li><a href="http://www.tierracuriosa.com">Tierra curiosa</a></li> </ul>http://www.carlostenor.com/2009/04/18/cambio-de-imagen/Cambios en mis blogshttp://www.carlostenor.com/2009/04/15/cambios-en-mis-blogs/<p>Estoy actualizando todos mis blogs y aprovechando para cambiar algunas cosas, me he dado cuenta de la tontería que era postear diariamente mis Twits&#8230; de todas formas si quieres leerlos puedes entrar en mi <a href="http://twitter.com/carlostenor">Twitter</a>.</p> <p>Por cierto, es bastante bonita la nueva interfaz de <a href="http://wordpress.org/">Wordpress</a>.</p>http://www.carlostenor.com/2009/04/15/cambios-en-mis-blogs/Diario erasmus día 2009-02-01http://www.carlostenor.com/2009/02/01/diario-erasmus-dia-2009-02-01/<ul class="aktt_tweet_digest"> <li>Soy el rey del universo de las bolitas de calcetines, bautizado por mi hermana <a href="http://twitter.com/carlostenor/statuses/1167639232">#</a></li> </ul>http://www.carlostenor.com/2009/02/01/diario-erasmus-dia-2009-02-01/Diario erasmus día 2009-01-16http://www.carlostenor.com/2009/01/16/diario-erasmus-dia-2009-01-16/<ul class="aktt_tweet_digest"> <li>Pensando en mudarme&#8230; si alguien conoce una habitación libre en Karlshof que me escriba! <a href="http://twitter.com/carlostenor/statuses/1123464038">#</a></li> </ul>http://www.carlostenor.com/2009/01/16/diario-erasmus-dia-2009-01-16/Diario erasmus día 2009-01-15http://www.carlostenor.com/2009/01/15/diario-erasmus-dia-2009-01-15/<ul class="aktt_tweet_digest"> <li>qué tardes más largas&#8230;. <a href="http://twitter.com/carlostenor/statuses/1121469595">#</a></li> </ul>http://www.carlostenor.com/2009/01/15/diario-erasmus-dia-2009-01-15/Diario erasmus día 2009-01-14http://www.carlostenor.com/2009/01/14/diario-erasmus-dia-2009-01-14/<ul class="aktt_tweet_digest"> <li>Nevando en Darmstadt <a href="http://twitter.com/carlostenor/statuses/1117999877">#</a></li> </ul>http://www.carlostenor.com/2009/01/14/diario-erasmus-dia-2009-01-14/Diario erasmus día 2009-01-09http://www.carlostenor.com/2009/01/09/diario-erasmus-dia-2009-01-09/<ul class="aktt_tweet_digest"> <li>Anda que España está bien preparada&#8230; caen 2 o 3 centímetros de nieve y se colapsa! <a href="http://twitter.com/carlostenor/statuses/1106543310">#</a></li> </ul>http://www.carlostenor.com/2009/01/09/diario-erasmus-dia-2009-01-09/Reiniciar el servidor gráfico (Xorg) en Ubuntu Jaunty con Ctrl+Alt+Backspacehttp://www.gskbyte.net/2009/04/11/reiniciar-el-servidor-grafico-xorg-en-ubuntu-jaunty-con-ctrlaltbackspace/<p>Vayamos directos al grano. Hay que abrir una terminal e introducir</p> <h3><code>sudo dontzap --disable</code></h3> <p>O, si usas KDE, ir al panel de control, y en el apartado &#8220;Pantalla&#8221;, marcar abajo del todo &#8220;<code>Ctrl+Alt+Retroceso reinicia xserver</code>&#8220;.</p> <p>Durante el diseño de Ubuntu 9.04 Jaunty Jackalope se tomó la (para muchos usuarios, entre los que me incluyo) <a href="https://wiki.ubuntu.com/JauntyJackalope/TechnicalOverview#Known%20issues">absurda decisión</a> de cambiar la combinación Ctrl+Alt+Backspace (Ctrl+Alt+Borrar) por otras combinaciones como <code>"ALTGR + SYSRQ + K" o "ALTGR + PRINTSCREEN + K</code>, principalmente para evitar que se <em>pulsara accidentalmente</em>.</p> <p>En el enlace <a href="https://wiki.ubuntu.com/JauntyJackalope/TechnicalOverview#Known%20issues">de más arriba</a> (<a href="https://wiki.ubuntu.com/XorgCtrlAltBackspace">documento oficial aquí</a>), se dan estas razones:</p> <blockquote><p>In my opinion, the ctrl-alt-backspace command that kills the X server should not be activated on an end-user desktop system such as Ubuntu.<br /> My arguments are the following:<br /> - There is no need for such a feature for an end user desktop system (you cannot kill the X server in MacOSX&#8230;) <span>¿Por qué siempre hay que hacer las cosas como Mac? Además, eso de que no es necesario es falso, ya me ha pasado más de una vez que un programa empiece a comerse la memoria hasta llenarla y empezar a comerse el swap (KDevelop en Intrepid) y la única solución, dada la lenta y mala respuesta del servidor gráfico, es reiniciarlo, o hacer un botonazo y reiniciar el sistema a lo bestia.</span><br /> - The typical end user does not know about this feature (it is undocumented and hidden) and it is relatively easy to trigger it by mistake. It can have disastrous consequences. <span>Ctrl+Alt+Backspace es una de las primeras cosas que aprendí cuando empecé con Linux, y me parece algo bastante útil que debería poderse usar en el resto de Sistemas Operativos.</span><br /> - If one really needs to kill the X server, he can go to a tty term and do it by hand. <span>Creo que pulsar Ctrl+Alt+Backspace es mucho más rápido que hacer Ctrl+Alt+F2, introducir usuario y contraseña y escribir sudo /etc/init.d/kdm restart (o gdm para Gnome). Porque si quieres matar el servidor gráfico, la razón más probable es que no te deje hacer nada, ni abrir una terminal (como Konsole o Gnome-terminal).</span></p></blockquote>http://www.gskbyte.net/2009/04/11/reiniciar-el-servidor-grafico-xorg-en-ubuntu-jaunty-con-ctrlaltbackspace/Por qué el software libre es la polla con cebollahttp://www.gskbyte.net/2009/04/10/por-que-el-software-libre-es-la-polla-con-cebolla/<p>Para conectarme al Mésenller, utilizo el <a href="http://www.kmess.org/">Kmess</a> en Kubuntu. En vez de usar la versión de los repositorios, uso la beta de la versión 2 (para KDE4), que tiene que bajarse desde repositorio mediante SVN, y <a href="http://trac.kmess.org/wiki/Development%20tutorial">compilarse &#8220;a mano&#8221;</a>*.</p> <p>Esta tarde me he dado cuenta del coñazo que supone tener que ir a la carpeta de historiales para leer conversaciones anteriores, y les he mandado un mensaje solicitándoles que integren la vista de historiales en el programa, mediante el sistema de aviso de fallos que tiene el programa:</p> <p><a href="http://www.gskbyte.net/wp-content/uploads/2009/04/bugs_kmess.png"><img class="aligncenter size-full wp-image-781" title="bugs_kmess" src="http://www.gskbyte.net/wp-content/uploads/2009/04/bugs_kmess.png" alt="bugs_kmess" width="292" height="124" /></a></p> <p>Es muy, muy cómodo y sencillo colaborar con Kmess, ya podría generalizarse este sistema para muchos otros proyectos de software libre. Más de una vez he avisado de errores en <a href="http://bugs.kde.org">bugs.kde.org</a> y es muchísimo más engorroso que esto, comenzando porque hay que ir a la web, y siguiendo porque hay que rellenar muchísimos campos que bien podría recoger y rellenar el programa automáticamente (tal y como hace kmess).</p> <p>Pues tras mandarles este mensaje:</p> <blockquote><p>Would it be possible to integrate an history viewer inside chat windows (and also in the contact list, something like &#8220;right button-&gt;see logs&#8221;)? It&#8217;s much more comfortable than going to the logs folder and manually opening the log file.</p> <p>Also, it would be interesting to show last lines of the previous conversation with a contact when you start to chat to him/her.</p> <p>I think you should spread your bugs reporting system, so that other projects could use it. It is very, very comfortable to use and also provides a fast feedback to developers. Results are clearly visible ;).</p> <p>Thanks for your great work!</p></blockquote> <p>No han tardado ni un cuarto de hora en responderme:</p> <blockquote><p>likeback@kmess.org schreef:<br /> &gt; http://www.kmess.org/likeback/admin/view.php<br /> &gt;<br /> &gt; Version: 2.0beta1-svn (4536M &gt;= 20090407)<br /> &gt; Locale: en_US<br /> &gt; Window: ChatWindow#1<br /> &gt; Context:<br /> &gt; Type: Feature<br /> &gt; Comment:<br /> &gt; Would it be possible to integrate an history viewer inside the chat<br /> &gt; windows (and also in the contact list, something like \&#8221;right<br /> &gt; button-&gt;see logs\&#8221;)? It\&#8217;s much more comfortable than going to the<br /> &gt; logs folder and manually opening the log file.</p> <p>We expect to fully integrate this feature into our 2.1 release&#8230; <img src="http://www.gskbyte.net/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p> <p>&gt; Also, it would be interesting to show the last lines of the previous<br /> &gt; conversation with a contact when you start to chat with him/her.</p> <p>If enough people think that is a good idea, we will certainly add an<br /> option for that <img src="http://www.gskbyte.net/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> </p> <p>Thank you for your e-mail <img src="http://www.gskbyte.net/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /><br /> - Sjors</p></blockquote> <p>Da gusto tener una forma fácil de ayudar a los proyectos que nos interesan, y que además estén dispuestos a recibir sugerencias tan de buen grado.</p> <p><span id="more-780"></span></p> <p>* <a href="http://trac.kmess.org/wiki/Development%20tutorial">Para compilar</a> se necesitan las cabeceras de desarrollo de Qt4 y las de las kdelibs:<br /> <code>svn checkout https://kmess.svn.sourceforge.net/svnroot/kmess/trunk/kmess<br /> cd kmess<br /> ./configure --build-type=release<br /> make &amp;&amp; sudo make install</code></p>http://www.gskbyte.net/2009/04/10/por-que-el-software-libre-es-la-polla-con-cebolla/Humor sesudohttp://www.gskbyte.net/2009/04/10/humor-sesudo/<p align="center"></p> <p>¿Lo mejor de FilmAffinity? Las <a href="http://www.filmaffinity.com/es/review/67831596.html">críticas de los usuarios</a>:</p> <p><span id="more-774"></span></p> <blockquote><p> SEGÚN FILMAFFINITY, LA PEOR PELÍCULA DE LA HISTORIA (en 27 puñaladas)<br /> <strong>&#8220;Dragon Ball Evolution&#8221; en 27 puñaladas:</strong></p> <p>***ATENCIÓN: ESTA CRÍTICA CONTIENE SPOLEIRS***</p> <p>PUÑALADA 1: A los 18 años Goku aun tiene abuelo y trabaja en un invernadero. Bueno, intentemos pasarlo por alto, quizás aporte algo bueno a la trama.</p> <p>PUÑALADA 2: Gok no quiere ser diferente, quiere ser normal. Umh&#8230; que raro está Goku&#8230;</p> <p>PUÑALADA 3: Goku “sólo quiere ser el típico chico que patea los traseros de los chicos malos”. Creo que esto es una errata de la versión española, en la original no puede decir eso porque es exactamente todo lo contrario a la filosofía Dragon Ball.</p> <p>PUÑALADA 4: Goku le dice a su abuelo que deje de enseñarle artes marciales y que le enseñe a ligar con chicas para no parecer tonto. Umh&#8230; debe ser un fallo de traducción.</p> <p>PUÑALADA 5: Goku va al instituto. Umh&#8230; bueno, no nos pongamos nerviosos&#8230; quizás va al instituto a recoger a algún amigo.</p> <p>PUÑALADA 6: Goku es agredido y ridiculizado por los &#8220;guays del insti&#8221;. A lo mejor son conocidos suyos que le gastan una broma. Ojalá sea eso.</p> <p>PUÑALADA 7: Aparece el malo en una nave de Star Treck y una china con cara de muerdealmohadas que les roban una bola mágica a unas vietnamitas muertas de hambre. Esperemos que el malo sea un personaje importante en la película. Esperemos. Recemos.</p> <p>PUÑALADA 8: Parece ser que Goku no iba a recoger a nadie al instituto. Es él quién está en el High School Musical y posee una especie de magia que le permite abrir taquillas telepáticamente. ¿Poderes nuevos en la película? Suena interesante, pero a ver si para la próxima son mejores.</p> <p>PUÑALADA 9: Comparte clase con Chi-Chi, que resulta ser la típica alumna que va con la camiseta blanca ajustada y la faldita corta para calentar al profesor de matemáticas. No recordaba así a Chi-Chi&#8230; a lo mejor no es la misma Chi-Chi del original. A lo mejor es una prima.</p> <p>PUÑALADA 10: Goku va a una ¿fiesta adolescente? ¿todo engominado? y la ¿chaqueta de cuero? que viste no le hace lo suficientemente guay para que los tipos molones del insti no se metan con él y le intenten pegar una paliza.</p> <p>PUÑALADA 11: El malo mata al abuelo con telepatía o algo así. ¡¡Dios!! Resulta que el malo encapuchado es Piccolo. ¡NOOOO! ¿Qué coño se ha tomado para quedar así? ¿Quizás la puta misma mierda que la mala madre del guionista de la peli? Ojalá sea otro fallo de traducción, porque Piccolo es Verde, no Gris.</p> <p>PUÑALADA 12: Goku conoce a Bulma en una filosófica y trascendental conversación. Me encanta esta película. Me voy a por un helado, vengo ahora.</p> <p>PUÑALADA 13: El Maestro Roshi (Mestre Mutenroi o Fullet Tortuga) resulta ser un cuarentón que vive en el medio de la ciudad. Y yo me pregunto: ¿Dónde está la tortuga? ¿Quizás en la tumba de la hermana del director de esta película, James Wong?</p> <p>PUÑALADA 14: Oh, no. Piccolo en primer plano parece&#8230; no sé&#8230; un viejo dinosaurio gris que tiene por cabeza un huevo manchado de mala corrida del mal padre de ese bastardo de James Wong.<br /> (El resto de la crítica puede contar partes de la película) Ver todo<br /> spoiler:<br /> PUÑALADA 15: Roshi lleva a Goku a un campo de nabos que parece ser una fiesta de disfraces. Finalmente resulta ser un campo de ¿entrenamiento? de guerreros. Allí también está Chi-Chi, que ya sabía a lo que iba.</p> <p>PUÑALADA 16: Goku, Bulma y Roshi van por el desierto y de repente se caen en una cueva subterránea donde, por coincidencias del destino, hay una bola mágica. A lo mejor en la versión extendida del DVD expliquen esto. Me lo compraré y lo veré. Sí.</p> <p>PUÑALADA 17: No creo necesario mencionar la aparición de “¿Yamsha? la insegura ladronzuela con mechas rubias” en la película. Así que&#8230; lo siento ¿Yamsha?.</p> <p>PUÑALADA 18: De repente, y sin previo aviso, aparecen orcos que atacan teatralmente a los protagonistas. Esa es toda la historia sobre los orcos. No me preguntes el por qué.</p> <p>PUÑALADA 19: Roshi va a visitar a un negro con trazas de armonioso blanco bello facial en el rostro. Se desconoce quién puede ser. ¿Quizá Piccolo? ¡Ah! No, no, que Piccolo es el puto dinosaurio malvado.</p> <p>PUÑALADA 20: Me aburre mucho la peli. Bulma le come la boca a Yamsha la ladronzuela a primeras de cambio y Chi-Chi tiene las tetas grandes.</p> <p>PUÑALADA 21: Goku utiliza el Hame-hame-ha para encender velas. Una secuencia que quedará grabada en la retina de nuestros hijos con el paso del tiempo. Espléndida. Magnífica.</p> <p>PUÑALADA 22: ¡Dios mio! Goku muere por una bala de pistola ¿perdón? y es resucitado por Roshi ¿con una Hame-hame-ha?. Posiblemente el genial guionista de la película sea el mismo que el de Street Fighter, la última batalla. Lo comprobaré. Mañana.</p> <p>PUÑALADA 23: Goku se convierte en un mono gigante de cartón-piedra. Increíble. James Wong es un genio de las finanzas. 100 millones de presupuesto. 99 de ellos en supositorios.</p> <p>PUÑALADA 24: Goku el mono bailón mata a Roshi pero luego deja de ser mono. Cautivadora secuencia.</p> <p>PUÑALADA 25: ¡ATENCIÓN! Aquí tenemos la batalla final. (La transcribiré exactamente, sin exagerar nada). Goku y Piccolo se lanzan ondas Hame hame has durante un minuto. Goku y Piccolo ascienden al cielo y se pegan 6 puñetazos (contados). En el suelo, Goku le lanza a Piccolo un Hame hame ha y lo mata. Tremenda pelea. Pasará a los anales de la historia seguro, como pasó a los anales de la historia la polla que se dejó meter James Wong para hacer esta película. Una leyenda que circula entre productores dice que James Wong tiene el culo más abierto del mundo. ¿Será verdad? Quién sabe&#8230; habrá que preguntarselo a su padre. “-No, papá, ¡otra vez no!&#8221;</p> <p>PUÑALADA 26: La peli acaba con Goku invocando a un dragón blanco de dibujos animados (posible borrador pokemon desechado) que le concede el deseo de resucitar a Roshi. ¿No podía resucitar a su abuelo ya de paso? A lo mejor se le olvidó. Seguramente eso.</p> <p>PUÑALADA 27: ¡EL FINAL! Goku se funde en un abrazo con la casta Chi-Chi. Fin.</p></blockquote>http://www.gskbyte.net/2009/04/10/humor-sesudo/Por qué la energía nuclear NO es soluciónhttp://www.gskbyte.net/2009/03/28/por-que-la-energia-nuclear-no-es-solucion/<p align="center"> </p> <p>En resumen:</p> <ul> <li>Para obtener una tonelada de uranio, hay que producir 666 toneladas de residuos &#8220;peligrosos&#8221;, que lo serán durante miles de años. Una central nuclear &#8220;normal&#8221; gasta 200 toneladas de uranio, lo que produce en total 133.200 toneladas de desperdicios.</li> <li>Se necesitan cantidades ingentes de agua para procesar uranio, y casualmente, las minas suelen estar en lugares muy áridos.</li> <li>Una vez consumido el combustible, se generan residuos aún más peligrosos que serán radiactivos durante varias decenas de miles de años.</li> </ul>http://www.gskbyte.net/2009/03/28/por-que-la-energia-nuclear-no-es-solucion/El centro de mi vidahttp://www.gskbyte.net/2009/03/25/el-centro-de-mi-vida/<p><a href="http://www.gskbyte.net/wp-content/uploads/2009/03/correo.png"><img class="aligncenter size-large wp-image-763" title="correo" src="http://www.gskbyte.net/wp-content/uploads/2009/03/correo-1024x663.png" alt="correo" width="500" height="324" /></a></p> <p>Es curioso cómo esta asignatura puede ser a la vez apasionante y odiosa. Ya os contaré en junio, si no me veis antes en los periódicos o en cortes de vídeo durante tertulias en La Noria.</p>http://www.gskbyte.net/2009/03/25/el-centro-de-mi-vida/El proceso de Bolonia, la lucha continúahttp://www.gskbyte.net/2009/03/25/el-proceso-de-bolonia-la-lucha-continua/<p>A continuación pongo un vídeo que ha editado mi compañero <a href="http://www.psychosynth.com/">Raskolnikov</a>, sobre las protestas estudiantiles anti-Bolonia y las desmesuradas represalias que se están tomando por parte del Gobierno a través de las Fuerzas de Seguridad del Estado (aka la poli).</p> <p></p>http://www.gskbyte.net/2009/03/25/el-proceso-de-bolonia-la-lucha-continua/¡¡¡This is España!!!http://www.gskbyte.net/2009/03/16/this-is-espana/<p><a href="http://www.gskbyte.net/wp-content/uploads/2009/03/curas_grande.jpeg"><img class="aligncenter size-full wp-image-751" title="Manifiesto de los 300" src="http://www.gskbyte.net/wp-content/uploads/2009/03/curas.jpeg" alt="Manifiesto de los 300" width="418" height="82" /></a></p> <p>Pínchese para leer el contexto. El niño del anuncio es feote, ¿no? Bueno, a la par a la demagogia de lo que representa.</p>http://www.gskbyte.net/2009/03/16/this-is-espana/Sonic y el Caballero Negrohttp://www.gskbyte.net/2009/03/15/sonic-y-el-caballero-negro/<p>Hace casi una semana conseguí por fin este juego (a la tercera&#8230; eso, ejem), y me gusta. El juego consiste en Sonic recorriendo pantallas a toda hostia, lo típico, sólo que esta vez lleva una espada para matar bichos. Conste que por norma, me encantan tanto los juegos de Sonic como el propio personaje, aunque desde los 3D me han decepcionado casi todos los juegos, expecto el Sonic Rush, el Adventure y el Heroes.</p> <p>Salió en EEUU el 3 de marzo, 10 días antes que en Europa, y lo mismo le daban un 8 (en la revista de Nintendo) que un 3&#8242;9 (en IGN -que, según he leído después, son un poco anti-Sonic, aunque sí supieron valorar con un 9 a un juegazo como Sonic Rush). Normal, uno empieza a pensar que va a ser otra decepción como a medias lo fue el Unleashed, y encima de las gordas.</p> <p>Pues no es tan malo como dicen en IGN, ni mucho menos. Si hasta en Meristation le han puesto un 7&#8230; De hecho, me parece un juego bastante bueno, y quizás me guste más que el <a href="http://www.gskbyte.net/2009/01/02/sonic/">Unleashed</a> en conjunto, aunque las fases diurnas de este último me gusten más.</p> <p align="center"></p> <p>En lo que respecta a lo más importante de un juego, que son la diversión y la jugabilidad, hay de todo. El juego es bastante divertido y se presta a jugar varias veces las mismas pantallas. Es espectacular y rápido (aunque no tanto como las pantallas diurnas del <a href="http://www.gskbyte.net/2009/01/02/sonic/">Sonic Unleashed</a>, que son brutales), y bastante bonito. Pero el control es mejorable, pues está a medias entre el control del Unleashed -control perfecto, libertad total de movimientos- y el de los Anillos Secretos -en el que es un coñazo volver atrás-: Sonic se mueve hacia atrás de espaldas (el juego es de ir palante desplazándose hacia los lados, básicamente), pero es más fácil de manejar que en los Anillos Secretos. El manejo de la espada funciona bien, aunque a veces uno termina con el brazo machacado. Quizás lo peor del control son las fases 2D, en las que es bastante raro mover a Sonic, pues sigue andando de espaldas para volver atrás, y queda bastante antinatural, además de ser incómodo. Este es el aspecto que más le han criticado al juego, de hecho, es uno de los dos principales motivos de su baja nota en IGN, pero personalmente no me parece tan grave. Eso sí, para la siguiente estrega de los &#8220;Storybook Series&#8221; sería una mejora bastante a tener en cuenta. La historia es una tontería, como en la mayoría de juegos de este estilo, pero tiene algo de miga y hasta giros inesperados, y la forma de contarla es bastante original.</p> <p>Los gráficos del juego son impresionantes, de lo mejor que he visto en la Wii junto con los de Super Mario Galaxy (que, repito, me sigue pareciendo el muy mejor juego de la Wii y uno de los mejores y más bellos a los que he jugado en mi vida, es perfecto). De hecho, creo que hasta los superan, pues aunque no sean tan coloristas son más detallados y espectaculares. A destacar el modelado se Sonic, la hierba, el agua, el fuego, los castillos, y todo en general. El diseño de los menús del juego también tiene un diseño espectacular y casa bastante bien con el tema del mismo, me encantan los rayos que giran, el blanco y negro y hasta los tipos de letra que usan. Cuando se acaba una misión,  Sonic atraviesa una señal de meta y aparece una pantalla con las puntuaciones, y queda un efecto bastante chulo en la pantalla. La verdad es que el aspecto gráfico, junto con la música, son lo mejor con diferencia. El único fallo que encuentro es que hay pocos loopings, que en mi opinión es algo importante en un juego de Sonic, aunque de todas formas sigue siendo bastante espectacular.</p> <p align="center"></p> <p>La música está bastante chula, como en casi todos los juegos de Sonic. Me gusta la canción principal, la de los menús y las de las pantallas, que suele ser rock celta, con violines y demás. Y aunque no suela escuchar música de ese estilo, se puede apreciar que la banda sonora está bastante currada.</p> <p>Y por último, la duración. Parece ser que el juego es más corto que el Unleashed y que los Anillos Secretos (aunque este último es infinito porque no hay huevos a conseguir todas las medallas de oro), pero tampoco puedo decir mucho porque no me lo he pasado todavía. Este era el segundo de los aspectos que esgrimía IGN para bajarle la nota tan drásticamente, pero parece que el que hizo el análisis se confundió y creyó que el juego acababa con el falso final que hay (eso dicen los rumore, rumore). El caso es que el juego no parece muy largo -es decir, la historia-, pero de todas formas no todo consigue en llegar al final, pues hay que completar las pantallas con 5 estrellas, conseguir todos los seguidores y conseguir todos los objetos, lo cual alarga bastante el juego. También hay multijugador y modo online.</p> <p>En conclusión, que me mola bastante. Aunque habría preferido que fuera aún más largo, con más loopings, y con las posibilidades de pegar espadazos con un botón y que se Sonic se moviera hacia atrás de forma natural. En conjunto creo que es mejor juego que el Unleashed aunque menos rejugable, básicamente porque no hay cosas por explorar, como los templos Gaia o la posibilidad de moverse hacia cualquier sitio de la pantalla, pero las pantallas de día de este último me gustan más que las de Sonic y Caballero Oscuro (aunque las fases nocturnas del Unleashed empeoran el conjunto del juego). Si tuviera pasta me lo compraría por el simple gusto de tenerlo original.</p>http://www.gskbyte.net/2009/03/15/sonic-y-el-caballero-negro/Otro descubrimientohttp://www.gskbyte.net/2009/03/13/otro-descubrimiento/<p>Cuanto más discos y canciones escucho de The Meters, más me gustan:</p> <p></p> <p>&#8220;Cardova&#8221;, del álbum &#8220;The Meters&#8221;, por The Meters, de 1969.</p> <p><img class="alignleft size-full wp-image-731" title="the-meters-the-meters" src="http://www.gskbyte.net/wp-content/uploads/2009/03/the-meters-the-meters.jpg" alt="the-meters-the-meters" width="299" height="300" /></p>http://www.gskbyte.net/2009/03/13/otro-descubrimiento/Meme: disco aleatoriohttp://www.gskbyte.net/2009/03/09/meme-disco-aleatorio/<p><strong>Portada del disco:</strong></p> <p><img class="aligncenter size-full wp-image-722" title="Portada del disco" src="http://www.gskbyte.net/wp-content/uploads/2009/03/portada_disco.jpg" alt="Portada del disco" width="490" height="498" /></p> <p><strong>Cantante:</strong></p> <p><a href="http://en.wikipedia.org/wiki/Samuel_Ward_(American_statesman)">Samuel Ward</a>: fue un granjero estadounidense, comerciante y hombre de negocios procedente de Westerly, Rhode Island. Fue gobernador de Rhode Island, y posteriormente delegado del Congreso Continental.</p> <p>Normal que no lo conozcáis, es un muchacho que está empezando su carrera.</p> <p><strong>Título del disco:</strong></p> <dt class="quote"><a title="Click for further information about this quotation" href="http://www.quotationspage.com/quote/27649.html">&#8220;Household tasks are easier and quicker when they are done by somebody else&#8221;</a><strong><a href="http://www.quotationspage.com/quotes/James_Thorpe/">. James Thorpe</a> (1888 - 1953)</strong></dt> <dt class="quote"><strong></strong>(&#8221;Las tareas domésticas son más fáciles y se acaban antes cuando las hace otro &#8220;)</dt> <dt class="quote"> </dt> <p>Según Ward, este título le vino a la mente cuando estaba a punto de terminar el viaje jipioso-mochilero que emprendió para encontrarse a sí mismo, animado tras leer la saga completa de &#8220;Crepúsculo&#8221; y todos los libros de Dan Brown durante el verano del año pasado. Además, según nos contó <a href="http://www.gskbyte.net/2007/06/25/diez-consejos-para-no-masturbarse/#comments">en una reciente entrevista</a>, todas las canciones del disco fueron compuestas durante este largo periplo, canciones como &#8220;Con coche se llega más rápido que andando, excepto si hay un atasco que la vihen&#8221;, &#8220;Como cuando tengo hambre, y a veces por ansia&#8221;, &#8220;2+2=4&#8243;, &#8220;La que está liando Zapatero&#8221; o &#8220;Los pisos nunca bajan&#8221;. Y cómo no, el gran single del disco: &#8220;Niños, no fuméis porros, que les echan droga&#8221;.</p> <p><span id="more-721"></span></p> <p><strong>Instrucciones del meme<br /> </strong></p> <p>Y ahora os explico de qué va este meme tan guapi que <a href="http://princessbeia.blogspot.com/2009/03/meme-de-disco-random.html">me ha mandado Bea</a> desde ese sitio con niebla que no es Inglaterra, pero casi. Que tienen tréboles, hay gente con gaitas y faldas y a veces ponen bombas, y eso:</p> <p>1. Pincha <a href="http://en.wikipedia.org/wiki/Special:random">aquí</a> y te llevará una página aleatoria de la Wikipedia (inglesa). El título del primer artículo aleatorio que obtengas al pinchar es el nombre del grupo/cantante.</p> <p>2. Pincha <a href="http://www.quotationspage.com/random.php3">aquí</a> y te llevará a una página de citas (frases célebres, no es un chat guarrete) también en modo aleatorio. Las últimas palabras de la última cita de la página es el título del disco.</p> <p>3. Pincha <a href="http://www.flickr.com/explore/interesting/7days">aquí</a> y obtrendrás una lista aleatoria de fotos de flickr. La tercera foto será la portada del disco.</p> <p>4. Usa GIMP o cualquier programa de retoque mierdoso (como GCC, Mathematica, Amarok, FreeBSD, KTouch  o Winamp) para componerlo.</p> <p>5. Si crees que eso lo hace más interesante, puedes explicar qué/de quien son los nombres y las citas.</p> <p>6. Públicalo y nomina. Yo nomino a <a href="http://draxus.org/weblog/">DraXus</a>, a <a href="http://fotolog.com/maldeahiarriba">Íñigo</a>, a <a href="http://pistachousa.blogspot.com/">Car</a><a href="http://pedepistacho.blogspot.com/">men</a>, a <a href="http://smalldetail.blogspot.com/">Iris</a> y a <a href="http://www.fotolog.com/olgacm/">Olga</a>.</p>http://www.gskbyte.net/2009/03/09/meme-disco-aleatorio/Resumen en DrupalDochttp://feedproxy.google.com/~r/virtualizada/blog/~3/jFzC004rd8Q/resumen-en-drupaldochttp://feedproxy.google.com/~r/virtualizada/blog/~3/jFzC004rd8Q/resumen-en-drupaldocMujeres en la Informática y la telecomunicaciónhttp://feedproxy.google.com/~r/virtualizada/blog/~3/NzAtn0ZWU-A/mujeres-en-la-inform%C3%A1tica-y-la-telecomunicaci%C3%B3nhttp://feedproxy.google.com/~r/virtualizada/blog/~3/NzAtn0ZWU-A/mujeres-en-la-inform%C3%A1tica-y-la-telecomunicaci%C3%B3nEnlaceshttp://feedproxy.google.com/~r/virtualizada/blog/~3/YNHbhUxGbGE/enlaces-0http://feedproxy.google.com/~r/virtualizada/blog/~3/YNHbhUxGbGE/enlaces-0Se nota el pixel!!http://feedproxy.google.com/~r/virtualizada/blog/~3/1jlz9aIlfgI/se-nota-el-pixelhttp://feedproxy.google.com/~r/virtualizada/blog/~3/1jlz9aIlfgI/se-nota-el-pixelBeca de diseño gráficohttp://feedproxy.google.com/~r/virtualizada/blog/~3/Fh5QpHge-xk/beca-de-dise%C3%B1o-gr%C3%A1ficohttp://feedproxy.google.com/~r/virtualizada/blog/~3/Fh5QpHge-xk/beca-de-dise%C3%B1o-gr%C3%A1ficoRecursos para programadores: Rubularhttp://feedproxy.google.com/~r/virtualizada/blog/~3/Dc9HVGrmZpg/recursos-para-programadores-rubularhttp://feedproxy.google.com/~r/virtualizada/blog/~3/Dc9HVGrmZpg/recursos-para-programadores-rubularEmpresas, freelances y mucho trabajohttp://feedproxy.google.com/~r/virtualizada/blog/~3/HRkOViK8fUA/empresas-freelances-y-mucho-trabajohttp://feedproxy.google.com/~r/virtualizada/blog/~3/HRkOViK8fUA/empresas-freelances-y-mucho-trabajoBloque T2.10http://alejandrobareamontoya.blogspot.com/2009/05/bloque-t210.htmlAquí tengo el <a href="http://aap-ugr-2007.wikispaces.com/alexbm8_bloque_T2_10_programa_ruby">programa en ruby</a>, y el documento XML a <a href="http://aap-ugr-2007.wikispaces.com/alexbm8_bloque_T2_10_xml">traducir está aquí</a><br />Para ejecutarlo le debemos pasar al programa en ruby el documento xml de futbolistas.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-5315772954221398103?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/05/bloque-t210.htmlBloque T2_8http://alejandrobareamontoya.blogspot.com/2009/04/bloque-t28.htmlHe realizado un pequeño RSS con noticias sobre Bruce Springsteen, se puede <a href="http://aap-ugr-2007.wikispaces.com/alexbm8_bloqueT2_8">consultar aquí</a>.<br />(Nota: para ejecutar, guardar en la carpeta cgi-bin de Apache y acceder a http://localhost/cgi-bin/ejT2_8.cgi)<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-6877211840425387085?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/04/bloque-t28.htmlAAP: Practica 4 : XMLhttp://alejandrobareamontoya.blogspot.com/2009/04/aap-practica-4-xml.html<h2>Breve introducción</h2> <p>El documento XML creado en primer lugar y que define la temática elegida para la práctica se denomina <b><i>software.xml</i></b>, y se trata de una recopilación de las principales aplicaciones software instaladas en mi ordenador. Usualmente, sobre todo cuando ya se lleva algún tiempo con la misma máquina, nos decidimos a hacer una "limpieza" de programas instalados y que apenas utilizamos, por lo que resulta útil disponer de una base de datos XML donde consultar todas las aplicaciones residentes en el PC en los distintos sistemas operativos instalados, disponiendo así de un control de versiones, compatibilidades, idioma, etc. que nos ayudará a conocer la utilidad y el estado de actualización de los diferentes programas.</p> <h2>Primer documento XML</h2> <p>El documento software.xml <a href="http://aap-ugr-2007.wikispaces.com/practica4_alexbm8_software">se encuentra aquí</a>, y analizándolo vemos que se parte de la raiz <i></i> y se llega a dos nodos principales, que representan los dos SO instalados en mi ordenador: Windows y Ubuntu. De cada uno de estos nodos parten las distintas categorías en las que se engloban las aplicaciones descritas. Podría haberse orientado al revés, es decir, partir de las categorías y distinguir en cada aplicación la plataforma donde se encuentra instalada, pero dado el carácter organizativo personal para el que está ideado el documento, se pensó que era mejor organizarlo de forma que de un simple vistazo se distinguieran las aplicaciones instaladas en Windows y las instaladas en Linux, pues al fin y al cabo, se encuentran en particiones diferentes del disco duro. Dentro del nodo del SO se encuentra asimismo, el atributo "<i>versión</i>" para una correcta identificación de la plataforma. Dentro de cada categoría nos encontraríamos las empresas desarrolladoras, con atributos como "<i>sede</i>", y por último, debajo de éstas, se encuentran las aplicaciones finales, de las que descienden sus descriptores de versión instalada, versión actual (a fecha de la realización del documento), licencia gratuita o de pago, lenguaje de programación en que han sido desarrolladas, idioma de la interfaz y breve descripción de las mismas.</p> <p>Para este primer documento se listaron un total de 11 aplicaciones distribuidas entre los dos SO, y fue validado en xmllint mediante la instrucción <span class="user"><code class="ejemplo">xmllint software.xml</code></span></p> <h2>DTD o XSchema</h2> <p>Una vez elaborado el documento XML, se hizo uso del <a href="http://www.hitsw.com/xml_utilites/">generador automático de HitSoftware</a> para obtener el XSchema primario (<b><i>software.xsd</i></b>, <a href="http://aap-ugr-2007.wikispaces.com/practica4_alexbm8_XSchema1">consultar aquí</a>), mediante el cual validamos el documento XML con la instrucción <code class="ejemplo">xmllint --schema software.xsd software.xml </code>obteniendo el mensaje "software.xml validates" que indica la correcta validación. Sin embargo, al crearse automáticamente, este primer XSchema fue simplificado, eliminando las referencias (<i>ref = "..."</i>) y mejorado, pues se le incluyó la posibilidad de que existiesen múltiples SO, categorías, desarrolladores y aplicaciones, y se aplicaron restricciones al campo "<i>Gratuita</i>" mediante expresiones regulares, a la longitud del campo "<i>Descripción</i>" para que no pudiese dejarse vacío ni extenderse demasiado, a los atributos principales para que no faltasen en ningún elemento (mediante <i>use = "required"</i>) y al formato de algunos atributos que debía cambiarse a NMTOKEN para incluir algunos caracteres especiales. Todas estas modificaciones fueron verificadas, por ejemplo, introduciendo valores no válidos o eliminando campos y observando que la validación era incorrecta. Por último decir que se ajustó la ortografía empleada (las tildes) a la codificación elegida (UTF-8). Esta segunda versión del XSchema modificada manualmente (<i><b>software2.xsd</b></i>) también puede <a href="http://aap-ugr-2007.wikispaces.com/practica4_alexbm8_XSchema2">consultarse en la web</a> y de nuevo con ella se verificó que validaba correctamente al primer documento creado (<code class="ejemplo">xmllint --schema software2.xsd software.xml</code>).</p> <h2>Segundo documento XML</h2> <p>Para terminar se elaboró un segundo documento XML (<i><b>software2.xml</b></i>), ampliación del primero, donde se describen un total de 17 aplicaciones (14 de Windows y 3 de Ubuntu), y donde se probaron variaciones tales como incluir dentro de una misma categoría aplicaciones de distintos desarrolladores (ver rama de navegadores) o incluir dentro del mismo desarrollador distintas aplicaciones (ver rama de IDEs). Este segundo documento puede <a href="http://aap-ugr-2007.wikispaces.com/practica4_alexbm8_software2">consultarse aquí</a>, e igualmente fue validado con xmllint mediante la orden <code class="ejemplo">xmllint --schema software2.xsd software2.xml.</code></p><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-235090429169479799?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/04/aap-practica-4-xml.htmlBloque T2.4http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t24.htmlEl XSchema diseñado exige que en la quiniela haya 15 partidos, con un equipo local, visitante y un resultado, que deberá ser del tipo "1", "X", ó "2". Una posible mejora sería exigir que los 15 partidos involucrasen equipos diferentes.<br /><br />El código se <a href="http://aap-ugr-2007.wikispaces.com/alexbm8_bloqueT2_4">encuentra aquí</a>, y la captura con la correcta validación de xmllint es la siguiente:<a href="http://2.bp.blogspot.com/_DYphh_oWN4k/Sc4_sUmk1vI/AAAAAAAAAwk/XEAAtHtHUtE/s1600-h/T2_4.png"><img src="http://2.bp.blogspot.com/_DYphh_oWN4k/Sc4_sUmk1vI/AAAAAAAAAwk/XEAAtHtHUtE/s320/T2_4.png" alt="" id="BLOGGER_PHOTO_ID_5318258240648435442" border="0" /></a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-1034833660737217729?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t24.htmlBloque T2.3http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t23.htmlEl código del fichero XML se <a href="http://aap-ugr-2007.wikispaces.com/alexbm8_T2_3">encuentra aquí</a><br />La captura con la correcta validación en xmllint es la siguiente:<br /><br /><div><a href="http://2.bp.blogspot.com/_DYphh_oWN4k/ScwWo7iAcuI/AAAAAAAAAwE/tQv2kZQuMVQ/s1600-h/BloqueT2_3"><img src="http://2.bp.blogspot.com/_DYphh_oWN4k/ScwWo7iAcuI/AAAAAAAAAwE/tQv2kZQuMVQ/s320/BloqueT2_3" alt="" id="BLOGGER_PHOTO_ID_5317650152448619234" border="0" /></a></div><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-1148620671738541296?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t23.htmlEjercicio bloque T1.8http://alejandrobareamontoya.blogspot.com/2009/03/ejercicio-bloque-t18.htmlHe modificado la resolución de este ejercicio, ya aportada por draxus, para mostrar al final del div dos enlaces más (con aspecto diferente) hacia el primer y último bloque de ejercicios. Además, el código se encuentra convenientemente comentado.<br /><br />El código fuente que debemos guardar como X.user.js se <a href="http://aap-ugr-2007.wikispaces.com/alexbm8_bloque_T1_8">encuentra aquí</a>.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-488238707455569327?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/03/ejercicio-bloque-t18.htmlEj. Bloque T1.7http://alejandrobareamontoya.blogspot.com/2009/03/ej-bloque-t17.htmlEl código que yo usé se <a href="http://aap-ugr-2007.wikispaces.com/ejercicio_bloque_T1_7">encuentra aquí</a>.<br />Aún así, no sé por qué no busca en todo el documento, sino que me muestra las secciones anteriores a la ubicación del código Javascript, de forma que para que me muestre todas las secciones tenía que colocarlo al final, ¿por qué ocurre esto?<br /><br />Bueno, ya creo que sé por qué ocurre esto, se debe a que conforme la página se va cargando, cuando el navegador interpreta el código javascript, aún no dispone de la totalidad de la página, y sólo puede mostrar las secciones anteriores a dicho código. Esto se resolvería, por ejemplo, colocando un botón que llamase a una función, tal y como podemos ver en el ejemplo de <a href="http://aap-ugr-2007.wikispaces.com/Ejercicio+T1.7.1+draxus+13-03-09">draxus</a>.<br /><br />Otra forma de resolverlo sería colocar el código justo antes del final (etiqueta &lt;/body&gt;), como en el siguiente ejemplo donde se muestra la <a href="http://aap-ugr-2007.wikispaces.com/ejercicios_bloque_T1_7_v2">sección introducida en el TextBox.</a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-146893649611425106?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/03/ej-bloque-t17.htmlBloque T1.3http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t13.html<span>Hacer una clase que corresponda a una fila de una tabla, con número de columnas variable, y un programa que permita crear e imprimir una tabla usándolo.</span><span><br /></span><span><br />La solución, muy similar a la de <a href="http://aap-ugr-2007.wikispaces.com/Taller+1+-+Ejercicio+1.3.1+draxus+04-03-09">Draxus</a>, está <a href="http://aap-ugr-2007.wikispaces.com/alexbm8_bloque_T1_3">aquí</a>.</span><span><br /><br /></span><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-5288653632001513146?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t13.htmlBloque T1.2http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t12.html<span>Hacer una función que devuelva una tabla en HTML con el número de filas y columnas que se le pasen como parámetro. </span><br /><br /><a href="http://aap-ugr-2007.wikispaces.com/alexbm8_bloqueT1_2">En este enlace</a> se puede ver una página web con Javascript donde se pueden introducir el número de filas y columnas de la matriz por medio de InputBox.<div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-6338430901522051632?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/03/bloque-t12.htmlEjercicios tema 1 (Introducción) - AAPhttp://alejandrobareamontoya.blogspot.com/2009/03/ejercicios-tema-1-introduccion-aap.html<strong><span>Bloque 1.1</span></strong><br /><br /><em><strong>1. Buscar ejemplos de sistemas P2P.</strong></em><br /><br />Las redes P2P poseen una serie de características que paso a resumir brevemente:<br /><br /><ul><li><strong>Escalabilidad</strong>, es decir, este tipo de redes llegan a todos los puntos del planeta. Lo mejor, para que funcionen a la perfección, es que cuantos más nodos estén conectados a la red, su funcionamiento será mucho mejor. Cuando los nodos comparten recursos, los recursos totales de la red aumentan.</li><li><strong>Robustez</strong>: La distribución que se produce en este tipo de redes incrementa la robustez de la misma. </li><li><strong>Descentralización</strong>: Las redes P2P están descentralizadas totalmente y sus usuarios, como ya hemos dicho, son iguales entre sí.</li><li><strong>Al compartir recursos</strong>, también los costes se reparten entre los usuarios que participan en la red.</li><li><strong>Anonimato</strong>: Lo suyo es que el autor de un contenido, el editor, el lector y el servidor queden en el más profundo anonimato.</li><li><strong>Seguridad</strong>: Para que una red P2P sea completamente segura, se deben identificar y evitar los nodos maliciosos, evitar contenidos infectados y el espionaje de las comunicaciones entre nodos. Además, se deben crear grupos seguros de nodos y proteger los recursos disponibles en la red. Los mecanismos más positivos para conseguir esta seguridad son el cifrado multiclave, las cajas de arena, la gestión de derechos de autor, la reputación, establecer comunicaciones seguras o permitir los comentarios sobre los ficheros.</li></ul><p><br />Existen varios tipos de redes P2P y podrían resumirse de la siguiente manera:</p><ul><li><strong>Redes P2P centralizadas</strong>: En ella todos los intercambios de información se llevan a cabo por medio de un servidor único. Este servidor es el punto de conexión entre dos nodos. Además, almacena y distribuye los nodos en los que se almacenan los contenidos que se van a compartir. Tiene una serie de ventajas, como la dinámica en la administración de los recursos y la disposición permanente de contenidos. También lleva consigo algunos inconvenientes como son la privacidad limitada de los usuarios que participan en la red, problemas legales y grandes costos en su mantenimiento, así como un gran consumo de bancha ancha.</li><li><strong>Redes P2P descentralizadas</strong>: Este tipo de redes son las más comunes porque son mucho más versátiles y, en ellas, los usuarios actúan como nodos de las conexiones y almacenan, ellos mismos, la información, es decir, todo tipo de comunicación se producen de usuario a usuario.</li><li><strong>Redes P2P híbridas</strong>: En ellas se da la presencia de un servidor central, que administra los recursos de banda ancha, enrutamientos y comunicación entre nodos. El servidor no conoce, en ningún momento, la identidad de cada nodo y no almacena la información, por lo que el servidor en cuestión no comparte archivos.<br /><br /><br />A continuación enumero algunas de las numerosas redes P2P existentes (o ya desaparecidas) junto con una breve descripción y un enlace para ver más información:<br /><br /><br /><a href="http://www.elmundo.es/navegante/2000/04/10/freenet.html">Freenet</a><br />Una red diseñada para evitar la censura.<br /><br /><a href="http://www.skype.com/intl/es/newtoskype/">Skype</a><br />La telefonía en Internet de forma gratuita<br /><br /><a href="http://lionshare.its.psu.edu/">LionShare</a><br />Diseñado para intercambiar material educativo de nivel universitario.<br /><br /><a href="http://aresgalaxy.sourceforge.net/">AresGalaxy</a><br />Inspirada en Gnutella, se independizó de la misma y es la red asociada al programa de intercambio de archivos Ares.<br /><br /><a href="http://www.audiogalaxy.com/">Audiogalaxy</a><br />Red especializada en intercambio de música.<br /><br /><a href="http://es.wikipedia.org/wiki/Direct_Connect">DirectConnect</a><br />Basada en FTP.<br /><br /><a href="http://en.wikipedia.org/wiki/Gnutella2">Gnutella2</a><br />Nueva versión de la famosa red Gnutella, usada por Shareaza o MLLDonkey.<br /><br /><a href="http://www.xatakamovil.com/aplicaciones/mbittv-red-p2p-de-moviles">mBit.tv</a><br />Para disfrutar de la televisión en el teléfono móvil.<br /><br /><a href="http://www.hectormilla.com/article/307/mercora-y-grouper-las-radios-p2p-y-comunitarias">Mercora</a><br />Permite convertir a cada nodo de la red en una emisora de radio.<br /><br /><a href="http://mute-net.sourceforge.net/">MUTE</a><br />Descargas anónimas, es decir, un prototipo de programa p2p preparado contra todo tipo de repercusión legal.<br /><br /><a href="http://sermone.blogspot.com/2007/03/omemo-p2p-para-compartir-espacio-de.html">OMEMO</a><br />Una innovadora red que persigue crear un inmenso disco duro virtual.</li></ul>Como curiosidad extra tenemos <a href="http://www.mpi-inf.mpg.de/departments/d5/teaching/ws03_04/p2p-">Chord</a>, un protocolo de búsqueda en redes P2P que permite alta escalabilidad (coste proporcional a log(N), con N = número de nodos).<br /><br /><br /><p></p><p><em><strong>2. Identificar diferentes productos para crear clústers de computadores, e instalaciones comerciales que los usen.</strong></em><br /><br /></p><ul><li><a href="http://gridengine.sunsource.net/">Sun Grid Engine</a>, usado en el grid de supercómputo de <a href="http://www.sun.com/blueprints/0207/820-0831.pdf?cid=920837">Tokyo Tech</a>.<br /></li><li><a href="http://svn.oscar.openclustergroup.org/trac/oscar">OSCAR</a> y <a href="http://www.rocksclusters.org/wordpress/">NPACI Rocks</a>, empleado por todos los clusters de tipo <a href="http://www.beowulf.org/">Beowulf</a>.</li></ul><p><span>OSCAR </span>es una colección de software de código abierto para crear un cluster sobre Linux desarrollada por el Grupo de Clusters Abiertos (OCG – Open Cluster Group).<br />OSCAR se instala sobre un computador con una distribución Linux previamente y realiza la instalación y/o configuración de los paquetes necesarios para el cluster de forma automática.</p><p><br /><strong>Arquitectura de OSCAR</strong>: los computadores que conforman el cluster se denominan nodos, existen dos tipos de nodos: un nodo principal (nodo servidor) y varios nodos de cómputo (nodos clientes).</p><p><span>NPACI </span>(National Partnership for Advanced Computational Infrastructure) <span>Rocks </span>es una colección de software de código abierto para crear un cluster sobre Linux Red Hat, desarrollada por el Grupo de Computación Cluster del Centro de Supercomputación de San Diego, California.<br />El objetivo principal de Rocks es permitir que la instalación de un cluster sea lo más fácil posible. Para cumplir con este objetivo, la instalación realiza una serie de suposiciones acerca del software que será incluido y cómo el cluster será configurado.<br />Rocks realiza una instalación completa del sistema operativo sobre un nodo. Rocks incorpora una versión de la distribución de Red Hat con software adicional específico para clusters. Adicionalmente, Rocks configura correctamente varios servicios. Al instalar Rocks, éste instalará Linux, por lo que no es posible agregarlo sobre un servidor existente o usarlo con alguna distribución de Linux diferente.<br />Rocks permite la creación de clusters más complejos que los creados con OSCAR. Tiene soporte para sistemas Itanium (tecnología Intel de 64 bits) y Opteron (tecnología AMD de 64 bits), así como sistemas basados en la tecnología Intel de 32 bits.<br />Una de sus principales características de es un mecanismo robusto para producir distribuciones personalizadas (con parches de seguridad preaplicados tanto a nivel del kernel como a nivel de aplicación), el mismo que define un conjunto completo de software para un nodo en particular.</p><p><br /><span>Arquitectura de Rocks</span>: la arquitectura tradicional de un sistema Rocks está compuesta por un nodo servidor (frontend), varios nodos cliente, una red Ethernet y una red opcional de alto rendimiento (Myrinet o Gigabit Ethernet).<br />El nodo frontend está expuesto al mundo exterior. Sobre este nodo se ejecutan algunos servicios como NFS, NIS, DHCP, NTP, MySQL y HTTP. En el nodo frontend, los usuarios se conectan al sistema, presentan tareas, compilan código, etc. Este nodo pueden actuar como enrutador para otros nodos usando NAT. Los nodos de cómputo son nodos esclavos y son los que ejecutan todas las tareas. Las herramientas de Rocks permiten que un sistema operativo completo sea reinstalado en cada nodo de cómputo en una cantidad pequeña de tiempo (~10 minutos).<br /></p><ul><li><a href="http://opensolaris.org/os/community/ha-clusters/">Open HA Cluster</a>, que en realidad forma parte de Sun.</li></ul><p><strong><em><br /></em></strong></p><p><strong><em>3. Identificar un producto para sistemas Grid, y diferentes instalaciones que lo usen.</em></strong><br /><br /><a href="http://www.cs.vu.nl/ibis/">Ibis</a> es un proyecto Java Opensource con el que se perseguía la creación de una plataforma Java para la computación grid. Podemos encontrar más información detallada en el <a href="http://www.cica.es/index2.php?option=com_content&do_pdf=1&id=244">siguiente pdf</a> o ver un <a href="http://www.cs.vu.nl/ibis/downloads/barnes-demo-xvid.avi">vídeo de ejemplo</a>.<br /><br />Con respecto a productos relacionados con sistemas grid encontré esta útil web donde se ofrecen múltiples productos para sistemas grid: <a href="http://www.solucionesgrid.com/">http://www.solucionesgrid.com/</a> (un apartado de la empresa española dedicada al hosting de todo tipo <a href="http://www.webstudio.es/">WebStudio</a>). Un ejemplo de ellas es “GridHosting”, un servicio de alojamiento descentralizado y redundado, que permite a nuestra web usar hasta 80 núcleos de procesamiento y 320 GB de memoria RAM con una alta disponibilidad e independencia con respecto al resto de webs alojadas. Además permite elegir el grid hosting tanto bajo Windows como bajo Linux. Un ejemplo de marca conocida que aloja su página web en los servidores de WebStudio es la de <a href="http://www.hyundai.es/dev/">Hyundai</a>.<br /><br /><br /><br /><br /><strong><span>Bloque 1.2</span><br /></strong><br /><strong><em>1. Discutir cuáles son los principales obstáculos a la escalabilidad en un sistema distribuido.</em></strong><br /><br />El principal obstáculo que se me ocurre a la hora de que añadir nuevos elementos al sistema no suponga un problema, es cómo distribuir de manera eficiente el trabajo entre un número de nodos cada vez mayor, y que por tanto presenta cada vez más diversidad. Supongo que se trataría de elaborar algoritmos que dividiesen el trabajo de manera rápida en función del número y las características de los nodos existentes, de forma que se siguiese un esquema adaptativo modificable cada vez que entra o sale de funcionamiento un nodo, ó cada cierto tiempo de forma periódica. Debemos tener en cuenta que no sólo se trata de la potencia de cálculo de cada nodo, sino de las prestaciones de la red acceso a Internet que usa.<br /><br />Deberían establecerse puntos de control para subconjuntos de nodos que recogiese información sobre los nodos a su cargo enviándola hacia nodos superiores en una “supuesta jerarquía”, que finalizaría en el nodo-conjunto de nodos central que generase la carga computacional en cuestión. No debemos olvidar que no sólo se trata de repartir el trabajo de forma eficiente y rápida, sino que después el trabajo deberá ser tratado y comparado con las distintas redundancias establecidas para evitar resultados manipulados.<br /><br />Pero no todo son grandes proyectos a escala mundial como puede ser el proyecto SETI@Home, si pensamos en términos de una empresa más pequeña, puede llegar un punto en que no nos interese añadir más nodos a una red de computación distribuída, por ejemplo porque el ancho de banda que se consume al establecer comunicación con más nodos es cada vez mayor, lo que puede decrementará el rendimiento de la línea.<br />En resumen, aumentar el número de nodos, aunque es una gran ventaja a la hora de repartir la carga entre más nodos u obtener más redundancia para comprobación de errores, supone un aumento en la gestión de los nodos, que puede obligar a mejorar el equipamiento distribuidor, e incluso, la tecnología de comunicación.<br /><br /><br /><strong>2. Hacer un programa o buscar un ejemplo que use un interfaz REST para acceder a algún servicio Web, como del.icio.us.</strong><br /><br />Mi idea original era la de hacer un programa en Ruby al estilo del que el profesor nos presentó y que obtenía las coordenadas geográficas de una localidad. Sin embargo, aunque existen infinidad de sitios web que emplean la interfaz REST para hacer todo tipo de consultas, es mucho más difícil encontrar páginas con un servicio web XML como el disponible en Geonames, que dé una respuesta tan estructurada y correctamente etiquetada que permita una inmediata obtención con Ruby. Después de mucho buscar conseguí, al menos, hacer este simplón programa que devuelve la primera acepción del diccionario de la RAE para la palabra que se le pase como argumento (buscon.rb):<br /><br /><br /><span><em>#!/usr/bin/ruby<br /><br />require 'net/http'<br />require 'uri'<br />palabra = ARGV[0]<br />respuesta = Net::HTTP.get( URI.parse( URI.escape('http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_BUS=3&amp;LEMA='+palabra) ) )<br />respuesta =~/&lt;span class="eAcep"><span class="eAcep"><span class="eAcep"><span class="eAcep"><span class="eAcep">([^<]+)<\/span>/<br />print "Definición primaria: #$1\n"</span></span></span></span></em></span><br /><br /><br /><br />Aun así, encontré que los siguientes sitios poseen un apartado especial para desarrolladores donde podemos encontrar distintos tipos de APIs, entre ellas una para REST:<br /><br />§ <a href="http://code.google.com/apis/ajaxsearch/documentation/#fonje">Google</a><br />§ <a href="http://www.panoramio.com/api/">Panoramio</a><br />§ <a href="http://developer.ebay.com/developercenter/rest/">eBay</a><br />§ <a href="http://wiki.developers.facebook.com/index.php/API">Facebook</a><br />§ <a href="http://drupal.org/project/restapi">Drupal</a><br />§ <a href="http://www.anyexample.com/programming/php/uploading_files_to_amazon_s3_with_rest_api.xml">AmazonS3</a><br />§ <a href="http://developer.yahoo.com/maps/rest/V1/geocode.html">Yahoo!Maps</a><br />§ <a href="http://developer.myspace.com/community/RestfulAPIs/intro.aspx">MySpace</a><br />§ <a href="http://apiwiki.twitter.com/REST+API+Documentation">Twitter</a><br />§ <a href="http://www.flickr.com/services/api/request.rest.html">Flickr</a> (necesitas registrarte para obtener una <a href="http://www.flickr.com/services/api/misc.api_keys.html">clave API</a>)<br />§ <a href="http://delicious.com/help/api">Delicious</a> (también con acceso identificado al servidor).<br /><br />Otras páginas web que usan REST pero no incluyen una API son por ejemplo la de la <a href="http://www.rae.es/rae.html">RAE</a>, la de <a href="http://www.scribd.com/">Scribd</a>, la <a href="http://www.aemet.es/es/portada">AEMET</a>, etc.</p><p><br /></p><p><br /><strong><span>Bloque 1.3</span></strong></p><p><strong><em><br />1. Buscar un fichero de tamaño conocido (por ejemplo, una ISO de alguna distro Linux) y probar qué tiempo se tarda en descargarla usando BitTorrent y usando la web. ¿Qué diferencia hay? ¿De qué depende esa diferencia?</em></strong><br /><br />En primer lugar me descargué desde la web <a href="http://www.ubuntu.com/getubuntu/download">http://www.ubuntu.com/getubuntu/download</a> la ISO de la versión 8.10 de Ubuntu, un archivo con un tamaño total de 699.03MB que tardó en descargarse exactamente 1h, 28 min y 9 segundos, a una velocidad media de 132.17 KB/s.<br />Para usar BitTorrent, en primer lugar usé el famoso tracker <a href="http://thepiratebay.org/">http://thepiratebay.org/</a> , donde obtuve la semilla que más tarde mediante el cliente <a href="http://www.bitcomet.com/">BitComet</a> 1.09 emplearía para buscar el resto de clientes, y comenzar tanto la descarga como la subida (de forma simultánea). Increíblemente, el mismo archivo tardó sólo 28 min y 40 s, es decir, una velocidad media estimada por BitComet de 416KB/s.<br /><br />Esta gran diferencia se debe al mecanismo de compartición subyacente en la red P2P de BitTorrent. Desde el momento en que alguien comienza a descargarse un archivo, también comienza a compartir las porciones ya descargadas del mismo, de forma que la cooperación entre usuarios es forzosa e inmediata. Además, no siempre se comienza a descargar el fichero por el principio del mismo, pues esto podría suponer un importante cuello de botella cuando múltiples nodos quisieran el mismo fichero, ya que todos pedirían la misma partición. Al bajarse partes al azar, el rendimiento y la velocidad de descarga mejora sustancialmente.<br /><br />También debemos tener en cuenta el número de semillas del archivo en cuestión, a mayor número de ellas, mayor velocidad de descarga obtendremos. Por último decir que muchos clientes de BitTorrent, como BitComet, permiten establecer manualmente el número máximo de conexiones que pueden establecerse en paralelo, y que por defecto, Windows limita a 10 para evitarse problemas con los virus. Evidentemente, si escogemos el máximo número de conexiones TCP/IP adecuado a nuestra conexión ADSL, la descarga será más rápida.<br /><br /><br /><em><strong>2. Instalar algún cliente de gnutella (por ejemplo, gtk_gnutella) y buscar un fichero popular para bajarlo. ¿Cuánto se tarda desde la petición hasta que se encuentra? ¿Cuánto se tarda desde que se empieza a descargar hasta que se descarga?</strong></em><br /><br />El cliente Gnutella que me instalé fue una aplicación escrita en Java, <a href="http://www.limewire.com/">LimeWire</a>, y busqué para descargarme el último single de U2, “No line on the horizon”. En total fueron 9.56MB descargados a una velocidad media de 54-55KB/s. Lo que sí se aprecia en esta red P2P es que la búsqueda es más lenta, así como que el contenido de ficheros es más escaso. El retardo se debe principalmente a que cuando lanzamos una búsqueda en Gnutella, en realidad estamos lanzando una petición a todos los nodos a los que estamos conectados directamente, los cuales a su vez, mediante una estrategia de inundación, irán trasladando la petición a toda la red, recabando las respuestas. Este mecanismo de inundación es el causante del retardo, ya que estos mensajes saturan la red. La ventaja es que no existe ningún servidor central de búsqueda, lo que hace que sea completamente robusta.<br />En cuanto a la descarga, emplea un mecanismo muy similar al de las redes BitTorrent, por lo que sólo en base a la popularidad del fichero obtendremos mejor o pero tasa de descarga. Una ventaja o inconveniente que presenta (según se mire), es que no premia a aquellos que más comparten, ya que todos los nodos tiene igual función, peso e importancia dentro de la red.<br /><br /><br /><em><strong>3. Argumentar en una entrada del blog las ventajas relativas de las diferentes formas de localización, descarga y disponibilidad de los recursos.<br /></strong></em><br />La disponibilidad y la localización suelen ir de la mano en los sistemas distribuidos, y pueden ser básicamente centralizadas o distribuidas. La versión centralizada tiene la ventaja de que es más rápida, pues sólo tiene que consultar/depender de un único nodo, pero éste sufrirá una importante sobrecarga que puede llevar a la saturación. La distribuida evita esta saturación a la vez que se hace más resistente frente a la caída de estos nodos, pero a cambio se obtiene un retardo mayor. La solución pasaría, como casi siempre, por el término medio (como diría Aristóteles), es decir una solución centralizada jerárquica con copias de respaldo, al estilo del servicio DNS.<br /><br />La forma de descargar un recurso de la red está muy relacionada con los conceptos anteriores. Podemos destacar dos tipos: la descarga descentralizada (ligada en un 99% de los casos a las redes P2P), donde se obtienen los distintos fragmentos de un archivo estableciendo múltiples conexiones con otros nodos, de forma que se puede obtener un gran rendimiento del ancho de banda en base al número de “semillas” y otras reglas del protocolo (como por ejemplo el número de archivos que compartimos o el tiempo que llevamos activos). En el punto opuesto tendríamos la descarga directa (o centralizada) tan de moda nuevamente. En esta versión se obtienen los archivos desde un único servidor, aprovechando casi al máximo la capacidad de la línea con una única conexión, eso sí, dependemos del servidor que dispone del archivo por lo que existe una escasa robustez. ¿Qué es mejor, las redes P2P o la descarga directa? Pues mejor que copiar,<a href="http://www.genbeta.com/intercambio-de-ficheros/bittorrent-vs-emule-vs-descarga-directa"> leed esta completa comparación</a>.<br />En un punto intermedio, aunque mucho más próximos a la descarga centralizada, estarían los aceleradores de descargas, que mediante múltiples conexiones a distintas ubicaciones del archivo, permiten acelerar la tasa de bajada.<br /><br />En cuanto a la comunicación a través de la red, puede ser principalmente de tipo P2P pura, o mediante intermediarios (brokers). Si la comunicación es directa, evidentemente ésta será más rápida, pero también menos eficiente, pues si pensamos en una aplicación de mensajería, cada vez que quisiésemos conversar con un contacto deberíamos establecer una nueva conexión, mientras que con un servidor que hiciese de intermediario podríamos simplificar el procedimiento, claro que perderíamos la correspondiente privacidad. Además, tal y como he comentado anteriormente, por cuestiones de robustez, suele ser conveniente no depender de un único nodo servidor-intermediario.<br /><br /></p><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/1650337775132069278-2423438338782685852?l=alejandrobareamontoya.blogspot.com" /></div>http://alejandrobareamontoya.blogspot.com/2009/03/ejercicios-tema-1-introduccion-aap.htmlEjercicio T8.2.3http://pakitochusaap.blogspot.com/2009/04/ejercicio-t823.htmlHe aquí el ejercicio<br /><br /><br /><pre class="hl"><span class="slc">#!/usr/bin/perl</span><br /><br /><span class="kwa">use</span> CGI <span class="kwd">qw</span><span class="sym">(:</span>standard<span class="sym">);</span><br /><br />print <span class="kwd">header</span><span class="sym">( -</span>type <span class="sym">=&gt;</span> <span class="str">'application/xhtml+xml'</span> <span class="sym">);</span><br /><br />print<span class="sym">&lt;&lt;</span>EOC<span class="sym">;</span><br /><span class="sym">&lt;</span>?xml version<span class="sym">=</span><span class="str">&quot;1.0&quot;</span> encoding<span class="sym">=</span><span class="str">&quot;iso-8859-1&quot;</span> standalone<span class="sym">=</span><span class="str">&quot;yes&quot;</span>?<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>rss version<span class="sym">=</span><span class="str">&quot;2.0&quot;</span> xmlns<span class="sym">:</span>atom<span class="sym">=</span><span class="str">&quot;http://www.w3.org/2005/Atom&quot;</span><span class="sym">&gt;</span><br /><span class="sym">&lt;</span>channel<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>title<span class="sym">&gt;</span>Anima Adversa <span class="sym">-</span> Noticias<span class="sym">&lt;/</span>title<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>description<span class="sym">&gt;</span>Noticias de Anima Adversa<span class="sym">&lt;/</span>description<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>link<span class="sym">&gt;</span>http<span class="sym">://</span>www.animaadversa.es<span class="sym">/&lt;/</span>link<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>language<span class="sym">&gt;</span>es<span class="sym">-</span>sp<span class="sym">&lt;/</span>language<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>copyright<span class="sym">&gt;</span>Copyright <span class="num">2009</span> Anima Adversa<span class="sym">&lt;/</span>copyright<span class="sym">&gt;</span><br /><br /><span class="sym">&lt;</span>item<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>title<span class="sym">&gt;</span>Nuevo disco <span class="str">&quot;El Grito en el Cielo&quot;</span> presentación <span class="num">20</span> Marzo<span class="sym">,</span> sala El Tren<span class="sym">&lt;/</span>title<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>description<span class="sym">&gt;</span>El nuevo disco de Anima Adversa<span class="sym">,</span> <span class="str">&quot;El Grito en el Cielo&quot;</span><span class="sym">,</span> ya está disponible en la web para libre descarga y distribución. Si os ha gustado y queréis el disco en soporte físico y calidad CD<span class="sym">,</span> lo podéis comprar en la tienda. <span class="sym">&lt;/</span>description<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>category<span class="sym">&gt;![</span>CDATA<span class="sym">[</span><span class="num">4</span><span class="sym">]]&lt;/</span>category<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>link<span class="sym">&gt;</span>http<span class="sym">://</span>www.animaadversa.es<span class="sym">/</span>noticias.php?notID<span class="sym">=</span><span class="num">32</span><span class="sym">&lt;/</span>link<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>pubDate<span class="sym">&gt;</span>Wed<span class="sym">,</span> <span class="num">11</span> Mar <span class="num">2009 00</span><span class="sym">:</span><span class="num">00</span><span class="sym">:</span><span class="num">00</span> <span class="sym">+</span><span class="num">0100</span><span class="sym">&lt;/</span>pubDate<span class="sym">&gt;</span><br /><span class="sym">&lt;/</span>item<span class="sym">&gt;</span><br /><br /><span class="sym">&lt;</span>item<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>title<span class="sym">&gt;</span>Sisyphos. Nuevo Videoclip<span class="sym">!!&lt;/</span>title<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>description<span class="sym">&gt;</span>Nuevo Videoclip de Sisyphos que podéis disfrutar tras el enlace. <span class="sym">&lt;/</span>description<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>category<span class="sym">&gt;![</span>CDATA<span class="sym">[</span><span class="num">4</span><span class="sym">]]&lt;/</span>category<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>link<span class="sym">&gt;</span>http<span class="sym">://</span>www.animaadversa.es<span class="sym">/</span>noticias.php?notID<span class="sym">=</span><span class="num">31</span><span class="sym">&lt;/</span>link<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>pubDate<span class="sym">&gt;</span>Fri<span class="sym">,</span> <span class="num">06</span> Mar <span class="num">2009 00</span><span class="sym">:</span><span class="num">00</span><span class="sym">:</span><span class="num">00</span> <span class="sym">+</span><span class="num">0100</span><span class="sym">&lt;/</span>pubDate<span class="sym">&gt;</span><br /><span class="sym">&lt;/</span>item<span class="sym">&gt;</span><br /><br /><span class="sym">&lt;</span>item<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>title<span class="sym">&gt;</span>El Grito en el Cielo. Primicia Mundial. <span class="sym">&lt;/</span>title<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>description<span class="sym">&gt;</span>Os presentamos Sisyphos<span class="sym">,</span> el próximo Single de Anima Adversa.<span class="sym">&lt;/</span>description<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>category<span class="sym">&gt;![</span>CDATA<span class="sym">[</span><span class="num">4</span><span class="sym">]]&lt;/</span>category<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>link<span class="sym">&gt;</span>http<span class="sym">://</span>www.animaadversa.es<span class="sym">/</span>noticias.php?notID<span class="sym">=</span><span class="num">28</span><span class="sym">&lt;/</span>link<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>pubDate<span class="sym">&gt;</span>Mon<span class="sym">,</span> <span class="num">19</span> Jan <span class="num">2009 00</span><span class="sym">:</span><span class="num">00</span><span class="sym">:</span><span class="num">00</span> <span class="sym">+</span><span class="num">0100</span><span class="sym">&lt;/</span>pubDate<span class="sym">&gt;</span><br /><span class="sym">&lt;/</span>item<span class="sym">&gt;</span><br /><br /><span class="sym">&lt;</span>item<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>title<span class="sym">&gt;</span>Ya tenemos feed de RSS<span class="sym">!</span> Suscribios<span class="sym">!!&lt;/</span>title<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>description<span class="sym">&gt;</span>Ya tenemos FEED de RSS. Suscribíos<span class="sym">!&lt;/</span>description<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>category<span class="sym">&gt;![</span>CDATA<span class="sym">[</span><span class="num">5</span><span class="sym">]]&lt;/</span>category<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>link<span class="sym">&gt;</span>http<span class="sym">://</span>www.animaadversa.es<span class="sym">/</span>noticias.php?notID<span class="sym">=</span><span class="num">29</span><span class="sym">&lt;/</span>link<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>pubDate<span class="sym">&gt;</span>Thu<span class="sym">,</span> <span class="num">15</span> Jan <span class="num">2009 00</span><span class="sym">:</span><span class="num">00</span><span class="sym">:</span><span class="num">00</span> <span class="sym">+</span><span class="num">0100</span><span class="sym">&lt;/</span>pubDate<span class="sym">&gt;</span><br /><span class="sym">&lt;/</span>item<span class="sym">&gt;</span><br /><br /><span class="sym">&lt;</span>item<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>title<span class="sym">&gt;</span>Finalizada la grabación de <span class="str">&quot;El Grito en el Cielo&quot;</span><span class="sym">&lt;/</span>title<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>description<span class="sym">&gt;</span>Finalizada la grabación de <span class="str">&quot;El Grito en el Cielo&quot;</span>.<span class="sym">&lt;/</span>description<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>category<span class="sym">&gt;![</span>CDATA<span class="sym">[</span><span class="num">4</span><span class="sym">]]&lt;/</span>category<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>link<span class="sym">&gt;</span>http<span class="sym">://</span>www.animaadversa.es<span class="sym">/</span>noticias.php?notID<span class="sym">=</span><span class="num">27</span><span class="sym">&lt;/</span>link<span class="sym">&gt;</span><br /><span class="sym">&lt;</span>pubDate<span class="sym">&gt;</span>Sun<span class="sym">,</span> <span class="num">21</span> Dec <span class="num">2008 00</span><span class="sym">:</span><span class="num">00</span><span class="sym">:</span><span class="num">00</span> <span class="sym">+</span><span class="num">0100</span><span class="sym">&lt;/</span>pubDate<span class="sym">&gt;</span><br /><span class="sym">&lt;/</span>item<span class="sym">&gt;</span><br /><br /><span class="sym">&lt;/</span>channel<span class="sym">&gt;</span><br /><span class="sym">&lt;/</span>rss<span class="sym">&gt;</span><br />EOC<br /><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-6602213864301557321?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/04/ejercicio-t823.htmlBloque T2.7 Ejercicio 1http://pakitochusaap.blogspot.com/2009/03/bloque-t27-ejercicio-1.htmlComprobado con un par de Feeds que me he descargado. No sé si funcionará online. <br /><br /><pre class="hl"><span class="slc">#!/usr/bin/ruby</span><br /><br />require <span class="str">'rss/1.0'</span><br />require <span class="str">'rss/2.0'</span><br /><br />documento = <span class="kwc">ARGV</span><span class="sym">[</span><span class="num">0</span><span class="sym">]</span><br />file = File<span class="sym">.</span><span class="kwd">new</span><span class="sym">(</span>documento)<br />rss = RSS<span class="sym">::</span>Parser<span class="sym">.</span><span class="kwd">parse</span><span class="sym">(</span>file<span class="sym">,</span> <span class="kwa">false</span>)<br />rss<span class="sym">.</span>channel<span class="sym">.</span>items<span class="sym">.</span>each <span class="kwa">do</span> <span class="sym">|</span>i<span class="sym">|</span><br /> puts <span class="str">&quot;*&quot;</span> <span class="sym">+</span> i<span class="sym">.</span>title<br /> puts <span class="str">&quot;</span><span class="esc">\t</span><span class="str">&quot;</span> <span class="sym">+</span> i<span class="sym">.</span>pubDate<span class="sym">.</span>to_s <span class="sym">+</span> <span class="str">&quot;</span><span class="esc">\n</span><span class="str">&quot;</span><br /><span class="kwa">end</span><br /><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-741596126054406975?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/bloque-t27-ejercicio-1.htmlBloque T2.5 Ejercicio 1http://pakitochusaap.blogspot.com/2009/03/bloque-t25-ejercicio-1.htmlCon este programa he conseguido que se muestre "habitacion: "+ nombre de habitacion y tipo de habitacion. <br /><br /><pre class="hl"><span class="slc">#!/usr/bin/ruby</span><br /><br />require <span class="str">'rexml/document'</span><br />include REXML<br />documento = <span class="kwc">ARGV</span><span class="sym">[</span><span class="num">0</span><span class="sym">]</span><br />file = File<span class="sym">.</span><span class="kwd">new</span><span class="sym">(</span>documento)<br />doc = Document<span class="sym">.</span><span class="kwd">new</span><span class="sym">(</span>file)<br />doc<span class="sym">.</span>root<span class="sym">.</span><span class="kwd">each_element</span><span class="sym">(</span><span class="str">'habitacion'</span>) <span class="sym">{ |</span>h<span class="sym">|</span> <span class="slc">#Bucle sobre las habitaciones</span><br /> puts <span class="str">&quot;Habitacion: &quot;</span><br /> <span class="sym">(</span>puts h<span class="sym">.</span><span class="kwd">attribute</span><span class="sym">(</span><span class="str">'id'</span>)) <span class="sym">|| (</span>puts h<span class="sym">.</span><span class="kwd">attribute</span><span class="sym">(</span><span class="str">'tipo'</span>))<br /> puts <span class="str">&quot;</span><span class="esc">\n</span><span class="str">&quot;</span><br /><span class="sym">}</span><br /></pre><br /><br />Este es el XML que usé. <br /><pre class="hl"><span class="kwa">&lt;?xml version=</span><span class="str">&quot;1.0&quot;</span><span class="kwa"> encoding=</span><span class="str">&quot;iso-8859-1&quot;</span><span class="kwa">?&gt;</span><br /><span class="com">&lt;!-- Descripci�n de los elementos de una casa so�ada --&gt;</span><br /><span class="kwa">&lt;micasa&gt;</span><br /> <span class="kwa">&lt;habitacion id=</span><span class="str">&quot;comedor&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;mueble&gt;</span>aparador<span class="kwa">&lt;/mueble&gt;</span><br /> <span class="kwa">&lt;mueble&gt;</span>sof� <span class="kwb">&amp;quot;</span>de �poca<span class="kwb">&amp;quot;</span><span class="kwa">&lt;/mueble&gt;</span><br /> <span class="kwa">&lt;/habitacion&gt;</span><br /> <span class="kwa">&lt;habitacion id=</span><span class="str">&quot;cocina&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;mueble&gt;</span><span class="kwa">&lt;![CDATA[</span><br /><span class="kwa">&lt;p&gt;</span>En la pared de la derecha hay un frigor�fico<br /><span class="kwa">&lt;p&gt;</span>Y en la de la izquierda, s�lo mugre<br /> ]]&gt;<span class="kwa">&lt;/mueble&gt;</span><br /> <span class="kwa">&lt;mueble&gt;</span>fregadero<span class="kwa">&lt;/mueble&gt;</span><br /> <span class="kwa">&lt;/habitacion&gt;</span><br /> <span class="kwa">&lt;habitacion tipo='dormir'&gt;</span><span class="kwa">&lt;mueble&gt;</span>Cama<span class="kwa">&lt;/mueble&gt;</span><span class="kwa">&lt;/habitacion&gt;</span><br /> <span class="kwa">&lt;habitacion tipo='transdimensional'&gt;</span><span class="kwa">&lt;mueble&gt;</span>armario<span class="kwa">&lt;habitacion&gt;</span><span class="kwa">&lt;mueble&gt;</span>Sillon de hielo de la reina mala <span class="kwa">&lt;/mueble&gt;</span><span class="kwa">&lt;/habitacion&gt;</span><span class="kwa">&lt;/mueble&gt;</span><span class="kwa">&lt;/habitacion&gt;</span><br /><br /><span class="kwa">&lt;/micasa&gt;</span><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-4527096707486660188?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/bloque-t25-ejercicio-1.htmlBloque T2.4 Ejercicio 1http://pakitochusaap.blogspot.com/2009/03/t24-ejercicio-1.htmlXML Schema (XSD):<br /><pre class="hl"><span class="kwa">&lt;?xml version=</span><span class="str">&quot;1.0&quot;</span><span class="kwa"> encoding=</span><span class="str">&quot;UTF-8&quot;</span><span class="kwa">?&gt;</span><br /><span class="kwa">&lt;xs:schema xmlns:xs=</span><span class="str">&quot;http://www.w3.org/2001/XMLSchema&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;xs:element name=</span><span class="str">&quot;partido&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;xs:complexType mixed=</span><span class="str">&quot;true&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;xs:attribute name=</span><span class="str">&quot;local&quot;</span><span class="kwa"> type=</span><span class="str">&quot;xs:NMTOKEN&quot;</span><span class="kwa"> use=</span><span class="str">&quot;required&quot;</span><span class="kwa"> /&gt;</span><br /> <span class="kwa">&lt;xs:attribute name=</span><span class="str">&quot;visitante&quot;</span><span class="kwa"> type=</span><span class="str">&quot;xs:NMTOKEN&quot;</span><span class="kwa"> use=</span><span class="str">&quot;required&quot;</span><span class="kwa"> /&gt;</span><br /> <span class="kwa">&lt;xs:attribute name=</span><span class="str">&quot;id&quot;</span><span class="kwa"> type=</span><span class="str">&quot;xs:ID&quot;</span><span class="kwa"> use=</span><span class="str">&quot;required&quot;</span><span class="kwa"> /&gt;</span><br /> <span class="kwa">&lt;/xs:complexType&gt;</span><br /> <span class="kwa">&lt;/xs:element&gt;</span><br /><br /> <span class="kwa">&lt;xs:element name=</span><span class="str">&quot;quiniela&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;xs:complexType&gt;</span><br /> <span class="kwa">&lt;xs:sequence&gt;</span><br /> <span class="kwa">&lt;xs:element ref=</span><span class="str">&quot;partido&quot;</span><span class="kwa"> maxOccurs=</span><span class="str">&quot;15&quot;</span><span class="kwa"> /&gt;</span><br /> <span class="kwa">&lt;/xs:sequence&gt;</span><br /> <span class="kwa">&lt;xs:attribute name=</span><span class="str">&quot;fecha&quot;</span><span class="kwa"> type=</span><span class="str">&quot;xs:string&quot;</span><span class="kwa"> use=</span><span class="str">&quot;required&quot;</span><span class="kwa"> /&gt;</span><br /> <span class="kwa">&lt;xs:attribute name=</span><span class="str">&quot;id&quot;</span><span class="kwa"> type=</span><span class="str">&quot;xs:NMTOKEN&quot;</span><span class="kwa"> use=</span><span class="str">&quot;required&quot;</span><span class="kwa"> /&gt;</span><br /> <span class="kwa">&lt;/xs:complexType&gt;</span><br /> <span class="kwa">&lt;/xs:element&gt;</span><br /><span class="kwa">&lt;/xs:schema&gt;</span><br /></pre><br /><br /><br />Archivo XML:<br /><br /><pre class="hl"><span class="kwa">&lt;?xml version=</span><span class="str">&quot;1.0&quot;</span><span class="kwa"> encoding=</span><span class="str">&quot;UTF-8&quot;</span><span class="kwa">?&gt;</span><br /><span class="kwa">&lt;quiniela id=</span><span class="str">&quot;1&quot;</span><span class="kwa"> xmlns:noNamespacesSchemaLocation=</span><span class="str">&quot;quiniela.xsd&quot;</span><span class="kwa"> fecha=</span><span class="str">&quot;27/03/2009&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P1&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_A&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_B&quot;</span><span class="kwa">&gt;</span><span class="num">1</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P2&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_C&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_D&quot;</span><span class="kwa">&gt;</span><span class="num">2</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P3&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_E&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_F&quot;</span><span class="kwa">&gt;</span><span class="num">1</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P4&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_G&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_H&quot;</span><span class="kwa">&gt;</span><span class="num">2</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P5&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_I&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_J&quot;</span><span class="kwa">&gt;</span>X<span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P6&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_K&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_L&quot;</span><span class="kwa">&gt;</span>X<span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P7&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_M&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_N&quot;</span><span class="kwa">&gt;</span><span class="num">1</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P8&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_O&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_P&quot;</span><span class="kwa">&gt;</span><span class="num">2</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P9&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_Q&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_R&quot;</span><span class="kwa">&gt;</span><span class="num">2</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P10&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_S&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_T&quot;</span><span class="kwa">&gt;</span><span class="num">2</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P11&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_U&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_V&quot;</span><span class="kwa">&gt;</span><span class="num">1</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P12&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_W&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_X&quot;</span><span class="kwa">&gt;</span><span class="num">1</span><span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P13&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_Y&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_Z&quot;</span><span class="kwa">&gt;</span>X<span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P14&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_1&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_2&quot;</span><span class="kwa">&gt;</span>X<span class="kwa">&lt;/partido&gt;</span><br /> <span class="kwa">&lt;partido id=</span><span class="str">&quot;P15&quot;</span><span class="kwa"> local=</span><span class="str">&quot;equipo_3&quot;</span><span class="kwa"> visitante=</span><span class="str">&quot;equipo_4&quot;</span><span class="kwa">&gt;</span>X<span class="kwa">&lt;/partido&gt;</span><br /><span class="kwa">&lt;/quiniela&gt;</span><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-5191346600840917457?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/t24-ejercicio-1.htmlBloque T2.2.3http://pakitochusaap.blogspot.com/2009/03/bloque-t223.htmlBueno, vemos el espacio de nombres para nuestro equipo clásico (nunca mejor dicho).<br /><br /><pre class="hl"><span class="kwa">&lt;eq:equipo xmlns:eq='http://www.lfp.com/equipo' id=</span><span class="str">&quot;Atenas C.F&quot;</span><span class="kwa"> xmlns:plan='http://www.lfp.com/plantilla'&gt;</span><br /> <span class="kwa">&lt;eq:entrenador&gt;</span>Pericles<span class="kwa">&lt;/eq:entrenador&gt;</span><br /> <span class="kwa">&lt;eq:presidente&gt;</span>Leonidas<span class="kwa">&lt;/eq:presidente&gt;</span><br /> <span class="kwa">&lt;eq:plantilla_titular&gt;</span><br /> <span class="kwa">&lt;plan:jugador posicion=</span><span class="str">&quot;portero&quot;</span><span class="kwa">&gt;</span>Socrates<span class="kwa">&lt;/eq:jugador&gt;</span><br /> <span class="kwa">&lt;plan:jugador posicion=</span><span class="str">&quot;defensa&quot;</span><span class="kwa">&gt;</span>Empedocles<span class="kwa">&lt;/eq:jugador&gt;</span><br /> <span class="kwa">&lt;plan:jugador posicion=</span><span class="str">&quot;centro&quot;</span><span class="kwa">&gt;</span>Aristofanes<span class="kwa">&lt;/eq:jugador&gt;</span><br /> <span class="kwa">&lt;plan:jugador posicion=</span><span class="str">&quot;mediapunta&quot;</span><span class="kwa">&gt;</span>Aristoteles<span class="kwa">&lt;/eq:jugador&gt;</span><br /> <span class="kwa">&lt;plan:jugador posicion=</span><span class="str">&quot;delantero&quot;</span><span class="kwa">&gt;</span>Platon<span class="kwa">&lt;/eq:jugador&gt;</span><br /> <span class="kwa">&lt;/eq:plantilla_titular&gt;</span><br /> <span class="kwa">&lt;eq:plantilla_suplente&gt;</span><br /> <span class="kwa">&lt;plan:jugador posicion=</span><span class="str">&quot;defensa&quot;</span><span class="kwa">&gt;</span>Diogenes<span class="kwa">&lt;/eq:jugador&gt;</span><br /> <span class="kwa">&lt;plan:jugador posicion=</span><span class="str">&quot;delantero&quot;</span><span class="kwa">&gt;</span>Pitagoras<span class="kwa">&lt;/eq:jugador&gt;</span><br /> <span class="kwa">&lt;/eq:plantilla_suplente&gt;</span><br /><span class="kwa">&lt;/eq:equipo&gt;</span><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-3637194391195713849?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/bloque-t223.htmlBloque T2.2.2http://pakitochusaap.blogspot.com/2009/03/bloque-t222.html<p>Bueno, y esta vez, como siempre, barremos pa' casa. En lugar de hacer el XML que se pide sobre libros, he decidido hacerlo acerca de los discos de mi grupo (¡Cómo no!). Al fin y al cabo son publicaciones de un estilo similar, aunque con vistas a posterior implementación real he incluido muchísima más información de la que normalmente incluiría si fuera sólo un ejercicio.</p><p>Para ver como va funcionando, <a href="http://pachus.animaadversa.es/musica/discos.html?disc=gritocielo">aquí</a>.<br /></p><br /><pre class="hl"><span class="hl kwa"><br />&lt;?xml</span> <span class="hl kwb">version</span>=<span class="hl str">"1.0"</span> <span class="hl kwb">encoding</span>=<span class="hl str">"iso-8859-1"</span><span class="hl kwa">?&gt;</span><br /><span class="hl com">&lt;!-- Plantilla Discos por Pakitochus --&gt;</span><br /><span class="hl kwa">&lt;disco&gt;</span><br /><span class="hl kwa">&lt;titulo&gt;</span> El Otro Yo <span class="hl kwa">&lt;/titulo&gt;</span><br /><span class="hl kwa">&lt;fecha&gt;</span> <span class="hl num">2007</span> <span class="hl kwa">&lt;/fecha&gt;</span><br /><span class="hl kwa">&lt;descarga</span> <span class="hl kwb">href</span>=<span class="hl str">"http://www.megaupload.com/es/?d=SFG94C0C"</span> <span class="hl kwa">/&gt;</span><br /><span class="hl kwa">&lt;datos_tecnicos&gt;</span><br /> <span class="hl kwa">&lt;productor&gt;</span>Anima Adversa<span class="hl kwa">&lt;/productor&gt;</span><br /> <span class="hl kwa">&lt;musica&gt;</span>Anima Adversa<span class="hl kwa">&lt;/musica&gt;</span><br /> <span class="hl kwa">&lt;graficas&gt;</span>Angeles Muñoz<span class="hl kwa">&lt;/graficas&gt;</span><br /> <span class="hl kwa">&lt;colaboraciones&gt;</span><br /> <span class="hl kwa">&lt;colaborador&gt;</span>Antonio J. Jimenez<span class="hl kwa">&lt;/colaborador&gt;</span><br /> <span class="hl kwa">&lt;colaborador&gt;</span>Santi Dominguez<span class="hl kwa">&lt;/colaborador&gt;</span><br /> <span class="hl kwa">&lt;colaborador&gt;</span>Guillermo Vázquez<span class="hl kwa">&lt;/colaborador&gt;</span><br /> <span class="hl kwa">&lt;/colaboraciones&gt;</span><br /> <span class="hl kwa">&lt;detalles&gt;</span>Grabado entre Octubre de <span class="hl num">2006</span> y Enero de <span class="hl num">2007</span> en la escuela de Rock <span class="hl str">"La Chana Blue"</span> de granada.<span class="hl kwa">&lt;/detalles&gt;</span><br /><span class="hl kwa">&lt;/datos_tecnicos&gt;</span><br /><span class="hl kwa">&lt;artwork&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"portada_oy.jpg"</span><span class="hl kwa">&gt;</span>Portada<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"inlay_oy.jpg"</span><span class="hl kwa">&gt;</span>Inlay<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"libreto_oy.jpg"</span><span class="hl kwa">&gt;</span>Libreto<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"galleta_oy.jpg"</span><span class="hl kwa">&gt;</span>Galleta<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"ilustracion_oy.jpg"</span><span class="hl kwa">&gt;</span>Ilustracion<span class="hl kwa">&lt;/art&gt;</span><br /><span class="hl kwa">&lt;/artwork&gt;</span><br /><span class="hl kwa">&lt;tracklist&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"1"</span> <span class="hl kwb">letra</span>=<span class="hl str">"1"</span><span class="hl kwa">&gt;</span>Uno Para Despertar<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"2"</span> <span class="hl kwb">letra</span>=<span class="hl str">"2"</span><span class="hl kwa">&gt;</span>El Cuervo<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"3"</span> <span class="hl kwb">letra</span>=<span class="hl str">"3"</span><span class="hl kwa">&gt;</span>Princesa del Desierto<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"4"</span> <span class="hl kwb">letra</span>=<span class="hl str">"4"</span><span class="hl kwa">&gt;</span>En tus Brazos<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"5"</span> <span class="hl kwb">letra</span>=<span class="hl str">"5"</span><span class="hl kwa">&gt;</span>Lágrimas de Eternidad<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"6"</span> <span class="hl kwb">letra</span>=<span class="hl str">"7"</span><span class="hl kwa">&gt;</span>Hell's Kitchen<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"7"</span> <span class="hl kwb">letra</span>=<span class="hl str">"10"</span><span class="hl kwa">&gt;</span>Alter Ego<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"8"</span> <span class="hl kwb">letra</span>=<span class="hl str">"9"</span><span class="hl kwa">&gt;</span>Gamonal<span class="hl kwa">&lt;/track&gt;</span><br /><span class="hl kwa">&lt;/traclist&gt;</span><br /><span class="hl kwa">&lt;legal&gt;</span><br /> <span class="hl kwa">&lt;licencia</span> <span class="hl kwb">ref</span>=<span class="hl str">"http://creativecommons.org/licenses/by-nc-nd/2.5/es/legalcode.es"</span><span class="hl kwa">&gt;</span>Creative Commons BY-NC-ND <span class="hl num">2.5</span><span class="hl kwa">&lt;/licencia&gt;</span><br /> <span class="hl kwa">&lt;registro</span> <span class="hl kwb">ref</span>=<span class="hl str">"http://images.safecreative.org/work/0811171595819/label/barcode-150"</span> <span class="hl kwa">/&gt;</span><br /><span class="hl kwa">&lt;/legal&gt;</span><br /><span class="hl kwa">&lt;/disco&gt;</span><br /><br /><span class="hl kwa">&lt;disco&gt;</span><br /><span class="hl kwa">&lt;titulo&gt;</span> El Grito en el Cielo <span class="hl kwa">&lt;/titulo&gt;</span><br /><span class="hl kwa">&lt;fecha&gt;</span> <span class="hl num">2009</span> <span class="hl kwa">&lt;/fecha&gt;</span><br /><span class="hl kwa">&lt;descarga</span> <span class="hl kwb">href</span>=<span class="hl str">"http://www.safecreative.org/work-view.shtml?cid=34909&amp;actionMethod=work-view.xhtml%3AworkHome.workDownload&amp;id=64769"</span> <span class="hl kwa">/&gt;</span><br /><span class="hl kwa">&lt;datos_tecnicos&gt;</span><br /> <span class="hl kwa">&lt;productor&gt;</span>David F. Castro<span class="hl kwa">&lt;/productor&gt;</span><br /> <span class="hl kwa">&lt;productor&gt;</span>Anima Adversa<span class="hl kwa">&lt;/productor&gt;</span><br /> <span class="hl kwa">&lt;musica&gt;</span>Anima Adversa<span class="hl kwa">&lt;/musica&gt;</span><br /> <span class="hl kwa">&lt;graficas&gt;</span>Felix de la Fuente<span class="hl kwa">&lt;/graficas&gt;</span><br /> <span class="hl kwa">&lt;colaboraciones&gt;</span><br /> <span class="hl kwa">&lt;colaborador&gt;</span>Rocio Garcia<span class="hl kwa">&lt;/colaborador&gt;</span><br /> <span class="hl kwa">&lt;colaborador&gt;</span>Chema Lapuente<span class="hl kwa">&lt;/colaborador&gt;</span><br /> <span class="hl kwa">&lt;colaborador&gt;</span>Fran Suarez<span class="hl kwa">&lt;/colaborador&gt;</span><br /> <span class="hl kwa">&lt;colaborador&gt;</span>David Castro<span class="hl kwa">&lt;/colaborador&gt;</span><br /> <span class="hl kwa">&lt;/colaboraciones&gt;</span><br /> <span class="hl kwa">&lt;detalles&gt;</span>Grabado entre Octubre de <span class="hl num">2008</span> y Enero de <span class="hl num">2009</span> en los estudios BomTrack de Úbeda, bajo la dirección de David F. Castro.<span class="hl kwa">&lt;/detalles&gt;</span><br /><span class="hl kwa">&lt;/datos_tecnicos&gt;</span><br /><span class="hl kwa">&lt;artwork&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"portada_gc.jpg"</span><span class="hl kwa">&gt;</span>Portada<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"inlay_gc.jpg"</span><span class="hl kwa">&gt;</span>Inlay<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"libreto_gc.jpg"</span><span class="hl kwa">&gt;</span>Libreto<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"galleta_gc.jpg"</span><span class="hl kwa">&gt;</span>Galleta<span class="hl kwa">&lt;/art&gt;</span><br /> <span class="hl kwa">&lt;art</span> <span class="hl kwb">id</span>=<span class="hl str">"ilustracion_gc.jpg"</span><span class="hl kwa">&gt;</span>Ilustracion<span class="hl kwa">&lt;/art&gt;</span><br /><span class="hl kwa">&lt;/artwork&gt;</span><br /><span class="hl kwa">&lt;tracklist&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"1"</span> <span class="hl kwb">letra</span>=<span class="hl str">"13"</span><span class="hl kwa">&gt;</span>Condena<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"2"</span> <span class="hl kwb">letra</span>=<span class="hl str">"14"</span><span class="hl kwa">&gt;</span>Sisyphos<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"3"</span> <span class="hl kwb">letra</span>=<span class="hl str">"15"</span><span class="hl kwa">&gt;</span>El Hombre Terminal<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"4"</span> <span class="hl kwb">letra</span>=<span class="hl str">"16"</span><span class="hl kwa">&gt;</span>Liberacion<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"5"</span> <span class="hl kwb">letra</span>=<span class="hl str">"17"</span><span class="hl kwa">&gt;</span>Nautilus<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"6"</span> <span class="hl kwb">letra</span>=<span class="hl str">"18"</span><span class="hl kwa">&gt;</span>Todo Quedara Asi<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"7"</span> <span class="hl kwb">letra</span>=<span class="hl str">"19"</span><span class="hl kwa">&gt;</span>Que Nada os Detenga<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"8"</span> <span class="hl kwb">letra</span>=<span class="hl str">"20"</span><span class="hl kwa">&gt;</span>Al Abordaje<span class="hl kwa">&lt;/track&gt;</span><br /> <span class="hl kwa">&lt;track</span> <span class="hl kwb">num</span>=<span class="hl str">"9"</span> <span class="hl kwb">letra</span>=<span class="hl str">"21"</span><span class="hl kwa">&gt;</span>El Disfraz de la Mariposa<span class="hl kwa">&lt;/track&gt;</span><br /><span class="hl kwa">&lt;/tracklist&gt;</span><br /><span class="hl kwa">&lt;legal&gt;</span><br /> <span class="hl kwa">&lt;licencia</span> <span class="hl kwb">ref</span>=<span class="hl str">"http://creativecommons.org/licenses/by-nc-nd/2.5/es/legalcode.es"</span><span class="hl kwa">&gt;</span>Creative Commons BY-NC-ND <span class="hl num">2.5</span><span class="hl kwa">&lt;/licencia&gt;</span><br /> <span class="hl kwa">&lt;registro</span> <span class="hl kwb">ref</span>=<span class="hl str">"http://images.safecreative.org/work/0901212445354/label/barcode-150"</span> <span class="hl kwa">/&gt;</span><br /><span class="hl kwa">&lt;/legal&gt;</span><br /><span class="hl kwa">&lt;/disco&gt;</span><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-4107448976008640386?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/bloque-t222.htmlBloque T2.2.1http://pakitochusaap.blogspot.com/2009/03/bloque-t221.html<pre class="hl"><span class="kwa">&lt;?xml version=</span><span class="str">&quot;1.0&quot;</span><span class="kwa"> encoding=</span><span class="str">&quot;ISO-8859-1&quot;</span><span class="kwa">?&gt;</span><br /><span class="kwa">&lt;equipo id=</span><span class="str">&quot;Atenas C.F.&quot;</span><span class="kwa">&gt;</span><br /> <span class="kwa">&lt;entrenador&gt;</span>Pericles<span class="kwa">&lt;/entrenador&gt;</span><br /> <span class="kwa">&lt;lista_jugadores&gt;</span><br /> <span class="kwa">&lt;jugador posicion=</span><span class="str">&quot;portero&quot;</span><span class="kwa">&gt;</span>Socrates<span class="kwa">&lt;/jugador&gt;</span><br /> <span class="kwa">&lt;jugador posicion=</span><span class="str">&quot;defensa&quot;</span><span class="kwa">&gt;</span>Empedocles<span class="kwa">&lt;/jugador&gt;</span><br /> <span class="kwa">&lt;jugador posicion=</span><span class="str">&quot;defensa&quot;</span><span class="kwa">&gt;</span>Diogenes<span class="kwa">&lt;/jugador&gt;</span><br /> <span class="kwa">&lt;jugador posicion=</span><span class="str">&quot;centro&quot;</span><span class="kwa">&gt;</span>Aristofanes<span class="kwa">&lt;/jugador&gt;</span><br /> <span class="kwa">&lt;jugador posicion=</span><span class="str">&quot;mediapunta&quot;</span><span class="kwa">&gt;</span>Aristoteles<span class="kwa">&lt;/jugador&gt;</span><br /> <span class="kwa">&lt;jugador posicion=</span><span class="str">&quot;delantero&quot;</span><span class="kwa">&gt;</span>Pitagoras<span class="kwa">&lt;/jugador&gt;</span><br /> <span class="kwa">&lt;jugador posicion=</span><span class="str">&quot;delantero&quot;</span><span class="kwa">&gt;</span>Platon<span class="kwa">&lt;/jugador&gt;</span><br /> <span class="kwa">&lt;/lista_jugadores&gt;</span><br /><span class="kwa">&lt;/equipo&gt;</span><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-1673027933597932496?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/bloque-t221.htmlPractica 2http://pakitochusaap.blogspot.com/2009/03/practica-2.html<p>El ejemplo funcionando lo podéis encontrar <a href="http://pachus.animaadversa.es/noticias.html">aqui</a>.</p><br /><br /><pre class="hl"> <span class="slc">// Definición de la clase noticia</span><br /> <span class="kwa">function</span> <span class="kwd">noticia</span><span class="sym">(</span><span class="kwc">title</span><span class="sym">,</span> descrip<span class="sym">,</span> fech<span class="sym">,</span> enlac<span class="sym">){</span><br /> <span class="kwa">this</span><span class="sym">.</span>titulo<span class="sym">=</span><span class="kwc">title</span><span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span>descripcion<span class="sym">=</span>descrip<span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span>fecha<span class="sym">=</span>fech<span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span>enlace<span class="sym">=</span>enlac<span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span>setNoticia<span class="sym">=</span>setNoticia<span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span><span class="kwc">toString</span><span class="sym">=</span><span class="kwc">toString</span><span class="sym">;</span><br /> <span class="sym">}</span><br /><br /> <span class="slc">//Establece una noticia nueva.</span><br /> <span class="kwa">function</span> <span class="kwd">setNoticia</span><span class="sym">(</span>tit<span class="sym">,</span> desc<span class="sym">,</span> fec<span class="sym">,</span> enl<span class="sym">){</span><br /> <span class="kwa">this</span><span class="sym">.</span>titulo <span class="sym">=</span> tit<span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span>descripcion <span class="sym">=</span> desc<span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span>fecha <span class="sym">=</span> fec<span class="sym">;</span><br /> <span class="kwa">this</span><span class="sym">.</span>enlace <span class="sym">=</span> enl<span class="sym">;</span><br /> <span class="sym">}</span><br /><br /> <span class="slc">//Muestra el contenido de la noticia en HTML</span><br /> <span class="kwa">function</span> <span class="kwc">toString</span><span class="sym">() {</span><br /> <span class="kwa">return</span> <span class="str">&quot;&lt;h1&gt;&quot;</span> <span class="sym">+</span> <span class="kwa">this</span><span class="sym">.</span>titulo<span class="sym">.</span><span class="kwc">toString</span><span class="sym">() +</span> <span class="str">&quot;&lt;/h1&gt;&lt;h5&gt;&quot;</span><span class="sym">+</span> <span class="kwa">this</span><span class="sym">.</span>fecha <span class="sym">+</span><span class="str">&quot;&lt;/h5&gt;&lt;h4&gt;&quot;</span><span class="sym">+</span> <span class="kwa">this</span><span class="sym">.</span>descripcion <span class="sym">+</span><span class="str">&quot;&lt;/h4&gt;&lt;p&gt;&lt;a href='&quot;</span><span class="sym">+</span><span class="kwa">this</span><span class="sym">.</span>enlace<span class="sym">+</span><span class="str">&quot;' target='_blank'&gt;Leer mas&lt;/a&gt;&lt;br&gt;&lt;br&gt;&quot;</span><span class="sym">;</span><br /> <span class="sym">}</span><br /><br /> <span class="com">/**Script importado desde http://www.jr.pl/www.quirksmode.org/dom/importxml.html*/</span><br /> <span class="kwa">function</span> <span class="kwd">importXML</span><span class="sym">(){</span><br /> <span class="slc">//Si el navegador dispone de la estructura de Mozilla,</span><br /> <span class="kwa">if</span> <span class="sym">(</span><span class="kwc">document</span><span class="sym">.</span>implementation <span class="sym">&amp;&amp;</span> <span class="kwc">document</span><span class="sym">.</span>implementation<span class="sym">.</span>createDocument<span class="sym">){</span><br /> xmlDoc <span class="sym">=</span> <span class="kwc">document</span><span class="sym">.</span>implementation<span class="sym">.</span><span class="kwd">createDocument</span><span class="sym">(</span><span class="str">&quot;&quot;</span><span class="sym">,</span> <span class="str">&quot;&quot;</span><span class="sym">,</span> <span class="kwa">null</span><span class="sym">);</span><br /> xmlDoc<span class="sym">.</span><span class="kwc">onload</span> <span class="sym">=</span> mostrarNoticias<span class="sym">;</span><br /> <span class="sym">}</span><br /> <span class="slc">//Si estamos en internet Explorer.</span><br /> <span class="kwa">else if</span> <span class="sym">(</span><span class="kwc">window</span><span class="sym">.</span>ActiveXObject<span class="sym">){</span><br /> xmlDoc <span class="sym">=</span> <span class="kwa">new</span> <span class="kwd">ActiveXObject</span><span class="sym">(</span><span class="str">&quot;Microsoft.XMLDOM&quot;</span><span class="sym">);</span><br /> xmlDoc<span class="sym">.</span>onreadystatechange <span class="sym">=</span> <span class="kwa">function</span> <span class="sym">() {</span><br /> <span class="kwa">if</span> <span class="sym">(</span>xmlDoc<span class="sym">.</span>readyState <span class="sym">==</span> <span class="num">4</span><span class="sym">)</span> <span class="kwd">mostrarNoticias</span><span class="sym">()</span><br /> <span class="sym">};</span><br /> <span class="sym">}</span><br /> <span class="kwa">else</span><span class="sym">{</span><br /> <span class="kwc">alert</span><span class="sym">(</span><span class="str">'Your browser can</span><span class="esc">\'</span><span class="str">t handle this script'</span><span class="sym">);</span><br /> <span class="kwa">return</span><span class="sym">;</span><br /> <span class="sym">}</span><br /> xmlDoc<span class="sym">.</span><span class="kwd">load</span><span class="sym">(</span><span class="str">&quot;rssfeed.xml&quot;</span><span class="sym">);</span><br /> <span class="sym">}</span><br /><br /> <span class="slc">//Esta función carga todas las noticias desde el</span><br /> <span class="kwa">function</span> <span class="kwd">mostrarNoticias</span><span class="sym">(){</span><br /> <span class="kwa">var</span> oyetu<span class="sym">=</span><span class="kwa">new</span> <span class="kwd">noticia</span><span class="sym">(</span><span class="str">&quot;prueba&quot;</span><span class="sym">,</span> <span class="str">&quot;perfect&quot;</span><span class="sym">,</span> <span class="str">&quot;13&quot;</span><span class="sym">,</span> <span class="str">&quot;http://www.animaadversa.es&quot;</span><span class="sym">);</span><br /><br /> <span class="slc">//Extraemos los objetos items.</span><br /> <span class="kwa">var</span> items <span class="sym">=</span> xmlDoc<span class="sym">.</span><span class="kwd">getElementsByTagName</span><span class="sym">(</span><span class="str">'item'</span><span class="sym">);</span><br /> <span class="slc">//Creamos el componente de lista desordenada</span><br /> <span class="kwa">var</span> ul <span class="sym">=</span> <span class="kwc">document</span><span class="sym">.</span><span class="kwd">createElement</span><span class="sym">(</span><span class="str">'UL'</span><span class="sym">);</span><br /><br /> <span class="slc">//Y hacemos la conversión a HTML</span><br /> <span class="kwa">for</span><span class="sym">(</span><span class="kwa">var</span> i<span class="sym">=</span><span class="num">0</span><span class="sym">;</span> i<span class="sym">&lt;</span>items<span class="sym">.</span><span class="kwc">length</span><span class="sym">;</span>i<span class="sym">++){</span><br /> <span class="slc">//Los textos que vamos a incluir, dentro de la lista</span><br /> <span class="kwa">var</span> container <span class="sym">=</span> <span class="kwc">document</span><span class="sym">.</span><span class="kwd">createElement</span><span class="sym">(</span><span class="str">'LI'</span><span class="sym">);</span><br /> <span class="kwa">var</span> array<span class="sym">=</span><span class="kwa">new</span> <span class="kwc">Array</span><span class="sym">();</span><span class="slc">//un array con 0.- titulo, 1.- desc, 3.- link, 4.- fecha</span><br /> <span class="kwa">for</span> <span class="sym">(</span><span class="kwa">var</span> j<span class="sym">=</span><span class="num">0</span><span class="sym">;</span> j<span class="sym">&lt;</span>items<span class="sym">[</span>i<span class="sym">].</span>childNodes<span class="sym">.</span><span class="kwc">length</span><span class="sym">/</span><span class="num">2</span><span class="sym">-</span><span class="num">1</span><span class="sym">;</span> j<span class="sym">++){</span><br /> array<span class="sym">[</span>j<span class="sym">] =</span> items<span class="sym">[</span>i<span class="sym">].</span>childNodes<span class="sym">[</span><span class="num">2</span><span class="sym">*</span>j<span class="sym">+</span><span class="num">1</span><span class="sym">].</span>firstChild<span class="sym">.</span>textContent<span class="sym">;</span><br /> <span class="sym">}</span><br /> oyetu<span class="sym">.</span><span class="kwd">setNoticia</span><span class="sym">(</span>array<span class="sym">[</span><span class="num">0</span><span class="sym">]+</span><span class="str">&quot; &quot;</span><span class="sym">,</span> array<span class="sym">[</span><span class="num">1</span><span class="sym">]+</span><span class="str">&quot; &quot;</span><span class="sym">,</span> array<span class="sym">[</span><span class="num">4</span><span class="sym">]+</span><span class="str">&quot; &quot;</span><span class="sym">,</span> array<span class="sym">[</span><span class="num">3</span><span class="sym">]+</span><span class="str">&quot; &quot;</span><span class="sym">);</span><br /> <span class="kwa">var</span> htmlamostrar <span class="sym">=</span>oyetu<span class="sym">.</span><span class="kwc">toString</span><span class="sym">();</span><br /> container<span class="sym">.</span><span class="kwc">innerHTML</span><span class="sym">=(</span>htmlamostrar<span class="sym">);</span><br /> ul<span class="sym">.</span><span class="kwd">appendChild</span><span class="sym">(</span>container<span class="sym">);</span><br /> <span class="sym">}</span><br /> <span class="kwc">document</span><span class="sym">.</span><span class="kwc">getElementById</span><span class="sym">(</span><span class="str">&quot;sections&quot;</span><span class="sym">).</span><span class="kwd">appendChild</span><span class="sym">(</span>ul<span class="sym">);</span><br /><br /> <span class="kwd">iniciarjQuery</span><span class="sym">();</span><br /> <span class="sym">}</span><br /><br /> <span class="slc">//Funcion para iniciar el plugin de jQuery SerialScroll, de ARiel Flesler</span><br /> <span class="kwa">function</span> <span class="kwd">iniciarjQuery</span><span class="sym">(){</span><br /> $<span class="sym">(</span><span class="str">'#screen'</span><span class="sym">).</span><span class="kwd">serialScroll</span><span class="sym">({</span><br /> <span class="kwc">target</span><span class="sym">:</span><span class="str">'#sections'</span><span class="sym">,</span><br /> items<span class="sym">:</span><span class="str">'li'</span><span class="sym">,</span><br /> prev<span class="sym">:</span><span class="str">'img.prev'</span><span class="sym">,</span><br /> <span class="kwc">next</span><span class="sym">:</span><span class="str">'img.next'</span><span class="sym">,</span><br /> axis<span class="sym">:</span><span class="str">'xy'</span><span class="sym">,</span><br /> navigation<span class="sym">:</span><span class="str">'#navigation li a'</span><span class="sym">,</span><br /> duration<span class="sym">:</span><span class="num">700</span><span class="sym">,</span><br /> force<span class="sym">:</span><span class="kwa">true</span><span class="sym">,</span><br /> onBefore<span class="sym">:</span><span class="kwa">function</span><span class="sym">(</span> e<span class="sym">,</span> elem<span class="sym">,</span> $pane<span class="sym">,</span> $items<span class="sym">,</span> pos <span class="sym">){</span><br /> e<span class="sym">.</span><span class="kwd">preventDefault</span><span class="sym">();</span><span class="kwa">if</span><span class="sym">(</span> <span class="kwa">this</span><span class="sym">.</span><span class="kwc">blur</span> <span class="sym">)</span><span class="kwa">this</span><span class="sym">.</span><span class="kwc">blur</span><span class="sym">();</span><br /> <span class="sym">},</span><br /> onAfter<span class="sym">:</span><span class="kwa">function</span><span class="sym">(</span> elem <span class="sym">){}});</span><br /> <span class="sym">}</span><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-7300141389131416527?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/practica-2.htmlBloque T1.8 Ejercicio 1http://pakitochusaap.blogspot.com/2009/03/bloque-t18-ejercicio-1.html<pre class="hl"><span class="slc">// ==UserScript==</span><br /><span class="slc">// &#64;name AAP-Nav-Pachus</span><br /><span class="slc">// &#64;namespace http://geneura.org/projects/greasemonkey</span><br /><span class="slc">// &#64;description Navegación por las secciones de AAP</span><br /><span class="slc">// &#64;include http://geneura.ugr.es/~jmerelo/asignaturas/*</span><br /><span class="slc">// ==/UserScript==</span><br /><br /><span class="kwd">GM_log</span><span class="sym">(</span><span class="str">'Entrando AAP-Nav'</span><span class="sym">);</span><br /><span class="kwa">var</span> ejercicios <span class="sym">=</span> <span class="kwc">document</span><span class="sym">.</span><span class="kwd">getElementsByTagName</span><span class="sym">(</span><span class="str">'div'</span><span class="sym">);</span><br /><span class="kwd">GM_log</span><span class="sym">(</span>ejercicios<span class="sym">);</span><br /><span class="kwa">var</span> a_nodes <span class="sym">=</span> <span class="kwa">new</span> <span class="kwc">Array</span><span class="sym">;</span><br /><span class="kwa">var</span> <span class="kwc">anchors</span> <span class="sym">=</span> <span class="kwa">new</span> <span class="kwc">Array</span><span class="sym">;</span><br /><span class="kwa">var</span> contador <span class="sym">=</span><span class="num">0</span><span class="sym">;</span><br /><span class="kwa">for</span> <span class="sym">(</span> <span class="kwa">var</span> secs <span class="sym">=</span> <span class="num">0</span><span class="sym">;</span> secs <span class="sym">&lt;</span> ejercicios<span class="sym">.</span><span class="kwc">length</span><span class="sym">;</span> secs <span class="sym">++ ) {</span><br /> <span class="kwa">if</span><span class="sym">(</span>ejercicios<span class="sym">[</span>secs<span class="sym">].</span><span class="kwd">getAttribute</span><span class="sym">(</span><span class="str">'class'</span><span class="sym">)==</span><span class="str">'ejercicios'</span><span class="sym">){</span><br /> a_nodes<span class="sym">[</span>contador<span class="sym">] =</span> ejercicios<span class="sym">[</span>secs<span class="sym">].</span>firstChild<span class="sym">;</span><br /> <span class="kwc">anchors</span><span class="sym">[</span>contador<span class="sym">] =</span> ejercicios<span class="sym">[</span>secs<span class="sym">].</span><span class="kwd">getAttribute</span><span class="sym">(</span><span class="str">'id'</span><span class="sym">);</span><br /> <span class="kwd">GM_log</span><span class="sym">(</span><span class="str">'Anchor '</span> <span class="sym">+</span> secs <span class="sym">+</span> <span class="str">&quot; &quot;</span> <span class="sym">+</span> <span class="kwc">anchors</span><span class="sym">[</span>contador<span class="sym">]);</span><br /> contador<span class="sym">++;</span><br /> <span class="sym">}</span><br /><span class="sym">}</span><br /><br /><br /><br /><span class="kwa">for</span> <span class="sym">(</span> <span class="kwa">var</span> secs <span class="sym">=</span> <span class="num">0</span><span class="sym">;</span> secs <span class="sym">&lt;</span> ejercicios<span class="sym">.</span><span class="kwc">length</span><span class="sym">;</span> secs <span class="sym">++ ) {</span><br /> <span class="kwa">var</span> span <span class="sym">=</span> <span class="kwc">document</span><span class="sym">.</span><span class="kwd">createElement</span><span class="sym">(</span><span class="str">'span'</span><span class="sym">);</span><br /> span<span class="sym">.</span><span class="kwd">setAttribute</span><span class="sym">(</span><span class="str">'style'</span><span class="sym">,</span><span class="str">'background:lightblue'</span><span class="sym">);</span><br /> <span class="kwa">if</span> <span class="sym">(</span> secs <span class="sym">&gt;</span> <span class="num">0</span> <span class="sym">) {</span><br /> <span class="kwa">var</span> ahref <span class="sym">=</span> <span class="kwc">document</span><span class="sym">.</span><span class="kwd">createElement</span><span class="sym">(</span><span class="str">'a'</span><span class="sym">);</span><br /> ahref<span class="sym">.</span><span class="kwd">setAttribute</span><span class="sym">(</span><span class="str">'href'</span><span class="sym">,</span><span class="str">'#'</span><span class="sym">+</span><span class="kwc">anchors</span><span class="sym">[</span>secs<span class="sym">-</span><span class="num">1</span><span class="sym">]);</span><br /> <span class="kwa">var</span> txt<span class="sym">=</span><span class="kwc">document</span><span class="sym">.</span><span class="kwd">createTextNode</span><span class="sym">(</span><span class="str">'^'</span><span class="sym">);</span><br /> ahref<span class="sym">.</span><span class="kwd">appendChild</span><span class="sym">(</span>txt<span class="sym">);</span><br /> span<span class="sym">.</span><span class="kwd">appendChild</span><span class="sym">(</span>ahref<span class="sym">);</span><br /> <span class="sym">}</span><br /> <span class="kwa">if</span> <span class="sym">(</span> secs <span class="sym">&lt;</span> ejercicios<span class="sym">.</span><span class="kwc">length</span> <span class="sym">-</span><span class="num">1</span> <span class="sym">) {</span><br /> span<span class="sym">.</span><span class="kwd">appendChild</span><span class="sym">(</span><span class="kwc">document</span><span class="sym">.</span><span class="kwd">createTextNode</span><span class="sym">(</span><span class="str">' | '</span><span class="sym">));</span><br /> <span class="kwa">var</span> ahref <span class="sym">=</span> <span class="kwc">document</span><span class="sym">.</span><span class="kwd">createElement</span><span class="sym">(</span><span class="str">'a'</span><span class="sym">);</span><br /> ahref<span class="sym">.</span><span class="kwd">setAttribute</span><span class="sym">(</span><span class="str">'href'</span><span class="sym">,</span><span class="str">'#'</span><span class="sym">+</span><span class="kwc">anchors</span><span class="sym">[</span>secs<span class="sym">+</span><span class="num">1</span><span class="sym">]);</span><br /> <span class="kwa">var</span> txt<span class="sym">=</span><span class="kwc">document</span><span class="sym">.</span><span class="kwd">createTextNode</span><span class="sym">(</span><span class="str">'v'</span><span class="sym">);</span><br /> ahref<span class="sym">.</span><span class="kwd">appendChild</span><span class="sym">(</span>txt<span class="sym">);</span><br /> span<span class="sym">.</span><span class="kwd">appendChild</span><span class="sym">(</span>ahref<span class="sym">);</span><br /> <span class="sym">}</span><br /> a_nodes<span class="sym">[</span>secs<span class="sym">].</span>parentNode<span class="sym">.</span><span class="kwd">insertBefore</span><span class="sym">(</span>span<span class="sym">,</span>a_nodes<span class="sym">[</span>secs<span class="sym">]);</span><br /><span class="sym">}</span><br /><br /><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-4300796751419204404?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/bloque-t18-ejercicio-1.htmlBloque T1.7 Ejercicio 1http://pakitochusaap.blogspot.com/2009/03/bloque-t17-ejercicio-1.html<pre class="hl"> <span class="kwa">function</span> <span class="kwd">mostrarTitulos</span><span class="sym">(){</span><br /> <span class="kwa">var</span> titulos<span class="sym">=</span><span class="kwa">new</span> <span class="kwc">Array</span><span class="sym">();</span><br /> titulos<span class="sym">=</span><span class="kwc">document</span><span class="sym">.</span><span class="kwd">getElementsByTagName</span><span class="sym">(</span><span class="str">'h2'</span><span class="sym">);</span><br /> <span class="kwa">var</span> ejs<span class="sym">=</span><span class="str">&quot;&quot;</span><span class="sym">;</span><br /> <span class="kwa">for</span> <span class="sym">(</span>i <span class="kwa">in</span> titulos<span class="sym">){</span><br /> ejs <span class="sym">= (</span>ejs<span class="sym">+</span><span class="str">&quot;Apartado &quot;</span><span class="sym">+</span> i <span class="sym">+</span><span class="str">&quot;: &quot;</span><span class="sym">+</span>titulos<span class="sym">[</span>i<span class="sym">].</span><span class="kwc">innerHTML</span><span class="sym">+</span><span class="str">&quot;&lt;br&gt;&quot;</span><span class="sym">);</span><br /><br /> <span class="sym">}</span><br /> <span class="kwc">document</span><span class="sym">.</span><span class="kwc">getElementById</span><span class="sym">(</span><span class="str">&quot;resumen&quot;</span><span class="sym">).</span><span class="kwc">innerHTML</span><span class="sym">=</span>ejs<span class="sym">;</span><br /> <span class="sym">}</span><br /></pre><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/5228844509473508943-1789929649620897385?l=pakitochusaap.blogspot.com" /></div>http://pakitochusaap.blogspot.com/2009/03/bloque-t17-ejercicio-1.htmlTaller2: Bloque T2.8http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t28.html<span>1. Buscar formas alternativas de servir XML a través de un servidor web.</span><br /><br />Existen múltiples programas que se ejecutan en un servidor además de los CGIs. Algunas de ellos son:<br /><br /><ul><li>Servlet de Java</li></ul>Programas orientados a servir páginas o documentos de forma dinámica usando la programación en Java. Los Servlets se ejecutan en el servidor y en no presentan ningún tipo de interfaz gráfica puesto que se encargan de hacer el trabajo oculto.<span> </span><br />Referencia <a href="http://manuales.dgsca.unam.mx/webdina/servlets.htm">aquí</a>.<br /><ul><li>PHP<i><b> (</b>PHP Hypertext Pre-processor)</i></li></ul>Lenguaje que se ejecuta en la parte del servidor y que permite generar dinamicamente documentos o paginas, destacando especialmente su integración con distintas bases de datos como mySQL.<br />Referencia <a href="http://es.wikipedia.org/wiki/.php">aquí</a>.<br /><ul><li>ASP (Active Server Pages)<br /></li></ul>Es la ecnología para la creación de páginas dinámicas del lado del servidor desarrollada por Microsoft. El tipo de servidores que emplean este lenguaje son aquellos que funcionan con sistema operativo de la familia de Windows NT. Para escribir páginas ASP utilizamos un lenguaje de scripts, que se colocan en la misma página web junto con el código HTML.<br />Documentación<span> <a href="http://www.desarrolloweb.com/manuales/8/">aquí</a>.</span><br /><br /><br /><span>2.Instalar un servidor web en el ordenador, y probar el programa anterior.</span><br /><br />En principio comencé instalándome el servidor<a href="http://www.apachefriends.org/es/xampp.html"> XAMPP</a> para Windows al que más tarde tuve que añadir la librería Perl porque no la llevaba. Sin embargo, al final decidí pasarme a Linux (a estas alturas) ya que me lo recomendaron.<br /><br />Así pues, con la ayuda de Alexfh me instalé la maquina virtual <a href="http://www.vmware.com/products/ws/">VMware Workstation</a> y en ella cargué la última versión de Ubuntu. Una vez hecho, instalé el servidor Apache y las líbrerias Ruby y Perl.<br /><br />El ejemplo anterior:<br /><a href="http://1.bp.blogspot.com/_KhG-B-v1VcI/Sf-Wl4OcrQI/AAAAAAAAAF4/15r22gjj1CE/s1600-h/t28b.JPG"><img src="http://1.bp.blogspot.com/_KhG-B-v1VcI/Sf-Wl4OcrQI/AAAAAAAAAF4/15r22gjj1CE/s400/t28b.JPG" alt="" id="BLOGGER_PHOTO_ID_5332146061322267906" border="0" /></a><span><br /></span><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-2174859357887061150?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t28.htmlTaller2: Bloque T2.7 REPETICIONhttp://nikabgirl.blogspot.com/2009/05/taller2-bloque-t27-repeticion.htmlDespues de fijarme en uno de los ejemplos de otros años me dado cuenta de que eso no es exactamente lo que pedía el ejercicio así que he creado otro programa que lee los titulos y las categorias de feeds ya que la web que encontré después de mucho buscar no contienen etiquetas de fecha.<br /><br /><a href="http://2.bp.blogspot.com/_KhG-B-v1VcI/Sf-Nbp1a3uI/AAAAAAAAAFw/0OMH7huPpv8/s1600-h/t27d.JPG"><img src="http://2.bp.blogspot.com/_KhG-B-v1VcI/Sf-Nbp1a3uI/AAAAAAAAAFw/0OMH7huPpv8/s400/t27d.JPG" alt="" id="BLOGGER_PHOTO_ID_5332135990055853794" border="0" /></a><a href="http://2.bp.blogspot.com/_KhG-B-v1VcI/Sf-Mi299taI/AAAAAAAAAFo/VLxJfNtmN5U/s1600-h/t27d.JPG"><br /></a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-4096294804444247293?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t27-repeticion.htmlTaller2: Bloque T2.7http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t27.html<span>1. Hacer un programa que lea un feed RSS dado por el URL y presente los titulos y fechas. usar cualquier lenguaje de programacion.</span><br /><br />Modificamos el programa rss-1.rb para que muestre la fecha. Esta hay que pasarla de tipo Time a string con la funcion <span>to_s</span>:<br /><a href="http://3.bp.blogspot.com/_KhG-B-v1VcI/Sf-C1g8DjzI/AAAAAAAAAFQ/bbn3pnXI1Qk/s1600-h/t27a.JPG"><img src="http://3.bp.blogspot.com/_KhG-B-v1VcI/Sf-C1g8DjzI/AAAAAAAAAFQ/bbn3pnXI1Qk/s400/t27a.JPG" alt="" id="BLOGGER_PHOTO_ID_5332124339716460338" border="0" /></a>Si lo pasamos por el documento .rss que sigue:<br /><a href="http://2.bp.blogspot.com/_KhG-B-v1VcI/Sf-DxtU60fI/AAAAAAAAAFY/OUmjrsM1uBQ/s1600-h/t27b.JPG"><img src="http://2.bp.blogspot.com/_KhG-B-v1VcI/Sf-DxtU60fI/AAAAAAAAAFY/OUmjrsM1uBQ/s400/t27b.JPG" alt="" id="BLOGGER_PHOTO_ID_5332125373834121714" border="0" /></a>resulta:<br /><a href="http://4.bp.blogspot.com/_KhG-B-v1VcI/Sf-EJocY4UI/AAAAAAAAAFg/rafh4rSvG84/s1600-h/t27c.JPG"><img src="http://4.bp.blogspot.com/_KhG-B-v1VcI/Sf-EJocY4UI/AAAAAAAAAFg/rafh4rSvG84/s400/t27c.JPG" alt="" id="BLOGGER_PHOTO_ID_5332125784840134978" border="0" /></a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-6128712448198212533?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t27.htmlTaller2: Bloque T2.6http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t26.html<span>1. Localizar feeds RSS de publicaciones relacionadas con la asignatura</span><br /><br /><a href="http://www.bloginformatico.com/que-son-lenguajes-de-programacion.php">Aquí</a><span> tenemos un blog de software, aplicaciones webs y mas, que nos permite suscribirnos a su canal</span> <a href="http://feeds.feedburner.com/Blog-Informatico">RSS</a><br /><br /><span>2.Darse de alta en un agregador donline (alguno de los indicados anteriormente), o bien descargar un agregador, suscribirse a las publicaciones anteriores y seguirlas con suma atencion.</span><br /><br /><span>Me he dado de alta en</span> <a href="http://www.google.com/ig">GoogleIG</a><br /><br /><a href="http://1.bp.blogspot.com/_KhG-B-v1VcI/Sf95roeZtII/AAAAAAAAAFI/6Vowlh-gHT8/s1600-h/t26.JPG"><img src="http://1.bp.blogspot.com/_KhG-B-v1VcI/Sf95roeZtII/AAAAAAAAAFI/6Vowlh-gHT8/s400/t26.JPG" alt="" id="BLOGGER_PHOTO_ID_5332114274336224386" border="0" /></a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-6066917551422437156?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t26.htmlTaller2: Bloque T2.5http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t25.html<span>1. Modificar alguno de los programas para que imprimas las habitaciones, en vez de los muebles</span><br /><br />Modificamos el ejemplo en ruby. Nos fijamos en que el nombre de las habitaciones se incluye en su identificador, por lo que es ese atributo el que tenemos que buscar en el documento.<br /><a href="http://3.bp.blogspot.com/_KhG-B-v1VcI/Sf9xb036lPI/AAAAAAAAAE4/8NubP_S4cNQ/s1600-h/t25.JPG"><img src="http://3.bp.blogspot.com/_KhG-B-v1VcI/Sf9xb036lPI/AAAAAAAAAE4/8NubP_S4cNQ/s400/t25.JPG" alt="" id="BLOGGER_PHOTO_ID_5332105206693532914" border="0" /></a>y el xml que le pasamos como parámetro:<br /><a href="http://2.bp.blogspot.com/_KhG-B-v1VcI/Sf9zec5b8fI/AAAAAAAAAFA/D2Yrrv7ewyk/s1600-h/t25b.JPG"><img src="http://2.bp.blogspot.com/_KhG-B-v1VcI/Sf9zec5b8fI/AAAAAAAAAFA/D2Yrrv7ewyk/s400/t25b.JPG" alt="" id="BLOGGER_PHOTO_ID_5332107450820325874" border="0" /></a>si lo ejecutamos:<br /><br /><span>>>ruby ./muebles.rb muebles.xml</span><br /><span>comedor</span><br /><span>cocina<br /><br /><span>Referencias: <a href="http://www.xml.com/lpt/a/1626">http://www.xml.com/lpt/a/1626</a></span><br /></span><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-1541558559395308455?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/05/taller2-bloque-t25.htmlPráctica 4: Introducción al XMLhttp://nikabgirl.blogspot.com/2009/05/practica-4-introduccion-al-xml.html<span>Este documento XML trata sobre la formación de una orquesta en cuanto a personas que la componen.<br /></span><br /><span>Primer documento xml (el blog hace que no se muestre correctamente)</span><br /><br />< ?xml version="1.0" encoding="UTF-8"?><br />< !--Descripcion de los componentes de una orquesta--><br /><br /><br />< nombre="'Banda" ciudad="'Olula'" xsi="http://www.w3.org/2001/XMLSchema-instance" nonamespaceschemalocation="orq.xsd"><br />< id="'JJ'">< /director><br /><br /><br /><br />< !--======================================================--><br /><br /><br /><br />< !--VIOLINES--><br />< clase="'principal'">< nombre="'Pepe'" edad="'22'" sexo="'hombre'" email="'pepe@orq.es'">< /musico>< /violin><br />< clase="'primero'">< nombre="'Maria'" edad="'32'" sexo="'mujer'" email="'maria@orq.es'">< /musico>< /violin><br />< clase="'primero'">< nombre="'Manolo'" edad="'25'" sexo="'hombre'" email="'manolo@orq.es'">< /musico>< /violin><br />< clase="'segundo'">< nombre="'Juan'" edad="'34'" sexo="'hombre'" email="'juan@orq.es'">< /musico>< /violin><br />< clase="'segundo'">< nombre="'Enma'" edad="'27'" sexo="'mujer'" email="'enma@orq.es'">< /musico>< /violin><br />< clase="'tercero'">< nombre="'Lola'" edad="'15'" sexo="'mujer'" email="'lola@orq.es'">< /musico>< /violin><br /><br />< !--VIOLA--><br />< nombre="'Antonio'" edad="'25'" sexo="'hombre'" email="'antonio@orq.es'">< /musico>< /viola><br /><br />< !--VIOLONCELLO--><br />< nombre="'Paco'" edad="'15'" sexo="'hombre'" email="'paco@orq.es'">< /musico>< /violoncello><br /><br />< !--CONTRABAJO--><br />< nombre="'Alexfh'" edad="'21'" sexo="'hombre'" email="'alex@orq.es'">< /musico>< /contrabajo><br /><br />< /cuerda><br /><br />< !--========================================================--><br /><br /><br /><br /><br />< !--SAXOFONES--><br />< clase="'tenor'">< nombre="'Laura'" edad="'21'" sexo="'mujer'" email="'laura@orq.es'">< /musico>< /saxofon><br />< clase="'tenor'">< nombre="'Manu'" edad="'21'" sexo="'hombre'" email="'manu@orq.es'">< /musico>< /saxofon><br />< clase="'alto'">< nombre="'PakitoChus'" edad="'21'" sexo="'hombre'" email="'pakito@orq.es'">< /musico>< /saxofon><br /><br />< !--TROMPETAS--><br />< clase="'primera'" tipo="'enSi'">< nombre="'Luis'" edad="'23'" sexo="'hombre'" email="'luis@orq.es'">< /musico>< /trompeta><br />< clase="'segunda'" tipo="'enSi'">< /musico>< /trompeta><br />< clase="'segunda'" tipo="'enSol'">< nombre="'Abel'" edad="'17'" sexo="'hombre'" email="'abel@orq.es'">< /musico>< /trompeta> <br /><br />< !--TROMPA--><br />< tipo="'enFa'">< nombre="'Cristian'" edad="'20'" sexo="'hombre'" email="'cris@orq.es'">< /musico>< /trompa><br /><br />< !--TROMBON--><br /><br />< nombre="'Almudena'" edad="'21'" sexo="'mujer'" email="'almu@orq.es'">< /musico>< /trombon><br /><br />< !--BOMBARDINO--><br /><br />< nombre="'Miguel'" edad="'28'" sexo="'hombre'" email="'miguel@orq.es'">< /musico>< /bombardino><br /><br />< !--HELICÓN--><br /><br />< nombre="'Inma'" edad="'20'" sexo="'mujer'" email="'inma@orq.es'">< /musico>< /helicon><br /><br />< /metales><br /><br />< !--========================================================--><br /><br /><br /><br />< !--FLAUTAS--><br />< clase="'primera'">< nombre="'Nika'" edad="'21'" sexo="'mujer'" email="'nika@orq.es'">< /musico>< /flauta><br />< clase="'segunda'">< nombre="'Carlos'" edad="'21'" sexo="'hombre'" email="'carlos@orq.es'">< /musico>< /flauta><br /><br />< nombre="'Loli'" edad="'13'" sexo="'mujer'" email="'loli@orq.es'">< /musico>< /flautin><br /><br />< !--OBOE--><br /><br />< nombre="'Pepa'" edad="'26'" sexo="'mujer'" email="'pepa@orq.es'">< /musico>< /oboe><br /><br />< !--FAGOT--><br /><br />< nombre="'Raul'" edad="'35'" sexo="'hombre'" email="'raul@orq.es'">< /musico>< /fagot><br /><br />< !--CLARINETES--><br />< clase="'principal'">< nombre="'Mariola'" edad="'24'" sexo="'mujer'" email="'mariola@orq.es'">< /musico>< /clarinete><br />< clase="'primero'">< nombre="'Fede'" edad="'21'" sexo="'hombre'" email="'fede@orq.es'">< /musico>< /clarinete><br />< clase="'primero'">< nombre="'Alba'" edad="'18'" sexo="'mujer'" email="'alba@orq.es'">< /musico>< /clarinete><br />< clase="'segundo'">< nombre="'Kisko'" edad="'22'" sexo="'hombre'" email="'kisko@orq.es'">< /musico>< /clarinete> <br />< clase="'segundo'">< nombre="'Carmen'" edad="'18'" sexo="'mujer'" email="'carmen@orq.es'">< /musico>< /clarinete><br />< clase="'tercero'">< nombre="'Mercedes'" edad="'13'" sexo="'mujer'" email="'mercedes@orq.es'">< /musico>< /clarinete><br />< clase="'tercero'"> < /musico>< /clarinete><br />< /maderas><br /><br />< !--========================================================--><br /><br /><br /><br />< !--TIMBALES--><br /><br />< nombre="'Esperanza'" edad="'25'" sexo="'mujer'" email="'espe@orq.es'">< /musico>< /timbales><br /><br />< !--PLATOS--><br /><br />< nombre="'Andres'" edad="'21'" sexo="'hombre'" email="'andres@orq.es'">< /musico>< /platillos><br /><br />< !--CAJA--><br /><br />< nombre="'Josefa'" edad="'22'" sexo="'mujer'" email="'josefa@orq.es'">< /musico>< /caja><br />< /percusion><br /><br />< !--========================================================--><br /><br />< /familias><br />< /orquesta><br /><br /><br /><span>Schema</span><a href="http://4.bp.blogspot.com/_KhG-B-v1VcI/Sf9vmWmpiEI/AAAAAAAAAEg/nR1psuTGrvU/s1600-h/orq_schema.jpg"><img src="http://4.bp.blogspot.com/_KhG-B-v1VcI/Sf9vmWmpiEI/AAAAAAAAAEg/nR1psuTGrvU/s400/orq_schema.jpg" alt="" id="BLOGGER_PHOTO_ID_5332103188523354178" border="0" /></a><br />NOTA:<span> <span>Como no se ve bien si alguien quiere ver mi practica basta con que me lo deje escrito en comentarios</span></span><span> y se la mando</span><br /><br /><br /><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-2869978439901751773?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/05/practica-4-introduccion-al-xml.htmlTaller2: Bloque T2.4http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t24.html<span>1.Diseñar un XSchema para un documento X</span><span>ML que describa una quiniela, incluyendo resultados. Tener en cuenta que una quiniela tiene 15 partidos sólo. Hacer un documento XML que siga ese XML Schema, y validarlo usando Xerces2 o algún otro parser con validación.<br /></span><br /><span>El enlace al wiki donde está colgado es</span><span><span> el siguiente:</span> <a href="http://aap-ugr-2007.wikispaces.com/BloqueT2.4nikaTeleco">bloqueT24</a><br /><br /><span>Este ejercicio ha sido validado por Oxygen:</span></span><span><br /><br /></span><a href="http://1.bp.blogspot.com/_KhG-B-v1VcI/Seuv4cnW_HI/AAAAAAAAAEQ/Mfhe4i1JvWk/s1600-h/bloqueT24_schema.jpg"><img src="http://1.bp.blogspot.com/_KhG-B-v1VcI/Seuv4cnW_HI/AAAAAAAAAEQ/Mfhe4i1JvWk/s400/bloqueT24_schema.jpg" alt="" id="BLOGGER_PHOTO_ID_5326544368584555634" border="0" /></a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-2196614820422027952?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t24.htmlTaller2: Bloque T2.3http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t23.html<span>1. Con los equipos de la liga anteriores, usar diferentes espacio de nombres para el equipo e sí y para sus componentes. </span><br /><br /><a href="http://aap-ugr-2007.wikispaces.com/bloque+T2.2.3+nikaTeleco">Enlace al wiki</a><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-8100223216913363551?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t23.htmlTaller2: Bloque T2.2http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t22.html<span>1. Crear un documento XML que contenga la descripción de un equipo de liga. Comprobar que el XML es válido.</span><br /><br /><span>2. Crear un documento XML que describa varios libros de una biblioteca.</span><br /><b><span><br /></span></b><span> <span>Los cuelgo en el wiki porque al copiar el código el blog hace cosas raras :S .<br /><span><br /><a href="http://aap-ugr-2007.wikispaces.com/Bloque+T2.2.1+nikaTeleco">Ejercicio 1</a><br /></span><a href="http://aap-ugr-2007.wikispaces.com/Bloque+T2.2.2+nikaTeleco">Ejercicio 2 (hay dos versiones del mismo ejercicio)</a><br /></span><br /><!--[if !supportLineBreakNewLine]--><br /><!--[endif]--></span><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-2954567936427418006?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t22.htmlTaller2: Bloque T2.1http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t21.html<span>1.Elegir un editor XML e instalarlo, o buscar un modo XML para un editor genérico.<br /><br /></span><span>El editor elegido ha sido <span>notepad++</span> recomendado por Tularis. Además de tener la ventaja de no tener que ser instalado en el ordenador (lo cual facilita su movilidad) puede ser usado para múltiples lenguajes de programación</span><span><br /></span><span><span><br /><span><span>Enlace: <a href="http://notepad-plus.sourceforge.net/es/site.htm">notepad++</a></span><br /><br /></span></span></span> <p class="MsoNormal"><b>2.Visualizar este </b><a href="http://atalaya.blogalia.com/rdf.xml"><b>fichero XML</b></a><b> en un navegador y comprobar que efectivamente puede hacerlo.</b><br /><br /><span>Lo abrimos con el Mozilla 3.0.7 y va sin problemas.</span><span></span></p><br /><span><br /><!--[if !supportLineBreakNewLine]--><br /><!--[endif]--></span><div class="blogger-post-footer"><img width="1" height="1" src="http://res1.blogblog.com/tracker/2471099110194155672-7564597470702188744?l=nikabgirl.blogspot.com" /></div>http://nikabgirl.blogspot.com/2009/04/taller2-bloque-t21.htmlimg/0000775000076400007640000000000011200107472011234 5ustar draxusdraxusimg/rss.png0000775000076400007640000000134311172345644012572 0ustar draxusdraxusPNG  IHDRasBIT|d pHYs B4tEXtSoftwareAdobe FireworksONaIDAT89hq73.11hB%B A -TPAAKl SD,DOPA*(F11!g7;>U,3S0x(5[q6ӃdZsq1l:@2Td>+`"ڥ(d@`&Fım@p+=Vo58Jƾazg|' uRLi;M4N!0姇ܘ֛؍Khū"S'kQ \ž⍽oΓtUSa盧Bn)9m4qtgrjv܋&cT-=19Eb"i -i(F6Nv } -448;:zmBoE7ުLTiZ&Ċ!7!i(={= F);n=i=$IoΣ\h,&t0rX{L4fcb; @LY}zϗ܇O}yX=W_wkJD.aϬ 3γ.*36ƕ3.'*Amt%K,{Ix^_}M~t xN 'AQ;A<xqUw̙J NÃAl韝[3"6GjlR],,הlkʜ']={ KC^jx*[ٳ쌋g6%GѦ CHor!"frA$zwd67pO{?|z}<y,y: TNYpcEs$ $^ JޢD6{+0Tymxh6Ezy>?W^W dy×wS.;xyףS5/O^/<4cY Vֿ_4eyDO;Kf)_~=fZ1]}_67X#^waZ(,>k^C7W4/E)e+_854O_U8kOmfr{i5Oz U/f^4kGO.;[&ufn-q g >H 7ֽO۬yqϤg'0*ͦ"A;fS(vXf.߁rZdœlv]T(ݨl''v|(̔%lYL7[dXk l))dkbʹm@7KI'D’ج l DCY$ ~=!\ˣٓhKeQ' ,VFЏov UDeT 0%Ch5!nh-M\WU!IE*6hEyN5Khq67+O".// ,"tj2mGf$EB$O"J I$|;Dt օ.6 H_۪ ~{Ţ-Lb^$ZMt:_]Dj-BMEua17Q?WFy<cN,F5RRyL졏,r^~3 u^:MqLyۨT^L)iގS €Z9ULX?JI2T7& oBpq yV1Vd}T<]5 x;<,/ 8'Լeı6ڗ9xSPZ8phcIں2mW6 o w»nbm pI V $zأ|0Yt_9x4+2+V' z9W VpԮZ-O`y ~ [_QJfsBKY˗ф.&oo-<خ 1![E3Zln/6 D0:w_C>G9y&@9 &` FђYx*: /ay-xlK=xq~]g6_ gṱ KZ "m|,M=g #}ϟGJCp;GsScệ)/<G +i{ -S)}#@'~K_7KIZoo],)ԘѥeYff&4y8Xy㭉KTH;, ?lCdRV'Yo]^pV# 0G&S-]r qAx%MiRk@V$m6 0DfKNb ֈjboOA EY[$Nڔ*(b=:/ՖRMZ6_zgr]$ C;ӃpbyZo<L:%,^3rVg^ gw" 'uv)]<cvnQCUj]P'2w tZcIþpRaQrޚs*zn~,]Ù $x;~g mbJLMtU/쉽!  *s҃o0M D oA&]NcH[1<4:m!1}@[tOcO Rx OPjX:Uz^}^ oT,#YjlcsRY(ǦL OvfЛh)y-Wk-_y%]:忷gLP<>缍%U'#{һwݏED`[ޤ2{q߀>E#i'zNYc޲Vy m 9Z8rY,MóU;ZpSyfŌAMwj>C݆` }v2PZ[a.tC cOӳhFY5bPɓao败$X6i FS&~xaȞڣUO|5/671/lHxt6HSC jik.~Gj2DdF~q2 g]z5OSajËu]QeNtcih~mŶ-ָNj kxclv`gV^7 Cj~A:IښW=~| 9J&T`s>5To|6g{nvXS2^cF?#n$nv׶9.47Ltxv"r"±7]Dnklx", G>hQ5n txpC ;1n'g^WG{2<*6 j\@dSTyѳnv54f_+wIkUIENDB`index.html0000664000076400007640000000662111200145524012462 0ustar draxusdraxus AAP: Prctica 5 : Manuel Martn Salvador

AAP: Prctica 5 : Manuel Martn Salvador

Breve introduccin

He programado un script en python para poder crear un agregador de blogs fcilmente. Lo que hace es leer las urls de los feeds de un fichero dado (sites.txt) y extrae los ttulos y el contenido (de aquellos que sea posible) de los posts. El script genera dos ficheros: planet.html y feed.xml que presentan los 10 ltimos posts de cada blog.

Se puede crear cualquier planet con slo editar los campos indicados en el fichero actualizar.py como son el ttulo o el subttulo del mismo, entre otros. Para agregar blogs simplemente basta con aadir la url de sus feeds al fichero sites.txt.

Es recomendable programar una tarea cron para que ejecute peridicamente el script actualizar.py (cada hora, por ejemplo).

Ms detalles

  • Se usa la librera feedparser para parsear los feeds, como su propio nombre indica.
  • Se usa la librera PyRSS2Gen para generar el feed rss del planet.
  • Se usa la codificacin UTF-8 tanto para el html como para el xml.
  • Se usa jQuery UI para poder reagrupar el orden de los blogs.
  • Se usa Facebox para mostrar en una capa "popup" el contenido de los posts al pinchar en los ttulos.

Ejemplo de uso

Vamos a crear un planet para la ETSIIT, para ello lo primero que hacemos es copiar todos los archivos en un directorio accesible por web y configurar el archivo scripts/actualizar.py:

__PLANET_TITLE__ = "Planet ETSIIT"
__PLANET_SUBTITLE__ = "El planet informaticotelecomunicado de Granada"
__PLANET_URL__ = "http://swecai.ugr.es/~planet_etsiit"
__PLANET_EMAIL__ = "draxus@gmail.com"

Ahora aadimos las urls de aquellos feeds que queramos en el fichero sites.txt:

http://atalaya.blogalia.com/rdf.xml
http://draxus.org/weblog/feed/
http://misvaguedades.blogspot.com/feeds/posts/default
http://fergunet.blogspot.com/feeds/posts/default
http://eldiegoj.blogspot.com/feeds/posts/default
http://moviendocubos.blogspot.com/feeds/posts/default
http://www.carlostenor.com/feed/
http://www.gskbyte.net/feed/
http://virtualizada.com/rss.xml
http://alejandrobareamontoya.blogspot.com/feeds/posts/default
http://pakitochusaap.blogspot.com/feeds/posts/default
http://nikabgirl.blogspot.com/feeds/posts/default

A continuacin ya podemos ejecutar el script ./actualizar.py y una vez finalizado, podemos comprobar que se ha ejecutado con xito cargando el fichero planet.html en un navegador web.

Para que los feeds se vayan actualizando automticamente crearemos una tarea cron que se ejecute cada hora:

01 * * * * cd /home/planet_etsiit/public_html/scripts/ && ./actualizar.py > log

Para ver este ejemplo en funcionamiento, visitar http://swecai.ugr.es/~planet_etsiit/ (si se experimentan problemas con la codificacin de caracteres, seleccionar en el navegador Unicode UTF-8).


draxus
js/0000775000076400007640000000000011200117052011067 5ustar draxusdraxusjs/jquery-ui-1.7.1.custom.min.js0000664000076400007640000023021311200017572016123 0ustar draxusdraxus/* * jQuery UI 1.7.1 * * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI */ jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.1",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Draggable 1.7.1 * * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Draggables * * Depends: * ui.core.js */ (function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.leftthis.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y=0;b--){this.items[b].item.removeData("sortable-item")}},_mouseCapture:function(e,f){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(e);var d=null,c=this,b=a(e.target).parents().each(function(){if(a.data(this,"sortable-item")==c){d=a(this);return false}});if(a.data(e.target,"sortable-item")==c){d=a(e.target)}if(!d){return false}if(this.options.handle&&!f){var g=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==e.target){g=true}});if(!g){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,b){var g=this.options,c=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(e);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(e);this.originalPageX=e.pageX;this.originalPageY=e.pageY;if(g.cursorAt){this._adjustOffsetFromHelper(g.cursorAt)}this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!b){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,c._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(f){this.position=this._generatePosition(f);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var g=this.options,b=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-f.pageY=0;d--){var e=this.items[d],c=e.item[0],h=this._intersectsWithPointer(e);if(!h){continue}if(c!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=c&&!a.ui.contains(this.placeholder[0],c)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],c):true)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e)){this._rearrange(f,e)}else{break}this._trigger("change",f,this._uiHash());break}}this._contactContainers(f);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,f)}this._trigger("sort",f,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(c,d){if(!c){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,c)}if(this.options.revert){var b=this;var e=b.placeholder.offset();b.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-b.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-b.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){b._clear(c)})}else{this._clear(c,d)}return false},cancel:function(){var b=this;if(this.dragging){this._mouseUp();if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,b._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,b._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}return true},serialize:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};a(b).each(function(){var e=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||(/(.+)[-=_](.+)/));if(e){c.push((d.key||e[1]+"[]")+"="+(d.key&&d.expression?e[1]:e[2]))}});return c.join("&")},toArray:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};b.each(function(){c.push(a(d.item||this).attr(d.attribute||"id")||"")});return c},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)f&&(e+h)m[this.floating?"width":"height"])){return g}else{return(f0?"down":"up")},_getDragHorizontalDirection:function(){var b=this.positionAbs.left-this.lastPositionAbs.left;return b!=0&&(b>0?"right":"left")},refresh:function(b){this._refreshItems(b);this.refreshPositions()},_connectWith:function(){var b=this.options;return b.connectWith.constructor==String?[b.connectWith]:b.connectWith},_getItemsAsjQuery:function(b){var l=this;var g=[];var e=[];var h=this._connectWith();if(h&&b){for(var d=h.length-1;d>=0;d--){var k=a(h[d]);for(var c=k.length-1;c>=0;c--){var f=a.data(k[c],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element):a(f.options.items,f.element).not(".ui-sortable-helper"),f])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper"),this]);for(var d=e.length-1;d>=0;d--){e[d][0].each(function(){g.push(this)})}return a(g)},_removeCurrentsFromItems:function(){var d=this.currentItem.find(":data(sortable-item)");for(var c=0;c=0;e--){var m=a(l[e]);for(var d=m.length-1;d>=0;d--){var g=a.data(m[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element[0],b,{item:this.currentItem}):a(g.options.items,g.element),g]);this.containers.push(g)}}}}for(var e=f.length-1;e>=0;e--){var k=f[e][1];var c=f[e][0];for(var d=0,n=c.length;d=0;d--){var e=this.items[d];if(e.instance!=this.currentContainer&&this.currentContainer&&e.item[0]!=this.currentItem[0]){continue}var c=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!b){e.width=c.outerWidth();e.height=c.outerHeight()}var f=c.offset();e.left=f.left;e.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var d=this.containers.length-1;d>=0;d--){var f=this.containers[d].element.offset();this.containers[d].containerCache.left=f.left;this.containers[d].containerCache.top=f.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}}},_createPlaceholder:function(d){var b=d||this,e=b.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(b.currentItem[0].nodeName)).addClass(c||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=a(e.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);e.placeholder.update(b,b.placeholder)},_contactContainers:function(d){for(var c=this.containers.length-1;c>=0;c--){if(this._intersectsWith(this.containers[c].containerCache)){if(!this.containers[c].containerCache.over){if(this.currentContainer!=this.containers[c]){var h=10000;var g=null;var e=this.positionAbs[this.containers[c].floating?"left":"top"];for(var b=this.items.length-1;b>=0;b--){if(!a.ui.contains(this.containers[c].element[0],this.items[b].item[0])){continue}var f=this.items[b][this.containers[c].floating?"left":"top"];if(Math.abs(f-e)this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left=0;c--){if(a.ui.contains(this.containers[c].element[0],this.currentItem[0])&&!e){f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.containers[c]));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.containers[c]))}}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000}})})(jQuery);;/* * jQuery UI Effects 1.7.1 * * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Effects/ */ jQuery.effects||(function(d){d.effects={version:"1.7.1",save:function(g,h){for(var f=0;f');var j=f.parent();if(f.css("position")=="static"){j.css({position:"relative"});f.css({position:"relative"})}else{var i=f.css("top");if(isNaN(parseInt(i,10))){i="auto"}var h=f.css("left");if(isNaN(parseInt(h,10))){h="auto"}j.css({position:f.css("position"),top:i,left:h,zIndex:f.css("z-index")}).show();f.css({position:"relative",top:0,left:0})}j.css(g);return j},removeWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent().replaceWith(f)}return f},setTransition:function(g,i,f,h){h=h||{};d.each(i,function(k,j){unit=g.cssUnit(j);if(unit[0]>0){h[j]=unit[0]*f+unit[1]}});return h},animateClass:function(h,i,k,j){var f=(typeof k=="function"?k:(j?j:null));var g=(typeof k=="string"?k:null);return this.each(function(){var q={};var o=d(this);var p=o.attr("style")||"";if(typeof p=="object"){p=p.cssText}if(h.toggle){o.hasClass(h.toggle)?h.remove=h.toggle:h.add=h.toggle}var l=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.addClass(h.add)}if(h.remove){o.removeClass(h.remove)}var m=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.removeClass(h.add)}if(h.remove){o.addClass(h.remove)}for(var r in m){if(typeof m[r]!="function"&&m[r]&&r.indexOf("Moz")==-1&&r.indexOf("length")==-1&&m[r]!=l[r]&&(r.match(/color/i)||(!r.match(/color/i)&&!isNaN(parseInt(m[r],10))))&&(l.position!="static"||(l.position=="static"&&!r.match(/left|top|bottom|right/)))){q[r]=m[r]}}o.animate(q,i,g,function(){if(typeof d(this).attr("style")=="object"){d(this).attr("style")["cssText"]="";d(this).attr("style")["cssText"]=p}else{d(this).attr("style",p)}if(h.add){d(this).addClass(h.add)}if(h.remove){d(this).removeClass(h.remove)}if(f){f.apply(this,arguments)}})})}};function c(g,f){var i=g[1]&&g[1].constructor==Object?g[1]:{};if(f){i.mode=f}var h=g[1]&&g[1].constructor!=Object?g[1]:(i.duration?i.duration:g[2]);h=d.fx.off?0:typeof h==="number"?h:d.fx.speeds[h]||d.fx.speeds._default;var j=i.callback||(d.isFunction(g[1])&&g[1])||(d.isFunction(g[2])&&g[2])||(d.isFunction(g[3])&&g[3]);return[g[0],i,h,j]}d.fn.extend({_show:d.fn.show,_hide:d.fn.hide,__toggle:d.fn.toggle,_addClass:d.fn.addClass,_removeClass:d.fn.removeClass,_toggleClass:d.fn.toggleClass,effect:function(g,f,h,i){return d.effects[g]?d.effects[g].call(this,{method:g,options:f||{},duration:h,callback:i}):null},show:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._show.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"show"))}},hide:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._hide.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"hide"))}},toggle:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))||(arguments[0].constructor==Function)){return this.__toggle.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"toggle"))}},addClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{add:g},f,i,h]):this._addClass(g)},removeClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{remove:g},f,i,h]):this._removeClass(g)},toggleClass:function(g,f,i,h){return((typeof f!=="boolean")&&f)?d.effects.animateClass.apply(this,[{toggle:g},f,i,h]):this._toggleClass(g,f)},morph:function(f,h,g,j,i){return d.effects.animateClass.apply(this,[{add:h,remove:f},g,j,i])},switchClass:function(){return this.morph.apply(this,arguments)},cssUnit:function(f){var g=this.css(f),h=[];d.each(["em","px","%","pt"],function(j,k){if(g.indexOf(k)>0){h=[parseFloat(g),k]}});return h}});d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(g,f){d.fx.step[f]=function(h){if(h.state==0){h.start=e(h.elem,f);h.end=b(h.end)}h.elem.style[f]="rgb("+[Math.max(Math.min(parseInt((h.pos*(h.end[0]-h.start[0]))+h.start[0],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[1]-h.start[1]))+h.start[1],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[2]-h.start[2]))+h.start[2],10),255),0)].join(",")+")"}});function b(g){var f;if(g&&g.constructor==Array&&g.length==3){return g}if(f=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(g)){return[parseInt(f[1],10),parseInt(f[2],10),parseInt(f[3],10)]}if(f=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(g)){return[parseFloat(f[1])*2.55,parseFloat(f[2])*2.55,parseFloat(f[3])*2.55]}if(f=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(g)){return[parseInt(f[1],16),parseInt(f[2],16),parseInt(f[3],16)]}if(f=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(g)){return[parseInt(f[1]+f[1],16),parseInt(f[2]+f[2],16),parseInt(f[3]+f[3],16)]}if(f=/rgba\(0, 0, 0, 0\)/.exec(g)){return a.transparent}return a[d.trim(g).toLowerCase()]}function e(h,f){var g;do{g=d.curCSS(h,f);if(g!=""&&g!="transparent"||d.nodeName(h,"body")){break}f="backgroundColor"}while(h=h.parentNode);return b(g)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};d.easing.jswing=d.easing.swing;d.extend(d.easing,{def:"easeOutQuad",swing:function(g,h,f,j,i){return d.easing[d.easing.def](g,h,f,j,i)},easeInQuad:function(g,h,f,j,i){return j*(h/=i)*h+f},easeOutQuad:function(g,h,f,j,i){return -j*(h/=i)*(h-2)+f},easeInOutQuad:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h+f}return -j/2*((--h)*(h-2)-1)+f},easeInCubic:function(g,h,f,j,i){return j*(h/=i)*h*h+f},easeOutCubic:function(g,h,f,j,i){return j*((h=h/i-1)*h*h+1)+f},easeInOutCubic:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h+f}return j/2*((h-=2)*h*h+2)+f},easeInQuart:function(g,h,f,j,i){return j*(h/=i)*h*h*h+f},easeOutQuart:function(g,h,f,j,i){return -j*((h=h/i-1)*h*h*h-1)+f},easeInOutQuart:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h+f}return -j/2*((h-=2)*h*h*h-2)+f},easeInQuint:function(g,h,f,j,i){return j*(h/=i)*h*h*h*h+f},easeOutQuint:function(g,h,f,j,i){return j*((h=h/i-1)*h*h*h*h+1)+f},easeInOutQuint:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h*h+f}return j/2*((h-=2)*h*h*h*h+2)+f},easeInSine:function(g,h,f,j,i){return -j*Math.cos(h/i*(Math.PI/2))+j+f},easeOutSine:function(g,h,f,j,i){return j*Math.sin(h/i*(Math.PI/2))+f},easeInOutSine:function(g,h,f,j,i){return -j/2*(Math.cos(Math.PI*h/i)-1)+f},easeInExpo:function(g,h,f,j,i){return(h==0)?f:j*Math.pow(2,10*(h/i-1))+f},easeOutExpo:function(g,h,f,j,i){return(h==i)?f+j:j*(-Math.pow(2,-10*h/i)+1)+f},easeInOutExpo:function(g,h,f,j,i){if(h==0){return f}if(h==i){return f+j}if((h/=i/2)<1){return j/2*Math.pow(2,10*(h-1))+f}return j/2*(-Math.pow(2,-10*--h)+2)+f},easeInCirc:function(g,h,f,j,i){return -j*(Math.sqrt(1-(h/=i)*h)-1)+f},easeOutCirc:function(g,h,f,j,i){return j*Math.sqrt(1-(h=h/i-1)*h)+f},easeInOutCirc:function(g,h,f,j,i){if((h/=i/2)<1){return -j/2*(Math.sqrt(1-h*h)-1)+f}return j/2*(Math.sqrt(1-(h-=2)*h)+1)+f},easeInElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h").css({position:"absolute",visibility:"visible",left:-d*(g/e),top:-f*(c/k)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/e,height:c/k,left:l.left+d*(g/e)+(b.options.mode=="show"?(d-Math.floor(e/2))*(g/e):0),top:l.top+f*(c/k)+(b.options.mode=="show"?(f-Math.floor(k/2))*(c/k):0),opacity:b.options.mode=="show"?0:1}).animate({left:l.left+d*(g/e)+(b.options.mode=="show"?0:(d-Math.floor(e/2))*(g/e)),top:l.top+f*(c/k)+(b.options.mode=="show"?0:(f-Math.floor(k/2))*(c/k)),opacity:b.options.mode=="show"?1:0},b.duration||500)}}setTimeout(function(){b.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();if(b.callback){b.callback.apply(h[0])}h.dequeue();a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/* * jQuery UI Effects Fold 1.7.1 * * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Effects/Fold * * Depends: * effects.core.js */ (function(a){a.effects.fold=function(b){return this.queue(function(){var e=a(this),k=["position","top","left"];var h=a.effects.setMode(e,b.options.mode||"hide");var o=b.options.size||15;var n=!(!b.options.horizFirst);var g=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(e,k);e.show();var d=a.effects.createWrapper(e).css({overflow:"hidden"});var i=((h=="show")!=n);var f=i?["width","height"]:["height","width"];var c=i?[d.width(),d.height()]:[d.height(),d.width()];var j=/([0-9]+)%/.exec(o);if(j){o=parseInt(j[1],10)/100*c[h=="hide"?0:1]}if(h=="show"){d.css(n?{height:0,width:o}:{height:o,width:0})}var m={},l={};m[f[0]]=h=="show"?c[0]:o;l[f[1]]=h=="show"?c[1]:0;d.animate(m,g,b.options.easing).animate(l,g,b.options.easing,function(){if(h=="hide"){e.hide()}a.effects.restore(e,k);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(e[0],arguments)}e.dequeue()})})}})(jQuery);;/* * jQuery UI Effects Highlight 1.7.1 * * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Effects/Highlight * * Depends: * effects.core.js */ (function(a){a.effects.highlight=function(b){return this.queue(function(){var e=a(this),d=["backgroundImage","backgroundColor","opacity"];var h=a.effects.setMode(e,b.options.mode||"show");var c=b.options.color||"#ffff99";var g=e.css("backgroundColor");a.effects.save(e,d);e.show();e.css({backgroundImage:"none",backgroundColor:c});var f={backgroundColor:g};if(h=="hide"){f.opacity=0}e.animate(f,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(h=="hide"){e.hide()}a.effects.restore(e,d);if(h=="show"&&a.browser.msie){this.style.removeAttribute("filter")}if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/* * jQuery UI Effects Pulsate 1.7.1 * * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Effects/Pulsate * * Depends: * effects.core.js */ (function(a){a.effects.pulsate=function(b){return this.queue(function(){var d=a(this);var g=a.effects.setMode(d,b.options.mode||"show");var f=b.options.times||5;var e=b.duration?b.duration/2:a.fx.speeds._default/2;if(g=="hide"){f--}if(d.is(":hidden")){d.css("opacity",0);d.show();d.animate({opacity:1},e,b.options.easing);f=f-2}for(var c=0;c').appendTo(document.body).addClass(b.options.className).css({top:d.top,left:d.left,height:f.innerHeight(),width:f.innerWidth(),position:"absolute"}).animate(g,b.duration,b.options.easing,function(){c.remove();(b.callback&&b.callback.apply(f[0],arguments));f.dequeue()})})}})(jQuery);;js/jquery-1.3.2.min.js0000664000076400007640000015764611177541134014227 0ustar draxusdraxus/* * jQuery JavaScript Library v1.3.2 * http://jquery.com/ * * Copyright (c) 2009 John Resig * Dual licensed under the MIT and GPL licenses. * http://docs.jquery.com/License * * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) * Revision: 6246 */ (function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); /* * Sizzle CSS Selector Engine - v0.9.3 * Copyright 2009, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();js/planet.js0000664000076400007640000000004211200076765012723 0ustar draxusdraxus$(document).ready(function(){ }); planet.css0000664000076400007640000000151411200131034012445 0ustar draxusdraxusbody{ background-color: #333333; margin: 0; padding: 0; font-family: "Times New Roman", times, serif; } a, a:visited{ text-decoration: none; } a:hover{ text-decoration: underline } #cabecera{ background: #FFFFFF url(img/cabecera_planet.png) no-repeat right center; border-bottom: 8px solid orange; padding: 10px; } #pie{ border-top: 5px solid orange; padding: 10px; color: orange; clear: both; } h1,h3{ margin-top: 0; } h2{ font-size: 20px; color: #454545; font-style: italic; } h3{ padding-left: 5px; } .blog{ background-color: #232323; width: 25%; min-height: 400px; float: left; margin: 20px; padding: 10px; } .blog h3 a{ color: #FFFFFF; font-size: 14px; } .blog ul li{ color: #454545; font-size: 0.5em; margin-bottom: 7px; } .blog ul li a{ color: #F0F0F0; font-size: 1.5em; } planet.html0000664000076400007640000104024011200144152012626 0ustar draxusdraxus Planet ETSIIT

Planet ETSIIT

El planet informaticotelecomunicado de Granada

Suscripción RSS | Contacto

Atalaya: desde la tela de araña [feed]

The Power of Mind [feed]

  • Blogs y Medios Granada 2009
  • Cómo clonar ramas (branch) en git
  • Navegación jerarquizada de pestañas en Firefox
  • HP LaserJet 1020 en Fedora 10
  • Mobi-Blog: blog de experiencias Erasmus
  • AAP Práctica 3 - Script para Greasemonkey
  • [Meme] Disco aleatorio
  • El Chojin - Superhéroe
  • Finalista de los Premios Web Ideal.es
  • AAP Práctica 1 - Recursos para la asignatura

Vaguedades [feed]

  • Música para el puente: Alexander the Great, Iron Maiden
  • De incultura, fanatismo y falta de autocrítica (en política)
  • Relato: la vuelta
  • Popurrí de P2P, Ministra de Cultura y acciones judiciales
  • (Sextas) Jornadas de Bitácoras y Medios de Comunicación (BMC6)
  • Música: Barón Rojo, "Concierto para ellos"
  • Ángeles González-Sinde, dimisión
  • País de pandereta (google dixit)
  • 364
  • Personajes interesantes de la informática II: Ada Byron

How To Cook For Forty Humans (aka FERGUNET) [feed]

El diegoj [feed]

  • Perdonen que no escriba, pero...
  • ¿Tú también, hijo mío?
  • Cuando tratas con usuarios...
  • Traducir: una forma sencilla de colaborar con el software libre
  • ¿Por qué no usar Microsoft Internet Explorer?
  • Comprar 1, regalar 1
  • El coche de Horatio bajo la atenta mirada de Michael Scofield
  • La mejor noticia del día
  • El año de Linux
  • Ya soy ingeniero

MoviendoCubos [feed]

  • Practicando con la Steadicam
  • Completadas las labores de actualización de Sigatrabajando.com
  • Curso de cine y comic
  • Cómo levantarte y prepararte para irte en 5 minutos
  • VI Jornadas sobre bitácoras y medios de comunicación
  • Videoclips en lenguaje de signos
  • El caso de Domino's Pizza
  • Curso gratuito de XHTML+CSS
  • Kanye West - Gay Fish (Parodia de Southpark)
  • Otra vez esos correos en cadena que dicen que el messenger será de pago

Carlos Tenor [feed]

  • Filosofía de Murphy
  • Nuevas fotos
  • Cambio Feeds a FeedBurned
  • Cambio de imagen
  • Cambios en mis blogs
  • Diario erasmus día 2009-02-01
  • Diario erasmus día 2009-01-16
  • Diario erasmus día 2009-01-15
  • Diario erasmus día 2009-01-14
  • Diario erasmus día 2009-01-09

The Pike Of Plancha [feed]

  • Reiniciar el servidor gráfico (Xorg) en Ubuntu Jaunty con Ctrl+Alt+Backspace
  • Por qué el software libre es la polla con cebolla
  • Humor sesudo
  • Por qué la energía nuclear NO es solución
  • El centro de mi vida
  • El proceso de Bolonia, la lucha continúa
  • ¡¡¡This is España!!!
  • Sonic y el Caballero Negro
  • Otro descubrimiento
  • Meme: disco aleatorio

Blog de Alejandro [feed]

  • Bloque T2.10
  • Bloque T2_8
  • AAP: Practica 4 : XML
  • Bloque T2.4
  • Bloque T2.3
  • Ejercicio bloque T1.8
  • Ej. Bloque T1.7
  • Bloque T1.3
  • Bloque T1.2
  • Ejercicios tema 1 (Introducción) - AAP

Pakitochus' AAP [feed]

  • Ejercicio T8.2.3
  • Bloque T2.7 Ejercicio 1
  • Bloque T2.5 Ejercicio 1
  • Bloque T2.4 Ejercicio 1
  • Bloque T2.2.3
  • Bloque T2.2.2
  • Bloque T2.2.1
  • Practica 2
  • Bloque T1.8 Ejercicio 1
  • Bloque T1.7 Ejercicio 1

BLoG De CRiSTiNa [feed]

  • Taller2: Bloque T2.8
  • Taller2: Bloque T2.7 REPETICION
  • Taller2: Bloque T2.7
  • Taller2: Bloque T2.6
  • Taller2: Bloque T2.5
  • Práctica 4: Introducción al XML
  • Taller2: Bloque T2.4
  • Taller2: Bloque T2.3
  • Taller2: Bloque T2.2
  • Taller2: Bloque T2.1
Última actualización: Wed May 6 01:14:50 2009
scripts/0000775000076400007640000000000011200144223012142 5ustar draxusdraxusscripts/PyRSS2Gen.py0000644000076400007640000003375410333467053014241 0ustar draxusdraxus"""PyRSS2Gen - A Python library for generating RSS 2.0 feeds.""" __name__ = "PyRSS2Gen" __version__ = (1, 0, 0) __author__ = "Andrew Dalke " _generator_name = __name__ + "-" + ".".join(map(str, __version__)) import datetime # Could make this the base class; will need to add 'publish' class WriteXmlMixin: def write_xml(self, outfile, encoding = "iso-8859-1"): from xml.sax import saxutils handler = saxutils.XMLGenerator(outfile, encoding) handler.startDocument() self.publish(handler) handler.endDocument() def to_xml(self, encoding = "iso-8859-1"): try: import cStringIO as StringIO except ImportError: import StringIO f = StringIO.StringIO() self.write_xml(f, encoding) return f.getvalue() def _element(handler, name, obj, d = {}): if isinstance(obj, basestring) or obj is None: # special-case handling to make the API easier # to use for the common case. handler.startElement(name, d) if obj is not None: handler.characters(obj) handler.endElement(name) else: # It better know how to emit the correct XML. obj.publish(handler) def _opt_element(handler, name, obj): if obj is None: return _element(handler, name, obj) def _format_date(dt): """convert a datetime into an RFC 822 formatted date Input date must be in GMT. """ # Looks like: # Sat, 07 Sep 2002 00:00:01 GMT # Can't use strftime because that's locale dependent # # Isn't there a standard way to do this for Python? The # rfc822 and email.Utils modules assume a timestamp. The # following is based on the rfc822 module. return "%s, %02d %s %04d %02d:%02d:%02d GMT" % ( ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][dt.weekday()], dt.day, ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][dt.month-1], dt.year, dt.hour, dt.minute, dt.second) ## # A couple simple wrapper objects for the fields which # take a simple value other than a string. class IntElement: """implements the 'publish' API for integers Takes the tag name and the integer value to publish. (Could be used for anything which uses str() to be published to text for XML.) """ element_attrs = {} def __init__(self, name, val): self.name = name self.val = val def publish(self, handler): handler.startElement(self.name, self.element_attrs) handler.characters(str(self.val)) handler.endElement(self.name) class DateElement: """implements the 'publish' API for a datetime.datetime Takes the tag name and the datetime to publish. Converts the datetime to RFC 2822 timestamp (4-digit year). """ def __init__(self, name, dt): self.name = name self.dt = dt def publish(self, handler): _element(handler, self.name, _format_date(self.dt)) #### class Category: """Publish a category element""" def __init__(self, category, domain = None): self.category = category self.domain = domain def publish(self, handler): d = {} if self.domain is not None: d["domain"] = self.domain _element(handler, "category", self.category, d) class Cloud: """Publish a cloud""" def __init__(self, domain, port, path, registerProcedure, protocol): self.domain = domain self.port = port self.path = path self.registerProcedure = registerProcedure self.protocol = protocol def publish(self, handler): _element(handler, "cloud", None, { "domain": self.domain, "port": str(self.port), "path": self.path, "registerProcedure": self.registerProcedure, "protocol": self.protocol}) class Image: """Publish a channel Image""" element_attrs = {} def __init__(self, url, title, link, width = None, height = None, description = None): self.url = url self.title = title self.link = link self.width = width self.height = height self.description = description def publish(self, handler): handler.startElement("image", self.element_attrs) _element(handler, "url", self.url) _element(handler, "title", self.title) _element(handler, "link", self.link) width = self.width if isinstance(width, int): width = IntElement("width", width) _opt_element(handler, "width", width) height = self.height if isinstance(height, int): height = IntElement("height", height) _opt_element(handler, "height", height) _opt_element(handler, "description", self.description) handler.endElement("image") class Guid: """Publish a guid Defaults to being a permalink, which is the assumption if it's omitted. Hence strings are always permalinks. """ def __init__(self, guid, isPermaLink = 1): self.guid = guid self.isPermaLink = isPermaLink def publish(self, handler): d = {} if self.isPermaLink: d["isPermaLink"] = "true" else: d["isPermaLink"] = "false" _element(handler, "guid", self.guid, d) class TextInput: """Publish a textInput Apparently this is rarely used. """ element_attrs = {} def __init__(self, title, description, name, link): self.title = title self.description = description self.name = name self.link = link def publish(self, handler): handler.startElement("textInput", self.element_attrs) _element(handler, "title", self.title) _element(handler, "description", self.description) _element(handler, "name", self.name) _element(handler, "link", self.link) handler.endElement("textInput") class Enclosure: """Publish an enclosure""" def __init__(self, url, length, type): self.url = url self.length = length self.type = type def publish(self, handler): _element(handler, "enclosure", None, {"url": self.url, "length": str(self.length), "type": self.type, }) class Source: """Publish the item's original source, used by aggregators""" def __init__(self, name, url): self.name = name self.url = url def publish(self, handler): _element(handler, "source", self.name, {"url": self.url}) class SkipHours: """Publish the skipHours This takes a list of hours, as integers. """ element_attrs = {} def __init__(self, hours): self.hours = hours def publish(self, handler): if self.hours: handler.startElement("skipHours", self.element_attrs) for hour in self.hours: _element(handler, "hour", str(hour)) handler.endElement("skipHours") class SkipDays: """Publish the skipDays This takes a list of days as strings. """ element_attrs = {} def __init__(self, days): self.days = days def publish(self, handler): if self.days: handler.startElement("skipDays", self.element_attrs) for day in self.days: _element(handler, "day", day) handler.endElement("skipDays") class RSS2(WriteXmlMixin): """The main RSS class. Stores the channel attributes, with the "category" elements under ".categories" and the RSS items under ".items". """ rss_attrs = {"version": "2.0"} element_attrs = {} def __init__(self, title, link, description, language = None, copyright = None, managingEditor = None, webMaster = None, pubDate = None, # a datetime, *in* *GMT* lastBuildDate = None, # a datetime categories = None, # list of strings or Category generator = _generator_name, docs = "http://blogs.law.harvard.edu/tech/rss", cloud = None, # a Cloud ttl = None, # integer number of minutes image = None, # an Image rating = None, # a string; I don't know how it's used textInput = None, # a TextInput skipHours = None, # a SkipHours with a list of integers skipDays = None, # a SkipDays with a list of strings items = None, # list of RSSItems ): self.title = title self.link = link self.description = description self.language = language self.copyright = copyright self.managingEditor = managingEditor self.webMaster = webMaster self.pubDate = pubDate self.lastBuildDate = lastBuildDate if categories is None: categories = [] self.categories = categories self.generator = generator self.docs = docs self.cloud = cloud self.ttl = ttl self.image = image self.rating = rating self.textInput = textInput self.skipHours = skipHours self.skipDays = skipDays if items is None: items = [] self.items = items def publish(self, handler): handler.startElement("rss", self.rss_attrs) handler.startElement("channel", self.element_attrs) _element(handler, "title", self.title) _element(handler, "link", self.link) _element(handler, "description", self.description) self.publish_extensions(handler) _opt_element(handler, "language", self.language) _opt_element(handler, "copyright", self.copyright) _opt_element(handler, "managingEditor", self.managingEditor) _opt_element(handler, "webMaster", self.webMaster) pubDate = self.pubDate if isinstance(pubDate, datetime.datetime): pubDate = DateElement("pubDate", pubDate) _opt_element(handler, "pubDate", pubDate) lastBuildDate = self.lastBuildDate if isinstance(lastBuildDate, datetime.datetime): lastBuildDate = DateElement("lastBuildDate", lastBuildDate) _opt_element(handler, "lastBuildDate", lastBuildDate) for category in self.categories: if isinstance(category, basestring): category = Category(category) category.publish(handler) _opt_element(handler, "generator", self.generator) _opt_element(handler, "docs", self.docs) if self.cloud is not None: self.cloud.publish(handler) ttl = self.ttl if isinstance(self.ttl, int): ttl = IntElement("ttl", ttl) _opt_element(handler, "tt", ttl) if self.image is not None: self.image.publish(handler) _opt_element(handler, "rating", self.rating) if self.textInput is not None: self.textInput.publish(handler) if self.skipHours is not None: self.skipHours.publish(handler) if self.skipDays is not None: self.skipDays.publish(handler) for item in self.items: item.publish(handler) handler.endElement("channel") handler.endElement("rss") def publish_extensions(self, handler): # Derived classes can hook into this to insert # output after the three required fields. pass class RSSItem(WriteXmlMixin): """Publish an RSS Item""" element_attrs = {} def __init__(self, title = None, # string link = None, # url as string description = None, # string author = None, # email address as string categories = None, # list of string or Category comments = None, # url as string enclosure = None, # an Enclosure guid = None, # a unique string pubDate = None, # a datetime source = None, # a Source ): if title is None and description is None: raise TypeError( "must define at least one of 'title' or 'description'") self.title = title self.link = link self.description = description self.author = author if categories is None: categories = [] self.categories = categories self.comments = comments self.enclosure = enclosure self.guid = guid self.pubDate = pubDate self.source = source # It sure does get tedious typing these names three times... def publish(self, handler): handler.startElement("item", self.element_attrs) _opt_element(handler, "title", self.title) _opt_element(handler, "link", self.link) self.publish_extensions(handler) _opt_element(handler, "description", self.description) _opt_element(handler, "author", self.author) for category in self.categories: if isinstance(category, basestring): category = Category(category) category.publish(handler) _opt_element(handler, "comments", self.comments) if self.enclosure is not None: self.enclosure.publish(handler) _opt_element(handler, "guid", self.guid) pubDate = self.pubDate if isinstance(pubDate, datetime.datetime): pubDate = DateElement("pubDate", pubDate) _opt_element(handler, "pubDate", pubDate) if self.source is not None: self.source.publish(handler) handler.endElement("item") def publish_extensions(self, handler): # Derived classes can hook into this to insert # output after the title and link elements pass scripts/PyRSS2Gen.pyc0000664000076400007640000003522411200135506014365 0ustar draxusdraxus +nnCc@svdZdZd(ZdZeddieeeZddkZd d)d YZ hd Z d Z d Z dd*dYZ dd+dYZdd,dYZdd-dYZdd.dYZdd/dYZdd0dYZdd1dYZdd2dYZd d3d!YZd"d4d#YZd$e fd%YZd&e fd'YZdS(5s:PyRSS2Gen - A Python library for generating RSS 2.0 feeds.t PyRSS2Geniis(Andrew Dalke t-t.iNt WriteXmlMixincBs eZddZddZRS(s iso-8859-1cCsGddkl}|i||}|i|i||idS(Ni(tsaxutils(txml.saxRt XMLGeneratort startDocumenttpublisht endDocument(tselftoutfiletencodingRthandler((s$/var/www/planet/scripts/PyRSS2Gen.pyt write_xml s   cCsXyddk}Wntj oddk}nX|i}|i|||iS(Ni(t cStringIOt ImportErrortStringIORtgetvalue(R R Rtf((s$/var/www/planet/scripts/PyRSS2Gen.pytto_xmls (t__name__t __module__RR(((s$/var/www/planet/scripts/PyRSS2Gen.pyR s cCsmt|tp |djo?|i|||dj o|i|n|i|n|i|dS(N(t isinstancet basestringtNonet startElementt characterst endElementR(R tnametobjtd((s$/var/www/planet/scripts/PyRSS2Gen.pyt_elements  cCs)|djodSnt|||dS(N(RR (R RR((s$/var/www/planet/scripts/PyRSS2Gen.pyt _opt_element*s cCszddddddddg|i|id d d d d dddddddg |id|i|i|i|ifS(sVconvert a datetime into an RFC 822 formatted date Input date must be in GMT. s#%s, %02d %s %04d %02d:%02d:%02d GMTtMontTuetWedtThutFritSattSuntJantFebtMartAprtMaytJuntJultAugtSeptOcttNovtDeci(tweekdaytdaytmonthtyearthourtminutetsecond(tdt((s$/var/www/planet/scripts/PyRSS2Gen.pyt _format_date0s " t IntElementcBs&eZdZhZdZdZRS(simplements the 'publish' API for integers Takes the tag name and the integer value to publish. (Could be used for anything which uses str() to be published to text for XML.) cCs||_||_dS(N(Rtval(R RR?((s$/var/www/planet/scripts/PyRSS2Gen.pyt__init__Ps cCs@|i|i|i|it|i|i|idS(N(RRt element_attrsRtstrR?R(R R ((s$/var/www/planet/scripts/PyRSS2Gen.pyRSs(RRt__doc__RAR@R(((s$/var/www/planet/scripts/PyRSS2Gen.pyR>Gs t DateElementcBs eZdZdZdZRS(simplements the 'publish' API for a datetime.datetime Takes the tag name and the datetime to publish. Converts the datetime to RFC 2822 timestamp (4-digit year). cCs||_||_dS(N(RR<(R RR<((s$/var/www/planet/scripts/PyRSS2Gen.pyR@_s cCs t||it|idS(N(R RR=R<(R R ((s$/var/www/planet/scripts/PyRSS2Gen.pyRbs(RRRCR@R(((s$/var/www/planet/scripts/PyRSS2Gen.pyRDXs tCategorycBs#eZdZddZdZRS(sPublish a category elementcCs||_||_dS(N(tcategorytdomain(R RFRG((s$/var/www/planet/scripts/PyRSS2Gen.pyR@hs cCsAh}|idj o|i|dR!RSRTR(R R RRRS((s$/var/www/planet/scripts/PyRSS2Gen.pyRs  N(RRRCRARR@R(((s$/var/www/planet/scripts/PyRSS2Gen.pyRNstGuidcBs#eZdZddZdZRS(sPublish a guid Defaults to being a permalink, which is the assumption if it's omitted. Hence strings are always permalinks. icCs||_||_dS(N(tguidt isPermaLink(R RXRY((s$/var/www/planet/scripts/PyRSS2Gen.pyR@s cCsBh}|iod|d|iD]3}t|tot|}n|i|q@Wt|d |it|d |i|idj o|ii|n|i}t|itotd|}nt|d||idj o|ii|nt|d|i|idj o|ii|n|i dj o|i i|n|i!dj o|i!i|nx|i"D]}|i|qW|i#d|i#ddS(NtrsstchannelRPRQRTRlRmRnRoRpRqRsRtRutttRv($Rt rss_attrsRAR RPRQRTtpublish_extensionsR!RlRmRnRoRpRtdatetimeRDRqRrRRERRsRtRMRRuRVR>RURvR]RfRiRwR(R R RpRqRFRutitem((s$/var/www/planet/scripts/PyRSS2Gen.pyR;sZ       cCsdS(N((R R ((s$/var/www/planet/scripts/PyRSS2Gen.pyR|tsN( RRRCR{RARt_generator_nameR@RR|(((s$/var/www/planet/scripts/PyRSS2Gen.pyRjs,  9tRSSItemc BsMeZdZhZddddddddddd ZdZdZRS(sPublish an RSS Itemc Cs|djo|djotdn||_||_||_||_|djo g}n||_||_||_||_ | |_ | |_ dS(Ns4must define at least one of 'title' or 'description'( Rt TypeErrorRPRQRTtauthorRrtcommentsRaRXRpRc( R RPRQRTRRrRRaRXRpRc((s$/var/www/planet/scripts/PyRSS2Gen.pyR@~s             cCsk|id|it|d|it|d|i|i|t|d|it|d|ix>|iD]3}t |t ot |}n|i |qvWt|d|i |idj o|ii |nt|d|i|i}t |tiotd|}nt|d||idj o|ii |n|iddS( NR~RPRQRTRRRXRp(RRAR!RPRQR|RTRRrRRRERRRaRRXRpR}RDRcR(R R RFRp((s$/var/www/planet/scripts/PyRSS2Gen.pyRs,   cCsdS(N((R R ((s$/var/www/planet/scripts/PyRSS2Gen.pyR|sN(RRRCRARR@RR|(((s$/var/www/planet/scripts/PyRSS2Gen.pyR{s  (iii(((((((((((((RCRt __version__t __author__tjointmapRBRR}RR R!R=R>RDRERHRNRWR\R^RbRdRgRjR(((s$/var/www/planet/scripts/PyRSS2Gen.pyss,     ! scripts/feedparser.pyc0000664000076400007640000030126511200142016015004 0ustar draxusdraxus VCc?@sX dZdZdZdZdddddgZd Zd eZd Zd gZd Z d dgZ ddk Z ddk Z ddk Z ddkZddkZddkZddkZddkZddkZddkZddkZyddklZWnddklZnXyddkZWn eZnXyddkZWn eZnXy6ddkZeiieddk l!Z"dZ#Wnd Z#dZ"nXyddk$Z$ddk%Z%WneZ$Z%nXyddk&Z'WnnXyddk(Z(WnnXy3ddk)Z)eoddk*Z)de)i+_nWn eZ)nXde,fdYZ-de-fdYZ.de-fdYZ/de-fdYZ0de,fdYZ1e i2de _3e i2d e _4e i2d!e _5hd"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdCdKZ?dLfdMYZ@e#o&dNe@eiiAiBfdOYZCndPe iDfdQYZEdRe@eEfdSYZFdTeEfdUYZGdVZHdWeEfdXYZIdYZJdZeiKeiLeiMfd[YZNd\ZOgZPd]ZQd^d_d`dadbdcdddedfdgdhdidjd#gZRgZSeRD]aZTeSeTiUdcdkiUdldmiUdndoiUdpdqiUdrdsiUdjdtdudvdwq0[SZV[TgZWeVD]ZXeWe i2eXiYq[WZZ[XdxZ[eQe[dyZ\dzZ]d{Z^d|Z_d}Z`e i2d~e\e]e^fZae i2de_e`fZbdZceQecdZdeQede i2dZedZfeQefhdd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd<dd s4.1sCopyright (c) 2002-2006, Mark Pilgrim, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.s'Mark Pilgrim s%Jason Diamond s'John Beimler s1Fazal Majid s"Aaron Swartz s(Kevin Marks is.UniversalFeedParser/%s +http://feedparser.org/sapplication/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1t drv_libxml2tuTidytmxTidyiN(tStringIO(tescapeicCs:|idd}|idd}|idd}|S(Nt&s&t>s>ti?iiiiiiiiii`i:i#i@i'i=i"iiaibicidieifigihiiiiiiiiiijikiliminioipiqiriiiiiiii~isitiuiviwixiyiziiiiiiiiiiiiiiiiiiiiiii{iAiBiCiDiEiFiGiHiIiiiiiii}iJiKiLiMiNiOiPiQiRiiiiiii\iiSiTiUiViWiXiYiZiiiiiii0i1i2i3i4i5i6i7i8i9iiiiiiiRi(iiiiii iiiiii i i iiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiii[i.i<i(i+i!i&iiiiiiiiii]i$i*i)i;i^i-i/iiiiiiiii|i,i%i_i>i?iiiiiiiiii`i:i#i@i'i=i"iiaibicidieifigihiiiiiiiiiijikiliminioipiqiriiiiiiii~isitiuiviwixiyiziiiiiiiiiiiiiiiiiiiiiii{iAiBiCiDiEiFiGiHiIiiiiiii}iJiKiLiMiNiOiPiQiRiiiiiii\iiSiTiUiViWiXiYiZiiiiiii0i1i2i3i4i5i6i7i8i9iiiiii(t_ebcdic_to_ascii_maptstringt maketranstjointmaptchrtranget translate(tstemapRn((s%/var/www/planet/scripts/feedparser.pyt_ebcdic_to_asciis* :s&^([A-Za-z][A-Za-z0-9+-.]*://)(/*)(.*?)cCs"tid|}ti||S(Ns\1\3(t _urifixertsubturlparseturljoin(tbaseturi((s%/var/www/planet/scripts/feedparser.pyt_urljoinst_FeedParserMixinc BsEeZhdd<dd<dd<dd<dd<dd<dd<dd<dd<dd <dd <dd <dd <d d<dd<dd<dd<dd<dd<dd<dd<dd<dd <d!d"<d#d$<d%d&<d'd(<d)d*<d+d,<d-d.<d/d0<d1d2<d3d4<d5d6<d5d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQ<dRdS<dTdU<dVdW<dXdY<dZd[<d\d]<d^d_<d`da<dbdc<ddde<dfdge>Z?dZ@e@ZAdZBdZCdZDdZEdZFeFZGeFZHdZIeIZJeIZKdZLeLZMdZNeNZOdZPddZQdZRddZSdZTeTZUeTZVdZWeWZXeWZYdZZeZZ[eZZ\dZ]e]Z^e]Z_dZ`e`Zae`ZbdZcecZddZeeeZfdZgegZhdZieiZjdZkekZldZmemZnemZodZpepZqepZrdZsesZtesZuesZvesZwdZxexZyexZzexZ{exZ|dZ}e}Z~dZeZdZdZdZdZdZdZdZeZeZdZdZdZeZeZeZdZdZeZdZeZdZdZdZeZeZdZeZeZdZdZdZeZdZeZdZeZdZdZdZdZdZeZdZeZdZdZdZdZdZdZeZdZeZdZeZeZeZeZeZdZeZdZdZRS(Rshttp://backend.userland.com/rsss%http://blogs.law.harvard.edu/tech/rssshttp://purl.org/rss/1.0/s&http://my.netscape.com/rdf/simple/0.9/shttp://example.com/newformat#shttp://example.com/nechoshttp://purl.org/echo/suri/of/echo/namespace#shttp://purl.org/pie/shttp://purl.org/atom/ns#shttp://www.w3.org/2005/Atoms'http://purl.org/rss/1.0/modules/rss091#tadminshttp://webns.net/mvcb/tags,http://purl.org/rss/1.0/modules/aggregation/tannotates)http://purl.org/rss/1.0/modules/annotate/taudios!http://media.tangent.org/rss/1.0/t blogChannels-http://backend.userland.com/blogChannelModuletccshttp://web.resource.org/cc/tcreativeCommonss4http://backend.userland.com/creativeCommonsRssModuletcos'http://purl.org/rss/1.0/modules/companytcontents(http://purl.org/rss/1.0/modules/content/tcps&http://my.theinfo.org/changed/1.0/rss/tdcs http://purl.org/dc/elements/1.1/tdctermsshttp://purl.org/dc/terms/temails&http://purl.org/rss/1.0/modules/email/tevs&http://purl.org/rss/1.0/modules/event/t feedburners*http://rssnamespace.org/feedburner/ext/1.0tfmshttp://freshmeat.net/rss/fm/tfoafshttp://xmlns.com/foaf/0.1/tgeos(http://www.w3.org/2003/01/geo/wgs84_pos#ticbmshttp://postneo.com/icbm/timages&http://purl.org/rss/1.0/modules/image/tituness*http://www.itunes.com/DTDs/PodCast-1.0.dtds'http://example.com/DTDs/PodCast-1.0.dtdtls%http://purl.org/rss/1.0/modules/link/tmediashttp://search.yahoo.com/mrsstpingbacks4http://madskills.com/public/xml/rss/module/pingback/tprisms.http://prismstandard.org/namespaces/1.2/basic/trdfs+http://www.w3.org/1999/02/22-rdf-syntax-ns#trdfss%http://www.w3.org/2000/01/rdf-schema#trefs*http://purl.org/rss/1.0/modules/reference/treqvs*http://purl.org/rss/1.0/modules/richequiv/tsearchs'http://purl.org/rss/1.0/modules/search/tslashs&http://purl.org/rss/1.0/modules/slash/tsoaps)http://schemas.xmlsoap.org/soap/envelope/tsss.http://purl.org/rss/1.0/modules/servicestatus/tstrs-http://hacks.benhammersley.com/rss/streaming/Rys-http://purl.org/rss/1.0/modules/subscription/tsys,http://purl.org/rss/1.0/modules/syndication/ttaxos)http://purl.org/rss/1.0/modules/taxonomy/tthrs*http://purl.org/rss/1.0/modules/threading/ttis*http://purl.org/rss/1.0/modules/textinput/t trackbacks5http://madskills.com/public/xml/rss/module/trackback/twfws$http://wellformedweb.org/commentAPI/twikis%http://purl.org/rss/1.0/modules/wiki/txhtmlshttp://www.w3.org/1999/xhtmltxmls$http://www.w3.org/XML/1998/namespacetszfs/http://schemas.pocketsoap.com/rss/myDescModule/tlinkR0t wfw_commenttwfw_commentrsstdocsR:R9tcommentstlicenseticontlogottitleR7tinfoRER6RBRAR8s text/htmlsapplication/xhtml+xmlsutf-8cCs^totiidn|ip7x4|iiD]\}}||i|i                       cCstotiid||fng}|D]\}}||i|fq0~}g}|D]3\}}|||d#jo |ip|fqc~}t|}|id|idp|i}t|i||_|id|id} | djo d} n| djo |i } n| o"|d$jo| |i d s %s="%s"RiiRaRRR8tnameR:R9twidththeightt_start_(Rstype(sfeedsrsssrdf:RDF(stitleslinks descriptionsname(stitleslinks descriptionsurlshrefRR(RRRRRR*RORR~RiRRRtappendRRdttrackNamespaceRRRStendswithtsplitt handle_dataRptfindRRRtgetattrR_tpush(RTRWtattrsRVR(R)t_[2]tattrsDRRtprefixR}t_[3]tttsuffixt methodnametmethod((s%/var/www/planet/scripts/feedparser.pytunknown_starttagsZ3G %        =# I   cCstotiid|n|iddjo|idd\}}nd|}}|ii||}|o|d}nd||}yt||}|Wn$t j o|i ||nX|i oD|i i do1|i idd id  od |i dRi(RRRRRRRRORR_tpopRRRSRRRRRR(RTRWRRRR((s%/var/www/planet/scripts/feedparser.pytunknown_endtags6  =#     c Cs|ipdSn|i}|djod |}nJ|d d jot|dd}n t|}t|id}|iddi|dS(Nt34t38t39t60t62tx22tx26tx27tx3ctx3es&#%s;itxiisutf-8ii( RRRRRRRRRR(RRtinttunichrtencodeR(RTRttexttc((s%/var/www/planet/scripts/feedparser.pythandle_charrefs    cCs|ipdSntotiid|n|d jod|}nSd}y||Wntj od|}nXt||id }|id d i|dS( Ns"entering handle_entityref with %s tlttgttquottamptaposs&%s;cSswddk}t|do|i|Sn|i|}|ido%|idot|dd!Snt|S(Nitname2codepoints&#t;i(thtmlentitydefsR^Rt entitydefsRdRRtord(R(R ((s%/var/www/planet/scripts/feedparser.pytname2cps   sutf-8ii(RRRRR( RRRRRRcRRR(RTRRR ((s%/var/www/planet/scripts/feedparser.pythandle_entityrefs   icCs^|ipdSn|o)|iiddjot|}n|iddi|dS(NRPsapplication/xhtml+xmlii(RRROR R(RTRR((s%/var/www/planet/scripts/feedparser.pyRs   cCsdS(N((RTR((s%/var/www/planet/scripts/feedparser.pythandle_commentscCsdS(N((RTR((s%/var/www/planet/scripts/feedparser.pyt handle_pi!scCsdS(N((RTR((s%/var/www/planet/scripts/feedparser.pyt handle_decl%scCstotiidn|i||d!djoe|iid|}|djot|i}n|it|i|d|!d|dSn|iid|}|d SdS( Nsentering parse_declaration i s iiiRi( RRRRtrawdataRtlenRR (RTtiR(((s%/var/www/planet/scripts/feedparser.pytparse_declaration(s $ cCsU|i}|djo d}n/|djo d}n|djo d}n|S(NRs text/plainthtmls text/htmlRsapplication/xhtml+xml(R(RTt contentType((s%/var/www/planet/scripts/feedparser.pytmapContentType4s       cCs|i}||fd jo|i o d|_n|djo|i o d|_n|djo|i o d|_n|iddjod }|}n|ii|o,|i||i|<||i|i|s     cCst|ipd|S(NR(R~R(RTR}((s%/var/www/planet/scripts/feedparser.pyt resolveURIPscCs|S(N((RTtelementR ((s%/var/www/planet/scripts/feedparser.pytdecodeEntitiesSscCs|ii||ggdS(N(RR(RTRt expectingText((s%/var/www/planet/scripts/feedparser.pyRVscCsa|ipdSn|idd|jodSn|ii\}}}di|}|o|i}n|p|Snto[|iiddoEyti|}Wqti j oqti j oqXn||i jo|o|i |}n|iiddp|i ||}ny|id=Wntj onXy|id=Wntj onX|i|iidd|ijo0||ijot||i|i}qn|i|iidd|ijo*||ijot||i}q)n|io=t|tdjo$yt||i}WqpqpXn|d jo|Sn|io|i o |d joO|idi|gti|i}||d <|id|i|q]|d jo9||id|<|o||idd ddt _parse_date(RTR[((s%/var/www/planet/scripts/feedparser.pyt_end_publishedscCs|idddS(NR2i(R(RTR((s%/var/www/planet/scripts/feedparser.pyt_start_updated$scCs/|id}t|}|id|dS(NR2R4(RR}R>(RTR[t parsed_value((s%/var/www/planet/scripts/feedparser.pyt _end_updated+s cCs|idddS(Ntcreatedi(R(RTR((s%/var/www/planet/scripts/feedparser.pyt_start_created4scCs)|id}|idt|dS(NRtcreated_parsed(RR>R}(RTR[((s%/var/www/planet/scripts/feedparser.pyt _end_created8scCs|idddS(Ntexpiredi(R(RTR((s%/var/www/planet/scripts/feedparser.pyt_start_expirationdate=scCs#|idt|iddS(Ntexpired_parsedR(R>R}R(RT((s%/var/www/planet/scripts/feedparser.pyt_end_expirationdate@scCsV|idd|i|d}|o|iddi|n|iddS(NRis rdf:resourceii(RR<RRR(RTRR[((s%/var/www/planet/scripts/feedparser.pyt_start_cc_licenseCs cCs|idddS(NRi(R(RTR((s%/var/www/planet/scripts/feedparser.pyt_start_creativecommons_licenseJscCs|iddS(NR(R(RT((s%/var/www/planet/scripts/feedparser.pyt_end_creativecommons_licenseMscCs|i}|idg}| o| o| odSnth|d<|d<|d<}||jo2|ith|d<|d<|d<ndS(NRIRJRLtlabel(R0R]R+R(RTRJRLRR4RIR[((s%/var/www/planet/scripts/feedparser.pyt_addTagPs ' cCstotiidt|n|id}|id|id}|id}|i||||idddS(Ns!entering _start_category with %s RJRLtdomainRRHi(RRRRtreprRORR(RTRRJRLR((s%/var/www/planet/scripts/feedparser.pyt_start_categoryXscCs7x0|idiD]}|i|ddqWdS(Ntitunes_keywordsshttp://www.itunes.com/(RRRRi(RTRJ((s%/var/www/planet/scripts/feedparser.pyt_end_itunes_keywordsbscCs0|i|iddd|idddS(NRshttp://www.itunes.com/RHi(RRORiR(RTR((s%/var/www/planet/scripts/feedparser.pyt_start_itunes_categoryfscCs|id}|pdSn|i}|d}|o/t|o"|dd o||ddRuR0RS(RTR[((s%/var/www/planet/scripts/feedparser.pyt _end_guids* cCs1|id|d|ip|ip|idS(NRs text/plain(R7RRR(RTR((s%/var/www/planet/scripts/feedparser.pyt _start_titlescCsW|id}|i}|io||dd|i|}|ido|i|d|d(RTtcopyToDescriptionR[((s%/var/www/planet/scripts/feedparser.pyR$s+cCs<|iddth|idd<|idRARBRDt_start_feedinfoRCRJRKt _end_feedRLRMROt_start_textInputRPt_end_textInputRRt_start_managingeditort_start_dc_authort_start_dc_creatort_start_itunes_authorRTt_end_managingeditort_end_dc_authort_end_dc_creatort_end_itunes_authorRVRWRZR[R\R^R_t_start_itunes_nameR]t_end_itunes_nameRbRcRdReRft_start_homepaget _start_uriRgt _end_homepaget_end_uriRht_start_itunes_emailRit_end_itunes_emailR0R`RaRSRpt_start_taglinet_start_itunes_subtitleRqt _end_taglinet_end_itunes_subtitleRrt_start_dc_rightst_start_copyrightRst_end_dc_rightst_end_copyrightRvt _start_entryt_start_productRwt _end_entryRxt_start_languageRyt _end_languageRzt_start_webmasterR{t_end_webmasterR|t_start_dcterms_issuedt _start_issuedR~t_end_dcterms_issuedt _end_issuedRRFt_start_dcterms_modifiedt_start_pubdatet_start_dc_dateRRGt_end_dcterms_modifiedt _end_pubdatet _end_dc_dateRt_start_dcterms_createdRt_end_dcterms_createdRRRRRRRt_start_dc_subjectt_start_keywordsRRRt_end_dc_subjectt _end_keywordst_end_itunes_categoryRRHt_start_producturlRIt_end_producturlRRRt_start_dc_titlet_start_media_titleRt _end_dc_titlet_end_media_titleRRRt _end_abstractRt!_start_feedburner_browserfriendlyRt_end_feedburner_browserfriendlyRRRRRt_start_itunes_summaryRt_end_itunes_summaryRRRRRRt_start_xhtml_bodyRt_start_fullitemRt _end_bodyt_end_xhtml_bodyt_end_content_encodedt _end_fullitemt _end_prodlinkRt_start_itunes_linkRR(((s%/var/www/planet/scripts/feedparser.pyR s                                                           '!! " F %           Y                                                                                    t_StrictFeedParsercBsGeZdZdZdZdZdZdZdZRS(cCs]totiidntiiii|t i||||d|_ d|_ dS(Nstrying StrictFeedParser i( RRRRRtsaxthandlertContentHandlerRRtbozoRitexc(RTRRR((s%/var/www/planet/scripts/feedparser.pyR>s  cCs|i||dS(N(R(RTRR}((s%/var/www/planet/scripts/feedparser.pytstartPrefixMappingEsc Cs"|\}}t|pdi}|iddjod}|}n|o-|iddjo|idd}nd}|ii||}|oL|djp|djo|djo%|ii| ot d|n|o|d|}nt|i}t o0t i i d|||||i|fnh} xz|iiD]i\\}} } |pdi}|ii|d}|o|d| } n| | t| is>s't's"t"u( Rltcompilet IGNORECASERyR/RRRPRR*R+R,(RTR ((s%/var/www/planet/scripts/feedparser.pyR,s!#c Cs~g}|D]\}}||i|fq ~}g}|D]3\}}|||djo |ip|fq>~}|S(NRRP(srelstype(R(RTRRVR(R)R((s%/var/www/planet/scripts/feedparser.pytnormalize_attrss3Gc Cstotiid|ng}xb|D]Z\}}t|tdjot||i}n|it||i|fq,Wdig}|D]\}}|d||fq~i |i}||i jo|i idt n|i idt dS(Ns-_BaseHTMLProcessor, unknown_starttag, tag=%s uu %s="%s"s<%(tag)s%(strattrs)s />s<%(tag)s%(strattrs)s>( RRRRRPR-RRRpRR-R2tlocals(RTRWRtuattrsRUR[RVtstrattrs((s%/var/www/planet/scripts/feedparser.pyRs #FcCs/||ijo|iidtndS(Ns (R-R2RR5(RTRW((s%/var/www/planet/scripts/feedparser.pyRscCs|iidtdS(Ns &#%(ref)s;(R2RR5(RTR((s%/var/www/planet/scripts/feedparser.pyRscCs|iidtdS(Ns &%(ref)s;(R2RR5(RTR((s%/var/www/planet/scripts/feedparser.pyRscCs3totiid|n|ii|dS(Ns)_BaseHTMLProcessor, handle_text, text=%s (RRRRR2R(RTR((s%/var/www/planet/scripts/feedparser.pyRscCs|iidtdS(Ns(R2RR5(RTR((s%/var/www/planet/scripts/feedparser.pyRscCs|iidtdS(Ns (R2RR5(RTR((s%/var/www/planet/scripts/feedparser.pyRscCs|iidtdS(Ns (R2RR5(RTR((s%/var/www/planet/scripts/feedparser.pyRss-zA-Z][-_.a-zA-Z0-9:]*\s*cCs|i}t|}||jodSn|i||}|oQ|i}|i}|t||jodSn|i|ifSn|i|dSdS(Ni(Ni(Ni(Ni( RRRit_new_declname_matchRmR"RtendR(RTRt declstartposRtntmRuR((s%/var/www/planet/scripts/feedparser.pyt _scan_names      cCs1dig}|iD]}|t|q~S(s(Return processed HTML as a single stringR(RpR2R(RTRVtp((s%/var/www/planet/scripts/feedparser.pyR3s(R R R-RR,R/R,R4RRRRRRRRRlR2R.R8R=R3(((s%/var/www/planet/scripts/feedparser.pyRs$             t_LooseFeedParsercBseZdZdZRS(cCs*tii|ti||||dS(N(R*R+RR(RTRRR((s%/var/www/planet/scripts/feedparser.pyRscCsI|idd}|idd}|idd}|idd}|idd}|id d}|id d }|id d }|id d}|idd}|iido~|iiddid o^|idd}|idd}|idd}|id d}|idd}n|S(Ns<s<s<s>s>s>s&s&s&s"s"s"s's's'RPRRRRR1R0(RRRSROR(RTRR ((s%/var/www/planet/scripts/feedparser.pyRs"3(R R RR(((s%/var/www/planet/scripts/feedparser.pyR?s t_RelativeURIResolvercBsteZdd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7gZdZdZdZRS(8taR9tapplettcodebaseRt blockquotetcitetbodyt backgroundtdeltformtactionR#tlongdescRtiframetheadtprofileR%tusemapR&tinsRtobjecttclassidR tqtscriptcCsti||||_dS(N(RRR(RTRR((s%/var/www/planet/scripts/feedparser.pyR+scCst|i|S(N(R~R(RTR}((s%/var/www/planet/scripts/feedparser.pyR/scCsy|i|}g}|D]?\}}||||f|ijo|i|p|fq~}ti|||dS(N(R4t relative_urisRRR(RTRWRRVRUR[((s%/var/www/planet/scripts/feedparser.pyR2sS(RAshref(RBRC(sareashref(RDRE(RFRG(RHRE(RIsaction(sframeRK(sframessrc(RLRK(RLssrc(sheadRN(simgRK(simgssrc(simgRO(sinputssrc(sinputRO(RPRE(slinkshref(sobjectRR(sobjectRC(sobjectsdata(sobjectRO(RSRE(RTssrc(R R RURRR(((s%/var/www/planet/scripts/feedparser.pyR@s8   cCsAtotiidnt||}|i||iS(Nsentering _resolveRelativeURIs (RRRRR@R,R3(t htmlSourcetbaseURIRR>((s%/var/www/planet/scripts/feedparser.pyR*7s  t_HTMLSanitizercGBseZdddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFgGZddGdHdIdJdKdLdMdNdOdPdQdRdSdTd dUdVdWdXdYdZd[d\dd]d^d_d`dadbdcdddedfdgd'dhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d6d}d~ddddddddddgGZddgZdZdZdZdZdZ dZ RS(RAtabbrtacronymtaddressRtbtbigRDR!tbuttontcaptiontcenterREtcodeR"tcolgrouptddRHtdfntdirtdivtdltdttemtfieldsettfontRIth1th2th3th4th5th6R$RR%R&RPtkbdRtlegendtliRqtmenutoltoptgrouptoptionR>tpreRSRutsamptselecttsmalltspantstriketstrongRytsupttablettbodyttdttextareattfoottthttheadttrttttutultvartacceptsaccept-charsett accesskeyRJtaligntalttaxistbordert cellpaddingt cellspacingtchartcharofftcharsettcheckedtclassR8tcolstcolspantcolortcompacttcoordstdatetimetdisabledtenctypetforR#theadersRR9threflangthspaceR0tismapRRKt maxlengthRRtmultipleRtnohreftnoshadetnowraptprompttreadonlyRtrevtrowstrowspantrulestscopetselectedtshapetsizeRtstartR7ttabindexttargetRRPROtvalignR[tvspaceRRTRBcCsti|d|_dS(Ni(RR,tunacceptablestack(RT((s%/var/www/planet/scripts/feedparser.pyR,Ts cCs||ijo+||ijo|id7_ndSn|i|}g}|D]-\}}||ijo|||fqUqU~}ti|||dS(Ni(tacceptable_elementst"unacceptable_elements_with_end_tagRR4tacceptable_attributesRR(RTRWRRVRUR[((s%/var/www/planet/scripts/feedparser.pyRXsAcCsO||ijo+||ijo|id8_ndSnti||dS(Ni(RRRRR(RTRW((s%/var/www/planet/scripts/feedparser.pyRas cCsdS(N((RTR((s%/var/www/planet/scripts/feedparser.pyRhscCsdS(N((RTR((s%/var/www/planet/scripts/feedparser.pyRkscCs"|ipti||ndS(N(RRR(RTR((s%/var/www/planet/scripts/feedparser.pyRns ( R R RRRR,RRRRR(((s%/var/www/planet/scripts/feedparser.pyRX=s2$      c st|}|i||i}tod}x~tD]v}yf|djo$ddklfd}Pn2|djo$ddkl fd}PnWq9q9Xq9W|ot |t dj}|o|i d }n||d d d d d ddd}|ot |d }n|i doD|idd d }|i do|idd d }q~n|i do|idd d}qqn|iidd}|S(NRi(t parseStringcst||S(N(R(R tkwargs(t_utidy(s%/var/www/planet/scripts/feedparser.pyt_tidy~sR(tTidycs"i||\}}}}|S(N(ttidy(R Rtnerrorst nwarningst errordata(t_mxtidy(s%/var/www/planet/scripts/feedparser.pyRsusutf-8t output_xhtmlitnumeric_entitiestwrapit char_encodingtutf8sR Rttidy_interfaceR((RRs%/var/www/planet/scripts/feedparser.pyR,rsB      $"t_FeedURLHandlercBs>eZdZdZdZeZeZeZdZRS(cCsc|ddjo*|djo|i|||||Snti|||i}||_|S(Nidii0(thttp_error_302turllibt addinfourlt get_full_urltstatus(RTtreqtfpRatmsgRtinfourl((s%/var/www/planet/scripts/feedparser.pythttp_error_defaults  cCst|iido%tii||||||}nti|||i}t|dp ||_ n|S(NtlocationR( R*RSturllib2tHTTPRedirectHandlerRRRRR^R(RTRRRaRRR((s%/var/www/planet/scripts/feedparser.pyRs % cCst|iido%tii||||||}nti|||i}t|dp ||_ n|S(NRR( R*RSRRthttp_error_301RRRR^R(RTRRRaRRR((s%/var/www/planet/scripts/feedparser.pyRs % c Csti|id}ytiiddjpttdjptti|i diddid\}}t i d|dd} |i | ||||i d |||} |i| SWn |i|||||SnXdS( Niis2.3.3t Authorizationt Rsrealm="([^"]*)"sWWW-Authenticateswww-authenticate(RzRRRRReRRiR#RRltfindallt add_passwordthttp_error_auth_reqedtreset_retry_countR( RTRRRaRRthosttusertpasswtrealmtretry((s%/var/www/planet/scripts/feedparser.pythttp_error_401s !2 ( R R RRRthttp_error_300thttp_error_303thttp_error_307R(((s%/var/www/planet/scripts/feedparser.pyRs  c Cst|do|Sn|djo tiSnti|dd1jo|p t}nd0}toti|\}}ti |\} }| oLti | \} } | o,d|| |f}ti | i }qqnt i|} | id||o| id |n|od d d d dddg} ddddddddddddg } | idd| |d|d | |d!d!|d|d"|d#|d$fn|o| id%|ntoto| id&d'nGto| id&d(n,to| id&d)n| id&d*|o| id+d,|nto| id-tn| id.d/tt ittg|}g|_z|i| SWd0|iXnyt|SWnnXtt|S(2s8URL, filename, or string --> stream This function lets you define parsers that take any input source (URL, pathname to local or network file, or actual data as a string) and deal with it in a uniform manner. Returned object is guaranteed to have all the basic stdio read methods (read, readline, readlines). Just .close() the object when you're done with it. If the etag argument is supplied, it will be used as the value of an If-None-Match request header. If the modified argument is supplied, it must be a tuple of 9 integers as returned by gmtime() in the standard Python time module. This MUST be in GMT (Greenwich Mean Time). The formatted date/time will be used as the value of an If-Modified-Since request header. If the agent argument is supplied, it will be used as the value of a User-Agent request header. If the referrer argument is supplied, it will be used as the value of a Referer[sic] request header. If handlers is supplied, it is a list of handlers used to build a urllib2 opener. treadt-ithttpthttpstftps %s://%s%ss User-Agents If-None-MatchtMontTuetWedtThutFritSattSuntJantFebtMartAprtMaytJuntJultAugtSeptOcttNovtDecsIf-Modified-Sinces#%s, %02d %s %04d %02d:%02d:%02d GMTiiiiiitReferersAccept-encodings gzip, deflatetgziptdeflateRRsBasic %stAcceptsA-IMR,N(RRR(R^RtstdinRzt USER_AGENTRiRRt splittypet splithostt splitusert encodestringR"RtRequestt add_headerR tzlibt ACCEPT_HEADERtapplyt build_openerttupleRt addheaderstopentcloset _StringIOR(turl_file_stream_or_stringtetagR;tagenttreferrerthandlerstauthturltypetresttrealhostt user_passwdtrequesttshort_weekdaystmonthstopener((s%/var/www/planet/scripts/feedparser.pyt_open_resources`   !*U" cCstid|dS(sLRegister a date handler function (takes string, returns 9-tuple date in GMT)iN(t_date_handlerstinsert(tfunc((s%/var/www/planet/scripts/feedparser.pytregisterDateHandler*ss YYYY-?MM-?DDsYYYY-MMs YYYY-?OOOs YY-?MM-?DDsYY-?OOOtYYYYs-YY-?MMs-OOOs-YYs--MM-?DDs--MMs---DDtCCs(?P\d{4})tYYs(?P\d\d)tMMs(?P[01]\d)tDDs(?P[0123]\d)tOOOs(?P[0123]\d\d)s(?P\d\d$)s$(T?(?P\d{2}):(?P\d{2})s(:(?P\d{2}))?s6(?P[+-](?P\d{2})(:(?P\d{2}))?|Z)?)?c Csd}x&tD]}||}|oPq q W|pdSn|idjodSn|i}|idd}|ot|}nd}|idd}| p |djotid}nLt|djo,dttiddt|}n t|}|idd }| p |d jo%|o d }qftid }nt|}|id d}|ph|o |}q|id dp&|iddp|iddo d }qtid}n t|}d |i jo t|d d dd }nx>d ddddgD]'}|i|dpd||tweekdaytdaylight_savings_flagttmRA((s%/var/www/planet/scripts/feedparser.pyt_parse_date_iso8601Lsv   ,    &    "&"&u년u월u일u오전u오후s;(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})u>(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})cCsti|}|pdSndh|idd<|idd<|idd<|id d <|id d <|id d<dd<}totiid|nt|S(s8Parse a string according to the OnBlog 8-bit date formatNsE%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)siR8iR9iR:iR<iR=iR>s+09:00tzonediffsOnBlog date parsed as: %s (t_korean_onblog_date_reR.RmRRRRt_parse_date_w3dtf(RJR<t w3dtfdate((s%/var/www/planet/scripts/feedparser.pyt_parse_date_onblogs:6 cCs)ti|}|pdSnt|id}|id}|tjo|d7}nt|}t|djod|}ndh|idd<|id d <|id d <|d <|idd<|idd<dd<}toti i d|nt |S(s6Parse a string according to the Nate 8-bit date formatNiii it0sE%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)sR8iR9iR:R<iR=iR>s+09:00RRsNate date parsed as: %s ( t_korean_nate_date_reR.RRmt _korean_pmRRRRRRRT(RJR<R<tampmRU((s%/var/www/planet/scripts/feedparser.pyt_parse_date_nates"  :- s9(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})(\.\d+)?cCsti|}|pdSndh|idd<|idd<|idd<|id d <|id d <|id d<dd<}totiid|nt|S(s2Parse a string according to the MS SQL date formatNsE%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)siR8iR9iR:iR<iR=iR>s+09:00RRsMS SQL date parsed as: %s (t_mssql_date_reR.RmRRRRRT(RJR<RU((s%/var/www/planet/scripts/feedparser.pyt_parse_date_mssqls:6 uJanuΙανuFebuΦεβuMaruΜάώuΜαώuApruΑπρuMayuΜάιuΜαϊuΜαιuJunuΙούνuΙονuJuluΙούλuΙολuAuguΑύγuΑυγuSepuΣεπuOctuΟκτuNovuΝοέuΝοεuDecuΔεκuSunuΚυρuMonuΔευuTueuΤριuWeduΤετuThuuΠεμuFriuΠαρuSatuΣαβuL([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)cCsti|}|pdSny*t|id}t|id}Wn dSnXdh|d<|idd<|d<|id d <|id d <|id d<|idd<|idd<}totiid|nt |S(s6Parse a string according to a Greek 8-bit date format.NiisP%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)stwdayiR:R9iR8iR<iR=iR>iRRsGreek date parsed as: %s ( t_greek_date_format_reR.t _greek_wdaysRmt _greek_monthsRRRRt_parse_date_rfc822(RJR<R^R9t rfc822date((s%/var/www/planet/scripts/feedparser.pyt_parse_date_greeks:6u01ujanuáru02u februáriu03umárciusu04uáprilisu05umáujusu06ujúniusu07ujúliusu08u augusztusu09u szeptemberu10uoktóberu11unovemberu12udecemberu?(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))cCs'ti|}|pdSnywt|id}|id}t|djod|}n|id}t|djod|}nWn dSnXdh|idd<|d <|d <|d <|id d <|idd<}totiid|nt |S(s:Parse a string according to a Hungarian 8-bit date format.NiiiRWis:%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)sR8R9R:R<iR=iRRsHungarian date parsed as: %s ( t_hungarian_date_format_reR.t_hungarian_monthsRmRRRRRRT(RJR<R9R:R<RU((s%/var/www/planet/scripts/feedparser.pyt_parse_date_hungarian!s((c Csd}d}d}d}d}ti|}d|}d||f}ti|} | i|} | djp| i|jodSn|| || d } | ddjodSntiti| || tiS( Nc Sst|id}|djo,dttiddt|}n|djod Sn|id}|ot|}|dd}|dd}d}x||joti|||ddddddf }ti|d}t||}||jo/||jo||}qz|d}d }q||jo-||d jo||}qz|d}qqW|||fSn|id }d}|djo d}n9t|}|id }|ot|}nd}|||fS(NR8idiitjulianiiiiiR9R:(iii(RRmRFRGRiRItabs(R<R8RhR9R:tjdayRtdiff((s%/var/www/planet/scripts/feedparser.pyt__extract_date<sH ,   *        cSs|pdSn|id}|pdSnt|}t|id}|id}|ot|}nd}|||fS(Nithourstminutestseconds(iii(iii(RmR(R<RmRnRo((s%/var/www/planet/scripts/feedparser.pyt__extract_timees cSs|pdSn|id}|pdSn|djodSnt|id}|id}|ot|}nd}|d|d}|ddjo | Sn|S(sAReturn the Time Zone Designator as an offset in seconds from UTC.ittzdRBttzdhourst tzdminutesi<RC(RmR(R<RqRmRntoffset((s%/var/www/planet/scripts/feedparser.pyt __extract_tzdts   sd(?P\d\d\d\d)(?:(?P-|)(?:(?P\d\d\d)|(?P\d\d)(?:(?P=dsep)(?P\d\d))?))?s;(?P[-+](?P\d\d)(?::?(?P\d\d))|Z)sW(?P\d\d)(?P:|)(?P\d\d)(?:(?P=tsep)(?P\d\d(?:[.,]\d+)?))?s %s(?:T%s)?i(iii( RlR2R.RiRmRFRGRIttimezone( RJRlRpRut __date_ret__tzd_ret__tzd_rxt __time_ret __datetime_ret __datetime_rxR<tgmt((s%/var/www/planet/scripts/feedparser.pyRT;s" )   cCs|i}|dddjp|ditijo |d=nt|djof|d}|id}|djo || ||dg|d)n|id d i|}nt|d jo|d 7}nti|}|ot i ti |Snd S(s8Parse an RFC822, RFC1123, RFC2822, or asctime-style dateiit,t.iiRCiRRis 00:00:00 GMTN(R~R( RRtrfc822t _daynamesRRRRpt parsedate_tzRFRGt mktime_tz(RJR RuRRP((s%/var/www/planet/scripts/feedparser.pyRbs /     iptATi tETitCTiDtMTitPTcCsxtD]}yg||}|pwnt|djo%totiidntntt||SWqt j o7}to'tiid|i t |fqqXqWdS(s6Parses a variety of date formats into a 9-tuple in GMTi s*date handler function must return 9-tuple s %s raised %s N( R-RRRRRt ValueErrorRqRt ExceptionR RRi(RJR t date9tuplete((s%/var/www/planet/scripts/feedparser.pyR}s"   ' c Csd}d}d}d}||id\}}yj|d djot|}n.|d djo"d}t|did}nt|djoK|d d jo:|d d!d jo&d}t|d did}n|d d jo"d }t|d id}njt|djoK|d djo:|d d!d jo&d }t|d d id}n |d djo"d}t|did}n|d djo"d}t|did}n|d djo&d}t|ddid}no|d djo&d}t|ddid}n8|d djo&d}t|ddid}ntidi|}Wn d0}nX|o8|i di }|o|d1jo |}qnd} d2} d3} || jp |i d*o.|i d+od,} |p |pd}n|| jp |i d-o'|i d+od,} |pd.}nX|i d-o|pd.}n7|o"|i d o|pd/}n|pd}||||| fS(4s Get the character encoding of the XML document http_headers is a dictionary xml_data is a raw string (not Unicode) This is so much trickier than it sounds, it's not even funny. According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type is application/xml, application/*+xml, application/xml-external-parsed-entity, or application/xml-dtd, the encoding given in the charset parameter of the HTTP Content-Type takes precedence over the encoding given in the XML prefix within the document, and defaults to 'utf-8' if neither are specified. But, if the HTTP Content-Type is text/xml, text/*+xml, or text/xml-external-parsed-entity, the encoding given in the XML prefix within the document is ALWAYS IGNORED and only the encoding given in the charset parameter of the HTTP Content-Type header should be respected, and it defaults to 'us-ascii' if not specified. Furthermore, discussion on the atom-syntax mailing list with the author of RFC 3023 leads me to the conclusion that any document served with a Content-Type of text/* and no charset parameter must be treated as us-ascii. (We now do this.) And also that it must always be flagged as non-well-formed. (We now do this too.) If Content-Type is unspecified (input was local file or non-HTTP source) or unrecognized (server just got it totally wrong), then go by the encoding given in the XML prefix of the document and default to 'iso-8859-1' as per the HTTP specification (RFC 2616). Then, assuming we didn't find a character encoding in the HTTP headers (and the HTTP Content-type allowed us to look in the body), we need to sniff the first few bytes of the XML data and try to determine whether the encoding is ASCII-compatible. Section F of the XML specification shows the way here: http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info If the sniffed encoding is not ASCII-compatible, we need to make it ASCII compatible so that we can sniff further into the XML declaration to find the encoding attribute, which will tell us the true encoding. Of course, none of this guarantees that we will be able to parse the feed in the declared character encoding (assuming it was declared correctly, which many are not). CJKCodecs and iconv_codec help a lot; you should definitely install them if you can. http://cjkpython.i18n.org/ cSsD|pd}ti|\}}||iddiddfS(s takes HTTP Content-Type header and returns (content type, charset) If no charset is specified, returns (content type, '') If no content type is specified, returns ('', '') Both return parameters are guaranteed to be lowercase strings RRR0(tcgit parse_headerROR(t content_typeRL((s%/var/www/planet/scripts/feedparser.pyt_parseHTTPContentTypes Rs content-typeisLot<?sutf-16besutf-8ists<?sutf-16lestisiso-10646-ucs-2sucs-2t csunicodesiso-10646-ucs-4sucs-4tcsucs4sutf-16sutf-32tutf_16tutf_32tutf16tu16sapplication/xmlsapplication/xml-dtds&application/xml-external-parsed-entitystext/xmlstext/xml-external-parsed-entitys application/s+xmlistext/sus-asciis iso-8859-1N( siso-10646-ucs-2sucs-2Rsiso-10646-ucs-4sucs-4Rsutf-16sutf-32sutf_16Rsutf16su16(sapplication/xmlsapplication/xml-dtds&application/xml-external-parsed-entity(stext/xmlstext/xml-external-parsed-entity(RORwR-RRRlR2R.RitgroupsRRdRRS( t http_headerstxml_dataRtsniffed_xml_encodingt xml_encodingt true_encodingthttp_content_typet http_encodingtxml_encoding_matchtacceptable_content_typetapplication_content_typesttext_content_types((s%/var/www/planet/scripts/feedparser.pyt_getCharacterEncodingsv0 8 8          c Cstotiid|nt|djou|d djod|dd!djoPto5tiid|djotiidqnd}|d}nt|djou|d d jod|dd!djoPto5tiid|d jotiid qnd }|d}n$|d d joPto5tiid|djotiidq|nd}|d }n|d djoPto5tiid|djotiidqnd}|d}nb|d djoPto5tiid|djotiidq>nd}|d}nt||}totiid|ntid}d}|i|o|i ||}n|d|}|i dS(sChanges an XML data stream on the fly to specify a new encoding data is a raw sequence of bytes (not Unicode) that is presumed to be in %encoding already encoding is a string recognized by encodings.aliases s%entering _toUTF8, trying encoding %s iisRsstripping BOM sutf-16bestrying utf-16be instead ssutf-16lestrying utf-16le instead issutf-8strying utf-8 instead Rsutf-32bestrying utf-32be instead ssutf-32lestrying utf-32le instead s*successfully converted %s data to unicode s^<\?xml[^>]*?>s&u ( RRRRRR-RlR2RRyR(R Rtnewdatat declmatchtnewdecl((s%/var/www/planet/scripts/feedparser.pyt_toUTF8J s\8 8    cCstidti}|id|}tidti}|i|}|o |dpd}|iido d}nd}|id|}||fS(sStrips DOCTYPE from XML document, returns (rss_version, stripped_data) rss_version may be 'rss091n' or None stripped_data is the same XML document, minus the DOCTYPE s]*?)>Rs]*?)>itnetscapeRN(RlR2t MULTILINERyRRRRi(R tentity_patterntdoctype_patterntdoctype_resultstdoctypeR((s%/var/www/planet/scripts/feedparser.pyt _stripDoctype s cCst}t|dy0d"}|i|t||}d}}WqqXn| oKd#|jo>y0d#}|i|t||}d}}WqiqiXn|p:d|dtj oh} t2o4d*d+k3}|i4|i5t6i7i8d,nd|d<|i9p| |dXn|p1t:|||od"pd}|i;|n|i<|d<|i=|d<|dp|i>|d<|i?|d-<|S(.s0Parse a feed from a URL, file, stream, or stringR,R.iR itbozo_exceptionRRscontent-encodingR tfileobjR RtETagRs Last-ModifiedR;R:R9iRRRs content-types%s is not an XML media typesno Content-type specifiedRscontent-locationscontent-languagei0s1The feed has not changed since you last checked, s:so the server sent no data. This is a feature, not a bug!t debug_messagesutf-8s windows-1252s#document encoding unknown, I tried s2%s, %s, utf-8, and windows-1252 but nothing workeds+documented declared as %s, but parsed as %st _ns_stackRs$http://www.w3.org/XML/1998/namespaceiNsxml parsing failed R(@R+t_XML_AVAILABLERPRQt InstanceTypeR,RRRiR^R RROtGzipFileRRt decompresst MAX_WBITSRt getheaderR}R:RR*RRRSRRRRtchardettdetectRRRRR t make_parsertPREFERRED_XML_PARSERSt setFeatureR tfeature_namespacestsetContentHandlertsetErrorHandlert xmlreadert InputSourcet setByteStreamRtparseRt tracebackt print_stackt print_excRRRR R?R,RR.RR(RRR;R R!R"tresulttfR RRt last_modifiedRRRRRt bozo_messageRRtuse_strict_parsertknown_encodingttried_encodingstproposed_encodingt feedparsert saxparserRR((s%/var/www/planet/scripts/feedparser.pyR s(       #"  #    "                      t__main__(tpprint(t__doc__t __version__t __license__t __author__t__contributors__RRRRRRR*RlRR.RzRFRRQRRRt cStringIORRR RiRtxml.saxRR Rtxml.sax.saxutilsRR RRR$tcjkcodecs.aliasest cjkcodecst iconv_codecRtchardet.constantst constantsRR RRRRR2ttagfindtspecialtcharreftSUPPORTED_VERSIONSR*R%t NameErrorR+RlRmRwRxR~RR R RR+RR?R@R*RXR,tHTTPDigestAuthHandlerRtHTTPDefaultErrorHandlerRR,R-R0t _iso8601_tmplRVttmplRt _iso8601_reRtregexR.RDRQt _korean_yeart _korean_montht _korean_dayt _korean_amRYRSRXRVR[R\R]RaR`R_RdRfReRgRTRbt_additional_timezonest _timezonesRjR}RRRRR targvtexitturlsRR:R(((s%/var/www/planet/scripts/feedparser.pys s                              K    &Hs' 5 '%6 Z     n- N                                                  ]  3   5     scripts/feedparser.py0000755000076400007640000036006510361105126014655 0ustar draxusdraxus#!/usr/bin/env python """Universal feed parser Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds Visit http://feedparser.org/ for the latest version Visit http://feedparser.org/docs/ for the latest documentation Required: Python 2.1 or later Recommended: Python 2.3 or later Recommended: CJKCodecs and iconv_codec """ __version__ = "4.1"# + "$Revision: 1.92 $"[11:15] + "-cvs" __license__ = """Copyright (c) 2002-2006, Mark Pilgrim, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" __author__ = "Mark Pilgrim " __contributors__ = ["Jason Diamond ", "John Beimler ", "Fazal Majid ", "Aaron Swartz ", "Kevin Marks "] _debug = 0 # HTTP "User-Agent" header to send to servers when downloading feeds. # If you are embedding feedparser in a larger application, you should # change this to your application name and URL. USER_AGENT = "UniversalFeedParser/%s +http://feedparser.org/" % __version__ # HTTP "Accept" header to send to servers when downloading feeds. If you don't # want to send an Accept header, set this to None. ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1" # List of preferred XML parsers, by SAX driver name. These will be tried first, # but if they're not installed, Python will keep searching through its own list # of pre-installed parsers until it finds one that supports everything we need. PREFERRED_XML_PARSERS = ["drv_libxml2"] # If you want feedparser to automatically run HTML markup through HTML Tidy, set # this to 1. Requires mxTidy # or utidylib . TIDY_MARKUP = 0 # List of Python interfaces for HTML Tidy, in order of preference. Only useful # if TIDY_MARKUP = 1 PREFERRED_TIDY_INTERFACES = ["uTidy", "mxTidy"] # ---------- required modules (should come with any Python distribution) ---------- import sgmllib, re, sys, copy, urlparse, time, rfc822, types, cgi, urllib, urllib2 try: from cStringIO import StringIO as _StringIO except: from StringIO import StringIO as _StringIO # ---------- optional modules (feedparser will work without these, but with reduced functionality) ---------- # gzip is included with most Python distributions, but may not be available if you compiled your own try: import gzip except: gzip = None try: import zlib except: zlib = None # If a real XML parser is available, feedparser will attempt to use it. feedparser has # been tested with the built-in SAX parser, PyXML, and libxml2. On platforms where the # Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some # versions of FreeBSD), feedparser will quietly fall back on regex-based parsing. try: import xml.sax xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers from xml.sax.saxutils import escape as _xmlescape _XML_AVAILABLE = 1 except: _XML_AVAILABLE = 0 def _xmlescape(data): data = data.replace('&', '&') data = data.replace('>', '>') data = data.replace('<', '<') return data # base64 support for Atom feeds that contain embedded binary data try: import base64, binascii except: base64 = binascii = None # cjkcodecs and iconv_codec provide support for more character encodings. # Both are available from http://cjkpython.i18n.org/ try: import cjkcodecs.aliases except: pass try: import iconv_codec except: pass # chardet library auto-detects character encodings # Download from http://chardet.feedparser.org/ try: import chardet if _debug: import chardet.constants chardet.constants._debug = 1 except: chardet = None # ---------- don't touch these ---------- class ThingsNobodyCaresAboutButMe(Exception): pass class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): pass class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): pass class NonXMLContentType(ThingsNobodyCaresAboutButMe): pass class UndeclaredNamespace(Exception): pass sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') sgmllib.special = re.compile('' % (tag, ''.join([' %s="%s"' % t for t in attrs])), escape=0) # match namespaces if tag.find(':') <> -1: prefix, suffix = tag.split(':', 1) else: prefix, suffix = '', tag prefix = self.namespacemap.get(prefix, prefix) if prefix: prefix = prefix + '_' # special hack for better tracking of empty textinput/image elements in illformed feeds if (not prefix) and tag not in ('title', 'link', 'description', 'name'): self.intextinput = 0 if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'href', 'width', 'height'): self.inimage = 0 # call special handler (if defined) or default handler methodname = '_start_' + prefix + suffix try: method = getattr(self, methodname) return method(attrsD) except AttributeError: return self.push(prefix + suffix, 1) def unknown_endtag(self, tag): if _debug: sys.stderr.write('end %s\n' % tag) # match namespaces if tag.find(':') <> -1: prefix, suffix = tag.split(':', 1) else: prefix, suffix = '', tag prefix = self.namespacemap.get(prefix, prefix) if prefix: prefix = prefix + '_' # call special handler (if defined) or default handler methodname = '_end_' + prefix + suffix try: method = getattr(self, methodname) method() except AttributeError: self.pop(prefix + suffix) # track inline content if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'): # element declared itself as escaped markup, but it isn't really self.contentparams['type'] = 'application/xhtml+xml' if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml': tag = tag.split(':')[-1] self.handle_data('' % tag, escape=0) # track xml:base and xml:lang going out of scope if self.basestack: self.basestack.pop() if self.basestack and self.basestack[-1]: self.baseuri = self.basestack[-1] if self.langstack: self.langstack.pop() if self.langstack: # and (self.langstack[-1] is not None): self.lang = self.langstack[-1] def handle_charref(self, ref): # called for each character reference, e.g. for ' ', ref will be '160' if not self.elementstack: return ref = ref.lower() if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'): text = '&#%s;' % ref else: if ref[0] == 'x': c = int(ref[1:], 16) else: c = int(ref) text = unichr(c).encode('utf-8') self.elementstack[-1][2].append(text) def handle_entityref(self, ref): # called for each entity reference, e.g. for '©', ref will be 'copy' if not self.elementstack: return if _debug: sys.stderr.write('entering handle_entityref with %s\n' % ref) if ref in ('lt', 'gt', 'quot', 'amp', 'apos'): text = '&%s;' % ref else: # entity resolution graciously donated by Aaron Swartz def name2cp(k): import htmlentitydefs if hasattr(htmlentitydefs, 'name2codepoint'): # requires Python 2.3 return htmlentitydefs.name2codepoint[k] k = htmlentitydefs.entitydefs[k] if k.startswith('&#') and k.endswith(';'): return int(k[2:-1]) # not in latin-1 return ord(k) try: name2cp(ref) except KeyError: text = '&%s;' % ref else: text = unichr(name2cp(ref)).encode('utf-8') self.elementstack[-1][2].append(text) def handle_data(self, text, escape=1): # called for each block of plain text, i.e. outside of any tag and # not containing any character or entity references if not self.elementstack: return if escape and self.contentparams.get('type') == 'application/xhtml+xml': text = _xmlescape(text) self.elementstack[-1][2].append(text) def handle_comment(self, text): # called for each comment, e.g. pass def handle_pi(self, text): # called for each processing instruction, e.g. pass def handle_decl(self, text): pass def parse_declaration(self, i): # override internal declaration handler to handle CDATA blocks if _debug: sys.stderr.write('entering parse_declaration\n') if self.rawdata[i:i+9] == '', i) if k == -1: k = len(self.rawdata) self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0) return k+3 else: k = self.rawdata.find('>', i) return k+1 def mapContentType(self, contentType): contentType = contentType.lower() if contentType == 'text': contentType = 'text/plain' elif contentType == 'html': contentType = 'text/html' elif contentType == 'xhtml': contentType = 'application/xhtml+xml' return contentType def trackNamespace(self, prefix, uri): loweruri = uri.lower() if (prefix, loweruri) == (None, 'http://my.netscape.com/rdf/simple/0.9/') and not self.version: self.version = 'rss090' if loweruri == 'http://purl.org/rss/1.0/' and not self.version: self.version = 'rss10' if loweruri == 'http://www.w3.org/2005/atom' and not self.version: self.version = 'atom10' if loweruri.find('backend.userland.com/rss') <> -1: # match any backend.userland.com namespace uri = 'http://backend.userland.com/rss' loweruri = uri if self._matchnamespaces.has_key(loweruri): self.namespacemap[prefix] = self._matchnamespaces[loweruri] self.namespacesInUse[self._matchnamespaces[loweruri]] = uri else: self.namespacesInUse[prefix or ''] = uri def resolveURI(self, uri): return _urljoin(self.baseuri or '', uri) def decodeEntities(self, element, data): return data def push(self, element, expectingText): self.elementstack.append([element, expectingText, []]) def pop(self, element, stripWhitespace=1): if not self.elementstack: return if self.elementstack[-1][0] != element: return element, expectingText, pieces = self.elementstack.pop() output = ''.join(pieces) if stripWhitespace: output = output.strip() if not expectingText: return output # decode base64 content if base64 and self.contentparams.get('base64', 0): try: output = base64.decodestring(output) except binascii.Error: pass except binascii.Incomplete: pass # resolve relative URIs if (element in self.can_be_relative_uri) and output: output = self.resolveURI(output) # decode entities within embedded markup if not self.contentparams.get('base64', 0): output = self.decodeEntities(element, output) # remove temporary cruft from contentparams try: del self.contentparams['mode'] except KeyError: pass try: del self.contentparams['base64'] except KeyError: pass # resolve relative URIs within embedded markup if self.mapContentType(self.contentparams.get('type', 'text/html')) in self.html_types: if element in self.can_contain_relative_uris: output = _resolveRelativeURIs(output, self.baseuri, self.encoding) # sanitize embedded markup if self.mapContentType(self.contentparams.get('type', 'text/html')) in self.html_types: if element in self.can_contain_dangerous_markup: output = _sanitizeHTML(output, self.encoding) if self.encoding and type(output) != type(u''): try: output = unicode(output, self.encoding) except: pass # categories/tags/keywords/whatever are handled in _end_category if element == 'category': return output # store output in appropriate place(s) if self.inentry and not self.insource: if element == 'content': self.entries[-1].setdefault(element, []) contentparams = copy.deepcopy(self.contentparams) contentparams['value'] = output self.entries[-1][element].append(contentparams) elif element == 'link': self.entries[-1][element] = output if output: self.entries[-1]['links'][-1]['href'] = output else: if element == 'description': element = 'summary' self.entries[-1][element] = output if self.incontent: contentparams = copy.deepcopy(self.contentparams) contentparams['value'] = output self.entries[-1][element + '_detail'] = contentparams elif (self.infeed or self.insource) and (not self.intextinput) and (not self.inimage): context = self._getContext() if element == 'description': element = 'subtitle' context[element] = output if element == 'link': context['links'][-1]['href'] = output elif self.incontent: contentparams = copy.deepcopy(self.contentparams) contentparams['value'] = output context[element + '_detail'] = contentparams return output def pushContent(self, tag, attrsD, defaultContentType, expectingText): self.incontent += 1 self.contentparams = FeedParserDict({ 'type': self.mapContentType(attrsD.get('type', defaultContentType)), 'language': self.lang, 'base': self.baseuri}) self.contentparams['base64'] = self._isBase64(attrsD, self.contentparams) self.push(tag, expectingText) def popContent(self, tag): value = self.pop(tag) self.incontent -= 1 self.contentparams.clear() return value def _mapToStandardPrefix(self, name): colonpos = name.find(':') if colonpos <> -1: prefix = name[:colonpos] suffix = name[colonpos+1:] prefix = self.namespacemap.get(prefix, prefix) name = prefix + ':' + suffix return name def _getAttribute(self, attrsD, name): return attrsD.get(self._mapToStandardPrefix(name)) def _isBase64(self, attrsD, contentparams): if attrsD.get('mode', '') == 'base64': return 1 if self.contentparams['type'].startswith('text/'): return 0 if self.contentparams['type'].endswith('+xml'): return 0 if self.contentparams['type'].endswith('/xml'): return 0 return 1 def _itsAnHrefDamnIt(self, attrsD): href = attrsD.get('url', attrsD.get('uri', attrsD.get('href', None))) if href: try: del attrsD['url'] except KeyError: pass try: del attrsD['uri'] except KeyError: pass attrsD['href'] = href return attrsD def _save(self, key, value): context = self._getContext() context.setdefault(key, value) def _start_rss(self, attrsD): versionmap = {'0.91': 'rss091u', '0.92': 'rss092', '0.93': 'rss093', '0.94': 'rss094'} if not self.version: attr_version = attrsD.get('version', '') version = versionmap.get(attr_version) if version: self.version = version elif attr_version.startswith('2.'): self.version = 'rss20' else: self.version = 'rss' def _start_dlhottitles(self, attrsD): self.version = 'hotrss' def _start_channel(self, attrsD): self.infeed = 1 self._cdf_common(attrsD) _start_feedinfo = _start_channel def _cdf_common(self, attrsD): if attrsD.has_key('lastmod'): self._start_modified({}) self.elementstack[-1][-1] = attrsD['lastmod'] self._end_modified() if attrsD.has_key('href'): self._start_link({}) self.elementstack[-1][-1] = attrsD['href'] self._end_link() def _start_feed(self, attrsD): self.infeed = 1 versionmap = {'0.1': 'atom01', '0.2': 'atom02', '0.3': 'atom03'} if not self.version: attr_version = attrsD.get('version') version = versionmap.get(attr_version) if version: self.version = version else: self.version = 'atom' def _end_channel(self): self.infeed = 0 _end_feed = _end_channel def _start_image(self, attrsD): self.inimage = 1 self.push('image', 0) context = self._getContext() context.setdefault('image', FeedParserDict()) def _end_image(self): self.pop('image') self.inimage = 0 def _start_textinput(self, attrsD): self.intextinput = 1 self.push('textinput', 0) context = self._getContext() context.setdefault('textinput', FeedParserDict()) _start_textInput = _start_textinput def _end_textinput(self): self.pop('textinput') self.intextinput = 0 _end_textInput = _end_textinput def _start_author(self, attrsD): self.inauthor = 1 self.push('author', 1) _start_managingeditor = _start_author _start_dc_author = _start_author _start_dc_creator = _start_author _start_itunes_author = _start_author def _end_author(self): self.pop('author') self.inauthor = 0 self._sync_author_detail() _end_managingeditor = _end_author _end_dc_author = _end_author _end_dc_creator = _end_author _end_itunes_author = _end_author def _start_itunes_owner(self, attrsD): self.inpublisher = 1 self.push('publisher', 0) def _end_itunes_owner(self): self.pop('publisher') self.inpublisher = 0 self._sync_author_detail('publisher') def _start_contributor(self, attrsD): self.incontributor = 1 context = self._getContext() context.setdefault('contributors', []) context['contributors'].append(FeedParserDict()) self.push('contributor', 0) def _end_contributor(self): self.pop('contributor') self.incontributor = 0 def _start_dc_contributor(self, attrsD): self.incontributor = 1 context = self._getContext() context.setdefault('contributors', []) context['contributors'].append(FeedParserDict()) self.push('name', 0) def _end_dc_contributor(self): self._end_name() self.incontributor = 0 def _start_name(self, attrsD): self.push('name', 0) _start_itunes_name = _start_name def _end_name(self): value = self.pop('name') if self.inpublisher: self._save_author('name', value, 'publisher') elif self.inauthor: self._save_author('name', value) elif self.incontributor: self._save_contributor('name', value) elif self.intextinput: context = self._getContext() context['textinput']['name'] = value _end_itunes_name = _end_name def _start_width(self, attrsD): self.push('width', 0) def _end_width(self): value = self.pop('width') try: value = int(value) except: value = 0 if self.inimage: context = self._getContext() context['image']['width'] = value def _start_height(self, attrsD): self.push('height', 0) def _end_height(self): value = self.pop('height') try: value = int(value) except: value = 0 if self.inimage: context = self._getContext() context['image']['height'] = value def _start_url(self, attrsD): self.push('href', 1) _start_homepage = _start_url _start_uri = _start_url def _end_url(self): value = self.pop('href') if self.inauthor: self._save_author('href', value) elif self.incontributor: self._save_contributor('href', value) elif self.inimage: context = self._getContext() context['image']['href'] = value elif self.intextinput: context = self._getContext() context['textinput']['link'] = value _end_homepage = _end_url _end_uri = _end_url def _start_email(self, attrsD): self.push('email', 0) _start_itunes_email = _start_email def _end_email(self): value = self.pop('email') if self.inpublisher: self._save_author('email', value, 'publisher') elif self.inauthor: self._save_author('email', value) elif self.incontributor: self._save_contributor('email', value) _end_itunes_email = _end_email def _getContext(self): if self.insource: context = self.sourcedata elif self.inentry: context = self.entries[-1] else: context = self.feeddata return context def _save_author(self, key, value, prefix='author'): context = self._getContext() context.setdefault(prefix + '_detail', FeedParserDict()) context[prefix + '_detail'][key] = value self._sync_author_detail() def _save_contributor(self, key, value): context = self._getContext() context.setdefault('contributors', [FeedParserDict()]) context['contributors'][-1][key] = value def _sync_author_detail(self, key='author'): context = self._getContext() detail = context.get('%s_detail' % key) if detail: name = detail.get('name') email = detail.get('email') if name and email: context[key] = '%s (%s)' % (name, email) elif name: context[key] = name elif email: context[key] = email else: author = context.get(key) if not author: return emailmatch = re.search(r'''(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))''', author) if not emailmatch: return email = emailmatch.group(0) # probably a better way to do the following, but it passes all the tests author = author.replace(email, '') author = author.replace('()', '') author = author.strip() if author and (author[0] == '('): author = author[1:] if author and (author[-1] == ')'): author = author[:-1] author = author.strip() context.setdefault('%s_detail' % key, FeedParserDict()) context['%s_detail' % key]['name'] = author context['%s_detail' % key]['email'] = email def _start_subtitle(self, attrsD): self.pushContent('subtitle', attrsD, 'text/plain', 1) _start_tagline = _start_subtitle _start_itunes_subtitle = _start_subtitle def _end_subtitle(self): self.popContent('subtitle') _end_tagline = _end_subtitle _end_itunes_subtitle = _end_subtitle def _start_rights(self, attrsD): self.pushContent('rights', attrsD, 'text/plain', 1) _start_dc_rights = _start_rights _start_copyright = _start_rights def _end_rights(self): self.popContent('rights') _end_dc_rights = _end_rights _end_copyright = _end_rights def _start_item(self, attrsD): self.entries.append(FeedParserDict()) self.push('item', 0) self.inentry = 1 self.guidislink = 0 id = self._getAttribute(attrsD, 'rdf:about') if id: context = self._getContext() context['id'] = id self._cdf_common(attrsD) _start_entry = _start_item _start_product = _start_item def _end_item(self): self.pop('item') self.inentry = 0 _end_entry = _end_item def _start_dc_language(self, attrsD): self.push('language', 1) _start_language = _start_dc_language def _end_dc_language(self): self.lang = self.pop('language') _end_language = _end_dc_language def _start_dc_publisher(self, attrsD): self.push('publisher', 1) _start_webmaster = _start_dc_publisher def _end_dc_publisher(self): self.pop('publisher') self._sync_author_detail('publisher') _end_webmaster = _end_dc_publisher def _start_published(self, attrsD): self.push('published', 1) _start_dcterms_issued = _start_published _start_issued = _start_published def _end_published(self): value = self.pop('published') self._save('published_parsed', _parse_date(value)) _end_dcterms_issued = _end_published _end_issued = _end_published def _start_updated(self, attrsD): self.push('updated', 1) _start_modified = _start_updated _start_dcterms_modified = _start_updated _start_pubdate = _start_updated _start_dc_date = _start_updated def _end_updated(self): value = self.pop('updated') parsed_value = _parse_date(value) self._save('updated_parsed', parsed_value) _end_modified = _end_updated _end_dcterms_modified = _end_updated _end_pubdate = _end_updated _end_dc_date = _end_updated def _start_created(self, attrsD): self.push('created', 1) _start_dcterms_created = _start_created def _end_created(self): value = self.pop('created') self._save('created_parsed', _parse_date(value)) _end_dcterms_created = _end_created def _start_expirationdate(self, attrsD): self.push('expired', 1) def _end_expirationdate(self): self._save('expired_parsed', _parse_date(self.pop('expired'))) def _start_cc_license(self, attrsD): self.push('license', 1) value = self._getAttribute(attrsD, 'rdf:resource') if value: self.elementstack[-1][2].append(value) self.pop('license') def _start_creativecommons_license(self, attrsD): self.push('license', 1) def _end_creativecommons_license(self): self.pop('license') def _addTag(self, term, scheme, label): context = self._getContext() tags = context.setdefault('tags', []) if (not term) and (not scheme) and (not label): return value = FeedParserDict({'term': term, 'scheme': scheme, 'label': label}) if value not in tags: tags.append(FeedParserDict({'term': term, 'scheme': scheme, 'label': label})) def _start_category(self, attrsD): if _debug: sys.stderr.write('entering _start_category with %s\n' % repr(attrsD)) term = attrsD.get('term') scheme = attrsD.get('scheme', attrsD.get('domain')) label = attrsD.get('label') self._addTag(term, scheme, label) self.push('category', 1) _start_dc_subject = _start_category _start_keywords = _start_category def _end_itunes_keywords(self): for term in self.pop('itunes_keywords').split(): self._addTag(term, 'http://www.itunes.com/', None) def _start_itunes_category(self, attrsD): self._addTag(attrsD.get('text'), 'http://www.itunes.com/', None) self.push('category', 1) def _end_category(self): value = self.pop('category') if not value: return context = self._getContext() tags = context['tags'] if value and len(tags) and not tags[-1]['term']: tags[-1]['term'] = value else: self._addTag(value, None, None) _end_dc_subject = _end_category _end_keywords = _end_category _end_itunes_category = _end_category def _start_cloud(self, attrsD): self._getContext()['cloud'] = FeedParserDict(attrsD) def _start_link(self, attrsD): attrsD.setdefault('rel', 'alternate') attrsD.setdefault('type', 'text/html') attrsD = self._itsAnHrefDamnIt(attrsD) if attrsD.has_key('href'): attrsD['href'] = self.resolveURI(attrsD['href']) expectingText = self.infeed or self.inentry or self.insource context = self._getContext() context.setdefault('links', []) context['links'].append(FeedParserDict(attrsD)) if attrsD['rel'] == 'enclosure': self._start_enclosure(attrsD) if attrsD.has_key('href'): expectingText = 0 if (attrsD.get('rel') == 'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types): context['link'] = attrsD['href'] else: self.push('link', expectingText) _start_producturl = _start_link def _end_link(self): value = self.pop('link') context = self._getContext() if self.intextinput: context['textinput']['link'] = value if self.inimage: context['image']['link'] = value _end_producturl = _end_link def _start_guid(self, attrsD): self.guidislink = (attrsD.get('ispermalink', 'true') == 'true') self.push('id', 1) def _end_guid(self): value = self.pop('id') self._save('guidislink', self.guidislink and not self._getContext().has_key('link')) if self.guidislink: # guid acts as link, but only if 'ispermalink' is not present or is 'true', # and only if the item doesn't already have a link element self._save('link', value) def _start_title(self, attrsD): self.pushContent('title', attrsD, 'text/plain', self.infeed or self.inentry or self.insource) _start_dc_title = _start_title _start_media_title = _start_title def _end_title(self): value = self.popContent('title') context = self._getContext() if self.intextinput: context['textinput']['title'] = value elif self.inimage: context['image']['title'] = value _end_dc_title = _end_title _end_media_title = _end_title def _start_description(self, attrsD): context = self._getContext() if context.has_key('summary'): self._summaryKey = 'content' self._start_content(attrsD) else: self.pushContent('description', attrsD, 'text/html', self.infeed or self.inentry or self.insource) def _start_abstract(self, attrsD): self.pushContent('description', attrsD, 'text/plain', self.infeed or self.inentry or self.insource) def _end_description(self): if self._summaryKey == 'content': self._end_content() else: value = self.popContent('description') context = self._getContext() if self.intextinput: context['textinput']['description'] = value elif self.inimage: context['image']['description'] = value self._summaryKey = None _end_abstract = _end_description def _start_info(self, attrsD): self.pushContent('info', attrsD, 'text/plain', 1) _start_feedburner_browserfriendly = _start_info def _end_info(self): self.popContent('info') _end_feedburner_browserfriendly = _end_info def _start_generator(self, attrsD): if attrsD: attrsD = self._itsAnHrefDamnIt(attrsD) if attrsD.has_key('href'): attrsD['href'] = self.resolveURI(attrsD['href']) self._getContext()['generator_detail'] = FeedParserDict(attrsD) self.push('generator', 1) def _end_generator(self): value = self.pop('generator') context = self._getContext() if context.has_key('generator_detail'): context['generator_detail']['name'] = value def _start_admin_generatoragent(self, attrsD): self.push('generator', 1) value = self._getAttribute(attrsD, 'rdf:resource') if value: self.elementstack[-1][2].append(value) self.pop('generator') self._getContext()['generator_detail'] = FeedParserDict({'href': value}) def _start_admin_errorreportsto(self, attrsD): self.push('errorreportsto', 1) value = self._getAttribute(attrsD, 'rdf:resource') if value: self.elementstack[-1][2].append(value) self.pop('errorreportsto') def _start_summary(self, attrsD): context = self._getContext() if context.has_key('summary'): self._summaryKey = 'content' self._start_content(attrsD) else: self._summaryKey = 'summary' self.pushContent(self._summaryKey, attrsD, 'text/plain', 1) _start_itunes_summary = _start_summary def _end_summary(self): if self._summaryKey == 'content': self._end_content() else: self.popContent(self._summaryKey or 'summary') self._summaryKey = None _end_itunes_summary = _end_summary def _start_enclosure(self, attrsD): attrsD = self._itsAnHrefDamnIt(attrsD) self._getContext().setdefault('enclosures', []).append(FeedParserDict(attrsD)) href = attrsD.get('href') if href: context = self._getContext() if not context.get('id'): context['id'] = href def _start_source(self, attrsD): self.insource = 1 def _end_source(self): self.insource = 0 self._getContext()['source'] = copy.deepcopy(self.sourcedata) self.sourcedata.clear() def _start_content(self, attrsD): self.pushContent('content', attrsD, 'text/plain', 1) src = attrsD.get('src') if src: self.contentparams['src'] = src self.push('content', 1) def _start_prodlink(self, attrsD): self.pushContent('content', attrsD, 'text/html', 1) def _start_body(self, attrsD): self.pushContent('content', attrsD, 'application/xhtml+xml', 1) _start_xhtml_body = _start_body def _start_content_encoded(self, attrsD): self.pushContent('content', attrsD, 'text/html', 1) _start_fullitem = _start_content_encoded def _end_content(self): copyToDescription = self.mapContentType(self.contentparams.get('type')) in (['text/plain'] + self.html_types) value = self.popContent('content') if copyToDescription: self._save('description', value) _end_body = _end_content _end_xhtml_body = _end_content _end_content_encoded = _end_content _end_fullitem = _end_content _end_prodlink = _end_content def _start_itunes_image(self, attrsD): self.push('itunes_image', 0) self._getContext()['image'] = FeedParserDict({'href': attrsD.get('href')}) _start_itunes_link = _start_itunes_image def _end_itunes_block(self): value = self.pop('itunes_block', 0) self._getContext()['itunes_block'] = (value == 'yes') and 1 or 0 def _end_itunes_explicit(self): value = self.pop('itunes_explicit', 0) self._getContext()['itunes_explicit'] = (value == 'yes') and 1 or 0 if _XML_AVAILABLE: class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler): def __init__(self, baseuri, baselang, encoding): if _debug: sys.stderr.write('trying StrictFeedParser\n') xml.sax.handler.ContentHandler.__init__(self) _FeedParserMixin.__init__(self, baseuri, baselang, encoding) self.bozo = 0 self.exc = None def startPrefixMapping(self, prefix, uri): self.trackNamespace(prefix, uri) def startElementNS(self, name, qname, attrs): namespace, localname = name lowernamespace = str(namespace or '').lower() if lowernamespace.find('backend.userland.com/rss') <> -1: # match any backend.userland.com namespace namespace = 'http://backend.userland.com/rss' lowernamespace = namespace if qname and qname.find(':') > 0: givenprefix = qname.split(':')[0] else: givenprefix = None prefix = self._matchnamespaces.get(lowernamespace, givenprefix) if givenprefix and (prefix == None or (prefix == '' and lowernamespace == '')) and not self.namespacesInUse.has_key(givenprefix): raise UndeclaredNamespace, "'%s' is not associated with a namespace" % givenprefix if prefix: localname = prefix + ':' + localname localname = str(localname).lower() if _debug: sys.stderr.write('startElementNS: qname = %s, namespace = %s, givenprefix = %s, prefix = %s, attrs = %s, localname = %s\n' % (qname, namespace, givenprefix, prefix, attrs.items(), localname)) # qname implementation is horribly broken in Python 2.1 (it # doesn't report any), and slightly broken in Python 2.2 (it # doesn't report the xml: namespace). So we match up namespaces # with a known list first, and then possibly override them with # the qnames the SAX parser gives us (if indeed it gives us any # at all). Thanks to MatejC for helping me test this and # tirelessly telling me that it didn't work yet. attrsD = {} for (namespace, attrlocalname), attrvalue in attrs._attrs.items(): lowernamespace = (namespace or '').lower() prefix = self._matchnamespaces.get(lowernamespace, '') if prefix: attrlocalname = prefix + ':' + attrlocalname attrsD[str(attrlocalname).lower()] = attrvalue for qname in attrs.getQNames(): attrsD[str(qname).lower()] = attrs.getValueByQName(qname) self.unknown_starttag(localname, attrsD.items()) def characters(self, text): self.handle_data(text) def endElementNS(self, name, qname): namespace, localname = name lowernamespace = str(namespace or '').lower() if qname and qname.find(':') > 0: givenprefix = qname.split(':')[0] else: givenprefix = '' prefix = self._matchnamespaces.get(lowernamespace, givenprefix) if prefix: localname = prefix + ':' + localname localname = str(localname).lower() self.unknown_endtag(localname) def error(self, exc): self.bozo = 1 self.exc = exc def fatalError(self, exc): self.error(exc) raise exc class _BaseHTMLProcessor(sgmllib.SGMLParser): elements_no_end_tag = ['area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'] def __init__(self, encoding): self.encoding = encoding if _debug: sys.stderr.write('entering BaseHTMLProcessor, encoding=%s\n' % self.encoding) sgmllib.SGMLParser.__init__(self) def reset(self): self.pieces = [] sgmllib.SGMLParser.reset(self) def _shorttag_replace(self, match): tag = match.group(1) if tag in self.elements_no_end_tag: return '<' + tag + ' />' else: return '<' + tag + '>' def feed(self, data): data = re.compile(r'', self._shorttag_replace, data) # bug [ 1399464 ] Bad regexp for _shorttag_replace data = re.sub(r'<([^<\s]+?)\s*/>', self._shorttag_replace, data) data = data.replace(''', "'") data = data.replace('"', '"') if self.encoding and type(data) == type(u''): data = data.encode(self.encoding) sgmllib.SGMLParser.feed(self, data) def normalize_attrs(self, attrs): # utility method to be called by descendants attrs = [(k.lower(), v) for k, v in attrs] attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs] return attrs def unknown_starttag(self, tag, attrs): # called for each start tag # attrs is a list of (attr, value) tuples # e.g. for
, tag='pre', attrs=[('class', 'screen')]
        if _debug: sys.stderr.write('_BaseHTMLProcessor, unknown_starttag, tag=%s\n' % tag)
        uattrs = []
        # thanks to Kevin Marks for this breathtaking hack to deal with (valid) high-bit attribute values in UTF-8 feeds
        for key, value in attrs:
            if type(value) != type(u''):
                value = unicode(value, self.encoding)
            uattrs.append((unicode(key, self.encoding), value))
        strattrs = u''.join([u' %s="%s"' % (key, value) for key, value in uattrs]).encode(self.encoding)
        if tag in self.elements_no_end_tag:
            self.pieces.append('<%(tag)s%(strattrs)s />' % locals())
        else:
            self.pieces.append('<%(tag)s%(strattrs)s>' % locals())

    def unknown_endtag(self, tag):
        # called for each end tag, e.g. for 
, tag will be 'pre' # Reconstruct the original end tag. if tag not in self.elements_no_end_tag: self.pieces.append("" % locals()) def handle_charref(self, ref): # called for each character reference, e.g. for ' ', ref will be '160' # Reconstruct the original character reference. self.pieces.append('&#%(ref)s;' % locals()) def handle_entityref(self, ref): # called for each entity reference, e.g. for '©', ref will be 'copy' # Reconstruct the original entity reference. self.pieces.append('&%(ref)s;' % locals()) def handle_data(self, text): # called for each block of plain text, i.e. outside of any tag and # not containing any character or entity references # Store the original text verbatim. if _debug: sys.stderr.write('_BaseHTMLProcessor, handle_text, text=%s\n' % text) self.pieces.append(text) def handle_comment(self, text): # called for each HTML comment, e.g. # Reconstruct the original comment. self.pieces.append('' % locals()) def handle_pi(self, text): # called for each processing instruction, e.g. # Reconstruct original processing instruction. self.pieces.append('' % locals()) def handle_decl(self, text): # called for the DOCTYPE, if present, e.g. # # Reconstruct original DOCTYPE self.pieces.append('' % locals()) _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match def _scan_name(self, i, declstartpos): rawdata = self.rawdata n = len(rawdata) if i == n: return None, -1 m = self._new_declname_match(rawdata, i) if m: s = m.group() name = s.strip() if (i + len(s)) == n: return None, -1 # end of buffer return name.lower(), m.end() else: self.handle_data(rawdata) # self.updatepos(declstartpos, i) return None, -1 def output(self): '''Return processed HTML as a single string''' return ''.join([str(p) for p in self.pieces]) class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor): def __init__(self, baseuri, baselang, encoding): sgmllib.SGMLParser.__init__(self) _FeedParserMixin.__init__(self, baseuri, baselang, encoding) def decodeEntities(self, element, data): data = data.replace('<', '<') data = data.replace('<', '<') data = data.replace('>', '>') data = data.replace('>', '>') data = data.replace('&', '&') data = data.replace('&', '&') data = data.replace('"', '"') data = data.replace('"', '"') data = data.replace(''', ''') data = data.replace(''', ''') if self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'): data = data.replace('<', '<') data = data.replace('>', '>') data = data.replace('&', '&') data = data.replace('"', '"') data = data.replace(''', "'") return data class _RelativeURIResolver(_BaseHTMLProcessor): relative_uris = [('a', 'href'), ('applet', 'codebase'), ('area', 'href'), ('blockquote', 'cite'), ('body', 'background'), ('del', 'cite'), ('form', 'action'), ('frame', 'longdesc'), ('frame', 'src'), ('iframe', 'longdesc'), ('iframe', 'src'), ('head', 'profile'), ('img', 'longdesc'), ('img', 'src'), ('img', 'usemap'), ('input', 'src'), ('input', 'usemap'), ('ins', 'cite'), ('link', 'href'), ('object', 'classid'), ('object', 'codebase'), ('object', 'data'), ('object', 'usemap'), ('q', 'cite'), ('script', 'src')] def __init__(self, baseuri, encoding): _BaseHTMLProcessor.__init__(self, encoding) self.baseuri = baseuri def resolveURI(self, uri): return _urljoin(self.baseuri, uri) def unknown_starttag(self, tag, attrs): attrs = self.normalize_attrs(attrs) attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs] _BaseHTMLProcessor.unknown_starttag(self, tag, attrs) def _resolveRelativeURIs(htmlSource, baseURI, encoding): if _debug: sys.stderr.write('entering _resolveRelativeURIs\n') p = _RelativeURIResolver(baseURI, encoding) p.feed(htmlSource) return p.output() class _HTMLSanitizer(_BaseHTMLProcessor): acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'b', 'big', 'blockquote', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'map', 'menu', 'ol', 'optgroup', 'option', 'p', 'pre', 'q', 's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var'] acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey', 'action', 'align', 'alt', 'axis', 'border', 'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'clear', 'cols', 'colspan', 'color', 'compact', 'coords', 'datetime', 'dir', 'disabled', 'enctype', 'for', 'frame', 'headers', 'height', 'href', 'hreflang', 'hspace', 'id', 'ismap', 'label', 'lang', 'longdesc', 'maxlength', 'media', 'method', 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly', 'rel', 'rev', 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src', 'start', 'summary', 'tabindex', 'target', 'title', 'type', 'usemap', 'valign', 'value', 'vspace', 'width'] unacceptable_elements_with_end_tag = ['script', 'applet'] def reset(self): _BaseHTMLProcessor.reset(self) self.unacceptablestack = 0 def unknown_starttag(self, tag, attrs): if not tag in self.acceptable_elements: if tag in self.unacceptable_elements_with_end_tag: self.unacceptablestack += 1 return attrs = self.normalize_attrs(attrs) attrs = [(key, value) for key, value in attrs if key in self.acceptable_attributes] _BaseHTMLProcessor.unknown_starttag(self, tag, attrs) def unknown_endtag(self, tag): if not tag in self.acceptable_elements: if tag in self.unacceptable_elements_with_end_tag: self.unacceptablestack -= 1 return _BaseHTMLProcessor.unknown_endtag(self, tag) def handle_pi(self, text): pass def handle_decl(self, text): pass def handle_data(self, text): if not self.unacceptablestack: _BaseHTMLProcessor.handle_data(self, text) def _sanitizeHTML(htmlSource, encoding): p = _HTMLSanitizer(encoding) p.feed(htmlSource) data = p.output() if TIDY_MARKUP: # loop through list of preferred Tidy interfaces looking for one that's installed, # then set up a common _tidy function to wrap the interface-specific API. _tidy = None for tidy_interface in PREFERRED_TIDY_INTERFACES: try: if tidy_interface == "uTidy": from tidy import parseString as _utidy def _tidy(data, **kwargs): return str(_utidy(data, **kwargs)) break elif tidy_interface == "mxTidy": from mx.Tidy import Tidy as _mxtidy def _tidy(data, **kwargs): nerrors, nwarnings, data, errordata = _mxtidy.tidy(data, **kwargs) return data break except: pass if _tidy: utf8 = type(data) == type(u'') if utf8: data = data.encode('utf-8') data = _tidy(data, output_xhtml=1, numeric_entities=1, wrap=0, char_encoding="utf8") if utf8: data = unicode(data, 'utf-8') if data.count(''): data = data.split('>', 1)[1] if data.count('= '2.3.3' assert base64 != None user, passw = base64.decodestring(req.headers['Authorization'].split(' ')[1]).split(':') realm = re.findall('realm="([^"]*)"', headers['WWW-Authenticate'])[0] self.add_password(realm, host, user, passw) retry = self.http_error_auth_reqed('www-authenticate', host, req, headers) self.reset_retry_count() return retry except: return self.http_error_default(req, fp, code, msg, headers) def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers): """URL, filename, or string --> stream This function lets you define parsers that take any input source (URL, pathname to local or network file, or actual data as a string) and deal with it in a uniform manner. Returned object is guaranteed to have all the basic stdio read methods (read, readline, readlines). Just .close() the object when you're done with it. If the etag argument is supplied, it will be used as the value of an If-None-Match request header. If the modified argument is supplied, it must be a tuple of 9 integers as returned by gmtime() in the standard Python time module. This MUST be in GMT (Greenwich Mean Time). The formatted date/time will be used as the value of an If-Modified-Since request header. If the agent argument is supplied, it will be used as the value of a User-Agent request header. If the referrer argument is supplied, it will be used as the value of a Referer[sic] request header. If handlers is supplied, it is a list of handlers used to build a urllib2 opener. """ if hasattr(url_file_stream_or_string, 'read'): return url_file_stream_or_string if url_file_stream_or_string == '-': return sys.stdin if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp'): if not agent: agent = USER_AGENT # test for inline user:password for basic auth auth = None if base64: urltype, rest = urllib.splittype(url_file_stream_or_string) realhost, rest = urllib.splithost(rest) if realhost: user_passwd, realhost = urllib.splituser(realhost) if user_passwd: url_file_stream_or_string = '%s://%s%s' % (urltype, realhost, rest) auth = base64.encodestring(user_passwd).strip() # try to open with urllib2 (to use optional headers) request = urllib2.Request(url_file_stream_or_string) request.add_header('User-Agent', agent) if etag: request.add_header('If-None-Match', etag) if modified: # format into an RFC 1123-compliant timestamp. We can't use # time.strftime() since the %a and %b directives can be affected # by the current locale, but RFC 2616 states that dates must be # in English. short_weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] request.add_header('If-Modified-Since', '%s, %02d %s %04d %02d:%02d:%02d GMT' % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5])) if referrer: request.add_header('Referer', referrer) if gzip and zlib: request.add_header('Accept-encoding', 'gzip, deflate') elif gzip: request.add_header('Accept-encoding', 'gzip') elif zlib: request.add_header('Accept-encoding', 'deflate') else: request.add_header('Accept-encoding', '') if auth: request.add_header('Authorization', 'Basic %s' % auth) if ACCEPT_HEADER: request.add_header('Accept', ACCEPT_HEADER) request.add_header('A-IM', 'feed') # RFC 3229 support opener = apply(urllib2.build_opener, tuple([_FeedURLHandler()] + handlers)) opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent try: return opener.open(request) finally: opener.close() # JohnD # try to open with native open function (if url_file_stream_or_string is a filename) try: return open(url_file_stream_or_string) except: pass # treat url_file_stream_or_string as string return _StringIO(str(url_file_stream_or_string)) _date_handlers = [] def registerDateHandler(func): '''Register a date handler function (takes string, returns 9-tuple date in GMT)''' _date_handlers.insert(0, func) # ISO-8601 date parsing routines written by Fazal Majid. # The ISO 8601 standard is very convoluted and irregular - a full ISO 8601 # parser is beyond the scope of feedparser and would be a worthwhile addition # to the Python library. # A single regular expression cannot parse ISO 8601 date formats into groups # as the standard is highly irregular (for instance is 030104 2003-01-04 or # 0301-04-01), so we use templates instead. # Please note the order in templates is significant because we need a # greedy match. _iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-MM', 'YYYY-?OOO', 'YY-?MM-?DD', 'YY-?OOO', 'YYYY', '-YY-?MM', '-OOO', '-YY', '--MM-?DD', '--MM', '---DD', 'CC', ''] _iso8601_re = [ tmpl.replace( 'YYYY', r'(?P\d{4})').replace( 'YY', r'(?P\d\d)').replace( 'MM', r'(?P[01]\d)').replace( 'DD', r'(?P[0123]\d)').replace( 'OOO', r'(?P[0123]\d\d)').replace( 'CC', r'(?P\d\d$)') + r'(T?(?P\d{2}):(?P\d{2})' + r'(:(?P\d{2}))?' + r'(?P[+-](?P\d{2})(:(?P\d{2}))?|Z)?)?' for tmpl in _iso8601_tmpl] del tmpl _iso8601_matches = [re.compile(regex).match for regex in _iso8601_re] del regex def _parse_date_iso8601(dateString): '''Parse a variety of ISO-8601-compatible formats like 20040105''' m = None for _iso8601_match in _iso8601_matches: m = _iso8601_match(dateString) if m: break if not m: return if m.span() == (0, 0): return params = m.groupdict() ordinal = params.get('ordinal', 0) if ordinal: ordinal = int(ordinal) else: ordinal = 0 year = params.get('year', '--') if not year or year == '--': year = time.gmtime()[0] elif len(year) == 2: # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993 year = 100 * int(time.gmtime()[0] / 100) + int(year) else: year = int(year) month = params.get('month', '-') if not month or month == '-': # ordinals are NOT normalized by mktime, we simulate them # by setting month=1, day=ordinal if ordinal: month = 1 else: month = time.gmtime()[1] month = int(month) day = params.get('day', 0) if not day: # see above if ordinal: day = ordinal elif params.get('century', 0) or \ params.get('year', 0) or params.get('month', 0): day = 1 else: day = time.gmtime()[2] else: day = int(day) # special case of the century - is the first year of the 21st century # 2000 or 2001 ? The debate goes on... if 'century' in params.keys(): year = (int(params['century']) - 1) * 100 + 1 # in ISO 8601 most fields are optional for field in ['hour', 'minute', 'second', 'tzhour', 'tzmin']: if not params.get(field, None): params[field] = 0 hour = int(params.get('hour', 0)) minute = int(params.get('minute', 0)) second = int(params.get('second', 0)) # weekday is normalized by mktime(), we can ignore it weekday = 0 # daylight savings is complex, but not needed for feedparser's purposes # as time zones, if specified, include mention of whether it is active # (e.g. PST vs. PDT, CET). Using -1 is implementation-dependent and # and most implementations have DST bugs daylight_savings_flag = 0 tm = [year, month, day, hour, minute, second, weekday, ordinal, daylight_savings_flag] # ISO 8601 time zone adjustments tz = params.get('tz') if tz and tz != 'Z': if tz[0] == '-': tm[3] += int(params.get('tzhour', 0)) tm[4] += int(params.get('tzmin', 0)) elif tz[0] == '+': tm[3] -= int(params.get('tzhour', 0)) tm[4] -= int(params.get('tzmin', 0)) else: return None # Python's time.mktime() is a wrapper around the ANSI C mktime(3c) # which is guaranteed to normalize d/m/y/h/m/s. # Many implementations have bugs, but we'll pretend they don't. return time.localtime(time.mktime(tm)) registerDateHandler(_parse_date_iso8601) # 8-bit date handling routines written by ytrewq1. _korean_year = u'\ub144' # b3e2 in euc-kr _korean_month = u'\uc6d4' # bff9 in euc-kr _korean_day = u'\uc77c' # c0cf in euc-kr _korean_am = u'\uc624\uc804' # bfc0 c0fc in euc-kr _korean_pm = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr _korean_onblog_date_re = \ re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \ (_korean_year, _korean_month, _korean_day)) _korean_nate_date_re = \ re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \ (_korean_am, _korean_pm)) def _parse_date_onblog(dateString): '''Parse a string according to the OnBlog 8-bit date format''' m = _korean_onblog_date_re.match(dateString) if not m: return w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\ 'zonediff': '+09:00'} if _debug: sys.stderr.write('OnBlog date parsed as: %s\n' % w3dtfdate) return _parse_date_w3dtf(w3dtfdate) registerDateHandler(_parse_date_onblog) def _parse_date_nate(dateString): '''Parse a string according to the Nate 8-bit date format''' m = _korean_nate_date_re.match(dateString) if not m: return hour = int(m.group(5)) ampm = m.group(4) if (ampm == _korean_pm): hour += 12 hour = str(hour) if len(hour) == 1: hour = '0' + hour w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\ 'zonediff': '+09:00'} if _debug: sys.stderr.write('Nate date parsed as: %s\n' % w3dtfdate) return _parse_date_w3dtf(w3dtfdate) registerDateHandler(_parse_date_nate) _mssql_date_re = \ re.compile('(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})(\.\d+)?') def _parse_date_mssql(dateString): '''Parse a string according to the MS SQL date format''' m = _mssql_date_re.match(dateString) if not m: return w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\ 'zonediff': '+09:00'} if _debug: sys.stderr.write('MS SQL date parsed as: %s\n' % w3dtfdate) return _parse_date_w3dtf(w3dtfdate) registerDateHandler(_parse_date_mssql) # Unicode strings for Greek date strings _greek_months = \ { \ u'\u0399\u03b1\u03bd': u'Jan', # c9e1ed in iso-8859-7 u'\u03a6\u03b5\u03b2': u'Feb', # d6e5e2 in iso-8859-7 u'\u039c\u03ac\u03ce': u'Mar', # ccdcfe in iso-8859-7 u'\u039c\u03b1\u03ce': u'Mar', # cce1fe in iso-8859-7 u'\u0391\u03c0\u03c1': u'Apr', # c1f0f1 in iso-8859-7 u'\u039c\u03ac\u03b9': u'May', # ccdce9 in iso-8859-7 u'\u039c\u03b1\u03ca': u'May', # cce1fa in iso-8859-7 u'\u039c\u03b1\u03b9': u'May', # cce1e9 in iso-8859-7 u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7 u'\u0399\u03bf\u03bd': u'Jun', # c9efed in iso-8859-7 u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7 u'\u0399\u03bf\u03bb': u'Jul', # c9f9eb in iso-8859-7 u'\u0391\u03cd\u03b3': u'Aug', # c1fde3 in iso-8859-7 u'\u0391\u03c5\u03b3': u'Aug', # c1f5e3 in iso-8859-7 u'\u03a3\u03b5\u03c0': u'Sep', # d3e5f0 in iso-8859-7 u'\u039f\u03ba\u03c4': u'Oct', # cfeaf4 in iso-8859-7 u'\u039d\u03bf\u03ad': u'Nov', # cdefdd in iso-8859-7 u'\u039d\u03bf\u03b5': u'Nov', # cdefe5 in iso-8859-7 u'\u0394\u03b5\u03ba': u'Dec', # c4e5ea in iso-8859-7 } _greek_wdays = \ { \ u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7 u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7 u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7 u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7 u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7 u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7 u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7 } _greek_date_format_re = \ re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)') def _parse_date_greek(dateString): '''Parse a string according to a Greek 8-bit date format.''' m = _greek_date_format_re.match(dateString) if not m: return try: wday = _greek_wdays[m.group(1)] month = _greek_months[m.group(3)] except: return rfc822date = '%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s' % \ {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\ 'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\ 'zonediff': m.group(8)} if _debug: sys.stderr.write('Greek date parsed as: %s\n' % rfc822date) return _parse_date_rfc822(rfc822date) registerDateHandler(_parse_date_greek) # Unicode strings for Hungarian date strings _hungarian_months = \ { \ u'janu\u00e1r': u'01', # e1 in iso-8859-2 u'febru\u00e1ri': u'02', # e1 in iso-8859-2 u'm\u00e1rcius': u'03', # e1 in iso-8859-2 u'\u00e1prilis': u'04', # e1 in iso-8859-2 u'm\u00e1ujus': u'05', # e1 in iso-8859-2 u'j\u00fanius': u'06', # fa in iso-8859-2 u'j\u00falius': u'07', # fa in iso-8859-2 u'augusztus': u'08', u'szeptember': u'09', u'okt\u00f3ber': u'10', # f3 in iso-8859-2 u'november': u'11', u'december': u'12', } _hungarian_date_format_re = \ re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))') def _parse_date_hungarian(dateString): '''Parse a string according to a Hungarian 8-bit date format.''' m = _hungarian_date_format_re.match(dateString) if not m: return try: month = _hungarian_months[m.group(2)] day = m.group(3) if len(day) == 1: day = '0' + day hour = m.group(4) if len(hour) == 1: hour = '0' + hour except: return w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s' % \ {'year': m.group(1), 'month': month, 'day': day,\ 'hour': hour, 'minute': m.group(5),\ 'zonediff': m.group(6)} if _debug: sys.stderr.write('Hungarian date parsed as: %s\n' % w3dtfdate) return _parse_date_w3dtf(w3dtfdate) registerDateHandler(_parse_date_hungarian) # W3DTF-style date parsing adapted from PyXML xml.utils.iso8601, written by # Drake and licensed under the Python license. Removed all range checking # for month, day, hour, minute, and second, since mktime will normalize # these later def _parse_date_w3dtf(dateString): def __extract_date(m): year = int(m.group('year')) if year < 100: year = 100 * int(time.gmtime()[0] / 100) + int(year) if year < 1000: return 0, 0, 0 julian = m.group('julian') if julian: julian = int(julian) month = julian / 30 + 1 day = julian % 30 + 1 jday = None while jday != julian: t = time.mktime((year, month, day, 0, 0, 0, 0, 0, 0)) jday = time.gmtime(t)[-2] diff = abs(jday - julian) if jday > julian: if diff < day: day = day - diff else: month = month - 1 day = 31 elif jday < julian: if day + diff < 28: day = day + diff else: month = month + 1 return year, month, day month = m.group('month') day = 1 if month is None: month = 1 else: month = int(month) day = m.group('day') if day: day = int(day) else: day = 1 return year, month, day def __extract_time(m): if not m: return 0, 0, 0 hours = m.group('hours') if not hours: return 0, 0, 0 hours = int(hours) minutes = int(m.group('minutes')) seconds = m.group('seconds') if seconds: seconds = int(seconds) else: seconds = 0 return hours, minutes, seconds def __extract_tzd(m): '''Return the Time Zone Designator as an offset in seconds from UTC.''' if not m: return 0 tzd = m.group('tzd') if not tzd: return 0 if tzd == 'Z': return 0 hours = int(m.group('tzdhours')) minutes = m.group('tzdminutes') if minutes: minutes = int(minutes) else: minutes = 0 offset = (hours*60 + minutes) * 60 if tzd[0] == '+': return -offset return offset __date_re = ('(?P\d\d\d\d)' '(?:(?P-|)' '(?:(?P\d\d\d)' '|(?P\d\d)(?:(?P=dsep)(?P\d\d))?))?') __tzd_re = '(?P[-+](?P\d\d)(?::?(?P\d\d))|Z)' __tzd_rx = re.compile(__tzd_re) __time_re = ('(?P\d\d)(?P:|)(?P\d\d)' '(?:(?P=tsep)(?P\d\d(?:[.,]\d+)?))?' + __tzd_re) __datetime_re = '%s(?:T%s)?' % (__date_re, __time_re) __datetime_rx = re.compile(__datetime_re) m = __datetime_rx.match(dateString) if (m is None) or (m.group() != dateString): return gmt = __extract_date(m) + __extract_time(m) + (0, 0, 0) if gmt[0] == 0: return return time.gmtime(time.mktime(gmt) + __extract_tzd(m) - time.timezone) registerDateHandler(_parse_date_w3dtf) def _parse_date_rfc822(dateString): '''Parse an RFC822, RFC1123, RFC2822, or asctime-style date''' data = dateString.split() if data[0][-1] in (',', '.') or data[0].lower() in rfc822._daynames: del data[0] if len(data) == 4: s = data[3] i = s.find('+') if i > 0: data[3:] = [s[:i], s[i+1:]] else: data.append('') dateString = " ".join(data) if len(data) < 5: dateString += ' 00:00:00 GMT' tm = rfc822.parsedate_tz(dateString) if tm: return time.gmtime(rfc822.mktime_tz(tm)) # rfc822.py defines several time zones, but we define some extra ones. # 'ET' is equivalent to 'EST', etc. _additional_timezones = {'AT': -400, 'ET': -500, 'CT': -600, 'MT': -700, 'PT': -800} rfc822._timezones.update(_additional_timezones) registerDateHandler(_parse_date_rfc822) def _parse_date(dateString): '''Parses a variety of date formats into a 9-tuple in GMT''' for handler in _date_handlers: try: date9tuple = handler(dateString) if not date9tuple: continue if len(date9tuple) != 9: if _debug: sys.stderr.write('date handler function must return 9-tuple\n') raise ValueError map(int, date9tuple) return date9tuple except Exception, e: if _debug: sys.stderr.write('%s raised %s\n' % (handler.__name__, repr(e))) pass return None def _getCharacterEncoding(http_headers, xml_data): '''Get the character encoding of the XML document http_headers is a dictionary xml_data is a raw string (not Unicode) This is so much trickier than it sounds, it's not even funny. According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type is application/xml, application/*+xml, application/xml-external-parsed-entity, or application/xml-dtd, the encoding given in the charset parameter of the HTTP Content-Type takes precedence over the encoding given in the XML prefix within the document, and defaults to 'utf-8' if neither are specified. But, if the HTTP Content-Type is text/xml, text/*+xml, or text/xml-external-parsed-entity, the encoding given in the XML prefix within the document is ALWAYS IGNORED and only the encoding given in the charset parameter of the HTTP Content-Type header should be respected, and it defaults to 'us-ascii' if not specified. Furthermore, discussion on the atom-syntax mailing list with the author of RFC 3023 leads me to the conclusion that any document served with a Content-Type of text/* and no charset parameter must be treated as us-ascii. (We now do this.) And also that it must always be flagged as non-well-formed. (We now do this too.) If Content-Type is unspecified (input was local file or non-HTTP source) or unrecognized (server just got it totally wrong), then go by the encoding given in the XML prefix of the document and default to 'iso-8859-1' as per the HTTP specification (RFC 2616). Then, assuming we didn't find a character encoding in the HTTP headers (and the HTTP Content-type allowed us to look in the body), we need to sniff the first few bytes of the XML data and try to determine whether the encoding is ASCII-compatible. Section F of the XML specification shows the way here: http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info If the sniffed encoding is not ASCII-compatible, we need to make it ASCII compatible so that we can sniff further into the XML declaration to find the encoding attribute, which will tell us the true encoding. Of course, none of this guarantees that we will be able to parse the feed in the declared character encoding (assuming it was declared correctly, which many are not). CJKCodecs and iconv_codec help a lot; you should definitely install them if you can. http://cjkpython.i18n.org/ ''' def _parseHTTPContentType(content_type): '''takes HTTP Content-Type header and returns (content type, charset) If no charset is specified, returns (content type, '') If no content type is specified, returns ('', '') Both return parameters are guaranteed to be lowercase strings ''' content_type = content_type or '' content_type, params = cgi.parse_header(content_type) return content_type, params.get('charset', '').replace("'", '') sniffed_xml_encoding = '' xml_encoding = '' true_encoding = '' http_content_type, http_encoding = _parseHTTPContentType(http_headers.get('content-type')) # Must sniff for non-ASCII-compatible character encodings before # searching for XML declaration. This heuristic is defined in # section F of the XML specification: # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info try: if xml_data[:4] == '\x4c\x6f\xa7\x94': # EBCDIC xml_data = _ebcdic_to_ascii(xml_data) elif xml_data[:4] == '\x00\x3c\x00\x3f': # UTF-16BE sniffed_xml_encoding = 'utf-16be' xml_data = unicode(xml_data, 'utf-16be').encode('utf-8') elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') and (xml_data[2:4] != '\x00\x00'): # UTF-16BE with BOM sniffed_xml_encoding = 'utf-16be' xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8') elif xml_data[:4] == '\x3c\x00\x3f\x00': # UTF-16LE sniffed_xml_encoding = 'utf-16le' xml_data = unicode(xml_data, 'utf-16le').encode('utf-8') elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and (xml_data[2:4] != '\x00\x00'): # UTF-16LE with BOM sniffed_xml_encoding = 'utf-16le' xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8') elif xml_data[:4] == '\x00\x00\x00\x3c': # UTF-32BE sniffed_xml_encoding = 'utf-32be' xml_data = unicode(xml_data, 'utf-32be').encode('utf-8') elif xml_data[:4] == '\x3c\x00\x00\x00': # UTF-32LE sniffed_xml_encoding = 'utf-32le' xml_data = unicode(xml_data, 'utf-32le').encode('utf-8') elif xml_data[:4] == '\x00\x00\xfe\xff': # UTF-32BE with BOM sniffed_xml_encoding = 'utf-32be' xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8') elif xml_data[:4] == '\xff\xfe\x00\x00': # UTF-32LE with BOM sniffed_xml_encoding = 'utf-32le' xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8') elif xml_data[:3] == '\xef\xbb\xbf': # UTF-8 with BOM sniffed_xml_encoding = 'utf-8' xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8') else: # ASCII-compatible pass xml_encoding_match = re.compile('^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data) except: xml_encoding_match = None if xml_encoding_match: xml_encoding = xml_encoding_match.groups()[0].lower() if sniffed_xml_encoding and (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode', 'iso-10646-ucs-4', 'ucs-4', 'csucs4', 'utf-16', 'utf-32', 'utf_16', 'utf_32', 'utf16', 'u16')): xml_encoding = sniffed_xml_encoding acceptable_content_type = 0 application_content_types = ('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity') text_content_types = ('text/xml', 'text/xml-external-parsed-entity') if (http_content_type in application_content_types) or \ (http_content_type.startswith('application/') and http_content_type.endswith('+xml')): acceptable_content_type = 1 true_encoding = http_encoding or xml_encoding or 'utf-8' elif (http_content_type in text_content_types) or \ (http_content_type.startswith('text/')) and http_content_type.endswith('+xml'): acceptable_content_type = 1 true_encoding = http_encoding or 'us-ascii' elif http_content_type.startswith('text/'): true_encoding = http_encoding or 'us-ascii' elif http_headers and (not http_headers.has_key('content-type')): true_encoding = xml_encoding or 'iso-8859-1' else: true_encoding = xml_encoding or 'utf-8' return true_encoding, http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type def _toUTF8(data, encoding): '''Changes an XML data stream on the fly to specify a new encoding data is a raw sequence of bytes (not Unicode) that is presumed to be in %encoding already encoding is a string recognized by encodings.aliases ''' if _debug: sys.stderr.write('entering _toUTF8, trying encoding %s\n' % encoding) # strip Byte Order Mark (if present) if (len(data) >= 4) and (data[:2] == '\xfe\xff') and (data[2:4] != '\x00\x00'): if _debug: sys.stderr.write('stripping BOM\n') if encoding != 'utf-16be': sys.stderr.write('trying utf-16be instead\n') encoding = 'utf-16be' data = data[2:] elif (len(data) >= 4) and (data[:2] == '\xff\xfe') and (data[2:4] != '\x00\x00'): if _debug: sys.stderr.write('stripping BOM\n') if encoding != 'utf-16le': sys.stderr.write('trying utf-16le instead\n') encoding = 'utf-16le' data = data[2:] elif data[:3] == '\xef\xbb\xbf': if _debug: sys.stderr.write('stripping BOM\n') if encoding != 'utf-8': sys.stderr.write('trying utf-8 instead\n') encoding = 'utf-8' data = data[3:] elif data[:4] == '\x00\x00\xfe\xff': if _debug: sys.stderr.write('stripping BOM\n') if encoding != 'utf-32be': sys.stderr.write('trying utf-32be instead\n') encoding = 'utf-32be' data = data[4:] elif data[:4] == '\xff\xfe\x00\x00': if _debug: sys.stderr.write('stripping BOM\n') if encoding != 'utf-32le': sys.stderr.write('trying utf-32le instead\n') encoding = 'utf-32le' data = data[4:] newdata = unicode(data, encoding) if _debug: sys.stderr.write('successfully converted %s data to unicode\n' % encoding) declmatch = re.compile('^<\?xml[^>]*?>') newdecl = '''''' if declmatch.search(newdata): newdata = declmatch.sub(newdecl, newdata) else: newdata = newdecl + u'\n' + newdata return newdata.encode('utf-8') def _stripDoctype(data): '''Strips DOCTYPE from XML document, returns (rss_version, stripped_data) rss_version may be 'rss091n' or None stripped_data is the same XML document, minus the DOCTYPE ''' entity_pattern = re.compile(r']*?)>', re.MULTILINE) data = entity_pattern.sub('', data) doctype_pattern = re.compile(r']*?)>', re.MULTILINE) doctype_results = doctype_pattern.findall(data) doctype = doctype_results and doctype_results[0] or '' if doctype.lower().count('netscape'): version = 'rss091n' else: version = None data = doctype_pattern.sub('', data) return version, data def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=[]): '''Parse a feed from a URL, file, stream, or string''' result = FeedParserDict() result['feed'] = FeedParserDict() result['entries'] = [] if _XML_AVAILABLE: result['bozo'] = 0 if type(handlers) == types.InstanceType: handlers = [handlers] try: f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers) data = f.read() except Exception, e: result['bozo'] = 1 result['bozo_exception'] = e data = '' f = None # if feed is gzip-compressed, decompress it if f and data and hasattr(f, 'headers'): if gzip and f.headers.get('content-encoding', '') == 'gzip': try: data = gzip.GzipFile(fileobj=_StringIO(data)).read() except Exception, e: # Some feeds claim to be gzipped but they're not, so # we get garbage. Ideally, we should re-request the # feed without the 'Accept-encoding: gzip' header, # but we don't. result['bozo'] = 1 result['bozo_exception'] = e data = '' elif zlib and f.headers.get('content-encoding', '') == 'deflate': try: data = zlib.decompress(data, -zlib.MAX_WBITS) except Exception, e: result['bozo'] = 1 result['bozo_exception'] = e data = '' # save HTTP headers if hasattr(f, 'info'): info = f.info() result['etag'] = info.getheader('ETag') last_modified = info.getheader('Last-Modified') if last_modified: result['modified'] = _parse_date(last_modified) if hasattr(f, 'url'): result['href'] = f.url result['status'] = 200 if hasattr(f, 'status'): result['status'] = f.status if hasattr(f, 'headers'): result['headers'] = f.headers.dict if hasattr(f, 'close'): f.close() # there are four encodings to keep track of: # - http_encoding is the encoding declared in the Content-Type HTTP header # - xml_encoding is the encoding declared in the ; changed # project name #2.5 - 7/25/2003 - MAP - changed to Python license (all contributors agree); # removed unnecessary urllib code -- urllib2 should always be available anyway; # return actual url, status, and full HTTP headers (as result['url'], # result['status'], and result['headers']) if parsing a remote feed over HTTP -- # this should pass all the HTTP tests at ; # added the latest namespace-of-the-week for RSS 2.0 #2.5.1 - 7/26/2003 - RMK - clear opener.addheaders so we only send our custom # User-Agent (otherwise urllib2 sends two, which confuses some servers) #2.5.2 - 7/28/2003 - MAP - entity-decode inline xml properly; added support for # inline and as used in some RSS 2.0 feeds #2.5.3 - 8/6/2003 - TvdV - patch to track whether we're inside an image or # textInput, and also to return the character encoding (if specified) #2.6 - 1/1/2004 - MAP - dc:author support (MarekK); fixed bug tracking # nested divs within content (JohnD); fixed missing sys import (JohanS); # fixed regular expression to capture XML character encoding (Andrei); # added support for Atom 0.3-style links; fixed bug with textInput tracking; # added support for cloud (MartijnP); added support for multiple # category/dc:subject (MartijnP); normalize content model: 'description' gets # description (which can come from description, summary, or full content if no # description), 'content' gets dict of base/language/type/value (which can come # from content:encoded, xhtml:body, content, or fullitem); # fixed bug matching arbitrary Userland namespaces; added xml:base and xml:lang # tracking; fixed bug tracking unknown tags; fixed bug tracking content when # element is not in default namespace (like Pocketsoap feed); # resolve relative URLs in link, guid, docs, url, comments, wfw:comment, # wfw:commentRSS; resolve relative URLs within embedded HTML markup in # description, xhtml:body, content, content:encoded, title, subtitle, # summary, info, tagline, and copyright; added support for pingback and # trackback namespaces #2.7 - 1/5/2004 - MAP - really added support for trackback and pingback # namespaces, as opposed to 2.6 when I said I did but didn't really; # sanitize HTML markup within some elements; added mxTidy support (if # installed) to tidy HTML markup within some elements; fixed indentation # bug in _parse_date (FazalM); use socket.setdefaulttimeout if available # (FazalM); universal date parsing and normalization (FazalM): 'created', modified', # 'issued' are parsed into 9-tuple date format and stored in 'created_parsed', # 'modified_parsed', and 'issued_parsed'; 'date' is duplicated in 'modified' # and vice-versa; 'date_parsed' is duplicated in 'modified_parsed' and vice-versa #2.7.1 - 1/9/2004 - MAP - fixed bug handling " and '. fixed memory # leak not closing url opener (JohnD); added dc:publisher support (MarekK); # added admin:errorReportsTo support (MarekK); Python 2.1 dict support (MarekK) #2.7.4 - 1/14/2004 - MAP - added workaround for improperly formed
tags in # encoded HTML (skadz); fixed unicode handling in normalize_attrs (ChrisL); # fixed relative URI processing for guid (skadz); added ICBM support; added # base64 support #2.7.5 - 1/15/2004 - MAP - added workaround for malformed DOCTYPE (seen on many # blogspot.com sites); added _debug variable #2.7.6 - 1/16/2004 - MAP - fixed bug with StringIO importing #3.0b3 - 1/23/2004 - MAP - parse entire feed with real XML parser (if available); # added several new supported namespaces; fixed bug tracking naked markup in # description; added support for enclosure; added support for source; re-added # support for cloud which got dropped somehow; added support for expirationDate #3.0b4 - 1/26/2004 - MAP - fixed xml:lang inheritance; fixed multiple bugs tracking # xml:base URI, one for documents that don't define one explicitly and one for # documents that define an outer and an inner xml:base that goes out of scope # before the end of the document #3.0b5 - 1/26/2004 - MAP - fixed bug parsing multiple links at feed level #3.0b6 - 1/27/2004 - MAP - added feed type and version detection, result['version'] # will be one of SUPPORTED_VERSIONS.keys() or empty string if unrecognized; # added support for creativeCommons:license and cc:license; added support for # full Atom content model in title, tagline, info, copyright, summary; fixed bug # with gzip encoding (not always telling server we support it when we do) #3.0b7 - 1/28/2004 - MAP - support Atom-style author element in author_detail # (dictionary of 'name', 'url', 'email'); map author to author_detail if author # contains name + email address #3.0b8 - 1/28/2004 - MAP - added support for contributor #3.0b9 - 1/29/2004 - MAP - fixed check for presence of dict function; added # support for summary #3.0b10 - 1/31/2004 - MAP - incorporated ISO-8601 date parsing routines from # xml.util.iso8601 #3.0b11 - 2/2/2004 - MAP - added 'rights' to list of elements that can contain # dangerous markup; fiddled with decodeEntities (not right); liberalized # date parsing even further #3.0b12 - 2/6/2004 - MAP - fiddled with decodeEntities (still not right); # added support to Atom 0.2 subtitle; added support for Atom content model # in copyright; better sanitizing of dangerous HTML elements with end tags # (script, frameset) #3.0b13 - 2/8/2004 - MAP - better handling of empty HTML tags (br, hr, img, # etc.) in embedded markup, in either HTML or XHTML form (
,
,
) #3.0b14 - 2/8/2004 - MAP - fixed CDATA handling in non-wellformed feeds under # Python 2.1 #3.0b15 - 2/11/2004 - MAP - fixed bug resolving relative links in wfw:commentRSS; # fixed bug capturing author and contributor URL; fixed bug resolving relative # links in author and contributor URL; fixed bug resolvin relative links in # generator URL; added support for recognizing RSS 1.0; passed Simon Fell's # namespace tests, and included them permanently in the test suite with his # permission; fixed namespace handling under Python 2.1 #3.0b16 - 2/12/2004 - MAP - fixed support for RSS 0.90 (broken in b15) #3.0b17 - 2/13/2004 - MAP - determine character encoding as per RFC 3023 #3.0b18 - 2/17/2004 - MAP - always map description to summary_detail (Andrei); # use libxml2 (if available) #3.0b19 - 3/15/2004 - MAP - fixed bug exploding author information when author # name was in parentheses; removed ultra-problematic mxTidy support; patch to # workaround crash in PyXML/expat when encountering invalid entities # (MarkMoraes); support for textinput/textInput #3.0b20 - 4/7/2004 - MAP - added CDF support #3.0b21 - 4/14/2004 - MAP - added Hot RSS support #3.0b22 - 4/19/2004 - MAP - changed 'channel' to 'feed', 'item' to 'entries' in # results dict; changed results dict to allow getting values with results.key # as well as results[key]; work around embedded illformed HTML with half # a DOCTYPE; work around malformed Content-Type header; if character encoding # is wrong, try several common ones before falling back to regexes (if this # works, bozo_exception is set to CharacterEncodingOverride); fixed character # encoding issues in BaseHTMLProcessor by tracking encoding and converting # from Unicode to raw strings before feeding data to sgmllib.SGMLParser; # convert each value in results to Unicode (if possible), even if using # regex-based parsing #3.0b23 - 4/21/2004 - MAP - fixed UnicodeDecodeError for feeds that contain # high-bit characters in attributes in embedded HTML in description (thanks # Thijs van de Vossen); moved guid, date, and date_parsed to mapped keys in # FeedParserDict; tweaked FeedParserDict.has_key to return True if asking # about a mapped key #3.0fc1 - 4/23/2004 - MAP - made results.entries[0].links[0] and # results.entries[0].enclosures[0] into FeedParserDict; fixed typo that could # cause the same encoding to be tried twice (even if it failed the first time); # fixed DOCTYPE stripping when DOCTYPE contained entity declarations; # better textinput and image tracking in illformed RSS 1.0 feeds #3.0fc2 - 5/10/2004 - MAP - added and passed Sam's amp tests; added and passed # my blink tag tests #3.0fc3 - 6/18/2004 - MAP - fixed bug in _changeEncodingDeclaration that # failed to parse utf-16 encoded feeds; made source into a FeedParserDict; # duplicate admin:generatorAgent/@rdf:resource in generator_detail.url; # added support for image; refactored parse() fallback logic to try other # encodings if SAX parsing fails (previously it would only try other encodings # if re-encoding failed); remove unichr madness in normalize_attrs now that # we're properly tracking encoding in and out of BaseHTMLProcessor; set # feed.language from root-level xml:lang; set entry.id from rdf:about; # send Accept header #3.0 - 6/21/2004 - MAP - don't try iso-8859-1 (can't distinguish between # iso-8859-1 and windows-1252 anyway, and most incorrectly marked feeds are # windows-1252); fixed regression that could cause the same encoding to be # tried twice (even if it failed the first time) #3.0.1 - 6/22/2004 - MAP - default to us-ascii for all text/* content types; # recover from malformed content-type header parameter with no equals sign # ('text/xml; charset:iso-8859-1') #3.1 - 6/28/2004 - MAP - added and passed tests for converting HTML entities # to Unicode equivalents in illformed feeds (aaronsw); added and # passed tests for converting character entities to Unicode equivalents # in illformed feeds (aaronsw); test for valid parsers when setting # XML_AVAILABLE; make version and encoding available when server returns # a 304; add handlers parameter to pass arbitrary urllib2 handlers (like # digest auth or proxy support); add code to parse username/password # out of url and send as basic authentication; expose downloading-related # exceptions in bozo_exception (aaronsw); added __contains__ method to # FeedParserDict (aaronsw); added publisher_detail (aaronsw) #3.2 - 7/3/2004 - MAP - use cjkcodecs and iconv_codec if available; always # convert feed to UTF-8 before passing to XML parser; completely revamped # logic for determining character encoding and attempting XML parsing # (much faster); increased default timeout to 20 seconds; test for presence # of Location header on redirects; added tests for many alternate character # encodings; support various EBCDIC encodings; support UTF-16BE and # UTF16-LE with or without a BOM; support UTF-8 with a BOM; support # UTF-32BE and UTF-32LE with or without a BOM; fixed crashing bug if no # XML parsers are available; added support for 'Content-encoding: deflate'; # send blank 'Accept-encoding: ' header if neither gzip nor zlib modules # are available #3.3 - 7/15/2004 - MAP - optimize EBCDIC to ASCII conversion; fix obscure # problem tracking xml:base and xml:lang if element declares it, child # doesn't, first grandchild redeclares it, and second grandchild doesn't; # refactored date parsing; defined public registerDateHandler so callers # can add support for additional date formats at runtime; added support # for OnBlog, Nate, MSSQL, Greek, and Hungarian dates (ytrewq1); added # zopeCompatibilityHack() which turns FeedParserDict into a regular # dictionary, required for Zope compatibility, and also makes command- # line debugging easier because pprint module formats real dictionaries # better than dictionary-like objects; added NonXMLContentType exception, # which is stored in bozo_exception when a feed is served with a non-XML # media type such as 'text/plain'; respect Content-Language as default # language if not xml:lang is present; cloud dict is now FeedParserDict; # generator dict is now FeedParserDict; better tracking of xml:lang, # including support for xml:lang='' to unset the current language; # recognize RSS 1.0 feeds even when RSS 1.0 namespace is not the default # namespace; don't overwrite final status on redirects (scenarios: # redirecting to a URL that returns 304, redirecting to a URL that # redirects to another URL with a different type of redirect); add # support for HTTP 303 redirects #4.0 - MAP - support for relative URIs in xml:base attribute; fixed # encoding issue with mxTidy (phopkins); preliminary support for RFC 3229; # support for Atom 1.0; support for iTunes extensions; new 'tags' for # categories/keywords/etc. as array of dict # {'term': term, 'scheme': scheme, 'label': label} to match Atom 1.0 # terminology; parse RFC 822-style dates with no time; lots of other # bug fixes #4.1 - MAP - removed socket timeout; added support for chardet library scripts/actualizar.py0000775000076400007640000001057211200144223014663 0ustar draxusdraxus#!/usr/bin/python # -*- coding: utf-8 -*- import codecs import datetime import feedparser import PyRSS2Gen from md5 import md5 ########################### # Parámetros a configurar # ########################### __PLANET_TITLE__ = "Planet ETSIIT" __PLANET_SUBTITLE__ = "El planet informaticotelecomunicado de Granada" __PLANET_URL__ = "http://localhost/" __PLANET_EMAIL__ = "draxus@gmail.com" ################################# # Archivos de lectura/escritura # ################################# f = open("../sites.txt") feed_planet = open("../feed.xml", "w") web_planet = open("../planet.html", "w") ################################ # Parser de los feeds # # Generación del HTML y el XML # ################################ items = [] html = "\n" html += "\n" html += ""+__PLANET_TITLE__+"\n" html += "\n" html += "\n" html += "\n" html += "\n" html += "\n" html += "\n" html += "\n" html += "\n" html += """\n""" html += "\n" html += "\n" html += "
" html += "

"+__PLANET_TITLE__+"

" html += "

"+__PLANET_SUBTITLE__+"

" html += "Suscripción RSS | Contacto\n" html += "
" html += "
\n" for url in f: try: print "Obteniendo titulares de ", url d = feedparser.parse(url) html += "
\n" html += "

" + d.feed.title.encode("utf-8") + " [feed]

\n" html += "
    \n" for e in d.entries[:10]: hash = md5(e.link).hexdigest() #uso esto como id porque la url no funciona como ancla html += "
  • " + e.title.encode("utf-8") + "
  • \n" try: item = PyRSS2Gen.RSSItem( title = unicode(e.title), link = unicode(e.link), guid = PyRSS2Gen.Guid(unicode(e.link)), description = unicode(e.content[0].value), ) html += "\n" except: #puede ocurrir que no existan algunos campos, por lo que cogemos los básicos item = PyRSS2Gen.RSSItem( title = unicode(e.title), link = unicode(e.link), guid = PyRSS2Gen.Guid(unicode(e.link)), ) html += "\n" items.append(item) html += "
\n" except BaseException, e: html += "Error parseando el feed "+ url + ": " + str(e) + "
\n" html += "
\n" html += "
Última actualización: "+ datetime.datetime.now().ctime() +"
\n" html += "\n" html += "" ################################# # Generación del rss del planet # ################################# rss = PyRSS2Gen.RSS2( title = __PLANET_TITLE__, link = __PLANET_URL__, description = __PLANET_SUBTITLE__, lastBuildDate = datetime.datetime.now(), items = items ) rss.write_xml(feed_planet, encoding="utf-8") web_planet.write(html) f.close() feed_planet.close() web_planet.close() sites.txt0000664000076400007640000000102511200113324012337 0ustar draxusdraxushttp://atalaya.blogalia.com/rdf.xml http://draxus.org/weblog/feed/ http://misvaguedades.blogspot.com/feeds/posts/default http://fergunet.blogspot.com/feeds/posts/default http://eldiegoj.blogspot.com/feeds/posts/default http://moviendocubos.blogspot.com/feeds/posts/default http://www.carlostenor.com/feed/ http://www.gskbyte.net/feed/ http://virtualizada.com/rss.xml http://alejandrobareamontoya.blogspot.com/feeds/posts/default http://pakitochusaap.blogspot.com/feeds/posts/default http://nikabgirl.blogspot.com/feeds/posts/default