日语词汇学笔记[4] ——日语语音历史演变

上代特殊仮名遣

Noyuki 「本节课我们介绍日语语音上的一些“历史遗留问题”。首先,Midori,你知道母音(ぼいん)和子音(しいん)的概念吗?」

Midori 「死因?」

Noyuki 「不是,是儿子的子,发音的音💦」

Midori 「啊……我明白了。那可以理解成元音和辅音之类的吧。」

Noyuki 「对,在日语里母音就是あいうえお。但是你知道吗,最早的时候母音可不止五个哦?」

Noyuki 「神(かみ)髪(かみ) 这两个词现在发音相同,但是语言学家研究表明,这两个み在上代是不同的み,他们之间是不可以混用的。这也是现在日语很多看似完全不同的词竟然同音的原因。之后,他们发现いえお行的假名都存在甲乙两个变种,也就是上代的时候有8个母音。这些叫做“上代特殊仮名遣(じょうだい とくしゅ かな づかい)”」

Read More

日语词汇学笔记[3] ——词汇的分类

词汇的分类

Noyuki 「日语的词汇可以分为三类:和語(わご)、漢語(かんご)、外来語(がいらいご)。」

Noyuki 「对于和语词,我们注意到一音节、二音节的词比较多;对于汉语词,我们注意到许多生活常见的名词都是汉语词;外来语词则用来描述外来概念,自日本开放以后数量逐渐增加。」

思考题:日语的外来语中,来自葡萄牙语、西班牙语、荷兰语等词汇较多,这是为什么呢?

Noyuki 「对了,Midori,你知道梅、馬、菊是汉语词吗?」

Midori 「诶?明明都是两音节来着,梅和马听起来也不像音读啊,真的吗?」

Noyuki 「是真的,梅是うめ,就是u+梅的读音;马也是一样,u+马的读音,很神奇吧」

Noyuki 「另外,外来語不等于カタカナ語,你知道吧?后者的范围可比前者多多了,包含了和制词、特殊表记等等」

Read More

日语词汇学笔记[2] ——词语的变化

文化ぶんか発達はったつおうじて語彙ごい変化へんかする
随着文化的发展,词汇也在发展

日语的分代

Noyuki 「从上代日语以来,日语的很多单词发生了意义的变化。不过在那之前,你知道日语能够分为哪几个时代吗?」

Midori 「嗯……我只知道奈良、平安、镰仓之类的时代」

Noyuki 「在日语语言学的划分中,我们主要分为上代、中古、中世、近世、近代、现代。他们大致的对应关系是上代对应奈良(な ら),中古对应平安(へい あん),中世对应镰仓(かま くら),近世对江户(え ど),近代对明治(めい じ),现代对昭和(しょう わ)以后」

Noyuki 「每个时代都有自己的特征和语言风格,比如在中古时代,大量出现了贵族文学,如源氏物语(げん じ もの がたり)感兴趣的话课后可以再查一查,做深入研究~」

Read More

日语词汇学笔记[1] ——概述

前言

本系列文章希望能够以一种比较casual的方式为读者介绍基础的日语词汇学知识,也希望通过一些有意思的例子让读者管中窥豹,感受到日语背后的历史、文化和神奇之处。文章的全部内容基于笔者对南京大学日语系张闻君老师的《日语词汇学》课程的理解。笔者不是日语专业学生,对该方向也没有深入的研究,如有错误欢迎指出。请注意,本文的目标是通俗易懂,并不追求十分严谨,笔者也认为人文学科追求过度严苛的定义是不理智的。

在阅读本文前,我们建议您有N5级别左右的日语基础。

人物介绍

Noyuki:龙族,喜欢语言研究,本系列的讲师。在研究龙人语的过程中学习了日语相关知识。

Midori:龙族,喜欢推理。为了破译古代精灵的语言,正在加紧学习语言学相关知识……

Read More

一种基于维护高度的无递归、无栈、无parent指针的AVL树实现方式

引入

AVL树有种种实现方式,其中最自然的是采用递归的写法,毕竟AVL树是递归定义的。但是,有的老师认为“递归时间常数大”,觉得应该用迭代。但是,还有老师认为迭代要用栈,“栈空间大(指占用了 )空间”,不能用栈。自然,我们可以用parent指针规避掉这一问题,但是显然parent指针需要使用的额外内存更大,这位老师还是不喜欢。所以现在我们被要求实现三无AVL——无递归、无栈、无parent指针。

AVL树的维护方法有两种:维护高度和balance factor(BF)。笔者认为Balance Factor不够优雅、泛用性低、过于特殊化,故采用维护高度的方式。

所以,本文认为,三无AVL实现的重点在于 快速的维护每个节点子树的高度

Read More

Building a Clear Programming Language for Newcomers

This is a joke

Introduction

Many new programmers are often confused about a very important concept in programming: the variable lifespan. For example, one could not understand why the variable “a” is “not defined” when it’s clearly there:

1
2
3
4
5
6
int x=3;
{
int a=4;
}

a; //Compile Error

Another problem newcomers face when they are first presented callback functions are that they are not able to convert sequential code into callback functions. When the program gets complicated, it is common for a professional programmer to combine the callback functions and sequential coding. When this happens, newcomers may not know the correct order of execution, leading to frustration.

One more problem comes from the “impossible” mission for coding: naming things. Professional coder might use what are called “defensive programming” by naming variables weirdly, like just calling them q fa wps sht etc.

In order to make programming more accessible to beginners, we have developed the latest programming language: CLang!

Read More

Displaying Attachment PDF with Frontend Javascript

背景

笔者最近在参加某校在线平台前端的开发,收到了这样的要求:

将服务器传输过来的文件尽可能(图片/PDF)在网页中就显示下来,这样就不用下载了!

笔者劈里啪啦敲下了如下代码(由于渲染问题,美元符号已替换为人民币符号!!!):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var xhr = new XMLHttpRequest();

¥.ajax({
url: 'download_link',
type: 'get',
data: {},
xhr: function () {
return xhr;
},
success: function (r) {
const params = new URLSearchParams(xhr.responseURL);
const para1 = params.get('filename');
console.log("Returned url:"+xhr.responseURL);
console.log(para1);

if (para1 == null) {
¥('#fast_load').text('');
return;
}

if (para1.endsWith(".png") || para1.endsWith(".jpg") || para1.endsWith(".gif") || para1.endsWith(".bmp")) {
¥('#fast_load').html(`用户上传的图片(为正常显示,已缩放。请点击下载按钮下载原图。)<br/><br/><img src="¥{xhr.responseURL}" style="max-width:600px;width:100%"/>`);
return;
}

if(para1.endsWith(".pdf")){
¥('#fast_load').html(`用户上传的PDF<br/><br/><object class="pdf" data="¥{xhr.responseURL}" width="100%" height="1500"></object>`);
return;
}

¥('#fast_load').text(`用户上传了文件:¥{para1},请按下载按钮下载。请注意:本网站不对用户上传内容进行检查,文件有可能包含恶意内容。`);
}
});

上述代码可以正确分辨并显示各种常用类型的图片文件,然而pdf文件则会直接下载,不会显示在object中,令人迷惑。

Read More