转到正文

6月23日周四下大雨那天看天气预报说周六25日可能有雨,故策划到机场拍摄,希望能拍到飞机降落时吹水的场景。为此还专门购买了两只折叠凳和一个用于遮雨的铝膜地席。然则周六白天天气晴朗,拍吹水的希望肯定是破灭了,不过鉴于已经做好了计划,所以还是赶到机场进行拍摄。

中午与kk一起到京东的自提点取了折叠凳和地席,然后与loudly会合前往机场。考虑到光线的原因,决定在铁匠营拍摄跑道36L/18R起降的飞机。天气预报的情况是白天刮东南风,不过飞机还都是从36L方向起降,不利于拍摄,较为不理想。

不过还是拍到了若干新鲜东西。根据搜到的留言,这架建新集团所有的Hawker 4000今年6月份刚交付给海航旗下的金鹿公务机队。可以看到发动机正开着反推,是蚌式的反推罩。

 

继续阅读

某人mm今日乘机返京,加之刚好又是端午假期,于是与Loudly及某人一同前往机场拍飞机并接机。由于要接的飞机是接近中午到达的SK995,因此计划早上出发,这样还可以赶上拍汉莎航空的A380。考虑到作息时间及路上耗时,汉莎LH720的落地(8:30)估计是赶不上了,但是赶LH721航班10点半的起飞还是相当轻松的,故决定早上8点半从学校出发前往机场。

6号的天气相当不理想,预报有雷阵雨,早上热且闷,并且最要命的是有雾,能见度相当差,听ATIS的通播能见度只有7km。由于是端午节假期,因此一路上较为畅通,9点20左右就下了机场高速,同时看到远处一只疑似蓝色尾翼的飞机悄然滑过,受雾气影响,并没有看清楚是哪个航空公司的航班。

鉴于本次的两只目标航班均为停靠T3的国际航班,因此径直来到二号观察点。收拾好装备爬上土坡,就从树丛的缝隙中赫然看到了汉莎航空的尾翼标志,看体型就是A380了。

然则看到这飞机的时候它仍在朝停机位缓慢滑行,显然是刚降落不久。于是立即手机上网查了首都机场的国际到港,发现今天的LH720是9:21抵达,比计划时间赫然晚了近一个小时。也就是说我们再早一些出发或者路上快一些的话还是可以赶上降落的,相当尴尬。 继续阅读

继4月9日在机场东侧跑道01/19拍摄A380之后,又来到西侧的36L/18R跑道继续拍摄。西侧的最佳观察位置就是铁匠营,具体地点前人早有描述,这里就不再贴方位图了。这一观察点靠近跑道北侧,位于P7与P8出口之间,适合观察18R跑道起降的飞机。由于当天刮南风,使用跑道18R,因而前往观看的人也相对较多。

跑道36L/18R起降的航班以国内航班为主,因此拍摄重点主要就是降落接地过程以及特殊涂装的飞机了。以下为在此处拍摄的照片: 继续阅读

目前在ZBAA起降的空客A380有阿联酋航空和德国汉莎航空的两个航班,均在跑道01/19。汉莎的A380之前执行的是每周一班的频次(4月10日起改为每天一班),拍摄机会少,且起降时间偏早,赶往机场有一定困难。而阿联酋航空的A380每天一班,到港时间为下午,适合拍摄。

参照前人的经验,选择了六经路和龙塘路西侧延长线的两个位置作为预选的拍摄点,于9日中午动身前往。9日天气较差,天空雾蒙蒙的,接近机场时收听arrival ATIS报的能见度只有6 km。首先到达六经路的拍摄点(下图),确定跑道01/19对应的塔台频率为1186,开始收听航班信息。

听了一个航班通信之后发现一个很严重的问题。由于北京多刮北风,所以ZBAA大多数情况下使用36L、36R和01跑道。我们所选择的两个拍摄点是适合01跑道的情况。而9日当天刮起了南风,使用18R、18L和19跑道,那么在六经路这个位置就看不到降落了,于是立即赶往龙塘路的拍摄点(下图)。

龙塘路与机场东路的交叉点向西可通至机场围墙。道路尽头处有一较大的土堆,可爬上观看。但由于该位置在跑道南端之外,无法清晰观察到19降落的航班,故继续沿机场东路向北寻找。

自龙塘路口沿机场东路向北行驶约1 km可拐入西侧小路,到达机场围墙(上图)。该位置与T3航站楼的中段基本平齐,国际部分在北侧,南侧为国内部分。因此在使用跑道19时适合观察国内到港航班,国际到港航班通常在滑行到此位置之前就脱离了。

考虑到距离A380降落尚有一段时间,故继续沿机场东路向北寻找更合适的观测位置。继续向北行驶约500 m可拐入西侧最后一个入口(上图)。但此处向西行走不远即被一条河阻挡(图中11点方向两排深绿色的树之间即为河道),无法到达机场围墙。且河道西侧与机场围墙之间种有大量的树,在此位置无法看到机场的任何设施和飞机,因此放弃该观察点。

沿机场东路继续向北就由高架跨越六环,也就离开了机场的范围。所以最终仍返回观察点2。以下是此观察点的详图:入口处有一大广告牌,进入不远为一桥,过桥绕过图中的建筑之后,此图中显示为路的位置是一个很长的土堆,高约5米,两侧为田地,地势较为开阔。土堆最西端坡度较缓,可以由此爬上。在土堆之下则被机场围墙的双层铁丝网阻挡,不能进行观察和拍摄。机场围墙外种有一排树木,目前对于视线的阻挡尚不严重,但估计夏天就会有较为严重的遮挡。

以下为在此处拍摄的照片: 继续阅读

SQL Server Business Intelligence Development Studio 中的 Analysis Services 开发工具提供了一个自动生成日期维度的功能,能够很方便的生成带有层次结构的日期维度。但是若想扩展已有日期维度中的时间范围则无法通过开发工具完成。以下提供一个存储过程用于生成日期维度数据。

说明:由于语言环境以及所生成的日期维度结构可存在较大差异,因此本脚本仅供思路参考。在实际应用时应根据具体情况进行改动。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  onelittlefox
-- Create date: 2011-01-06
-- Description: Fill date dim for SSAS
-- =============================================
ALTER PROCEDURE [dbo].[FillDateDim]
 -- Add the parameters for the stored procedure here
 @startDate datetime,
 @endDate datetime,
 @operation int = 0
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

 -- Insert statements for procedure here
 DECLARE @CurrentDate Datetime;
 SET @CurrentDate = @startDate;
 SET LANGUAGE english;

 IF @operation = 1
 BEGIN
  WHILE @CurrentDate < @endDate
  BEGIN
   INSERT INTO dbo.Dim_Date
   (
    [PK_日期],
    [日期_名称],
    [年],
    [年_名称],
    [季度],
    [季度_名称],
    [月份],
    [月份_名称],
    [每年的某一日],
    [每年的某一日_名称],
    [每个季度的某一日],
    [每个季度的某一日_名称],
    [每月的某一日],
    [每月的某一日_名称],
    [每年的某一月],
    [每年的某一月_名称],
    [每个季度的某一月],
    [每个季度的某一月_名称],
    [每年的某一季度],
    [每年的某一季度_名称]
   )
   VALUES
   (
    @CurrentDate,
    DATENAME(DW, @CurrentDate)+ ', ' + DATENAME(MM, @CurrentDate) + ' '
      + right('00' + CONVERT(char(2), DATEPART(D, @CurrentDate)), 2) + ' ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEADD(YYYY, DATEDIFF(YYYY, 0, @CurrentDate), 0),
    'Calendar ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0),
    'Quarter ' + CONVERT(char(1), DATEPART(QQ, @CurrentDate)) + ', ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEADD(MM, DATEDIFF(MM, 0, @CurrentDate), 0),
    DATENAME(MM, @CurrentDate) + ' ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEPART(DY, @CurrentDate),
    RTRIM('Day ' + CONVERT(char(3), DATEPART(DY, @CurrentDate))),
    DATEDIFF(D, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1,
    RTRIM('Day ' + CONVERT(char(3),DATEDIFF(D, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1)),
    DATEDIFF(D, DATEADD(MM, DATEDIFF(MM, 0, @CurrentDate), 0), @CurrentDate) + 1,
    RTRIM('Day ' + CONVERT(char(2),DATEDIFF(D, DATEADD(MM, DATEDIFF(MM, 0, @CurrentDate), 0), @CurrentDate) + 1)),
    DATEPART(MM, @CurrentDate),
    RTRIM('Month ' + CONVERT(char(2),DATEPART(MM, @CurrentDate))),
    DATEDIFF(MM, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1,
    RTRIM('Month ' + CONVERT(char(2), DATEDIFF(MM, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1)),
    DATEPART(QQ, @CurrentDate),
    RTRIM('Quarter ' + CONVERT(char(1), DATEPART(QQ, @CurrentDate)))
   );
   SET @CurrentDate = DATEADD(D, 1, @CurrentDate);
  END
 END
 ELSE
 BEGIN
  CREATE TABLE #tmp(
   [PK_日期] [Datetime] NOT NULL,
   [日期_名称] [nvarchar](50) NULL,
   [年] [Datetime] NULL,
   [年_名称] [nvarchar](50) NULL,
   [季度] [Datetime] NULL,
   [季度_名称] [nvarchar](50) NULL,
   [月份] [Datetime] NULL,
   [月份_名称] [nvarchar](50) NULL,
   [每年的某一日] [int] NULL,
   [每年的某一日_名称] [nvarchar](50) NULL,
   [每个季度的某一日] [int] NULL,
   [每个季度的某一日_名称] [nvarchar](50) NULL,
   [每月的某一日] [int] NULL,
   [每月的某一日_名称] [nvarchar](50) NULL,
   [每年的某一月] [int] NULL,
   [每年的某一月_名称] [nvarchar](50) NULL,
   [每个季度的某一月] [int] NULL,
   [每个季度的某一月_名称] [nvarchar](50) NULL,
   [每年的某一季度] [int] NULL,
   [每年的某一季度_名称] [nvarchar](50) NULL
  );
  WHILE @CurrentDate < @endDate
  BEGIN
   INSERT INTO #tmp
   (
    [PK_日期],
    [日期_名称],
    [年],
    [年_名称],
    [季度],
    [季度_名称],
    [月份],
    [月份_名称],
    [每年的某一日],
    [每年的某一日_名称],
    [每个季度的某一日],
    [每个季度的某一日_名称],
    [每月的某一日],
    [每月的某一日_名称],
    [每年的某一月],
    [每年的某一月_名称],
    [每个季度的某一月],
    [每个季度的某一月_名称],
    [每年的某一季度],
    [每年的某一季度_名称]
   )
   VALUES
   (
    @CurrentDate,
    DATENAME(DW, @CurrentDate)+ ', ' + DATENAME(MM, @CurrentDate) + ' '
      + right('00' + CONVERT(char(2), DATEPART(D, @CurrentDate)), 2) + ' ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEADD(YYYY, DATEDIFF(YYYY, 0, @CurrentDate), 0),
    'Calendar ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0),
    'Quarter ' + CONVERT(char(1), DATEPART(QQ, @CurrentDate)) + ', ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEADD(MM, DATEDIFF(MM, 0, @CurrentDate), 0),
    DATENAME(MM, @CurrentDate) + ' ' + CONVERT(char(4), DATEPART(YYYY, @CurrentDate)),
    DATEPART(DY, @CurrentDate),
    RTRIM('Day ' + CONVERT(char(3), DATEPART(DY, @CurrentDate))),
    DATEDIFF(D, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1,
    RTRIM('Day ' + CONVERT(char(3),DATEDIFF(D, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1)),
    DATEDIFF(D, DATEADD(MM, DATEDIFF(MM, 0, @CurrentDate), 0), @CurrentDate) + 1,
    RTRIM('Day ' + CONVERT(char(2),DATEDIFF(D, DATEADD(MM, DATEDIFF(MM, 0, @CurrentDate), 0), @CurrentDate) + 1)),
    DATEPART(MM, @CurrentDate),
    RTRIM('Month ' + CONVERT(char(2),DATEPART(MM, @CurrentDate))),
    DATEDIFF(MM, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1,
    RTRIM('Month ' + CONVERT(char(2), DATEDIFF(MM, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1)),
    DATEPART(QQ, @CurrentDate),
    RTRIM('Quarter ' + CONVERT(char(1), DATEPART(QQ, @CurrentDate)))
   );
   SET @CurrentDate = DATEADD(D, 1, @CurrentDate);
  END
  SELECT * FROM #tmp;
  DROP TABLE #tmp;
 END
END

由于 BBS 的一些业务需求,需要使用 PHP 调用 C# 所编写的 WebService,其中遇到一些文档中未提及的细节问题,在此记录一下。

PHP 使用 SoapClient 进行调用,C#返回如下结构:

public struct QueryResult
{
    public bool Result;
    public string Message;
    public string[] Data1;
    public int[] Data2;
}

PHP 的调用代码如下,此处使用异常捕获的方式处理调用失败的情况,若 PHP 不支持异常,应用 is_soap_fault() 判断返回值。与 ASP.net 有关的注意事项写在注释中:

$client = new SoapClient("http://serveraddress/sample.asmx?wsdl");
if ($client !== false)
{
    // 使用关联数组,键名对应C#方法的参数名
    $param = array("Param1" => 1, "Param2" => 2);
    // 可以使用 $client->__soapCall() 或 $client->WebService方法名() 两种方式调用
    // 使用 $client->__soapCall() 调用时应将 $param 再包裹一层
    $result = $client->__soapCall("Method", array("parameters" => $param));
    // 使用 $client->WebService方法名() 调用时无需另行包裹 $param
    $result = $client->Method($param);
    // C# 返回结构体时,访问返回值采用 $result->结构体名称
    $resultdata = $result->Result;
    // bool 变量判断
    if ($resultdata->Result == "True")
    {
        // 访问返回的数组变量时应根据数组长度做不同的处理
        // 对于长度为1的数组,表现为普通变量,不能用下标访问
        if (count($resultdata->Data1) == 1)
        {
            // 用 $resultdata->Data1->string 访问数据
            echo $resultdata->Data1->string;
        }
        else
        {
            // 用 $resultdata->Data1->数据类型[] 访问数据
            echo $resultdata->Data1->string[0];
        }
    }
    catch (Exception $ex)
    {
        echo $ex->getMessage();
    }
}

今天发现某台机器上的一个网站目录下所有的html文件都被在文件末尾加上了一个恶意网站的iframe。机器为Windows系统,没有安装PowerShell等工具,于是写了个bat文件处理这个事情。

被篡改的html文件特征为:

</html><malicious iframe1>
<malicious iframe2>

其中红色的两个iframe为加入的恶意链接。第一个iframe紧接在原有的</html>标记之后,第二个iframe在之后的新行上。为了恢复文件原本内容,需要将这两个iframe移去,并添加上原有的</html>标记。

写了以下的批处理文件完成该目录下所有html和htm文件的修改(一些注意事项以注释的形式写出):

@echo off
rem 将当前路径 %~dp0 保存到环境变量 CurrentBatPath
set CurrentBatPath=%~dp0
rem 从当前目录开始用 for /R 遍历目录

for /R %%j in (.) do (
    cd %%j
    rem 检查目录下所有的htm和html文件(当扩展名为三字母时匹配前三个字母相同的所有扩展名)

    for %%i in (*.htm) do (
        findstr “<malicious iframe1>$^<malicious iframe2>” %%i >nul
        rem 当 findstr 匹配成功时 %errorlevel% 为0,不成功时为 -1
        if %errorlevel% == 0 (
            rem 将两个iframe所在行之外的内容转入新文件。若输出至原始文件会将其内容全部清除
            findstr /V “<malicious iframe1>$^<malicious iframe2>” %%i > %%~ni.new”
            rem 添加</html>标记,^为转义符

            echo ^</html^> >> %%~ni.new”
            del %%i
            ren %%~ni.new” %%i
            rem 显示所修改的文件的完全路径

            echo %%~fi
        )
    )
)
cd %CurrentBatPath%

学校图书馆提供了SciFinder Scholar的授权文件,但是在应用于Mac版的SciFinder Scholar时不起作用。查看授权文件的内容,发现其由若干行无意义的字符组成,其中换行符为CR+LF。联想到Mac平台上传统的换行符为CR,而SciFinder Scholar在早期的Mac系统上已出现,因而猜测将换行符修改为CR可能会有作用。实际操作证实了这一猜测。

Matlab的.m文件,寻找使左右两部分面积相等的点,可能需要根据实际数据的范围调整其中的一些参数。

GetBalancePosition.zip

附带一些测试数据: 继续阅读

CCME 03 胶体化学复习提纲,主要是概念总结。

胶体化学复习提纲.doc