Drude公式以及电子伏特和波长的转换

Drude模型将金属表面的自由电子看作气体,可以很好的预测其光学性质。该模型提出了$\epsilon(\omega)$的表达式:

\[\epsilon_c = \epsilon_\infty - \frac{\omega_p^2}{\omega^2+i\gamma\omega}\]

其中$\omega_p$为块状金属的等离子体频率(rad/s),表达式为:

\[\omega_p = \sqrt{\frac{N_he^2}{\epsilon_0m*}}\]

其中$N_h$代表电子密度(计算时注意单位是$cm^{-3}$或是$m^{-3}$),m*代表有效质量。那么,如果假设$N_h$等于$1.7\times 10^{21}\;cm^{-3}$,m*为0.8 m0(m0代表电子的质量)。则$\omega_p$的结果为多少呢?

首先,公式中涉及到的常数为:

  • $e=-1.6\times10^{-19}\;C$
  • $m0=9.1093837015\times 10^{-31}\;kg$
  • $\epsilon_0=8.85418782\times 10^{-12}\; m^{-3}kg^{-1}s^4A^2$

因此:

\[\begin{aligned} \omega_p &= \sqrt{\frac{1.7\times 10^{27}\cdot (-1.6\times10^{-19})^2}{8.85418782\times 10^{-12}\cdot 0.8\times 9.1093837015\times 10^{-31}}}\\ &= 2.597052\times 10^{15} (rad/s) \end{aligned}\]

转换成电子伏特

\[\omega_p = \frac{1240\cdot\omega_p(rad/s)}{2\pi c \cdot 10^{9}} = 1.7 (eV)\]

基于球形纳米颗粒的吸收光谱,得到介电常数

  • 首先将吸收光谱,转换成能量(eV)为单位的吸收光谱,代码为
# h*c/lda
evs = 1240*1e-3/lda
pl.plot(evs, qext)

然后根据吸收光谱图,找到$\omega_{sp}$,即等离子体共振峰,以及$\gamma$,即线性的增宽因子。根据文献1提供的公式,球形的微小纳米颗粒的偶极子极化率$\alpha$的公式为:

\[\alpha = 3\epsilon_0\rm{V}\frac{\epsilon - \epsilon_m}{\epsilon+2\epsilon_m}\]

当分母小时的时候,纳米颗粒会出现LSPR吸收峰,即: \(\epsilon_r = -2\epsilon_m\)

$\epsilon_r$代表介电常数的实部,根据Drude模型,其表达式为:

\[\epsilon_r = 1 - \frac{\omega_p^2}{\omega^2 + \gamma^2}\]

$\omega_p$为块状的等离子体震荡频率,因此纳米颗粒的共振频率和块状等离子体震荡频率的关系为:

\[\omega_{sp} = \sqrt{\frac{\omega_p^2}{1+2\epsilon_m} - \gamma^2}\]

因此,如果知道$\omega_{sp}$和$\gamma$,可以算出$\omega_p$。如文献5所示,假设$\omega_{sp}$为0.98 eV,FWHM(也即$\gamma$)为0.66 eV。当溶液的介质为水,折射率为1.33。那么根据上述公式,$\omega_p$大约为2.26 eV。接着,设置一个初始的$\epsilon_\infty$,然后按照$\epsilon_c$的公式,计算得到纳米颗粒的介电常数$\epsilon$,然后根据mie公式的python代码,计算得到吸收光谱,最后根据将其与实验得到吸收光谱进行比较,校正$\epsilon_\infty$。这里我们校正得到$\epsilon_\infty$为1.8是比较符合文献的数据。

根据经验$\epsilon_\infty$和$\omega_p$都能够调节LSPR的峰位,而$\gamma$可以调节半峰宽,且$\epsilon_\infty$越小,LSPR越红移(波长越长)。

参考文献

  1. https://doi.org/10.1038/NMAT3004
  2. https://doi.org/10.1038/ncomms4548
  3. https://www.osapublishing.org/abstract.cfm?uri=ao-22-7-1099
  4. Frequency - Wavelength - Energy Converter
  5. https://link.springer.com/article/10.1557/adv.2018.91
  6. https://pubs.acs.org/doi/abs/10.1021/nn400894d

创建百度网盘应用,得到开发者信息

前往https://pan.baidu.com/union/console/applist?from=header,创建一个个人应用,然后得到AppID、Appkey、Secretkey以及Signkey等信息。

获取access_token

根据http://developer.baidu.com/wiki/index.php?title=docs/oauth/application的说明,获取access_token。

  • 首先使用浏览器前往http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&scope=email&display=page,其中YOUR_CLIENT_ID为Appkey,如果不知道怎么设置YOUR_REGISTERED_REDIRECT_URI,可以设置为obb,然后得到CODE,尤其需要注意的是,scope决定你可以拿到的access_token的权限,其范围可以参考http://developer.baidu.com/wiki/index.php?title=docs/oauth,例如basic、netdisk等等。
  • 使用浏览器前往https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=CODE&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&redirect_uri=YOUR_REGISTERED_REDIRECT_URI,得到access_token。

根据api进行开发

参考https://pan.baidu.com/union/document/basic,根据api说明,可以实现百度网盘的开发。

示例开发,将百度网盘当做网站的文件存储服务器

  • 通过浏览器插件,得到文件的fsid

  • 由于fsid是固定的,那么在前端指定文件(例如图片、视频)等的fsid,通过后端的api,将fsid转换为dlink,则可以实现将百度网盘用作文件存储工具(不足之处,该api的使用频率限制比较严格)。

查看示例播放器:游西湖。更新:貌似当做文件下载可以,但是作为网站上的播放源出现403,后面再去看看是什么问题。

额外参考链接:flask中生成ssl证书的方式,https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https

4月29日更新

目前已经探明,请求dlink资源时,如果带了referrer,服务器会返回403。这个时候将referer设置为no-referrer值,可以解决防盗链问题。类似a、area、img、iframe、link等标签,可以设置referrerpolicy属性解决此问题。不过这些设置不是在所有浏览器都会生效。目前来看,Chrome是支持的,但是最新的Ege 90似乎并不支持。

<meta name="referrer" content="no-referrer">

Word文档虽然非常常见,但是不便于通过网站给别人浏览,因此需要将其转换成HTML文件。Word应用是自带转换功能的,只需将其另存为HTML文件即可。不过这个另存为功能在转后将自动切换到HTML文件,由于我们有时只是需要将文档转换成HTML文件,但是仍然还要在这个Word文档上工作,修改文件内容,那么这个功能就稍微显得麻烦一些。如果解决这个办法呢,可以使用VBA脚本来解决。

  • 设置路径变量
Let strDocName = ActiveDocument.Name
Let intPos = InStrRev(strDocName, ".")
Let strDocName = Left(strDocName, intPos - 1)
Let htmlFileName = strDocName & ".htm"
Let htmlDir = ActiveDocument.Path & "\html"
Let htmlFullPath = htmlDir & "\" & htmlFileName
  • 判断路径是否存在
If Dir(htmlDir, vbDirectory) = "" Then
    MkDir htmlDir
End If
  • 创建新的文档
Dim oNewDocument As Document
Set oNewDocument = Documents.Add(Template:=ActiveDocument.FullName, DocumentType:=wdNewBlankDocument, Visible:=False)
  • 另存为HTML文件
oNewDocument.SaveAs2 FileName:=htmlFullPath, FileFormat:=wdFormatHTML
oNewDocument.Close SaveChanges:=False
  • 清除对象
Set oNewDocument = Nothing

在将这个vba脚本和一个按钮对应起来,这样以后,只需要点击一个按钮,就可以生成该Word文档的HTML版本,非常方便。

安卓10及其之后的版本,提高了系统的隐私安全,类似如图片的GPS信息这样的exif数据无法直接获取了。如果使用之前的方法获取,则得到的GPS信息始终是0,0。那么如何解决该问题呢?

  • 首先在Activity的onCreate函数中,判断是否拥有图片GPS信息的权限,这个权限的名称为ACCESS_MEDIA_LOCATION
private boolean isAccessMediaLocationGranted() {
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
        return true;
    } else {
        return getBaseContext().checkSelfPermission(android.Manifest.permission.ACCESS_MEDIA_LOCATION)
                == PackageManager.PERMISSION_GRANTED;
    }
}
  • 如果没有这个权限,那么就需要请求权限,请求权限的代码如下
if (!isAccessMediaLocationGranted()) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_MEDIA_LOCATION}, IMAGE_LOCATION);
}
  • 如果已经获得权限,那么首先将得到图片的Uri转换成真是的Uri,然后再通过ExifInterface获取GPS信息
//如果是Q10版本一下,则不需要得到原来的Uri
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
    currentMediaRealUri = mediaUri;
} else {
    //隐私信息,导致gps信息无法获取:https://stackoverflow.com/questions/57980935/exifinterface-gps-not-read-on-android-q-10
    currentMediaRealUri = MediaStore.setRequireOriginal(mediaUri);
}

……

String longitude = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
String latitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);

初冬的草地

前一阵子,研究院的伙伴将试剂都归了类、标了号放在不同的试剂柜里边。因为试剂很多,如果是查找常用的试剂,那还是很好的,但是如果查找不常用的试剂,其实还是非常麻烦。正好我前两天突然想到之前看到的MongoDB,感觉结合python做一个查询应该非常简单。因此,就着手做了一个,确实蛮方便的。现在查询试剂,只需要右键打开批处理窗口,然后类似如下命令即可返回结果。

mater -q query_words

查询结果

这里边打印表格,首先直接将查询结果转换成pandas,然后打印pandas,其中pandas的设置和打印代码如下

# 表格打印选项
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)

# 打印结果
df = pd.DataFrame(list(cursors))
rn_dict = {'cabinet': u'货架名称', 'layer': u'层', 'no': u'编号', 'cn': u'中文名称', 'en': u'英文名称'}
print(df.rename(rn_dict, axis=1).to_string(index=False))

后面给该程序增加了一个自动获取mw的功能,如以下命令所示

mater -wq query_words

增加了w选项,即如果数据库中没有当前实际的mw字段,则自动根据cas从网上加载,然后存储下来。这样方便下次配试剂。