安卓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从网上加载,然后存储下来。这样方便下次配试剂。

@ECHO OFF

if "%1"=="" (
    pushd %1
)


::get the object line
::http://www.bathome.net/thread-9512-1-1.html
for /f "tokens=*" %%i in ('ipconfig ^|findstr IPv4') do (
    SET IPLine=%%i
)

::split by ":" and obtain the second element
for /f "tokens=2 delims=:" %%j in ("%IPLine%") do (
    SET IPv4Line=%%j
)

::get the substring
SET IPv4=%IPv4Line:~1%

::copy host to clipboard
echo http://%IPv4%/ | clip

python -m http.server --bind %IPv4% 80


::参考
::https://www.cnblogs.com/accumulater/p/10647497.html
::https://stackoverflow.com/questions/6359820/how-to-set-commands-output-as-a-variable-in-a-batch-file

安装

pip install pyftpdlib

编写ftp.server.bat文件

@ECHO OFF

if "%1"=="" (
    pushd %1
)

::get the object line
::http://www.bathome.net/thread-9512-1-1.html
for /f "tokens=*" %%i in ('ipconfig ^|findstr IPv4') do (
    SET IPLine=%%i
)

::split by ":" and obtain the second element
for /f "tokens=2 delims=:" %%j in ("%IPLine%") do (
    SET IPv4Line=%%j
)

::get the substring
SET IPv4=%IPv4Line:~1%

::copy host to clipboard
echo ftp://%IPv4%/ | clip

python -m pyftpdlib -i %IPv4% -p 21 -w

解决中文字符乱码的问题

pyftpdlib内部使用utf8,而windows使用gbk,可以将pyftpdlib进行修改:

  • filesystems.py
yield line.encode('utf8', self.cmd_channel.unicode_errors)

utf8改成gbk

  • handlers.py
return bytes.decode('utf8', self.unicode_errors)

utf8改成gbk

参考

电镜图片通常都有一个标尺,可以用来对照颗粒的尺寸。但是用于发表的电镜图片通常只是原始图片的一部分,而且是经过裁剪以及分辨率等等修改过的,那正确给修改过的电镜图片添加标尺呢?

这里我们使用ImageJ工具来处理这个操作,该工具的下载地址:https://imagej.nih.gov/ij/download.html

  • 首先使用ImageJ打开原始图片
  • 选择直线工具,然后先标注标尺,并按M添加结果,Length为L1
  • 标注一个原始图片以及修改后的图片均包含的颗粒,按M添加结果,Length为L2
  • 打开裁剪后的图片,标注原始图片标注过的颗粒结果,按M添加结果,Length为L3

这样根据计算,裁剪后的图片,其标尺的像素数应该为:

\[L4 = \frac{L1\times L3}{L2}\]

然后,在Photoshop中绘制一个长度为L4的线段,将数值设置为原始图片的标尺值即可。