ONE NOTE

Rage, rage against the dying of the light.

未然型

未然型本身无含义,加上ない被称为ない型

  1. 表示否定的命令,用 ない型+で+ください

    部屋の 鍵「かぎ」を 忘れないで ください。

    この部屋には 入らない「はいらない」 ください。

  2. 表示必须,用 未然型+なければ+なりません、也可以用ないと いけません

    李さんは 今日 早く 帰らなければ なりさせん。

    この薬「くすり」は 毎日 飲まなければ ありさせん」。

  3. 表示不做也可以。未然+なくても いいです。

    明日は 残業「ざんぎょう」しなくても いいです。

    靴を 脱が「脱ぐーぬぐ」 なくても いいですか?

  4. 名詞は 動詞「基本型」 ことが できます。「表示有xx的能力」

    スミスさんは ピアノを 弾く できます。

    森さんは 中華料理「ちゅうかりょうり」を 作る できますか?

  5. 動詞 前に、~「在某个动作之前」

    毎日 寝る 前に シャワーを 浴びます「あびます」。

  6. 名詞は 動「基本型」 ことです。「当谓语是一种行为时,使用这个句型」

    私の趣味「しゅみ」は 切手を 集めいる「あつめる」 ことです。

    动词做名词时,也可使用动词基本型+こと:

    小野さんは 車を運転する「うんてん」 こと が できません。

文法

  1. 「名詞 は」 名詞 が 欲しいです
  2. 名詞 を 動たいです 「動詞ます活用」

    想看 - 見たい

    不想看 - 見たくない

    ‘たい’的名词可以用’を’or’が’。’欲しい’只能用’が’表示。

  3. 動ませんが 表面上是疑问形式,表示提议。
  4. 動ましょう 表示提议
  5. 疑问词+でも 无论怎么怎么样

    この問題は 誰でも 書けます。

なります「变得~~~」

  1. 一类形容词+なります「非人为的变化」

    だんだん 暖かく「あったかく」 なります。

    パソコンは 安く「やすく」 なりました。

  2. 二类形容词/名に なります「非人为的变化」

    もう 元気に なりました。

    息子は 医者に なりました。

  3. 一类形容词します「人为的变化」

    テレビの音「おと」を 大きく します。

    ジュースを 冷たく「つめたく」しなす。

  4. 二类形容词/名に します「人为的变化」

    部屋を 綺麗 に して ください。

    会議室「かいぎしつ」を 禁煙「きんえん」に します。

表达词

  1. ‘中’的不同发音

    今年中 ことしじゅう

    来週中 らいしゅうちゅう

    今日、明日、今年+中 じょう

    ~週、月+中 ちゅう

  2. ぜひ 务必如何

    今度、ぜひ 家へ 遊びに 来て ください。

Before

《工业和信息化部关于开展移动互联网应用程序备案工作的通知》解读

网络接入服务提供者、应用分发平台、智能终端生产企业不得为未履行备案手续的APP提供网络接入、分发、预置等服务。

APP主办者、网络接入服务提供者、应用分发平台、智能终端生产企业应当建立健全违法违规信息监测和处置机制,发现法律、行政法规禁止发布或者传输的信息,应当立即停止传输该信息,采取消除等处置措施,防止信息扩散,保存有关记录,并向电信主管部门报告,依据电信主管部门要求进行处置。

这个通知真的是大的来了,如果严格执行起来,就是网络白名单制度(虽然大概率烂尾)。不过今天不讨论这个,至少以后国产安卓系统是不能用了,还有这个:

MIUI系统组件监听,“隐身”模式跟踪用户,网友:国产机的恐惧

据早前英国每日邮报称,研究人员对安装在小米手机中的网络浏览器进行了研究,发现该浏览器正在跟踪几乎所有用户的网络行为,包括访问过的网站,Google浏览器搜索查询词条以及手机新闻显示的所有内容。

更糟糕的是,每日邮报援引《福布斯》的报道说,研究人员发现,即使手机的浏览器处于“隐身”模式,跟踪仍会持续。除浏览器外,研究人员称还发现手机记录了打开了哪些文件夹以及浏览了哪些屏幕。

虽然手头上用的是miui12.5国际版,但是还是觉得不舒服,于是赶紧给手机刷上第三方rom,这里记录一下。

需要解释的东西(可以避免的踩坑)

不要跨安卓版本刷机

“底包”指的就是某个特定作为最低(或特定)要求的已安装安卓系统版本,或是某个作为最低(或特定)要求的已安装官方ROM版本。上面提到,卡刷是对系统和用户数据进行修补,就像打补丁一样,得先有衣服才能打补丁吧?这个“底包”就是作为底的衣服。不同的ROM间往往有许多共同的基础,如库文件、系统框架等,卡刷包发布者往往不需要将整个系统都打包进来,只打包需要修补的文件和操作的脚本就行了。因此,大几G的ROM卡刷包是卡刷包,几百兆的卡刷包也是卡刷包,完全取决于要修补的内容大小。而发包者可能是在某个/类底包上作出的修改,所以在刷卡刷包前需要先线刷/卡刷中转包满足该底包要求。

踩坑经验:最开始刷机使用的是官网的PE13系统,结果刷好遇上了这几个问题:mac地址重启更换,陀螺仪失灵,发热严重,耗电增加。不是不能用,但是总归是很难受,于是最终刷回了PE11,以上的问题才解决(除了mac地址,这个问题我没找到解决方法,虽然不影响使用)推荐在官方包同Android版本下寻找第三方rom.

总结:非必要不跨android版本,尤其是比较旧的手机,盲目刷最新版没用,且不说适配问题,硬件是跟不上的。

Android分区

bootloader:设备启动后,会先进入bootloader程序,这里会通过判断开机时的按键组合(也会有一些其他判断条件,暂不赘述)选择启动到哪种模式,这里主要有> Android系统、recovery模式、fastboot模式等。

boot:包含有Android系统的kernel和ramdisk。如果bootloader选择启动Android系统,则会引导启动此分区的kernel并加载ramdisk,完成内核启动。

system:包含有Android系统的可执行程序、库、系统服务和app等。内核启动后,会运行第一个用户态进程init,其会依据init.rc文件中的规则启动Android系统组件,> 这些系统组件就在system分区中。将Android系统组件启动完成后,最后会启动系统app —— launcher桌面,至此完成Android系统启动。

vendor:包含有厂商私有的可执行程序、库、系统服务和app等。可以将此分区看做是system分区的补充,厂商定制ROM的一些功能都可以放在此分区。

userdata:用户存储空间。一般新买来的手机此分区几乎是空的,用户安装的app以及用户数据都是存放在此分区中。用户通过系统文件管理器访问到的手机存储(sdcard)即此分区的一部分,是通过fuse或sdcardfs这类用户态文件系统实现的一块特殊存储空间。

recovery:包含recovery系统的kernel和ramdisk。如果bootloader选择启动recovery模式,则会引导启动此分区的kernel并加载ramdisk,并启动其中的init继而启> 动recovery程序,至此可以操作recovery模式功能(主要包括OTA升级、双清等)。

cache:主要用于缓存系统升级OTA包等。双清就是指对userdata分区和cache分区的清理。

misc:主要用于Android系统和bootloader通信,使Android系统能够重启进入recovery系统并执行相应操作。

线刷?卡刷?

这个叫法不准确,卡刷也可以通过adb sideload的方法线刷,其实应该叫Fastboot FlashRecovery Install,一个在fastboot里刷,一个在rec里刷。

卡刷一般是对系统和用户数据进行修改和替换,也有重新写入分区镜像的,一般是zip后缀。

线刷是fastboot模式下,直接覆写分区,可以解决大部分非硬件黑砖问题,一般是tar.gz后缀,解压可以看见刷机脚本。理论上可以直接运行脚本刷机,但是本人使用的是MiFlash工具。

除此之外还有深度刷机,和处理器挂钩的刷机方式,例如高通骁龙的9008,联发科的USB_PORT。作为最底层的刷机方式,一般只用于救砖(操作很复杂)。

Redmi Note 8 Pro没有persist分区

包括官方的线刷包,以及手机本身,都没有persist分区。手机有一个persist Image分区,不要在rec里看到persist为0MB就以为是persist分区坏了,很可能是刷机包适配问题。传感器问题就线刷官方版本就能解决。

准备

  1. adb下载&文档

  2. 下载刷机包,这里没有选择官方刷机包,是因为官方只有android13和android12的刷机包,版本选择原因后面细讲。这个下载站是酷安大佬 @无心 的刷机资源站,里面有刷机需要的大部分资源。

  3. Rec镜像官方的twrp似乎适配有问题,换上这里的修改版就ok。

rom版本选择

体验了几个类原生系统,比较推荐这几个:ArrowOS, LineageOS, PixelExperience. 前两者不带google全家桶,非常简洁的系统;第三个是pixel系统移植,原汁原味。本人最终选择了第三个系统。

刷机步骤

  1. 刷入Rec(前提是解锁bootloader),fastboot模式下输入命令:
1
2
fastboot flash recovery <rec镜像路径>
fastboot reboot recovery

顺便一提,刷入Magisk的时候,就是覆写boot分区:

1
fastboot flash boot <修补过的boot.img路径>
  1. 在rec里执行清除数据&格式化Data分区操作,这里用的rec是TWRP,也可以选择其他Rec.然后重启到Rec(格式化后重启才能挂载Data)

    TWRP

  2. 连接电脑,将刷机包放入手机里,然后Rec选中刷机包,执行刷入工作(一般几分钟就好)。

  3. OK之后继续清除数据然后启动到系统,就可以使用新的系统了。

可能遇到的问题

系统启动卡住or无限重启

尝试双清重新启动,不行就换rom。

刷机后系统功能不正常

rom包适配问题,依次尝试以下方案:卡刷回官方包->线刷回官方->深刷官方包。

耗电&发热严重

可能是rom包适配,或者Android版本太高的问题,换刷机包。

资源&引用

无惧黑砖–小米联发科手动救黑砖教程[新手向]! 深刷教程,希望你不会用到。

个人安卓刷机经验(附小米6刷机指南)

一镜到底刷入rec,刷入类原生,海量rec及各种安卓刷机包 小米红米刷机

TWRP Download

无心的下载站 大杂烩,又多又全(针对Note8Pro)

MIUI Official ROMS

Magisk

形容词て型(表示并列)

  • 一类形容词变形: い变成くて
    • ホテルの 部屋は 広くて 明るいです「あかるい」
  • 二类形容词变形: 直接加で
    • このコンピュータの 操作「そうさ」は 簡単で 便利です。

で的用法

另外,で加在名词之间,表示并列,如:

スミスさんは 旅行会社の 社員で 営業部の 部長です`

动词加で也表示动作结束后的结果,如:

李さんは 車を 持って います。

彼は 北京に 住んで います。

別の文法

小句 が 小句(表示转折)

このレストランは 美味しいですが、ちょっと 高いです。

动词变形之た型/て型

三类动词 カ型・サ型

する ー> して

来る「くる」 ー> 来て「きて」

「う段+る ー> い段+て」

二类动词

食べる ー> 食べて

調べる ー> 調べて「しらべて」

简单的ru变成te

一类动词

話す 話して

磨く「みがく」 磨いて

急ぐ「いそぐ」 急いで

洗う「あらう」 洗って

待つ 待って

やる やって

遊ぶ 遊んで

読む 読んで

死ぬ 死んで

行く 行って

た型和て型变形一致,て变た,で变だ

て型の意味

  • 动词て型[…] 动词(表示动作相继发生)

    • 昨日 デパートへ 行って、買い物しました。
    • 図書館へ いって 本を 借りて「かりて」、家へ 帰ります。
  • 动词て型から 动词(表示相继发生,区别是不能连用多次)

  • 动词て型 ください(表示请求)

て型の活用

  • 动て+います 表示动作正在发生
  • 动て+も いいです 表示许可
  • 动て+いいです 表示许可
    • 家に 仕事を しても いいです
  • 动ては いけません 表示禁止
    • 飛行機の中に タバコを 吸っては いけません

他の文法

場所 + を

表示经过某地,常用动词如**“通ります「とおります」”、”渡ります「わたります」”、”過ぎます「すぎます」”**

动词是”出ます「でます」”、”卒業します「そつぎょうします」”时,表示离开。

名詞+する:名詞活用动词

サ变动词的定义就是名词活用动词

表示附着点,用に

李さんは 電車に 乗りました「のり」

表达词

  • 駅前「えきまえ」「车站附近」
  • なかなか「挺不错的嘛」
  • ~て くださいませんか「更礼貌的用法」
  • そうして ください「请您那样做」
    • そうするー>そうして
  • お金を 下ろします「おろします」「取钱」

Before

博客由wordpress迁移而来,有很多不是用的图片资源,现在来删除一下.

删除没有引用的文件&&统一文件名

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
import re
import uuid

post_dir = "source/_posts/"
image_dir = "source/images/"


def get_ref_filename(root_dir):
referenced_files = set()

for dirpath, _, filenames in os.walk(root_dir):
for filename in filenames:
if filename.endswith(".md"):
file_path = os.path.join(dirpath, filename)
with open(file_path, "r") as file:
contents = file.read()
matches = re.findall(r"images\/(.+\..+)\)", contents)
referenced_files.update(matches)

return referenced_files


def get_source_filenames(directory):
picture_files = []
valid_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp']

for filename in os.listdir(directory):
file_extension = os.path.splitext(filename)[1].lower()
if file_extension in valid_extensions:
picture_files.append(filename)

return set(picture_files)


def del_unref_files():
referenced_files = get_ref_filename(post_dir)
pic_files = get_source_filenames(image_dir)
unref_file = list(pic_files - referenced_files)
print(unref_file)

for e in unref_file:
try:
os.remove(image_dir + e)
print(f"Deleted file: {e}")
except OSError as e:
print(f"Error deleting file: {e} - {e}")


def rename_ref_in_post(oldname, newname):
for dirpath, _, filenames in os.walk(post_dir):
for filename in filenames:
if filename.endswith(".md"):
file_path = os.path.join(dirpath, filename)
with open(file_path, "r+") as file:
contents = file.read()

contents = contents.replace(oldname, newname)

file.seek(0)
file.truncate()
file.write(contents)


def random_filename(post_dir, image_dir):
fms = get_ref_filename(post_dir)
for fm in fms:
suffix = fm.split(".")[-1]
uid = str(uuid.uuid4())[:6]
os.rename(f"{image_dir}{fm}", f"{image_dir}{uid}.{suffix}")
rename_ref_in_post(fm, f"{uid}.{suffix}")

if __name__ == '__main__':
# rename_ref_in_post('image-5-1024x691.png', 'image-5.png')
random_filename(post_dir, image_dir)

解法

只用统计有多少对,很明显应该用哈希表存储所有的行,在通过列一一比较,统计出结果.

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* @param {number[][]} grid
* @return {number}
*/
var equalPairs = function (grid) {
const l = grid.length;
const cnt = {};
grid.forEach((element) => {
let s = element.toString();
cnt[s] = (cnt[s] || 0) + 1;
});
let res = 0;
for (let i = 0; i < l; i++) {
const arr = [];
for (let j = 0; j < l; j++) {
arr.push(grid[j][i]);
}
const arrStr = arr.toString();
if (cnt[arrStr]) {
res += cnt[arrStr];
}
}
return res;
};